Browse Source

避免重复创建订单。

lighter 4 years ago
parent
commit
6b865a8508

+ 7 - 8
src/main/java/thyyxxk/wxservice_server/dao/WxApiDao.java

@@ -13,22 +13,21 @@ public interface WxApiDao {
     @Select("select rtrim(name) from mz_patient_mi where patient_id=#{patientId}")
     String selectPatientName(@Param("patientId") String patientId);
 
-    @Select("select count(1) from t_wechat_pay_order where patient_id=#{patientId} " +
-            "and mzy_request_id=#{mzyRequestId} and pay_status=1")
-    int selectSameGhCount(@Param("patientId") String patientId,
-                          @Param("mzyRequestId") Integer mzyRequestId);
+    @Select("select * from t_wechat_pay_order where patient_id=#{patientId} and mzy_request_id=#{mzyRequestId}")
+    WxPayOrder selectSameGhOrder(@Param("patientId") String patientId,
+                                 @Param("mzyRequestId") Integer mzyRequestId);
 
-    @Select("select count(1) from t_wechat_pay_order where his_ord_num=#{hisOrdNum} and pay_status=1")
-    int selectSameMzFeeCount(@Param("hisOrdNum") String hisOrdNum);
+    @Select("select * from t_wechat_pay_order where his_ord_num=#{hisOrdNum}")
+    WxPayOrder selectSameMzPayOrder(@Param("hisOrdNum") String hisOrdNum);
 
     @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," +
-            "create_datetime,pay_status,serial_no,order_type,his_ord_num,mzy_request_id) " +
+            "create_datetime,pay_status,serial_no,order_type,his_ord_num,mzy_request_id,yj_req_no) " +
             "values (#{body},#{openId},#{totalFee},#{patientId},#{patientName},#{inpatientNo}," +
             "#{admissTimes},#{appId},#{mchId},#{prepayId},#{timeStamp},#{tradeNo}," +
             "#{createOrderSign},#{paySign},#{spbillCreateIp},#{createDatetime}," +
-            "#{payStatus},#{serialNo},#{orderType},#{hisOrdNum},#{mzyRequestId})")
+            "#{payStatus},#{serialNo},#{orderType},#{hisOrdNum},#{mzyRequestId},#{yjReqNo})")
     void insertNewOrder(WxPayOrder param);
 
     @Update("update t_wechat_pay_order set pay_status=#{status}, " +

+ 15 - 7
src/main/java/thyyxxk/wxservice_server/service/WxApiService.java

@@ -76,17 +76,24 @@ public class WxApiService {
 
     @Async("asyncTask")
     public CompletableFuture<ResultVo<WxPayOrder>> createPayOrder(WeChatPayParam param) {
+        WxPayOrder existOrder = null;
         if (param.getOrderType() == 1) {
-            int count = dao.selectSameGhCount(param.getPatientId(), param.getMzyRequestId());
-            if (count > 0) {
-                return CompletableFuture.completedFuture(ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "您已成功支付过一笔相同金额的订单,请勿重复支付。"));
-            }
+            existOrder = dao.selectSameGhOrder(param.getPatientId(), param.getMzyRequestId());
+        } else if (param.getOrderType() == 2) {
+            existOrder = dao.selectSameMzPayOrder(param.getHisOrdNum());
         }
-        if (param.getOrderType() == 2) {
-            int count = dao.selectSameMzFeeCount(param.getHisOrdNum());
-            if (count > 0) {
+        if (null != existOrder) {
+            if (existOrder.getPayStatus() == 1) {
                 return CompletableFuture.completedFuture(ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "您已成功支付过一笔相同金额的订单,请勿重复支付。"));
             }
+            if (existOrder.getPayStatus() == 99 || existOrder.getPayStatus() == 0) {
+                if (DateUtil.orderValid(existOrder.getCreateDatetime())) {
+                    return CompletableFuture.completedFuture(ResultVoUtil.success(existOrder));
+                }
+            }
+            if (null == param.getYjReqNo()) {
+                param.setYjReqNo(existOrder.getYjReqNo());
+            }
         }
         String appId = PropertiesUtil.getProperty("appId");
         String merchantId = PropertiesUtil.getProperty("mchId");
@@ -162,6 +169,7 @@ public class WxApiService {
                 order.setPayStatus(99);
                 order.setHisOrdNum(param.getHisOrdNum());
                 order.setMzyRequestId(param.getMzyRequestId());
+                order.setYjReqNo(param.getYjReqNo());
                 order.setInpatientNo(param.getInpatientNo());
                 order.setAdmissTimes(param.getAdmissTimes());
                 dao.insertNewOrder(order);