Commit ae493e66dface723e8b08f1b93f72a1ff90feebb
1 parent
ea7f9230
MALL-TRADE:新增 BrokerageUserService#getOrCreateBrokerageUser 获得或创建分销用户方法,解决父级推广人不存在的问题
Showing
4 changed files
with
38 additions
and
22 deletions
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/AppBrokerageUserController.java
| 1 | package cn.iocoder.yudao.module.trade.controller.app.brokerage; | 1 | package cn.iocoder.yudao.module.trade.controller.app.brokerage; |
| 2 | 2 | ||
| 3 | import cn.hutool.core.date.LocalDateTimeUtil; | 3 | import cn.hutool.core.date.LocalDateTimeUtil; |
| 4 | -import cn.hutool.core.util.ObjUtil; | ||
| 5 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; | 4 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| 6 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 5 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 7 | import cn.iocoder.yudao.framework.security.core.annotations.PreAuthenticated; | 6 | import cn.iocoder.yudao.framework.security.core.annotations.PreAuthenticated; |
| @@ -11,8 +10,6 @@ import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.*; | @@ -11,8 +10,6 @@ import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.*; | ||
| 11 | import cn.iocoder.yudao.module.trade.convert.brokerage.BrokerageRecordConvert; | 10 | import cn.iocoder.yudao.module.trade.convert.brokerage.BrokerageRecordConvert; |
| 12 | import cn.iocoder.yudao.module.trade.convert.brokerage.BrokerageUserConvert; | 11 | import cn.iocoder.yudao.module.trade.convert.brokerage.BrokerageUserConvert; |
| 13 | import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageUserDO; | 12 | import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageUserDO; |
| 14 | -import cn.iocoder.yudao.module.trade.dal.dataobject.config.TradeConfigDO; | ||
| 15 | -import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageEnabledConditionEnum; | ||
| 16 | import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordBizTypeEnum; | 13 | import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordBizTypeEnum; |
| 17 | import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordStatusEnum; | 14 | import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordStatusEnum; |
| 18 | import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageWithdrawStatusEnum; | 15 | import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageWithdrawStatusEnum; |
| @@ -20,7 +17,6 @@ import cn.iocoder.yudao.module.trade.service.brokerage.BrokerageRecordService; | @@ -20,7 +17,6 @@ import cn.iocoder.yudao.module.trade.service.brokerage.BrokerageRecordService; | ||
| 20 | import cn.iocoder.yudao.module.trade.service.brokerage.BrokerageUserService; | 17 | import cn.iocoder.yudao.module.trade.service.brokerage.BrokerageUserService; |
| 21 | import cn.iocoder.yudao.module.trade.service.brokerage.BrokerageWithdrawService; | 18 | import cn.iocoder.yudao.module.trade.service.brokerage.BrokerageWithdrawService; |
| 22 | import cn.iocoder.yudao.module.trade.service.brokerage.bo.BrokerageWithdrawSummaryRespBO; | 19 | import cn.iocoder.yudao.module.trade.service.brokerage.bo.BrokerageWithdrawSummaryRespBO; |
| 23 | -import cn.iocoder.yudao.module.trade.service.config.TradeConfigService; | ||
| 24 | import io.swagger.v3.oas.annotations.Operation; | 20 | import io.swagger.v3.oas.annotations.Operation; |
| 25 | import io.swagger.v3.oas.annotations.Parameter; | 21 | import io.swagger.v3.oas.annotations.Parameter; |
| 26 | import io.swagger.v3.oas.annotations.tags.Tag; | 22 | import io.swagger.v3.oas.annotations.tags.Tag; |
| @@ -55,22 +51,16 @@ public class AppBrokerageUserController { | @@ -55,22 +51,16 @@ public class AppBrokerageUserController { | ||
| 55 | @Resource | 51 | @Resource |
| 56 | private BrokerageWithdrawService brokerageWithdrawService; | 52 | private BrokerageWithdrawService brokerageWithdrawService; |
| 57 | @Resource | 53 | @Resource |
| 58 | - private TradeConfigService tradeConfigService; | ||
| 59 | - @Resource | ||
| 60 | private MemberUserApi memberUserApi; | 54 | private MemberUserApi memberUserApi; |
| 61 | 55 | ||
| 62 | @GetMapping("/get") | 56 | @GetMapping("/get") |
| 63 | @Operation(summary = "获得个人分销信息") | 57 | @Operation(summary = "获得个人分销信息") |
| 64 | @PreAuthenticated | 58 | @PreAuthenticated |
| 65 | public CommonResult<AppBrokerageUserRespVO> getBrokerageUser() { | 59 | public CommonResult<AppBrokerageUserRespVO> getBrokerageUser() { |
| 66 | - Optional<BrokerageUserDO> user = Optional.ofNullable(brokerageUserService.getBrokerageUser(getLoginUserId())); | ||
| 67 | - // 获得交易中心配置 | ||
| 68 | - TradeConfigDO tradeConfig = tradeConfigService.getTradeConfig(); | ||
| 69 | - // 如果是人人分佣 BrokerageUserDO 为 null 时,也有分销资格 | ||
| 70 | - boolean brokerageEnabled = ObjUtil.equal(BrokerageEnabledConditionEnum.ALL.getCondition(), tradeConfig.getBrokerageEnabledCondition()); | 60 | + Optional<BrokerageUserDO> user = Optional.ofNullable(brokerageUserService.getOrCreateBrokerageUser(getLoginUserId())); |
| 71 | // 返回数据 | 61 | // 返回数据 |
| 72 | AppBrokerageUserRespVO respVO = new AppBrokerageUserRespVO() | 62 | AppBrokerageUserRespVO respVO = new AppBrokerageUserRespVO() |
| 73 | - .setBrokerageEnabled(user.map(BrokerageUserDO::getBrokerageEnabled).orElse(brokerageEnabled)) | 63 | + .setBrokerageEnabled(user.map(BrokerageUserDO::getBrokerageEnabled).orElse(false)) |
| 74 | .setBrokeragePrice(user.map(BrokerageUserDO::getBrokeragePrice).orElse(0)) | 64 | .setBrokeragePrice(user.map(BrokerageUserDO::getBrokeragePrice).orElse(0)) |
| 75 | .setFrozenPrice(user.map(BrokerageUserDO::getFrozenPrice).orElse(0)); | 65 | .setFrozenPrice(user.map(BrokerageUserDO::getFrozenPrice).orElse(0)); |
| 76 | return success(respVO); | 66 | return success(respVO); |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/vo/user/AppBrokerageUserBindReqVO.java
| @@ -8,7 +8,7 @@ import jakarta.validation.constraints.NotNull; | @@ -8,7 +8,7 @@ import jakarta.validation.constraints.NotNull; | ||
| 8 | 8 | ||
| 9 | @Schema(description = "应用 App - 绑定推广员 Request VO") | 9 | @Schema(description = "应用 App - 绑定推广员 Request VO") |
| 10 | @Data | 10 | @Data |
| 11 | -public class AppBrokerageUserBindReqVO extends PageParam { | 11 | +public class AppBrokerageUserBindReqVO { |
| 12 | 12 | ||
| 13 | @Schema(description = "推广员编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") | 13 | @Schema(description = "推广员编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") |
| 14 | @NotNull(message = "推广员编号不能为空") | 14 | @NotNull(message = "推广员编号不能为空") |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageUserService.java
| @@ -7,8 +7,8 @@ import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokera | @@ -7,8 +7,8 @@ import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokera | ||
| 7 | import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserRankByUserCountRespVO; | 7 | import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserRankByUserCountRespVO; |
| 8 | import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserRankPageReqVO; | 8 | import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserRankPageReqVO; |
| 9 | import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageUserDO; | 9 | import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageUserDO; |
| 10 | - | ||
| 11 | import jakarta.validation.constraints.NotNull; | 10 | import jakarta.validation.constraints.NotNull; |
| 11 | + | ||
| 12 | import java.util.Collection; | 12 | import java.util.Collection; |
| 13 | import java.util.List; | 13 | import java.util.List; |
| 14 | 14 | ||
| @@ -68,6 +68,14 @@ public interface BrokerageUserService { | @@ -68,6 +68,14 @@ public interface BrokerageUserService { | ||
| 68 | BrokerageUserDO getBindBrokerageUser(Long id); | 68 | BrokerageUserDO getBindBrokerageUser(Long id); |
| 69 | 69 | ||
| 70 | /** | 70 | /** |
| 71 | + * 获得或创建分销用户 | ||
| 72 | + * | ||
| 73 | + * @param id 用户编号 | ||
| 74 | + * @return 分销用户 | ||
| 75 | + */ | ||
| 76 | + BrokerageUserDO getOrCreateBrokerageUser(Long id); | ||
| 77 | + | ||
| 78 | + /** | ||
| 71 | * 更新用户佣金 | 79 | * 更新用户佣金 |
| 72 | * | 80 | * |
| 73 | * @param id 用户编号 | 81 | * @param id 用户编号 |
| @@ -104,8 +112,8 @@ public interface BrokerageUserService { | @@ -104,8 +112,8 @@ public interface BrokerageUserService { | ||
| 104 | /** | 112 | /** |
| 105 | * 【会员】绑定推广员 | 113 | * 【会员】绑定推广员 |
| 106 | * | 114 | * |
| 107 | - * @param userId 用户编号 | ||
| 108 | - * @param bindUserId 推广员编号 | 115 | + * @param userId 用户编号 |
| 116 | + * @param bindUserId 推广员编号 | ||
| 109 | * @return 是否绑定 | 117 | * @return 是否绑定 |
| 110 | */ | 118 | */ |
| 111 | boolean bindBrokerageUser(@NotNull Long userId, @NotNull Long bindUserId); | 119 | boolean bindBrokerageUser(@NotNull Long userId, @NotNull Long bindUserId); |
| @@ -134,4 +142,5 @@ public interface BrokerageUserService { | @@ -134,4 +142,5 @@ public interface BrokerageUserService { | ||
| 134 | * @return 下级分销统计分页 | 142 | * @return 下级分销统计分页 |
| 135 | */ | 143 | */ |
| 136 | PageResult<AppBrokerageUserChildSummaryRespVO> getBrokerageUserChildSummaryPage(AppBrokerageUserChildSummaryPageReqVO pageReqVO, Long userId); | 144 | PageResult<AppBrokerageUserChildSummaryRespVO> getBrokerageUserChildSummaryPage(AppBrokerageUserChildSummaryPageReqVO pageReqVO, Long userId); |
| 145 | + | ||
| 137 | } | 146 | } |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageUserServiceImpl.java
| @@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil; | @@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil; | ||
| 4 | import cn.hutool.core.lang.Assert; | 4 | import cn.hutool.core.lang.Assert; |
| 5 | import cn.hutool.core.util.ArrayUtil; | 5 | import cn.hutool.core.util.ArrayUtil; |
| 6 | import cn.hutool.core.util.BooleanUtil; | 6 | import cn.hutool.core.util.BooleanUtil; |
| 7 | +import cn.hutool.core.util.ObjUtil; | ||
| 7 | import cn.hutool.core.util.StrUtil; | 8 | import cn.hutool.core.util.StrUtil; |
| 8 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 9 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 9 | import cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils; | 10 | import cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils; |
| @@ -25,10 +26,10 @@ import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordBizTypeEnum; | @@ -25,10 +26,10 @@ import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordBizTypeEnum; | ||
| 25 | import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordStatusEnum; | 26 | import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordStatusEnum; |
| 26 | import cn.iocoder.yudao.module.trade.service.config.TradeConfigService; | 27 | import cn.iocoder.yudao.module.trade.service.config.TradeConfigService; |
| 27 | import com.baomidou.mybatisplus.core.metadata.IPage; | 28 | import com.baomidou.mybatisplus.core.metadata.IPage; |
| 29 | +import jakarta.annotation.Resource; | ||
| 28 | import org.springframework.stereotype.Service; | 30 | import org.springframework.stereotype.Service; |
| 29 | import org.springframework.validation.annotation.Validated; | 31 | import org.springframework.validation.annotation.Validated; |
| 30 | 32 | ||
| 31 | -import jakarta.annotation.Resource; | ||
| 32 | import java.time.LocalDateTime; | 33 | import java.time.LocalDateTime; |
| 33 | import java.util.*; | 34 | import java.util.*; |
| 34 | 35 | ||
| @@ -128,6 +129,18 @@ public class BrokerageUserServiceImpl implements BrokerageUserService { | @@ -128,6 +129,18 @@ public class BrokerageUserServiceImpl implements BrokerageUserService { | ||
| 128 | } | 129 | } |
| 129 | 130 | ||
| 130 | @Override | 131 | @Override |
| 132 | + public BrokerageUserDO getOrCreateBrokerageUser(Long id) { | ||
| 133 | + BrokerageUserDO brokerageUser = brokerageUserMapper.selectById(id); | ||
| 134 | + if (brokerageUser == null && ObjUtil.equal(BrokerageEnabledConditionEnum.ALL.getCondition(), | ||
| 135 | + tradeConfigService.getTradeConfig().getBrokerageEnabledCondition())) { // 人人分销的情况下,如果分销人为空则创建分销人 | ||
| 136 | + brokerageUser = new BrokerageUserDO().setId(id).setBrokerageEnabled(true).setBrokeragePrice(0) | ||
| 137 | + .setBrokerageTime(LocalDateTime.now()).setFrozenPrice(0); | ||
| 138 | + brokerageUserMapper.insert(brokerageUser); | ||
| 139 | + } | ||
| 140 | + return brokerageUser; | ||
| 141 | + } | ||
| 142 | + | ||
| 143 | + @Override | ||
| 131 | public boolean updateUserPrice(Long id, Integer price) { | 144 | public boolean updateUserPrice(Long id, Integer price) { |
| 132 | if (price > 0) { | 145 | if (price > 0) { |
| 133 | brokerageUserMapper.updatePriceIncr(id, price); | 146 | brokerageUserMapper.updatePriceIncr(id, price); |
| @@ -184,7 +197,6 @@ public class BrokerageUserServiceImpl implements BrokerageUserService { | @@ -184,7 +197,6 @@ public class BrokerageUserServiceImpl implements BrokerageUserService { | ||
| 184 | if (BrokerageEnabledConditionEnum.ALL.getCondition().equals(enabledCondition)) { // 人人分销:用户默认就有分销资格 | 197 | if (BrokerageEnabledConditionEnum.ALL.getCondition().equals(enabledCondition)) { // 人人分销:用户默认就有分销资格 |
| 185 | brokerageUser.setBrokerageEnabled(true).setBrokerageTime(LocalDateTime.now()); | 198 | brokerageUser.setBrokerageEnabled(true).setBrokerageTime(LocalDateTime.now()); |
| 186 | } | 199 | } |
| 187 | - brokerageUser.setBindUserId(bindUserId).setBindUserTime(LocalDateTime.now()); | ||
| 188 | brokerageUserMapper.insert(fillBindUserData(bindUserId, brokerageUser)); | 200 | brokerageUserMapper.insert(fillBindUserData(bindUserId, brokerageUser)); |
| 189 | } else { | 201 | } else { |
| 190 | brokerageUserMapper.updateById(fillBindUserData(bindUserId, new BrokerageUserDO().setId(userId))); | 202 | brokerageUserMapper.updateById(fillBindUserData(bindUserId, new BrokerageUserDO().setId(userId))); |
| @@ -294,18 +306,23 @@ public class BrokerageUserServiceImpl implements BrokerageUserService { | @@ -294,18 +306,23 @@ public class BrokerageUserServiceImpl implements BrokerageUserService { | ||
| 294 | } | 306 | } |
| 295 | 307 | ||
| 296 | private void validateCanBindUser(BrokerageUserDO user, Long bindUserId) { | 308 | private void validateCanBindUser(BrokerageUserDO user, Long bindUserId) { |
| 297 | - // 校验要绑定的用户有无推广资格 | ||
| 298 | - BrokerageUserDO bindUser = brokerageUserMapper.selectById(bindUserId); | 309 | + // 1.1 校验推广人是否存在 |
| 310 | + MemberUserRespDTO bindUserInfo = memberUserApi.getUser(bindUserId); | ||
| 311 | + if (bindUserInfo == null) { | ||
| 312 | + throw exception(BROKERAGE_USER_NOT_EXISTS); | ||
| 313 | + } | ||
| 314 | + // 1.2 校验要绑定的用户有无推广资格 | ||
| 315 | + BrokerageUserDO bindUser = getOrCreateBrokerageUser(bindUserId); | ||
| 299 | if (bindUser == null || BooleanUtil.isFalse(bindUser.getBrokerageEnabled())) { | 316 | if (bindUser == null || BooleanUtil.isFalse(bindUser.getBrokerageEnabled())) { |
| 300 | throw exception(BROKERAGE_BIND_USER_NOT_ENABLED); | 317 | throw exception(BROKERAGE_BIND_USER_NOT_ENABLED); |
| 301 | } | 318 | } |
| 302 | 319 | ||
| 303 | - // 校验绑定自己 | 320 | + // 2. 校验绑定自己 |
| 304 | if (Objects.equals(user.getId(), bindUserId)) { | 321 | if (Objects.equals(user.getId(), bindUserId)) { |
| 305 | throw exception(BROKERAGE_BIND_SELF); | 322 | throw exception(BROKERAGE_BIND_SELF); |
| 306 | } | 323 | } |
| 307 | 324 | ||
| 308 | - // 下级不能绑定自己的上级 | 325 | + // 3. 下级不能绑定自己的上级 |
| 309 | for (int i = 0; i <= Short.MAX_VALUE; i++) { | 326 | for (int i = 0; i <= Short.MAX_VALUE; i++) { |
| 310 | if (Objects.equals(bindUser.getBindUserId(), user.getId())) { | 327 | if (Objects.equals(bindUser.getBindUserId(), user.getId())) { |
| 311 | throw exception(BROKERAGE_BIND_LOOP); | 328 | throw exception(BROKERAGE_BIND_LOOP); |