Commit 9eb7837b67c0ed8b9d4e85efac33372a0a79ae27

Authored by owen
1 parent a708521b

member: 佣金失效

yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java
... ... @@ -635,12 +635,12 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
635 635 .setRefundStatus(TradeOrderRefundStatusEnum.PART.getStatus()).setRefundPrice(orderRefundPrice));
636 636 }
637 637  
638   - // TODO 芋艿:未来如果有分佣,需要更新相关分佣订单为已失效
639   -
640 638 // 扣减用户积分
641 639 getSelf().reduceUserPointAsync(order.getUserId(), orderRefundPrice, afterSaleId);
642 640 // 扣减用户经验
643 641 getSelf().reduceUserExperienceAsync(order.getUserId(), orderRefundPrice, afterSaleId);
  642 + // 更新分佣记录为已失效
  643 + getSelf().cancelBrokerageAsync(order.getUserId(), id);
644 644 }
645 645  
646 646 @Override
... ... @@ -757,6 +757,11 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
757 757 brokerageApi.addBrokerage(userId, list);
758 758 }
759 759  
  760 + @Async
  761 + protected void cancelBrokerageAsync(Long userId, Long orderItemId) {
  762 + brokerageApi.cancelBrokerage(userId, String.valueOf(orderItemId));
  763 + }
  764 +
