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,12 +635,12 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
635 .setRefundStatus(TradeOrderRefundStatusEnum.PART.getStatus()).setRefundPrice(orderRefundPrice)); 635 .setRefundStatus(TradeOrderRefundStatusEnum.PART.getStatus()).setRefundPrice(orderRefundPrice));
636 } 636 }
637 637
638 - // TODO 芋艿:未来如果有分佣,需要更新相关分佣订单为已失效  
639 -  
640 // 扣减用户积分 638 // 扣减用户积分
641 getSelf().reduceUserPointAsync(order.getUserId(), orderRefundPrice, afterSaleId); 639 getSelf().reduceUserPointAsync(order.getUserId(), orderRefundPrice, afterSaleId);
642 // 扣减用户经验 640 // 扣减用户经验
643 getSelf().reduceUserExperienceAsync(order.getUserId(), orderRefundPrice, afterSaleId); 641 getSelf().reduceUserExperienceAsync(order.getUserId(), orderRefundPrice, afterSaleId);
  642 + // 更新分佣记录为已失效
  643 + getSelf().cancelBrokerageAsync(order.getUserId(), id);
644 } 644 }
645 645
646 @Override 646 @Override
@@ -757,6 +757,11 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { @@ -757,6 +757,11 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
757 brokerageApi.addBrokerage(userId, list); 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 * 获得自身的代理对象,解决 AOP 生效问题 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,6 +27,6 @@ public class BrokerageApiImpl implements BrokerageApi {
27 27
28 @Override 28 @Override
29 public void cancelBrokerage(Long userId, String bizId) { 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,4 +39,9 @@ public interface MemberBrokerageRecordMapper extends BaseMapperX<MemberBrokerage
39 .eq(MemberBrokerageRecordDO::getId, id) 39 .eq(MemberBrokerageRecordDO::getId, id)
40 .eq(MemberBrokerageRecordDO::getStatus, status)); 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,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 * @param id 用户编号 99 * @param id 用户编号
@@ -94,12 +109,27 @@ public interface MemberUserMapper extends BaseMapperX&lt;MemberUserDO&gt; { @@ -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 * @param id 用户编号 128 * @param id 用户编号
99 * @param incrCount 减少冻结佣金(负数) 129 * @param incrCount 减少冻结佣金(负数)
100 * @return 更新条数 130 * @return 更新条数
101 */ 131 */
102 - default int updateFrozenBrokeragePriceDecr(Long id, int incrCount) { 132 + default int updateFrozenBrokeragePriceDecrAndBrokeragePriceIncr(Long id, int incrCount) {
103 Assert.isTrue(incrCount < 0); 133 Assert.isTrue(incrCount < 0);
104 LambdaUpdateWrapper<MemberUserDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<MemberUserDO>() 134 LambdaUpdateWrapper<MemberUserDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<MemberUserDO>()
105 .setSql(" frozen_brokerage_price = frozen_brokerage_price + " + incrCount + // 负数,所以使用 + 号 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,16 +33,22 @@ public interface MemberBrokerageRecordService {
33 /** 33 /**
34 * 增加佣金 34 * 增加佣金
35 * 35 *
36 - * @param userId 会员ID 36 + * @param userId 会员编号
37 * @param list 请求参数列表 37 * @param list 请求参数列表
38 */ 38 */
39 void addBrokerage(Long userId, List<BrokerageAddReqDTO> list); 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 * @return 解冻佣金的数量 51 * @return 解冻佣金的数量
45 */ 52 */
46 int unfreezeRecord(); 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,6 +13,7 @@ import cn.iocoder.yudao.module.member.dal.dataobject.brokerage.record.MemberBrok
13 import cn.iocoder.yudao.module.member.dal.dataobject.point.MemberPointConfigDO; 13 import cn.iocoder.yudao.module.member.dal.dataobject.point.MemberPointConfigDO;
14 import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; 14 import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
15 import cn.iocoder.yudao.module.member.dal.mysql.brokerage.record.MemberBrokerageRecordMapper; 15 import cn.iocoder.yudao.module.member.dal.mysql.brokerage.record.MemberBrokerageRecordMapper;
  16 +import cn.iocoder.yudao.module.member.enums.brokerage.BrokerageRecordBizTypeEnum;
16 import cn.iocoder.yudao.module.member.enums.brokerage.BrokerageRecordStatusEnum; 17 import cn.iocoder.yudao.module.member.enums.brokerage.BrokerageRecordStatusEnum;
17 import cn.iocoder.yudao.module.member.service.point.MemberPointConfigService; 18 import cn.iocoder.yudao.module.member.service.point.MemberPointConfigService;
18 import cn.iocoder.yudao.module.member.service.user.MemberUserService; 19 import cn.iocoder.yudao.module.member.service.user.MemberUserService;
@@ -85,6 +86,29 @@ public class MemberBrokerageRecordServiceImpl implements MemberBrokerageRecordSe @@ -85,6 +86,29 @@ public class MemberBrokerageRecordServiceImpl implements MemberBrokerageRecordSe
85 addBrokerage(secondUser, list, memberConfig.getBrokerageFrozenDays(), memberConfig.getBrokerageSecondPercent(), BrokerageAddReqDTO::getSkuSecondBrokeragePrice); 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,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 log.info("[unfreezeRecord][record({}) 更新为已结算成功]", record.getId()); 219 log.info("[unfreezeRecord][record({}) 更新为已结算成功]", record.getId());
196 return true; 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,4 +190,12 @@ public interface MemberUserService {
190 * @param frozenBrokeragePrice 用户冻结佣金 190 * @param frozenBrokeragePrice 用户冻结佣金
191 */ 191 */
192 void updateUserFrozenBrokeragePrice(Long id, int frozenBrokeragePrice); 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 package cn.iocoder.yudao.module.member.service.user; 1 package cn.iocoder.yudao.module.member.service.user;
2 2
  3 +import cn.hutool.core.lang.Assert;
3 import cn.hutool.core.util.IdUtil; 4 import cn.hutool.core.util.IdUtil;
4 import cn.hutool.core.util.ObjectUtil; 5 import cn.hutool.core.util.ObjectUtil;
5 import cn.hutool.core.util.StrUtil; 6 import cn.hutool.core.util.StrUtil;
@@ -272,7 +273,11 @@ public class MemberUserServiceImpl implements MemberUserService { @@ -272,7 +273,11 @@ public class MemberUserServiceImpl implements MemberUserService {
272 @Override 273 @Override
273 @Transactional(rollbackFor = Exception.class) 274 @Transactional(rollbackFor = Exception.class)
274 public void updateUserBrokeragePrice(Long id, int brokeragePrice) { 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 @Override 283 @Override
@@ -281,10 +286,17 @@ public class MemberUserServiceImpl implements MemberUserService { @@ -281,10 +286,17 @@ public class MemberUserServiceImpl implements MemberUserService {
281 if (frozenBrokeragePrice > 0) { 286 if (frozenBrokeragePrice > 0) {
282 memberUserMapper.updateFrozenBrokeragePriceIncr(id, frozenBrokeragePrice); 287 memberUserMapper.updateFrozenBrokeragePriceIncr(id, frozenBrokeragePrice);
283 } else if (frozenBrokeragePrice < 0) { 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