From 086b2186789ea04362db4bce71c6112686c43caa Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期一, 21 九月 2026 15:33:26 +0800
Subject: [PATCH] feat(crm): 支持合同编号自定义配置

---
 docs/project-business/data/objects.json                                                                                    |    2 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/template/MesQcTemplateItemService.java               |   14 +++---
 yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/enums/ErrorCodeConstants.java                                   |    1 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/template/MesQcTemplateItemDO.java             |    3 -
 docs/project-business/index.html                                                                                           |    2 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/template/MesQcTemplateItemServiceImpl.java           |   45 ++++++++++++++--------
 yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/contract/CrmContractSaveReqVO.java |    6 +++
 yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractServiceImpl.java                    |   31 ++++++++++++---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/ipqc/MesQcIpqcServiceImpl.java                       |    3 +
 9 files changed, 72 insertions(+), 35 deletions(-)

diff --git a/docs/project-business/data/objects.json b/docs/project-business/data/objects.json
index adaa873..29ac7ce 100644
--- a/docs/project-business/data/objects.json
+++ b/docs/project-business/data/objects.json
@@ -7,7 +7,7 @@
     {"name": "鑱旂郴浜�", "module": "閿�鍞鐞�", "table": "crm_contact", "doc": "瀹㈡埛涓嬭仈绯讳汉锛屼笌鍟嗘満澶氬澶�", "upstream": ["瀹㈡埛"], "downstream": ["鍟嗘満"], "keywords": "鑱旂郴浜� contact"},
     {"name": "鍟嗘満", "module": "閿�鍞鐞�", "table": "crm_business", "doc": "閿�鍞満浼氾紝DB 閰嶇疆寮忛樁娈垫帹杩涳紝缁撴潫鎬�: 璧�/杈�/鏃犳晥", "upstream": ["瀹㈡埛"], "downstream": ["鎶ヤ环鍗�", "鍚堝悓"], "keywords": "鍟嗘満 business 璧㈠崟 杈撳崟 闃舵"},
     {"name": "鎶ヤ环鍗�", "module": "閿�鍞鐞�", "table": "crm_sale_quotation", "doc": "QT缂栧彿锛岄�� MDM 鐗╂枡鎶ヤ环锛孉I OCR 褰曞叆锛岃崏绋库啋宸茶浆鍚堝悓", "upstream": ["鍟嗘満"], "downstream": ["鍚堝悓"], "keywords": "鎶ヤ环 quotation QT"},
-    {"name": "鍚堝悓", "module": "閿�鍞鐞�", "table": "crm_contract", "doc": "HT缂栧彿锛孊PM 瀹℃壒(0鑽夌/10瀹℃壒涓�/20閫氳繃/30椹冲洖/40鍙栨秷/50浣滃簾)锛岄�氳繃鍚庡彲鐢熸垚閿�鍞鍗�", "upstream": ["鎶ヤ环鍗�"], "downstream": ["閿�鍞鍗�", "鍥炴璁″垝", "寮�绁�"], "keywords": "鍚堝悓 contract 瀹℃壒"},
+    {"name": "鍚堝悓", "module": "閿�鍞鐞�", "table": "crm_contract", "doc": "HT缂栧彿(鏂板/缂栬緫鍧囧彲鑷畾涔夛紝鐣欑┖鍒欐柊澧炶嚜鍔ㄧ敓鎴愩�佺紪杈戜繚鎸佸師缂栧彿)锛孊PM 瀹℃壒(0鑽夌/10瀹℃壒涓�/20閫氳繃/30椹冲洖/40鍙栨秷/50浣滃簾)锛岄�氳繃鍚庡彲鐢熸垚閿�鍞鍗�", "upstream": ["鎶ヤ环鍗�"], "downstream": ["閿�鍞鍗�", "鍥炴璁″垝", "寮�绁�"], "keywords": "鍚堝悓 contract 瀹℃壒"},
     {"name": "鍙戠エ", "module": "閿�鍞鐞�", "table": "crm_invoice", "doc": "KP缂栧彿锛孊PM 瀹℃壒锛岀疮璁″紑绁ㄢ墹鍚堝悓棰濓紝闄勪欢蹇呬紶", "upstream": ["鍚堝悓"], "downstream": ["鍥炴"], "keywords": "寮�绁� 鍙戠エ invoice"},
     {"name": "鍥炴", "module": "閿�鍞鐞�", "table": "crm_receivable", "doc": "HK缂栧彿锛屽垱寤哄嵆瀹℃壒涓�(鎵嬪姩瀹℃牳)锛屽己鍒跺厛寮�绁紝閲戦鍙屾牎楠�", "upstream": ["鍚堝悓", "鍙戠エ"], "downstream": ["鏀舵鍗�(鍏宠仈)"], "keywords": "鍥炴 鏀舵璁″垝 receivable"},
     {"name": "閿�鍞洰鏍�", "module": "閿�鍞鐞�", "table": "crm_sales_target", "doc": "骞�/瀛�/鏈埫椾釜浜�/閮ㄩ棬/浜у搧缁村害鐨勫悎鍚屽洖娆剧瓑鐩爣", "upstream": [], "downstream": ["涓氱哗缁熻"], "keywords": "鐩爣 target 涓氱哗"},
