Commit 972b01c001e95edd83e9649c6e37a76ce2252154

Authored by owen
1 parent 7a8a440e

分佣: 佣金排行

yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/AppBrokerageUserController.java
@@ -4,7 +4,10 @@ import cn.hutool.core.date.LocalDateTimeUtil; @@ -4,7 +4,10 @@ import cn.hutool.core.date.LocalDateTimeUtil;
4 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 4 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
5 import cn.iocoder.yudao.framework.common.pojo.PageResult; 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 import cn.iocoder.yudao.framework.security.core.annotations.PreAuthenticated; 6 import cn.iocoder.yudao.framework.security.core.annotations.PreAuthenticated;
  7 +import cn.iocoder.yudao.module.member.api.user.MemberUserApi;
  8 +import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
7 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;
8 import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageUserDO; 11 import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageUserDO;
9 import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordBizTypeEnum; 12 import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordBizTypeEnum;
10 import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageWithdrawStatusEnum; 13 import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageWithdrawStatusEnum;
@@ -22,9 +25,11 @@ import org.springframework.web.bind.annotation.*; @@ -22,9 +25,11 @@ import org.springframework.web.bind.annotation.*;
22 import javax.annotation.Resource; 25 import javax.annotation.Resource;
23 import javax.validation.Valid; 26 import javax.validation.Valid;
24 import java.time.LocalDateTime; 27 import java.time.LocalDateTime;
  28 +import java.util.Map;
25 import java.util.Optional; 29 import java.util.Optional;
26 30
27 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; 31 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  32 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
28 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; 33 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
29 import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; 34 import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
30 import static java.util.Arrays.asList; 35 import static java.util.Arrays.asList;
@@ -42,6 +47,9 @@ public class AppBrokerageUserController { @@ -42,6 +47,9 @@ public class AppBrokerageUserController {
42 @Resource 47 @Resource
43 private BrokerageWithdrawService brokerageWithdrawService; 48 private BrokerageWithdrawService brokerageWithdrawService;
44 49
  50 + @Resource
  51 + private MemberUserApi memberUserApi;
  52 +
45 @GetMapping("/get") 53 @GetMapping("/get")
46 @Operation(summary = "获得个人分销信息") 54 @Operation(summary = "获得个人分销信息")
47 @PreAuthenticated 55 @PreAuthenticated
@@ -102,24 +110,15 @@ public class AppBrokerageUserController { @@ -102,24 +110,15 @@ public class AppBrokerageUserController {
102 return success(new PageResult<>(asList(vo1, vo2, vo3, vo4), 10L)); 110 return success(new PageResult<>(asList(vo1, vo2, vo3, vo4), 10L));
103 } 111 }
104 112
105 - // TODO 芋艿:临时 mock =>  
106 @GetMapping("/rank-page-by-price") 113 @GetMapping("/rank-page-by-price")
107 @Operation(summary = "获得分销用户排行分页(基于佣金)") 114 @Operation(summary = "获得分销用户排行分页(基于佣金)")
108 @PreAuthenticated 115 @PreAuthenticated
109 public CommonResult<PageResult<AppBrokerageUserRankByPriceRespVO>> getBrokerageUserChildSummaryPageByPrice(AppBrokerageUserRankPageReqVO pageReqVO) { 116 public CommonResult<PageResult<AppBrokerageUserRankByPriceRespVO>> getBrokerageUserChildSummaryPageByPrice(AppBrokerageUserRankPageReqVO pageReqVO) {
110 - AppBrokerageUserRankByPriceRespVO vo1 = new AppBrokerageUserRankByPriceRespVO()  
111 - .setId(1L).setNickname("芋1**艿").setAvatar("http://www.iocoder.cn/images/common/wechat_mp_2017_07_31_bak.jpg")  
112 - .setBrokeragePrice(10);  
113 - AppBrokerageUserRankByPriceRespVO vo2 = new AppBrokerageUserRankByPriceRespVO()  
114 - .setId(2L).setNickname("芋2**艿").setAvatar("http://www.iocoder.cn/images/common/wechat_mp_2017_07_31_bak.jpg")  
115 - .setBrokeragePrice(6);  
116 - AppBrokerageUserRankByPriceRespVO vo3 = new AppBrokerageUserRankByPriceRespVO()  
117 - .setId(3L).setNickname("芋3**艿").setAvatar("http://www.iocoder.cn/images/common/wechat_mp_2017_07_31_bak.jpg")  
118 - .setBrokeragePrice(4);  
119 - AppBrokerageUserRankByPriceRespVO vo4 = new AppBrokerageUserRankByPriceRespVO()  
120 - .setId(3L).setNickname("芋3**艿").setAvatar("http://www.iocoder.cn/images/common/wechat_mp_2017_07_31_bak.jpg")  
121 - .setBrokeragePrice(4);  
122 - return success(new PageResult<>(asList(vo1, vo2, vo3, vo4), 10L)); 117 + // 分页查询
  118 + PageResult<AppBrokerageUserRankByPriceRespVO> pageResult = brokerageRecordService.getBrokerageUserChildSummaryPageByPrice(pageReqVO);
  119 + // 拼接数据
  120 + Map<Long, MemberUserRespDTO> userMap = memberUserApi.getUserMap(convertSet(pageResult.getList(), AppBrokerageUserRankByPriceRespVO::getId));
  121 + return success(BrokerageRecordConvert.INSTANCE.convertPage03(pageResult, userMap));
123 } 122 }
124 123
125 // TODO 芋艿:临时 mock => 124 // TODO 芋艿:临时 mock =>
@@ -139,13 +138,12 @@ public class AppBrokerageUserController { @@ -139,13 +138,12 @@ public class AppBrokerageUserController {
139 return success(new PageResult<>(asList(vo1, vo2), 10L)); 138 return success(new PageResult<>(asList(vo1, vo2), 10L));
140 } 139 }
141 140
142 - // TODO 芋艿:临时 mock =>  
143 @GetMapping("/get-rank-by-price") 141 @GetMapping("/get-rank-by-price")
144 @Operation(summary = "获得分销用户排行(基于佣金)") 142 @Operation(summary = "获得分销用户排行(基于佣金)")
145 @Parameter(name = "times", description = "时间段", required = true) 143 @Parameter(name = "times", description = "时间段", required = true)
146 - public CommonResult<Integer> bindBrokerageUser( 144 + public CommonResult<Integer> getRankByPrice(
147 @RequestParam("times") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) LocalDateTime[] times) { 145 @RequestParam("times") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) LocalDateTime[] times) {
148 - return success(1); 146 + return success(brokerageRecordService.getUserRankByPrice(getLoginUserId(), times));
149 } 147 }
150 148
151 } 149 }
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/brokerage/BrokerageRecordConvert.java
@@ -9,11 +9,13 @@ import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.record.Broker @@ -9,11 +9,13 @@ import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.record.Broker
9 import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.record.BrokerageRecordRespVO; 9 import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.record.BrokerageRecordRespVO;
10 import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.record.AppBrokerageRecordPageReqVO; 10 import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.record.AppBrokerageRecordPageReqVO;
11 import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.record.AppBrokerageRecordRespVO; 11 import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.record.AppBrokerageRecordRespVO;
  12 +import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserRankByPriceRespVO;
