Commit ddbfd10161e0f87cd1a801542c627fcaf07ed4dd
Merge branch 'master-jdk17' of https://github.com/YunaiV/ruoyi-vue-pro into master-jdk17
Showing
4 changed files
with
14 additions
and
3 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 | } |
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,6 +45,7 @@ public interface ErrorCodeConstants { | ||
| 45 | ErrorCode SPU_ATTR_NUMBERS_MUST_BE_EQUALS = new ErrorCode(1_008_006_002, "一个 SPU 下的每个 SKU,其属性项必须一致"); | 45 | ErrorCode SPU_ATTR_NUMBERS_MUST_BE_EQUALS = new ErrorCode(1_008_006_002, "一个 SPU 下的每个 SKU,其属性项必须一致"); |
| 46 | ErrorCode SPU_SKU_NOT_DUPLICATE = new ErrorCode(1_008_006_003, "一个 SPU 下的每个 SKU,必须不重复"); | 46 | ErrorCode SPU_SKU_NOT_DUPLICATE = new ErrorCode(1_008_006_003, "一个 SPU 下的每个 SKU,必须不重复"); |
| 47 | ErrorCode SKU_STOCK_NOT_ENOUGH = new ErrorCode(1_008_006_004, "商品 SKU 库存不足"); | 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 | // ========== 商品 评价 1-008-007-000 ========== | 50 | // ========== 商品 评价 1-008-007-000 ========== |
| 50 | ErrorCode COMMENT_NOT_EXISTS = new ErrorCode(1_008_007_000, "商品评价不存在"); | 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,9 +106,13 @@ public class ProductSkuServiceImpl implements ProductSkuService { | ||
| 106 | Set<Long> propertyIds = skus.stream().filter(p -> p.getProperties() != null) | 106 | Set<Long> propertyIds = skus.stream().filter(p -> p.getProperties() != null) |
| 107 | // 遍历多个 Property 属性 | 107 | // 遍历多个 Property 属性 |
| 108 | .flatMap(p -> p.getProperties().stream()) | 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 | List<ProductPropertyDO> propertyList = productPropertyService.getPropertyList(propertyIds); | 116 | List<ProductPropertyDO> propertyList = productPropertyService.getPropertyList(propertyIds); |
| 113 | if (propertyList.size() != propertyIds.size()) { | 117 | if (propertyList.size() != propertyIds.size()) { |
| 114 | throw exception(PROPERTY_NOT_EXISTS); | 118 | throw exception(PROPERTY_NOT_EXISTS); |