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,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<BrokerageUserDO> { | @@ -116,8 +115,7 @@ public interface BrokerageUserMapper extends BaseMapperX<BrokerageUserDO> { | ||
| 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<BrokerageUserDO> { | @@ -126,10 +124,9 @@ public interface BrokerageUserMapper extends BaseMapperX<BrokerageUserDO> { | ||
| 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<BrokerageUserDO> { | @@ -144,4 +141,8 @@ public interface BrokerageUserMapper extends BaseMapperX<BrokerageUserDO> { | ||
| 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 |