From 4dc00a72e6229e7fdcd6055132cfb4128da1774f Mon Sep 17 00:00:00 2001
From: 吴羡 <16976746+Xian-TT3@user.noreply.gitee.com>
Date: 星期一, 28 九月 2026 14:53:40 +0800
Subject: [PATCH] 宁夏万通需求:生产领料取消三个字段必填;来料检验质检方案与产品物料解绑

---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/vo/MesWmProductIssueSaveReqVO.java |    3 -
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java                                       |    2 +
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcServiceImpl.java                             |   34 ++++++++++------
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/template/MesQcTemplateItemController.java       |   12 +++++
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/template/MesQcTemplateServiceImpl.java                   |   10 +++++
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/template/MesQcTemplateService.java                       |    8 ++++
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueServiceImpl.java           |   20 +++++-----
 7 files changed, 63 insertions(+), 26 deletions(-)

diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/template/MesQcTemplateItemController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/template/MesQcTemplateItemController.java
index cdd5397..e4f02e4 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/template/MesQcTemplateItemController.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/template/MesQcTemplateItemController.java
@@ -28,6 +28,7 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
 import static cn.iocoder.yudao.framework.common.util.collection.MapUtils.findAndThen;
@@ -91,13 +92,22 @@
     }
 
     @GetMapping("/list-by-item-and-type")
