Commit bc349d2e8bdb8b38c23fc1e950eb0461bf08c2d9

Authored by dadiyang
1 parent 8e43004c

fix(crm):合同金额负值校验+无明细合同金额按传入值落库(A24)

1) CrmContractSaveReqVO.totalPrice 加 @DecimalMin(0):负金额原可直接建单
   (2026-09-21 23:50:39 实抓:totalPrice=-100 code=0 放行,载体 CRM-24)。
2) calculateTotalPrice 无产品明细时不再重算覆盖:原逻辑恒以
   明细合计-折扣 覆盖 totalPrice,无明细合同(服务类/总额类交易)手工
   填写的合同金额被覆写为 0(同实证:10000000.01 落库回显 0)。
   有明细路径行为不变(明细合计-折扣)。
   discountPercent 本身 @NotNull,无明细早返回不引入新空值路径。
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/contract/CrmContractSaveReqVO.java
... ... @@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.crm.framework.operatelog.core.CrmCustomerParseFun
6 6 import cn.iocoder.yudao.module.crm.framework.operatelog.core.SysAdminUserParseFunction;
7 7 import com.mzt.logapi.starter.annotation.DiffLogField;
8 8 import io.swagger.v3.oas.annotations.media.Schema;
  9 +import jakarta.validation.constraints.DecimalMin;
9 10 import jakarta.validation.constraints.NotNull;
10 11 import lombok.AllArgsConstructor;
11 12 import lombok.Data;
... ... @@ -67,6 +68,7 @@ public class CrmContractSaveReqVO {
67 68  
68 69 @Schema(description = "合同金额", example = "5617")
69 70 @DiffLogField(name = "合同金额")
  71 + @DecimalMin(value = "0", message = "合同金额不能小于 0")
70 72 private BigDecimal totalPrice;
71 73  
72 74 @Schema(description = "客户签约人编号", example = "18546")
... ...
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractServiceImpl.java
... ... @@ -217,6 +217,10 @@ public class CrmContractServiceImpl implements CrmContractService {
217 217  
218 218 private void calculateTotalPrice(CrmContractDO contract, List<CrmContractProductDO> contractProducts) {
219 219 contract.setTotalProductPrice(getSumValue(contractProducts, CrmContractProductDO::getTotalPrice, BigDecimal::add, BigDecimal.ZERO));
  220 + // 无产品明细的合同,合同金额以传入值为准(支持手工填写合同金额),不做重算覆盖
  221 + if (CollUtil.isEmpty(contractProducts)) {
  222 + return;
  223 + }
220 224 BigDecimal discountPrice = MoneyUtils.priceMultiplyPercent(contract.getTotalProductPrice(), contract.getDiscountPercent());
221 225 contract.setTotalPrice(contract.getTotalProductPrice().subtract(discountPrice));
222 226 }
... ...