diff --git a/docs/project-business/index.html b/docs/project-business/index.html
index 2cf6913..47214d7 100644
--- a/docs/project-business/index.html
+++ b/docs/project-business/index.html
@@ -442,7 +442,7 @@
     {"name": "鑱旂郴浜�", "module": "閿�鍞鐞�", "table": "crm_contact", "doc": "瀹㈡埛涓嬭仈绯讳汉锛屼笌鍟嗘満澶氬澶�", "upstream": ["瀹㈡埛"], "downstream": ["鍟嗘満"], "keywords": "鑱旂郴浜� contact"},
     {"name": "鍟嗘満", "module": "閿�鍞鐞�", "table": "crm_business", "doc": "閿�鍞満浼氾紝DB 閰嶇疆寮忛樁娈垫帹杩涳紝缁撴潫鎬�: 璧�/杈�/鏃犳晥", "upstream": ["瀹㈡埛"], "downstream": ["鎶ヤ环鍗�", "鍚堝悓"], "keywords": "鍟嗘満 business 璧㈠崟 杈撳崟 闃舵"},
     {"name": "鎶ヤ环鍗�", "module": "閿�鍞鐞�", "table": "crm_sale_quotation", "doc": "QT缂栧彿锛岄�� MDM 鐗╂枡鎶ヤ环锛孉I OCR 褰曞叆锛岃崏绋库啋宸茶浆鍚堝悓", "upstream": ["鍟嗘満"], "downstream": ["鍚堝悓"], "keywords": "鎶ヤ环 quotation QT"},
