diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/config/vo/TradeConfigBaseVO.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/config/vo/TradeConfigBaseVO.java index 3c58275..0f40fe0 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/config/vo/TradeConfigBaseVO.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/config/vo/TradeConfigBaseVO.java @@ -97,4 +97,11 @@ public class TradeConfigBaseVO { @InEnum(value = BrokerageWithdrawTypeEnum.class, message = "提现方式必须是 {value}") private List brokerageWithdrawTypes; + // ========== 售货机相关 ========== + + @Schema(description = "售货机结算比例(0-100)", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") + @NotNull(message = "售货机结算比例不能为空") + @Range(min = 0, max = 100, message = "售货机结算比例必须在 0 - 100 之间") + private Integer machineSettlePercent; + } diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/vo/TradeOrderBaseVO.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/vo/TradeOrderBaseVO.java index 3d7d253..9f142c8 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/vo/TradeOrderBaseVO.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/vo/TradeOrderBaseVO.java @@ -108,6 +108,14 @@ public class TradeOrderBaseVO { @ExcelProperty("应付金额(总)") private Integer payPrice; + @Schema(description = "售货机结算比例快照(0-100)", example = "10") + @ExcelProperty("售货机结算比例") + private Integer machineSettlePercent; + + @Schema(description = "售货机实得金额(总),单位:分", example = "100") + @ExcelProperty("售货机实得金额(总)") + private Integer machineSettlePrice; + // ========== 收件 + 物流基本信息 ========== @Schema(description = "配送方式", example = "10") diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/vo/TradeOrderItemBaseVO.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/vo/TradeOrderItemBaseVO.java index cff2a14..415acee 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/vo/TradeOrderItemBaseVO.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/vo/TradeOrderItemBaseVO.java @@ -75,6 +75,10 @@ public class TradeOrderItemBaseVO { @ExcelProperty(value ="商品实付金额(总)", converter = MoneyConvert.class) private Integer payPrice; + @Schema(description = "售货机实得金额(总),单位:分", example = "10") + @ExcelProperty(value = "售货机实得金额(总)", converter = MoneyConvert.class) + private Integer machineSettlePrice; + @Schema(description = "子订单分摊金额(总)", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") @ExcelProperty(value ="子订单分摊金额(总)", converter = MoneyConvert.class) private Integer orderPartPrice; diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/config/TradeConfigDO.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/config/TradeConfigDO.java index 5d7116b..8b32254 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/config/TradeConfigDO.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/config/TradeConfigDO.java @@ -115,4 +115,13 @@ public class TradeConfigDO extends BaseDO { @TableField(typeHandler = IntegerListTypeHandler.class) private List brokerageWithdrawTypes; + // ========== 售货机相关 ========== + + /** + * 售货机结算比例(0-100) + *

+ * 实得金额 = 实付金额 * 比例 / 100 + */ + private Integer machineSettlePercent; + } diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/order/TradeOrderDO.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/order/TradeOrderDO.java index 2069cd5..19c80c4 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/order/TradeOrderDO.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/order/TradeOrderDO.java @@ -189,6 +189,17 @@ public class TradeOrderDO extends BaseDO { */ private Integer payPrice; + /** + * 售货机结算比例快照(0-100) + */ + private Integer machineSettlePercent; + /** + * 售货机实得金额(总),单位:分 + *

+ * = {@link #payPrice} * {@link #machineSettlePercent} / 100 + */ + private Integer machineSettlePrice; + // ========== 收件 + 物流基本信息 ========== /** * 配送方式 diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/order/TradeOrderItemDO.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/order/TradeOrderItemDO.java index 2f8c25c..95de72c 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/order/TradeOrderItemDO.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/order/TradeOrderItemDO.java @@ -143,6 +143,13 @@ public class TradeOrderItemDO extends BaseDO { */ private Integer payPrice; + /** + * 售货机实得金额(总),单位:分 + *

+ * = {@link #payPrice} * 订单结算比例 / 100 + */ + private Integer machineSettlePrice; + // ========== 营销基本信息 ========== /** diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java index b789c9a..57636f1 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java @@ -48,6 +48,7 @@ import cn.iocoder.yudao.module.trade.dal.dataobject.delivery.DeliveryExpressDO; import cn.iocoder.yudao.module.trade.dal.dataobject.delivery.DeliveryPickUpStoreDO; import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO; import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO; +import cn.iocoder.yudao.module.trade.dal.dataobject.config.TradeConfigDO; import cn.iocoder.yudao.module.trade.dal.mysql.order.TradeOrderItemMapper; import cn.iocoder.yudao.module.trade.dal.mysql.order.TradeOrderMapper; import cn.iocoder.yudao.module.trade.dal.redis.no.TradeNoRedisDAO; @@ -57,6 +58,7 @@ import cn.iocoder.yudao.module.trade.framework.order.config.TradeOrderProperties import cn.iocoder.yudao.module.trade.framework.order.core.annotations.TradeOrderLog; import cn.iocoder.yudao.module.trade.framework.order.core.utils.TradeOrderLogUtils; import cn.iocoder.yudao.module.trade.service.cart.CartService; +import cn.iocoder.yudao.module.trade.service.config.TradeConfigService; import cn.iocoder.yudao.module.trade.service.delivery.DeliveryExpressService; import cn.iocoder.yudao.module.trade.service.delivery.DeliveryPickUpStoreService; import cn.iocoder.yudao.module.trade.service.message.TradeMessageService; @@ -152,6 +154,9 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { @Resource private TradePurchaseLimitService tradePurchaseLimitService; + @Resource + private TradeConfigService tradeConfigService; + // =================== Order =================== /** @@ -265,6 +270,8 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { // 1.2 构建订单 TradeOrderDO order = buildTradeOrder(userId, createReqVO, calculateRespBO); List orderItems = buildTradeOrderItems(order, calculateRespBO); + // 1.3 售货机结算比例快照 + fillMachineSettleSnapshot(order, orderItems); // 2. 订单创建前的逻辑 tradeOrderHandlers.forEach(handler -> handler.beforeOrderCreate(order, orderItems)); @@ -312,6 +319,45 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { return TradeOrderConvert.INSTANCE.convertList(tradeOrderDO, calculateRespBO); } + /** + * 售货机订单:按全局配置比例快照实得金额 + */ + private void fillMachineSettleSnapshot(TradeOrderDO order, List orderItems) { + boolean hasDeviceItem = CollUtil.isNotEmpty(orderItems) && orderItems.stream() + .anyMatch(i -> StrUtil.isNotEmpty(i.getDeviceId())); + if (!TradeOrderMapper.isMachineOrder(order, hasDeviceItem)) { + return; + } + Integer percent = resolveMachineSettlePercent(order.getMachineSettlePercent()); + order.setMachineSettlePercent(percent); + order.setMachineSettlePrice(calcMachineSettlePrice(order.getPayPrice(), percent)); + if (CollUtil.isEmpty(orderItems)) { + return; + } + for (TradeOrderItemDO item : orderItems) { + item.setMachineSettlePrice(calcMachineSettlePrice(item.getPayPrice(), percent)); + } + } + + private Integer resolveMachineSettlePercent(Integer orderPercent) { + if (orderPercent != null) { + return Math.max(0, Math.min(100, orderPercent)); + } + TradeConfigDO config = tradeConfigService.getTradeConfig(); + Integer percent = config != null ? config.getMachineSettlePercent() : null; + if (percent == null) { + return 10; + } + return Math.max(0, Math.min(100, percent)); + } + + private static int calcMachineSettlePrice(Integer payPrice, Integer percent) { + if (payPrice == null || percent == null) { + return 0; + } + return payPrice * percent / 100; + } + /** * 订单创建后,执行后置逻辑 *

@@ -776,9 +822,25 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { List updateItems = new ArrayList<>(); for (int i = 0; i < orderOrderItems.size(); i++) { TradeOrderItemDO item = orderOrderItems.get(i); + int newItemPayPrice = item.getPayPrice() + dividePrices.get(i); updateItems.add(new TradeOrderItemDO().setId(item.getId()) .setAdjustPrice(item.getAdjustPrice() + dividePrices.get(i)) - .setPayPrice(item.getPayPrice() + dividePrices.get(i))); + .setPayPrice(newItemPayPrice)); + } + + // 售货机订单:调价后按原快照比例重算实得金额 + boolean isMachine = TradeOrderMapper.isMachineOrder(order, + CollUtil.isNotEmpty(orderOrderItems) && orderOrderItems.stream() + .anyMatch(i -> StrUtil.isNotEmpty(i.getDeviceId()))); + if (isMachine) { + Integer settlePercent = resolveMachineSettlePercent(order.getMachineSettlePercent()); + tradeOrderMapper.updateById(new TradeOrderDO().setId(order.getId()) + .setMachineSettlePercent(settlePercent) + .setMachineSettlePrice(calcMachineSettlePrice(newPayPrice, settlePercent))); + for (TradeOrderItemDO updateItem : updateItems) { + updateItem.setMachineSettlePrice( + calcMachineSettlePrice(updateItem.getPayPrice(), settlePercent)); + } } tradeOrderItemMapper.updateBatch(updateItems); @@ -1165,6 +1227,8 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { // 1.2 构建订单 TradeOrderDO order = buildTradeOrderSummary(userId, createReqVO, calculateRespBO); List orderItems = buildTradeOrderItemsSummary(order, calculateRespBO); + // 1.3 售货机结算比例快照 + fillMachineSettleSnapshot(order, orderItems); // 2. 订单创建前的逻辑 tradeOrderHandlers.forEach(handler -> handler.beforeOrderCreate(order, orderItems));