Commit ee15b802b24f52359ed610263186bbee6a051073

Authored by owen
1 parent 972b01c0

分佣: 推广人排行

yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/AppBrokerageUserController.java
@@ -8,6 +8,7 @@ import cn.iocoder.yudao.module.member.api.user.MemberUserApi; @@ -8,6 +8,7 @@ import cn.iocoder.yudao.module.member.api.user.MemberUserApi;
8 import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; 8 import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
9 import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.*; 9 import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.*;
10 import cn.iocoder.yudao.module.trade.convert.brokerage.BrokerageRecordConvert; 10 import cn.iocoder.yudao.module.trade.convert.brokerage.BrokerageRecordConvert;
  11 +import cn.iocoder.yudao.module.trade.convert.brokerage.BrokerageUserConvert;
11 import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageUserDO; 12 import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageUserDO;
12 import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordBizTypeEnum; 13 import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordBizTypeEnum;
13 import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageWithdrawStatusEnum; 14 import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageWithdrawStatusEnum;
@@ -90,24 +91,15 @@ public class AppBrokerageUserController { @@ -90,24 +91,15 @@ public class AppBrokerageUserController {
90 return success(respVO); 91 return success(respVO);
91 } 92 }
92 93
93 - // TODO 芋艿:临时 mock =>  
94 @GetMapping("/rank-page-by-user-count") 94 @GetMapping("/rank-page-by-user-count")
95 @Operation(summary = "获得分销用户排行分页(基于用户量)") 95 @Operation(summary = "获得分销用户排行分页(基于用户量)")
96 @PreAuthenticated 96 @PreAuthenticated
97 public CommonResult<PageResult<AppBrokerageUserRankByUserCountRespVO>> getBrokerageUserRankPageByUserCount(AppBrokerageUserRankPageReqVO pageReqVO) { 97 public CommonResult<PageResult<AppBrokerageUserRankByUserCountRespVO>> getBrokerageUserRankPageByUserCount(AppBrokerageUserRankPageReqVO pageReqVO) {
98 - AppBrokerageUserRankByUserCountRespVO vo1 = new AppBrokerageUserRankByUserCountRespVO()  
99 - .setId(1L).setNickname("芋1**艿").setAvatar("http://www.iocoder.cn/images/common/wechat_mp_2017_07_31_bak.jpg")  
100 - .setBrokerageUserCount(10);  
101 - AppBrokerageUserRankByUserCountRespVO vo2 = new AppBrokerageUserRankByUserCountRespVO()  
102 - .setId(2L).setNickname("芋2**艿").setAvatar("http://www.iocoder.cn/images/common/wechat_mp_2017_07_31_bak.jpg")  
103 - .setBrokerageUserCount(6);  
104 - AppBrokerageUserRankByUserCountRespVO vo3 = new AppBrokerageUserRankByUserCountRespVO()  
105 - .setId(3L).setNickname("芋3**艿").setAvatar("http://www.iocoder.cn/images/common/wechat_mp_2017_07_31_bak.jpg")  
106 - .setBrokerageUserCount(4);  
107 - AppBrokerageUserRankByUserCountRespVO vo4 = new AppBrokerageUserRankByUserCountRespVO()  
108 - .setId(3L).setNickname("芋3**艿").setAvatar("http://www.iocoder.cn/images/common/wechat_mp_2017_07_31_bak.jpg")  
109 - .setBrokerageUserCount(4);  
110 - return success(new PageResult<>(asList(vo1, vo2, vo3, vo4), 10L)); 98 + // 分页查询
  99 + PageResult<AppBrokerageUserRankByUserCountRespVO> pageResult = brokerageUserService.getBrokerageUserRankPageByUserCount(pageReqVO);
  100 + // 拼接数据
  101 + Map<Long, MemberUserRespDTO> userMap = memberUserApi.getUserMap(convertSet(pageResult.getList(), AppBrokerageUserRankByUserCountRespVO::getId));
  102 + return success(BrokerageUserConvert.INSTANCE.convertPage03(pageResult, userMap));
111 } 103 }
112 104
113 @GetMapping("/rank-page-by-price") 105 @GetMapping("/rank-page-by-price")
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/brokerage/BrokerageUserConvert.java
@@ -4,9 +4,11 @@ import cn.hutool.core.map.MapUtil; @@ -4,9 +4,11 @@ import cn.hutool.core.map.MapUtil;
4 import cn.iocoder.yudao.framework.common.pojo.PageResult; 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; 5 import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
6 import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.user.BrokerageUserRespVO; 6 import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.user.BrokerageUserRespVO;
  7 +import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserRankByUserCountRespVO;
7 import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageUserDO; 8 import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageUserDO;
8 import cn.iocoder.yudao.module.trade.service.brokerage.bo.UserBrokerageSummaryBO; 9 import cn.iocoder.yudao.module.trade.service.brokerage.bo.UserBrokerageSummaryBO;
9 import org.mapstruct.Mapper; 10 import org.mapstruct.Mapper;
  11 +import org.mapstruct.MappingTarget;