-    {"name": "鍚堝悓", "module": "閿�鍞鐞�", "table": "crm_contract", "doc": "HT缂栧彿锛孊PM 瀹℃壒(0鑽夌/10瀹℃壒涓�/20閫氳繃/30椹冲洖/40鍙栨秷/50浣滃簾)锛岄�氳繃鍚庡彲鐢熸垚閿�鍞鍗�", "upstream": ["鎶ヤ环鍗�"], "downstream": ["閿�鍞鍗�", "鍥炴璁″垝", "寮�绁�"], "keywords": "鍚堝悓 contract 瀹℃壒"},
+    {"name": "鍚堝悓", "module": "閿�鍞鐞�", "table": "crm_contract", "doc": "HT缂栧彿(鏂板/缂栬緫鍧囧彲鑷畾涔夛紝鐣欑┖鍒欐柊澧炶嚜鍔ㄧ敓鎴愩�佺紪杈戜繚鎸佸師缂栧彿)锛孊PM 瀹℃壒(0鑽夌/10瀹℃壒涓�/20閫氳繃/30椹冲洖/40鍙栨秷/50浣滃簾)锛岄�氳繃鍚庡彲鐢熸垚閿�鍞鍗�", "upstream": ["鎶ヤ环鍗�"], "downstream": ["閿�鍞鍗�", "鍥炴璁″垝", "寮�绁�"], "keywords": "鍚堝悓 contract 瀹℃壒"},
     {"name": "鍙戠エ", "module": "閿�鍞鐞�", "table": "crm_invoice", "doc": "KP缂栧彿锛孊PM 瀹℃壒锛岀疮璁″紑绁ㄢ墹鍚堝悓棰濓紝闄勪欢蹇呬紶", "upstream": ["鍚堝悓"], "downstream": ["鍥炴"], "keywords": "寮�绁� 鍙戠エ invoice"},
     {"name": "鍥炴", "module": "閿�鍞鐞�", "table": "crm_receivable", "doc": "HK缂栧彿锛屽垱寤哄嵆瀹℃壒涓�(鎵嬪姩瀹℃牳)锛屽己鍒跺厛寮�绁紝閲戦鍙屾牎楠�", "upstream": ["鍚堝悓", "鍙戠エ"], "downstream": ["鏀舵鍗�(鍏宠仈)"], "keywords": "鍥炴 鏀舵璁″垝 receivable"},
     {"name": "閿�鍞洰鏍�", "module": "閿�鍞鐞�", "table": "crm_sales_target", "doc": "骞�/瀛�/鏈埫椾釜浜�/閮ㄩ棬/浜у搧缁村害鐨勫悎鍚屽洖娆剧瓑鐩爣", "upstream": [], "downstream": ["涓氱哗缁熻"], "keywords": "鐩爣 target 涓氱哗"},
diff --git a/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/contract/CrmContractSaveReqVO.java b/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/contract/CrmContractSaveReqVO.java
index 5e7b2c0..169b1e1 100644
--- a/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/contract/CrmContractSaveReqVO.java
+++ b/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/contract/CrmContractSaveReqVO.java
@@ -7,6 +7,7 @@
 import com.mzt.logapi.starter.annotation.DiffLogField;
 import io.swagger.v3.oas.annotations.media.Schema;
 import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
@@ -30,6 +31,11 @@
     @NotNull(message = "鍚堝悓鍚嶇О涓嶈兘涓虹┖")
     private String name;
 
+    @Schema(description = "鍚堝悓缂栧彿锛岀暀绌哄垯鑷姩鐢熸垚锛涙柊澧炲拰鏇存柊鍧囧彲鑷畾涔夛紝鏇存柊鏃剁暀绌哄垯淇濇寔鍘熺紪鍙�", example = "HT20260921001")
+    @DiffLogField(name = "鍚堝悓缂栧彿")
+    @Size(max = 100, message = "鍚堝悓缂栧彿闀垮害涓嶈兘瓒呰繃 100 涓瓧绗�")
+    private String no;
+
     @Schema(description = "瀹㈡埛缂栧彿", requiredMode = Schema.RequiredMode.REQUIRED, example = "18336")
     @DiffLogField(name = "瀹㈡埛", function = CrmCustomerParseFunction.NAME)
     @NotNull(message = "瀹㈡埛缂栧彿涓嶈兘涓虹┖")
diff --git a/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/enums/ErrorCodeConstants.java b/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/enums/ErrorCodeConstants.java
index ffcdf9c..c133f54 100644
--- a/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/enums/ErrorCodeConstants.java
+++ b/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/enums/ErrorCodeConstants.java
@@ -20,6 +20,7 @@
     ErrorCode CONTRACT_GENERATE_ORDER_FAIL_EXISTS_ORDER = new ErrorCode(1_020_000_007, "鐢熸垚閿�鍞鍗曞け璐ワ紝鍘熷洜锛氬凡鍏宠仈閿�鍞鍗曘�恵}銆�");
     ErrorCode CONTRACT_GENERATE_ORDER_FAIL_NO_PRODUCT = new ErrorCode(1_020_000_008, "鐢熸垚閿�鍞鍗曞け璐ワ紝鍘熷洜锛氬悎鍚屾病鏈変骇鍝佷俊鎭�");
     ErrorCode CONTRACT_BPM_PROCESS_DEFINITION_NOT_EXISTS = new ErrorCode(1_020_000_009, "鍚堝悓瀹℃壒娴佺▼涓嶅瓨鍦ㄦ垨鏈縺娲伙紝璇锋鏌� BPM 閰嶇疆");
