From 24984ff670fcce16322aa8c2460f93307ddc3f9a Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期二, 13 十月 2026 15:15:06 +0800
Subject: [PATCH] test(invoice): 优化开票编辑状态验证逻辑并添加测试
---
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/quotation/CrmSaleQuotationServiceImpl.java | 37 +++++++++++++++++++++++++++++--------
1 files changed, 29 insertions(+), 8 deletions(-)
diff --git a/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/quotation/CrmSaleQuotationServiceImpl.java b/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/quotation/CrmSaleQuotationServiceImpl.java
index 1b0237a..b4a4ab5 100644
--- a/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/quotation/CrmSaleQuotationServiceImpl.java
+++ b/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/quotation/CrmSaleQuotationServiceImpl.java
@@ -1,6 +1,7 @@
package cn.iocoder.yudao.module.crm.service.quotation;
import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.number.MoneyUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
@@ -81,11 +82,11 @@
public Long createSaleQuotation(CrmSaleQuotationSaveReqVO createReqVO, Long userId) {
// 1.1 鏍¢獙鐗╂枡椤圭殑鏈夋晥鎬�
List<CrmSaleQuotationProductDO> quotationProducts = validateQuotationItems(createReqVO.getItems());
- // 1.2 鐢熸垚鎶ヤ环鍗曞彿锛屽苟鏍¢獙鍞竴鎬�
- String no = noRedisDAO.generate(CrmNoRedisDAO.SALE_QUOTATION_NO_PREFIX);
- if (saleQuotationMapper.selectByNo(no) != null) {
- throw exception(SALE_QUOTATION_NO_EXISTS);
- }
+ // 1.2 纭畾鎶ヤ环鍗曞彿锛堝墠绔~鍐欏垯鐢ㄨ嚜瀹氫箟鍗曞彿锛岀暀绌哄垯鑷姩鐢熸垚锛夛紝骞舵牎楠屽敮涓�鎬�
+ String customNo = StrUtil.trim(createReqVO.getNo());
+ String no = StrUtil.isBlank(customNo)
+ ? noRedisDAO.generate(CrmNoRedisDAO.SALE_QUOTATION_NO_PREFIX) : customNo;
+ validateQuotationNoUnique(no, null);
// 1.3 鏍¢獙鍏宠仈瀛楁
validateRelationDataExists(createReqVO);
@@ -123,8 +124,15 @@
// 1.4 鏍¢獙鍏宠仈瀛楁
validateRelationDataExists(updateReqVO);
- // 2.1 鏇存柊鎶ヤ环鍗�
+ // 2.1 鏇存柊鎶ヤ环鍗曪紙鎶ヤ环鍗曞彿鐣欑┖琛ㄧず淇濇寔鍘熷�硷紝濉啓鍒欐牎楠屽敮涓�鎬у悗鏇挎崲锛�
CrmSaleQuotationDO updateObj = BeanUtils.toBean(updateReqVO, CrmSaleQuotationDO.class);
+ String no = StrUtil.trim(updateReqVO.getNo());
+ if (StrUtil.isBlank(no)) {
+ updateObj.setNo(saleQuotation.getNo());
+ } else {
+ validateQuotationNoUnique(no, saleQuotation.getId());
+ updateObj.setNo(no);
+ }
calculateTotalPrice(updateObj, quotationProducts);
saleQuotationMapper.updateById(updateObj);
// 2.2 鏇存柊鎶ヤ环鏄庣粏
@@ -165,6 +173,19 @@
throw exception(SALE_QUOTATION_NOT_EXISTS);
}
return saleQuotation;
+ }
+
+ /**
+ * 鏍¢獙鎶ヤ环鍗曞彿鍞竴锛堝惈宸查�昏緫鍒犻櫎鐨勬姤浠峰崟锛屽洜 uk_no 鍞竴绱㈠紩瑕嗙洊宸插垹闄よ锛�
+ *
+ * @param no 鎶ヤ环鍗曞彿
+ * @param selfId 鑷韩缂栧彿锛堜慨鏀规椂鎺掗櫎鑷繁锛屾柊澧炰紶 null锛�
+ */
+ private void validateQuotationNoUnique(String no, Long selfId) {
+ CrmSaleQuotationDO exists = saleQuotationMapper.selectAnyByNo(no);
+ if (exists != null && !exists.getId().equals(selfId)) {
+ throw exception(SALE_QUOTATION_NO_EXISTS, no);
+ }
}
private List<CrmSaleQuotationProductDO> validateQuotationItems(List<CrmSaleQuotationSaveReqVO.Item> list) {
@@ -300,7 +321,7 @@
product.setItemId(qp.getItemId());
product.setItemPrice(qp.getItemPrice());
product.setContractPrice(qp.getQuotationPrice());
- product.setCount(qp.getCount().intValue());
+ product.setCount(qp.getCount());
return product;
});
contractVO.setProducts(contractProducts);
@@ -329,4 +350,4 @@
saleQuotationMapper.clearContractReference(quotationId);
}
-}
\ No newline at end of file
+}
--
Gitblit v1.9.3