Commit 9eb7837b67c0ed8b9d4e85efac33372a0a79ae27
1 parent
a708521b
member: 佣金失效
Showing
8 changed files
with
102 additions
and
12 deletions
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<MemberUserDO> { | @@ -94,12 +109,27 @@ public interface MemberUserMapper extends BaseMapperX<MemberUserDO> { | ||
| 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 |