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,11 +45,13 @@ public interface BrokerageRecordService {
45 /** 45 /**
46 * 增加佣金【多级分佣】 46 * 增加佣金【多级分佣】
47 * 47 *
48 - * @param userId 会员编号 48 + * @param userId 会员编号(下单人)
  49 + * @param brokerageUserId 订单推广人
49 * @param bizType 业务类型 50 * @param bizType 业务类型
50 * @param list 请求参数列表 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,16 +74,18 @@ public class BrokerageRecordServiceImpl implements BrokerageRecordService {
74 74
75 @Override 75 @Override
76 @Transactional(rollbackFor = Exception.class) 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 TradeConfigDO memberConfig = tradeConfigService.getTradeConfig(); 79 TradeConfigDO memberConfig = tradeConfigService.getTradeConfig();
79 // 0 未启用分销功能 80 // 0 未启用分销功能
80 if (memberConfig == null || !BooleanUtil.isTrue(memberConfig.getBrokerageEnabled())) { 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 return; 84 return;
83 } 85 }
84 86
85 // 1.1 获得一级推广人 87 // 1.1 获得一级推广人
86 - BrokerageUserDO firstUser = brokerageUserService.getBindBrokerageUser(userId); 88 + BrokerageUserDO firstUser = brokerageUserService.getBrokerageUser(brokerageUserId);
87 if (firstUser == null || !BooleanUtil.isTrue(firstUser.getBrokerageEnabled())) { 89 if (firstUser == null || !BooleanUtil.isTrue(firstUser.getBrokerageEnabled())) {
88 return; 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,7 +58,7 @@ public class TradeBrokerageOrderHandler implements TradeOrderHandler {
58 if (order.getBrokerageUserId() == null) { 58 if (order.getBrokerageUserId() == null) {
59 return; 59 return;
60 } 60 }
61 - addBrokerage(order.getUserId(), orderItems); 61 + addBrokerage(order.getUserId(), order.getBrokerageUserId(), orderItems);
62 } 62 }
63 63
64 @Override 64 @Override
@@ -97,9 +97,10 @@ public class TradeBrokerageOrderHandler implements TradeOrderHandler { @@ -97,9 +97,10 @@ public class TradeBrokerageOrderHandler implements TradeOrderHandler {
97 * 2. 支付 or 下单成功时,创建分销记录(冻结),确认收货解冻或者 n 天后解冻 97 * 2. 支付 or 下单成功时,创建分销记录(冻结),确认收货解冻或者 n 天后解冻
98 * 98 *
99 * @param userId 用户编号 99 * @param userId 用户编号
  100 + * @param brokerageUserId 订单推广人
100 * @param orderItems 订单项 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 MemberUserRespDTO user = memberUserApi.getUser(userId); 104 MemberUserRespDTO user = memberUserApi.getUser(userId);
104 Assert.notNull(user); 105 Assert.notNull(user);
105 Map<Long, ProductSpuRespDTO> spusMap = productSpuApi.getSpuMap(convertList(orderItems, TradeOrderItemDO::getSpuId)); 106 Map<Long, ProductSpuRespDTO> spusMap = productSpuApi.getSpuMap(convertList(orderItems, TradeOrderItemDO::getSpuId));
@@ -113,7 +114,7 @@ public class TradeBrokerageOrderHandler implements TradeOrderHandler { @@ -113,7 +114,7 @@ public class TradeBrokerageOrderHandler implements TradeOrderHandler {
113 Assert.notNull(sku); 114 Assert.notNull(sku);
114 return TradeOrderConvert.INSTANCE.convert(user, item, spu, sku); 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,10 +11,12 @@ import cn.iocoder.yudao.module.product.api.spu.dto.ProductSpuRespDTO;
11 import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.record.BrokerageRecordPageReqVO; 11 import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.record.BrokerageRecordPageReqVO;
12 import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.record.AppBrokerageProductPriceRespVO; 12 import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.record.AppBrokerageProductPriceRespVO;
13 import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageRecordDO; 13 import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageRecordDO;
  14 +import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageUserDO;
14 import cn.iocoder.yudao.module.trade.dal.dataobject.config.TradeConfigDO; 15 import cn.iocoder.yudao.module.trade.dal.dataobject.config.TradeConfigDO;
15 import cn.iocoder.yudao.module.trade.dal.mysql.brokerage.BrokerageRecordMapper; 16 import cn.iocoder.yudao.module.trade.dal.mysql.brokerage.BrokerageRecordMapper;
16 import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordBizTypeEnum; 17 import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordBizTypeEnum;
17 import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordStatusEnum; 18 import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordStatusEnum;
  19 +import cn.iocoder.yudao.module.trade.service.brokerage.bo.BrokerageAddReqBO;
18 import cn.iocoder.yudao.module.trade.service.config.TradeConfigService; 20 import cn.iocoder.yudao.module.trade.service.config.TradeConfigService;
19 import jakarta.annotation.Resource; 21 import jakarta.annotation.Resource;
20 import org.junit.jupiter.api.Test; 22 import org.junit.jupiter.api.Test;
@@ -22,6 +24,7 @@ import org.springframework.context.annotation.Import; @@ -22,6 +24,7 @@ import org.springframework.context.annotation.Import;
22 import org.springframework.test.context.bean.override.mockito.MockitoBean; 24 import org.springframework.test.context.bean.override.mockito.MockitoBean;
23 25
24 import java.math.RoundingMode; 26 import java.math.RoundingMode;
  27 +import java.util.List;
25 28
26 import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime; 29 import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime;
27 import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildTime; 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,6 +33,7 @@ import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEq
30 import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; 33 import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
31 import static org.junit.jupiter.api.Assertions.assertEquals; 34 import static org.junit.jupiter.api.Assertions.assertEquals;
32 import static org.junit.jupiter.api.Assertions.assertTrue; 35 import static org.junit.jupiter.api.Assertions.assertTrue;
  36 +import static org.mockito.Mockito.verify;
33 import static org.mockito.Mockito.when; 37 import static org.mockito.Mockito.when;
34 38
35 /** 39 /**
@@ -97,6 +101,26 @@ public class BrokerageRecordServiceImplTest extends BaseDbUnitTest { @@ -97,6 +101,26 @@ public class BrokerageRecordServiceImplTest extends BaseDbUnitTest {
97 } 101 }
98 102
99 @Test 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 public void testCalculatePrice_useFixedPrice() { 124 public void testCalculatePrice_useFixedPrice() {
101 // mock 数据 125 // mock 数据
102 Integer payPrice = 1000; 126 Integer payPrice = 1000;