-    @Operation(summary = "鏍规嵁鐗╂枡鎴栧伐鍗�/浠诲姟鍜屾娴嬬绫昏幏鍙栧彲鐢ㄨ川妫�鏂规")
+    @Operation(summary = "鏍规嵁鐗╂枡鎴栧伐鍗�/浠诲姟鍜屾娴嬬绫昏幏鍙栧彲鐢ㄨ川妫�鏂规锛堟湭鎸囧畾鐗╂枡/宸ュ崟/浠诲姟鏃惰繑鍥炶妫�娴嬬绫讳笅鍏ㄩ儴鍚敤鏂规锛�")
     @PreAuthorize("@ss.hasPermission('mes:qc-template:query')")
     public CommonResult<List<MesQcTemplateItemOptionRespVO>> getTemplateItemOptionList(
             @RequestParam(value = "qcType", required = false) Integer qcType,
             @RequestParam(value = "itemId", required = false) Long itemId,
             @RequestParam(value = "workOrderId", required = false) Long workOrderId,
             @RequestParam(value = "taskId", required = false) Long taskId) {
+        // 鏈寚瀹氱墿鏂�/宸ュ崟/浠诲姟鏃讹紝鎸夋娴嬬绫昏繑鍥炲叏閮ㄥ惎鐢ㄧ殑璐ㄦ鏂规锛堜笉闄愬埗浜у搧鐗╂枡鍏宠仈锛�
+        if (itemId == null && workOrderId == null && taskId == null && qcType != null) {
+            List<MesQcTemplateItemOptionRespVO> options = templateService.getEnabledTemplateListByType(qcType)
+                    .stream().map(template -> new MesQcTemplateItemOptionRespVO()
+                            .setTemplateId(template.getId()).setTemplateCode(template.getCode())
+                            .setTemplateName(template.getName()))
+                    .collect(Collectors.toList());
+            return success(options);
+        }
         List<MesQcTemplateItemDO> list = templateItemService.getTemplateItemList(
                 itemId, qcType, workOrderId, taskId);
         if (CollUtil.isEmpty(list)) {
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/vo/MesWmProductIssueSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/vo/MesWmProductIssueSaveReqVO.java
index b84e0ea..2918ba7 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/vo/MesWmProductIssueSaveReqVO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/vo/MesWmProductIssueSaveReqVO.java
@@ -22,8 +22,7 @@
     @NotBlank(message = "棰嗘枡鍗曞悕绉颁笉鑳戒负绌�")
     private String name;
 
-    @Schema(description = "鐢熶骇浠诲姟 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
-    @NotNull(message = "鐢熶骇浠诲姟 ID 涓嶈兘涓虹┖")
+    @Schema(description = "鐢熶骇浠诲姟 ID", example = "1")
     private Long taskId;
 
     @Schema(description = "鐢熶骇宸ュ崟 ID", example = "1")
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java
index d93fca2..44b3741 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java
@@ -393,6 +393,8 @@
     ErrorCode QC_NO_TEMPLATE_FOR_ITEM = new ErrorCode(1_040_603_008, "鐗╂枡銆恵}銆戞湭閰嶇疆 IQC 妫�娴嬫ā鏉匡紝璇峰厛鍦ㄨ川閲忕鐞嗕腑閰嶇疆");
     ErrorCode QC_IQC_SOURCE_DOC_PARAMS_MISSING = new ErrorCode(1_040_603_006, "鏉ユ簮鍗曟嵁绫诲瀷闈炵┖鏃讹紝鏉ユ簮鍗曟嵁 ID 鍜屾潵婧愬崟鎹 ID 涓嶈兘涓虹┖");
     ErrorCode QC_IQC_CHECK_RESULT_EMPTY = new ErrorCode(1_040_603_007, "瀹屾垚妫�楠屽崟鍓嶏紝妫�娴嬬粨鏋滃繀椤诲~鍐�");
+    ErrorCode QC_IQC_TEMPLATE_IS_DISABLE = new ErrorCode(1_040_603_009, "鎵�閫夎川妫�鏂规銆恵}銆戝凡绂佺敤锛岃閲嶆柊閫夋嫨宸插惎鐢ㄧ殑璐ㄦ鏂规");
+    ErrorCode QC_IQC_TEMPLATE_TYPE_NOT_MATCH = new ErrorCode(1_040_603_010, "鎵�閫夎川妫�鏂规銆恵}銆戠殑妫�娴嬬绫讳笉鍖呭惈鏉ユ枡妫�楠岋紝璇烽噸鏂伴�夋嫨妫�娴嬬绫诲寘鍚潵鏂欐楠岀殑璐ㄦ鏂规");
     // ========== MES 璐ㄩ噺绠$悊-鏉ユ枡妫�楠岃锛�1-040-603-100锛� ==========
     ErrorCode QC_IQC_LINE_NOT_EXISTS = new ErrorCode(1_040_603_100, "鏉ユ枡妫�楠岃涓嶅瓨鍦�");
 
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcServiceImpl.java
index 353da9a..1281815 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcServiceImpl.java
@@ -7,6 +7,7 @@
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.hutool.core.util.ObjectUtil;
+import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
 import cn.iocoder.yudao.module.mes.controller.admin.qc.iqc.vo.MesQcIqcImportExcelVO;
 import cn.iocoder.yudao.module.mes.controller.admin.qc.iqc.vo.MesQcIqcPageReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.qc.iqc.vo.MesQcIqcSaveReqVO;
@@ -16,6 +17,7 @@
 import cn.iocoder.yudao.module.mes.service.qc.imports.MesQcImportHelper;
 import cn.iocoder.yudao.module.mes.dal.dataobject.qc.defectrecord.MesQcDefectRecordDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.qc.iqc.MesQcIqcDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.qc.template.MesQcTemplateDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.qc.template.MesQcTemplateItemDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.arrivalnotice.MesWmArrivalNoticeLineDO;
 import cn.iocoder.yudao.module.mes.dal.mysql.qc.iqc.MesQcIqcMapper;
@@ -27,6 +29,7 @@
 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.qc.template.MesQcTemplateService;
 import cn.iocoder.yudao.module.mes.service.wm.arrivalnotice.MesWmArrivalNoticeService;
 import cn.iocoder.yudao.module.mes.service.wm.outsourcereceipt.MesWmOutsourceReceiptService;
 import cn.iocoder.yudao.module.mes.controller.admin.qc.ncr.vo.MesQcNcrSaveReqVO;
@@ -65,6 +68,8 @@
     @Resource
     private MesQcTemplateItemService templateItemService;
     @Resource
+    private MesQcTemplateService templateService;
+    @Resource
     private MesQcIqcLineService iqcLineService;
     @Resource
     private MesQcDefectRecordService defectRecordService;
@@ -101,22 +106,25 @@
         // 1.2 鏍¢獙鏉ユ簮鍗曟嵁鍙傛暟锛屽苟楠岃瘉鏁版嵁瀛樺湪
         String sourceDocCode = validateAndGetSourceDocCode(
                 createReqVO.getSourceDocType(), createReqVO.getSourceDocId(), createReqVO.getSourceLineId());
-        // 1.3 鏍规嵁浜у搧 + IQC 绫诲瀷鏌ユ壘鍙敤璐ㄦ鏂规锛堟敮鎸佸墠绔樉寮忔寚瀹氾級
-        List<MesQcTemplateItemDO> templateItems = templateItemService.getTemplateItemList(
-                createReqVO.getItemId(), MesQcTypeEnum.IQC.getType(), null, null);
-        if (CollUtil.isEmpty(templateItems)) {
-            throw exception(QC_NO_TEMPLATE);
-        }
-        MesQcTemplateItemDO templateItem = templateItems.get(0);
+        // 1.3 纭畾璐ㄦ鏂规锛氭樉寮忔寚瀹氭椂鏍¢獙鏂规鏈韩鍙敤锛堜笉瑕佹眰涓庝骇鍝佺墿鏂欑粦瀹氾級锛涙湭鎸囧畾鏃舵寜鐗╂枡宸茬粦瀹氭柟妗堝厹搴�
+        Long templateId;
         if (createReqVO.getTemplateId() != null) {
-            templateItem = templateItems.stream()
-                    .filter(item -> Objects.equals(item.getTemplateId(), createReqVO.getTemplateId()))
-                    .findFirst().orElse(null);
-            if (templateItem == null) {
-                throw exception(QC_NO_TEMPLATE); // 鎸囧畾浜嗘柟妗堜絾涓嶅湪鍖归厤鍒楄〃涓紝鎷掔粷
+            MesQcTemplateDO template = templateService.getTemplate(createReqVO.getTemplateId());
+            if (template == null) {
+                throw new ServiceException(QC_TEMPLATE_NOT_EXISTS.getCode(), StrUtil.format(
+                        "鎵�閫夎川妫�鏂规涓嶅瓨鍦紙ID={}锛夛紝鍙兘宸茶鍒犻櫎锛岃鍒锋柊鍚庨噸鏂伴�夋嫨璐ㄦ鏂规", createReqVO.getTemplateId()));
             }
+            if (!CommonStatusEnum.isEnable(template.getStatus())) {
+                throw exception(QC_IQC_TEMPLATE_IS_DISABLE, template.getName());
+            }
+            if (!CollUtil.contains(template.getTypes(), MesQcTypeEnum.IQC.getType())) {
+                throw exception(QC_IQC_TEMPLATE_TYPE_NOT_MATCH, template.getName());
+            }
+            templateId = template.getId();
+        } else {
+            templateId = templateItemService.getRequiredTemplateByItemIdAndType(
+                    createReqVO.getItemId(), MesQcTypeEnum.IQC.getType()).getTemplateId();
         }
-        Long templateId = templateItem.getTemplateId();
 
         // 2. 鎻掑叆涓昏〃
         MesQcIqcDO iqc = BeanUtils.toBean(createReqVO, MesQcIqcDO.class)
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/template/MesQcTemplateService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/template/MesQcTemplateService.java
index 96adfb7..1a9b3ba 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/template/MesQcTemplateService.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/template/MesQcTemplateService.java
@@ -90,4 +90,12 @@
      */
     MesQcTemplateDO validateTemplateExists(Long id);
 
+    /**
+     * 鑾峰緱鎸囧畾妫�娴嬬绫荤殑鍚敤璐ㄦ鏂规鍒楄〃锛堟湭鎸囧畾鐗╂枡绛変笂涓嬫枃鏃剁殑涓嬫媺閫夋嫨锛�
+     *
+     * @param qcType 妫�娴嬬绫�
+     * @return 璐ㄦ鏂规鍒楄〃
+     */
+    List<MesQcTemplateDO> getEnabledTemplateListByType(Integer qcType);
+
 }
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/template/MesQcTemplateServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/template/MesQcTemplateServiceImpl.java
index 912153b..0a08ba7 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/template/MesQcTemplateServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/template/MesQcTemplateServiceImpl.java
@@ -2,6 +2,7 @@
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjUtil;
+import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.mes.controller.admin.qc.template.vo.MesQcTemplatePageReqVO;
@@ -17,6 +18,7 @@
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*;
@@ -119,5 +121,13 @@
         return templateMapper.selectByIds(ids);
     }
 
+    @Override
+    public List<MesQcTemplateDO> getEnabledTemplateListByType(Integer qcType) {
+        return templateMapper.selectList().stream()
+                .filter(template -> CommonStatusEnum.isEnable(template.getStatus())
+                        && CollUtil.contains(template.getTypes(), qcType))
+                .collect(Collectors.toList());
+    }
+
 }
 
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueServiceImpl.java
index 3164436..0b52b25 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueServiceImpl.java
@@ -91,11 +91,11 @@
         validateProductIssueSaveData(createReqVO);
 
         // 2. 浠� task 鑷姩甯﹀叆 workOrderId 鍜� workstationId
-        MesProTaskDO task = taskService.validateTaskExists(createReqVO.getTaskId());
-        if (createReqVO.getWorkOrderId() == null) {
+        MesProTaskDO task = createReqVO.getTaskId() != null ? taskService.validateTaskExists(createReqVO.getTaskId()) : null;
+        if (task != null && createReqVO.getWorkOrderId() == null) {
             createReqVO.setWorkOrderId(task.getWorkOrderId());
         }
-        if (createReqVO.getWorkstationId() == null) {
+        if (task != null && createReqVO.getWorkstationId() == null) {
             createReqVO.setWorkstationId(task.getWorkstationId());
         }
 
@@ -115,11 +115,11 @@
         validateProductIssueSaveData(updateReqVO);
 
         // 2. 浠� task 鑷姩甯﹀叆 workOrderId 鍜� workstationId
-        MesProTaskDO task = taskService.validateTaskExists(updateReqVO.getTaskId());
-        if (updateReqVO.getWorkOrderId() == null) {
+        MesProTaskDO task = updateReqVO.getTaskId() != null ? taskService.validateTaskExists(updateReqVO.getTaskId()) : null;
+        if (task != null && updateReqVO.getWorkOrderId() == null) {
             updateReqVO.setWorkOrderId(task.getWorkOrderId());
         }
-        if (updateReqVO.getWorkstationId() == null) {
+        if (task != null && updateReqVO.getWorkstationId() == null) {
             updateReqVO.setWorkstationId(task.getWorkstationId());
         }
 
@@ -398,10 +398,10 @@
      */
     private void validateProductIssueSaveData(MesWmProductIssueSaveReqVO reqVO) {
         validateCodeUnique(reqVO.getId(), reqVO.getCode());
-        // 鏍¢獙 task 瀛樺湪
-        MesProTaskDO task = taskService.validateTaskExists(reqVO.getTaskId());
-        // 鏍¢獙 task 鍏宠仈鐨勫伐鍗曞凡纭
-        Long workOrderId = reqVO.getWorkOrderId() != null ? reqVO.getWorkOrderId() : task.getWorkOrderId();
+        // 鏍¢獙 task 瀛樺湪锛堢敓浜т换鍔¢潪蹇呭~锛屾湭閫夋椂璺宠繃锛�
+        MesProTaskDO task = reqVO.getTaskId() != null ? taskService.validateTaskExists(reqVO.getTaskId()) : null;
+        // 鏍¢獙鍏宠仈鐨勫伐鍗曞凡纭
+        Long workOrderId = reqVO.getWorkOrderId() != null ? reqVO.getWorkOrderId() : (task != null ? task.getWorkOrderId() : null);
         if (workOrderId != null) {
             workOrderService.validateWorkOrderConfirmed(workOrderId);
         }

--
Gitblit v1.9.3