فهرست منبع

在获取缴费流水号失败的情况下,最多重复调用5次保存缴费的接口

lighter 2 سال پیش
والد
کامیت
beb8e089d2

+ 7 - 1
src/main/java/thyyxxk/wxservice_server/config/exception/ExceptionEnum.java

@@ -23,7 +23,13 @@ public enum ExceptionEnum {
     /**
      * 以下是不需要提示的错误
      * */
-    SLIGHTLY_ERROR(4001, "未知错误!");
+    SLIGHTLY_ERROR(4001, "未知错误!"),
+    /**
+     * 以下是内部使用的错误
+     * */
+    FETCH_SERIAL_NO_FAILURE(300, "获取缴费流水号失败"),
+
+    SAVE_MZ_FEE_FAILED(301, "保存门诊缴费信息失败,自动退款。");
 
     private final int code;
     private String message;

+ 8 - 0
src/main/java/thyyxxk/wxservice_server/entity/hrgresponse/SaveMzFeeResponse.java

@@ -9,4 +9,12 @@ import lombok.Data;
 public class SaveMzFeeResponse {
     private Integer resultCode;
     private String resultMessage;
+
+    public Integer getResultCode() {
+        return null == resultCode ? -1 : resultCode;
+    }
+
+    public String getResultMessage() {
+        return null == resultMessage ? "" : resultMessage;
+    }
 }

+ 51 - 30
src/main/java/thyyxxk/wxservice_server/service/SavePayResultService.java

@@ -22,6 +22,7 @@ import thyyxxk.wxservice_server.entity.wxapi.WxPayOrder;
 import thyyxxk.wxservice_server.utils.*;
 
 import java.util.Date;
+import java.util.Objects;
 import java.util.concurrent.TimeUnit;
 
 /**
@@ -87,58 +88,78 @@ public class SavePayResultService {
     }
 
     public ResultVo<Object> saveMzChargeInfo(WxPayOrder order, String successTime) throws Exception {
-        while (TradeVectorUtil.tradeNoBeingRefund(order.getTradeNo())) {
+        String hisOrdNum = order.getHisOrdNum();
+        String tradeNo = order.getTradeNo();
+        while (TradeVectorUtil.tradeNoBeingRefund(tradeNo)) {
             TimeUnit.SECONDS.sleep(3);
         }
-        if (dao.alreadyPayed(order.getTradeNo()) == 1) {
-            log.info("订单号:{} 的门诊缴费信息已保存,无需再次保存。", order.getTradeNo());
-            updateHisChargeStatus(order.getHisOrdNum(), order.getTradeNo());
+        if (dao.alreadyPayed(tradeNo) == 1) {
+            log.info("订单号:{} 的门诊缴费信息已保存,无需再次保存。", tradeNo);
+            updateHisChargeStatus(hisOrdNum, tradeNo);
             return ResultVoUtil.success("保存门诊缴费信息成功。");
         }
-        Integer status = dao.selectPayStatus(order.getTradeNo());
+        Integer status = dao.selectPayStatus(tradeNo);
         if (null != status && status == TradeState.REFUND.getCode()) {
-            TradeVectorUtil.removeRefunded(order.getTradeNo());
+            TradeVectorUtil.removeRefunded(tradeNo);
             return ResultVoUtil.success("因系统原因,订单已退款。请稍后重新缴费或前往一楼收费窗口缴费。");
         }
-        if (TradeVectorUtil.tradeNoRefunded(order.getTradeNo())) {
-            dao.updateRefundStatus(order.getTradeNo());
+        if (TradeVectorUtil.tradeNoRefunded(tradeNo)) {
+            dao.updateRefundStatus(tradeNo);
             return ResultVoUtil.success("因系统原因,订单已退款。请稍后重新缴费或前往一楼收费窗口缴费。");
         }
         JSONObject hrgParam = new JSONObject();
         hrgParam.put("patCardType", 1);
         hrgParam.put("patCardNo", order.getPatientId());
-        hrgParam.put("hisOrdNum", order.getHisOrdNum());
-        hrgParam.put("psOrdNum", order.getTradeNo());
+        hrgParam.put("hisOrdNum", hisOrdNum);
+        hrgParam.put("psOrdNum", tradeNo);
         hrgParam.put("payMode", "WX");
         hrgParam.put("payAmt", DecimalTool.moneyYuanToFen(order.getTotalFee()));
         hrgParam.put("agtOrdNum", order.getSerialNo());
         hrgParam.put("payTime", successTime);
-        RestTemplate template = new RestTemplate();
-        SaveMzFeeResponse saveMzFeeResponse = template.postForObject(hrgApiUrl + "/payChargeDetailFormHaiCi",
-                hrgParam, SaveMzFeeResponse.class);
-        log.info("保存门诊缴费信息:\n参数:{},\n结果:{}", hrgParam, saveMzFeeResponse);
-        if (null != saveMzFeeResponse && null != saveMzFeeResponse.getResultCode() &&
-                saveMzFeeResponse.getResultCode() == 0) {
-            updateHisChargeStatus(order.getHisOrdNum(), order.getTradeNo());
+        int tryTimes = 1;
+        ExceptionEnum mzFeeResponse = saveMzPayResult(hrgParam, tryTimes, hisOrdNum, tradeNo);
+        if (mzFeeResponse == ExceptionEnum.SUCCESS) {
             return ResultVoUtil.success("保存门诊缴费信息成功。");
         }
-        if (dao.alreadyPayed(order.getTradeNo()) == 1) {
-            updateHisChargeStatus(order.getHisOrdNum(), order.getTradeNo());
-            return ResultVoUtil.success("保存门诊缴费信息成功。");
+        while (mzFeeResponse == ExceptionEnum.FETCH_SERIAL_NO_FAILURE && tryTimes < 5) {
+            tryTimes ++;
+            TimeUnit.SECONDS.sleep(tryTimes > 3 ? 2 : tryTimes);
+            mzFeeResponse = saveMzPayResult(hrgParam, tryTimes, hisOrdNum, tradeNo);
         }
-        String message = "保存门诊缴费信息失败,自动退款。";
-        if (null != saveMzFeeResponse && StringUtil.notBlank(saveMzFeeResponse.getResultMessage())) {
-            message = saveMzFeeResponse.getResultMessage();
+        if (mzFeeResponse == ExceptionEnum.SUCCESS) {
+            return ResultVoUtil.success("保存门诊缴费信息成功。");
         }
-        log.info("【订单号:{}】发起自动退款:{}", order.getTradeNo(), message);
-        ResultVo<String> refund = refundService.autoRefund(order.getTradeNo(), message);
-        log.info("【订单号:{}】自动退款结果:{}", order.getTradeNo(), refund);
+        log.info("【订单号:{}】发起自动退款:{}", tradeNo, mzFeeResponse.getMessage());
+        ResultVo<String> refund = refundService.autoRefund(tradeNo, mzFeeResponse.getMessage());
+        log.info("【订单号:{}】自动退款结果:{}", tradeNo, refund);
         if (refund.getCode() == ExceptionEnum.SUCCESS.getCode()) {
-            dao.refundOrder(order.getTradeNo(), message);
-            return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "【" + message +  "】已为您自动退款,请留意到账信息。");
+            dao.refundOrder(tradeNo, mzFeeResponse.getMessage());
+            return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "【" + mzFeeResponse.getMessage() +  "】已为您自动退款,请留意到账信息。");
         }
-        dao.updatePayStatusOnly(order.getTradeNo(), 7);
-        return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "【" + message +  "】自动退款失败,请联系服务中心进行退款。");
+        dao.updatePayStatusOnly(tradeNo, 7);
+        return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "【" + mzFeeResponse.getMessage() +  "】自动退款失败,请联系服务中心进行退款。");
+    }
+
+    private ExceptionEnum saveMzPayResult(JSONObject hrgParam, int times, String hisOrdNum, String tradeNo) {
+        RestTemplate template = new RestTemplate();
+        SaveMzFeeResponse mzFeeResponse = template.postForObject(hrgApiUrl + "/payChargeDetailFormHaiCi",
+                hrgParam, SaveMzFeeResponse.class);
+        log.info("第{}次尝试保存门诊缴费信息:\n参数:{},\n结果:{}", times, hrgParam, mzFeeResponse);
+        mzFeeResponse = null == mzFeeResponse ? new SaveMzFeeResponse() : mzFeeResponse;
+        if (mzFeeResponse.getResultCode() == 0) {
+            updateHisChargeStatus(hisOrdNum, tradeNo);
+            return ExceptionEnum.SUCCESS;
+        }
+        if (dao.alreadyPayed(tradeNo) == 1) {
+            updateHisChargeStatus(hisOrdNum, tradeNo);
+            return ExceptionEnum.SUCCESS;
+        }
+        if (mzFeeResponse.getResultMessage().contains("获取缴费流水号失败")) {
+            return ExceptionEnum.FETCH_SERIAL_NO_FAILURE;
+        }
+        ExceptionEnum saveMzFeeFailed = ExceptionEnum.SAVE_MZ_FEE_FAILED;
+        saveMzFeeFailed.setMessage(mzFeeResponse.getResultMessage());
+        return saveMzFeeFailed;
     }
 
     private void updateHisChargeStatus(String hisOrdNum, String tradeNo) {