Commit ddbfd10161e0f87cd1a801542c627fcaf07ed4dd

Authored by YunaiV
2 parents f68f1f93 330fa3a2

Merge branch 'master-jdk17' of https://github.com/YunaiV/ruoyi-vue-pro into master-jdk17

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 }
... ...
yudao-module-mall/yudao-module-product/src/main/java/cn/iocoder/yudao/module/product/enums/ErrorCodeConstants.java
... ... @@ -45,6 +45,7 @@ public interface ErrorCodeConstants {
45 45 ErrorCode SPU_ATTR_NUMBERS_MUST_BE_EQUALS = new ErrorCode(1_008_006_002, "一个 SPU 下的每个 SKU,其属性项必须一致");
46 46 ErrorCode SPU_SKU_NOT_DUPLICATE = new ErrorCode(1_008_006_003, "一个 SPU 下的每个 SKU,必须不重复");
47 47 ErrorCode SKU_STOCK_NOT_ENOUGH = new ErrorCode(1_008_006_004, "商品 SKU 库存不足");
  48 + ErrorCode SKU_PROPERTIES_EMPTY = new ErrorCode(1_008_006_005, "多规格商品必须从规格列表选择属性组合,SKU 属性不能为空");
48 49  
49 50 // ========== 商品 评价 1-008-007-000 ==========
50 51 ErrorCode COMMENT_NOT_EXISTS = new ErrorCode(1_008_007_000, "商品评价不存在");
... ...
yudao-module-mall/yudao-module-product/src/main/java/cn/iocoder/yudao/module/product/service/sku/ProductSkuServiceImpl.java
... ... @@ -106,9 +106,13 @@ public class ProductSkuServiceImpl implements ProductSkuService {
106 106 Set<Long> propertyIds = skus.stream().filter(p -> p.getProperties() != null)
107 107 // 遍历多个 Property 属性
108 108 .flatMap(p -> p.getProperties().stream())
109   - // 将每个 Property 转换成对应的 propertyId,最后形成集合
110   - .map(ProductSkuSaveReqVO.Property::getPropertyId)
111   - .collect(Collectors.toSet());
  109 + // 将每个 Property 转换成对应的 propertyId,最后形成集合
  110 + .map(ProductSkuSaveReqVO.Property::getPropertyId)
  111 + .collect(Collectors.toSet());
  112 + // 多规格下,属性组合不能为空:空集合会让后续按 id 批量查询生成非法 SQL(IN())而 500,这里明确拒绝
  113 + if (CollUtil.isEmpty(propertyIds)) {
  114 + throw exception(SKU_PROPERTIES_EMPTY);
  115 + }
112 116 List<ProductPropertyDO> propertyList = productPropertyService.getPropertyList(propertyIds);
113 117 if (propertyList.size() != propertyIds.size()) {
114 118 throw exception(PROPERTY_NOT_EXISTS);
... ...