From df6efd77578c8ba54d1ae3be9198c70fb5173399 Mon Sep 17 00:00:00 2001
From: liu <2021943741@qq.com>
Date: 星期六, 29 八月 2026 01:46:11 +0800
Subject: [PATCH] feat(mes): 报工只填写报工数量,合格/不良数量由质检确定;快速报工响应返回剩余可报工数量

---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackQuickCreateReqVO.java  |    6 ---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productproduce/MesWmProductProduceServiceImpl.java         |    4 ++
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImpl.java                   |   72 +++++++++++++++++++-----------------
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackBatchCreateReqVO.java  |    6 ---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackQuickCreateRespVO.java |    5 ++
 5 files changed, 47 insertions(+), 46 deletions(-)

diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackBatchCreateReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackBatchCreateReqVO.java
index 8837e16..d652ca1 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackBatchCreateReqVO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackBatchCreateReqVO.java
@@ -20,12 +20,6 @@
     @NotNull(message = "鎶ュ伐鏁伴噺涓嶈兘涓虹┖")
     private BigDecimal feedbackQuantity;
 
-    @Schema(description = "鍚堟牸鍝佹暟閲忥紙闈炶川妫�宸ュ簭蹇呭~锛�", example = "48")
-    private BigDecimal qualifiedQuantity;
-
-    @Schema(description = "涓嶈壇鍝佹暟閲�", example = "2")
-    private BigDecimal unqualifiedQuantity;
-
     @Schema(description = "澶囨敞", example = "鎵归噺鎶ュ伐")
     private String remark;
 }
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackQuickCreateReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackQuickCreateReqVO.java
index 0b6ba8a..ce717b4 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackQuickCreateReqVO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackQuickCreateReqVO.java
@@ -19,12 +19,6 @@
     @NotNull(message = "鎶ュ伐鏁伴噺涓嶈兘涓虹┖")
     private BigDecimal feedbackQuantity;
 
-    @Schema(description = "鍚堟牸鍝佹暟閲忥紙闈炶川妫�宸ュ簭蹇呭~锛�", example = "48")
-    private BigDecimal qualifiedQuantity;
-
-    @Schema(description = "涓嶈壇鍝佹暟閲�", example = "2")
-    private BigDecimal unqualifiedQuantity;
-
     @Schema(description = "宸ヨ壓鍙傛暟鍊�")
     private List<MesProFeedbackSaveReqVO.ParamValue> paramValues;
 
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackQuickCreateRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackQuickCreateRespVO.java
index f3a87c0..1b80a2c 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackQuickCreateRespVO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackQuickCreateRespVO.java
@@ -4,6 +4,8 @@
 import lombok.Data;
 import lombok.experimental.Accessors;
 
+import java.math.BigDecimal;
+
 @Schema(description = "绠$悊鍚庡彴 - MES 蹇�熸姤宸� Response VO")
 @Data
 @Accessors(chain = true)
@@ -17,4 +19,7 @@
 
     @Schema(description = "宸ュ崟鐘舵�侊紙鍙兘鑷姩瀹屾垚锛�", example = "1")
     private Integer workOrderStatus;
+
+    @Schema(description = "鎶ュ伐鍚庡墿浣欏彲鎶ュ伐鏁伴噺", example = "20.00")
+    private BigDecimal reportableQuantity;
 }
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..016e10a 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,7 +279,17 @@
                 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) {
@@ -361,6 +371,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 +477,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 +504,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 +520,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 +528,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 +556,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()
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productproduce/MesWmProductProduceServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productproduce/MesWmProductProduceServiceImpl.java
index ef11a06..1c45ee4 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productproduce/MesWmProductProduceServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productproduce/MesWmProductProduceServiceImpl.java
@@ -168,6 +168,10 @@
             // 3.2 鏃犻渶妫�楠岋細鎸夊悎鏍煎搧/涓嶅悎鏍煎搧鍚勭敓鎴愪竴琛� + 鏄庣粏
             BigDecimal qualifiedQty = ObjectUtil.defaultIfNull(feedback.getQualifiedQuantity(), BigDecimal.ZERO);
             BigDecimal unqualifiedQty = ObjectUtil.defaultIfNull(feedback.getUnqualifiedQuantity(), BigDecimal.ZERO);
+            // 3.2.0 鍏滃簳锛氬悎鏍�/涓嶈壇鏁伴噺閮芥湭濉啓鏃讹紙鎶ュ伐鍙~鎶ュ伐鏁伴噺锛夛紝榛樿鏁村崟涓哄悎鏍煎搧
+            if (qualifiedQty.compareTo(BigDecimal.ZERO) <= 0 && unqualifiedQty.compareTo(BigDecimal.ZERO) <= 0) {
+                qualifiedQty = feedback.getFeedbackQuantity();
+            }
             // 3.2.1 涓嶅悎鏍煎搧琛� + 鏄庣粏
             if (unqualifiedQty.compareTo(BigDecimal.ZERO) > 0) {
                 MesWmProductProduceLineDO unqualifiedLine = buildProduceLine(produce, feedback, batchId, batchCode,

--
Gitblit v1.9.3