Commit 557b09a15773733b7d3c1730059d222b37bfc508
1 parent
3b5215db
code review:分销逻辑
Showing
16 changed files
with
68 additions
and
76 deletions
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/api/brokerage/BrokerageApiImpl.java
| @@ -20,6 +20,7 @@ public class BrokerageApiImpl implements BrokerageApi { | @@ -20,6 +20,7 @@ public class BrokerageApiImpl implements BrokerageApi { | ||
| 20 | @Resource | 20 | @Resource |
| 21 | private BrokerageUserService brokerageUserService; | 21 | private BrokerageUserService brokerageUserService; |
| 22 | 22 | ||
| 23 | + @Override | ||
| 23 | public BrokerageUserDTO getBrokerageUser(Long userId) { | 24 | public BrokerageUserDTO getBrokerageUser(Long userId) { |
| 24 | return BrokerageUserConvert.INSTANCE.convertDTO(brokerageUserService.getBrokerageUser(userId)); | 25 | return BrokerageUserConvert.INSTANCE.convertDTO(brokerageUserService.getBrokerageUser(userId)); |
| 25 | } | 26 | } |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/user/BrokerageUserController.java
| @@ -62,7 +62,7 @@ public class BrokerageUserController { | @@ -62,7 +62,7 @@ public class BrokerageUserController { | ||
| 62 | @Operation(summary = "修改推广资格") | 62 | @Operation(summary = "修改推广资格") |
| 63 | @PreAuthorize("@ss.hasPermission('trade:brokerage-user:update-brokerage-enable')") | 63 | @PreAuthorize("@ss.hasPermission('trade:brokerage-user:update-brokerage-enable')") |
| 64 | public CommonResult<Boolean> updateBrokerageEnabled(@Valid @RequestBody BrokerageUserUpdateBrokerageEnabledReqVO updateReqVO) { | 64 | public CommonResult<Boolean> updateBrokerageEnabled(@Valid @RequestBody BrokerageUserUpdateBrokerageEnabledReqVO updateReqVO) { |
| 65 | - brokerageUserService.updateBrokerageEnabled(updateReqVO.getId(), updateReqVO.getEnabled()); | 65 | + brokerageUserService.updateBrokerageUserEnabled(updateReqVO.getId(), updateReqVO.getEnabled()); |
| 66 | return success(true); | 66 | return success(true); |
| 67 | } | 67 | } |
| 68 | 68 | ||
| @@ -89,12 +89,12 @@ public class BrokerageUserController { | @@ -89,12 +89,12 @@ public class BrokerageUserController { | ||
| 89 | // 合计分佣订单 | 89 | // 合计分佣订单 |
| 90 | Map<Long, UserBrokerageSummaryBO> userOrderSummaryMap = convertMap(userIds, | 90 | Map<Long, UserBrokerageSummaryBO> userOrderSummaryMap = convertMap(userIds, |
| 91 | userId -> userId, | 91 | userId -> userId, |
| 92 | - userId -> brokerageRecordService.summaryByUserIdAndBizTypeAndStatus(userId, | 92 | + userId -> brokerageRecordService.getUserBrokerageSummaryByUserId(userId, |
| 93 | BrokerageRecordBizTypeEnum.ORDER.getType(), BrokerageRecordStatusEnum.SETTLEMENT.getStatus())); | 93 | BrokerageRecordBizTypeEnum.ORDER.getType(), BrokerageRecordStatusEnum.SETTLEMENT.getStatus())); |
| 94 | // 合计推广用户数量 | 94 | // 合计推广用户数量 |
| 95 | Map<Long, Long> brokerageUserCountMap = convertMap(userIds, | 95 | Map<Long, Long> brokerageUserCountMap = convertMap(userIds, |
| 96 | userId -> userId, | 96 | userId -> userId, |
| 97 | - userId -> brokerageUserService.getCountByBindUserId(userId)); | 97 | + userId -> brokerageUserService.getBrokerageUserCountByBindUserId(userId)); |
| 98 | 98 | ||
| 99 | // todo 合计提现 | 99 | // todo 合计提现 |
| 100 | 100 |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/vo/withdraw/AppBrokerageWithdrawCreateReqVO.java
| @@ -23,21 +23,18 @@ public class AppBrokerageWithdrawCreateReqVO { | @@ -23,21 +23,18 @@ public class AppBrokerageWithdrawCreateReqVO { | ||
| 23 | @Min(value = 1, message = "提现金额不能小于 1") | 23 | @Min(value = 1, message = "提现金额不能小于 1") |
| 24 | private Integer price; | 24 | private Integer price; |
| 25 | 25 | ||
| 26 | - | ||
| 27 | // ========== 银行卡、微信、支付宝 提现相关字段 ========== | 26 | // ========== 银行卡、微信、支付宝 提现相关字段 ========== |
| 28 | 27 | ||
| 29 | @Schema(description = "提现账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "123456789") | 28 | @Schema(description = "提现账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "123456789") |
| 30 | @NotBlank(message = "提现账号不能为空", groups = {Bank.class, Wechat.class, Alipay.class}) | 29 | @NotBlank(message = "提现账号不能为空", groups = {Bank.class, Wechat.class, Alipay.class}) |
| 31 | private String accountNo; | 30 | private String accountNo; |
| 32 | 31 | ||
| 33 | - | ||
| 34 | // ========== 微信、支付宝 提现相关字段 ========== | 32 | // ========== 微信、支付宝 提现相关字段 ========== |
| 35 | 33 | ||
| 36 | @Schema(description = "收款码的图片", example = "https://www.iocoder.cn/1.png") | 34 | @Schema(description = "收款码的图片", example = "https://www.iocoder.cn/1.png") |
| 37 | @URL(message = "收款码的图片,必须是一个 URL") | 35 | @URL(message = "收款码的图片,必须是一个 URL") |
| 38 | private String accountQrCodeUrl; | 36 | private String accountQrCodeUrl; |
| 39 | 37 | ||
| 40 | - | ||
| 41 | // ========== 银行卡 提现相关字段 ========== | 38 | // ========== 银行卡 提现相关字段 ========== |
| 42 | 39 | ||
| 43 | @Schema(description = "持卡人姓名", example = "张三") | 40 | @Schema(description = "持卡人姓名", example = "张三") |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/brokerage/record/BrokerageRecordConvert.java
| @@ -30,25 +30,21 @@ public interface BrokerageRecordConvert { | @@ -30,25 +30,21 @@ public interface BrokerageRecordConvert { | ||
| 30 | 30 | ||
| 31 | PageResult<BrokerageRecordRespVO> convertPage(PageResult<BrokerageRecordDO> page); | 31 | PageResult<BrokerageRecordRespVO> convertPage(PageResult<BrokerageRecordDO> page); |
| 32 | 32 | ||
| 33 | + // TODO @疯狂:可能 title 不是很固化,会存在类似:沐晴成功购买《XXX JVM 实战》 | ||
| 33 | default BrokerageRecordDO convert(BrokerageUserDO user, BrokerageRecordBizTypeEnum bizType, String bizId, | 34 | default BrokerageRecordDO convert(BrokerageUserDO user, BrokerageRecordBizTypeEnum bizType, String bizId, |
| 34 | - Integer brokerageFrozenDays, int brokerage, LocalDateTime unfreezeTime, | 35 | + Integer brokerageFrozenDays, int brokeragePrice, LocalDateTime unfreezeTime, |
| 35 | String title) { | 36 | String title) { |
| 36 | brokerageFrozenDays = ObjectUtil.defaultIfNull(brokerageFrozenDays, 0); | 37 | brokerageFrozenDays = ObjectUtil.defaultIfNull(brokerageFrozenDays, 0); |
| 37 | // 不冻结时,佣金直接就是结算状态 | 38 | // 不冻结时,佣金直接就是结算状态 |
| 38 | Integer status = brokerageFrozenDays > 0 | 39 | Integer status = brokerageFrozenDays > 0 |
| 39 | ? BrokerageRecordStatusEnum.WAIT_SETTLEMENT.getStatus() | 40 | ? BrokerageRecordStatusEnum.WAIT_SETTLEMENT.getStatus() |
| 40 | : BrokerageRecordStatusEnum.SETTLEMENT.getStatus(); | 41 | : BrokerageRecordStatusEnum.SETTLEMENT.getStatus(); |
| 41 | - return new BrokerageRecordDO() | ||
| 42 | - .setUserId(user.getId()) | ||
| 43 | - .setBizType(bizType.getType()) | ||
| 44 | - .setBizId(bizId) | ||
| 45 | - .setPrice(brokerage) | ||
| 46 | - .setTotalPrice(user.getPrice()) | 42 | + return new BrokerageRecordDO().setUserId(user.getId()) |
| 43 | + .setBizType(bizType.getType()).setBizId(bizId) | ||
| 44 | + .setPrice(brokeragePrice).setTotalPrice(user.getPrice()) | ||
| 47 | .setTitle(title) | 45 | .setTitle(title) |
| 48 | - .setDescription(StrUtil.format(bizType.getDescription(), String.valueOf(brokerage / 100.0))) | ||
| 49 | - .setStatus(status) | ||
| 50 | - .setFrozenDays(brokerageFrozenDays) | ||
| 51 | - .setUnfreezeTime(unfreezeTime); | 46 | + .setDescription(StrUtil.format(bizType.getDescription(), String.valueOf(brokeragePrice / 100.0))) |
| 47 | + .setStatus(status).setFrozenDays(brokerageFrozenDays).setUnfreezeTime(unfreezeTime); | ||
| 52 | } | 48 | } |
| 53 | 49 | ||
| 54 | } | 50 | } |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/brokerage/user/BrokerageUserConvert.java
| @@ -37,24 +37,16 @@ public interface BrokerageUserConvert { | @@ -37,24 +37,16 @@ public interface BrokerageUserConvert { | ||
| 37 | PageResult<BrokerageUserRespVO> result = convertPage(pageResult); | 37 | PageResult<BrokerageUserRespVO> result = convertPage(pageResult); |
| 38 | for (BrokerageUserRespVO vo : result.getList()) { | 38 | for (BrokerageUserRespVO vo : result.getList()) { |
| 39 | // 用户信息 | 39 | // 用户信息 |
| 40 | - Optional.ofNullable(userMap.get(vo.getId())) | ||
| 41 | - .ifPresent(user -> { | ||
| 42 | - vo.setNickname(user.getNickname()); | ||
| 43 | - vo.setAvatar(user.getAvatar()); | ||
| 44 | - }); | ||
| 45 | - | 40 | + Optional.ofNullable(userMap.get(vo.getId())).ifPresent( |
| 41 | + user -> vo.setNickname(user.getNickname()).setAvatar(user.getAvatar())); | ||
| 46 | // 推广用户数量(一级) | 42 | // 推广用户数量(一级) |
| 47 | vo.setBrokerageUserCount(MapUtil.getInt(brokerageUserCountMap, vo.getId(), 0)); | 43 | vo.setBrokerageUserCount(MapUtil.getInt(brokerageUserCountMap, vo.getId(), 0)); |
| 48 | - | 44 | + // 推广订单数量、推广订单金额 |
| 49 | Optional<UserBrokerageSummaryBO> orderSummaryOptional = Optional.ofNullable(userOrderSummaryMap.get(vo.getId())); | 45 | Optional<UserBrokerageSummaryBO> orderSummaryOptional = Optional.ofNullable(userOrderSummaryMap.get(vo.getId())); |
| 50 | - // 推广订单数量 | ||
| 51 | - vo.setBrokerageOrderCount(orderSummaryOptional.map(UserBrokerageSummaryBO::getCount).orElse(0)); | ||
| 52 | - // 推广订单金额 | ||
| 53 | - vo.setBrokerageOrderPrice(orderSummaryOptional.map(UserBrokerageSummaryBO::getPrice).orElse(0)); | ||
| 54 | - | ||
| 55 | - // todo 已提现次数 | 46 | + vo.setBrokerageOrderCount(orderSummaryOptional.map(UserBrokerageSummaryBO::getCount).orElse(0)) |
| 47 | + .setBrokerageOrderPrice(orderSummaryOptional.map(UserBrokerageSummaryBO::getPrice).orElse(0)); | ||
| 48 | + // todo 已提现次数、已提现金额 | ||
| 56 | vo.setWithdrawCount(0); | 49 | vo.setWithdrawCount(0); |
| 57 | - // todo 已提现金额 | ||
| 58 | vo.setWithdrawPrice(0); | 50 | vo.setWithdrawPrice(0); |
| 59 | } | 51 | } |
| 60 | return result; | 52 | return result; |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/brokerage/record/BrokerageRecordMapper.java
| @@ -48,6 +48,7 @@ public interface BrokerageRecordMapper extends BaseMapperX<BrokerageRecordDO> { | @@ -48,6 +48,7 @@ public interface BrokerageRecordMapper extends BaseMapperX<BrokerageRecordDO> { | ||
| 48 | BrokerageRecordDO::getBizId, bizId); | 48 | BrokerageRecordDO::getBizId, bizId); |
| 49 | } | 49 | } |
| 50 | 50 | ||
| 51 | + // TODO @疯狂:mysql 关键字,大写哈;这样看起来清晰点;例如说 SELECT COUNT(1) | ||
| 51 | @Select("select count(1), sum(price) from trade_brokerage_record where user_id = #{userId} and biz_type = #{bizType} and status = #{status}") | 52 | @Select("select count(1), sum(price) from trade_brokerage_record where user_id = #{userId} and biz_type = #{bizType} and status = #{status}") |
| 52 | UserBrokerageSummaryBO selectCountAndSumPriceByUserIdAndBizTypeAndStatus(@Param("userId") Long userId, | 53 | UserBrokerageSummaryBO selectCountAndSumPriceByUserIdAndBizTypeAndStatus(@Param("userId") Long userId, |
| 53 | @Param("bizType") Integer bizType, | 54 | @Param("bizType") Integer bizType, |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/brokerage/user/BrokerageUserMapper.java
| @@ -111,4 +111,5 @@ public interface BrokerageUserMapper extends BaseMapperX<BrokerageUserDO> { | @@ -111,4 +111,5 @@ public interface BrokerageUserMapper extends BaseMapperX<BrokerageUserDO> { | ||
| 111 | .eq(BrokerageUserDO::getId, id) | 111 | .eq(BrokerageUserDO::getId, id) |
| 112 | .set(BrokerageUserDO::getBrokerageEnabled, false).set(BrokerageUserDO::getBrokerageTime, null)); | 112 | .set(BrokerageUserDO::getBrokerageEnabled, false).set(BrokerageUserDO::getBrokerageTime, null)); |
| 113 | } | 113 | } |
| 114 | + | ||
| 114 | } | 115 | } |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/bo/BrokerageAddReqBO.java
| @@ -5,6 +5,7 @@ import lombok.Data; | @@ -5,6 +5,7 @@ import lombok.Data; | ||
| 5 | import lombok.NoArgsConstructor; | 5 | import lombok.NoArgsConstructor; |
| 6 | 6 | ||
| 7 | import javax.validation.constraints.NotBlank; | 7 | import javax.validation.constraints.NotBlank; |
| 8 | +import javax.validation.constraints.NotNull; | ||
| 8 | 9 | ||
| 9 | /** | 10 | /** |
| 10 | * 佣金 增加 Request BO | 11 | * 佣金 增加 Request BO |
| @@ -24,6 +25,7 @@ public class BrokerageAddReqBO { | @@ -24,6 +25,7 @@ public class BrokerageAddReqBO { | ||
| 24 | /** | 25 | /** |
| 25 | * 佣金基数 | 26 | * 佣金基数 |
| 26 | */ | 27 | */ |
| 28 | + @NotNull(message = "佣金基数不能为空") | ||
| 27 | private Integer basePrice; | 29 | private Integer basePrice; |
| 28 | /** | 30 | /** |
| 29 | * 一级佣金(固定) | 31 | * 一级佣金(固定) |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/bo/UserBrokerageSummaryBO.java
| @@ -13,6 +13,7 @@ import lombok.NoArgsConstructor; | @@ -13,6 +13,7 @@ import lombok.NoArgsConstructor; | ||
| 13 | @NoArgsConstructor | 13 | @NoArgsConstructor |
| 14 | @AllArgsConstructor | 14 | @AllArgsConstructor |
| 15 | public class UserBrokerageSummaryBO { | 15 | public class UserBrokerageSummaryBO { |
| 16 | + | ||
| 16 | /** | 17 | /** |
| 17 | * 佣金数量 | 18 | * 佣金数量 |
| 18 | */ | 19 | */ |
| @@ -21,4 +22,5 @@ public class UserBrokerageSummaryBO { | @@ -21,4 +22,5 @@ public class UserBrokerageSummaryBO { | ||
| 21 | * 佣金总额 | 22 | * 佣金总额 |
| 22 | */ | 23 | */ |
| 23 | private Integer price; | 24 | private Integer price; |
| 25 | + | ||
| 24 | } | 26 | } |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/record/BrokerageRecordService.java
| @@ -66,5 +66,5 @@ public interface BrokerageRecordService { | @@ -66,5 +66,5 @@ public interface BrokerageRecordService { | ||
| 66 | * @param status 佣金状态 | 66 | * @param status 佣金状态 |
| 67 | * @return 用户佣金汇总 | 67 | * @return 用户佣金汇总 |
| 68 | */ | 68 | */ |
| 69 | - UserBrokerageSummaryBO summaryByUserIdAndBizTypeAndStatus(Long userId, Integer bizType, Integer status); | 69 | + UserBrokerageSummaryBO getUserBrokerageSummaryByUserId(Long userId, Integer bizType, Integer status); |
| 70 | } | 70 | } |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/record/BrokerageRecordServiceImpl.java
| @@ -89,6 +89,7 @@ public class BrokerageRecordServiceImpl implements BrokerageRecordService { | @@ -89,6 +89,7 @@ public class BrokerageRecordServiceImpl implements BrokerageRecordService { | ||
| 89 | @Override | 89 | @Override |
| 90 | @Transactional(rollbackFor = Exception.class) | 90 | @Transactional(rollbackFor = Exception.class) |
| 91 | public void cancelBrokerage(Long userId, BrokerageRecordBizTypeEnum bizType, String bizId) { | 91 | public void cancelBrokerage(Long userId, BrokerageRecordBizTypeEnum bizType, String bizId) { |
| 92 | + // TODO @疯狂:userId 加进去查询,会不会更好一点?万一穿错参数; | ||
| 92 | BrokerageRecordDO record = brokerageRecordMapper.selectByBizTypeAndBizId(bizType.getType(), bizId); | 93 | BrokerageRecordDO record = brokerageRecordMapper.selectByBizTypeAndBizId(bizType.getType(), bizId); |
| 93 | if (record == null || ObjectUtil.notEqual(record.getUserId(), userId)) { | 94 | if (record == null || ObjectUtil.notEqual(record.getUserId(), userId)) { |
| 94 | log.error("[cancelBrokerage][userId({})][bizId({}) 更新为已失效失败:记录不存在]", userId, bizId); | 95 | log.error("[cancelBrokerage][userId({})][bizId({}) 更新为已失效失败:记录不存在]", userId, bizId); |
| @@ -138,7 +139,7 @@ public class BrokerageRecordServiceImpl implements BrokerageRecordService { | @@ -138,7 +139,7 @@ public class BrokerageRecordServiceImpl implements BrokerageRecordService { | ||
| 138 | * @param list 佣金增加参数列表 | 139 | * @param list 佣金增加参数列表 |
| 139 | * @param brokerageFrozenDays 冻结天数 | 140 | * @param brokerageFrozenDays 冻结天数 |
| 140 | * @param brokeragePercent 佣金比例 | 141 | * @param brokeragePercent 佣金比例 |
| 141 | - * @param fixedPriceFun 固定佣金 | 142 | + * @param fixedPriceFun 固定佣金 // TODO 疯狂:这里是不是可以直接传递 fixedPrice 呀? |
| 142 | * @param bizType 业务类型 | 143 | * @param bizType 业务类型 |
| 143 | */ | 144 | */ |
| 144 | private void addBrokerage(BrokerageUserDO user, List<BrokerageAddReqBO> list, Integer brokerageFrozenDays, | 145 | private void addBrokerage(BrokerageUserDO user, List<BrokerageAddReqBO> list, Integer brokerageFrozenDays, |
| @@ -200,9 +201,9 @@ public class BrokerageRecordServiceImpl implements BrokerageRecordService { | @@ -200,9 +201,9 @@ public class BrokerageRecordServiceImpl implements BrokerageRecordService { | ||
| 200 | } | 201 | } |
| 201 | 202 | ||
| 202 | @Override | 203 | @Override |
| 203 | - public UserBrokerageSummaryBO summaryByUserIdAndBizTypeAndStatus(Long userId, Integer bizType, Integer status) { | 204 | + public UserBrokerageSummaryBO getUserBrokerageSummaryByUserId(Long userId, Integer bizType, Integer status) { |
| 204 | UserBrokerageSummaryBO summaryBO = brokerageRecordMapper.selectCountAndSumPriceByUserIdAndBizTypeAndStatus(userId, bizType, status); | 205 | UserBrokerageSummaryBO summaryBO = brokerageRecordMapper.selectCountAndSumPriceByUserIdAndBizTypeAndStatus(userId, bizType, status); |
| 205 | - return summaryBO == null ? new UserBrokerageSummaryBO(0, 0) : summaryBO; | 206 | + return summaryBO != null ? summaryBO : new UserBrokerageSummaryBO(0, 0); |
| 206 | } | 207 | } |
| 207 | 208 | ||
| 208 | @Transactional(rollbackFor = Exception.class) | 209 | @Transactional(rollbackFor = Exception.class) |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/user/BrokerageUserService.java
| @@ -52,7 +52,7 @@ public interface BrokerageUserService { | @@ -52,7 +52,7 @@ public interface BrokerageUserService { | ||
| 52 | * @param id 用户编号 | 52 | * @param id 用户编号 |
| 53 | * @param enabled 推广资格 | 53 | * @param enabled 推广资格 |
| 54 | */ | 54 | */ |
| 55 | - void updateBrokerageEnabled(Long id, Boolean enabled); | 55 | + void updateBrokerageUserEnabled(Long id, Boolean enabled); |
| 56 | 56 | ||
| 57 | /** | 57 | /** |
| 58 | * 获得用户的推广人 | 58 | * 获得用户的推广人 |
| @@ -79,20 +79,21 @@ public interface BrokerageUserService { | @@ -79,20 +79,21 @@ public interface BrokerageUserService { | ||
| 79 | void updateUserFrozenPrice(Long id, Integer frozenPrice); | 79 | void updateUserFrozenPrice(Long id, Integer frozenPrice); |
| 80 | 80 | ||
| 81 | /** | 81 | /** |
| 82 | - * 更新用户冻结佣金(减少), 更新用户佣金(增加) | 82 | + * 更新用户冻结佣金(减少),更新用户佣金(增加) |
| 83 | * | 83 | * |
| 84 | * @param id 用户编号 | 84 | * @param id 用户编号 |
| 85 | * @param frozenPrice 减少冻结佣金(负数) | 85 | * @param frozenPrice 减少冻结佣金(负数) |
| 86 | */ | 86 | */ |
| 87 | void updateFrozenPriceDecrAndPriceIncr(Long id, Integer frozenPrice); | 87 | void updateFrozenPriceDecrAndPriceIncr(Long id, Integer frozenPrice); |
| 88 | 88 | ||
| 89 | + // TODO @疯狂:这个后面可能要支持下,二级 | ||
| 89 | /** | 90 | /** |
| 90 | * 获得推广用户数量(一级) | 91 | * 获得推广用户数量(一级) |
| 91 | * | 92 | * |
| 92 | * @param bindUserId 绑定的推广员编号 | 93 | * @param bindUserId 绑定的推广员编号 |
| 93 | * @return 推广用户数量 | 94 | * @return 推广用户数量 |
| 94 | */ | 95 | */ |
| 95 | - Long getCountByBindUserId(Long bindUserId); | 96 | + Long getBrokerageUserCountByBindUserId(Long bindUserId); |
| 96 | 97 | ||
| 97 | /** | 98 | /** |
| 98 | * 【会员】绑定推广员 | 99 | * 【会员】绑定推广员 |
| @@ -103,4 +104,5 @@ public interface BrokerageUserService { | @@ -103,4 +104,5 @@ public interface BrokerageUserService { | ||
| 103 | * @return 是否绑定 | 104 | * @return 是否绑定 |
| 104 | */ | 105 | */ |
| 105 | boolean bindUser(Long userId, Long bindUserId, Boolean isNewUser); | 106 | boolean bindUser(Long userId, Long bindUserId, Boolean isNewUser); |
| 107 | + | ||
| 106 | } | 108 | } |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/user/BrokerageUserServiceImpl.java
| @@ -57,18 +57,22 @@ public class BrokerageUserServiceImpl implements BrokerageUserService { | @@ -57,18 +57,22 @@ public class BrokerageUserServiceImpl implements BrokerageUserService { | ||
| 57 | public void updateBrokerageUserId(Long id, Long bindUserId) { | 57 | public void updateBrokerageUserId(Long id, Long bindUserId) { |
| 58 | // 校验存在 | 58 | // 校验存在 |
| 59 | validateBrokerageUserExists(id); | 59 | validateBrokerageUserExists(id); |
| 60 | + | ||
| 61 | + // 情况一:清除推广员 | ||
| 60 | if (bindUserId == null) { | 62 | if (bindUserId == null) { |
| 61 | // 清除推广员 | 63 | // 清除推广员 |
| 62 | brokerageUserMapper.updateBindUserIdAndBindUserTimeToNull(id); | 64 | brokerageUserMapper.updateBindUserIdAndBindUserTimeToNull(id); |
| 63 | - } else { | ||
| 64 | - // 修改推广员 | ||
| 65 | - brokerageUserMapper.updateById(new BrokerageUserDO().setId(id) | ||
| 66 | - .setBindUserId(bindUserId).setBindUserTime(LocalDateTime.now())); | 65 | + return; |
| 67 | } | 66 | } |
| 67 | + | ||
| 68 | + // 情况二:修改推广员 | ||
| 69 | + // TODO @疯狂:要复用一些 validateCanBindUser 的校验哈; | ||
| 70 | + brokerageUserMapper.updateById(new BrokerageUserDO().setId(id) | ||
| 71 | + .setBindUserId(bindUserId).setBindUserTime(LocalDateTime.now())); | ||
| 68 | } | 72 | } |
| 69 | 73 | ||
| 70 | @Override | 74 | @Override |
| 71 | - public void updateBrokerageEnabled(Long id, Boolean enabled) { | 75 | + public void updateBrokerageUserEnabled(Long id, Boolean enabled) { |
| 72 | // 校验存在 | 76 | // 校验存在 |
| 73 | validateBrokerageUserExists(id); | 77 | validateBrokerageUserExists(id); |
| 74 | if (BooleanUtil.isTrue(enabled)) { | 78 | if (BooleanUtil.isTrue(enabled)) { |
| @@ -124,36 +128,41 @@ public class BrokerageUserServiceImpl implements BrokerageUserService { | @@ -124,36 +128,41 @@ public class BrokerageUserServiceImpl implements BrokerageUserService { | ||
| 124 | } | 128 | } |
| 125 | 129 | ||
| 126 | @Override | 130 | @Override |
| 127 | - public Long getCountByBindUserId(Long bindUserId) { | 131 | + public Long getBrokerageUserCountByBindUserId(Long bindUserId) { |
| 132 | + // TODO @疯狂:mapper 封装下哈;不直接在 service 调用这种基础 mapper 的基础方法 | ||
| 128 | return brokerageUserMapper.selectCount(BrokerageUserDO::getBindUserId, bindUserId); | 133 | return brokerageUserMapper.selectCount(BrokerageUserDO::getBindUserId, bindUserId); |
| 129 | } | 134 | } |
| 130 | 135 | ||
| 136 | + // TODO @疯狂:因为现在 user 会存在使用验证码直接注册,所以 isNewUser 不太好传递;我们是不是可以约定绑定的时间,createTime 在 30 秒内,就认为新用户; | ||
| 131 | @Override | 137 | @Override |
| 132 | public boolean bindUser(Long userId, Long bindUserId, Boolean isNewUser) { | 138 | public boolean bindUser(Long userId, Long bindUserId, Boolean isNewUser) { |
| 139 | + // TODO @疯狂:userId 为空,搞到参数校验里哇; | ||
| 133 | if (userId == null) { | 140 | if (userId == null) { |
| 134 | throw exception(0); | 141 | throw exception(0); |
| 135 | } | 142 | } |
| 136 | 143 | ||
| 137 | - boolean isInsert = false; | 144 | + // 1. 获得分销用户 |
| 145 | + boolean isNewBrokerageUser = false; | ||
| 138 | BrokerageUserDO brokerageUser = brokerageUserMapper.selectById(userId); | 146 | BrokerageUserDO brokerageUser = brokerageUserMapper.selectById(userId); |
| 139 | - // 分销用户不存在的情况:1.新注册 2.旧数据 3.分销功能关闭后又打开 | ||
| 140 | - if (brokerageUser == null) { | ||
| 141 | - isInsert = true; | 147 | + if (brokerageUser == null) { // 分销用户不存在的情况:1. 新注册;2. 旧数据;3. 分销功能关闭后又打开 |
| 148 | + isNewBrokerageUser = true; | ||
| 142 | brokerageUser = new BrokerageUserDO().setId(userId).setBrokerageEnabled(false).setPrice(0).setFrozenPrice(0); | 149 | brokerageUser = new BrokerageUserDO().setId(userId).setBrokerageEnabled(false).setPrice(0).setFrozenPrice(0); |
| 143 | } | 150 | } |
| 144 | 151 | ||
| 145 | - // 校验能否绑定 | 152 | + // 2.1 校验能否绑定 |
| 146 | boolean validated = validateCanBindUser(brokerageUser, bindUserId, isNewUser); | 153 | boolean validated = validateCanBindUser(brokerageUser, bindUserId, isNewUser); |
| 147 | if (!validated) { | 154 | if (!validated) { |
| 148 | return false; | 155 | return false; |
| 149 | } | 156 | } |
| 150 | 157 | ||
| 151 | - if (isInsert) { | 158 | + // 2.2 绑定用户 |
| 159 | + if (isNewBrokerageUser) { | ||
| 152 | Integer enabledCondition = tradeConfigService.getTradeConfig().getBrokerageEnabledCondition(); | 160 | Integer enabledCondition = tradeConfigService.getTradeConfig().getBrokerageEnabledCondition(); |
| 153 | - if (BrokerageEnabledConditionEnum.ALL.getCondition().equals(enabledCondition)) { | ||
| 154 | - // 人人分销:用户默认就有分销资格 | 161 | + if (BrokerageEnabledConditionEnum.ALL.getCondition().equals(enabledCondition)) { // 人人分销:用户默认就有分销资格 |
| 162 | + // TODO @疯狂:应该设置下 brokerageTime,而不是 bindUserTime | ||
| 155 | brokerageUser.setBrokerageEnabled(true).setBindUserTime(LocalDateTime.now()); | 163 | brokerageUser.setBrokerageEnabled(true).setBindUserTime(LocalDateTime.now()); |
| 156 | } | 164 | } |
| 165 | + // TODO @疯狂:这里是不是要设置 bindUserId、bindUserTime 字段哈; | ||
| 157 | brokerageUserMapper.insert(brokerageUser); | 166 | brokerageUserMapper.insert(brokerageUser); |
| 158 | } else { | 167 | } else { |
| 159 | brokerageUserMapper.updateById(new BrokerageUserDO().setId(userId) | 168 | brokerageUserMapper.updateById(new BrokerageUserDO().setId(userId) |
| @@ -162,14 +171,16 @@ public class BrokerageUserServiceImpl implements BrokerageUserService { | @@ -162,14 +171,16 @@ public class BrokerageUserServiceImpl implements BrokerageUserService { | ||
| 162 | return true; | 171 | return true; |
| 163 | } | 172 | } |
| 164 | 173 | ||
| 174 | + // TODO @疯狂:validate 方法,一般不返回 true false,而是抛出异常;如果要返回 true false 这种,方法名字可以改成 isUserCanBind | ||
| 165 | private boolean validateCanBindUser(BrokerageUserDO user, Long bindUserId, Boolean isNewUser) { | 175 | private boolean validateCanBindUser(BrokerageUserDO user, Long bindUserId, Boolean isNewUser) { |
| 176 | + // TODO @疯狂:bindUserId 为空,搞到参数校验里哇; | ||
| 166 | if (bindUserId == null) { | 177 | if (bindUserId == null) { |
| 167 | return false; | 178 | return false; |
| 168 | } | 179 | } |
| 169 | 180 | ||
| 170 | // 校验分销功能是否启用 | 181 | // 校验分销功能是否启用 |
| 171 | TradeConfigDO tradeConfig = tradeConfigService.getTradeConfig(); | 182 | TradeConfigDO tradeConfig = tradeConfigService.getTradeConfig(); |
| 172 | - if (tradeConfig == null || !BooleanUtil.isTrue(tradeConfig.getBrokerageEnabled())) { | 183 | + if (tradeConfig == null || BooleanUtil.isFalse(tradeConfig.getBrokerageEnabled())) { |
| 173 | return false; | 184 | return false; |
| 174 | } | 185 | } |
| 175 | 186 | ||
| @@ -180,7 +191,7 @@ public class BrokerageUserServiceImpl implements BrokerageUserService { | @@ -180,7 +191,7 @@ public class BrokerageUserServiceImpl implements BrokerageUserService { | ||
| 180 | 191 | ||
| 181 | // 校验要绑定的用户有无推广资格 | 192 | // 校验要绑定的用户有无推广资格 |
| 182 | BrokerageUserDO bindUser = brokerageUserMapper.selectById(bindUserId); | 193 | BrokerageUserDO bindUser = brokerageUserMapper.selectById(bindUserId); |
| 183 | - if (bindUser == null || !BooleanUtil.isTrue(bindUser.getBrokerageEnabled())) { | 194 | + if (bindUser == null || BooleanUtil.isFalse(bindUser.getBrokerageEnabled())) { |
| 184 | throw exception(BROKERAGE_BIND_USER_NOT_ENABLED); | 195 | throw exception(BROKERAGE_BIND_USER_NOT_ENABLED); |
| 185 | } | 196 | } |
| 186 | 197 | ||
| @@ -200,6 +211,7 @@ public class BrokerageUserServiceImpl implements BrokerageUserService { | @@ -200,6 +211,7 @@ public class BrokerageUserServiceImpl implements BrokerageUserService { | ||
| 200 | } | 211 | } |
| 201 | } | 212 | } |
| 202 | 213 | ||
| 214 | + // TODO @疯狂:这块是不是一直查询到根节点,中间不允许出现自己;就是不能形成环。虽然目前是 2 级,但是未来可能会改多级; = = 环的话,就会存在问题哈 | ||
| 203 | // A->B->A:下级不能绑定自己的上级, A->B->C->A可以!! | 215 | // A->B->A:下级不能绑定自己的上级, A->B->C->A可以!! |
| 204 | if (Objects.equals(user.getId(), bindUser.getBindUserId())) { | 216 | if (Objects.equals(user.getId(), bindUser.getBindUserId())) { |
| 205 | throw exception(BROKERAGE_BIND_LOOP); | 217 | throw exception(BROKERAGE_BIND_LOOP); |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java
| @@ -395,7 +395,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { | @@ -395,7 +395,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { | ||
| 395 | // 增加用户经验 | 395 | // 增加用户经验 |
| 396 | getSelf().addUserExperienceAsync(order.getUserId(), order.getPayPrice(), order.getId()); | 396 | getSelf().addUserExperienceAsync(order.getUserId(), order.getPayPrice(), order.getId()); |
| 397 | // 增加用户佣金 | 397 | // 增加用户佣金 |
| 398 | - getSelf().addBrokerageAsync(order.getUserId(), BrokerageRecordBizTypeEnum.ORDER, order.getId()); | 398 | + getSelf().addBrokerageAsync(order.getUserId(), order.getId()); |
| 399 | } | 399 | } |
| 400 | 400 | ||
| 401 | /** | 401 | /** |
| @@ -675,7 +675,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { | @@ -675,7 +675,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { | ||
| 675 | // 扣减用户经验 | 675 | // 扣减用户经验 |
| 676 | getSelf().reduceUserExperienceAsync(order.getUserId(), orderRefundPrice, afterSaleId); | 676 | getSelf().reduceUserExperienceAsync(order.getUserId(), orderRefundPrice, afterSaleId); |
| 677 | // 更新分佣记录为已失效 | 677 | // 更新分佣记录为已失效 |
| 678 | - getSelf().cancelBrokerageAsync(order.getUserId(), BrokerageRecordBizTypeEnum.ORDER, id); | 678 | + getSelf().cancelBrokerageAsync(order.getUserId(), id); |
| 679 | } | 679 | } |
| 680 | 680 | ||
| 681 | @Override | 681 | @Override |
| @@ -785,16 +785,16 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { | @@ -785,16 +785,16 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { | ||
| 785 | 785 | ||
| 786 | 786 | ||
| 787 | @Async | 787 | @Async |
| 788 | - protected void addBrokerageAsync(Long userId, BrokerageRecordBizTypeEnum bizType, Long orderId) { | 788 | + protected void addBrokerageAsync(Long userId, Long orderId) { |
| 789 | List<TradeOrderItemDO> orderItems = tradeOrderItemMapper.selectListByOrderId(orderId); | 789 | List<TradeOrderItemDO> orderItems = tradeOrderItemMapper.selectListByOrderId(orderId); |
| 790 | List<BrokerageAddReqBO> list = convertList(orderItems, | 790 | List<BrokerageAddReqBO> list = convertList(orderItems, |
| 791 | item -> TradeOrderConvert.INSTANCE.convert(item, productSkuApi.getSku(item.getSkuId()))); | 791 | item -> TradeOrderConvert.INSTANCE.convert(item, productSkuApi.getSku(item.getSkuId()))); |
| 792 | - brokerageRecordService.addBrokerage(userId, bizType, list); | 792 | + brokerageRecordService.addBrokerage(userId, BrokerageRecordBizTypeEnum.ORDER, list); |
| 793 | } | 793 | } |
| 794 | 794 | ||
| 795 | @Async | 795 | @Async |
| 796 | - protected void cancelBrokerageAsync(Long userId, BrokerageRecordBizTypeEnum bizType, Long orderItemId) { | ||
| 797 | - brokerageRecordService.cancelBrokerage(userId, bizType, String.valueOf(orderItemId)); | 796 | + protected void cancelBrokerageAsync(Long userId, Long orderItemId) { |
| 797 | + brokerageRecordService.cancelBrokerage(userId, BrokerageRecordBizTypeEnum.ORDER, String.valueOf(orderItemId)); | ||
| 798 | } | 798 | } |
| 799 | 799 | ||
| 800 | /** | 800 | /** |
yudao-module-member/yudao-module-member-biz/pom.xml
| @@ -33,11 +33,6 @@ | @@ -33,11 +33,6 @@ | ||
| 33 | <artifactId>yudao-module-infra-api</artifactId> | 33 | <artifactId>yudao-module-infra-api</artifactId> |
| 34 | <version>${revision}</version> | 34 | <version>${revision}</version> |
| 35 | </dependency> | 35 | </dependency> |
| 36 | - <dependency> | ||
| 37 | - <groupId>cn.iocoder.boot</groupId> | ||
| 38 | - <artifactId>yudao-module-trade-api</artifactId> | ||
| 39 | - <version>${revision}</version> | ||
| 40 | - </dependency> | ||
| 41 | 36 | ||
| 42 | <!-- 业务组件 --> | 37 | <!-- 业务组件 --> |
| 43 | <dependency> | 38 | <dependency> |
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/AppMemberUserController.java
| @@ -8,8 +8,6 @@ import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelDO; | @@ -8,8 +8,6 @@ import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelDO; | ||
| 8 | import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; | 8 | import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; |
| 9 | import cn.iocoder.yudao.module.member.service.level.MemberLevelService; | 9 | import cn.iocoder.yudao.module.member.service.level.MemberLevelService; |
| 10 | import cn.iocoder.yudao.module.member.service.user.MemberUserService; | 10 | import cn.iocoder.yudao.module.member.service.user.MemberUserService; |
| 11 | -import cn.iocoder.yudao.module.trade.api.brokerage.BrokerageApi; | ||
| 12 | -import cn.iocoder.yudao.module.trade.api.brokerage.dto.BrokerageUserDTO; | ||
| 13 | import io.swagger.v3.oas.annotations.Operation; | 11 | import io.swagger.v3.oas.annotations.Operation; |
| 14 | import io.swagger.v3.oas.annotations.tags.Tag; | 12 | import io.swagger.v3.oas.annotations.tags.Tag; |
| 15 | import lombok.extern.slf4j.Slf4j; | 13 | import lombok.extern.slf4j.Slf4j; |
| @@ -18,7 +16,6 @@ import org.springframework.web.bind.annotation.*; | @@ -18,7 +16,6 @@ import org.springframework.web.bind.annotation.*; | ||
| 18 | 16 | ||
| 19 | import javax.annotation.Resource; | 17 | import javax.annotation.Resource; |
| 20 | import javax.validation.Valid; | 18 | import javax.validation.Valid; |
| 21 | -import java.util.Optional; | ||
| 22 | 19 | ||
| 23 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; | 20 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| 24 | import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; | 21 | import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; |
| @@ -32,23 +29,16 @@ public class AppMemberUserController { | @@ -32,23 +29,16 @@ public class AppMemberUserController { | ||
| 32 | 29 | ||
| 33 | @Resource | 30 | @Resource |
| 34 | private MemberUserService userService; | 31 | private MemberUserService userService; |
| 35 | - | ||
| 36 | @Resource | 32 | @Resource |
| 37 | private MemberLevelService levelService; | 33 | private MemberLevelService levelService; |
| 38 | 34 | ||
| 39 | - @Resource | ||
| 40 | - private BrokerageApi brokerageApi; | ||
| 41 | - | ||
| 42 | @GetMapping("/get") | 35 | @GetMapping("/get") |
| 43 | @Operation(summary = "获得基本信息") | 36 | @Operation(summary = "获得基本信息") |
| 44 | @PreAuthenticated | 37 | @PreAuthenticated |
| 45 | public CommonResult<AppMemberUserInfoRespVO> getUserInfo() { | 38 | public CommonResult<AppMemberUserInfoRespVO> getUserInfo() { |
| 46 | MemberUserDO user = userService.getUser(getLoginUserId()); | 39 | MemberUserDO user = userService.getUser(getLoginUserId()); |
| 47 | MemberLevelDO level = levelService.getLevel(user.getLevelId()); | 40 | MemberLevelDO level = levelService.getLevel(user.getLevelId()); |
| 48 | - BrokerageUserDTO brokerageUser = brokerageApi.getBrokerageUser(user.getId()); | ||
| 49 | - return success(MemberUserConvert.INSTANCE.convert(user, level) | ||
| 50 | - .setBrokerageEnabled(Optional.ofNullable(brokerageUser).map(BrokerageUserDTO::getBrokerageEnabled).orElse(false)) | ||
| 51 | - ); | 41 | + return success(MemberUserConvert.INSTANCE.convert(user, level)); |
| 52 | } | 42 | } |
| 53 | 43 | ||
| 54 | @PutMapping("/update") | 44 | @PutMapping("/update") |