1、患者数据新增时,医共体的状态没有进行是否为医共体的判断问题修复。

2、智能导诊需要性别返回,HIS接口新增性别返回,并处理。
3、非分时段挂号亚专科的合并判断存在问题,可能出现重复的情况问题修复
4、石林县医院电子健康卡在使用了新版后,子医院在使用时也必须传递县医院的appid才能使用,否则会报错,配置文件新增医共体模式的可传递appid选项。兼容旧版本。
5、医共体数据同步新增时间参数判断,签名在10分钟后失效。
debug
王绍全 2 days ago
parent 1147b5fe9b
commit 61652877f2
  1. 4
      src/main/java/com/ynxbd/common/TestA.java
  2. 1
      src/main/java/com/ynxbd/common/action/HealthCodeAction.java
  3. 12
      src/main/java/com/ynxbd/common/action/PatientAction.java
  4. 2
      src/main/java/com/ynxbd/common/bean/Doctor.java
  5. 46
      src/main/java/com/ynxbd/common/bean/ai/AIDoctorSchedule.java
  6. 25
      src/main/java/com/ynxbd/common/bean/ai/AIPatient.java
  7. 24
      src/main/java/com/ynxbd/common/bean/ai/AISchedule.java
  8. 15
      src/main/java/com/ynxbd/common/config/HealthCardConfig.java
  9. 2
      src/main/java/com/ynxbd/common/dao/PatientDao.java
  10. 3
      src/main/java/com/ynxbd/common/dao/his/HisRegisterDao.java
  11. 2
      src/main/java/com/ynxbd/common/helper/HealthCardHelper.java
  12. 52
      src/main/java/com/ynxbd/common/helper/common/DateHelper.java
  13. 6
      src/main/java/com/ynxbd/common/helper/common/IDNumberHelper.java
  14. 149
      src/main/java/com/ynxbd/common/service/AIGuidanceService.java
  15. 17
      src/main/java/com/ynxbd/common/service/DoctorService.java
  16. 4
      src/main/java/com/ynxbd/common/service/GMCService.java
  17. 47
      src/main/java/com/ynxbd/common/service/HCodeService.java
  18. 16
      src/main/java/com/ynxbd/common/service/PatientService.java
  19. 44
      src/main/java/com/ynxbd/common/service/RegService.java
  20. 2
      src/main/resources/ai-guidance.properties
  21. 8
      src/main/resources/hcode.properties

@ -6,10 +6,13 @@ import com.ynxbd.common.bean.Doctor;
import com.ynxbd.common.bean.Patient; import com.ynxbd.common.bean.Patient;
import com.ynxbd.common.bean.enums.MerchantEnum; import com.ynxbd.common.bean.enums.MerchantEnum;
import com.ynxbd.common.dao.PatientDao; 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.HMACHelper;
import com.ynxbd.common.helper.common.JsonHelper; import com.ynxbd.common.helper.common.JsonHelper;
import com.ynxbd.common.result.JsonResult; import com.ynxbd.common.result.JsonResult;
import com.ynxbd.common.result.JsonResultEnum; 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.common.service.DoctorService;
import com.ynxbd.wx.wxfactory.AesWxHelper; import com.ynxbd.wx.wxfactory.AesWxHelper;
@ -82,4 +85,5 @@ public class TestA {
// //
// System.out.println(AesWxHelper.decode("A25BF2DD5820B151B8AB2E333E05565E")); // System.out.println(AesWxHelper.decode("A25BF2DD5820B151B8AB2E333E05565E"));
// } // }
} }

@ -8,7 +8,6 @@ import com.ynxbd.common.bean.enums.HCardTypeEnum;
import com.ynxbd.common.bean.enums.HealthCardRespCodeEnum; import com.ynxbd.common.bean.enums.HealthCardRespCodeEnum;
import com.ynxbd.common.config.HealthCardConfig; import com.ynxbd.common.config.HealthCardConfig;
import com.ynxbd.common.config.interceptor.AesDecode; import com.ynxbd.common.config.interceptor.AesDecode;
import com.ynxbd.common.dao.PatientDao;
import com.ynxbd.common.helper.HealthCardHelper; import com.ynxbd.common.helper.HealthCardHelper;
import com.ynxbd.common.helper.common.DateHelper; import com.ynxbd.common.helper.common.DateHelper;
import com.ynxbd.common.helper.common.IDNumberHelper; import com.ynxbd.common.helper.common.IDNumberHelper;

