ソースを参照

fix:重复支付加锁

liujunchi 2 年 前
コミット
f390721e66

+ 20 - 3
mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/OmsPortalOrderController.java

@@ -25,6 +25,7 @@ import org.springframework.stereotype.Controller;
 import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
@@ -78,8 +79,16 @@ public class OmsPortalOrderController {
     @RequestMapping(value = "/generateOrder", method = RequestMethod.POST)
     @ResponseBody
     public CommonResult generateOrder(@RequestBody OrderParam orderParam) {
-        Map<String, Object> result = portalOrderService.generateOrder(orderParam);
-        return CommonResult.success(result, "下单成功");
+        final Map<String, Object>[] result = new Map[]{new HashMap<>()};
+        if (StringUtil.isEmpty(orderParam.getOrderNo())) {
+            result[0] = portalOrderService.generateOrder(orderParam);
+        }  else {
+            DistributedLock.of(redissonClient)
+                           .runIfLockCanGet(OrderCacheEnum.LOCK_ORDER_NO_MALL.getRedisKey(orderParam.getOrderNo()), () -> {
+                               result[0] = portalOrderService.generateOrder(orderParam);
+                           }, 60L, TimeUnit.SECONDS);
+        }
+        return CommonResult.success(result[0], "下单成功");
     }
 
 
@@ -89,7 +98,15 @@ public class OmsPortalOrderController {
     public CommonResult teacherGenerateOrder(@RequestBody OrderParam orderParam) {
         UmsMember currentMember = memberService.getCurrentMember();
         orderParam.setTeacherId(currentMember.getId());
-        Map<String, Object> result = portalOrderService.generateOrder(orderParam);
+        final Map<String, Object>[] result = new Map[]{new HashMap<>()};
+        if (StringUtil.isEmpty(orderParam.getOrderNo())) {
+            result[0] = portalOrderService.generateOrder(orderParam);
+        }  else {
+            DistributedLock.of(redissonClient)
+                           .runIfLockCanGet(OrderCacheEnum.LOCK_ORDER_NO_MALL.getRedisKey(orderParam.getOrderNo()), () -> {
+                               result[0] = portalOrderService.generateOrder(orderParam);
+                           }, 60L, TimeUnit.SECONDS);
+        }
         return CommonResult.success(result, "下单成功");
     }