12 import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageRecordDO; 13 import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageRecordDO;
13 import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageUserDO; 14 import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageUserDO;
14 import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordBizTypeEnum; 15 import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordBizTypeEnum;
15 import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordStatusEnum; 16 import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordStatusEnum;
16 import org.mapstruct.Mapper; 17 import org.mapstruct.Mapper;
  18 +import org.mapstruct.MappingTarget;
17 import org.mapstruct.factory.Mappers; 19 import org.mapstruct.factory.Mappers;
18 20
19 import java.time.LocalDateTime; 21 import java.time.LocalDateTime;
@@ -68,4 +70,13 @@ public interface BrokerageRecordConvert { @@ -68,4 +70,13 @@ public interface BrokerageRecordConvert {
68 BrokerageRecordPageReqVO convert(AppBrokerageRecordPageReqVO pageReqVO, Long userId); 70 BrokerageRecordPageReqVO convert(AppBrokerageRecordPageReqVO pageReqVO, Long userId);
69 71
70 PageResult<AppBrokerageRecordRespVO> convertPage02(PageResult<BrokerageRecordDO> pageResult); 72 PageResult<AppBrokerageRecordRespVO> convertPage02(PageResult<BrokerageRecordDO> pageResult);
  73 +
  74 + default PageResult<AppBrokerageUserRankByPriceRespVO> convertPage03(PageResult<AppBrokerageUserRankByPriceRespVO> pageResult, Map<Long, MemberUserRespDTO> userMap) {
  75 + for (AppBrokerageUserRankByPriceRespVO vo : pageResult.getList()) {
  76 + copyTo(userMap.get(vo.getId()), vo);
  77 + }
  78 + return pageResult;
  79 + }
  80 +
  81 + void copyTo(MemberUserRespDTO from, @MappingTarget AppBrokerageUserRankByPriceRespVO to);
71 } 82 }
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/brokerage/BrokerageRecordMapper.java
@@ -4,9 +4,11 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -4,9 +4,11 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
5 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; 5 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
6 import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.record.BrokerageRecordPageReqVO; 6 import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.record.BrokerageRecordPageReqVO;
  7 +import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserRankByPriceRespVO;
