Commit 53e789dfdcfe27c7cf43d96f194e2237d6dea22f

Authored by YunaiV
1 parent aa5525d1

trade:订单表,增加 vip 优惠字段

Showing 14 changed files with 297 additions and 4 deletions
yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/common/PromotionTypeEnum.java
@@ -22,7 +22,7 @@ public enum PromotionTypeEnum implements IntArrayValuable { @@ -22,7 +22,7 @@ public enum PromotionTypeEnum implements IntArrayValuable {
22 DISCOUNT_ACTIVITY(4, "限时折扣"), 22 DISCOUNT_ACTIVITY(4, "限时折扣"),
23 REWARD_ACTIVITY(5, "满减送"), 23 REWARD_ACTIVITY(5, "满减送"),
24 24
25 - MEMBER(6, "会员折扣"), 25 + MEMBER_LEVEL(6, "会员折扣"),
26 COUPON(7, "优惠劵") 26 COUPON(7, "优惠劵")
27 ; 27 ;
28 28
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/order/TradeOrderConvert.java
@@ -65,6 +65,7 @@ public interface TradeOrderConvert { @@ -65,6 +65,7 @@ public interface TradeOrderConvert {
65 @Mapping(source = "calculateRespBO.price.deliveryPrice", target = "deliveryPrice"), 65 @Mapping(source = "calculateRespBO.price.deliveryPrice", target = "deliveryPrice"),
66 @Mapping(source = "calculateRespBO.price.couponPrice", target = "couponPrice"), 66 @Mapping(source = "calculateRespBO.price.couponPrice", target = "couponPrice"),
67 @Mapping(source = "calculateRespBO.price.pointPrice", target = "pointPrice"), 67 @Mapping(source = "calculateRespBO.price.pointPrice", target = "pointPrice"),
  68 + @Mapping(source = "calculateRespBO.price.vipPrice", target = "vipPrice"),
68 @Mapping(source = "calculateRespBO.price.payPrice", target = "payPrice") 69 @Mapping(source = "calculateRespBO.price.payPrice", target = "payPrice")
69 }) 70 })
70 TradeOrderDO convert(Long userId, String userIp, AppTradeOrderCreateReqVO createReqVO, 71 TradeOrderDO convert(Long userId, String userIp, AppTradeOrderCreateReqVO createReqVO,
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/order/TradeOrderDO.java
@@ -168,6 +168,7 @@ public class TradeOrderDO extends BaseDO { @@ -168,6 +168,7 @@ public class TradeOrderDO extends BaseDO {
168 * - {@link #discountPrice} 168 * - {@link #discountPrice}
169 * + {@link #deliveryPrice} 169 * + {@link #deliveryPrice}
170 * + {@link #adjustPrice} 170 * + {@link #adjustPrice}
  171 + * - {@link #vipPrice}
171 */ 172 */
172 private Integer payPrice; 173 private Integer payPrice;
173 174
@@ -269,5 +270,9 @@ public class TradeOrderDO extends BaseDO { @@ -269,5 +270,9 @@ public class TradeOrderDO extends BaseDO {
269 // * 奖励的积分 TODO 疯狂:可以使用这个字段哈; 270 // * 奖励的积分 TODO 疯狂:可以使用这个字段哈;
270 // */ 271 // */
271 // private Integer rewardPoint; 272 // private Integer rewardPoint;
  273 + /**
  274 + * VIP 减免金额,单位:分
  275 + */
  276 + private Integer vipPrice;
272 277
273 } 278 }
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/order/TradeOrderItemDO.java
@@ -126,6 +126,7 @@ public class TradeOrderItemDO extends BaseDO { @@ -126,6 +126,7 @@ public class TradeOrderItemDO extends BaseDO {
126 * - {@link #discountPrice} 126 * - {@link #discountPrice}
127 * + {@link #deliveryPrice} 127 * + {@link #deliveryPrice}
128 * + {@link #adjustPrice} 128 * + {@link #adjustPrice}
  129 + * - {@link #vipPrice}
129 */ 130 */
130 private Integer payPrice; 131 private Integer payPrice;
131 132
@@ -143,6 +144,10 @@ public class TradeOrderItemDO extends BaseDO { @@ -143,6 +144,10 @@ public class TradeOrderItemDO extends BaseDO {
143 * 对应 taobao 的 trade.point_fee 字段 144 * 对应 taobao 的 trade.point_fee 字段
144 */ 145 */
145 private Integer pointPrice; 146 private Integer pointPrice;
  147 + /**
  148 + * VIP 减免金额,单位:分
  149 + */
  150 + private Integer vipPrice;
146 // TODO @芋艿:如果商品 vip 折扣时,到底是新增一个 vipPrice 记录优惠记录,还是 vipDiscountPrice,记录 vip 的优惠;还是直接使用 vipPrice; 151 // TODO @芋艿:如果商品 vip 折扣时,到底是新增一个 vipPrice 记录优惠记录,还是 vipDiscountPrice,记录 vip 的优惠;还是直接使用 vipPrice;
147 // 目前 crmeb 的选择,单独一个 vipPrice 记录优惠价格;感觉不一定合理,可以在看看有赞的; 152 // 目前 crmeb 的选择,单独一个 vipPrice 记录优惠价格;感觉不一定合理,可以在看看有赞的;
148 153
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/bo/TradePriceCalculateRespBO.java
@@ -90,6 +90,10 @@ public class TradePriceCalculateRespBO { @@ -90,6 +90,10 @@ public class TradePriceCalculateRespBO {
90 */ 90 */
91 private Integer pointPrice; 91 private Integer pointPrice;
92 /** 92 /**
  93 + * VIP 减免金额,单位:分
  94 + */
  95 + private Integer vipPrice;
  96 + /**
93 * 最终购买金额(总),单位:分 97 * 最终购买金额(总),单位:分
94 * 98 *
95 * = {@link #totalPrice} 99 * = {@link #totalPrice}
@@ -97,6 +101,7 @@ public class TradePriceCalculateRespBO { @@ -97,6 +101,7 @@ public class TradePriceCalculateRespBO {
97 * - {@link #pointPrice} 101 * - {@link #pointPrice}
98 * - {@link #discountPrice} 102 * - {@link #discountPrice}
99 * + {@link #deliveryPrice} 103 * + {@link #deliveryPrice}
  104 + * - {@link #vipPrice}
100 */ 105 */
101 private Integer payPrice; 106 private Integer payPrice;
102 107
@@ -159,6 +164,10 @@ public class TradePriceCalculateRespBO { @@ -159,6 +164,10 @@ public class TradePriceCalculateRespBO {
159 */ 164 */
160 private Integer pointPrice; 165 private Integer pointPrice;
161 /** 166 /**
  167 + * VIP 减免金额,单位:分
  168 + */
  169 + private Integer vipPrice;
  170 + /**
162 * 应付金额(总),单位:分 171 * 应付金额(总),单位:分
163 * 172 *
164 * = {@link #price} * {@link #count} 173 * = {@link #price} * {@link #count}
@@ -166,6 +175,7 @@ public class TradePriceCalculateRespBO { @@ -166,6 +175,7 @@ public class TradePriceCalculateRespBO {
166 * - {@link #pointPrice} 175 * - {@link #pointPrice}
167 * - {@link #discountPrice} 176 * - {@link #discountPrice}
168 * + {@link #deliveryPrice} 177 * + {@link #deliveryPrice}
  178 + * - {@link #vipPrice}
169 */ 179 */
170 private Integer payPrice; 180 private Integer payPrice;
171 181
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeMemberLevelPriceCalculator.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.price.calculator;
  2 +
  3 +import cn.iocoder.yudao.module.member.api.level.MemberLevelApi;
  4 +import cn.iocoder.yudao.module.member.api.level.dto.MemberLevelRespDTO;
  5 +import cn.iocoder.yudao.module.member.api.user.MemberUserApi;
  6 +import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
  7 +import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum;
  8 +import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO;
  9 +import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO;
  10 +import org.springframework.core.annotation.Order;
  11 +import org.springframework.stereotype.Component;
  12 +
  13 +import javax.annotation.Resource;
  14 +
  15 +import static cn.iocoder.yudao.module.trade.service.price.calculator.TradePriceCalculatorHelper.formatPrice;
  16 +
  17 +/**
  18 + * 会员 VIP 折扣的 {@link TradePriceCalculator} 实现类
  19 + *
  20 + * @author 芋道源码
  21 + */
  22 +@Component
  23 +@Order(TradePriceCalculator.ORDER_MEMBER_LEVEL)
  24 +public class TradeMemberLevelPriceCalculator implements TradePriceCalculator {
  25 +
  26 + @Resource
  27 + private MemberLevelApi memberLevelApi;
  28 + @Resource
  29 + private MemberUserApi memberUserApi;
  30 +
  31 + @Override
  32 + public void calculate(TradePriceCalculateReqBO param, TradePriceCalculateRespBO result) {
  33 + // 1. 获得用户的会员等级
  34 + MemberUserRespDTO user = memberUserApi.getUser(param.getUserId());
  35 + if (user.getLevelId() == null || user.getLevelId() <= 0) {
  36 + return;
  37 + }
  38 + MemberLevelRespDTO level = memberLevelApi.getMemberLevel(user.getLevelId());
  39 + if (level == null || level.getDiscountPercent() == null) {
  40 + return;
  41 + }
  42 +
  43 + // 2. 计算每个 SKU 的优惠金额
  44 + result.getItems().forEach(orderItem -> {
  45 + // 2.1 计算优惠金额
  46 + Integer vipPrice = calculateVipPrice(orderItem.getPayPrice(), level.getDiscountPercent());
  47 + if (vipPrice <= 0) {
  48 + return;
  49 + }
  50 +
  51 + // 2.2 记录优惠明细
  52 + if (orderItem.getSelected()) {
  53 + // 注意,只有在选中的情况下,才会记录到优惠明细。否则仅仅是更新 SKU 优惠金额,用于展示
  54 + TradePriceCalculatorHelper.addPromotion(result, orderItem,
  55 + level.getId(), level.getName(), PromotionTypeEnum.MEMBER_LEVEL.getType(),
  56 + String.format("会员等级折扣:省 %s 元", formatPrice(vipPrice)),
  57 + vipPrice);
  58 + }
  59 +
  60 + // 2.3 更新 SKU 的优惠金额
  61 + orderItem.setVipPrice(vipPrice);
  62 + TradePriceCalculatorHelper.recountPayPrice(orderItem);
  63 + });
  64 + TradePriceCalculatorHelper.recountAllPrice(result);
  65 + }
  66 +
  67 + /**
  68 + * 计算会员 VIP 优惠价格
  69 + *
  70 + * @param price 原价
  71 + * @param discountPercent 折扣
  72 + * @return 优惠价格
  73 + */
  74 + public Integer calculateVipPrice(Integer price, Integer discountPercent) {
  75 + if (discountPercent == null) {
  76 + return 0;
  77 + }
  78 + Integer newPrice = price * discountPercent / 100;
  79 + return price - newPrice;
  80 + }
  81 +
  82 +}
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; @@ -13,6 +13,7 @@ import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO;
13 */ 13 */
14 public interface TradePriceCalculator { 14 public interface TradePriceCalculator {
15 15
  16 + int ORDER_MEMBER_LEVEL = 5;
16 int ORDER_DISCOUNT_ACTIVITY = 10; 17 int ORDER_DISCOUNT_ACTIVITY = 10;
17 int ORDER_REWARD_ACTIVITY = 20; 18 int ORDER_REWARD_ACTIVITY = 20;
18 int ORDER_COUPON = 30; 19 int ORDER_COUPON = 30;
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 { @@ -52,7 +52,7 @@ public class TradePriceCalculatorHelper {
52 .setCount(item.getCount()).setCartId(item.getCartId()).setSelected(item.getSelected()); 52 .setCount(item.getCount()).setCartId(item.getCartId()).setSelected(item.getSelected());
53 // sku 价格 53 // sku 价格
54 orderItem.setPrice(sku.getPrice()).setPayPrice(sku.getPrice() * item.getCount()) 54 orderItem.setPrice(sku.getPrice()).setPayPrice(sku.getPrice() * item.getCount())
55 - .setDiscountPrice(0).setDeliveryPrice(0).setCouponPrice(0).setPointPrice(0); 55 + .setDiscountPrice(0).setDeliveryPrice(0).setCouponPrice(0).setPointPrice(0).setVipPrice(0);
56 // sku 信息 56 // sku 信息
57 orderItem.setPicUrl(sku.getPicUrl()).setProperties(sku.getProperties()) 57 orderItem.setPicUrl(sku.getPicUrl()).setProperties(sku.getProperties())
58 .setWeight(sku.getWeight()).setVolume(sku.getVolume()); 58 .setWeight(sku.getWeight()).setVolume(sku.getVolume());
@@ -96,7 +96,7 @@ public class TradePriceCalculatorHelper { @@ -96,7 +96,7 @@ public class TradePriceCalculatorHelper {
96 // 先重置 96 // 先重置
97 TradePriceCalculateRespBO.Price price = result.getPrice(); 97 TradePriceCalculateRespBO.Price price = result.getPrice();
98 price.setTotalPrice(0).setDiscountPrice(0).setDeliveryPrice(0) 98 price.setTotalPrice(0).setDiscountPrice(0).setDeliveryPrice(0)
99 - .setCouponPrice(0).setPointPrice(0).setPayPrice(0); 99 + .setCouponPrice(0).setPointPrice(0).setVipPrice(0).setPayPrice(0);
100 // 再合计 item 100 // 再合计 item
101 result.getItems().forEach(item -> { 101 result.getItems().forEach(item -> {
102 if (!item.getSelected()) { 102 if (!item.getSelected()) {
@@ -107,6 +107,7 @@ public class TradePriceCalculatorHelper { @@ -107,6 +107,7 @@ public class TradePriceCalculatorHelper {
107 price.setDeliveryPrice(price.getDeliveryPrice() + item.getDeliveryPrice()); 107 price.setDeliveryPrice(price.getDeliveryPrice() + item.getDeliveryPrice());
108 price.setCouponPrice(price.getCouponPrice() + item.getCouponPrice()); 108 price.setCouponPrice(price.getCouponPrice() + item.getCouponPrice());
109 price.setPointPrice(price.getPointPrice() + item.getPointPrice()); 109 price.setPointPrice(price.getPointPrice() + item.getPointPrice());
  110 + price.setVipPrice(price.getVipPrice() + item.getVipPrice());
110 price.setPayPrice(price.getPayPrice() + item.getPayPrice()); 111 price.setPayPrice(price.getPayPrice() + item.getPayPrice());
111 }); 112 });
112 } 113 }
@@ -121,7 +122,9 @@ public class TradePriceCalculatorHelper { @@ -121,7 +122,9 @@ public class TradePriceCalculatorHelper {
121 - orderItem.getDiscountPrice() 122 - orderItem.getDiscountPrice()
122 + orderItem.getDeliveryPrice() 123 + orderItem.getDeliveryPrice()
123 - orderItem.getCouponPrice() 124 - orderItem.getCouponPrice()
124 - - orderItem.getPointPrice()); 125 + - orderItem.getPointPrice()
  126 + - orderItem.getVipPrice()
  127 + );
125 } 128 }
126 129
127 /** 130 /**
@@ -145,6 +148,9 @@ public class TradePriceCalculatorHelper { @@ -145,6 +148,9 @@ public class TradePriceCalculatorHelper {
145 if (orderItem.getPointPrice() == null) { 148 if (orderItem.getPointPrice() == null) {
146 orderItem.setPointPrice(0); 149 orderItem.setPointPrice(0);
147 } 150 }
  151 + if (orderItem.getVipPrice() == null) {
  152 + orderItem.setVipPrice(0);
  153 + }
148 recountPayPrice(orderItem); 154 recountPayPrice(orderItem);
149 }); 155 });
150 } 156 }
yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeMemberLevelPriceCalculatorTest.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.price.calculator;
  2 +
  3 +import cn.iocoder.yudao.framework.test.core.ut.BaseMockitoUnitTest;
  4 +import cn.iocoder.yudao.module.member.api.level.MemberLevelApi;
  5 +import cn.iocoder.yudao.module.member.api.level.dto.MemberLevelRespDTO;
  6 +import cn.iocoder.yudao.module.member.api.user.MemberUserApi;
  7 +import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
  8 +import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum;
  9 +import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO;
  10 +import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO;
  11 +import org.junit.jupiter.api.Test;
  12 +import org.mockito.InjectMocks;
  13 +import org.mockito.Mock;
  14 +
  15 +import java.util.ArrayList;
  16 +
  17 +import static java.util.Arrays.asList;
  18 +import static org.junit.jupiter.api.Assertions.*;
  19 +import static org.mockito.ArgumentMatchers.eq;
  20 +import static org.mockito.Mockito.when;
  21 +
  22 +/**
  23 + * {@link TradeMemberLevelPriceCalculator} 的单元测试类
  24 + *
  25 + * @author 芋道源码
  26 + */
  27 +public class TradeMemberLevelPriceCalculatorTest extends BaseMockitoUnitTest {
  28 +
  29 + @InjectMocks
  30 + private TradeMemberLevelPriceCalculator memberLevelPriceCalculator;
  31 +
  32 + @Mock
  33 + private MemberLevelApi memberLevelApi;
  34 + @Mock
  35 + private MemberUserApi memberUserApi;
  36 +
  37 + @Test
  38 + public void testCalculate() {
  39 + // 准备参数
  40 + TradePriceCalculateReqBO param = new TradePriceCalculateReqBO()
  41 + .setUserId(1024L)
  42 + .setItems(asList(
  43 + new TradePriceCalculateReqBO.Item().setSkuId(10L).setCount(2).setSelected(true), // 匹配活动,且已选中
  44 + new TradePriceCalculateReqBO.Item().setSkuId(20L).setCount(3).setSelected(false) // 匹配活动,但未选中
  45 + ));
  46 + TradePriceCalculateRespBO result = new TradePriceCalculateRespBO()
  47 + .setPrice(new TradePriceCalculateRespBO.Price())
  48 + .setPromotions(new ArrayList<>())
  49 + .setItems(asList(
  50 + new TradePriceCalculateRespBO.OrderItem().setSkuId(10L).setCount(2).setSelected(true)
  51 + .setPrice(100),
  52 + new TradePriceCalculateRespBO.OrderItem().setSkuId(20L).setCount(3).setSelected(false)
  53 + .setPrice(50)
  54 + ));
  55 + // 保证价格被初始化上
  56 + TradePriceCalculatorHelper.recountPayPrice(result.getItems());
  57 + TradePriceCalculatorHelper.recountAllPrice(result);
  58 +
  59 + // mock 方法(会员等级)
  60 + when(memberUserApi.getUser(eq(1024L))).thenReturn(new MemberUserRespDTO().setLevelId(2048L));
  61 + when(memberLevelApi.getMemberLevel(eq(2048L))).thenReturn(
  62 + new MemberLevelRespDTO().setId(2048L).setName("VIP 会员").setDiscountPercent(60));
  63 +
  64 + // 调用
  65 + memberLevelPriceCalculator.calculate(param, result);
  66 + // 断言:Price 部分
  67 + TradePriceCalculateRespBO.Price price = result.getPrice();
  68 + assertEquals(price.getTotalPrice(), 200);
  69 + assertEquals(price.getDiscountPrice(), 0);
  70 + assertEquals(price.getPointPrice(), 0);
  71 + assertEquals(price.getDeliveryPrice(), 0);
  72 + assertEquals(price.getCouponPrice(), 0);
  73 + assertEquals(price.getVipPrice(), 80);
  74 + assertEquals(price.getPayPrice(), 120);
  75 + assertNull(result.getCouponId());
  76 + // 断言:SKU 1
  77 + assertEquals(result.getItems().size(), 2);
  78 + TradePriceCalculateRespBO.OrderItem orderItem01 = result.getItems().get(0);
  79 + assertEquals(orderItem01.getSkuId(), 10L);
  80 + assertEquals(orderItem01.getCount(), 2);
  81 + assertEquals(orderItem01.getPrice(), 100);
  82 + assertEquals(orderItem01.getDiscountPrice(), 0);
  83 + assertEquals(orderItem01.getDeliveryPrice(), 0);
  84 + assertEquals(orderItem01.getCouponPrice(), 0);
  85 + assertEquals(orderItem01.getPointPrice(), 0);
  86 + assertEquals(orderItem01.getVipPrice(), 80);
  87 + assertEquals(orderItem01.getPayPrice(), 120);
  88 + // 断言:SKU 2
  89 + TradePriceCalculateRespBO.OrderItem orderItem02 = result.getItems().get(1);
  90 + assertEquals(orderItem02.getSkuId(), 20L);
  91 + assertEquals(orderItem02.getCount(), 3);
  92 + assertEquals(orderItem02.getPrice(), 50);
  93 + assertEquals(orderItem02.getDiscountPrice(), 0);
  94 + assertEquals(orderItem02.getDeliveryPrice(), 0);
  95 + assertEquals(orderItem02.getCouponPrice(), 0);
  96 + assertEquals(orderItem02.getPointPrice(), 0);
  97 + assertEquals(orderItem02.getVipPrice(), 60);
  98 + assertEquals(orderItem02.getPayPrice(), 90);
  99 + // 断言:Promotion 部分
  100 + assertEquals(result.getPromotions().size(), 1);
  101 + TradePriceCalculateRespBO.Promotion promotion01 = result.getPromotions().get(0);
  102 + assertEquals(promotion01.getId(), 2048L);
  103 + assertEquals(promotion01.getName(), "VIP 会员");
  104 + assertEquals(promotion01.getType(), PromotionTypeEnum.MEMBER_LEVEL.getType());
  105 + assertEquals(promotion01.getTotalPrice(), 200);
  106 + assertEquals(promotion01.getDiscountPrice(), 80);
  107 + assertTrue(promotion01.getMatch());
  108 + assertEquals(promotion01.getDescription(), "会员等级折扣:省 0.80 元");
  109 + TradePriceCalculateRespBO.PromotionItem promotionItem01 = promotion01.getItems().get(0);
  110 + assertEquals(promotion01.getItems().size(), 1);
  111 + assertEquals(promotionItem01.getSkuId(), 10L);
  112 + assertEquals(promotionItem01.getTotalPrice(), 200);
  113 + assertEquals(promotionItem01.getDiscountPrice(), 80);
  114 + }
  115 +
  116 +}
yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/level/MemberLevelApi.java
1 package cn.iocoder.yudao.module.member.api.level; 1 package cn.iocoder.yudao.module.member.api.level;
2 2
  3 +import cn.iocoder.yudao.module.member.api.level.dto.MemberLevelRespDTO;
3 import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum; 4 import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum;
4 5
5 /** 6 /**
@@ -10,6 +11,14 @@ import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum; @@ -10,6 +11,14 @@ import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum;
10 public interface MemberLevelApi { 11 public interface MemberLevelApi {
11 12
12 /** 13 /**
  14 + * 获得会员等级
  15 + *
  16 + * @param id 会员等级编号
  17 + * @return 会员等级
  18 + */
  19 + MemberLevelRespDTO getMemberLevel(Long id);
  20 +
  21 + /**
13 * 增加会员经验 22 * 增加会员经验
14 * 23 *
15 * @param userId 会员ID 24 * @param userId 会员ID
yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/level/dto/MemberLevelRespDTO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.member.api.level.dto;
  2 +
  3 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
  4 +import lombok.Data;
  5 +
  6 +/**
  7 + * 会员等级 Resp DTO
  8 + *
  9 + * @author 芋道源码
  10 + */
  11 +@Data
  12 +public class MemberLevelRespDTO {
  13 +
  14 + /**
  15 + * 编号
  16 + */
  17 + private Long id;
  18 + /**
  19 + * 等级名称
  20 + */
  21 + private String name;
  22 + /**
  23 + * 等级
  24 + */
  25 + private Integer level;
  26 + /**
  27 + * 升级经验
  28 + */
  29 + private Integer experience;
  30 + /**
  31 + * 享受折扣
  32 + */
  33 + private Integer discountPercent;
  34 + /**
  35 + * 状态
  36 + *
  37 + * 枚举 {@link CommonStatusEnum}
  38 + */
  39 + private Integer status;
  40 +
  41 +}
yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/dto/MemberUserRespDTO.java
@@ -34,4 +34,11 @@ public class MemberUserRespDTO { @@ -34,4 +34,11 @@ public class MemberUserRespDTO {
34 */ 34 */
35 private String mobile; 35 private String mobile;
36 36
  37 + // ========== 其它信息 ==========
  38 +
  39 + /**
  40 + * 会员级别编号
  41 + */
  42 + private Long levelId;
  43 +
37 } 44 }
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/api/level/MemberLevelApiImpl.java
1 package cn.iocoder.yudao.module.member.api.level; 1 package cn.iocoder.yudao.module.member.api.level;
2 2
  3 +import cn.iocoder.yudao.module.member.api.level.dto.MemberLevelRespDTO;
  4 +import cn.iocoder.yudao.module.member.convert.level.MemberLevelConvert;
3 import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum; 5 import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum;
4 import cn.iocoder.yudao.module.member.service.level.MemberLevelService; 6 import cn.iocoder.yudao.module.member.service.level.MemberLevelService;
5 import org.springframework.stereotype.Service; 7 import org.springframework.stereotype.Service;
@@ -23,6 +25,11 @@ public class MemberLevelApiImpl implements MemberLevelApi { @@ -23,6 +25,11 @@ public class MemberLevelApiImpl implements MemberLevelApi {
23 private MemberLevelService memberLevelService; 25 private MemberLevelService memberLevelService;
24 26
25 @Override 27 @Override
  28 + public MemberLevelRespDTO getMemberLevel(Long id) {
  29 + return MemberLevelConvert.INSTANCE.convert02(memberLevelService.getLevel(id));
  30 + }
  31 +
  32 + @Override
26 public void addExperience(Long userId, Integer experience, Integer bizType, String bizId) { 33 public void addExperience(Long userId, Integer experience, Integer bizType, String bizId) {
27 MemberExperienceBizTypeEnum bizTypeEnum = MemberExperienceBizTypeEnum.getByType(bizType); 34 MemberExperienceBizTypeEnum bizTypeEnum = MemberExperienceBizTypeEnum.getByType(bizType);
28 if (bizTypeEnum == null) { 35 if (bizTypeEnum == null) {
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/convert/level/MemberLevelConvert.java
1 package cn.iocoder.yudao.module.member.convert.level; 1 package cn.iocoder.yudao.module.member.convert.level;
2 2
  3 +import cn.iocoder.yudao.module.member.api.level.dto.MemberLevelRespDTO;
3 import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelCreateReqVO; 4 import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelCreateReqVO;
4 import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelRespVO; 5 import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelRespVO;
5 import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelSimpleRespVO; 6 import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelSimpleRespVO;
@@ -33,4 +34,6 @@ public interface MemberLevelConvert { @@ -33,4 +34,6 @@ public interface MemberLevelConvert {
33 34
34 List<AppMemberLevelRespVO> convertList02(List<MemberLevelDO> list); 35 List<AppMemberLevelRespVO> convertList02(List<MemberLevelDO> list);
35 36
  37 + MemberLevelRespDTO convert02(MemberLevelDO bean);
  38 +
36 } 39 }