From 298e948226a6773c5432f490f68c671af80dfc16 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期三, 14 十月 2026 09:29:28 +0800
Subject: [PATCH] feat(crm-invoice): 新增开票Excel批量导入功能

---
 yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractServiceImpl.java |   36 +++++++++++++++++++++++++++++-------
 1 files changed, 29 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..ef79bb7 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 鏇存柊鍚堝悓
@@ -644,6 +661,11 @@
     }
 
     @Override
+    public CrmContractDO getContractByNo(String no) {
+        return contractMapper.selectByNo(no);
+    }
+
+    @Override
     public CrmContractDO validateContract(Long id) {
         return validateContractExists(id);
     }

--
Gitblit v1.9.3