Commit bc349d2e8bdb8b38c23fc1e950eb0461bf08c2d9
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,无明细早返回不引入新空值路径。
Showing
2 changed files
with
6 additions
and
0 deletions
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 +6,7 @@ import cn.iocoder.yudao.module.crm.framework.operatelog.core.CrmCustomerParseFun | ||
| 6 | import cn.iocoder.yudao.module.crm.framework.operatelog.core.SysAdminUserParseFunction; | 6 | import cn.iocoder.yudao.module.crm.framework.operatelog.core.SysAdminUserParseFunction; |
| 7 | import com.mzt.logapi.starter.annotation.DiffLogField; | 7 | import com.mzt.logapi.starter.annotation.DiffLogField; |
| 8 | import io.swagger.v3.oas.annotations.media.Schema; | 8 | import io.swagger.v3.oas.annotations.media.Schema; |
| 9 | +import jakarta.validation.constraints.DecimalMin; | ||
| 9 | import jakarta.validation.constraints.NotNull; | 10 | import jakarta.validation.constraints.NotNull; |
| 10 | import lombok.AllArgsConstructor; | 11 | import lombok.AllArgsConstructor; |
| 11 | import lombok.Data; | 12 | import lombok.Data; |
| @@ -67,6 +68,7 @@ public class CrmContractSaveReqVO { | @@ -67,6 +68,7 @@ public class CrmContractSaveReqVO { | ||
| 67 | 68 | ||
| 68 | @Schema(description = "合同金额", example = "5617") | 69 | @Schema(description = "合同金额", example = "5617") |
| 69 | @DiffLogField(name = "合同金额") | 70 | @DiffLogField(name = "合同金额") |
| 71 | + @DecimalMin(value = "0", message = "合同金额不能小于 0") | ||
| 70 | private BigDecimal totalPrice; | 72 | private BigDecimal totalPrice; |
| 71 | 73 | ||
| 72 | @Schema(description = "客户签约人编号", example = "18546") | 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,6 +217,10 @@ public class CrmContractServiceImpl implements CrmContractService { | ||
| 217 | 217 | ||
| 218 | private void calculateTotalPrice(CrmContractDO contract, List<CrmContractProductDO> contractProducts) { | 218 | private void calculateTotalPrice(CrmContractDO contract, List<CrmContractProductDO> contractProducts) { |
| 219 | contract.setTotalProductPrice(getSumValue(contractProducts, CrmContractProductDO::getTotalPrice, BigDecimal::add, BigDecimal.ZERO)); | 219 | contract.setTotalProductPrice(getSumValue(contractProducts, CrmContractProductDO::getTotalPrice, BigDecimal::add, BigDecimal.ZERO)); |
| 220 | + // 无产品明细的合同,合同金额以传入值为准(支持手工填写合同金额),不做重算覆盖 | ||
| 221 | + if (CollUtil.isEmpty(contractProducts)) { | ||
| 222 | + return; | ||
| 223 | + } | ||
| 220 | BigDecimal discountPrice = MoneyUtils.priceMultiplyPercent(contract.getTotalProductPrice(), contract.getDiscountPercent()); | 224 | BigDecimal discountPrice = MoneyUtils.priceMultiplyPercent(contract.getTotalProductPrice(), contract.getDiscountPercent()); |
| 221 | contract.setTotalPrice(contract.getTotalProductPrice().subtract(discountPrice)); | 225 | contract.setTotalPrice(contract.getTotalProductPrice().subtract(discountPrice)); |
| 222 | } | 226 | } |