From 7bd10d34e8a8dc2437ec8551eb511e37634d7306 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期一, 02 十一月 2026 16:51:52 +0800
Subject: [PATCH] feat(mes): 生产计划审批改走协同办公,修复工单领料与产成品入库校验

---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImpl.java |   51 ++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 36 insertions(+), 15 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 6453847..3444cc2 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
@@ -114,8 +117,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 +131,7 @@
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void updateFeedback(MesProFeedbackSaveReqVO updateReqVO) {
+        equipmentService.lock();
         // 1.1 鏍¢獙瀛樺湪 + 鑽夌鐘舵��
         validateFeedbackStatusPrepare(updateReqVO.getId());
         // 1.2 鏍¢獙涓氬姟鏁版嵁
@@ -136,6 +141,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 +158,9 @@
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public void deleteFeedback(Long id) {
+        equipmentService.lock();
         // 1. 鏍¢獙瀛樺湪 + 鑽夌鐘舵��
         validateFeedbackStatusPrepare(id);
 
@@ -186,9 +194,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());
@@ -266,7 +276,9 @@
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public void rejectFeedback(Long id) {
+        equipmentService.lock();
         // 1. 鏍¢獙瀛樺湪 + 瀹℃壒涓姸鎬�
         validateFeedbackStatusApproving(id);
 
@@ -278,8 +290,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) {
@@ -291,7 +311,12 @@
         // 2.1 鏌ヨ宸ュ簭鐨勫叧閿伐搴忔爣璇� + 妫�楠屾爣璇嗭紙闇�鍦� uncheckQuantity 鏍¢獙涔嬪墠锛屽洜涓鸿川妫�宸ュ簭鍏佽 uncheckQuantity > 0锛�
         MesProRouteProcessDO routeProcess = routeProcessService.getRouteProcessByRouteIdAndProcessId(
                 feedback.getRouteId(), feedback.getProcessId());
-        boolean keyFlag = routeProcess != null && Boolean.TRUE.equals(routeProcess.getKeyFlag());
+        // 鏈厤缃伐鑹鸿矾绾垮伐搴忔椂锛岃涓哄崟宸ュ簭鐢熶骇锛屾寜鏈�鍚庝竴閬撳伐搴忔洿鏂板伐鍗曚骇閲�
+        boolean noProcessChain = routeProcess == null
+                && CollUtil.isEmpty(workOrderProcessService.getWorkOrderProcessListByWorkOrderId(feedback.getWorkOrderId()));
+        boolean keyFlag = routeProcess != null
+                ? Boolean.TRUE.equals(routeProcess.getKeyFlag())
+                : noProcessChain;
         boolean checkFlag = routeProcess != null && Boolean.TRUE.equals(routeProcess.getCheckFlag());
         // 2.2 闈炶川妫�宸ュ簭锛氬悎鏍煎搧/涓嶈壇鍝佹暟閲忕敱璐ㄦ纭畾锛涙湰宸ュ簭涓嶇粡杩囪川妫�锛屾姤宸ユ湭濉啓鏃堕粯璁ゅ叏閮ㄤ负鍚堟牸鍝�
         if (!checkFlag
@@ -351,6 +376,7 @@
             productProduceService.generateProductProduce(feedback, true, reqVO);
             feedbackMapper.updateById(new MesProFeedbackDO().setId(reqVO.getId())
                     .setStatus(MesProFeedbackStatusEnum.UNCHECK.getStatus()));
+            equipmentService.afterApproved(feedback);
             return false;
         } else {
             // 6.2 鏃犻渶妫�楠岋細鐢熸垚浜у嚭鍗曪紙鎸夊悎鏍�/涓嶅悎鏍兼媶琛岋級锛岀洿鎺ュ畬鎴愬叆搴�
@@ -359,6 +385,7 @@
 
         }
 
+        equipmentService.afterApproved(feedback);
         return true; // 宸插畬鎴�
     }
 
@@ -400,7 +427,9 @@
         // 3. 鏇存柊璁㈠崟鐨勫凡鐢熶骇鏁伴噺
         // 鏂板閫昏緫锛氬彧鏈夊湪璇ョ瑪璁㈠崟鏈�鍚庝竴涓伐搴忔墠鏇存柊鐢熶骇璁㈠崟鐨勫凡鐢熶骇鏁伴噺
         MesProWorkOrderProcessDO lastProcess = workOrderProcessService.getLastWorkOrderProcessByWorkOrderId(feedback.getWorkOrderId());
-        if (lastProcess != null && ObjUtil.equal(lastProcess.getProcessId(), feedback.getProcessId())) {
+        // 鏈厤缃伐搴忛摼璺殑鍗曞伐搴忓伐鍗曪紝鎶ュ伐鍗宠涓哄畬鎴愭渶鍚庝竴閬撳伐搴�
+        boolean noProcessChain = lastProcess == null && feedback.getRouteId() == null;
+        if (noProcessChain || (lastProcess != null && ObjUtil.equal(lastProcess.getProcessId(), feedback.getProcessId()))) {
             workOrderService.updateProducedQuantity(feedback.getWorkOrderId(),
                     feedback.getFeedbackQuantity());
             // 4. 鏇存柊 MPS 鐨勫凡鐢熶骇鏁伴噺锛堝鏋滄槸閿�鍞鍗曟潵婧愶級
@@ -486,12 +515,7 @@
         reqVO.setItemId(task.getItemId());
         reqVO.setWorkstationId(task.getWorkstationId());
 
-        // 3. 鏍¢獙宸ヨ壓璺嚎 + 宸ュ簭閰嶇疆鏈夋晥
-        MesProRouteProcessDO routeProcess = routeProcessService.getRouteProcessByRouteIdAndProcessId(
-                task.getRouteId(), task.getProcessId());
-        if (routeProcess == null) {
-            throw exception(PRO_FEEDBACK_ROUTE_PROCESS_INVALID);
-        }
+        // 3. 鏈厤缃伐鑹鸿矾绾�/宸ュ簭鏃舵寜鍗曞伐搴忔姤宸ュ鐞嗭紝涓嶅啀寮哄埗鏍¢獙璺嚎宸ュ簭閰嶇疆
         // 4.1 鏍¢獙鏁伴噺锛氭棤璁烘槸鍚﹂渶瑕佹楠岋紝鎶ュ伐鍙渶濉姤宸ユ暟閲忥紝涓斿繀椤� > 0
         // 鍚堟牸鍝�/涓嶈壇鍝佹暟閲忕敱璐ㄦ纭畾锛堥潪璐ㄦ宸ュ簭鍦ㄥ鎵规椂榛樿鍏ㄩ儴涓哄悎鏍煎搧锛�
         if (reqVO.getFeedbackQuantity() == null
@@ -570,6 +594,7 @@
     @Override
     @Transactional(rollbackFor = Exception.class)
     public MesProFeedbackQuickCreateRespVO quickCreateFeedback(MesProFeedbackQuickCreateReqVO reqVO) {
+        equipmentService.lock();
         // 1. 鏍¢獙浠诲姟瀛樺湪涓旈潪缁堟��
         MesProTaskDO task = taskService.validateTaskNotFinished(reqVO.getTaskId());
 
@@ -580,12 +605,7 @@
         // 1.1 椤哄簭鎶ュ伐鏍¢獙锛氬悓涓�鐢熶骇宸ュ崟鍐咃紝涓婁竴閬撳伐搴忓繀椤诲凡鎶ュ伐瀹屾垚锛屽惁鍒欎笉鍏佽鎶ュ伐
         validatePreviousProcessFinished(task);
 
-        // 2. 鏍¢獙宸ヨ壓璺嚎宸ュ簭閰嶇疆
-        MesProRouteProcessDO routeProcess = routeProcessService.getRouteProcessByRouteIdAndProcessId(
-                task.getRouteId(), task.getProcessId());
-        if (routeProcess == null) {
-            throw exception(PRO_FEEDBACK_ROUTE_PROCESS_INVALID);
-        }
+        // 2. 鏈厤缃伐鑹鸿矾绾�/宸ュ簭鏃舵寜鍗曞伐搴忔姤宸ュ鐞嗭紝涓嶅啀寮哄埗鏍¢獙璺嚎宸ュ簭閰嶇疆
         // 3. 鏍¢獙鏁伴噺锛氬彧濉姤宸ユ暟閲忥紝涓斿繀椤� > 0锛堝悎鏍煎搧/涓嶈壇鍝佹暟閲忕敱璐ㄦ纭畾锛�
         if (reqVO.getFeedbackQuantity() == null
                 || reqVO.getFeedbackQuantity().compareTo(BigDecimal.ZERO) <= 0) {
@@ -606,6 +626,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