7 import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageRecordDO; 8 import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageRecordDO;
8 import cn.iocoder.yudao.module.trade.service.brokerage.bo.UserBrokerageSummaryBO; 9 import cn.iocoder.yudao.module.trade.service.brokerage.bo.UserBrokerageSummaryBO;
9 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 10 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  11 +import com.baomidou.mybatisplus.core.metadata.IPage;
10 import org.apache.ibatis.annotations.Mapper; 12 import org.apache.ibatis.annotations.Mapper;
11 import org.apache.ibatis.annotations.Param; 13 import org.apache.ibatis.annotations.Param;
12 import org.apache.ibatis.annotations.Select; 14 import org.apache.ibatis.annotations.Select;
@@ -63,4 +65,14 @@ public interface BrokerageRecordMapper extends BaseMapperX&lt;BrokerageRecordDO&gt; { @@ -63,4 +65,14 @@ public interface BrokerageRecordMapper extends BaseMapperX&lt;BrokerageRecordDO&gt; {
63 @Param("bizType") Integer bizType, 65 @Param("bizType") Integer bizType,
64 @Param("beginTime") LocalDateTime beginTime, 66 @Param("beginTime") LocalDateTime beginTime,
65 @Param("endTime") LocalDateTime endTime); 67 @Param("endTime") LocalDateTime endTime);
  68 +
  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} " +
  71 + "GROUP BY user_id " +
  72 + "ORDER BY SUM(price) DESC")
  73 + IPage<AppBrokerageUserRankByPriceRespVO> selectSummaryPricePageGroupByUserId(IPage<?> page,
  74 + @Param("bizType") Integer bizType,
  75 + @Param("status") Integer status,
  76 + @Param("beginTime") LocalDateTime beginTime,
  77 + @Param("endTime") LocalDateTime endTime);
66 } 78 }
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageRecordService.java
@@ -2,6 +2,8 @@ package cn.iocoder.yudao.module.trade.service.brokerage; @@ -2,6 +2,8 @@ package cn.iocoder.yudao.module.trade.service.brokerage;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.record.BrokerageRecordPageReqVO; 4 import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.record.BrokerageRecordPageReqVO;
  5 +import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserRankByPriceRespVO;
  6 +import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserRankPageReqVO;
5 import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageRecordDO; 7 import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageRecordDO;
6 import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordBizTypeEnum; 8 import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordBizTypeEnum;
7 import cn.iocoder.yudao.module.trade.service.brokerage.bo.BrokerageAddReqBO; 9 import cn.iocoder.yudao.module.trade.service.brokerage.bo.BrokerageAddReqBO;
@@ -90,4 +92,20 @@ public interface BrokerageRecordService { @@ -90,4 +92,20 @@ public interface BrokerageRecordService {
90 * @return 用户佣金合计 92 * @return 用户佣金合计
91 */ 93 */
92 Integer getSummaryPriceByUserId(Long userId, Integer bizType, LocalDateTime beginTime, LocalDateTime endTime); 94 Integer getSummaryPriceByUserId(Long userId, Integer bizType, LocalDateTime beginTime, LocalDateTime endTime);
  95 +
  96 + /**
  97 + * 获得用户佣金排行分页列表(基于佣金总数)
  98 + * @param pageReqVO 分页查询
  99 + * @return 排行榜分页
  100 + */
  101 + PageResult<AppBrokerageUserRankByPriceRespVO> getBrokerageUserChildSummaryPageByPrice(AppBrokerageUserRankPageReqVO pageReqVO);
  102 +
  103 + /**
  104 + * 获取用户的排名(基于佣金总数)
  105 + *
  106 + * @param userId 用户编号
  107 + * @param times 时间范围
  108 + * @return 用户的排名
  109 + */
  110 + Integer getUserRankByPrice(Long userId, LocalDateTime[] times);
93 } 111 }
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageRecordServiceImpl.java
@@ -2,13 +2,17 @@ package cn.iocoder.yudao.module.trade.service.brokerage; @@ -2,13 +2,17 @@ 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.math.Money; 4 import cn.hutool.core.math.Money;
  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.hutool.extra.spring.SpringUtil; 9 import cn.hutool.extra.spring.SpringUtil;
