zhangkaikai 1 年間 前
コミット
3eec27fd5a

+ 16 - 1
mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserMineController.java

@@ -12,10 +12,12 @@ import com.qs.mp.channel.service.IChannelService;
 import com.qs.mp.common.annotation.Log;
 import com.qs.mp.common.core.domain.AjaxResult;
 import com.qs.mp.common.core.page.TableDataInfo;
+import com.qs.mp.common.core.redis.DistributedLocker;
 import com.qs.mp.common.enums.*;
 import com.qs.mp.common.utils.DateUtils;
 import com.qs.mp.common.utils.StringUtils;
 import com.qs.mp.core.domain.LoginUser;
+import com.qs.mp.framework.redis.RedisLockKey;
 import com.qs.mp.system.domain.SysUser;
 import com.qs.mp.system.service.ISysUserService;
 import com.qs.mp.user.domain.*;
@@ -31,6 +33,7 @@ import io.swagger.annotations.*;
 
 import java.util.*;
 
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 import lombok.AllArgsConstructor;
 import ma.glasnost.orika.MapperFacade;
@@ -92,6 +95,9 @@ public class UserMineController extends BaseApiController {
     @Autowired
     private IUserRedPkgService redPkgService;
 
+    @Autowired
+    private DistributedLocker distributedLocker;
+
     @Log(title = "昵称和头像修改", businessType = BusinessType.UPDATE)
     @PostMapping("/updateUserInfo")
     public AjaxResult updateUserInfo(@RequestBody SysUser user) {
@@ -206,7 +212,16 @@ public class UserMineController extends BaseApiController {
         if (param.getOpenId() == null) {
             return AjaxResult.error("您未微信授权登录,无法提现,请重新微信授权登录");
         }
-        boolean rst = redPkgService.draw(param);
+        String lockKey = RedisLockKey.build(RedisLockKey.USER_RED_PKG_DRAW_LOCK, userId);
+        if (!distributedLocker.tryLock(lockKey, 3, -1, TimeUnit.SECONDS)) {
+            return AjaxResult.error("红包提现太频繁,请稍后再操作");
+        }
+        boolean rst = false;
+        try {
+             rst = redPkgService.draw(param);
+        }finally {
+            distributedLocker.unlock(lockKey);
+        }
         if (rst) {
             return AjaxResult.success("红包领取成功,请查看微信钱包零钱余额");
         }

+ 2 - 0
mp-service/src/main/java/com/qs/mp/framework/redis/RedisLockKey.java

@@ -22,6 +22,8 @@ public enum RedisLockKey {
     USER_COIN_TRANSFER_LOCK("user_coin_transfer_lock_{0}", "盲豆转赠锁"),
 
     USER_CD_KEY_EXCHANGE_LOCK("user_cd_key_exchange_lock_{0}", "兑换码兑换锁"),
+
+    USER_RED_PKG_DRAW_LOCK("user_red_pkg_draw_lock_{0}","红包提现锁")
     ;
 
 

+ 18 - 10
mp-service/src/main/java/com/qs/mp/user/service/impl/UserRedPkgServiceImpl.java

@@ -13,14 +13,13 @@ import com.qs.mp.user.mapper.UserRedPkgMapper;
 import com.qs.mp.user.service.IUserRedPkgService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.wechat.pay.java.service.transferbatch.TransferBatchService;
+import com.wechat.pay.java.service.transferbatch.model.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.wechat.pay.java.core.RSAConfig;
-import com.wechat.pay.java.service.transferbatch.model.InitiateBatchTransferRequest;
-import com.wechat.pay.java.service.transferbatch.model.InitiateBatchTransferResponse;
-import com.wechat.pay.java.service.transferbatch.model.TransferDetailInput;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.Assert;
 
 import java.util.ArrayList;
@@ -59,10 +58,17 @@ public class UserRedPkgServiceImpl extends ServiceImpl<UserRedPkgMapper, UserRed
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public boolean draw(RedPkgDrawParam param) {
 
         // 获取红包信息
         UserRedPkg userRedPkg = getById(param.getId());
+
+        boolean rst = update(new LambdaUpdateWrapper<UserRedPkg>().set(UserRedPkg::getStatus, UserRedPkgStatusEnum.DRAW)
+                .eq(UserRedPkg::getId, userRedPkg.getId()));
+        Assert.isTrue(rst,"用户红包提现更新失败");
+
+
         RSAConfig config = new RSAConfig.Builder()
                 .merchantId(merChantId)
 //                .privateKeyFromPath("mp-service/src/main/resources/config/apiclient_key.pem")
@@ -100,13 +106,15 @@ public class UserRedPkgServiceImpl extends ServiceImpl<UserRedPkgMapper, UserRed
         initiateBatchTransferRequest.setTransferSceneId("1000");
         InitiateBatchTransferResponse response =
                 service.initiateBatchTransfer(initiateBatchTransferRequest);
-        if (response == null) {
-            LogUtil.error(logger, "发起商家转账到零钱失败");
-            return false;
+
+        // 查询批次单状态
+        GetTransferBatchByNoRequest request = new GetTransferBatchByNoRequest();
+        request.setBatchId(response.getBatchId());
+        request.setNeedQueryDetail(true);
+        TransferBatchEntity transferBatchResponse = service.getTransferBatchByNo(request);
+        if ("FINISHED".equals(transferBatchResponse.getTransferBatch().getBatchStatus())) {
+            return true;
         }
-        boolean rst = update(new LambdaUpdateWrapper<UserRedPkg>().set(UserRedPkg::getStatus, UserRedPkgStatusEnum.DRAW)
-                .eq(UserRedPkg::getId, userRedPkg.getId()));
-        Assert.isTrue(rst,"用户红包提现更新失败");
-        return true;
+        return false;
     }
 }