Commit bbd18afbcc5d06ec9291947dac9c86114db9ad06
1 parent
6e6486cc
分佣: 简化推广用户关系树查询方式
Showing
4 changed files
with
39 additions
and
64 deletions
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
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<BrokerageUserDO> { |
| 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<BrokerageUserDO> { |
| 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<BrokerageUserDO> { |
| 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 | ... | ... |