mirror of
https://gitee.com/hhyykk/ipms-sjy.git
synced 2025-02-15 18:14:59 +08:00
code review:分销逻辑
This commit is contained in:
parent
3b5215db21
commit
557b09a157
@ -20,6 +20,7 @@ public class BrokerageApiImpl implements BrokerageApi {
|
|||||||
@Resource
|
@Resource
|
||||||
private BrokerageUserService brokerageUserService;
|
private BrokerageUserService brokerageUserService;
|
||||||
|
|
||||||
|
@Override
|
||||||
public BrokerageUserDTO getBrokerageUser(Long userId) {
|
public BrokerageUserDTO getBrokerageUser(Long userId) {
|
||||||
return BrokerageUserConvert.INSTANCE.convertDTO(brokerageUserService.getBrokerageUser(userId));
|
return BrokerageUserConvert.INSTANCE.convertDTO(brokerageUserService.getBrokerageUser(userId));
|
||||||
}
|
}
|
||||||
|
@ -62,7 +62,7 @@ public class BrokerageUserController {
|
|||||||
@Operation(summary = "修改推广资格")
|
@Operation(summary = "修改推广资格")
|
||||||
@PreAuthorize("@ss.hasPermission('trade:brokerage-user:update-brokerage-enable')")
|
@PreAuthorize("@ss.hasPermission('trade:brokerage-user:update-brokerage-enable')")
|
||||||
public CommonResult<Boolean> updateBrokerageEnabled(@Valid @RequestBody BrokerageUserUpdateBrokerageEnabledReqVO updateReqVO) {
|
public CommonResult<Boolean> updateBrokerageEnabled(@Valid @RequestBody BrokerageUserUpdateBrokerageEnabledReqVO updateReqVO) {
|
||||||
brokerageUserService.updateBrokerageEnabled(updateReqVO.getId(), updateReqVO.getEnabled());
|
brokerageUserService.updateBrokerageUserEnabled(updateReqVO.getId(), updateReqVO.getEnabled());
|
||||||
return success(true);
|
return success(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -89,12 +89,12 @@ public class BrokerageUserController {
|
|||||||
// 合计分佣订单
|
// 合计分佣订单
|
||||||
Map<Long, UserBrokerageSummaryBO> userOrderSummaryMap = convertMap(userIds,
|
Map<Long, UserBrokerageSummaryBO> userOrderSummaryMap = convertMap(userIds,
|
||||||
userId -> userId,
|
userId -> userId,
|
||||||
userId -> brokerageRecordService.summaryByUserIdAndBizTypeAndStatus(userId,
|
userId -> brokerageRecordService.getUserBrokerageSummaryByUserId(userId,
|
||||||
BrokerageRecordBizTypeEnum.ORDER.getType(), BrokerageRecordStatusEnum.SETTLEMENT.getStatus()));
|
BrokerageRecordBizTypeEnum.ORDER.getType(), BrokerageRecordStatusEnum.SETTLEMENT.getStatus()));
|
||||||
// 合计推广用户数量
|
// 合计推广用户数量
|
||||||
Map<Long, Long> brokerageUserCountMap = convertMap(userIds,
|
Map<Long, Long> brokerageUserCountMap = convertMap(userIds,
|
||||||
userId -> userId,
|
userId -> userId,
|
||||||
userId -> brokerageUserService.getCountByBindUserId(userId));
|
userId -> brokerageUserService.getBrokerageUserCountByBindUserId(userId));
|
||||||
|
|
||||||
// todo 合计提现
|
// todo 合计提现
|
||||||
|
|
||||||
|
@ -23,21 +23,18 @@ public class AppBrokerageWithdrawCreateReqVO {
|
|||||||
@Min(value = 1, message = "提现金额不能小于 1")
|
@Min(value = 1, message = "提现金额不能小于 1")
|
||||||
private Integer price;
|
private Integer price;
|
||||||
|
|
||||||
|
|
||||||
// ========== 银行卡、微信、支付宝 提现相关字段 ==========
|
// ========== 银行卡、微信、支付宝 提现相关字段 ==========
|
||||||
|
|
||||||
@Schema(description = "提现账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "123456789")
|
@Schema(description = "提现账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "123456789")
|
||||||
@NotBlank(message = "提现账号不能为空", groups = {Bank.class, Wechat.class, Alipay.class})
|
@NotBlank(message = "提现账号不能为空", groups = {Bank.class, Wechat.class, Alipay.class})
|
||||||
private String accountNo;
|
private String accountNo;
|
||||||
|
|
||||||
|
|
||||||
// ========== 微信、支付宝 提现相关字段 ==========
|
// ========== 微信、支付宝 提现相关字段 ==========
|
||||||
|
|
||||||
@Schema(description = "收款码的图片", example = "https://www.iocoder.cn/1.png")
|
@Schema(description = "收款码的图片", example = "https://www.iocoder.cn/1.png")
|
||||||
@URL(message = "收款码的图片,必须是一个 URL")
|
@URL(message = "收款码的图片,必须是一个 URL")
|
||||||
private String accountQrCodeUrl;
|
private String accountQrCodeUrl;
|
||||||
|
|
||||||
|
|
||||||
// ========== 银行卡 提现相关字段 ==========
|
// ========== 银行卡 提现相关字段 ==========
|
||||||
|
|
||||||
@Schema(description = "持卡人姓名", example = "张三")
|
@Schema(description = "持卡人姓名", example = "张三")
|
||||||
|
@ -30,25 +30,21 @@ public interface BrokerageRecordConvert {
|
|||||||
|
|
||||||
PageResult<BrokerageRecordRespVO> convertPage(PageResult<BrokerageRecordDO> page);
|
PageResult<BrokerageRecordRespVO> convertPage(PageResult<BrokerageRecordDO> page);
|
||||||
|
|
||||||
|
// TODO @疯狂:可能 title 不是很固化,会存在类似:沐晴成功购买《XXX JVM 实战》
|
||||||
default BrokerageRecordDO convert(BrokerageUserDO user, BrokerageRecordBizTypeEnum bizType, String bizId,
|
default BrokerageRecordDO convert(BrokerageUserDO user, BrokerageRecordBizTypeEnum bizType, String bizId,
|
||||||
Integer brokerageFrozenDays, int brokerage, LocalDateTime unfreezeTime,
|
Integer brokerageFrozenDays, int brokeragePrice, LocalDateTime unfreezeTime,
|
||||||
String title) {
|
String title) {
|
||||||
brokerageFrozenDays = ObjectUtil.defaultIfNull(brokerageFrozenDays, 0);
|
brokerageFrozenDays = ObjectUtil.defaultIfNull(brokerageFrozenDays, 0);
|
||||||
// 不冻结时,佣金直接就是结算状态
|
// 不冻结时,佣金直接就是结算状态
|
||||||
Integer status = brokerageFrozenDays > 0
|
Integer status = brokerageFrozenDays > 0
|
||||||
? BrokerageRecordStatusEnum.WAIT_SETTLEMENT.getStatus()
|
? BrokerageRecordStatusEnum.WAIT_SETTLEMENT.getStatus()
|
||||||
: BrokerageRecordStatusEnum.SETTLEMENT.getStatus();
|
: BrokerageRecordStatusEnum.SETTLEMENT.getStatus();
|
||||||
return new BrokerageRecordDO()
|
return new BrokerageRecordDO().setUserId(user.getId())
|
||||||
.setUserId(user.getId())
|
.setBizType(bizType.getType()).setBizId(bizId)
|
||||||
.setBizType(bizType.getType())
|
.setPrice(brokeragePrice).setTotalPrice(user.getPrice())
|
||||||
.setBizId(bizId)
|
|
||||||
.setPrice(brokerage)
|
|
||||||
.setTotalPrice(user.getPrice())
|
|
||||||
.setTitle(title)
|
.setTitle(title)
|
||||||
.setDescription(StrUtil.format(bizType.getDescription(), String.valueOf(brokerage / 100.0)))
|
.setDescription(StrUtil.format(bizType.getDescription(), String.valueOf(brokeragePrice / 100.0)))
|
||||||
.setStatus(status)
|
.setStatus(status).setFrozenDays(brokerageFrozenDays).setUnfreezeTime(unfreezeTime);
|
||||||
.setFrozenDays(brokerageFrozenDays)
|
|
||||||
.setUnfreezeTime(unfreezeTime);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -37,24 +37,16 @@ public interface BrokerageUserConvert {
|
|||||||
PageResult<BrokerageUserRespVO> result = convertPage(pageResult);
|
PageResult<BrokerageUserRespVO> result = convertPage(pageResult);
|
||||||
for (BrokerageUserRespVO vo : result.getList()) {
|
for (BrokerageUserRespVO vo : result.getList()) {
|
||||||
// 用户信息
|
// 用户信息
|
||||||
Optional.ofNullable(userMap.get(vo.getId()))
|
Optional.ofNullable(userMap.get(vo.getId())).ifPresent(
|
||||||
.ifPresent(user -> {
|
user -> vo.setNickname(user.getNickname()).setAvatar(user.getAvatar()));
|
||||||
vo.setNickname(user.getNickname());
|
|
||||||
vo.setAvatar(user.getAvatar());
|
|
||||||
});
|
|
||||||
|
|
||||||
// 推广用户数量(一级)
|
// 推广用户数量(一级)
|
||||||
vo.setBrokerageUserCount(MapUtil.getInt(brokerageUserCountMap, vo.getId(), 0));
|
vo.setBrokerageUserCount(MapUtil.getInt(brokerageUserCountMap, vo.getId(), 0));
|
||||||
|
// 推广订单数量、推广订单金额
|
||||||
Optional<UserBrokerageSummaryBO> orderSummaryOptional = Optional.ofNullable(userOrderSummaryMap.get(vo.getId()));
|
Optional<UserBrokerageSummaryBO> orderSummaryOptional = Optional.ofNullable(userOrderSummaryMap.get(vo.getId()));
|
||||||
// 推广订单数量
|
vo.setBrokerageOrderCount(orderSummaryOptional.map(UserBrokerageSummaryBO::getCount).orElse(0))
|
||||||
vo.setBrokerageOrderCount(orderSummaryOptional.map(UserBrokerageSummaryBO::getCount).orElse(0));
|
.setBrokerageOrderPrice(orderSummaryOptional.map(UserBrokerageSummaryBO::getPrice).orElse(0));
|
||||||
// 推广订单金额
|
// todo 已提现次数、已提现金额
|
||||||
vo.setBrokerageOrderPrice(orderSummaryOptional.map(UserBrokerageSummaryBO::getPrice).orElse(0));
|
|
||||||
|
|
||||||
// todo 已提现次数
|
|
||||||
vo.setWithdrawCount(0);
|
vo.setWithdrawCount(0);
|
||||||
// todo 已提现金额
|
|
||||||
vo.setWithdrawPrice(0);
|
vo.setWithdrawPrice(0);
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
|
@ -48,6 +48,7 @@ public interface BrokerageRecordMapper extends BaseMapperX<BrokerageRecordDO> {
|
|||||||
BrokerageRecordDO::getBizId, bizId);
|
BrokerageRecordDO::getBizId, bizId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO @疯狂:mysql 关键字,大写哈;这样看起来清晰点;例如说 SELECT COUNT(1)
|
||||||
@Select("select count(1), sum(price) from trade_brokerage_record where user_id = #{userId} and biz_type = #{bizType} and status = #{status}")
|
@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,
|
UserBrokerageSummaryBO selectCountAndSumPriceByUserIdAndBizTypeAndStatus(@Param("userId") Long userId,
|
||||||
@Param("bizType") Integer bizType,
|
@Param("bizType") Integer bizType,
|
||||||
|
@ -111,4 +111,5 @@ public interface BrokerageUserMapper extends BaseMapperX<BrokerageUserDO> {
|
|||||||
.eq(BrokerageUserDO::getId, id)
|
.eq(BrokerageUserDO::getId, id)
|
||||||
.set(BrokerageUserDO::getBrokerageEnabled, false).set(BrokerageUserDO::getBrokerageTime, null));
|
.set(BrokerageUserDO::getBrokerageEnabled, false).set(BrokerageUserDO::getBrokerageTime, null));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,7 @@ import lombok.Data;
|
|||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
import javax.validation.constraints.NotBlank;
|
import javax.validation.constraints.NotBlank;
|
||||||
|
import javax.validation.constraints.NotNull;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 佣金 增加 Request BO
|
* 佣金 增加 Request BO
|
||||||
@ -24,6 +25,7 @@ public class BrokerageAddReqBO {
|
|||||||
/**
|
/**
|
||||||
* 佣金基数
|
* 佣金基数
|
||||||
*/
|
*/
|
||||||
|
@NotNull(message = "佣金基数不能为空")
|
||||||
private Integer basePrice;
|
private Integer basePrice;
|
||||||
/**
|
/**
|
||||||
* 一级佣金(固定)
|
* 一级佣金(固定)
|
||||||
|
@ -13,6 +13,7 @@ import lombok.NoArgsConstructor;
|
|||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
public class UserBrokerageSummaryBO {
|
public class UserBrokerageSummaryBO {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 佣金数量
|
* 佣金数量
|
||||||
*/
|
*/
|
||||||
@ -21,4 +22,5 @@ public class UserBrokerageSummaryBO {
|
|||||||
* 佣金总额
|
* 佣金总额
|
||||||
*/
|
*/
|
||||||
private Integer price;
|
private Integer price;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -66,5 +66,5 @@ public interface BrokerageRecordService {
|
|||||||
* @param status 佣金状态
|
* @param status 佣金状态
|
||||||
* @return 用户佣金汇总
|
* @return 用户佣金汇总
|
||||||
*/
|
*/
|
||||||
UserBrokerageSummaryBO summaryByUserIdAndBizTypeAndStatus(Long userId, Integer bizType, Integer status);
|
UserBrokerageSummaryBO getUserBrokerageSummaryByUserId(Long userId, Integer bizType, Integer status);
|
||||||
}
|
}
|
||||||
|
@ -89,6 +89,7 @@ public class BrokerageRecordServiceImpl implements BrokerageRecordService {
|
|||||||
@Override
|
@Override
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public void cancelBrokerage(Long userId, BrokerageRecordBizTypeEnum bizType, String bizId) {
|
public void cancelBrokerage(Long userId, BrokerageRecordBizTypeEnum bizType, String bizId) {
|
||||||
|
// TODO @疯狂:userId 加进去查询,会不会更好一点?万一穿错参数;
|
||||||
BrokerageRecordDO record = brokerageRecordMapper.selectByBizTypeAndBizId(bizType.getType(), bizId);
|
BrokerageRecordDO record = brokerageRecordMapper.selectByBizTypeAndBizId(bizType.getType(), bizId);
|
||||||
if (record == null || ObjectUtil.notEqual(record.getUserId(), userId)) {
|
if (record == null || ObjectUtil.notEqual(record.getUserId(), userId)) {
|
||||||
log.error("[cancelBrokerage][userId({})][bizId({}) 更新为已失效失败:记录不存在]", userId, bizId);
|
log.error("[cancelBrokerage][userId({})][bizId({}) 更新为已失效失败:记录不存在]", userId, bizId);
|
||||||
@ -138,7 +139,7 @@ public class BrokerageRecordServiceImpl implements BrokerageRecordService {
|
|||||||
* @param list 佣金增加参数列表
|
* @param list 佣金增加参数列表
|
||||||
* @param brokerageFrozenDays 冻结天数
|
* @param brokerageFrozenDays 冻结天数
|
||||||
* @param brokeragePercent 佣金比例
|
* @param brokeragePercent 佣金比例
|
||||||
* @param fixedPriceFun 固定佣金
|
* @param fixedPriceFun 固定佣金 // TODO 疯狂:这里是不是可以直接传递 fixedPrice 呀?
|
||||||
* @param bizType 业务类型
|
* @param bizType 业务类型
|
||||||
*/
|
*/
|
||||||
private void addBrokerage(BrokerageUserDO user, List<BrokerageAddReqBO> list, Integer brokerageFrozenDays,
|
private void addBrokerage(BrokerageUserDO user, List<BrokerageAddReqBO> list, Integer brokerageFrozenDays,
|
||||||
@ -200,9 +201,9 @@ public class BrokerageRecordServiceImpl implements BrokerageRecordService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public UserBrokerageSummaryBO summaryByUserIdAndBizTypeAndStatus(Long userId, Integer bizType, Integer status) {
|
public UserBrokerageSummaryBO getUserBrokerageSummaryByUserId(Long userId, Integer bizType, Integer status) {
|
||||||
UserBrokerageSummaryBO summaryBO = brokerageRecordMapper.selectCountAndSumPriceByUserIdAndBizTypeAndStatus(userId, bizType, status);
|
UserBrokerageSummaryBO summaryBO = brokerageRecordMapper.selectCountAndSumPriceByUserIdAndBizTypeAndStatus(userId, bizType, status);
|
||||||
return summaryBO == null ? new UserBrokerageSummaryBO(0, 0) : summaryBO;
|
return summaryBO != null ? summaryBO : new UserBrokerageSummaryBO(0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
@ -52,7 +52,7 @@ public interface BrokerageUserService {
|
|||||||
* @param id 用户编号
|
* @param id 用户编号
|
||||||
* @param enabled 推广资格
|
* @param enabled 推广资格
|
||||||
*/
|
*/
|
||||||
void updateBrokerageEnabled(Long id, Boolean enabled);
|
void updateBrokerageUserEnabled(Long id, Boolean enabled);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获得用户的推广人
|
* 获得用户的推广人
|
||||||
@ -79,20 +79,21 @@ public interface BrokerageUserService {
|
|||||||
void updateUserFrozenPrice(Long id, Integer frozenPrice);
|
void updateUserFrozenPrice(Long id, Integer frozenPrice);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 更新用户冻结佣金(减少), 更新用户佣金(增加)
|
* 更新用户冻结佣金(减少),更新用户佣金(增加)
|
||||||
*
|
*
|
||||||
* @param id 用户编号
|
* @param id 用户编号
|
||||||
* @param frozenPrice 减少冻结佣金(负数)
|
* @param frozenPrice 减少冻结佣金(负数)
|
||||||
*/
|
*/
|
||||||
void updateFrozenPriceDecrAndPriceIncr(Long id, Integer frozenPrice);
|
void updateFrozenPriceDecrAndPriceIncr(Long id, Integer frozenPrice);
|
||||||
|
|
||||||
|
// TODO @疯狂:这个后面可能要支持下,二级
|
||||||
/**
|
/**
|
||||||
* 获得推广用户数量(一级)
|
* 获得推广用户数量(一级)
|
||||||
*
|
*
|
||||||
* @param bindUserId 绑定的推广员编号
|
* @param bindUserId 绑定的推广员编号
|
||||||
* @return 推广用户数量
|
* @return 推广用户数量
|
||||||
*/
|
*/
|
||||||
Long getCountByBindUserId(Long bindUserId);
|
Long getBrokerageUserCountByBindUserId(Long bindUserId);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 【会员】绑定推广员
|
* 【会员】绑定推广员
|
||||||
@ -103,4 +104,5 @@ public interface BrokerageUserService {
|
|||||||
* @return 是否绑定
|
* @return 是否绑定
|
||||||
*/
|
*/
|
||||||
boolean bindUser(Long userId, Long bindUserId, Boolean isNewUser);
|
boolean bindUser(Long userId, Long bindUserId, Boolean isNewUser);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -57,18 +57,22 @@ public class BrokerageUserServiceImpl implements BrokerageUserService {
|
|||||||
public void updateBrokerageUserId(Long id, Long bindUserId) {
|
public void updateBrokerageUserId(Long id, Long bindUserId) {
|
||||||
// 校验存在
|
// 校验存在
|
||||||
validateBrokerageUserExists(id);
|
validateBrokerageUserExists(id);
|
||||||
|
|
||||||
|
// 情况一:清除推广员
|
||||||
if (bindUserId == null) {
|
if (bindUserId == null) {
|
||||||
// 清除推广员
|
// 清除推广员
|
||||||
brokerageUserMapper.updateBindUserIdAndBindUserTimeToNull(id);
|
brokerageUserMapper.updateBindUserIdAndBindUserTimeToNull(id);
|
||||||
} else {
|
return;
|
||||||
// 修改推广员
|
}
|
||||||
|
|
||||||
|
// 情况二:修改推广员
|
||||||
|
// TODO @疯狂:要复用一些 validateCanBindUser 的校验哈;
|
||||||
brokerageUserMapper.updateById(new BrokerageUserDO().setId(id)
|
brokerageUserMapper.updateById(new BrokerageUserDO().setId(id)
|
||||||
.setBindUserId(bindUserId).setBindUserTime(LocalDateTime.now()));
|
.setBindUserId(bindUserId).setBindUserTime(LocalDateTime.now()));
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateBrokerageEnabled(Long id, Boolean enabled) {
|
public void updateBrokerageUserEnabled(Long id, Boolean enabled) {
|
||||||
// 校验存在
|
// 校验存在
|
||||||
validateBrokerageUserExists(id);
|
validateBrokerageUserExists(id);
|
||||||
if (BooleanUtil.isTrue(enabled)) {
|
if (BooleanUtil.isTrue(enabled)) {
|
||||||
@ -124,36 +128,41 @@ public class BrokerageUserServiceImpl implements BrokerageUserService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Long getCountByBindUserId(Long bindUserId) {
|
public Long getBrokerageUserCountByBindUserId(Long bindUserId) {
|
||||||
|
// TODO @疯狂:mapper 封装下哈;不直接在 service 调用这种基础 mapper 的基础方法
|
||||||
return brokerageUserMapper.selectCount(BrokerageUserDO::getBindUserId, bindUserId);
|
return brokerageUserMapper.selectCount(BrokerageUserDO::getBindUserId, bindUserId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO @疯狂:因为现在 user 会存在使用验证码直接注册,所以 isNewUser 不太好传递;我们是不是可以约定绑定的时间,createTime 在 30 秒内,就认为新用户;
|
||||||
@Override
|
@Override
|
||||||
public boolean bindUser(Long userId, Long bindUserId, Boolean isNewUser) {
|
public boolean bindUser(Long userId, Long bindUserId, Boolean isNewUser) {
|
||||||
|
// TODO @疯狂:userId 为空,搞到参数校验里哇;
|
||||||
if (userId == null) {
|
if (userId == null) {
|
||||||
throw exception(0);
|
throw exception(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean isInsert = false;
|
// 1. 获得分销用户
|
||||||
|
boolean isNewBrokerageUser = false;
|
||||||
BrokerageUserDO brokerageUser = brokerageUserMapper.selectById(userId);
|
BrokerageUserDO brokerageUser = brokerageUserMapper.selectById(userId);
|
||||||
// 分销用户不存在的情况:1.新注册 2.旧数据 3.分销功能关闭后又打开
|
if (brokerageUser == null) { // 分销用户不存在的情况:1. 新注册;2. 旧数据;3. 分销功能关闭后又打开
|
||||||
if (brokerageUser == null) {
|
isNewBrokerageUser = true;
|
||||||
isInsert = true;
|
|
||||||
brokerageUser = new BrokerageUserDO().setId(userId).setBrokerageEnabled(false).setPrice(0).setFrozenPrice(0);
|
brokerageUser = new BrokerageUserDO().setId(userId).setBrokerageEnabled(false).setPrice(0).setFrozenPrice(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 校验能否绑定
|
// 2.1 校验能否绑定
|
||||||
boolean validated = validateCanBindUser(brokerageUser, bindUserId, isNewUser);
|
boolean validated = validateCanBindUser(brokerageUser, bindUserId, isNewUser);
|
||||||
if (!validated) {
|
if (!validated) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isInsert) {
|
// 2.2 绑定用户
|
||||||
|
if (isNewBrokerageUser) {
|
||||||
Integer enabledCondition = tradeConfigService.getTradeConfig().getBrokerageEnabledCondition();
|
Integer enabledCondition = tradeConfigService.getTradeConfig().getBrokerageEnabledCondition();
|
||||||
if (BrokerageEnabledConditionEnum.ALL.getCondition().equals(enabledCondition)) {
|
if (BrokerageEnabledConditionEnum.ALL.getCondition().equals(enabledCondition)) { // 人人分销:用户默认就有分销资格
|
||||||
// 人人分销:用户默认就有分销资格
|
// TODO @疯狂:应该设置下 brokerageTime,而不是 bindUserTime
|
||||||
brokerageUser.setBrokerageEnabled(true).setBindUserTime(LocalDateTime.now());
|
brokerageUser.setBrokerageEnabled(true).setBindUserTime(LocalDateTime.now());
|
||||||
}
|
}
|
||||||
|
// TODO @疯狂:这里是不是要设置 bindUserId、bindUserTime 字段哈;
|
||||||
brokerageUserMapper.insert(brokerageUser);
|
brokerageUserMapper.insert(brokerageUser);
|
||||||
} else {
|
} else {
|
||||||
brokerageUserMapper.updateById(new BrokerageUserDO().setId(userId)
|
brokerageUserMapper.updateById(new BrokerageUserDO().setId(userId)
|
||||||
@ -162,14 +171,16 @@ public class BrokerageUserServiceImpl implements BrokerageUserService {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO @疯狂:validate 方法,一般不返回 true false,而是抛出异常;如果要返回 true false 这种,方法名字可以改成 isUserCanBind
|
||||||
private boolean validateCanBindUser(BrokerageUserDO user, Long bindUserId, Boolean isNewUser) {
|
private boolean validateCanBindUser(BrokerageUserDO user, Long bindUserId, Boolean isNewUser) {
|
||||||
|
// TODO @疯狂:bindUserId 为空,搞到参数校验里哇;
|
||||||
if (bindUserId == null) {
|
if (bindUserId == null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 校验分销功能是否启用
|
// 校验分销功能是否启用
|
||||||
TradeConfigDO tradeConfig = tradeConfigService.getTradeConfig();
|
TradeConfigDO tradeConfig = tradeConfigService.getTradeConfig();
|
||||||
if (tradeConfig == null || !BooleanUtil.isTrue(tradeConfig.getBrokerageEnabled())) {
|
if (tradeConfig == null || BooleanUtil.isFalse(tradeConfig.getBrokerageEnabled())) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -180,7 +191,7 @@ public class BrokerageUserServiceImpl implements BrokerageUserService {
|
|||||||
|
|
||||||
// 校验要绑定的用户有无推广资格
|
// 校验要绑定的用户有无推广资格
|
||||||
BrokerageUserDO bindUser = brokerageUserMapper.selectById(bindUserId);
|
BrokerageUserDO bindUser = brokerageUserMapper.selectById(bindUserId);
|
||||||
if (bindUser == null || !BooleanUtil.isTrue(bindUser.getBrokerageEnabled())) {
|
if (bindUser == null || BooleanUtil.isFalse(bindUser.getBrokerageEnabled())) {
|
||||||
throw exception(BROKERAGE_BIND_USER_NOT_ENABLED);
|
throw exception(BROKERAGE_BIND_USER_NOT_ENABLED);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -200,6 +211,7 @@ public class BrokerageUserServiceImpl implements BrokerageUserService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO @疯狂:这块是不是一直查询到根节点,中间不允许出现自己;就是不能形成环。虽然目前是 2 级,但是未来可能会改多级; = = 环的话,就会存在问题哈
|
||||||
// A->B->A:下级不能绑定自己的上级, A->B->C->A可以!!
|
// A->B->A:下级不能绑定自己的上级, A->B->C->A可以!!
|
||||||
if (Objects.equals(user.getId(), bindUser.getBindUserId())) {
|
if (Objects.equals(user.getId(), bindUser.getBindUserId())) {
|
||||||
throw exception(BROKERAGE_BIND_LOOP);
|
throw exception(BROKERAGE_BIND_LOOP);
|
||||||
|
@ -395,7 +395,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
|
|||||||
// 增加用户经验
|
// 增加用户经验
|
||||||
getSelf().addUserExperienceAsync(order.getUserId(), order.getPayPrice(), order.getId());
|
getSelf().addUserExperienceAsync(order.getUserId(), order.getPayPrice(), order.getId());
|
||||||
// 增加用户佣金
|
// 增加用户佣金
|
||||||
getSelf().addBrokerageAsync(order.getUserId(), BrokerageRecordBizTypeEnum.ORDER, order.getId());
|
getSelf().addBrokerageAsync(order.getUserId(), order.getId());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -675,7 +675,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
|
|||||||
// 扣减用户经验
|
// 扣减用户经验
|
||||||
getSelf().reduceUserExperienceAsync(order.getUserId(), orderRefundPrice, afterSaleId);
|
getSelf().reduceUserExperienceAsync(order.getUserId(), orderRefundPrice, afterSaleId);
|
||||||
// 更新分佣记录为已失效
|
// 更新分佣记录为已失效
|
||||||
getSelf().cancelBrokerageAsync(order.getUserId(), BrokerageRecordBizTypeEnum.ORDER, id);
|
getSelf().cancelBrokerageAsync(order.getUserId(), id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -785,16 +785,16 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
|
|||||||
|
|
||||||
|
|
||||||
@Async
|
@Async
|
||||||
protected void addBrokerageAsync(Long userId, BrokerageRecordBizTypeEnum bizType, Long orderId) {
|
protected void addBrokerageAsync(Long userId, Long orderId) {
|
||||||
List<TradeOrderItemDO> orderItems = tradeOrderItemMapper.selectListByOrderId(orderId);
|
List<TradeOrderItemDO> orderItems = tradeOrderItemMapper.selectListByOrderId(orderId);
|
||||||
List<BrokerageAddReqBO> list = convertList(orderItems,
|
List<BrokerageAddReqBO> list = convertList(orderItems,
|
||||||
item -> TradeOrderConvert.INSTANCE.convert(item, productSkuApi.getSku(item.getSkuId())));
|
item -> TradeOrderConvert.INSTANCE.convert(item, productSkuApi.getSku(item.getSkuId())));
|
||||||
brokerageRecordService.addBrokerage(userId, bizType, list);
|
brokerageRecordService.addBrokerage(userId, BrokerageRecordBizTypeEnum.ORDER, list);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Async
|
@Async
|
||||||
protected void cancelBrokerageAsync(Long userId, BrokerageRecordBizTypeEnum bizType, Long orderItemId) {
|
protected void cancelBrokerageAsync(Long userId, Long orderItemId) {
|
||||||
brokerageRecordService.cancelBrokerage(userId, bizType, String.valueOf(orderItemId));
|
brokerageRecordService.cancelBrokerage(userId, BrokerageRecordBizTypeEnum.ORDER, String.valueOf(orderItemId));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -33,11 +33,6 @@
|
|||||||
<artifactId>yudao-module-infra-api</artifactId>
|
<artifactId>yudao-module-infra-api</artifactId>
|
||||||
<version>${revision}</version>
|
<version>${revision}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>cn.iocoder.boot</groupId>
|
|
||||||
<artifactId>yudao-module-trade-api</artifactId>
|
|
||||||
<version>${revision}</version>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<!-- 业务组件 -->
|
<!-- 业务组件 -->
|
||||||
<dependency>
|
<dependency>
|
||||||
|
@ -8,8 +8,6 @@ import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelDO;
|
|||||||
import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
|
import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
|
||||||
import cn.iocoder.yudao.module.member.service.level.MemberLevelService;
|
import cn.iocoder.yudao.module.member.service.level.MemberLevelService;
|
||||||
import cn.iocoder.yudao.module.member.service.user.MemberUserService;
|
import cn.iocoder.yudao.module.member.service.user.MemberUserService;
|
||||||
import cn.iocoder.yudao.module.trade.api.brokerage.BrokerageApi;
|
|
||||||
import cn.iocoder.yudao.module.trade.api.brokerage.dto.BrokerageUserDTO;
|
|
||||||
import io.swagger.v3.oas.annotations.Operation;
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@ -18,7 +16,6 @@ import org.springframework.web.bind.annotation.*;
|
|||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import javax.validation.Valid;
|
import javax.validation.Valid;
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||||
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
|
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
|
||||||
@ -32,23 +29,16 @@ public class AppMemberUserController {
|
|||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private MemberUserService userService;
|
private MemberUserService userService;
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private MemberLevelService levelService;
|
private MemberLevelService levelService;
|
||||||
|
|
||||||
@Resource
|
|
||||||
private BrokerageApi brokerageApi;
|
|
||||||
|
|
||||||
@GetMapping("/get")
|
@GetMapping("/get")
|
||||||
@Operation(summary = "获得基本信息")
|
@Operation(summary = "获得基本信息")
|
||||||
@PreAuthenticated
|
@PreAuthenticated
|
||||||
public CommonResult<AppMemberUserInfoRespVO> getUserInfo() {
|
public CommonResult<AppMemberUserInfoRespVO> getUserInfo() {
|
||||||
MemberUserDO user = userService.getUser(getLoginUserId());
|
MemberUserDO user = userService.getUser(getLoginUserId());
|
||||||
MemberLevelDO level = levelService.getLevel(user.getLevelId());
|
MemberLevelDO level = levelService.getLevel(user.getLevelId());
|
||||||
BrokerageUserDTO brokerageUser = brokerageApi.getBrokerageUser(user.getId());
|
return success(MemberUserConvert.INSTANCE.convert(user, level));
|
||||||
return success(MemberUserConvert.INSTANCE.convert(user, level)
|
|
||||||
.setBrokerageEnabled(Optional.ofNullable(brokerageUser).map(BrokerageUserDTO::getBrokerageEnabled).orElse(false))
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@PutMapping("/update")
|
@PutMapping("/update")
|
||||||
|
Loading…
Reference in New Issue
Block a user