From 913dc3d278a3de932e6f543390ccdf839d8c5966 Mon Sep 17 00:00:00 2001 From: Timi Date: Thu, 3 Sep 2026 15:16:16 +0800 Subject: [PATCH] update product unit --- .../gao/entity/GaoCustomerPackageItem.java | 4 +-- .../gao/entity/GaoOrderFulfillmentItem.java | 4 +-- .../gao/entity/GaoPackageConfigItem.java | 4 +-- .../api/modules/gao/entity/GaoProduct.java | 3 -- .../modules/gao/entity/GaoProductUnit.java | 7 ++-- .../modules/gao/entity/GaoSalesOrderItem.java | 4 +-- .../modules/gao/entity/GaoStockRecord.java | 4 +-- .../gao/service/GaoProductUnitService.java | 4 +-- .../GaoCustomerPackageServiceImplement.java | 6 ++-- .../GaoOrderFulfillmentServiceImplement.java | 36 +++++++++---------- .../GaoPackageConfigServiceImplement.java | 6 ++-- .../implement/GaoProductServiceImplement.java | 5 ++- .../GaoProductStockServiceImplement.java | 4 +-- .../GaoProductUnitServiceImplement.java | 24 ++++++++----- .../GaoSalesOrderServiceImplement.java | 10 +++--- .../vo/GaoCustomerPackagePurchaseItem.java | 4 +-- .../modules/gao/vo/GaoStockChangeItem.java | 6 ++-- ...9__move_gao_product_sale_price_to_unit.sql | 28 +++++++++++++++ .../timi-server/gao/GaoProductUnitMapper.xml | 5 +-- 19 files changed, 102 insertions(+), 66 deletions(-) create mode 100644 src/main/resources/db/migration/timiserver/V59__move_gao_product_sale_price_to_unit.sql diff --git a/src/main/java/com/imyeyu/api/modules/gao/entity/GaoCustomerPackageItem.java b/src/main/java/com/imyeyu/api/modules/gao/entity/GaoCustomerPackageItem.java index ea4b5fd..84fc8b6 100644 --- a/src/main/java/com/imyeyu/api/modules/gao/entity/GaoCustomerPackageItem.java +++ b/src/main/java/com/imyeyu/api/modules/gao/entity/GaoCustomerPackageItem.java @@ -30,8 +30,8 @@ public class GaoCustomerPackageItem extends UUIDEntity { /// 产品单位快照 private String unitSnapshot; - /// 折算率快照 - private BigDecimal conversionToBaseSnapshot; + /// 基础单位数量系数快照 + private BigDecimal baseQuantityPerUnitSnapshot; /// 总权益数量 private BigDecimal totalQuantity; diff --git a/src/main/java/com/imyeyu/api/modules/gao/entity/GaoOrderFulfillmentItem.java b/src/main/java/com/imyeyu/api/modules/gao/entity/GaoOrderFulfillmentItem.java index 16f1ae6..4c08de0 100644 --- a/src/main/java/com/imyeyu/api/modules/gao/entity/GaoOrderFulfillmentItem.java +++ b/src/main/java/com/imyeyu/api/modules/gao/entity/GaoOrderFulfillmentItem.java @@ -53,6 +53,6 @@ public class GaoOrderFulfillmentItem extends UUIDEntity { /// 单位快照 private String unitSnapshot; - /// 折算率快照 - private BigDecimal conversionToBaseSnapshot; + /// 基础单位数量系数快照 + private BigDecimal baseQuantityPerUnitSnapshot; } diff --git a/src/main/java/com/imyeyu/api/modules/gao/entity/GaoPackageConfigItem.java b/src/main/java/com/imyeyu/api/modules/gao/entity/GaoPackageConfigItem.java index ff2f76b..a3d7a1b 100644 --- a/src/main/java/com/imyeyu/api/modules/gao/entity/GaoPackageConfigItem.java +++ b/src/main/java/com/imyeyu/api/modules/gao/entity/GaoPackageConfigItem.java @@ -29,8 +29,8 @@ public class GaoPackageConfigItem extends UUIDEntity { /// 单位快照 private String unitSnapshot; - /// 折算率快照 - private BigDecimal conversionToBaseSnapshot; + /// 基础单位数量系数快照 + private BigDecimal baseQuantityPerUnitSnapshot; /// 默认数量 private BigDecimal defaultQuantity; diff --git a/src/main/java/com/imyeyu/api/modules/gao/entity/GaoProduct.java b/src/main/java/com/imyeyu/api/modules/gao/entity/GaoProduct.java index b8fe90a..4584bb0 100644 --- a/src/main/java/com/imyeyu/api/modules/gao/entity/GaoProduct.java +++ b/src/main/java/com/imyeyu/api/modules/gao/entity/GaoProduct.java @@ -77,9 +77,6 @@ public class GaoProduct extends UUIDEntity { /// 状态 private Status status; - /// 建议售价,单位分 - private Long salePrice; - /// 参考成本,单位分 private Long referenceCost; diff --git a/src/main/java/com/imyeyu/api/modules/gao/entity/GaoProductUnit.java b/src/main/java/com/imyeyu/api/modules/gao/entity/GaoProductUnit.java index fc94032..38f3830 100644 --- a/src/main/java/com/imyeyu/api/modules/gao/entity/GaoProductUnit.java +++ b/src/main/java/com/imyeyu/api/modules/gao/entity/GaoProductUnit.java @@ -20,8 +20,11 @@ public class GaoProductUnit extends UUIDEntity { /// 单位名称 private String name; - /// 折算为基础单位的比例 - private BigDecimal conversionToBase; + /// 每个业务单位对应的基础单位数量 + private BigDecimal baseQuantityPerUnit; + + /// 该业务单位建议售价,单位分 + private Long salePrice; /// true 为基础库存单位 private Boolean isBase; diff --git a/src/main/java/com/imyeyu/api/modules/gao/entity/GaoSalesOrderItem.java b/src/main/java/com/imyeyu/api/modules/gao/entity/GaoSalesOrderItem.java index efb2734..b41b8f0 100644 --- a/src/main/java/com/imyeyu/api/modules/gao/entity/GaoSalesOrderItem.java +++ b/src/main/java/com/imyeyu/api/modules/gao/entity/GaoSalesOrderItem.java @@ -29,8 +29,8 @@ public class GaoSalesOrderItem extends UUIDEntity { /// 单位快照 private String unitSnapshot; - /// 折算率快照 - private BigDecimal conversionToBaseSnapshot; + /// 基础单位数量系数快照 + private BigDecimal baseQuantityPerUnitSnapshot; /// 购买数量 private BigDecimal quantity; diff --git a/src/main/java/com/imyeyu/api/modules/gao/entity/GaoStockRecord.java b/src/main/java/com/imyeyu/api/modules/gao/entity/GaoStockRecord.java index 31a74c9..6b5b593 100644 --- a/src/main/java/com/imyeyu/api/modules/gao/entity/GaoStockRecord.java +++ b/src/main/java/com/imyeyu/api/modules/gao/entity/GaoStockRecord.java @@ -79,8 +79,8 @@ public class GaoStockRecord implements IDEntity, Creatable { /// 单位名称快照 private String unitSnapshot; - /// 折算率快照 - private BigDecimal conversionToBaseSnapshot; + /// 基础单位数量系数快照 + private BigDecimal baseQuantityPerUnitSnapshot; /// 业务数量 private BigDecimal quantity; diff --git a/src/main/java/com/imyeyu/api/modules/gao/service/GaoProductUnitService.java b/src/main/java/com/imyeyu/api/modules/gao/service/GaoProductUnitService.java index 5ddc33c..f9ae789 100644 --- a/src/main/java/com/imyeyu/api/modules/gao/service/GaoProductUnitService.java +++ b/src/main/java/com/imyeyu/api/modules/gao/service/GaoProductUnitService.java @@ -19,10 +19,10 @@ public interface GaoProductUnitService { /// @return 规范化后的单位列表 List validateAndNormalize(GaoProduct product, List unitList); - /// 按基础单位换算数量 + /// 按基础单位数量系数换算业务数量 /// /// @param unit 单位 /// @param quantity 业务数量 /// @return 基础单位数量 - BigDecimal convertToBase(GaoProductUnit unit, BigDecimal quantity); + BigDecimal convertQuantityToBase(GaoProductUnit unit, BigDecimal quantity); } diff --git a/src/main/java/com/imyeyu/api/modules/gao/service/implement/GaoCustomerPackageServiceImplement.java b/src/main/java/com/imyeyu/api/modules/gao/service/implement/GaoCustomerPackageServiceImplement.java index 5f92d19..71eb264 100644 --- a/src/main/java/com/imyeyu/api/modules/gao/service/implement/GaoCustomerPackageServiceImplement.java +++ b/src/main/java/com/imyeyu/api/modules/gao/service/implement/GaoCustomerPackageServiceImplement.java @@ -250,7 +250,7 @@ public class GaoCustomerPackageServiceImplement extends AbstractEntityService Boolean.TRUE.equals(unit.getIsBase())).findFirst().orElse(null); TimiException.required(baseUnit, "实物产品缺少基础库存单位"); - BigDecimal baseQuantity = unitService.convertToBase(source.unit(), source.quantity()); + BigDecimal baseQuantity = unitService.convertQuantityToBase(source.unit(), source.quantity()); GaoStockChangeItem item = itemMap.get(source.product().getId()); if (item == null) { item = GaoStockChangeItem.of(source.product(), baseUnit, baseQuantity, baseQuantity); @@ -590,21 +590,21 @@ public class GaoOrderFulfillmentServiceImplement extends AbstractEntityService existingList = recordService.listByRequestNo(storeId, requestNo); if (!existingList.isEmpty()) { GaoStockRecord existing = existingList.getFirst(); @@ -237,7 +237,7 @@ public class GaoProductStockServiceImplement implements GaoProductStockService { record.setProductUnitId(item.getProductUnitId()); record.setProductNameSnapshot(item.getProductNameSnapshot()); record.setUnitSnapshot(item.getUnitSnapshot()); - record.setConversionToBaseSnapshot(item.getConversionToBaseSnapshot()); + record.setBaseQuantityPerUnitSnapshot(item.getBaseQuantityPerUnitSnapshot()); record.setQuantity(item.getQuantity()); record.setBaseQuantity(item.getBaseQuantity()); record.setOperationType(operationType); diff --git a/src/main/java/com/imyeyu/api/modules/gao/service/implement/GaoProductUnitServiceImplement.java b/src/main/java/com/imyeyu/api/modules/gao/service/implement/GaoProductUnitServiceImplement.java index 4af2824..9ec318a 100644 --- a/src/main/java/com/imyeyu/api/modules/gao/service/implement/GaoProductUnitServiceImplement.java +++ b/src/main/java/com/imyeyu/api/modules/gao/service/implement/GaoProductUnitServiceImplement.java @@ -44,16 +44,17 @@ public class GaoProductUnitServiceImplement implements GaoProductUnitService { } unit.setName(requiredText(source.getName(), "产品单位名称不能为空")); TimiException.requiredTrue(nameSet.add(unit.getName()), "同一产品的单位名称不能重复"); - unit.setConversionToBase(TimiJava.defaultIfNull(source.getConversionToBase(), ONE)); - TimiException.requiredTrue(0 < unit.getConversionToBase().signum(), "单位折算率必须大于 0"); - TimiException.requiredTrue(6 >= unit.getConversionToBase().scale(), "单位折算率最多保留六位小数"); + unit.setBaseQuantityPerUnit(TimiJava.defaultIfNull(source.getBaseQuantityPerUnit(), ONE)); + TimiException.requiredTrue(0 < unit.getBaseQuantityPerUnit().signum(), "基础单位数量系数必须大于 0"); + TimiException.requiredTrue(6 >= unit.getBaseQuantityPerUnit().scale(), "基础单位数量系数最多保留六位小数"); + unit.setSalePrice(nonNegative(source.getSalePrice(), "单位建议售价不能为负数")); unit.setIsBase(Boolean.TRUE.equals(source.getIsBase())); unit.setAllowPurchase(TimiJava.defaultIfNull(source.getAllowPurchase(), true)); unit.setAllowSale(TimiJava.defaultIfNull(source.getAllowSale(), true)); unit.setSort(TimiJava.defaultIfNull(source.getSort(), i)); if (unit.getIsBase()) { TimiException.requiredNull(base, "一个产品只能有一个基础单位"); - TimiException.requiredTrue(unit.getConversionToBase().compareTo(ONE) == 0, "基础单位折算率必须为 1"); + TimiException.requiredTrue(unit.getBaseQuantityPerUnit().compareTo(ONE) == 0, "基础单位数量系数必须为 1"); TimiException.requiredTrue(baseUnit.equals(unit.getName()), "基础单位名称必须与产品基础单位一致"); base = unit; } @@ -65,22 +66,22 @@ public class GaoProductUnitServiceImplement implements GaoProductUnitService { } @Override - public BigDecimal convertToBase(GaoProductUnit unit, BigDecimal quantity) { + public BigDecimal convertQuantityToBase(GaoProductUnit unit, BigDecimal quantity) { TimiException.required(unit, "not found product unit"); TimiException.required(quantity, "数量不能为空"); TimiException.requiredTrue(0 < quantity.signum(), "数量必须大于 0"); - BigDecimal result = quantity.multiply(unit.getConversionToBase()); + BigDecimal result = quantity.multiply(unit.getBaseQuantityPerUnit()); try { return result.setScale(3, RoundingMode.UNNECESSARY); } catch (ArithmeticException e) { - throw new TimiException(com.imyeyu.java.bean.timi.TimiCode.ERROR, "业务数量折算后不能精确保存为三位小数", e); + throw new TimiException(com.imyeyu.java.bean.timi.TimiCode.ERROR, "业务数量换算后不能精确保存为三位小数", e); } } private GaoProductUnit createBaseUnit(GaoProduct product) { GaoProductUnit unit = new GaoProductUnit(); unit.setName(product.getBaseUnit()); - unit.setConversionToBase(ONE); + unit.setBaseQuantityPerUnit(ONE); unit.setIsBase(true); unit.setAllowPurchase(Boolean.TRUE.equals(product.getStockEnabled())); unit.setAllowSale(true); @@ -94,4 +95,11 @@ public class GaoProductUnitServiceImplement implements GaoProductUnitService { TimiException.requiredTrue(!result.isEmpty(), message); return result; } + + private Long nonNegative(Long value, String message) { + if (value != null) { + TimiException.requiredTrue(0 <= value, message); + } + return value; + } } diff --git a/src/main/java/com/imyeyu/api/modules/gao/service/implement/GaoSalesOrderServiceImplement.java b/src/main/java/com/imyeyu/api/modules/gao/service/implement/GaoSalesOrderServiceImplement.java index 61af01d..198a006 100644 --- a/src/main/java/com/imyeyu/api/modules/gao/service/implement/GaoSalesOrderServiceImplement.java +++ b/src/main/java/com/imyeyu/api/modules/gao/service/implement/GaoSalesOrderServiceImplement.java @@ -357,13 +357,13 @@ public class GaoSalesOrderServiceImplement extends AbstractEntityService - + + @@ -37,7 +38,7 @@ UPDATE `gao_product_unit` - SET `name` = #{name}, `conversion_to_base` = #{conversionToBase}, `is_base` = #{isBase}, + SET `name` = #{name}, `base_quantity_per_unit` = #{baseQuantityPerUnit}, `sale_price` = #{salePrice}, `is_base` = #{isBase}, `allow_purchase` = #{allowPurchase}, `allow_sale` = #{allowSale}, `sort` = #{sort}, `updated_at` = FLOOR(UNIX_TIMESTAMP(NOW(3)) * 1000) WHERE `id` = #{id} AND `product_id` = #{productId} AND `deleted_at` IS NULL