diff --git a/src/main/java/com/ynxbd/ali/config/AliMIConfig.java b/src/main/java/com/ynxbd/ali/config/AliMIConfig.java new file mode 100644 index 0000000..3ee5e3f --- /dev/null +++ b/src/main/java/com/ynxbd/ali/config/AliMIConfig.java @@ -0,0 +1,39 @@ +package com.ynxbd.ali.config; + +import com.ynxbd.common.helper.ProperHelper; +import com.ynxbd.wx.wxfactory.medical.WechatMIConfig; + +// 支付宝医保配置 +public class AliMIConfig { + private AliMIConfig() { + } + + //配置文件读取项 + public static final boolean IS_ENABLE; + + public static final String CITY_CODE; // 城市编码 + public static final String ORG_CHNL_CRTF_CODG; + public static final String ORG_NO; + public static final String ORG_APP_ID; + public static final String ORG_HOSPITAL_NAME; + + public static boolean IS_DEV; + public static boolean IS_AUTO_REFUND; + + static { + ProperHelper config = new ProperHelper().read("medical-ali.properties"); + + IS_ENABLE = config.getBoolean("mi_ali.is_enable", false); + config.setIsEnable(IS_ENABLE); + + IS_DEV = config.getBoolean("mi_ali.is_dev", true); + IS_AUTO_REFUND = config.getBoolean("mi_ali.is_auto_refund", false); + + ORG_NO = config.getString("mi_ali.org_no"); + ORG_APP_ID = config.getString("mi_ali.org_app_id"); + ORG_CHNL_CRTF_CODG = config.getString("mi_ali.org_chnl_crtf_codg"); + ORG_HOSPITAL_NAME = config.getString("mi_ali.org_hospital_name"); + // 相同数据赋值 + CITY_CODE = WechatMIConfig.CITY_CODE; + } +} diff --git a/src/main/java/com/ynxbd/ali/helper/AliMedicalHelper.java b/src/main/java/com/ynxbd/ali/helper/AliMedicalHelper.java index 5127727..ea7e30a 100644 --- a/src/main/java/com/ynxbd/ali/helper/AliMedicalHelper.java +++ b/src/main/java/com/ynxbd/ali/helper/AliMedicalHelper.java @@ -7,15 +7,17 @@ import com.alipay.api.AlipayClient; import com.alipay.api.DefaultAlipayClient; import com.alipay.api.domain.AlipayCommerceMedicalAuthinfoAuthQueryModel; import com.alipay.api.domain.AuthExtendParams; +import com.alipay.api.domain.MedicalNationalPayAuthInfo; import com.alipay.api.request.AlipayCommerceMedicalAuthinfoAuthQueryRequest; import com.alipay.api.request.AlipayTradeAppPayRequest; import com.alipay.api.response.AlipayCommerceMedicalAuthinfoAuthQueryResponse; import com.alipay.api.response.AlipayTradeAppPayResponse; import com.ynxbd.ali.config.AliConfig; +import com.ynxbd.ali.config.AliMIConfig; import com.ynxbd.common.helper.common.DateHelper; import com.ynxbd.common.helper.common.ErrorHelper; +import com.ynxbd.common.helper.common.JsonHelper; import com.ynxbd.wx.wxfactory.bean.OrderMIEnum; -import com.ynxbd.wx.wxfactory.medical.MIConfig; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ObjectUtils; @@ -37,7 +39,7 @@ public class AliMedicalHelper { * @param callUrl 回调地址 * @return */ - public static String queryMIAuth(String openId, String accessToken, String patientName, String patientCardNo, String callUrl) { + public static MedicalNationalPayAuthInfo queryMIAuth(String openId, String accessToken, String patientName, String patientCardNo, String callUrl) { try { // 初始化SDK AlipayClient alipayClient = new DefaultAlipayClient(AliConfig.getAlipayConfig()); @@ -64,11 +66,11 @@ public class AliMedicalHelper { model.setCallUrl(callUrl); // 设置olBizTypeCode=04107(医保移动支付业务)时必传 - model.setOrgAppId(MIConfig.ORG_APP_ID); + model.setOrgAppId(AliMIConfig.ORG_APP_ID); // 设置机构渠道认证编码 - model.setOrgChnlCrtfCode(MIConfig.ORG_CHNL_CRTF_CODG); + model.setOrgChnlCrtfCode(AliMIConfig.ORG_CHNL_CRTF_CODG); // 设置定点医药机构代码 - model.setOrgCode(MIConfig.ORG_NO); + model.setOrgCode(AliMIConfig.ORG_NO); // 设置扩展信息-亲情账户支付场景增加 AuthExtendParams extendParams = new AuthExtendParams(); @@ -92,17 +94,17 @@ public class AliMedicalHelper { // 设置auth_token,同access_token(用户访问令牌) request.putOtherTextParam("auth_token", accessToken); + + log.info("[支付宝]国家医保局线上业务身份核验信息授权查询接口-入参{}", JsonHelper.toJsonString(request)); AlipayCommerceMedicalAuthinfoAuthQueryResponse response = alipayClient.execute(request); - log.info("[支付宝]国家医保局线上业务身份核验信息授权查询接口-返回{}", response.getBody()); + log.info("[支付宝]国家医保局线上业务身份核验信息授权查询接口-调用{} {}", response.isSuccess() ? "[成功]" : "[失败]", response.getBody()); + if (response.isSuccess()) { - System.out.println("调用成功"); - return response.getBody(); - } else { - System.out.println("调用失败"); - // sdk版本是"4.38.0.ALL"及以上,可以参考下面的示例获取诊断链接 - // String diagnosisUrl = DiagnosisUtils.getDiagnosisUrl(response); - // System.out.println(diagnosisUrl); + return response.getData(); } + // sdk版本是"4.38.0.ALL"及以上,可以参考下面的示例获取诊断链接 + // String diagnosisUrl = DiagnosisUtils.getDiagnosisUrl(response); + // System.out.println(diagnosisUrl); } catch (Exception e) { ErrorHelper.println(e); } @@ -130,7 +132,7 @@ public class AliMedicalHelper { * @param familyType 保卡类型"1":”亲情支付“,"0":"本人支付",为空默认本人支付。 * @param familyName 家属姓名(这里不使用) * @param familyCardNo 医保电子凭证授权码 获取线上医保业务授权接口返回medicalCardId参数。"6638aabe-7b4d-4d10-bdf0-b44804da3dab" - * @return + * @return map */ public static Map createOrder(OrderMIEnum orderMIEnum, String openid, String outTradeNo, String payOrdId, String payAuthNo, BigDecimal totalAmount, BigDecimal cashFee, String subject, String notifyUrl, String notifyType, String familyType, String familyName, String familyCardNo) { try { @@ -163,9 +165,9 @@ public class AliMedicalHelper { medicalRequestExt.put("bill_no", payOrdId); // 移动支付中心订单号payOrdId medicalRequestExt.put("pay_auth_no", payAuthNo); // 移动支付中心返回授权编号 获取线上医保业务授权接口返回payAuthNo参数 // - medicalRequestExt.put("org_no", MIConfig.ORG_NO); //医药机构编号 - medicalRequestExt.put("org_name", MIConfig.HOSPITAL_NAME); // 医药机构名称 - medicalRequestExt.put("payment_city_code", MIConfig.CITY_CODE); // 医保结算地城市编码(国标) + medicalRequestExt.put("org_no", AliMIConfig.ORG_NO); // 医药机构编号 + medicalRequestExt.put("org_name", AliMIConfig.ORG_HOSPITAL_NAME); // 医药机构名称 + medicalRequestExt.put("payment_city_code", AliMIConfig.CITY_CODE); // 医保结算地城市编码(国标) // medicalRequestExt.put("industry", "HOSPITAL"); //行业标识 医院:HOSPITAL medicalRequestExt.put("chinfo", "gjydzf"); // 渠道标识-默认为gjydzf diff --git a/src/main/java/com/ynxbd/ali/helper/AliUploadHelper.java b/src/main/java/com/ynxbd/ali/helper/AliUploadHelper.java index da94e07..6a6dd66 100644 --- a/src/main/java/com/ynxbd/ali/helper/AliUploadHelper.java +++ b/src/main/java/com/ynxbd/ali/helper/AliUploadHelper.java @@ -69,7 +69,7 @@ public class AliUploadHelper { public static void uploadDept(List deptList, boolean isReserve) { - if (deptList == null || deptList.size() == 0) { + if (deptList == null || deptList.isEmpty()) { return; } if (!AliConfig.IS_PUSH_MSG) { diff --git a/src/main/java/com/ynxbd/common/action/MedicalInsuranceAction.java b/src/main/java/com/ynxbd/common/action/MedicalInsuranceAction.java index 55819ce..edd1630 100644 --- a/src/main/java/com/ynxbd/common/action/MedicalInsuranceAction.java +++ b/src/main/java/com/ynxbd/common/action/MedicalInsuranceAction.java @@ -2,7 +2,7 @@ package com.ynxbd.common.action; import com.ynxbd.common.action.base.BaseAction; import com.ynxbd.common.bean.HisChronic; -import com.ynxbd.common.dao.his.HisMedicalDao; +import com.ynxbd.common.dao.his.HisMIDao; import com.ynxbd.common.helper.common.JsonHelper; import com.ynxbd.common.result.Result; import org.apache.struts2.convention.annotation.Action; @@ -20,7 +20,7 @@ public class MedicalInsuranceAction extends BaseAction { */ @Action("getBillInfo") public Result getBillInfo(String queryNumType, String queryNumber, String begDate, String endDate) { - return HisMedicalDao.getBillInfo(queryNumType, queryNumber, begDate, endDate); + return HisMIDao.getBillInfo(queryNumType, queryNumber, begDate, endDate); } /** @@ -29,6 +29,6 @@ public class MedicalInsuranceAction extends BaseAction { */ @Action("getChronicList") public Result getChronicList(String idCardNo){ - return Result.success(JsonHelper.parseArray(HisMedicalDao.getChronicList(idCardNo).getDataMapString("DiseaseInfo"), HisChronic.class)); + return Result.success(JsonHelper.parseArray(HisMIDao.getChronicList(idCardNo).getDataMapString("DiseaseInfo"), HisChronic.class)); } } diff --git a/src/main/java/com/ynxbd/common/action/RecipeAction.java b/src/main/java/com/ynxbd/common/action/RecipeAction.java index 42ca233..233adf0 100644 --- a/src/main/java/com/ynxbd/common/action/RecipeAction.java +++ b/src/main/java/com/ynxbd/common/action/RecipeAction.java @@ -170,7 +170,7 @@ public class RecipeAction extends BaseAction { if (treatNum == null || personID == null || recipes == null) { return Result.error(ResultEnum.PARAM_IS_DEFECT); } - return new HisRecipeDao().uploadMedicalRecipe(treatNum, personID, recipes); + return new HisRecipeDao().uploadRxMI(treatNum, personID, recipes); } @@ -189,27 +189,7 @@ public class RecipeAction extends BaseAction { return new HisRecipeDao().queryElectronInvoice(invoiceNo); } -// /** -// * 获取未缴费项目 -// */ -// @Action("getDevUnPayList") -// public Result getDevUnPayList(String patientId, String begDate, String endDate ) { -// log.info("[处方]未缴费项目查询 patientId={}, begDate={}, endDate={}", patientId, begDate, endDate); -// if (patientId == null || begDate == null || endDate == null) { -// return Result.error(ResultEnum.PARAM_IS_DEFECT); -// } -// -// int days = DateHelper.intervalDays(begDate, endDate, true); -// List hisRecipes = new DevHisRecipeDao().getDevUnPayRecipe(patientId, days); -// -// List resultList = new ArrayList<>(); -// for (HisRecipe hisRecipe : hisRecipes) { -// if (hisRecipe.getDate() != null && DateHelper.inDateRange(begDate, endDate, hisRecipe.getDate(), DateHelper.DateEnum.yyyy_MM_dd)) { -// resultList.add(hisRecipe); -// } -// } -// return Result.success(resultList); -// } + /** @@ -382,6 +362,28 @@ public class RecipeAction extends BaseAction { // ErrorHelper.println(e); // } // return Result.error(); +// } + + // /** +// * 获取未缴费项目 +// */ +// @Action("getDevUnPayList") +// public Result getDevUnPayList(String patientId, String begDate, String endDate ) { +// log.info("[处方]未缴费项目查询 patientId={}, begDate={}, endDate={}", patientId, begDate, endDate); +// if (patientId == null || begDate == null || endDate == null) { +// return Result.error(ResultEnum.PARAM_IS_DEFECT); +// } +// +// int days = DateHelper.intervalDays(begDate, endDate, true); +// List hisRecipes = new DevHisRecipeDao().getDevUnPayRecipe(patientId, days); +// +// List resultList = new ArrayList<>(); +// for (HisRecipe hisRecipe : hisRecipes) { +// if (hisRecipe.getDate() != null && DateHelper.inDateRange(begDate, endDate, hisRecipe.getDate(), DateHelper.DateEnum.yyyy_MM_dd)) { +// resultList.add(hisRecipe); +// } +// } +// return Result.success(resultList); // } } diff --git a/src/main/java/com/ynxbd/common/action/XBDAction.java b/src/main/java/com/ynxbd/common/action/XBDAction.java index ae226d2..385c54e 100644 --- a/src/main/java/com/ynxbd/common/action/XBDAction.java +++ b/src/main/java/com/ynxbd/common/action/XBDAction.java @@ -7,6 +7,7 @@ import com.ynxbd.common.bean.enums.MerchantEnum; import com.ynxbd.common.bean.pay.PayCasebook; import com.ynxbd.common.bean.xbd.MRHistory; import com.ynxbd.common.bean.xbd.MedicalRecord; +import com.ynxbd.common.config.interceptor.AesDecode; import com.ynxbd.common.helper.common.Base64Helper; import com.ynxbd.common.helper.common.JsonHelper; import com.ynxbd.common.helper.xbd.XBDEnum; @@ -23,9 +24,6 @@ import org.apache.commons.lang3.ObjectUtils; import org.apache.struts2.convention.annotation.Action; import org.apache.struts2.convention.annotation.Namespace; -import java.util.HashMap; -import java.util.Map; - /** * @author 李进才 * @ClassName XBDAction @@ -62,6 +60,22 @@ public class XBDAction extends BaseAction { } } + + /** + * 获取云胶片的授权地址 + * + * @param patientId 患者id + */ + @Action("pacsAuth") + public Result pacsAuth(Integer version, @AesDecode String patientId, @AesDecode String treatNum, String treatType) { + try { + String url = new XBDService().getPacsAuthUrl(version, patientId, treatNum, treatType); + return Result.success(url); + } catch (Exception e) { + return Result.error(e); + } + } + /** * 获取该病人已归档可以翻拍的病历[红河] * diff --git a/src/main/java/com/ynxbd/common/action/pay/AliPayAction.java b/src/main/java/com/ynxbd/common/action/pay/AliPayAction.java index ad922c5..47863fd 100644 --- a/src/main/java/com/ynxbd/common/action/pay/AliPayAction.java +++ b/src/main/java/com/ynxbd/common/action/pay/AliPayAction.java @@ -1,5 +1,6 @@ package com.ynxbd.common.action.pay; +import com.alipay.api.domain.MedicalNationalPayAuthInfo; import com.ynxbd.ali.helper.AliHelper; import com.ynxbd.ali.helper.AliMedicalHelper; import com.ynxbd.common.action.base.BaseAction; @@ -114,19 +115,19 @@ public class AliPayAction extends BaseAction { } /** - * [支付宝]授权查询 + * [支付宝]医保授权查询 * * @return 是否成功 */ @Action("queryMIAuth") public Result queryMIAuth(String openid, String accessToken, String patientName, String patientCardNo, String callUrl) { log.info("[支付宝][医保]授权查询 openid={}, accessToken={}, patientName={}, patientCardNo={}, callUrl={}", openid, accessToken, patientName, patientCardNo, callUrl); - String data = AliMedicalHelper.queryMIAuth(openid, accessToken, patientName, patientCardNo, callUrl); - log.info("[支付宝][医保]授权查询 body={}", data); - if (data == null) { + MedicalNationalPayAuthInfo dataInfo = AliMedicalHelper.queryMIAuth(openid, accessToken, patientName, patientCardNo, callUrl); + log.info("[支付宝][医保]授权查询 {}", JsonHelper.toJsonString(dataInfo)); + if (dataInfo == null) { return Result.error("授权查询失败"); } - return Result.success(data); + return Result.success(dataInfo); } // /** diff --git a/src/main/java/com/ynxbd/common/action/pay/MedicalAction.java b/src/main/java/com/ynxbd/common/action/pay/MedicalAction.java index 2d314b1..1ddd9bd 100644 --- a/src/main/java/com/ynxbd/common/action/pay/MedicalAction.java +++ b/src/main/java/com/ynxbd/common/action/pay/MedicalAction.java @@ -7,7 +7,7 @@ import com.ynxbd.common.bean.pay.Order; import com.ynxbd.common.bean.pay.Recipe; import com.ynxbd.common.bean.pay.Register; import com.ynxbd.common.dao.RecipeDao; -import com.ynxbd.common.dao.his.HisMedicalDao; +import com.ynxbd.common.dao.his.HisMIDao; import com.ynxbd.common.helper.common.AesMicroHelper; import com.ynxbd.common.helper.common.Base64Helper; import com.ynxbd.common.helper.common.DateHelper; @@ -20,7 +20,7 @@ import com.ynxbd.common.service.MedicalService; import com.ynxbd.common.service.params.RequestParams; import com.ynxbd.wx.wxfactory.*; import com.ynxbd.wx.wxfactory.bean.*; -import com.ynxbd.wx.wxfactory.medical.MIConfig; +import com.ynxbd.wx.wxfactory.medical.WechatMIConfig; import com.ynxbd.wx.wxfactory.utils.MdRespHelper; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ObjectUtils; @@ -118,7 +118,7 @@ public class MedicalAction extends BaseAction { @Action("medicalAuth") public Result medicalAuth(String openid, String qrCode) { log.info("[医保建档] openid-{},qrCode={}", openid, qrCode); - MedicalUserInfo info = WxFactory.Medical.Common().getUserInfo(MIConfig.PARTNER_URL, openid, qrCode); + MedicalUserInfo info = WxFactory.Medical.Common().getUserInfo(WechatMIConfig.PARTNER_URL, openid, qrCode); log.info("[医保建档获取用户信息] resp-{}", info); return Result.success(info); } @@ -286,11 +286,15 @@ public class MedicalAction extends BaseAction { /** - * HIS查询医保对账记录 + * 查询HIS医保对账记录 */ @Action("getHisAccountsInfo") - public Result getHisAccountsInfo(String mdUserId) { - JsonResult jsonResult = HisMedicalDao.getMedicalAccounts(mdUserId); + public Result getHisAccountsInfo(String payCode, String mdUserId) { + MerchantEnum merchantEnum = MerchantEnum.findEnumByCode(payCode); + if (merchantEnum == null) { + return Result.error(ResultEnum.PAY_TYPE_ERROR); + } + JsonResult jsonResult = HisMIDao.getMIAccounts(merchantEnum, mdUserId); return Result.success(jsonResult); } @@ -336,9 +340,9 @@ public class MedicalAction extends BaseAction { public Result payNotify() { try { log.info("[微信][医保]回调通知..."); - MedicalNotify notifyInfo = WxMedicalHelper.medicalPayNotify(request); + MedicalNotify notifyInfo = WxMedicalHelper.paidMINotify(request); // 成功返回 - Result.respXml(MdRespHelper.respOk(MIConfig.PAY_KEY)); + Result.respXml(MdRespHelper.respOk(WechatMIConfig.PAY_KEY)); String openid = notifyInfo.getOpenid(); String bankTransNo = notifyInfo.getMedTransId(); @@ -356,7 +360,7 @@ public class MedicalAction extends BaseAction { new MedicalService().commonNotify(MerchantEnum.WX_MEDICAL, notifyType, outTradeNo, totalFee, bankTransNo, payDate, payTime, openid, payInfo); return null; } catch (ServiceException e) { - return Result.respXml(MdRespHelper.resp(e, MIConfig.PAY_KEY)); + return Result.respXml(MdRespHelper.resp(e, WechatMIConfig.PAY_KEY)); } } diff --git a/src/main/java/com/ynxbd/common/action/pay/MedicalTestAction.java b/src/main/java/com/ynxbd/common/action/pay/MedicalTestAction.java index 69a91fe..5b5081b 100644 --- a/src/main/java/com/ynxbd/common/action/pay/MedicalTestAction.java +++ b/src/main/java/com/ynxbd/common/action/pay/MedicalTestAction.java @@ -9,7 +9,7 @@ import com.ynxbd.common.result.ResultEnum; import com.ynxbd.common.service.RecipeService; import com.ynxbd.wx.wxfactory.WxMedicalHelper; import com.ynxbd.wx.wxfactory.bean.MedicalOrder; -import com.ynxbd.wx.wxfactory.medical.MIConfig; +import com.ynxbd.wx.wxfactory.medical.WechatMIConfig; import lombok.extern.slf4j.Slf4j; import org.apache.struts2.convention.annotation.Action; import org.apache.struts2.convention.annotation.Namespace; @@ -37,7 +37,7 @@ public class MedicalTestAction extends BaseAction { return Result.error(ResultEnum.PARAM_IS_DEFECT); } - if (!MIConfig.IS_DEV) { + if (!WechatMIConfig.IS_DEV) { return Result.error("环境错误"); } @@ -65,7 +65,7 @@ public class MedicalTestAction extends BaseAction { return Result.error(ResultEnum.PARAM_IS_DEFECT); } - if (!MIConfig.IS_DEV) { + if (!WechatMIConfig.IS_DEV) { return Result.error("环境错误"); } List hisRecipeList = HisMedicalTestDao.devPaidRecipeList(patientId, begDate, endDate); 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 fd61215..ce1cf35 100644 --- a/src/main/java/com/ynxbd/common/action/test/TestAction.java +++ b/src/main/java/com/ynxbd/common/action/test/TestAction.java @@ -8,7 +8,7 @@ import com.ynxbd.common.result.Result; import com.ynxbd.common.result.ResultEnum; import com.ynxbd.common.result.ServiceException; import com.ynxbd.wx.wxfactory.WxMedicalHelper; -import com.ynxbd.wx.wxfactory.medical.MIConfig; +import com.ynxbd.wx.wxfactory.medical.WechatMIConfig; import lombok.extern.slf4j.Slf4j; import org.apache.struts2.convention.annotation.Action; import org.apache.struts2.convention.annotation.Namespace; @@ -74,7 +74,7 @@ public class TestAction extends BaseAction { @Action("test03") public Result test03() throws ServiceException { - System.out.println("开关" + MIConfig.IS_AUTO_REFUND); + System.out.println("开关" + WechatMIConfig.IS_AUTO_REFUND); log.info("日志测试"); System.out.println(System.getProperty("fileEncoding")); System.out.println(System.getProperty("encoding")); diff --git a/src/main/java/com/ynxbd/common/bean/enums/MerchantEnum.java b/src/main/java/com/ynxbd/common/bean/enums/MerchantEnum.java index 771496b..e04a98a 100644 --- a/src/main/java/com/ynxbd/common/bean/enums/MerchantEnum.java +++ b/src/main/java/com/ynxbd/common/bean/enums/MerchantEnum.java @@ -1,5 +1,7 @@ package com.ynxbd.common.bean.enums; +import com.ynxbd.ali.config.AliMIConfig; +import com.ynxbd.wx.wxfactory.medical.WechatMIConfig; import lombok.ToString; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ObjectUtils; @@ -19,32 +21,42 @@ import java.util.List; public enum MerchantEnum { // 支付宝 - ALI("ali", "【支付宝】", "3", + ALI("ali", "【支付宝】", + false, + "3", "25,26,27,28,29,30", "ali_pay/notify", "", "10", "11", "12"), // 微信 - WX("wx", "【微信】", "4", + WX("wx", "【微信】", + false, + "4", "10,11,12,13,14,15", "wx_pay/apiNotify", "wx_pay/nativeNotify", "0", "1", "2"), - BCM("bcm", "【交行】", "4", + BCM("bcm", "【交行】", + false, + "4", "", "bcm_pay/notify", "", "20", "21", "22"), - WX_MEDICAL("wx_medical", "【微信医保】", "4", + WX_MEDICAL("wx_medical", "【微信医保】", + WechatMIConfig.IS_DEV, + "4", "10,11,12,13,14,15", "medical/payNotify", "", "0", "1", "2"), - ALI_MEDICAL("ali_medical", "【支付宝医保】", "3", + ALI_MEDICAL("ali_medical", "【支付宝医保】", + AliMIConfig.IS_DEV, + "3", "25,26,27,28,29,30", "ali_pay/medical_notify", "", @@ -56,6 +68,8 @@ public enum MerchantEnum { public final String NAME; + public final boolean IS_DEV; + public final String HIS_PAY_WAY; // 条码规则 public final String BAR_CODE_RULES; @@ -70,9 +84,10 @@ public enum MerchantEnum { // 盒子支付代码 public final String PAY_WAY_MICRO; - MerchantEnum(String CODE, String NAME, String HIS_PAY_WAY, String BAR_CODE_RULES, String NOTIFY_URL, String QR_NOTIFY_URL, String PAY_WAY_IN, String PAY_WAY_QR, String PAY_WAY_MICRO) { + MerchantEnum(String CODE, String NAME, boolean IS_DEV, String HIS_PAY_WAY, String BAR_CODE_RULES, String NOTIFY_URL, String QR_NOTIFY_URL, String PAY_WAY_IN, String PAY_WAY_QR, String PAY_WAY_MICRO) { this.CODE = CODE; this.NAME = NAME; + this.IS_DEV = IS_DEV; this.HIS_PAY_WAY = HIS_PAY_WAY; this.BAR_CODE_RULES = BAR_CODE_RULES; this.NOTIFY_URL = NOTIFY_URL; diff --git a/src/main/java/com/ynxbd/common/dao/his/HisMedicalDao.java b/src/main/java/com/ynxbd/common/dao/his/HisMIDao.java similarity index 81% rename from src/main/java/com/ynxbd/common/dao/his/HisMedicalDao.java rename to src/main/java/com/ynxbd/common/dao/his/HisMIDao.java index 5b73768..16e7559 100644 --- a/src/main/java/com/ynxbd/common/dao/his/HisMedicalDao.java +++ b/src/main/java/com/ynxbd/common/dao/his/HisMIDao.java @@ -1,284 +1,285 @@ -package com.ynxbd.common.dao.his; - -import com.alibaba.fastjson.JSONArray; -import com.ynxbd.common.bean.enums.MerchantEnum; -import com.ynxbd.common.bean.pay.Recipe; -import com.ynxbd.common.bean.pay.Register; -import com.ynxbd.common.helper.common.CodeHelper; -import com.ynxbd.common.helper.common.DateHelper; -import com.ynxbd.common.helper.common.JsonHelper; -import com.ynxbd.common.helper.his.HisEnum; -import com.ynxbd.common.helper.his.HisHelper; -import com.ynxbd.common.result.JsonResult; -import com.ynxbd.common.result.Result; -import com.ynxbd.common.result.ResultEnum; -import com.ynxbd.wx.wxfactory.bean.MedicalInfo; -import org.apache.commons.lang3.ObjectUtils; - -import java.math.BigDecimal; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class HisMedicalDao { - - /** - * [医保处方]上传明细(请求地址不通) - * - * @param payAuthNo 授权码 - * @param patientId 患者ID - * @param cardNo 卡号 - * @param treatNum 治疗号 - * @param recipeJson 处方json - * @param totalFee 总金额 - */ - public static JsonResult recipeMdUploadFeeDetails(String payAuthNo, String cardNo, String openid, String patientId, String treatNum, String recipeJson, BigDecimal totalFee, String ybAttrib, String ybBZCode, String ybBZName) { - List recipeList = JsonHelper.parseArray(recipeJson, Recipe.class); - if (recipeList == null || recipeList.isEmpty()) { - return HisHelper.createErrorResult("处方数量为 0 或 数据转换失败"); - } - - StringBuilder recipeIdsXml = new StringBuilder(); - for (Recipe item : recipeList) { - recipeIdsXml.append("").append(item.getRecipeId()).append(""); - } - Map params = new HashMap<>(); - params.put("PatientID", patientId); - params.put("MZNum", treatNum); - params.put("Recipe", recipeIdsXml.toString()); - params.put("PayMoney", totalFee); - params.put("PayDate", DateHelper.getCurDate()); - params.put("PayTime", DateHelper.getCurTime()); - params.put("TransNo", CodeHelper.get32UUID()); - params.put("PayWay", "4"); - // 医保----------------------------------- - params.put("PayAuthNo", payAuthNo); - params.put("PersonID", cardNo); - if (ObjectUtils.isNotEmpty(ybAttrib) && ObjectUtils.isNotEmpty(ybBZCode) && ObjectUtils.isNotEmpty(ybBZName)) { - params.put("YBAttrib", ybAttrib); - params.put("YBBZCode", ybBZCode); - params.put("YBBZName", ybBZName); - } - return HisHelper.getMdJsonResult(HisEnum.AP_Pay_Invoice, params); - } - - /** - * [医保]获取该病人的慢病列表 - * - * @param idCardNo 身份证号 - */ - public static JsonResult getChronicList(String idCardNo) { - return HisHelper.getMdJsonResult(HisEnum.YDZF_QueryDiseaseInfo, params -> { - params.put("CallNo", HisHelper.CALL_NO); - params.put("IDCardNo", idCardNo); - }); - } - - /** - * [医保挂号]分时段挂号 - */ - public static JsonResult regTimeMdUploadFeeDetails(Register reg, String payAuthNo, String cardNo, MerchantEnum merchantEnum, Boolean isSplitTime) { - if (isSplitTime) { - return HisHelper.getMdJsonResult(HisEnum.AP_Regist_New, params -> { - params.put("PatientID", reg.getPatientId()); - params.put("PayMoney", reg.getPayMoney()); - - params.put("DeptCode", reg.getDeptCode()); - params.put("DoctCode", reg.getDoctCode()); - - params.put("SourceId", reg.getSourceId()); - params.put("TimeInterval", reg.getTid()); - params.put("BegTime", reg.getBegTime()); - params.put("EndTime", reg.getEndTime()); - params.put("RegistCode", reg.getRegCode()); - params.put("RegistDate", reg.getRegDate()); - - - params.put("PayDate", DateHelper.getCurDate()); - params.put("PayTime", DateHelper.getCurTime()); - params.put("TransNo", CodeHelper.get32UUID()); - params.put("PayWay", merchantEnum.HIS_PAY_WAY); - if (!ObjectUtils.isEmpty(reg.getSubDeptCode())) { - params.put("DeptCode_YZKCode", reg.getSubDeptCode()); // 亚专科code - } - - // 医保----------------------------------- - params.put("PayAuthNo", payAuthNo); - params.put("PersonID", cardNo); - }); - } - // 非分时段挂号 医保支付 - return HisHelper.getMdJsonResult(HisEnum.AP_Regist, params -> { - params.put("PatientID", reg.getPatientId()); - params.put("PayMoney", reg.getPayMoney()); - params.put("DeptCode", reg.getDeptCode()); - params.put("DoctCode", reg.getDoctCode()); - params.put("ClinicCode", reg.getClinicCode()); - params.put("TID", reg.getTid()); - params.put("RegFee", reg.getRegFee()); - params.put("ClinicFee", reg.getClinicFee()); - params.put("PayDate", DateHelper.getCurDate()); - params.put("PayTime", DateHelper.getCurTime()); - params.put("TransNo", CodeHelper.get32UUID()); - params.put("PayDeviceID", reg.getPayDeviceId()); - params.put("BankTransNo", reg.getBankTransNo()); - params.put("PayWay", merchantEnum.HIS_PAY_WAY); - if (!ObjectUtils.isEmpty(reg.getSubDeptCode())) { - params.put("DeptCode_YZKCode", reg.getSubDeptCode()); // 亚专科code - } - - // 医保----------------------------------- - params.put("PayAuthNo", payAuthNo); - params.put("PersonID", cardNo); - }); - } - - - /** - * HIS医保结算 - * - * @param mdUserId 医保用户ID - * @param cashFee 现金 - * @param payDate 支付日期 - * @param payTime 支付实际 - * @param transNo HIS交易流水号 - * @param bankTransNo HIS流水号 - */ - public static JsonResult regMdPay(String mdUserId, String payDate, String payTime, String transNo, String bankTransNo, BigDecimal cashFee) { - return HisHelper.getMdJsonResult(HisEnum.Medical_PAY, params -> { - params.put("UserID_YBZF", mdUserId); - params.put("PayMoney", cashFee); - params.put("PayDate", payDate); - params.put("PayTime", payTime); - params.put("TransNo", transNo); - params.put("BankTransNo", bankTransNo); - params.put("PayWay", "4"); - params.put("PayDeviceID", "mobile"); - }); - - } - - - /** - * [医保]HIS调用支付下单 - * - * @param mdInfo 医保下单对象 - */ - public static JsonResult mdPlaceOrder(MedicalInfo mdInfo) { - return HisHelper.getMdJsonResult(HisEnum.Medical_PayOrders, params -> { - // 授权码 - params.put("PayAuthNo", mdInfo.getPayAuthNo()); - // 授权token - params.put("PayToken", mdInfo.getPayToken()); - // 订单id - params.put("PayOrdId", mdInfo.getPayOrdId()); - params.put("MdtrtId", mdInfo.getMdTrtId()); - params.put("ChrgBchno", mdInfo.getChrgBchno()); - params.put("UserID_YBZF", mdInfo.getMdUserId()); - }); - } - - - /** - * 医保退费(需先退医保,才能再退现金) - * - * @param payAuthNo 用户授权码 - * @param fpNum 发票号(上传费用明细返回的 chrgBchno ,把第一位“M” 过滤后传入) - */ - // * @param refundType 退款类型(ALL:全部,CASH:只退现金 HI:只退医保) - public static JsonResult mdRefund(String payAuthNo, String fpNum, String bankTransNo, String refundTradeNo, BigDecimal cashFee) { - return HisHelper.getMdJsonResult(HisEnum.Medical_Refund, params -> { - params.put("PayAuthNo", payAuthNo); // AUTH530100202206291132200000008 - params.put("FPNum", fpNum); - params.put("PayWay", "4"); - params.put("BankTransNo", bankTransNo); - params.put("TransNo", refundTradeNo); - params.put("PayDeviceID", "mobile"); - params.put("PayMoney", cashFee); - }); - } - - - /** - * HIS医保结算 - * - * @param mdUserId 医保用户ID - * @param cashFee 现金 - * @param payDate 支付日期 - * @param payTime 支付实际 - * @param transNo HIS交易流水号 - * @param bankTransNo HIS流水号 - */ - public static JsonResult mdRecipePay(String mdUserId, String payDate, String payTime, String transNo, String bankTransNo, BigDecimal cashFee) { - return HisHelper.getMdJsonResult(HisEnum.Medical_PAY, params -> { - params.put("UserID_YBZF", mdUserId); - params.put("PayMoney", cashFee); - params.put("PayDate", payDate); - params.put("PayTime", payTime); - params.put("TransNo", transNo); - params.put("BankTransNo", bankTransNo); - params.put("PayWay", "4"); - params.put("PayDeviceID", "mobile"); - }); - } - - - /** - * [医保]查询医保订单结算信息 - * - * @param mdUserId 医保用户ID - *

