From 61652877f22ed80a6d503e8bd0ed644cb468f259 Mon Sep 17 00:00:00 2001 From: wangsq Date: Thu, 25 Jun 2026 10:23:15 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E6=82=A3=E8=80=85=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=97=B6=EF=BC=8C=E5=8C=BB=E5=85=B1=E4=BD=93?= =?UTF-8?q?=E7=9A=84=E7=8A=B6=E6=80=81=E6=B2=A1=E6=9C=89=E8=BF=9B=E8=A1=8C?= =?UTF-8?q?=E6=98=AF=E5=90=A6=E4=B8=BA=E5=8C=BB=E5=85=B1=E4=BD=93=E7=9A=84?= =?UTF-8?q?=E5=88=A4=E6=96=AD=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D=E3=80=82?= =?UTF-8?q?=202=E3=80=81=E6=99=BA=E8=83=BD=E5=AF=BC=E8=AF=8A=E9=9C=80?= =?UTF-8?q?=E8=A6=81=E6=80=A7=E5=88=AB=E8=BF=94=E5=9B=9E=EF=BC=8CHIS?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E6=96=B0=E5=A2=9E=E6=80=A7=E5=88=AB=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=EF=BC=8C=E5=B9=B6=E5=A4=84=E7=90=86=E3=80=82=203?= =?UTF-8?q?=E3=80=81=E9=9D=9E=E5=88=86=E6=97=B6=E6=AE=B5=E6=8C=82=E5=8F=B7?= =?UTF-8?q?=E4=BA=9A=E4=B8=93=E7=A7=91=E7=9A=84=E5=90=88=E5=B9=B6=E5=88=A4?= =?UTF-8?q?=E6=96=AD=E5=AD=98=E5=9C=A8=E9=97=AE=E9=A2=98=EF=BC=8C=E5=8F=AF?= =?UTF-8?q?=E8=83=BD=E5=87=BA=E7=8E=B0=E9=87=8D=E5=A4=8D=E7=9A=84=E6=83=85?= =?UTF-8?q?=E5=86=B5=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D=204=E3=80=81?= =?UTF-8?q?=E7=9F=B3=E6=9E=97=E5=8E=BF=E5=8C=BB=E9=99=A2=E7=94=B5=E5=AD=90?= =?UTF-8?q?=E5=81=A5=E5=BA=B7=E5=8D=A1=E5=9C=A8=E4=BD=BF=E7=94=A8=E4=BA=86?= =?UTF-8?q?=E6=96=B0=E7=89=88=E5=90=8E=EF=BC=8C=E5=AD=90=E5=8C=BB=E9=99=A2?= =?UTF-8?q?=E5=9C=A8=E4=BD=BF=E7=94=A8=E6=97=B6=E4=B9=9F=E5=BF=85=E9=A1=BB?= =?UTF-8?q?=E4=BC=A0=E9=80=92=E5=8E=BF=E5=8C=BB=E9=99=A2=E7=9A=84appid?= =?UTF-8?q?=E6=89=8D=E8=83=BD=E4=BD=BF=E7=94=A8=EF=BC=8C=E5=90=A6=E5=88=99?= =?UTF-8?q?=E4=BC=9A=E6=8A=A5=E9=94=99=EF=BC=8C=E9=85=8D=E7=BD=AE=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E6=96=B0=E5=A2=9E=E5=8C=BB=E5=85=B1=E4=BD=93=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=E7=9A=84=E5=8F=AF=E4=BC=A0=E9=80=92appid=E9=80=89?= =?UTF-8?q?=E9=A1=B9=E3=80=82=E5=85=BC=E5=AE=B9=E6=97=A7=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E3=80=82=205=E3=80=81=E5=8C=BB=E5=85=B1=E4=BD=93=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=90=8C=E6=AD=A5=E6=96=B0=E5=A2=9E=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E5=88=A4=E6=96=AD=EF=BC=8C=E7=AD=BE=E5=90=8D?= =?UTF-8?q?=E5=9C=A810=E5=88=86=E9=92=9F=E5=90=8E=E5=A4=B1=E6=95=88?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/ynxbd/common/TestA.java | 4 + .../ynxbd/common/action/HealthCodeAction.java | 1 - .../ynxbd/common/action/PatientAction.java | 12 +- .../java/com/ynxbd/common/bean/Doctor.java | 2 + .../common/bean/ai/AIDoctorSchedule.java | 46 ++++++ .../com/ynxbd/common/bean/ai/AIPatient.java | 25 +++ .../com/ynxbd/common/bean/ai/AISchedule.java | 24 +++ .../ynxbd/common/config/HealthCardConfig.java | 15 +- .../java/com/ynxbd/common/dao/PatientDao.java | 2 +- .../ynxbd/common/dao/his/HisRegisterDao.java | 3 + .../ynxbd/common/helper/HealthCardHelper.java | 2 - .../common/helper/common/DateHelper.java | 52 ++++-- .../common/helper/common/IDNumberHelper.java | 6 +- .../common/service/AIGuidanceService.java | 149 ++++++++++++++++-- .../ynxbd/common/service/DoctorService.java | 17 +- .../com/ynxbd/common/service/GMCService.java | 4 +- .../ynxbd/common/service/HCodeService.java | 47 ++++++ .../ynxbd/common/service/PatientService.java | 16 +- .../com/ynxbd/common/service/RegService.java | 44 +++--- src/main/resources/ai-guidance.properties | 2 +- src/main/resources/hcode.properties | 10 +- 21 files changed, 397 insertions(+), 86 deletions(-) create mode 100644 src/main/java/com/ynxbd/common/bean/ai/AIDoctorSchedule.java create mode 100644 src/main/java/com/ynxbd/common/bean/ai/AIPatient.java create mode 100644 src/main/java/com/ynxbd/common/bean/ai/AISchedule.java diff --git a/src/main/java/com/ynxbd/common/TestA.java b/src/main/java/com/ynxbd/common/TestA.java index 4a4256f..c94182f 100644 --- a/src/main/java/com/ynxbd/common/TestA.java +++ b/src/main/java/com/ynxbd/common/TestA.java @@ -6,10 +6,13 @@ import com.ynxbd.common.bean.Doctor; import com.ynxbd.common.bean.Patient; import com.ynxbd.common.bean.enums.MerchantEnum; import com.ynxbd.common.dao.PatientDao; +import com.ynxbd.common.helper.common.DateHelper; import com.ynxbd.common.helper.common.HMACHelper; import com.ynxbd.common.helper.common.JsonHelper; import com.ynxbd.common.result.JsonResult; import com.ynxbd.common.result.JsonResultEnum; +import com.ynxbd.common.result.Result; +import com.ynxbd.common.result.ResultEnum; import com.ynxbd.common.service.DoctorService; import com.ynxbd.wx.wxfactory.AesWxHelper; @@ -82,4 +85,5 @@ public class TestA { // // System.out.println(AesWxHelper.decode("A25BF2DD5820B151B8AB2E333E05565E")); // } + } diff --git a/src/main/java/com/ynxbd/common/action/HealthCodeAction.java b/src/main/java/com/ynxbd/common/action/HealthCodeAction.java index cb2e4ba..e9e76ae 100644 --- a/src/main/java/com/ynxbd/common/action/HealthCodeAction.java +++ b/src/main/java/com/ynxbd/common/action/HealthCodeAction.java @@ -8,7 +8,6 @@ import com.ynxbd.common.bean.enums.HCardTypeEnum; import com.ynxbd.common.bean.enums.HealthCardRespCodeEnum; import com.ynxbd.common.config.HealthCardConfig; import com.ynxbd.common.config.interceptor.AesDecode; -import com.ynxbd.common.dao.PatientDao; import com.ynxbd.common.helper.HealthCardHelper; import com.ynxbd.common.helper.common.DateHelper; import com.ynxbd.common.helper.common.IDNumberHelper; diff --git a/src/main/java/com/ynxbd/common/action/PatientAction.java b/src/main/java/com/ynxbd/common/action/PatientAction.java index 3be35c9..b6dddf7 100644 --- a/src/main/java/com/ynxbd/common/action/PatientAction.java +++ b/src/main/java/com/ynxbd/common/action/PatientAction.java @@ -388,11 +388,17 @@ public class PatientAction extends BaseAction { * [患者]查询列表 */ @Action("getGmcPatientList") - public Result getGmcPatientList(@AesDecode String gmcOpenId, @AesDecode String hospAppId) { - log.info("[患者]查询列表 hospAppId={}, gmcOpenId={}", hospAppId, gmcOpenId); - if (gmcOpenId == null || hospAppId == null) { + public Result getGmcPatientList(@AesDecode String gmcOpenId, @AesDecode String hospAppId, @AesDecode String signTime) { + log.info("[患者]查询列表 hospAppId={}, gmcOpenId={}, signTime={}", hospAppId, gmcOpenId, signTime); + if (gmcOpenId == null || hospAppId == null || signTime == null) { return Result.error(ResultEnum.PARAM_IS_DEFECT); } + String begTime = DateHelper.getMoveMinute(-5); + String endTime = DateHelper.getMoveMinute(5); + if (!DateHelper.inDateRange(begTime, endTime, signTime, DateHelper.DateEnum.yyyy_MM_dd_HH_mm_ss)) { // 10分钟内 + return Result.error(ResultEnum.PARAM_IS_INVALID); + } + if (!hospAppId.equals(WeChatConfig.APP_ID)) { return Result.error(ResultEnum.PARAM_IS_INVALID); } diff --git a/src/main/java/com/ynxbd/common/bean/Doctor.java b/src/main/java/com/ynxbd/common/bean/Doctor.java index 9564844..16b8272 100644 --- a/src/main/java/com/ynxbd/common/bean/Doctor.java +++ b/src/main/java/com/ynxbd/common/bean/Doctor.java @@ -43,6 +43,8 @@ public class Doctor implements Serializable { private String headImg; // 地址 private String address; + // 性别编码 { 0:未知;1:男;2:女 } + private String genderCode; // 是否是专家 private Integer isExpert; // 备注 diff --git a/src/main/java/com/ynxbd/common/bean/ai/AIDoctorSchedule.java b/src/main/java/com/ynxbd/common/bean/ai/AIDoctorSchedule.java new file mode 100644 index 0000000..72c60ca --- /dev/null +++ b/src/main/java/com/ynxbd/common/bean/ai/AIDoctorSchedule.java @@ -0,0 +1,46 @@ +package com.ynxbd.common.bean.ai; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +import java.util.List; + +@Setter +@Getter +@ToString +@NoArgsConstructor +public class AIDoctorSchedule { + // 医生唯一id,不允许为空 + private String docId; + + // 医生姓名,不允许为空 + private String name; + + // 医生所在主院Id,不允许为空 + private String hosId; + + // 医生所在分院Id,允许为空 + private String branchId; + + // 医生科室id,不允许为空 + private String departmentId; + + // 科室名,不允许为空 + private String deptName; + + // 医生职称,允许为空 + private String doctorLevel; + + // 擅长描述,允许为空 + private String description; + + // 头像http地址,允许为空 Y + private String iconURL; + + // 挂号页面地址,不允许为空 (点击推荐医生前往挂号页面,无法提供时需给出跳转挂号页面方案) + private String url; + + private List schedule; +} diff --git a/src/main/java/com/ynxbd/common/bean/ai/AIPatient.java b/src/main/java/com/ynxbd/common/bean/ai/AIPatient.java new file mode 100644 index 0000000..d0016b5 --- /dev/null +++ b/src/main/java/com/ynxbd/common/bean/ai/AIPatient.java @@ -0,0 +1,25 @@ +package com.ynxbd.common.bean.ai; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +@Setter +@Getter +@ToString +@NoArgsConstructor +public class AIPatient { + // 就诊人姓名 + private String name; + // 就诊人性别 + private String gender; + // 就诊人生日[yyyy-mm-dd] + private String birthday; + // 就诊人卡号 + private String ecardNo; + // 家庭关系(可为空) + private String relation; + // 最近一次绑卡时间(可为空) + private String lastBindTime; +} diff --git a/src/main/java/com/ynxbd/common/bean/ai/AISchedule.java b/src/main/java/com/ynxbd/common/bean/ai/AISchedule.java new file mode 100644 index 0000000..c6bd932 --- /dev/null +++ b/src/main/java/com/ynxbd/common/bean/ai/AISchedule.java @@ -0,0 +1,24 @@ +package com.ynxbd.common.bean.ai; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +@Setter +@Getter +@ToString +@NoArgsConstructor +public class AISchedule { + // 排班时间,不允许为空 + private String date; + + // 挂号类型,允许为空;可选值:普通、专家;若全部为同一级别统一返回"普通" + private String type; + + // 某天可挂号总数,不允许为空 + private Integer total; + + // 某天剩余挂号个数,不允许为空 + private Integer available; +} diff --git a/src/main/java/com/ynxbd/common/config/HealthCardConfig.java b/src/main/java/com/ynxbd/common/config/HealthCardConfig.java index fd51b42..e20cb32 100644 --- a/src/main/java/com/ynxbd/common/config/HealthCardConfig.java +++ b/src/main/java/com/ynxbd/common/config/HealthCardConfig.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.tencent.healthcard.impl.HealthCardServerImpl; import com.tencent.healthcard.model.CommonIn; import com.ynxbd.common.helper.ProperHelper; +import com.ynxbd.common.helper.common.CodeHelper; import com.ynxbd.common.helper.common.ErrorHelper; import com.ynxbd.common.helper.common.JsonHelper; import com.ynxbd.wx.config.WeChatConfig; @@ -40,6 +41,7 @@ public class HealthCardConfig { public static final String H_HOSPITAL_ID; // 医院ID(每家医院不一样) public static final String H_MINI_HOSPITAL_ID; // 小程序-医院ID(每家医院不一样) public static final String H_MINI_APP_ID; // 小程序-appid + public static final String H_AUTH_APP_ID; // 仅用于授权的公众号appid(医共体为主体公众号的appid) // 万达 public static final String CARD_URL; public static final String CARD_APP_ID; @@ -73,6 +75,7 @@ public class HealthCardConfig { log.info("[电子健康卡]医院id缺失"); } H_MINI_APP_ID = config.getString("h.mini_app_id"); + H_AUTH_APP_ID = config.getString("h.auth_app_id"); H_MINI_HOSPITAL_ID = config.getString("h.mini_hospital_id"); initCache(); @@ -115,8 +118,16 @@ public class HealthCardConfig { 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(); - String appId = (isMiniApp ? H_MINI_APP_ID : WeChatConfig.APP_ID); - return new CommonIn(appToken, requestId, hospId, channelNum, appId, openid); + String appId; + if (isMiniApp) { + appId = H_MINI_APP_ID; + } else { + appId = ObjectUtils.isEmpty(H_AUTH_APP_ID) ? WeChatConfig.APP_ID : H_AUTH_APP_ID; + } + if (!IS_UPLOAD_DATA) { // 不上传数据[医院等级不够][H_AUTH_APP_ID is null = 旧版] + openid = ObjectUtils.isEmpty(H_AUTH_APP_ID) ? null : CodeHelper.get28UUID(); + } + return new CommonIn(appToken, requestId, hospId, channelNum, appId, openid); // 旧版电子健康卡openid可以为空 } /** diff --git a/src/main/java/com/ynxbd/common/dao/PatientDao.java b/src/main/java/com/ynxbd/common/dao/PatientDao.java index 5854a9c..18ca13d 100644 --- a/src/main/java/com/ynxbd/common/dao/PatientDao.java +++ b/src/main/java/com/ynxbd/common/dao/PatientDao.java @@ -525,7 +525,7 @@ public class PatientDao { return false; } - int gmcBindState = WeChatConfig.IS_ENABLE_GMC && WeChatConfig.IS_GMC_SERVER ? 1 : 0; // 医共体主服务器直接标识为1,其他医院的服务器同步时为0,后续使用时同步 + int gmcBindState = WeChatConfig.IS_ENABLE_GMC ? 1 : 0; // 医共体主服务器直接标识为1,其他医院的服务器同步时为0,后续使用时同步 String sql = "update patientBase set gmcCheckTime=now(), gmcBindState=?, empiId=? where id=?"; return DataBase.update(sql, ps -> { ps.setInt(1, gmcBindState); diff --git a/src/main/java/com/ynxbd/common/dao/his/HisRegisterDao.java b/src/main/java/com/ynxbd/common/dao/his/HisRegisterDao.java index 3bdc544..68f5668 100644 --- a/src/main/java/com/ynxbd/common/dao/his/HisRegisterDao.java +++ b/src/main/java/com/ynxbd/common/dao/his/HisRegisterDao.java @@ -73,6 +73,7 @@ public class HisRegisterDao { doctorItem.setTitleCode(node.getString("TitleCode")); // doctorItem.setIsExpert(node.getInteger("IsExpertRegistion")); // 是否是专家 doctorItem.setDescription(node.getString("Spec")); // 特长 + doctorItem.setGenderCode(ParamHelper.spaceFormat(node.getString("Gender"))); // 性别 // 号源 regItem = new Register(); @@ -254,6 +255,7 @@ public class HisRegisterDao { doctorItem.setTitleCode(node.getString("TitleCode")); // doctorItem.setIsExpert(node.getInteger("IsExpertRegistion")); // 是否是专家 doctorItem.setDescription(node.getString("Spec")); // 特长 + doctorItem.setGenderCode(ParamHelper.spaceFormat(node.getString("Gender"))); // 性别 // 号源 regItem = new Register(); regItem.setClinicCode(node.getString("ClinicCode")); // @@ -851,6 +853,7 @@ public class HisRegisterDao { doctorItem.setDeptName(deptName); doctorItem.setDoctCode(ParamHelper.spaceFormat(doctorJson.getString("DoctCode"))); doctorItem.setDoctName(ParamHelper.spaceFormat(doctorJson.getString("DoctName"))); + doctorItem.setGenderCode(ParamHelper.spaceFormat(doctorJson.getString("Gender"))); // 性别 // doctorItem.setTitle(ParamHelper.spaceFormat(doctorJson.getString("Title"))); // 职称 doctorItem.setTitleCode(ParamHelper.spaceFormat(doctorJson.getString("TitleCode"))); // 职称编码 diff --git a/src/main/java/com/ynxbd/common/helper/HealthCardHelper.java b/src/main/java/com/ynxbd/common/helper/HealthCardHelper.java index 5cf94fe..aac1690 100644 --- a/src/main/java/com/ynxbd/common/helper/HealthCardHelper.java +++ b/src/main/java/com/ynxbd/common/helper/HealthCardHelper.java @@ -69,8 +69,6 @@ public class HealthCardHelper { : (webURL + "health-card-form.html?authCode=${authCode}" + (ObjectUtils.isEmpty(enHisPatientId) ? "" : "&enHisPatientId=" + enHisPatientId)); } - System.out.println("[userFormPageUrl]=" + userFormPageUrl); - // 小程序内嵌必传(固定为小程序路径,不需要加“mini:”前缀)示例: /path/to/facePage String faceUrl = isMiniApp ? "/path/to/facePage" : null; // 放弃验证回调页 diff --git a/src/main/java/com/ynxbd/common/helper/common/DateHelper.java b/src/main/java/com/ynxbd/common/helper/common/DateHelper.java index de2c34c..a95d797 100644 --- a/src/main/java/com/ynxbd/common/helper/common/DateHelper.java +++ b/src/main/java/com/ynxbd/common/helper/common/DateHelper.java @@ -42,7 +42,6 @@ public class DateHelper { } - public static String DateTimeToString(Date date) { if (date == null || "".equals(date.toString())) { return ""; @@ -254,7 +253,7 @@ public class DateHelper { */ public static Boolean isDateTimeOver(String dateTime, String time) { try { - if (time == null || "".equals(time) || dateTime == null || "".equals(dateTime)) { + if (ObjectUtils.isEmpty(time) || ObjectUtils.isEmpty(dateTime)) { return null; } @@ -279,7 +278,7 @@ public class DateHelper { */ public static Boolean isTodayMoveDateOverDate(String date, int moveDays) { try { - if (date == null || "".equals(date)) { + if (ObjectUtils.isEmpty(date)) { return null; } SimpleDateFormat format = new SimpleDateFormat(DateEnum.yyyy_MM_dd.TYPE); @@ -474,7 +473,6 @@ public class DateHelper { } - /** * 得到一个时间延后或前移几天的时间 * @@ -541,23 +539,15 @@ public class DateHelper { /** - * 得到一个时间延后或前移几天的时间 + * 获得按[指定时间]平移[moveMinute]分钟得时间 * - * @param date 指定日期 - * @param moveDays 移动天数 - * @return String 日期 + * @param moveMinute 移动分钟(可为负数) + * @return 日期 */ - public static String getMoveDate(Date date, int moveDays) { - try { - SimpleDateFormat format = new SimpleDateFormat(DateEnum.yyyy_MM_dd.TYPE); - return getMoveDate(format.format(date), moveDays); - } catch (Exception e) { - e.printStackTrace(); - return null; - } + public static String getMoveMinute(long moveMinute) { + return getMoveMinute(DateHelper.getCurDateTime(), moveMinute); } - /** * 获得按[指定时间]平移[moveMinute]分钟得时间 * @@ -582,6 +572,34 @@ public class DateHelper { } } + + /** + * 得到一个时间延后或前移几天的时间 + * + * @param date 指定日期 + * @param moveDays 移动天数 + * @return String 日期 + */ + public static String getMoveDate(Date date, int moveDays) { + try { + SimpleDateFormat format = new SimpleDateFormat(DateEnum.yyyy_MM_dd.TYPE); + return getMoveDate(format.format(date), moveDays); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 当前日期移动x天 + * + * @param moveDays 移动天数 + * @return String 日期 + */ + public static String getMoveDate(int moveDays) { + return getMoveDate(DateHelper.getCurDate(), moveDays); + } + /** * 得到一个时间延后或前移几天的时间 * diff --git a/src/main/java/com/ynxbd/common/helper/common/IDNumberHelper.java b/src/main/java/com/ynxbd/common/helper/common/IDNumberHelper.java index a530add..1212513 100644 --- a/src/main/java/com/ynxbd/common/helper/common/IDNumberHelper.java +++ b/src/main/java/com/ynxbd/common/helper/common/IDNumberHelper.java @@ -4,6 +4,7 @@ import com.baidu.aip.ocr.AipOcr; import com.ynxbd.common.bean.Patient; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; + import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; @@ -56,7 +57,6 @@ public class IDNumberHelper { } - /** * 根据身份证号获取年龄 * @@ -99,7 +99,9 @@ public class IDNumberHelper { * @return 出生日期 yyyy-mm-dd */ public static String getBirthday(String idNumber) { - if (isValid(idNumber)) return null; + if (isValid(idNumber)) { + return null; + } String y, m, d; if (idNumber.length() == 18) { //18位身份证号 diff --git a/src/main/java/com/ynxbd/common/service/AIGuidanceService.java b/src/main/java/com/ynxbd/common/service/AIGuidanceService.java index 6c33398..b14cb58 100644 --- a/src/main/java/com/ynxbd/common/service/AIGuidanceService.java +++ b/src/main/java/com/ynxbd/common/service/AIGuidanceService.java @@ -2,11 +2,16 @@ package com.ynxbd.common.service; import com.ynxbd.common.bean.Dept; import com.ynxbd.common.bean.Doctor; +import com.ynxbd.common.bean.Patient; import com.ynxbd.common.bean.ai.AIDept; import com.ynxbd.common.bean.ai.AIDoctor; +import com.ynxbd.common.bean.ai.AIDoctorSchedule; +import com.ynxbd.common.bean.ai.AIPatient; 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.IDNumberHelper; +import com.ynxbd.common.helper.common.JsonHelper; import com.ynxbd.common.helper.common.URLHelper; import com.ynxbd.common.result.Result; import com.ynxbd.common.result.ResultEnum; @@ -54,7 +59,7 @@ public class AIGuidanceService { map.put("location", ""); // 经纬度,逗号分割 map.put("miniAppId", ""); // 经纬度,逗号分割 - map.put("isHTML", false); // 经纬度,逗号分割 + map.put("isHTML", false); // 介绍信息是否为HTML 文档 resultList.add(map); return Result.success(ResultEnum.AI_SUCCESS, resultList); @@ -132,7 +137,7 @@ public class AIGuidanceService { item.setParentDeptId(isSubDept ? dept.getDeptCode() : ""); item.setFeatureFlag(0); // 是否特色科室 item.setTreatrange(""); // 诊疗范围 - item.setIsHTML(true); + item.setIsHTML(true); // 介绍信息是否为HTML 文档 item.setDeptMiniWxUrl(""); item.setDeptMiniAlipayUrl(""); @@ -169,15 +174,17 @@ public class AIGuidanceService { return Result.success(ResultEnum.AI_SUCCESS, new ArrayList<>()); } + HisRegisterDao hisRegisterDao = new HisRegisterDao(); + List doctorList; if (AIGuidanceConfig.IS_SPLIT_TIME_REG) { // 分时段 String curDate = DateHelper.getCurDate(); - doctorList = new HisRegisterDao().queryHisTimeRegDoctorList(deptId, branchId, curDate, DateHelper.getMoveDate(curDate, 7)); + doctorList = hisRegisterDao.queryHisTimeRegDoctorList(deptId, branchId, curDate, DateHelper.getMoveDate(curDate, 7)); } else { - HisRegisterDao hisRegisterDao = new HisRegisterDao(); - doctorList = hisRegisterDao.queryHisResRegDoctorList(deptId, null); - List todayDoctorList = hisRegisterDao.queryHisRegTodayDoctorList(deptId, null); - for (Doctor doctor : todayDoctorList) { + // 注意:需先查询今日挂号 + doctorList = hisRegisterDao.queryHisRegTodayDoctorList(deptId, null); // 今日挂号 + List resDoctorList = hisRegisterDao.queryHisResRegDoctorList(deptId, null); // 预约挂号 + for (Doctor doctor : resDoctorList) { Doctor findItem = doctorList.stream().filter(o -> o.getDoctCode().equals(doctor.getDoctCode())).findFirst().orElse(null); if (findItem == null) { doctorList.add(doctor); @@ -197,7 +204,7 @@ public class AIGuidanceService { doctorList = new DoctorService().doctorListFilter(doctorList); RegisterDao registerDao = new RegisterDao(); - List wxDeptList = registerDao.selectDeptList(); + List dbDeptList = registerDao.selectDeptList(); String domain = WeChatConfig.getDomain(true); String deptName, deptCode, headImg, doctCode; @@ -212,10 +219,14 @@ public class AIGuidanceService { doctCode = doctCode.trim(); if ("*".equals(doctCode)) { // 任意医生 item.setDoctorId("0"); - item.setDoctorSex(-1); doctCode = "0"; + item.setDoctorSex(1); } else { - item.setDoctorSex(-1); + int doctorSex = 1; + if ("2".equals(doctor.getGenderCode())) { + doctorSex = 2; + } + item.setDoctorSex(doctorSex); } deptCode = doctor.getDeptCode(); @@ -238,7 +249,7 @@ public class AIGuidanceService { item.setDoctorLifeAlipayUrl(""); item.setDoctorEmbedAlipayUrl(""); - dept = registerDao.deptFilter(wxDeptList, deptCode, deptName, null, null); + dept = registerDao.deptFilter(dbDeptList, deptCode, deptName, null, null); if (!ObjectUtils.isEmpty(dept.getDeptAlias())) { deptName = dept.getDeptAlias(); } @@ -259,11 +270,123 @@ public class AIGuidanceService { item.setDoctorUrl(webReqURL + "reg-reserve.html#/reg-doctor" + URLHelper.mapParamsToUrl(map, true)); } } catch (Exception e) { - log.error(e.getMessage()); - item.setDoctorUrl(""); + log.error("[智能导诊]医生链接异常:{}", e.getMessage()); + continue; } resultList.add(item); } return resultList; } + + /** + * 4.1.5 查询就诊人列表 + * + * @param patientId 患者id + * @return map + */ + public Result getPatientCardList(String patientId, String hosId, String branchId) { + List cardList = new ArrayList<>(); + Map resp = new HashMap<>(); + resp.put("hospitalId", AIGuidanceConfig.HOS_ID); + resp.put("cardList", cardList); + + if (!hosId.equals(AIGuidanceConfig.HOS_ID)) { // 医院id校验 + log.warn("[智能导诊]查询就诊人列表-hosId不匹配"); + return Result.success(ResultEnum.AI_SUCCESS, resp); + } + + Patient patient = new PatientService().queryOnePatientByPatientId(patientId); + if (patient == null) { + return Result.success(ResultEnum.AI_SUCCESS, resp); + } + + String birthday = patient.getBirthday(); + String idCardNo = patient.getIdCardNo(); + if ((ObjectUtils.isEmpty(birthday) || birthday.length() != 10) && !ObjectUtils.isEmpty(idCardNo)) { + birthday = IDNumberHelper.getBirthday(idCardNo); + } + if (birthday == null) { + return Result.success(ResultEnum.AI_SUCCESS, resp); + } + + AIPatient item = new AIPatient(); + item.setName(patient.getName()); + item.setGender("女".equals(patient.getSex()) ? "女" : "男"); // 防空->默认男 + item.setEcardNo(patientId); + item.setBirthday(birthday); + cardList.add(item); + + resp.put("cardList", cardList); + return Result.success(ResultEnum.AI_SUCCESS, resp); + } + + + /** + * 4.1.9 获取医生号源排班信息(必选) + * + */ + public Result getDoctorSchedule(String hosId, String branchId, String doctorsJson) { + List doctors = new ArrayList<>(); + + if (ObjectUtils.isEmpty(doctors)) { + return Result.success(ResultEnum.AI_SUCCESS, doctors); + } + List doctorScheduleList = JsonHelper.parseArray(doctorsJson, AIDoctorSchedule.class); + if (doctorScheduleList.isEmpty()) { + return Result.success(ResultEnum.AI_SUCCESS, doctors); + } + + List regDoctorList = new ArrayList<>(); + List hisDoctorList; + HisRegisterDao hisRegisterDao = new HisRegisterDao(); + for (AIDoctorSchedule aiDoctorSchedule : doctorScheduleList) { + String departmentId = aiDoctorSchedule.getDepartmentId(); + if (ObjectUtils.isEmpty(departmentId)) { + continue; + } + + if (AIGuidanceConfig.IS_SPLIT_TIME_REG) { // 分时段 + String curDate = DateHelper.getCurDate(); + hisDoctorList = hisRegisterDao.queryHisTimeRegDoctorList(departmentId, branchId, curDate, DateHelper.getMoveDate(curDate, 7)); + } else { + hisDoctorList = hisRegisterDao.queryHisRegTodayDoctorList(departmentId, null); + List resDoctorList = hisRegisterDao.queryHisResRegDoctorList(departmentId, null); + for (Doctor doctor : resDoctorList) { + Doctor findItem = hisDoctorList.stream().filter(o -> o.getDoctCode().equals(doctor.getDoctCode())).findFirst().orElse(null); + if (findItem == null) { + hisDoctorList.add(doctor); + } + } + } + regDoctorList.addAll(hisDoctorList); + } + + regDoctorList = new DoctorService().doctorListFilter(regDoctorList); + + String domain = WeChatConfig.getDomain(true); + + AIDoctorSchedule item; + String headImg; + for (Doctor doctor : regDoctorList) { + item = new AIDoctorSchedule(); + item.setDocId(doctor.getDoctCode()); + item.setName(doctor.getDoctName()); + item.setHosId(AIGuidanceConfig.HOS_ID); + item.setDepartmentId(doctor.getDeptCode()); + item.setDoctorLevel(""); + item.setDescription(ObjectUtils.isEmpty(doctor.getDescription()) ? "暂无介绍" : doctor.getDescription()); + headImg = doctor.getHeadImg(); + if (headImg != null && !ObjectUtils.isEmpty(headImg.trim())) { + if (!headImg.contains("data:image/")) { // 不是base64 + item.setIconURL(domain + headImg); // 头像 + } + } + + item.setUrl(""); // 挂号链接 + +// item.sets + doctors.add(item); + } + return Result.success(ResultEnum.AI_SUCCESS, doctors); + } } diff --git a/src/main/java/com/ynxbd/common/service/DoctorService.java b/src/main/java/com/ynxbd/common/service/DoctorService.java index 2c0fd51..b74024a 100644 --- a/src/main/java/com/ynxbd/common/service/DoctorService.java +++ b/src/main/java/com/ynxbd/common/service/DoctorService.java @@ -24,7 +24,7 @@ public class DoctorService { List resultList = new ArrayList<>(); String title; // 职称 - Doctor dbDoctor; // 数据库中的医生 + Doctor findDBDoctor; // 数据库中的医生 Boolean isDisabled; List dbDocList = registerDao.selectDocListByCodes(doctorList); for (Doctor doctorItem : doctorList) { @@ -34,16 +34,19 @@ public class DoctorService { } doctCode = doctCode.trim(); if (!"*".equals(doctCode)) { // 任意医生 - dbDoctor = dbDocList.stream().filter(o -> o.getDoctCode().equals(doctorItem.getDoctCode())).findFirst().orElse(null); - if (dbDoctor != null) { - isDisabled = dbDoctor.getIsDisabled(); + findDBDoctor = dbDocList.stream().filter(o -> o.getDoctCode().equals(doctorItem.getDoctCode())).findFirst().orElse(null); + if (findDBDoctor != null) { + isDisabled = findDBDoctor.getIsDisabled(); if ((isDisabled != null && isDisabled)) { // 禁用 | 移除 continue; } - doctorItem.setHeadImg(dbDoctor.getHeadImg()); - doctorItem.setPym(dbDoctor.getPym()); - doctorStateFilter(dbDoctor, doctorItem); + doctorItem.setHeadImg(findDBDoctor.getHeadImg()); + doctorItem.setPym(findDBDoctor.getPym()); + if (ObjectUtils.isEmpty(doctorItem.getGenderCode())) { // 性别 + doctorItem.setGenderCode(findDBDoctor.getGenderCode()); + } + doctorStateFilter(findDBDoctor, doctorItem); } } diff --git a/src/main/java/com/ynxbd/common/service/GMCService.java b/src/main/java/com/ynxbd/common/service/GMCService.java index 2ca7519..ee3204e 100644 --- a/src/main/java/com/ynxbd/common/service/GMCService.java +++ b/src/main/java/com/ynxbd/common/service/GMCService.java @@ -8,6 +8,7 @@ import com.ynxbd.common.cache.GmcCacheManager; import com.ynxbd.common.dao.GMCUserDao; import com.ynxbd.common.dao.PatientDao; import com.ynxbd.common.dao.his.HisPatientDao; +import com.ynxbd.common.helper.common.DateHelper; import com.ynxbd.common.helper.common.JsonHelper; import com.ynxbd.common.helper.common.LocalDateHelper; import com.ynxbd.common.helper.http.OkHttpHelper; @@ -49,6 +50,7 @@ public class GMCService { JsonResult jsonResult = postFormGMC(request, "/patient/getGmcPatientList", params -> { params.put("gmcOpenId", enGmcOpenId); params.put("hospAppId", AesWxHelper.encode(WeChatConfig.GMC_APP_ID)); + params.put("signTime", AesWxHelper.encode(DateHelper.getCurDateTime())); }, null); if (!jsonResult.success()) { String message = jsonResult.getMessage(); @@ -312,7 +314,7 @@ public class GMCService { patient.setEnGmcOpenId(enGmcOpenId); // 主体医院openid patient.setEnOpenId(enOpenId); // 本院openid - patient.setGmcUniqueId(gmcUniqueId); + patient.setGmcUniqueId(gmcUniqueId); // 主体医院唯一id patient.setEnEmpiId(enEmpiId); patient.setEmpiId(empiId); return patient; diff --git a/src/main/java/com/ynxbd/common/service/HCodeService.java b/src/main/java/com/ynxbd/common/service/HCodeService.java index d5620c6..8e24cbb 100644 --- a/src/main/java/com/ynxbd/common/service/HCodeService.java +++ b/src/main/java/com/ynxbd/common/service/HCodeService.java @@ -202,4 +202,51 @@ public class HCodeService { } return rspItems; } + + + +// /** +// * 健康卡授权码获取健康卡信息 +// * +// * @param healthCode 健康卡授权码 +// */ +// public static Patient getHealthCardByHealthCode(Boolean isMiniApp, String healthCode) { +// try { +// CommonIn commonIn = HealthCardConfig.createCommonIn(isMiniApp); +// if (commonIn == null) { +// return null; +// } +// JSONObject resultJson = HealthCardConfig.createHealthCardService().getHealthCardByHealthCode(commonIn, healthCode); +// HealthCardConfig.HCardResult result = new HealthCardConfig.HCardResult(resultJson); +// JSONObject respJson = result.getRsp(); +// if (!result.isOk || respJson == null) { +// log.info("[电子健康卡]健康卡授权码获取健康卡信息-失败: {}", resultJson); +// return null; +// } +// JSONObject card = respJson.getJSONObject("card"); +// if (card == null) { +// log.info("[电子健康卡]健康卡授权码获取健康卡信息-Json解析失败"); +// return null; +// } +// +// Patient patient = new Patient(); +// String phone1 = card.getString("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")); +// log.info("[电子健康卡]健康卡授权码获取健康卡信息: {}", JsonHelper.toJsonString(patient)); +// return patient; +// } catch (Exception e) { +// ErrorHelper.println(e); +// } +// return null; +// } } diff --git a/src/main/java/com/ynxbd/common/service/PatientService.java b/src/main/java/com/ynxbd/common/service/PatientService.java index dd3e668..a85a8c6 100644 --- a/src/main/java/com/ynxbd/common/service/PatientService.java +++ b/src/main/java/com/ynxbd/common/service/PatientService.java @@ -223,11 +223,6 @@ public class PatientService { } } - if (WeChatConfig.IS_ENABLE_GMC) { // 是医共体主服务器 - bindInfo.setGmcUniqueId(CodeHelper.get32UUID()); - } - - log.info("[患者]身份绑定: {}", JsonHelper.toJsonString(bindInfo)); String name = bindInfo.getName(); String idCardNo = bindInfo.getIdCardNo(); String healthCardId = bindInfo.getHealthCardId(); @@ -266,11 +261,14 @@ public class PatientService { bindInfo.setPatientId(hisPatientId); bindInfo.setHisTransNo(hisTransNo); + if (WeChatConfig.IS_ENABLE_GMC) { // 是医共体 + bindInfo.setGmcUniqueId(CodeHelper.get32UUID()); + } + try { List dbPatients = patientDao.selectByOpenIdAndCardNo(openid, idCardNo); if (dbPatients.isEmpty()) { // 数据库没有-->添加 log.info("[用户身份绑定]添加 name={}, patientId={}, empiId={}", name, hisPatientId, empiId); - bindInfo.setGmcBindState(1); if (bindInfo.getEnUnionId() != null) { bindInfo.setUnionId(AesWxHelper.decode(bindInfo.getEnUnionId())); } @@ -618,6 +616,12 @@ public class PatientService { } + public Patient queryOnePatientByPatientId(String patientId) { + List patients = new PatientDao().selectListByPatientId(patientId); + return patients.isEmpty() ? null : patients.get(0); + } + + // /** // * [维护]替换患者id为医共体id // * diff --git a/src/main/java/com/ynxbd/common/service/RegService.java b/src/main/java/com/ynxbd/common/service/RegService.java index 6553882..27f55f3 100644 --- a/src/main/java/com/ynxbd/common/service/RegService.java +++ b/src/main/java/com/ynxbd/common/service/RegService.java @@ -16,6 +16,7 @@ import com.ynxbd.common.dao.RegisterDao; import com.ynxbd.common.dao.his.HisAccountDao; import com.ynxbd.common.dao.his.HisRegisterDao; import com.ynxbd.common.helper.common.DateHelper; +import com.ynxbd.common.helper.common.JsonHelper; import com.ynxbd.common.helper.his.HisHelper; import com.ynxbd.common.result.JsonResult; import com.ynxbd.common.result.Result; @@ -1081,9 +1082,9 @@ public class RegService { String sourceInfo = "今日有号"; String childDeptCode; - Dept findDept, newChild; + Dept findDept; List children; - List todayChildren, resChildren; + List todayChildren; for (Dept todayItem : todayDeptList) { todayItem.setSourceInfo(sourceInfo); @@ -1098,47 +1099,38 @@ public class RegService { } else { findDept.setSourceInfo(sourceInfo); - resChildren = findDept.getChildren(); + children = findDept.getChildren(); todayChildren = todayItem.getChildren(); - if (resChildren == null) { - resChildren = new ArrayList<>(); + if (children == null) { + children = new ArrayList<>(); } if (todayChildren == null) { todayChildren = new ArrayList<>(); } - if (resChildren.isEmpty() && todayChildren.isEmpty()) { + if (children.isEmpty() && todayChildren.isEmpty()) { continue; } - children = findDept.getChildren(); - if (children == null) { - children = new ArrayList<>(); - } Map childMap = new HashMap<>(); - if (!todayChildren.isEmpty()) { - for (Dept child : todayChildren) { + if (!children.isEmpty()) { + for (Dept child : children) { childDeptCode = child.getDeptCode(); - newChild = new Dept(); - newChild.setDeptCode(childDeptCode); - newChild.setDeptName(child.getDeptName()); - newChild.setDeptTypeCode(child.getDeptTypeCode()); - newChild.setSourceInfo(sourceInfo); // 今日有号 - children.add(newChild); - childMap.put(childDeptCode, child.getDeptName()); + if (!childMap.containsKey(childDeptCode)) { + childMap.put(childDeptCode, child.getDeptName()); + } } } - if (!resChildren.isEmpty()) { - for (Dept child : resChildren) { + if (!todayChildren.isEmpty()) { + for (Dept child : todayChildren) { childDeptCode = child.getDeptCode(); if (!childMap.containsKey(childDeptCode)) { - newChild = new Dept(); - newChild.setDeptCode(child.getDeptCode()); - newChild.setDeptName(child.getDeptName()); - newChild.setDeptTypeCode(child.getDeptTypeCode()); - children.add(newChild); + child.setSourceInfo(sourceInfo); // 今日有号 + children.add(child); childMap.put(childDeptCode, child.getDeptName()); + } else { + child.setSourceInfo(sourceInfo); // 今日有号 } } } diff --git a/src/main/resources/ai-guidance.properties b/src/main/resources/ai-guidance.properties index 5caf170..cf9b8df 100644 --- a/src/main/resources/ai-guidance.properties +++ b/src/main/resources/ai-guidance.properties @@ -1,7 +1,7 @@ # \u667A\u80FD\u5BFC\u8BCA\uFF08\u9700\u5546\u6237\u52A0https\u767D\u540D\u5355\uFF09 ai.is_enable=true # \u662F\u5426\u5F00\u542F\u8C03\u8BD5 -ai.is_debug=false +ai.is_debug=true # \u662F\u5426\u4E3A\u6D4B\u8BD5\u73AF\u5883 ai.is_dev=true # \u662F\u5426\u662F\u5206\u65F6\u6BB5\u6302\u53F7(\u9ED8\u8BA4true) diff --git a/src/main/resources/hcode.properties b/src/main/resources/hcode.properties index ff41232..3d7426d 100644 --- a/src/main/resources/hcode.properties +++ b/src/main/resources/hcode.properties @@ -1,6 +1,6 @@ # \u662F\u5426\u4F7F\u7528\u5065\u5EB7\u5361 is_enable=true -# \u662F\u5426\u4E0A\u4F20\u6570\u636E(\u7B49\u7EA7\u672A\u5230\u8FBE\u65F6\u914D\u7F6E\u4E3Afalse[36626]) +# \u662F\u5426\u4E0A\u4F20\u6570\u636E(\u7B49\u7EA7\u672A\u5230\u8FBE\u65F6\u914D\u7F6E\u4E3Afalse[32064]) h.is_upload_data=false # \u662F\u5426\u6253\u5370\u4E0A\u62A5\u6570\u636E\u65E5\u5FD7 h.is_log_report=false @@ -8,7 +8,7 @@ h.is_log_report=false h.app_id=e4a05c13301f2f6a8b07b3de872dfe2d h.app_secret=e5322dfd9bfab939851319812c30f9f1 # \u533B\u9662id -h.hospital_id=36626 +h.hospital_id=32064 #\u4E07\u8FBE\u5361\u7BA1\u5E73\u53F0\u8C03\u7528\u53C2\u6570 h.card_app_id=5a4a6eacbe1040d8a91c76608aefb943 h.card_public_key=mfkwewyhkozizj0caqyikozizj0daqcdqgaepc6p0omuruc5lq7cwdu18ca4cgmqbtjpwdyrglo4wbal9/m3dv4oywez7fbgtnkkgj/kfojvze6sc/dka+ddca== @@ -19,6 +19,8 @@ h.card_url=http://220.164.109.105:19211/internet # mini-app====================================== # \u5C0F\u7A0B\u5E8F\u533B\u9662id -h.mini_hospital_id=36626 +h.mini_hospital_id=32064 # \u5C0F\u7A0B\u5E8FappId -h.mini_app_id=wx80685a7daa772a0b \ No newline at end of file +h.mini_app_id=wx80685a7daa772a0b +# \u7528\u4E8E\u6388\u6743\u7684\u516C\u4F17\u53F7app_id[\u4E0D\u662F\u672C\u9662 & \u533B\u9662\u7B49\u7EA7\u4E0D\u591F & \u65B0\u7248\u7535\u5B50\u5065\u5EB7\u5361 & \u533B\u5171\u4F53]-[\u4F18\u5148\u7EA7\u5927\u4E8Ewx\u914D\u7F6E\u6587\u4EF6\u4E2D\u7684appId] +h.auth_app_id=wxe53f0f528bb16d9f \ No newline at end of file