orderItems = tradeOrderItemMapper.selectListByOrderId(id);
productSkuApi.updateSkuStock(TradeOrderConvert.INSTANCE.convert(orderItems));
- // 3.回滚优惠券
- couponApi.returnUsedCoupon(order.getCouponId());
+ // 5. 回滚优惠券
+ if (order.getCouponId() > 0) {
+ couponApi.returnUsedCoupon(order.getCouponId());
+ }
- // 4.回滚积分(抵扣的)
+ // 6. 回滚积分(抵扣的)
addUserPoint(order.getUserId(), order.getUsePoint(), MemberPointBizTypeEnum.ORDER_CANCEL, order.getId());
- // TODO 芋艿:OrderLog
+ // 7. 增加订单日志
+ TradeOrderLogUtils.setOrderInfo(order.getId(), order.getStatus(), TradeOrderStatusEnum.CANCELED.getStatus());
+ }
- // TODO 芋艿:lili 发送订单变化的消息
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ @TradeOrderLog(operateType = TradeOrderOperateTypeEnum.MEMBER_DELETE)
+ public void deleteOrder(Long userId, Long id) {
+ // 1.1 校验存在
+ TradeOrderDO order = tradeOrderMapper.selectOrderByIdAndUserId(id, userId);
+ if (order == null) {
+ throw exception(ORDER_NOT_FOUND);
+ }
+ // 1.2 校验状态
+ if (ObjectUtil.notEqual(order.getStatus(), TradeOrderStatusEnum.CANCELED.getStatus())) {
+ throw exception(ORDER_DELETE_FAIL_STATUS_NOT_CANCEL);
+ }
+ // 2. 删除订单
+ tradeOrderMapper.deleteById(id);
+
+ // 3. 记录日志
+ TradeOrderLogUtils.setOrderInfo(order.getId(), order.getStatus(), order.getStatus());
}
/**
@@ -766,6 +804,20 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
memberLevelApi.addExperience(userId, -refundPrice, bizType, String.valueOf(afterSaleId));
}
+ /**
+ * 添加用户积分
+ *
+ * 目前是支付成功后,就会创建积分记录。
+ *
+ * 业内还有两种做法,可以根据自己的业务调整:
+ * 1. 确认收货后,才创建积分记录
+ * 2. 支付 or 下单成功时,创建积分记录(冻结),确认收货解冻或者 n 天后解冻
+ *
+ * @param userId 用户编号
+ * @param point 增加积分数量
+ * @param bizType 业务编号
+ * @param bizId 业务编号
+ */
protected void addUserPoint(Long userId, Integer point, MemberPointBizTypeEnum bizType, Long bizId) {
if (point != null && point > 0) {
memberPointApi.addPoint(userId, point, bizType.getType(), String.valueOf(bizId));
@@ -778,15 +830,27 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
}
}
+ /**
+ * 创建分销记录
+ *
+ * 目前是支付成功后,就会创建分销记录。
+ *
+ * 业内还有两种做法,可以根据自己的业务调整:
+ * 1. 确认收货后,才创建分销记录
+ * 2. 支付 or 下单成功时,创建分销记录(冻结),确认收货解冻或者 n 天后解冻
+ *
+ * @param userId 用户编号
+ * @param orderId 订单编号
+ */
@Async
protected void addBrokerageAsync(Long userId, Long orderId) {
MemberUserRespDTO user = memberUserApi.getUser(userId);
Assert.notNull(user);
-
+ // 每一个订单项,都会去生成分销记录
List orderItems = tradeOrderItemMapper.selectListByOrderId(orderId);
- List list = convertList(orderItems,
+ List addList = convertList(orderItems,
item -> TradeOrderConvert.INSTANCE.convert(user, item, productSkuApi.getSku(item.getSkuId())));
- brokerageRecordService.addBrokerage(userId, BrokerageRecordBizTypeEnum.ORDER, list);
+ brokerageRecordService.addBrokerage(userId, BrokerageRecordBizTypeEnum.ORDER, addList);
}
@Async
diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/bo/TradeBeforeOrderCreateReqBO.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/bo/TradeBeforeOrderCreateReqBO.java
index 077b5a5ef..261683d3d 100644
--- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/bo/TradeBeforeOrderCreateReqBO.java
+++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/bo/TradeBeforeOrderCreateReqBO.java
@@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.trade.service.order.bo;
+import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@@ -14,36 +15,73 @@ import javax.validation.constraints.NotNull;
@Data
public class TradeBeforeOrderCreateReqBO {
- // TODO @puhui999:注释也写下哈;bo 还是写注释噢
-
+ /**
+ * 订单类型
+ *
+ * 枚举 {@link TradeOrderTypeEnum}
+ */
@NotNull(message = "订单类型不能为空")
private Integer orderType;
+ /**
+ * 用户编号
+ *
+ * 关联 MemberUserDO 的 id 编号
+ */
+ @NotNull(message = "用户编号不能为空")
+ private Long userId;
+
// ========== 秒杀活动相关字段 ==========
+ /**
+ *
+ */
@Schema(description = "秒杀活动编号", example = "1024")
private Long seckillActivityId;
// ========== 拼团活动相关字段 ==========
+ /**
+ * 拼团活动编号
+ */
@Schema(description = "拼团活动编号", example = "1024")
private Long combinationActivityId;
+ /**
+ * 拼团团长编号
+ */
@Schema(description = "拼团团长编号", example = "2048")
private Long combinationHeadId;
+ // ========== 砍价活动相关字段 ==========
+
+ /**
+ * 砍价活动编号
+ */
@Schema(description = "砍价活动编号", example = "123")
private Long bargainActivityId;
+ // ========== 活动购买商品相关字段 ==========
+
+ /**
+ * 商品 SPU 编号
+ *
+ * 关联 ProductSkuDO 的 spuId 编号
+ */
@NotNull(message = "SPU 编号不能为空")
private Long spuId;
+ /**
+ * 商品 SKU 编号
+ *
+ * 关联 ProductSkuDO 的 id 编号
+ */
@NotNull(message = "SKU 编号活动商品不能为空")
private Long skuId;
- @NotNull(message = "用户编号不能为空")
- private Long userId;
-
+ /**
+ * 购买的商品数量
+ */
@NotNull(message = "购买数量不能为空")
private Integer count;
diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeBargainHandler.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeBargainHandler.java
index 72def213d..18a276fde 100644
--- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeBargainHandler.java
+++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeBargainHandler.java
@@ -20,14 +20,17 @@ public class TradeBargainHandler implements TradeOrderHandler {
@Resource
private BargainActivityApi bargainActivityApi;
+ // TODO @puhui999:先临时写在这里;在价格计算时,如果是秒杀商品,需要校验如下条件:
+ // 1. 商品存在、库存充足、单次限购;
+ // 2. 活动进行中、时间段符合
+
@Override
public void beforeOrderCreate(TradeBeforeOrderCreateReqBO reqBO) {
// 如果是砍价订单
if (ObjectUtil.notEqual(TradeOrderTypeEnum.BARGAIN.getType(), reqBO.getOrderType())) {
return;
}
-
- // 额外扣减砍价的库存
+ // 扣减砍价活动的库存
bargainActivityApi.updateBargainActivityStock(reqBO.getBargainActivityId(), reqBO.getCount());
}
diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeOrderHandler.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeOrderHandler.java
index b747e35d4..47426dd9b 100644
--- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeOrderHandler.java
+++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeOrderHandler.java
@@ -24,9 +24,12 @@ public interface TradeOrderHandler {
*/
void afterOrderCreate(TradeAfterOrderCreateReqBO reqBO);
+ // TODO @puhui999:这个搞成订单取消
/**
* 回滚
*/
void rollback();
+ // TODO @puhui999:再搞个订单项取消哈
+
}
diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeSeckillHandler.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeSeckillHandler.java
index ce1dfdb05..652717b77 100644
--- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeSeckillHandler.java
+++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeSeckillHandler.java
@@ -20,13 +20,17 @@ public class TradeSeckillHandler implements TradeOrderHandler {
@Resource
private SeckillActivityApi seckillActivityApi;
+ // TODO @puhui999:先临时写在这里;在价格计算时,如果是秒杀商品,需要校验如下条件:
+ // 1. 商品存在、库存充足、单次限购;
+ // 2. 活动进行中、时间段符合
+
@Override
public void beforeOrderCreate(TradeBeforeOrderCreateReqBO reqBO) {
// 如果是秒杀订单:额外扣减秒杀的库存;
if (ObjectUtil.notEqual(TradeOrderTypeEnum.SECKILL.getType(), reqBO.getOrderType())) {
return;
}
-
+ // 扣减秒杀活动的库存
seckillActivityApi.updateSeckillStock(reqBO.getSeckillActivityId(), reqBO.getSkuId(), reqBO.getCount());
}
diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/bo/TradePriceCalculateRespBO.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/bo/TradePriceCalculateRespBO.java
index 786c478bc..af73332de 100644
--- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/bo/TradePriceCalculateRespBO.java
+++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/bo/TradePriceCalculateRespBO.java
@@ -94,6 +94,10 @@ public class TradePriceCalculateRespBO {
* 对应 taobao 的 trade.point_fee 字段
*/
private Integer pointPrice;
+ /**
+ * VIP 减免金额,单位:分
+ */
+ private Integer vipPrice;
/**
* 最终购买金额(总),单位:分
*
@@ -102,6 +106,7 @@ public class TradePriceCalculateRespBO {
* - {@link #pointPrice}
* - {@link #discountPrice}
* + {@link #deliveryPrice}
+ * - {@link #vipPrice}
*/
private Integer payPrice;
@@ -167,6 +172,10 @@ public class TradePriceCalculateRespBO {
* 使用的积分
*/
private Integer usePoint;
+ /**
+ * VIP 减免金额,单位:分
+ */
+ private Integer vipPrice;
/**
* 应付金额(总),单位:分
*
@@ -175,6 +184,7 @@ public class TradePriceCalculateRespBO {
* - {@link #pointPrice}
* - {@link #discountPrice}
* + {@link #deliveryPrice}
+ * - {@link #vipPrice}
*/
private Integer payPrice;
diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeCouponPriceCalculator.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeCouponPriceCalculator.java
index 68955ce51..b871186bd 100644
--- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeCouponPriceCalculator.java
+++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeCouponPriceCalculator.java
@@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.trade.service.price.calculator;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.Assert;
+import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.module.promotion.api.coupon.CouponApi;
import cn.iocoder.yudao.module.promotion.api.coupon.dto.CouponRespDTO;
@@ -9,6 +10,7 @@ import cn.iocoder.yudao.module.promotion.api.coupon.dto.CouponValidReqDTO;
import cn.iocoder.yudao.module.promotion.enums.common.PromotionDiscountTypeEnum;
import cn.iocoder.yudao.module.promotion.enums.common.PromotionProductScopeEnum;
import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum;
+import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;
import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO;
import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO;
import org.springframework.core.annotation.Order;
@@ -22,6 +24,7 @@ import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionU
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.filterList;
import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.COUPON_NO_MATCH_MIN_PRICE;
import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.COUPON_NO_MATCH_SPU;
+import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.PRICE_CALCULATE_COUPON_NOT_MATCH_NORMAL_ORDER;
/**
* 优惠劵的 {@link TradePriceCalculator} 实现类
@@ -44,6 +47,10 @@ public class TradeCouponPriceCalculator implements TradePriceCalculator {
CouponRespDTO coupon = couponApi.validateCoupon(new CouponValidReqDTO()
.setId(param.getCouponId()).setUserId(param.getUserId()));
Assert.notNull(coupon, "校验通过的优惠劵({}),不能为空", param.getCouponId());
+ // 1.2 只有【普通】订单,才允许使用优惠劵
+ if (ObjectUtil.notEqual(result.getType(), TradeOrderTypeEnum.NORMAL.getType())) {
+ throw exception(PRICE_CALCULATE_COUPON_NOT_MATCH_NORMAL_ORDER);
+ }
// 2.1 获得匹配的商品 SKU 数组
List orderItems = filterMatchCouponOrderItems(result, coupon);
diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeDeliveryPriceCalculator.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeDeliveryPriceCalculator.java
index 20c3feee3..01796ad0e 100644
--- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeDeliveryPriceCalculator.java
+++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeDeliveryPriceCalculator.java
@@ -64,7 +64,8 @@ public class TradeDeliveryPriceCalculator implements TradePriceCalculator {
private void calculateByPickUp(TradePriceCalculateReqBO param) {
if (param.getPickUpStoreId() == null) {
- throw exception(PRICE_CALCULATE_DELIVERY_PRICE_PICK_UP_STORE_IS_EMPTY);
+ // 价格计算时,如果为空就不算~最终下单,会校验该字段不允许空
+ return;
}
DeliveryPickUpStoreDO pickUpStore = deliveryPickUpStoreService.getDeliveryPickUpStore(param.getPickUpStoreId());
if (pickUpStore == null || CommonStatusEnum.DISABLE.getStatus().equals(pickUpStore.getStatus())) {
@@ -77,7 +78,8 @@ public class TradeDeliveryPriceCalculator implements TradePriceCalculator {
private void calculateExpress(TradePriceCalculateReqBO param, TradePriceCalculateRespBO result) {
// 0. 得到收件地址区域
if (param.getAddressId() == null) {
- throw exception(PRICE_CALCULATE_DELIVERY_PRICE_USER_ADDRESS_IS_EMPTY);
+ // 价格计算时,如果为空就不算~最终下单,会校验该字段不允许空
+ return;
}
AddressRespDTO address = addressApi.getAddress(param.getAddressId(), param.getUserId());
Assert.notNull(address, "收件人({})的地址,不能为空", param.getUserId());
diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeDiscountActivityPriceCalculator.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeDiscountActivityPriceCalculator.java
index fe465f37d..a42780625 100644
--- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeDiscountActivityPriceCalculator.java
+++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeDiscountActivityPriceCalculator.java
@@ -1,11 +1,13 @@
package cn.iocoder.yudao.module.trade.service.price.calculator;
import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.module.promotion.api.discount.DiscountActivityApi;
import cn.iocoder.yudao.module.promotion.api.discount.dto.DiscountProductRespDTO;
import cn.iocoder.yudao.module.promotion.enums.common.PromotionDiscountTypeEnum;
import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum;
+import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;
import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO;
import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO;
import org.springframework.core.annotation.Order;
@@ -33,6 +35,10 @@ public class TradeDiscountActivityPriceCalculator implements TradePriceCalculato
@Override
public void calculate(TradePriceCalculateReqBO param, TradePriceCalculateRespBO result) {
+ // 0. 只有【普通】订单,才计算该优惠
+ if (ObjectUtil.notEqual(result.getType(), TradeOrderTypeEnum.NORMAL.getType())) {
+ return;
+ }
// 获得 SKU 对应的限时折扣活动
List discountProducts = discountActivityApi.getMatchDiscountProductList(
convertSet(result.getItems(), TradePriceCalculateRespBO.OrderItem::getSkuId));
diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeMemberLevelPriceCalculator.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeMemberLevelPriceCalculator.java
new file mode 100644
index 000000000..8aee001d5
--- /dev/null
+++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeMemberLevelPriceCalculator.java
@@ -0,0 +1,88 @@
+package cn.iocoder.yudao.module.trade.service.price.calculator;
+
+import cn.hutool.core.util.ObjectUtil;
+import cn.iocoder.yudao.module.member.api.level.MemberLevelApi;
+import cn.iocoder.yudao.module.member.api.level.dto.MemberLevelRespDTO;
+import cn.iocoder.yudao.module.member.api.user.MemberUserApi;
+import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
+import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum;
+import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;
+import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO;
+import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+import static cn.iocoder.yudao.module.trade.service.price.calculator.TradePriceCalculatorHelper.formatPrice;
+
+/**
+ * 会员 VIP 折扣的 {@link TradePriceCalculator} 实现类
+ *
+ * @author 芋道源码
+ */
+@Component
+@Order(TradePriceCalculator.ORDER_MEMBER_LEVEL)
+public class TradeMemberLevelPriceCalculator implements TradePriceCalculator {
+
+ @Resource
+ private MemberLevelApi memberLevelApi;
+ @Resource
+ private MemberUserApi memberUserApi;
+
+ @Override
+ public void calculate(TradePriceCalculateReqBO param, TradePriceCalculateRespBO result) {
+ // 0. 只有【普通】订单,才计算该优惠
+ if (ObjectUtil.notEqual(result.getType(), TradeOrderTypeEnum.NORMAL.getType())) {
+ return;
+ }
+ // 1. 获得用户的会员等级
+ MemberUserRespDTO user = memberUserApi.getUser(param.getUserId());
+ if (user.getLevelId() == null || user.getLevelId() <= 0) {
+ return;
+ }
+ MemberLevelRespDTO level = memberLevelApi.getMemberLevel(user.getLevelId());
+ if (level == null || level.getDiscountPercent() == null) {
+ return;
+ }
+
+ // 2. 计算每个 SKU 的优惠金额
+ result.getItems().forEach(orderItem -> {
+ // 2.1 计算优惠金额
+ Integer vipPrice = calculateVipPrice(orderItem.getPayPrice(), level.getDiscountPercent());
+ if (vipPrice <= 0) {
+ return;
+ }
+
+ // 2.2 记录优惠明细
+ if (orderItem.getSelected()) {
+ // 注意,只有在选中的情况下,才会记录到优惠明细。否则仅仅是更新 SKU 优惠金额,用于展示
+ TradePriceCalculatorHelper.addPromotion(result, orderItem,
+ level.getId(), level.getName(), PromotionTypeEnum.MEMBER_LEVEL.getType(),
+ String.format("会员等级折扣:省 %s 元", formatPrice(vipPrice)),
+ vipPrice);
+ }
+
+ // 2.3 更新 SKU 的优惠金额
+ orderItem.setVipPrice(vipPrice);
+ TradePriceCalculatorHelper.recountPayPrice(orderItem);
+ });
+ TradePriceCalculatorHelper.recountAllPrice(result);
+ }
+
+ /**
+ * 计算会员 VIP 优惠价格
+ *
+ * @param price 原价
+ * @param discountPercent 折扣
+ * @return 优惠价格
+ */
+ public Integer calculateVipPrice(Integer price, Integer discountPercent) {
+ if (discountPercent == null) {
+ return 0;
+ }
+ Integer newPrice = price * discountPercent / 100;
+ return price - newPrice;
+ }
+
+}
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 e5b18e88e..620c3e13f 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
@@ -13,6 +13,7 @@ import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO;
*/
public interface TradePriceCalculator {
+ int ORDER_MEMBER_LEVEL = 5;
int ORDER_DISCOUNT_ACTIVITY = 10;
int ORDER_REWARD_ACTIVITY = 20;
int ORDER_COUPON = 30;
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 9a0a7e1d5..812ce5591 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
@@ -52,7 +52,7 @@ public class TradePriceCalculatorHelper {
.setCount(item.getCount()).setCartId(item.getCartId()).setSelected(item.getSelected());
// sku 价格
orderItem.setPrice(sku.getPrice()).setPayPrice(sku.getPrice() * item.getCount())
- .setDiscountPrice(0).setDeliveryPrice(0).setCouponPrice(0).setPointPrice(0);
+ .setDiscountPrice(0).setDeliveryPrice(0).setCouponPrice(0).setPointPrice(0).setVipPrice(0);
// sku 信息
orderItem.setPicUrl(sku.getPicUrl()).setProperties(sku.getProperties())
.setWeight(sku.getWeight()).setVolume(sku.getVolume());
@@ -98,7 +98,7 @@ public class TradePriceCalculatorHelper {
// 先重置
TradePriceCalculateRespBO.Price price = result.getPrice();
price.setTotalPrice(0).setDiscountPrice(0).setDeliveryPrice(0)
- .setCouponPrice(0).setPointPrice(0).setPayPrice(0);
+ .setCouponPrice(0).setPointPrice(0).setVipPrice(0).setPayPrice(0);
// 再合计 item
result.getItems().forEach(item -> {
if (!item.getSelected()) {
@@ -109,6 +109,7 @@ public class TradePriceCalculatorHelper {
price.setDeliveryPrice(price.getDeliveryPrice() + item.getDeliveryPrice());
price.setCouponPrice(price.getCouponPrice() + item.getCouponPrice());
price.setPointPrice(price.getPointPrice() + item.getPointPrice());
+ price.setVipPrice(price.getVipPrice() + item.getVipPrice());
price.setPayPrice(price.getPayPrice() + item.getPayPrice());
});
}
@@ -132,7 +133,9 @@ public class TradePriceCalculatorHelper {
- orderItem.getDiscountPrice()
+ orderItem.getDeliveryPrice()
- orderItem.getCouponPrice()
- - orderItem.getPointPrice());
+ - orderItem.getPointPrice()
+ - orderItem.getVipPrice()
+ );
}
/**
@@ -162,6 +165,9 @@ public class TradePriceCalculatorHelper {
if (orderItem.getGivePoint() == null) {
orderItem.setGivePoint(0);
}
+ if (orderItem.getVipPrice() == null) {
+ orderItem.setVipPrice(0);
+ }
recountPayPrice(orderItem);
});
}
diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeRewardActivityPriceCalculator.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeRewardActivityPriceCalculator.java
index f2cfe71cd..d9b44c2b6 100644
--- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeRewardActivityPriceCalculator.java
+++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeRewardActivityPriceCalculator.java
@@ -1,11 +1,13 @@
package cn.iocoder.yudao.module.trade.service.price.calculator;
import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.module.promotion.api.reward.RewardActivityApi;
import cn.iocoder.yudao.module.promotion.api.reward.dto.RewardActivityMatchRespDTO;
import cn.iocoder.yudao.module.promotion.enums.common.PromotionConditionTypeEnum;
import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum;
+import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;
import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO;
import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO;
import org.springframework.core.annotation.Order;
@@ -32,6 +34,10 @@ public class TradeRewardActivityPriceCalculator implements TradePriceCalculator
@Override
public void calculate(TradePriceCalculateReqBO param, TradePriceCalculateRespBO result) {
+ // 0. 只有【普通】订单,才计算该优惠
+ if (ObjectUtil.notEqual(result.getType(), TradeOrderTypeEnum.NORMAL.getType())) {
+ return;
+ }
// 获得 SKU 对应的满减送活动
List rewardActivities = rewardActivityApi.getMatchRewardActivityList(
convertSet(result.getItems(), TradePriceCalculateRespBO.OrderItem::getSpuId));
diff --git a/yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeCouponPriceCalculatorTest.java b/yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeCouponPriceCalculatorTest.java
index 94ac66c9b..06655e0b2 100644
--- a/yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeCouponPriceCalculatorTest.java
+++ b/yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeCouponPriceCalculatorTest.java
@@ -7,6 +7,7 @@ import cn.iocoder.yudao.module.promotion.api.coupon.dto.CouponValidReqDTO;
import cn.iocoder.yudao.module.promotion.enums.common.PromotionDiscountTypeEnum;
import cn.iocoder.yudao.module.promotion.enums.common.PromotionProductScopeEnum;
import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum;
+import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;
import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO;
import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO;
import org.junit.jupiter.api.Test;
@@ -47,6 +48,7 @@ public class TradeCouponPriceCalculatorTest extends BaseMockitoUnitTest {
new TradePriceCalculateReqBO.Item().setSkuId(40L).setCount(5).setSelected(false) // 匹配优惠劵,但是未选中
));
TradePriceCalculateRespBO result = new TradePriceCalculateRespBO()
+ .setType(TradeOrderTypeEnum.NORMAL.getType())
.setPrice(new TradePriceCalculateRespBO.Price())
.setPromotions(new ArrayList<>())
.setItems(asList(
diff --git a/yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeDiscountActivityPriceCalculatorTest.java b/yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeDiscountActivityPriceCalculatorTest.java
index 9175e1643..21760217c 100644
--- a/yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeDiscountActivityPriceCalculatorTest.java
+++ b/yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeDiscountActivityPriceCalculatorTest.java
@@ -5,6 +5,7 @@ import cn.iocoder.yudao.module.promotion.api.discount.DiscountActivityApi;
import cn.iocoder.yudao.module.promotion.api.discount.dto.DiscountProductRespDTO;
import cn.iocoder.yudao.module.promotion.enums.common.PromotionDiscountTypeEnum;
import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum;
+import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;
import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO;
import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO;
import org.junit.jupiter.api.Test;
@@ -42,6 +43,7 @@ public class TradeDiscountActivityPriceCalculatorTest extends BaseMockitoUnitTes
new TradePriceCalculateReqBO.Item().setSkuId(20L).setCount(3).setSelected(false) // 匹配活动,但未选中
));
TradePriceCalculateRespBO result = new TradePriceCalculateRespBO()
+ .setType(TradeOrderTypeEnum.NORMAL.getType())
.setPrice(new TradePriceCalculateRespBO.Price())
.setPromotions(new ArrayList<>())
.setItems(asList(
diff --git a/yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeMemberLevelPriceCalculatorTest.java b/yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeMemberLevelPriceCalculatorTest.java
new file mode 100644
index 000000000..44e783103
--- /dev/null
+++ b/yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeMemberLevelPriceCalculatorTest.java
@@ -0,0 +1,118 @@
+package cn.iocoder.yudao.module.trade.service.price.calculator;
+
+import cn.iocoder.yudao.framework.test.core.ut.BaseMockitoUnitTest;
+import cn.iocoder.yudao.module.member.api.level.MemberLevelApi;
+import cn.iocoder.yudao.module.member.api.level.dto.MemberLevelRespDTO;
+import cn.iocoder.yudao.module.member.api.user.MemberUserApi;
+import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
+import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum;
+import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;
+import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO;
+import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO;
+import org.junit.jupiter.api.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+
+import java.util.ArrayList;
+
+import static java.util.Arrays.asList;
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.when;
+
+/**
+ * {@link TradeMemberLevelPriceCalculator} 的单元测试类
+ *
+ * @author 芋道源码
+ */
+public class TradeMemberLevelPriceCalculatorTest extends BaseMockitoUnitTest {
+
+ @InjectMocks
+ private TradeMemberLevelPriceCalculator memberLevelPriceCalculator;
+
+ @Mock
+ private MemberLevelApi memberLevelApi;
+ @Mock
+ private MemberUserApi memberUserApi;
+
+ @Test
+ public void testCalculate() {
+ // 准备参数
+ TradePriceCalculateReqBO param = new TradePriceCalculateReqBO()
+ .setUserId(1024L)
+ .setItems(asList(
+ new TradePriceCalculateReqBO.Item().setSkuId(10L).setCount(2).setSelected(true), // 匹配活动,且已选中
+ new TradePriceCalculateReqBO.Item().setSkuId(20L).setCount(3).setSelected(false) // 匹配活动,但未选中
+ ));
+ TradePriceCalculateRespBO result = new TradePriceCalculateRespBO()
+ .setType(TradeOrderTypeEnum.NORMAL.getType())
+ .setPrice(new TradePriceCalculateRespBO.Price())
+ .setPromotions(new ArrayList<>())
+ .setItems(asList(
+ new TradePriceCalculateRespBO.OrderItem().setSkuId(10L).setCount(2).setSelected(true)
+ .setPrice(100),
+ new TradePriceCalculateRespBO.OrderItem().setSkuId(20L).setCount(3).setSelected(false)
+ .setPrice(50)
+ ));
+ // 保证价格被初始化上
+ TradePriceCalculatorHelper.recountPayPrice(result.getItems());
+ TradePriceCalculatorHelper.recountAllPrice(result);
+
+ // mock 方法(会员等级)
+ when(memberUserApi.getUser(eq(1024L))).thenReturn(new MemberUserRespDTO().setLevelId(2048L));
+ when(memberLevelApi.getMemberLevel(eq(2048L))).thenReturn(
+ new MemberLevelRespDTO().setId(2048L).setName("VIP 会员").setDiscountPercent(60));
+
+ // 调用
+ memberLevelPriceCalculator.calculate(param, result);
+ // 断言:Price 部分
+ TradePriceCalculateRespBO.Price price = result.getPrice();
+ assertEquals(price.getTotalPrice(), 200);
+ assertEquals(price.getDiscountPrice(), 0);
+ assertEquals(price.getPointPrice(), 0);
+ assertEquals(price.getDeliveryPrice(), 0);
+ assertEquals(price.getCouponPrice(), 0);
+ assertEquals(price.getVipPrice(), 80);
+ assertEquals(price.getPayPrice(), 120);
+ assertNull(result.getCouponId());
+ // 断言:SKU 1
+ assertEquals(result.getItems().size(), 2);
+ TradePriceCalculateRespBO.OrderItem orderItem01 = result.getItems().get(0);
+ assertEquals(orderItem01.getSkuId(), 10L);
+ assertEquals(orderItem01.getCount(), 2);
+ assertEquals(orderItem01.getPrice(), 100);
+ assertEquals(orderItem01.getDiscountPrice(), 0);
+ assertEquals(orderItem01.getDeliveryPrice(), 0);
+ assertEquals(orderItem01.getCouponPrice(), 0);
+ assertEquals(orderItem01.getPointPrice(), 0);
+ assertEquals(orderItem01.getVipPrice(), 80);
+ assertEquals(orderItem01.getPayPrice(), 120);
+ // 断言:SKU 2
+ TradePriceCalculateRespBO.OrderItem orderItem02 = result.getItems().get(1);
+ assertEquals(orderItem02.getSkuId(), 20L);
+ assertEquals(orderItem02.getCount(), 3);
+ assertEquals(orderItem02.getPrice(), 50);
+ assertEquals(orderItem02.getDiscountPrice(), 0);
+ assertEquals(orderItem02.getDeliveryPrice(), 0);
+ assertEquals(orderItem02.getCouponPrice(), 0);
+ assertEquals(orderItem02.getPointPrice(), 0);
+ assertEquals(orderItem02.getVipPrice(), 60);
+ assertEquals(orderItem02.getPayPrice(), 90);
+ // 断言:Promotion 部分
+ assertEquals(result.getPromotions().size(), 1);
+ TradePriceCalculateRespBO.Promotion promotion01 = result.getPromotions().get(0);
+ assertEquals(promotion01.getId(), 2048L);
+ assertEquals(promotion01.getName(), "VIP 会员");
+ assertEquals(promotion01.getType(), PromotionTypeEnum.MEMBER_LEVEL.getType());
+ assertEquals(promotion01.getTotalPrice(), 200);
+ assertEquals(promotion01.getDiscountPrice(), 80);
+ assertTrue(promotion01.getMatch());
+ assertEquals(promotion01.getDescription(), "会员等级折扣:省 0.80 元");
+ TradePriceCalculateRespBO.PromotionItem promotionItem01 = promotion01.getItems().get(0);
+ assertEquals(promotion01.getItems().size(), 1);
+ assertEquals(promotionItem01.getSkuId(), 10L);
+ assertEquals(promotionItem01.getTotalPrice(), 200);
+ assertEquals(promotionItem01.getDiscountPrice(), 80);
+ }
+
+}
diff --git a/yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeRewardActivityPriceCalculatorTest.java b/yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeRewardActivityPriceCalculatorTest.java
index 30107d5b4..de72ed616 100644
--- a/yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeRewardActivityPriceCalculatorTest.java
+++ b/yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeRewardActivityPriceCalculatorTest.java
@@ -5,6 +5,7 @@ import cn.iocoder.yudao.module.promotion.api.reward.RewardActivityApi;
import cn.iocoder.yudao.module.promotion.api.reward.dto.RewardActivityMatchRespDTO;
import cn.iocoder.yudao.module.promotion.enums.common.PromotionConditionTypeEnum;
import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum;
+import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;
import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO;
import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO;
import org.junit.jupiter.api.Test;
@@ -44,6 +45,7 @@ public class TradeRewardActivityPriceCalculatorTest extends BaseMockitoUnitTest
new TradePriceCalculateReqBO.Item().setSkuId(30L).setCount(4).setSelected(true) // 匹配活动 2
));
TradePriceCalculateRespBO result = new TradePriceCalculateRespBO()
+ .setType(TradeOrderTypeEnum.NORMAL.getType())
.setPrice(new TradePriceCalculateRespBO.Price())
.setPromotions(new ArrayList<>())
.setItems(asList(
@@ -157,6 +159,7 @@ public class TradeRewardActivityPriceCalculatorTest extends BaseMockitoUnitTest
new TradePriceCalculateReqBO.Item().setSkuId(30L).setCount(4).setSelected(true)
));
TradePriceCalculateRespBO result = new TradePriceCalculateRespBO()
+ .setType(TradeOrderTypeEnum.NORMAL.getType())
.setPrice(new TradePriceCalculateRespBO.Price())
.setPromotions(new ArrayList<>())
.setItems(asList(
diff --git a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/level/MemberLevelApi.java b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/level/MemberLevelApi.java
index 2091189a2..1ddd899cb 100644
--- a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/level/MemberLevelApi.java
+++ b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/level/MemberLevelApi.java
@@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.member.api.level;
+import cn.iocoder.yudao.module.member.api.level.dto.MemberLevelRespDTO;
import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum;
/**
@@ -9,6 +10,14 @@ import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum;
*/
public interface MemberLevelApi {
+ /**
+ * 获得会员等级
+ *
+ * @param id 会员等级编号
+ * @return 会员等级
+ */
+ MemberLevelRespDTO getMemberLevel(Long id);
+
/**
* 增加会员经验
*
diff --git a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/level/dto/MemberLevelRespDTO.java b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/level/dto/MemberLevelRespDTO.java
new file mode 100644
index 000000000..a72d65f23
--- /dev/null
+++ b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/level/dto/MemberLevelRespDTO.java
@@ -0,0 +1,41 @@
+package cn.iocoder.yudao.module.member.api.level.dto;
+
+import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
+import lombok.Data;
+
+/**
+ * 会员等级 Resp DTO
+ *
+ * @author 芋道源码
+ */
+@Data
+public class MemberLevelRespDTO {
+
+ /**
+ * 编号
+ */
+ private Long id;
+ /**
+ * 等级名称
+ */
+ private String name;
+ /**
+ * 等级
+ */
+ private Integer level;
+ /**
+ * 升级经验
+ */
+ private Integer experience;
+ /**
+ * 享受折扣
+ */
+ private Integer discountPercent;
+ /**
+ * 状态
+ *
+ * 枚举 {@link CommonStatusEnum}
+ */
+ private Integer status;
+
+}
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 0fa2c3e0b..c426fbbf1 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
@@ -33,6 +33,14 @@ public class MemberUserRespDTO {
* 手机
*/
private String mobile;
+
+ // ========== 其它信息 ==========
+
+ /**
+ * 会员级别编号
+ */
+ private Long levelId;
+
/**
* 积分
*/
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/api/level/MemberLevelApiImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/api/level/MemberLevelApiImpl.java
index 3cd2cad65..519a8e8a1 100644
--- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/api/level/MemberLevelApiImpl.java
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/api/level/MemberLevelApiImpl.java
@@ -1,5 +1,7 @@
package cn.iocoder.yudao.module.member.api.level;
+import cn.iocoder.yudao.module.member.api.level.dto.MemberLevelRespDTO;
+import cn.iocoder.yudao.module.member.convert.level.MemberLevelConvert;
import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum;
import cn.iocoder.yudao.module.member.service.level.MemberLevelService;
import org.springframework.stereotype.Service;
@@ -22,6 +24,11 @@ public class MemberLevelApiImpl implements MemberLevelApi {
@Resource
private MemberLevelService memberLevelService;
+ @Override
+ public MemberLevelRespDTO getMemberLevel(Long id) {
+ return MemberLevelConvert.INSTANCE.convert02(memberLevelService.getLevel(id));
+ }
+
@Override
public void addExperience(Long userId, Integer experience, Integer bizType, String bizId) {
MemberExperienceBizTypeEnum bizTypeEnum = MemberExperienceBizTypeEnum.getByType(bizType);
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/convert/level/MemberLevelConvert.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/convert/level/MemberLevelConvert.java
index 073f76027..f2282815e 100644
--- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/convert/level/MemberLevelConvert.java
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/convert/level/MemberLevelConvert.java
@@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.member.convert.level;
+import cn.iocoder.yudao.module.member.api.level.dto.MemberLevelRespDTO;
import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelCreateReqVO;
import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelRespVO;
import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelSimpleRespVO;
@@ -33,4 +34,6 @@ public interface MemberLevelConvert {
List convertList02(List list);
+ MemberLevelRespDTO convert02(MemberLevelDO bean);
+
}