From ac2e2b5af3726ee64dc37c3ebf26989a0346f22a Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期六, 07 十一月 2026 19:16:05 +0800
Subject: [PATCH] feat(feedback): 优化报工审批流程并增加报工人校验

---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/rqc/MesQcRqcServiceImpl.java |   52 ++++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 46 insertions(+), 6 deletions(-)

diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/rqc/MesQcRqcServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/rqc/MesQcRqcServiceImpl.java
index d20475f..5ef87eb 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/rqc/MesQcRqcServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/rqc/MesQcRqcServiceImpl.java
@@ -10,6 +10,8 @@
 import cn.iocoder.yudao.module.mes.dal.dataobject.qc.defectrecord.MesQcDefectRecordDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.qc.rqc.MesQcRqcDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.qc.template.MesQcTemplateItemDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnissue.MesWmReturnIssueLineDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesLineDO;
 import cn.iocoder.yudao.module.mes.dal.mysql.qc.rqc.MesQcRqcMapper;
 import cn.iocoder.yudao.module.mes.enums.qc.MesQcStatusEnum;
 import cn.iocoder.yudao.module.mes.enums.qc.MesQcDefectLevelEnum;
@@ -40,6 +42,7 @@
 import java.util.Objects;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
 import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*;
 import cn.iocoder.yudao.module.mes.controller.admin.qc.rqc.vo.MesQcRqcImportExcelVO;
 import cn.iocoder.yudao.module.mes.controller.admin.qc.rqc.vo.MesQcRqcImportRespVO;
@@ -119,6 +122,13 @@
                 .setTemplateId(templateId)
                 .setSourceDocCode(sourceDocCode)
                 .setStatus(MesQcStatusEnum.DRAFT.getStatus());
+        // 妫�娴嬩汉鍛樸�佹娴嬫棩鏈熸湭濉啓鏃朵娇鐢ㄩ粯璁ゅ�硷紝涓嶅奖鍝嶆祦绋�
+        if (rqc.getInspectorUserId() == null) {
+            rqc.setInspectorUserId(getLoginUserId());
+        }
+        if (rqc.getInspectDate() == null) {
+            rqc.setInspectDate(LocalDateTime.now());
+        }
         rqcMapper.insert(rqc);
 
         // 3. 浠庢ā鏉挎寚鏍囪嚜鍔ㄧ敓鎴愭楠岃
@@ -146,7 +156,10 @@
         validateRqcCodeUnique(reqVO.getId(), reqVO.getCode());
         // 鏍¢獙鐗╂枡銆佹娴嬩汉鍛樺瓨鍦紙鍏煎 mdm_item.id / mes_md_item.id锛�
         qcItemResolver.validateItemExists(reqVO.getItemId());
-        adminUserApi.validateUser(reqVO.getInspectorUserId());
+        // 鏍¢獙妫�娴嬩汉鍛樺瓨鍦紙闈炲繀濉紝鏈~鍐欐椂鐢卞垱寤洪�昏緫榛樿褰撳墠鐧诲綍浜猴級
+        if (reqVO.getInspectorUserId() != null) {
+            adminUserApi.validateUser(reqVO.getInspectorUserId());
+        }
     }
 
     @Override
@@ -166,7 +179,9 @@
                 throw exception(QC_RQC_QUANTITY_MISMATCH);
             }
         }
-        // 1.4 鏍¢獙鑷冲皯瀛樺湪涓�鏉℃娴嬬粨鏋�
+        // 1.4 鏍¢獙妫�娴嬫暟閲忎笌鏉ユ簮閫�璐ц鏁伴噺涓�鑷达紝閬垮厤鍥炲啓鏃惰鐩栨潵婧愯鏁伴噺
+        validateSourceLineQuantity(rqc);
+        // 1.5 鏍¢獙鑷冲皯瀛樺湪涓�鏉℃娴嬬粨鏋�
         indicatorResultService.validateIndicatorResultExistsByQcIdAndType(id, MesQcTypeEnum.RQC.getType());
 
         // 2. 鏇存柊鐘舵�佷负宸插畬鎴�
@@ -178,6 +193,33 @@
 
         // 4. 鍥炲啓鏉ユ簮鍗曟嵁
         writeBackSourceDoc(rqc);
+    }
+
+    /**
+     * 鏍¢獙妫�娴嬫暟閲忎笌鏉ユ簮閫�璐ц鏁伴噺涓�鑷�
+     *
+     * <p>鍥炲啓鏉ユ簮鍗曟嵁鏃朵細鐢ㄥ悎鏍�/涓嶅悎鏍兼暟閲忛噸鍐欒鐨勬暟閲忥紝鑻ユ娴嬫暟閲忎笌鏉ユ簮琛屼笉涓�鑷翠細闈欓粯鏀瑰彉閫�璐ф暟閲忥紝
+     * 鍥犳瀹屾垚妫�楠屽墠蹇呴』淇濊瘉涓よ�呯浉绛夈��
+     */
+    private void validateSourceLineQuantity(MesQcRqcDO rqc) {
+        if (rqc.getSourceDocType() == null || rqc.getSourceLineId() == null || rqc.getCheckQuantity() == null) {
+            return;
+        }
+        BigDecimal sourceQuantity = null;
+        if (Objects.equals(rqc.getSourceDocType(), MesBizTypeConstants.WM_RETURN_ISSUE)) {
+            MesWmReturnIssueLineDO line = returnIssueLineService.getReturnIssueLine(rqc.getSourceLineId());
+            if (line != null) {
+                sourceQuantity = line.getQuantity();
+            }
+        } else if (Objects.equals(rqc.getSourceDocType(), MesBizTypeConstants.WM_RETURN_SALES)) {
+            MesWmReturnSalesLineDO line = returnSalesLineService.getReturnSalesLine(rqc.getSourceLineId());
+            if (line != null) {
+                sourceQuantity = line.getQuantity();
+            }
+        }
+        if (sourceQuantity != null && rqc.getCheckQuantity().compareTo(sourceQuantity) != 0) {
+            throw exception(QC_RQC_SOURCE_QUANTITY_INVALID, sourceQuantity.stripTrailingZeros().toPlainString());
+        }
     }
 
     /**
@@ -216,8 +258,7 @@
             return;
         }
         if (rqc.getSourceLineId() == null) {
-            throw new IllegalArgumentException(
-                    "RQC 鍗昜" + rqc.getId() + "] sourceDocType 闈炵┖浣� sourceLineId 涓虹┖");
+            throw exception(QC_RQC_SOURCE_LINE_REQUIRED);
         }
 
         if (Objects.equals(rqc.getSourceDocType(), MesBizTypeConstants.WM_RETURN_ISSUE)) {
@@ -231,8 +272,7 @@
                     rqc.getSourceLineId(), rqc.getSourceDocId(), rqc.getCheckResult(),
                     rqc.getQualifiedQuantity(), rqc.getUnqualifiedQuantity());
         } else {
-            throw new IllegalArgumentException(
-                    "RQC 鍗昜" + rqc.getId() + "] sourceDocType=" + rqc.getSourceDocType() + " 鏃犳硶璇嗗埆锛屾棤娉曞洖鍐欐潵婧愬崟鎹�");
+            throw exception(QC_RQC_SOURCE_DOC_TYPE_UNKNOWN, rqc.getSourceDocType());
         }
     }
 

--
Gitblit v1.9.3