Selaa lähdekoodia

优化门诊缴费状态查询

lighter 2 vuotta sitten
vanhempi
commit
a492eb96f8

+ 2 - 2
pom.xml

@@ -10,7 +10,7 @@
     </parent>
     <groupId>thyyxxk</groupId>
     <artifactId>wxservice-server</artifactId>
-    <version>9.0</version>
+    <version>9.1</version>
     <name>wxservice-server</name>
     <description>server for wxservice-web</description>
 
@@ -50,7 +50,7 @@
         <dependency>
             <groupId>com.microsoft.sqlserver</groupId>
             <artifactId>mssql-jdbc</artifactId>
-            <version>7.4.1.jre8</version>
+            <version>8.2.2.jre8</version>
         </dependency>
         <!-- https://mvnrepository.com/artifact/com.zaxxer/HikariCP -->
         <dependency>

+ 6 - 0
src/main/java/thyyxxk/wxservice_server/dao/WxApiDao.java

@@ -23,6 +23,9 @@ public interface WxApiDao {
     @Select("select * from t_wechat_pay_order with(nolock) where his_ord_num=#{hisOrdNum}")
     WxPayOrder selectSameMzPayOrder(@Param("hisOrdNum") String hisOrdNum);
 
+    @Select("select count(1) from mzy_reqrec WITH(NOLOCK) where psordnum=#{tradeNo} and cancel_mark=0")
+    int alreadyPaidRegisterFee(@Param("tradeNo") String tradeNo);
+
     @Insert("insert into t_wechat_pay_order (body,open_id,total_fee,patient_id," +
             "patient_name,inpatient_no,admiss_times,app_id,mch_id,prepay_id," +
             "time_stamp,trade_no,create_order_sign,pay_sign,spbill_create_ip," +
@@ -46,6 +49,9 @@ public interface WxApiDao {
     @Update("update t_wechat_pay_order set pay_status=#{status} where trade_no=#{tradeNo}")
     void updatePayStatusOnly(@Param("tradeNo") String tradeNo, @Param("status") Integer status);
 
+    @Select("select count(1) from mz_deposit_file WITH(NOLOCK) where psordnum=#{tradeNo} and pay_mark=0")
+    int alreadyPayed(@Param("tradeNo") String tradeNo);
+
     @Update("update t_wechat_pay_order set pay_status=4,refund_op_code='99999',refund_reason=#{rea}, " +
             "his_status=0,refund_op_datetime=getdate() where trade_no=#{tradeNo}")
     void refundOrder(@Param("tradeNo") String tradeNo, @Param("rea") String rea);

+ 31 - 29
src/main/java/thyyxxk/wxservice_server/scheduled/GetWeChatAccessTokenTask.java

@@ -2,6 +2,7 @@ package thyyxxk.wxservice_server.scheduled;
 
 import com.alibaba.fastjson.JSONObject;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -21,6 +22,8 @@ import thyyxxk.wxservice_server.utils.ResultVoUtil;
 @RequestMapping("/tokenSchedule")
 public class GetWeChatAccessTokenTask {
     private static volatile boolean canScheduleRun = true;
+    @Value("${production}")
+    private Boolean production;
 
     @GetMapping("/start")
     public ResultVo<String> setCanScheduleRun(@RequestParam("value") boolean value) {
@@ -35,37 +38,36 @@ public class GetWeChatAccessTokenTask {
 
     @Scheduled(fixedRate = 6900 * 1000)
     public void getAccessToken() {
-        if (!canScheduleRun) {
-            return;
-        }
-        RestTemplate restTemplate = new RestTemplate();
-        String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&" +
-                "appid=" + PropertiesUtil.getProperty("appId") +"&secret=" + PropertiesUtil.getProperty("appSecret");
-        String httpRes = restTemplate.getForObject(url, String.class);
-        JSONObject json = JSONObject.parseObject(httpRes);
-        String token = json.getString("access_token");
-        log.info("获取微信公众号ACCESS_TOKEN: {}", token);
-        PropertiesUtil.writeAccessToken("access_token", token);
-        if (Constants.WINDOWS_10.equals(PropertiesUtil.getProperty(Constants.OS_NAME))) {
-            String synchronizeAccessTokenUrl = "http://192.168.200.3/wxserver/wxApi/synchronizeAccessToken?token=" + token;
-            restTemplate.getForObject(synchronizeAccessTokenUrl, String.class);
-        }
+        if (canScheduleRun && production) {
+            RestTemplate restTemplate = new RestTemplate();
+            String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&" +
+                    "appid=" + PropertiesUtil.getProperty("appId") +"&secret=" + PropertiesUtil.getProperty("appSecret");
+            String httpRes = restTemplate.getForObject(url, String.class);
+            JSONObject json = JSONObject.parseObject(httpRes);
+            String token = json.getString("access_token");
+            log.info("获取微信公众号ACCESS_TOKEN: {}", token);
+            PropertiesUtil.writeAccessToken("access_token", token);
+            if (Constants.WINDOWS_10.equals(PropertiesUtil.getProperty(Constants.OS_NAME))) {
+                String synchronizeAccessTokenUrl = "http://192.168.200.3/wxserver/wxApi/synchronizeAccessToken?token=" + token;
+                restTemplate.getForObject(synchronizeAccessTokenUrl, String.class);
+            }
 
-        url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" +
-                PropertiesUtil.getProperty("access_token") + "&type=jsapi";
-        httpRes = restTemplate.getForObject(url, String.class);
-        json = JSONObject.parseObject(httpRes);
-        String ticket = json.getString("ticket");
-        log.info("获取微信公众号JSAPI票据: {}", ticket);
-        PropertiesUtil.writeAccessToken("ticket", ticket);
+            url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" +
+                    PropertiesUtil.getProperty("access_token") + "&type=jsapi";
+            httpRes = restTemplate.getForObject(url, String.class);
+            json = JSONObject.parseObject(httpRes);
+            String ticket = json.getString("ticket");
+            log.info("获取微信公众号JSAPI票据: {}", ticket);
+            PropertiesUtil.writeAccessToken("ticket", ticket);
 
-        url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=" + PropertiesUtil.getProperty("qywxCorpId") +
-                "&corpsecret=" + PropertiesUtil.getProperty("qywxSecret");
-        httpRes = restTemplate.getForObject(url, String.class);
-        json = JSONObject.parseObject(httpRes);
-        token = json.getString("access_token");
-        log.info("获取企业微信ACCESS_TOKEN: {}", token);
-        PropertiesUtil.writeAccessToken("qywxToken",token);
+            url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=" + PropertiesUtil.getProperty("qywxCorpId") +
+                    "&corpsecret=" + PropertiesUtil.getProperty("qywxSecret");
+            httpRes = restTemplate.getForObject(url, String.class);
+            json = JSONObject.parseObject(httpRes);
+            token = json.getString("access_token");
+            log.info("获取企业微信ACCESS_TOKEN: {}", token);
+            PropertiesUtil.writeAccessToken("qywxToken",token);
+        }
     }
 
 }

+ 10 - 66
src/main/java/thyyxxk/wxservice_server/service/SavePayResultService.java

@@ -52,32 +52,9 @@ public class SavePayResultService {
         this.pushWxMessageService = pushWxMessageService;
     }
 
-    public int queryAppointmentSaveStatus(String tradeNo, String serialNo, String feeAmount, Date payTime) {
-        JSONObject obj = new JSONObject();
-        obj.put("psOrdNum", tradeNo);
-        obj.put("payMode", "WX");
-        obj.put("payAmt", feeAmount);
-        obj.put("agtOrdNum", serialNo);
-        obj.put("payTime", DateUtil.formatDatetime(payTime, "yyyy-MM-dd HH:mm:ss"));
-        RestTemplate template = new RestTemplate();
-        QueryMzPayStatusResponse response = template.postForObject(hrgApiUrl + "/getPayStatusForRegistration",
-                obj, QueryMzPayStatusResponse.class);
-        log.info("门诊挂号订单HIS入库状态查询:\n参数:{},\n结果:{}", obj, response);
-        int hasSaved = 0; // 入库状态:0-未查询到,1-入库成功,2-入库失败
-        if (null != response && response.getResultCode() == 0) {
-            hasSaved = response.getPayStatus();
-        }
-        return hasSaved;
-    }
-
     public ResultVo<Object> saveAppointment(WxPayOrder order) {
-        int hasSaved = queryAppointmentSaveStatus(order.getTradeNo(), order.getSerialNo(),
-                order.getTotalFee().toPlainString(), order.getPayDatetime());
-        if (hasSaved == 0) {
-            log.info("订单号:{} 的挂号信息查询失败,接口未调用成功。", order.getTradeNo());
-            return ResultVoUtil.fail(ExceptionEnum.NETWORK_ERROR, "挂号信息查询失败,将于3分钟后重新发起查询。");
-        }
-        if (hasSaved == 1) {
+        if (dao.alreadyPaidRegisterFee(order.getTradeNo()) == 1) {
+            dao.updateSuccessHisStatus(order.getTradeNo());
             log.info("订单号:{} 的挂号信息已保存,无需再次保存。", order.getTradeNo());
             return ResultVoUtil.success("保存挂号信息成功。");
         }
@@ -98,13 +75,8 @@ public class SavePayResultService {
             dao.updateSuccessHisStatus(order.getTradeNo());
             return ResultVoUtil.success("保存挂号信息成功。");
         }
-        hasSaved = queryAppointmentSaveStatus(order.getTradeNo(), order.getSerialNo(),
-                order.getTotalFee().toPlainString(), order.getPayDatetime());
-        if (hasSaved == 0) {
-            log.info("订单号:{} 的挂号信息查询失败,接口未调用成功。", order.getTradeNo());
-            return ResultVoUtil.fail(ExceptionEnum.NETWORK_ERROR, "挂号信息查询失败,将于3分钟后重新发起查询。");
-        }
-        if (hasSaved == 1) {
+        if (dao.alreadyPaidRegisterFee(order.getTradeNo()) == 1) {
+            dao.updateSuccessHisStatus(order.getTradeNo());
             return ResultVoUtil.success("保存挂号信息成功。");
         }
         ResultVo<String> refund = refundService.autoRefund(order.getTradeNo(), "保存挂号信息失败,自动退款。");
@@ -117,34 +89,10 @@ public class SavePayResultService {
         return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "保存挂号信息失败,自动退款失败,请联系服务中心进行退款。");
     }
 
-    public int queryMzPaySaveStatus(String hisOrdNum, String tradeNo, String serialNo, String feeAmount, Date payTime) {
-        JSONObject obj = new JSONObject();
-        obj.put("hisOrdNum", hisOrdNum);
-        obj.put("psOrdNum", tradeNo);
-        obj.put("agtOrdNum", serialNo);
-        obj.put("payMode", "WX");
-        obj.put("payAmt", feeAmount);
-        obj.put("payTime", DateUtil.formatDatetime(payTime, "yyyy-MM-dd HH:mm:ss"));
-        RestTemplate template = new RestTemplate();
-        QueryMzPayStatusResponse response = template.postForObject(hrgApiUrl + "/getPayStatus",
-                obj, QueryMzPayStatusResponse.class);
-        log.info("门诊缴费订单HIS入库状态查询:\n参数:{},\n结果:{}", obj, response);
-        int hasSaved = 0; // 入库状态:0-未查询到,1-入库成功,2-入库失败
-        if (null != response && response.getResultCode() != -1) {
-            hasSaved = response.getPayStatus();
-        }
-        return hasSaved;
-    }
-
     public ResultVo<Object> saveMzChargeInfo(WxPayOrder order, QuerySource source, String successTime) {
-        int hasSaved = queryMzPaySaveStatus(order.getHisOrdNum(), order.getTradeNo(),
-                order.getSerialNo(), order.getTotalFee().toPlainString(), order.getPayDatetime());
-        if (hasSaved == 0) {
-            log.info("订单号:{} 的门诊缴费信息查询失败,接口未调用成功。", order.getTradeNo());
-            return ResultVoUtil.fail(ExceptionEnum.NETWORK_ERROR, "门诊缴费信息查询失败,将于3分钟后重新发起查询。");
-        }
-        if (hasSaved == 1) {
+        if (dao.alreadyPayed(order.getTradeNo()) == 1) {
             log.info("订单号:{} 的门诊缴费信息已保存,无需再次保存。", order.getTradeNo());
+            dao.updateSuccessHisStatus(order.getTradeNo());
             return ResultVoUtil.success("保存门诊缴费信息成功。");
         }
         JSONObject hrgParam = new JSONObject();
@@ -160,7 +108,8 @@ public class SavePayResultService {
         SaveMzFeeResponse saveMzFeeResponse = template.postForObject(hrgApiUrl + "/payChargeDetailFormHaiCi",
                 hrgParam, SaveMzFeeResponse.class);
         log.info("保存门诊缴费信息:\n参数:{},\n结果:{}", hrgParam, saveMzFeeResponse);
-        if (null != saveMzFeeResponse && null != saveMzFeeResponse.getResultCode() && saveMzFeeResponse.getResultCode() == 0) {
+        if (null != saveMzFeeResponse && null != saveMzFeeResponse.getResultCode() &&
+                saveMzFeeResponse.getResultCode() == 0) {
             dao.updateSuccessHisStatus(order.getTradeNo());
             updateSiMzSavedFlag(order.getHisOrdNum());
             if (source == QuerySource.INTERFACE) {
@@ -175,13 +124,8 @@ public class SavePayResultService {
             }
             return ResultVoUtil.success("保存门诊缴费信息成功。");
         }
-        hasSaved = queryMzPaySaveStatus(order.getHisOrdNum(), order.getTradeNo(),
-                order.getSerialNo(), order.getTotalFee().toPlainString(), order.getPayDatetime());
-        if (hasSaved == 0) {
-            log.info("订单号:{} 的门诊缴费信息查询失败,接口未调用成功。", order.getTradeNo());
-            return ResultVoUtil.fail(ExceptionEnum.NETWORK_ERROR, "门诊缴费信息查询失败,将于3分钟后重新发起查询。");
-        }
-        if (hasSaved == 1) {
+        if (dao.alreadyPayed(order.getTradeNo()) == 1) {
+            dao.updateSuccessHisStatus(order.getTradeNo());
             if (source == QuerySource.INTERFACE) {
                 String hisOrdNum = order.getHisOrdNum();
                 String[] hsrdnms = hisOrdNum.split("_");

+ 2 - 4
src/main/java/thyyxxk/wxservice_server/service/WxApiService.java

@@ -194,11 +194,9 @@ public class WxApiService {
             OrderType orderType = OrderType.get(order.getOrderType());
             int hasSaved = 0;
             if (orderType == OrderType.REGISTRATION) {
-                hasSaved = savePayResultService.queryAppointmentSaveStatus(order.getTradeNo(),
-                        order.getSerialNo(), order.getTotalFee().toPlainString(), order.getPayDatetime());
+                hasSaved = dao.alreadyPaidRegisterFee(order.getTradeNo());
             } else if (orderType == OrderType.OUTPATIENT) {
-                hasSaved = savePayResultService.queryMzPaySaveStatus(order.getHisOrdNum(), order.getTradeNo(),
-                        order.getSerialNo(), order.getTotalFee().toPlainString(), order.getPayDatetime());
+                hasSaved = dao.alreadyPayed(order.getTradeNo());
             }
             if (hasSaved == 1) {
                 dao.updateSuccessHisStatus(tradeNo);