+    ErrorCode CONTRACT_NO_DUPLICATE = new ErrorCode(1_020_000_010, "鍚堝悓缂栧彿銆恵}銆戝凡瀛樺湪锛岃鏇存崲鍚庨噸璇�");
 
     // ========== 绾跨储绠$悊 1-020-001-000 ==========
     ErrorCode CLUE_NOT_EXISTS = new ErrorCode(1_020_001_000, "绾跨储涓嶅瓨鍦�");
diff --git a/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractServiceImpl.java b/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractServiceImpl.java
index 448dae2..91138a8 100644
--- a/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractServiceImpl.java
+++ b/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractServiceImpl.java
@@ -150,10 +150,15 @@
         List<CrmContractProductDO> contractProducts = validateContractProducts(createReqVO.getProducts());
         // 1.2 鏍¢獙鍏宠仈瀛楁
         validateRelationDataExists(createReqVO);
-        // 1.3 鐢熸垚搴忓彿
-        String no = noRedisDAO.generate(CrmNoRedisDAO.CONTRACT_NO_PREFIX);
-        if (contractMapper.selectByNo(no) != null) {
-            throw exception(CONTRACT_NO_EXISTS);
+        // 1.3 鐢熸垚鎴栨牎楠屽悎鍚岀紪鍙凤細鏀寔鑷畾涔夌紪鍙凤紝鏈~鍐欐椂鑷姩鐢熸垚
+        String no = StrUtil.trimToNull(createReqVO.getNo());
+        if (no == null) {
+            no = noRedisDAO.generate(CrmNoRedisDAO.CONTRACT_NO_PREFIX);
+            if (contractMapper.selectByNo(no) != null) {
+                throw exception(CONTRACT_NO_EXISTS);
+            }
+        } else if (contractMapper.selectByNo(no) != null) {
+            throw exception(CONTRACT_NO_DUPLICATE, no);
         }
 
         // 2.1 鎻掑叆鍚堝悓
@@ -188,14 +193,26 @@
         updateReqVO.setOwnerUserId(null); // 涓嶅厑璁告洿鏂扮殑瀛楁
         // 1.1 鏍¢獙瀛樺湪
         CrmContractDO oldContract = validateContractExists(updateReqVO.getId());
-        // 1.2 鍙湁鑽夌銆佸鎵逛腑锛屽彲浠ョ紪杈戯紱
+        // 1.2 鍚堝悓缂栧彿锛氱暀绌哄垯淇濇寔鍘熺紪鍙凤紝濉啓鍒欐牎楠屽敮涓�鎬э紙鎺掗櫎鑷韩锛�
+        //     鐣欑┖鏃跺洖濉師缂栧彿鑰岄潪缃┖锛岄伩鍏嶆搷浣滄棩蹇� diff 鍑虹幇鈥滅紪鍙疯娓呯┖鈥�
+        String no = StrUtil.trimToNull(updateReqVO.getNo());
+        if (no == null) {
+            no = oldContract.getNo();
+        } else {
+            CrmContractDO noContract = contractMapper.selectByNo(no);
+            if (noContract != null && !ObjUtil.equal(noContract.getId(), updateReqVO.getId())) {
+                throw exception(CONTRACT_NO_DUPLICATE, no);
+            }
+        }
+        updateReqVO.setNo(no);
+        // 1.3 鍙湁鑽夌銆佸鎵逛腑锛屽彲浠ョ紪杈戯紱
         if (!ObjectUtils.equalsAny(oldContract.getAuditStatus(), CrmAuditStatusEnum.DRAFT.getStatus(),
                 CrmAuditStatusEnum.PROCESS.getStatus())) {
             throw exception(CONTRACT_UPDATE_FAIL_NOT_DRAFT);
         }
-        // 1.3 鏍¢獙浜у搧椤圭殑鏈夋晥鎬�
+        // 1.4 鏍¢獙浜у搧椤圭殑鏈夋晥鎬�
         List<CrmContractProductDO> contractProducts = validateContractProducts(updateReqVO.getProducts());
-        // 1.4 鏍¢獙鍏宠仈瀛楁
+        // 1.5 鏍¢獙鍏宠仈瀛楁
         validateRelationDataExists(updateReqVO);
 
         // 2.1 鏇存柊鍚堝悓
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/template/MesQcTemplateItemDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/template/MesQcTemplateItemDO.java
index ef0b02b..163f3ed 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/template/MesQcTemplateItemDO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/template/MesQcTemplateItemDO.java
@@ -1,7 +1,6 @@
 package cn.iocoder.yudao.module.mes.dal.dataobject.qc.template;
 
 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
 import com.baomidou.mybatisplus.annotation.KeySequence;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
@@ -38,7 +37,7 @@
     /**
      * 浜у搧鐗╂枡缂栧彿
      *
-     * 鍏宠仈 {@link MesMdItemDO#getId()}
+     * 鍏宠仈 MDM 鐗╂枡缂栧彿锛坢dm_item.id锛夛紝闈� MES 鐗╂枡
      */
     private Long itemId;
     /**
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/ipqc/MesQcIpqcServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/ipqc/MesQcIpqcServiceImpl.java
index 47e9ed3..fcea450 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/ipqc/MesQcIpqcServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/ipqc/MesQcIpqcServiceImpl.java
@@ -131,8 +131,9 @@
         // 1.3 纭畾妫�楠岀墿鏂欙細鏈変换鍔℃椂鍙栦换鍔$殑鐗╂枡锛屾棤浠诲姟鏃跺彇宸ュ崟鐨勪骇鍝�
         Long itemId = (ctx.task() != null) ? ctx.task().getItemId() : workOrder.getProductId();
         // 1.4 鏍规嵁鐗╂枡 + IPQC 绫诲瀷鏌ユ壘鍙敤璐ㄦ鏂规锛堟敮鎸佸墠绔樉寮忔寚瀹氾級
+        // 宸ュ崟浜у搧/浠诲姟鐗╂枡鏄� MES 鐗╂枡锛岀敱妯℃澘鏈嶅姟鍐呴儴杞崲涓� MDM 鐗╂枡鍚庡尮閰嶏紝鏁呬紶宸ュ崟/浠诲姟 ID
         List<MesQcTemplateItemDO> templateItems = templateItemService.getTemplateItemList(
-                itemId, MesQcTypeEnum.IPQC.getType(), null, null);
+                null, MesQcTypeEnum.IPQC.getType(), createReqVO.getWorkOrderId(), createReqVO.getTaskId());
         if (CollUtil.isEmpty(templateItems)) {
             throw exception(QC_NO_TEMPLATE);
         }
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/template/MesQcTemplateItemService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/template/MesQcTemplateItemService.java
index 4a6ab79..1dba9d4 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/template/MesQcTemplateItemService.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/template/MesQcTemplateItemService.java
@@ -64,21 +64,21 @@
     /**
      * 鏍规嵁浜у搧鐗╂枡 ID 鍜� QC 绫诲瀷鏌ユ壘妫�楠屾ā鏉跨殑浜у搧鍏宠仈锛堝繀椤诲瓨鍦紝鍚﹀垯鎶涘紓甯革級
      *
-     * @param itemId 浜у搧鐗╂枡 ID
-     * @param qcType 妫�娴嬬绫伙紙鏋氫妇 {@link MesQcTypeEnum}锛�
+     * @param mdmItemId MDM 浜у搧鐗╂枡 ID锛坢dm_item.id锛�
+     * @param qcType    妫�娴嬬绫伙紙鏋氫妇 {@link MesQcTypeEnum}锛�
      * @return 鍖归厤鐨勪骇鍝佸叧鑱�
      */
-    MesQcTemplateItemDO getRequiredTemplateByItemIdAndType(Long itemId, Integer qcType);
+    MesQcTemplateItemDO getRequiredTemplateByItemIdAndType(Long mdmItemId, Integer qcType);
 
     /**
      * 鏍规嵁浜у搧鐗╂枡锛堟垨宸ュ崟/浠诲姟锛夊拰 QC 绫诲瀷锛岃幏鍙栨墍鏈夊彲鐢ㄧ殑璐ㄦ鏂规浜у搧鍏宠仈鍒楄〃
      *
-     * @param itemId      浜у搧鐗╂枡 ID锛坢es_md_item.id锛夛紱涓� workOrderId/taskId 鑷冲皯鍏朵竴
+     * @param mdmItemId   MDM 浜у搧鐗╂枡 ID锛坢dm_item.id锛夛紱涓� workOrderId/taskId 鑷冲皯鍏朵竴
      * @param qcType      妫�娴嬬绫伙紙鏋氫妇 {@link MesQcTypeEnum}锛�
-     * @param workOrderId 鐢熶骇宸ュ崟 ID锛堝彲閫夛紝IPQC 鍦烘櫙鐢ㄤ簬瑙f瀽浜у搧鐗╂枡锛�
-     * @param taskId      鐢熶骇浠诲姟 ID锛堝彲閫夛紝浼樺厛鐢ㄤ簬瑙f瀽浜у搧鐗╂枡锛�
+     * @param workOrderId 鐢熶骇宸ュ崟 ID锛堝彲閫夛紝IPQC 鍦烘櫙鐢ㄤ簬瑙f瀽浜у搧鐗╂枡锛涘伐鍗曚骇鍝佷负 MES 鐗╂枡锛屽唴閮ㄨ浆鎹负 MDM 鐗╂枡锛�
+     * @param taskId      鐢熶骇浠诲姟 ID锛堝彲閫夛紝浼樺厛鐢ㄤ簬瑙f瀽浜у搧鐗╂枡锛涗换鍔$墿鏂欎负 MES 鐗╂枡锛屽唴閮ㄨ浆鎹负 MDM 鐗╂枡锛�
      * @return 鍖归厤鐨勪骇鍝佸叧鑱斿垪琛紙淇濇寔鍘熼『搴忥級锛屾棤鍖归厤杩斿洖绌哄垪琛�
      */
-    List<MesQcTemplateItemDO> getTemplateItemList(Long itemId, Integer qcType, Long workOrderId, Long taskId);
+    List<MesQcTemplateItemDO> getTemplateItemList(Long mdmItemId, Integer qcType, Long workOrderId, Long taskId);
 
 }
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/template/MesQcTemplateItemServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/template/MesQcTemplateItemServiceImpl.java
index 712c693..8ff8e40 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/template/MesQcTemplateItemServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/template/MesQcTemplateItemServiceImpl.java
@@ -126,8 +126,8 @@
     }
 
     @Override
