Browse Source

景聚庭-商品管理功能调整

huangguoce 1 week atrás
parent
commit
856bae6670
18 changed files with 397 additions and 130 deletions
  1. 10 0
      jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/collect/domain/PsiCollectDetailed.java
  2. 2 0
      jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/collect/mapper/xml/PsiCollectDetailedMapper.xml
  3. 14 12
      jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/collect/service/PsiCollectService.java
  4. 16 0
      jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/loss/domain/PsiLossDetailed.java
  5. 1 0
      jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/loss/mapper/xml/PsiLossBasicMapper.xml
  6. 8 0
      jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/loss/mapper/xml/PsiLossDetailedMapper.xml
  7. 81 91
      jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/loss/service/PsiLossService.java
  8. 13 10
      jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/loss/service/dto/PsiLossExportDto.java
  9. 32 0
      jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/materialType/domain/PsiMaterialTypeInfo.java
  10. 19 1
      jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/materialType/mapper/xml/PsiMaterialTypeMapper.xml
  11. 29 1
      jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/materialType/service/PsiMaterialTypeService.java
  12. 10 0
      jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/psiWareHouse/domain/PsiWareHouseDetailed.java
  13. 13 5
      jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/psiWareHouse/mapper/xml/PsiWareHouseBasicMapper.xml
  14. 93 9
      jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/psiWareHouse/service/PsiWareHouseBasicService.java
  15. 10 0
      jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/psiWareHouse/service/dto/PsiWareHouseDto.java
  16. 10 0
      jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/purchase/domain/PsiMaterialDetailed.java
  17. 35 0
      jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/purchase/service/PsiMaterialService.java
  18. 1 1
      jeeplus-modules/jeeplus-xxl-job-executor-sample/src/main/java/com/xxl/job/executor/service/jobhandler/SampleXxlJob.java

+ 10 - 0
jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/collect/domain/PsiCollectDetailed.java

@@ -78,6 +78,16 @@ public class PsiCollectDetailed extends BaseEntity {
     private String company;
     private String company;
 
 
     /**
     /**
+     * 品牌
+     */
+    private String brand;
+
+    /**
+     * 规格
+     */
+    private String specification;
+
+    /**
      * 备注
      * 备注
      */
      */
     private String remarks;
     private String remarks;

+ 2 - 0
jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/collect/mapper/xml/PsiCollectDetailedMapper.xml

@@ -15,6 +15,8 @@
         a.goods_name,
         a.goods_name,
         a.collect_number,
         a.collect_number,
         a.company,
         a.company,
+        a.brand,
+        a.specification,
         a.current_inventory,
         a.current_inventory,
                c.spec,
                c.spec,
         su.name AS recipientAgent, su.id AS recipientAgentId, so.name AS recipientOffice,
         su.name AS recipientAgent, su.id AS recipientAgentId, so.name AS recipientOffice,

+ 14 - 12
jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/collect/service/PsiCollectService.java

@@ -497,18 +497,20 @@ public class PsiCollectService {
                         //向用户发起通知
                         //向用户发起通知
                         if (null != notifiedPartyUsers) {
                         if (null != notifiedPartyUsers) {
                             for (UserDTO userDTO1 : notifiedPartyUsers) {
                             for (UserDTO userDTO1 : notifiedPartyUsers) {
-                                //发送通知
-                                Map<String ,String > map = new HashMap<>();
-                                map.put("taskId",dto.getProcInsId());
-                                map.put("title",title);
-                                map.put("defId",info.getProcessDefinitionId());
-                                map.put("taskName","领用申请审批通过");
-                                map.put("createUser","管理员");
-                                map.put("createTime",day);
-                                map.put("noticeName",userDTO1.getLoginName());
-                                map.put("noticeId",userDTO1.getId());
-                                map.put("createById",userDTO.getId());
-                                flowTaskService.add(map);
+                                if(userDTO1 != null){
+                                    //发送通知
+                                    Map<String ,String > map = new HashMap<>();
+                                    map.put("taskId",dto.getProcInsId());
+                                    map.put("title",title);
+                                    map.put("defId",info.getProcessDefinitionId());
+                                    map.put("taskName","领用申请审批通过");
+                                    map.put("createUser","管理员");
+                                    map.put("createTime",day);
+                                    map.put("noticeName",userDTO1.getLoginName());
+                                    map.put("noticeId",userDTO1.getId());
+                                    map.put("createById",userDTO.getId());
+                                    flowTaskService.add(map);
+                                }
                         }
                         }
                     }
                     }
                 }
                 }

+ 16 - 0
jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/loss/domain/PsiLossDetailed.java

