From 3495965b99dfcbf191eefb8294a8de05bedc160a Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期五, 04 九月 2026 13:40:34 +0800
Subject: [PATCH] feat(mes): 新增批量查询方法并优化IPQC/IQC导出功能

---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/oqc/MesQcOqcServiceImpl.java |   64 ++++++++++++++++++++++++++-----
 1 files changed, 53 insertions(+), 11 deletions(-)

diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/oqc/MesQcOqcServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/oqc/MesQcOqcServiceImpl.java
index b392411..30bf336 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/oqc/MesQcOqcServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/oqc/MesQcOqcServiceImpl.java
@@ -1,5 +1,6 @@
 package cn.iocoder.yudao.module.mes.service.qc.oqc;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
@@ -13,11 +14,13 @@
 import cn.iocoder.yudao.module.mes.enums.qc.MesQcStatusEnum;
 import cn.iocoder.yudao.module.mes.enums.qc.MesQcTypeEnum;
 import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
 import cn.iocoder.yudao.module.mes.service.qc.defectrecord.MesQcDefectRecordService;
 import cn.iocoder.yudao.module.mes.service.qc.indicatorresult.MesQcIndicatorResultService;
 import cn.iocoder.yudao.module.mes.service.qc.template.MesQcTemplateItemService;
 import cn.iocoder.yudao.module.mes.service.wm.productsales.MesWmProductSalesLineService;
+import cn.iocoder.yudao.module.mes.controller.admin.qc.ncr.vo.MesQcNcrSaveReqVO;
+import cn.iocoder.yudao.module.mes.service.qc.ncr.MesQcNcrService;
+import cn.iocoder.yudao.module.mes.enums.qc.MesQcCheckResultEnum;
 import cn.iocoder.yudao.module.mes.service.wm.productsales.MesWmProductSalesService;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productsales.MesWmProductSalesDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productsales.MesWmProductSalesLineDO;
@@ -41,7 +44,7 @@
 /**
  * MES 鍑鸿揣妫�楠屽崟锛圤QC锛� Service 瀹炵幇绫�
  *
- * @author 鑺嬮亾婧愮爜
+ * @author 瓒呯骇绠$悊鍛�
  */
 @Service
 @Validated
@@ -59,9 +62,6 @@
     private MesQcDefectRecordService defectRecordService;
     @Resource
     @Lazy
-    private MesMdItemService itemService;
-    @Resource
-    @Lazy
     private MesWmProductSalesLineService productSalesLineService;
     @Resource
     @Lazy
@@ -77,6 +77,10 @@
     @Resource
     private CrmCustomerApi customerApi;
 
+    @Resource
+    @Lazy
+    private MesQcNcrService ncrService;
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Long createOqc(MesQcOqcSaveReqVO createReqVO) {
@@ -85,9 +89,21 @@
         // 1.2 鏍¢獙鏉ユ簮鍗曟嵁鍙傛暟锛屽苟楠岃瘉鏁版嵁瀛樺湪
         String sourceDocCode = validateAndGetSourceDocCode(
                 createReqVO.getSourceDocType(), createReqVO.getSourceLineId());
-        // 1.3 鏍规嵁浜у搧 + 妫�楠岀被鍨嬭嚜鍔ㄥ尮閰嶆ā鏉�
-        MesQcTemplateItemDO templateItem = templateItemService.getRequiredTemplateByItemIdAndType(
-                createReqVO.getItemId(), MesQcTypeEnum.OQC.getType());
+        // 1.3 鏍规嵁浜у搧 + OQC 绫诲瀷鏌ユ壘鍙敤璐ㄦ鏂规锛堟敮鎸佸墠绔樉寮忔寚瀹氾級
+        List<MesQcTemplateItemDO> templateItems = templateItemService.getTemplateItemList(
+                createReqVO.getItemId(), MesQcTypeEnum.OQC.getType(), null, null);
+        if (CollUtil.isEmpty(templateItems)) {
+            throw exception(QC_NO_TEMPLATE);
+        }
+        MesQcTemplateItemDO templateItem = templateItems.get(0);
+        if (createReqVO.getTemplateId() != null) {
+            templateItem = templateItems.stream()
+                    .filter(available -> Objects.equals(available.getTemplateId(), createReqVO.getTemplateId()))
+                    .findFirst().orElse(null);
+            if (templateItem == null) {
+                throw exception(QC_NO_TEMPLATE); // 鎸囧畾浜嗘柟妗堜絾涓嶅湪鍖归厤鍒楄〃涓紝鎷掔粷
+            }
+        }
         Long templateId = templateItem.getTemplateId();
 
         // 2. 鎻掑叆涓昏〃
@@ -121,8 +137,8 @@
         // 鏍¢獙缂栧彿鍞竴
         validateOqcCodeUnique(reqVO.getId(), reqVO.getCode());
         // 鏍¢獙鐗╂枡銆佹娴嬩汉鍛樺瓨鍦�
-        // 娉細瀹㈡埛 ID 鏉ヨ嚜 CRM锛屼笉闇�瑕佸湪 MES 涓牎楠�
-        itemService.validateItemExists(reqVO.getItemId());
+        // 娉細鐗╂枡 ID 鏉ヨ嚜 MDM锛屽鎴� ID 鏉ヨ嚜 CRM
+        mdmItemApi.validateItemExists(reqVO.getItemId());
         adminUserApi.validateUser(reqVO.getInspectorUserId());
     }
 
@@ -143,11 +159,37 @@
                 .setId(id).setStatus(MesQcStatusEnum.FINISHED.getStatus());
         oqcMapper.updateById(updateObj);
 
-        // 3. 鍥炲啓鏉ユ簮鍗曟嵁
+        // 3. 涓嶅悎鏍兼椂鑷姩鍒涘缓 NCR
+        generateNcrIfNeeded(oqc);
+
+        // 4. 鍥炲啓鏉ユ簮鍗曟嵁
         writeBackSourceDoc(oqc);
     }
 
     /**
+     * 涓嶅悎鏍兼椂鑷姩鍒涘缓 NCR锛堜笉鍚堟牸鍝佸鐞嗗崟锛�
+     *
+     * @param oqc 鍑鸿揣妫�楠屽崟
+     */
+    private void generateNcrIfNeeded(MesQcOqcDO oqc) {
+        BigDecimal unqualifiedQty = oqc.getUnqualifiedQuantity();
+        if (unqualifiedQty == null || unqualifiedQty.compareTo(BigDecimal.ZERO) <= 0) {
+            return;
+        }
+        String ncrCode = "NCR" + java.time.LocalDateTime.now()
+                .format(java.time.format.DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS"));
+        MesQcNcrSaveReqVO saveReqVO = new MesQcNcrSaveReqVO();
+        saveReqVO.setCode(ncrCode);
+        saveReqVO.setName("涓嶅悎鏍煎搧澶勭悊鍗�");
+        saveReqVO.setQcType(MesQcTypeEnum.OQC.getType());
+        saveReqVO.setQcId(oqc.getId());
+        saveReqVO.setItemId(oqc.getItemId());
+        saveReqVO.setUnqualifiedQuantity(unqualifiedQty);
+        saveReqVO.setDefectDescription("鐢卞嚭璐ф楠�(" + oqc.getCode() + ")鑷姩鐢熸垚");
+        ncrService.createNcr(saveReqVO);
+    }
+
+    /**
      * 鍥炲啓鏉ユ簮鍗曟嵁锛圤QC 瀹屾垚鍚庯級
      *
      * <p>褰撴潵婧愪负閿�鍞嚭搴撳崟鏃讹紝璋冪敤

--
Gitblit v1.9.3