Commit 166b1b31c0b20c3016fa2bebce376fdef96ea142

Authored by owen
1 parent 5808f77a

trade: 分销用户管理

Showing 11 changed files with 163 additions and 41 deletions
sql/mysql/brokerage.sql
... ... @@ -24,7 +24,7 @@ create table trade_config
24 24 create table trade_brokerage_user
25 25 (
26 26 id bigint auto_increment comment '用户编号' primary key,
27   - brokerage_user_id bigint not null comment '推广员编号',
  27 + brokerage_user_id bigint null comment '推广员编号',
28 28 brokerage_bind_time datetime null comment '推广员绑定时间',
29 29 brokerage_enabled bit default 1 not null comment '是否成为推广员',
30 30 brokerage_time datetime null comment '成为分销员时间',
... ... @@ -185,12 +185,15 @@ SELECT @parentId := LAST_INSERT_ID();
185 185 INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status)
186 186 VALUES ('分销用户查询', 'trade:brokerage-user:query', 3, 1, @parentId, '', '', '', 0);
187 187 INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status)
188   -VALUES ('分销用户修改推广员', 'trade:brokerage-user:update-brokerage-user', 3, 2, @parentId, '', '', '', 0);
  188 +VALUES ('分销用户推广人查询', 'trade:brokerage-user:user-query', 3, 2, @parentId, '', '', '', 0);
189 189 INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status)
190   -VALUES ('分销用户清除推广员', 'trade:brokerage-user:clear-brokerage-user', 3, 3, @parentId, '', '', '', 0);
  190 +VALUES ('分销用户推广订单查询', 'trade:brokerage-user:order-query', 3, 3, @parentId, '', '', '', 0);
191 191 INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status)
192 192 VALUES ('分销用户修改推广资格', 'trade:brokerage-user:update-brokerage-enable', 3, 4, @parentId, '', '', '', 0);
193   -
  193 +INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status)
  194 +VALUES ('分销用户修改推广员', 'trade:brokerage-user:update-brokerage-user', 3, 5, @parentId, '', '', '', 0);
  195 +INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status)
  196 +VALUES ('分销用户清除推广员', 'trade:brokerage-user:clear-brokerage-user', 3, 6, @parentId, '', '', '', 0);
194 197  
195 198 -- 增加菜单:佣金记录
196 199 INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status, component_name)
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/user/TradeBrokerageUserController.java
... ... @@ -2,9 +2,15 @@ package cn.iocoder.yudao.module.trade.controller.admin.brokerage.user;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  5 +import cn.iocoder.yudao.module.member.api.user.MemberUserApi;
  6 +import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
5 7 import cn.iocoder.yudao.module.trade.controller.admin.brokerage.user.vo.*;
6 8 import cn.iocoder.yudao.module.trade.convert.brokerage.user.TradeBrokerageUserConvert;
7 9 import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.user.TradeBrokerageUserDO;
  10 +import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordBizTypeEnum;
  11 +import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordStatusEnum;
  12 +import cn.iocoder.yudao.module.trade.service.brokerage.record.TradeBrokerageRecordService;
  13 +import cn.iocoder.yudao.module.trade.service.brokerage.record.bo.UserBrokerageSummaryBO;
8 14 import cn.iocoder.yudao.module.trade.service.brokerage.user.TradeBrokerageUserService;
9 15 import io.swagger.v3.oas.annotations.Operation;
10 16 import io.swagger.v3.oas.annotations.Parameter;
... ... @@ -15,8 +21,12 @@ import org.springframework.web.bind.annotation.*;
15 21  
16 22 import javax.annotation.Resource;
17 23 import javax.validation.Valid;
  24 +import java.util.Map;
  25 +import java.util.Set;
18 26  
19 27 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  28 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
  29 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
