比例
This commit is contained in:
1 parent
aaaf9a0f43
commit
7b184750e6
7 files changed
+111
-1
No files matched your search
+7
@@ -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;
|
||||
|
||||
}
|
||||
+8
@@ -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")
|
||||
|
||||
+4
@@ -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;
|
||||
|
||||
+9
@@ -115,4 +115,13 @@ public class TradeConfigDO extends BaseDO {
|
||||
@TableField(typeHandler = IntegerListTypeHandler.class)
|
||||
private List<Integer> brokerageWithdrawTypes;
|
||||
|
||||
// ========== 售货机相关 ==========
|
||||
|
||||
/**
|
||||
* 售货机结算比例(0-100)
|
||||
* <p>
|
||||
* 实得金额 = 实付金额 * 比例 / 100
|
||||
*/
|
||||
private Integer machineSettlePercent;
|
||||
|
||||
}
|
||||
+11
@@ -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;
|
||||
|
||||
// ========== 收件 + 物流基本信息 ==========
|
||||
/**
|
||||
* 配送方式
|
||||
|
||||
+7
@@ -143,6 +143,13 @@ public class TradeOrderItemDO extends BaseDO {
|
||||
*/
|
||||
private Integer payPrice;
|
||||
|
||||
/**
|
||||
* 售货机实得金额(总),单位:分
|
||||
* <p>
|
||||
* = {@link #payPrice} * 订单结算比例 / 100
|
||||
*/
|
||||
private Integer machineSettlePrice;
|
||||
|
||||
// ========== 营销基本信息 ==========
|
||||
|
||||
/**
|
||||
|
||||
+65
-1
@@ -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));
|
||||
|
||||
Reference in new issue
Block a user