10 import org.mapstruct.factory.Mappers; 12 import org.mapstruct.factory.Mappers;
11 13
12 import java.util.List; 14 import java.util.List;
@@ -55,4 +57,13 @@ public interface BrokerageUserConvert { @@ -55,4 +57,13 @@ public interface BrokerageUserConvert {
55 user -> target.setNickname(user.getNickname()).setAvatar(user.getAvatar())); 57 user -> target.setNickname(user.getNickname()).setAvatar(user.getAvatar()));
56 return target; 58 return target;
57 } 59 }
  60 +
  61 + default PageResult<AppBrokerageUserRankByUserCountRespVO> convertPage03(PageResult<AppBrokerageUserRankByUserCountRespVO> pageResult, Map<Long, MemberUserRespDTO> userMap) {
  62 + for (AppBrokerageUserRankByUserCountRespVO vo : pageResult.getList()) {
  63 + copyTo(userMap.get(vo.getId()), vo);
  64 + }
  65 + return pageResult;
  66 + }
  67 +
  68 + void copyTo(MemberUserRespDTO from, @MappingTarget AppBrokerageUserRankByUserCountRespVO to);
58 } 69 }
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/brokerage/BrokerageRecordMapper.java
@@ -67,9 +67,10 @@ public interface BrokerageRecordMapper extends BaseMapperX&lt;BrokerageRecordDO&gt; { @@ -67,9 +67,10 @@ public interface BrokerageRecordMapper extends BaseMapperX&lt;BrokerageRecordDO&gt; {
67 @Param("endTime") LocalDateTime endTime); 67 @Param("endTime") LocalDateTime endTime);
68 68
69 @Select("SELECT user_id AS id, SUM(price) AS brokeragePrice FROM trade_brokerage_record " + 69 @Select("SELECT user_id AS id, SUM(price) AS brokeragePrice FROM trade_brokerage_record " +
70 - "WHERE biz_type = #{bizType} AND status = #{status} AND create_time BETWEEN #{beginTime} AND #{endTime} " + 70 + "WHERE biz_type = #{bizType} AND status = #{status} AND deleted = FALSE " +
  71 + "AND unfreeze_time BETWEEN #{beginTime} AND #{endTime} " +
71 "GROUP BY user_id " + 72 "GROUP BY user_id " +
72 - "ORDER BY SUM(price) DESC") 73 + "ORDER BY brokeragePrice DESC")
73 IPage<AppBrokerageUserRankByPriceRespVO> selectSummaryPricePageGroupByUserId(IPage<?> page, 74 IPage<AppBrokerageUserRankByPriceRespVO> selectSummaryPricePageGroupByUserId(IPage<?> page,
74 @Param("bizType") Integer bizType, 75 @Param("bizType") Integer bizType,
75 @Param("status") Integer status, 76 @Param("status") Integer status,
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/brokerage/BrokerageUserMapper.java
@@ -5,10 +5,16 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -5,10 +5,16 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 5 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
6 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; 6 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
7 import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.user.BrokerageUserPageReqVO; 7 import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.user.BrokerageUserPageReqVO;
  8 +import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserRankByUserCountRespVO;
8 import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageUserDO; 9 import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageUserDO;
9 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; 10 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
  11 +import com.baomidou.mybatisplus.core.metadata.IPage;
  12 +import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
10 import org.apache.ibatis.annotations.Mapper; 13 import org.apache.ibatis.annotations.Mapper;
  14 +import org.apache.ibatis.annotations.Param;
  15 +import org.apache.ibatis.annotations.Select;
11 16
  17 +import java.time.LocalDateTime;
12 import java.util.List; 18 import java.util.List;
13 19
14 /** 20 /**
@@ -124,4 +130,12 @@ public interface BrokerageUserMapper extends BaseMapperX&lt;BrokerageUserDO&gt; { @@ -124,4 +130,12 @@ public interface BrokerageUserMapper extends BaseMapperX&lt;BrokerageUserDO&gt; {
124 .inIfPresent(BrokerageUserDO::getLevel, levels)); 130 .inIfPresent(BrokerageUserDO::getLevel, levels));
125 } 131 }
126 132
  133 + @Select("SELECT bind_user_id AS id, COUNT(1) AS brokerageUserCount FROM trade_brokerage_user " +
  134 + "WHERE bind_user_id IS NOT NULL AND deleted = FALSE " +
  135 + "AND bind_user_time BETWEEN #{beginTime} AND #{endTime} " +
  136 + "GROUP BY bind_user_id " +
  137 + "ORDER BY brokerageUserCount DESC")
  138 + IPage<AppBrokerageUserRankByUserCountRespVO> selectCountPageGroupByBindUserId(Page<?> page,
  139 + @Param("beginTime") LocalDateTime beginTime,
  140 + @Param("endTime") LocalDateTime endTime);
127 } 141 }
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageUserService.java
@@ -3,6 +3,8 @@ package cn.iocoder.yudao.module.trade.service.brokerage; @@ -3,6 +3,8 @@ package cn.iocoder.yudao.module.trade.service.brokerage;
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils; 4 import cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils;
5 import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.user.BrokerageUserPageReqVO; 5 import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.user.BrokerageUserPageReqVO;
  6 +import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserRankByUserCountRespVO;
  7 +import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserRankPageReqVO;
6 import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageUserDO; 8 import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageUserDO;
7 9
8 import javax.validation.constraints.NotNull; 10 import javax.validation.constraints.NotNull;
@@ -130,4 +132,12 @@ public interface BrokerageUserService { @@ -130,4 +132,12 @@ public interface BrokerageUserService {
130 * @return 是否有分销资格 132 * @return 是否有分销资格
131 */ 133 */
132 Boolean getUserBrokerageEnabled(Long userId); 134 Boolean getUserBrokerageEnabled(Long userId);
  135 +
  136 + /**
  137 + * 获得推广人排行
  138 + *
  139 + * @param pageReqVO 分页查询
  140 + * @return 推广人排行
  141 + */
  142 + PageResult<AppBrokerageUserRankByUserCountRespVO> getBrokerageUserRankPageByUserCount(AppBrokerageUserRankPageReqVO pageReqVO);
133 } 143 }
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageUserServiceImpl.java
@@ -2,17 +2,22 @@ package cn.iocoder.yudao.module.trade.service.brokerage; @@ -2,17 +2,22 @@ package cn.iocoder.yudao.module.trade.service.brokerage;
2 2
3 import cn.hutool.core.collection.CollUtil; 3 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.BooleanUtil; 6 import cn.hutool.core.util.BooleanUtil;
6 import cn.hutool.core.util.ObjectUtil; 7 import cn.hutool.core.util.ObjectUtil;
7 import cn.hutool.core.util.StrUtil; 8 import cn.hutool.core.util.StrUtil;
8 import cn.iocoder.yudao.framework.common.pojo.PageResult; 9 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  10 +import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils;
9 import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.user.BrokerageUserPageReqVO; 11 import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.user.BrokerageUserPageReqVO;
  12 +import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserRankByUserCountRespVO;
  13 +import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserRankPageReqVO;
