From c6eb0d852595f235b21520dab1d8600ed1b80776 Mon Sep 17 00:00:00 2001
From: liu <2021943741@qq.com>
Date: 星期五, 04 九月 2026 14:44:21 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_business' into dev_business

---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImpl.java |   83 ++++++++++++++++++++++-------------------
 1 files changed, 44 insertions(+), 39 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 a7617dc..d3f2a0a 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
@@ -279,23 +279,34 @@
                 feedback.getRouteId(), feedback.getProcessId());
         boolean keyFlag = routeProcess != null && Boolean.TRUE.equals(routeProcess.getKeyFlag());
         boolean checkFlag = routeProcess != null && Boolean.TRUE.equals(routeProcess.getCheckFlag());
-        // 2.2 闈炶川妫�宸ュ簭锛氫粛鏈夊緟妫�鏁伴噺鏃朵笉鑳藉鎵癸紙璐ㄦ宸ュ簭鐨� uncheckQuantity > 0 鏄甯哥姸鎬侊紝涓嶅仛鎷︽埅锛�
+        // 2.2 闈炶川妫�宸ュ簭锛氬悎鏍煎搧/涓嶈壇鍝佹暟閲忕敱璐ㄦ纭畾锛涙湰宸ュ簭涓嶇粡杩囪川妫�锛屾姤宸ユ湭濉啓鏃堕粯璁ゅ叏閮ㄤ负鍚堟牸鍝�
+        if (!checkFlag
+                && feedback.getQualifiedQuantity() == null
+                && feedback.getUnqualifiedQuantity() == null) {
+            feedback.setQualifiedQuantity(feedback.getFeedbackQuantity());
+            feedback.setUnqualifiedQuantity(BigDecimal.ZERO);
+            feedbackMapper.updateById(new MesProFeedbackDO().setId(feedback.getId())
+                    .setQualifiedQuantity(feedback.getFeedbackQuantity())
+                    .setUnqualifiedQuantity(BigDecimal.ZERO));
+        }
+        // 2.3 闈炶川妫�宸ュ簭锛氫粛鏈夊緟妫�鏁伴噺鏃朵笉鑳藉鎵癸紙璐ㄦ宸ュ簭鐨� uncheckQuantity > 0 鏄甯哥姸鎬侊紝涓嶅仛鎷︽埅锛�
         if (!checkFlag
                 && feedback.getUncheckQuantity() != null
                 && feedback.getUncheckQuantity().compareTo(BigDecimal.ZERO) > 0) {
             throw exception(PRO_FEEDBACK_UNCHECK_QUANTITY_EXISTS, feedback.getUncheckQuantity());
         }
 
