From eec479e2f3139286449005dcb05c014e4a60d255 Mon Sep 17 00:00:00 2001
From: cuilei <ray_tsu1@163.com>
Date: 星期一, 18 八月 2025 16:59:25 +0800
Subject: [PATCH] 报工接口、产线线边库物料查询接口

---
 src/main/java/org/jeecg/modules/mes/service/impl/MesWorkReportingServiceImpl.java |  198 ++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 162 insertions(+), 36 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 3dde504..271c5aa 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
@@ -1,35 +1,54 @@
 package org.jeecg.modules.mes.service.impl;
 
+import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.date.DateUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.extern.slf4j.Slf4j;
 import org.jeecg.common.constant.CommonConstant;
 import org.jeecg.common.exception.JeecgBootException;
 import org.jeecg.modules.base.entity.Factory;
 import org.jeecg.modules.base.entity.LineSideWarehouse;
 import org.jeecg.modules.base.entity.Shift;
+import org.jeecg.modules.base.entity.ShiftGroup;
 import org.jeecg.modules.base.service.IFactoryService;
 import org.jeecg.modules.base.service.ILineSideWarehouseService;
+import org.jeecg.modules.base.service.IShiftGroupService;
 import org.jeecg.modules.base.service.IShiftService;
 import org.jeecg.modules.lsw.entity.LswMaterial;
 import org.jeecg.modules.lsw.entity.LswMaterialInbound;
-import org.jeecg.modules.lsw.enums.MaterialCategory;
+import org.jeecg.modules.lsw.enums.MaterialCategoryEnum;
 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.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.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.sap.request.OrderLoadRequest;
+import org.jeecg.modules.sap.request.OrderReportRequest;
+import org.jeecg.modules.sap.service.OrderLoadService;
+import org.jeecg.modules.sap.service.OrderReportService;
 import org.jeecg.modules.system.service.ISysBusinessCodeRuleService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
-import java.util.Date;
-import java.util.List;
-import java.util.Objects;
-import java.util.Optional;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoField;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * @Description: 宸ュ崟鎶ュ伐
@@ -37,11 +56,14 @@
  * @Date:   2025-07-04
  * @Version: V1.0
  */