-    public MesQcTemplateItemDO getRequiredTemplateByItemIdAndType(Long itemId, Integer qcType) {
-        List<MesQcTemplateItemDO> templateItems = getTemplateItemList(itemId, qcType, null, null);
+    public MesQcTemplateItemDO getRequiredTemplateByItemIdAndType(Long mdmItemId, Integer qcType) {
+        List<MesQcTemplateItemDO> templateItems = getTemplateItemList(mdmItemId, qcType, null, null);
         if (CollUtil.isEmpty(templateItems)) {
             throw exception(QC_NO_TEMPLATE);
         }
@@ -135,28 +135,27 @@
     }
 
     @Override
-    public List<MesQcTemplateItemDO> getTemplateItemList(Long itemId, Integer qcType, Long workOrderId, Long taskId) {
-        // 1. 瑙f瀽鐪熷疄浜у搧鐗╂枡 ID锛氫换鍔′紭鍏堬紝鍏舵宸ュ崟锛屾渶鍚庣洿鎺ョ敤鍏ュ弬
-        Long resolvedItemId = itemId;
+    public List<MesQcTemplateItemDO> getTemplateItemList(Long mdmItemId, Integer qcType, Long workOrderId, Long taskId) {
+        // 1. 瑙f瀽 MDM 浜у搧鐗╂枡 ID锛氫换鍔′紭鍏堬紝鍏舵宸ュ崟锛涗袱鑰呭瓨鐨勬槸 MES 鐗╂枡 ID锛岄渶杞崲涓� MDM 鐗╂枡 ID銆�
+        //    鏈紶宸ュ崟/浠诲姟鏃讹紝鍏ュ弬鏈韩鍗� MDM 鐗╂枡 ID锛堣川妫�鍗曞墠绔�夋嫨鐨勫氨鏄� MDM 鐗╂枡锛�
+        Long resolvedMdmItemId;
         if (taskId != null) {
-            resolvedItemId = proTaskService.validateTaskExists(taskId).getItemId();
+            resolvedMdmItemId = convertMesItemIdToMdmItemId(proTaskService.validateTaskExists(taskId).getItemId());
         } else if (workOrderId != null) {
-            resolvedItemId = proWorkOrderService.validateWorkOrderExists(workOrderId).getProductId();
+            resolvedMdmItemId = convertMesItemIdToMdmItemId(
+                    proWorkOrderService.validateWorkOrderExists(workOrderId).getProductId());
+        } else {
+            resolvedMdmItemId = mdmItemId;
         }
-        if (resolvedItemId == null) {
+        if (resolvedMdmItemId == null) {
             return Collections.emptyList();
         }
-        // 2. mes_md_item.id 杞� mdm_item.id锛堜骇鍝佸叧鑱旇〃瀛樼殑鏄� mdm 鐗╂枡锛�
-        MesMdItemDO item = mesMdItemService.getItem(resolvedItemId);
-        if (item == null || item.getMdmItemId() == null) {
-            return Collections.emptyList();
-        }
-        // 3. 鏌ュ嚭璇ョ墿鏂欏叧鑱旂殑鎵�鏈変骇鍝佸叧鑱�
-        List<MesQcTemplateItemDO> templateItems = templateItemMapper.selectListByItemId(item.getMdmItemId());
+        // 2. 鏌ュ嚭璇ョ墿鏂欏叧鑱旂殑鎵�鏈変骇鍝佸叧鑱�
+        List<MesQcTemplateItemDO> templateItems = templateItemMapper.selectListByItemId(resolvedMdmItemId);
         if (CollUtil.isEmpty(templateItems)) {
             return Collections.emptyList();
         }
-        // 4. 杩囨护锛氭柟妗堝惎鐢ㄤ笖妫�娴嬬绫诲寘鍚� qcType锛岃繑鍥炲叏閮ㄥ尮閰嶉」
+        // 3. 杩囨护锛氭柟妗堝惎鐢ㄤ笖妫�娴嬬绫诲寘鍚� qcType锛岃繑鍥炲叏閮ㄥ尮閰嶉」
         List<MesQcTemplateDO> templates = templateService.getTemplateList(
                 convertSet(templateItems, MesQcTemplateItemDO::getTemplateId));
         Set<Long> matchedTemplateIds = templates.stream()
@@ -169,4 +168,18 @@
                 .collect(Collectors.toList());
     }
 
+    /**
+     * MES 鐗╂枡 ID 杞� MDM 鐗╂枡 ID
+     *
+     * @param mesItemId MES 鐗╂枡 ID锛坢es_md_item.id锛�
+     * @return MDM 鐗╂枡 ID锛坢dm_item.id锛夛紱MES 鐗╂枡涓嶅瓨鍦ㄦ垨鏈叧鑱� MDM 鐗╂枡鏃惰繑鍥� null
+     */
+    private Long convertMesItemIdToMdmItemId(Long mesItemId) {
+        if (mesItemId == null) {
+            return null;
+        }
+        MesMdItemDO item = mesMdItemService.getItem(mesItemId);
+        return item != null ? item.getMdmItemId() : null;
+    }
+
 }

--
Gitblit v1.9.3