20 30  
21 31 @Tag(name = "管理后台 - 分销用户")
22 32 @RestController
... ... @@ -26,6 +36,11 @@ public class TradeBrokerageUserController {
26 36  
27 37 @Resource
28 38 private TradeBrokerageUserService brokerageUserService;
  39 + @Resource
  40 + private TradeBrokerageRecordService brokerageRecordService;
  41 +
  42 + @Resource
  43 + private MemberUserApi memberUserApi;
29 44  
30 45 @PutMapping("/update-brokerage-user")
31 46 @Operation(summary = "修改推广员")
... ... @@ -64,8 +79,26 @@ public class TradeBrokerageUserController {
64 79 @Operation(summary = "获得分销用户分页")
65 80 @PreAuthorize("@ss.hasPermission('trade:brokerage-user:query')")
66 81 public CommonResult<PageResult<TradeBrokerageUserRespVO>> getBrokerageUserPage(@Valid TradeBrokerageUserPageReqVO pageVO) {
  82 + // 分页查询
67 83 PageResult<TradeBrokerageUserDO> pageResult = brokerageUserService.getBrokerageUserPage(pageVO);
68   - return success(TradeBrokerageUserConvert.INSTANCE.convertPage(pageResult));
  84 +
  85 + // 涉及到的用户
  86 + Set<Long> userIds = convertSet(pageResult.getList(), TradeBrokerageUserDO::getId);
  87 + // 查询用户信息
  88 + Map<Long, MemberUserRespDTO> userMap = memberUserApi.getUserMap(userIds);
  89 + // 合计分佣订单
  90 + Map<Long, UserBrokerageSummaryBO> userOrderSummaryMap = convertMap(userIds,
  91 + userId -> userId,
  92 + userId -> brokerageRecordService.summaryByUserIdAndBizTypeAndStatus(userId,
  93 + BrokerageRecordBizTypeEnum.ORDER.getType(), BrokerageRecordStatusEnum.SETTLEMENT.getStatus()));
  94 + // 合计推广用户数量
  95 + Map<Long, Long> brokerageUserCountMap = convertMap(userIds,
  96 + userId -> userId,
  97 + userId -> brokerageUserService.getCountByBrokerageUserId(userId));
  98 +
  99 + // todo 合计提现
  100 +
  101 + return success(TradeBrokerageUserConvert.INSTANCE.convertPage(pageResult, userMap, brokerageUserCountMap, userOrderSummaryMap));
69 102 }
70 103  
71 104 }
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/user/vo/TradeBrokerageUserRespVO.java
... ... @@ -19,4 +19,30 @@ public class TradeBrokerageUserRespVO extends TradeBrokerageUserBaseVO {
19 19 @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
20 20 private LocalDateTime createTime;
21 21  
  22 +
  23 + // ========== 用户信息 ==========
  24 +
  25 + @Schema(description = "用户头像", example = "https://www.iocoder.cn/xxx.png")
  26 + private String avatar;
  27 + @Schema(description = "用户昵称", example = "李四")
  28 + private String nickname;
  29 +
  30 +
  31 + // ========== 推广信息 ==========
  32 +
  33 + @Schema(description = "推广用户数量(一级)", example = "20019")
  34 + private Integer brokerageUserCount;
  35 + @Schema(description = "推广订单数量", example = "20019")
  36 + private Integer brokerageOrderCount;
  37 + @Schema(description = "推广订单金额", example = "20019")
  38 + private Integer brokerageOrderPrice;
  39 +
  40 +
  41 + // ========== 提现信息 ==========
  42 +
  43 + @Schema(description = "已提现金额", example = "20019")
  44 + private Integer withdrawPrice;
  45 + @Schema(description = "已提现次数", example = "20019")
  46 + private Integer withdrawCount;
  47 +
22 48 }
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/brokerage/user/TradeBrokerageUserConvert.java
1 1 package cn.iocoder.yudao.module.trade.convert.brokerage.user;
2 2  
  3 +import cn.hutool.core.map.MapUtil;
3 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  5 +import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
4 6 import cn.iocoder.yudao.module.trade.controller.admin.brokerage.user.vo.TradeBrokerageUserRespVO;
5 7 import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.user.TradeBrokerageUserDO;
  8 +import cn.iocoder.yudao.module.trade.service.brokerage.record.bo.UserBrokerageSummaryBO;
6 9 import org.mapstruct.Mapper;
7 10 import org.mapstruct.factory.Mappers;
8 11  
9 12 import java.util.List;
  13 +import java.util.Map;
  14 +import java.util.Optional;
10 15  
11 16 /**
12 17 * 分销用户 Convert
... ... @@ -24,4 +29,33 @@ public interface TradeBrokerageUserConvert {
24 29  
25 30 PageResult<TradeBrokerageUserRespVO> convertPage(PageResult<TradeBrokerageUserDO> page);
26 31  
  32 + default PageResult<TradeBrokerageUserRespVO> convertPage(PageResult<TradeBrokerageUserDO> pageResult,
  33 + Map<Long, MemberUserRespDTO> userMap,
  34 + Map<Long, Long> brokerageUserCountMap,
  35 + Map<Long, UserBrokerageSummaryBO> userOrderSummaryMap) {
  36 + PageResult<TradeBrokerageUserRespVO> result = convertPage(pageResult);
  37 + for (TradeBrokerageUserRespVO vo : result.getList()) {
  38 + // 用户信息
  39 + Optional.ofNullable(userMap.get(vo.getId()))
  40 + .ifPresent(user -> {
  41 + vo.setNickname(user.getNickname());
  42 + vo.setAvatar(user.getAvatar());
  43 + });
  44 +
  45 + // 推广用户数量(一级)
  46 + vo.setBrokerageUserCount(MapUtil.getInt(brokerageUserCountMap, vo.getId(), 0));
  47 +
  48 + Optional<UserBrokerageSummaryBO> orderSummaryOptional = Optional.ofNullable(userOrderSummaryMap.get(vo.getId()));
  49 + // 推广订单数量
  50 + vo.setBrokerageOrderCount(orderSummaryOptional.map(UserBrokerageSummaryBO::getCount).orElse(0));
  51 + // 推广订单金额
  52 + vo.setBrokerageOrderPrice(orderSummaryOptional.map(UserBrokerageSummaryBO::getPrice).orElse(0));
  53 +
  54 + // todo 已提现次数
  55 + vo.setWithdrawCount(0);
  56 + // todo 已提现金额
  57 + vo.setWithdrawPrice(0);
  58 + }
  59 + return result;
  60 + }
27 61 }
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/brokerage/record/TradeBrokerageRecordMapper.java
... ... @@ -5,8 +5,11 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
5 5 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
6 6 import cn.iocoder.yudao.module.trade.controller.admin.brokerage.record.vo.TradeBrokerageRecordPageReqVO;
7 7 import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.record.TradeBrokerageRecordDO;
  8 +import cn.iocoder.yudao.module.trade.service.brokerage.record.bo.UserBrokerageSummaryBO;
8 9 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
9 10 import org.apache.ibatis.annotations.Mapper;
  11 +import org.apache.ibatis.annotations.Param;
  12 +import org.apache.ibatis.annotations.Select;
10 13  
11 14 import java.time.LocalDateTime;
12 15 import java.util.List;
... ... @@ -46,4 +49,8 @@ public interface TradeBrokerageRecordMapper extends BaseMapperX&lt;TradeBrokerageRe
46 49 TradeBrokerageRecordDO::getBizId, bizId);
47 50 }
48 51  
  52 + @Select("select count(1), sum(price) from trade_brokerage_record where user_id = #{userId} and biz_type = #{bizType} and status = #{status}")
  53 + UserBrokerageSummaryBO selectCountAndSumPriceByUserIdAndBizTypeAndStatus(@Param("userId") Long userId,
  54 + @Param("bizType") Integer bizType,
  55 + @Param("status") Integer status);
49 56 }
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/record/TradeBrokerageRecordService.java
1 1 package cn.iocoder.yudao.module.trade.service.brokerage.record;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.trade.controller.admin.brokerage.record.vo.TradeBrokerageRecordPageReqVO;
4 5 import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.record.TradeBrokerageRecordDO;
5 6 import cn.iocoder.yudao.module.trade.service.brokerage.record.bo.BrokerageAddReqBO;
6   -import cn.iocoder.yudao.module.trade.controller.admin.brokerage.record.vo.TradeBrokerageRecordPageReqVO;
  7 +import cn.iocoder.yudao.module.trade.service.brokerage.record.bo.UserBrokerageSummaryBO;
7 8  
8 9 import java.util.List;
9 10  
... ... @@ -44,7 +45,7 @@ public interface TradeBrokerageRecordService {
44 45 * 取消佣金:将佣金记录,状态修改为已失效
45 46 *
46 47 * @param userId 会员编号
47   - * @param bizId 业务编号
  48 + * @param bizId 业务编号
48 49 */
49 50 void cancelBrokerage(Long userId, String bizId);
50 51  
... ... @@ -55,4 +56,13 @@ public interface TradeBrokerageRecordService {
55 56 */
56 57 int unfreezeRecord();
57 58  
  59 + /**
  60 + * 汇总用户佣金
  61 + *
  62 + * @param userId 用户编号
  63 + * @param bizType 业务类型
  64 + * @param status 佣金状态
  65 + * @return 用户佣金汇总
  66 + */
  67 + UserBrokerageSummaryBO summaryByUserIdAndBizTypeAndStatus(Long userId, Integer bizType, Integer status);
58 68 }
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/record/TradeBrokerageRecordServiceImpl.java
... ... @@ -15,6 +15,7 @@ import cn.iocoder.yudao.module.trade.dal.mysql.brokerage.record.TradeBrokerageRe
15 15 import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordBizTypeEnum;
16 16 import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordStatusEnum;
17 17 import cn.iocoder.yudao.module.trade.service.brokerage.record.bo.BrokerageAddReqBO;
  18 +import cn.iocoder.yudao.module.trade.service.brokerage.record.bo.UserBrokerageSummaryBO;
18 19 import cn.iocoder.yudao.module.trade.service.brokerage.user.TradeBrokerageUserService;
19 20 import cn.iocoder.yudao.module.trade.service.config.TradeConfigService;
20 21 import lombok.extern.slf4j.Slf4j;
... ... @@ -203,6 +204,12 @@ public class TradeBrokerageRecordServiceImpl implements TradeBrokerageRecordServ
203 204 return count;
204 205 }
205 206  
  207 + @Override
  208 + public UserBrokerageSummaryBO summaryByUserIdAndBizTypeAndStatus(Long userId, Integer bizType, Integer status) {
  209 + UserBrokerageSummaryBO summaryBO = tradeBrokerageRecordMapper.selectCountAndSumPriceByUserIdAndBizTypeAndStatus(userId, bizType, status);
  210 + return summaryBO == null ? new UserBrokerageSummaryBO(0, 0) : summaryBO;
  211 + }
  212 +