-        // 3. 鐗╂枡娑堣�楋細鍊掑啿宸ュ簭鎸� BOM 鑷姩鎵f枡锛涢潪鍊掑啿宸ュ簭璺宠繃锛堢墿鏂欒蛋鎵嬪伐棰嗘枡/鎶曟枡锛�
+        // 3. 鐗╂枡娑堣�楋細鍊掑啿宸ュ簭鎸夋湰宸ュ簭鎶曟枡 BOM 鑷姩鎵f枡锛涢潪鍊掑啿宸ュ簭璺宠繃锛堢墿鏂欒蛋鎵嬪伐棰嗘枡/鎶曟枡锛�
         boolean backflushFlag = routeProcess != null && Boolean.TRUE.equals(routeProcess.getBackflushFlag());
         if (backflushFlag) {
-            // 3.1 鏍¢獙鍊掑啿宸ュ簭蹇呴』閰嶇疆 BOM 娑堣�楋紝閬垮厤闈欓粯涓嶆墸鏂�
-            List<MesProWorkOrderBomDO> boms = workOrderBomService.getWorkOrderBomListByWorkOrderId(
-                    feedback.getWorkOrderId());
+            // 3.1 鏍¢獙鍊掑啿宸ュ簭蹇呴』閰嶇疆鏈伐搴忕殑鎶曟枡 BOM锛岄伩鍏嶉潤榛樹笉鎵f枡
+            //     锛堝彧鏍¢獙褰撳墠鎶ュ伐宸ュ簭鐨勬姇鏂欙紝鍏朵粬宸ュ簭鎶曟枡鐢卞悇鑷伐搴忔姤宸ユ椂鎵i櫎锛�
+            List<MesProWorkOrderBomDO> boms = workOrderBomService.getWorkOrderBomListByWorkOrderIdAndProcessId(
+                    feedback.getWorkOrderId(), feedback.getProcessId());
             if (CollUtil.isEmpty(boms)) {
                 throw exception(PRO_FEEDBACK_BACKFLUSH_BOM_REQUIRED);
             }
-            // 3.2 鐢熸垚娑堣�楄褰曞苟鎵ц鎵e噺锛圔OM 脳 鎶ュ伐鏁伴噺锛孎IFO 鎵g嚎杈瑰簱锛�
+            // 3.2 鐢熸垚娑堣�楄褰曞苟鎵ц鎵e噺锛堟湰宸ュ簭鎶曟枡鐢ㄩ噺姣斾緥 脳 鎶ュ伐鏁伴噺锛孎IFO 鎵g嚎杈瑰簱锛�
             MesWmItemConsumeDO itemConsume = itemConsumeService.generateItemConsume(feedback);
             if (itemConsume != null) {
                 itemConsumeService.finishItemConsume(itemConsume.getId());
@@ -361,6 +372,12 @@
             if (ObjUtil.equal(line.getQualityStatus(), MesWmQualityStatusEnum.PASS.getStatus())) {
                 qualifiedQty = qualifiedQty.add(line.getQuantity());
             }
+        }
+        // 1.1 鍏滃簳锛氬叧閿潪璐ㄦ宸ュ簭瀹℃壒鏃朵骇鍑哄崟琛屽皻鏈敓鎴愶紝鐩存帴閲囩敤鎶ュ伐鍗曚笂鐨勫悎鏍�/涓嶈壇鏁伴噺
+        //     锛堥潪璐ㄦ宸ュ簭榛樿鍏ㄩ儴涓哄悎鏍煎搧锛涜川妫�宸ュ簭鐨勫悎鏍�/涓嶈壇鍦ㄨ川妫�鍥炶皟鍚庢寜浜у嚭琛岃仛鍚堬級
+        if (CollUtil.isEmpty(lines)) {
+            qualifiedQty = ObjectUtil.defaultIfNull(feedback.getQualifiedQuantity(), BigDecimal.ZERO);
+            unqualifiedQty = ObjectUtil.defaultIfNull(feedback.getUnqualifiedQuantity(), BigDecimal.ZERO);
         }
 
         //   2. 鏇存柊浠诲姟鐨勫凡鐢熶骇/鍚堟牸/涓嶅悎鏍兼暟閲�
@@ -461,21 +478,11 @@
         if (routeProcess == null) {
             throw exception(PRO_FEEDBACK_ROUTE_PROCESS_INVALID);
         }
-        // 4.1 鏍¢獙鏁伴噺
-        boolean checkFlag = Boolean.TRUE.equals(routeProcess.getCheckFlag());
-        if (checkFlag) {
-            // 闇�瑕佹楠岋細鍙渶濉姤宸ユ暟閲忥紝涓斿繀椤� > 0
-            if (reqVO.getFeedbackQuantity() == null
-                    || reqVO.getFeedbackQuantity().compareTo(BigDecimal.ZERO) <= 0) {
-                throw exception(PRO_FEEDBACK_QUANTITY_MUST_POSITIVE);
-            }
-        } else {
-            // 涓嶉渶妫�楠岋細闇�濉悎鏍煎搧 + 涓嶈壇鍝佹暟閲忥紝鍚堣 > 0
-            BigDecimal qualified = ObjectUtil.defaultIfNull(reqVO.getQualifiedQuantity(), BigDecimal.ZERO);
-            BigDecimal unqualified = ObjectUtil.defaultIfNull(reqVO.getUnqualifiedQuantity(), BigDecimal.ZERO);
-            if (qualified.add(unqualified).compareTo(BigDecimal.ZERO) <= 0) {
-                throw exception(PRO_FEEDBACK_QUALIFIED_UNQUALIFIED_REQUIRED);
-            }
+        // 4.1 鏍¢獙鏁伴噺锛氭棤璁烘槸鍚﹂渶瑕佹楠岋紝鎶ュ伐鍙渶濉姤宸ユ暟閲忥紝涓斿繀椤� > 0
+        // 鍚堟牸鍝�/涓嶈壇鍝佹暟閲忕敱璐ㄦ纭畾锛堥潪璐ㄦ宸ュ簭鍦ㄥ鎵规椂榛樿鍏ㄩ儴涓哄悎鏍煎搧锛�
+        if (reqVO.getFeedbackQuantity() == null
+                || reqVO.getFeedbackQuantity().compareTo(BigDecimal.ZERO) <= 0) {
+            throw exception(PRO_FEEDBACK_QUANTITY_MUST_POSITIVE);
         }
 
         return task;
@@ -498,19 +505,10 @@
         if (routeProcess == null) {
             throw exception(PRO_FEEDBACK_ROUTE_PROCESS_INVALID);
         }
-        // 3. 鏍¢獙鏁伴噺
-        boolean checkFlag = Boolean.TRUE.equals(routeProcess.getCheckFlag());
-        if (checkFlag) {
-            if (reqVO.getFeedbackQuantity() == null
-                    || reqVO.getFeedbackQuantity().compareTo(BigDecimal.ZERO) <= 0) {
-                throw exception(PRO_FEEDBACK_QUANTITY_MUST_POSITIVE);
-            }
-        } else {
-            BigDecimal qualified = ObjectUtil.defaultIfNull(reqVO.getQualifiedQuantity(), BigDecimal.ZERO);
-            BigDecimal unqualified = ObjectUtil.defaultIfNull(reqVO.getUnqualifiedQuantity(), BigDecimal.ZERO);
-            if (qualified.add(unqualified).compareTo(BigDecimal.ZERO) <= 0) {
-                throw exception(PRO_FEEDBACK_QUALIFIED_UNQUALIFIED_REQUIRED);
-            }
+        // 3. 鏍¢獙鏁伴噺锛氬彧濉姤宸ユ暟閲忥紝涓斿繀椤� > 0锛堝悎鏍煎搧/涓嶈壇鍝佹暟閲忕敱璐ㄦ纭畾锛�
+        if (reqVO.getFeedbackQuantity() == null
+                || reqVO.getFeedbackQuantity().compareTo(BigDecimal.ZERO) <= 0) {
+            throw exception(PRO_FEEDBACK_QUANTITY_MUST_POSITIVE);
         }
         // 4. 鏋勫缓鎶ュ伐DO
         MesProFeedbackDO feedback = new MesProFeedbackDO()
@@ -523,8 +521,6 @@
                 .setTaskId(reqVO.getTaskId())
                 .setItemId(task.getItemId())
                 .setFeedbackQuantity(reqVO.getFeedbackQuantity())
-                .setQualifiedQuantity(reqVO.getQualifiedQuantity())
-                .setUnqualifiedQuantity(reqVO.getUnqualifiedQuantity())
                 .setScheduledQuantity(task.getQuantity())
                 .setFeedbackTime(LocalDateTime.now())
                 .setStatus(MesProFeedbackStatusEnum.APPROVING.getStatus())
@@ -533,10 +529,21 @@
         saveParamValues(task.getId(), reqVO.getParamValues());
         // 5. 杩斿洖缁撴灉
         MesProWorkOrderDO workOrder = workOrderService.getWorkOrder(task.getWorkOrderId());
+        // 5.1 鎶ュ伐鍚庡墿浣欏彲鎶ュ伐鏁伴噺 = 鎺掍骇 - 宸茬敓浜� - 鍦ㄩ�旓紙鍚湰娆℃姤宸ワ級
+        BigDecimal reportable = task.getQuantity() == null ? BigDecimal.ZERO : task.getQuantity();
+        BigDecimal produced = task.getProducedQuantity() == null ? BigDecimal.ZERO : task.getProducedQuantity();
+        BigDecimal inTransit = BigDecimal.ZERO;
+        for (MesProFeedbackDO fb : getFeedbackListByTaskId(task.getId())) {
+            if (!ObjUtil.equal(fb.getStatus(), MesProFeedbackStatusEnum.FINISHED.getStatus())) {
+                inTransit = inTransit.add(fb.getFeedbackQuantity() == null ? BigDecimal.ZERO : fb.getFeedbackQuantity());
+            }
+        }
+        BigDecimal reportableQuantity = reportable.subtract(produced).subtract(inTransit).max(BigDecimal.ZERO);
         return new MesProFeedbackQuickCreateRespVO()
                 .setFeedbackId(feedback.getId())
                 .setTaskStatus(task.getStatus())
-                .setWorkOrderStatus(workOrder != null ? workOrder.getStatus() : null);
+                .setWorkOrderStatus(workOrder != null ? workOrder.getStatus() : null)
+                .setReportableQuantity(reportableQuantity);
     }
 
     @Override
@@ -550,8 +557,6 @@
                 MesProFeedbackQuickCreateReqVO singleReq = new MesProFeedbackQuickCreateReqVO();
                 singleReq.setTaskId(taskId);
                 singleReq.setFeedbackQuantity(reqVO.getFeedbackQuantity());
-                singleReq.setQualifiedQuantity(reqVO.getQualifiedQuantity());
-                singleReq.setUnqualifiedQuantity(reqVO.getUnqualifiedQuantity());
                 singleReq.setRemark(reqVO.getRemark());
                 MesProFeedbackQuickCreateRespVO resp = quickCreateFeedback(singleReq);
                 results.add(new MesProFeedbackBatchCreateRespVO.BatchResult()

--
Gitblit v1.9.3