- * StatusCode值域: - * 0 : 已保存 - * 1 : 预结算完成 - * 2 : 结算中 - * 3 : 自费完成 - * 4 : 医保支付完成 - * 5 : 院内结算完成 - * 6 : 结算完成 - * 7 : 已退款 - * 8 : 已医保全部退款 - * 9 : 仅自费全部退款 - * 10 : 仅自费部分退款 - * 11 : 医保全部退自费部分退款 - * 12 : 已撤销 - * 13 : 医保已撤销 - * 14 : 异常 - * 15 : 结算失败 - * -1 : 状态未知 - */ - public static JsonResult getMedicalAccounts(String mdUserId) { - return HisHelper.getMdJsonResult(HisEnum.Medical_QueryOrderStatus, params -> { - params.put("UserID_YBZF", mdUserId); - }); - } - - - /** - * HIS医保结算信息查询 - * - * @param queryNumType 类型 - * @param queryNumber 查询号码 - * @param begDate 开始日期 - * @param endDate 结束日期 - * @return 结果 - */ - public static Result getBillInfo(String queryNumType, String queryNumber, String begDate, String endDate) { - if (ObjectUtils.isEmpty(queryNumType) || ObjectUtils.isEmpty(queryNumber) || ObjectUtils.isEmpty(begDate) || ObjectUtils.isEmpty(endDate)) { - return Result.error(ResultEnum.PARAM_IS_DEFECT); - } - - JsonResult JsonResult = HisHelper.getMdJsonResult(HisEnum.Medical_Insurance_Bill, params -> { - params.put("QueryNumType", queryNumType); - params.put("QueryNumber", queryNumber); - params.put("BegDate", begDate); - params.put("EndDate", endDate); - }); - if (JsonResult.success()) { - JSONArray resultList = JsonResult.getJsonArray("SettlementInfo", "Item"); - return Result.success(resultList); - } - return Result.error(JsonResult.getMessage()); - } - -} +package com.ynxbd.common.dao.his; + +import com.alibaba.fastjson.JSONArray; +import com.ynxbd.common.bean.enums.MerchantEnum; +import com.ynxbd.common.bean.pay.Recipe; +import com.ynxbd.common.bean.pay.Register; +import com.ynxbd.common.helper.common.CodeHelper; +import com.ynxbd.common.helper.common.DateHelper; +import com.ynxbd.common.helper.common.JsonHelper; +import com.ynxbd.common.helper.his.HisEnum; +import com.ynxbd.common.helper.his.HisHelper; +import com.ynxbd.common.helper.his.HisMIHelper; +import com.ynxbd.common.result.JsonResult; +import com.ynxbd.common.result.Result; +import com.ynxbd.common.result.ResultEnum; +import com.ynxbd.wx.wxfactory.bean.MedicalInfo; +import org.apache.commons.lang3.ObjectUtils; + +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +// HIS医保接口 +public class HisMIDao { + + /** + * [医保处方]上传明细(请求地址不通) + * + * @param payAuthNo 授权码 + * @param patientId 患者ID + * @param cardNo 卡号 + * @param treatNum 治疗号 + * @param recipeJson 处方json + * @param totalFee 总金额 + */ + public static JsonResult rxMIUploadFeeDetails(MerchantEnum merchantEnum, String payAuthNo, String cardNo, String openid, String patientId, String treatNum, String recipeJson, BigDecimal totalFee, String ybAttrib, String ybBZCode, String ybBZName) { + List recipeList = JsonHelper.parseArray(recipeJson, Recipe.class); + if (recipeList == null || recipeList.isEmpty()) { + return HisHelper.createErrorResult("处方数量为 0 或 数据转换失败"); + } + + StringBuilder recipeIdsXml = new StringBuilder(); + for (Recipe item : recipeList) { + recipeIdsXml.append("").append(item.getRecipeId()).append(""); + } + Map params = new HashMap<>(); + params.put("PatientID", patientId); + params.put("MZNum", treatNum); + params.put("Recipe", recipeIdsXml.toString()); + params.put("PayMoney", totalFee); + params.put("PayDate", DateHelper.getCurDate()); + params.put("PayTime", DateHelper.getCurTime()); + params.put("TransNo", CodeHelper.get32UUID()); + params.put("PayWay", "4"); + // 医保----------------------------------- + params.put("PayAuthNo", payAuthNo); + params.put("PersonID", cardNo); + if (ObjectUtils.isNotEmpty(ybAttrib) && ObjectUtils.isNotEmpty(ybBZCode) && ObjectUtils.isNotEmpty(ybBZName)) { + params.put("YBAttrib", ybAttrib); + params.put("YBBZCode", ybBZCode); + params.put("YBBZName", ybBZName); + } + return HisMIHelper.getJsonResult(merchantEnum.IS_DEV, HisEnum.AP_Pay_Invoice, params); + } + + + /** + * [医保挂号]分时段挂号 + */ + public static JsonResult regMIUploadFeeDetails(MerchantEnum merchantEnum, Register reg, String payAuthNo, String cardNo, Boolean isSplitTime) { + if (isSplitTime) { + return HisMIHelper.getJsonResult(merchantEnum.IS_DEV, HisEnum.AP_Regist_New, params -> { + params.put("PatientID", reg.getPatientId()); + params.put("PayMoney", reg.getPayMoney()); + + params.put("DeptCode", reg.getDeptCode()); + params.put("DoctCode", reg.getDoctCode()); + + params.put("SourceId", reg.getSourceId()); + params.put("TimeInterval", reg.getTid()); + params.put("BegTime", reg.getBegTime()); + params.put("EndTime", reg.getEndTime()); + params.put("RegistCode", reg.getRegCode()); + params.put("RegistDate", reg.getRegDate()); + + + params.put("PayDate", DateHelper.getCurDate()); + params.put("PayTime", DateHelper.getCurTime()); + params.put("TransNo", CodeHelper.get32UUID()); + params.put("PayWay", merchantEnum.HIS_PAY_WAY); + if (!ObjectUtils.isEmpty(reg.getSubDeptCode())) { + params.put("DeptCode_YZKCode", reg.getSubDeptCode()); // 亚专科code + } + + // 医保----------------------------------- + params.put("PayAuthNo", payAuthNo); + params.put("PersonID", cardNo); + }); + } + // 非分时段挂号 医保支付 + return HisMIHelper.getJsonResult(merchantEnum.IS_DEV, HisEnum.AP_Regist, params -> { + params.put("PatientID", reg.getPatientId()); + params.put("PayMoney", reg.getPayMoney()); + params.put("DeptCode", reg.getDeptCode()); + params.put("DoctCode", reg.getDoctCode()); + params.put("ClinicCode", reg.getClinicCode()); + params.put("TID", reg.getTid()); + params.put("RegFee", reg.getRegFee()); + params.put("ClinicFee", reg.getClinicFee()); + params.put("PayDate", DateHelper.getCurDate()); + params.put("PayTime", DateHelper.getCurTime()); + params.put("TransNo", CodeHelper.get32UUID()); + params.put("PayDeviceID", reg.getPayDeviceId()); + params.put("BankTransNo", reg.getBankTransNo()); + params.put("PayWay", merchantEnum.HIS_PAY_WAY); + if (!ObjectUtils.isEmpty(reg.getSubDeptCode())) { + params.put("DeptCode_YZKCode", reg.getSubDeptCode()); // 亚专科code + } + + // 医保----------------------------------- + params.put("PayAuthNo", payAuthNo); + params.put("PersonID", cardNo); + }); + } + + + /** + * HIS医保结算 + * + * @param mdUserId 医保用户ID + * @param cashFee 现金 + * @param payDate 支付日期 + * @param payTime 支付实际 + * @param transNo HIS交易流水号 + * @param bankTransNo HIS流水号 + */ + public static JsonResult regMIPay(MerchantEnum merchantEnum, String mdUserId, String payDate, String payTime, String transNo, String bankTransNo, BigDecimal cashFee) { + return HisMIHelper.getJsonResult(merchantEnum.IS_DEV, HisEnum.Medical_PAY, params -> { + params.put("UserID_YBZF", mdUserId); + params.put("PayMoney", cashFee); + params.put("PayDate", payDate); + params.put("PayTime", payTime); + params.put("TransNo", transNo); + params.put("BankTransNo", bankTransNo); + params.put("PayWay", "4"); + params.put("PayDeviceID", "mobile"); + }); + + } + + /** + * [医保]HIS调用支付下单 + * + * @param mdInfo 医保下单对象 + */ + public static JsonResult placeMIOrder(MerchantEnum merchantEnum, MedicalInfo mdInfo) { + return HisMIHelper.getJsonResult(merchantEnum.IS_DEV, HisEnum.Medical_PayOrders, params -> { + // 授权码 + params.put("PayAuthNo", mdInfo.getPayAuthNo()); + // 授权token + params.put("PayToken", mdInfo.getPayToken()); + // 订单id + params.put("PayOrdId", mdInfo.getPayOrdId()); + params.put("MdtrtId", mdInfo.getMdTrtId()); + params.put("ChrgBchno", mdInfo.getChrgBchno()); + params.put("UserID_YBZF", mdInfo.getMdUserId()); + }); + } + + /** + * HIS医保结算 + * + * @param mdUserId 医保用户ID + * @param cashFee 现金 + * @param payDate 支付日期 + * @param payTime 支付实际 + * @param transNo HIS交易流水号 + * @param bankTransNo HIS流水号 + */ + public static JsonResult rxMIPay(MerchantEnum merchantEnum, String mdUserId, String payDate, String payTime, String transNo, String bankTransNo, BigDecimal cashFee) { + return HisMIHelper.getJsonResult(merchantEnum.IS_DEV, HisEnum.Medical_PAY, params -> { + params.put("UserID_YBZF", mdUserId); + params.put("PayMoney", cashFee); + params.put("PayDate", payDate); + params.put("PayTime", payTime); + params.put("TransNo", transNo); + params.put("BankTransNo", bankTransNo); + params.put("PayWay", "4"); + params.put("PayDeviceID", "mobile"); + }); + } + + + /** + * 医保退费(需先退医保,才能再退现金) + * + * @param payAuthNo 用户授权码 + * @param fpNum 发票号(上传费用明细返回的 chrgBchno ,把第一位“M” 过滤后传入) + */ + // * @param refundType 退款类型(ALL:全部,CASH:只退现金 HI:只退医保) + public static JsonResult miRefund(MerchantEnum merchantEnum, String payAuthNo, String fpNum, String bankTransNo, String refundTradeNo, BigDecimal cashFee) { + return HisMIHelper.getJsonResult(merchantEnum.IS_DEV, HisEnum.Medical_Refund, params -> { + params.put("PayAuthNo", payAuthNo); // AUTH530100202206291132200000008 + params.put("FPNum", fpNum); + params.put("PayWay", "4"); + params.put("BankTransNo", bankTransNo); + params.put("TransNo", refundTradeNo); + params.put("PayDeviceID", "mobile"); + params.put("PayMoney", cashFee); + }); + } + + + /** + * [医保]查询医保订单结算信息 + * + * @param mdUserId 医保用户ID + *