@ -388,11 +388,17 @@ public class PatientAction extends BaseAction {
* [患者]查询列表 * [患者]查询列表
*/ */
@Action("getGmcPatientList") @Action("getGmcPatientList")
public Result getGmcPatientList(@AesDecode String gmcOpenId, @AesDecode String hospAppId) { public Result getGmcPatientList(@AesDecode String gmcOpenId, @AesDecode String hospAppId, @AesDecode String signTime) {
log.info("[患者]查询列表 hospAppId={}, gmcOpenId={}", hospAppId, gmcOpenId); log.info("[患者]查询列表 hospAppId={}, gmcOpenId={}, signTime={}", hospAppId, gmcOpenId, signTime);
if (gmcOpenId == null || hospAppId == null) { if (gmcOpenId == null || hospAppId == null || signTime == null) {
return Result.error(ResultEnum.PARAM_IS_DEFECT); 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)) { if (!hospAppId.equals(WeChatConfig.APP_ID)) {
return Result.error(ResultEnum.PARAM_IS_INVALID); return Result.error(ResultEnum.PARAM_IS_INVALID);
} }

@ -43,6 +43,8 @@ public class Doctor implements Serializable {
private String headImg; private String headImg;
// 地址 // 地址
private String address; private String address;
// 性别编码 { 0:未知;1:男;2:女 }
private String genderCode;
// 是否是专家 // 是否是专家
private Integer isExpert; private Integer isExpert;
// 备注 // 备注

@ -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<AISchedule> schedule;
}

@ -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;
}

@ -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;
}

@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject;
import com.tencent.healthcard.impl.HealthCardServerImpl; import com.tencent.healthcard.impl.HealthCardServerImpl;
import com.tencent.healthcard.model.CommonIn; import com.tencent.healthcard.model.CommonIn;
import com.ynxbd.common.helper.ProperHelper; 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.ErrorHelper;
import com.ynxbd.common.helper.common.JsonHelper; import com.ynxbd.common.helper.common.JsonHelper;
import com.ynxbd.wx.config.WeChatConfig; 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_HOSPITAL_ID; // 医院ID(每家医院不一样)
public static final String H_MINI_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_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_URL;
public static final String CARD_APP_ID; public static final String CARD_APP_ID;
@ -73,6 +75,7 @@ public class HealthCardConfig {
log.info("[电子健康卡]医院id缺失"); log.info("[电子健康卡]医院id缺失");
} }
H_MINI_APP_ID = config.getString("h.mini_app_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"); H_MINI_HOSPITAL_ID = config.getString("h.mini_hospital_id");
initCache(); initCache();
@ -115,8 +118,16 @@ public class HealthCardConfig {
int channelNum = (isMiniApp ? 1 : 0); // 填入代码,0为微信服务号渠道,1为微信小程序渠道,3为刷脸终端,4为扫码终端 int channelNum = (isMiniApp ? 1 : 0); // 填入代码,0为微信服务号渠道,1为微信小程序渠道,3为刷脸终端,4为扫码终端
String hospId = (isMiniApp ? H_MINI_HOSPITAL_ID : H_HOSPITAL_ID); String hospId = (isMiniApp ? H_MINI_HOSPITAL_ID : H_HOSPITAL_ID);
String requestId = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase(); String requestId = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
String appId = (isMiniApp ? H_MINI_APP_ID : WeChatConfig.APP_ID); String appId;
return new CommonIn(appToken, requestId, hospId, channelNum, appId, openid); 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可以为空
} }
/** /**

@ -525,7 +525,7 @@ public class PatientDao {
return false; 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=?"; String sql = "update patientBase set gmcCheckTime=now(), gmcBindState=?, empiId=? where id=?";
return DataBase.update(sql, ps -> { return DataBase.update(sql, ps -> {
ps.setInt(1, gmcBindState); ps.setInt(1, gmcBindState);

@ -73,6 +73,7 @@ public class HisRegisterDao {
doctorItem.setTitleCode(node.getString("TitleCode")); // doctorItem.setTitleCode(node.getString("TitleCode")); //
doctorItem.setIsExpert(node.getInteger("IsExpertRegistion")); // 是否是专家 doctorItem.setIsExpert(node.getInteger("IsExpertRegistion")); // 是否是专家
doctorItem.setDescription(node.getString("Spec")); // 特长 doctorItem.setDescription(node.getString("Spec")); // 特长
doctorItem.setGenderCode(ParamHelper.spaceFormat(node.getString("Gender"))); // 性别
// 号源 // 号源
regItem = new Register(); regItem = new Register();
@ -254,6 +255,7 @@ public class HisRegisterDao {
doctorItem.setTitleCode(node.getString("TitleCode")); // doctorItem.setTitleCode(node.getString("TitleCode")); //
doctorItem.setIsExpert(node.getInteger("IsExpertRegistion")); // 是否是专家 doctorItem.setIsExpert(node.getInteger("IsExpertRegistion")); // 是否是专家
doctorItem.setDescription(node.getString("Spec")); // 特长 doctorItem.setDescription(node.getString("Spec")); // 特长
doctorItem.setGenderCode(ParamHelper.spaceFormat(node.getString("Gender"))); // 性别
// 号源 // 号源
regItem = new Register(); regItem = new Register();
regItem.setClinicCode(node.getString("ClinicCode")); // regItem.setClinicCode(node.getString("ClinicCode")); //
@ -851,6 +853,7 @@ public class HisRegisterDao {
doctorItem.setDeptName(deptName); doctorItem.setDeptName(deptName);
doctorItem.setDoctCode(ParamHelper.spaceFormat(doctorJson.getString("DoctCode"))); doctorItem.setDoctCode(ParamHelper.spaceFormat(doctorJson.getString("DoctCode")));
doctorItem.setDoctName(ParamHelper.spaceFormat(doctorJson.getString("DoctName"))); doctorItem.setDoctName(ParamHelper.spaceFormat(doctorJson.getString("DoctName")));
doctorItem.setGenderCode(ParamHelper.spaceFormat(doctorJson.getString("Gender"))); // 性别
// //
doctorItem.setTitle(ParamHelper.spaceFormat(doctorJson.getString("Title"))); // 职称 doctorItem.setTitle(ParamHelper.spaceFormat(doctorJson.getString("Title"))); // 职称
doctorItem.setTitleCode(ParamHelper.spaceFormat(doctorJson.getString("TitleCode"))); // 职称编码 doctorItem.setTitleCode(ParamHelper.spaceFormat(doctorJson.getString("TitleCode"))); // 职称编码

@ -69,8 +69,6 @@ public class HealthCardHelper {
: (webURL + "health-card-form.html?authCode=${authCode}" + (ObjectUtils.isEmpty(enHisPatientId) ? "" : "&enHisPatientId=" + enHisPatientId)); : (webURL + "health-card-form.html?authCode=${authCode}" + (ObjectUtils.isEmpty(enHisPatientId) ? "" : "&enHisPatientId=" + enHisPatientId));
} }
System.out.println("[userFormPageUrl]=" + userFormPageUrl);
// 小程序内嵌必传(固定为小程序路径,不需要加“mini:”前缀)示例: /path/to/facePage // 小程序内嵌必传(固定为小程序路径,不需要加“mini:”前缀)示例: /path/to/facePage
String faceUrl = isMiniApp ? "/path/to/facePage" : null; String faceUrl = isMiniApp ? "/path/to/facePage" : null;
// 放弃验证回调页 // 放弃验证回调页

@ -42,7 +42,6 @@ public class DateHelper {
} }
public static String DateTimeToString(Date date) { public static String DateTimeToString(Date date) {
if (date == null || "".equals(date.toString())) { if (date == null || "".equals(date.toString())) {
return ""; return "";
@ -254,7 +253,7 @@ public class DateHelper {
*/ */
public static Boolean isDateTimeOver(String dateTime, String time) { public static Boolean isDateTimeOver(String dateTime, String time) {
try { try {
if (time == null || "".equals(time) || dateTime == null || "".equals(dateTime)) { if (ObjectUtils.isEmpty(time) || ObjectUtils.isEmpty(dateTime)) {
return null; return null;
} }
@ -279,7 +278,7 @@ public class DateHelper {
*/ */
public static Boolean isTodayMoveDateOverDate(String date, int moveDays) { public static Boolean isTodayMoveDateOverDate(String date, int moveDays) {
try { try {
if (date == null || "".equals(date)) { if (ObjectUtils.isEmpty(date)) {
return null; return null;
} }
SimpleDateFormat format = new SimpleDateFormat(DateEnum.yyyy_MM_dd.TYPE); 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 moveMinute 移动分钟可为负数
* @param moveDays 移动天数 * @return 日期
* @return String 日期
*/ */
public static String getMoveDate(Date date, int moveDays) { public static String getMoveMinute(long moveMinute) {
try { return getMoveMinute(DateHelper.getCurDateTime(), moveMinute);
SimpleDateFormat format = new SimpleDateFormat(DateEnum.yyyy_MM_dd.TYPE);
return getMoveDate(format.format(date), moveDays);
} catch (Exception e) {
e.printStackTrace();
return null;
}
} }
/** /**
* 获得按[指定时间]平移[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);
}
/** /**
* 得到一个时间延后或前移几天的时间 * 得到一个时间延后或前移几天的时间
* *

@ -4,6 +4,7 @@ import com.baidu.aip.ocr.AipOcr;
import com.ynxbd.common.bean.Patient; import com.ynxbd.common.bean.Patient;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import java.text.ParseException; import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Date; import java.util.Date;
@ -56,7 +57,6 @@ public class IDNumberHelper {
} }
/** /**
* 根据身份证号获取年龄 * 根据身份证号获取年龄
* *
@ -99,7 +99,9 @@ public class IDNumberHelper {
* @return 出生日期 yyyy-mm-dd * @return 出生日期 yyyy-mm-dd
*/ */
public static String getBirthday(String idNumber) { public static String getBirthday(String idNumber) {
if (isValid(idNumber)) return null; if (isValid(idNumber)) {
return null;
}
String y, m, d; String y, m, d;
if (idNumber.length() == 18) { //18位身份证号 if (idNumber.length() == 18) { //18位身份证号

@ -2,11 +2,16 @@ package com.ynxbd.common.service;
import com.ynxbd.common.bean.Dept; import com.ynxbd.common.bean.Dept;
import com.ynxbd.common.bean.Doctor; 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.AIDept;
import com.ynxbd.common.bean.ai.AIDoctor; 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.RegisterDao;
import com.ynxbd.common.dao.his.HisRegisterDao; import com.ynxbd.common.dao.his.HisRegisterDao;
import com.ynxbd.common.helper.common.DateHelper; 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.helper.common.URLHelper;
import com.ynxbd.common.result.Result; import com.ynxbd.common.result.Result;
import com.ynxbd.common.result.ResultEnum; import com.ynxbd.common.result.ResultEnum;
@ -54,7 +59,7 @@ public class AIGuidanceService {
map.put("location", ""); // 经纬度,逗号分割 map.put("location", ""); // 经纬度,逗号分割
map.put("miniAppId", ""); // 经纬度,逗号分割 map.put("miniAppId", ""); // 经纬度,逗号分割
map.put("isHTML", false); // 经纬度,逗号分割 map.put("isHTML", false); // 介绍信息是否为HTML 文档
resultList.add(map); resultList.add(map);
return Result.success(ResultEnum.AI_SUCCESS, resultList); return Result.success(ResultEnum.AI_SUCCESS, resultList);
@ -132,7 +137,7 @@ public class AIGuidanceService {
item.setParentDeptId(isSubDept ? dept.getDeptCode() : ""); item.setParentDeptId(isSubDept ? dept.getDeptCode() : "");
item.setFeatureFlag(0); // 是否特色科室 item.setFeatureFlag(0); // 是否特色科室
item.setTreatrange(""); // 诊疗范围 item.setTreatrange(""); // 诊疗范围
item.setIsHTML(true); item.setIsHTML(true); // 介绍信息是否为HTML 文档
item.setDeptMiniWxUrl(""); item.setDeptMiniWxUrl("");
item.setDeptMiniAlipayUrl(""); item.setDeptMiniAlipayUrl("");
@ -169,15 +174,17 @@ public class AIGuidanceService {
return Result.success(ResultEnum.AI_SUCCESS, new ArrayList<>()); return Result.success(ResultEnum.AI_SUCCESS, new ArrayList<>());
} }
HisRegisterDao hisRegisterDao = new HisRegisterDao();
List<Doctor> doctorList; List<Doctor> doctorList;
if (AIGuidanceConfig.IS_SPLIT_TIME_REG) { // 分时段 if (AIGuidanceConfig.IS_SPLIT_TIME_REG) { // 分时段
String curDate = DateHelper.getCurDate(); 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 { } else {
HisRegisterDao hisRegisterDao = new HisRegisterDao(); // 注意:需先查询今日挂号
doctorList = hisRegisterDao.queryHisResRegDoctorList(deptId, null); doctorList = hisRegisterDao.queryHisRegTodayDoctorList(deptId, null); // 今日挂号
List<Doctor> todayDoctorList = hisRegisterDao.queryHisRegTodayDoctorList(deptId, null); List<Doctor> resDoctorList = hisRegisterDao.queryHisResRegDoctorList(deptId, null); // 预约挂号
for (Doctor doctor : todayDoctorList) { for (Doctor doctor : resDoctorList) {
Doctor findItem = doctorList.stream().filter(o -> o.getDoctCode().equals(doctor.getDoctCode())).findFirst().orElse(null); Doctor findItem = doctorList.stream().filter(o -> o.getDoctCode().equals(doctor.getDoctCode())).findFirst().orElse(null);
if (findItem == null) { if (findItem == null) {
doctorList.add(doctor); doctorList.add(doctor);
@ -197,7 +204,7 @@ public class AIGuidanceService {
doctorList = new DoctorService().doctorListFilter(doctorList); doctorList = new DoctorService().doctorListFilter(doctorList);
RegisterDao registerDao = new RegisterDao(); RegisterDao registerDao = new RegisterDao();
List<Dept> wxDeptList = registerDao.selectDeptList(); List<Dept> dbDeptList = registerDao.selectDeptList();
String domain = WeChatConfig.getDomain(true); String domain = WeChatConfig.getDomain(true);
String deptName, deptCode, headImg, doctCode; String deptName, deptCode, headImg, doctCode;
@ -212,10 +219,14 @@ public class AIGuidanceService {
doctCode = doctCode.trim(); doctCode = doctCode.trim();
if ("*".equals(doctCode)) { // 任意医生 if ("*".equals(doctCode)) { // 任意医生
item.setDoctorId("0"); item.setDoctorId("0");
item.setDoctorSex(-1);
doctCode = "0"; doctCode = "0";
item.setDoctorSex(1);
} else { } else {
item.setDoctorSex(-1); int doctorSex = 1;
if ("2".equals(doctor.getGenderCode())) {
doctorSex = 2;
}
item.setDoctorSex(doctorSex);
} }
deptCode = doctor.getDeptCode(); deptCode = doctor.getDeptCode();
@ -238,7 +249,7 @@ public class AIGuidanceService {
item.setDoctorLifeAlipayUrl(""); item.setDoctorLifeAlipayUrl("");
item.setDoctorEmbedAlipayUrl(""); item.setDoctorEmbedAlipayUrl("");
dept = registerDao.deptFilter(wxDeptList, deptCode, deptName, null, null); dept = registerDao.deptFilter(dbDeptList, deptCode, deptName, null, null);
if (!ObjectUtils.isEmpty(dept.getDeptAlias())) { if (!ObjectUtils.isEmpty(dept.getDeptAlias())) {
deptName = dept.getDeptAlias(); deptName = dept.getDeptAlias();
} }
@ -259,11 +270,123 @@ public class AIGuidanceService {
item.setDoctorUrl(webReqURL + "reg-reserve.html#/reg-doctor" + URLHelper.mapParamsToUrl(map, true)); item.setDoctorUrl(webReqURL + "reg-reserve.html#/reg-doctor" + URLHelper.mapParamsToUrl(map, true));
} }
} catch (Exception e) { } catch (Exception e) {
log.error(e.getMessage()); log.error("[智能导诊]医生链接异常:{}", e.getMessage());
item.setDoctorUrl(""); continue;
} }
resultList.add(item); resultList.add(item);
} }
return resultList; return resultList;
} }
/**
* 4.1.5 查询就诊人列表
*
* @param patientId 患者id
* @return map
*/
public Result getPatientCardList(String patientId, String hosId, String branchId) {
List<AIPatient> cardList = new ArrayList<>();
Map<String, Object> 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<AIDoctorSchedule> doctors = new ArrayList<>();
if (ObjectUtils.isEmpty(doctors)) {
return Result.success(ResultEnum.AI_SUCCESS, doctors);
}
List<AIDoctorSchedule> doctorScheduleList = JsonHelper.parseArray(doctorsJson, AIDoctorSchedule.class);
if (doctorScheduleList.isEmpty()) {
return Result.success(ResultEnum.AI_SUCCESS, doctors);
}
List<Doctor> regDoctorList = new ArrayList<>();
List<Doctor> 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<Doctor> 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);
}
} }

@ -24,7 +24,7 @@ public class DoctorService {
List<Doctor> resultList = new ArrayList<>(); List<Doctor> resultList = new ArrayList<>();
String title; // 职称 String title; // 职称
Doctor dbDoctor; // 数据库中的医生 Doctor findDBDoctor; // 数据库中的医生
Boolean isDisabled; Boolean isDisabled;
List<Doctor> dbDocList = registerDao.selectDocListByCodes(doctorList); List<Doctor> dbDocList = registerDao.selectDocListByCodes(doctorList);
for (Doctor doctorItem : doctorList) { for (Doctor doctorItem : doctorList) {
@ -34,16 +34,19 @@ public class DoctorService {
} }
doctCode = doctCode.trim(); doctCode = doctCode.trim();
if (!"*".equals(doctCode)) { // 任意医生 if (!"*".equals(doctCode)) { // 任意医生
dbDoctor = dbDocList.stream().filter(o -> o.getDoctCode().equals(doctorItem.getDoctCode())).findFirst().orElse(null); findDBDoctor = dbDocList.stream().filter(o -> o.getDoctCode().equals(doctorItem.getDoctCode())).findFirst().orElse(null);
if (dbDoctor != null) { if (findDBDoctor != null) {
isDisabled = dbDoctor.getIsDisabled(); isDisabled = findDBDoctor.getIsDisabled();
if ((isDisabled != null && isDisabled)) { // 禁用 | 移除 if ((isDisabled != null && isDisabled)) { // 禁用 | 移除
continue; continue;
} }
doctorItem.setHeadImg(dbDoctor.getHeadImg()); doctorItem.setHeadImg(findDBDoctor.getHeadImg());
doctorItem.setPym(dbDoctor.getPym()); doctorItem.setPym(findDBDoctor.getPym());
doctorStateFilter(dbDoctor, doctorItem); if (ObjectUtils.isEmpty(doctorItem.getGenderCode())) { // 性别
doctorItem.setGenderCode(findDBDoctor.getGenderCode());
}
doctorStateFilter(findDBDoctor, doctorItem);
} }
} }

@ -8,6 +8,7 @@ import com.ynxbd.common.cache.GmcCacheManager;
import com.ynxbd.common.dao.GMCUserDao; import com.ynxbd.common.dao.GMCUserDao;
import com.ynxbd.common.dao.PatientDao; import com.ynxbd.common.dao.PatientDao;
import com.ynxbd.common.dao.his.HisPatientDao; 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.JsonHelper;
import com.ynxbd.common.helper.common.LocalDateHelper; import com.ynxbd.common.helper.common.LocalDateHelper;
import com.ynxbd.common.helper.http.OkHttpHelper; import com.ynxbd.common.helper.http.OkHttpHelper;
@ -49,6 +50,7 @@ public class GMCService {
JsonResult jsonResult = postFormGMC(request, "/patient/getGmcPatientList", params -> { JsonResult jsonResult = postFormGMC(request, "/patient/getGmcPatientList", params -> {
params.put("gmcOpenId", enGmcOpenId); params.put("gmcOpenId", enGmcOpenId);
params.put("hospAppId", AesWxHelper.encode(WeChatConfig.GMC_APP_ID)); params.put("hospAppId", AesWxHelper.encode(WeChatConfig.GMC_APP_ID));
params.put("signTime", AesWxHelper.encode(DateHelper.getCurDateTime()));
}, null); }, null);
if (!jsonResult.success()) { if (!jsonResult.success()) {
String message = jsonResult.getMessage(); String message = jsonResult.getMessage();
@ -312,7 +314,7 @@ public class GMCService {
patient.setEnGmcOpenId(enGmcOpenId); // 主体医院openid patient.setEnGmcOpenId(enGmcOpenId); // 主体医院openid
patient.setEnOpenId(enOpenId); // 本院openid patient.setEnOpenId(enOpenId); // 本院openid
patient.setGmcUniqueId(gmcUniqueId); patient.setGmcUniqueId(gmcUniqueId); // 主体医院唯一id
patient.setEnEmpiId(enEmpiId); patient.setEnEmpiId(enEmpiId);
patient.setEmpiId(empiId); patient.setEmpiId(empiId);
return patient; return patient;

@ -202,4 +202,51 @@ public class HCodeService {
} }
return rspItems; 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;
// }
} }

@ -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 name = bindInfo.getName();
String idCardNo = bindInfo.getIdCardNo(); String idCardNo = bindInfo.getIdCardNo();
String healthCardId = bindInfo.getHealthCardId(); String healthCardId = bindInfo.getHealthCardId();
@ -266,11 +261,14 @@ public class PatientService {
bindInfo.setPatientId(hisPatientId); bindInfo.setPatientId(hisPatientId);
bindInfo.setHisTransNo(hisTransNo); bindInfo.setHisTransNo(hisTransNo);
if (WeChatConfig.IS_ENABLE_GMC) { // 是医共体
bindInfo.setGmcUniqueId(CodeHelper.get32UUID());
}
try { try {
List<Patient> dbPatients = patientDao.selectByOpenIdAndCardNo(openid, idCardNo); List<Patient> dbPatients = patientDao.selectByOpenIdAndCardNo(openid, idCardNo);
if (dbPatients.isEmpty()) { // 数据库没有-->添加 if (dbPatients.isEmpty()) { // 数据库没有-->添加
log.info("[用户身份绑定]添加 name={}, patientId={}, empiId={}", name, hisPatientId, empiId); log.info("[用户身份绑定]添加 name={}, patientId={}, empiId={}", name, hisPatientId, empiId);
bindInfo.setGmcBindState(1);
if (bindInfo.getEnUnionId() != null) { if (bindInfo.getEnUnionId() != null) {
bindInfo.setUnionId(AesWxHelper.decode(bindInfo.getEnUnionId())); bindInfo.setUnionId(AesWxHelper.decode(bindInfo.getEnUnionId()));
} }
@ -618,6 +616,12 @@ public class PatientService {
} }
public Patient queryOnePatientByPatientId(String patientId) {
List<Patient> patients = new PatientDao().selectListByPatientId(patientId);
return patients.isEmpty() ? null : patients.get(0);
}
// /** // /**
// * [维护]替换患者id为医共体id // * [维护]替换患者id为医共体id
// * // *

@ -16,6 +16,7 @@ import com.ynxbd.common.dao.RegisterDao;
import com.ynxbd.common.dao.his.HisAccountDao; import com.ynxbd.common.dao.his.HisAccountDao;
import com.ynxbd.common.dao.his.HisRegisterDao; import com.ynxbd.common.dao.his.HisRegisterDao;
import com.ynxbd.common.helper.common.DateHelper; 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.helper.his.HisHelper;
import com.ynxbd.common.result.JsonResult; import com.ynxbd.common.result.JsonResult;
import com.ynxbd.common.result.Result; import com.ynxbd.common.result.Result;
@ -1081,9 +1082,9 @@ public class RegService {
String sourceInfo = "今日有号"; String sourceInfo = "今日有号";
String childDeptCode; String childDeptCode;
Dept findDept, newChild; Dept findDept;
List<Dept> children; List<Dept> children;
List<Dept> todayChildren, resChildren; List<Dept> todayChildren;
for (Dept todayItem : todayDeptList) { for (Dept todayItem : todayDeptList) {
todayItem.setSourceInfo(sourceInfo); todayItem.setSourceInfo(sourceInfo);
@ -1098,47 +1099,38 @@ public class RegService {
} else { } else {
findDept.setSourceInfo(sourceInfo); findDept.setSourceInfo(sourceInfo);
resChildren = findDept.getChildren(); children = findDept.getChildren();
todayChildren = todayItem.getChildren(); todayChildren = todayItem.getChildren();
if (resChildren == null) { if (children == null) {
resChildren = new ArrayList<>(); children = new ArrayList<>();
} }
if (todayChildren == null) { if (todayChildren == null) {
todayChildren = new ArrayList<>(); todayChildren = new ArrayList<>();
} }
if (resChildren.isEmpty() && todayChildren.isEmpty()) { if (children.isEmpty() && todayChildren.isEmpty()) {
continue; continue;
} }
children = findDept.getChildren();
if (children == null) {
children = new ArrayList<>();
}
Map<String, String> childMap = new HashMap<>(); Map<String, String> childMap = new HashMap<>();
if (!todayChildren.isEmpty()) { if (!children.isEmpty()) {
for (Dept child : todayChildren) { for (Dept child : children) {
childDeptCode = child.getDeptCode(); childDeptCode = child.getDeptCode();
newChild = new Dept(); if (!childMap.containsKey(childDeptCode)) {
newChild.setDeptCode(childDeptCode); childMap.put(childDeptCode, child.getDeptName());
newChild.setDeptName(child.getDeptName()); }
newChild.setDeptTypeCode(child.getDeptTypeCode());
newChild.setSourceInfo(sourceInfo); // 今日有号
children.add(newChild);
childMap.put(childDeptCode, child.getDeptName());
} }
} }
if (!resChildren.isEmpty()) { if (!todayChildren.isEmpty()) {
for (Dept child : resChildren) { for (Dept child : todayChildren) {
childDeptCode = child.getDeptCode(); childDeptCode = child.getDeptCode();
if (!childMap.containsKey(childDeptCode)) { if (!childMap.containsKey(childDeptCode)) {
newChild = new Dept(); child.setSourceInfo(sourceInfo); // 今日有号
newChild.setDeptCode(child.getDeptCode()); children.add(child);
newChild.setDeptName(child.getDeptName());
newChild.setDeptTypeCode(child.getDeptTypeCode());
children.add(newChild);
childMap.put(childDeptCode, child.getDeptName()); childMap.put(childDeptCode, child.getDeptName());
} else {
child.setSourceInfo(sourceInfo); // 今日有号
} }
} }
} }

@ -1,7 +1,7 @@
# \u667A\u80FD\u5BFC\u8BCA\uFF08\u9700\u5546\u6237\u52A0https\u767D\u540D\u5355\uFF09 # \u667A\u80FD\u5BFC\u8BCA\uFF08\u9700\u5546\u6237\u52A0https\u767D\u540D\u5355\uFF09
ai.is_enable=true ai.is_enable=true
# \u662F\u5426\u5F00\u542F\u8C03\u8BD5 # \u662F\u5426\u5F00\u542F\u8C03\u8BD5
ai.is_debug=false ai.is_debug=true
# \u662F\u5426\u4E3A\u6D4B\u8BD5\u73AF\u5883 # \u662F\u5426\u4E3A\u6D4B\u8BD5\u73AF\u5883
ai.is_dev=true ai.is_dev=true
# \u662F\u5426\u662F\u5206\u65F6\u6BB5\u6302\u53F7(\u9ED8\u8BA4true) # \u662F\u5426\u662F\u5206\u65F6\u6BB5\u6302\u53F7(\u9ED8\u8BA4true)

@ -1,6 +1,6 @@
# \u662F\u5426\u4F7F\u7528\u5065\u5EB7\u5361 # \u662F\u5426\u4F7F\u7528\u5065\u5EB7\u5361
is_enable=true 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 h.is_upload_data=false
# \u662F\u5426\u6253\u5370\u4E0A\u62A5\u6570\u636E\u65E5\u5FD7 # \u662F\u5426\u6253\u5370\u4E0A\u62A5\u6570\u636E\u65E5\u5FD7
h.is_log_report=false h.is_log_report=false
@ -8,7 +8,7 @@ h.is_log_report=false
h.app_id=e4a05c13301f2f6a8b07b3de872dfe2d h.app_id=e4a05c13301f2f6a8b07b3de872dfe2d
h.app_secret=e5322dfd9bfab939851319812c30f9f1 h.app_secret=e5322dfd9bfab939851319812c30f9f1
# \u533B\u9662id # \u533B\u9662id
h.hospital_id=36626 h.hospital_id=32064
#\u4E07\u8FBE\u5361\u7BA1\u5E73\u53F0\u8C03\u7528\u53C2\u6570 #\u4E07\u8FBE\u5361\u7BA1\u5E73\u53F0\u8C03\u7528\u53C2\u6570
h.card_app_id=5a4a6eacbe1040d8a91c76608aefb943 h.card_app_id=5a4a6eacbe1040d8a91c76608aefb943
h.card_public_key=mfkwewyhkozizj0caqyikozizj0daqcdqgaepc6p0omuruc5lq7cwdu18ca4cgmqbtjpwdyrglo4wbal9/m3dv4oywez7fbgtnkkgj/kfojvze6sc/dka+ddca== 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====================================== # mini-app======================================
# \u5C0F\u7A0B\u5E8F\u533B\u9662id # \u5C0F\u7A0B\u5E8F\u533B\u9662id
h.mini_hospital_id=36626 h.mini_hospital_id=32064
# \u5C0F\u7A0B\u5E8FappId # \u5C0F\u7A0B\u5E8FappId
h.mini_app_id=wx80685a7daa772a0b 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
Loading…
Cancel
Save