trade: 分销用户管理

This commit is contained in:
owen
2023-09-08 10:59:06 +08:00
parent 5808f77ade
commit 166b1b31c0
11 changed files with 163 additions and 41 deletions

View File

@ -2,9 +2,15 @@ package cn.iocoder.yudao.module.trade.controller.admin.brokerage.user;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.member.api.user.MemberUserApi;
import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
import cn.iocoder.yudao.module.trade.controller.admin.brokerage.user.vo.*;
import cn.iocoder.yudao.module.trade.convert.brokerage.user.TradeBrokerageUserConvert;
import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.user.TradeBrokerageUserDO;
import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordBizTypeEnum;
import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordStatusEnum;
import cn.iocoder.yudao.module.trade.service.brokerage.record.TradeBrokerageRecordService;
import cn.iocoder.yudao.module.trade.service.brokerage.record.bo.UserBrokerageSummaryBO;
import cn.iocoder.yudao.module.trade.service.brokerage.user.TradeBrokerageUserService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
@ -15,8 +21,12 @@ import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.Map;
import java.util.Set;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
@Tag(name = "管理后台 - 分销用户")
@RestController
@ -26,6 +36,11 @@ public class TradeBrokerageUserController {
@Resource
private TradeBrokerageUserService brokerageUserService;
@Resource
private TradeBrokerageRecordService brokerageRecordService;
@Resource
private MemberUserApi memberUserApi;
@PutMapping("/update-brokerage-user")
@Operation(summary = "修改推广员")
@ -64,8 +79,26 @@ public class TradeBrokerageUserController {
@Operation(summary = "获得分销用户分页")
@PreAuthorize("@ss.hasPermission('trade:brokerage-user:query')")
public CommonResult<PageResult<TradeBrokerageUserRespVO>> getBrokerageUserPage(@Valid TradeBrokerageUserPageReqVO pageVO) {
// 分页查询
PageResult<TradeBrokerageUserDO> pageResult = brokerageUserService.getBrokerageUserPage(pageVO);
return success(TradeBrokerageUserConvert.INSTANCE.convertPage(pageResult));
// 涉及到的用户
Set<Long> userIds = convertSet(pageResult.getList(), TradeBrokerageUserDO::getId);
// 查询用户信息
Map<Long, MemberUserRespDTO> userMap = memberUserApi.getUserMap(userIds);
// 合计分佣订单
Map<Long, UserBrokerageSummaryBO> userOrderSummaryMap = convertMap(userIds,
userId -> userId,
userId -> brokerageRecordService.summaryByUserIdAndBizTypeAndStatus(userId,
BrokerageRecordBizTypeEnum.ORDER.getType(), BrokerageRecordStatusEnum.SETTLEMENT.getStatus()));
// 合计推广用户数量
Map<Long, Long> brokerageUserCountMap = convertMap(userIds,
userId -> userId,
userId -> brokerageUserService.getCountByBrokerageUserId(userId));
// todo 合计提现
return success(TradeBrokerageUserConvert.INSTANCE.convertPage(pageResult, userMap, brokerageUserCountMap, userOrderSummaryMap));
}
}

View File

@ -19,4 +19,30 @@ public class TradeBrokerageUserRespVO extends TradeBrokerageUserBaseVO {
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
private LocalDateTime createTime;
// ========== 用户信息 ==========
@Schema(description = "用户头像", example = "https://www.iocoder.cn/xxx.png")
private String avatar;
@Schema(description = "用户昵称", example = "李四")
private String nickname;
// ========== 推广信息 ==========
@Schema(description = "推广用户数量(一级)", example = "20019")
private Integer brokerageUserCount;
@Schema(description = "推广订单数量", example = "20019")
private Integer brokerageOrderCount;
@Schema(description = "推广订单金额", example = "20019")
private Integer brokerageOrderPrice;
// ========== 提现信息 ==========
@Schema(description = "已提现金额", example = "20019")
private Integer withdrawPrice;
@Schema(description = "已提现次数", example = "20019")
private Integer withdrawCount;
}

View File

@ -1,12 +1,17 @@
package cn.iocoder.yudao.module.trade.convert.brokerage.user;
import cn.hutool.core.map.MapUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
import cn.iocoder.yudao.module.trade.controller.admin.brokerage.user.vo.TradeBrokerageUserRespVO;
import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.user.TradeBrokerageUserDO;
import cn.iocoder.yudao.module.trade.service.brokerage.record.bo.UserBrokerageSummaryBO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import java.util.List;
import java.util.Map;
import java.util.Optional;
/**
* 分销用户 Convert
@ -24,4 +29,33 @@ public interface TradeBrokerageUserConvert {
PageResult<TradeBrokerageUserRespVO> convertPage(PageResult<TradeBrokerageUserDO> page);
default PageResult<TradeBrokerageUserRespVO> convertPage(PageResult<TradeBrokerageUserDO> pageResult,
Map<Long, MemberUserRespDTO> userMap,
Map<Long, Long> brokerageUserCountMap,
Map<Long, UserBrokerageSummaryBO> userOrderSummaryMap) {
PageResult<TradeBrokerageUserRespVO> result = convertPage(pageResult);
for (TradeBrokerageUserRespVO vo : result.getList()) {
// 用户信息
Optional.ofNullable(userMap.get(vo.getId()))
.ifPresent(user -> {
vo.setNickname(user.getNickname());
vo.setAvatar(user.getAvatar());
});
// 推广用户数量(一级)
vo.setBrokerageUserCount(MapUtil.getInt(brokerageUserCountMap, vo.getId(), 0));
Optional<UserBrokerageSummaryBO> orderSummaryOptional = Optional.ofNullable(userOrderSummaryMap.get(vo.getId()));
// 推广订单数量
vo.setBrokerageOrderCount(orderSummaryOptional.map(UserBrokerageSummaryBO::getCount).orElse(0));
// 推广订单金额
vo.setBrokerageOrderPrice(orderSummaryOptional.map(UserBrokerageSummaryBO::getPrice).orElse(0));
// todo 已提现次数
vo.setWithdrawCount(0);
// todo 已提现金额
vo.setWithdrawPrice(0);
}
return result;
}
}

View File

@ -5,8 +5,11 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.trade.controller.admin.brokerage.record.vo.TradeBrokerageRecordPageReqVO;
import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.record.TradeBrokerageRecordDO;
import cn.iocoder.yudao.module.trade.service.brokerage.record.bo.UserBrokerageSummaryBO;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.time.LocalDateTime;
import java.util.List;
@ -46,4 +49,8 @@ public interface TradeBrokerageRecordMapper extends BaseMapperX<TradeBrokerageRe
TradeBrokerageRecordDO::getBizId, bizId);
}
@Select("select count(1), sum(price) from trade_brokerage_record where user_id = #{userId} and biz_type = #{bizType} and status = #{status}")
UserBrokerageSummaryBO selectCountAndSumPriceByUserIdAndBizTypeAndStatus(@Param("userId") Long userId,
@Param("bizType") Integer bizType,
@Param("status") Integer status);
}

View File

@ -1,9 +1,10 @@
package cn.iocoder.yudao.module.trade.service.brokerage.record;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.trade.controller.admin.brokerage.record.vo.TradeBrokerageRecordPageReqVO;
import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.record.TradeBrokerageRecordDO;
import cn.iocoder.yudao.module.trade.service.brokerage.record.bo.BrokerageAddReqBO;
import cn.iocoder.yudao.module.trade.controller.admin.brokerage.record.vo.TradeBrokerageRecordPageReqVO;
import cn.iocoder.yudao.module.trade.service.brokerage.record.bo.UserBrokerageSummaryBO;
import java.util.List;
@ -44,7 +45,7 @@ public interface TradeBrokerageRecordService {
* 取消佣金:将佣金记录,状态修改为已失效
*
* @param userId 会员编号
* @param bizId 业务编号
* @param bizId 业务编号
*/
void cancelBrokerage(Long userId, String bizId);
@ -55,4 +56,13 @@ public interface TradeBrokerageRecordService {
*/
int unfreezeRecord();
/**
* 汇总用户佣金
*
* @param userId 用户编号
* @param bizType 业务类型
* @param status 佣金状态
* @return 用户佣金汇总
*/
UserBrokerageSummaryBO summaryByUserIdAndBizTypeAndStatus(Long userId, Integer bizType, Integer status);
}

View File

@ -15,6 +15,7 @@ import cn.iocoder.yudao.module.trade.dal.mysql.brokerage.record.TradeBrokerageRe
import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordBizTypeEnum;
import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordStatusEnum;
import cn.iocoder.yudao.module.trade.service.brokerage.record.bo.BrokerageAddReqBO;
import cn.iocoder.yudao.module.trade.service.brokerage.record.bo.UserBrokerageSummaryBO;
import cn.iocoder.yudao.module.trade.service.brokerage.user.TradeBrokerageUserService;
import cn.iocoder.yudao.module.trade.service.config.TradeConfigService;
import lombok.extern.slf4j.Slf4j;
@ -203,6 +204,12 @@ public class TradeBrokerageRecordServiceImpl implements TradeBrokerageRecordServ
return count;
}
@Override
public UserBrokerageSummaryBO summaryByUserIdAndBizTypeAndStatus(Long userId, Integer bizType, Integer status) {
UserBrokerageSummaryBO summaryBO = tradeBrokerageRecordMapper.selectCountAndSumPriceByUserIdAndBizTypeAndStatus(userId, bizType, status);
return summaryBO == null ? new UserBrokerageSummaryBO(0, 0) : summaryBO;
}
@Transactional(rollbackFor = Exception.class)
public boolean unfreezeRecord(TradeBrokerageRecordDO record) {
// 更新记录状态

View File

@ -0,0 +1,24 @@
package cn.iocoder.yudao.module.trade.service.brokerage.record.bo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 用户佣金合计 BO
*
* @author owen
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserBrokerageSummaryBO {
/**
* 佣金数量
*/
private Integer count;
/**
* 佣金总额
*/
private Integer price;
}

View File

@ -88,4 +88,11 @@ public interface TradeBrokerageUserService {
*/
void updateFrozenBrokeragePriceDecrAndBrokeragePriceIncr(Long id, int frozenBrokeragePrice);
/**
* 获得推广用户数量(一级)
*
* @param brokerageUserId 推广员编号
* @return 推广用户数量
*/
Long getCountByBrokerageUserId(Long brokerageUserId);
}

View File

@ -109,4 +109,9 @@ public class TradeBrokerageUserServiceImpl implements TradeBrokerageUserService
}
}
@Override
public Long getCountByBrokerageUserId(Long brokerageUserId) {
return brokerageUserMapper.selectCount(TradeBrokerageUserDO::getBrokerageUserId, brokerageUserId);
}
}