分佣: 简化推广用户关系树查询方式
This commit is contained in:
parent
6e6486ccae
commit
bbd18afbcc
|
@ -40,8 +40,6 @@ create table trade_brokerage_user
|
||||||
brokerage_time datetime null comment '成为分销员时间',
|
brokerage_time datetime null comment '成为分销员时间',
|
||||||
price int default 0 not null comment '可用佣金',
|
price int default 0 not null comment '可用佣金',
|
||||||
frozen_price int default 0 not null comment '冻结佣金',
|
frozen_price int default 0 not null comment '冻结佣金',
|
||||||
level int default 1 not null comment '等级',
|
|
||||||
path varchar(2000) null comment '路径',
|
|
||||||
creator varchar(64) default '' null comment '创建者',
|
creator varchar(64) default '' null comment '创建者',
|
||||||
create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间',
|
create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间',
|
||||||
updater varchar(64) default '' null comment '更新者',
|
updater varchar(64) default '' null comment '更新者',
|
||||||
|
|
|
@ -59,13 +59,4 @@ public class BrokerageUserDO extends BaseDO {
|
||||||
* 冻结佣金
|
* 冻结佣金
|
||||||
*/
|
*/
|
||||||
private Integer frozenPrice;
|
private Integer frozenPrice;
|
||||||
|
|
||||||
/**
|
|
||||||
* 等级
|
|
||||||
*/
|
|
||||||
private Integer level;
|
|
||||||
/**
|
|
||||||
* 路径
|
|
||||||
*/
|
|
||||||
private String path;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,13 +27,12 @@ import java.util.List;
|
||||||
@Mapper
|
@Mapper
|
||||||
public interface BrokerageUserMapper extends BaseMapperX<BrokerageUserDO> {
|
public interface BrokerageUserMapper extends BaseMapperX<BrokerageUserDO> {
|
||||||
|
|
||||||
default PageResult<BrokerageUserDO> selectPage(BrokerageUserPageReqVO reqVO, List<Integer> levels) {
|
default PageResult<BrokerageUserDO> selectPage(BrokerageUserPageReqVO reqVO, List<Long> bindUserIds) {
|
||||||
return selectPage(reqVO, new LambdaQueryWrapperX<BrokerageUserDO>()
|
return selectPage(reqVO, new LambdaQueryWrapperX<BrokerageUserDO>()
|
||||||
.eqIfPresent(BrokerageUserDO::getBrokerageEnabled, reqVO.getBrokerageEnabled())
|
.eqIfPresent(BrokerageUserDO::getBrokerageEnabled, reqVO.getBrokerageEnabled())
|
||||||
.betweenIfPresent(BrokerageUserDO::getCreateTime, reqVO.getCreateTime())
|
.betweenIfPresent(BrokerageUserDO::getCreateTime, reqVO.getCreateTime())
|
||||||
.betweenIfPresent(BrokerageUserDO::getBindUserTime, reqVO.getBindUserTime())
|
.betweenIfPresent(BrokerageUserDO::getBindUserTime, reqVO.getBindUserTime())
|
||||||
.findInSetIfPresent(BrokerageUserDO::getPath, reqVO.getBindUserId())
|
.inIfPresent(BrokerageUserDO::getBindUserId, bindUserIds)
|
||||||
.inIfPresent(BrokerageUserDO::getLevel, levels)
|
|
||||||
.orderByDesc(BrokerageUserDO::getId));
|
.orderByDesc(BrokerageUserDO::getId));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -116,8 +115,7 @@ public interface BrokerageUserMapper extends BaseMapperX<BrokerageUserDO> {
|
||||||
default void updateBindUserIdAndBindUserTimeToNull(Long id) {
|
default void updateBindUserIdAndBindUserTimeToNull(Long id) {
|
||||||
update(null, new LambdaUpdateWrapper<BrokerageUserDO>()
|
update(null, new LambdaUpdateWrapper<BrokerageUserDO>()
|
||||||
.eq(BrokerageUserDO::getId, id)
|
.eq(BrokerageUserDO::getId, id)
|
||||||
.set(BrokerageUserDO::getBindUserId, null).set(BrokerageUserDO::getBindUserTime, null)
|
.set(BrokerageUserDO::getBindUserId, null).set(BrokerageUserDO::getBindUserTime, null));
|
||||||
.set(BrokerageUserDO::getLevel, 1).set(BrokerageUserDO::getPath, ""));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
default void updateEnabledFalseAndBrokerageTimeToNull(Long id) {
|
default void updateEnabledFalseAndBrokerageTimeToNull(Long id) {
|
||||||
|
@ -126,10 +124,9 @@ public interface BrokerageUserMapper extends BaseMapperX<BrokerageUserDO> {
|
||||||
.set(BrokerageUserDO::getBrokerageEnabled, false).set(BrokerageUserDO::getBrokerageTime, null));
|
.set(BrokerageUserDO::getBrokerageEnabled, false).set(BrokerageUserDO::getBrokerageTime, null));
|
||||||
}
|
}
|
||||||
|
|
||||||
default Long selectCountByBindUserIdAndLevelIn(Long bindUserId, List<Integer> levels) {
|
default Long selectCountByBindUserIdIn(List<Long> bindUserIds) {
|
||||||
return selectCount(new LambdaQueryWrapperX<BrokerageUserDO>()
|
return selectCount(new LambdaQueryWrapperX<BrokerageUserDO>()
|
||||||
.findInSetIfPresent(BrokerageUserDO::getPath, bindUserId)
|
.inIfPresent(BrokerageUserDO::getBindUserId, bindUserIds));
|
||||||
.inIfPresent(BrokerageUserDO::getLevel, levels));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Select("SELECT bind_user_id AS id, COUNT(1) AS brokerageUserCount FROM trade_brokerage_user " +
|
@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> {
|
||||||
IPage<AppBrokerageUserChildSummaryRespVO> selectSummaryPageByUserId(Page<?> page,
|
IPage<AppBrokerageUserChildSummaryRespVO> selectSummaryPageByUserId(Page<?> page,
|
||||||
@Param("param") AppBrokerageUserChildSummaryPageReqVO param,
|
@Param("param") AppBrokerageUserChildSummaryPageReqVO param,
|
||||||
@Param("userId") Long userId);
|
@Param("userId") Long userId);
|
||||||
|
|
||||||
|
default List<BrokerageUserDO> selectListByBindUserId(Long bindUserId) {
|
||||||
|
return selectList(BrokerageUserDO::getBindUserId, bindUserId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,8 +4,6 @@ import cn.hutool.core.collection.CollUtil;
|
||||||
import cn.hutool.core.lang.Assert;
|
import cn.hutool.core.lang.Assert;
|
||||||
import cn.hutool.core.util.ArrayUtil;
|
import cn.hutool.core.util.ArrayUtil;
|
||||||
import cn.hutool.core.util.BooleanUtil;
|
import cn.hutool.core.util.BooleanUtil;
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
|
||||||
import cn.hutool.core.util.StrUtil;
|
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils;
|
import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils;
|
||||||
import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.user.BrokerageUserPageReqVO;
|
import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.user.BrokerageUserPageReqVO;
|
||||||
|
@ -25,9 +23,13 @@ import org.springframework.validation.annotation.Validated;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.*;
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||||
|
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
|
||||||
import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.*;
|
import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -57,8 +59,8 @@ public class BrokerageUserServiceImpl implements BrokerageUserService {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PageResult<BrokerageUserDO> getBrokerageUserPage(BrokerageUserPageReqVO pageReqVO) {
|
public PageResult<BrokerageUserDO> getBrokerageUserPage(BrokerageUserPageReqVO pageReqVO) {
|
||||||
List<Integer> levels = buildUserQueryLevels(pageReqVO.getBindUserId(), pageReqVO.getLevel());
|
List<Long> bindUserIds = buildBindUserIdsByLevel(pageReqVO.getBindUserId(), pageReqVO.getLevel());
|
||||||
return brokerageUserMapper.selectPage(pageReqVO, levels);
|
return brokerageUserMapper.selectPage(pageReqVO, bindUserIds);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -66,6 +68,11 @@ public class BrokerageUserServiceImpl implements BrokerageUserService {
|
||||||
// 校验存在
|
// 校验存在
|
||||||
BrokerageUserDO brokerageUser = validateBrokerageUserExists(id);
|
BrokerageUserDO brokerageUser = validateBrokerageUserExists(id);
|
||||||
|
|
||||||
|
// 绑定关系未发生变化
|
||||||
|
if (Objects.equals(brokerageUser.getBindUserId(), bindUserId)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// 情况一:清除推广员
|
// 情况一:清除推广员
|
||||||
if (bindUserId == null) {
|
if (bindUserId == null) {
|
||||||
// 清除推广员
|
// 清除推广员
|
||||||
|
@ -73,12 +80,6 @@ public class BrokerageUserServiceImpl implements BrokerageUserService {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 绑定关系未发生变化
|
|
||||||
// TODO @疯狂:这个放到“情况一”之前,貌似也没关系?
|
|
||||||
if (Objects.equals(brokerageUser.getBindUserId(), bindUserId)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 情况二:修改推广员
|
// 情况二:修改推广员
|
||||||
validateCanBindUser(brokerageUser, bindUserId);
|
validateCanBindUser(brokerageUser, bindUserId);
|
||||||
brokerageUserMapper.updateById(fillBindUserData(bindUserId, new BrokerageUserDO().setId(id)));
|
brokerageUserMapper.updateById(fillBindUserData(bindUserId, new BrokerageUserDO().setId(id)));
|
||||||
|
@ -146,11 +147,11 @@ public class BrokerageUserServiceImpl implements BrokerageUserService {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Long getBrokerageUserCountByBindUserId(Long bindUserId, Integer level) {
|
public Long getBrokerageUserCountByBindUserId(Long bindUserId, Integer level) {
|
||||||
List<Integer> levels = buildUserQueryLevels(bindUserId, level);
|
List<Long> bindUserIds = buildBindUserIdsByLevel(bindUserId, level);
|
||||||
if (CollUtil.isEmpty(levels)) {
|
if (CollUtil.isEmpty(bindUserIds)) {
|
||||||
return 0L;
|
return 0L;
|
||||||
}
|
}
|
||||||
return brokerageUserMapper.selectCountByBindUserIdAndLevelIn(bindUserId, levels);
|
return brokerageUserMapper.selectCountByBindUserIdIn(bindUserIds);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -185,20 +186,7 @@ public class BrokerageUserServiceImpl implements BrokerageUserService {
|
||||||
}
|
}
|
||||||
|
|
||||||
private BrokerageUserDO fillBindUserData(Long bindUserId, BrokerageUserDO brokerageUser) {
|
private BrokerageUserDO fillBindUserData(Long bindUserId, BrokerageUserDO brokerageUser) {
|
||||||
BrokerageUserDO bindUser = getBrokerageUser(bindUserId);
|
return brokerageUser.setBindUserId(bindUserId).setBindUserTime(LocalDateTime.now());
|
||||||
|
|
||||||
Integer bindUserLevel = 0;
|
|
||||||
String bindUserPath = "";
|
|
||||||
if (bindUser != null) {
|
|
||||||
bindUserLevel = ObjectUtil.defaultIfNull(bindUser.getLevel(), 0);
|
|
||||||
bindUserPath = bindUser.getPath();
|
|
||||||
}
|
|
||||||
|
|
||||||
String path = StrUtil.isEmpty(bindUserPath)
|
|
||||||
? String.valueOf(bindUserId)
|
|
||||||
: String.format("%s,%s", bindUserPath, bindUserId);
|
|
||||||
return brokerageUser.setBindUserId(bindUserId).setBindUserTime(LocalDateTime.now())
|
|
||||||
.setLevel(bindUserLevel + 1).setPath(path);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -267,28 +255,25 @@ public class BrokerageUserServiceImpl implements BrokerageUserService {
|
||||||
}
|
}
|
||||||
|
|
||||||
// 下级不能绑定自己的上级
|
// 下级不能绑定自己的上级
|
||||||
if (StrUtil.split(bindUser.getPath(), ",").contains(String.valueOf(user.getId()))) {
|
for (int i = 0; i <= Short.MAX_VALUE; i++) {
|
||||||
|
if (Objects.equals(bindUser.getBindUserId(), user.getId())) {
|
||||||
throw exception(BROKERAGE_BIND_LOOP);
|
throw exception(BROKERAGE_BIND_LOOP);
|
||||||
}
|
}
|
||||||
|
bindUser = getBrokerageUser(bindUser.getBindUserId());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO @芋艿:这个层级,要微信讨论下;
|
private List<Long> buildBindUserIdsByLevel(Long bindUserId, Integer level) {
|
||||||
private List<Integer> buildUserQueryLevels(Long bindUserId, Integer level) {
|
List<Long> bindUserIds = CollUtil.newArrayList();
|
||||||
List<Integer> levels = new ArrayList<>(2);
|
if (level == null || level == 1) {
|
||||||
|
bindUserIds.add(bindUserId);
|
||||||
BrokerageUserDO bindUser = getBrokerageUser(bindUserId);
|
}
|
||||||
if (bindUser == null) {
|
if (level == null || level == 2) {
|
||||||
return levels;
|
List<Long> firstUserIds = convertList(brokerageUserMapper.selectListByBindUserId(bindUserId), BrokerageUserDO::getId);
|
||||||
|
bindUserIds.addAll(firstUserIds);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (level == null) {
|
return bindUserIds;
|
||||||
// 默认查两层
|
|
||||||
levels.add(bindUser.getLevel() + 1);
|
|
||||||
levels.add(bindUser.getLevel() + 2);
|
|
||||||
} else {
|
|
||||||
levels.add(bindUser.getLevel() + level);
|
|
||||||
}
|
|
||||||
return levels;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue