1、预问诊接口验证并调整,患者端已完成对接。

2、医生端token验证调整。
3、今日挂号和预约挂号退费接口合并,在发起申请时新增一个标记,方便处理发起取消,但是未完全执行的情况。
4、对接推送接口,用于通知患者预问诊报告可查看。
5、新增医保支付接口和微信v3支付接口。
debug
王绍全 4 days ago
parent aed2cedf8c
commit 7cea8e6dc4
  1. 7
      src/main/java/com/ynxbd/common/TestA.java
  2. 115
      src/main/java/com/ynxbd/common/action/healthcard/HCPreConsultAction.java
  3. 34
      src/main/java/com/ynxbd/common/action/pay/PayAction.java
  4. 6
      src/main/java/com/ynxbd/common/action/test/TestAction.java
  5. 1
      src/main/java/com/ynxbd/common/bean/HisTransaction.java
  6. 6
      src/main/java/com/ynxbd/common/bean/pay/Register.java
  7. 29
      src/main/java/com/ynxbd/common/dao/PreConsultDao.java
  8. 9
      src/main/java/com/ynxbd/common/dao/RegisterDao.java
  9. 20
      src/main/java/com/ynxbd/common/dao/his/HisRegisterDao.java
  10. 2
      src/main/java/com/ynxbd/common/dao/his/HisTreatDao.java
  11. 223
      src/main/java/com/ynxbd/common/healthcard/HCPreConsultHelper.java
  12. 4
      src/main/java/com/ynxbd/common/healthcard/config/HCPreConsultConfig.java
  13. 2
      src/main/java/com/ynxbd/common/service/MedicalService.java
  14. 317
      src/main/java/com/ynxbd/common/service/RegService.java
  15. 77
      src/main/java/com/ynxbd/wx/config/MessagePushConfig.java
  16. 13
      src/main/java/com/ynxbd/wx/utils/DesEncryptHelper.java
  17. 15
      src/main/java/com/ynxbd/wx/wxfactory/WxFactory.java
  18. 134
      src/main/java/com/ynxbd/wx/wxfactory/payment/jsapi/Client.java
  19. 4
      src/main/java/com/ynxbd/wx/wxfactory/payment/query/Client.java
  20. 2
      src/main/resources/hc-config.xml
  21. 2
      src/main/resources/webservice.xml
  22. 10
      src/main/resources/wx-msg-push.xml

@ -1,7 +1,12 @@
package com.ynxbd.common;
import com.ynxbd.common.bean.enums.MerchantEnum;
import com.ynxbd.common.dao.his.HisAccountDao;
import com.ynxbd.common.dao.his.HisRegisterDao;
import com.ynxbd.common.helper.common.LocalDateHelper;
import com.ynxbd.common.result.JsonResult;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.digest.DigestUtils;
import java.time.LocalDateTime;
@ -128,6 +133,6 @@ public class TestA {
// }
public static void main(String[] args) {
System.out.println(LocalDateTime.now() + "+08:00");
}
}