+ * StatusCode值域: + * 0 : 已保存 + * 1 : 预结算完成 + * 2 : 结算中 + * 3 : 自费完成 + * 4 : 医保支付完成 + * 5 : 院内结算完成 + * 6 : 结算完成 + * 7 : 已退款 + * 8 : 已医保全部退款 + * 9 : 仅自费全部退款 + * 10 : 仅自费部分退款 + * 11 : 医保全部退自费部分退款 + * 12 : 已撤销 + * 13 : 医保已撤销 + * 14 : 异常 + * 15 : 结算失败 + * -1 : 状态未知 + */ + public static JsonResult getMIAccounts(MerchantEnum merchantEnum, String mdUserId) { + return HisMIHelper.getJsonResult(merchantEnum.IS_DEV, HisEnum.Medical_QueryOrderStatus, params -> { + params.put("UserID_YBZF", mdUserId); + }); + } + + + /** + * HIS医保结算信息查询 + * + * @param queryNumType 类型 + * @param queryNumber 查询号码 + * @param begDate 开始日期 + * @param endDate 结束日期 + * @return 结果 + */ + public static Result getBillInfo(String queryNumType, String queryNumber, String begDate, String endDate) { + if (ObjectUtils.isEmpty(queryNumType) || ObjectUtils.isEmpty(queryNumber) || ObjectUtils.isEmpty(begDate) || ObjectUtils.isEmpty(endDate)) { + return Result.error(ResultEnum.PARAM_IS_DEFECT); + } + + JsonResult JsonResult = HisMIHelper.getJsonResult(HisMIHelper.IS_PROD, HisEnum.Medical_Insurance_Bill, params -> { + params.put("QueryNumType", queryNumType); + params.put("QueryNumber", queryNumber); + params.put("BegDate", begDate); + params.put("EndDate", endDate); + }); + if (JsonResult.success()) { + JSONArray resultList = JsonResult.getJsonArray("SettlementInfo", "Item"); + return Result.success(resultList); + } + return Result.error(JsonResult.getMessage()); + } + + /** + * [医保]获取该病人的慢病列表 + * + * @param idCardNo 身份证号 + */ + public static JsonResult getChronicList(String idCardNo) { + return HisMIHelper.getJsonResult(HisMIHelper.IS_PROD, HisEnum.YDZF_QueryDiseaseInfo, params -> { + params.put("CallNo", HisHelper.CALL_NO); + params.put("IDCardNo", idCardNo); + }); + } + +} diff --git a/src/main/java/com/ynxbd/common/dao/his/HisMedicalTestDao.java b/src/main/java/com/ynxbd/common/dao/his/HisMedicalTestDao.java index 9029941..81cbb1d 100644 --- a/src/main/java/com/ynxbd/common/dao/his/HisMedicalTestDao.java +++ b/src/main/java/com/ynxbd/common/dao/his/HisMedicalTestDao.java @@ -3,6 +3,7 @@ package com.ynxbd.common.dao.his; import com.ynxbd.common.bean.HisRecipe; import com.ynxbd.common.helper.his.HisEnum; import com.ynxbd.common.helper.his.HisHelper; +import com.ynxbd.common.helper.his.HisMIHelper; import com.ynxbd.common.result.JsonResult; import java.util.ArrayList; @@ -21,10 +22,10 @@ public class HisMedicalTestDao { public static List devUnPayList(String patientId, int days) { List resultList = new ArrayList<>(); - JsonResult jsonResult = HisHelper.getMdJsonResult(HisEnum.AP_Query_UnPay_Invoice, params -> { + JsonResult jsonResult = HisMIHelper.getJsonResult(HisMIHelper.IS_DEV, HisEnum.AP_Query_UnPay_Invoice, params -> { params.put("PatientID", patientId); params.put("IsLastWeekFlag", days <= 7 ? "1" : ""); - params.put("CallNo",HisHelper.CALL_NO); + params.put("CallNo", HisHelper.CALL_NO); }); if (!jsonResult.success()) { // 失败 @@ -39,7 +40,6 @@ public class HisMedicalTestDao { } - /** * 根据患者id查询已缴费项目 * @@ -56,7 +56,7 @@ public class HisMedicalTestDao { params.put("RecipeID", ""); params.put("StartTime", begDate); params.put("EndTime", endDate); - JsonResult jsonResult = HisHelper.getMdJsonResult(HisEnum.AP_Query_OutpatientFee, params); + JsonResult jsonResult = HisMIHelper.getJsonResult(HisMIHelper.IS_DEV, HisEnum.AP_Query_OutpatientFee, params); if (!jsonResult.success()) { // 请求失败 return resultList; diff --git a/src/main/java/com/ynxbd/common/dao/his/HisRecipeDao.java b/src/main/java/com/ynxbd/common/dao/his/HisRecipeDao.java index f4b5d47..4ea234a 100644 --- a/src/main/java/com/ynxbd/common/dao/his/HisRecipeDao.java +++ b/src/main/java/com/ynxbd/common/dao/his/HisRecipeDao.java @@ -5,6 +5,7 @@ import com.ynxbd.common.bean.enums.MerchantEnum; import com.ynxbd.common.bean.xk.medicalRecipe; import com.ynxbd.common.helper.his.HisEnum; import com.ynxbd.common.helper.his.HisHelper; +import com.ynxbd.common.helper.his.HisMIHelper; import com.ynxbd.common.result.JsonResult; import com.ynxbd.common.result.Result; import com.ynxbd.wx.config.WeChatConfig; @@ -96,10 +97,10 @@ public class HisRecipeDao { return resultList; } - public Result uploadMedicalRecipe(String treatNum, String personID, String recipes) { + public Result uploadRxMI(String treatNum, String personID, String recipes) { List resultList = new ArrayList<>(); - JsonResult jsonResult = HisHelper.getMdJsonResult(HisEnum.XK_MEDICAL_RECIPE, params -> { + JsonResult jsonResult = HisMIHelper.getJsonResult(HisMIHelper.IS_PROD, HisEnum.XK_MEDICAL_RECIPE, params -> { params.put("PersonID", personID); params.put("MZNum", treatNum); params.put("CallNo", HisHelper.CALL_NO); diff --git a/src/main/java/com/ynxbd/common/helper/his/HisEnum.java b/src/main/java/com/ynxbd/common/helper/his/HisEnum.java index 0b6b783..23c05e1 100644 --- a/src/main/java/com/ynxbd/common/helper/his/HisEnum.java +++ b/src/main/java/com/ynxbd/common/helper/his/HisEnum.java @@ -7,8 +7,6 @@ public enum HisEnum { AP_Binding_Card("[患者]身份证绑定", "1002", "AP_Binding_Card", true), AP_UnBinding_Card("[患者]身份证解绑", "1003", "AP_UnBinding_Card", true), - - Medical_Insurance_Bill("[医保]查询患者医保结算清单", "1008", "UniversalInterface", true), // 快速发药[自定义] diff --git a/src/main/java/com/ynxbd/common/helper/his/HisHelper.java b/src/main/java/com/ynxbd/common/helper/his/HisHelper.java index 78daa15..0be4a2d 100644 --- a/src/main/java/com/ynxbd/common/helper/his/HisHelper.java +++ b/src/main/java/com/ynxbd/common/helper/his/HisHelper.java @@ -34,11 +34,13 @@ public class HisHelper { // private static String HIS_WSD_URL; // webService请求地址 - private static final String HIS_SOAP_URL; - private static final String HIS_SOAP_MD_URL; + protected static final String HIS_SOAP_URL; + protected static final String HIS_SOAP_DEV_URL; + + // HIS医保环境 + protected static final String HIS_DEV_MI_URL; + protected static final String HIS_PROD_MI_URL; - // 挂号 - private static final String HIS_SOAP_DEV_URL; // 是否强制打印HIS响应的xml private static final Boolean IS_LOG_RESP; @@ -53,37 +55,41 @@ public class HisHelper { ProperHelper config = new ProperHelper().read("webservice.properties"); String url = config.getString("his.url"); - String mdUrl = config.getString("his.md_url"); String devUrl = config.getString("his.dev_url"); + + // 医保--------------------------------------------------------- + String mdUrl = config.getString("his.md_url"); // 旧版地址 + String devMIUrl = config.getString("his.dev_mi_url"); + String prodMIUrl = config.getString("his.prod_mi_url"); + String aliCallNo = config.getString("ali_code"); IS_LOG_RESP = config.getBoolean("his.is_log_resp", false); IS_PUSH_MSG = config.getBoolean("his.is_push_msg", false); IS_RECIPE_PREPAY = config.getBoolean("his.is_recipe_prepay", false); - if (!(aliCallNo == null || "".equals(aliCallNo))) { + + if (!ObjectUtils.isEmpty(aliCallNo)) { ALI_CALL_NO = aliCallNo; } + if (url == null) { - HIS_SOAP_URL = null; log.error("WebService配置文件读取失败"); - } else { - HIS_SOAP_URL = "http://" + url + "/WebService_AB.dll/soap/IInterface_AB"; } + HIS_SOAP_URL = initSoapURL(url); + HIS_SOAP_DEV_URL = initSoapURL(devUrl); - if (mdUrl == null) { - HIS_SOAP_MD_URL = null; - } else { - HIS_SOAP_MD_URL = "http://" + mdUrl + "/WebService_AB.dll/soap/IInterface_AB"; - } + // 医保--------------------------------- + HIS_DEV_MI_URL = initSoapURL(devMIUrl); + HIS_PROD_MI_URL = initSoapURL(prodMIUrl == null ? mdUrl : prodMIUrl); + } - if (devUrl == null) { - HIS_SOAP_DEV_URL = null; - } else { - HIS_SOAP_DEV_URL = "http://" + devUrl + "/WebService_AB.dll/soap/IInterface_AB"; + private static String initSoapURL(String ip) { + if (ObjectUtils.isEmpty(ip)) { + return null; } + return "http://" + ip + "/WebService_AB.dll/soap/IInterface_AB"; } - /** * HIS订单号 */ @@ -150,16 +156,6 @@ public class HisHelper { return getResponseXml(hisEnum, HIS_SOAP_URL, params, merchantEnum); } - /** - * 医保环境 - * - * @param hisEnum 枚举 - * @param params 发送的参数 - * @return 响应的xml数据 - */ - public static String getMdResponseXml(HisEnum hisEnum, Map params) { - return getResponseXml(hisEnum, HIS_SOAP_MD_URL, params); - } /** * 测试环境 @@ -237,7 +233,7 @@ public class HisHelper { } List nodes = document.selectNodes("//return"); - if (nodes.size() == 0) { + if (nodes.isEmpty()) { log.info("HIS请求失败[{}]-耗时:[{}]-返回xml={}", transactionCode, takeTime, hisResponse); return null; } @@ -255,7 +251,7 @@ public class HisHelper { } } - new MiddleOfficeService().req_his_JH0104(soapUrl, HIS_SOAP_MD_URL, params, transactionCode, result); + new MiddleOfficeService().req_his_JH0104(soapUrl, HIS_PROD_MI_URL, params, transactionCode, result); } catch (DocumentException e) { ErrorHelper.println(e); @@ -317,10 +313,10 @@ public class HisHelper { /** * [支付宝] xml响应数据组装成为JSON数据 * - * @param hisEnum - * @param params - * @param merchantEnum - * @return + * @param hisEnum 接口枚举 + * @param params 参数 + * @param merchantEnum 支付类型 + * @return JsonResult */ public static JsonResult getJsonResult(HisEnum hisEnum, Map params, MerchantEnum merchantEnum) { JsonResult result = JsonResult.xmlToBean(getResponseXml(hisEnum, params, merchantEnum), JsonResultEnum.SYS_HIS); @@ -357,35 +353,6 @@ public class HisHelper { } - // 医保------------------------------------------------------------------------------------------------------------- - - /** - * xml响应数据组装成为JSON数据 - * - * @return 封装好的对象 - */ - public static JsonResult getMdJsonResult(HisEnum hisEnum, Map params) { - JsonResult result = JsonResult.xmlToBean(getMdResponseXml(hisEnum, params), JsonResultEnum.SYS_HIS); - if (result == null) { // 如果返回为空可能为超时 - return createTimeoutResult(); - } - return result; - } - - /** - * xml响应数据组装成为JSON数据 - * - * @return 封装好的对象 - */ - public static JsonResult getMdJsonResult(HisEnum hisEnum, JsonResult.MapParams params) { - Map requestParams = new HashMap<>(); - if (params != null) { - params.setParams(requestParams); - } - return getMdJsonResult(hisEnum, requestParams); - } - - // --------------------------------------------------------------------------- // 测试环境 @@ -433,7 +400,7 @@ public class HisHelper { * * @return 封装好的对象 */ - private static JsonResult createTimeoutResult() { + protected static JsonResult createTimeoutResult() { return JsonResult.createTimeoutResult("【HIS】请求超时", JsonResultEnum.SYS_HIS); } diff --git a/src/main/java/com/ynxbd/common/helper/his/HisMIHelper.java b/src/main/java/com/ynxbd/common/helper/his/HisMIHelper.java new file mode 100644 index 0000000..767ea55 --- /dev/null +++ b/src/main/java/com/ynxbd/common/helper/his/HisMIHelper.java @@ -0,0 +1,50 @@ +package com.ynxbd.common.helper.his; + +import com.ynxbd.common.result.JsonResult; +import com.ynxbd.common.result.JsonResultEnum; + +import java.util.HashMap; +import java.util.Map; + +public class HisMIHelper { + + public final static boolean IS_PROD = false; // false为生产环境 + public final static boolean IS_DEV = true; // true为测试环境 + + /** + * 医保环境 + * + * @param hisEnum 枚举 + * @param params 发送的参数 + * @return 响应的xml数据 + */ + public static String getResponseXml(boolean isDev, HisEnum hisEnum, Map params) { + return HisHelper.getResponseXml(hisEnum, isDev ? HisHelper.HIS_DEV_MI_URL : HisHelper.HIS_PROD_MI_URL, params); + } + + /** + * xml响应数据组装成为JSON数据 + * + * @return 封装好的对象 + */ + public static JsonResult getJsonResult(boolean isDev, HisEnum hisEnum, Map params) { + JsonResult result = JsonResult.xmlToBean(getResponseXml(isDev, hisEnum, params), JsonResultEnum.SYS_HIS); + if (result == null) { // 如果返回为空可能为超时 + return HisHelper.createTimeoutResult(); + } + return result; + } + + /** + * xml响应数据组装成为JSON数据 + * + * @return 封装好的对象 + */ + public static JsonResult getJsonResult(boolean isDev, HisEnum hisEnum, JsonResult.MapParams params) { + Map requestParams = new HashMap<>(); + if (params != null) { + params.setParams(requestParams); + } + return getJsonResult(isDev, hisEnum, requestParams); + } +} diff --git a/src/main/java/com/ynxbd/common/helper/xbd/XBDHelper.java b/src/main/java/com/ynxbd/common/helper/xbd/XBDHelper.java index 361a8c4..0bf67ae 100644 --- a/src/main/java/com/ynxbd/common/helper/xbd/XBDHelper.java +++ b/src/main/java/com/ynxbd/common/helper/xbd/XBDHelper.java @@ -28,4 +28,6 @@ public class XBDHelper { } outTeamDao = new OutTeamDao(CLOUD_FILM_URL); } + + } diff --git a/src/main/java/com/ynxbd/common/service/MedicalService.java b/src/main/java/com/ynxbd/common/service/MedicalService.java index 1f423e5..26ccdba 100644 --- a/src/main/java/com/ynxbd/common/service/MedicalService.java +++ b/src/main/java/com/ynxbd/common/service/MedicalService.java @@ -9,7 +9,7 @@ import com.ynxbd.common.bean.pay.Recipe; import com.ynxbd.common.bean.pay.Register; import com.ynxbd.common.dao.RecipeDao; import com.ynxbd.common.dao.RegisterDao; -import com.ynxbd.common.dao.his.HisMedicalDao; +import com.ynxbd.common.dao.his.HisMIDao; import com.ynxbd.common.helper.common.CodeHelper; import com.ynxbd.common.helper.common.JsonHelper; import com.ynxbd.common.result.JsonResult; @@ -23,7 +23,7 @@ import com.ynxbd.wx.wxfactory.bean.MedicalInfo; import com.ynxbd.wx.wxfactory.bean.MedicalOrder; import com.ynxbd.wx.wxfactory.bean.MedicalUserInfo; import com.ynxbd.wx.wxfactory.bean.OrderMIEnum; -import com.ynxbd.wx.wxfactory.medical.MIConfig; +import com.ynxbd.wx.wxfactory.medical.WechatMIConfig; import lombok.extern.slf4j.Slf4j; import java.math.BigDecimal; @@ -72,8 +72,8 @@ public class MedicalService { } log.info("[医保]上传明细:patientId={}, cardNo={}, realName={}, reg={}", patientId, cardNo, realName, reg); - JsonResult result = HisMedicalDao.regTimeMdUploadFeeDetails(reg, payAuthNo, cardNo, MerchantEnum.WX, isSplitTime); - return hisMIPlaceOrder(payAuthNo, result); + JsonResult result = HisMIDao.regMIUploadFeeDetails(merchantEnum, reg, payAuthNo, cardNo, isSplitTime); + return hisMIPlaceOrder(merchantEnum, payAuthNo, result); } /** @@ -98,8 +98,8 @@ public class MedicalService { } log.info("[医保]上传明细:patientId={}, totalFee={}, cardNo={}, recipeJson={}", patientId, totalFee, cardNo, recipeJson); - JsonResult result = HisMedicalDao.recipeMdUploadFeeDetails(payAuthNo, cardNo, openid, patientId, treatNum, recipeJson, totalFee, ybAttrib, ybBZCode, ybBZName); - return hisMIPlaceOrder(payAuthNo, result); + JsonResult result = HisMIDao.rxMIUploadFeeDetails(merchantEnum, payAuthNo, cardNo, openid, patientId, treatNum, recipeJson, totalFee, ybAttrib, ybBZCode, ybBZName); + return hisMIPlaceOrder(merchantEnum, payAuthNo, result); } /** @@ -107,7 +107,7 @@ public class MedicalService { * * @param payAuthNo 授权码 */ - private MedicalInfo hisMIPlaceOrder(String payAuthNo, JsonResult result) throws ServiceException { + private MedicalInfo hisMIPlaceOrder(MerchantEnum merchantEnum, String payAuthNo, JsonResult result) throws ServiceException { if (result == null) { throw new ServiceException("[医保]返回数据为空"); } @@ -134,7 +134,7 @@ public class MedicalService { medicalInfo.setChrgBchno(chrgBchno); medicalInfo.setMdUserId(mdUserId); - JsonResult resp = HisMedicalDao.mdPlaceOrder(medicalInfo); + JsonResult resp = HisMIDao.placeMIOrder(merchantEnum, medicalInfo); if (!resp.success()) { log.info("[上传明细失败] {}", resp.getMessage()); throw new ServiceException(resp.getMessage()); @@ -412,7 +412,7 @@ public class MedicalService { return false; } - JsonResult jsonResult = HisMedicalDao.regMdPay(mdUserId, payDate, payTime, tradeNo, bankTransNo, cashFee); + JsonResult jsonResult = HisMIDao.regMIPay(merchantEnum, mdUserId, payDate, payTime, tradeNo, bankTransNo, cashFee); if (!jsonResult.success()) { String respCode = jsonResult.getCode(); String respMessage = jsonResult.getMessage(); @@ -440,7 +440,7 @@ public class MedicalService { return false; } - if (!MIConfig.IS_AUTO_REFUND) { + if (!WechatMIConfig.IS_AUTO_REFUND) { log.info("[医保][挂号]现金自动退费功能未开启 outTradeNo={}, bankTransNo={}, tradeNo={}", outTradeNo, bankTransNo, tradeNo); return false; } @@ -533,7 +533,7 @@ public class MedicalService { log.info("{} [医保][处方]更新商户信息成功 outTradeNo={}, bankTransNo={}", merchantEnum.NAME, outTradeNo, bankTransNo); } - JsonResult jsonResult = HisMedicalDao.mdRecipePay(mdUserId, payDate, payTime, tradeNo, bankTransNo, cashFee); + JsonResult jsonResult = HisMIDao.rxMIPay(merchantEnum, mdUserId, payDate, payTime, tradeNo, bankTransNo, cashFee); if (!jsonResult.success()) { String respCode = jsonResult.getCode(); @@ -563,7 +563,7 @@ public class MedicalService { return false; } - if (!MIConfig.IS_AUTO_REFUND) { + if (!WechatMIConfig.IS_AUTO_REFUND) { log.info("[医保][处方][现金自动退费]功能未开启 outTradeNo={}, bankTransNo={}, tradeNo={}", outTradeNo, bankTransNo, tradeNo); return false; } @@ -609,9 +609,8 @@ public class MedicalService { } // 医保退费-必须先执行 - log.info("[医保][处方][个账]退费开始 tradeNo={}, payAuthNo={}, fpNum={}", tradeNo, payAuthNo, fpNum); - JsonResult jsonResult = HisMedicalDao.mdRefund(payAuthNo, fpNum, bankTransNo, ("R" + tradeNo), cashFee); + JsonResult jsonResult = HisMIDao.miRefund(MerchantEnum.WX, payAuthNo, fpNum, bankTransNo, ("R" + tradeNo), cashFee); if (!jsonResult.success()) { // 失败 log.info("[医保][处方][个账]退费失败 outTradeNo={}, bankTransNo={}, tradeNo={}", outTradeNo, bankTransNo, tradeNo); String message = jsonResult.getMessage(); @@ -680,9 +679,13 @@ public class MedicalService { * * @param mdUserId 用户ID */ - public MedicalInfo getMedicalAccounts(String mdUserId) { - log.info("[医保]退费开始 mdUserId={}", mdUserId); - JsonResult jsonResult = HisMedicalDao.getMedicalAccounts(mdUserId); + public MedicalInfo getMedicalAccounts(String payCode, String mdUserId) { + log.info("[医保]退费开始 payCode={} mdUserId={}", payCode, mdUserId); + MerchantEnum merchantEnum = MerchantEnum.findEnumByCode(payCode); + if (merchantEnum == null) { + return null; + } + JsonResult jsonResult = HisMIDao.getMIAccounts(merchantEnum, mdUserId); if (!jsonResult.success()) { // 未找到 return null; } diff --git a/src/main/java/com/ynxbd/common/service/XBDService.java b/src/main/java/com/ynxbd/common/service/XBDService.java index 6a31e56..3d02c5a 100644 --- a/src/main/java/com/ynxbd/common/service/XBDService.java +++ b/src/main/java/com/ynxbd/common/service/XBDService.java @@ -1,8 +1,12 @@ package com.ynxbd.common.service; +import com.ynxbd.common.result.ResultEnum; +import com.ynxbd.common.result.ServiceException; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.lang3.ObjectUtils; +@Slf4j public class XBDService { public String getCloudToken(String treatNum) { @@ -13,4 +17,72 @@ public class XBDService { } return key.substring(3, 12); } + + + /** + * 获取云胶片的授权地址 + * + * @param treatNum 门诊号|住院号 + * @param treatType 类型[1:门诊;2:住院] + */ + public String getPacsAuthUrl(Integer version, String patientId, String treatNum, String treatType) throws ServiceException { + if (version == null) { + version = 1; + } + + if (version == 1) { + return getPacsAuthUrlByPatientId(version, patientId); + } + + if (version == 2) { + return getPacsAuthUrlByTreatNum(version, treatNum, treatType); + } + throw new ServiceException("[云胶片]授权version未匹配"); + } + + /** + * 获取云胶片的授权地址[版本2] + * + * @param treatNum 门诊号|住院号 + * @param treatType 类型[1:门诊;2:住院] + */ + public String getPacsAuthUrlByTreatNum(Integer version, String treatNum, String treatType) throws ServiceException { + log.info("[云胶片]授权 version={}, treatType={}, treatNum={}", version, treatType, treatNum); + if (treatType == null || treatNum == null) { + throw new ServiceException(ResultEnum.PARAM_IS_INVALID); + } + String token = DigestUtils.md5Hex(treatNum + "huiyou69"); + if (ObjectUtils.isEmpty(token)) { + throw new ServiceException("token转化失败"); + } + + if (token.length() < 12) { + throw new ServiceException("token长度错误"); + } + token = token.substring(3, 12).toUpperCase(); + + String url = "/smsPacs?token=" + token + ("1".equals(treatType) ? "&opsNum=" : "&inHosNum=") + treatNum; + log.info("[云胶片]授权 url={}", url); + return url; + } + + /** + * 获取云胶片的授权地址[版本1] + * + * @param patientId 患者id + */ + public String getPacsAuthUrlByPatientId(Integer version, String patientId) throws ServiceException { + log.info("[云胶片]授权 version={}, patientId={}", version, patientId); + if (ObjectUtils.isEmpty(patientId)) { + throw new ServiceException(ResultEnum.PARAM_IS_INVALID); + } + String token = DigestUtils.md5Hex(patientId + "huiyou69"); + if (ObjectUtils.isEmpty(token)) { + throw new ServiceException("token转化失败"); + } + String url = "/smsPacs?token=" + token.toUpperCase() + "&patID=" + patientId; + log.info("[云胶片]授权 url={}", url); + return url; + } + } diff --git a/src/main/java/com/ynxbd/wx/wxfactory/WxMedicalHelper.java b/src/main/java/com/ynxbd/wx/wxfactory/WxMedicalHelper.java index 5060704..86bc9c3 100644 --- a/src/main/java/com/ynxbd/wx/wxfactory/WxMedicalHelper.java +++ b/src/main/java/com/ynxbd/wx/wxfactory/WxMedicalHelper.java @@ -9,7 +9,7 @@ import com.ynxbd.wx.config.WeChatConfig; import com.ynxbd.wx.wxfactory.base.auth.models.RespAccessToken; import com.ynxbd.wx.wxfactory.base.auth.models.RespJsapiTicket; import com.ynxbd.wx.wxfactory.bean.*; -import com.ynxbd.wx.wxfactory.medical.MIConfig; +import com.ynxbd.wx.wxfactory.medical.WechatMIConfig; import com.ynxbd.wx.wxfactory.medical.enums.MdRefundTypeEnum; import com.ynxbd.wx.wxfactory.utils.WxSignHelper; import lombok.extern.slf4j.Slf4j; @@ -34,7 +34,7 @@ public class WxMedicalHelper { */ public static MedicalUserInfo getUserInfo(String openid, String qrCode, String cardNo, String realName) throws ServiceException { log.info("[医保]获取用户信息 openid={}, qrCode={}", openid, qrCode); - MedicalUserInfo info = WxFactory.Medical.Common().getUserInfo(MIConfig.PARTNER_URL, openid, qrCode); + MedicalUserInfo info = WxFactory.Medical.Common().getUserInfo(WechatMIConfig.PARTNER_URL, openid, qrCode); if (info == null || !info.isSuccess()) { String message = info == null ? "授权失败" : info.getMessage(); log.info("[医保授权]失败 {}", message); @@ -69,7 +69,7 @@ public class WxMedicalHelper { * @param request 请求 * @return 支付信息 */ - public static MedicalNotify medicalPayNotify(HttpServletRequest request) throws ServiceException { + public static MedicalNotify paidMINotify(HttpServletRequest request) throws ServiceException { try { // 转换数据对象 Map paramsMap = WxSignHelper.getReqXmlParamsMap(request); @@ -78,12 +78,13 @@ public class WxMedicalHelper { } // 签名验证 - if (!WxSignHelper.validateSign(paramsMap, MIConfig.PAY_KEY)) { // 验证未通过,通知支付失败 + if (!WxSignHelper.validateSign(paramsMap, WechatMIConfig.PAY_KEY)) { // 验证未通过,通知支付失败 throw new ServiceException("[医保]回调通知签名验证未通过!"); } + String json = JsonHelper.toJsonString(paramsMap); - if ("".equals(json)) { + if (ObjectUtils.isEmpty(json)) { throw new ServiceException("[医保]回调通知下单信息为空"); } @@ -155,8 +156,8 @@ public class WxMedicalHelper { , outTradeNo, openid, cardNo, realName, payOrdId, payAuthNo, totalFee, insuranceFee, cashFee, familyType, familyName, familyCardNo); MedicalPayOrder order = WxFactory.Medical.Common().createOrder(OrderMIEnum, WxCacheHelper.getAccessToken(), - MIConfig.MD_APP_ID, WeChatConfig.MCH_ID, MIConfig.PAY_KEY, - MIConfig.CITY_CODE, MIConfig.HOSPITAL_NAME, MIConfig.ORG_NO, MIConfig.CHANNEL, + WechatMIConfig.MD_APP_ID, WeChatConfig.MCH_ID, WechatMIConfig.PAY_KEY, + WechatMIConfig.CITY_CODE, WechatMIConfig.HOSPITAL_NAME, WechatMIConfig.ORG_NO, WechatMIConfig.CHANNEL, openid, payAuthNo, payOrdId, @@ -203,9 +204,9 @@ public class WxMedicalHelper { public static MedicalOrder queryOrder(String accessToken, String outTradeNo, String medTransId) { return WxFactory.Medical.Common().queryOrder( accessToken, - MIConfig.MD_APP_ID, + WechatMIConfig.MD_APP_ID, WeChatConfig.MCH_ID, - MIConfig.PAY_KEY, + WechatMIConfig.PAY_KEY, outTradeNo, medTransId); } @@ -251,9 +252,9 @@ public class WxMedicalHelper { public static MedicalOrder refund(String outTradeNo, String outRefundNo, String payOrdId, BigDecimal cashFee, String reason) { return WxFactory.Medical.Common().refund( WxCacheHelper.getAccessToken(), - MIConfig.MD_APP_ID, + WechatMIConfig.MD_APP_ID, WeChatConfig.MCH_ID, - MIConfig.PAY_KEY, + WechatMIConfig.PAY_KEY, outTradeNo, outRefundNo, payOrdId, @@ -269,9 +270,9 @@ public class WxMedicalHelper { public static MedicalOrder refundCash(String outTradeNo, String outRefundNo, String payOrdId, BigDecimal cashFee, String reason) { return WxFactory.Medical.Common().refund( WxCacheHelper.getAccessToken(), - MIConfig.MD_APP_ID, + WechatMIConfig.MD_APP_ID, WeChatConfig.MCH_ID, - MIConfig.PAY_KEY, + WechatMIConfig.PAY_KEY, outTradeNo, outRefundNo, payOrdId, @@ -296,9 +297,9 @@ public class WxMedicalHelper { return WxFactory.Medical.Common().downBill( WxCacheHelper.getAccessToken(), - MIConfig.MD_APP_ID, + WechatMIConfig.MD_APP_ID, WeChatConfig.MCH_ID, - MIConfig.PAY_KEY, + WechatMIConfig.PAY_KEY, billDate, billType); } @@ -310,9 +311,9 @@ public class WxMedicalHelper { public static MedicalRefundInfo queryRefund(String accessToken, String outTradeNo, String mdTransId) { return WxFactory.Medical.Common().queryRefund( accessToken, - MIConfig.MD_APP_ID, + WechatMIConfig.MD_APP_ID, WeChatConfig.MCH_ID, - MIConfig.PAY_KEY, + WechatMIConfig.PAY_KEY, outTradeNo, mdTransId); } @@ -329,7 +330,7 @@ public class WxMedicalHelper { return cacheToken; } - RespAccessToken response = WxFactory.Base.OAuth().getAccessToken(MIConfig.MD_APP_ID, MIConfig.MD_APP_SECRET); + RespAccessToken response = WxFactory.Base.OAuth().getAccessToken(WechatMIConfig.MD_APP_ID, WechatMIConfig.MD_APP_SECRET); if (!response.isSuccess()) { log.error("[微信]access_token请求失败 code={}, message={}", response.getErrCode(), response.getErrMsg()); return null; diff --git a/src/main/java/com/ynxbd/wx/wxfactory/WxMessageHelper.java b/src/main/java/com/ynxbd/wx/wxfactory/WxMessageHelper.java index e600cf2..0a5feaa 100644 --- a/src/main/java/com/ynxbd/wx/wxfactory/WxMessageHelper.java +++ b/src/main/java/com/ynxbd/wx/wxfactory/WxMessageHelper.java @@ -2,7 +2,7 @@ package com.ynxbd.wx.wxfactory; import com.ynxbd.common.result.JsonResult; import com.ynxbd.wx.config.WeChatConfig; -import com.ynxbd.wx.wxfactory.medical.MIConfig; +import com.ynxbd.wx.wxfactory.medical.WechatMIConfig; import com.ynxbd.wx.wxfactory.message.MdClient; import lombok.extern.slf4j.Slf4j; @@ -26,7 +26,7 @@ public class WxMessageHelper { public static void regPush(String url, Integer status, String patCardNo, String patName, String patHospitalId, String deptName, String docName, String appointmentTime, String memo) { JsonResult result = new MdClient().push(WxCacheHelper.getAccessToken(), WeChatConfig.APP_ID, 9001, "123", messageType -> messageType.reg( - MIConfig.HOSPITAL_NAME, + WechatMIConfig.HOSPITAL_NAME, url, status, patCardNo, diff --git a/src/main/java/com/ynxbd/wx/wxfactory/medical/Client.java b/src/main/java/com/ynxbd/wx/wxfactory/medical/Client.java index b0a0c11..d0f46a5 100644 --- a/src/main/java/com/ynxbd/wx/wxfactory/medical/Client.java +++ b/src/main/java/com/ynxbd/wx/wxfactory/medical/Client.java @@ -32,7 +32,7 @@ public class Client { * @param url url */ public String getAuthUrl(String url) { - String configUrl = MIConfig.getConfigUrl(url); + String configUrl = WechatMIConfig.getConfigUrl(url); log.info("[医保]免密授权地址-{}", configUrl); return configUrl; } @@ -119,7 +119,7 @@ public class Client { //========================================================== params.put("hospital_name", hospitalName); // - if (MIConfig.IS_DEV) { + if (WechatMIConfig.IS_DEV) { params.put("use_sandbox", 1); } @@ -322,7 +322,7 @@ public class Client { MedicalUserInfo info = new MedicalUserInfo(); String timestamp = Long.toString(System.currentTimeMillis()); - String signature = MIConfig.createSignature(timestamp); + String signature = WechatMIConfig.createSignature(timestamp); if (signature == null) { info.setMessage("signature签名错误"); return info; diff --git a/src/main/java/com/ynxbd/wx/wxfactory/medical/MIConfig.java b/src/main/java/com/ynxbd/wx/wxfactory/medical/WechatMIConfig.java similarity index 98% rename from src/main/java/com/ynxbd/wx/wxfactory/medical/MIConfig.java rename to src/main/java/com/ynxbd/wx/wxfactory/medical/WechatMIConfig.java index 81e82c1..e7d3342 100644 --- a/src/main/java/com/ynxbd/wx/wxfactory/medical/MIConfig.java +++ b/src/main/java/com/ynxbd/wx/wxfactory/medical/WechatMIConfig.java @@ -9,8 +9,8 @@ import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; -public class MIConfig { - private MIConfig() { +public class WechatMIConfig { + private WechatMIConfig() { } // 免密授权 diff --git a/src/main/resources/medical-ali.properties b/src/main/resources/medical-ali.properties new file mode 100644 index 0000000..51523fe --- /dev/null +++ b/src/main/resources/medical-ali.properties @@ -0,0 +1,14 @@ +# \u533B\u4FDD\u914D\u7F6E +mi_ali.is_dev=true +mi_ali.is_enable=true +mi_ali.is_auto_refund=true + +# \u5B9A\u70B9\u533B\u7597\u673A\u6784\u540D\u79F0\uFF08\u652F\u4ED8\u5B9D\u53EF\u80FD\u4E0D\u540C\uFF09 +mi_ali.org_hospital_name=\u4E91\u5357\u7701\u6EC7\u5357\u4E2D\u5FC3\u533B\u9662 +# \u533B\u4FDD\uFF08PDF\u6587\u6863\uFF09---------------------------------------------------------------------------------- +# \u5B9A\u70B9\u533B\u836F\u673A\u6784\u7F16\u7801 +mi_ali.org_no=H53250301796 +# \u5B9A\u70B9\u533B\u836F\u673A\u6784\u5C0F\u7A0B\u5E8F/h5\u5E94\u7528id\uFF08\u6B63\u5F0F\u73AF\u5883\uFF1A\u6E20\u9053\u7F16\u53F7\uFF09 +mi_ali.org_app_id=1J06MILHV0JM4460C80A0000F05B9B68 +# \u5B9A\u70B9\u533B\u836F\u673A\u6784\u6E20\u9053\u8BA4\u8BC1\u7F16\u7801 +mi_ali.org_chnl_crtf_codg=BqK1kMStlhVDgN2uHf4EsP9BQzovPtfTZGwRsyhqMMY05hWhBzmfAN/glcC2Qe8q diff --git a/src/main/resources/webservice.properties b/src/main/resources/webservice.properties index 824bc8c..c718220 100644 --- a/src/main/resources/webservice.properties +++ b/src/main/resources/webservice.properties @@ -1 +1 @@ -# \u5F00\u542F\u5904\u65B9\u9884\u7ED3\u7B97\uFF08\u7B2C2\u5F00\u5173\uFF09\uFF08\u6CE8\u610F\u8BE5\u914D\u7F6E\u9700\u8054\u7CFBhis\u5F00\u53D1\u8005\u786E\u8BA4\u652F\u6301\u624D\u80FD\u5F00\u542F\uFF0C\u5426\u5219\u5B58\u5728\u98CE\u9669\uFF01\uFF09 his.is_recipe_prepay=false lis.url=192.168.1.185:8090 lis.unifiedEntrance=true # \u672C\u5730 #his.url=127.0.0.1:8888 # \u6D4B\u8BD5\u73AF\u5883 ali_code=675448357 # \u662F\u5426\u5F3A\u5236\u6253\u5370webservice\u7684xml\u8FD4\u56DE\u6570\u636E his.is_log_resp=true # \u662F\u5426\u4F20\u9012openid\u7ED9his\u63A8\u9001\u6D88\u606F his.is_push_msg=false #------------------------------------------------------------- #\u672C\u5730 his.md_url=127.0.0.1:7777 his.dev_url=127.0.0.1:7777 ### \u5FB7\u5B8F\u4E2D\u533B #his.url=200.200.200.60:8888 # \u7EA2\u6CB3\u5DDE\u533B\u9662 #his.url=10.20.10.6:8888 # \u8292\u5E02\u5987\u5E7C his.url=192.168.11.7:8888 # \u5B81\u8497\u5987\u5E7C #his.url=172.19.3.15:8888 # \u516C\u53F8\u6D4B\u8BD5 #his.url=192.168.12.39:8888 # \u516C\u53F8\u6D4B\u8BD5 #his.url=192.168.12.10:8888 # \u7EA2\u6CB3 #his.url=10.20.10.6:8888 # \u7EA2\u6CB3\u533B\u4FDD #his.url=10.20.10.6:8888 #his.url=192.168.12.10:8888 #his.md_url=192.168.1.128:7885 #his.dev_url=10.20.10.6:9988 # \u6C38\u80DC #his.url=200.200.200.20:8888 # \u5FB7\u5B8F\u4E2D\u533B #his.url=200.200.200.60:8888 # \u534E\u576A #his.url=192.168.1.115:8888 # \u8499\u81EA\u4E2D\u533B #his.url=192.168.0.228:8888 # \u7389\u9F99 #his.url=192.168.0.17:8888 # \u4E91\u9F99 #his.url=200.200.200.69:8888 # #his.url=172.16.10.15:8888 # \u7984\u529D\u949F\u7231 #his.url=200.200.200.5:8888 # \u8499\u81EA\u5E02\u4EBA\u6C11\u533B\u9662 #his.url=200.200.200.174:8080 # \u5143\u8C0B #his.url=200.200.200.29:8888 # \u5143\u8C0B\u533B\u4FDD #his.dev_url=200.200.200.36:9999 # \u8292\u5E02 #his.url=192.168.100.8:8888 # \u7EA2\u6CB3\u5987\u5E7C\u4FDD\u5065\u9662 #his.url=192.168.1.204:8888 # \u8292\u5E02\u5987\u5E7C #his.url=192.168.11.7:8888 # #his.url=10.10.11.23:8888 # \u77F3\u6797 #his.url=192.168.10.10:8888 # \u5BCC\u6C11 #his.url=200.200.201.27:8888 # \u897F\u53CC\u7248\u7EB3 #his.url=10.10.11.23:8888 #wx.password=ynxbd@6910 \ No newline at end of file +# \u5F00\u542F\u5904\u65B9\u9884\u7ED3\u7B97\uFF08\u7B2C2\u5F00\u5173\uFF09\uFF08\u6CE8\u610F\u8BE5\u914D\u7F6E\u9700\u8054\u7CFBhis\u5F00\u53D1\u8005\u786E\u8BA4\u652F\u6301\u624D\u80FD\u5F00\u542F\uFF0C\u5426\u5219\u5B58\u5728\u98CE\u9669\uFF01\uFF09 his.is_recipe_prepay=false lis.url=192.168.1.185:8090 lis.unifiedEntrance=true # \u672C\u5730 #his.url=127.0.0.1:8888 # \u6D4B\u8BD5\u73AF\u5883 ali_code=675448357 # \u662F\u5426\u5F3A\u5236\u6253\u5370webservice\u7684xml\u8FD4\u56DE\u6570\u636E his.is_log_resp=true # \u662F\u5426\u4F20\u9012openid\u7ED9his\u63A8\u9001\u6D88\u606F his.is_push_msg=false #------------------------------------------------------------- # \u6D4B\u8BD5\u73AF\u5883 his.dev_url=127.0.0.1:7777 # \u533B\u4FDD====================== # \u65E7\u914D\u7F6E his.md_url=127.0.0.1:7777 # \u533B\u4FDD\u6B63\u5F0F\u73AF\u5883 his.prod_mi_url=127.0.0.1:7777 # \u533B\u4FDD\u6D4B\u8BD5\u73AF\u5883 his.dev_mi_url=10.20.10.7:7885 # \u6D4B\u8BD5============================================================ ### \u5FB7\u5B8F\u4E2D\u533B #his.url=200.200.200.60:8888 # \u7EA2\u6CB3\u5DDE\u533B\u9662 #his.url=10.20.10.6:8888 # \u8292\u5E02\u5987\u5E7C his.url=192.168.11.7:8888 # \u5B81\u8497\u5987\u5E7C #his.url=172.19.3.15:8888 # \u516C\u53F8\u6D4B\u8BD5 #his.url=192.168.12.39:8888 # \u516C\u53F8\u6D4B\u8BD5 #his.url=192.168.12.10:8888 # \u7EA2\u6CB3 #his.url=10.20.10.6:8888 # \u7EA2\u6CB3\u533B\u4FDD #his.url=10.20.10.6:8888 #his.url=192.168.12.10:8888 #his.md_url=192.168.1.128:7885 #his.dev_url=10.20.10.6:9988 # \u6C38\u80DC #his.url=200.200.200.20:8888 # \u5FB7\u5B8F\u4E2D\u533B #his.url=200.200.200.60:8888 # \u534E\u576A #his.url=192.168.1.115:8888 # \u8499\u81EA\u4E2D\u533B #his.url=192.168.0.228:8888 # \u7389\u9F99 #his.url=192.168.0.17:8888 # \u4E91\u9F99 #his.url=200.200.200.69:8888 # #his.url=172.16.10.15:8888 # \u7984\u529D\u949F\u7231 #his.url=200.200.200.5:8888 # \u8499\u81EA\u5E02\u4EBA\u6C11\u533B\u9662 #his.url=200.200.200.174:8080 # \u5143\u8C0B #his.url=200.200.200.29:8888 # \u5143\u8C0B\u533B\u4FDD #his.dev_url=200.200.200.36:9999 # \u8292\u5E02 #his.url=192.168.100.8:8888 # \u7EA2\u6CB3\u5987\u5E7C\u4FDD\u5065\u9662 #his.url=192.168.1.204:8888 # \u8292\u5E02\u5987\u5E7C #his.url=192.168.11.7:8888 # #his.url=10.10.11.23:8888 # \u77F3\u6797 #his.url=192.168.10.10:8888 # \u5BCC\u6C11 #his.url=200.200.201.27:8888 # \u897F\u53CC\u7248\u7EB3 #his.url=10.10.11.23:8888 #wx.password=ynxbd@6910 \ No newline at end of file diff --git a/src/main/resources/wx.properties b/src/main/resources/wx.properties index 89a3e6b..c99d494 100644 --- a/src/main/resources/wx.properties +++ b/src/main/resources/wx.properties @@ -7,7 +7,7 @@ #wx.baseURL=http://www.dljcxrmyy.com/wx/ #wx.webPath=/web -#wx.appId=wx64cc4b42bbed4090 +wx.appId=wx64cc4b42bbed4090 #wx.appSecret=7d5d713378e7885c5186c739ba1bcf0c #wx.token=ynxbd #wx.aesKey=s3ib5r9aE7VtICXjrix0zi9cZ2bipshqh4gzXkjJoh0