mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-11-04 04:08:43 +08:00 
			
		
		
		
	分销:调整推广人列表查询方式
This commit is contained in:
		@@ -1,5 +1,6 @@
 | 
			
		||||
package cn.iocoder.yudao.module.trade.dal.mysql.brokerage;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.convert.Convert;
 | 
			
		||||
import cn.hutool.core.lang.Assert;
 | 
			
		||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
 | 
			
		||||
import cn.iocoder.yudao.framework.common.pojo.SortingField;
 | 
			
		||||
@@ -17,6 +18,8 @@ import org.apache.ibatis.annotations.Param;
 | 
			
		||||
import org.apache.ibatis.annotations.Select;
 | 
			
		||||
 | 
			
		||||
import java.time.LocalDateTime;
 | 
			
		||||
import java.util.Collection;
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -27,12 +30,12 @@ import java.util.List;
 | 
			
		||||
@Mapper
 | 
			
		||||
public interface BrokerageUserMapper extends BaseMapperX<BrokerageUserDO> {
 | 
			
		||||
 | 
			
		||||
    default PageResult<BrokerageUserDO> selectPage(BrokerageUserPageReqVO reqVO, List<Long> bindUserIds) {
 | 
			
		||||
    default PageResult<BrokerageUserDO> selectPage(BrokerageUserPageReqVO reqVO, List<Long> ids) {
 | 
			
		||||
        return selectPage(reqVO, new LambdaQueryWrapperX<BrokerageUserDO>()
 | 
			
		||||
                .inIfPresent(BrokerageUserDO::getId, ids)
 | 
			
		||||
                .eqIfPresent(BrokerageUserDO::getBrokerageEnabled, reqVO.getBrokerageEnabled())
 | 
			
		||||
                .betweenIfPresent(BrokerageUserDO::getCreateTime, reqVO.getCreateTime())
 | 
			
		||||
                .betweenIfPresent(BrokerageUserDO::getBindUserTime, reqVO.getBindUserTime())
 | 
			
		||||
                .inIfPresent(BrokerageUserDO::getBindUserId, bindUserIds)
 | 
			
		||||
                .orderByDesc(BrokerageUserDO::getId));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -124,11 +127,6 @@ public interface BrokerageUserMapper extends BaseMapperX<BrokerageUserDO> {
 | 
			
		||||
                .set(BrokerageUserDO::getBrokerageEnabled, false).set(BrokerageUserDO::getBrokerageTime, null));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    default Long selectCountByBindUserIdIn(List<Long> bindUserIds) {
 | 
			
		||||
        return selectCount(new LambdaQueryWrapperX<BrokerageUserDO>()
 | 
			
		||||
                .inIfPresent(BrokerageUserDO::getBindUserId, bindUserIds));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Select("SELECT bind_user_id AS id, COUNT(1) AS brokerageUserCount FROM trade_brokerage_user " +
 | 
			
		||||
            "WHERE bind_user_id IS NOT NULL AND deleted = FALSE " +
 | 
			
		||||
            "AND bind_user_time BETWEEN #{beginTime} AND #{endTime} " +
 | 
			
		||||
@@ -143,32 +141,21 @@ public interface BrokerageUserMapper extends BaseMapperX<BrokerageUserDO> {
 | 
			
		||||
     *
 | 
			
		||||
     * @param bizType      业务类型
 | 
			
		||||
     * @param status       状态
 | 
			
		||||
     * @param bindUserIds  绑定用户编号列表
 | 
			
		||||
     * @param ids          用户编号列表
 | 
			
		||||
     * @param sortingField 排序字段
 | 
			
		||||
     * @return 下级分销统计分页列表
 | 
			
		||||
     */
 | 
			
		||||
    IPage<AppBrokerageUserChildSummaryRespVO> selectSummaryPageByUserId(Page<?> page,
 | 
			
		||||
                                                                        @Param("bizType") Integer bizType,
 | 
			
		||||
                                                                        @Param("status") Integer status,
 | 
			
		||||
                                                                        @Param("bindUserIds") List<Long> bindUserIds,
 | 
			
		||||
                                                                        @Param("ids") Collection<Long> ids,
 | 
			
		||||
                                                                        @Param("sortingField") SortingField sortingField);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 下级分销统计(不分页)
 | 
			
		||||
     *
 | 
			
		||||
     * @param bizType      业务类型
 | 
			
		||||
     * @param status       状态
 | 
			
		||||
     * @param bindUserIds  绑定用户编号列表
 | 
			
		||||
     * @param sortingField 排序字段
 | 
			
		||||
     * @return 下级分销统计列表
 | 
			
		||||
     */
 | 
			
		||||
    List<AppBrokerageUserChildSummaryRespVO> selectSummaryListByUserId(@Param("bizType") Integer bizType,
 | 
			
		||||
                                                                       @Param("status") Integer status,
 | 
			
		||||
                                                                       @Param("bindUserIds") List<Long> bindUserIds,
 | 
			
		||||
                                                                       @Param("sortingField") SortingField sortingField);
 | 
			
		||||
 | 
			
		||||
    default List<BrokerageUserDO> selectListByBindUserId(Long bindUserId) {
 | 
			
		||||
        return selectList(BrokerageUserDO::getBindUserId, bindUserId);
 | 
			
		||||
    default List<Long> selectIdListByBindUserIdIn(Collection<Long> bindUserIds) {
 | 
			
		||||
        return Convert.toList(Long.class,
 | 
			
		||||
                selectObjs(new LambdaQueryWrapperX<BrokerageUserDO>()
 | 
			
		||||
                        .select(Collections.singletonList(BrokerageUserDO::getId))
 | 
			
		||||
                        .in(BrokerageUserDO::getBindUserId, bindUserIds)));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -31,10 +31,9 @@ import org.springframework.validation.annotation.Validated;
 | 
			
		||||
import javax.annotation.Resource;
 | 
			
		||||
import java.time.LocalDateTime;
 | 
			
		||||
import java.util.*;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
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.framework.common.util.collection.CollectionUtils.convertMapByFilter;
 | 
			
		||||
import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.*;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -67,8 +66,12 @@ public class BrokerageUserServiceImpl implements BrokerageUserService {
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public PageResult<BrokerageUserDO> getBrokerageUserPage(BrokerageUserPageReqVO pageReqVO) {
 | 
			
		||||
        List<Long> bindUserIds = buildBindUserIdsByLevel(pageReqVO.getBindUserId(), pageReqVO.getLevel());
 | 
			
		||||
        return brokerageUserMapper.selectPage(pageReqVO, bindUserIds);
 | 
			
		||||
        List<Long> childIds = getChildUserIdsByLevel(pageReqVO.getBindUserId(), pageReqVO.getLevel());
 | 
			
		||||
        // 有”绑定用户编号“查询条件时,没有查到下级会员,直接返回空
 | 
			
		||||
        if (pageReqVO.getBindUserId() != null && CollUtil.isEmpty(childIds)) {
 | 
			
		||||
            return PageResult.empty();
 | 
			
		||||
        }
 | 
			
		||||
        return brokerageUserMapper.selectPage(pageReqVO, childIds);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
@@ -154,11 +157,8 @@ public class BrokerageUserServiceImpl implements BrokerageUserService {
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public Long getBrokerageUserCountByBindUserId(Long bindUserId, Integer level) {
 | 
			
		||||
        List<Long> bindUserIds = buildBindUserIdsByLevel(bindUserId, level);
 | 
			
		||||
        if (CollUtil.isEmpty(bindUserIds)) {
 | 
			
		||||
            return 0L;
 | 
			
		||||
        }
 | 
			
		||||
        return brokerageUserMapper.selectCountByBindUserIdIn(bindUserIds);
 | 
			
		||||
        List<Long> childIds = getChildUserIdsByLevel(bindUserId, level);
 | 
			
		||||
        return (long) CollUtil.size(childIds);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
@@ -226,70 +226,29 @@ public class BrokerageUserServiceImpl implements BrokerageUserService {
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public PageResult<AppBrokerageUserChildSummaryRespVO> getBrokerageUserChildSummaryPage(AppBrokerageUserChildSummaryPageReqVO pageReqVO, Long userId) {
 | 
			
		||||
        // 生成推广员编号列表
 | 
			
		||||
        List<Long> bindUserIds = buildBindUserIdsByLevel(userId, pageReqVO.getLevel());
 | 
			
		||||
 | 
			
		||||
        // TODO @疯狂:情况一和情况二,可以合并哈;
 | 
			
		||||
        //  如果有 nickname 的时候,相当于提前查询 users,然后 nickname 过滤掉 bindUserIds;
 | 
			
		||||
        //  之后,继续使用 selectSummaryPageByUserId 里面 in bindUserIds 查询;
 | 
			
		||||
 | 
			
		||||
        // 情况一:没有昵称过滤条件时,直接使用数据库的分页查询
 | 
			
		||||
        if (StrUtil.isBlank(pageReqVO.getNickname())) {
 | 
			
		||||
            // 1.1 分页查询
 | 
			
		||||
            IPage<AppBrokerageUserChildSummaryRespVO> pageResult = brokerageUserMapper.selectSummaryPageByUserId(
 | 
			
		||||
                    MyBatisUtils.buildPage(pageReqVO), BrokerageRecordBizTypeEnum.ORDER.getType(),
 | 
			
		||||
                    BrokerageRecordStatusEnum.SETTLEMENT.getStatus(), bindUserIds, pageReqVO.getSortingField()
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
            // 1.2 拼接数据并返回
 | 
			
		||||
            List<Long> userIds = convertList(pageResult.getRecords(), AppBrokerageUserChildSummaryRespVO::getId);
 | 
			
		||||
            Map<Long, MemberUserRespDTO> userMap = memberUserApi.getUserMap(userIds);
 | 
			
		||||
            BrokerageUserConvert.INSTANCE.copyTo(pageResult.getRecords(), userMap);
 | 
			
		||||
            return new PageResult<>(pageResult.getRecords(), pageResult.getTotal());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // 情况二:有昵称过滤条件时,需要跨模块(Member)过滤
 | 
			
		||||
        // 2.1 查询所有匹配的分销用户
 | 
			
		||||
        List<AppBrokerageUserChildSummaryRespVO> list = brokerageUserMapper.selectSummaryListByUserId(
 | 
			
		||||
                BrokerageRecordBizTypeEnum.ORDER.getType(), BrokerageRecordStatusEnum.SETTLEMENT.getStatus(),
 | 
			
		||||
                bindUserIds, pageReqVO.getSortingField()
 | 
			
		||||
        );
 | 
			
		||||
        if (CollUtil.isEmpty(list)) {
 | 
			
		||||
        // 1.1 查询下级用户编号列表
 | 
			
		||||
        List<Long> childIds = getChildUserIdsByLevel(userId, pageReqVO.getLevel());
 | 
			
		||||
        if (CollUtil.isEmpty(childIds)) {
 | 
			
		||||
            return PageResult.empty();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // 2.2 查出对应的用户信息
 | 
			
		||||
        List<MemberUserRespDTO> users = memberUserApi.getUserList(convertList(list, AppBrokerageUserChildSummaryRespVO::getId));
 | 
			
		||||
        if (CollUtil.isEmpty(users)) {
 | 
			
		||||
            return PageResult.empty();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // 2.3 根据昵称过滤出用户编号
 | 
			
		||||
        Map<Long, MemberUserRespDTO> userMap = users.stream()
 | 
			
		||||
                .filter(user -> StrUtil.contains(user.getNickname(), pageReqVO.getNickname()))
 | 
			
		||||
                .collect(Collectors.toMap(MemberUserRespDTO::getId, dto -> dto));
 | 
			
		||||
        // 1.2 根据昵称过滤下级用户
 | 
			
		||||
        Map<Long, MemberUserRespDTO> userMap = convertMapByFilter(memberUserApi.getUserList(childIds),
 | 
			
		||||
                user -> StrUtil.contains(user.getNickname(), pageReqVO.getNickname()),
 | 
			
		||||
                MemberUserRespDTO::getId);
 | 
			
		||||
        if (CollUtil.isEmpty(userMap)) {
 | 
			
		||||
            return PageResult.empty();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // 2.4 根据用户编号过滤结果
 | 
			
		||||
        list.removeIf(vo -> !userMap.containsKey(vo.getId()));
 | 
			
		||||
        if (CollUtil.isEmpty(list)) {
 | 
			
		||||
            return PageResult.empty();
 | 
			
		||||
        }
 | 
			
		||||
        // 2 分页查询
 | 
			
		||||
        IPage<AppBrokerageUserChildSummaryRespVO> pageResult = brokerageUserMapper.selectSummaryPageByUserId(
 | 
			
		||||
                MyBatisUtils.buildPage(pageReqVO), BrokerageRecordBizTypeEnum.ORDER.getType(),
 | 
			
		||||
                BrokerageRecordStatusEnum.SETTLEMENT.getStatus(), userMap.keySet(), pageReqVO.getSortingField()
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        // 2.5 处理分页
 | 
			
		||||
        List<AppBrokerageUserChildSummaryRespVO> result = list.stream()
 | 
			
		||||
                .skip((long) (pageReqVO.getPageNo() - 1) * pageReqVO.getPageSize())
 | 
			
		||||
                .limit(pageReqVO.getPageSize())
 | 
			
		||||
                .collect(Collectors.toList());
 | 
			
		||||
        if (CollUtil.isEmpty(result)) {
 | 
			
		||||
            return PageResult.empty();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // 2.6 拼接数据并返回
 | 
			
		||||
        BrokerageUserConvert.INSTANCE.copyTo(result, userMap);
 | 
			
		||||
        return new PageResult<>(result, (long) list.size());
 | 
			
		||||
        // 3 拼接数据并返回
 | 
			
		||||
        BrokerageUserConvert.INSTANCE.copyTo(pageResult.getRecords(), userMap);
 | 
			
		||||
        return new PageResult<>(pageResult.getRecords(), pageResult.getTotal());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private boolean isUserCanBind(BrokerageUserDO user) {
 | 
			
		||||
@@ -360,24 +319,35 @@ public class BrokerageUserServiceImpl implements BrokerageUserService {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据绑定用户编号,获得绑定用户编号列表
 | 
			
		||||
     * 根据绑定用户编号,获得下级用户编号列表
 | 
			
		||||
     *
 | 
			
		||||
     * @param bindUserId 绑定用户编号
 | 
			
		||||
     * @param level      绑定用户的层级。
 | 
			
		||||
     * @param level      下级用户的层级。
 | 
			
		||||
     *                   如果 level 为空,则查询 1+2 两个层级
 | 
			
		||||
     * @return 绑定用户编号列表
 | 
			
		||||
     * @return 下级用户编号列表
 | 
			
		||||
     */
 | 
			
		||||
    private List<Long> buildBindUserIdsByLevel(Long bindUserId, Integer level) {
 | 
			
		||||
    private List<Long> getChildUserIdsByLevel(Long bindUserId, Integer level) {
 | 
			
		||||
        if (bindUserId == null) {
 | 
			
		||||
            return Collections.emptyList();
 | 
			
		||||
        }
 | 
			
		||||
        Assert.isTrue(level == null || level <= 2, "目前只支持 level 小于等于 2");
 | 
			
		||||
        List<Long> bindUserIds = CollUtil.newArrayList();
 | 
			
		||||
        if (level == null || level == 1) {
 | 
			
		||||
            bindUserIds.add(bindUserId);
 | 
			
		||||
 | 
			
		||||
        // 先查第 1 级
 | 
			
		||||
        List<Long> bindUserIds = brokerageUserMapper.selectIdListByBindUserIdIn(Collections.singleton(bindUserId));
 | 
			
		||||
        if (CollUtil.isEmpty(bindUserIds)) {
 | 
			
		||||
            return Collections.emptyList();
 | 
			
		||||
        }
 | 
			
		||||
        if (level == null || level == 2) {
 | 
			
		||||
            bindUserIds.addAll(convertList(brokerageUserMapper.selectListByBindUserId(bindUserId), BrokerageUserDO::getId));
 | 
			
		||||
 | 
			
		||||
        if (level == null) {
 | 
			
		||||
            // level 为空,再查第 2 级,并合并结果
 | 
			
		||||
            bindUserIds.addAll(brokerageUserMapper.selectIdListByBindUserIdIn(bindUserIds));
 | 
			
		||||
        } else if (level == 2) {
 | 
			
		||||
            // 只查第 2 级
 | 
			
		||||
            bindUserIds = brokerageUserMapper.selectIdListByBindUserIdIn(bindUserIds);
 | 
			
		||||
        } else if (level == 1) {
 | 
			
		||||
            // 只查第 1 级
 | 
			
		||||
            return bindUserIds;
 | 
			
		||||
        } else {
 | 
			
		||||
            throw exception(BROKERAGE_USER_LEVEL_NOT_SUPPORT);
 | 
			
		||||
        }
 | 
			
		||||
        return bindUserIds;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,9 @@
 | 
			
		||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 | 
			
		||||
<mapper namespace="cn.iocoder.yudao.module.trade.dal.mysql.brokerage.BrokerageUserMapper">
 | 
			
		||||
 | 
			
		||||
    <sql id="selectSummaryListByUserId">
 | 
			
		||||
    <select id="selectSummaryPageByUserId"
 | 
			
		||||
            resultType="cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserChildSummaryRespVO">
 | 
			
		||||
 | 
			
		||||
        SELECT bu.id, bu.bind_user_time AS brokerageTime,
 | 
			
		||||
        (SELECT SUM(price) FROM trade_brokerage_record r
 | 
			
		||||
        WHERE r.user_id = bu.id AND biz_type = #{bizType} AND r.status = #{status} AND r.deleted = FALSE) AS brokeragePrice,
 | 
			
		||||
@@ -13,10 +15,10 @@
 | 
			
		||||
        FROM trade_brokerage_user AS bu
 | 
			
		||||
        <where>
 | 
			
		||||
            bu.deleted = false
 | 
			
		||||
            <if test="bindUserIds != null and bindUserIds.size() > 0">
 | 
			
		||||
                and bu.bind_user_id in
 | 
			
		||||
                <foreach collection="bindUserIds" open="(" item="bindUserId" separator="," close=")">
 | 
			
		||||
                    #{bindUserId}
 | 
			
		||||
            <if test="ids != null and ids.size() > 0">
 | 
			
		||||
                and bu.id in
 | 
			
		||||
                <foreach collection="ids" open="(" item="id" separator="," close=")">
 | 
			
		||||
                    #{id}
 | 
			
		||||
                </foreach>
 | 
			
		||||
            </if>
 | 
			
		||||
        </where>
 | 
			
		||||
@@ -34,15 +36,6 @@
 | 
			
		||||
                ORDER BY bu.bind_user_time DESC
 | 
			
		||||
            </otherwise>
 | 
			
		||||
        </choose>
 | 
			
		||||
    </sql>
 | 
			
		||||
 | 
			
		||||
    <select id="selectSummaryPageByUserId"
 | 
			
		||||
            resultType="cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserChildSummaryRespVO">
 | 
			
		||||
        <include refid="selectSummaryListByUserId" />
 | 
			
		||||
    </select>
 | 
			
		||||
    <select id="selectSummaryListByUserId"
 | 
			
		||||
            resultType="cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserChildSummaryRespVO">
 | 
			
		||||
        <include refid="selectSummaryListByUserId" />
 | 
			
		||||
    </select>
 | 
			
		||||
 | 
			
		||||
</mapper>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user