trade:积分相关的价格计算

This commit is contained in:
YunaiV 2023-09-26 20:11:54 +08:00
parent a8c78f3097
commit ad535e674f
11 changed files with 39 additions and 19 deletions

View File

@ -110,11 +110,6 @@ public class ProductSpuRespDTO {
// ========== 物流相关字段 =========
/**
* 赠送积分
*/
private Integer giveIntegral;
/**
* 物流配置模板编号
*
@ -122,6 +117,13 @@ public class ProductSpuRespDTO {
*/
private Long deliveryTemplateId;
// ========== 营销相关字段 =========
/**
* 赠送积分
*/
private Integer giveIntegral;
// ========== 统计相关字段 =========
/**

View File

@ -146,18 +146,20 @@ public class TradeOrderItemDO extends BaseDO {
private Integer pointPrice;
/**
* 使用的积分
*
* 目的用于后续取消或者售后订单时需要归还赠送
*/
private Integer usePoint;
/**
* 赠送的积分
*
* 目的用于后续取消或者售后订单时需要扣减赠送
*/
private Integer givePoint;
/**
* VIP 减免金额单位
*/
private Integer vipPrice;
// TODO @芋艿如果商品 vip 折扣时到底是新增一个 vipPrice 记录优惠记录还是 vipDiscountPrice记录 vip 的优惠还是直接使用 vipPrice
// 目前 crmeb 的选择单独一个 vipPrice 记录优惠价格感觉不一定合理可以在看看有赞的
// ========== 售后基本信息 ==========

View File

@ -348,7 +348,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
// TODO 芋艿OrderLog
// 增加用户积分赠送
addUserPoint(order.getUserId(), order.getGivePoint(), MemberPointBizTypeEnum.ORDER_REWARD, order.getId());
addUserPoint(order.getUserId(), order.getGivePoint(), MemberPointBizTypeEnum.ORDER_GIVE, order.getId());
// 增加用户经验
getSelf().addUserExperienceAsync(order.getUserId(), order.getPayPrice(), order.getId());
// 增加用户佣金

View File

@ -16,6 +16,7 @@ import java.util.Optional;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.filterList;
// TODO @疯狂这个可以搞个单测
/**
* 赠送积分的 {@link TradePriceCalculator} 实现类
*
@ -25,6 +26,7 @@ import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.
@Order(TradePriceCalculator.ORDER_POINT_GIVE)
@Slf4j
public class TradePointGiveCalculator implements TradePriceCalculator {
@Resource
private MemberPointApi memberPointApi;
@ -54,9 +56,10 @@ public class TradePointGiveCalculator implements TradePriceCalculator {
TradePriceCalculateRespBO.OrderItem orderItem = orderItems.get(i);
// 商品可能赠送了积分所以这里要加上
orderItem.setGivePoint(orderItem.getGivePoint() + dividePoints.get(i));
TradePriceCalculatorHelper.recountPayPrice(orderItem);
TradePriceCalculatorHelper.recountPayPrice(orderItem); // TODO @疯狂这个应该不用调用哇不影响支付金额
}
// 3.3 更新订单赠送积分
TradePriceCalculatorHelper.recountAllGivePoint(result);
}
}

View File

@ -20,6 +20,7 @@ import java.util.List;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.filterList;
// TODO @疯狂搞个单测嘿嘿
/**
* 使用积分的 {@link TradePriceCalculator} 实现类
*
@ -29,6 +30,7 @@ import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.
@Order(TradePriceCalculator.ORDER_POINT_USE)
@Slf4j
public class TradePointUsePriceCalculator implements TradePriceCalculator {
@Resource
private MemberPointApi memberPointApi;
@Resource
@ -48,13 +50,14 @@ public class TradePointUsePriceCalculator implements TradePriceCalculator {
}
// 1.3 校验用户积分余额
MemberUserRespDTO user = memberUserApi.getUser(param.getUserId());
if (user.getPoint() == null || user.getPoint() < 0) {
if (user.getPoint() == null || user.getPoint() <= 0) {
return;
}
// 2.1 计算积分优惠金额
// TODO @疯狂如果计算出来优惠金额为 0那是不是不用执行后续逻辑哈
int pointPrice = calculatePointPrice(config, user.getPoint(), result);
// 2.1 计算分摊的积分抵扣金额
// 2.2 计算分摊的积分抵扣金额
List<TradePriceCalculateRespBO.OrderItem> orderItems = filterList(result.getItems(), TradePriceCalculateRespBO.OrderItem::getSelected);
List<Integer> dividePointPrices = TradePriceCalculatorHelper.dividePrice(orderItems, pointPrice);
List<Integer> divideUsePoints = TradePriceCalculatorHelper.dividePrice(orderItems, result.getUsePoint());
@ -74,7 +77,9 @@ public class TradePointUsePriceCalculator implements TradePriceCalculator {
TradePriceCalculatorHelper.recountAllPrice(result);
}
// TODO @疯狂这个最好是 is 开头因为 check 或者 validator更多失败会抛出异常
private boolean checkDeductPointEnable(MemberPointConfigRespDTO config) {
// TODO @疯狂这个要不直接写成 return config != null && config .... 多行这样一个形式
if (config == null) {
return false;
}
@ -93,7 +98,7 @@ public class TradePointUsePriceCalculator implements TradePriceCalculator {
}
// 积分优惠金额
int pointPrice = usePoint * config.getTradeDeductUnitPrice();
// 0元购!!!用户积分比较多时积分可以抵扣的金额要大于支付金额 这时需要根据支付金额反推使用多少积分
// 0 元购!!!用户积分比较多时积分可以抵扣的金额要大于支付金额这时需要根据支付金额反推使用多少积分
if (result.getPrice().getPayPrice() < pointPrice) {
pointPrice = result.getPrice().getPayPrice();
// 反推需要扣除的积分
@ -103,7 +108,7 @@ public class TradePointUsePriceCalculator implements TradePriceCalculator {
}
// 记录使用的积分
result.setUsePoint(usePoint);
return pointPrice;
}
}

View File

@ -21,11 +21,13 @@ public interface TradePriceCalculator {
/**
* 快递运费的计算
*
* 放在各种营销活动优惠劵后面 TODO
* 放在各种营销活动优惠劵后面
*/
int ORDER_DELIVERY = 50;
/**
* 赠送积分放最后
*
* 放在 {@link #ORDER_DELIVERY} 后面的原因是运费也会产生费用需要赠送对应积分
*/
int ORDER_POINT_GIVE = 999;

View File

@ -199,6 +199,8 @@ public class TradePriceCalculatorHelper {
/**
* 按照支付金额返回每个订单项的分摊金额数组
*
* 实际上 price 不仅仅可以传递的是金额也可以是积分因为它的实现逻辑就是根据 payPrice 做分摊而已
*
* @param orderItems 订单项数组
* @param price 金额
* @return 分摊金额数组和传入的 orderItems 一一对应

View File

@ -12,6 +12,7 @@ import javax.validation.constraints.Min;
*/
public interface MemberPointApi {
// TODO @疯狂这个我们要不要搞成通用的会员配置MemberConfig
/**
* 获得积分配置
*

View File

@ -9,6 +9,7 @@ import lombok.Data;
*/
@Data
public class MemberPointConfigRespDTO {
/**
* 积分抵扣开关
*/
@ -27,4 +28,5 @@ public class MemberPointConfigRespDTO {
* 1 元赠送多少分
*/
private Integer tradeGivePoint;
}

View File

@ -51,4 +51,5 @@ public class MemberUserRespDTO {
* 积分
*/
private Integer point;
}

View File

@ -17,11 +17,11 @@ import java.util.Objects;
public enum MemberPointBizTypeEnum implements IntArrayValuable {
SIGN(1, "签到", "签到获得 {} 积分", true),
ORDER_REWARD(10, "订单奖励", "下单获得 {} 积分", true),
ORDER_CANCEL(11, "订单取消", "订单取消,退还 {} 积分", true), // 退回积分
ORDER_USE(12, "订单使用", "下单使用 {} 积分", false), // 扣减积分
AFTER_SALE_REFUND_USED(13, "订单退款", "订单退款,退还 {} 积分", true), // 退回积分
AFTER_SALE_DEDUCT_GIVE(14, "订单退款", "订单退款,扣除赠送的 {} 积分", false), // 扣减积分
ORDER_GIVE(10, "订单奖励", "下单获得 {} 积分", true), // 支付订单时赠送积分
ORDER_CANCEL(11, "订单取消", "订单取消,退还 {} 积分", true), // 取消订单时退回积分
ORDER_USE(12, "订单使用", "下单使用 {} 积分", false), // 下单时扣减积分
AFTER_SALE_REFUND_USED(13, "订单退款", "订单退款,退还 {} 积分", true), // 售后订单成功时退回积分对应 ORDER_USE 操作
AFTER_SALE_DEDUCT_GIVE(14, "订单退款", "订单退款,扣除赠送的 {} 积分", false), // 售后订单成功时扣减积分对应 ORDER_GIVE 操作
;
/**