This commit is contained in:
zjf committed 2026-09-22 18:33:29 +08:00
1 parent aaaf9a0f43
commit 7b184750e6
7 files changed
+111 -1

No files matched your search

@@ -97,4 +97,11 @@ public class TradeConfigBaseVO {
@InEnum(value = BrokerageWithdrawTypeEnum.class, message = "提现方式必须是 {value}")
private List<Integer> brokerageWithdrawTypes;
// ========== 售货机相关 ==========
@Schema(description = "售货机结算比例(0-100)", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")
@NotNull(message = "售货机结算比例不能为空")
@Range(min = 0, max = 100, message = "售货机结算比例必须在 0 - 100 之间")
private Integer machineSettlePercent;
}
@@ -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")
@@ -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;
@@ -115,4 +115,13 @@ public class TradeConfigDO extends BaseDO {
@TableField(typeHandler = IntegerListTypeHandler.class)
private List<Integer> brokerageWithdrawTypes;
// ========== 售货机相关 ==========
/**
* 售货机结算比例(0-100)
* <p>
* 实得金额 = 实付金额 * 比例 / 100
*/
private Integer machineSettlePercent;
}
@@ -189,6 +189,17 @@ public class TradeOrderDO extends BaseDO {
*/
private Integer payPrice;
/**
* 售货机结算比例快照(0-100)
*/
private Integer machineSettlePercent;
/**
* 售货机实得金额(总),单位:分
* <p>
* = {@link #payPrice} * {@link #machineSettlePercent} / 100
*/
private Integer machineSettlePrice;
// ========== 收件 + 物流基本信息 ==========
/**
* 配送方式
@@ -143,6 +143,13 @@ public class TradeOrderItemDO extends BaseDO {
*/
private Integer payPrice;
/**
* 售货机实得金额(总),单位:分
* <p>
* = {@link #payPrice} * 订单结算比例 / 100
*/
private Integer machineSettlePrice;
// ========== 营销基本信息 ==========
/**
@@ -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<TradeOrderItemDO> 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<TradeOrderItemDO> 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;
}
/**
* 订单创建后,执行后置逻辑
* <p>
@@ -776,9 +822,25 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
List<TradeOrderItemDO> 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<TradeOrderItemDO> orderItems = buildTradeOrderItemsSummary(order, calculateRespBO);
// 1.3 售货机结算比例快照
fillMachineSettleSnapshot(order, orderItems);
// 2. 订单创建前的逻辑
tradeOrderHandlers.forEach(handler -> handler.beforeOrderCreate(order, orderItems));