@ -17,10 +17,14 @@ import com.ynxbd.common.service.DoctorService;
import com.ynxbd.wx.config.MessagePushConfig;
import com.ynxbd.wx.pwe.bean.PreConsultRegInfo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import java.util.ArrayList;
import java.util.List;
/**
* 预问诊
* 接口名大写开头的接口是提供给第三方调用的
@ -34,7 +38,7 @@ public class HCPreConsultAction extends BaseAction {
* [预问诊]6.2 挂号查询 GetRegisteredInfo必选
*/
@Action("GetRegisteredInfo")
public Result GetRegisteredInfo(String hospitalId, String registeredId) {
public Result GetRegisteredInfo() {
try {
if (!HCPreConsultConfig.IS_DEBUG && !HCPreConsultConfig.isVerifySign(request)) {
return Result.error(ResultEnum.SIGN_ERROR); // 签名异常
@ -43,8 +47,12 @@ public class HCPreConsultAction extends BaseAction {
if (body == null) {
return Result.error(ResultEnum.BODY_IS_NULL);
}
String hospitalId = body.getString("hospitalId");
String registeredId = body.getString("registeredId");
log.info("[预问诊]挂号查询 hospitalId={}, registeredId={}", hospitalId, registeredId);
if (ObjectUtils.isEmpty(hospitalId) || ObjectUtils.isEmpty(registeredId)) {
return Result.error(ResultEnum.PARAM_IS_DEFECT);
}
Register order = new PreConsultDao().selectRegOrderInfo(registeredId);
if (order == null) {
@ -130,20 +138,57 @@ public class HCPreConsultAction extends BaseAction {
String hospitalId = body.getString("hospitalId");
String registeredId = body.getString("registeredId");
String progress = body.getString("progress");
Register order = new PreConsultDao().selectRegOrderInfo(registeredId);
log.info("[预问诊]6.3 预问诊完成通知 partnerId={}, hospitalId={}, registeredId={}, progress={}", partnerId, hospitalId, registeredId, progress);
if (ObjectUtils.isEmpty(partnerId) || ObjectUtils.isEmpty(hospitalId) || ObjectUtils.isEmpty(registeredId)) {
return Result.error(ResultEnum.PARAM_IS_DEFECT);
}
PreConsultDao preConsultDao = new PreConsultDao();
Register order = preConsultDao.selectRegOrderInfo(registeredId);
if ("1".equals(progress)) {
log.info("[预问诊]报告生成进度100%");
MessagePushConfig.preConsultReportNotify(order.getOpenid(), order.getPatientId(), order.getOutTradeNo());
if (!preConsultDao.updatePreConsultState(registeredId)) {
log.error("[预问诊]报告标记修改失败");
}
return Result.success(ResultEnum.HC_SUCCESS);
MessagePushConfig.preConsultReportNotify(order);
}
return Result.success(ResultEnum.HC_SUCCESS, null);
} catch (Exception e) {
return Result.error(e);
}
}
/**
* [预问诊]查询可查看报告的挂号订单
*/
@Action("getPreConsultReport")
public Result getPreConsultReport(@AesDecode String openId, @AesDecode String patientId, String begDate, String endDate) {
log.info("[预问诊]查询可查看报告的挂号订单 openId={}, patientId={}, begDate={}, endDate={}", openId, patientId, begDate, endDate);
if (ObjectUtils.isEmpty(openId) || ObjectUtils.isEmpty(patientId) || ObjectUtils.isEmpty(begDate) || ObjectUtils.isEmpty(endDate)) {
return Result.error(ResultEnum.PARAM_IS_DEFECT);
}
List<Register> dataList = new ArrayList<>();
List<Register> registerList = new PreConsultDao().selectReportList(openId, patientId, begDate, endDate);
for (Register register : registerList) {
Register item = new Register();
item.setDeptCode(register.getDeptCode());
item.setDeptName(register.getDeptName());
item.setDoctCode(register.getDeptCode());
item.setDoctName(register.getDoctName());
item.setAddress(register.getAddress());
item.setUpdateTime(register.getUpdateTime());
item.setRegDate(register.getRegDate());
item.setOutTradeNo(register.getOutTradeNo());
item.setUrl(HCPreConsultHelper.getH5Online(register.getOutTradeNo()));
dataList.add(register);
}
return Result.success(dataList);
}
/**
* [预问诊]5.1.1 线上挂号场景微信h5页面
*/
@ -174,34 +219,76 @@ public class HCPreConsultAction extends BaseAction {
/**
* [HIS][预问诊][医生端][方式]7.3.1 通过 GetDiagnosisReportByCaseId 接口获取数据
* [HIS][预问诊][医生端][方式]7.2 接入方式一打开完整页面
*/
@Action("getDiagnosisReportByCaseId")
public Result getDiagnosisReportByCaseId(String tradeNo, String doctCode, String doctName, String deptCode, String deptName) {
@Action("getH5DoctorURL")
public Result getH5DoctorURL(String token, String tradeNo, String deptCode, String deptName, String doctCode, String doctName, String redirectUrl) {
try {
log.info("[医生端][方式一] token={}, tradeNo={}, deptCode={}, deptName={}, doctCode={}, doctName={}, redirectUrl={}", token, tradeNo, deptCode, deptName, doctCode, doctName, redirectUrl);
if (ObjectUtils.isEmpty(token) || ObjectUtils.isEmpty(tradeNo) || ObjectUtils.isEmpty(deptCode) || ObjectUtils.isEmpty(doctCode)) {
return Result.error(ResultEnum.PARAM_IS_DEFECT);
}
String md5 = DigestUtils.md5Hex(tradeNo + "xbd" + deptCode + "xbd" + doctCode).toUpperCase();
if (!token.equals(md5)) {
return Result.error(ResultEnum.PARAM_IS_INVALID);
}
Register order = new PreConsultDao().selectRegOrderNo(tradeNo);
if (order == null) {
return Result.error("未找到挂号订单");
}
JSONObject data = HCPreConsultHelper.getDiagnosisReportByCaseId(order.getOutTradeNo(), doctCode, doctName, deptCode, deptName);
return Result.success(ResultEnum.HC_SUCCESS, data);
String url = HCPreConsultHelper.getH5DoctorURL(order.getOutTradeNo(), deptCode, deptName, doctCode, doctName, redirectUrl);
return Result.success(url);
} catch (Exception e) {
return Result.error(e);
}
}
/**
* [HIS][预问诊][医生端][方式二]7.3.2 通过 GetPreDiagnosisReportDialogues 接口获取对话记录
* [HIS][预问诊][医生端][方式二]7.3.1-获取预问诊报告数据
*/
@Action("getPreDiagnosisReportByCaseId")
public Result getPreDiagnosisReportByCaseId(String token, String tradeNo, String deptCode, String deptName, String doctCode, String doctName) {
try {
log.info("[医生端][方式二][7.3.1-获取预问诊报告数据] token={}, tradeNo={}, deptCode={}, deptName={}, doctCode={}, doctName={}", token, tradeNo, deptCode, deptName, doctCode, doctName);
if (ObjectUtils.isEmpty(token) || ObjectUtils.isEmpty(tradeNo) || ObjectUtils.isEmpty(deptCode) || ObjectUtils.isEmpty(doctCode)) {
return Result.error(ResultEnum.PARAM_IS_DEFECT);
}
String md5 = DigestUtils.md5Hex(tradeNo + "xbd" + deptCode + "xbd" + doctCode).toUpperCase();
if (!token.equals(md5)) {
return Result.error(ResultEnum.PARAM_IS_INVALID);
}
Register order = new PreConsultDao().selectRegOrderNo(tradeNo);
if (order == null) {
return Result.error("未找到挂号订单");
}
JSONObject data = HCPreConsultHelper.getPreDiagnosisReportByCaseId(order.getOutTradeNo(), deptCode, deptName, doctCode, doctName);
return Result.success(data);
} catch (Exception e) {
return Result.error(e);
}
}
/**
* [HIS][预问诊][医生端][方式二]7.3.2-获取预问诊对话记录
*/
@Action("getPreDiagnosisReportDialogues")
public Result getPreDiagnosisReportDialogues(String tradeNo, String doctCode, String doctName, String deptCode, String deptName) {
public Result getPreDiagnosisReportDialogues(String token, String tradeNo, String deptCode, String deptName, String doctCode, String doctName) {
try {
log.info("[医生端][方式二][7.3.2-获取预问诊对话记录] token={}, tradeNo={}, deptCode={}, deptName={}, doctCode={}, doctName={}", token, tradeNo, deptCode, deptName, doctCode, doctName);
if (ObjectUtils.isEmpty(token) || ObjectUtils.isEmpty(tradeNo) || ObjectUtils.isEmpty(deptCode) || ObjectUtils.isEmpty(doctCode)) {
return Result.error(ResultEnum.PARAM_IS_DEFECT);
}
String md5 = DigestUtils.md5Hex(tradeNo + "xbd" + deptCode + "xbd" + doctCode).toUpperCase();
if (!token.equals(md5)) {
return Result.error(ResultEnum.PARAM_IS_INVALID);
}
Register order = new PreConsultDao().selectRegOrderNo(tradeNo);
if (order == null) {
return Result.error("未找到挂号订单");
}
JSONObject data = HCPreConsultHelper.getPreDiagnosisReportDialogues(order.getOutTradeNo(), doctCode, doctName, deptCode, deptName);
return Result.success(ResultEnum.HC_SUCCESS, data);
JSONObject data = HCPreConsultHelper.getPreDiagnosisReportDialogues(order.getOutTradeNo(), deptCode, deptName, doctCode, doctName);
return Result.success(data);
} catch (Exception e) {
return Result.error(e);
}

@ -450,22 +450,39 @@ public class PayAction extends BaseAction {
/**
* 取消预约
* 取消挂号
*
* @param isRegToday 是否为今日挂号
* @param tradeNo HIS交易流水号
* @param patientId 患者id
* @param hisTransNo HIS流水号
*/
@Action("cancelRegReserve")
public Result cancelRegReserve(String tradeNo, String patientId, String hisTransNo) {
return new RegService().cancelRegReserve(patientId, tradeNo, hisTransNo);
@Action("cancelRegister")
public Result cancelRegister(Boolean isRegToday, @AesDecode String patientId, String tradeNo, String hisTransNo) {
log.info("[取消挂号] isRegToday={}, patientId={}, tradeNo={}, hisTransNo={}", isRegToday, patientId, tradeNo, hisTransNo);
if (isRegToday == null || patientId == null || tradeNo == null || hisTransNo == null) {
return Result.error(ResultEnum.PARAM_IS_DEFECT);
}
@Action("refundRegister")
public Result refundRegister(String hisTransNo) {
return new RegService().refundRegister(hisTransNo);
return new RegService().cancelRegister(isRegToday, patientId, tradeNo, hisTransNo);
}
// /**
// * 取消预约
// *
// * @param tradeNo HIS交易流水号
// * @param patientId 患者id
// * @param hisTransNo HIS流水号
// */
// @Action("cancelRegReserve")
// public Result cancelRegReserve(String tradeNo, String patientId, String hisTransNo) {
// return new RegService().cancelRegReserve(patientId, tradeNo, hisTransNo);
// }
//
// @Action("refundRegister")
// public Result refundRegister(String hisTransNo) {
// return new RegService().refundRegister(hisTransNo);
// }
/**
* 第三方手动退费
@ -1038,5 +1055,4 @@ public class PayAction extends BaseAction {
// }
}

@ -2,7 +2,6 @@ package com.ynxbd.common.action.test;
import com.ynxbd.common.action.base.BaseAction;
import com.ynxbd.common.bean.sms.SmsTempEnum;
import com.ynxbd.common.config.HealthCardConfig;
import com.ynxbd.common.helper.common.DateHelper;
import com.ynxbd.common.helper.common.SmsHelper;
import com.ynxbd.common.his.HisConfig;
@ -123,8 +122,7 @@ public class TestAction extends BaseAction {
@Action("r_test")
public Result r_test() throws ServiceException {
System.out.println(HealthCardConfig.isEnable());
return Result.success();
return Result.success(ResultEnum.HC_SUCCESS, null);
}
@Action("wx_push_test")
@ -132,7 +130,7 @@ public class TestAction extends BaseAction {
System.out.println("HOST_URL:" + MessagePushConfig.HOST_URL);
System.out.println("[挂号]缴费通知:" + MessagePushConfig.REG_PAID_API);
System.out.println("[挂号]取消预约:" + MessagePushConfig.REG_CANCEL_API);
System.out.println("[挂号]AI:" + MessagePushConfig.REG_AI_API);
System.out.println("[挂号]AI:" + MessagePushConfig.REG_PRE_CONSULT_API);
System.out.println("[处方]缴费通知:" + MessagePushConfig.RX_PAID_API);

@ -43,6 +43,7 @@ public class HisTransaction {
private String hisPositiveTransNo;
// HIS负交易流水号(负的为取消预约)
private String hisNegativeTransNo;
//
private String hisNegativeDate;
// HIS负交易金额
private String hisNegativeMoney;

@ -87,6 +87,10 @@ public class Register extends Order {
private Boolean isSplitTime;
// 就医助手标记
private String medToolMark;
// 预问诊报告标记[1:报告已生成]
private Integer preConsultState;
// 预问诊跳转链接
private String url;
public boolean hasIsTake(int val) {
return isTake != null && isTake == val;
@ -266,6 +270,4 @@ public class Register extends Order {
}
}

@ -5,6 +5,8 @@ import com.ynxbd.common.bean.pay.Register;
import com.ynxbd.common.config.db.DataBase;
import com.ynxbd.wx.config.WeChatConfig;
import java.util.List;
public class PreConsultDao {
// public boolean insert(PWEReport report) {
@ -47,6 +49,33 @@ public class PreConsultDao {
});
}
/**
* 查询可查看报告的挂号订单
*/
public List<Register> selectReportList(String openId, String patientId, String begDate, String endDate) {
String sql = "select * from register where openId=? and patientId=? and updateTime between ? and DATE_ADD(?,INTERVAL 1 DAY) and preConsultState = 1 order by updateTime desc";
return DataBase.select(sql, Register.class, ps -> {
ps.setString(1, openId);
ps.setString(2, patientId);
ps.setString(3, begDate);
ps.setString(4, endDate);
});
}
/**
* 标记为已生成报告
*
* @param outTradeNo 订单号
*/
public boolean updatePreConsultState(String outTradeNo) {
String sql = "update register set preConsultState=1 where outTradeNo=?";
return DataBase.update(sql, ps -> {
ps.setString(1, outTradeNo);
}) > 0;
}
/**
* 查询订单号
*

@ -497,12 +497,13 @@ public class RegisterDao {
* @param hisResult HIS失败原因
* @return 是否记录成功
*/
public boolean updateHisPaidFailByOutTradeNo(String outTradeNo, String hisStatus, String hisResult) {
String sql = "update register set hisStatus=?, hisResult=? where outTradeNo=?";
public boolean updateHisPaidFailByOutTradeNo(String outTradeNo, String hisStatus, String hisResult, String refundReason) {
String sql = "update register set hisStatus=?, hisResult=?, refundReason=? where outTradeNo=?";
return DataBase.update(sql, ps -> {
ps.setString(1, hisStatus);
ps.setString(2, hisResult);
ps.setString(3, outTradeNo);
ps.setString(3, refundReason);
ps.setString(4, outTradeNo);
}) > 0;
}
@ -542,6 +543,7 @@ public class RegisterDao {
}) > 0;
}
/**
* 修改退款描述
*
@ -551,7 +553,6 @@ public class RegisterDao {
* @return 是否成功
*/
public boolean updateRefundResult(String outTradeNo, String tradeNo, String refundMsg) {
// 退款成功
String sql = "update register set refundResult=?, refundTime=now() where tradeNo=? and outTradeNo=?";
return DataBase.update(sql, ps -> {
ps.setString(1, refundMsg);

@ -702,10 +702,8 @@ public class HisRegisterDao {
/**
* 今日挂号-取消挂号
*
* @return
*/
public JsonResult refundRegister(String tradeNo, MerchantEnum merchantEnum) {
public JsonResult refundTodayRegister(String tradeNo, MerchantEnum merchantEnum) {
Map<String, Object> params = new HashMap<>();
params.put("TransNo", tradeNo);
params.put("DelTransNo", "R" + tradeNo);
@ -713,6 +711,22 @@ public class HisRegisterDao {
return HisFactory.His().getJsonResultByMer(HisEnum.AP_Refund_Register, merchantEnum, params);
}
/**
* HIS取消挂号
*
* @param isToday 是否为今日挂号
* @param merchantEnum 商户类型
* @param patientId 患者id
* @param tradeNo 流水号
* @return JsonResult
*/
public JsonResult cancelHisReg(boolean isToday, MerchantEnum merchantEnum, String patientId, String tradeNo) {
if (isToday) {
return refundTodayRegister(tradeNo, merchantEnum);
}
return cancelReserve(patientId, tradeNo, merchantEnum);
}
/**
* 查询患者是否挂过号
*

@ -36,7 +36,7 @@ public class HisTreatDao {
/**
* 根据患者id查询检查报告
* 创建就诊记录
*
* @param treatNum 门诊号
*/

@ -1,6 +1,7 @@
package com.ynxbd.common.healthcard;
import com.alibaba.fastjson.JSONObject;
import com.google.gson.*;
import com.ynxbd.common.bean.Patient;
import com.ynxbd.common.bean.enums.MerchantEnum;
import com.ynxbd.common.bean.pay.Register;
@ -10,14 +11,15 @@ import com.ynxbd.common.helper.common.JsonHelper;
import com.ynxbd.common.helper.http.OkHttpHelper;
import com.ynxbd.common.result.ServiceException;
import com.ynxbd.common.service.PatientService;
import com.ynxbd.wx.config.MessagePushConfig;
import com.ynxbd.wx.config.WeChatConfig;
import lombok.extern.slf4j.Slf4j;
import okhttp3.Headers;
import org.apache.commons.lang3.ObjectUtils;
import java.util.HashMap;
import java.util.Map;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.time.Instant;
import java.util.*;
@Slf4j
public class HCPreConsultHelper {
@ -26,10 +28,25 @@ public class HCPreConsultHelper {
}
public static void setHeader(Headers.Builder headers) {
String timestamp = String.valueOf(System.currentTimeMillis());
headers.add("god-portal-signature", HCPreConsultConfig.toHmacSha256Example(HCPreConsultConfig.SECRET_KEY, HCPreConsultConfig.HOSP_ID + timestamp));
headers.add("god-portal-timestamp", timestamp);
headers.add("god-portal-request-id", CodeHelper.get32UUID());
headers.add("Content-Type", "application/json");
// String timestamp = String.valueOf(System.currentTimeMillis());
// headers.add("god-portal-signature", HCPreConsultConfig.toHmacSha256Example(HCPreConsultConfig.SECRET_KEY, HCPreConsultConfig.HOSP_ID + timestamp));
// headers.add("god-portal-timestamp", timestamp);
// headers.add("god-portal-request-id", CodeHelper.get32UUID());
// https://open.ai.tengmed.com/openAccess/docs/access#14
// headers.add("Th-Auth-Type", "Th-Auth-Hc");
// headers.add("Th-Auth-Hc-App-Token", appToken);
// headers.add("Th-Auth-Hc-HospitalId", HCPreConsultConfig.APP_HOSP_ID);
// headers.add("Th-Auth-Hc-Timestamp", String.valueOf(Instant.now().getEpochSecond()));
// headers.add("Th-Auth-Hc-Sign", signValue);
// headers.add("Th-Auth-Hc-BusinessId", businessId);
// headers.add("Th-Auth-Hc-ChannelNum", "0");
// headers.add("Th-Auth-Hc-Relate-AppId", WeChatConfig.APP_ID);
// headers.add("Th-Auth-Hc-Relate-OpenId", wxOpenId);
// // 自定义追踪ID
// headers.add("god-portal-request-id", UUID.randomUUID().toString());
}
public static String filterDoctorId(String doctorId) {
@ -76,7 +93,8 @@ public class HCPreConsultHelper {
int age = patient.computedAage();
String url = HCPreConsultConfig.IS_DEV
// 注意:首次和腾讯对接测试时,这里使用的是正式环境
String url = HCPreConsultConfig.IS_DEV_PUSH_SUBSCRIBE_MESSAGE
? "https://med-biz-pre.wecity.qq.com/api/report/PushSubscribeMessage/"
: "https://med-biz.wecity.qq.com/api/report/PushSubscribeMessage/";
@ -170,10 +188,11 @@ public class HCPreConsultHelper {
}
public static JSONObject getDiagnosisReportByCaseId(String registerId, String doctorId, String doctorName, String departmentId, String departmentName) throws ServiceException {
String url = HCPreConsultConfig.IS_DEV
? "https://dev-aimedical.wecity.qq.com/cgi-bin/v1/Diagnosis/DiagnosisAssistServer/DiagnosisAssistServant/GetPreDiagnosisReportByCaseId"
: "https://aimedical.wecity.qq.com/cgi-bin/v1/Diagnosis/DiagnosisAssistServer/DiagnosisAssistServant/GetPreDiagnosisReportByCaseId";
/**
* 7.3.1-获取预问诊报告数据
*/
public static JSONObject getPreDiagnosisReportByCaseId(String registerId, String departmentId, String departmentName, String doctorId, String doctorName) throws ServiceException {
String url = "https://wechat.wecity.qq.com/trpcapi/GuideThOpenAdpterServer/GetPreDiagnosisReportByCaseId";
Map<String, Object> data = new HashMap<>();
data.put("partnerId", HCPreConsultConfig.PARTNER_ID);
@ -187,34 +206,33 @@ public class HCPreConsultHelper {
header.put("hospitalId", HCPreConsultConfig.HOSP_ID);
header.put("subHospitalId", "");
log.info("[7.3.1 通过 GetDiagnosisReportByCaseId 接口获取数据] 入参:data={}, header={}", data, header);
JSONObject resultJson = post(url, params -> {
params.put("data", data);
params.put("header", header);
log.info("[7.3.1-获取预问诊报告数据] 入参:{}", JsonHelper.toJsonString(params));
}, HCPreConsultHelper::setHeader);
log.info("[7.3.1-获取预问诊报告数据] resp={}", resultJson);
String code = resultJson.getString("retcode");
String message = resultJson.getString("retmsg");
String reqId = resultJson.getString("request_id");
if (!"0".equals(code)) {
log.error("[7.3.1 通过 GetDiagnosisReportByCaseId 接口获取数据]失败[rid:{}] code={}, message={}", reqId, code, message);
log.error("[7.3.1-获取预问诊报告数据]失败[rid:{}] code={}, message={}", reqId, code, message);
throw new ServiceException(message);
}
JSONObject dataJson = resultJson.getJSONObject("data");
if (dataJson == null) {
throw new ServiceException("[7.3.1 通过 GetDiagnosisReportByCaseId 接口获取数据]data返回为空");
throw new ServiceException("[7.3.1-获取预问诊报告数据]data返回为空");
}
return dataJson;
}
/**
* 7.3.2 通过 GetPreDiagnosisReportDialogues 接口获取对话记录
* 7.3.2-获取预问诊对话记录
*/
public static JSONObject getPreDiagnosisReportDialogues(String registerId, String doctorId, String doctorName, String departmentId, String departmentName) throws ServiceException {
String url = HCPreConsultConfig.IS_DEV
? "https://dev-aimedical.wecity.qq.com/cgi-bin/v1/Diagnosis/DiagnosisAssistServer/DiagnosisAssistServant/GetPreDiagnosisReportDialogues"
: "https://aimedical.wecity.qq.com/cgi-bin/v1/Diagnosis/DiagnosisAssistServer/DiagnosisAssistServant/GetPreDiagnosisReportDialogues";
public static JSONObject getPreDiagnosisReportDialogues(String registerId, String departmentId, String departmentName, String doctorId, String doctorName) throws ServiceException {
String url = "https://wechat.wecity.qq.com/trpcapi/GuideThOpenAdpterServer/GetPreDiagnosisReportDialogues";
Map<String, Object> data = new HashMap<>();
data.put("partnerId", HCPreConsultConfig.PARTNER_ID);
data.put("caseId", registerId);
@ -226,24 +244,181 @@ public class HCPreConsultHelper {
Map<String, Object> header = new HashMap<>();
header.put("hospitalId", HCPreConsultConfig.HOSP_ID);
log.info("[7.3.2 通过 GetPreDiagnosisReportDialogues 接口获取对话记录] 入参:data={}, header={}", data, header);
JSONObject resultJson = post(url, params -> {
params.put("data", data);
params.put("header", header);
log.info("[7.3.2-获取预问诊对话记录] 入参:{}", JsonHelper.toJsonString(params));
}, HCPreConsultHelper::setHeader);
log.info("[7.3.2-获取预问诊对话记录] resp={}", resultJson);
String code = resultJson.getString("retcode");
String message = resultJson.getString("retmsg");
String reqId = resultJson.getString("request_id");
if (!"0".equals(code)) {
log.error("[7.3.2 通过 GetPreDiagnosisReportDialogues 接口获取对话记录]失败[rid:{}] code={}, message={}", reqId, code, message);
log.error("[7.3.2-获取预问诊对话记录]失败[rid:{}] code={}, message={}", reqId, code, message);
throw new ServiceException(message);
}
JSONObject dataJson = resultJson.getJSONObject("data");
if (dataJson == null) {
throw new ServiceException("[7.3.2 通过 GetPreDiagnosisReportDialogues 接口获取对话记录]data返回为空");
throw new ServiceException("[7.3.2-获取预问诊对话记录]data返回为空");
}
return dataJson;
}
/**
* 7.2 接入方式一打开完整页面
*/
public static String getH5DoctorURL(String registerId, String departmentId, String departmentName, String doctorId, String doctorName, String redirectUrl) throws ServiceException {
String token = getH5DoctorLoginToken(doctorId, doctorName);
if (ObjectUtils.isEmpty(token)) {
throw new ServiceException("token获取失败");
}
String url = HCPreConsultConfig.IS_DEV
? "https://dev-aimedical.wecity.qq.com/toolbox/prediagnosis.html?token=${token}&registeredid=${registeredid}&departmentId=${departmentId}&doctorId=${doctorId}&subHospitalId=&redirectUrl="
: "https://aimedical.wecity.qq.com/toolbox/prediagnosis.html?token=${token}&registeredid=${registeredid}&departmentId=${departmentId}&doctorId=${doctorId}&subHospitalId=&redirectUrl=";
url = url.replace("${token}", token)
.replace("${registeredid}", registerId)
.replace("${departmentId}", departmentId)
.replace("${doctorId}", doctorId);
return url + redirectUrl;
}
/**
* 7.2.1 通过 HisToolLoginIn接口获取 token
*/
public static String getH5DoctorLoginToken(String doctorId, String doctorName) throws ServiceException {
String url = HCPreConsultConfig.IS_DEV
? "https://dev-aimedical.wecity.qq.com/cgi-bin/v1/Diagnosis/RationalDrugServer/RationalDrugServant/HisToolLogin"
: "https://aimedical.wecity.qq.com/cgi-bin/v1/Diagnosis/RationalDrugServer/RationalDrugServant/HisToolLogin";
Map<String, Object> data = new HashMap<>();
data.put("partner_id", HCPreConsultConfig.PARTNER_ID);
data.put("doctor_id", doctorId);
data.put("doctor_name", doctorName);
Map<String, Object> header = new HashMap<>();
header.put("hospital_id", HCPreConsultConfig.HOSP_ID);
header.put("sub_hospital_id", "");
log.info("[7.2.1 通过 HisToolLoginIn接口获取 token] 入参:data={}, header={}", data, header);
JSONObject resultJson = post(url, params -> {
params.put("data", data);
params.put("header", header);
}, HCPreConsultHelper::setHeader);
String code = resultJson.getString("retcode");
String message = resultJson.getString("retmsg");
String reqId = resultJson.getString("request_id");
if (!"0".equals(code)) {
log.error("[7.2.1 通过 HisToolLoginIn接口获取 token]失败[rid:{}] code={}, message={}", reqId, code, message);
throw new ServiceException(message);
}
JSONObject dataJson = resultJson.getJSONObject("data");
if (dataJson == null) {
throw new ServiceException("[7.2.1 通过 HisToolLoginIn接口获取 token]data返回为空");
}
return dataJson.getString("token");
}
/**
* GetAppToken
*/
public static String GetAppToken(String wxOpenId) throws ServiceException {
JSONObject resultJson = post("https://wechat.wecity.qq.com/trpcapi/THOpenAuth/GetAppToken", params -> {
params.put("appId", HCPreConsultConfig.APP_ID);
}, headers -> {
Map<String, Object> params = new HashMap<>();
String timestamp = String.valueOf(Instant.now().getEpochSecond());
headers.add("Content-Type", "application/json");
headers.add("Th-Auth-Type", "Th-Auth-Hc");
headers.add("Th-Auth-Hc-HospitalId", HCPreConsultConfig.APP_HOSP_ID);
headers.add("Th-Auth-Hc-Timestamp", timestamp);
headers.add("Th-Auth-Hc-ChannelNum", "0");
headers.add("Th-Auth-Hc-Relate-AppId", WeChatConfig.APP_ID);
headers.add("Th-Auth-Hc-Relate-OpenId", wxOpenId);
// appId + channelNum + hospitalId + timestamp + relateAppId
// String sign = HCPreConsultConfig.APP_ID + "0" + HCPreConsultConfig.APP_HOSP_ID + timestamp + WeChatConfig.APP_ID;
// calculateSign(headers, HCPreConsultConfig.APP_SECRET);
});
String code = resultJson.getString("retcode");
String message = resultJson.getString("retmsg");
String reqId = resultJson.getString("request_id");
if (!"0".equals(code)) {
log.error("[7.2.1 通过 HisToolLoginIn接口获取 token]失败[rid:{}] code={}, message={}", reqId, code, message);
throw new ServiceException(message);
}
JSONObject dataJson = resultJson.getJSONObject("data");
if (dataJson == null) {
throw new ServiceException("[7.2.1 通过 HisToolLoginIn接口获取 token]data返回为空");
}
return dataJson.getString("token");
}
private static final Gson GSON = new GsonBuilder().disableHtmlEscaping().create();
/**
* 递归对 JSON 对象的 key 排序
*/
private static JsonElement sortKeys(JsonElement element) {
if (element.isJsonObject()) {
JsonObject sorted = new JsonObject();
TreeMap<String, JsonElement> map = new TreeMap<>();
for (Map.Entry<String, JsonElement> entry : element.getAsJsonObject().entrySet()) {
map.put(entry.getKey(), sortKeys(entry.getValue()));
}
for (Map.Entry<String, JsonElement> entry : map.entrySet()) {
sorted.add(entry.getKey(), entry.getValue());
}
return sorted;
} else if (element.isJsonArray()) {
JsonArray sorted = new JsonArray();
for (JsonElement item : element.getAsJsonArray()) {
sorted.add(sortKeys(item));
}
return sorted;
}
return element;
}
/**
* 格式化参数值为签名用字符串
*/
private static String formatValue(Object value) {
if (value == null) return null;
if (value instanceof String) {
String s = (String) value;
return (s.isEmpty() || s.equals("null")) ? null : s;
}
if (value instanceof Boolean) return value.toString();
if (value instanceof Number) return value.toString();
// Map / List / JsonElement → JSON 紧凑序列化,key 排序
JsonElement json = GSON.toJsonTree(value);
JsonElement sorted = sortKeys(json);
return GSON.toJson(sorted);
}
/**
* 计算签名 key 排序拼接 + appSecret SHA256 Base64
*/
public static String calculateSign(Map<String, Object> params, String appSecret) throws Exception {
List<String> keys = new ArrayList<>(params.keySet());
Collections.sort(keys);
StringBuilder sb = new StringBuilder();
for (String key : keys) {
String fv = formatValue(params.get(key));
if (fv == null) continue;
if (sb.length() > 0) sb.append("&");
sb.append(key).append("=").append(fv);
}
sb.append(appSecret);
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest(sb.toString().getBytes(StandardCharsets.UTF_8));
return Base64.getEncoder().encodeToString(hash);
}
}

@ -31,6 +31,7 @@ public class HCPreConsultConfig {
public static final String DEV_OPEN_IDS; // 用于测试的openid
public static final boolean IS_DEV;
public static final boolean IS_DEV_PUSH_SUBSCRIBE_MESSAGE;
public static final boolean IS_DEBUG;
public static final boolean IS_ENABLE;
@ -41,6 +42,7 @@ public class HCPreConsultConfig {
IS_DEV = config.getBoolean("is_dev", false);
IS_DEBUG = config.getBoolean("is_debug", false);
IS_DEV_PUSH_SUBSCRIBE_MESSAGE = config.getBoolean("is_dev_push_subscribe_message", false);
APP_ID = config.getString("app_id");
APP_SECRET = config.getString("app_secret");
@ -91,7 +93,7 @@ public class HCPreConsultConfig {
}
log.info("[预问诊]验签 timestamp={}, signature={}", timestamp, signature);
String str = PARTNER_ID + timestamp;
String str = APP_ID + timestamp;
String cacheSign = HMACHelper.sha256(str, APP_SECRET);
return signature.equals(cacheSign);
}

@ -659,7 +659,7 @@ public class MedicalService {
String respMessage = jsonResult.getMessage();
log.info("[医保][挂号]HIS结算失败 outTradeNo={}, bankTransNo={}, respCode={}, respMessage={}", outTradeNo, bankTransNo, respCode, respMessage);
if (!regDao.updateHisPaidFailByOutTradeNo(outTradeNo, respCode, respMessage)) {
if (!regDao.updateHisPaidFailByOutTradeNo(outTradeNo, respCode, respMessage, null)) {
log.info("[医保][挂号]更新HIS缴费失败信息异常 outTradeNo={}, code={}, message={}", outTradeNo, respCode, respMessage);
}

@ -155,7 +155,7 @@ public class RegService {
ResultEnum resultEnum = e.getResultEnum();
String message = resultEnum == null ? "系统繁忙" : resultEnum.message;
String pushMessage = "挂号失败已申请退款,原因:" + message + ",订单号:" + outTradeNo; // 推送消息
regAutoRefund(merchantEnum, HisFactory.His().createErrorResult(message), openid, totalFee, outTradeNo, tradeNo, message, pushMessage, tradeDate);
regAutoRefund(merchantEnum, HisFactory.His().createErrorResult(message), openid, totalFee, outTradeNo, tradeNo, message, pushMessage, tradeDate, null);
throw new ServiceException(message);
}
@ -210,7 +210,7 @@ public class RegService {
String pushMessage = "挂号失败已申请退款,原因:" + message + ",订单号:" + outTradeNo; // 推送消息
// 自动退款
regAutoRefund(merchantEnum, jsonResult, openid, totalFee, outTradeNo, tradeNo, message, pushMessage, tradeDate);
regAutoRefund(merchantEnum, jsonResult, openid, totalFee, outTradeNo, tradeNo, message, pushMessage, tradeDate, null);
throw new ServiceException(message);
}
@ -380,144 +380,219 @@ public class RegService {
/**
* 取消预约
* 取消挂号
*
* @param patientId 患者id
* @param tradeNo HIS交易流水号
* @param hisTransNo HIS流水号
* @return 是否成功
*/
public Result cancelRegReserve(String patientId, String tradeNo, String hisTransNo) {
log.info("[挂号][取消预约]申请 patientId={}, tradeNo={}, hisTransNo={}", patientId, tradeNo, hisTransNo);
if (patientId == null || ObjectUtils.isEmpty(tradeNo) || hisTransNo == null) {
log.info("[挂号][取消预约]参数缺失 patientId={}, bankTransNo={}, hisTransNo={}", patientId, tradeNo, hisTransNo);
return Result.error(ResultEnum.PARAM_IS_DEFECT);
}
Register reg = new RegisterDao().selectRegByHisTransNo(hisTransNo);
if (reg == null) {
log.info("[挂号][取消预约]失败, 未查询到挂号支付信息");
public Result cancelRegister(boolean isRegToday, String patientId, String tradeNo, String hisTransNo) {
Register order = new RegisterDao().selectRegByHisTransNo(hisTransNo);
if (order == null) {
log.info("[取消挂号]未查询到挂号订单信息");
return Result.error(ResultEnum.DATA_NOT_FOUND);
}
String outTradeNo = reg.getOutTradeNo();
MerchantEnum merchantEnum = MerchantEnum.findEnumByOutTradeNo(outTradeNo);
JsonResult resp = new HisRegisterDao().cancelReserve(patientId, tradeNo, merchantEnum);
if (!resp.success()) {
String message = resp.getMessage();
log.info("[挂号][取消预约]失败 HIS返回:{}", message);
return Result.error(message);
if (!patientId.equals(order.getPatientId())) {
return Result.error("[取消挂号]订单数据异常");
}
String dbTradeNo = reg.getTradeNo();
BigDecimal payMoney = reg.getPayMoney();
if (dbTradeNo == null || outTradeNo == null || payMoney == null) {
log.info("[挂号][取消预约]失败, 支付信息的参数为空,patientId={}, tradeNo={}, payMoney={}", patientId, tradeNo, payMoney);
return Result.error("支付信息的参数为空");
}
if (merchantEnum == null) {
return Result.error("支付方式未匹配 outTradeNo=" + outTradeNo);
String outTradeNo = order.getOutTradeNo();
String dbTradeNo = order.getTradeNo();
BigDecimal payMoney = order.getPayMoney();
if (outTradeNo == null || dbTradeNo == null || payMoney == null) {
log.info("[取消挂号]订单信息缺失 isRegToday={}, patientId={}, tradeNo={}, payMoney={}", isRegToday, patientId, tradeNo, payMoney);
return Result.error("[取消挂号]订单信息缺失");
}
log.info("{}[挂号][取消预约]开始退款... outTradeNo={}, dbTradeNo={}, payMoney={}", merchantEnum.NAME, outTradeNo, dbTradeNo, payMoney);
String pushInfo = "取消预约 科室:" + reg.getDeptName();
Result result = regAutoRefund(merchantEnum, resp, reg.getOpenid(), payMoney, outTradeNo, dbTradeNo, "取消预约", pushInfo, reg.getUpdateTime());
new SmsService().sms_reg_002(reg);
MessagePushConfig.regCancelPush(merchantEnum, reg);
if (result.isOK()) {
result.setMessage(merchantEnum.NAME + "取消成功,挂号费用将在24小时内退回!"); // 修改返回提示的信息
}
if (MerchantEnum.ALI.equals(merchantEnum)) {
String link = "pages/center/components/remordList/reserve";
String title = "预约挂号取消 " + reg.getDeptName();
AliMessageHelper.hospitalOrder(reg.getOpenid(), title, AliMsgEnum.MERCHANT_CLOSED, reg.getUpdateTime(), false, reg.getTotalFee(), outTradeNo, reg.getRegDate(), reg.getBegTime(), reg.getDeptCode(), reg.getDeptName(), reg.getDoctName(),
AliHelper.getLink(link, null));
}
return result;
if (order.hasRefundByRefundResult()) {
return Result.error("已退费,请勿重复操作");
}
/**
* 今日挂号[取消预约]
*
* @param hisTransNo HIS流水号
*/
public Result refundRegister(String hisTransNo) {
log.info("[今日挂号][取消预约]hisTransNo={}", hisTransNo);
if (hisTransNo == null) {
log.info("[今日挂号][取消预约]hisTransNo为空");
return Result.error(ResultEnum.PARAM_IS_DEFECT);
MerchantEnum merchantEnum = MerchantEnum.findEnumByOutTradeNo(outTradeNo);
if (merchantEnum == null) {
return Result.error("[取消挂号]支付方式未匹配 outTradeNo=" + outTradeNo);
}
Register reg = new RegisterDao().selectRegByHisTransNo(hisTransNo);
if (reg == null) {
log.info("[今日挂号][取消预约]失败, 未查询到挂号支付信息;若是医保支付则不允许线上退号,请到窗口进行退费");
return Result.error(ResultEnum.REG_NOT_FIND);
if (!new RegisterDao().updateRefundResult(outTradeNo, tradeNo, "已发起取消挂号申请")) {
log.error("[取消挂号]标记为[已发起取消挂号申请]失败 isRegToday={}, patientId={}, tradeNo={}, payMoney={}", isRegToday, patientId, tradeNo, payMoney);
}
String tradeNo = reg.getTradeNo();
String outTradeNo = reg.getOutTradeNo();
MerchantEnum merchantEnum = MerchantEnum.findEnumByOutTradeNo(outTradeNo);
JsonResult resp = new HisRegisterDao().refundRegister(tradeNo, merchantEnum);
JsonResult resp = new HisRegisterDao().cancelHisReg(isRegToday, merchantEnum, patientId, tradeNo);
if (!resp.success()) {
String message = resp.getMessage();
log.info("[今日挂号][取消预约]失败 HIS返回:{}", message);
log.info("[取消挂号]失败 HIS返回:{}", message);
return Result.error(message);
}
String dbTradeNo = reg.getTradeNo();
BigDecimal payMoney = reg.getPayMoney();
if (dbTradeNo == null || outTradeNo == null || payMoney == null) {
log.info("[今日挂号][取消预约]失败, 支付信息的参数为空, tradeNo={}, payMoney={}", tradeNo, payMoney);
return Result.error("今日挂号支付信息的参数为空");
}
log.info("{}[取消挂号]开始退款... outTradeNo={}, dbTradeNo={}, payMoney={}", merchantEnum.NAME, outTradeNo, dbTradeNo, payMoney);
if ("OK".equals(reg.getRefundResult())) {
return Result.error("已退费,请不要重复退费");
}
if (merchantEnum == null) {
return Result.error("支付方式未匹配 outTradeNo=" + outTradeNo);
}
new MiddleOfficeService().reg_JH0105(reg.getTreatNum());
log.info("{}[今日挂号][取消预约]开始退款... outTradeNo={}, dbTradeNo={}, payMoney={}", merchantEnum.NAME, outTradeNo, dbTradeNo, payMoney);
String pushInfo = "取消预约 科室:" + reg.getDeptName();
Result result = refundTodayRegister(merchantEnum, resp, reg.getOpenid(), payMoney, outTradeNo, dbTradeNo, "取消预约", pushInfo, reg.getUpdateTime());
new SmsService().sms_reg_002(reg); // 短信通知
MessagePushConfig.regCancelPush(merchantEnum, reg);
String pushInfo = "取消挂号 科室:" + order.getDeptName();
Result result = regRefund(merchantEnum, resp, order.getOpenid(), payMoney, outTradeNo, dbTradeNo, "取消预约", pushInfo, order.getUpdateTime(), "取消预约", isRegToday);
if (result.isOK()) {
result.setMessage(merchantEnum.NAME + "取消成功,挂号费用将在24小时内退回!"); // 修改返回提示的信息
result.setMessage(merchantEnum.NAME + "取消挂号成功,挂号费用将在24小时内退回!"); // 修改返回提示的信息
new SmsService().sms_reg_002(order);
MessagePushConfig.regCancelPush(merchantEnum, order);
}
if (MerchantEnum.ALI.equals(merchantEnum)) {
String link = "pages/center/components/remordList/reserve";
String title = "预约挂号取消 " + reg.getDeptName();
AliMessageHelper.hospitalOrder(reg.getOpenid(), title, AliMsgEnum.MERCHANT_CLOSED, reg.getUpdateTime(), false, reg.getTotalFee(), outTradeNo, reg.getRegDate(), reg.getBegTime(), reg.getDeptCode(), reg.getDeptName(), reg.getDoctName(),
String title = "取消挂号 " + order.getDeptName();
AliMessageHelper.hospitalOrder(order.getOpenid(), title, AliMsgEnum.MERCHANT_CLOSED, order.getUpdateTime(), false, order.getTotalFee(), outTradeNo, order.getRegDate(), order.getBegTime(), order.getDeptCode(), order.getDeptName(), order.getDoctName(),
AliHelper.getLink(link, null));
}
return result;
}
// /**
// * 取消预约
// *
// * @param patientId 患者id
// * @param tradeNo HIS交易流水号
// * @param hisTransNo HIS流水号
// * @return 是否成功
// */
// public Result cancelRegReserve(String patientId, String tradeNo, String hisTransNo) {
// log.info("[挂号][取消预约]申请 patientId={}, tradeNo={}, hisTransNo={}", patientId, tradeNo, hisTransNo);
//
// if (patientId == null || ObjectUtils.isEmpty(tradeNo) || hisTransNo == null) {
// log.info("[挂号][取消预约]参数缺失 patientId={}, bankTransNo={}, hisTransNo={}", patientId, tradeNo, hisTransNo);
// return Result.error(ResultEnum.PARAM_IS_DEFECT);
// }
//
// Register reg = new RegisterDao().selectRegByHisTransNo(hisTransNo);
// if (reg == null) {
// log.info("[挂号][取消预约]失败, 未查询到挂号支付信息");
// return Result.error(ResultEnum.DATA_NOT_FOUND);
// }
//
//
// String outTradeNo = reg.getOutTradeNo();
// MerchantEnum merchantEnum = MerchantEnum.findEnumByOutTradeNo(outTradeNo);
//
// JsonResult resp = new HisRegisterDao().cancelReserve(patientId, tradeNo, merchantEnum);
// if (!resp.success()) {
// String message = resp.getMessage();
// log.info("[挂号][取消预约]失败 HIS返回:{}", message);
// return Result.error(message);
// }
//
// String dbTradeNo = reg.getTradeNo();
// BigDecimal payMoney = reg.getPayMoney();
// if (dbTradeNo == null || outTradeNo == null || payMoney == null) {
// log.info("[挂号][取消预约]失败, 支付信息的参数为空,patientId={}, tradeNo={}, payMoney={}", patientId, tradeNo, payMoney);
// return Result.error("支付信息的参数为空");
// }
//
// if (reg.hasRefundByRefundResult()) {
// return Result.error("已退费,请不要重复退费");
// }
//
// if (merchantEnum == null) {
// return Result.error("支付方式未匹配 outTradeNo=" + outTradeNo);
// }
//
// log.info("{}[挂号][取消预约]开始退款... outTradeNo={}, dbTradeNo={}, payMoney={}", merchantEnum.NAME, outTradeNo, dbTradeNo, payMoney);
//
// String pushInfo = "取消预约 科室:" + reg.getDeptName();
//
// Result result = regAutoRefund(merchantEnum, resp, reg.getOpenid(), payMoney, outTradeNo, dbTradeNo, "取消预约", pushInfo, reg.getUpdateTime(), "取消预约");
//
// new SmsService().sms_reg_002(reg);
// MessagePushConfig.regCancelPush(merchantEnum, reg);
//
// if (result.isOK()) {
// result.setMessage(merchantEnum.NAME + "取消成功,挂号费用将在24小时内退回!"); // 修改返回提示的信息
// }
//
// if (MerchantEnum.ALI.equals(merchantEnum)) {
//
// String link = "pages/center/components/remordList/reserve";
//
// String title = "预约挂号取消 " + reg.getDeptName();
// AliMessageHelper.hospitalOrder(reg.getOpenid(), title, AliMsgEnum.MERCHANT_CLOSED, reg.getUpdateTime(), false, reg.getTotalFee(), outTradeNo, reg.getRegDate(), reg.getBegTime(), reg.getDeptCode(), reg.getDeptName(), reg.getDoctName(),
// AliHelper.getLink(link, null));
// }
// return result;
// }
//
// /**
// * 今日挂号[取消预约]
// *
// * @param hisTransNo HIS流水号
// */
// public Result refundRegister(String hisTransNo) {
// log.info("[今日挂号][取消预约]hisTransNo={}", hisTransNo);
//
// if (hisTransNo == null) {
// log.info("[今日挂号][取消预约]hisTransNo为空");
// return Result.error(ResultEnum.PARAM_IS_DEFECT);
// }
//
// Register reg = new RegisterDao().selectRegByHisTransNo(hisTransNo);
// if (reg == null) {
// log.info("[今日挂号][取消预约]失败, 未查询到挂号支付信息;若是医保支付则不允许线上退号,请到窗口进行退费");
// return Result.error(ResultEnum.REG_NOT_FIND);
// }
//
// String tradeNo = reg.getTradeNo();
// String outTradeNo = reg.getOutTradeNo();
// MerchantEnum merchantEnum = MerchantEnum.findEnumByOutTradeNo(outTradeNo);
//
// JsonResult resp = new HisRegisterDao().refundRegister(tradeNo, merchantEnum);
// if (!resp.success()) {
// String message = resp.getMessage();
// log.info("[今日挂号][取消预约]失败 HIS返回:{}", message);
// return Result.error(message);
// }
//
// String dbTradeNo = reg.getTradeNo();
// BigDecimal payMoney = reg.getPayMoney();
// if (dbTradeNo == null || outTradeNo == null || payMoney == null) {
// log.info("[今日挂号][取消预约]失败, 支付信息的参数为空, tradeNo={}, payMoney={}", tradeNo, payMoney);
// return Result.error("今日挂号支付信息的参数为空");
// }
//
// if (reg.hasRefundByRefundResult()) {
// return Result.error("已退费,请不要重复退费");
// }
//
// if (merchantEnum == null) {
// return Result.error("支付方式未匹配 outTradeNo=" + outTradeNo);
// }
//
// new MiddleOfficeService().reg_JH0105(reg.getTreatNum());
//
// log.info("{}[今日挂号][取消预约]开始退款... outTradeNo={}, dbTradeNo={}, payMoney={}", merchantEnum.NAME, outTradeNo, dbTradeNo, payMoney);
//
// String pushInfo = "取消预约 科室:" + reg.getDeptName();
//
// Result result = refundTodayRegister(merchantEnum, resp, reg.getOpenid(), payMoney, outTradeNo, dbTradeNo, "取消预约", pushInfo, reg.getUpdateTime(), "取消预约");
//
// new SmsService().sms_reg_002(reg); // 短信通知
// MessagePushConfig.regCancelPush(merchantEnum, reg);
//
// if (result.isOK()) {
// result.setMessage(merchantEnum.NAME + "取消成功,挂号费用将在24小时内退回!"); // 修改返回提示的信息
// }
//
// if (MerchantEnum.ALI.equals(merchantEnum)) {
//
// String link = "pages/center/components/remordList/reserve";
//
// String title = "预约挂号取消 " + reg.getDeptName();
// AliMessageHelper.hospitalOrder(reg.getOpenid(), title, AliMsgEnum.MERCHANT_CLOSED, reg.getUpdateTime(), false, reg.getTotalFee(), outTradeNo, reg.getRegDate(), reg.getBegTime(), reg.getDeptCode(), reg.getDeptName(), reg.getDoctName(),
// AliHelper.getLink(link, null));
// }
// return result;
// }
/**
* 挂号手动退费
*
@ -645,47 +720,47 @@ public class RegService {
* @param tradeNo HIS交易流水号
* @param hisResult 记录信息
*/
public Result regAutoRefund(MerchantEnum merchantEnum, JsonResult jsonResult, String openid, BigDecimal totalFee, String outTradeNo, String tradeNo, String hisResult, String pushInfo, Date tradeDate) {
log.info("[预约挂号/挂号失败自动退费][开始退费]---merchantEnum-{},JsonResult-{},openid-{},totalFee-{},outTradeNo-{},tradeNo-{},hisResult-{},pushInfo-{},tradeDate-{}", merchantEnum, jsonResult, openid, totalFee, outTradeNo, tradeNo, hisResult, pushInfo, tradeDate);
return regRefund(merchantEnum, jsonResult, openid, totalFee, outTradeNo, tradeNo, hisResult, pushInfo, tradeDate, false);
public Result regAutoRefund(MerchantEnum merchantEnum, JsonResult jsonResult, String openid, BigDecimal totalFee, String outTradeNo, String tradeNo, String hisResult, String pushInfo, Date tradeDate, String refundReason) {
return regRefund(merchantEnum, jsonResult, openid, totalFee, outTradeNo, tradeNo, hisResult, pushInfo, tradeDate, refundReason, false);
}
public Result refundTodayRegister(MerchantEnum merchantEnum, JsonResult jsonResult, String openid, BigDecimal totalFee, String outTradeNo, String tradeNo, String hisResult, String pushInfo, Date tradeDate) {
log.info("[今日挂号][开始退费]---merchantEnum-{},JsonResult-{},openid-{},totalFee-{},outTradeNo-{},tradeNo-{},hisResult-{},pushInfo-{},tradeDate-{}", merchantEnum, jsonResult, openid, totalFee, outTradeNo, tradeNo, hisResult, pushInfo, tradeDate);
return regRefund(merchantEnum, jsonResult, openid, totalFee, outTradeNo, tradeNo, hisResult, pushInfo, tradeDate, true);
}
// public Result refundTodayRegister(MerchantEnum merchantEnum, JsonResult jsonResult, String openid, BigDecimal totalFee, String outTradeNo, String tradeNo, String hisResult, String pushInfo, Date tradeDate, String refundReason) {
// log.info("{}[今日挂号][开始退费] openid={}, totalFee={}, outTradeNo={}, tradeNo={}, hisResult={}, pushInfo={}, tradeDate={}, refundReason={}", merchantEnum.NAME, openid, totalFee, outTradeNo, tradeNo, hisResult, pushInfo, tradeDate, refundReason);
// return regRefund(merchantEnum, jsonResult, openid, totalFee, outTradeNo, tradeNo, hisResult, pushInfo, tradeDate, refundReason, true);
// }
public Result regRefund(MerchantEnum merchantEnum, JsonResult jsonResult, String openid, BigDecimal totalFee, String outTradeNo, String tradeNo, String hisResult, String pushInfo, Date tradeDate, String refundReason, boolean isRegToday) {
log.info("{}[取消挂号][开始退费] isRegToday={}, openid={}, totalFee={}, outTradeNo={}, tradeNo={}, hisResult={}, pushInfo={}, tradeDate={}, refundReason={}", isRegToday, merchantEnum.NAME, openid, totalFee, outTradeNo, tradeNo, hisResult, pushInfo, tradeDate, refundReason);
public Result regRefund(MerchantEnum merchantEnum, JsonResult jsonResult, String openid, BigDecimal totalFee, String outTradeNo, String tradeNo, String hisResult, String pushInfo, Date tradeDate, boolean isToday) {
RegisterDao regDao = new RegisterDao();
String code = jsonResult.getCode();
// 挂号记录更新HIS返回的错误信息
if (!regDao.updateHisPaidFailByOutTradeNo(outTradeNo, code, hisResult)) {
log.info("[挂号][退费错误]更新HIS返回的错误信息失败 outTradeNo={}, tradeNo={}", outTradeNo, tradeNo);
// 挂号记录更新HIS返回的错误信息|取消预约
if (!regDao.updateHisPaidFailByOutTradeNo(outTradeNo, code, hisResult, refundReason)) {
log.info("[取消挂号]更新[HIS挂号失败信息|取消预约]失败 outTradeNo={}, tradeNo={}", outTradeNo, tradeNo);
}
if (jsonResult.isTimeout()) { // 超时不退费
log.info("[挂号][退费错误]HIS请求超时 outTradeNo={}, tradeNo={}", outTradeNo, tradeNo);
return Result.error("[挂号退费]HIS请求超时");
log.info("[取消挂号]HIS请求超时 outTradeNo={}, tradeNo={}", outTradeNo, tradeNo);
return Result.error("[挂号禁止退费]HIS请求超时");
}
if (!isToday) {
if (!isRegToday) {
// 如果HIS交过费返回true-->就不向下执行(自动退款)
String dateShort = DateGenerate.getStringDateShort();
String paidTip = new HisAccountDao().isPaid(DateGenerate.getNextDay(dateShort, "-7"), DateGenerate.getNextDay(dateShort, "7"), tradeNo);
if (paidTip != null) {
log.info("[挂号][退费错误] paidTip={}, outTradeNo={}, tradeNo={}", paidTip, outTradeNo, tradeNo);
log.info("[取消挂号] paidTip={}, outTradeNo={}, tradeNo={}", paidTip, outTradeNo, tradeNo);
return Result.error(paidTip);
}
}
String refundResult;
if (totalFee.compareTo(BigDecimal.ZERO) != 0) { // 金为0
log.info("{}[挂号][退款]开始申请 outTradeNo={}, pushInfo={}", merchantEnum.NAME, outTradeNo, pushInfo);
if (totalFee.compareTo(BigDecimal.ZERO) != 0) { // 金为0
log.info("{}[取消挂号]开始申请 outTradeNo={}, pushInfo={}", merchantEnum.NAME, outTradeNo, pushInfo);
Order orderRefund = PayService.refund(merchantEnum, outTradeNo, tradeNo, totalFee, totalFee, pushInfo, tradeDate, openid, null, pushInfo);
if (!orderRefund.isSuccess()) {
log.info("{} [挂号][退费错误] outTradeNo={}, tradeNo={}, totalFee={}", merchantEnum.NAME, outTradeNo, tradeNo, totalFee);
log.info("{} [取消挂号] outTradeNo={}, tradeNo={}, totalFee={}", merchantEnum.NAME, outTradeNo, tradeNo, totalFee);
}
refundResult = orderRefund.getRefundResult();
@ -695,7 +770,7 @@ public class RegService {
boolean isUpdate = regDao.updateRefundResult(outTradeNo, tradeNo, refundResult);
if (!isUpdate) {
log.info("{} [挂号][退费错误]信息更新失败 tradeNo={}", merchantEnum.NAME, tradeNo);
log.info("{} [取消挂号]信息更新失败 tradeNo={}", merchantEnum.NAME, tradeNo);
return Result.error();
}
return Result.success();

@ -6,6 +6,7 @@ import com.ynxbd.common.bean.pay.Recipe;
import com.ynxbd.common.bean.pay.Register;
import com.ynxbd.common.dao.PatientDao;
import com.ynxbd.common.healthcard.HCPreConsultHelper;
import com.ynxbd.common.helper.common.DateHelper;
import com.ynxbd.common.helper.common.XmlConfigHelper;
import com.ynxbd.common.helper.http.OkHttpHelper;
import com.ynxbd.wx.utils.DesEncryptHelper;
@ -42,9 +43,9 @@ public class MessagePushConfig {
public static final String REG_CANCEL_API;
// [挂号]AI
public static final boolean REG_AI_IS_ENABLE;
public static final String REG_AI_API;
// [挂号]预问诊reg_pre_consult
public static final boolean REG_PRE_CONSULT_IS_ENABLE;
public static final String REG_PRE_CONSULT_API;
// [处方]缴费通知
public static final boolean RX_PAID_IS_ENABLE;
@ -77,10 +78,10 @@ public class MessagePushConfig {
REG_CANCEL_IS_ENABLE = regCancelConfig.getBoolean("is_enable", false);
REG_CANCEL_API = HOST_URL + regCancelConfig.getString("api");
// [挂号]AI
XmlConfigHelper regAIConfig = config.getConfigNode("reg_ai");
REG_AI_IS_ENABLE = regAIConfig.getBoolean("is_enable", false);
REG_AI_API = HOST_URL + regAIConfig.getString("api");
// [挂号]预问诊
XmlConfigHelper regAIConfig = config.getConfigNode("reg_pre_consult");
REG_PRE_CONSULT_IS_ENABLE = regAIConfig.getBoolean("is_enable", false);
REG_PRE_CONSULT_API = HOST_URL + regAIConfig.getString("api");
// [处方]缴费通知
XmlConfigHelper rxPaidConfig = config.getConfigNode("rx_paid");
@ -207,58 +208,41 @@ public class MessagePushConfig {
.add("url", url)
.add("organizeName", ORGANIZENAME)
.build();
OkHttpHelper.post(REG_AI_API, requestBody);
OkHttpHelper.post(REG_PRE_CONSULT_API, requestBody);
}
/**
* 挂号完成-发起预问诊通知
*/
public static void regEndPreConsult(MerchantEnum merchantEnum, Register order) {
try {
if (!merchantEnum.equals(MerchantEnum.WX) || !REG_AI_IS_ENABLE || ObjectUtils.isEmpty(REG_AI_API) || order == null) {
return;
}
log.info("[推送]预问诊通知...");
String openId = order.getOpenid();
String patientId = order.getPatientId();
String outTradeNo = order.getOutTradeNo();
if (ObjectUtils.isEmpty(openId) || ObjectUtils.isEmpty(patientId) || ObjectUtils.isEmpty(outTradeNo)) {
log.warn("[推送]预问诊通知-失败:参数缺失");
if (!merchantEnum.equals(MerchantEnum.WX)) {
return;
}
String url = HCPreConsultHelper.getH5Online(outTradeNo);
if (ObjectUtils.isEmpty(url)) {
log.warn("[推送]预问诊通知-失败:链接为空[outTradeNo:{}]", outTradeNo);
return;
pushPreConsult(order, "为了帮助医生更全面地了解您的身体情况,请花2分钟时间填写病情信息,以便医生提前了解病症,为您提供更好的诊疗服务。");
}
RequestBody requestBody = new FormBody.Builder()
.add("openId", DesEncryptHelper.enCode(openId))
.add("patientId", patientId)
.add("content", "为了帮助医生更全面地了解您的身体情况,请花2分钟时间填写病情信息,以便医生提前了解病症,为您提供更好的诊疗服务。")
.add("url", url)
.add("organizeName", ORGANIZENAME)
.build();
OkHttpHelper.post(REG_AI_API, requestBody);
} catch (Exception e) {
log.warn("[推送]预问诊通知-异常-{}", e.getMessage());
}
/**
* 预问诊完成通知
*/
public static void preConsultReportNotify(Register order) {
pushPreConsult(order, "您好,您的预问诊报告可以查看啦");
}
/**
* 预问诊完成通知
* 预问诊推送
*/
public static void preConsultReportNotify(String openId, String patientId, String outTradeNo) {
public static void pushPreConsult(Register order, String content) {
try {
if (!REG_AI_IS_ENABLE || ObjectUtils.isEmpty(REG_AI_API)) {
if (order == null || !REG_PRE_CONSULT_IS_ENABLE || ObjectUtils.isEmpty(REG_PRE_CONSULT_API)) {
return;
}
log.info("[推送]预问诊完成通知...");
if (ObjectUtils.isEmpty(openId) || ObjectUtils.isEmpty(patientId) || ObjectUtils.isEmpty(outTradeNo)) {
log.warn("[推送]预问诊完成通知-失败:参数缺失~患者ID为空");
log.info("[推送]预问诊通知...");
String openId = order.getOpenid();
String patientName = order.getPatientId();
String outTradeNo = order.getOutTradeNo();
if (ObjectUtils.isEmpty(openId) || ObjectUtils.isEmpty(patientName) || ObjectUtils.isEmpty(outTradeNo)) {
log.warn("[推送]预问诊完成通知-失败:参数缺失 openId={}, patientName={}, outTradeNo={}", openId, patientName, outTradeNo);
return;
}
String url = HCPreConsultHelper.getH5Online(outTradeNo);
@ -269,12 +253,13 @@ public class MessagePushConfig {
RequestBody requestBody = new FormBody.Builder()
.add("openId", DesEncryptHelper.enCode(openId))
.add("patientId", patientId)
.add("content", "您好,您的预问诊报告可以查看啦")
.add("patientName", patientName)
.add("date", DateHelper.getCurDate())
.add("content", content)
.add("url", url)
.add("organizeName", ORGANIZENAME)
.add("organizeName", "355E376621BFA6B8")
.build();
OkHttpHelper.post(REG_AI_API, requestBody);
OkHttpHelper.post(REG_PRE_CONSULT_API, requestBody);
} catch (Exception e) {
log.error("[推送]预问诊完成通知-异常-{}", e.getMessage());
}

@ -70,12 +70,13 @@ public class DesEncryptHelper {
public static void main(String[] args) throws Exception {
String a = deCode("6ADACF5B7F310CC25598CCCD233DB1535D6ED4C5C1ED33EB7FB6EA58AAE4762E08E31B22C5B2C3CEE4C71A276C3162255B686984C447887E2053C9C89917CE7C5213744A91F02D8F948A6236562EC17CFDD2A7F66C501229A15D2957CA0E572FC716999C0E41244AB4132CF1504CC2178F6A7B6D60248C97B0AF59BDCFCF9138DB6DA413DBBA92BFA0A759D3930C4920");
System.out.println(a);
System.out.println(enCode("oqsq-vyMNxdWrlZFkbigCre0PM8s"));
System.out.println(enCode("oeso-t62kkoRwLVVkSkwmmjPfUXk"));
System.out.println(enCode("oeso-t9o2Wc3wV-CkOqmT6HLkM7c"));
// String a = deCode("6ADACF5B7F310CC25598CCCD233DB1535D6ED4C5C1ED33EB7FB6EA58AAE4762E08E31B22C5B2C3CEE4C71A276C3162255B686984C447887E2053C9C89917CE7C5213744A91F02D8F948A6236562EC17CFDD2A7F66C501229A15D2957CA0E572FC716999C0E41244AB4132CF1504CC2178F6A7B6D60248C97B0AF59BDCFCF9138DB6DA413DBBA92BFA0A759D3930C4920");
// System.out.println(a);
//
// System.out.println(enCode("oqsq-vyMNxdWrlZFkbigCre0PM8s"));
// System.out.println(enCode("oeso-t62kkoRwLVVkSkwmmjPfUXk"));
// System.out.println(enCode("oeso-t9o2Wc3wV-CkOqmT6HLkM7c"));
// System.out.println(enCode("oeso-t6OG3d7-VHlZ55Eu_TJjOTo"));
}
}

@ -27,14 +27,13 @@ public class WxFactory {
}
// public static class Payment {
// public Payment() {
// }
//
// public static com.alipay.easysdk.payment.common.Client Common() throws Exception {
// return new com.alipay.easysdk.payment.common.Client(new Client(Factory.context));
// }
// }
@NoArgsConstructor
public static class Payment {
public static com.ynxbd.wx.wxfactory.payment.jsapi.Client JSAPI() {
return new com.ynxbd.wx.wxfactory.payment.jsapi.Client();
}
}
// 医保
@NoArgsConstructor

@ -7,20 +7,16 @@ import com.ynxbd.wx.wxfactory.payment.jsapi.models.UnionAPIv3JsapiPrepay;
import lombok.extern.slf4j.Slf4j;
import java.math.BigDecimal;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.time.LocalDateTime;
import java.util.ArrayList;
/**
* JSAPI下单
*/
@Slf4j
public class Client {
public UnionAPIv3JsapiPrepay.UnionAPIv3JsapiPrepayResponse jsapiPrepay(
/**
* JSAPI下单
*/
public UnionAPIv3JsapiPrepay.UnionAPIv3JsapiPrepayResponse prepayJSAPI(
String attach, String appId, String mchId, String ip, String outTradeNo, String openId, BigDecimal totalFee, String description, String detail, String notifyUrl) {
UnionAPIv3JsapiPrepay.UnionAPIv3JsapiPrepayRequest request = new UnionAPIv3JsapiPrepay.UnionAPIv3JsapiPrepayRequest();
request.combineAppid = appId;
@ -58,126 +54,4 @@ public class Client {
}
return null;
}
// public static class DirectAPIv3JsapiPrepayRequest {
// @SerializedName("appid")
// public String appid;
//
// @SerializedName("mchid")
// public String mchid;
//
// @SerializedName("description")
// public String description;
//
// @SerializedName("out_trade_no")
// public String outTradeNo;
//
// @SerializedName("time_expire")
// public String timeExpire;
//
// @SerializedName("attach")
// public String attach;
//
// @SerializedName("notify_url")
// public String notifyUrl;
//
// @SerializedName("goods_tag")
// public String goodsTag;
//
// @SerializedName("support_fapiao")
// public Boolean supportFapiao;
//
// @SerializedName("amount")
// public CommonAmountInfo amount;
//
// @SerializedName("payer")
// public JsapiReqPayerInfo payer;
//
// @SerializedName("detail")
// public CouponInfo detail;
//
// @SerializedName("scene_info")
// public CommonSceneInfo sceneInfo;
//
// @SerializedName("settle_info")
// public SettleInfo settleInfo;
// }
//
// public static class DirectAPIv3JsapiPrepayResponse {
// @SerializedName("prepay_id")
// public String prepayId;
// }
//
// public static class CommonAmountInfo {
// @SerializedName("total")
// public Long total;
//
// @SerializedName("currency")
// public String currency;
// }
//
// public static class JsapiReqPayerInfo {
// @SerializedName("openid")
// public String openid;
// }
//
// public static class CouponInfo {
// @SerializedName("cost_price")
// public Long costPrice;
//
// @SerializedName("invoice_id")
// public String invoiceId;
//
// @SerializedName("goods_detail")
// public List<GoodsDetail> goodsDetail;
// }
//
// public static class CommonSceneInfo {
// @SerializedName("payer_client_ip")
// public String payerClientIp;
//
// @SerializedName("device_id")
// public String deviceId;
//
// @SerializedName("store_info")
// public StoreInfo storeInfo;
// }
//
// public static class SettleInfo {
// @SerializedName("profit_sharing")
// public Boolean profitSharing;
// }
//
// public static class GoodsDetail {
// @SerializedName("merchant_goods_id")
// public String merchantGoodsId;
//
// @SerializedName("wechatpay_goods_id")
// public String wechatpayGoodsId;
//
// @SerializedName("goods_name")
// public String goodsName;
//
// @SerializedName("quantity")
// public Long quantity;
//
// @SerializedName("unit_price")
// public Long unitPrice;
// }
//
// public static class StoreInfo {
// @SerializedName("id")
// public String id;
//
// @SerializedName("name")
// public String name;
//
// @SerializedName("area_code")
// public String areaCode;
//
// @SerializedName("address")
// public String address;
// }
}

@ -0,0 +1,4 @@
package com.ynxbd.wx.wxfactory.payment.query;
public class Client {
}

@ -62,6 +62,8 @@
<pre_consult name="预问诊">
<is_enable name="是否开启">true</is_enable>
<is_dev mame="是否为测试环境">false</is_dev>
<is_dev_push_subscribe_message name="[push_subscribe_message接口]是否为测试环境">false</is_dev_push_subscribe_message>
<is_debug mame="是否开启调试">true</is_debug>
<app_id name="[开发者ID]">34edf7cd14e646ae9c1bbca791b7b685</app_id>
<app_secret name="[开发者密钥]">b26188e6142d43b88f01453853d52a0a</app_secret>

@ -1 +1 @@
<?xml version="1.0" encoding="UTF-8"?> <config> <his> <is_req_cdata name="州傣医使用-[def:false]">false</is_req_cdata> <!-- 处方预结算(第2开关)(注意该配置需联系his开发者确认支持才能开启,否则存在风险!) --> <is_rx_prepay name="处方预结算[风险][def:false]">false</is_rx_prepay> <!-- 开关配置 --> <is_ali_mer name="HIS是否开启支付宝分开对账-[def:false]">false</is_ali_mer> <is_log_resp name="是否强制打印响应xml数据-[def:false]">false</is_log_resp> <is_push_msg name="是否传递openid给His推送消息-[def:false]">false</is_push_msg> <!-- 医保 --> <wx_med_url name="[微信医保]">127.0.0.1:8888</wx_med_url> <ali_med_url name="[支付宝医保]">127.0.0.1:8888</ali_med_url> <dev_med_openid_s name="[医保测试openid多个用英文逗号隔开]">1</dev_med_openid_s> <!-- HIS --> <dev_url name="[测试环境]">200.200.200.60:7777</dev_url> <!-- <url name="[正式环境]">200.200.200.60:7777</url> --> <url name="德宏中医">200.200.200.60:7777</url> </his> </config>
<?xml version="1.0" encoding="UTF-8"?> <config> <his> <is_req_cdata name="州傣医使用-[def:false]">false</is_req_cdata> <!-- 处方预结算(第2开关)(注意该配置需联系his开发者确认支持才能开启,否则存在风险!) --> <is_rx_prepay name="处方预结算[风险][def:false]">false</is_rx_prepay> <!-- 开关配置 --> <is_ali_mer name="HIS是否开启支付宝分开对账-[def:false]">false</is_ali_mer> <is_log_resp name="是否强制打印响应xml数据-[def:false]">false</is_log_resp> <is_push_msg name="是否传递openid给His推送消息-[def:false]">false</is_push_msg> <!-- 医保 --> <wx_med_url name="[微信医保]">127.0.0.1:8888</wx_med_url> <ali_med_url name="[支付宝医保]">127.0.0.1:8888</ali_med_url> <dev_med_openid_s name="[医保测试openid多个用英文逗号隔开]">1</dev_med_openid_s> <!-- HIS --> <dev_url name="[测试环境]">200.200.200.60:7777</dev_url> <!-- <url name="[正式环境]">200.200.200.60:7777</url> --> <!-- <url name="德宏中医">200.200.200.60:7777</url>--> <url name="红河州第一人民医院">10.20.10.6:8888</url> </his> </config>

@ -17,16 +17,16 @@
<api>AppointmentCancel</api>
</reg_cancel>
<reg_pre_consult name="[挂号]预问诊">
<is_enable>false</is_enable>
<api>ai/preConsultationpost</api>
</reg_pre_consult>
<rx_paid name="[处方]缴费通知">
<is_enable>false</is_enable>
<api>PaymentSuccess</api>
</rx_paid>
<reg_ai name="[挂号]AI">
<is_enable>false</is_enable>
<api>business/universal</api>
</reg_ai>
<obs_document name="产科建档">
<is_enable>false</is_enable>
<api>business/universal</api>

Loading…
Cancel
Save