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 | 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
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<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 | 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 | ... | ... |