From 14ac702e7ba403157b3edbb8626de0eb20ea120b Mon Sep 17 00:00:00 2001 From: wangsq Date: Tue, 10 Mar 2026 18:24:32 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E5=BE=AE=E4=BF=A1=E8=AE=A4=E8=AF=81?= =?UTF-8?q?=EF=BC=8C=E5=9C=A8=E5=AD=90=E6=9C=8D=E5=8A=A1=E5=99=A8=E5=85=B3?= =?UTF-8?q?=E9=97=AD=E5=90=8E=E5=86=8D=E6=AC=A1=E8=AE=BF=E9=97=AE=E6=97=B6?= =?UTF-8?q?=EF=BC=8C=E5=AD=98=E5=9C=A8=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=202=E3=80=81=E4=B8=BB=E6=AC=A1=E6=9C=8D=E5=8A=A1=E5=99=A8?= =?UTF-8?q?=E5=85=B3=E8=81=94=E5=85=B3=E7=B3=BB=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + pom.xml | 2 +- .../com/ynxbd/common/action/AliAction.java | 4 +- .../ynxbd/common/action/AuthAgentAction.java | 2 +- .../ynxbd/common/action/HealthCardAction.java | 12 + .../ynxbd/common/action/HealthCodeAction.java | 177 ++-- .../ynxbd/common/action/PatientAction.java | 42 +- .../ynxbd/common/action/RegisterAction.java | 17 +- .../common/action/auth/WxAuthAction.java | 7 + .../common/action/weihu/DataWHAction.java | 17 +- .../java/com/ynxbd/common/bean/Patient.java | 48 +- .../bean/enums/HealthCardRespCodeEnum.java | 25 + .../bean/enums/HealthCardSceneEnum.java | 37 + .../java/com/ynxbd/common/bean/pay/Order.java | 2 +- .../com/ynxbd/common/bean/pay/Register.java | 1 + .../config/interceptor/MethodInterceptor.java | 2 + .../java/com/ynxbd/common/dao/GMCUserDao.java | 6 +- .../java/com/ynxbd/common/dao/PatientDao.java | 30 +- .../ynxbd/common/dao/his/HisPatientDao.java | 17 +- .../common/helper/common/Base64Helper.java | 8 +- .../common/helper/common/ParamHelper.java | 2 +- .../ynxbd/common/helper/common/URLHelper.java | 33 + .../com/ynxbd/common/helper/his/HisEnum.java | 2 +- .../ynxbd/common/helper/his/HisHelper.java | 4 +- .../common/service/AIGuidanceService.java | 18 +- .../com/ynxbd/common/service/GMCService.java | 205 +++++ .../ynxbd/common/service/GMCUserService.java | 18 +- .../ynxbd/common/service/HCodeService.java | 853 +++++++++--------- .../common/service/HealthUploadService.java | 159 ++++ .../ynxbd/common/service/PatientService.java | 187 ++-- .../ynxbd/common/service/RecipeService.java | 2 +- .../com/ynxbd/common/service/RegService.java | 2 +- .../com/ynxbd/wx/config/WeChatConfig.java | 2 + .../com/ynxbd/wx/wxfactory/AesWxHelper.java | 6 +- .../com/ynxbd/wx/wxfactory/WxAuthHelper.java | 126 +-- .../com/ynxbd/wx/wxfactory/WxCacheHelper.java | 1 - .../com/ynxbd/wx/wxfactory/WxMiniHelper.java | 19 + src/main/resources/hcode.properties | 15 +- src/main/resources/webservice.properties | 2 +- src/main/resources/wx.properties | 11 +- 40 files changed, 1345 insertions(+), 779 deletions(-) create mode 100644 src/main/java/com/ynxbd/common/action/HealthCardAction.java create mode 100644 src/main/java/com/ynxbd/common/bean/enums/HealthCardSceneEnum.java create mode 100644 src/main/java/com/ynxbd/common/service/GMCService.java create mode 100644 src/main/java/com/ynxbd/common/service/HealthUploadService.java create mode 100644 src/main/java/com/ynxbd/wx/wxfactory/WxMiniHelper.java diff --git a/.gitignore b/.gitignore index eb585ca..212a129 100644 --- a/.gitignore +++ b/.gitignore @@ -105,3 +105,4 @@ wc.db .DS_Store /src/main/resources/druid-config.properties /src/main/resources/apiclient_cert.p12 +/catalina.home_IS_UNDEFINED diff --git a/pom.xml b/pom.xml index dfc1d42..454c17d 100644 --- a/pom.xml +++ b/pom.xml @@ -434,7 +434,7 @@ healthcard system 2.7 - ${pom.basedir}/src/main/webapp/WEB-INF/lib/open-platform-sdk-2.7-jdk1.8.jar + ${pom.basedir}/src/main/webapp/WEB-INF/lib/open-platform-sdk-3.1-jdk1.8.jar diff --git a/src/main/java/com/ynxbd/common/action/AliAction.java b/src/main/java/com/ynxbd/common/action/AliAction.java index ed9b5ff..6bd4b63 100644 --- a/src/main/java/com/ynxbd/common/action/AliAction.java +++ b/src/main/java/com/ynxbd/common/action/AliAction.java @@ -68,7 +68,7 @@ public class AliAction extends BaseAction { } else { user = new User(); user.setOpenid(openid); - user.setPatientList(new PatientService().queryPatientList(openid, null, true)); + user.setPatientList(new PatientService().queryPatientList(null, openid, null, true)); cache.put(openid, user); } @@ -82,7 +82,7 @@ public class AliAction extends BaseAction { } if (user.getPatientList() == null) { - user.setPatientList(new PatientService().queryPatientList(openid, null, true)); + user.setPatientList(new PatientService().queryPatientList(null, openid, null, true)); } AliCacheHelper.setUserAccessToken(scopes, user, accessToken); diff --git a/src/main/java/com/ynxbd/common/action/AuthAgentAction.java b/src/main/java/com/ynxbd/common/action/AuthAgentAction.java index 76d8fb0..6c7b7e5 100644 --- a/src/main/java/com/ynxbd/common/action/AuthAgentAction.java +++ b/src/main/java/com/ynxbd/common/action/AuthAgentAction.java @@ -46,7 +46,7 @@ public class AuthAgentAction extends BaseAction { item.setEnPersonId(AesWxHelper.encode(item.getPersonId())); item.setEnPersonTel(AesWxHelper.encode(item.getPersonTel())); item.setShowPersonId(ParamHelper.hideIdCardNo(item.getPersonId())); - item.setShowPersonTel(ParamHelper.hidTel(item.getPersonTel())); + item.setShowPersonTel(ParamHelper.hideTel(item.getPersonTel())); item.setPersonId(null); item.setPersonTel(null); diff --git a/src/main/java/com/ynxbd/common/action/HealthCardAction.java b/src/main/java/com/ynxbd/common/action/HealthCardAction.java new file mode 100644 index 0000000..b2f6749 --- /dev/null +++ b/src/main/java/com/ynxbd/common/action/HealthCardAction.java @@ -0,0 +1,12 @@ +package com.ynxbd.common.action; + +import com.ynxbd.common.action.base.BaseAction; +import lombok.extern.slf4j.Slf4j; +import org.apache.struts2.convention.annotation.Namespace; + +@Slf4j +@Namespace("/hc") +public class HealthCardAction extends BaseAction { + + +} diff --git a/src/main/java/com/ynxbd/common/action/HealthCodeAction.java b/src/main/java/com/ynxbd/common/action/HealthCodeAction.java index a43ed3a..4859077 100644 --- a/src/main/java/com/ynxbd/common/action/HealthCodeAction.java +++ b/src/main/java/com/ynxbd/common/action/HealthCodeAction.java @@ -39,89 +39,101 @@ import java.util.TimerTask; public class HealthCodeAction extends BaseAction { /** - * 查询患者集合 + * [患者]查询信息 + */ + @Action("getPatientByIdCardNo") + public Result getPatientByIdCardNo(@AesDecode String openid, @AesDecode String idCardNo) { + log.info("[电子健康卡]根据身份证和openId查询患者信息 openid={}, idCardNo={}", openid, idCardNo); + if (openid == null || idCardNo == null) { + return Result.error(ResultEnum.PARAM_IS_DEFECT); + } + + Patient patient = new PatientDao().selectByIdCardNo(openid, idCardNo); + return Result.success(patient); + } + + /** + * [电子健康卡]查询患者集 */ @Action("getHealthCardList") - public Result getHealthCardList(String openid) { - log.info("[电子健康卡]获取用户数据 openid={}", openid); + public Result getHealthCardList(@AesDecode String openid) { + log.info("[电子健康卡]查询患者集 openid={}", openid); if (openid == null) { return Result.error(ResultEnum.PARAM_IS_DEFECT); } - List patients = new PatientDao().selectHealthCardListByOpenid(openid); return Result.success(patients); } + // @Action("appBindHealthCard") +// public Result appBindHealthCard(String openid, String healthCode) { +// log.info("[新版电子健康卡]H5嵌入链接绑卡-通过healthCode获取健康卡数据 healthCode={}, openid={}", healthCode, openid); +// if (healthCode == null || openid == null) return Result.error(ResultEnum.PARAM_IS_DEFECT); // 参数为空 +// +// Patient patient = HCodeService.appBindHealthCard(healthCode); // 通过健康卡授权码获取健康卡的用户信息 +// if (patient == null) { +// log.info("[新版电子健康卡]H5嵌入链接绑卡 获取用户信息失败"); +// return Result.error("[新版电子健康卡]H5嵌入链接绑卡 获取用户信息失败"); +// } +// return Result.success(patient); +// } + /** - * 根据身份证和openid取二维码 + * 获取HIS地区编码信息 */ - @Action("getPatientByIdCardNo") - public Result getPatientByIdCardNo(String openid, String idCardNo) { - log.info("[电子健康卡]根据身份证和openid取二维码 openid={}, idCardNo={}", openid, idCardNo); - if (openid == null || idCardNo == null) { - return Result.error(ResultEnum.PARAM_IS_DEFECT); + @Action("getArea") + public Result getArea(Integer level, String areaCode) { + try { + return Result.success(new HisPatientDao().getArea(level, areaCode)); + } catch (Exception e) { + return Result.error(e); } - - Patient patient = new PatientDao().selectByIdCardNo(openid, idCardNo); - return Result.success(patient); } - /** * 获取token,用于绑卡 */ @Action("getAppToken") - public Result getAppToken() { - String appToken = new HCodeService().getAppToken(); + public Result getAppToken(Boolean isMiniApp) { + String appToken = HCodeService.getAppToken(isMiniApp, true); return appToken == null ? Result.error() : Result.success(); } - @Action("appBindHealthCard") - public Result appBindHealthCard(String openid, String healthCode) { - log.info("[新版电子健康卡]H5嵌入链接绑卡-通过healthCode获取健康卡数据 healthCode={}, openid={}", healthCode, openid); - if (healthCode == null || openid == null) return Result.error(ResultEnum.PARAM_IS_DEFECT); // 参数为空 - - Patient patient = new HCodeService().appBindHealthCard(healthCode); // 通过健康卡授权码获取健康卡的用户信息 - if (patient == null) { - log.info("[新版电子健康卡]H5嵌入链接绑卡 获取用户信息失败"); - return Result.error("[新版电子健康卡]H5嵌入链接绑卡 获取用户信息失败"); - } - return Result.success(patient); - } - /** * [电子健康卡]通过二维码获取健康卡数据 * * @param qrCode 二维码 */ @Action("getHealthCardByQrCode") - public Result getHealthCardByQrCode(String qrCode) { - log.info("[电子健康卡]通过二维码获取健康卡数据 qrCode={}", qrCode); + public Result getHealthCardByQrCode(Boolean isMiniApp, String qrCode) { + log.info("[电子健康卡]通过二维码获取健康卡数据 isMiniApp={}, qrCode={}", isMiniApp, qrCode); if (qrCode == null) { - return Result.error(ResultEnum.PARAM_IS_DEFECT); // 参数为空 + return Result.error(ResultEnum.PARAM_IS_DEFECT); } - Patient patient = new HCodeService().getHealthCardByQrCode(qrCode); + Patient patient = HCodeService.getHealthCardByQrCode(isMiniApp, qrCode); return patient == null ? Result.error() : Result.success(patient); } + /** * 获取健康卡二维码 - * * @param appToken appToken - * * @param healthCardId 健康卡ID - * * @param idCardNo 证件号码 - * * @param codeType 传0或者1,0返回动态码,1返回静态码 + * + * @param isMiniApp isMiniApp + * @param idCardNo 证件号码 + * @param healthCardId 健康卡ID + * @return result */ @Action("getDynamicQRCode") - public Result getDynamicQRCode(String idCardNo, String healthCardId) { + public Result getDynamicQRCode(Boolean isMiniApp, String idCardNo, String healthCardId) { log.info("[电子健康卡]获取二维码 healthCardId={}, idCardNo={}", healthCardId, idCardNo); if (healthCardId == null || idCardNo == null) { return Result.error(ResultEnum.PARAM_IS_DEFECT); // 参数缺失 } - JSONObject result = new HCodeService().getDynamicQRCode(healthCardId, idCardNo, "0"); + JSONObject result = HCodeService.getDynamicQRCode(isMiniApp, healthCardId, idCardNo, "0"); return result == null ? Result.error() : Result.success(result); } @@ -129,36 +141,21 @@ public class HealthCodeAction extends BaseAction { * 获取卡包订单ID */ @Action("getCardOrderId") - public Result getCardOrderId(String idCardNo, String healthCardId) { + public Result getCardOrderId(Boolean isMiniApp, String idCardNo, String healthCardId) { log.info("[电子健康卡]获取卡包订单ID healthCardId={}, idCardNo={}", healthCardId, idCardNo); if (healthCardId == null || idCardNo == null) { return Result.error(ResultEnum.PARAM_IS_DEFECT); // 参数缺失 } - HCodeService hCodeService = new HCodeService(); - String qrCodeText = hCodeService.getQRCodeText(healthCardId, idCardNo); + String qrCodeText = HCodeService.getQRCodeText(isMiniApp, healthCardId, idCardNo); if (qrCodeText == null) { return Result.error(ResultEnum.PARAM_IS_DEFECT); // qrCodeText参数缺失 } - - JSONObject result = hCodeService.getCardOrderId(qrCodeText); - + JSONObject result = HCodeService.getCardOrderId(isMiniApp, qrCodeText); return result == null ? Result.error() : Result.success(result); } - /** - * 获取卡包订单ID - */ - @Action("getArea") - public Result getArea(Integer level, String areaCode) { - try { - return Result.success(new HisPatientDao().getArea(level, areaCode)); - } catch (Exception e) { - return Result.error(e); - } - } - /** * 健康卡[上报数据] * @@ -173,13 +170,12 @@ public class HealthCodeAction extends BaseAction { return Result.error(ResultEnum.PARAM_IS_DEFECT); } - HCodeService hCodeService = new HCodeService(); - String qrCodeText = hCodeService.getQRCodeText(healthCardId, idCardNo); + String qrCodeText = HCodeService.getQRCodeText(false, healthCardId, idCardNo); if (qrCodeText == null) { return Result.error(ResultEnum.INTERFACE_OUTER_INVOKE_ERROR); } - JSONObject jsonObject = hCodeService.reportHISData(qrCodeText, null, scene, HealthCardEnum.CARD_TYPE_HEALTH_CARD.STATUS, null); + JSONObject jsonObject = HCodeService.reportHISData(qrCodeText, null, scene, HealthCardEnum.CARD_TYPE_HEALTH_CARD.STATUS, null); if (jsonObject == null) { return Result.error(); } @@ -191,7 +187,7 @@ public class HealthCodeAction extends BaseAction { * [电子健康卡]患者绑定(成人) */ @Action("bind") - public Result bind(boolean isAreaCode, boolean isFace, String orderId, String registerOrderId, String address, String areaCode, String areaAddress, String openid, String tel, String sex, String name, String nation, String birthday, String idCardNo, String cardType, Boolean isHealthCard, String healthCardId, String wechatCode, String enOpenId, String enUnionId, String enGmcOpenId, String enHospAppId) { + public Result bind(Boolean isMiniApp, boolean isAreaCode, boolean isFace, String orderId, String registerOrderId, String address, String areaCode, String areaAddress, String openid, String tel, String sex, String name, String nation, String birthday, String idCardNo, String cardType, Boolean isHealthCard, String healthCardId, String wechatCode, String enOpenId, String enUnionId, String enGmcOpenId, String enHospAppId) { log.info("[电子健康卡]身份绑定 name={}, address={}, areaCode={}, areaAddress={}, nation={}, sex={}, birthday={}, tel={}, healthCardId={}, cardType={}, enUnionId={}, openId={}, enOpenId={}, enGmcOpenId={}, enChildAppId={}", name, address, areaCode, areaAddress, nation, sex, birthday, tel, healthCardId, cardType, enUnionId, openid, enOpenId, enGmcOpenId, enHospAppId); if (isHealthCard == null || openid == null || tel == null || sex == null || birthday == null || name == null) { @@ -203,9 +199,8 @@ public class HealthCodeAction extends BaseAction { return Result.error(ResultEnum.PARAM_IS_INVALID); } - HCodeService hCodeService = new HCodeService(); - if (isFace) { // 实名认证 - if (!hCodeService.checkUniformVerifyResult(orderId, registerOrderId)) { + if (isHealthCard && isFace) { // 实名认证 + if (!HCodeService.checkUniformVerifyResult(isMiniApp, orderId, registerOrderId)) { return Result.error(ResultEnum.FACE_VERIFY_ERROR); } } @@ -251,7 +246,7 @@ public class HealthCodeAction extends BaseAction { } // 先注册,后修改-->先获取健康卡ID - JSONObject respObj = hCodeService.registerHealthCard(null, wechatCode, birthday, cardTypeEnum, address, areaAddress, sex, nation, name, idCardNo, tel); + JSONObject respObj = HCodeService.registerHealthCard(isMiniApp, null, wechatCode, birthday, cardTypeEnum, address, areaAddress, sex, nation, name, idCardNo, tel); if (respObj == null) { log.info("[电子健康卡]注册健康卡失败,响应内容为空"); @@ -263,9 +258,8 @@ public class HealthCodeAction extends BaseAction { // 响应处理 String errMsg = respObj.getString("errMsg"); String resultCode = respObj.getString("resultCode"); - HealthCardRespCodeEnum healthCardRespCodeEnum = hCodeService.resultCodeHandle(resultCode); + HealthCardRespCodeEnum healthCardRespCodeEnum = HealthCardRespCodeEnum.findEnumByResultCode(resultCode); log.info("[电子健康卡] 绑定失败原因 resultCode={}, errMsg={}, statusMsg={}", resultCode, errMsg, healthCardRespCodeEnum.MESSAGE); -// if (!healthCardRespCodeEnum.IS_CONTINUE) { // 不继续执行 if (!healthCardRespCodeEnum.equals(HealthCardRespCodeEnum._10060)) { // 姓名和身份证不一致 return Result.error(healthCardRespCodeEnum.MESSAGE); @@ -301,26 +295,25 @@ public class HealthCodeAction extends BaseAction { bindInfo.setEnUnionId(enUnionId); bindInfo.setEnHospAppId(enHospAppId); bindInfo.setEnGmcOpenId(enGmcOpenId); - return new PatientService().bindCard(request, false, isAreaCode, bindInfo); } /** - * [一键绑定]-->获取健康卡用户信息 + * 获取健康卡用户信息 * * @param openid openid * @param healthCode 健康卡授权码-->用来获取健康卡用户信息 */ @Action("getHealthCardInfo") - public Result getHealthCardInfo(String openid, String healthCode) { - log.info("[电子健康卡]一键绑定 获取健康卡用户信息 healthCode={}, openid={}", healthCode, openid); - if (healthCode == null || openid == null) return Result.error(ResultEnum.PARAM_IS_DEFECT); // 参数为空 + public Result getHealthCardInfo(Boolean isMiniApp, String openid, String healthCode) { + log.info("[电子健康卡]获取健康卡用户信息 healthCode={}, openid={}", healthCode, openid); + if (healthCode == null || openid == null) return Result.error(ResultEnum.PARAM_IS_DEFECT); - Patient patient = new HCodeService().getInfoByHealthCode(healthCode); // 通过健康卡授权码获取健康卡的用户信息 + Patient patient = HCodeService.getHealthCardByHealthCode(isMiniApp, healthCode); if (patient == null) { - log.info("[电子健康卡]一键绑定 获取用户信息失败"); - return Result.error("[电子健康卡]一键绑定 获取用户信息失败"); + log.info("[电子健康卡]获取健康卡用户信息-失败"); + return Result.error("[电子健康卡]获取健康卡用户信息-失败"); } return Result.success(patient); } @@ -338,7 +331,6 @@ public class HealthCodeAction extends BaseAction { * @param nation nation * @param patientId patientId * @param address address - * @return Result */ @Action("upBind") public Result upBind(String wechatCode, String idCardNo, String cardType, String openid, String tel, String name, String nation, String patientId, String address) { @@ -364,9 +356,8 @@ public class HealthCodeAction extends BaseAction { return Result.error(ResultEnum.PARAM_TYPE_ERROR); } - HCodeService hCodeService = new HCodeService(); // 先注册,后修改-->先获取健康卡ID - JSONObject rspObj = hCodeService.registerHealthCard(patientId, wechatCode, birthday, cardTypeEnum, address, null, sex, nation, name, idCardNo, tel); + JSONObject rspObj = HCodeService.registerHealthCard(false, patientId, wechatCode, birthday, cardTypeEnum, address, null, sex, nation, name, idCardNo, tel); if (rspObj == null) { log.info("[电子健康卡]升级绑定失败, 响应内容为空"); return Result.error("[电子健康卡]升级绑定失败, 响应内容为空"); @@ -377,7 +368,7 @@ public class HealthCodeAction extends BaseAction { // 响应处理 String errMsg = rspObj.getString("errMsg"); String resultCode = rspObj.getString("resultCode"); - HealthCardRespCodeEnum healthCardRespCodeEnum = hCodeService.resultCodeHandle(resultCode); + HealthCardRespCodeEnum healthCardRespCodeEnum = HealthCardRespCodeEnum.findEnumByResultCode(resultCode); log.info("[电子健康卡]升级绑定失败原因 resultCode={}, errMsg={}, statusMsg={}", resultCode, errMsg, healthCardRespCodeEnum.MESSAGE); return Result.error(healthCardRespCodeEnum.MESSAGE); @@ -407,12 +398,12 @@ public class HealthCodeAction extends BaseAction { * 身份证识别 */ @Action("orcInfo") - public Result orcInfo(String image) { + public Result orcInfo(Boolean isMiniApp, String image) { log.info("身份证识别"); if (image == null) { return Result.error(ResultEnum.PARAM_IS_DEFECT); } - Patient patient = new HCodeService().orcInfo(image); + Patient patient = HCodeService.orcInfo(isMiniApp, image); return Result.success(patient); } @@ -423,7 +414,6 @@ public class HealthCodeAction extends BaseAction { * @param idCardNo idCardNo * @param name name * @param wechatCode wechatCode - * @return result */ @Action("registerUniformVerifyOrder") public Result registerUniformVerifyOrder(String idCardNo, String name, String wechatCode) { @@ -431,21 +421,23 @@ public class HealthCodeAction extends BaseAction { if (idCardNo == null || name == null || wechatCode == null) { return Result.error(ResultEnum.PARAM_IS_DEFECT); // 参数为空 } - String orderId = new HCodeService().registerUniformVerifyOrder(idCardNo, name, wechatCode); + String orderId = HCodeService.bindUniformVerifyOrder(idCardNo, name, wechatCode); return ObjectUtils.isEmpty(orderId) ? Result.error() : Result.success(orderId); } /** * 实人认证结果查询接口 - * * @param qrCodeText 二维码编码 + * + * @param orderId orderId + * @param registerOrderId registerOrderId */ @Action("checkUniformVerifyResult") - public Result checkUniformVerifyResult(String orderId, String registerOrderId) { + public Result checkUniformVerifyResult(Boolean isMiniApp, String orderId, String registerOrderId) { log.info("[电子健康卡]实人认证结果查询 orderId={}, registerOrderId={}", orderId, registerOrderId); if (orderId == null || registerOrderId == null) { return Result.error(ResultEnum.PARAM_IS_DEFECT); // 参数为空 } - return Result.isOK(new HCodeService().checkUniformVerifyResult(orderId, registerOrderId)); + return Result.isOK(HCodeService.checkUniformVerifyResult(isMiniApp, orderId, registerOrderId)); } @@ -458,7 +450,7 @@ public class HealthCodeAction extends BaseAction { List lstPatient = new PatientDao().selectPatient4BatchUpdateHealthCard(); JSONArray jsonArray = null; try { - jsonArray = new HCodeService().batchUpdate(lstPatient); + jsonArray = HCodeService.batchUpdate(lstPatient); } catch (Exception e) { log.error(e.getMessage()); } @@ -475,4 +467,15 @@ public class HealthCodeAction extends BaseAction { }, 2 * 1000, 30 * 1000); } + + /** + * [电子健康卡]绑卡验证授权 + */ + @Action("registerHealthCardPreAuth") + public Result registerHealthCardPreAuth(Boolean isMiniApp, String wechatCode, String healthCode, String openId) { + log.info("[电子健康卡]绑卡验证授权 isMiniApp={}, wechatCode={}, healthCode={}, openId={}", isMiniApp, wechatCode, healthCode, openId); + JSONObject result = HCodeService.registerHealthCardPreAuth(isMiniApp, WeChatConfig.getDomain(true), wechatCode, healthCode, openId); + return Result.success(result); + } + } diff --git a/src/main/java/com/ynxbd/common/action/PatientAction.java b/src/main/java/com/ynxbd/common/action/PatientAction.java index 885ecb3..790c626 100644 --- a/src/main/java/com/ynxbd/common/action/PatientAction.java +++ b/src/main/java/com/ynxbd/common/action/PatientAction.java @@ -3,6 +3,7 @@ package com.ynxbd.common.action; import com.ynxbd.common.action.base.BaseAction; import com.ynxbd.common.bean.Patient; import com.ynxbd.common.bean.PatientLink; +import com.ynxbd.common.bean.User; import com.ynxbd.common.bean.enums.HCardTypeEnum; import com.ynxbd.common.config.interceptor.AesDecode; import com.ynxbd.common.dao.PatientDao; @@ -13,7 +14,8 @@ import com.ynxbd.common.result.Result; import com.ynxbd.common.result.ResultEnum; import com.ynxbd.common.result.ServiceException; import com.ynxbd.common.service.PatientService; -import com.ynxbd.wx.wxfactory.AesWxHelper; +import com.ynxbd.wx.config.WeChatConfig; +import com.ynxbd.wx.wxfactory.WxCacheHelper; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ObjectUtils; import org.apache.struts2.convention.annotation.Action; @@ -31,19 +33,13 @@ public class PatientAction extends BaseAction { */ @Action("getHisInfoByPatientId") public Result getHisInfoByPatientId(@AesDecode String patientId) { - log.info("[患者]根据patientId查询HIS信息 patientId={}", patientId); - if (patientId == null) { - return Result.error(ResultEnum.PARAM_IS_BLANK); - } try { - JsonResult jsonResult = new HisPatientDao().selectPatientInfo(patientId, "999"); - if (!jsonResult.success()) { - return Result.error(jsonResult.getMessage()); - } - Patient patient = jsonResult.dataMapToBean(Patient.class); - if (patient == null) { - return Result.error(ResultEnum.DATA_NOT_FOUND); + log.info("[患者]根据patientId查询HIS信息 patientId={}", patientId); + if (patientId == null) { + return Result.error(ResultEnum.PARAM_IS_BLANK); } + + Patient patient = new PatientService().queryPatientByPatientId(patientId); String encode = Base64Helper.encode(patient, true); if (encode == null) { return Result.error(); @@ -339,4 +335,26 @@ public class PatientAction extends BaseAction { } } + + /** + * [患者]查询列表 + */ + @Action("queryPatientList") + public Result queryPatientList(@AesDecode String openId, @AesDecode String hospAppId) { + log.info("[患者]查询列表 hospAppId={}, openId={}", hospAppId, openId); + if (openId == null || hospAppId == null) { + return Result.error(ResultEnum.PARAM_IS_DEFECT); + } + if (!hospAppId.equals(WeChatConfig.APP_ID)) { + return Result.error(ResultEnum.PARAM_IS_INVALID); + } + User user = WxCacheHelper.getCacheUser(openId); + List patients; + if (user == null) { + patients = new PatientService().queryPatientList(request, openId, null, true); + } else { + patients = user.getPatientList(); + } + return Result.success(patients); + } } diff --git a/src/main/java/com/ynxbd/common/action/RegisterAction.java b/src/main/java/com/ynxbd/common/action/RegisterAction.java index 8c5bfac..d2152bf 100644 --- a/src/main/java/com/ynxbd/common/action/RegisterAction.java +++ b/src/main/java/com/ynxbd/common/action/RegisterAction.java @@ -1,7 +1,6 @@ package com.ynxbd.common.action; import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; import com.ynxbd.ali.helper.AliUploadHelper; import com.ynxbd.common.action.base.BaseAction; import com.ynxbd.common.bean.*; @@ -35,8 +34,6 @@ import java.util.stream.Collectors; @Slf4j @Namespace("/register") public class RegisterAction extends BaseAction { - - /** * [推送] 获取预约今日的所有患者openId * @@ -507,9 +504,21 @@ public class RegisterAction extends BaseAction { return Result.success(regList); } + List noRepeatPatients = new ArrayList<>(); + for (Patient pItem : patients) { + String patientId = pItem.getPatientId(); + if(ObjectUtils.isEmpty(patientId)){ + continue; + } + Patient findItem = noRepeatPatients.stream().filter(o -> patientId.equals(o.getPatientId())).findFirst().orElse(null); + if (findItem == null) { + noRepeatPatients.add(pItem); + } + } + List treatNumList = new ArrayList<>(); String curDate = DateHelper.getCurDate(); - for (Patient pItem : patients) { + for (Patient pItem : noRepeatPatients) { String patientId = pItem.getPatientId(); List hisWaitRegRecords = new RegService().getHisWaitRegRecords(patientId); if (hisWaitRegRecords != null && !hisWaitRegRecords.isEmpty()) { diff --git a/src/main/java/com/ynxbd/common/action/auth/WxAuthAction.java b/src/main/java/com/ynxbd/common/action/auth/WxAuthAction.java index b633aa4..a5a925b 100644 --- a/src/main/java/com/ynxbd/common/action/auth/WxAuthAction.java +++ b/src/main/java/com/ynxbd/common/action/auth/WxAuthAction.java @@ -3,6 +3,7 @@ package com.ynxbd.common.action.auth; import com.ynxbd.common.action.base.BaseAction; import com.ynxbd.common.result.Result; import com.ynxbd.wx.wxfactory.WxAuthHelper; +import com.ynxbd.wx.wxfactory.WxMiniHelper; import lombok.extern.slf4j.Slf4j; import org.apache.struts2.convention.annotation.Action; import org.apache.struts2.convention.annotation.Namespace; @@ -34,4 +35,10 @@ public class WxAuthAction extends BaseAction { // 支付使用普通授权 return WxAuthHelper.isAuth(request, response); } + + @Action("mini_auth") + public Result mini_auth(String jsCode) { + String auth = WxMiniHelper.auth(jsCode); + return Result.success(); + } } diff --git a/src/main/java/com/ynxbd/common/action/weihu/DataWHAction.java b/src/main/java/com/ynxbd/common/action/weihu/DataWHAction.java index 7cc1a01..beaf93a 100644 --- a/src/main/java/com/ynxbd/common/action/weihu/DataWHAction.java +++ b/src/main/java/com/ynxbd/common/action/weihu/DataWHAction.java @@ -1,24 +1,25 @@ package com.ynxbd.common.action.weihu; -import com.ynxbd.common.bean.pay.Order; -import com.ynxbd.common.dao.RecipeDao; import com.ynxbd.common.result.Result; import lombok.extern.slf4j.Slf4j; import org.apache.struts2.convention.annotation.Action; import org.apache.struts2.convention.annotation.Namespace; -import java.util.List; - @Slf4j @Namespace("/data_wh") public class DataWHAction { - @Action("getData") - public Result getData(String callNo) { - String begTime = "2025-10-27"; - String endTime = "2025-12-08"; + public Result getData() { + String begDate = "2025-10-27"; + String endDate = "2025-12-08"; + return Result.success(); + } + + + @Action("wh") + public Result wh() { return Result.success(); } diff --git a/src/main/java/com/ynxbd/common/bean/Patient.java b/src/main/java/com/ynxbd/common/bean/Patient.java index c48f1b0..e1501ef 100644 --- a/src/main/java/com/ynxbd/common/bean/Patient.java +++ b/src/main/java/com/ynxbd/common/bean/Patient.java @@ -1,10 +1,13 @@ package com.ynxbd.common.bean; import com.ynxbd.common.bean.enums.HCardTypeEnum; +import com.ynxbd.common.helper.common.ParamHelper; +import com.ynxbd.wx.wxfactory.AesWxHelper; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import lombok.ToString; +import org.apache.commons.lang3.ObjectUtils; import java.io.Serializable; @@ -50,7 +53,7 @@ public class Patient implements Serializable { private String county; // 支付宝认证令牌 private String accessToken; - + // private String accessCode; // private String updateTime; @@ -81,29 +84,62 @@ public class Patient implements Serializable { private String gmcUniqueId; // 子公众号的AppId private String hospAppId; - // 医共体HIS患者Id - private String gmcHisPatientId; // private Integer gmcBindState; - // 认证加密openid private String enUnionId; private String enOpenId; private String enGmcOpenId; private String enHospAppId; + // BindingFlag:值为1时,说明患者尚未绑定或建档 + private String bindingFlag; private HCardTypeEnum cardTypeEnum; - + // HIS绑定 + public boolean hasHisBind() { + return "1".equals(this.bindingFlag); + } // 清除监护人信息 public void clearGuardianData() { this.fatherName = null; this.fatherIdCardNo = null; this.fatherTel = null; - + // this.motherName = null; this.motherIdCardNo = null; this.motherTel = null; } + + /** + * 数据过滤 + * + * @param isClearCardNoAndTel 是否清除证件号和电话 + */ + public void filterData(boolean isClearCardNoAndTel) { + boolean noneCardNo = ObjectUtils.isEmpty(this.idCardNo); // 无证件号 + // 患者ID + this.enPatientId = AesWxHelper.encode(this.patientId, true); + // 身份证 + this.showCardNo = ParamHelper.hideIdCardNo(this.idCardNo); + this.enCardNo = AesWxHelper.encode(this.idCardNo, true); + + // 电话 + this.showTel = ParamHelper.hideTel(this.tel); + this.enTel = AesWxHelper.encode(this.tel, true); + + if (noneCardNo) { // 无证绑定数据显示过滤 + this.fatherIdCardNo = ParamHelper.hideIdCardNo(this.fatherIdCardNo); + this.fatherTel = ParamHelper.hideTel(this.fatherTel); + + this.motherIdCardNo = ParamHelper.hideIdCardNo(this.motherIdCardNo); + this.motherTel = ParamHelper.hideTel(this.motherTel); + } + + if (isClearCardNoAndTel) { + this.tel = null; + this.idCardNo = null; + } + } } diff --git a/src/main/java/com/ynxbd/common/bean/enums/HealthCardRespCodeEnum.java b/src/main/java/com/ynxbd/common/bean/enums/HealthCardRespCodeEnum.java index a5447cd..5a2ca90 100644 --- a/src/main/java/com/ynxbd/common/bean/enums/HealthCardRespCodeEnum.java +++ b/src/main/java/com/ynxbd/common/bean/enums/HealthCardRespCodeEnum.java @@ -1,6 +1,7 @@ package com.ynxbd.common.bean.enums; import lombok.ToString; +import lombok.extern.slf4j.Slf4j; /** * 微信电子健康卡异常信息 @@ -9,6 +10,7 @@ import lombok.ToString; * @Date 2020/10/13 11:45 * @Copyright @ 2020 云南新八达科技有限公司 All rights reserved. */ +@Slf4j @ToString public enum HealthCardRespCodeEnum { // 自定义 @@ -121,4 +123,27 @@ public enum HealthCardRespCodeEnum { this.IS_RESULT = IS_RESULT; this.IS_CONTINUE = IS_CONTINUE; } + + + /** + * 响应码处理 + * + * @param resultCode 响应码 + * @return 返回响应码对应的消息 + */ + public static HealthCardRespCodeEnum findEnumByResultCode(String resultCode) { + HealthCardRespCodeEnum respEnum = HealthCardRespCodeEnum.CONTINUE; + for (HealthCardRespCodeEnum e : HealthCardRespCodeEnum.values()) { + if (e.STATUS.equals(resultCode)) { + if (e.IS_RESULT) { // 是否返回枚举中的信息 + respEnum = e; + } else { + log.info("[电子健康卡]异常信息:{}", e.MESSAGE); + respEnum = e.IS_CONTINUE ? HealthCardRespCodeEnum.CONTINUE : e; + } + break; + } + } + return respEnum; + } } diff --git a/src/main/java/com/ynxbd/common/bean/enums/HealthCardSceneEnum.java b/src/main/java/com/ynxbd/common/bean/enums/HealthCardSceneEnum.java new file mode 100644 index 0000000..4a44f59 --- /dev/null +++ b/src/main/java/com/ynxbd/common/bean/enums/HealthCardSceneEnum.java @@ -0,0 +1,37 @@ +package com.ynxbd.common.bean.enums; + +// 查报告等需要验证的场景 + +import lombok.ToString; + +@ToString +public enum HealthCardSceneEnum { + _0101081("0101081", "查(取)检查报告"), + _0101082("0101082", "查(取)检验报告"), + _0101083("0101083", "查(取)体检报告"), + + _010108("010108", "查询就医记录"), + _010101("010101", "挂号"), + _0101011("0101011", "预约挂号"), + _0101012("0101012", "当日挂号"), + _0101013("0101013", "挂号记录"), + _01010116("01010116", "预约社区挂号"), + + _02010184("02010184", "健康码出示查验"), + _0201017("0201017", "家庭医生服务"), + _0201091("0201091", "健康档案"), + _0201032("0201032", "疫苗接种记录"), + _02010322("02010322", "疫苗接种核验"), + _0101023("0101023", "病历查询与打印"), + ; + + public final String CODE; + + public final String NAME; + + HealthCardSceneEnum(String CODE, String NAME) { + this.CODE = CODE; + this.NAME = NAME; + } + +} diff --git a/src/main/java/com/ynxbd/common/bean/pay/Order.java b/src/main/java/com/ynxbd/common/bean/pay/Order.java index 3a92439..87e2a44 100644 --- a/src/main/java/com/ynxbd/common/bean/pay/Order.java +++ b/src/main/java/com/ynxbd/common/bean/pay/Order.java @@ -169,7 +169,7 @@ public class Order implements Serializable { if (!ObjectUtils.isEmpty(_tel)) { this.tel = null; this.enTel = AesWxHelper.encode(_tel); - this.showTel = ParamHelper.hidTel(_tel); + this.showTel = ParamHelper.hideTel(_tel); } if (!ObjectUtils.isEmpty(this.patientId)) { 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 90250cd..365f9d4 100644 --- a/src/main/java/com/ynxbd/common/bean/pay/Register.java +++ b/src/main/java/com/ynxbd/common/bean/pay/Register.java @@ -147,6 +147,7 @@ public class Register extends Order { patientId, deptCode, doctCode, regCode, regDate, tid); throw new ServiceException(ResultEnum.PARAM_IS_DEFECT); } + System.out.println("[挂号]证件号码:" + cardNo); // 此处打印不存日志 if (payMoney == null || totalFee == null) { log.info("[挂号]参数缺失 payMoney"); diff --git a/src/main/java/com/ynxbd/common/config/interceptor/MethodInterceptor.java b/src/main/java/com/ynxbd/common/config/interceptor/MethodInterceptor.java index cb8a0c6..7b43746 100644 --- a/src/main/java/com/ynxbd/common/config/interceptor/MethodInterceptor.java +++ b/src/main/java/com/ynxbd/common/config/interceptor/MethodInterceptor.java @@ -135,11 +135,13 @@ public class MethodInterceptor extends org.apache.struts2.interceptor.AbstractIn } catch (Exception e) { e.printStackTrace(); if (e.getMessage() == null) { + System.out.println("异常1"); Throwable cause = e.getCause(); if (cause != null) { ErrorHelper.println((Exception) cause); } } else { + System.out.println("异常2"); ErrorHelper.println(e); } return "SUCCESS"; diff --git a/src/main/java/com/ynxbd/common/dao/GMCUserDao.java b/src/main/java/com/ynxbd/common/dao/GMCUserDao.java index 61721ad..f3c8ce4 100644 --- a/src/main/java/com/ynxbd/common/dao/GMCUserDao.java +++ b/src/main/java/com/ynxbd/common/dao/GMCUserDao.java @@ -21,13 +21,13 @@ public class GMCUserDao { /** * 添加关系 */ - public boolean insert(String wxOpenId, String gmcOpenId, String gmcUnionId, String gmcUUId) { - String sql = "insert into gmc_user(updateTime, wxOpenId, gmcOpenId, gmcUnionId, gmcUUId, childAppId) values (now(),?,?,?,?)"; + public boolean insert(String wxOpenId, String gmcOpenId, String gmcUnionId, String gmcUniqueId) { + String sql = "insert into gmc_user(updateTime, wxOpenId, gmcOpenId, gmcUnionId, gmcUniqueId) values (now(),?,?,?,?)"; return DataBase.insert(sql, ps -> { ps.setString(1, wxOpenId); ps.setString(2, gmcOpenId); ps.setString(3, gmcUnionId); - ps.setString(4, gmcUUId); + ps.setString(4, gmcUniqueId); }) > 0; } } diff --git a/src/main/java/com/ynxbd/common/dao/PatientDao.java b/src/main/java/com/ynxbd/common/dao/PatientDao.java index 8396e77..d90c11c 100644 --- a/src/main/java/com/ynxbd/common/dao/PatientDao.java +++ b/src/main/java/com/ynxbd/common/dao/PatientDao.java @@ -100,7 +100,7 @@ public class PatientDao { ps.setString(1, openid); ps.setString(2, idCardNo); }); - return resultList.size() > 0 ? resultList.get(0) : null; + return !resultList.isEmpty() ? resultList.get(0) : null; } /** @@ -154,7 +154,7 @@ public class PatientDao { * @return 患者信息 */ public List selectPatientsByOpenId(String openId) { - String sql = "select patientId, name, sex, birthday, idCardNo, tel from patientBase where openId= ? and deletedState = 0 order by isDefault desc"; + String sql = "select patientId, name, sex, birthday, idCardNo, tel from patientBase where openId= ? and deletedState = 0 order by isDefault desc, id asc"; return DataBase.select(sql, Patient.class, ps -> { ps.setString(1, openId); }); @@ -168,7 +168,7 @@ public class PatientDao { * @return 是否成功 */ public boolean removePatient(String openid, String patientId) { - String sql = "update patientBase set updateTime=now(), deletedState=1 where openid=? and patientId=?"; + String sql = "update patientBase set updateTime=now(), age=null, deletedState=1 where openid=? and patientId=?"; return DataBase.update(sql, ps -> { ps.setString(1, openid); ps.setString(2, patientId); @@ -183,12 +183,10 @@ public class PatientDao { * @return 是否成功 */ public boolean updateInfo(Patient bindInfo) { - String sql = "update patientBase set deletedState=0, healthCardId=?, name=?, nation=?, tel=?, address=?, uuid=?, areaCode=?, areaAddress=?, patientId=?, gmcHisPatientId=?, gmcBindState=1, " + + String sql = "update patientBase set deletedState=0, healthCardId=?, name=?, nation=?, tel=?, address=?, uuid=?, areaCode=?, areaAddress=?, patientId=?, " + " uniqueId=if(uniqueId is null or uniqueId = '', ?, uniqueId), " + - " gmcUniqueId=if(gmcUniqueId is null or gmcUniqueId = '', ?, gmcUniqueId), " + - " hospAppId=if(hospAppId is null or hospAppId = '', ?, hospAppId) " + + " gmcUniqueId=if(gmcUniqueId is null or gmcUniqueId = '', ?, gmcUniqueId) " + " where openid=? and idCardNo=?"; - return DataBase.update(sql, ps -> { ps.setString(1, bindInfo.getHealthCardId()); ps.setString(2, bindInfo.getName()); @@ -199,13 +197,11 @@ public class PatientDao { ps.setString(7, bindInfo.getAreaCode()); ps.setString(8, bindInfo.getAreaAddress()); ps.setString(9, bindInfo.getPatientId()); - ps.setString(10, bindInfo.getGmcHisPatientId()); - ps.setString(11, CodeHelper.get32UUID()); - ps.setString(12, bindInfo.getGmcUniqueId()); - ps.setString(13, bindInfo.getHospAppId()); + ps.setString(10, CodeHelper.get32UUID()); + ps.setString(11, bindInfo.getGmcUniqueId()); // 条件 - ps.setString(14, bindInfo.getOpenid()); - ps.setString(15, bindInfo.getIdCardNo()); + ps.setString(12, bindInfo.getOpenid()); + ps.setString(13, bindInfo.getIdCardNo()); }) > 0; } @@ -227,8 +223,8 @@ public class PatientDao { * @return bool */ public boolean insert(boolean isMyself, Patient bindData) { - String sql = "insert into patientBase(bindDate, openid, patientId, hisTransNo, name, sex, idCardNo, tel, birthday, nation, healthCardId, age, uuid, fatherName, fatherTel, fatherIDCardNo, motherName, motherTel, motherIDCardNo, address, areaCode, areaAddress, isMyself, cardType, unionId, hospAppId, gmcUniqueId, gmcHisPatientId, gmcBindState, uniqueId) " + - " values(now(), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; + String sql = "insert into patientBase(bindDate, openid, patientId, hisTransNo, name, sex, idCardNo, tel, birthday, nation, healthCardId, age, uuid, fatherName, fatherTel, fatherIDCardNo, motherName, motherTel, motherIDCardNo, address, areaCode, areaAddress, isMyself, cardType, unionId, hospAppId, gmcUniqueId, uniqueId) " + + " values(now(), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; HCardTypeEnum cardTypeEnum = bindData.getCardTypeEnum(); @@ -261,9 +257,7 @@ public class PatientDao { ps.setString(24, bindData.getUnionId()); ps.setString(25, bindData.getHospAppId()); ps.setString(26, bindData.getGmcUniqueId()); - ps.setString(27, bindData.getGmcHisPatientId()); - ps.setInt(28, bindData.getGmcBindState()); - ps.setString(29, CodeHelper.get32UUID()); + ps.setString(27, CodeHelper.get32UUID()); }) > 0; } diff --git a/src/main/java/com/ynxbd/common/dao/his/HisPatientDao.java b/src/main/java/com/ynxbd/common/dao/his/HisPatientDao.java index 8816b0e..f91ecac 100644 --- a/src/main/java/com/ynxbd/common/dao/his/HisPatientDao.java +++ b/src/main/java/com/ynxbd/common/dao/his/HisPatientDao.java @@ -24,7 +24,6 @@ import java.util.UUID; @Slf4j public class HisPatientDao { - /** * HIS身份绑定 * @@ -110,9 +109,20 @@ public class HisPatientDao { params.put("CardNo", idCardNo); params.put("CardType", cardType); params.put("TransNo", UUID.randomUUID().toString().replace("-", "")); - return HisHelper.getJsonResult(HisEnum.AP_UnBinding_Card, params); + } + /** + * [患者]根据患者id查询信息 + * + * @param patientId 患者id + * @return hisResult + */ + public JsonResult queryPatientByPatientId(String patientId) throws ServiceException { + if (StringUtils.isEmpty(patientId)) { + throw new ServiceException(ResultEnum.PARAM_IS_DEFECT); + } + return queryPatientInfo(patientId, "999"); } /** @@ -122,7 +132,7 @@ public class HisPatientDao { * @param cardType 类型 {0:身份证; 1:健康卡;999:患者ID(PatientId) 此步骤对于已经获得PatientId 需要查询患者信息的情景。} * @return hisResult */ - public JsonResult selectPatientInfo(String cardNo, String cardType) throws ServiceException { + public JsonResult queryPatientInfo(String cardNo, String cardType) throws ServiceException { if (StringUtils.isEmpty(cardNo) || cardType == null) { throw new ServiceException(ResultEnum.PARAM_IS_DEFECT); } @@ -130,7 +140,6 @@ public class HisPatientDao { Map params = new HashMap<>(); params.put("CardNo", cardNo); params.put("CardType", cardType); - return HisHelper.getJsonResult(HisEnum.AP_Query_Patient, params); } diff --git a/src/main/java/com/ynxbd/common/helper/common/Base64Helper.java b/src/main/java/com/ynxbd/common/helper/common/Base64Helper.java index 4f430ff..4dc6668 100644 --- a/src/main/java/com/ynxbd/common/helper/common/Base64Helper.java +++ b/src/main/java/com/ynxbd/common/helper/common/Base64Helper.java @@ -1,5 +1,6 @@ package com.ynxbd.common.helper.common; +import org.apache.commons.lang3.ObjectUtils; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.rendering.ImageType; import org.apache.pdfbox.rendering.PDFRenderer; @@ -11,7 +12,6 @@ import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.nio.charset.StandardCharsets; -import java.util.Base64; import java.util.UUID; /** @@ -69,7 +69,9 @@ public class Base64Helper { * @return 加密后的字符串 */ public static String encode(Object obj, Boolean isEncryption) { - if (obj == null) return null; + if (obj == null) { + return null; + } String encode; if (obj.getClass() != String.class) { encode = JsonHelper.toJsonString(obj); @@ -77,7 +79,7 @@ public class Base64Helper { encode = obj.toString(); } - if ("".equals(encode)) { + if (ObjectUtils.isEmpty(encode)) { return null; } diff --git a/src/main/java/com/ynxbd/common/helper/common/ParamHelper.java b/src/main/java/com/ynxbd/common/helper/common/ParamHelper.java index 70c20a9..c386b6a 100644 --- a/src/main/java/com/ynxbd/common/helper/common/ParamHelper.java +++ b/src/main/java/com/ynxbd/common/helper/common/ParamHelper.java @@ -168,7 +168,7 @@ public class ParamHelper { } - public static String hidTel(String tel) { + public static String hideTel(String tel) { if (ObjectUtils.isEmpty(tel)) { return null; } diff --git a/src/main/java/com/ynxbd/common/helper/common/URLHelper.java b/src/main/java/com/ynxbd/common/helper/common/URLHelper.java index bc25225..fbad459 100644 --- a/src/main/java/com/ynxbd/common/helper/common/URLHelper.java +++ b/src/main/java/com/ynxbd/common/helper/common/URLHelper.java @@ -1,10 +1,13 @@ package com.ynxbd.common.helper.common; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ObjectUtils; +import java.net.URLEncoder; import java.util.HashMap; import java.util.Map; +@Slf4j public class URLHelper { @FunctionalInterface @@ -36,6 +39,27 @@ public class URLHelper { return (isPrefix ? "?" : "") + sb; } + /** + * map转url + * + * @param paramsMap paramsMap + * @param isPrefix 是否有前缀 + * @return string + */ + public static String mapParamsToUrl(Map paramsMap, boolean isPrefix) { + if (paramsMap == null) { + return ""; + } + + StringBuilder sb = new StringBuilder(); + for (Map.Entry item : paramsMap.entrySet()) { + Object value = item.getValue(); + sb.append("&").append(item.getKey()).append("=").append(value == null ? "" : value); + } + sb.replace(0, 1, ""); + return (isPrefix ? "?" : "") + sb; + } + public static String URLToHttps(String url) { if (ObjectUtils.isEmpty(url)) { @@ -48,4 +72,13 @@ public class URLHelper { return url; } + public static String encodeURL(String param) { + try { + URLEncoder.encode(param, "utf-8"); + } catch (Exception e) { + log.error(e.getMessage()); + } + return null; + } + } 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 6b42be2..aafe88d 100644 --- a/src/main/java/com/ynxbd/common/helper/his/HisEnum.java +++ b/src/main/java/com/ynxbd/common/helper/his/HisEnum.java @@ -3,7 +3,7 @@ package com.ynxbd.common.helper.his; public enum HisEnum { AP_Query_Hospital("查询医院列表", "1", "AP_Query_Hospital", true), - AP_Query_Patient("[患者]获取病人绑定信息", "1001", "AP_Query_Patient", true), + AP_Query_Patient("[患者]获取用户绑定信息", "1001", "AP_Query_Patient", true), AP_Binding_Card("[患者]身份证绑定", "1002", "AP_Binding_Card", true), AP_UnBinding_Card("[患者]身份证解绑", "1003", "AP_UnBinding_Card", 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 b1dad45..838dff0 100644 --- a/src/main/java/com/ynxbd/common/helper/his/HisHelper.java +++ b/src/main/java/com/ynxbd/common/helper/his/HisHelper.java @@ -92,7 +92,7 @@ public class HisHelper { } /** - * HIS订单号 + * 生成HIS订单号 */ public static List getHisTradeNo(String prefix, List ids, PEnum pEnum) { if (pEnum == null) { @@ -102,7 +102,7 @@ public class HisHelper { } /** - * HIS订单号 + * 生成HIS订单号 */ public static String getHisTradeNo(String prefix, PEnum pEnum) { if (pEnum == null) { diff --git a/src/main/java/com/ynxbd/common/service/AIGuidanceService.java b/src/main/java/com/ynxbd/common/service/AIGuidanceService.java index 07720eb..437585e 100644 --- a/src/main/java/com/ynxbd/common/service/AIGuidanceService.java +++ b/src/main/java/com/ynxbd/common/service/AIGuidanceService.java @@ -7,6 +7,7 @@ import com.ynxbd.common.bean.ai.AIDoctor; import com.ynxbd.common.dao.RegisterDao; import com.ynxbd.common.dao.his.HisRegisterDao; import com.ynxbd.common.helper.common.DateHelper; +import com.ynxbd.common.helper.common.URLHelper; import com.ynxbd.common.result.Result; import com.ynxbd.common.result.ResultEnum; import com.ynxbd.wx.config.AIGuidanceConfig; @@ -81,7 +82,7 @@ public class AIGuidanceService { } String curDate = DateHelper.getCurDate(); - List deptList = new HisRegisterDao().getTimeDeptList(curDate, DateHelper.getMoveDate(curDate, 7),""); + List deptList = new HisRegisterDao().getTimeDeptList(curDate, DateHelper.getMoveDate(curDate, 7), ""); String webReqURL = WeChatConfig.getWebReqURL(true); String deptName; @@ -107,7 +108,7 @@ public class AIGuidanceService { item.setDeptEmbedAlipayUrl(""); try { - item.setDeptUrl(webReqURL + "reg-reserve.html#/doctor?deptCode=" + dept.getDeptCode() + "&deptName=" + URLEncoder.encode(deptName, "utf-8") + "&hospitalArea="); + item.setDeptUrl(webReqURL + "reg-reserve.html#/reg-doctor?deptCode=" + dept.getDeptCode() + "&deptName=" + URLHelper.encodeURL(deptName) + "&hospitalArea="); } catch (Exception e) { log.error(e.getMessage()); item.setDeptUrl(""); @@ -117,6 +118,7 @@ public class AIGuidanceService { return Result.success(ResultEnum.AI_SUCCESS, resultList); } + /** * [医生列表] * @@ -145,7 +147,6 @@ public class AIGuidanceService { RegisterDao registerDao = new RegisterDao(); List wxDeptList = registerDao.selectDeptList(); - String domain = WeChatConfig.getDomain(true); String deptName, deptCode, headImg, doctCode; Dept dept; @@ -188,7 +189,16 @@ public class AIGuidanceService { } try { - item.setDoctorUrl(webReqURL + "reg-reserve.html#/source?deptCode=" + deptCode + "&deptName=" + URLEncoder.encode(deptName, "utf-8") + "&doctName=" + URLEncoder.encode(doctor.getDoctName(), "utf-8") + "&doctCode=" + doctor.getDoctCode() + "&hospitalArea="); + //reg-doct-source?date=2026-03-02&deptCode=0501&doctCode=1477&subDeptCode=0001&deptName=%25E5%25A6%2587%25E7%25A7%2591-%25E5%25A6%2587%25E7%25A7%2591%25E6%2599%25AE%25E9%2580%259A%25E9%2597%25A8%25E8%25AF%258A&doctName=%25E6%2598%258E%25E6%25BB%25A1%25E6%25B1%259F&hospitalArea= + Map map = new HashMap<>(); + map.put("date", DateHelper.getCurDate()); + map.put("deptCode", deptCode); + map.put("deptName", URLHelper.encodeURL(deptName)); + map.put("doctName", URLHelper.encodeURL(doctor.getDoctName())); + map.put("doctCode", doctor.getDoctCode()); + map.put("subDeptCode", ""); + map.put("hospitalArea", ""); + item.setDoctorUrl(webReqURL + "reg-reserve.html#/reg-doct-source" + URLHelper.mapParamsToUrl(map, true)); } catch (Exception e) { log.error(e.getMessage()); item.setDoctorUrl(""); diff --git a/src/main/java/com/ynxbd/common/service/GMCService.java b/src/main/java/com/ynxbd/common/service/GMCService.java new file mode 100644 index 0000000..9998ca6 --- /dev/null +++ b/src/main/java/com/ynxbd/common/service/GMCService.java @@ -0,0 +1,205 @@ +package com.ynxbd.common.service; + +import com.ynxbd.common.bean.Patient; +import com.ynxbd.common.helper.common.CodeHelper; +import com.ynxbd.common.helper.common.JsonHelper; +import com.ynxbd.common.helper.http.OkHttpHelper; +import com.ynxbd.common.result.JsonResult; +import com.ynxbd.common.result.JsonResultEnum; +import com.ynxbd.common.result.ServiceException; +import com.ynxbd.wx.config.WeChatConfig; +import com.ynxbd.wx.wxfactory.AesWxHelper; +import com.ynxbd.wx.wxfactory.WxAuthHelper; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.ObjectUtils; + +import javax.servlet.http.HttpServletRequest; +import java.util.ArrayList; +import java.util.List; + +@Slf4j +public class GMCService { + + public List queryGmcPatientList(HttpServletRequest request, String openId, String unionId) { + try { + if (WeChatConfig.IS_ENABLE_GMC && !WeChatConfig.IS_GMC_SERVER) { // 开启医共体服务 & 不为医共体主体 + return new ArrayList<>(); + } + if (ObjectUtils.isEmpty(openId)) { + return new ArrayList<>(); + } + JsonResult jsonResult = postFormGMC(request, "/patient/queryPatientList", params -> { + params.put("openId", openId); + params.put("hospAppId", AesWxHelper.encode(WeChatConfig.GMC_APP_ID)); + }, null); + if (!jsonResult.success()) { + return new ArrayList<>(); + } + List data = jsonResult.getDataMapList(Patient.class, "data"); + System.out.println(JsonHelper.toJsonString(data)); + return data; + } catch (Exception e) { + log.error(e.getMessage()); + } + return new ArrayList<>(); + } + + + /** + * 医共体绑定 + * + * @param request request + * @param bindInfo 绑定信息 + */ + public Patient bindGmcServer(HttpServletRequest request, Patient bindInfo) throws ServiceException { + if (!WeChatConfig.IS_ENABLE_GMC) { // 未开启医共体开关 + return bindInfo; + } +// String openid = bindInfo.getOpenid(); +// String hospAppId = AesWxHelper.decode(bindInfo.getEnHospAppId()); +// if (ObjectUtils.isEmpty(hospAppId)) { +// throw new ServiceException("医共体子公众号id参数错误"); +// } + + String gmcUniqueId; + if (WeChatConfig.IS_GMC_SERVER) { // 是医共体主服务器 +// if (!WeChatConfig.APP_ID.equals(hospAppId)) { // 不为自身AppId +// bindInfo.setHospAppId(hospAppId); // 需存的数据 +// } + bindInfo.setGmcUniqueId(CodeHelper.get32UUID()); + return bindInfo; + } + + String enGmcOpenId = bindInfo.getEnGmcOpenId(); // 只有子服务器有主服务器的openId + String gmcOpenId = AesWxHelper.decode(enGmcOpenId); + + log.info("[转发]enGmcOpenId={}, gmcOpenId={}", enGmcOpenId, gmcOpenId); + if (ObjectUtils.isEmpty(gmcOpenId)) { + throw new ServiceException("医共体非主体公众号ID参数异常"); + } + + JsonResult jsonResult = postFormGMC(request, "/healthCode/bind", params -> { + params.put("isAreaCode", false); + params.put("isFace", false); + params.put("isHealthCard", false); + + params.put("openid", gmcOpenId); // 主服务器的openId + params.put("address", bindInfo.getAddress()); + params.put("areaCode", bindInfo.getAreaCode()); + params.put("areaAddress", bindInfo.getAreaAddress()); + params.put("tel", bindInfo.getTel()); + params.put("sex", bindInfo.getSex()); + params.put("name", bindInfo.getName()); + params.put("nation", bindInfo.getNation()); + params.put("birthday", bindInfo.getBirthday()); + params.put("idCardNo", bindInfo.getIdCardNo()); + params.put("enOpenId", enGmcOpenId); + params.put("enUnionId", bindInfo.getEnUnionId()); + params.put("hospAppId", WeChatConfig.APP_ID); + }, null); + if (!jsonResult.success()) { + throw new ServiceException(jsonResult.getMessage()); + } + log.info("[医供体]绑定转发 resp={}", JsonHelper.toJsonString(jsonResult)); +// JSONObject dataJson = jsonResult.dataMapGetNodeToJsonObj(); +// gmcUniqueId = dataJson.getString("gmcUniqueId"); +// if (ObjectUtils.isEmpty(gmcUniqueId)) { +// throw new ServiceException("医共体返回唯一id为空"); +// } +// bindInfo.setGmcUniqueId(gmcUniqueId); +// if (!enGmcOpenId.equals(dataJson.getString("enOpenId"))) { +// throw new ServiceException("医共体主体openId不匹配"); +// } + return bindInfo; + } + + + public static JsonResult postForm(String url, OkHttpHelper.MapParams params, OkHttpHelper.Header header) { + return OkHttpHelper.postForm(url, params, header, JsonResultEnum.SYS_COMMON); + } + + public static JsonResult postFormGMC(HttpServletRequest request, String api, OkHttpHelper.MapParams params, OkHttpHelper.Header header) { + String url = WeChatConfig.getGMCAuthDomain(WxAuthHelper.isHttpsWithProxy(request), true); // 医共体请求服务地址 + return OkHttpHelper.postForm((url + api), params, header, JsonResultEnum.SYS_COMMON); + } + + + public List updatePatientList(String openId){ + + return new ArrayList<>(); + } + + // public Patient queryGmcPatientList(HttpServletRequest request, Patient bindInfo) throws ServiceException { +// if (!WeChatConfig.IS_ENABLE_GMC) { // 不为医共体主体 +// return bindInfo; +// } +// String openid = bindInfo.getOpenid(); +// String hospAppId = AesWxHelper.decode(bindInfo.getEnHospAppId()); +// if (ObjectUtils.isEmpty(hospAppId)) { +// throw new ServiceException("医共体子公众号id参数错误"); +// } +// +// String gmcUniqueId; +// if (WeChatConfig.IS_GMC_SERVER) { // 是医共体主服务器 +// if (!WeChatConfig.APP_ID.equals(hospAppId)) { // 不为自身AppId +// bindInfo.setHospAppId(hospAppId); // 需存的数据 +// } +// bindInfo.setGmcUniqueId(CodeHelper.get32UUID()); +// +// } else { +// String enGmcOpenId = bindInfo.getEnGmcOpenId(); // 只有子公众号有 +// String gmcOpenId = AesWxHelper.decode(enGmcOpenId); +// +// log.info("[转发]enGmcOpenId={}, gmcOpenId={}", enGmcOpenId, gmcOpenId); +// if (ObjectUtils.isEmpty(gmcOpenId)) { +// throw new ServiceException("医共体非主体公众号ID参数异常"); +// } +// +// JsonResult jsonResult = WxAuthHelper.postFormGMC(request, "/patient/bind", params -> { +// params.put("isAreaCode", false); +// params.put("isFace", false); +// params.put("isHealthCard", false); +// +// params.put("openid", gmcOpenId); // 主体的openid +// params.put("address", bindInfo.getAddress()); +// params.put("areaCode", bindInfo.getAreaCode()); +// params.put("areaAddress", bindInfo.getAreaAddress()); +// params.put("tel", bindInfo.getTel()); +// params.put("sex", bindInfo.getSex()); +// params.put("name", bindInfo.getName()); +// params.put("nation", bindInfo.getNation()); +// params.put("birthday", bindInfo.getBirthday()); +// params.put("idCardNo", bindInfo.getIdCardNo()); +// // +// params.put("enOpenId", enGmcOpenId); +// params.put("enUnionId", bindInfo.getEnUnionId()); +// params.put("enGmcOpenId", enGmcOpenId); +// params.put("enHospAppId", AesWxHelper.encode(WeChatConfig.APP_ID)); +// }, null); +// if (!jsonResult.success()) { +// throw new ServiceException(jsonResult.getMessage()); +// } +// log.info("[绑定转发]resp={}", JsonHelper.toJsonString(jsonResult)); +// +// JSONObject dataJson = jsonResult.dataMapGetNodeToJsonObj(); +// gmcUniqueId = dataJson.getString("gmcUniqueId"); +// if (ObjectUtils.isEmpty(gmcUniqueId)) { +// throw new ServiceException("医共体返回唯一id为空"); +// } +// bindInfo.setGmcUniqueId(gmcUniqueId); +// if (!enGmcOpenId.equals(dataJson.getString("enOpenId"))) { +// throw new ServiceException("医共体主体openId不匹配"); +// } +// +// GMCUser findGMCUser = new GMCUserService().queryInfoByOpenId(openid); +// if (findGMCUser == null) { +// boolean isOK = new GMCUserService().addInfo(openid, gmcOpenId, bindInfo.getUnionId(), gmcUniqueId); +// if (!isOK) { +// log.error("[医共体关系]添加失败 openid={}, gmcOpenId={}, uuid={}", openid, gmcOpenId, gmcUniqueId); +// } +// } +// } +// return bindInfo; +// } + +} diff --git a/src/main/java/com/ynxbd/common/service/GMCUserService.java b/src/main/java/com/ynxbd/common/service/GMCUserService.java index 9bc75ee..1f85e96 100644 --- a/src/main/java/com/ynxbd/common/service/GMCUserService.java +++ b/src/main/java/com/ynxbd/common/service/GMCUserService.java @@ -1,7 +1,10 @@ package com.ynxbd.common.service; import com.ynxbd.common.bean.GMCUser; +import com.ynxbd.common.bean.User; import com.ynxbd.common.dao.GMCUserDao; +import com.ynxbd.common.helper.common.ErrorHelper; +import com.ynxbd.wx.wxfactory.WxCacheHelper; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ObjectUtils; @@ -16,18 +19,23 @@ public class GMCUserService { } /** - * 添加用户关系 + * 添加主体关联 */ - public boolean addInfo(String wxOpenId, String gmcOpenId, String gmcUnionId, String gmcUUId) { + public void addInfo(String wxOpenId, String gmcOpenId, String gmcUnionId, String gmcUUId) { try { if (ObjectUtils.isEmpty(wxOpenId) || ObjectUtils.isEmpty(gmcOpenId) || ObjectUtils.isEmpty(gmcUUId)) { - return false; + return; + } + GMCUser findInfo = queryInfoByOpenId(wxOpenId); + if (findInfo != null) { + return; } boolean isOK = new GMCUserDao().insert(wxOpenId, gmcOpenId, gmcUnionId, gmcUUId); log.info("[认证联系]添加{} wxOpenId={}, gmcOpenId={}, gmcUUId={}", (isOK ? "成功" : "失败"), wxOpenId, gmcOpenId, gmcUUId); - return isOK; } catch (Exception e) { - return false; + ErrorHelper.println(e); } } + + } diff --git a/src/main/java/com/ynxbd/common/service/HCodeService.java b/src/main/java/com/ynxbd/common/service/HCodeService.java index 4a23fd3..468e19c 100644 --- a/src/main/java/com/ynxbd/common/service/HCodeService.java +++ b/src/main/java/com/ynxbd/common/service/HCodeService.java @@ -6,44 +6,88 @@ import com.tencent.healthcard.impl.HealthCardServerImpl; import com.tencent.healthcard.model.CommonIn; import com.tencent.healthcard.model.HealthCardInfo; import com.tencent.healthcard.model.ReportHISData; +import com.ynxbd.common.bean.Patient; import com.ynxbd.common.bean.enums.HCardTypeEnum; import com.ynxbd.common.bean.enums.HealthCardEnum; -import com.ynxbd.common.bean.Patient; -import com.ynxbd.common.bean.enums.HealthCardRespCodeEnum; +import com.ynxbd.common.bean.enums.HealthCardSceneEnum; +import com.ynxbd.common.config.EhCacheConfig; import com.ynxbd.common.helper.ProperHelper; +import com.ynxbd.common.helper.common.ErrorHelper; import com.ynxbd.common.helper.common.JsonHelper; +import com.ynxbd.common.helper.common.URLHelper; import com.ynxbd.wx.config.WeChatConfig; -import com.ynxbd.common.dao.PatientDao; -import com.ynxbd.common.config.EhCacheConfig; -import com.ynxbd.common.helper.common.ErrorHelper; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ObjectUtils; -import org.apache.commons.lang3.StringUtils; import org.ehcache.Cache; import java.text.SimpleDateFormat; -import java.util.*; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.UUID; @Slf4j public class HCodeService { + @Setter + @Getter + @ToString + @NoArgsConstructor + static class HealthCardResult { // 数据解析 + private JSONObject commonOut; + private JSONObject rsp; + private String resultCode; + private boolean isOk; + + public HealthCardResult(JSONObject resultJsonObj) { + if (resultJsonObj == null) { + return; + } + this.rsp = resultJsonObj.getJSONObject("rsp"); + this.commonOut = resultJsonObj.getJSONObject("commonOut"); + if (this.commonOut == null) { + return; + } + this.resultCode = commonOut.getString("resultCode"); + this.isOk = "0".equals(this.resultCode); + } + } + + + public static final String MINI_CACHE_KEY = "mini_app_token_cache"; + public static final String APP_CACHE_KEY = "app_token_cache"; + + public static synchronized void initCache() { + if (CACHE == null) { // 创建一个缓存实例(7000s最大存活时间) + CACHE = EhCacheConfig.createCache(String.class, String.class, "health_card_cache", 1L, 3L, 10L, false, 7000L, null); + } + } - final private static boolean IS_ENABLE; // 是否启用电子健康看(true:启用, false:禁用) + private static final boolean IS_ENABLE; // 是否启用电子健康看(true:启用, false:禁用) // 健康码 - final private static String H_APP_ID; - final private static String H_APP_SECRET; - final private static String H_HOSPITAL_ID; // 医院ID(每家医院不一样) + private static final String H_APP_ID; + private static final String H_APP_SECRET; + private static final String H_HOSPITAL_ID; // 医院ID(每家医院不一样) + private static final String H_MINI_HOSPITAL_ID; // 小程序-医院ID(每家医院不一样) + private static final String H_MINI_APP_ID; // 小程序-appid // 万达 - final private static String CARD_URL; - final private static String CARD_APP_ID; - final private static String CARD_PUBLIC_KEY; - final private static String CARD_PRIVATE_KEY; + private static final String CARD_URL; + private static final String CARD_APP_ID; + private static final String CARD_PUBLIC_KEY; + private static final String CARD_PRIVATE_KEY; // 缓存 private static Cache CACHE; // 离线WeChartCode 批量领取健康卡用 - final private static String WE_CHART_CODE = "73EFA6796D3869FF82FAE7E81E9814B7"; + private static final String WE_CHART_CODE = "73EFA6796D3869FF82FAE7E81E9814B7"; + + // 公众号不用传,小程序内嵌必传,具体传参请联系平台对接人员分配 + private static final int domainChannel = 0; static { ProperHelper config = new ProperHelper().read("hcode.properties"); @@ -57,118 +101,101 @@ public class HCodeService { CARD_URL = config.getString("h.card_url"); H_HOSPITAL_ID = config.getString("h.hospital_id"); - if ("0".equals(H_HOSPITAL_ID)) { - log.info("[电子健康卡]医院id异常"); + if (ObjectUtils.isEmpty(H_HOSPITAL_ID)) { + log.info("[电子健康卡]医院id缺失"); } + H_MINI_APP_ID = config.getString("h.mini_app_id"); + H_MINI_HOSPITAL_ID = config.getString("h.mini_hospital_id"); + initCache(); } - public static synchronized void initCache() { - if (CACHE == null) { - // 创建一个缓存实例(7000s最大存活时间) - CACHE = EhCacheConfig.createCache(String.class, String.class, "health_card_cache", 1L, 3L, 10L, false, 7000L, null); - } + private static HealthCardServerImpl createHealthCardService() { + return new HealthCardServerImpl(H_APP_SECRET); } + private static CommonIn createCommonIn(Boolean isMiniApp) { + return createCommonIn(isMiniApp, getAppToken(isMiniApp, true)); + } - private CommonIn createCommonIn(String appToken) { + private static CommonIn createCommonIn(Boolean isMiniApp, String appToken) { + if (appToken == null) { // 此处不判断空字符串 + log.info("[电子健康卡]appToken为空"); + return null; + } + if (isMiniApp == null) { + isMiniApp = false; + } + int channelNum = (isMiniApp ? 1 : 0); // 填入代码,0为微信服务号渠道,1为微信小程序渠道,3为刷脸终端,4为扫码终端 + String hospId = (isMiniApp ? H_MINI_HOSPITAL_ID : H_HOSPITAL_ID); String requestId = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase(); - int channelNum = 0; - return new CommonIn(appToken, requestId, H_HOSPITAL_ID, channelNum); + String appId = (isMiniApp ? H_MINI_APP_ID : WeChatConfig.APP_ID); + return new CommonIn(appToken, requestId, hospId, channelNum, appId, null); } - /** - * 判断是否使用电子健康卡 - * - * @return 是否使用 - */ + // 判断是否开启电子健康卡 public static boolean isEnableHCode() { if (!IS_ENABLE) { - log.info("hcode.properties中禁用电子健康卡 isEnable={}", IS_ENABLE); + log.info("[配置][hcode.properties]未开启电子健康卡IS_ENABLE"); } return IS_ENABLE; } - public String getAppToken() { - return getAppToken(true); - } /** * 获取token * + * @param isEnTokenSwitch [true:必须开启功能才能获取token] * @return token */ - public String getAppToken(boolean isEnTokenSwitch) { + public static String getAppToken(Boolean isMiniApp, boolean isEnTokenSwitch) { if (isEnTokenSwitch && !isEnableHCode()) { return null; } + if (isMiniApp == null) { + isMiniApp = false; + } + String appToken = null; if (CACHE == null) { initCache(); } if (CACHE != null) { - appToken = CACHE.get("appToken"); + appToken = CACHE.get(isMiniApp ? MINI_CACHE_KEY : APP_CACHE_KEY); if (appToken != null) { return appToken; } } try { - //调用接口 - JSONObject resultObj = new HealthCardServerImpl(H_APP_SECRET, 5, 10) - .getAppToken(createCommonIn(""), H_APP_ID); - JSONObject commonOut = resultObj.getJSONObject("commonOut"); - if (!"0".equals(commonOut.getString("resultCode"))) { - log.info("[电子健康卡]获取appToken失败: {}", resultObj); + CommonIn commonIn = createCommonIn(isMiniApp, ""); + if (commonIn == null) { return null; } - - JSONObject respJson = resultObj.getJSONObject("rsp"); + JSONObject resultJson = new HealthCardServerImpl(H_APP_SECRET, 5, 10).getAppToken(commonIn, H_APP_ID); + HealthCardResult result = new HealthCardResult(resultJson); + if (!result.isOk) { + log.info("[电子健康卡]获取appToken失败: {}", resultJson); + return null; + } + JSONObject respJson = result.getRsp(); appToken = respJson.getString("appToken"); if (CACHE != null && !ObjectUtils.isEmpty(appToken)) { CACHE.put("appToken", appToken); } - } catch (Exception e) { ErrorHelper.println(e); } - if (StringUtils.isEmpty(appToken)) { + if (ObjectUtils.isEmpty(appToken)) { log.info("[电子健康卡]获取appToken为空"); } return appToken; } - public Patient appBindHealthCard(String healthCode) { - if (healthCode == null) { - return null; - } - String appToken = getAppToken(); - if (appToken == null) { - return null; - } - CommonIn commonIn = createCommonIn(appToken); - - JSONObject resultObj = new HealthCardServerImpl(H_APP_SECRET).getHealthCardByHealthCode(commonIn, healthCode); - JSONObject rspObj = resultObj.getJSONObject("rsp"); - JSONObject cardJson = rspObj.getJSONObject("card"); - Patient patient = new Patient(); - patient.setSex(cardJson.getString("gender")); // 性别 - patient.setName(cardJson.getString("name")); - patient.setNation(cardJson.getString("nation")); - patient.setCardType(cardJson.getString("idType")); - patient.setIdCardNo(cardJson.getString("idNumber")); - patient.setBirthday(cardJson.getString("birthday")); - patient.setAddress(cardJson.getString("address")); - String phone1 = cardJson.getString("phone1"); - String phone2 = cardJson.getString("phone2"); - patient.setTel(ObjectUtils.isEmpty(phone1) ? phone2 : phone1); - return patient; - } - /** * 注册健康卡 * @@ -183,12 +210,12 @@ public class HCodeService { * @param idCardNo 证件号码 * @param phone1 联系方式1 */ - public JSONObject registerHealthCard(String patientId, String wechatCode, - String birthday, HCardTypeEnum cardTypeEnum, String address, String areaAddress, - String sex, String nation, String name, String idCardNo, String phone1) { + public static JSONObject registerHealthCard(Boolean isMiniApp, String patientId, String wechatCode, + String birthday, HCardTypeEnum cardTypeEnum, String address, String areaAddress, + String sex, String nation, String name, String idCardNo, String phone1) { try { - String appToken = getAppToken(); - if (appToken == null) { + CommonIn commonIn = createCommonIn(isMiniApp); + if (commonIn == null) { return null; } @@ -200,27 +227,25 @@ public class HCodeService { areaAddress = ""; } - CommonIn commonIn = createCommonIn(appToken); - - HealthCardInfo healthCardInfoReq = new HealthCardInfo(); - healthCardInfoReq.setAddress(areaAddress + address); - healthCardInfoReq.setBirthday(birthday); - healthCardInfoReq.setGender(sex); - healthCardInfoReq.setIdNumber(idCardNo); - healthCardInfoReq.setIdType(cardTypeEnum.WX_CODE); - healthCardInfoReq.setNation(nation); - healthCardInfoReq.setName(name); - healthCardInfoReq.setPhone1(phone1); - healthCardInfoReq.setWechatCode(wechatCode); - healthCardInfoReq.setPatid(patientId); - //调用接口 - JSONObject resultObj = new HealthCardServerImpl(H_APP_SECRET).registerHealthCard(commonIn, healthCardInfoReq); - JSONObject commonOut = resultObj.getJSONObject("commonOut"); - if (!"0".equals(commonOut.getString("resultCode"))) { - log.info("[电子健康卡]注册失败: {}", resultObj); - return commonOut; - } - return resultObj.getJSONObject("rsp"); + HealthCardInfo req = new HealthCardInfo(); + req.setAddress(areaAddress + address); + req.setBirthday(birthday); + req.setGender(sex); + req.setIdNumber(idCardNo); + req.setIdType(cardTypeEnum.WX_CODE); + req.setNation(nation); + req.setName(name); + req.setPhone1(phone1); + req.setWechatCode(wechatCode); + req.setPatid(patientId); + + JSONObject resultJson = createHealthCardService().registerHealthCard(commonIn, req); + HealthCardResult result = new HealthCardResult(resultJson); + if (!result.isOk) { + log.info("[电子健康卡]注册失败: {}", resultJson); + return result.getCommonOut(); + } + return result.getRsp(); } catch (Exception e) { ErrorHelper.println(e); } @@ -229,48 +254,43 @@ public class HCodeService { /** - * 授权码获取健康卡 + * 健康卡授权码获取健康卡信息 * * @param healthCode 健康卡授权码 */ - public Patient getInfoByHealthCode(String healthCode) { + public static Patient getHealthCardByHealthCode(Boolean isMiniApp, String healthCode) { try { - String appToken = getAppToken(false); - if (appToken == null) { + CommonIn commonIn = createCommonIn(isMiniApp); + if (commonIn == null) { return null; } - CommonIn commonIn = createCommonIn(appToken); - //调用接口 - JSONObject resultObj = new HealthCardServerImpl(H_APP_SECRET).getHealthCardByHealthCode(commonIn, healthCode); - JSONObject commonOut = resultObj.getJSONObject("commonOut"); - JSONObject rspObj = resultObj.getJSONObject("rsp"); - if (!"0".equals(commonOut.getString("resultCode")) || rspObj == null) { - log.info("[电子健康卡]授权码获取健康卡失败: {}", resultObj); + JSONObject resultJson = createHealthCardService().getHealthCardByHealthCode(commonIn, healthCode); + HealthCardResult result = new HealthCardResult(resultJson); + JSONObject respJson = result.getRsp(); + if (!result.isOk || respJson == null) { + log.info("[电子健康卡]健康卡授权码获取健康卡信息-失败: {}", resultJson); return null; } - JSONObject card = rspObj.getJSONObject("card"); + JSONObject card = respJson.getJSONObject("card"); if (card == null) { - log.info("[电子健康卡]一键绑定 解析json失败"); + log.info("[电子健康卡]健康卡授权码获取健康卡信息-Json解析失败"); return null; } Patient patient = new Patient(); String phone1 = card.getString("phone1"); - if (ObjectUtils.isEmpty(phone1)) { - patient.setTel(card.getString("phone2")); - } else { - patient.setTel(phone1); - } + patient.setTel(ObjectUtils.isEmpty(phone1) ? card.getString("phone2") : phone1); + patient.setIsMyself(card.getBoolean("isSelf")); patient.setName(card.getString("name")); + patient.setCardType(card.getString("idType")); patient.setIdCardNo(card.getString("idNumber")); patient.setSex(card.getString("gender")); patient.setNation(card.getString("nation")); patient.setAddress(card.getString("address")); patient.setBirthday(card.getString("birthday")); patient.setHealthCardId(card.getString("healthCardId")); - patient.setCardType(card.getString("idType")); - log.info("[一键绑定]获取用户信息 {}", JsonHelper.toJsonString(patient)); + log.info("[电子健康卡]健康卡授权码获取健康卡信息: {}", JsonHelper.toJsonString(patient)); return patient; } catch (Exception e) { ErrorHelper.println(e); @@ -284,25 +304,24 @@ public class HCodeService { * * @param qrCode 二维码 */ - public Patient getHealthCardByQrCode(String qrCode) { + public static Patient getHealthCardByQrCode(Boolean isMiniApp, String qrCode) { try { log.info("[电子健康卡]查询健康卡信息 qrCode={}", qrCode); if (ObjectUtils.isEmpty(qrCode)) { return null; } - String appToken = getAppToken(); - if (appToken == null) { + CommonIn commonIn = createCommonIn(isMiniApp); + if (commonIn == null) { return null; } - CommonIn commonIn = createCommonIn(appToken); - //调用接口 - JSONObject resultObj = new HealthCardServerImpl(H_APP_SECRET).getHealthCardByQRCode(commonIn, qrCode); - JSONObject commonOut = resultObj.getJSONObject("commonOut"); - if (!"0".equals(commonOut.getString("resultCode"))) { - log.info("[电子健康卡]二维码获取健康卡失败: {}", resultObj); + + JSONObject resultJson = createHealthCardService().getHealthCardByQRCode(commonIn, qrCode); + HealthCardResult result = new HealthCardResult(resultJson); + if (!result.isOk) { + log.info("[电子健康卡]二维码获取健康卡失败: {}", resultJson); return null; } - JSONObject respJson = resultObj.getJSONObject("rsp"); + JSONObject respJson = result.getRsp(); if (respJson == null) { return null; } @@ -329,32 +348,47 @@ public class HCodeService { } + public static String bindUniformVerifyOrder(String idCardNo, String name, String wechatCode) { + return registerUniformVerifyOrder(false, idCardNo, name, wechatCode, null); // HealthCardSceneEnum._0201091 + } + /** * 实人认证生成orderId接口 */ - public String registerUniformVerifyOrder(String idCardNo, String name, String wechatCode) { + public static String registerUniformVerifyOrder(Boolean isMiniApp, String idCardNo, String name, String wechatCode, HealthCardSceneEnum sceneEnum) { try { log.info("[电子健康卡]实人认证生成orderId idCardNo={}, name={}", idCardNo, name); if (ObjectUtils.isEmpty(idCardNo) || ObjectUtils.isEmpty(name)) { return null; } - String appToken = getAppToken(); - if (appToken == null) { + CommonIn commonIn = createCommonIn(isMiniApp); + if (commonIn == null) { return null; } - CommonIn commonIn = createCommonIn(appToken); - //调用接口 - String okURL = WeChatConfig.getWebReqURL() + "/health-card-bind.html"; - JSONObject resultJson = new HealthCardServerImpl(H_APP_SECRET).registerUniformVerifyOrder(commonIn, idCardNo, "01", name, wechatCode); - JSONObject commonOut = resultJson.getJSONObject("commonOut"); - if (!"0".equals(commonOut.getString("resultCode"))) { + JSONObject resultJson = createHealthCardService().registerUniformVerifyOrder(commonIn, + idCardNo, + "01", + name, + wechatCode, + null, + (sceneEnum == null ? null : sceneEnum.CODE), + null, + HealthCardEnum.CARD_TYPE_ID_CARD.STATUS, + null, + null, + null, + null, + 0); + HealthCardResult result = new HealthCardResult(resultJson); +// JSONObject resultJson = new HealthCardServerImpl(H_APP_SECRET).registerUniformVerifyOrder(commonIn, idCardNo, "01", name, wechatCode); + if (!result.isOk) { log.info("[电子健康卡]实人认证生成orderId接口失败: {}", resultJson); return null; } - JSONObject respJson = resultJson.getJSONObject("rsp"); + JSONObject respJson = result.getRsp(); if (respJson == null) { return null; } @@ -367,27 +401,26 @@ public class HCodeService { /** - * 实人认证结果查询接口 + * 实人认证结果查询 */ - public boolean checkUniformVerifyResult(String verifyOrderId, String registerOrderId) { + public static boolean checkUniformVerifyResult(Boolean isMiniApp, String verifyOrderId, String registerOrderId) { try { log.info("[电子健康卡]实人认证结果查询 verifyOrderId={}, registerOrderId={}", verifyOrderId, registerOrderId); if (ObjectUtils.isEmpty(verifyOrderId) || ObjectUtils.isEmpty(registerOrderId)) { return false; } - String appToken = getAppToken(); - if (appToken == null) { + CommonIn commonIn = createCommonIn(isMiniApp); + if (commonIn == null) { return false; } - CommonIn commonIn = createCommonIn(appToken); - //调用接口 - JSONObject resultJson = new HealthCardServerImpl(H_APP_SECRET).checkUniformVerifyResult(commonIn, verifyOrderId, registerOrderId); - JSONObject commonOut = resultJson.getJSONObject("commonOut"); - if (!"0".equals(commonOut.getString("resultCode"))) { + + JSONObject resultJson = createHealthCardService().checkUniformVerifyResult(commonIn, verifyOrderId, registerOrderId); + HealthCardResult result = new HealthCardResult(resultJson); + if (!result.isOk) { log.info("[电子健康卡]实人认证结果查询失败: {}", resultJson); return false; } - JSONObject respJson = resultJson.getJSONObject("rsp"); + JSONObject respJson = result.getRsp(); if (respJson == null) { return false; } @@ -404,78 +437,20 @@ public class HCodeService { * * @param qrCodeText 二维码编码 */ - public JSONObject getCardOrderId(String qrCodeText) { + public static JSONObject getCardOrderId(Boolean isMiniApp, String qrCodeText) { try { - String appToken = getAppToken(); - if (appToken == null) { - log.info("获取卡包订单ID-appToken为空"); + CommonIn commonIn = createCommonIn(isMiniApp); + if (commonIn == null) { return null; } - - CommonIn commonIn = createCommonIn(appToken); //调用接口 - JSONObject resultObj = new HealthCardServerImpl(H_APP_SECRET).getOrderIdByOutAppId(commonIn, WeChatConfig.APP_ID, qrCodeText); - JSONObject commonOut = resultObj.getJSONObject("commonOut"); - if (!"0".equals(commonOut.getString("resultCode"))) { - log.info("[电子健康卡]获取卡包订单ID 失败: {}", resultObj); + JSONObject resultJson = createHealthCardService().getOrderIdByOutAppId(commonIn, WeChatConfig.APP_ID, qrCodeText); + HealthCardResult result = new HealthCardResult(resultJson); + if (!result.isOk) { + log.info("[电子健康卡]获取卡包订单ID 失败: {}", resultJson); return null; } - return resultObj.getJSONObject("rsp"); - } catch (Exception e) { - ErrorHelper.println(e); - } - return null; - } - - - /** - * 电子健康卡用卡数据监测接口 - * - * @param qrCodeText 动态二维码 - * @param deptName 科室名 - * @param scene 上报类型 scene - * @param cardType 卡类型 - * @return JSONObject - */ - public JSONObject reportHISData(String qrCodeText, String deptName, String scene, String cardType, String cardCostType) { - if ("".equals(qrCodeText) || scene == null || cardType == null) { - log.info("[电子健康卡]用卡数据监测接口,参数为空"); - return null; - } - - try { - String appToken = getAppToken(); - if (appToken == null) { - return null; - } - - HealthCardServerImpl healthCard = new HealthCardServerImpl(H_APP_SECRET); - CommonIn commonIn = createCommonIn(appToken); - //构造请求参数req - ReportHISData reportHISData = new ReportHISData(); - reportHISData.setQrCodeText(qrCodeText); - SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - reportHISData.setTime(format.format(new Date())); - - reportHISData.setHospitalCode(H_HOSPITAL_ID); - // 010101 挂号 - reportHISData.setScene(scene); - reportHISData.setDepartment(deptName); // 科室代码 - reportHISData.setCardChannel(HealthCardEnum.CARD_CHANNEL_WX_CHANNEL.STATUS); // 微信渠道 - - reportHISData.setCardType(cardType); - - // 自费:0100,医保:0200,公费:0300,其他:0000 - reportHISData.setCardCostTypes(cardCostType); - //调用接口 - JSONObject resultObj = healthCard.reportHISData(commonIn, reportHISData); - - JSONObject commonOut = resultObj.getJSONObject("commonOut"); - if (!"0".equals(commonOut.getString("resultCode"))) { - log.info("用卡数据监测接口-" + resultObj); - return null; - } - return resultObj.getJSONObject("rsp"); + return result.getRsp(); } catch (Exception e) { ErrorHelper.println(e); } @@ -490,27 +465,25 @@ public class HCodeService { * @param idCardNo 证件号码 * @param codeType 传0或者1,0返回动态码,1返回静态码 */ - public JSONObject getDynamicQRCode(String healthCardId, String idCardNo, String codeType) { + public static JSONObject getDynamicQRCode(Boolean isMiniApp, String healthCardId, String idCardNo, String codeType) { if (healthCardId == null || idCardNo == null || codeType == null) { - log.info("[电子健康卡]获取健康卡二维码参数缺失 healthCardId={}, idCardNo={}, codeType={}", healthCardId, idCardNo, codeType); + log.info("[电子健康卡]获取健康卡二维码-参数缺失 healthCardId={}, idCardNo={}, codeType={}", healthCardId, idCardNo, codeType); return null; } try { - String appToken = getAppToken(); - if (appToken == null) { + CommonIn commonIn = createCommonIn(isMiniApp); + if (commonIn == null) { return null; } - CommonIn commonIn = createCommonIn(appToken); - //调用接口 - JSONObject resultObj = new HealthCardServerImpl(H_APP_SECRET).getDynamicQRCode(commonIn, healthCardId, "01", idCardNo, codeType); - JSONObject commonOut = resultObj.getJSONObject("commonOut"); - if (!"0".equals(commonOut.getString("resultCode"))) { - log.info("获取健康卡二维码失败: {}", resultObj); + JSONObject resultJson = createHealthCardService().getDynamicQRCode(commonIn, healthCardId, "01", idCardNo, codeType); + HealthCardResult result = new HealthCardResult(resultJson); + if (!result.isOk) { + log.info("[电子健康卡]获取健康卡二维码失败: {}", resultJson); return null; } - return resultObj.getJSONObject("rsp"); + return result.getRsp(); } catch (Exception e) { ErrorHelper.println(e); } @@ -519,32 +492,30 @@ public class HCodeService { /** - * 一键绑定,绑定健康卡和医院关系 + * 绑定健康卡和医院关系 * * @param patientId 患者ID * @param qrCodeText 标识ID(healthCardId = qrCodeText) */ - public JSONObject bindCardRelation(String patientId, String qrCodeText) { - if (patientId == null || "".equals(qrCodeText)) { - log.info("[电子健康卡]一键绑定绑定健康卡和医院关系参数缺失 patientId={}, qrCodeText={}", patientId, qrCodeText); + public JSONObject bindCardRelation(Boolean isMiniApp, String patientId, String qrCodeText) { + if (patientId == null || ObjectUtils.isEmpty(qrCodeText)) { + log.info("[电子健康卡]绑定健康卡和医院关系-参数缺失 patientId={}, qrCodeText={}", patientId, qrCodeText); return null; } try { - String appToken = getAppToken(); - if (appToken == null) { + CommonIn commonIn = createCommonIn(isMiniApp); + if (commonIn == null) { return null; } - - CommonIn commonIn = createCommonIn(appToken); - JSONObject resultObj = new HealthCardServerImpl(H_APP_SECRET).bindCardRelation(commonIn, patientId, qrCodeText); - JSONObject commonOut = resultObj.getJSONObject("commonOut"); - if (!"0".equals(commonOut.getString("resultCode"))) { - log.info("[电子健康卡]绑定健康卡和医院关系失败: {}", resultObj); + JSONObject resultJson = createHealthCardService().bindCardRelation(commonIn, patientId, qrCodeText); + HealthCardResult result = new HealthCardResult(resultJson); + if (!result.isOk) { + log.info("[电子健康卡]绑定健康卡和医院关系-失败: {}", resultJson); return null; } - return resultObj.getJSONObject("rsp"); + return result.getRsp(); } catch (Exception e) { - e.printStackTrace(); + ErrorHelper.println(e); } return null; } @@ -557,16 +528,16 @@ public class HCodeService { * @param idCardNo 身份证号 * @return 动态二维码 */ - public String getQRCodeText(String healthCardId, String idCardNo) { - JSONObject QRResult = getDynamicQRCode(healthCardId, idCardNo, "0"); + public static String getQRCodeText(Boolean isMiniApp, String healthCardId, String idCardNo) { + JSONObject QRResult = getDynamicQRCode(isMiniApp, healthCardId, idCardNo, "0"); if (QRResult == null) { - log.info("用卡数据监测接口,获取二维码失败"); + log.info("[电子健康卡]用卡数据监测接口-获取二维码失败"); return null; } String qrCodeText = QRResult.getString("qrCodeText"); - if ("".equals(qrCodeText)) { - log.info("用卡数据监测接口,获取qrCodeText失败"); + if (ObjectUtils.isEmpty(qrCodeText)) { + log.info("[电子健康卡]用卡数据监测接口-获取qrCodeText失败"); return null; } return qrCodeText; @@ -574,64 +545,12 @@ public class HCodeService { /** - * 健康卡数据上报-->挂号支付 - * - * @param openid openid - * @param patientId 患者ID - * @param deptName 科室名 - * @param regDate 挂号日期 - * @return 是否上报成功 - */ - public boolean regPayReportHISData(String openid, String patientId, String deptName, String regDate) { - try { - if (!HCodeService.isEnableHCode()) { // 判断是否禁用电子健康卡 - return false; - } - - if (deptName == null || openid == null || patientId == null || regDate == null) { - return false; - } - - SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); - String today = format.format(new Date()); - String scene = regDate.equals(today) ? HealthCardEnum.SCENE_REGISTER_SITE.STATUS : HealthCardEnum.SCENE_REGISTER_RESERVE.STATUS; - - Patient patient = new PatientDao().selectByOpenidAndPatientId(openid, patientId); - if (patient == null) { - return false; - } - - String healthCardId = patient.getHealthCardId(); - String idCardNo = patient.getIdCardNo(); - if (healthCardId == null || idCardNo == null) { - return false; - } - - String qrCodeText = getQRCodeText(healthCardId, idCardNo); - if (qrCodeText == null) { - return false; - } - - // 挂号,自费 - JSONObject jsonObject = reportHISData(qrCodeText, deptName, scene, HealthCardEnum.CARD_TYPE_HEALTH_CARD.STATUS, HealthCardEnum.CARD_COST_TYPE_OWN_EXPENSE.STATUS); - if (jsonObject == null) { - log.info("挂号数据上报失败"); - return false; - } - } catch (Exception e) { - e.printStackTrace(); - return false; - } - return true; - } - - /** - * 健康卡数据上报-->挂号支付 + * 身份证识别 * * @param imageContent 身份证正面照片的base64编码数据,头部信息需要删除,如image/png;base64、image/jpeg/png;base64等,并且数据量建议压缩到百K级别上传。 * @return 身份证信息 */ - public Patient orcInfo(String imageContent) { + public static Patient orcInfo(Boolean isMiniApp, String imageContent) { if (imageContent == null) { return null; } @@ -646,21 +565,14 @@ public class HCodeService { if (!HCodeService.isEnableHCode()) { // 判断是否禁用电子健康卡 return null; } - - String appToken = getAppToken(false); // 未开启功能时也能获取token - if (appToken == null) { + CommonIn commonIn = new CommonIn(getAppToken(false, false), UUID.randomUUID().toString().replaceAll("-", ""), H_HOSPITAL_ID, 0, null, null); + JSONObject resultJson = createHealthCardService().ocrInfo(commonIn, imageContent); + HealthCardResult result = new HealthCardResult(resultJson); + if (!result.isOk) { + log.info("[电子健康卡]身份证识别失败: {}", resultJson); return null; } - - CommonIn commonIn = createCommonIn(appToken); - //调用接口 - JSONObject resultObj = new HealthCardServerImpl(H_APP_SECRET).ocrInfo(commonIn, imageContent); - JSONObject commonOut = resultObj.getJSONObject("commonOut"); - if (!"0".equals(commonOut.getString("resultCode"))) { - log.info("[电子健康卡]身份证识别失败: {}", resultObj); - return null; - } - JSONObject rsp = resultObj.getJSONObject("rsp"); + JSONObject rsp = result.getRsp(); if (rsp == null) { return null; } @@ -688,61 +600,15 @@ public class HCodeService { return patient; } - /** - * 健康卡数据上报-->处方缴费 - * - * @param openid openid - * @param patientId patientId - * @return 是否成功 - */ - public boolean rxReportHISData(String openid, String patientId) { - try { - if (!HCodeService.isEnableHCode()) { // 判断是否禁用电子健康卡 - return false; - } - - if (patientId == null || openid == null) { - return false; - } - - Patient patient = new PatientDao().selectByOpenidAndPatientId(openid, patientId); - if (patient == null) { - return false; - } - - String healthCardId = patient.getHealthCardId(); - String idCardNo = patient.getIdCardNo(); - if (healthCardId == null || idCardNo == null) { - return false; - } - - String qrCodeText = getQRCodeText(healthCardId, idCardNo); - if (qrCodeText == null) { - return false; - } - - // 门诊缴费 - JSONObject jsonObject = reportHISData(qrCodeText, null, HealthCardEnum.SCENE_TOLL_OUTPATIENT_PAYMENT.STATUS, HealthCardEnum.CARD_TYPE_HEALTH_CARD.STATUS, HealthCardEnum.CARD_COST_TYPE_OWN_EXPENSE.STATUS); - if (jsonObject == null) { - log.info("挂号数据上报失败"); - return false; - } - } catch (Exception e) { - e.printStackTrace(); - return false; - } - return true; - } - /** * 批量领卡 - * - * @return json */ - public JSONArray batchUpdate(List lstPatient) { + public static JSONArray batchUpdate(List lstPatient) { //构造公共输入参数commonIn - String appToken = getAppToken(); - CommonIn commonIn = createCommonIn(appToken); + CommonIn commonIn = createCommonIn(false); + if (commonIn == null) { + return null; + } List lstHealthCard = new ArrayList<>(); for (Patient patient : lstPatient) { @@ -762,81 +628,238 @@ public class HCodeService { lstHealthCard.add(healthCardInfo); } - JSONObject healthCardInfosRsp = new HealthCardServerImpl(H_APP_SECRET).registerBatchHealthCard(commonIn, lstHealthCard); - JSONObject commonOut = healthCardInfosRsp.getJSONObject("commonOut"); - JSONObject rspObj = healthCardInfosRsp.getJSONObject("rsp"); - if (!"0".equals(commonOut.getString("resultCode")) || rspObj == null) { - log.info("批量领取健康卡失败: {}", healthCardInfosRsp); + JSONObject resultJson = createHealthCardService().registerBatchHealthCard(commonIn, lstHealthCard); + HealthCardResult result = new HealthCardResult(resultJson); + JSONObject rspJson = result.getRsp(); + if (!result.isOk || rspJson == null) { + log.info("[电子健康卡]批量领取-失败: {}", resultJson); return null; } - JSONArray rspItems = rspObj.getJSONArray("rspItems"); + JSONArray rspItems = rspJson.getJSONArray("rspItems"); if (rspItems == null) { - log.info("[批量领取健康卡]解析json失败"); + log.info("[电子健康卡]批量领取-Json解析失败"); return null; } - return rspItems; } - /** - * 响应码处理 + * 电子健康卡用卡数据监测接口 * - * @param resultCode 响应码 - * @return 返回响应码对应的消息 + * @param qrCodeText 动态二维码 + * @param deptName 科室名 + * @param scene 上报类型 scene + * @param cardType 卡类型 + * @return JSONObject */ - public HealthCardRespCodeEnum resultCodeHandle(String resultCode) { - HealthCardRespCodeEnum healthCardRespCodeEnum = HealthCardRespCodeEnum.CONTINUE; + public static JSONObject reportHISData(String qrCodeText, String deptName, String scene, String cardType, String cardCostType) { + if (ObjectUtils.isEmpty(qrCodeText) || scene == null || cardType == null) { + log.info("[电子健康卡]用卡数据监测接口,参数为空"); + return null; + } - for (HealthCardRespCodeEnum e : HealthCardRespCodeEnum.values()) { - if (e.STATUS.equals(resultCode)) { - if (e.IS_RESULT) { // 是否返回枚举中的信息 - healthCardRespCodeEnum = e; - } else { - log.info("[电子健康卡]异常信息:{}", e.MESSAGE); - healthCardRespCodeEnum = e.IS_CONTINUE ? HealthCardRespCodeEnum.CONTINUE : e; - } - break; + try { + CommonIn commonIn = createCommonIn(false); + if (commonIn == null) { + return null; } - } - return healthCardRespCodeEnum; - } + ReportHISData req = new ReportHISData(); + req.setQrCodeText(qrCodeText); + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + req.setTime(format.format(new Date())); - public static void main(String[] args) { - new HCodeService().dataUpload(); - } + req.setHospitalCode(H_HOSPITAL_ID); + // 010101 挂号 + req.setScene(scene); + req.setDepartment(deptName); // 科室代码 + req.setCardChannel(HealthCardEnum.CARD_CHANNEL_WX_CHANNEL.STATUS); // 微信渠道 - public void dataUpload() { - String qrCodeText = getQRCodeText("F43F5B90877116A61D3B960EDAECBCDDDDE7F452605C23DD425CC79BF4644F61", "530127199711211059"); + req.setCardType(cardType); - reportHISData(qrCodeText, "口腔科", "0101011", HealthCardEnum.CARD_TYPE_HEALTH_CARD.STATUS, - null); + // 自费:0100,医保:0200,公费:0300,其他:0000 + req.setCardCostTypes(cardCostType); + //调用接口 + JSONObject resultJson = createHealthCardService().reportHISData(commonIn, req); + HealthCardResult result = new HealthCardResult(resultJson); + if (!result.isOk) { + log.info("[电子健康卡]用卡数据监测接口 {}", resultJson); + return null; + } + return result.getRsp(); + } catch (Exception e) { + ErrorHelper.println(e); + } + return null; + } - reportHISData(qrCodeText, "口腔科", "0101012", HealthCardEnum.CARD_TYPE_HEALTH_CARD.STATUS, - null); - reportHISData(qrCodeText, null, "0101013", HealthCardEnum.CARD_TYPE_HEALTH_CARD.STATUS, - null); + /** + * 获取建档信息 + * + * @param code 建档授权码[获取信息失败时返回]-填写regInfoCode + */ + public Patient getRegInfoByCode(Boolean isMiniApp, String code) { + try { + CommonIn commonIn = createCommonIn(isMiniApp); + if (commonIn == null) { + return null; + } + JSONObject resultJson = createHealthCardService().getRegInfoByCode(commonIn, code); + HealthCardResult result = new HealthCardResult(resultJson); + JSONObject respJsonObj = result.getRsp(); + if (!result.isOk || respJsonObj == null) { + log.info("[电子健康卡]获取建档信息-失败: {}", resultJson); + return null; + } + JSONObject card = respJsonObj.getJSONObject("card"); + if (card == null) { + log.info("[电子健康卡]获取建档信息-Json解析失败"); + return null; + } - reportHISData(qrCodeText, null, "0101014", HealthCardEnum.CARD_TYPE_HEALTH_CARD.STATUS, - null); - // 门诊缴费 - reportHISData(qrCodeText, "口腔科", "0101051", HealthCardEnum.CARD_TYPE_HEALTH_CARD.STATUS, - "0100"); + Patient patient = new Patient(); + String phone1 = card.getString("phone1"); + patient.setTel(ObjectUtils.isEmpty(phone1) ? card.getString("phone2") : phone1); - // 门诊缴费记录 - reportHISData(qrCodeText, null, "0101052", HealthCardEnum.CARD_TYPE_HEALTH_CARD.STATUS, - null); + patient.setIsMyself(card.getBoolean("isSelf")); + patient.setCardType(card.getString("idType")); + patient.setIdCardNo(card.getString("idNumber")); + patient.setName(card.getString("name")); + patient.setSex(card.getString("gender")); + patient.setNation(card.getString("nation")); + patient.setAddress(card.getString("address")); + patient.setBirthday(card.getString("birthday")); + patient.setHealthCardId(card.getString("healthCardId")); + log.info("[电子健康卡]获取建档信息: {}", JsonHelper.toJsonString(patient)); + return patient; + } catch (Exception e) { + ErrorHelper.println(e); + } + return null; + } - reportHISData(qrCodeText, null, "0101081", HealthCardEnum.CARD_TYPE_HEALTH_CARD.STATUS, - null); - reportHISData(qrCodeText, null, "0101082", HealthCardEnum.CARD_TYPE_HEALTH_CARD.STATUS, - null); + /** + * 绑卡验证授权 + * + * @param wechatCode 微信身份码 + * @param openId openId + */ + public static JSONObject registerHealthCardPreAuth(Boolean isMiniApp, String domain, String wechatCode, String healthCode, String openId) { + try { + CommonIn commonIn = createCommonIn(isMiniApp); + if (commonIn == null) { + return null; + } - reportHISData(qrCodeText, null, "0101083", HealthCardEnum.CARD_TYPE_HEALTH_CARD.STATUS, - null); + // 成功回调页 + String successRedirectUrl = (isMiniApp ? "mini:/path/to/isvpage?healthCode=" : (domain + "/path/to/isvpage?healthCode=")) + wechatCode; + // 失败回调页 + String failRedirectUrl = (isMiniApp ? "/path/to/isvpage?regInfoCode=" : (domain + "/path/to/isvpage?regInfoCode=")) + wechatCode; + /* + * 用户手动填写信息建卡可选两种方式(二选一): + * 一、服务商自行提供建卡页(可以是H5或小程序),需增加authCode占位符,示例如下: + * H5: https://xxx.xxx.xx/path/to/isvpage?authCode=${authCode} |小程序: mini:/path/to/isvpage?authCode=${authCode} + * 二、使用开放平台的H5绑卡组件页,需增加authCode占位符,示例如下: + * https://h5-health.tengmed.com/h5/tencent/open/card/regist?hospitalId=${hospitalId}&redirect_uri=${redirect_uri}&fail_redirect_uri=${fail_redirect_uri}&authCode=${authCode}小程序需修改该域名地址为已配置的业务域名 + * ${hospitalId},必传,为开放平台分配的医院ID(hospitalId); + * ${redirect_uri},必传,为建卡成功后的回跳服务商页面,必须要对该URL进行UrlEncode编码。 + * ${fail_redirect_uri},必传,为建卡失败后的回跳服务商页面,必须要对该URL进行UrlEncode编码。 + * 小程序内嵌,仍以 mini 协议开头,且需要UrlEncode编码。 + */ + + String userFormPageUrl = String.format("%s/h5/tencent/open/card/regist?hospitalId=%s&redirect_uri=%s&fail_redirect_uri=%s&authCode=%s", + (isMiniApp ? domain : " https://h5-health.tengmed.com"), + H_HOSPITAL_ID, + URLHelper.encodeURL(successRedirectUrl), + URLHelper.encodeURL(failRedirectUrl), + wechatCode); + + // 小程序内嵌必传(固定为小程序路径,不需要加“mini:”前缀)示例: /path/to/facePage + String faceUrl = isMiniApp ? "/path/to/facePage" : null; + // 放弃验证回调页 + String verifyFailRedirectUrl = isMiniApp ? "mini:/path/to/isvpage" : (domain + "/path/to/isvpage"); + + int patientType = 0; // 0-新患者 1-老患者(针对就诊卡升级健康卡);不传默认为0 + + JSONObject resultJson = createHealthCardService().registerHealthCardPreAuth(commonIn, + wechatCode, + patientType, + successRedirectUrl, + failRedirectUrl, + userFormPageUrl, + faceUrl, + verifyFailRedirectUrl, + domainChannel); + log.info("[电子健康卡]绑卡验证授权 resp={}", JsonHelper.toJsonString(resultJson)); + HealthCardResult result = new HealthCardResult(resultJson); + if (!result.isOk) { + log.info("[电子健康卡]绑卡验证授权-失败: {}", resultJson); + return result.getCommonOut(); + } + return result.getRsp(); + } catch (Exception e) { + ErrorHelper.println(e); + } + return null; } + + /** + * 提交建卡相关信息 + * + * @param wechatCode 微信身份码 + * @param openId openId + */ + public JSONObject registerHealthCardPreFill(Boolean isMiniApp, String wechatCode, String authCode, String openId, String patientId, + String birthday, HCardTypeEnum cardTypeEnum, String address, String areaAddress, + String sex, String nation, String name, String idCardNo, String phone1) { + try { + CommonIn commonIn = createCommonIn(isMiniApp); + if (commonIn == null) { + return null; + } + + // 成功回调页,需增加healthCode 占位符,示例如下:H5: https://xxx.xxx.xx/path/to/isvpage?healthCode=${healthCode} | 小程序: mini:/path/to/isvpage?healthCode=${healthCode} + String successRedirectUrl = ""; + // 失败回调页,需增加regInfoCode占位符,示例如下: H5: https://xxx.xxx.xx/path/to/isvpage?regInfoCode=${regInfoCode}|小程序: mini:/path/to/isvpage?regInfoCode=${regInfoCode} + String failRedirectUrl = ""; + + // 小程序内嵌必传(固定为小程序路径,不需要加“mini:”前缀)示例: /path/to/facePage + String faceUrl = ""; + // 放弃验证回调页,无参数占位要求,示例如下: H5: https://xxx.xxx.xx/path/to/isvpage | 小程序: mini:/path/to/isvpage + String verifyFailRedirectUrl = ""; + + HealthCardInfo req = new HealthCardInfo(); + req.setAddress(areaAddress + address); + req.setBirthday(birthday); + req.setGender(sex); + req.setIdNumber(idCardNo); + req.setIdType(cardTypeEnum.WX_CODE); + req.setNation(nation); + req.setName(name); + req.setPhone1(phone1); + req.setWechatCode(wechatCode); + req.setPatid(patientId); + + JSONObject resultJson = createHealthCardService().registerHealthCardPreFill(commonIn, + req, + authCode, + successRedirectUrl, + failRedirectUrl, + faceUrl, + verifyFailRedirectUrl, + domainChannel); + HealthCardResult result = new HealthCardResult(resultJson); + if (!result.isOk) { + log.info("[电子健康卡]提交建卡相关信息-失败: {}", resultJson); + return result.getCommonOut(); + } + return result.getRsp(); + } catch (Exception e) { + ErrorHelper.println(e); + } + return null; + } } diff --git a/src/main/java/com/ynxbd/common/service/HealthUploadService.java b/src/main/java/com/ynxbd/common/service/HealthUploadService.java new file mode 100644 index 0000000..b1b308d --- /dev/null +++ b/src/main/java/com/ynxbd/common/service/HealthUploadService.java @@ -0,0 +1,159 @@ +package com.ynxbd.common.service; + +import com.alibaba.fastjson.JSONObject; +import com.ynxbd.common.bean.Patient; +import com.ynxbd.common.bean.enums.HealthCardEnum; +import com.ynxbd.common.dao.PatientDao; +import lombok.extern.slf4j.Slf4j; + +import java.text.SimpleDateFormat; +import java.util.Date; + +@Slf4j +public class HealthUploadService { + + /** + * 健康卡数据上报-->挂号支付 + * + * @param openid openid + * @param patientId 患者ID + * @param deptName 科室名 + * @param regDate 挂号日期 + */ + public void regPayReportHISData(String openid, String patientId, String deptName, String regDate) { + try { + if (!HCodeService.isEnableHCode()) { // 判断是否禁用电子健康卡 + return; + } + + if (deptName == null || openid == null || patientId == null || regDate == null) { + return; + } + + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); + String today = format.format(new Date()); + String scene = regDate.equals(today) ? HealthCardEnum.SCENE_REGISTER_SITE.STATUS : HealthCardEnum.SCENE_REGISTER_RESERVE.STATUS; + + Patient patient = new PatientDao().selectByOpenidAndPatientId(openid, patientId); + if (patient == null) { + return; + } + + String healthCardId = patient.getHealthCardId(); + String idCardNo = patient.getIdCardNo(); + if (healthCardId == null || idCardNo == null) { + return; + } + + String qrCodeText = HCodeService.getQRCodeText(false, healthCardId, idCardNo); + if (qrCodeText == null) { + return; + } + + JSONObject jsonObject = HCodeService.reportHISData(qrCodeText, deptName, scene, HealthCardEnum.CARD_TYPE_HEALTH_CARD.STATUS, HealthCardEnum.CARD_COST_TYPE_OWN_EXPENSE.STATUS); + if (jsonObject == null) { + log.info("[电子健康卡][挂号缴费]数据上报失败"); + } + } catch (Exception e) { + log.error(e.getMessage()); + } + } + + + /** + * 健康卡数据上报-->门诊缴费 + * + * @param openid openid + * @param patientId patientId + */ + public void rxReportHISData(String openid, String patientId) { + try { + if (!HCodeService.isEnableHCode()) { // 判断是否禁用电子健康卡 + return; + } + + if (patientId == null || openid == null) { + return; + } + + Patient patient = new PatientDao().selectByOpenidAndPatientId(openid, patientId); + if (patient == null) { + return; + } + + String healthCardId = patient.getHealthCardId(); + String idCardNo = patient.getIdCardNo(); + if (healthCardId == null || idCardNo == null) { + return; + } + + String qrCodeText = HCodeService.getQRCodeText(false, healthCardId, idCardNo); + if (qrCodeText == null) { + return; + } + + JSONObject jsonObject = HCodeService.reportHISData(qrCodeText, null, HealthCardEnum.SCENE_TOLL_OUTPATIENT_PAYMENT.STATUS, HealthCardEnum.CARD_TYPE_HEALTH_CARD.STATUS, HealthCardEnum.CARD_COST_TYPE_OWN_EXPENSE.STATUS); + if (jsonObject == null) { + log.info("[电子健康卡][门诊缴费]数据上报失败"); + } + } catch (Exception e) { + log.error(e.getMessage()); + } + } + + // public static Patient appBindHealthCard(String healthCode) { +// if (healthCode == null) { +// return null; +// } +// String appToken = getAppToken(); +// if (appToken == null) { +// return null; +// } +// CommonIn commonIn = createCommonIn(appToken); +// +// JSONObject resultObj = createHealthCardService().getHealthCardByHealthCode(commonIn, healthCode); +// JSONObject rspObj = resultObj.getJSONObject("rsp"); +// JSONObject cardJson = rspObj.getJSONObject("card"); +// Patient patient = new Patient(); +// patient.setSex(cardJson.getString("gender")); // 性别 +// patient.setName(cardJson.getString("name")); +// patient.setNation(cardJson.getString("nation")); +// patient.setCardType(cardJson.getString("idType")); +// patient.setIdCardNo(cardJson.getString("idNumber")); +// patient.setBirthday(cardJson.getString("birthday")); +// patient.setAddress(cardJson.getString("address")); +// String phone1 = cardJson.getString("phone1"); +// String phone2 = cardJson.getString("phone2"); +// patient.setTel(ObjectUtils.isEmpty(phone1) ? phone2 : phone1); +// return patient; +// } + + + public static void dataUpload() { + String qrCodeText = HCodeService.getQRCodeText(false, "F43F5B90877116A61D3B960EDAECBCDDDDE7F452605C23DD425CC79BF4644F61", "530127199711211059"); + + HCodeService.reportHISData(qrCodeText, "口腔科", "0101011", HealthCardEnum.CARD_TYPE_HEALTH_CARD.STATUS, null); + + HCodeService.reportHISData(qrCodeText, "口腔科", "0101012", HealthCardEnum.CARD_TYPE_HEALTH_CARD.STATUS, null); + + HCodeService.reportHISData(qrCodeText, null, "0101013", HealthCardEnum.CARD_TYPE_HEALTH_CARD.STATUS, null); + + HCodeService.reportHISData(qrCodeText, null, "0101014", HealthCardEnum.CARD_TYPE_HEALTH_CARD.STATUS, null); + // 门诊缴费 + HCodeService.reportHISData(qrCodeText, "口腔科", "0101051", HealthCardEnum.CARD_TYPE_HEALTH_CARD.STATUS, "0100"); + + // 门诊缴费记录 + HCodeService.reportHISData(qrCodeText, null, "0101052", HealthCardEnum.CARD_TYPE_HEALTH_CARD.STATUS, null); + + HCodeService.reportHISData(qrCodeText, null, "0101081", HealthCardEnum.CARD_TYPE_HEALTH_CARD.STATUS, null); + + HCodeService.reportHISData(qrCodeText, null, "0101082", HealthCardEnum.CARD_TYPE_HEALTH_CARD.STATUS, null); + + HCodeService.reportHISData(qrCodeText, null, "0101083", HealthCardEnum.CARD_TYPE_HEALTH_CARD.STATUS, null); + } + + public static void main(String[] args) { + dataUpload(); + } + +} diff --git a/src/main/java/com/ynxbd/common/service/PatientService.java b/src/main/java/com/ynxbd/common/service/PatientService.java index 4b338bd..f02b9e4 100644 --- a/src/main/java/com/ynxbd/common/service/PatientService.java +++ b/src/main/java/com/ynxbd/common/service/PatientService.java @@ -1,7 +1,5 @@ package com.ynxbd.common.service; -import com.alibaba.fastjson.JSONObject; -import com.ynxbd.common.bean.GMCUser; import com.ynxbd.common.bean.Patient; import com.ynxbd.common.bean.User; import com.ynxbd.common.dao.PatientDao; @@ -14,16 +12,12 @@ import com.ynxbd.common.result.ServiceException; import com.ynxbd.wx.config.WeChatConfig; import com.ynxbd.wx.utils.DesEncryptHelper; import com.ynxbd.wx.wxfactory.AesWxHelper; -import com.ynxbd.wx.wxfactory.WxAuthHelper; import com.ynxbd.wx.wxfactory.WxCacheHelper; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ObjectUtils; import javax.servlet.http.HttpServletRequest; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; +import java.util.*; /** * 患者业务层 @@ -39,7 +33,7 @@ public class PatientService { return new PatientDao().selectMyself(openid); } - public Patient getCacheMyself(String openid) { + public Patient queryCacheMyself(String openid) { User user = WxCacheHelper.getCacheUser(openid); if (user == null) { return null; @@ -63,53 +57,23 @@ public class PatientService { public List enPatientList(List patients) { for (Patient item : patients) { - if (item.getPatientId() != null) { - item.setEnPatientId(AesWxHelper.encode(item.getPatientId())); - } - - if (!ObjectUtils.isEmpty(item.getIdCardNo())) { - // 加密数据 - item.setEnCardNo(AesWxHelper.encode(item.getIdCardNo())); - item.setEnTel(AesWxHelper.encode(item.getTel())); - // 显示数据---------------------- - item.setShowCardNo(ParamHelper.hideIdCardNo(item.getIdCardNo())); - item.setShowTel(ParamHelper.hidTel(item.getTel())); - - } else { - // 无证绑定显示数据 - item.setFatherIdCardNo(ParamHelper.hideIdCardNo(item.getFatherIdCardNo())); - item.setMotherIdCardNo(ParamHelper.hideIdCardNo(item.getMotherIdCardNo())); - // ------------ - item.setFatherTel(ParamHelper.hidTel(item.getFatherTel())); - item.setMotherTel(ParamHelper.hidTel(item.getMotherTel())); - } + item.filterData(false); } return patients; } - /** - * 查询医共体医生列表 - * - * @param openid - * @param unionId - * @param isEnPid - * @return - */ - public List queryGMCPatientList(String enUnionId, String openid, String unionId, boolean isEnPid) { - // 在查询时完成数据同步 - if (!WeChatConfig.IS_GMC_SERVER) { // 不为医共体主体 - // 查询医共体患者数据 - +// public List queryGMCPatientList(String enUnionId, String openid, String unionId, boolean isEnPid) { +// // 在查询时完成数据同步 +// if (!WeChatConfig.IS_GMC_SERVER) { // 不为医共体主体=>查询医共体患者数据 +// +// } +// return queryPatientList(openid, unionId, true); +// } + + public List queryPatientList(HttpServletRequest request, String openid, String unionId, boolean isEnPid) { + if (request != null && WeChatConfig.IS_ENABLE_GMC && !WeChatConfig.IS_GMC_SERVER) { // 不是主体服务器=>请求主服务器 + return new GMCService().queryGmcPatientList(request, openid, unionId); } - - List patients = new PatientDao().selectListByToken(openid, unionId); - if (isEnPid) { - patients = enPatientList(patients); - } - return patients; - } - - public List queryPatientList(String openid, String unionId, boolean isEnPid) { List patients = new PatientDao().selectListByToken(openid, unionId); if (isEnPid) { patients = enPatientList(patients); @@ -125,79 +89,6 @@ public class PatientService { return bind(request, isMyself, isAreaCode, bindInfo); } - public Patient gmcServerBind(HttpServletRequest request, Patient bindInfo) throws ServiceException { - if (!WeChatConfig.IS_ENABLE_GMC) { // 未医共体开关 - return bindInfo; - } - String openid = bindInfo.getOpenid(); - String hospAppId = AesWxHelper.decode(bindInfo.getEnHospAppId()); - if (ObjectUtils.isEmpty(hospAppId)) { - throw new ServiceException("医共体子公众号id参数错误"); - } - - String gmcUniqueId; - if (WeChatConfig.IS_GMC_SERVER) { // 是医共体主服务器 - if (!WeChatConfig.APP_ID.equals(hospAppId)) { // 不为自身AppId - bindInfo.setHospAppId(hospAppId); // 需存的数据 - } - bindInfo.setGmcUniqueId(CodeHelper.get32UUID()); - - } else { - String enGmcOpenId = bindInfo.getEnGmcOpenId(); // 只有子公众号有 - String gmcOpenId = AesWxHelper.decode(enGmcOpenId); - - log.info("[转发]enGmcOpenId={}, gmcOpenId={}", enGmcOpenId, gmcOpenId); - if (ObjectUtils.isEmpty(gmcOpenId)) { - throw new ServiceException("医共体非主体公众号ID参数异常"); - } - - JsonResult jsonResult = WxAuthHelper.postFormGMC(request, "/healthCode/bind", params -> { - params.put("isAreaCode", false); - params.put("isFace", false); - params.put("isHealthCard", false); - - params.put("openid", gmcOpenId); // 主体的openid - params.put("address", bindInfo.getAddress()); - params.put("areaCode", bindInfo.getAreaCode()); - params.put("areaAddress", bindInfo.getAreaAddress()); - params.put("tel", bindInfo.getTel()); - params.put("sex", bindInfo.getSex()); - params.put("name", bindInfo.getName()); - params.put("nation", bindInfo.getNation()); - params.put("birthday", bindInfo.getBirthday()); - params.put("idCardNo", bindInfo.getIdCardNo()); - // - params.put("enOpenId", enGmcOpenId); - params.put("enUnionId", bindInfo.getEnUnionId()); - params.put("enGmcOpenId", enGmcOpenId); - params.put("enHospAppId", bindInfo.getEnHospAppId()); - }, null); - if (!jsonResult.success()) { - throw new ServiceException(jsonResult.getMessage()); - } - log.info("[绑定转发] resp={}", JsonHelper.toJsonString(jsonResult)); - - JSONObject dataJson = jsonResult.dataMapGetNodeToJsonObj(); - gmcUniqueId = dataJson.getString("gmcUniqueId"); - if (ObjectUtils.isEmpty(gmcUniqueId)) { - throw new ServiceException("医共体返回唯一id为空"); - } - bindInfo.setGmcUniqueId(gmcUniqueId); - if (!enGmcOpenId.equals(dataJson.getString("enOpenId"))) { - throw new ServiceException("医共体主体openId不匹配"); - } - - GMCUser findGMCUser = new GMCUserService().queryInfoByOpenId(openid); - if (findGMCUser == null) { - boolean isOK = new GMCUserService().addInfo(openid, gmcOpenId, bindInfo.getUnionId(), gmcUniqueId); - if (!isOK) { - log.error("[医共体关系]添加失败 openid={}, gmcOpenId={}, uuid={}", openid, gmcOpenId, gmcUniqueId); - } - } - } - return bindInfo; - } - /** * [绑定] * @@ -209,14 +100,15 @@ public class PatientService { if (bindInfo == null) { return Result.error(ResultEnum.PARAM_IS_DEFECT); } + try { - bindInfo = gmcServerBind(request, bindInfo); + bindInfo = new GMCService().bindGmcServer(request, bindInfo); } catch (Exception e) { ErrorHelper.println(e); return Result.error(e); } - log.info("[患者]身份绑定 bindInfo={}", JsonHelper.toJsonString(bindInfo)); + log.info("[患者]身份绑定: {}", JsonHelper.toJsonString(bindInfo)); String openid = bindInfo.getOpenid(); String name = bindInfo.getName(); String idCardNo = bindInfo.getIdCardNo(); @@ -246,11 +138,11 @@ public class PatientService { String patientId = hisPatient.getPatientId(); String hisTransNo = hisPatient.getHisTransNo(); - String gmcHisPatientId = null; // HIS医共体患者ID + // String gmcHospId = null; // 医共体下的医院id bindInfo.setPatientId(patientId); bindInfo.setHisTransNo(hisTransNo); - bindInfo.setGmcHisPatientId(gmcHisPatientId); + // bindInfo.setGmcHospId(gmcHospId); // 判断是否已有数据 Patient patient = patientDao.selectByIdCardNo(openid, idCardNo); @@ -267,7 +159,7 @@ public class PatientService { } else { patientId = patient.getPatientId(); - if (healthCardId != null && new HCodeService().bindCardRelation(patientId, healthCardId) == null) { // 绑定患者和院内关系 + if (healthCardId != null && new HCodeService().bindCardRelation(false, patientId, healthCardId) == null) { // 绑定患者和院内关系 log.info("[电子健康卡]绑定患者和医院关系失败"); } @@ -436,4 +328,43 @@ public class PatientService { } } + + /** + * [患者]根据患者id查询信息 + * + * @param patientId 患者id + * @return patient + */ + public Patient queryPatientByPatientId(String patientId) throws ServiceException { + if (ObjectUtils.isEmpty(patientId)) { + throw new ServiceException(ResultEnum.PARAM_IS_DEFECT); + } + JsonResult jsonResult = new HisPatientDao().queryPatientByPatientId(patientId); + if (!jsonResult.success()) { + throw new ServiceException(jsonResult.getMessage()); + } + Patient patient = jsonResult.dataMapToBean(Patient.class); + if (patient == null) { + throw new ServiceException(ResultEnum.DATA_NOT_FOUND); + } + return patient; + } + + /** + * [患者]HIS中是否已绑定 + * + * @param patientId 患者id + * @return patient + */ + public boolean hasHisBind(String patientId) { + try { + Patient patient = queryPatientByPatientId(patientId); + if (patient == null) { + return false; + } + return "1".equals(patient.getBindingFlag()); + } catch (Exception ignored) { + } + return false; + } } diff --git a/src/main/java/com/ynxbd/common/service/RecipeService.java b/src/main/java/com/ynxbd/common/service/RecipeService.java index 81b130a..56a4356 100644 --- a/src/main/java/com/ynxbd/common/service/RecipeService.java +++ b/src/main/java/com/ynxbd/common/service/RecipeService.java @@ -380,7 +380,7 @@ public class RecipeService { TZReserveConfig.reserveRun(patientId); // 天助医技预约 - new HCodeService().rxReportHISData(openid, patientId); + new HealthUploadService().rxReportHISData(openid, patientId); return true; } diff --git a/src/main/java/com/ynxbd/common/service/RegService.java b/src/main/java/com/ynxbd/common/service/RegService.java index 3737105..d913b09 100644 --- a/src/main/java/com/ynxbd/common/service/RegService.java +++ b/src/main/java/com/ynxbd/common/service/RegService.java @@ -228,7 +228,7 @@ public class RegService { // 电子健康卡上报数据 - new HCodeService().regPayReportHISData(openid, patientId, reg.getDeptName(), reg.getRegDate()); + new HealthUploadService().regPayReportHISData(openid, patientId, reg.getDeptName(), reg.getRegDate()); } if (MerchantEnum.ALI.equals(merchantEnum)) { diff --git a/src/main/java/com/ynxbd/wx/config/WeChatConfig.java b/src/main/java/com/ynxbd/wx/config/WeChatConfig.java index 2bb6080..6b6ffe6 100644 --- a/src/main/java/com/ynxbd/wx/config/WeChatConfig.java +++ b/src/main/java/com/ynxbd/wx/config/WeChatConfig.java @@ -51,6 +51,7 @@ public class WeChatConfig { // public static final String GMC_AUTH_APP_ID; // public static final String GMC_AUTH_APP_SECRET; public static final String GMC_AUTH_DOMAIN; + public static final String GMC_APP_ID; static { ProperHelper config = new ProperHelper().read("wx.properties"); @@ -85,6 +86,7 @@ public class WeChatConfig { // GMC_AUTH_APP_ID = config.getString("wx.gmc.auth_app_id"); // GMC_AUTH_APP_SECRET = config.getString("wx.gmc.auth_app_secret"); GMC_AUTH_DOMAIN = config.getString("wx.gmc.auth_domain"); + GMC_APP_ID = config.getString("wx.gmc.app_id"); IS_GMC_SERVER = DOMAIN != null && DOMAIN.equals(GMC_AUTH_DOMAIN); } diff --git a/src/main/java/com/ynxbd/wx/wxfactory/AesWxHelper.java b/src/main/java/com/ynxbd/wx/wxfactory/AesWxHelper.java index 5368af5..a899833 100644 --- a/src/main/java/com/ynxbd/wx/wxfactory/AesWxHelper.java +++ b/src/main/java/com/ynxbd/wx/wxfactory/AesWxHelper.java @@ -35,8 +35,8 @@ public class AesWxHelper extends AesHelper { return decryptHex(enData, KEY, IV); } -// public static void main(String[] args) { -// System.out.println(encode("847149")); + public static void main(String[] args) { + System.out.println(encode("001")); // System.out.println(decode("E6835E243069406F53EC8464898B37C0")); -// } + } } diff --git a/src/main/java/com/ynxbd/wx/wxfactory/WxAuthHelper.java b/src/main/java/com/ynxbd/wx/wxfactory/WxAuthHelper.java index 1bb3035..4a5ed15 100644 --- a/src/main/java/com/ynxbd/wx/wxfactory/WxAuthHelper.java +++ b/src/main/java/com/ynxbd/wx/wxfactory/WxAuthHelper.java @@ -5,8 +5,6 @@ import com.ynxbd.common.bean.Patient; import com.ynxbd.common.bean.User; import com.ynxbd.common.helper.common.*; import com.ynxbd.common.helper.http.OkHttpHelper; -import com.ynxbd.common.result.JsonResult; -import com.ynxbd.common.result.JsonResultEnum; import com.ynxbd.common.result.Result; import com.ynxbd.common.service.GMCUserService; import com.ynxbd.common.service.PatientService; @@ -36,8 +34,8 @@ public class WxAuthHelper { private static final String P_PREFIX = "_@"; // 前缀 private static final String P_SUFFIX = ":"; // 后缀 - private static final String AUTH_SESSION_ID_NAME = "SID"; - private static final String GMC_ID = "GMCId"; + private static final String AUTH_SESSION_ID_NAME = "SID"; // session name标识 + private static final String GMC_ID = "GMCId"; // 主体服务器-sessionId private static final String OPENID = "openid"; public static String getSessionOpenid(HttpServletRequest request) { @@ -78,7 +76,7 @@ public class WxAuthHelper { user.setUnionId(unionId); user.setOpenid(openid); user.setIsSnapShotUser(snsToken.getIsSnapShotUser()); - user.setPatientList(new PatientService().queryPatientList(openid, unionId, true)); + user.setPatientList(new PatientService().queryPatientList(request, openid, unionId, true)); if (isUserInfo) { SnsUserInfo snsUser = WxFactory.Base.OAuth().snsUserInfo(snsToken.getAccessToken(), openid, "zh_CN", 3); @@ -145,7 +143,7 @@ public class WxAuthHelper { AuthTokenData authTokenData = new AuthTokenData(); String cacheTokenOpenId = authTokenData.decodeToken(token, WeChatConfig.APP_ID); - log.warn("[授权is_auth] token={}, state={}, isUserInfo={}, deState={}", token, state, isUserInfo, deState); + log.warn("[授权is_auth] has_token={}, state={}, isUserInfo={}, deState={}", !ObjectUtils.isEmpty(token), state, isUserInfo, deState); String authSessionId = null; if (WeChatConfig.IS_ENABLE_GMC) { // 开启医共体开关 @@ -153,12 +151,13 @@ public class WxAuthHelper { if (WeChatConfig.IS_GMC_SERVER) { // 是医共体主服务器 authSessionId = AesWxHelper.decode(request.getHeader(AUTH_SESSION_ID_NAME)); - } else { // 请求转发 + } else { // 请求转发 String serverDomain = WeChatConfig.getDomain(false, false); if (deState != null && serverDomain != null && !deState.contains(serverDomain)) { return Result.error("授权域名不匹配"); } - return gmc_server_auth(request, session, state, isUserInfo, cacheTokenOpenId, token, authTokenData, sessionOpenId, authSessionId); + log.info("[微信认证]向主服务器请求认证 cacheTokenOpenId={}", cacheTokenOpenId); + return reqGmcServiceAuth(request, session, state, isUserInfo, cacheTokenOpenId, token, authTokenData, sessionOpenId, authSessionId); } } catch (Exception e) { ErrorHelper.println(e); @@ -167,20 +166,22 @@ public class WxAuthHelper { } if (cacheTokenOpenId != null) { - log.info("[微信token认证] token={}, cacheOpenId={}", token, cacheTokenOpenId); - AuthResultData authResultData = getTokenData(cacheTokenOpenId, token, authTokenData); + log.info("[微信token认证] cacheOpenId={}", cacheTokenOpenId); + AuthResultData authResultData = getTokenData(request, cacheTokenOpenId, token, authTokenData); session.setAttribute(OPENID, cacheTokenOpenId); return Result.success(authResultData.toResultData()); } - log.info("[微信认证]获取 openid={}, authSessionId={}", sessionOpenId, authSessionId); + log.info("[微信认证]获取 openId={}, authSessionId={}", sessionOpenId, authSessionId); if (!ObjectUtils.isEmpty(authSessionId) && ObjectUtils.isEmpty(sessionOpenId)) { sessionOpenId = WxCacheHelper.findOpenIdBySessionIdCache(authSessionId); log.info("[微信AID认证]sessionOpenId={}", sessionOpenId); } AuthResultData authResultData = getCacheUserData(request, sessionOpenId, state, isUserInfo, authSessionId); + log.info("[返回认证数据] data={}", JsonHelper.toJsonString(authResultData)); if (authResultData.hasAuthUrl()) { + log.info("[返回认证链接]authResultData.getAuthUrl"); return Result.success(authResultData.getAuthUrl()); } return Result.success(authResultData.toResultData()); @@ -189,29 +190,35 @@ public class WxAuthHelper { /** * 主体服务器认证 */ - public static Result gmc_server_auth(HttpServletRequest request, HttpSession session, String state, String isUserInfo, - String cacheTokenOpenId, String token, AuthTokenData tokenData, String sessionOpenId, String authSessionId) { - String reqGMCServerUrl = getReqGMCServerUrl(request); + public static Result reqGmcServiceAuth(HttpServletRequest request, HttpSession session, String state, String isUserInfo, + String cacheTokenOpenId, String token, AuthTokenData tokenData, String sessionOpenId, String authSessionId) { // 自身认证 boolean hasTokenCache = !ObjectUtils.isEmpty(cacheTokenOpenId); String openId = hasTokenCache ? cacheTokenOpenId : sessionOpenId; if (ObjectUtils.isEmpty(openId)) { // 自身认证未完成 return Result.success(getAuthUrl(request, state, false, null, authSessionId)); } -// log.info("cacheTokenOpenId={}, sessionOpenId={}", cacheTokenOpenId, sessionOpenId); + // log.info("cacheTokenOpenId={}, sessionOpenId={}", cacheTokenOpenId, sessionOpenId); // 判断是否有主体id Object sessionGmcOpenId = session.getAttribute(GMC_ID); String gmcOpenId = sessionGmcOpenId == null ? null : sessionGmcOpenId.toString(); + log.info("[向主服务器请求认证] gmcOpenId={}", gmcOpenId); + + if (gmcOpenId == null) { GMCUser gmcUser = new GMCUserService().queryInfoByOpenId(openId); if (gmcUser != null) { + log.info("[医共体认证]存在关联信息"); gmcOpenId = gmcUser.getGmcOpenId(); } } + if (!ObjectUtils.isEmpty(gmcOpenId)) { + new GMCUserService().addInfo(sessionOpenId, gmcOpenId, null, CodeHelper.get32UUID()); + if (sessionGmcOpenId == null) { session.setAttribute(GMC_ID, gmcOpenId); } @@ -219,7 +226,7 @@ public class WxAuthHelper { // 查询返回数据 AuthResultData authResultData = null; if (hasTokenCache) { - authResultData = getTokenData(openId, token, tokenData); + authResultData = getTokenData(request, openId, token, tokenData); } if (authResultData == null) { authResultData = getCacheUserData(request, sessionOpenId, state, isUserInfo, authSessionId); @@ -227,14 +234,14 @@ public class WxAuthHelper { if (authResultData.hasAuthUrl()) { // 授权链接 return Result.success(authResultData.getAuthUrl()); } -// repeatPatients(reqGMCServerUrl, authResultData.getPatientList(), gmcOpenId); // 患者信息去重 +// repeatPatients(reqGMCServerUrl, authResultData.getPatientList(), gmcOpenId); // 患者信息去重 authResultData.setEnGmcOpenId(AesWxHelper.encode(gmcOpenId)); // 用于绑定传递数据,确保关系记录 return Result.success(authResultData.toResultData()); } - String sessionId = session.getId(); - log.info("[认证请求转发] [sessionId:{}]URL:[{}]", sessionId, reqGMCServerUrl); + String reqGMCServerUrl = WeChatConfig.getGMCAuthDomain(isHttpsWithProxy(request), true); // 医共体请求地址 + log.info("[req:认证请求转发] [sessionId:{}]URL:[{}]", sessionId, reqGMCServerUrl); String resultJson = OkHttpHelper.postFormStr(reqGMCServerUrl + "wx_auth/is_auth", params -> { params.put("token", token); params.put("state", state); @@ -249,20 +256,24 @@ public class WxAuthHelper { return result; } String dataStr = result.toDataStr(); - if (dataStr != null && !dataStr.contains("{")) { + if (dataStr != null && !dataStr.contains("{")) { // 返回的是认证链接 + log.info("[req:主服务器认证]返回认证链接"); return Result.success(dataStr); } - AuthResultData gmcAuthResultData = result.dataToBean(AuthResultData.class); // 医共体医生 + AuthResultData gmcAuthResultData = result.dataToBean(AuthResultData.class); // 医共体信息 String enGmcOpenId = gmcAuthResultData.getEnOpenId(); - gmcOpenId = AesWxHelper.decode(enGmcOpenId); // 主体openid - String gmcUUId = AesWxHelper.decode(gmcAuthResultData.getEnGmcUniqueId()); + gmcOpenId = AesWxHelper.decode(enGmcOpenId); // 主体服务器的openid + log.info("[req:主服务器认证]wxOpenId={}, gmcOpenId={}", sessionOpenId, openId); if (!ObjectUtils.isEmpty(gmcOpenId)) { // 授权主体完成认证 session.setAttribute(GMC_ID, gmcOpenId); - new GMCUserService().addInfo(sessionOpenId, gmcOpenId, null, gmcUUId); + new GMCUserService().addInfo(sessionOpenId, gmcOpenId, null, CodeHelper.get32UUID()); AuthResultData authResultData = getCacheUserData(request, sessionOpenId, state, isUserInfo, authSessionId); + if (authResultData.hasAuthUrl()) { // 授权链接 + return Result.success(authResultData.getAuthUrl()); + } authResultData.setEnGmcOpenId(enGmcOpenId); // 用于绑定传递数据,确保关系记录 return Result.success(authResultData.toResultData()); } @@ -277,18 +288,15 @@ public class WxAuthHelper { * @param tokenData token解析出来的数据 * @return bean */ - public static AuthResultData getTokenData(String cacheOpenId, String token, AuthTokenData tokenData) { - if (cacheOpenId == null) { - return null; - } - if (tokenData == null) { + public static AuthResultData getTokenData(HttpServletRequest request, String cacheOpenId, String token, AuthTokenData tokenData) { + if (tokenData == null || cacheOpenId == null) { return null; } - log.info("[微信token认证] token={}, cacheOpenId={}", token, cacheOpenId); + log.info("[微信token认证]has_token={}, cacheOpenId={}", !ObjectUtils.isEmpty(token), cacheOpenId); User user = WxCacheHelper.getCacheUser(cacheOpenId); List patients; if (user == null) { - patients = new PatientService().queryPatientList(cacheOpenId, null, true); + patients = new PatientService().queryPatientList(request, cacheOpenId, null, true); Cache cache = WxCacheHelper.getUserCacheManager(); User addCache = new User(); addCache.setOpenid(cacheOpenId); @@ -315,12 +323,23 @@ public class WxAuthHelper { return authResultData; } + /** + * 从缓存获取数据 + * + * @param request + * @param openId + * @param state + * @param isUserInfo + * @param authSessionId + * @return + */ public static AuthResultData getCacheUserData(HttpServletRequest request, String openId, String state, String isUserInfo, String authSessionId) { log.info("[微信认证]openid={}", openId); AuthResultData authResultData = new AuthResultData(); boolean isFindUserInfo = ("true".equals(isUserInfo)); if (openId == null) { authResultData.setAuthUrl(getAuthUrl(request, state, isFindUserInfo, null, authSessionId)); + log.info("[微信认证]data={}", JsonHelper.toJsonString(authResultData)); return authResultData; } @@ -354,24 +373,6 @@ public class WxAuthHelper { return authResultData; } - public List repeatPatients(String reqDomain, List patientList, String gmcOpenId) throws Exception { - // 数据去重 - JsonResult jsonResult = postForm(reqDomain + "patient/authGMCPatients", params -> { - params.put("gmcOpenId", AesWxHelper.encode(gmcOpenId, true)); - }, headers -> { - headers.add("gmcOpenId", AesWxHelper.encode(gmcOpenId, true)); - }); - if (jsonResult.success()) { - List gmcPatientList = jsonResult.dataMapGetNodeToList(Patient.class); -// authResultData.setPatientList(patientList); - } - return patientList; - } - - public static String getReqGMCServerUrl(HttpServletRequest request) { - return WeChatConfig.getGMCAuthDomain(isHttpsWithProxy(request), true); // 医共体请求服务地址 - } - private static final String OAUTH_URL = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + WeChatConfig.APP_ID + "&redirect_uri="; @@ -391,7 +392,7 @@ public class WxAuthHelper { String params = enSID + enUID; try { params = ObjectUtils.isEmpty(params) ? "" : URLEncoder.encode(params, "UTF-8"); - log.warn("[认证链接参数] params={}", params); + log.warn("[认证链接参数]params={}", params); } catch (Exception e) { log.error(e.getMessage()); } @@ -407,7 +408,6 @@ public class WxAuthHelper { return Base64Helper.encode(state); } - // 是否为https请求 public static boolean isHttpsWithProxy(HttpServletRequest request) { // 优先检查代理头(适用于反向代理场景) @@ -419,6 +419,7 @@ public class WxAuthHelper { return request.isSecure(); } + // 转化成url中的参数 public static String toURLParam(String key, String val) { if (ObjectUtils.isEmpty(val)) return ""; return P_PREFIX + key + P_SUFFIX + val; @@ -455,15 +456,6 @@ public class WxAuthHelper { } - public static JsonResult postForm(String url, OkHttpHelper.MapParams params, OkHttpHelper.Header header) { - return OkHttpHelper.postForm(url, params, header, JsonResultEnum.SYS_COMMON); - } - - public static JsonResult postFormGMC(HttpServletRequest request, String api, OkHttpHelper.MapParams params, OkHttpHelper.Header header) { - String url = getReqGMCServerUrl(request) + api; - return OkHttpHelper.postForm(url, params, header, JsonResultEnum.SYS_COMMON); - } - // // 医共体开启 & 不是支付授权 // private static boolean isAuthGMC(boolean isPayOAuth) { // return WeChatConfig.IS_ENABLE_GMC && !isPayOAuth; @@ -491,4 +483,18 @@ public class WxAuthHelper { // return WeChatConfig.getDomain(WeChatConfig.HAS_HTTPS_BY_BASE_URL || isHttpsWithProxy(request)); // 配置中baseURL有"https"时优先级最高 ["@protocol=1"为https;"@protocol=0"为默认的http;] // } +// public List repeatPatients(String reqDomain, List patientList, String gmcOpenId) throws Exception { +// // 数据去重 +// JsonResult jsonResult = postForm(reqDomain + "patient/authGMCPatients", params -> { +// params.put("gmcOpenId", AesWxHelper.encode(gmcOpenId, true)); +// }, headers -> { +// headers.add("gmcOpenId", AesWxHelper.encode(gmcOpenId, true)); +// }); +// if (jsonResult.success()) { +// List gmcPatientList = jsonResult.dataMapGetNodeToList(Patient.class); +//// authResultData.setPatientList(patientList); +// } +// return patientList; +// } + } diff --git a/src/main/java/com/ynxbd/wx/wxfactory/WxCacheHelper.java b/src/main/java/com/ynxbd/wx/wxfactory/WxCacheHelper.java index 4b3cfe6..2d9cdec 100644 --- a/src/main/java/com/ynxbd/wx/wxfactory/WxCacheHelper.java +++ b/src/main/java/com/ynxbd/wx/wxfactory/WxCacheHelper.java @@ -25,7 +25,6 @@ public class WxCacheHelper { createUserCacheManager(); createAccessTokenCache(); createAuthSessionIdCacheManager(); - } diff --git a/src/main/java/com/ynxbd/wx/wxfactory/WxMiniHelper.java b/src/main/java/com/ynxbd/wx/wxfactory/WxMiniHelper.java new file mode 100644 index 0000000..1e71d37 --- /dev/null +++ b/src/main/java/com/ynxbd/wx/wxfactory/WxMiniHelper.java @@ -0,0 +1,19 @@ +package com.ynxbd.wx.wxfactory; + +import com.ynxbd.common.helper.http.OkHttpHelper; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class WxMiniHelper { + + public static String auth(String jsCode) { + String respJson = OkHttpHelper.get("https://api.weixin.qq.com/sns/jscode2session", params -> { + params.put("appid", "appid"); + params.put("secret", "secret"); + params.put("js_code", jsCode); + params.put("grant_type", "authorization_code"); + }); + log.info("respJson:{}", respJson); + return null; + } +} diff --git a/src/main/resources/hcode.properties b/src/main/resources/hcode.properties index 689a3e8..c83effa 100644 --- a/src/main/resources/hcode.properties +++ b/src/main/resources/hcode.properties @@ -1,12 +1,17 @@ -# 是否使用健康卡 +# \u662F\u5426\u4F7F\u7528\u5065\u5EB7\u5361 is_enable=true -#微信开放平台调用参数 +#\u5FAE\u4FE1\u5F00\u653E\u5E73\u53F0\u8C03\u7528\u53C2\u6570 h.app_id=e4a05c13301f2f6a8b07b3de872dfe2d h.app_secret=e5322dfd9bfab939851319812c30f9f1 -# 医院id +# \u533B\u9662id h.hospital_id=36626 -#万达卡管平台调用参数 +#\u4E07\u8FBE\u5361\u7BA1\u5E73\u53F0\u8C03\u7528\u53C2\u6570 h.card_app_id=5a4a6eacbe1040d8a91c76608aefb943 h.card_public_key=mfkwewyhkozizj0caqyikozizj0daqcdqgaepc6p0omuruc5lq7cwdu18ca4cgmqbtjpwdyrglo4wbal9/m3dv4oywez7fbgtnkkgj/kfojvze6sc/dka+ddca== h.card_private_key=4e181412b5874b22ba113ea3a907e244 -h.card_url=http://220.164.109.105:19211/internet \ No newline at end of file +h.card_url=http://220.164.109.105:19211/internet +# mini-app====================================== +# \u5C0F\u7A0B\u5E8F\u533B\u9662id +h.mini_hospital_id=36626 +# \u5C0F\u7A0B\u5E8FappId +h.mini_app_id=wx80685a7daa772a0b \ No newline at end of file diff --git a/src/main/resources/webservice.properties b/src/main/resources/webservice.properties index 9354497..38ac906 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 # \u672C\u5730 #his.url=127.0.0.1:8888 # HIS\u662F\u5426\u5F00\u542F\u652F\u4ED8\u5B9D\u5206\u5F00\u5BF9\u8D26 his.is_ali_mer=false # \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 # \u5FAE\u4FE1\u533B\u4FDD his.wx_med_url=10.20.10.7:7885 # \u652F\u4ED8\u5B9D\u533B\u4FDD his.ali_med_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 +# \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 # \u672C\u5730 #his.url=127.0.0.1:8888 # HIS\u662F\u5426\u5F00\u542F\u652F\u4ED8\u5B9D\u5206\u5F00\u5BF9\u8D26 his.is_ali_mer=false # \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 # \u5FAE\u4FE1\u533B\u4FDD his.wx_med_url=10.20.10.7:7885 # \u652F\u4ED8\u5B9D\u533B\u4FDD his.ali_med_url=10.20.10.7:7885 # \u77F3\u6797\u6D4B\u8BD5 his.url=200.200.200.105:8888 # \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 794c52f..cfbe38d 100644 --- a/src/main/resources/wx.properties +++ b/src/main/resources/wx.properties @@ -1,4 +1,4 @@ -wx.app_id=wxd503671f502bd89d +wx.app_id= wx.app_secret= wx.token=ynxbd wx.aes_key= @@ -12,3 +12,12 @@ wx.deploy_server_name=wx wx.web_static_path=/web # \u9000\u8D39\u5BC6\u7801 wx.password=ynxbd@6910 + + +# \u662F\u5426\u4E3A\u6D4B\u8BD5\u73AF\u5883 +wx.is_dev=true + +# \u7528\u4E8E\u6388\u6743\u7684\u533B\u5171\u4F53\u516C\u4F17\u53F7\u914D\u7F6E======================= +wx.gmc.is_enable= +wx.gmc.auth_domain= +wx.gmc.app_id= \ No newline at end of file