Commit bbd18afbcc5d06ec9291947dac9c86114db9ad06

Authored by owen
1 parent 6e6486cc

分佣: 简化推广用户关系树查询方式

sql/mysql/brokerage.sql
@@ -40,8 +40,6 @@ create table trade_brokerage_user @@ -40,8 +40,6 @@ create table trade_brokerage_user
40 brokerage_time datetime null comment '成为分销员时间', 40 brokerage_time datetime null comment '成为分销员时间',
41 price int default 0 not null comment '可用佣金', 41 price int default 0 not null comment '可用佣金',
42 frozen_price int default 0 not null comment '冻结佣金', 42 frozen_price int default 0 not null comment '冻结佣金',
43 - level int default 1 not null comment '等级',  
44 - path varchar(2000) null comment '路径',  
45 creator varchar(64) default '' null comment '创建者', 43 creator varchar(64) default '' null comment '创建者',
46 create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间', 44 create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间',
47 updater varchar(64) default '' null comment '更新者', 45 updater varchar(64) default '' null comment '更新者',
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/brokerage/BrokerageUserDO.java
@@ -59,13 +59,4 @@ public class BrokerageUserDO extends BaseDO { @@ -59,13 +59,4 @@ public class BrokerageUserDO extends BaseDO {
59 * 冻结佣金 59 * 冻结佣金
60 */ 60 */
61 private Integer frozenPrice; 61 private Integer frozenPrice;
62 -  
63 - /**  
64 - * 等级  
65 - */  
66 - private Integer level;  
67 - /**  
68 - * 路径  
69 - */  
70 - private String path;  
71 } 62 }
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/brokerage/BrokerageUserMapper.java
@@ -27,13 +27,12 @@ import java.util.List; @@ -27,13 +27,12 @@ import java.util.List;
27 @Mapper 27 @Mapper
28 public interface BrokerageUserMapper extends BaseMapperX<BrokerageUserDO> { 28 public interface BrokerageUserMapper extends BaseMapperX<BrokerageUserDO> {
29 29
30 - default PageResult<BrokerageUserDO> selectPage(BrokerageUserPageReqVO reqVO, List<Integer> levels) { 30 + default PageResult<BrokerageUserDO> selectPage(BrokerageUserPageReqVO reqVO, List<Long> bindUserIds) {
31 return selectPage(reqVO, new LambdaQueryWrapperX<BrokerageUserDO>() 31 return selectPage(reqVO, new LambdaQueryWrapperX<BrokerageUserDO>()
32 .eqIfPresent(BrokerageUserDO::getBrokerageEnabled, reqVO.getBrokerageEnabled()) 32 .eqIfPresent(BrokerageUserDO::getBrokerageEnabled, reqVO.getBrokerageEnabled())
33 .betweenIfPresent(BrokerageUserDO::getCreateTime, reqVO.getCreateTime()) 33 .betweenIfPresent(BrokerageUserDO::getCreateTime, reqVO.getCreateTime())
34 .betweenIfPresent(BrokerageUserDO::getBindUserTime, reqVO.getBindUserTime()) 34 .betweenIfPresent(BrokerageUserDO::getBindUserTime, reqVO.getBindUserTime())
35 - .findInSetIfPresent(BrokerageUserDO::getPath, reqVO.getBindUserId())  
36 - .inIfPresent(BrokerageUserDO::getLevel, levels) 35 + .inIfPresent(BrokerageUserDO::getBindUserId, bindUserIds)
37 .orderByDesc(BrokerageUserDO::getId)); 36 .orderByDesc(BrokerageUserDO::getId));
38 } 37 }
39 38
@@ -116,8 +115,7 @@ public interface BrokerageUserMapper extends BaseMapperX&lt;BrokerageUserDO&gt; { @@ -116,8 +115,7 @@ public interface BrokerageUserMapper extends BaseMapperX&lt;BrokerageUserDO&gt; {
116 default void updateBindUserIdAndBindUserTimeToNull(Long id) { 115 default void updateBindUserIdAndBindUserTimeToNull(Long id) {
117 update(null, new LambdaUpdateWrapper<BrokerageUserDO>() 116 update(null, new LambdaUpdateWrapper<BrokerageUserDO>()
118 .eq(BrokerageUserDO::getId, id) 117 .eq(BrokerageUserDO::getId, id)
119 - .set(BrokerageUserDO::getBindUserId, null).set(BrokerageUserDO::getBindUserTime, null)  
120 - .set(BrokerageUserDO::getLevel, 1).set(BrokerageUserDO::getPath, "")); 118 + .set(BrokerageUserDO::getBindUserId, null).set(BrokerageUserDO::getBindUserTime, null));
121 } 119 }
122 120
123 default void updateEnabledFalseAndBrokerageTimeToNull(Long id) { 121 default void updateEnabledFalseAndBrokerageTimeToNull(Long id) {
@@ -126,10 +124,9 @@ public interface BrokerageUserMapper extends BaseMapperX&lt;BrokerageUserDO&gt; { @@ -126,10 +124,9 @@ public interface BrokerageUserMapper extends BaseMapperX&lt;BrokerageUserDO&gt; {
126 .set(BrokerageUserDO::getBrokerageEnabled, false).set(BrokerageUserDO::getBrokerageTime, null)); 124 .set(BrokerageUserDO::getBrokerageEnabled, false).set(BrokerageUserDO::getBrokerageTime, null));
127 } 125 }
128 126
129 - default Long selectCountByBindUserIdAndLevelIn(Long bindUserId, List<Integer> levels) { 127 + default Long selectCountByBindUserIdIn(List<Long> bindUserIds) {
130 return selectCount(new LambdaQueryWrapperX<BrokerageUserDO>() 128 return selectCount(new LambdaQueryWrapperX<BrokerageUserDO>()
131 - .findInSetIfPresent(BrokerageUserDO::getPath, bindUserId)  
132 - .inIfPresent(BrokerageUserDO::getLevel, levels)); 129 + .inIfPresent(BrokerageUserDO::getBindUserId, bindUserIds));
133 } 130 }
134 131
135 @Select("SELECT bind_user_id AS id, COUNT(1) AS brokerageUserCount FROM trade_brokerage_user " + 132 @Select("SELECT bind_user_id AS id, COUNT(1) AS brokerageUserCount FROM trade_brokerage_user " +
@@ -144,4 +141,8 @@ public interface BrokerageUserMapper extends BaseMapperX&lt;BrokerageUserDO&gt; { @@ -144,4 +141,8 @@ public interface BrokerageUserMapper extends BaseMapperX&lt;BrokerageUserDO&gt; {
144 IPage<AppBrokerageUserChildSummaryRespVO> selectSummaryPageByUserId(Page<?> page, 141 IPage<AppBrokerageUserChildSummaryRespVO> selectSummaryPageByUserId(Page<?> page,
145 @Param("param") AppBrokerageUserChildSummaryPageReqVO param, 142 @Param("param") AppBrokerageUserChildSummaryPageReqVO param,
146 @Param("userId") Long userId); 143 @Param("userId") Long userId);
  144 +
  145 + default List<BrokerageUserDO> selectListByBindUserId(Long bindUserId) {
  146 + return selectList(BrokerageUserDO::getBindUserId, bindUserId);
  147 + }
147 } 148 }
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageUserServiceImpl.java
@@ -4,8 +4,6 @@ import cn.hutool.core.collection.CollUtil; @@ -4,8 +4,6 @@ import cn.hutool.core.collection.CollUtil;
4 import cn.hutool.core.lang.Assert; 4 import cn.hutool.core.lang.Assert;
5 import cn.hutool.core.util.ArrayUtil; 5 import cn.hutool.core.util.ArrayUtil;
6 import cn.hutool.core.util.BooleanUtil; 6 import cn.hutool.core.util.BooleanUtil;
7 -import cn.hutool.core.util.ObjectUtil;  
8 -import cn.hutool.core.util.StrUtil;  
9 import cn.iocoder.yudao.framework.common.pojo.PageResult; 7 import cn.iocoder.yudao.framework.common.pojo.PageResult;
10 import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils; 8 import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils;
11 import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.user.BrokerageUserPageReqVO; 9 import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.user.BrokerageUserPageReqVO;
@@ -25,9 +23,13 @@ import org.springframework.validation.annotation.Validated; @@ -25,9 +23,13 @@ import org.springframework.validation.annotation.Validated;
25 23
26 import javax.annotation.Resource; 24 import javax.annotation.Resource;
27 import java.time.LocalDateTime; 25 import java.time.LocalDateTime;
28 -import java.util.*; 26 +import java.util.Collection;
  27 +import java.util.List;
  28 +import java.util.Objects;
  29 +import java.util.Optional;
29 30
30 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; 31 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  32 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
31 import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.*; 33 import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.*;
32 34
33 /** 35 /**
@@ -57,8 +59,8 @@ public class BrokerageUserServiceImpl implements BrokerageUserService { @@ -57,8 +59,8 @@ public class BrokerageUserServiceImpl implements BrokerageUserService {
57 59
58 @Override 60 @Override
59 public PageResult<BrokerageUserDO> getBrokerageUserPage(BrokerageUserPageReqVO pageReqVO) { 61 public PageResult<BrokerageUserDO> getBrokerageUserPage(BrokerageUserPageReqVO pageReqVO) {
60 - List<Integer> levels = buildUserQueryLevels(pageReqVO.getBindUserId(), pageReqVO.getLevel());  
61 - return brokerageUserMapper.selectPage(pageReqVO, levels); 62 + List<Long> bindUserIds = buildBindUserIdsByLevel(pageReqVO.getBindUserId(), pageReqVO.getLevel());
  63 + return brokerageUserMapper.selectPage(pageReqVO, bindUserIds);
62 } 64 }
63 65
64 @Override 66 @Override
@@ -66,6 +68,11 @@ public class BrokerageUserServiceImpl implements BrokerageUserService { @@ -66,6 +68,11 @@ public class BrokerageUserServiceImpl implements BrokerageUserService {
66 // 校验存在 68 // 校验存在
67 BrokerageUserDO brokerageUser = validateBrokerageUserExists(id); 69 BrokerageUserDO brokerageUser = validateBrokerageUserExists(id);
68 70
  71 + // 绑定关系未发生变化
  72 + if (Objects.equals(brokerageUser.getBindUserId(), bindUserId)) {
  73 + return;
  74 + }
  75 +
69 // 情况一:清除推广员 76 // 情况一:清除推广员
70 if (bindUserId == null) { 77 if (bindUserId == null) {
71 // 清除推广员 78 // 清除推广员
@@ -73,12 +80,6 @@ public class BrokerageUserServiceImpl implements BrokerageUserService { @@ -73,12 +80,6 @@ public class BrokerageUserServiceImpl implements BrokerageUserService {
73 return; 80 return;
74 } 81 }
75 82
76 - // 绑定关系未发生变化  
77 - // TODO @疯狂:这个放到“情况一”之前,貌似也没关系?  
78 - if (Objects.equals(brokerageUser.getBindUserId(), bindUserId)) {  
79 - return;  
80 - }  
81 -  
82 // 情况二:修改推广员 83 // 情况二:修改推广员
83 validateCanBindUser(brokerageUser, bindUserId); 84 validateCanBindUser(brokerageUser, bindUserId);
84 brokerageUserMapper.updateById(fillBindUserData(bindUserId, new BrokerageUserDO().setId(id))); 85 brokerageUserMapper.updateById(fillBindUserData(bindUserId, new BrokerageUserDO().setId(id)));
@@ -146,11 +147,11 @@ public class BrokerageUserServiceImpl implements BrokerageUserService { @@ -146,11 +147,11 @@ public class BrokerageUserServiceImpl implements BrokerageUserService {
146 147
147 @Override 148 @Override
148 public Long getBrokerageUserCountByBindUserId(Long bindUserId, Integer level) { 149 public Long getBrokerageUserCountByBindUserId(Long bindUserId, Integer level) {
149 - List<Integer> levels = buildUserQueryLevels(bindUserId, level);  
150 - if (CollUtil.isEmpty(levels)) { 150 + List<Long> bindUserIds = buildBindUserIdsByLevel(bindUserId, level);
  151 + if (CollUtil.isEmpty(bindUserIds)) {
151 return 0L; 152 return 0L;
152 } 153 }
153 - return brokerageUserMapper.selectCountByBindUserIdAndLevelIn(bindUserId, levels); 154 + return brokerageUserMapper.selectCountByBindUserIdIn(bindUserIds);
154 } 155 }
155 156
156 @Override 157 @Override
@@ -185,20 +186,7 @@ public class BrokerageUserServiceImpl implements BrokerageUserService { @@ -185,20 +186,7 @@ public class BrokerageUserServiceImpl implements BrokerageUserService {
185 } 186 }
186 187
187 private BrokerageUserDO fillBindUserData(Long bindUserId, BrokerageUserDO brokerageUser) { 188 private BrokerageUserDO fillBindUserData(Long bindUserId, BrokerageUserDO brokerageUser) {
188 - BrokerageUserDO bindUser = getBrokerageUser(bindUserId);  
189 -  
190 - Integer bindUserLevel = 0;  
191 - String bindUserPath = "";  
192 - if (bindUser != null) {  
193 - bindUserLevel = ObjectUtil.defaultIfNull(bindUser.getLevel(), 0);  
194 - bindUserPath = bindUser.getPath();  
195 - }  
196 -  
197 - String path = StrUtil.isEmpty(bindUserPath)  
198 - ? String.valueOf(bindUserId)  
199 - : String.format("%s,%s", bindUserPath, bindUserId);  
200 - return brokerageUser.setBindUserId(bindUserId).setBindUserTime(LocalDateTime.now())  
201 - .setLevel(bindUserLevel + 1).setPath(path); 189 + return brokerageUser.setBindUserId(bindUserId).setBindUserTime(LocalDateTime.now());
202 } 190 }
203 191
204 @Override 192 @Override
@@ -267,28 +255,25 @@ public class BrokerageUserServiceImpl implements BrokerageUserService { @@ -267,28 +255,25 @@ public class BrokerageUserServiceImpl implements BrokerageUserService {
267 } 255 }
268 256
269 // 下级不能绑定自己的上级 257 // 下级不能绑定自己的上级
270 - if (StrUtil.split(bindUser.getPath(), ",").contains(String.valueOf(user.getId()))) {  
271 - throw exception(BROKERAGE_BIND_LOOP); 258 + for (int i = 0; i <= Short.MAX_VALUE; i++) {
  259 + if (Objects.equals(bindUser.getBindUserId(), user.getId())) {
  260 + throw exception(BROKERAGE_BIND_LOOP);
  261 + }
  262 + bindUser = getBrokerageUser(bindUser.getBindUserId());
272 } 263 }
273 } 264 }
274 265
275 - // TODO @芋艿:这个层级,要微信讨论下;  
276 - private List<Integer> buildUserQueryLevels(Long bindUserId, Integer level) {  
277 - List<Integer> levels = new ArrayList<>(2);  
278 -  
279 - BrokerageUserDO bindUser = getBrokerageUser(bindUserId);  
280 - if (bindUser == null) {  
281 - return levels; 266 + private List<Long> buildBindUserIdsByLevel(Long bindUserId, Integer level) {
  267 + List<Long> bindUserIds = CollUtil.newArrayList();
  268 + if (level == null || level == 1) {
  269 + bindUserIds.add(bindUserId);
282 } 270 }
283 -  
284 - if (level == null) {  
285 - // 默认查两层  
286 - levels.add(bindUser.getLevel() + 1);  
287 - levels.add(bindUser.getLevel() + 2);  
288 - } else {  
289 - levels.add(bindUser.getLevel() + level); 271 + if (level == null || level == 2) {
  272 + List<Long> firstUserIds = convertList(brokerageUserMapper.selectListByBindUserId(bindUserId), BrokerageUserDO::getId);
  273 + bindUserIds.addAll(firstUserIds);
290 } 274 }
291 - return levels; 275 +
  276 + return bindUserIds;
292 277
293 } 278 }
294 279