|
@@ -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) {
|