9 import cn.iocoder.yudao.framework.common.pojo.PageResult; 10 import cn.iocoder.yudao.framework.common.pojo.PageResult;
10 import cn.iocoder.yudao.framework.common.util.number.MoneyUtils; 11 import cn.iocoder.yudao.framework.common.util.number.MoneyUtils;
  12 +import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils;
11 import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.record.BrokerageRecordPageReqVO; 13 import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.record.BrokerageRecordPageReqVO;
  14 +import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserRankByPriceRespVO;
  15 +import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserRankPageReqVO;
12 import cn.iocoder.yudao.module.trade.convert.brokerage.BrokerageRecordConvert; 16 import cn.iocoder.yudao.module.trade.convert.brokerage.BrokerageRecordConvert;
13 import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageRecordDO; 17 import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageRecordDO;
14 import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageUserDO; 18 import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageUserDO;
@@ -19,6 +23,7 @@ import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordStatusEnum; @@ -19,6 +23,7 @@ import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordStatusEnum;
19 import cn.iocoder.yudao.module.trade.service.brokerage.bo.BrokerageAddReqBO; 23 import cn.iocoder.yudao.module.trade.service.brokerage.bo.BrokerageAddReqBO;
20 import cn.iocoder.yudao.module.trade.service.brokerage.bo.UserBrokerageSummaryBO; 24 import cn.iocoder.yudao.module.trade.service.brokerage.bo.UserBrokerageSummaryBO;
21 import cn.iocoder.yudao.module.trade.service.config.TradeConfigService; 25 import cn.iocoder.yudao.module.trade.service.config.TradeConfigService;
  26 +import com.baomidou.mybatisplus.core.metadata.IPage;
22 import lombok.extern.slf4j.Slf4j; 27 import lombok.extern.slf4j.Slf4j;
23 import org.springframework.stereotype.Service; 28 import org.springframework.stereotype.Service;
24 import org.springframework.transaction.annotation.Transactional; 29 import org.springframework.transaction.annotation.Transactional;
@@ -228,6 +233,26 @@ public class BrokerageRecordServiceImpl implements BrokerageRecordService { @@ -228,6 +233,26 @@ public class BrokerageRecordServiceImpl implements BrokerageRecordService {
228 } 233 }
229 234
230 @Override 235 @Override
  236 + public PageResult<AppBrokerageUserRankByPriceRespVO> getBrokerageUserChildSummaryPageByPrice(AppBrokerageUserRankPageReqVO pageReqVO) {
  237 + IPage<AppBrokerageUserRankByPriceRespVO> pageResult = brokerageRecordMapper.selectSummaryPricePageGroupByUserId(MyBatisUtils.buildPage(pageReqVO),
  238 + BrokerageRecordBizTypeEnum.ORDER.getType(), BrokerageRecordStatusEnum.SETTLEMENT.getStatus(),
  239 + ArrayUtil.get(pageReqVO.getTimes(), 0), ArrayUtil.get(pageReqVO.getTimes(), 1));
  240 + return new PageResult<>(pageResult.getRecords(), pageResult.getTotal());
  241 + }
  242 +
  243 + @Override
  244 + public Integer getUserRankByPrice(Long userId, LocalDateTime[] times) {
  245 + AppBrokerageUserRankPageReqVO pageParam = new AppBrokerageUserRankPageReqVO().setTimes(times);
  246 + // 取前100名
  247 + pageParam.setPageSize(100);
  248 + PageResult<AppBrokerageUserRankByPriceRespVO> pageResult = getBrokerageUserChildSummaryPageByPrice(pageParam);
  249 + // 获得索引
  250 + int index = CollUtil.indexOf(pageResult.getList(), user -> Objects.equals(userId, user.getId()));
  251 + // 获得排名
  252 + return index + 1;
  253 + }
  254 +
  255 + @Override
231 @Transactional(rollbackFor = Exception.class) 256 @Transactional(rollbackFor = Exception.class)
232 public void addBrokerage(Long userId, BrokerageRecordBizTypeEnum bizType, String bizId, Integer brokeragePrice, String title) { 257 public void addBrokerage(Long userId, BrokerageRecordBizTypeEnum bizType, String bizId, Integer brokeragePrice, String title) {
233 // 校验佣金余额 258 // 校验佣金余额