10 import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageUserDO; 14 import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageUserDO;
11 import cn.iocoder.yudao.module.trade.dal.dataobject.config.TradeConfigDO; 15 import cn.iocoder.yudao.module.trade.dal.dataobject.config.TradeConfigDO;
12 import cn.iocoder.yudao.module.trade.dal.mysql.brokerage.BrokerageUserMapper; 16 import cn.iocoder.yudao.module.trade.dal.mysql.brokerage.BrokerageUserMapper;
13 import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageBindModeEnum; 17 import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageBindModeEnum;
14 import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageEnabledConditionEnum; 18 import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageEnabledConditionEnum;
15 import cn.iocoder.yudao.module.trade.service.config.TradeConfigService; 19 import cn.iocoder.yudao.module.trade.service.config.TradeConfigService;
  20 +import com.baomidou.mybatisplus.core.metadata.IPage;
16 import org.springframework.stereotype.Service; 21 import org.springframework.stereotype.Service;
17 import org.springframework.validation.annotation.Validated; 22 import org.springframework.validation.annotation.Validated;
18 23
@@ -208,6 +213,13 @@ public class BrokerageUserServiceImpl implements BrokerageUserService { @@ -208,6 +213,13 @@ public class BrokerageUserServiceImpl implements BrokerageUserService {
208 .orElse(false); 213 .orElse(false);
209 } 214 }
210 215
  216 + @Override
  217 + public PageResult<AppBrokerageUserRankByUserCountRespVO> getBrokerageUserRankPageByUserCount(AppBrokerageUserRankPageReqVO pageReqVO) {
  218 + IPage<AppBrokerageUserRankByUserCountRespVO> pageResult = brokerageUserMapper.selectCountPageGroupByBindUserId(MyBatisUtils.buildPage(pageReqVO),
  219 + ArrayUtil.get(pageReqVO.getTimes(), 0), ArrayUtil.get(pageReqVO.getTimes(), 1));
  220 + return new PageResult<>(pageResult.getRecords(), pageResult.getTotal());
  221 + }
  222 +
211 private boolean isUserCanBind(BrokerageUserDO user, Boolean isNewUser) { 223 private boolean isUserCanBind(BrokerageUserDO user, Boolean isNewUser) {
212 // 校验分销功能是否启用 224 // 校验分销功能是否启用
213 TradeConfigDO tradeConfig = tradeConfigService.getTradeConfig(); 225 TradeConfigDO tradeConfig = tradeConfigService.getTradeConfig();