Commit 2a1fc61d83e06001f04a74ad8e9fe25cb42275f3

Authored by YunaiV
1 parent 218b422c

feat(trade): 按订单推广人结算一级佣金

yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageRecordService.java
... ... @@ -45,11 +45,13 @@ public interface BrokerageRecordService {
45 45 /**
46 46 * 增加佣金【多级分佣】
47 47 *
48   - * @param userId 会员编号
  48 + * @param userId 会员编号(下单人)
  49 + * @param brokerageUserId 订单推广人
49 50 * @param bizType 业务类型
50 51 * @param list 请求参数列表
51 52 */
52   - void addBrokerage(Long userId, BrokerageRecordBizTypeEnum bizType, @Valid List<BrokerageAddReqBO> list);
  53 + void addBrokerage(Long userId, Long brokerageUserId, BrokerageRecordBizTypeEnum bizType,
  54 + @Valid List<BrokerageAddReqBO> list);
53 55  
54 56 /**
55 57 * 增加佣金【只针对自己】
... ...
yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageRecordServiceImpl.java
... ... @@ -74,16 +74,18 @@ public class BrokerageRecordServiceImpl implements BrokerageRecordService {
74 74  
75 75 @Override
76 76 @Transactional(rollbackFor = Exception.class)
77   - public void addBrokerage(Long userId, BrokerageRecordBizTypeEnum bizType, List<BrokerageAddReqBO> list) {
  77 + public void addBrokerage(Long userId, Long brokerageUserId, BrokerageRecordBizTypeEnum bizType,
  78 + List<BrokerageAddReqBO> list) {
78 79 TradeConfigDO memberConfig = tradeConfigService.getTradeConfig();
79 80 // 0 未启用分销功能
80 81 if (memberConfig == null || !BooleanUtil.isTrue(memberConfig.getBrokerageEnabled())) {
81   - log.error("[addBrokerage][增加佣金失败:brokerageEnabled 未配置,userId({}) bizType({}) list({})", userId, bizType, list);
  82 + log.error("[addBrokerage][增加佣金失败:brokerageEnabled 未配置,userId({}) brokerageUserId({}) bizType({}) list({})",
  83 + userId, brokerageUserId, bizType, list);
82 84 return;
83 85 }
84 86  
85 87 // 1.1 获得一级推广人
86   - BrokerageUserDO firstUser = brokerageUserService.getBindBrokerageUser(userId);
  88 + BrokerageUserDO firstUser = brokerageUserService.getBrokerageUser(brokerageUserId);
87 89 if (firstUser == null || !BooleanUtil.isTrue(firstUser.getBrokerageEnabled())) {
88 90 return;
89 91 }
... ...
yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeBrokerageOrderHandler.java
... ... @@ -58,7 +58,7 @@ public class TradeBrokerageOrderHandler implements TradeOrderHandler {
58 58 if (order.getBrokerageUserId() == null) {
59 59 return;
60 60 }
61   - addBrokerage(order.getUserId(), orderItems);
  61 + addBrokerage(order.getUserId(), order.getBrokerageUserId(), orderItems);
62 62 }
63 63  
64 64 @Override
... ... @@ -97,9 +97,10 @@ public class TradeBrokerageOrderHandler implements TradeOrderHandler {
97 97 * 2. 支付 or 下单成功时,创建分销记录(冻结),确认收货解冻或者 n 天后解冻
98 98 *
99 99 * @param userId 用户编号
  100 + * @param brokerageUserId 订单推广人
100 101 * @param orderItems 订单项
101 102 */
102   - protected void addBrokerage(Long userId, List<TradeOrderItemDO> orderItems) {
  103 + protected void addBrokerage(Long userId, Long brokerageUserId, List<TradeOrderItemDO> orderItems) {
103 104 MemberUserRespDTO user = memberUserApi.getUser(userId);
104 105 Assert.notNull(user);
105 106 Map<Long, ProductSpuRespDTO> spusMap = productSpuApi.getSpuMap(convertList(orderItems, TradeOrderItemDO::getSpuId));
... ... @@ -113,7 +114,7 @@ public class TradeBrokerageOrderHandler implements TradeOrderHandler {
113 114 Assert.notNull(sku);
114 115 return TradeOrderConvert.INSTANCE.convert(user, item, spu, sku);
115 116 });
116   - brokerageRecordService.addBrokerage(userId, BrokerageRecordBizTypeEnum.ORDER, addList);
  117 + brokerageRecordService.addBrokerage(userId, brokerageUserId, BrokerageRecordBizTypeEnum.ORDER, addList);
117 118 }
118 119  
119 120 }
... ...
yudao-module-mall/yudao-module-trade/src/test/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageRecordServiceImplTest.java
... ... @@ -11,10 +11,12 @@ import cn.iocoder.yudao.module.product.api.spu.dto.ProductSpuRespDTO;
11 11 import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.record.BrokerageRecordPageReqVO;
12 12 import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.record.AppBrokerageProductPriceRespVO;
13 13 import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageRecordDO;
  14 +import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageUserDO;
