Ver Fonte

余额退款充值优惠相关逻辑优化

skyline há 1 ano atrás
pai
commit
d90b539a9c

+ 2 - 2
mapper/src/main/java/com/kym/mapper/miniapp/AccountMapper.java

@@ -1,7 +1,7 @@
 package com.kym.mapper.miniapp;
 
-import com.github.yulichang.base.MPJBaseMapper;
 import com.kym.entity.miniapp.Account;
+import com.kym.mapper.mybatisplus.MyBaseMapper;
 
 /**
  * <p>
@@ -11,6 +11,6 @@ import com.kym.entity.miniapp.Account;
  * @author skyline
  * @since 2023-08-07
  */
-public interface AccountMapper extends MPJBaseMapper<Account> {
+public interface AccountMapper extends MyBaseMapper<Account> {
 
 }

+ 6 - 1
miniapp/src/main/java/com/kym/miniapp/jobs/UserDiscountExpiredJob.java

@@ -3,6 +3,7 @@ package com.kym.miniapp.jobs;
 import com.kym.common.utils.CommUtil;
 import com.kym.entity.miniapp.UserCoupon;
 import com.kym.entity.miniapp.UserRechargeRights;
+import com.kym.service.miniapp.AccountService;
 import com.kym.service.miniapp.UserCouponService;
 import com.kym.service.miniapp.UserRechargeRightsService;
 import lombok.extern.slf4j.Slf4j;
@@ -23,10 +24,12 @@ public class UserDiscountExpiredJob {
     private final UserRechargeRightsService userRechargeRightsService;
 
     private final UserCouponService userCouponService;
+    private final AccountService accountService;
 
-    public UserDiscountExpiredJob(UserRechargeRightsService userRechargeRightsService, UserCouponService userCouponService) {
+    public UserDiscountExpiredJob(UserRechargeRightsService userRechargeRightsService, UserCouponService userCouponService, AccountService accountService) {
         this.userRechargeRightsService = userRechargeRightsService;
         this.userCouponService = userCouponService;
+        this.accountService = accountService;
     }
 
     // 每天凌晨0点执行一次
@@ -42,6 +45,8 @@ public class UserDiscountExpiredJob {
                     .set(UserRechargeRights::getStatus, UserRechargeRights.STATUS_无效)
                     .in(UserRechargeRights::getId, list.stream().map(UserRechargeRights::getId).toList())
                     .update();
+            // 权益失效时,用户Account中discountAmount今天需要减去当前失效权益已产生的优惠金额
+            accountService.batchHandleDiscountAmount(list);
         }
         log.info("用户权益卡到期处理结束,共处理{}条数据", list.size());
     }

+ 7 - 0
service/src/main/java/com/kym/service/miniapp/AccountService.java

@@ -2,7 +2,11 @@ package com.kym.service.miniapp;
 
 import com.github.yulichang.base.MPJBaseService;
 import com.kym.entity.miniapp.Account;
+import com.kym.entity.miniapp.UserRechargeRights;
 import com.kym.entity.miniapp.vo.UserRightsAndCouponsVo;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
 
 /**
  * <p>
@@ -19,4 +23,7 @@ public interface AccountService extends MPJBaseService<Account> {
     UserRightsAndCouponsVo listRightsAndCoupons();
 
     UserRightsAndCouponsVo listStationAvailableRightsAndCoupons(String stationId);
+
+    @Transactional
+    void batchHandleDiscountAmount(List<UserRechargeRights> userRechargeRightsList);
 }

+ 19 - 2
service/src/main/java/com/kym/service/miniapp/impl/AccountServiceImpl.java

@@ -2,7 +2,7 @@ package com.kym.service.miniapp.impl;
 
 import cn.dev33.satoken.stp.StpUtil;
 import com.baomidou.dynamic.datasource.annotation.DS;
-import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.kym.entity.miniapp.Account;
 import com.kym.entity.miniapp.UserCoupon;
 import com.kym.entity.miniapp.UserRechargeRights;
@@ -11,8 +11,11 @@ import com.kym.mapper.miniapp.AccountMapper;
 import com.kym.service.miniapp.AccountService;
 import com.kym.service.miniapp.UserCouponService;
 import com.kym.service.miniapp.UserRechargeRightsService;
+import com.kym.service.mybatisplus.MyBaseServiceImpl;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -25,7 +28,7 @@ import java.util.Map;
  */
 @Service
 @DS("db-miniapp")
-public class AccountServiceImpl extends MPJBaseServiceImpl<AccountMapper, Account> implements AccountService {
+public class AccountServiceImpl extends MyBaseServiceImpl<AccountMapper, Account> implements AccountService {
 
     private final UserRechargeRightsService userRechargeRightsService;
 
@@ -87,5 +90,19 @@ public class AccountServiceImpl extends MPJBaseServiceImpl<AccountMapper, Accoun
         return vo;
     }
 
+    /**
+     * 批量处理用户权益的优惠金额
+     *
+     * @param userRechargeRightsList
+     */
+    @Transactional
+    @Override
+    public void batchHandleDiscountAmount(List<UserRechargeRights> userRechargeRightsList) {
+        var accountList = lambdaQuery().in(Account::getUserId, userRechargeRightsList.stream().map(UserRechargeRights::getUserId).toList()).list();
+        accountList.forEach(account ->
+                account.setDiscountAmount(account.getDiscountAmount() - userRechargeRightsList.stream().filter(userRechargeRights -> userRechargeRights.getUserId().equals(account.getUserId())).mapToInt(UserRechargeRights::getDiscountAmount).sum()));
+        updateBatchByQueryWrapper(accountList, account -> new QueryWrapper<Account>().eq("user_id", account.getUserId()));
+    }
+
 
 }

+ 4 - 1
service/src/main/java/com/kym/service/miniapp/impl/RechargeRightsDiscountHandle.java

@@ -75,6 +75,8 @@ public class RechargeRightsDiscountHandle implements DiscountService {
                         account.setDiscountAmount(discountAmount);
                         if (chargeOrder.getPayAmount().intValue() == userRechargeRights.getRightsBalance().intValue()) {
                             userRechargeRights.setStatus(UserRechargeRights.STATUS_无效);
+                            // 权益失效时减去当前权益包已产生的优惠金额
+                            account.setDiscountAmount(discountAmount - userRechargeRights.getDiscountAmount());
                         }
                     } else {
                         // 不足(用户当前权益金余额是否足够支付本次充电费用)
@@ -104,7 +106,8 @@ public class RechargeRightsDiscountHandle implements DiscountService {
                         orderRechargeRights.setDiscountAmount(realDiscountAmount);
                         // 此权益包消耗完毕,账户设置优惠不可退金额
                         discountAmount = account.getDiscountAmount() + realDiscountAmount;
-                        account.setDiscountAmount(discountAmount);
+                        // 权益失效时减去当前权益包已产生的优惠金额
+                        account.setDiscountAmount(discountAmount - userRechargeRights.getDiscountAmount());
                     }
                 }
 

+ 4 - 8
service/src/main/java/com/kym/service/wechat/impl/WxPayServiceImpl.java

@@ -11,6 +11,7 @@ import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.dynamic.datasource.annotation.DS;
 import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
+import com.google.common.util.concurrent.AtomicDouble;
 import com.kym.common.config.WxFapiaoConfig;
 import com.kym.common.config.WxPayConfig;
 import com.kym.common.constant.ResponseEnum;
@@ -360,7 +361,7 @@ public class WxPayServiceImpl implements WxPayService {
                 var chargingOrder = chargeOrderService.getChargingOrderByUserId(walletDetail.getUserId());
                 if (chargingOrder != null) {
                     var account = accountService.getAccountByUserId(walletDetail.getUserId());
-                    // TODO: 2023-11-30 快充这里考虑过充的金额要提高 
+                    // TODO: 2023-11-30 快充这里考虑过充的金额要提高
                     var res = enPlusService.updateBalanceByQueryEquipChargeStatus(chargingOrder.getStartChargeSeq(), account.getBalance() - 50);
                     LOGGER.info("用户:{}充电过程中充值,已更新en+充电金额,en+返回数据:{}", account.getUserId(), res);
                 }
@@ -414,7 +415,7 @@ public class WxPayServiceImpl implements WxPayService {
                 .eq(UserRechargeRights::getStatus, UserRechargeRights.STATUS_有效)
                 .update();
 
-        // 余减去优惠金额作为退款金额
+        // 余减去优惠金额作为退款金额,优惠金额数据每次退款完成后重新计算
         AtomicInteger refundAmount = new AtomicInteger(account.getBalance() - account.getDiscountAmount());
         var originalRefundAmount = BigDecimal.valueOf(refundAmount.get());
         // 充值记录
@@ -608,11 +609,6 @@ public class WxPayServiceImpl implements WxPayService {
                         .eq(WalletDetail::getId, walletDetail.getId()).update();
                 LOGGER.info("微信退款回调{}:业务处理结束", notifyRes[2]);
 
-                // 退款时,充值权益失效(权益余额转入冻结余额,接收退款通知时权益状态设置为失效)
-//                userRechargeRightsService.lambdaUpdate().set(UserRechargeRights::getStatus, UserRechargeRights.STATUS_无效)
-//                        .eq(UserRechargeRights::getUserId, walletDetail.getUserId())
-//                        .eq(UserRechargeRights::getStatus, UserRechargeRights.STATUS_有效).update();
-
                 return ResponseEntity.status(HttpStatus.OK).build();
             } else {
                 // 退款失败
@@ -987,4 +983,4 @@ public class WxPayServiceImpl implements WxPayService {
         return res.getServiceResponse();
     }
 
-}
+}