Browse Source

修复重复查询订单的问题。

lighter 3 năm trước cách đây
mục cha
commit
e1ed017942

+ 1 - 1
pom.xml

@@ -10,7 +10,7 @@
     </parent>
     <groupId>thyyxxk</groupId>
     <artifactId>wxservice-server</artifactId>
-    <version>6.8</version>
+    <version>7.0</version>
     <name>wxservice-server</name>
     <description>server for wxservice-web</description>
 

+ 37 - 23
src/main/java/thyyxxk/wxservice_server/service/WxApiService.java

@@ -1,5 +1,6 @@
 package thyyxxk.wxservice_server.service;
 
+import ch.qos.logback.core.util.TimeUtil;
 import com.alibaba.fastjson.JSONObject;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.http.client.methods.CloseableHttpResponse;
@@ -32,6 +33,7 @@ import thyyxxk.wxservice_server.utils.*;
 
 import java.nio.charset.StandardCharsets;
 import java.util.*;
+import java.util.concurrent.TimeUnit;
 
 /**
  * @author dj
@@ -183,31 +185,43 @@ public class WxApiService {
     }
 
     public ResultVo<String> queryOrderState(String tradeNo, QuerySource source) throws Exception {
-        WxPayOrder order = dao.selectOrderByTradeNo(tradeNo);
-        OrderType orderType = OrderType.get(order.getOrderType());
-        JSONObject obj = retryService.queryOrderStateFromTencent(tradeNo, orderType, source);
-        String value = obj.getString("trade_state");
-        TradeState tradeState = TradeState.get(value);
-        if (tradeState.equals(TradeState.SUCCESS)) {
-            String successTime = obj.getString("success_time")
-                    .split("\\+")[0].replace("T", " ");
-            dao.updatePayStatusAndPayTime(tradeNo, tradeState.getCode(), successTime);
-            switch (orderType) {
-                case REGISTRATION:
-                    return savePayResultService.saveAppointment(order);
-                case OUTPATIENT:
-                    return savePayResultService.saveMzChargeInfo(order);
-                case INPATIENT_PRE_PAY:
-                    return savePayResultService.saveZyYjjInfo(order);
-                case SELF_HELP_MACHINE:
-                case INSPECTIONS:
-                    return ResultVoUtil.success("订单已支付。");
-                default:
-                    return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "未识别到的订单类型,请联系服务中心。");
+        while (TradeVectorUtil.tradeNoBeingQuery(tradeNo)) {
+            log.info("订单号:{} 正在查询状态中,进入等待区。", tradeNo);
+            TimeUnit.SECONDS.sleep(1);
+        }
+        TradeVectorUtil.add(tradeNo);
+        try {
+            WxPayOrder order = dao.selectOrderByTradeNo(tradeNo);
+            OrderType orderType = OrderType.get(order.getOrderType());
+            JSONObject obj = retryService.queryOrderStateFromTencent(tradeNo, orderType, source);
+            String value = obj.getString("trade_state");
+            TradeState tradeState = TradeState.get(value);
+            if (tradeState.equals(TradeState.SUCCESS)) {
+                String successTime = obj.getString("success_time")
+                        .split("\\+")[0].replace("T", " ");
+                dao.updatePayStatusAndPayTime(tradeNo, tradeState.getCode(), successTime);
+                switch (orderType) {
+                    case REGISTRATION:
+                        return savePayResultService.saveAppointment(order);
+                    case OUTPATIENT:
+                        return savePayResultService.saveMzChargeInfo(order);
+                    case INPATIENT_PRE_PAY:
+                        return savePayResultService.saveZyYjjInfo(order);
+                    case SELF_HELP_MACHINE:
+                    case INSPECTIONS:
+                        return ResultVoUtil.success("订单已支付。");
+                    default:
+                        return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "未识别到的订单类型,请联系服务中心。");
+                }
             }
+            dao.updatePayStatusAndQueryTimes(tradeNo, tradeState.getCode());
+            return ResultVoUtil.fail(ExceptionEnum.INTERNAL_SERVER_ERROR, tradeState.getLabel());
+        } catch (Exception e) {
+            e.printStackTrace();
+            return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "服务器错误,请联系管理员处理。【订单号:" + tradeNo + "】");
+        } finally {
+            TradeVectorUtil.remove(tradeNo);
         }
-        dao.updatePayStatusAndQueryTimes(tradeNo, tradeState.getCode());
-        return ResultVoUtil.fail(ExceptionEnum.INTERNAL_SERVER_ERROR, tradeState.getLabel());
     }
 
     public ResultVo<String> generateMzGuideBillPayQrcode(GenMzPayQrcodeParam param) throws Exception {

+ 19 - 0
src/main/java/thyyxxk/wxservice_server/utils/TradeVectorUtil.java

@@ -0,0 +1,19 @@
+package thyyxxk.wxservice_server.utils;
+
+import java.util.Vector;
+
+public class TradeVectorUtil {
+    private final static Vector<String> tradeNosBeingQuery = new Vector<>();
+
+    public static void add(String tradeNo) {
+        tradeNosBeingQuery.add(tradeNo);
+    }
+
+    public static void remove(String tradeNo) {
+        tradeNosBeingQuery.remove(tradeNo);
+    }
+
+    public static boolean tradeNoBeingQuery(String tradeNo) {
+        return tradeNosBeingQuery.contains(tradeNo);
+    }
+}