diff --git a/yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageRecordService.java b/yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageRecordService.java index bc1f3aa..5f1cb38 100644 --- a/yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageRecordService.java +++ b/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 { /** * 增加佣金【多级分佣】 * - * @param userId 会员编号 + * @param userId 会员编号(下单人) + * @param brokerageUserId 订单推广人 * @param bizType 业务类型 * @param list 请求参数列表 */ - void addBrokerage(Long userId, BrokerageRecordBizTypeEnum bizType, @Valid List list); + void addBrokerage(Long userId, Long brokerageUserId, BrokerageRecordBizTypeEnum bizType, + @Valid List list); /** * 增加佣金【只针对自己】 diff --git a/yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageRecordServiceImpl.java b/yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageRecordServiceImpl.java index 845fea7..75da49c 100644 --- a/yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageRecordServiceImpl.java +++ b/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 { @Override @Transactional(rollbackFor = Exception.class) - public void addBrokerage(Long userId, BrokerageRecordBizTypeEnum bizType, List list) { + public void addBrokerage(Long userId, Long brokerageUserId, BrokerageRecordBizTypeEnum bizType, + List list) { TradeConfigDO memberConfig = tradeConfigService.getTradeConfig(); // 0 未启用分销功能 if (memberConfig == null || !BooleanUtil.isTrue(memberConfig.getBrokerageEnabled())) { - log.error("[addBrokerage][增加佣金失败:brokerageEnabled 未配置,userId({}) bizType({}) list({})", userId, bizType, list); + log.error("[addBrokerage][增加佣金失败:brokerageEnabled 未配置,userId({}) brokerageUserId({}) bizType({}) list({})", + userId, brokerageUserId, bizType, list); return; } // 1.1 获得一级推广人 - BrokerageUserDO firstUser = brokerageUserService.getBindBrokerageUser(userId); + BrokerageUserDO firstUser = brokerageUserService.getBrokerageUser(brokerageUserId); if (firstUser == null || !BooleanUtil.isTrue(firstUser.getBrokerageEnabled())) { return; } diff --git a/yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeBrokerageOrderHandler.java b/yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeBrokerageOrderHandler.java index 36d3140..a5355ca 100644 --- a/yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeBrokerageOrderHandler.java +++ b/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 { if (order.getBrokerageUserId() == null) { return; } - addBrokerage(order.getUserId(), orderItems); + addBrokerage(order.getUserId(), order.getBrokerageUserId(), orderItems); } @Override @@ -97,9 +97,10 @@ public class TradeBrokerageOrderHandler implements TradeOrderHandler { * 2. 支付 or 下单成功时,创建分销记录(冻结),确认收货解冻或者 n 天后解冻 * * @param userId 用户编号 + * @param brokerageUserId 订单推广人 * @param orderItems 订单项 */ - protected void addBrokerage(Long userId, List orderItems) { + protected void addBrokerage(Long userId, Long brokerageUserId, List orderItems) { MemberUserRespDTO user = memberUserApi.getUser(userId); Assert.notNull(user); Map spusMap = productSpuApi.getSpuMap(convertList(orderItems, TradeOrderItemDO::getSpuId)); @@ -113,7 +114,7 @@ public class TradeBrokerageOrderHandler implements TradeOrderHandler { Assert.notNull(sku); return TradeOrderConvert.INSTANCE.convert(user, item, spu, sku); }); - brokerageRecordService.addBrokerage(userId, BrokerageRecordBizTypeEnum.ORDER, addList); + brokerageRecordService.addBrokerage(userId, brokerageUserId, BrokerageRecordBizTypeEnum.ORDER, addList); } } diff --git a/yudao-module-mall/yudao-module-trade/src/test/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageRecordServiceImplTest.java b/yudao-module-mall/yudao-module-trade/src/test/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageRecordServiceImplTest.java index abdd4e8..b1e3fdd 100644 --- a/yudao-module-mall/yudao-module-trade/src/test/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageRecordServiceImplTest.java +++ b/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; import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.record.BrokerageRecordPageReqVO; import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.record.AppBrokerageProductPriceRespVO; import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageRecordDO; +import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageUserDO; import cn.iocoder.yudao.module.trade.dal.dataobject.config.TradeConfigDO; import cn.iocoder.yudao.module.trade.dal.mysql.brokerage.BrokerageRecordMapper; import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordBizTypeEnum; import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordStatusEnum; +import cn.iocoder.yudao.module.trade.service.brokerage.bo.BrokerageAddReqBO; import cn.iocoder.yudao.module.trade.service.config.TradeConfigService; import jakarta.annotation.Resource; import org.junit.jupiter.api.Test; @@ -22,6 +24,7 @@ import org.springframework.context.annotation.Import; import org.springframework.test.context.bean.override.mockito.MockitoBean; import java.math.RoundingMode; +import java.util.List; import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime; 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 import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; /** @@ -97,6 +101,26 @@ public class BrokerageRecordServiceImplTest extends BaseDbUnitTest { } @Test + public void testAddBrokerage_usesOrderBrokerageUser() { + TradeConfigDO tradeConfig = new TradeConfigDO(); + tradeConfig.setBrokerageEnabled(true); + tradeConfig.setBrokerageFirstPercent(10); + when(tradeConfigService.getTradeConfig()).thenReturn(tradeConfig); + BrokerageUserDO orderBrokerageUser = new BrokerageUserDO().setId(200L).setBrokerageEnabled(true) + .setBrokeragePrice(0); + when(brokerageUserService.getBrokerageUser(200L)).thenReturn(orderBrokerageUser); + + brokerageRecordService.addBrokerage(100L, 200L, BrokerageRecordBizTypeEnum.ORDER, + ListUtil.of(new BrokerageAddReqBO("1", 1000, null, null, 100L, "订单商品"))); + + List records = brokerageRecordMapper.selectList(null); + assertEquals(1, records.size()); + assertEquals(200L, records.get(0).getUserId()); + assertEquals(100, records.get(0).getPrice()); + verify(brokerageUserService).updateUserPrice(200L, 100); + } + + @Test public void testCalculatePrice_useFixedPrice() { // mock 数据 Integer payPrice = 1000;