206 213 @Transactional(rollbackFor = Exception.class)
207 214 public boolean unfreezeRecord(TradeBrokerageRecordDO record) {
208 215 // 更新记录状态
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/record/bo/UserBrokerageSummaryBO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.brokerage.record.bo;
  2 +
  3 +import lombok.AllArgsConstructor;
  4 +import lombok.Data;
  5 +import lombok.NoArgsConstructor;
  6 +
  7 +/**
  8 + * 用户佣金合计 BO
  9 + *
  10 + * @author owen
  11 + */
  12 +@Data
  13 +@NoArgsConstructor
  14 +@AllArgsConstructor
  15 +public class UserBrokerageSummaryBO {
  16 + /**
  17 + * 佣金数量
  18 + */
  19 + private Integer count;
  20 + /**
  21 + * 佣金总额
  22 + */
  23 + private Integer price;
  24 +}
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/user/TradeBrokerageUserService.java
... ... @@ -88,4 +88,11 @@ public interface TradeBrokerageUserService {
88 88 */
89 89 void updateFrozenBrokeragePriceDecrAndBrokeragePriceIncr(Long id, int frozenBrokeragePrice);
90 90  
  91 + /**
  92 + * 获得推广用户数量(一级)
  93 + *
  94 + * @param brokerageUserId 推广员编号
  95 + * @return 推广用户数量
  96 + */
  97 + Long getCountByBrokerageUserId(Long brokerageUserId);
91 98 }
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/user/TradeBrokerageUserServiceImpl.java
... ... @@ -109,4 +109,9 @@ public class TradeBrokerageUserServiceImpl implements TradeBrokerageUserService
109 109 }
110 110 }
111 111  
  112 + @Override
  113 + public Long getCountByBrokerageUserId(Long brokerageUserId) {
  114 + return brokerageUserMapper.selectCount(TradeBrokerageUserDO::getBrokerageUserId, brokerageUserId);
  115 + }
  116 +
