Bläddra i källkod

添加诊间挂号支付

lighter 2 år sedan
förälder
incheckning
97bf22803d

+ 1 - 6
pom.xml

@@ -10,7 +10,7 @@
     </parent>
     <groupId>thyyxxk</groupId>
     <artifactId>wxservice-server</artifactId>
-    <version>10.4</version>
+    <version>10.5</version>
     <name>wxservice-server</name>
     <description>server for wxservice-web</description>
 
@@ -32,11 +32,6 @@
             <artifactId>mybatis-plus-boot-starter</artifactId>
             <version>3.4.2</version>
         </dependency>
-<!--        <dependency>-->
-<!--            <groupId>com.baomidou</groupId>-->
-<!--            <artifactId>mybatis-plus-generator</artifactId>-->
-<!--            <version>3.4.1</version>-->
-<!--        </dependency>-->
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-validation</artifactId>

+ 1 - 0
src/main/java/thyyxxk/wxservice_server/constant/OrderType.java

@@ -1,6 +1,7 @@
 package thyyxxk.wxservice_server.constant;
 
 public enum OrderType {
+    CLINIC_REGISTER(0, "诊间挂号"),
 
     REGISTRATION(1, "挂号费"),
 

+ 11 - 0
src/main/java/thyyxxk/wxservice_server/controller/AppointmentController.java

@@ -3,6 +3,7 @@ package thyyxxk.wxservice_server.controller;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
+import thyyxxk.wxservice_server.entity.BriefPatInfo;
 import thyyxxk.wxservice_server.entity.ResultVo;
 import thyyxxk.wxservice_server.entity.appointment.*;
 import thyyxxk.wxservice_server.service.AppointmentService;
@@ -79,4 +80,14 @@ public class AppointmentController {
     public ResultVo<List<Map<String, String>>> getPaidMzGhList(@RequestParam("patientId") String patientId) {
         return service.getPaidMzGhList(patientId);
     }
+
+    @PostMapping("/listMzyReqrecUnPay")
+    public ResultVo<List<MzyReqrec>> listMzyReqrecUnPay(@RequestBody BriefPatInfo patInfo) {
+        return service.listMzyReqrecUnPay(patInfo);
+    }
+
+    @PostMapping("/getMzyReqrecInfo")
+    public ResultVo<MzyReqrec> getMzyReqrecInfo(@RequestBody BriefPatInfo patInfo) {
+        return service.getMzyReqrecInfo(patInfo);
+    }
 }

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

@@ -10,6 +10,9 @@ public interface RedisLikeDao {
     @Select("select rtrim(code_rs) from a_employee_mi with(nolock) where code=#{code}")
     String selectEmployeeCodeRs(@Param("code") String code);
 
+    @Select("select rtrim(name) from a_employee_mi with(nolock) where code=#{code}")
+    String selectEmployeeName(@Param("code") String code);
+
     @Select("select rtrim(name) from zd_unit_code where code=#{code} ")
     String selectDepartmentName(@Param("code") String code);
 
@@ -18,4 +21,7 @@ public interface RedisLikeDao {
 
     @Select("select parent_code from t_region with(nolock) where code=#{code}")
     String selectRegionParentCode(@Param("code") String code);
+
+    @Select("select rtrim(name) from mz_zd_work_time WITH(NOLOCK) where code=#{code} and del_flag=0")
+    String selectAmpmName(@Param("code") String code);
 }

+ 1 - 2
src/main/java/thyyxxk/wxservice_server/dao/WxApiDao.java

@@ -16,8 +16,7 @@ public interface WxApiDao {
     @Select("select rtrim(name) from mz_patient_mi with(nolock) where patient_id=#{patientId}")
     String selectPatientName(@Param("patientId") String patientId);
 
-    @Select("select * from t_wechat_pay_order with(nolock) where patient_id=#{patientId} and " +
-            "mzy_request_id=#{mzyRequestId} ")
+    @Select("select * from t_wechat_pay_order with(nolock) where patient_id=#{patientId} and mzy_request_id=#{mzyRequestId} ")
     WxPayOrder selectSameGhOrder(@Param("patientId") String patientId,
                                  @Param("mzyRequestId") Integer mzyRequestId);
 

+ 9 - 0
src/main/java/thyyxxk/wxservice_server/entity/BriefPatInfo.java

@@ -0,0 +1,9 @@
+package thyyxxk.wxservice_server.entity;
+
+import lombok.Data;
+
+@Data
+public class BriefPatInfo {
+    private String patientId;
+    private Integer times;
+}

+ 20 - 1
src/main/java/thyyxxk/wxservice_server/entity/appointment/MzyReqrec.java

@@ -2,13 +2,32 @@ package thyyxxk.wxservice_server.entity.appointment;
 
 import lombok.Data;
 
+import java.math.BigDecimal;
+
 /**
  * @author dj
  */
 @Data
 public class MzyReqrec {
     private String patientId;
-    private String paymode="WX";
+    private Integer times;
+    private String name;
+    private String reqType;
+    private String requestDay;
+    private String ampm;
+    private String unitCode;
+    private String doctorCode;
+    private String chargeType;
+    private Integer reqOrder;
+    private BigDecimal reqFee;
+    private BigDecimal clinicFee;
+    private BigDecimal othFee;
+    private BigDecimal totalAmount;
+    private String requestDayStr;
+    private Integer serialNo;
+    private String opDay;
+    private BigDecimal amount;
+    private String paymode;
     /**
      * 订单号
      * */

+ 1 - 1
src/main/java/thyyxxk/wxservice_server/entity/appointment/WeChatPayParam.java

@@ -15,7 +15,7 @@ public class WeChatPayParam {
     @NotBlank(message = "商品描述不能为空")
     private String body;
     /**
-     * 订单类型,1:挂号费 2:门诊缴费 3:住院预交金
+     * 订单类型,1:挂号费 2:门诊缴费 3:住院预交金 0:诊间挂号
      * */
     @NotNull(message = "订单类型不能为空")
     private Integer orderType;

+ 58 - 0
src/main/java/thyyxxk/wxservice_server/service/AppointmentService.java

@@ -1,5 +1,6 @@
 package thyyxxk.wxservice_server.service;
 
+import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -10,6 +11,7 @@ import thyyxxk.wxservice_server.config.exception.ExceptionEnum;
 import thyyxxk.wxservice_server.constant.Constants;
 import thyyxxk.wxservice_server.constant.Gender;
 import thyyxxk.wxservice_server.dao.AppointmentDao;
+import thyyxxk.wxservice_server.entity.BriefPatInfo;
 import thyyxxk.wxservice_server.entity.ResultVo;
 import thyyxxk.wxservice_server.entity.appointment.*;
 import thyyxxk.wxservice_server.entity.hrgresponse.SourcesResponse;
@@ -247,4 +249,60 @@ public class AppointmentService {
         return ThmzUtil.getResultVoCompletableFuture(hrgResponse);
     }
 
+    public ResultVo<List<MzyReqrec>> listMzyReqrecUnPay(BriefPatInfo patInfo) {
+        String url = hrgApiUrl + "/listMzyReqrecUnPay?patientId=" + patInfo.getPatientId();
+        JSONObject response = new RestTemplate().getForObject(url, JSONObject.class);
+        if (null == response) {
+            return ResultVoUtil.fail(ExceptionEnum.NETWORK_ERROR);
+        }
+        Integer resultCode = response.getInteger("resultCode");
+        if (null == resultCode) {
+            return ResultVoUtil.fail(ExceptionEnum.NETWORK_ERROR);
+        }
+        if (resultCode != 0) {
+            return ResultVoUtil.fail(ExceptionEnum.INTERNAL_SERVER_ERROR, response.getString("message"));
+        }
+        JSONArray data = response.getJSONArray("data");
+        if (null == data || data.size() == 0) {
+            return ResultVoUtil.fail(ExceptionEnum.NO_DATA_EXIST);
+        }
+        List<MzyReqrec> list = new ArrayList<>();
+        for (int i = 0; i < data.size(); i++) {
+            JSONObject mzy = data.getJSONObject(i).getJSONObject("mzyReqrec");
+            if (null != mzy) {
+                list.add(JSONObject.parseObject(JSONObject.toJSONString(mzy), MzyReqrec.class));
+            }
+        }
+        if (list.isEmpty()) {
+            return ResultVoUtil.fail(ExceptionEnum.NO_DATA_EXIST);
+        }
+        return ResultVoUtil.success(list);
+    }
+
+    public ResultVo<MzyReqrec> getMzyReqrecInfo(BriefPatInfo patInfo) {
+        String url = hrgApiUrl + "/getMzyReqrecInfo?patientId=" + patInfo.getPatientId() + "&times=" + patInfo.getTimes();
+        JSONObject response = new RestTemplate().getForObject(url, JSONObject.class);
+        if (null == response) {
+            return ResultVoUtil.fail(ExceptionEnum.NETWORK_ERROR);
+        }
+        Integer resultCode = response.getInteger("resultCode");
+        if (null == resultCode) {
+            return ResultVoUtil.fail(ExceptionEnum.NETWORK_ERROR);
+        }
+        if (resultCode != 0) {
+            return ResultVoUtil.fail(ExceptionEnum.INTERNAL_SERVER_ERROR, response.getString("message"));
+        }
+        JSONObject data = response.getJSONObject("data");
+        if (null == data) {
+            return ResultVoUtil.fail(ExceptionEnum.NO_DATA_EXIST);
+        }
+        MzyReqrec mzyReqrec = JSONObject.parseObject(JSONObject.toJSONString(data), MzyReqrec.class);
+        if (StringUtil.notBlank(mzyReqrec.getPaymode())) {
+            return ResultVoUtil.fail(ExceptionEnum.NO_DATA_EXIST);
+        }
+        mzyReqrec.setDoctorCode(redis.getEmployeeName(mzyReqrec.getDoctorCode()));
+        mzyReqrec.setUnitCode(redis.getDepartmentName(mzyReqrec.getUnitCode()));
+        mzyReqrec.setAmpm(redis.getAmpmName(mzyReqrec.getAmpm()));
+        return ResultVoUtil.success(mzyReqrec);
+    }
 }

+ 25 - 0
src/main/java/thyyxxk/wxservice_server/service/RedisLikeService.java

@@ -10,9 +10,11 @@ import java.util.Map;
 @Service
 public class RedisLikeService {
     private final static Map<String, String> employeeCodeRsMap = new HashMap<>();
+    private final static Map<String, String> employeeNameMap = new HashMap<>();
     private final static Map<String, String> departmentMap = new HashMap<>();
     private final static Map<String, String> regionMap = new HashMap<>();
     private final static Map<String, String> regionParentMap = new HashMap<>();
+    private final static Map<String, String> ampmMap = new HashMap<>();
     private final RedisLikeDao dao;
 
     public RedisLikeService(RedisLikeDao dao) {
@@ -31,6 +33,18 @@ public class RedisLikeService {
         return codeRs;
     }
 
+    public String getEmployeeName(String code) {
+        if (StringUtil.isBlank(code)) {
+            return null;
+        }
+        String employeeName = employeeNameMap.get(code);
+        if (null == employeeName) {
+            employeeName = dao.selectEmployeeName(code);
+            employeeNameMap.put(code, employeeName);
+        }
+        return employeeName;
+    }
+
     public String getDepartmentName(String code) {
         if (StringUtil.isBlank(code)) {
             return null;
@@ -67,4 +81,15 @@ public class RedisLikeService {
         return regionParentCode;
     }
 
+    public String getAmpmName(String code) {
+        if (StringUtil.isBlank(code)) {
+            return null;
+        }
+        String ampmName = ampmMap.get(code);
+        if (null == ampmName) {
+            ampmName = dao.selectAmpmName(code);
+            ampmMap.put(code, ampmName);
+        }
+        return ampmName;
+    }
 }

+ 39 - 0
src/main/java/thyyxxk/wxservice_server/service/SavePayResultService.java

@@ -53,6 +53,45 @@ public class SavePayResultService {
         this.healthCardService = healthCardService;
     }
 
+    public ResultVo<Object> saveClinicRegister(WxPayOrder order) {
+        if (dao.alreadyPaidRegisterFee(order.getTradeNo()) == 1) {
+            dao.updateSuccessHisStatus(order.getTradeNo());
+            log.info("订单号:{} 的挂号信息已保存,无需再次保存。", order.getTradeNo());
+            return ResultVoUtil.success("保存挂号信息成功。");
+        }
+        String url = hrgApiUrl + "/payRegistration";
+        JSONObject param = new JSONObject();
+        param.put("patientId", order.getPatientId());
+        param.put("times", order.getMzyRequestId());
+        param.put("paymode", "WX");
+        param.put("psordnum", order.getTradeNo());
+        param.put("agtordnum", order.getSerialNo());
+        param.put("amount", order.getTotalFee());
+        SaveGhFeeResponse response = new RestTemplate().postForObject(url, param, SaveGhFeeResponse.class);
+        log.info("保存诊间挂号信息: \n参数:{},\n结果:{}", param, response);
+        if (null != response && (response.getResultCode() == 0 || response.getMessage().contains("成功"))) {
+            dao.updateSuccessHisStatus(order.getTradeNo());
+            HisRegister hisRegister = dao.selectRegisterDateDiff(order.getTradeNo());
+            if (null != hisRegister) {
+                String scene = hisRegister.getDateDiff() > 0 ? "0101011" : "0101012";
+                healthCardService.reportHisData(order.getPatientId(), scene, hisRegister.getUnitCode(), CardCostTypes.SELF_PAY);
+            }
+            return ResultVoUtil.success("保存诊间挂号信息成功。");
+        }
+        if (dao.alreadyPaidRegisterFee(order.getTradeNo()) == 1) {
+            dao.updateSuccessHisStatus(order.getTradeNo());
+            return ResultVoUtil.success("保存挂号信息成功。");
+        }
+        ResultVo<String> refund = refundService.autoRefund(order.getTradeNo(), "保存诊间挂号信息失败,自动退款。");
+        log.info("【订单号:{}】保存诊间挂号信息失败,自动退款结果:{}", order.getTradeNo(), refund);
+        if (null != refund && refund.getCode() == ExceptionEnum.SUCCESS.getCode()) {
+            dao.refundOrder(order.getTradeNo(), "保存诊间挂号信息失败,自动退款。");
+            return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "保存诊间挂号信息失败,已为您自动退款,请留意到账信息。");
+        }
+        dao.updatePayStatusOnly(order.getTradeNo(), 7);
+        return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "保存诊间挂号信息失败,自动退款失败,请联系服务中心进行退款。");
+    }
+
     public ResultVo<Object> saveAppointment(WxPayOrder order) {
         if (dao.alreadyPaidRegisterFee(order.getTradeNo()) == 1) {
             dao.updateSuccessHisStatus(order.getTradeNo());

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

@@ -65,7 +65,8 @@ public class WxApiService {
 
     public ResultVo<WxPayOrder> createPayOrder(WeChatPayParam param) throws Exception {
         WxPayOrder existOrder = null;
-        if (param.getOrderType() == OrderType.REGISTRATION.getCode()) {
+        if (param.getOrderType() == OrderType.CLINIC_REGISTER.getCode() ||
+                param.getOrderType() == OrderType.REGISTRATION.getCode()) {
             existOrder = dao.selectSameGhOrder(param.getPatientId(), param.getMzyRequestId());
         } else if (param.getOrderType() == OrderType.OUTPATIENT.getCode()) {
             existOrder = dao.selectSameMzPayOrder(param.getHisOrdNum(), param.getTotalFee().doubleValue());
@@ -198,7 +199,7 @@ public class WxApiService {
             WxPayOrder order = dao.selectOrderByTradeNo(tradeNo);
             OrderType orderType = OrderType.get(order.getOrderType());
             int hasSaved = 0;
-            if (orderType == OrderType.REGISTRATION) {
+            if (orderType == OrderType.REGISTRATION || orderType == OrderType.CLINIC_REGISTER) {
                 hasSaved = dao.alreadyPaidRegisterFee(order.getTradeNo());
             } else if (orderType == OrderType.OUTPATIENT) {
                 hasSaved = dao.alreadyPayed(order.getTradeNo());
@@ -219,6 +220,8 @@ public class WxApiService {
                         .split("\\+")[0].replace("T", " ");
                 dao.updatePayStatusAndPayTime(tradeNo, tradeState.getCode(), successTime);
                 switch (orderType) {
+                    case CLINIC_REGISTER:
+                        return savePayResultService.saveClinicRegister(order);
                     case REGISTRATION:
                         return savePayResultService.saveAppointment(order);
                     case OUTPATIENT: