From b3fe06c151dc8455649bf0a46e481ceb83e3ea2a Mon Sep 17 00:00:00 2001
From: 吴羡 <16976746+Xian-TT3@user.noreply.gitee.com>
Date: 星期六, 07 十一月 2026 13:37:54 +0800
Subject: [PATCH] feat: 完成好水川 MOM 需求1/2/4/5/8(装箱、BOM成本、销售合同、劳动合同、留样)

---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImpl.java |   47 +++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 45 insertions(+), 2 deletions(-)

diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImpl.java
index 48db7a0..434e647 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImpl.java
@@ -71,6 +71,9 @@
 public class MesProFeedbackServiceImpl implements MesProFeedbackService {
 
     @Resource
+    private MesProFeedbackEquipmentService equipmentService;
+
+    @Resource
     private MesProFeedbackMapper feedbackMapper;
 
     @Resource
@@ -107,6 +110,8 @@
     private MdmItemBatchConfigApi itemBatchConfigApi;
     @Resource
     private cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi processInstanceApi;
+    @Resource
+    private cn.iocoder.yudao.module.mes.service.pro.cost.MesProWorkOrderCostService workOrderCostService;
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -114,8 +119,9 @@
         // 1. 鏍¢獙
         MesProTaskDO task = validateFeedbackData(createReqVO);
 
-        // 2. 鎻掑叆锛堣嚜鍔ㄥ~鍏� itemId锛�
+        // 2. 鎻掑叆锛堜富閿敱鏁版嵁搴撹嚜澧烇紝蹇界暐璇锋眰涓彲鑳芥畫鐣欑殑 id锛涜嚜鍔ㄥ~鍏� itemId锛�
         MesProFeedbackDO feedback = BeanUtils.toBean(createReqVO, MesProFeedbackDO.class)
+                .setId(null)
                 .setStatus(MesProFeedbackStatusEnum.PREPARE.getStatus())
                 .setItemId(task.getItemId());
         feedbackMapper.insert(feedback);
@@ -127,6 +133,7 @@
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void updateFeedback(MesProFeedbackSaveReqVO updateReqVO) {
+        equipmentService.lock();
         // 1.1 鏍¢獙瀛樺湪 + 鑽夌鐘舵��
         validateFeedbackStatusPrepare(updateReqVO.getId());
         // 1.2 鏍¢獙涓氬姟鏁版嵁
@@ -136,6 +143,7 @@
         MesProFeedbackDO updateObj = BeanUtils.toBean(updateReqVO, MesProFeedbackDO.class)
                 .setItemId(task.getItemId());
         feedbackMapper.updateById(updateObj);
+        equipmentService.resetSnapshot(updateReqVO.getId());
         // 3. 淇濆瓨鍙傛暟鍊硷紱蹇呭~鍙傛暟鏍¢獙澶辫触鏃舵暣浣撳洖婊�
         saveParamValues(task.getId(), updateReqVO.getParamValues());
     }
@@ -152,7 +160,9 @@
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public void deleteFeedback(Long id) {
+        equipmentService.lock();
         // 1. 鏍¢獙瀛樺湪 + 鑽夌鐘舵��
         validateFeedbackStatusPrepare(id);
 
@@ -186,9 +196,11 @@
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void submitFeedback(MesProFeedbackSubmitReqVO reqVO) {
+        equipmentService.lock();
         Long id = reqVO.getId();
         // 1. 鏍¢獙瀛樺湪 + 鑽夌鐘舵��
         MesProFeedbackDO feedback = validateFeedbackStatusPrepare(id);
+        equipmentService.validateSubmission(feedback);
         // 1.1 椤哄簭鎶ュ伐鏍¢獙锛氬悓涓�鐢熶骇宸ュ崟鍐咃紝涓婁竴閬撳伐搴忓繀椤诲凡鎶ュ伐瀹屾垚锛屽惁鍒欎笉鍏佽鎻愪氦
         if (feedback.getTaskId() != null) {
             MesProTaskDO submitTask = taskService.getTask(feedback.getTaskId());
@@ -199,7 +211,9 @@
 
         MesProWorkOrderDO workOrder = workOrderService.getWorkOrder(feedback.getWorkOrderId());
 
-        if (workOrder != null && Boolean.TRUE.equals(workOrder.getFeedbackApprove()) && cn.hutool.core.util.StrUtil.isNotBlank(workOrder.getProcessDefinitionKey())) {
+        if (!processInstanceApi.isGlobalAutoApprove() && workOrder != null
+                && Boolean.TRUE.equals(workOrder.getFeedbackApprove())
+                && cn.hutool.core.util.StrUtil.isNotBlank(workOrder.getProcessDefinitionKey())) {
             // 2. 鏇存柊鐘舵�佷负瀹℃壒涓紝骞跺惎鍔ㄦ祦绋�
             String processInstanceId = processInstanceApi.createProcessInstance(cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId(),
                     new cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO()
@@ -264,7 +278,9 @@
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public void rejectFeedback(Long id) {
+        equipmentService.lock();
         // 1. 鏍¢獙瀛樺湪 + 瀹℃壒涓姸鎬�
         validateFeedbackStatusApproving(id);
 
@@ -276,8 +292,16 @@
     @Override
     @Transactional(rollbackFor = Exception.class)
     public boolean approveFeedback(MesProFeedbackApproveReqVO reqVO) {
+        equipmentService.lock();
         // 1.1 鏍¢獙瀛樺湪 + 瀹℃壒涓姸鎬�
         MesProFeedbackDO feedback = validateFeedbackStatusApproving(reqVO.getId());
+        equipmentService.validateApproval(feedback);
+        try (var equipmentScope = equipmentService.beginApproval(feedback)) {
+            return approveValidatedFeedback(reqVO, feedback);
+        }
+    }
+
+    private boolean approveValidatedFeedback(MesProFeedbackApproveReqVO reqVO, MesProFeedbackDO feedback) {
         // 1.2 鏍¢獙鎶ュ伐鏁伴噺 > 0
         if (feedback.getFeedbackQuantity() == null
                 || feedback.getFeedbackQuantity().compareTo(BigDecimal.ZERO) <= 0) {
@@ -349,6 +373,8 @@
             productProduceService.generateProductProduce(feedback, true, reqVO);
             feedbackMapper.updateById(new MesProFeedbackDO().setId(reqVO.getId())
                     .setStatus(MesProFeedbackStatusEnum.UNCHECK.getStatus()));
+            equipmentService.afterApproved(feedback);
+            tryHandleCostAndAlert(feedback);
             return false;
         } else {
             // 6.2 鏃犻渶妫�楠岋細鐢熸垚浜у嚭鍗曪紙鎸夊悎鏍�/涓嶅悎鏍兼媶琛岋級锛岀洿鎺ュ畬鎴愬叆搴�
@@ -357,7 +383,22 @@
 
         }
 
+        equipmentService.afterApproved(feedback);
+        tryHandleCostAndAlert(feedback);
         return true; // 宸插畬鎴�
+    }
+
+    /**
+     * 鎶ュ伐瀹℃壒閫氳繃鍚庨噸绠楀伐鍗曠墿鏂欐垚鏈苟妫�鏌ヨ秴鑰楁姤璀︺��
+     * 鎴愭湰/鎶ヨ灞炰簬鏃佽矾鑳藉姏锛屽け璐ュ彧璁板綍鏃ュ織锛屼笉褰卞搷鎶ュ伐瀹℃壒缁撴灉銆�
+     */
+    private void tryHandleCostAndAlert(MesProFeedbackDO feedback) {
+        try {
+            workOrderCostService.handleFeedbackApproved(feedback);
+        } catch (Exception ex) {
+            log.error("[tryHandleCostAndAlert][宸ュ崟({}) 鎶ュ伐({}) 鎴愭湰/瓒呰�楀鐞嗗け璐",
+                    feedback.getWorkOrderId(), feedback.getId(), ex);
+        }
     }
 
     /**
@@ -568,6 +609,7 @@
     @Override
     @Transactional(rollbackFor = Exception.class)
     public MesProFeedbackQuickCreateRespVO quickCreateFeedback(MesProFeedbackQuickCreateReqVO reqVO) {
+        equipmentService.lock();
         // 1. 鏍¢獙浠诲姟瀛樺湪涓旈潪缁堟��
         MesProTaskDO task = taskService.validateTaskNotFinished(reqVO.getTaskId());
 
@@ -604,6 +646,7 @@
                 .setFeedbackTime(LocalDateTime.now())
                 .setStatus(MesProFeedbackStatusEnum.APPROVING.getStatus())
                 .setRemark(reqVO.getRemark());
+        equipmentService.validateSubmission(feedback);
         feedbackMapper.insert(feedback);
         saveParamValues(task.getId(), reqVO.getParamValues());
         // 5. 杩斿洖缁撴灉

--
Gitblit v1.9.3