From 182c04e399f5db26406234767f7ef34b5adc0015 Mon Sep 17 00:00:00 2001
From: zhangherong <571457620@qq.com>
Date: 星期三, 20 八月 2025 18:19:51 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 src/main/java/org/jeecg/modules/mes/service/impl/MesWorkReportingServiceImpl.java |  278 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 278 insertions(+), 0 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 a20f621..d5f8a99 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,10 +1,59 @@
 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.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.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;
+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.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: 宸ュ崟鎶ュ伐
@@ -12,7 +61,236 @@
  * @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
+    private IFactoryService factoryService;
+    @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;
+    @Autowired
+    private IInspectionPlanService inspectionPlanService;
+    @Autowired
+    private IInspectionPlanItemService inspectionPlanItemService;
+
+    @Override
+    public List<MesWorkReporting> queryWorkReportingByWorkOrderId(String workOrderId) {
+        return baseMapper.queryWorkReportingByWorkOrderId(workOrderId);
+    }
+
+    @Override
+    public List<MesWorkReporting> queryWorkReportingByOrderId(String orderId) {
+        return baseMapper.queryWorkReportingByOrderId(orderId);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public MesWorkReporting addReporting(MesWorkReporting mesWorkReporting) {
+        MesProductionWorkOrder workOrder = mesProductionWorkOrderService.getById(mesWorkReporting.getWorkOrderId());
+        if (workOrder == null) {
+            throw new JeecgBootException("宸ュ崟涓嶅瓨鍦紒");
+        }
+        LswMaterial material = lswMaterialService.list(new LambdaQueryWrapper<LswMaterial>()
+                        .eq(LswMaterial::getMaterialNumber, workOrder.getMaterialNumber())
+                        .eq(LswMaterial::getDelFlag, CommonConstant.DEL_FLAG_0)).stream()
+                .findAny().orElse(null);
+        if (material == null) {
+            throw new JeecgBootException("鐗╂枡涓嶅瓨鍦紒");
+        }
+        MaterialCategoryEnum materialCategory = MaterialCategoryEnum.fromName(material.getMaterialCategory());
+        if (materialCategory == null) {
+            throw new JeecgBootException("鏈煡鐨勭墿鏂欑被鍨嬶紒");
+        }
+
+        LineSideWarehouse lineSideWarehouse = lineSideWarehouseService.list(new LambdaQueryWrapper<LineSideWarehouse>()
+                        .eq(LineSideWarehouse::getFactoryId, mesWorkReporting.getFactoryId())
+                        .eq(LineSideWarehouse::getDelFlag, CommonConstant.DEL_FLAG_0))
+                .stream().findAny().orElse(null);
+        if (lineSideWarehouse == null) {
+            throw new JeecgBootException("绾胯竟浠撳簱涓嶅瓨鍦紒");
+        }
+
+        //鐢熶骇鎵规鍙�
+        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)
+                .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());
+        switch (materialCategory) {
+            case FINISHED_PRODUCT:
+                //鎴愬搧鎶ュ伐
+                productReport(mesWorkReporting, workOrder, lineSideWarehouse);
+                //鐢熸垚妫�楠屽伐鍗�
+                generateInspectionOrder(mesWorkReporting, workOrder);
+                //鎷兼帴鎴愬搧鎶ュ伐鎵樺彿
+                String palletNumber4 = sysBusinessCodeRuleService.generateBusinessCodeSeq("WorkReportingPalletNumber4");
+                String finishedPalletNumber = material.getMaterialNumber() + date + palletNumber4;
+                mesWorkReporting.setPalletNumber(finishedPalletNumber).setReportType("FINISHED");
+                break;
+            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).setReportType("HALF");
+                break;
+        }
+        //鏂板鎶ュ伐璁板綍
+        save(mesWorkReporting);
+        //鏇存柊鎺掍骇宸ュ崟
+        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) {
+        //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 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("鏈壘鍒拌鐗╂枡鐨勬楠屾柟妗堬紒");
+        }
+        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爜锛屾病鏈夊姛鑳�
+    }
+
+    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