@@ -32,11 +32,20 @@ public class PsiLossDetailed extends BaseEntity {
 
 
     private String goodsName;
     private String goodsName;
 
 
+    private String inventoryId;
+
     @TableField("loss_number")
     @TableField("loss_number")
     private String lossNumber;
     private String lossNumber;
 
 
+    @TableField("loss_reason")
+    private String lossReason;
+
     private String company;
     private String company;
 
 
+    private String brand;
+
+    private String specification;
+
     @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
     @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
     private Date produceDate;
     private Date produceDate;
 
 
@@ -50,6 +59,13 @@ public class PsiLossDetailed extends BaseEntity {
     private String surplusNumber;
     private String surplusNumber;
 
 
     @TableField(exist = false)
     @TableField(exist = false)
+    private String wareHouseNumber;
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @TableField(exist = false)
+    private Date wareHouseDate;
+
+    @TableField(exist = false)
     private List<WorkAttachmentDto> fileInfoLost;
     private List<WorkAttachmentDto> fileInfoLost;
 
 
     @TableField(exist = false)
     @TableField(exist = false)

+ 1 - 0
jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/loss/mapper/xml/PsiLossBasicMapper.xml

@@ -47,6 +47,7 @@
             so.name AS handledByOfficeName,
             so.name AS handledByOfficeName,
             su.name AS handledByName,
             su.name AS handledByName,
             a.loss_number,
             a.loss_number,
+            a.loss_reason,
             a.produce_date,
             a.produce_date,
             b.collect_no as lossNo,
             b.collect_no as lossNo,
             b.collect_date as createTime
             b.collect_date as createTime

+ 8 - 0
jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/loss/mapper/xml/PsiLossDetailedMapper.xml

@@ -15,12 +15,18 @@
             a.recipient_agent,
             a.recipient_agent,
             a.collect_type,
             a.collect_type,
             a.goods_name,
             a.goods_name,
+            a.inventory_id,
             a.loss_number,
             a.loss_number,
+            a.loss_reason,
             a.company,
             a.company,
+            a.brand,
+            a.specification,
             a.produce_date,
             a.produce_date,
             a.shelf_life,
             a.shelf_life,
             a.spec,
             a.spec,
             a.shelf_life_unit,
             a.shelf_life_unit,
+            bas.ware_house_number,
+            bas.ware_house_date,
             su.name AS recipientAgent,
             su.name AS recipientAgent,
             su.id AS recipientAgentId,
             su.id AS recipientAgentId,
             so.name AS recipientOffice,
             so.name AS recipientOffice,
@@ -30,6 +36,8 @@
         FROM psi_management_loss_detailed a
         FROM psi_management_loss_detailed a
         LEFT JOIN sys_user su ON a.recipient_agent = su.id
         LEFT JOIN sys_user su ON a.recipient_agent = su.id
         LEFT JOIN sys_office so ON su.office_id = so.id
         LEFT JOIN sys_office so ON su.office_id = so.id
+        LEFT JOIN psi_management_warehouse_detailed wd ON a.inventory_id = wd.id
+        LEFT JOIN psi_management_warehouse_basics bas ON wd.basic_id = bas.id
 
 
         LEFT JOIN psi_management_type d ON a.collect_type = d.id
         LEFT JOIN psi_management_type d ON a.collect_type = d.id
         WHERE a.basic_id = #{id}
         WHERE a.basic_id = #{id}

+ 81 - 91
jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/loss/service/PsiLossService.java

@@ -1,6 +1,5 @@
 package com.jeeplus.psimanage.loss.service;
 package com.jeeplus.psimanage.loss.service;
 
 
-import cn.hutool.core.collection.CollUtil;
 import cn.hutool.extra.spring.SpringUtil;
 import cn.hutool.extra.spring.SpringUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -21,7 +20,6 @@ import com.jeeplus.psimanage.loss.service.dto.PsiLossExportDto;
 import com.jeeplus.psimanage.oss.service.dto.WorkAttachmentDto;
 import com.jeeplus.psimanage.oss.service.dto.WorkAttachmentDto;
 import com.jeeplus.psimanage.psiWareHouse.domain.PsiWareHouseDetailed;
 import com.jeeplus.psimanage.psiWareHouse.domain.PsiWareHouseDetailed;
 import com.jeeplus.psimanage.psiWareHouse.mapper.PsiWareHouseDetailedMapper;
 import com.jeeplus.psimanage.psiWareHouse.mapper.PsiWareHouseDetailedMapper;
-import com.jeeplus.psimanage.psiWareHouse.mapper.PsiWareHouseSummaryMapper;
 import com.jeeplus.psimanage.purchase.service.PsiMaterialService;
 import com.jeeplus.psimanage.purchase.service.PsiMaterialService;
 import com.jeeplus.psimanage.serialNumTpl.service.PsiSerialnumTplService;
 import com.jeeplus.psimanage.serialNumTpl.service.PsiSerialnumTplService;
 import com.jeeplus.sys.feign.IRoleApi;
 import com.jeeplus.sys.feign.IRoleApi;
@@ -58,9 +56,6 @@ public class PsiLossService {
     private PsiMaterialService psiMaterialService;
     private PsiMaterialService psiMaterialService;
 
 
     @Resource
     @Resource
-    private PsiWareHouseSummaryMapper summaryMapper;
-
-    @Resource
     private PsiWareHouseDetailedMapper psiWareHouseDetailedMapper;
     private PsiWareHouseDetailedMapper psiWareHouseDetailedMapper;
 
 
     @Resource
     @Resource
@@ -95,9 +90,6 @@ public class PsiLossService {
 
 
     public String add(PsiLossDto dto, UserDTO userDTO) throws Exception {
     public String add(PsiLossDto dto, UserDTO userDTO) throws Exception {
         validateDetailInfos(dto.getDetailInfos());
         validateDetailInfos(dto.getDetailInfos());
-        PsiLossDetailed detail = dto.getDetailInfos().get(0);
-        prepareDetail(detail, userDTO);
-        fillStockInfo(detail);
 
 
         String id = UUID.randomUUID().toString().replace("-", "");
         String id = UUID.randomUUID().toString().replace("-", "");
         PsiLossBasic info = new PsiLossBasic();
         PsiLossBasic info = new PsiLossBasic();
@@ -112,17 +104,23 @@ public class PsiLossService {
         info.setDelFlag(0);
         info.setDelFlag(0);
         basicMapper.insert(info);
         basicMapper.insert(info);
 
 
-        detail.setId(UUID.randomUUID().toString().replace("-", ""));
-        detail.setBasicId(id);
-        detailedMapper.insert(detail);
-        saveDetailFiles(detail, userDTO);
+        for (PsiLossDetailed detail : dto.getDetailInfos()) {
+            prepareDetail(detail, userDTO);
+            fillStockInfo(detail);
+            detail.setId(UUID.randomUUID().toString().replace("-", ""));
+            detail.setBasicId(id);
+            detailedMapper.insert(detail);
+            saveDetailFiles(detail, userDTO);
+        }
 
 
         if (CollectionUtils.isNotEmpty(dto.getFiles())) {
         if (CollectionUtils.isNotEmpty(dto.getFiles())) {
             psiMaterialService.saveFiles(dto.getFiles(), userDTO, id);
             psiMaterialService.saveFiles(dto.getFiles(), userDTO, id);
         }
         }
 
 
         if (isApproved(info.getStatus())) {
         if (isApproved(info.getStatus())) {
-            deductInventory(detail);
+            for (PsiLossDetailed detail : dto.getDetailInfos()) {
+                deductInventory(detail);
+            }
         }
         }
         return id;
         return id;
     }
     }
@@ -144,13 +142,10 @@ public class PsiLossService {
 
 
         List<String> dbIds = detailedMapper.getIdByBasicId(dto.getId());
         List<String> dbIds = detailedMapper.getIdByBasicId(dto.getId());
         List<String> liveIds = new ArrayList<>();
         List<String> liveIds = new ArrayList<>();
-        PsiLossDetailed detail = dto.getDetailInfos().get(0);
-        prepareDetail(detail, userDTO);
-        fillStockInfo(detail);
-        detail.setBasicId(dto.getId());
-
-        if (StringUtils.isNotBlank(detail.getId())) {
-            liveIds.add(detail.getId());
+        for (PsiLossDetailed detail : dto.getDetailInfos()) {
+            if (StringUtils.isNotBlank(detail.getId())) {
+                liveIds.add(detail.getId());
+            }
         }
         }
         if (CollectionUtils.isNotEmpty(dbIds)) {
         if (CollectionUtils.isNotEmpty(dbIds)) {
             dbIds.stream()
             dbIds.stream()
@@ -161,22 +156,29 @@ public class PsiLossService {
                     });
                     });
         }
         }
 
 
-        if (StringUtils.isBlank(detail.getId()) || detailedMapper.selectById(detail.getId()) == null) {
-            detail.setId(UUID.randomUUID().toString().replace("-", ""));
-            detail.setCreateById(userDTO.getId());
-            detail.setCreateTime(new Date());
-            detail.setDelFlag(0);
-            detailedMapper.insert(detail);
-            saveDetailFiles(detail, userDTO);
-        } else {
-            detailedMapper.updateById(detail);
-            psiMaterialService.updateFiles(detail.getFileInfoLost(), userDTO, detail.getId());
+        for (PsiLossDetailed detail : dto.getDetailInfos()) {
+            prepareDetail(detail, userDTO);
+            fillStockInfo(detail);
+            detail.setBasicId(dto.getId());
+            if (StringUtils.isBlank(detail.getId()) || detailedMapper.selectById(detail.getId()) == null) {
+                detail.setId(UUID.randomUUID().toString().replace("-", ""));
+                detail.setCreateById(userDTO.getId());
+                detail.setCreateTime(new Date());
+                detail.setDelFlag(0);
+                detailedMapper.insert(detail);
+                saveDetailFiles(detail, userDTO);
+            } else {
+                detailedMapper.updateById(detail);
+                psiMaterialService.updateFiles(detail.getFileInfoLost(), userDTO, detail.getId());
+            }
         }
         }
 
 
         psiMaterialService.updateFiles(dto.getFiles(), userDTO, dto.getId());
         psiMaterialService.updateFiles(dto.getFiles(), userDTO, dto.getId());
 
 
         if (!isApproved(oldInfo.getStatus()) && isApproved(info.getStatus())) {
         if (!isApproved(oldInfo.getStatus()) && isApproved(info.getStatus())) {
-            deductInventory(detail);
+            for (PsiLossDetailed detail : dto.getDetailInfos()) {
+                deductInventory(detail);
+            }
             //通知发起人
             //通知发起人
             List<UserDTO> notifiedPartyUsers = new ArrayList<>();
             List<UserDTO> notifiedPartyUsers = new ArrayList<>();
             SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
             SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
@@ -217,7 +219,7 @@ public class PsiLossService {
         List<PsiLossDetailed> detailList = detailedMapper.getByBasicId(id);
         List<PsiLossDetailed> detailList = detailedMapper.getByBasicId(id);
         if (CollectionUtils.isNotEmpty(detailList)) {
         if (CollectionUtils.isNotEmpty(detailList)) {
             detailList.forEach(detail -> {
             detailList.forEach(detail -> {
-                detail.setSurplusNumber(formatNumber(getAvailableBottleCount(detail.getGoodsName(), getCollectTypeId(detail))));
+                detail.setSurplusNumber(formatNumber(getAvailableBottleCount(detail)));
                 List<WorkAttachmentDto> fileList = detailedMapper.getByAttachmentId(detail.getId());
                 List<WorkAttachmentDto> fileList = detailedMapper.getByAttachmentId(detail.getId());
                 if (CollectionUtils.isNotEmpty(fileList)) {
                 if (CollectionUtils.isNotEmpty(fileList)) {
                     fileList.forEach(file -> file.setCreateBy(SpringUtil.getBean(IUserApi.class).getById(file.getBy())));
                     fileList.forEach(file -> file.setCreateBy(SpringUtil.getBean(IUserApi.class).getById(file.getBy())));
@@ -300,21 +302,27 @@ public class PsiLossService {
         if (CollectionUtils.isEmpty(detailInfos)) {
         if (CollectionUtils.isEmpty(detailInfos)) {
             throw new RuntimeException("报损明细不能为空");
             throw new RuntimeException("报损明细不能为空");
         }
         }
-        if (detailInfos.size() != 1) {
-            throw new RuntimeException("报损单只能保存一条明细");
-        }
-        PsiLossDetailed detail = detailInfos.get(0);
-        if (StringUtils.isBlank(detail.getRecipientAgentId())) {
-            throw new RuntimeException("报损人不能为空");
-        }
-        if (StringUtils.isBlank(getCollectTypeId(detail))) {
-            throw new RuntimeException("报损类型不能为空");
-        }
-        if (StringUtils.isBlank(detail.getGoodsName())) {
-            throw new RuntimeException("物品名称不能为空");
-        }
-        if (StringUtils.isBlank(detail.getLossNumber())) {
-            throw new RuntimeException("报损数量不能为空");
+        for (int i = 0; i < detailInfos.size(); i++) {
+            PsiLossDetailed detail = detailInfos.get(i);
+            String lineNo = String.valueOf(i + 1);
+            if (StringUtils.isBlank(detail.getRecipientAgentId())) {
+                throw new RuntimeException("报损明细第" + lineNo + "行报损人不能为空");
+            }
+            if (StringUtils.isBlank(getCollectTypeId(detail))) {
+                throw new RuntimeException("报损明细第" + lineNo + "行报损类型不能为空");
+            }
+            if (StringUtils.isBlank(detail.getGoodsName())) {
+                throw new RuntimeException("报损明细第" + lineNo + "行物品名称不能为空");
+            }
+            if (StringUtils.isBlank(detail.getInventoryId())) {
+                throw new RuntimeException("报损明细第" + lineNo + "行请选择报损库存批次");
+            }
+            if (StringUtils.isBlank(detail.getLossNumber())) {
+                throw new RuntimeException("报损明细第" + lineNo + "行报损数量不能为空");
+            }
+            if (StringUtils.isBlank(detail.getLossReason())) {
+                throw new RuntimeException("报损明细第" + lineNo + "行报损原因不能为空");
+            }
         }
         }
     }
     }
 
 
@@ -337,59 +345,40 @@ public class PsiLossService {
     }
     }
 
 
     private void fillStockInfo(PsiLossDetailed detail) {
     private void fillStockInfo(PsiLossDetailed detail) {
-        detail.setSurplusNumber(formatNumber(getAvailableBottleCount(detail.getGoodsName(), getCollectTypeId(detail))));
+        detail.setSurplusNumber(formatNumber(getAvailableBottleCount(detail)));
     }
     }
 
 
     private void deductInventory(PsiLossDetailed detail) {
     private void deductInventory(PsiLossDetailed detail) {
         double lossNumber = parseDouble(detail.getLossNumber());
         double lossNumber = parseDouble(detail.getLossNumber());
-        double available = getAvailableBottleCount(detail.getGoodsName(), getCollectTypeId(detail));
+        PsiWareHouseDetailed inventory = getInventory(detail.getInventoryId());
+        double spec = parseSpec(inventory.getSpec());
+        double available = round(parseDouble(inventory.getCurrentInventory()) * spec);
         if (lossNumber - available > 0.001D) {
         if (lossNumber - available > 0.001D) {
-            throw new RuntimeException("报损数量不能大于当前库存数量");
-        }
-        List<PsiWareHouseDetailed> updateList = batchCalculation(detail);
-        if (CollUtil.isNotEmpty(updateList)) {
-            psiWareHouseDetailedMapper.updateBatchById(updateList);
+            throw new RuntimeException("报损数量不能大于当前批次库存数量");
         }
         }
+        PsiWareHouseDetailed update = new PsiWareHouseDetailed();
+        update.setId(inventory.getId());
+        update.setCurrentInventory(formatNumber(round((available - lossNumber) / spec)));
+        psiWareHouseDetailedMapper.updateBatchById(Collections.singletonList(update));
     }
     }
 
 
-    private List<PsiWareHouseDetailed> batchCalculation(PsiLossDetailed detail) {
-        List<PsiWareHouseDetailed> inventoryList = summaryMapper.getInfoByProduceDateDesc(detail.getGoodsName(), getCollectTypeId(detail));
-        List<PsiWareHouseDetailed> updateList = new ArrayList<>();
-        double pending = parseDouble(detail.getLossNumber());
-        for (PsiWareHouseDetailed inventory : inventoryList) {
-            if (pending <= 0.001D) {
-                break;
-            }
-            double currentBox = parseDouble(inventory.getCurrentInventory());
-            double spec = parseSpec(inventory.getSpec());
-            double totalUnit = round(currentBox * spec);
-            if (totalUnit <= 0.001D) {
-                continue;
-            }
-            PsiWareHouseDetailed update = new PsiWareHouseDetailed();
-            update.setId(inventory.getId());
-            if (totalUnit >= pending) {
-                update.setCurrentInventory(formatNumber(round((totalUnit - pending) / spec)));
-                pending = 0D;
-            } else {
-                update.setCurrentInventory("0");
-                pending = round(pending - totalUnit);
-            }
-            updateList.add(update);
+    private double getAvailableBottleCount(PsiLossDetailed detail) {
+        if (detail == null || StringUtils.isBlank(detail.getInventoryId())) {
+            return 0D;
         }
         }
-        return updateList;
+        PsiWareHouseDetailed inventory = getInventory(detail.getInventoryId());
+        return round(parseDouble(inventory.getCurrentInventory()) * parseSpec(inventory.getSpec()));
     }
     }
 
 
-    private double getAvailableBottleCount(String goodsName, String collectTypeId) {
-        if (StringUtils.isBlank(goodsName) || StringUtils.isBlank(collectTypeId)) {
-            return 0D;
+    private PsiWareHouseDetailed getInventory(String inventoryId) {
+        if (StringUtils.isBlank(inventoryId)) {
+            throw new RuntimeException("请选择报损库存批次");
         }
         }
-        List<PsiWareHouseDetailed> inventoryList = summaryMapper.getInfoByProduceDateDesc(goodsName, collectTypeId);
-        double total = 0D;
-        for (PsiWareHouseDetailed inventory : inventoryList) {
-            total += parseDouble(inventory.getCurrentInventory()) * parseSpec(inventory.getSpec());
+        PsiWareHouseDetailed inventory = psiWareHouseDetailedMapper.selectById(inventoryId);
+        if (inventory == null || !"0".equals(String.valueOf(inventory.getDelFlag()))) {
+            throw new RuntimeException("报损库存批次不存在");
         }
         }
-        return round(total);
+        return inventory;
     }
     }
 
 
     private String getCollectTypeId(PsiLossDetailed detail) {
     private String getCollectTypeId(PsiLossDetailed detail) {
@@ -444,12 +433,13 @@ public class PsiLossService {
             recordList.forEach(record -> {
             recordList.forEach(record -> {
                 PsiLossExportDto exportDto = new PsiLossExportDto();
                 PsiLossExportDto exportDto = new PsiLossExportDto();
                 exportDto.setLossNo(item.getLossNo());
                 exportDto.setLossNo(item.getLossNo());
-                exportDto.setRecipientAgent(record.getRecipientAgent());
-                exportDto.setRecipientOffice(record.getRecipientOffice());
+                //exportDto.setRecipientAgent(record.getRecipientAgent());
+                //exportDto.setRecipientOffice(record.getRecipientOffice());
                 exportDto.setCollectType(record.getCollectType());
                 exportDto.setCollectType(record.getCollectType());
-                exportDto.setGoodsName(record.getGoodsName());
-                exportDto.setProduceDate(record.getProduceDate() == null ? "暂无生产日期" : dateFormat.format(record.getProduceDate()));
+                //exportDto.setGoodsName(record.getGoodsName());
+                //exportDto.setProduceDate(record.getProduceDate() == null ? "暂无生产日期" : dateFormat.format(record.getProduceDate()));
                 exportDto.setLossNumber(record.getLossNumber());
                 exportDto.setLossNumber(record.getLossNumber());
+                exportDto.setLossReason(record.getLossReason());
                 result.add(exportDto);
                 result.add(exportDto);
             });
             });
         });
         });

+ 13 - 10
jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/loss/service/dto/PsiLossExportDto.java

@@ -17,22 +17,25 @@ public class PsiLossExportDto {
     @ExcelProperty("报损编号")
     @ExcelProperty("报损编号")
     private String lossNo;
     private String lossNo;
 
 
-    @ExcelProperty("报损人")
-    private String recipientAgent;
+    //@ExcelProperty("报损人")
+    //private String recipientAgent;
+    //
+    //@ExcelProperty("报损部门")
+    //private String recipientOffice;
 
 
-    @ExcelProperty("报损部门")
-    private String recipientOffice;
-
-    @ExcelProperty("物品类型")
+    @ExcelProperty("物品名称")
     private String collectType;
     private String collectType;
 
 
-    @ExcelProperty("物品名称")
-    private String goodsName;
+    //@ExcelProperty("物品名称")
+    //private String goodsName;
 
 
-    @ExcelProperty("生产日期")
-    private String produceDate;
+    //@ExcelProperty("生产日期")
+    //private String produceDate;
 
 
     @ExcelProperty("报损数量")
     @ExcelProperty("报损数量")
     private String lossNumber;
     private String lossNumber;
 
 
+    @ExcelProperty("报损原因")
+    private String lossReason;
+
 }
 }

+ 32 - 0
jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/materialType/domain/PsiMaterialTypeInfo.java

@@ -80,7 +80,39 @@ public class PsiMaterialTypeInfo extends TreeEntity<PsiMaterialTypeInfo> {
 
 
     private String parentIds;
     private String parentIds;
 
 
+    /**
+     * 信息类别:0分类,1商品
+     */
+    private String infoType;
+
+    /**
+     * 品牌
+     */
+    private String brand;
+
+    /**
+     * 规格
+     */
+    private String specification;
+
+    /**
+     * 单位
+     */
+    private String company;
+
     @TableField(exist = false)
     @TableField(exist = false)
     private Boolean disabled = false;
     private Boolean disabled = false;
 
 
+    /**
+     * 当前剩余库存数量
+     */
+    @TableField(exist = false)
+    private String currentInventory;
+
+    /**
+     * 剩余库存数量,兼容领用页面原有字段
+     */
+    @TableField(exist = false)
+    private String surplusNumber;
+
 }
 }

+ 19 - 1
jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/materialType/mapper/xml/PsiMaterialTypeMapper.xml

@@ -14,6 +14,12 @@
 		<result property="sort" column="sort" jdbcType="VARCHAR"/>
 		<result property="sort" column="sort" jdbcType="VARCHAR"/>
 		<result property="parentId" column="parent_id" jdbcType="VARCHAR"/>
 		<result property="parentId" column="parent_id" jdbcType="VARCHAR"/>
 		<result property="parentIds" column="parent_ids" jdbcType="VARCHAR"/>
 		<result property="parentIds" column="parent_ids" jdbcType="VARCHAR"/>
+		<result property="infoType" column="info_type" jdbcType="VARCHAR"/>
+		<result property="brand" column="brand" jdbcType="VARCHAR"/>
+		<result property="specification" column="specification" jdbcType="VARCHAR"/>
+		<result property="company" column="company" jdbcType="VARCHAR"/>
+		<result property="currentInventory" column="current_inventory" jdbcType="VARCHAR"/>
+		<result property="surplusNumber" column="current_inventory" jdbcType="VARCHAR"/>
 
 
 	</resultMap>
 	</resultMap>
 
 
@@ -29,7 +35,19 @@
 		a.name,
 		a.name,
 		a.sort,
 		a.sort,
 		a.parent_id,
 		a.parent_id,
-		a.parent_ids
+		a.parent_ids,
+		a.info_type,
+		a.brand,
+		a.specification,
+		a.company,
+		IFNULL((
+			SELECT SUM(CAST(IFNULL(NULLIF(wd.current_inventory, ''), '0') AS DECIMAL(18,4)))
+			FROM psi_management_warehouse_detailed wd
+			LEFT JOIN psi_management_warehouse_basics wb ON wd.basic_id = wb.id AND wb.del_flag = 0
+			WHERE wd.del_flag = 0
+			  AND wd.ware_house_type = a.id
+			  AND (wb.id IS NULL OR wb.status IN ('0', '5'))
+		), 0) AS current_inventory
     </sql>
     </sql>
 
 
 
 

+ 29 - 1
jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/materialType/service/PsiMaterialTypeService.java

@@ -176,7 +176,7 @@ public class PsiMaterialTypeService extends ServiceImpl<PsiMaterialTypeMapper, P
 
 
         wrapper.eq(BaseEntity::getDelFlag, 0);
         wrapper.eq(BaseEntity::getDelFlag, 0);
         wrapper.orderByAsc(PsiMaterialTypeInfo::getSort);
         wrapper.orderByAsc(PsiMaterialTypeInfo::getSort);
-        return mapper.selectList(wrapper);
+        return mapper.findList(wrapper);
     }
     }
 
 
     public String saveM(PsiMaterialTypeInfo info) {
     public String saveM(PsiMaterialTypeInfo info) {
@@ -197,6 +197,9 @@ public class PsiMaterialTypeService extends ServiceImpl<PsiMaterialTypeMapper, P
      * @return
      * @return
      */
      */
     public String add(PsiMaterialTypeInfo info) {
     public String add(PsiMaterialTypeInfo info) {
+        if (!prepareMaterialTypeInfo(info)) {
+            return "false";
+        }
 
 
         // 判断名称是否已存在
         // 判断名称是否已存在
         Integer isExist = mapper.checkNameIsExist(info.getName(), info.getParentId());
         Integer isExist = mapper.checkNameIsExist(info.getName(), info.getParentId());
@@ -229,12 +232,37 @@ public class PsiMaterialTypeService extends ServiceImpl<PsiMaterialTypeMapper, P
         UserDTO userDto = SpringUtil.getBean ( IUserApi.class ).getByToken(TokenProvider.getCurrentToken ( ));
         UserDTO userDto = SpringUtil.getBean ( IUserApi.class ).getByToken(TokenProvider.getCurrentToken ( ));
         // 获取当前登录人信息
         // 获取当前登录人信息
 //        UserDTO userDto = UserUtils.getCurrentUserDTO();
 //        UserDTO userDto = UserUtils.getCurrentUserDTO();
+        if (!prepareMaterialTypeInfo(info)) {
+            return "false";
+        }
         info.setUpdateBy(userDto.getId());
         info.setUpdateBy(userDto.getId());
         info.setUpdateDate(new Date());
         info.setUpdateDate(new Date());
         mapper.updateById(info);
         mapper.updateById(info);
         return "操作完成";
         return "操作完成";
     }
     }
 
 
+    private boolean prepareMaterialTypeInfo(PsiMaterialTypeInfo info) {
+        if (info == null) {
+            return true;
+        }
+        if (StringUtils.isBlank(info.getInfoType())) {
+            info.setInfoType("0");
+        }
+        if (StringUtils.isNotBlank(info.getParentId()) && !"0".equals(info.getParentId())) {
+            PsiMaterialTypeInfo parentInfo = mapper.selectById(info.getParentId());
+            if (parentInfo != null && "1".equals(parentInfo.getInfoType())) {
+                return false;
+            }
+        }
+        if (!"1".equals(info.getInfoType())) {
+            info.setInfoType("0");
+            info.setBrand(null);
+            info.setSpecification(null);
+            info.setCompany(null);
+        }
+        return true;
+    }
+
     /**
     /**
      * 生成序号/层级
      * 生成序号/层级
      * @param info
      * @param info

+ 10 - 0
jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/psiWareHouse/domain/PsiWareHouseDetailed.java

@@ -78,6 +78,11 @@ public class PsiWareHouseDetailed extends BaseEntity {
     private String company;
     private String company;
 
 
     /**
     /**
+     * 品牌
+     */
+    private String brand;
+
+    /**
      * 商品总价
      * 商品总价
      */
      */
     private String tradeTotalPrice;
     private String tradeTotalPrice;
@@ -138,6 +143,11 @@ public class PsiWareHouseDetailed extends BaseEntity {
     private String spec;
     private String spec;
 
 
     /**
     /**
+     * 规格
+     */
+    private String specification;
+
+    /**
      * 生产日期
      * 生产日期
      */
      */
     @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
     @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")

+ 13 - 5
jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/psiWareHouse/mapper/xml/PsiWareHouseBasicMapper.xml

@@ -38,6 +38,8 @@
 				a.create_time as createDate,
 				a.create_time as createDate,
 				a.ware_house_type,
 				a.ware_house_type,
 				a.trade_name,
 				a.trade_name,
+				a.brand,
+				a.specification,
 				a.company,
 				a.company,
 				b.NAME AS wareHouseTypeName,
 				b.NAME AS wareHouseTypeName,
 				sum( trade_number ) AS allNumber,
 				sum( trade_number ) AS allNumber,
@@ -78,6 +80,8 @@
 			a.create_time as createDate,
 			a.create_time as createDate,
 			a.ware_house_type,
 			a.ware_house_type,
 			a.trade_name,
 			a.trade_name,
+			a.brand,
+			a.specification,
 			a.company,
 			a.company,
 			c.name as wareHouseTypeName,
 			c.name as wareHouseTypeName,
 			sum( trade_number ) AS allNumber,
 			sum( trade_number ) AS allNumber,
@@ -339,21 +343,25 @@
 		SELECT
 		SELECT
 			a.id,
 			a.id,
 			a.produce_date as produce_date,
 			a.produce_date as produce_date,
+			a.ware_house_type,
 			a.trade_name,
 			a.trade_name,
 			a.spec,
 			a.spec,
+			a.specification,
 			a.company,
 			a.company,
+			a.brand,
 			a.current_inventory,
 			a.current_inventory,
-			pmwd.warn_num,
-			pmwd.warn_flag
+			a.warn_num,
+			a.warn_flag,
+			bas.ware_house_number,
+			bas.ware_house_date
 		FROM
 		FROM
 			psi_management_warehouse_detailed a
 			psi_management_warehouse_detailed a
 				LEFT JOIN psi_management_warehouse_basics bas on a.basic_id = bas.id
 				LEFT JOIN psi_management_warehouse_basics bas on a.basic_id = bas.id
-				LEFT JOIN psi_management_warehouse_detailed pmwd on bas.id = pmwd.basic_id
 				left join psi_management_type c on a.ware_house_type = c.id
 				left join psi_management_type c on a.ware_house_type = c.id
 			${ew.customSqlSegment}
 			${ew.customSqlSegment}
 
 
-		GROUP BY a.trade_name,a.ware_house_type,a.produce_date
-		ORDER BY a.produce_date asc
+		GROUP BY a.id
+		ORDER BY a.create_time asc
 	</select>
 	</select>
 	<select id="getAllData"
 	<select id="getAllData"
 			resultType="com.jeeplus.psimanage.psiWareHouse.service.dto.PsiWareHouseDto">
 			resultType="com.jeeplus.psimanage.psiWareHouse.service.dto.PsiWareHouseDto">

+ 93 - 9
jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/psiWareHouse/service/PsiWareHouseBasicService.java

@@ -155,8 +155,8 @@ public class PsiWareHouseBasicService {
         //根据时间查询当前库存
         //根据时间查询当前库存
         iPage.getRecords().stream().forEach(i->{
         iPage.getRecords().stream().forEach(i->{
             //根据商品名称,物品类型,时间查当前库存
             //根据商品名称,物品类型,时间查当前库存
-            String d = basicMapper.getWareHouseInfoByTime(i.getTradeName(),i.getWareHouseType(),i.getProduceDate());
-            i.setCurrentInventory(d);
+            //String d = basicMapper.getWareHouseInfoByTime(i.getTradeName(),i.getWareHouseType(),i.getProduceDate());
+            //i.setCurrentInventory(d);
         });
         });
         //根据查询领用明细
         //根据查询领用明细
         return iPage;
         return iPage;
@@ -323,6 +323,7 @@ public class PsiWareHouseBasicService {
         // 获取当前登录人信息
         // 获取当前登录人信息
 //        UserDTO userDTO = UserUtils.getCurrentUserDTO();
 //        UserDTO userDTO = UserUtils.getCurrentUserDTO();
         UserDTO userDTO = SpringUtil.getBean ( IUserApi.class ).getByToken (TokenProvider.getCurrentToken ( ));
         UserDTO userDTO = SpringUtil.getBean ( IUserApi.class ).getByToken (TokenProvider.getCurrentToken ( ));
+        normalizeWareHouseAmounts(dto);
         if (StringUtils.isNotEmpty(dto.getId())) {
         if (StringUtils.isNotEmpty(dto.getId())) {
             return update(dto, userDTO);
             return update(dto, userDTO);
         } else {
         } else {
@@ -347,6 +348,7 @@ public class PsiWareHouseBasicService {
                     warehouseUpHi.setEndflag("0"); // endflag = 0 代表此数据为原数据,在回退数据的时候使用
                     warehouseUpHi.setEndflag("0"); // endflag = 0 代表此数据为原数据,在回退数据的时候使用
                     warehouseUpHi.setJsonData(jsonString);
                     warehouseUpHi.setJsonData(jsonString);
                     warehouseUpHi.setWarehouseId(dto.getId());
                     warehouseUpHi.setWarehouseId(dto.getId());
+                    fillWarehouseUpHiTradeName(warehouseUpHi, dto.getWareHouse());
                     psiWarehouseUpHiMapper.insert(warehouseUpHi);
                     psiWarehouseUpHiMapper.insert(warehouseUpHi);
                 }
                 }
             }
             }
@@ -359,17 +361,24 @@ public class PsiWareHouseBasicService {
                 if (ObjectUtil.isNotEmpty(byId)) {
                 if (ObjectUtil.isNotEmpty(byId)) {
                     // 获取修改数据的商品名称、商品类型
                     // 获取修改数据的商品名称、商品类型
                     if (CollectionUtil.isNotEmpty(byId.getWareHouse())){
                     if (CollectionUtil.isNotEmpty(byId.getWareHouse())){
+                        List<PsiWareHouseDetailed> updateTradeNameData = byId.getWareHouse().stream()
+                                .filter(this::isWareHouseUpdateHistoryDetail)
+                                .collect(Collectors.toList());
+                        List<String> updateTradeNameList = updateTradeNameData.stream()
+                                .map(this::resolveWareHouseTradeName)
+                                .filter(StringUtils::isNotBlank)
+                                .distinct()
+                                .collect(Collectors.toList());
+                        if (CollectionUtil.isNotEmpty(updateTradeNameList)) {
+                            //获取修改数据的商品名称
+                            warehouseUpHi.setUpdateTradeName(String.join(",",updateTradeNameList));
+                        }
                         List<PsiWareHouseDetailed> updateData = byId.getWareHouse().stream().filter(i -> {
                         List<PsiWareHouseDetailed> updateData = byId.getWareHouse().stream().filter(i -> {
                             if ("1".equals(i.getUpFlag()) || "2".equals(i.getUpFlag())) {
                             if ("1".equals(i.getUpFlag()) || "2".equals(i.getUpFlag())) {
                                 return true;
                                 return true;
                             }
                             }
                             return false;
                             return false;
                         }).collect(Collectors.toList());
                         }).collect(Collectors.toList());
-                        List<String> updateTradeNameList = updateData.stream().map(PsiWareHouseDetailed::getTradeName).collect(Collectors.toList());
-                        if (CollectionUtil.isNotEmpty(updateTradeNameList)) {
-                            //获取修改数据的商品名称
-                            warehouseUpHi.setUpdateTradeName(String.join(",",updateTradeNameList));
-                        }
                         List<String> updateTradeTypeList = updateData.stream().map(PsiWareHouseDetailed::getWareHouseType).collect(Collectors.toList()).stream().distinct().collect(Collectors.toList());
                         List<String> updateTradeTypeList = updateData.stream().map(PsiWareHouseDetailed::getWareHouseType).collect(Collectors.toList()).stream().distinct().collect(Collectors.toList());
                         if (CollectionUtil.isNotEmpty(updateTradeTypeList)) {
                         if (CollectionUtil.isNotEmpty(updateTradeTypeList)) {
                             //获取修改数据的商品类型
                             //获取修改数据的商品类型
@@ -432,7 +441,7 @@ public class PsiWareHouseBasicService {
                 List<UserDTO> notifiedPartyUsers = new ArrayList<>();
                 List<UserDTO> notifiedPartyUsers = new ArrayList<>();
                 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
                 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
                 String day = format.format(new Date());
                 String day = format.format(new Date());
-                String title = "[入库修改:"+dto.getPurchaseNo()+"]-入库修改申请审批通过";
+                String title = "[入库修改:"+dto.getWareHouseNumber()+"]-入库修改申请审批通过";
                 UserDTO initiator = SpringUtil.getBean(IUserApi.class).getById(dto.getHandledById());
                 UserDTO initiator = SpringUtil.getBean(IUserApi.class).getById(dto.getHandledById());
                 notifiedPartyUsers.add(initiator);
                 notifiedPartyUsers.add(initiator);
                 //向用户发起通知
                 //向用户发起通知
@@ -473,6 +482,7 @@ public class PsiWareHouseBasicService {
                 if (CollectionUtils.isNotEmpty(dto.getWareHouse())) {
                 if (CollectionUtils.isNotEmpty(dto.getWareHouse())) {
                     dto.getWareHouse().stream().forEach(item -> {
                     dto.getWareHouse().stream().forEach(item -> {
                         item.setWareHouseMan(item.getWareHouseManId());
                         item.setWareHouseMan(item.getWareHouseManId());
+                        fillWareHouseLegacyTradeName(item);
                         item.setWareHouseType(item.getWareHouseTypeId());
                         item.setWareHouseType(item.getWareHouseTypeId());
                         psiDetailedMapper.insert(item);
                         psiDetailedMapper.insert(item);
                         // 保存附件信息列表
                         // 保存附件信息列表
@@ -505,6 +515,7 @@ public class PsiWareHouseBasicService {
             });
             });
             dto.getWareHouse().stream().forEach(detailInfo -> {
             dto.getWareHouse().stream().forEach(detailInfo -> {
                 detailInfo.setWareHouseMan(detailInfo.getWareHouseManId());
                 detailInfo.setWareHouseMan(detailInfo.getWareHouseManId());
+                fillWareHouseLegacyTradeName(detailInfo);
                 detailInfo.setWareHouseType(detailInfo.getWareHouseTypeId());
                 detailInfo.setWareHouseType(detailInfo.getWareHouseTypeId());
                 detailInfo.setBasicId(dto.getId()); // 保存基础表信息主键值
                 detailInfo.setBasicId(dto.getId()); // 保存基础表信息主键值
                 detailInfo.setTradeTotalPrice(dto.getWareHouseTotalPrice());
                 detailInfo.setTradeTotalPrice(dto.getWareHouseTotalPrice());
@@ -658,12 +669,13 @@ public class PsiWareHouseBasicService {
                 detailed.setUpdateById(userDTO.getId());
                 detailed.setUpdateById(userDTO.getId());
                 detailed.setUpdateTime(new Date());
                 detailed.setUpdateTime(new Date());
                 detailed.setDelFlag(0);
                 detailed.setDelFlag(0);
+                fillWareHouseLegacyTradeName(detailed);
                 detailed.setWareHouseType(detailed.getWareHouseTypeId());
                 detailed.setWareHouseType(detailed.getWareHouseTypeId());
                 // 保存基础表信息主键值
                 // 保存基础表信息主键值
                 detailed.setBasicId(id);
                 detailed.setBasicId(id);
                 detailed.setTradeTotalPrice(dto.getWareHouseTotalPrice());
                 detailed.setTradeTotalPrice(dto.getWareHouseTotalPrice());
                 detailed.setUpFlag("0");
                 detailed.setUpFlag("0");
-                if(detailed.getSpec().equals("0")){
+                if ("0".equals(detailed.getSpec())) {
                     detailed.setSpec("1");
                     detailed.setSpec("1");
                 }
                 }
                 if (StringUtils.isNotBlank(detailed.getWareHouseType()) && StringUtils.isNotBlank(detailed.getTradeName())) {
                 if (StringUtils.isNotBlank(detailed.getWareHouseType()) && StringUtils.isNotBlank(detailed.getTradeName())) {
@@ -863,6 +875,78 @@ public class PsiWareHouseBasicService {
         }
         }
     }
     }
 
 
+    private void normalizeWareHouseAmounts(PsiWareHouseDto dto) {
+        if (dto == null) {
+            return;
+        }
+        dto.setTradePrice(blankToNull(dto.getTradePrice()));
+        dto.setTradeNumber(blankToNull(dto.getTradeNumber()));
+        dto.setWareHouseTotalPrice(blankToNull(dto.getWareHouseTotalPrice()));
+        dto.setWareHouseActualPrice(blankToNull(dto.getWareHouseActualPrice()));
+        dto.setActualPrice(blankToNull(dto.getActualPrice()));
+        if (CollectionUtils.isEmpty(dto.getWareHouse())) {
+            return;
+        }
+        dto.getWareHouse().forEach(detail -> {
+            detail.setTradePrice(blankToNull(detail.getTradePrice()));
+            detail.setTradeNumber(blankToNull(detail.getTradeNumber()));
+            detail.setTradeTotalPrice(blankToNull(detail.getTradeTotalPrice()));
+            detail.setActualPrice(blankToNull(detail.getActualPrice()));
+            detail.setCurrentInventory(blankToNull(detail.getCurrentInventory()));
+            if (StringUtils.isBlank(detail.getSpec())) {
+                detail.setSpec("1");
+            }
+        });
+    }
+
+    private String blankToNull(String value) {
+        return StringUtils.isBlank(value) ? null : value;
+    }
+
+    private void fillWareHouseLegacyTradeName(PsiWareHouseDetailed detail) {
+        if (detail == null) {
+            return;
+        }
+        if (StringUtils.isBlank(detail.getTradeName()) && StringUtils.isNotBlank(detail.getWareHouseType())) {
+            detail.setTradeName(detail.getWareHouseType());
+        }
+    }
+
+    private void fillWarehouseUpHiTradeName(PsiWarehouseUpHi warehouseUpHi, List<PsiWareHouseDetailed> wareHouseList) {
+        if (warehouseUpHi == null || CollectionUtils.isEmpty(wareHouseList)) {
+            return;
+        }
+        List<String> tradeNameList = wareHouseList.stream()
+                .map(this::resolveWareHouseTradeName)
+                .filter(StringUtils::isNotBlank)
+                .distinct()
+                .collect(Collectors.toList());
+        if (CollectionUtil.isNotEmpty(tradeNameList)) {
+            warehouseUpHi.setUpdateTradeName(String.join(",", tradeNameList));
+        }
+    }
+
+    private boolean isWareHouseUpdateHistoryDetail(PsiWareHouseDetailed detail) {
+        if (detail == null) {
+            return false;
+        }
+        return "1".equals(detail.getUpFlag()) || "2".equals(detail.getUpFlag())
+                || ("0".equals(detail.getUpFlag()) && StringUtils.isNotBlank(detail.getSourceId()));
+    }
+
+    private String resolveWareHouseTradeName(PsiWareHouseDetailed detail) {
+        if (detail == null) {
+            return "";
+        }
+        if (StringUtils.isNotBlank(detail.getTradeName())) {
+            return detail.getTradeName();
+        }
+        if (StringUtils.isNotBlank(detail.getWareHouseType())) {
+            return detail.getWareHouseType();
+        }
+        return "";
+    }
+
     private String formatShelfLife(String shelfLife, String shelfLifeUnit) {
     private String formatShelfLife(String shelfLife, String shelfLifeUnit) {
         if (StringUtils.isBlank(shelfLife)) {
         if (StringUtils.isBlank(shelfLife)) {
             return "";
             return "";

+ 10 - 0
jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/psiWareHouse/service/dto/PsiWareHouseDto.java

@@ -102,6 +102,11 @@ public class PsiWareHouseDto {
      */
      */
     private String company;
     private String company;
 
 
+    /**
+     * 品牌
+     */
+    private String brand;
+
 
 
 
 
     /**
     /**
@@ -335,6 +340,11 @@ public class PsiWareHouseDto {
     private String spec;
     private String spec;
 
 
     /**
     /**
+     * 规格
+     */
+    private String specification;
+
+    /**
      * 生产日期
      * 生产日期
      */
      */
     @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
     @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")

+ 10 - 0
jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/purchase/domain/PsiMaterialDetailed.java

@@ -107,6 +107,16 @@ public class PsiMaterialDetailed extends BaseEntity {
     private String spec;
     private String spec;
 
 
     /**
     /**
+     * 规格
+     */
+    private String specification;
+
+    /**
+     * 品牌
+     */
+    private String brand;
+
+    /**
      * 生产日期
      * 生产日期
      */
      */
     @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
     @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")

+ 35 - 0
jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/purchase/service/PsiMaterialService.java

@@ -248,6 +248,7 @@ public class PsiMaterialService {
         String bearerToken = authentication.getCredentials().toString();
         String bearerToken = authentication.getCredentials().toString();
         // 获取当前登录人信息
         // 获取当前登录人信息
         UserDTO userDTO = SpringUtil.getBean ( IUserApi.class ).getByToken (TokenProvider.getCurrentToken ( ));
         UserDTO userDTO = SpringUtil.getBean ( IUserApi.class ).getByToken (TokenProvider.getCurrentToken ( ));
+        normalizePurchaseAmounts(dto);
         if (StringUtils.isNotEmpty(dto.getId()) && !dto.getId().equals("false")) {
         if (StringUtils.isNotEmpty(dto.getId()) && !dto.getId().equals("false")) {
             return update(dto, userDTO);
             return update(dto, userDTO);
         } else {
         } else {
@@ -279,6 +280,7 @@ public class PsiMaterialService {
                 // 生成id
                 // 生成id
                 String detailId = UUID.randomUUID().toString().replace("-", "");
                 String detailId = UUID.randomUUID().toString().replace("-", "");
                 detailed.setId(detailId);
                 detailed.setId(detailId);
+                fillPurchaseLegacyTradeName(detailed);
                 detailed.setPurchaserAgent(detailed.getPurchaserAgentId());
                 detailed.setPurchaserAgent(detailed.getPurchaserAgentId());
                 detailed.setProcurementType(detailed.getProcurementTypeId());
                 detailed.setProcurementType(detailed.getProcurementTypeId());
                 detailed.setCreateById(userDTO.getId());
                 detailed.setCreateById(userDTO.getId());
@@ -373,6 +375,7 @@ public class PsiMaterialService {
                     // 生成id
                     // 生成id
                     String detailId = UUID.randomUUID().toString().replace("-", "");
                     String detailId = UUID.randomUUID().toString().replace("-", "");
                     detailInfo.setId(detailId);
                     detailInfo.setId(detailId);
+                    fillPurchaseLegacyTradeName(detailInfo);
                     detailInfo.setPurchaserAgent(detailInfo.getPurchaserAgentId());
                     detailInfo.setPurchaserAgent(detailInfo.getPurchaserAgentId());
                     detailInfo.setProcurementType(detailInfo.getProcurementTypeId());
                     detailInfo.setProcurementType(detailInfo.getProcurementTypeId());
                     detailInfo.setCreateById(userDTO.getId());
                     detailInfo.setCreateById(userDTO.getId());
@@ -389,6 +392,7 @@ public class PsiMaterialService {
                         saveFiles(detailInfo.getFileInfoLost(), userDTO, detailInfo.getId());
                         saveFiles(detailInfo.getFileInfoLost(), userDTO, detailInfo.getId());
                     }
                     }
                 } else {
                 } else {
+                    fillPurchaseLegacyTradeName(detailInfo);
                     detailInfo.setPurchaserAgent(detailInfo.getPurchaserAgentId());
                     detailInfo.setPurchaserAgent(detailInfo.getPurchaserAgentId());
                     detailInfo.setProcurementType(detailInfo.getProcurementTypeId());
                     detailInfo.setProcurementType(detailInfo.getProcurementTypeId());
                     detailInfo.setUpdateById(userDTO.getId());
                     detailInfo.setUpdateById(userDTO.getId());
@@ -410,6 +414,37 @@ public class PsiMaterialService {
         return dto.getId();
         return dto.getId();
     }
     }
 
 
+    private void normalizePurchaseAmounts(PsiMaterialInfoDto dto) {
+        if (dto == null) {
+            return;
+        }
+        dto.setTradeTotalPrice(blankToNull(dto.getTradeTotalPrice()));
+        if (CollectionUtils.isEmpty(dto.getDetailInfos())) {
+            return;
+        }
+        dto.getDetailInfos().forEach(detail -> {
+            detail.setTradePrice(blankToNull(detail.getTradePrice()));
+            detail.setTradeNumber(blankToNull(detail.getTradeNumber()));
+            detail.setTradeTotalPrice(blankToNull(detail.getTradeTotalPrice()));
+            if (StringUtils.isBlank(detail.getSpec())) {
+                detail.setSpec("1");
+            }
+        });
+    }
+
+    private String blankToNull(String value) {
+        return StringUtils.isBlank(value) ? null : value;
+    }
+
+    private void fillPurchaseLegacyTradeName(PsiMaterialDetailed detail) {
+        if (detail == null) {
+            return;
+        }
+        if (StringUtils.isBlank(detail.getTradeName()) && StringUtils.isNotBlank(detail.getProcurementType())) {
+            detail.setTradeName(detail.getProcurementType());
+        }
+    }
+
     public PsiMaterialInfoDto findById(String id) {
     public PsiMaterialInfoDto findById(String id) {
         PsiMaterialInfoDto dto = new PsiMaterialInfoDto();
         PsiMaterialInfoDto dto = new PsiMaterialInfoDto();
         // 查询基础信息表
         // 查询基础信息表

+ 1 - 1
jeeplus-modules/jeeplus-xxl-job-executor-sample/src/main/java/com/xxl/job/executor/service/jobhandler/SampleXxlJob.java

@@ -1208,7 +1208,7 @@ public class SampleXxlJob {
     @XxlJob("nearExpiryList")
     @XxlJob("nearExpiryList")
     public void nearExpiryList() {
     public void nearExpiryList() {
         try {
         try {
-            SpringUtil.getBean(IPsiManagementApi.class).nearExpiryList();
+            //SpringUtil.getBean(IPsiManagementApi.class).nearExpiryList();
         } catch (Exception e) {
         } catch (Exception e) {
             logger.warn("调用失败,可能服务不存在", e);
             logger.warn("调用失败,可能服务不存在", e);
         }
         }