Merge pull request #1241 from dadiyang/fix/crm-contract-total-price-validation

[BUG] CRM:合同金额边界缺口——无明细合同的填写金额被重算覆盖为 0;合同金额字段无负值校验
This commit is contained in:
芋道源码
2026-09-26 10:41:11 +08:00
committed by GitHub
2 changed files with 6 additions and 0 deletions
@@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.crm.framework.operatelog.core.CrmCustomerParseFun
import cn.iocoder.yudao.module.crm.framework.operatelog.core.SysAdminUserParseFunction;
import com.mzt.logapi.starter.annotation.DiffLogField;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.DecimalMin;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Data;
@@ -67,6 +68,7 @@ public class CrmContractSaveReqVO {
@Schema(description = "合同金额", example = "5617")
@DiffLogField(name = "合同金额")
@DecimalMin(value = "0", message = "合同金额不能小于 0")
private BigDecimal totalPrice;
@Schema(description = "客户签约人编号", example = "18546")
@@ -217,6 +217,10 @@ public class CrmContractServiceImpl implements CrmContractService {
private void calculateTotalPrice(CrmContractDO contract, List<CrmContractProductDO> contractProducts) {
contract.setTotalProductPrice(getSumValue(contractProducts, CrmContractProductDO::getTotalPrice, BigDecimal::add, BigDecimal.ZERO));
// 无产品明细的合同,合同金额以传入值为准(支持手工填写合同金额),不做重算覆盖
if (CollUtil.isEmpty(contractProducts)) {
return;
}
BigDecimal discountPrice = MoneyUtils.priceMultiplyPercent(contract.getTotalProductPrice(), contract.getDiscountPercent());
contract.setTotalPrice(contract.getTotalProductPrice().subtract(discountPrice));
}