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

---
 yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractServiceImpl.java |   31 ++++++++++++++++++++++++-------
 1 files changed, 24 insertions(+), 7 deletions(-)

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 鏇存柊鍚堝悓

--
Gitblit v1.9.3