+@Slf4j
 @Service
 public class MesWorkReportingServiceImpl extends ServiceImpl<MesWorkReportingMapper, MesWorkReporting> implements IMesWorkReportingService {
 
     @Autowired
     private IMesProductionWorkOrderService mesProductionWorkOrderService;
+    @Autowired
+    private IMesProductionOrderService mesProductionOrderService;
     @Autowired
     private ILswMaterialService lswMaterialService;
     @Autowired
@@ -49,11 +71,23 @@
     @Autowired
     private IShiftService shiftService;
     @Autowired
+    private IShiftGroupService shiftGroupService;
+    @Autowired
     private ILineSideWarehouseService lineSideWarehouseService;
     @Autowired
     private ILswMaterialInboundService lswMaterialInboundService;
     @Autowired
+    private IMesMaterialLoadingService mesMaterialLoadingService;
+    @Autowired
+    private IPmsProcessBillMaterialsService pmsProcessBillMaterialsService;
+    @Autowired
+    private IPmsMaterialProcessService pmsMaterialProcessService;
+    @Autowired
     private ISysBusinessCodeRuleService sysBusinessCodeRuleService;
+    @Autowired
+    private OrderReportService orderReportService;
+    @Autowired
+    private OrderLoadService orderLoadService;
 
     @Override
     public List<MesWorkReporting> queryWorkReportingByWorkOrderId(String workOrderId) {
@@ -66,6 +100,7 @@
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public void addReporting(MesWorkReporting mesWorkReporting) {
         MesProductionWorkOrder workOrder = mesProductionWorkOrderService.getById(mesWorkReporting.getWorkOrderId());
         if (workOrder == null) {
@@ -78,13 +113,11 @@
         if (material == null) {
             throw new JeecgBootException("鐗╂枡涓嶅瓨鍦紒");
         }
-        MaterialCategory materialCategory = MaterialCategory.fromName(material.getMaterialCategory());
+        MaterialCategoryEnum materialCategory = MaterialCategoryEnum.fromName(material.getMaterialCategory());
         if (materialCategory == null) {
             throw new JeecgBootException("鏈煡鐨勭墿鏂欑被鍨嬶紒");
         }
-        //鐢熶骇鎵规鍙�
-        String batchNumber = sysBusinessCodeRuleService.generateBusinessCodeSeq("WorkReportingBatchNumber");
-        mesWorkReporting.setBatchNumber(batchNumber);
+
         LineSideWarehouse lineSideWarehouse = lineSideWarehouseService.list(new LambdaQueryWrapper<LineSideWarehouse>()
                         .eq(LineSideWarehouse::getFactoryId, mesWorkReporting.getFactoryId())
                         .eq(LineSideWarehouse::getDelFlag, CommonConstant.DEL_FLAG_0))
@@ -92,44 +125,137 @@
         if (lineSideWarehouse == null) {
             throw new JeecgBootException("绾胯竟浠撳簱涓嶅瓨鍦紒");
         }
-        mesWorkReporting.setWarehouseId(lineSideWarehouse.getId());
-        mesWorkReporting.setReporter(Objects.requireNonNull(CommonUtils.getCurrentUser()).getUsername());
-        mesWorkReporting.setReportTime(new Date());
-        String date = DateUtil.format(new Date(), "yyMMdd");
+
+        //鐢熶骇鎵规鍙�
+        LocalDate today = LocalDate.now();
+        String yearLastTwo = today.format(DateTimeFormatter.ofPattern("yy"));
+        String dayOfYearStr = today.format(DateTimeFormatter.ofPattern("DDD"));
+        ShiftGroup shiftGroup = shiftGroupService.getById(workOrder.getGroupId());
+        int currentPallets = workOrder.getFinishedPallets() + 1;
+        String batchNumber = yearLastTwo + dayOfYearStr + shiftGroup.getGroupCode() + currentPallets;
+        mesWorkReporting.setBatchNumber(batchNumber)
+                .setWarehouseId(lineSideWarehouse.getId())
+                .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());
         switch (materialCategory) {
-            case FINISHED:
-                //鎴愬搧鎶ュ伐閫昏緫
+            case FINISHED_PRODUCT:
+                //鎴愬搧鎶ュ伐
+                productReport(mesWorkReporting, workOrder, lineSideWarehouse);
+                //鎷兼帴鎴愬搧鎶ュ伐鎵樺彿
                 String palletNumber4 = sysBusinessCodeRuleService.generateBusinessCodeSeq("WorkReportingPalletNumber4");
                 String finishedPalletNumber = material.getMaterialNumber() + date + palletNumber4;
                 mesWorkReporting.setPalletNumber(finishedPalletNumber);
-                //todo 鎵e噺鍐呮硶鍏帮紙瀵瑰簲鏈哄姞鍐呮硶鍏扮嚎杈瑰簱锛夈�佸娉曞叞锛堝搴旀満鍔犲娉曞叞绾胯竟搴擄級銆佸皬鍐呭湀锛堝搴旇閰嶇嚎杈瑰簱锛夊簱瀛橈紝璋冪敤SAP鎶曟枡鎺ュ彛
-                //todo 璋冪敤SAP宸ュ簭鎶ュ伐
-                //todo 鎵撳嵃鎴愬搧鎵樻爣绛俱�佹楠屾爣璇嗗崱銆佺Щ搴撳崟銆佸畬宸ユ楠屽伐鍗曪紱鍒ゆ柇鐢熶骇璁㈠崟鏄惁闇�瑕佸叧闂紙鍚堟牸鏁伴噺 = 璁㈠崟鏁伴噺锛�
+                //todo 鎵撳嵃鎴愬搧鎵樻爣绛俱�佹楠屾爣璇嗗崱銆佺Щ搴撳崟銆佸畬宸ユ楠屽伐鍗�
                 break;
-            case HALF:
-            case RAW:
-                //鍗婃垚鍝佹姤宸ラ�昏緫
-                Factory factory = factoryService.getById(mesWorkReporting.getFactoryId());
+            case INNER_FLANGE:
+            case OUTER_FLANGE:
+                //鍗婃垚鍝�(鍐呮硶鍏般�佸娉曞叞)鎶ュ伐
+                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);
-                //todo 鎵e噺瀵瑰簲绾胯竟搴擄紙澶栨硶鍏版瘺鍧�佸唴娉曞叞姣涘澂锛夊簱瀛樺悗锛岃皟鐢⊿AP鎶曟枡鎺ュ彛
-                //todo 璋冪敤SAP宸ュ簭鎶ュ伐
-                break;
-            case PARTS:
                 break;
         }
+        //鏂板鎶ュ伐璁板綍
         save(mesWorkReporting);
-        //绾胯竟搴撳叆搴撻�昏緫
-        LswMaterialInbound lswMaterialInbound = new LswMaterialInbound()
-                .setFactoryId(mesWorkReporting.getFactoryId())
-                .setMaterialNumber(material.getMaterialNumber())
-                .setMaterialName(material.getMaterialName())
-                .setBatchNumber(batchNumber)
-                .setQuantity(mesWorkReporting.getQuantity())
-                .setWarehouseId(lineSideWarehouse.getId());
-        lswMaterialInboundService.save(lswMaterialInbound);
+        //鏇存柊鎺掍骇宸ュ崟
+        MesProductionWorkOrder productionWorkUpdateOrder = new MesProductionWorkOrder()
+                .setId(workOrder.getId())
+                .setActualQuantity(workOrder.getActualQuantity().add(mesWorkReporting.getQuantity()))
+                .setFinishedPallets(workOrder.getFinishedPallets() + 1);
+        mesProductionWorkOrderService.updateById(productionWorkUpdateOrder);
+    }
+
+    //鍗婃垚鍝�(鍐呮硶鍏般�佸娉曞叞)銆佹垚鍝佹姤宸�
+    private void productReport(MesWorkReporting mesWorkReporting, MesProductionWorkOrder workOrder, LineSideWarehouse lineSideWarehouse) {
+        //1銆佸叆搴� 鍗婃垚鍝�/鎴愬搧 鍒板搴旂嚎杈瑰簱
+        LswMaterialInbound materialInbound = new LswMaterialInbound()
+                .setFactoryId(workOrder.getFactoryId())
+                .setWarehouseId(lineSideWarehouse.getId())
+                .setMaterialNumber(workOrder.getMaterialNumber())
+                .setMaterialName(workOrder.getMaterialName())
+                .setBatchNumber(mesWorkReporting.getBatchNumber())
+                .setQuantity(mesWorkReporting.getQuantity());
+        lswMaterialInboundService.save(materialInbound);
+        //2銆佹墸鍑忎娇鐢ㄦ瘺鍧簱瀛橈紙鏇存柊涓婃枡璁板綍锛夋垨鍗婃垚鍝佺墿鏂欏簱瀛橈紙鍐呮硶鍏般�佸娉曞叞銆佸皬鍐呭湀銆侀厤浠剁瓑锛夛紝鎸夌収 鎺掍骇宸ュ崟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())
+                        .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();
+        for (String materialNumber : processBillMaterialsDetailMap.keySet()) {
+            List<MesMaterialLoading> materialLoadingRecordList = materialLoadingRecordMap.get(materialNumber);
+            if (materialLoadingRecordList.isEmpty()) {
+                throw new JeecgBootException("鏈煡璇㈠埌鐩稿簲鐗╂枡鐨勪笂鏂欒褰曪紒");
+            }
+            //璁$畻鐗╂枡鎵e噺鏁伴噺
+            ProcessBillMaterialsDetailVo processBillMaterialsDetailVo = processBillMaterialsDetailMap.get(materialNumber);
+            BigDecimal quantity = processBillMaterialsDetailVo.getPerQuantity().multiply(mesWorkReporting.getQuantity());
+            List<MesMaterialLoading> updateList = deductQuantity(materialLoadingRecordList, quantity);
+            materialLoadingRecordUpdateList.addAll(updateList);
+        }
+        //鏇存柊涓婃枡璁板綍
+        mesMaterialLoadingService.updateBatchById(materialLoadingRecordUpdateList);
+        MesProductionOrder productionOrder = mesProductionOrderService.getById(mesWorkReporting.getOrderId());
+        //3銆佽皟鐢⊿AP鎶曟枡鎺ュ彛锛堟秷鑰楃殑鐗╂枡锛� OrderLoadService
+        for (String materialNumber : processBillMaterialsDetailMap.keySet()) {
+            ProcessBillMaterialsDetailVo processBillMaterialsDetailVo = processBillMaterialsDetailMap.get(materialNumber);
+            OrderLoadRequest loadRequest = new OrderLoadRequest()
+                    .setOrderCode(productionOrder.getOrderCode())
+                    .setFactoryCode(workOrder.getFactoryCode())
+                    .setMaterialNumber(materialNumber)
+                    .setWarehouseCode(lineSideWarehouse.getWarehouseCode())
+                    .setQuantity(processBillMaterialsDetailVo.getPerQuantity().multiply(mesWorkReporting.getQuantity()))
+                    .setBatchNumber(mesWorkReporting.getBatchNumber())
+                    .setProductionUnit(processBillMaterialsDetailVo.getProductionUnit());
+            try {
+                orderLoadService.productionOrderLoad(loadRequest);
+            } catch (Exception e) {
+                log.error("SAP鐢熶骇璁㈠崟鎶曟枡寮傚父锛�", e);
+            }
+        }
+        //4銆佽皟鐢⊿AP宸ュ簭鎶ュ伐锛堟牴鎹敓浜ц鍗昳d鏌ヨ瀵瑰簲鐨勭墿鏂欏伐搴忥紙鍗婃垚鍝佹槸澶氫釜宸ュ簭锛屾垚鍝佸彧鏈変竴涓伐搴忥級锛屾寜鐓у伐搴忓彿浠庡皬鍒板ぇ渚濇鎸ㄤ釜鎶ュ伐锛涚洰鍓嶈�冭檻寮傛鎵ц锛� OrderReportService
+        List<PmsMaterialProcess> processList = pmsMaterialProcessService.list(new LambdaQueryWrapper<PmsMaterialProcess>()
+                .eq(PmsMaterialProcess::getOrderId, mesWorkReporting.getOrderId())
+                .orderByAsc(PmsMaterialProcess::getProcessCode));
+        for (PmsMaterialProcess process : processList) {
+            OrderReportRequest reportRequest = new OrderReportRequest()
+                    .setOrderCode(productionOrder.getOrderCode())
+                    .setFactoryCode(workOrder.getFactoryCode())
+                    .setProcessCode(process.getProcessCode())
+                    .setQualifiedQuantity(mesWorkReporting.getQuantity())
+                    .setWarehouseCode(lineSideWarehouse.getWarehouseCode())
+                    .setBatchNumber(mesWorkReporting.getBatchNumber());
+            try {
+                orderReportService.productionOrderReport(reportRequest);
+            } catch (Exception e) {
+                log.error("SAP宸ュ簭鎶ュ伐寮傚父锛�", e);
+            }
+        }
+    }
+
+    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);
+            }
+        }
+        return materialLoadingRecordList;
     }
 }

--
Gitblit v1.9.3