760 765 /**
761 766 * 获得自身的代理对象,解决 AOP 生效问题
762 767 *
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/api/brokerage/BrokerageApiImpl.java
... ... @@ -27,6 +27,6 @@ public class BrokerageApiImpl implements BrokerageApi {
27 27  
28 28 @Override
29 29 public void cancelBrokerage(Long userId, String bizId) {
30   -
  30 + memberBrokerageRecordService.cancelBrokerage(userId, bizId);
31 31 }
32 32 }
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/brokerage/record/MemberBrokerageRecordMapper.java
... ... @@ -39,4 +39,9 @@ public interface MemberBrokerageRecordMapper extends BaseMapperX<MemberBrokerage
39 39 .eq(MemberBrokerageRecordDO::getId, id)
40 40 .eq(MemberBrokerageRecordDO::getStatus, status));
41 41 }
  42 +
  43 + default MemberBrokerageRecordDO selectByUserIdAndBizTypeAndBizId(Integer bizType, String bizId) {
  44 + return selectOne(MemberBrokerageRecordDO::getBizType, bizType,
  45 + MemberBrokerageRecordDO::getBizId, bizId);
  46 + }
42 47 }
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/user/MemberUserMapper.java
... ... @@ -79,6 +79,21 @@ public interface MemberUserMapper extends BaseMapperX<MemberUserDO> {
79 79 }
80 80  
81 81 /**
  82 + * 更新用户可用佣金(减少)
  83 + * 注意:理论上佣金可能已经提现,这时会扣出负数,确保平台不会造成损失
  84 + *
  85 + * @param id 用户编号
  86 + * @param incrCount 增加佣金(负数)
  87 + */
  88 + default void updateBrokeragePriceDecr(Long id, int incrCount) {
  89 + Assert.isTrue(incrCount < 0);
  90 + LambdaUpdateWrapper<MemberUserDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<MemberUserDO>()
  91 + .setSql(" brokerage_price = brokerage_price + " + incrCount) // 负数,所以使用 + 号
  92 + .eq(MemberUserDO::getId, id);
  93 + update(null, lambdaUpdateWrapper);
  94 + }
  95 +
  96 + /**
82 97 * 更新用户冻结佣金(增加)
83 98 *
84 99 * @param id 用户编号
... ... @@ -94,12 +109,27 @@ public interface MemberUserMapper extends BaseMapperX&lt;MemberUserDO&gt; {
94 109  
95 110 /**
96 111 * 更新用户冻结佣金(减少)
  112 + * 注意:理论上冻结佣金可能已经解冻,这时会扣出负数,确保平台不会造成损失
  113 + *
  114 + * @param id 用户编号
  115 + * @param incrCount 减少冻结佣金(负数)
  116 + */
  117 + default void updateFrozenBrokeragePriceDecr(Long id, int incrCount) {
  118 + Assert.isTrue(incrCount < 0);
  119 + LambdaUpdateWrapper<MemberUserDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<MemberUserDO>()
  120 + .setSql(" frozen_brokerage_price = frozen_brokerage_price + " + incrCount) // 负数,所以使用 + 号
  121 + .eq(MemberUserDO::getId, id);
  122 + update(null, lambdaUpdateWrapper);
  123 + }
  124 +
  125 + /**
  126 + * 更新用户冻结佣金(减少), 更新用户佣金(增加)
97 127 *
98 128 * @param id 用户编号
99 129 * @param incrCount 减少冻结佣金(负数)
100 130 * @return 更新条数
101 131 */
102   - default int updateFrozenBrokeragePriceDecr(Long id, int incrCount) {
  132 + default int updateFrozenBrokeragePriceDecrAndBrokeragePriceIncr(Long id, int incrCount) {
103 133 Assert.isTrue(incrCount < 0);
104 134 LambdaUpdateWrapper<MemberUserDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<MemberUserDO>()
105 135 .setSql(" frozen_brokerage_price = frozen_brokerage_price + " + incrCount + // 负数,所以使用 + 号
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/brokerage/record/MemberBrokerageRecordService.java
... ... @@ -33,16 +33,22 @@ public interface MemberBrokerageRecordService {
33 33 /**
34 34 * 增加佣金
35 35 *
36   - * @param userId 会员ID
  36 + * @param userId 会员编号
37 37 * @param list 请求参数列表
38 38 */
39 39 void addBrokerage(Long userId, List<BrokerageAddReqDTO> list);
40 40  
41 41 /**
  42 + * 取消佣金:将佣金记录,状态修改为已失效
  43 + * @param userId 会员编号
  44 + * @param bizId 业务编号
  45 + */
  46 + void cancelBrokerage(Long userId, String bizId);
  47 +
  48 + /**
42 49 * 解冻佣金:将待结算的佣金记录,状态修改为已结算
43 50 *
44 51 * @return 解冻佣金的数量
45 52 */
46 53 int unfreezeRecord();
47   -
48 54 }
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/brokerage/record/MemberBrokerageRecordServiceImpl.java
... ... @@ -13,6 +13,7 @@ import cn.iocoder.yudao.module.member.dal.dataobject.brokerage.record.MemberBrok
13 13 import cn.iocoder.yudao.module.member.dal.dataobject.point.MemberPointConfigDO;
14 14 import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
15 15 import cn.iocoder.yudao.module.member.dal.mysql.brokerage.record.MemberBrokerageRecordMapper;
  16 +import cn.iocoder.yudao.module.member.enums.brokerage.BrokerageRecordBizTypeEnum;
16 17 import cn.iocoder.yudao.module.member.enums.brokerage.BrokerageRecordStatusEnum;
17 18 import cn.iocoder.yudao.module.member.service.point.MemberPointConfigService;
18 19 import cn.iocoder.yudao.module.member.service.user.MemberUserService;
... ... @@ -85,6 +86,29 @@ public class MemberBrokerageRecordServiceImpl implements MemberBrokerageRecordSe
85 86 addBrokerage(secondUser, list, memberConfig.getBrokerageFrozenDays(), memberConfig.getBrokerageSecondPercent(), BrokerageAddReqDTO::getSkuSecondBrokeragePrice);
86 87 }
87 88  
  89 + @Override
  90 + @Transactional(rollbackFor = Exception.class)
  91 + public void cancelBrokerage(Long userId, String bizId) {
  92 + MemberBrokerageRecordDO record = memberBrokerageRecordMapper.selectByUserIdAndBizTypeAndBizId(BrokerageRecordBizTypeEnum.ORDER.getType(), bizId);
  93 + if (record == null || ObjectUtil.notEqual(record.getUserId(), userId)) {
  94 + log.error("[cancelBrokerage][userId({})][bizId({}) 更新为已失效失败:记录不存在]", userId, bizId);
  95 + return;
  96 + }
  97 +
  98 + MemberBrokerageRecordDO updateObj = new MemberBrokerageRecordDO().setStatus(BrokerageRecordStatusEnum.CANCEL.getStatus());
  99 + int updateRows = memberBrokerageRecordMapper.updateByIdAndStatus(record.getId(), record.getStatus(), updateObj);
  100 + if (updateRows == 0) {
  101 + log.error("[cancelBrokerage][record({}) 更新为已失效失败]", record.getId());
  102 + return;
  103 + }
  104 +
  105 + if (BrokerageRecordStatusEnum.WAIT_SETTLEMENT.getStatus().equals(record.getStatus())) {
  106 + memberUserService.updateUserFrozenBrokeragePrice(userId, -record.getPrice());
  107 + } else if (BrokerageRecordStatusEnum.SETTLEMENT.getStatus().equals(record.getStatus())) {
  108 + memberUserService.updateUserBrokeragePrice(userId, -record.getPrice());
  109 + }
  110 + }
  111 +
88 112 /**
89 113 * 计算佣金
90 114 *
... ... @@ -190,7 +214,7 @@ public class MemberBrokerageRecordServiceImpl implements MemberBrokerageRecordSe
190 214 }
191 215  
192 216 // 更新用户冻结佣金
193   - memberUserService.updateUserFrozenBrokeragePrice(record.getUserId(), -record.getPrice());
  217 + memberUserService.updateFrozenBrokeragePriceDecrAndBrokeragePriceIncr(record.getUserId(), -record.getPrice());
194 218  
195 219 log.info("[unfreezeRecord][record({}) 更新为已结算成功]", record.getId());
196 220 return true;
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserService.java
... ... @@ -190,4 +190,12 @@ public interface MemberUserService {
190 190 * @param frozenBrokeragePrice 用户冻结佣金
191 191 */
192 192 void updateUserFrozenBrokeragePrice(Long id, int frozenBrokeragePrice);
  193 +
  194 + /**
  195 + * 更新用户冻结佣金(减少), 更新用户佣金(增加)
  196 + *
  197 + * @param id 用户编号
  198 + * @param frozenBrokeragePrice 减少冻结佣金(负数)
  199 + */
  200 + void updateFrozenBrokeragePriceDecrAndBrokeragePriceIncr(Long id, int frozenBrokeragePrice);
193 201 }
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImpl.java
1 1 package cn.iocoder.yudao.module.member.service.user;
2 2  
  3 +import cn.hutool.core.lang.Assert;
3 4 import cn.hutool.core.util.IdUtil;
4 5 import cn.hutool.core.util.ObjectUtil;
5 6 import cn.hutool.core.util.StrUtil;
... ... @@ -272,7 +273,11 @@ public class MemberUserServiceImpl implements MemberUserService {
272 273 @Override
273 274 @Transactional(rollbackFor = Exception.class)
274 275 public void updateUserBrokeragePrice(Long id, int brokeragePrice) {
275   - memberUserMapper.updateBrokeragePriceIncr(id, brokeragePrice);
  276 + if (brokeragePrice > 0) {
  277 + memberUserMapper.updateBrokeragePriceIncr(id, brokeragePrice);
  278 + } else if (brokeragePrice < 0) {
  279 + memberUserMapper.updateBrokeragePriceDecr(id, brokeragePrice);
  280 + }
276 281 }
277 282  
278 283 @Override
... ... @@ -281,10 +286,17 @@ public class MemberUserServiceImpl implements MemberUserService {
281 286 if (frozenBrokeragePrice > 0) {
282 287 memberUserMapper.updateFrozenBrokeragePriceIncr(id, frozenBrokeragePrice);
283 288 } else if (frozenBrokeragePrice < 0) {
284   - int updateRows = memberUserMapper.updateFrozenBrokeragePriceDecr(id, frozenBrokeragePrice);
285   - if (updateRows == 0) {
286   - throw exception(MEMBER_FROZEN_BROKERAGE_PRICE_NOT_ENOUGH);
287   - }
  289 + memberUserMapper.updateFrozenBrokeragePriceDecr(id, frozenBrokeragePrice);
  290 + }
  291 + }
  292 +
  293 + @Override
  294 + @Transactional(rollbackFor = Exception.class)
  295 + public void updateFrozenBrokeragePriceDecrAndBrokeragePriceIncr(Long id, int frozenBrokeragePrice) {
  296 + Assert.isTrue(frozenBrokeragePrice < 0);
  297 + int updateRows = memberUserMapper.updateFrozenBrokeragePriceDecrAndBrokeragePriceIncr(id, frozenBrokeragePrice);
  298 + if (updateRows == 0) {
  299 + throw exception(MEMBER_FROZEN_BROKERAGE_PRICE_NOT_ENOUGH);
288 300 }
289 301 }
290 302  
... ...