From ad535e674f16e7fa96b5421fe52d434755fc79d6 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Tue, 26 Sep 2023 20:11:54 +0800 Subject: [PATCH] =?UTF-8?q?trade=EF=BC=9A=E7=A7=AF=E5=88=86=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E7=9A=84=E4=BB=B7=E6=A0=BC=E8=AE=A1=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../product/api/spu/dto/ProductSpuRespDTO.java | 12 +++++++----- .../dal/dataobject/order/TradeOrderItemDO.java | 6 ++++-- .../service/order/TradeOrderUpdateServiceImpl.java | 2 +- .../price/calculator/TradePointGiveCalculator.java | 5 ++++- .../calculator/TradePointUsePriceCalculator.java | 13 +++++++++---- .../price/calculator/TradePriceCalculator.java | 4 +++- .../calculator/TradePriceCalculatorHelper.java | 2 ++ .../module/member/api/point/MemberPointApi.java | 1 + .../api/point/dto/MemberPointConfigRespDTO.java | 2 ++ .../member/api/user/dto/MemberUserRespDTO.java | 1 + .../member/enums/point/MemberPointBizTypeEnum.java | 10 +++++----- 11 files changed, 39 insertions(+), 19 deletions(-) diff --git a/yudao-module-mall/yudao-module-product-api/src/main/java/cn/iocoder/yudao/module/product/api/spu/dto/ProductSpuRespDTO.java b/yudao-module-mall/yudao-module-product-api/src/main/java/cn/iocoder/yudao/module/product/api/spu/dto/ProductSpuRespDTO.java index cad6bfcb2..cd7a62eea 100644 --- a/yudao-module-mall/yudao-module-product-api/src/main/java/cn/iocoder/yudao/module/product/api/spu/dto/ProductSpuRespDTO.java +++ b/yudao-module-mall/yudao-module-product-api/src/main/java/cn/iocoder/yudao/module/product/api/spu/dto/ProductSpuRespDTO.java @@ -110,11 +110,6 @@ public class ProductSpuRespDTO { // ========== 物流相关字段 ========= - /** - * 赠送积分 - */ - private Integer giveIntegral; - /** * 物流配置模板编号 * @@ -122,6 +117,13 @@ public class ProductSpuRespDTO { */ private Long deliveryTemplateId; + // ========== 营销相关字段 ========= + + /** + * 赠送积分 + */ + private Integer giveIntegral; + // ========== 统计相关字段 ========= /** 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 4849aad0b..deb895eef 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 @@ -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 记录优惠价格;感觉不一定合理,可以在看看有赞的; // ========== 售后基本信息 ========== 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 b5eb0479b..8377fef15 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 @@ -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()); // 增加用户佣金 diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradePointGiveCalculator.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradePointGiveCalculator.java index 4fb2b2d7b..ea9faaec9 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradePointGiveCalculator.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradePointGiveCalculator.java @@ -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); } + } diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradePointUsePriceCalculator.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradePointUsePriceCalculator.java index b2fd10572..8436eaa2d 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradePointUsePriceCalculator.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradePointUsePriceCalculator.java @@ -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 orderItems = filterList(result.getItems(), TradePriceCalculateRespBO.OrderItem::getSelected); List dividePointPrices = TradePriceCalculatorHelper.dividePrice(orderItems, pointPrice); List 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; } + } diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradePriceCalculator.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradePriceCalculator.java index 620c3e13f..bff2ac291 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradePriceCalculator.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradePriceCalculator.java @@ -21,11 +21,13 @@ public interface TradePriceCalculator { /** * 快递运费的计算 * - * 放在各种营销活动、优惠劵后面 TODO + * 放在各种营销活动、优惠劵后面 */ int ORDER_DELIVERY = 50; /** * 赠送积分,放最后 + * + * 放在 {@link #ORDER_DELIVERY} 后面的原因,是运费也会产生费用,需要赠送对应积分 */ int ORDER_POINT_GIVE = 999; diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradePriceCalculatorHelper.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradePriceCalculatorHelper.java index 812ce5591..d80eddfab 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradePriceCalculatorHelper.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradePriceCalculatorHelper.java @@ -199,6 +199,8 @@ public class TradePriceCalculatorHelper { /** * 按照支付金额,返回每个订单项的分摊金额数组 * + * 实际上 price 不仅仅可以传递的是金额,也可以是积分。因为它的实现逻辑,就是根据 payPrice 做分摊而已 + * * @param orderItems 订单项数组 * @param price 金额 * @return 分摊金额数组,和传入的 orderItems 一一对应 diff --git a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/point/MemberPointApi.java b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/point/MemberPointApi.java index c6df95f7c..9cfbda0a1 100644 --- a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/point/MemberPointApi.java +++ b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/point/MemberPointApi.java @@ -12,6 +12,7 @@ import javax.validation.constraints.Min; */ public interface MemberPointApi { + // TODO @疯狂:这个我们要不要搞成通用的会员配置?MemberConfig? /** * 获得积分配置 * diff --git a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/point/dto/MemberPointConfigRespDTO.java b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/point/dto/MemberPointConfigRespDTO.java index a9783352a..aaa9a3fcf 100644 --- a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/point/dto/MemberPointConfigRespDTO.java +++ b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/point/dto/MemberPointConfigRespDTO.java @@ -9,6 +9,7 @@ import lombok.Data; */ @Data public class MemberPointConfigRespDTO { + /** * 积分抵扣开关 */ @@ -27,4 +28,5 @@ public class MemberPointConfigRespDTO { * 1 元赠送多少分 */ private Integer tradeGivePoint; + } diff --git a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/dto/MemberUserRespDTO.java b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/dto/MemberUserRespDTO.java index e55eda154..50548f935 100644 --- a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/dto/MemberUserRespDTO.java +++ b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/dto/MemberUserRespDTO.java @@ -51,4 +51,5 @@ public class MemberUserRespDTO { * 积分 */ private Integer point; + } diff --git a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/point/MemberPointBizTypeEnum.java b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/point/MemberPointBizTypeEnum.java index 68e61cc9f..931b09de3 100644 --- a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/point/MemberPointBizTypeEnum.java +++ b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/point/MemberPointBizTypeEnum.java @@ -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 操作) ; /**