112 117 }
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/user/MemberUserDO.java
... ... @@ -136,38 +136,4 @@ public class MemberUserDO extends TenantBaseDO {
136 136 */
137 137 private Long groupId;
138 138  
139   - // TODO @疯狂:看看要不要删除掉哈
140   - // ========== 分销相关 ==========
141   -
142   - /**
143   - * 推广员编号
144   - */
145   - @TableField(exist = false) // TODO 芋艿:避免报错
146   - private Long brokerageUserId;
147   - /**
148   - * 推广员绑定时间
149   - */
150   - @TableField(exist = false) // TODO 芋艿:避免报错
151   - private LocalDateTime brokerageBindTime;
152   - /**
153   - * 是否成为推广员
154   - */
155   - @TableField(exist = false) // TODO 芋艿:避免报错
156   - private Boolean brokerageEnabled;
157   - /**
158   - * 成为分销员时间
159   - */
160   - @TableField(exist = false) // TODO 芋艿:避免报错
161   - private LocalDateTime brokerageTime;
162   - /**
163   - * 可用佣金
164   - */
165   - @TableField(exist = false) // TODO 芋艿:避免报错
166   - private Integer brokeragePrice;
167   - /**
168   - * 冻结佣金
169   - */
170   - @TableField(exist = false) // TODO 芋艿:避免报错
171   - private Integer frozenBrokeragePrice;
172   -
173 139 }
... ...