From 3870cf443bf0dfd9394bc545c8e90ac0d6dacaeb Mon Sep 17 00:00:00 2001
From: cuilei <ray_tsu1@163.com>
Date: 星期一, 08 九月 2025 17:55:05 +0800
Subject: [PATCH] 上料实体类调整、物料消耗明细基础代码、报工接口适配调整(适配上料表结构调整、并记录物料消耗明细)

---
 src/main/java/org/jeecg/modules/mes/service/impl/MesWorkReportingServiceImpl.java |  110 +++++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 79 insertions(+), 31 deletions(-)

diff --git a/src/main/java/org/jeecg/modules/mes/service/impl/MesWorkReportingServiceImpl.java b/src/main/java/org/jeecg/modules/mes/service/impl/MesWorkReportingServiceImpl.java
index 271c5aa..5a7af5a 100644
--- a/src/main/java/org/jeecg/modules/mes/service/impl/MesWorkReportingServiceImpl.java
+++ b/src/main/java/org/jeecg/modules/mes/service/impl/MesWorkReportingServiceImpl.java
@@ -18,22 +18,22 @@
 import org.jeecg.modules.lsw.entity.LswMaterial;
 import org.jeecg.modules.lsw.entity.LswMaterialInbound;
 import org.jeecg.modules.lsw.enums.MaterialCategoryEnum;
+import org.jeecg.modules.lsw.enums.MaterialInboundCategory;
 import org.jeecg.modules.lsw.service.ILswMaterialInboundService;
 import org.jeecg.modules.lsw.service.ILswMaterialService;
-import org.jeecg.modules.mes.entity.MesMaterialLoading;
-import org.jeecg.modules.mes.entity.MesProductionOrder;
-import org.jeecg.modules.mes.entity.MesProductionWorkOrder;
-import org.jeecg.modules.mes.entity.MesWorkReporting;
+import org.jeecg.modules.mes.entity.*;
 import org.jeecg.modules.mes.mapper.MesWorkReportingMapper;
-import org.jeecg.modules.mes.service.IMesMaterialLoadingService;
-import org.jeecg.modules.mes.service.IMesProductionOrderService;
-import org.jeecg.modules.mes.service.IMesProductionWorkOrderService;
-import org.jeecg.modules.mes.service.IMesWorkReportingService;
+import org.jeecg.modules.mes.service.*;
 import org.jeecg.modules.mes.utils.CommonUtils;
 import org.jeecg.modules.pms.entity.PmsMaterialProcess;
 import org.jeecg.modules.pms.service.IPmsMaterialProcessService;
 import org.jeecg.modules.pms.service.IPmsProcessBillMaterialsService;
 import org.jeecg.modules.pms.vo.ProcessBillMaterialsDetailVo;
+import org.jeecg.modules.qms.entity.InspectionPlan;
+import org.jeecg.modules.qms.entity.InspectionPlanItem;
+import org.jeecg.modules.qms.enums.PlanCategoryEnum;
+import org.jeecg.modules.qms.service.IInspectionPlanItemService;
+import org.jeecg.modules.qms.service.IInspectionPlanService;
 import org.jeecg.modules.sap.request.OrderLoadRequest;
 import org.jeecg.modules.sap.request.OrderReportRequest;
 import org.jeecg.modules.sap.service.OrderLoadService;
@@ -88,6 +88,12 @@
     private OrderReportService orderReportService;
     @Autowired
     private OrderLoadService orderLoadService;
