diff --git a/src/main/java/com/ynxbd/common/TestA.java b/src/main/java/com/ynxbd/common/TestA.java index f02d312..87b0168 100644 --- a/src/main/java/com/ynxbd/common/TestA.java +++ b/src/main/java/com/ynxbd/common/TestA.java @@ -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"); + } } \ No newline at end of file diff --git a/src/main/java/com/ynxbd/common/action/healthcard/HCPreConsultAction.java b/src/main/java/com/ynxbd/common/action/healthcard/HCPreConsultAction.java index 084a83c..e8389bb 100644 --- a/src/main/java/com/ynxbd/common/action/healthcard/HCPreConsultAction.java +++ b/src/main/java/com/ynxbd/common/action/healthcard/HCPreConsultAction.java @@ -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("[预问诊]报告标记修改失败"); + } + MessagePushConfig.preConsultReportNotify(order); } - return Result.success(ResultEnum.HC_SUCCESS); + 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 dataList = new ArrayList<>(); + List 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("未找到挂号订单"); + } + 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.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.getDiagnosisReportByCaseId(order.getOutTradeNo(), doctCode, doctName, deptCode, deptName); - return Result.success(ResultEnum.HC_SUCCESS, data); + 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 通过 GetPreDiagnosisReportDialogues 接口获取对话记录 + * [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); } diff --git a/src/main/java/com/ynxbd/common/action/pay/PayAction.java b/src/main/java/com/ynxbd/common/action/pay/PayAction.java index c280314..e26560d 100644 --- a/src/main/java/com/ynxbd/common/action/pay/PayAction.java +++ b/src/main/java/com/ynxbd/common/action/pay/PayAction.java @@ -450,21 +450,38 @@ 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); + } + return new RegService().cancelRegister(isRegToday, patientId, tradeNo, hisTransNo); } - @Action("refundRegister") - public Result refundRegister(String hisTransNo) { - return new RegService().refundRegister(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 { // } - } diff --git a/src/main/java/com/ynxbd/common/action/test/TestAction.java b/src/main/java/com/ynxbd/common/action/test/TestAction.java index 8b94b36..63b1b2a 100644 --- a/src/main/java/com/ynxbd/common/action/test/TestAction.java +++ b/src/main/java/com/ynxbd/common/action/test/TestAction.java @@ -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); diff --git a/src/main/java/com/ynxbd/common/bean/HisTransaction.java b/src/main/java/com/ynxbd/common/bean/HisTransaction.java index 2d73318..77c5363 100644 --- a/src/main/java/com/ynxbd/common/bean/HisTransaction.java +++ b/src/main/java/com/ynxbd/common/bean/HisTransaction.java @@ -43,6 +43,7 @@ public class HisTransaction { private String hisPositiveTransNo; // HIS负交易流水号(负的为取消预约) private String hisNegativeTransNo; + // private String hisNegativeDate; // HIS负交易金额 private String hisNegativeMoney; diff --git a/src/main/java/com/ynxbd/common/bean/pay/Register.java b/src/main/java/com/ynxbd/common/bean/pay/Register.java index 613ae91..cad04c1 100644 --- a/src/main/java/com/ynxbd/common/bean/pay/Register.java +++ b/src/main/java/com/ynxbd/common/bean/pay/Register.java @@ -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 { } - - } diff --git a/src/main/java/com/ynxbd/common/dao/PreConsultDao.java b/src/main/java/com/ynxbd/common/dao/PreConsultDao.java index 55e73e2..39b64a2 100644 --- a/src/main/java/com/ynxbd/common/dao/PreConsultDao.java +++ b/src/main/java/com/ynxbd/common/dao/PreConsultDao.java @@ -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 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; + } + + /** * 查询订单号 * diff --git a/src/main/java/com/ynxbd/common/dao/RegisterDao.java b/src/main/java/com/ynxbd/common/dao/RegisterDao.java index 370b365..4fe36f0 100644 --- a/src/main/java/com/ynxbd/common/dao/RegisterDao.java +++ b/src/main/java/com/ynxbd/common/dao/RegisterDao.java @@ -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,8 +553,7 @@ 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=?"; + String sql = "update register set refundResult=?, refundTime=now() where tradeNo=? and outTradeNo=?"; return DataBase.update(sql, ps -> { ps.setString(1, refundMsg); ps.setString(2, tradeNo); diff --git a/src/main/java/com/ynxbd/common/dao/his/HisRegisterDao.java b/src/main/java/com/ynxbd/common/dao/his/HisRegisterDao.java index c2e1980..5640f22 100644 --- a/src/main/java/com/ynxbd/common/dao/his/HisRegisterDao.java +++ b/src/main/java/com/ynxbd/common/dao/his/HisRegisterDao.java @@ -702,10 +702,8 @@ public class HisRegisterDao { /** * 今日挂号-取消挂号 - * - * @return */ - public JsonResult refundRegister(String tradeNo, MerchantEnum merchantEnum) { + public JsonResult refundTodayRegister(String tradeNo, MerchantEnum merchantEnum) { Map 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); + } + /** * 查询患者是否挂过号 * diff --git a/src/main/java/com/ynxbd/common/dao/his/HisTreatDao.java b/src/main/java/com/ynxbd/common/dao/his/HisTreatDao.java index 44fb82a..6915ea4 100644 --- a/src/main/java/com/ynxbd/common/dao/his/HisTreatDao.java +++ b/src/main/java/com/ynxbd/common/dao/his/HisTreatDao.java @@ -36,7 +36,7 @@ public class HisTreatDao { /** - * 根据患者id查询检查报告 + * 创建就诊记录 * * @param treatNum 门诊号 */ diff --git a/src/main/java/com/ynxbd/common/healthcard/HCPreConsultHelper.java b/src/main/java/com/ynxbd/common/healthcard/HCPreConsultHelper.java index 0ebab11..15ba67e 100644 --- a/src/main/java/com/ynxbd/common/healthcard/HCPreConsultHelper.java +++ b/src/main/java/com/ynxbd/common/healthcard/HCPreConsultHelper.java @@ -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 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 data = new HashMap<>(); data.put("partnerId", HCPreConsultConfig.PARTNER_ID); data.put("caseId", registerId); @@ -226,24 +244,181 @@ public class HCPreConsultHelper { Map 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}®isteredid=${registeredid}&departmentId=${departmentId}&doctorId=${doctorId}&subHospitalId=&redirectUrl=" + : "https://aimedical.wecity.qq.com/toolbox/prediagnosis.html?token=${token}®isteredid=${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 data = new HashMap<>(); + data.put("partner_id", HCPreConsultConfig.PARTNER_ID); + data.put("doctor_id", doctorId); + data.put("doctor_name", doctorName); + + Map 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 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 map = new TreeMap<>(); + for (Map.Entry entry : element.getAsJsonObject().entrySet()) { + map.put(entry.getKey(), sortKeys(entry.getValue())); + } + for (Map.Entry 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 params, String appSecret) throws Exception { + List 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); + } } diff --git a/src/main/java/com/ynxbd/common/healthcard/config/HCPreConsultConfig.java b/src/main/java/com/ynxbd/common/healthcard/config/HCPreConsultConfig.java index 177ed22..96595d9 100644 --- a/src/main/java/com/ynxbd/common/healthcard/config/HCPreConsultConfig.java +++ b/src/main/java/com/ynxbd/common/healthcard/config/HCPreConsultConfig.java @@ -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); } diff --git a/src/main/java/com/ynxbd/common/service/MedicalService.java b/src/main/java/com/ynxbd/common/service/MedicalService.java index 01e0767..b3b5b1c 100644 --- a/src/main/java/com/ynxbd/common/service/MedicalService.java +++ b/src/main/java/com/ynxbd/common/service/MedicalService.java @@ -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); } diff --git a/src/main/java/com/ynxbd/common/service/RegService.java b/src/main/java/com/ynxbd/common/service/RegService.java index da24265..68fd785 100644 --- a/src/main/java/com/ynxbd/common/service/RegService.java +++ b/src/main/java/com/ynxbd/common/service/RegService.java @@ -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("支付信息的参数为空"); + 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("[取消挂号]订单信息缺失"); } - if (merchantEnum == null) { - return Result.error("支付方式未匹配 outTradeNo=" + outTradeNo); + if (order.hasRefundByRefundResult()) { + 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; - } - - /** - * 今日挂号[取消预约] - * - * @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("今日挂号支付信息的参数为空"); - } - - 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(); + log.info("{}[取消挂号]开始退款... outTradeNo={}, dbTradeNo={}, payMoney={}", merchantEnum.NAME, outTradeNo, dbTradeNo, payMoney); - 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(); diff --git a/src/main/java/com/ynxbd/wx/config/MessagePushConfig.java b/src/main/java/com/ynxbd/wx/config/MessagePushConfig.java index 2ebe714..c57ae6c 100644 --- a/src/main/java/com/ynxbd/wx/config/MessagePushConfig.java +++ b/src/main/java/com/ynxbd/wx/config/MessagePushConfig.java @@ -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("[推送]预问诊通知-失败:参数缺失"); - return; - } - - String url = HCPreConsultHelper.getH5Online(outTradeNo); - if (ObjectUtils.isEmpty(url)) { - log.warn("[推送]预问诊通知-失败:链接为空[outTradeNo:{}]", outTradeNo); - return; - } - - 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()); + if (!merchantEnum.equals(MerchantEnum.WX)) { + return; } + pushPreConsult(order, "为了帮助医生更全面地了解您的身体情况,请花2分钟时间填写病情信息,以便医生提前了解病症,为您提供更好的诊疗服务。"); } - /** * 预问诊完成通知 */ - public static void preConsultReportNotify(String openId, String patientId, String outTradeNo) { + public static void preConsultReportNotify(Register order) { + pushPreConsult(order, "您好,您的预问诊报告可以查看啦"); + } + + /** + * 预问诊推送 + */ + 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()); } diff --git a/src/main/java/com/ynxbd/wx/utils/DesEncryptHelper.java b/src/main/java/com/ynxbd/wx/utils/DesEncryptHelper.java index 81d9664..3e88a99 100644 --- a/src/main/java/com/ynxbd/wx/utils/DesEncryptHelper.java +++ b/src/main/java/com/ynxbd/wx/utils/DesEncryptHelper.java @@ -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")); } } diff --git a/src/main/java/com/ynxbd/wx/wxfactory/WxFactory.java b/src/main/java/com/ynxbd/wx/wxfactory/WxFactory.java index b79d80b..92aaf21 100644 --- a/src/main/java/com/ynxbd/wx/wxfactory/WxFactory.java +++ b/src/main/java/com/ynxbd/wx/wxfactory/WxFactory.java @@ -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 diff --git a/src/main/java/com/ynxbd/wx/wxfactory/payment/jsapi/Client.java b/src/main/java/com/ynxbd/wx/wxfactory/payment/jsapi/Client.java index d45df3e..f7d817e 100644 --- a/src/main/java/com/ynxbd/wx/wxfactory/payment/jsapi/Client.java +++ b/src/main/java/com/ynxbd/wx/wxfactory/payment/jsapi/Client.java @@ -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; -// } -// -// 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; -// } - } diff --git a/src/main/java/com/ynxbd/wx/wxfactory/payment/query/Client.java b/src/main/java/com/ynxbd/wx/wxfactory/payment/query/Client.java new file mode 100644 index 0000000..b69874c --- /dev/null +++ b/src/main/java/com/ynxbd/wx/wxfactory/payment/query/Client.java @@ -0,0 +1,4 @@ +package com.ynxbd.wx.wxfactory.payment.query; + +public class Client { +} diff --git a/src/main/resources/hc-config.xml b/src/main/resources/hc-config.xml index 05f1ed5..305fe3d 100644 --- a/src/main/resources/hc-config.xml +++ b/src/main/resources/hc-config.xml @@ -62,6 +62,8 @@ true false + false + true 34edf7cd14e646ae9c1bbca791b7b685 b26188e6142d43b88f01453853d52a0a diff --git a/src/main/resources/webservice.xml b/src/main/resources/webservice.xml index aa6ac7b..4686204 100644 --- a/src/main/resources/webservice.xml +++ b/src/main/resources/webservice.xml @@ -1 +1 @@ - false false false false false 127.0.0.1:8888 127.0.0.1:8888 1 200.200.200.60:7777 200.200.200.60:7777 \ No newline at end of file + false false false false false 127.0.0.1:8888 127.0.0.1:8888 1 200.200.200.60:7777 10.20.10.6:8888 \ No newline at end of file diff --git a/src/main/resources/wx-msg-push.xml b/src/main/resources/wx-msg-push.xml index 5b70193..0a96db2 100644 --- a/src/main/resources/wx-msg-push.xml +++ b/src/main/resources/wx-msg-push.xml @@ -17,16 +17,16 @@ AppointmentCancel + + false + ai/preConsultationpost + + false PaymentSuccess - - false - business/universal - - false business/universal