Commit bbd18afbcc5d06ec9291947dac9c86114db9ad06

Authored by owen
1 parent 6e6486cc

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

sql/mysql/brokerage.sql
... ... @@ -40,8 +40,6 @@ create table trade_brokerage_user
40 40 brokerage_time datetime null comment '成为分销员时间',
41 41 price int default 0 not null comment '可用佣金',
42 42 frozen_price int default 0 not null comment '冻结佣金',
43   - level int default 1 not null comment '等级',
44   - path varchar(2000) null comment '路径',
45 43 creator varchar(64) default '' null comment '创建者',
46 44 create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间',
47 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 59 * 冻结佣金
60 60 */
61 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 27 @Mapper
28 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 31 return selectPage(reqVO, new LambdaQueryWrapperX<BrokerageUserDO>()
32 32 .eqIfPresent(BrokerageUserDO::getBrokerageEnabled, reqVO.getBrokerageEnabled())
33 33 .betweenIfPresent(BrokerageUserDO::getCreateTime, reqVO.getCreateTime())
34 34 .betweenIfPresent(BrokerageUserDO::getBindUserTime, reqVO.getBindUserTime())
35   - .findInSetIfPresent(BrokerageUserDO::getPath, reqVO.getBindUserId())
36   - .inIfPresent(BrokerageUserDO::getLevel, levels)
  35 + .inIfPresent(BrokerageUserDO::getBindUserId, bindUserIds)
37 36 .orderByDesc(BrokerageUserDO::getId));
38 37 }
39 38  
... ... @@ -116,8 +115,7 @@ public interface BrokerageUserMapper extends BaseMapperX&lt;BrokerageUserDO&gt; {
116 115 default void updateBindUserIdAndBindUserTimeToNull(Long id) {
117 116 update(null, new LambdaUpdateWrapper<BrokerageUserDO>()
118 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 121 default void updateEnabledFalseAndBrokerageTimeToNull(Long id) {
... ... @@ -126,10 +124,9 @@ public interface BrokerageUserMapper extends BaseMapperX&lt;BrokerageUserDO&gt; {
126 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 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 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 141 IPage<AppBrokerageUserChildSummaryRespVO> selectSummaryPageByUserId(Page<?> page,
145 142 @Param("param") AppBrokerageUserChildSummaryPageReqVO param,
146 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 4 import cn.hutool.core.lang.Assert;
5 5 import cn.hutool.core.util.ArrayUtil;
6 6 import cn.hutool.core.util.BooleanUtil;
7   -import cn.hutool.core.util.ObjectUtil;
8   -import cn.hutool.core.util.StrUtil;
9 7 import cn.iocoder.yudao.framework.common.pojo.PageResult;
10 8 import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils;
11 9 import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.user.BrokerageUserPageReqVO;
... ... @@ -25,9 +23,13 @@ import org.springframework.validation.annotation.Validated;
25 23  
26 24 import javax.annotation.Resource;
27 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 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 33 import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.*;
32 34  
33 35 /**
... ... @@ -57,8 +59,8 @@ public class BrokerageUserServiceImpl implements BrokerageUserService {
57 59  
58 60 @Override
59 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 66 @Override
... ... @@ -66,6 +68,11 @@ public class BrokerageUserServiceImpl implements BrokerageUserService {
66 68 // 校验存在
67 69 BrokerageUserDO brokerageUser = validateBrokerageUserExists(id);
68 70  
  71 + // 绑定关系未发生变化
  72 + if (Objects.equals(brokerageUser.getBindUserId(), bindUserId)) {
  73 + return;
  74 + }
  75 +
69 76 // 情况一:清除推广员
70 77 if (bindUserId == null) {
71 78 // 清除推广员
... ... @@ -73,12 +80,6 @@ public class BrokerageUserServiceImpl implements BrokerageUserService {
73 80 return;
74 81 }
75 82  
76   - // 绑定关系未发生变化
77   - // TODO @疯狂:这个放到“情况一”之前,貌似也没关系?
78   - if (Objects.equals(brokerageUser.getBindUserId(), bindUserId)) {
79   - return;
80   - }
81   -
82 83 // 情况二:修改推广员
83 84 validateCanBindUser(brokerageUser, bindUserId);
84 85 brokerageUserMapper.updateById(fillBindUserData(bindUserId, new BrokerageUserDO().setId(id)));
... ... @@ -146,11 +147,11 @@ public class BrokerageUserServiceImpl implements BrokerageUserService {
146 147  
147 148 @Override
148 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 152 return 0L;
152 153 }
153   - return brokerageUserMapper.selectCountByBindUserIdAndLevelIn(bindUserId, levels);
  154 + return brokerageUserMapper.selectCountByBindUserIdIn(bindUserIds);
154 155 }
155 156  
156 157 @Override
... ... @@ -185,20 +186,7 @@ public class BrokerageUserServiceImpl implements BrokerageUserService {
185 186 }
186 187  
187 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 192 @Override
... ... @@ -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  
... ...