+    @Autowired
+    private IInspectionPlanService inspectionPlanService;
+    @Autowired
+    private IInspectionPlanItemService inspectionPlanItemService;
+    @Autowired
+    private IMesMaterialConsumptionDetailService mesMaterialConsumptionDetailService;
 
     @Override
     public List<MesWorkReporting> queryWorkReportingByWorkOrderId(String workOrderId) {
@@ -101,7 +107,7 @@
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void addReporting(MesWorkReporting mesWorkReporting) {
+    public MesWorkReporting addReporting(MesWorkReporting mesWorkReporting) {
         MesProductionWorkOrder workOrder = mesProductionWorkOrderService.getById(mesWorkReporting.getWorkOrderId());
         if (workOrder == null) {
             throw new JeecgBootException("宸ュ崟涓嶅瓨鍦紒");
@@ -134,45 +140,54 @@
         int currentPallets = workOrder.getFinishedPallets() + 1;
         String batchNumber = yearLastTwo + dayOfYearStr + shiftGroup.getGroupCode() + currentPallets;
         mesWorkReporting.setBatchNumber(batchNumber)
+                .setWorkOrderCode(workOrder.getWorkOrderCode())
                 .setWarehouseId(lineSideWarehouse.getId())
+                .setWarehouseCode(lineSideWarehouse.getWarehouseCode())
                 .setReporter(Objects.requireNonNull(CommonUtils.getCurrentUser()).getUsername())
                 .setReportTime(new Date());
         String date = today.format(DateTimeFormatter.ofPattern("yyMMdd"));
         Factory factory = factoryService.getById(mesWorkReporting.getFactoryId());
         workOrder.setFactoryCode(factory.getFactoryCode());
+        List<MesMaterialConsumptionDetail> consumptionDetailList = CollectionUtil.newArrayList();
         switch (materialCategory) {
             case FINISHED_PRODUCT:
                 //鎴愬搧鎶ュ伐
-                productReport(mesWorkReporting, workOrder, lineSideWarehouse);
+                consumptionDetailList = productReport(mesWorkReporting, workOrder, lineSideWarehouse);
+                //鐢熸垚妫�楠屽伐鍗�
+                //generateInspectionOrder(mesWorkReporting, workOrder);
                 //鎷兼帴鎴愬搧鎶ュ伐鎵樺彿
                 String palletNumber4 = sysBusinessCodeRuleService.generateBusinessCodeSeq("WorkReportingPalletNumber4");
                 String finishedPalletNumber = material.getMaterialNumber() + date + palletNumber4;
-                mesWorkReporting.setPalletNumber(finishedPalletNumber);
-                //todo 鎵撳嵃鎴愬搧鎵樻爣绛俱�佹楠屾爣璇嗗崱銆佺Щ搴撳崟銆佸畬宸ユ楠屽伐鍗�
+                mesWorkReporting.setPalletNumber(finishedPalletNumber).setReportType("FINISHED");
                 break;
             case INNER_FLANGE:
             case OUTER_FLANGE:
                 //鍗婃垚鍝�(鍐呮硶鍏般�佸娉曞叞)鎶ュ伐
-                productReport(mesWorkReporting, workOrder, lineSideWarehouse);
+                consumptionDetailList = productReport(mesWorkReporting, workOrder, lineSideWarehouse);
                 //鎷兼帴鍗婃垚鍝佹姤宸ユ墭鍙�
                 Shift shift = shiftService.getById(workOrder.getShiftId());
                 String palletNumber6 = sysBusinessCodeRuleService.generateBusinessCodeSeq("WorkReportingPalletNumber6");
                 String halfPalletNumber = factory.getFactoryCode() + material.getMaterialNumber() + date + shift.getShiftCode() + palletNumber6;
-                mesWorkReporting.setPalletNumber(halfPalletNumber);
+                mesWorkReporting.setPalletNumber(halfPalletNumber).setReportType("HALF");
                 break;
         }
         //鏂板鎶ュ伐璁板綍
         save(mesWorkReporting);
+        consumptionDetailList.forEach(i -> i.setReportingId(mesWorkReporting.getId()));
+        //淇濆瓨鐗╂枡娑堣�楁槑缁�
+        mesMaterialConsumptionDetailService.saveBatch(consumptionDetailList);
         //鏇存柊鎺掍骇宸ュ崟
         MesProductionWorkOrder productionWorkUpdateOrder = new MesProductionWorkOrder()
                 .setId(workOrder.getId())
                 .setActualQuantity(workOrder.getActualQuantity().add(mesWorkReporting.getQuantity()))
                 .setFinishedPallets(workOrder.getFinishedPallets() + 1);
         mesProductionWorkOrderService.updateById(productionWorkUpdateOrder);
+        //杩斿洖鎶ュ伐璁板綍锛岀敤浜庢墭鏍囩鎵撳嵃
+        return mesWorkReporting;
     }
 
     //鍗婃垚鍝�(鍐呮硶鍏般�佸娉曞叞)銆佹垚鍝佹姤宸�
-    private void productReport(MesWorkReporting mesWorkReporting, MesProductionWorkOrder workOrder, LineSideWarehouse lineSideWarehouse) {
+    private List<MesMaterialConsumptionDetail> productReport(MesWorkReporting mesWorkReporting, MesProductionWorkOrder workOrder, LineSideWarehouse lineSideWarehouse) {
         //1銆佸叆搴� 鍗婃垚鍝�/鎴愬搧 鍒板搴旂嚎杈瑰簱
         LswMaterialInbound materialInbound = new LswMaterialInbound()
                 .setFactoryId(workOrder.getFactoryId())
@@ -180,21 +195,26 @@
                 .setMaterialNumber(workOrder.getMaterialNumber())
                 .setMaterialName(workOrder.getMaterialName())
                 .setBatchNumber(mesWorkReporting.getBatchNumber())
-                .setQuantity(mesWorkReporting.getQuantity());
-        lswMaterialInboundService.save(materialInbound);
-        //2銆佹墸鍑忎娇鐢ㄦ瘺鍧簱瀛橈紙鏇存柊涓婃枡璁板綍锛夋垨鍗婃垚鍝佺墿鏂欏簱瀛橈紙鍐呮硶鍏般�佸娉曞叞銆佸皬鍐呭湀銆侀厤浠剁瓑锛夛紝鎸夌収 鎺掍骇宸ュ崟id銆佺墿鏂欑紪鐮� 鏌ヨ涓婃枡璁板綍锛屾寜鐓ф椂闂翠粠鏃╁埌鏅氭帓搴忥紝浼樺厛鎵e噺鏃╃殑涓婃枡璁板綍锛堝厛杩涘厛鍑猴級
+                .setQuantity(mesWorkReporting.getQuantity())
+                .setInboundCategory(MaterialInboundCategory.PRODUCTION_INBOUND.name())//鐢熶骇涓嬬嚎
+                .setOriginalCode(lineSideWarehouse.getWarehouseCode())
+                .setOriginalName(lineSideWarehouse.getWarehouseName());
+        lswMaterialInboundService.inboundMaterial(materialInbound);
+        //2銆佹墸鍑忎娇鐢ㄦ瘺鍧簱瀛橈紙鏇存柊涓婃枡璁板綍锛夋垨鍗婃垚鍝佺墿鏂欏簱瀛橈紙鍐呮硶鍏般�佸娉曞叞銆佸皬鍐呭湀銆侀厤浠剁瓑锛夛紝鎸夌収 浜х嚎id銆佸簱瀛樺湴id銆佺墿鏂欑紪鐮� 鏌ヨ涓婃枡璁板綍锛屾寜鐓ф椂闂翠粠鏃╁埌鏅氭帓搴忥紝浼樺厛鎵e噺鏃╃殑涓婃枡璁板綍锛堝厛杩涘厛鍑猴級
         //鍏堟煡璇㈢墿鏂� BOM
         Map<String, ProcessBillMaterialsDetailVo> processBillMaterialsDetailMap = pmsProcessBillMaterialsService
                 .queryMaterialsDetailByOrderIdAndMaterialNumber(mesWorkReporting.getOrderId(), workOrder.getMaterialNumber()).stream()
                 .collect(Collectors.toMap(ProcessBillMaterialsDetailVo::getMaterialNumber, v1 -> v1, (v1, v2) -> v1));
         //鏌ヨ涓婃枡璁板綍
         Map<String, List<MesMaterialLoading>> materialLoadingRecordMap = mesMaterialLoadingService.list(new LambdaQueryWrapper<MesMaterialLoading>()
-                        .eq(MesMaterialLoading::getWorkOrderId, workOrder.getId())
+                        .eq(MesMaterialLoading::getFactoryId, workOrder.getFactoryId())
+                        .eq(MesMaterialLoading::getWarehouseId, lineSideWarehouse.getId())
                         .in(MesMaterialLoading::getMaterialNumber, processBillMaterialsDetailMap.keySet())
                         .gt(MesMaterialLoading::getRemainingQuantity, BigDecimal.ZERO)).stream()
                 .sorted(Comparator.comparing(MesMaterialLoading::getCreateTime))
                 .collect(Collectors.groupingBy(MesMaterialLoading::getMaterialNumber));
         List<MesMaterialLoading> materialLoadingRecordUpdateList = CollectionUtil.newArrayList();
+        List<MesMaterialConsumptionDetail> consumptionDetailAddList = CollectionUtil.newArrayList();
         for (String materialNumber : processBillMaterialsDetailMap.keySet()) {
             List<MesMaterialLoading> materialLoadingRecordList = materialLoadingRecordMap.get(materialNumber);
             if (materialLoadingRecordList.isEmpty()) {
@@ -203,8 +223,26 @@
             //璁$畻鐗╂枡鎵e噺鏁伴噺
             ProcessBillMaterialsDetailVo processBillMaterialsDetailVo = processBillMaterialsDetailMap.get(materialNumber);
             BigDecimal quantity = processBillMaterialsDetailVo.getPerQuantity().multiply(mesWorkReporting.getQuantity());
-            List<MesMaterialLoading> updateList = deductQuantity(materialLoadingRecordList, quantity);
-            materialLoadingRecordUpdateList.addAll(updateList);
+            //鎵e噺涓婃枡鏁伴噺骞惰褰曠墿鏂欐秷鑰楁槑缁�
+            for (MesMaterialLoading mesMaterialLoading : materialLoadingRecordList) {
+                //璁板綍鐗╂枡娑堣�楁槑缁�
+                MesMaterialConsumptionDetail materialConsumptionDetail = new MesMaterialConsumptionDetail()
+                        .setOrderId(mesWorkReporting.getOrderId())
+                        .setWorkOrderId(workOrder.getId())
+                        .setFactoryId(workOrder.getFactoryId())
+                        .setLoadingId(mesMaterialLoading.getId());
+                if (mesMaterialLoading.getRemainingQuantity().compareTo(quantity) >= 0) {
+                    mesMaterialLoading.setRemainingQuantity(mesMaterialLoading.getRemainingQuantity().subtract(quantity));
+                    materialConsumptionDetail.setQuantity(quantity);
+                    break;
+                } else {
+                    quantity = quantity.subtract(mesMaterialLoading.getRemainingQuantity());
+                    materialConsumptionDetail.setQuantity(mesMaterialLoading.getRemainingQuantity());
+                    mesMaterialLoading.setRemainingQuantity(BigDecimal.ZERO);
+                }
+                consumptionDetailAddList.add(materialConsumptionDetail);
+            }
+            materialLoadingRecordUpdateList.addAll(materialLoadingRecordList);
         }
         //鏇存柊涓婃枡璁板綍
         mesMaterialLoadingService.updateBatchById(materialLoadingRecordUpdateList);
@@ -244,18 +282,28 @@
                 log.error("SAP宸ュ簭鎶ュ伐寮傚父锛�", e);
             }
         }
+        return consumptionDetailAddList;
     }
 
-    private List<MesMaterialLoading> deductQuantity(List<MesMaterialLoading> materialLoadingRecordList, BigDecimal quantity) {
-        for (MesMaterialLoading mesMaterialLoading : materialLoadingRecordList) {
-            if (mesMaterialLoading.getRemainingQuantity().compareTo(quantity) >= 0) {
-                mesMaterialLoading.setRemainingQuantity(mesMaterialLoading.getRemainingQuantity().subtract(quantity));
-                break;
-            } else {
-                quantity = quantity.subtract(mesMaterialLoading.getRemainingQuantity());
-                mesMaterialLoading.setRemainingQuantity(BigDecimal.ZERO);
-            }
+    //鏍规嵁妫�楠屾柟妗堢敓鎴愭楠屽伐鍗�
+    private void generateInspectionOrder(MesWorkReporting mesWorkReporting, MesProductionWorkOrder workOrder) {
+        //1.鏍规嵁鐗╂枡缂栫爜鏌ヨ妫�楠屾柟妗�
+        InspectionPlan inspectionPlan = inspectionPlanService.list(new LambdaQueryWrapper<InspectionPlan>()
+                .eq(InspectionPlan::getMaterialNumber, workOrder.getMaterialNumber())
+                .eq(InspectionPlan::getPlanCategory, PlanCategoryEnum.COMPLETION_INSPECTION.name())
+                .eq(InspectionPlan::getPlanStatus, CommonConstant.STATUS_1)
+                .eq(InspectionPlan::getDelFlag, CommonConstant.DEL_FLAG_0)).stream().findFirst().orElse(null);
+        if (inspectionPlan == null) {
+            throw new JeecgBootException("鏈壘鍒拌鐗╂枡鐨勬楠屾柟妗堬紒");
         }
-        return materialLoadingRecordList;
+        List<InspectionPlanItem> inspectionPlanItemList = inspectionPlanItemService.list(new LambdaQueryWrapper<InspectionPlanItem>()
+                .eq(InspectionPlanItem::getPlanId, inspectionPlan.getId())
+                .orderByAsc(InspectionPlanItem::getSorter));
+        if (inspectionPlanItemList.isEmpty()) {
+            throw new JeecgBootException("鏈壘鍒拌鐗╂枡鐨勬楠屾柟妗堟楠岄」鏄庣粏锛�");
+        }
+        //2.鐢熸垚妫�楠屽伐鍗�
+        //todo 妫�楠屽伐鍗曠洰鍓嶈繕娌℃湁鐢熸垚浠g爜锛屾病鏈夊姛鑳�
     }
+
 }

--
Gitblit v1.9.3