14 15 import cn.iocoder.yudao.module.trade.dal.dataobject.config.TradeConfigDO;
15 16 import cn.iocoder.yudao.module.trade.dal.mysql.brokerage.BrokerageRecordMapper;
16 17 import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordBizTypeEnum;
17 18 import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordStatusEnum;
  19 +import cn.iocoder.yudao.module.trade.service.brokerage.bo.BrokerageAddReqBO;
18 20 import cn.iocoder.yudao.module.trade.service.config.TradeConfigService;
19 21 import jakarta.annotation.Resource;
20 22 import org.junit.jupiter.api.Test;
... ... @@ -22,6 +24,7 @@ import org.springframework.context.annotation.Import;
22 24 import org.springframework.test.context.bean.override.mockito.MockitoBean;
23 25  
24 26 import java.math.RoundingMode;
  27 +import java.util.List;
25 28  
26 29 import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime;
27 30 import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildTime;
... ... @@ -30,6 +33,7 @@ import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEq
30 33 import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
31 34 import static org.junit.jupiter.api.Assertions.assertEquals;
32 35 import static org.junit.jupiter.api.Assertions.assertTrue;
  36 +import static org.mockito.Mockito.verify;
33 37 import static org.mockito.Mockito.when;
34 38  
35 39 /**
... ... @@ -97,6 +101,26 @@ public class BrokerageRecordServiceImplTest extends BaseDbUnitTest {
97 101 }
98 102  
99 103 @Test
  104 + public void testAddBrokerage_usesOrderBrokerageUser() {
  105 + TradeConfigDO tradeConfig = new TradeConfigDO();
  106 + tradeConfig.setBrokerageEnabled(true);
  107 + tradeConfig.setBrokerageFirstPercent(10);
  108 + when(tradeConfigService.getTradeConfig()).thenReturn(tradeConfig);
  109 + BrokerageUserDO orderBrokerageUser = new BrokerageUserDO().setId(200L).setBrokerageEnabled(true)
  110 + .setBrokeragePrice(0);
  111 + when(brokerageUserService.getBrokerageUser(200L)).thenReturn(orderBrokerageUser);
  112 +
  113 + brokerageRecordService.addBrokerage(100L, 200L, BrokerageRecordBizTypeEnum.ORDER,
  114 + ListUtil.of(new BrokerageAddReqBO("1", 1000, null, null, 100L, "订单商品")));
  115 +
  116 + List<BrokerageRecordDO> records = brokerageRecordMapper.selectList(null);
  117 + assertEquals(1, records.size());
  118 + assertEquals(200L, records.get(0).getUserId());
  119 + assertEquals(100, records.get(0).getPrice());
  120 + verify(brokerageUserService).updateUserPrice(200L, 100);
  121 + }
  122 +
  123 + @Test
100 124 public void testCalculatePrice_useFixedPrice() {
101 125 // mock 数据
102 126 Integer payPrice = 1000;
... ...