package com.ynxbd.common.dao.his; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.ynxbd.common.bean.Dept; import com.ynxbd.common.bean.Doctor; import com.ynxbd.common.bean.RegSign; import com.ynxbd.common.bean.enums.MerchantEnum; import com.ynxbd.common.bean.pay.Register; import com.ynxbd.common.dao.RegisterDao; import com.ynxbd.common.helper.common.*; import com.ynxbd.common.his.HisEnum; import com.ynxbd.common.his.HisFactory; import com.ynxbd.common.result.JsonResult; import com.ynxbd.wx.config.WeChatConfig; import com.ynxbd.wx.wxfactory.AesWxHelper; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ObjectUtils; import java.math.BigDecimal; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * HIS挂号调用 * * @Author wsq * @Date 2020/10/30 11:59 * @Copyright @ 2020 云南新八达科技有限公司 All rights reserved. */ @Slf4j public class HisRegisterDao { /** * [预约挂号]查询HIS预约挂号医生 * * @param deptCode 科室代码 * @return 医生列表 */ public List queryHisResRegDoctorList(String deptCode, String regDate) { Map params = new HashMap<>(); params.put("DeptCode", deptCode); params.put("DoctCode", ""); // 空为所有 params.put("ReservationDate", ObjectUtils.isEmpty(regDate) ? "" : regDate); // 空为近7天 params.put("AllowResevationFlag", "1"); // [0:默认值可不传——所有;1:只返回有剩余号源的医师] JsonResult jsonResult = HisFactory.His().getJsonResult(HisEnum.AP_Query_Reservation_Doct, params); if (!jsonResult.success()) { return new ArrayList<>(); } List doctorList = new ArrayList<>(); String deptName = jsonResult.getDataMapString("DeptName"); JSONArray jsonArray = jsonResult.getJsonArray("Doctor"); Doctor doctorItem; JSONObject node; Register regItem; String doctRegDate; BigDecimal regFee, clinicFee, payMoney; for (int i = 0; i < jsonArray.size(); i++) { node = jsonArray.getJSONObject(i); doctorItem = new Doctor(); doctorItem.setDeptCode(deptCode); doctorItem.setDeptName(deptName); doctRegDate = ParamHelper.spaceFormat(node.getString("ReservationDate")); doctorItem.setDoctCode(node.getString("DoctCode")); doctorItem.setDoctName(node.getString("DoctName")); doctorItem.setTitle(node.getString("Title")); // 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")); // regItem.setClinicName(node.getString("ClinicName")); // regItem.setTid(node.getString("TID")); // regItem.setTName(node.getString("TID")); // regItem.setSourceCount(node.getInteger("TotalCount")); // 总号源数量 regItem.setRemainCount(node.getInteger("RemainCount")); // 剩余号源数 regItem.setAllowReg(node.getInteger("AllowRegist")); // regItem.setRegDate(doctRegDate); regItem.setAddress(node.getString("Address")); // 金额 regFee = node.getBigDecimal("RegFee"); clinicFee = node.getBigDecimal("ClinicFee"); if (regFee == null) { regFee = BigDecimal.ZERO; } if (clinicFee == null) { clinicFee = BigDecimal.ZERO; } regItem.setRegFee(regFee); regItem.setClinicFee(clinicFee); // 金额 payMoney = regFee.add(clinicFee); regItem.setTotalFee(payMoney); regItem.setPayMoney(payMoney); regItem.setEnPayMoney(AesWxHelper.encode(payMoney)); doctorItem.setRegister(regItem); doctorItem.setRegDate(doctRegDate); doctorList.add(doctorItem); } return doctorList; } /** * [预约挂号]查询有号状态 * * @param deptCode 科室代码 * @return 预约的号源状态 */ public Map queryHisRegSourceState(String deptCode, String subDeptCode, Boolean isTimeInterval, String timeInterval) { if (isTimeInterval == null) { isTimeInterval = true; } List doctorList = queryHisResRegDoctorList(deptCode, null); Map sourceStateMap = new HashMap<>(); String regDate; Register regInfo; for (Doctor doctor : doctorList) { regDate = doctor.getRegDate(); if (ObjectUtils.isEmpty(regDate)) { continue; } regInfo = doctor.getRegister(); if (regInfo == null) { continue; } if (!sourceStateMap.containsKey(regDate) && (regInfo.hasSourceCount() || regInfo.hasRemainCount())) { // 不存在挂号日期 && (无限号 || 剩余号源>0) sourceStateMap.put(regDate, 1); } } List todayDoctorList = isTimeInterval ? queryHisTodayRegDoctorList(deptCode, subDeptCode, timeInterval) : queryHisRegTodayDoctorList(deptCode, subDeptCode); if (!todayDoctorList.isEmpty()) { // 今日挂号 String curDate = DateHelper.getCurDate(); for (Doctor doctor : todayDoctorList) { regInfo = doctor.getRegister(); if (regInfo == null) { continue; } if (!sourceStateMap.containsKey(curDate) && (regInfo.hasSourceCount() || regInfo.hasRemainCount())) { // 不存在挂号日期 && (无限号 || 剩余号源>0) sourceStateMap.put(curDate, 1); break; } } } return sourceStateMap; } /** * [预约挂号]查询有号状态 * * @param deptCode 科室代码 * @return 预约的号源状态 */ public Map queryHisTimeRegSourceState(String deptCode, String subDeptCode, String begDate, String endDate) { List doctorList = queryHisTimeRegDoctorList(deptCode, subDeptCode, begDate, endDate); Map sourceStateMap = new HashMap<>(); String regDate; Integer surplusSources; for (Doctor doctor : doctorList) { regDate = doctor.getRegDate(); if (ObjectUtils.isEmpty(regDate)) { continue; } surplusSources = doctor.getSurplusSources(); if (!sourceStateMap.containsKey(regDate) && surplusSources > 0) { sourceStateMap.put(regDate, 1); } } return sourceStateMap; } /** * [预约挂号]获取医生列表 * * @param deptCode 科室代码 * @return 医生列表 */ public List queryHisResRegDoctorListByRegDate(String deptCode, String regDate) { List resultList = new ArrayList<>(); if (regDate == null) { log.info("[预约挂号]获取医生列表失败 regDate 为空"); return resultList; } return queryHisResRegDoctorList(deptCode, regDate); // // String appId = WeChatConfig.APP_ID; // if (HospConfigEnum.富民县人民医院.WX_APP_ID.equals(appId)) { // 富民晚班不能预约 // Register register; // for (Doctor doctor : doctorList) { // register = doctor.getRegister(); // if (register != null) { // String tid = register.getTid(); // if (tid != null && !tid.trim().contains("晚班")) { // resultList.add(doctor); // } // } // } // } else { // resultList = doctorList; // } } /** * [今日挂号]查询今日挂号医生列表 * * @param deptCode 科室代码 * @return 医生列表 */ public List queryHisRegTodayDoctorList(String deptCode, String subDeptCode) { Map params = new HashMap<>(); params.put("DeptCode", deptCode); params.put("DoctCode", ""); params.put("AllowRegistFlag", "1"); // 只返回有号源的医生 JsonResult jsonResult = HisFactory.His().getJsonResult(HisEnum.AP_Query_Doct, params); if (!jsonResult.success()) { return new ArrayList<>(); } List doctorList = new ArrayList<>(); String deptName = jsonResult.getDataMapString("DeptName"); JSONArray jsonArray = jsonResult.getJsonArray("Doctor"); String tId; Doctor doctorItem; JSONObject node; Register regItem; BigDecimal regFee, clinicFee, payMoney; String today = DateHelper.getCurDate(); for (int i = 0; i < jsonArray.size(); i++) { node = jsonArray.getJSONObject(i); doctorItem = new Doctor(); doctorItem.setDeptCode(deptCode); doctorItem.setDeptName(deptName); tId = ParamHelper.spaceFormat(node.getString("TID")); doctorItem.setDoctCode(node.getString("DoctCode")); doctorItem.setDoctName(node.getString("DoctName")); doctorItem.setTitle(node.getString("Title")); // 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")); // regItem.setClinicName(node.getString("ClinicName")); // regItem.setTid(tId); // 时段id regItem.setTName(tId); // 时段名 regItem.setSourceCount(node.getInteger("TotalCount")); // 总号源数量 regItem.setRemainCount(node.getInteger("RemainCount")); // 剩余号源数 regItem.setAllowReg(node.getInteger("AllowReservation")); // regItem.setAddress(node.getString("Address")); regItem.setRegDate(today); // 今天 // 金额 regFee = node.getBigDecimal("RegFee"); clinicFee = node.getBigDecimal("ClinicFee"); if (regFee == null) { regFee = BigDecimal.ZERO; } if (clinicFee == null) { clinicFee = BigDecimal.ZERO; } regItem.setRegFee(regFee); regItem.setClinicFee(clinicFee); // 金额 payMoney = regFee.add(clinicFee); regItem.setTotalFee(payMoney); regItem.setPayMoney(payMoney); regItem.setEnPayMoney(AesWxHelper.encode(payMoney)); doctorItem.setRegister(regItem); doctorItem.setRegDate(today); doctorList.add(doctorItem); } return doctorList; } /** * [今日挂号]获取今日挂号医生列表 * * @param deptCode 科室代码 * @param timeInterval 挂号时段显示 * @return 医生列表 */ public List queryHisTodayRegDoctorList(String deptCode, String subDeptCode, String timeInterval) { List doctorList = queryHisRegTodayDoctorList(deptCode, subDeptCode); // 芒市 "08:00:00", "11:45:00" | "11:46:00", "14:31:00" | "14:30:00", "17:30:00" // 蒙自市 07:40:00", "11:30:00 | "11:31:00", "13:44:00" | "13:45:00", "17:30:00" List resultList = new ArrayList<>(); String defaultTimeInterval = "{\"am\":{\"begTime\":\"08:00\",\"endTime\":\"12:00\"},\"pm\":{\"begTime\":\"14:00\",\"endTime\":\"17:30\"},\"noon\":{\"begTime\":\"12:01\",\"endTime\":\"13:59\"}}"; if (ObjectUtils.isEmpty(timeInterval)) { timeInterval = defaultTimeInterval; } JSONObject jsonObj = JsonHelper.parseObject(timeInterval); if (jsonObj == null) { jsonObj = JsonHelper.parseObject(defaultTimeInterval); } JSONObject am = jsonObj.getJSONObject("am"); // 早上 JSONObject pm = jsonObj.getJSONObject("pm"); // 下午 JSONObject noon = jsonObj.getJSONObject("noon"); // 中午 JSONObject night = jsonObj.getJSONObject("night"); // 晚上 // 早上 if (am == null) { am = JsonHelper.parseObject("{ begTime: '08:00', endTime: '12:00' }"); } String amBegTime = DateHelper.timeToHms(am.getString("begTime"), "08:00:00"); String amEndTime = DateHelper.timeToHms(am.getString("endTime"), "12:00:00"); // 下午 if (pm == null) { pm = JsonHelper.parseObject("{ begTime: '14:01', endTime: '17:00' }"); } String pmBegTime = DateHelper.timeToHms(pm.getString("begTime"), "14:01:00"); String pmEndTime = DateHelper.timeToHms(pm.getString("endTime"), "17:30:00"); // 中午 if (noon == null) { noon = JsonHelper.parseObject("{ begTime: '12:01', endTime: '14:00' }"); } String noonBegTime = DateHelper.timeToHms(noon.getString("begTime"), "12:01:00"); String noonEndTime = DateHelper.timeToHms(noon.getString("endTime"), "14:00:00"); String nightBegTime = null; String nightEndTime = null; // 中午 if (night != null) { nightBegTime = DateHelper.timeToHms(night.getString("begTime"), null); nightEndTime = DateHelper.timeToHms(night.getString("endTime"), null); } int key; if (DateHelper.inTimeRangeH_m_s(amBegTime, amEndTime)) { // 上午 key = 1; } else if (DateHelper.inTimeRangeH_m_s(noonBegTime, noonEndTime)) { // 中午 key = 2; } else if (DateHelper.inTimeRangeH_m_s(pmBegTime, pmEndTime)) { // 下午 key = 3; } else { key = 4; } log.info("[挂号]时段参数【key[{}]】 早上:{}-{}, 下午:{}-{}, 中午:{}-{}", key, amBegTime, amEndTime, pmBegTime, pmEndTime, noonBegTime, noonEndTime); // 晚班 boolean isNight = night != null && nightBegTime != null && nightEndTime != null && DateHelper.inTimeRangeH_m_s(nightBegTime, nightEndTime); Register register; boolean hasNightTid; for (Doctor doctor : doctorList) { register = doctor.getRegister(); if (register == null) { continue; } String tid = register.getTid(); tid = tid == null ? "" : tid.trim(); hasNightTid = tid.contains("晚"); if (tid.contains("全天")) { resultList.add(doctor); } else if (key == 1 && (tid.contains("上午") || (isNight && hasNightTid))) { resultList.add(doctor); } else if (key == 2 && tid.contains("中午") || (isNight && hasNightTid)) { resultList.add(doctor); } else if (key == 3 && (tid.contains("下午") || (isNight && hasNightTid))) { resultList.add(doctor); } else if (key == 4 && hasNightTid) { if (night == null || nightBegTime == null || nightEndTime == null) { resultList.add(doctor); } else { if (DateHelper.inTimeRangeH_m_s(nightBegTime, nightEndTime)) { resultList.add(doctor); } } } } return resultList; } /** * [预约挂号]获取科室列表 * * @return 预约科室列表 */ public List getRegResDeptList() { log.info("[预约挂号]查询HIS科室列表"); List resultList = new ArrayList<>(); Map params = new HashMap<>(); params.put("DeptCode", ""); // 空为所有 params.put("ReservationDate", ""); // 空为近7天 JsonResult jsonResult = HisFactory.His().getJsonResult(HisEnum.AP_Query_Reservation_Dept, params); if (!jsonResult.success()) { return resultList; } List deptList = new ArrayList<>(); JSONArray jsonArray = jsonResult.getJsonArray("Dept"); RegisterDao registerDao = new RegisterDao(); List wxDeptList = registerDao.selectDeptList(); List subDeptList; String subDeptJson, subDeptName, subDeptCode, subDeptNote; String address, deptCode, deptName, hospitalAreaName; Dept dept, subDept; JSONObject nodeItem, subDeptItem, subDeptItemData; JSONArray dataItems; for (int i = 0; i < jsonArray.size(); i++) { nodeItem = jsonArray.getJSONObject(i); deptCode = nodeItem.getString("Code"); deptName = nodeItem.getString("Name"); address = nodeItem.getString("Address"); hospitalAreaName = nodeItem.getString("HospitalAreaName"); // 科室过滤 dept = registerDao.deptFilter(wxDeptList, deptCode, deptName, address, hospitalAreaName); if (dept != null) { subDeptJson = nodeItem.getString("Code_YZKStr"); if (!ObjectUtils.isEmpty(subDeptJson)) { subDeptItemData = JsonHelper.parseObject(subDeptJson); dataItems = subDeptItemData.getJSONArray("Data"); subDeptList = new ArrayList<>(); for (int j = 0; j < dataItems.size(); j++) { subDeptItem = dataItems.getJSONObject(j); subDeptName = subDeptItem.getString("Name"); subDeptCode = subDeptItem.getString("Code"); subDeptNote = subDeptItem.getString("Note"); subDept = new Dept(); subDept.setDeptName(subDeptName); subDept.setDeptCode(subDeptCode); if (!ObjectUtils.isEmpty(subDeptNote)) { subDept.setNote(subDeptNote); } // 预约挂号 subDeptList.add(subDept); } dept.setChildren(subDeptList); } deptList.add(dept); } } return deptList; } /** * [今日挂号]获取科室列表 * * @param hasSourcesFlag 有号源标识 { 1:仅返回有号源科室; 0:有无号源科室都返回} * @return 科室列表 */ public List getRegTodayDeptList(String hasSourcesFlag) { if (ObjectUtils.isEmpty(hasSourcesFlag)) { hasSourcesFlag = "1"; } else { if (!"0".equals(hasSourcesFlag) && !"1".equals(hasSourcesFlag)) { hasSourcesFlag = "1"; } } Map params = new HashMap<>(); params.put("DeptCode", ""); // 空为所有 params.put("HasSourcesFlag", hasSourcesFlag); // 1:仅返回有号源科室; 0:有无号源科室都返回 List deptList = new ArrayList<>(); JsonResult jsonResult = HisFactory.His().getJsonResult(HisEnum.AP_Query_Dept, params); if (!jsonResult.success()) { return deptList; } JSONArray jsonArray = jsonResult.getJsonArray("Dept"); RegisterDao registerDao = new RegisterDao(); List wxDeptList = registerDao.selectDeptList(); List subDeptList; String subDeptJson, subDeptName, subDeptCode, subDeptNote; String address, deptCode, deptName, hospitalAreaName; Dept dept, subDept; JSONObject nodeItem, subDeptItem, subDeptItemData; JSONArray dataItems; for (int i = 0; i < jsonArray.size(); i++) { nodeItem = jsonArray.getJSONObject(i); deptCode = nodeItem.getString("Code"); deptName = nodeItem.getString("Name"); address = nodeItem.getString("Address"); hospitalAreaName = nodeItem.getString("HospitalAreaName"); // 科室过滤 dept = registerDao.deptFilter(wxDeptList, deptCode, deptName, address, hospitalAreaName); if (dept != null) { subDeptJson = nodeItem.getString("Code_YZKStr"); if (!ObjectUtils.isEmpty(subDeptJson)) { subDeptItemData = JsonHelper.parseObject(subDeptJson); dataItems = subDeptItemData.getJSONArray("Data"); subDeptList = new ArrayList<>(); for (int j = 0; j < dataItems.size(); j++) { subDeptItem = dataItems.getJSONObject(j); subDeptName = subDeptItem.getString("Name"); subDeptCode = subDeptItem.getString("Code"); subDeptNote = subDeptItem.getString("Note"); subDept = new Dept(); subDept.setDeptName(subDeptName); subDept.setDeptCode(subDeptCode); if (!ObjectUtils.isEmpty(subDeptNote)) { subDept.setNote(subDeptNote); } // 今日挂号 subDeptList.add(subDept); } dept.setChildren(subDeptList); } deptList.add(dept); } } return deptList; } /** * [今日挂号]根据患者id获取挂号记录 * * @param patientId 患者id * @return 挂号记录 */ public List getHisRegHistoryRecords(String patientId, String regDate) { List resultList = new ArrayList<>(); Map params = new HashMap<>(); params.put("PatientID", patientId); params.put("MZNum", null); params.put("RegistDate", regDate); JsonResult result = HisFactory.His().getJsonResult(HisEnum.AP_Query_Regist, params); if (!result.success()) { return resultList; } JSONArray jsonArray = result.getJsonArray("Reg"); Register reg; BigDecimal payMoney; JSONObject node; for (int i = 0; i < jsonArray.size(); i++) { node = jsonArray.getJSONObject(i); reg = new Register(); reg.setDeptCode(node.getString("DeptCode")); // reg.setDeptName(node.getString("DeptName")); // reg.setDoctCode(node.getString("DoctCode")); // reg.setDoctName(node.getString("DoctName")); // reg.setAddress(node.getString("Address")); // reg.setTreatNum(node.getString("MZNum")); // 门诊号 reg.setClinicCode(node.getString("ClinicCode")); // reg.setClinicName(node.getString("ClinicName")); // reg.setOrderFromOwner(node.getString("OrderFromOwner")); // // 日期 reg.setRegDate(node.getString("RegistDate")); reg.setBegTime(node.getString("BegTime")); reg.setEndTime(node.getString("EndTime")); reg.setRefundDate(node.getString("RefundDate")); reg.setTradeNo(node.getString("TransNo")); // 是否取号 reg.setIsTake(node.getInteger("IsTake")); // 是否就诊 reg.setIsTreat(node.getInteger("IsTreat")); // HIS reg.setHisTransNo(node.getString("HISTransNo")); // // 金额 payMoney = node.getBigDecimal("RegistMoney"); reg.setPayMoney(payMoney == null ? BigDecimal.ZERO : payMoney); // resultList.add(reg); } return resultList; } /** * [预约挂号]根据患者id查询预约记录 * * @param patientId 患者id * @param regDate 挂号日期 * @return 预约记录 */ public List getRegReserveRecords(String patientId, String regDate) { List resultList = new ArrayList<>(); Map params = new HashMap<>(); params.put("PatientID", patientId); params.put("ReservationDate", regDate); params.put("ReservationTransNo", ""); params.put("AfterTodayFlag", "0"); JsonResult result = HisFactory.His().getJsonResult(HisEnum.AP_Query_Reservation, params); if (!result.success()) { return resultList; } JSONArray jsonArray = result.getJsonArray("Reservation"); Register reg; JSONObject node; BigDecimal regFee, clinicFee; String doctorCode, doctorName; for (int i = 0; i < jsonArray.size(); i++) { node = jsonArray.getJSONObject(i); reg = new Register(); reg.setDeptCode(node.getString("DeptCode")); reg.setDeptName(node.getString("DeptName")); doctorCode = node.getString("DoctCode"); doctorName = node.getString("DoctName"); if (ObjectUtils.isEmpty(doctorCode)) { doctorCode = node.getString("TitleCode"); } if (ObjectUtils.isEmpty(doctorName)) { doctorName = node.getString("Title"); } reg.setDoctCode(doctorCode); reg.setDoctName(doctorName); reg.setAddress(node.getString("Address")); reg.setClinicCode(node.getString("ClinicCode")); // reg.setClinicName(node.getString("ClinicName")); // reg.setOrderFromOwner(node.getString("OrderFromOwner")); // // 时段 reg.setTid(node.getString("TID")); reg.setTName(node.getString("TID")); // 是否取号 reg.setIsTake(node.getInteger("IsTake")); // 是否就诊 reg.setIsTreat(node.getInteger("IsTreat")); reg.setRegDate(node.getString("ReservationDate")); // 日期 reg.setHisTransNo(node.getString("HISTransNo")); // HIS流水号 reg.setTradeNo(node.getString("ReservationTransNo")); // 与HIS交易的流水号 reg.setHospitalArea(node.getString("HospitalAreaName")); // 园区 reg.setBegTime(node.getString("BegTime")); reg.setEndTime(node.getString("EndTime")); // 金额 regFee = node.getBigDecimal("RegFee"); if (regFee == null) { regFee = BigDecimal.ZERO; } clinicFee = node.getBigDecimal("ClinicFee"); if (clinicFee == null) { clinicFee = BigDecimal.ZERO; } reg.setRegFee(regFee); reg.setClinicFee(clinicFee); reg.setPayMoney(regFee.add(clinicFee)); resultList.add(reg); } return resultList; } /** * 取消预约 * * @param patientId 患者ID * @param tradeNo HIS交易流水号 * @return WsResult响应码 */ public JsonResult cancelReserve(String patientId, String tradeNo, MerchantEnum merchantEnum) { Map params = new HashMap<>(); params.put("PatientID", patientId); params.put("ReservationTransNo", tradeNo); params.put("RecallTransNo", "R" + tradeNo); return HisFactory.His().getJsonResultByMer(HisEnum.AP_Recall_Reservation, merchantEnum, params); } /** * 今日挂号-取消挂号 */ public JsonResult refundTodayRegister(String tradeNo, MerchantEnum merchantEnum) { Map params = new HashMap<>(); params.put("TransNo", tradeNo); params.put("DelTransNo", "R" + tradeNo); return HisFactory.His().getJsonResultByMer(HisEnum.AP_Refund_Register, merchantEnum, params); } /** * HIS取消挂号 * * @param isToday 是否为今日挂号 * @param merchantEnum 商户类型 * @param patientId 患者id * @param tradeNo 流水号 * @return JsonResult */ public JsonResult cancelHisReg(boolean isToday, MerchantEnum merchantEnum, String patientId, String tradeNo) { if (isToday) { return refundTodayRegister(tradeNo, merchantEnum); } return cancelReserve(patientId, tradeNo, merchantEnum); } /** * 查询患者是否挂过号 * * @param patientId 患者ID * @param regDate 挂号时间 * @return boolean */ public List hasRegSite(String patientId, String regDate) { return getHisRegHistoryRecords(patientId, regDate); } /** * 查询患者是否预约过 * * @param patientId 患者ID * @param regDate 挂号时间 * @return boolean */ public List hasRegReserve(String patientId, String regDate) { return getRegReserveRecords(patientId, regDate); } // 分时段--------------------------------------------------------------------------- /** * [分时段挂号]查询科室 * * @param begDate 开始时间 * @param endDate 结束时间 * @param deptCode 科室编码-空为所有 */ public List getTimeDeptList(String begDate, String endDate, String deptCode) { List deptList = new ArrayList<>(); Map params = new HashMap<>(); params.put("DeptCode", deptCode);// 空为所有 params.put("RegistBegDate", begDate); params.put("RegistEndDate", endDate); params.put("CanRegistFlag", "1"); // [空或0为所有科室; 1:返回有号源的科室] JsonResult result = HisFactory.His().getJsonResult(HisEnum.AP_Query_Dept_New, params); if (!result.success()) { log.info("[分时段挂号]查询科室列表 {}", result.getMessage()); return deptList; } JSONArray jsonArray = result.getJsonArray("Dept"); Dept dept; JSONObject nodeItem; String address, returnDeptCode, deptName, hospitalAreaName; RegisterDao registerDao = new RegisterDao(); List dbDeptList = registerDao.selectDeptList(); String subDeptJson; List subDeptList; String subDeptName, subDeptCode, subDeptNote, subDeptSourceInfo; JSONObject subDeptItem; Dept subDept; for (int i = 0; i < jsonArray.size(); i++) { nodeItem = jsonArray.getJSONObject(i); returnDeptCode = nodeItem.getString("Code"); deptName = nodeItem.getString("Name"); address = nodeItem.getString("Address"); hospitalAreaName = nodeItem.getString("HospitalAreaName"); // 科室过滤 dept = registerDao.deptFilter(dbDeptList, returnDeptCode, deptName, address, hospitalAreaName); if (dept != null) { // 亚专科 subDeptJson = nodeItem.getString("Code_YZKStr"); if (!ObjectUtils.isEmpty(subDeptJson)) { JSONObject subDeptData = JsonHelper.parseObject(subDeptJson); JSONArray dataItems = subDeptData.getJSONArray("Data"); subDeptList = new ArrayList<>(); for (int j = 0; j < dataItems.size(); j++) { subDeptItem = dataItems.getJSONObject(j); subDeptName = subDeptItem.getString("Name"); subDeptCode = subDeptItem.getString("Code"); subDeptNote = subDeptItem.getString("Note"); subDeptSourceInfo = subDeptItem.getString("SourceInfo"); subDept = new Dept(); subDept.setDeptName(subDeptName); subDept.setDeptCode(subDeptCode); if (!ObjectUtils.isEmpty(subDeptNote)) { subDept.setNote(subDeptNote); } subDept.setSourceInfo(subDeptSourceInfo); subDeptList.add(subDept); } dept.setChildren(subDeptList); } deptList.add(dept); } } return deptList; } /** * 分时段医生查询 * * @param deptCode 科室编码 * @param subDeptCode 亚专科编码 * @param begDate 开始日期 * @param endDate 结束日期 * @return list */ public List queryHisTimeRegDoctorList(String deptCode, String subDeptCode, String begDate, String endDate) { Map params = new HashMap<>(); params.put("DeptCode", deptCode); params.put("DoctCode", null); // 空为所有 params.put("RegistBegDate", begDate); params.put("RegistEndDate", endDate); params.put("CanRegistFlag", "0"); // { 0:返回所有医生; 1:仅返回有号源的医师 } if (!ObjectUtils.isEmpty(subDeptCode)) { params.put("DeptCode_YZKCode", subDeptCode); // 亚专科code } JsonResult result = HisFactory.His().getJsonResult(HisEnum.AP_Query_Doct_New, params); List resultList = new ArrayList<>(); if (!result.success()) { log.info("[医生-分时段查询]{}", result.getMessage()); return resultList; } JSONArray deptJsonList = result.getJsonArray("Dept"); JSONObject deptJson, doctorJson; String deptName; Doctor doctorItem; JSONArray doctorJsonList; for (int i = 0; i < deptJsonList.size(); i++) { deptJson = deptJsonList.getJSONObject(i); deptCode = ParamHelper.spaceFormat(deptJson.getString("DeptCode")); deptName = ParamHelper.spaceFormat(deptJson.getString("DeptName")); doctorJsonList = deptJson.getJSONArray("Doct"); for (int k = 0; k < doctorJsonList.size(); k++) { doctorJson = doctorJsonList.getJSONObject(k); doctorItem = new Doctor(); doctorItem.setDeptCode(deptCode); doctorItem.setSubDeptCode(subDeptCode); 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"))); // 职称编码 doctorItem.setDescription(ParamHelper.spaceFormat(doctorJson.getString("Spec"))); // 描述 doctorItem.setRegDate(ParamHelper.spaceFormat(doctorJson.getString("ReservationDate"))); // 排班日期 // doctorItem.setSurplusSources(doctorJson.getInteger("SurplusSources")); // 号源信息 resultList.add(doctorItem); } } return resultList; } /** * [分时段]根据科室code和医生code查询医生号源 * * @param deptCode 科室code * @param doctCode 医生code * @param subDeptCode 亚专科code(可为空,为空查询大科室) * @param begDate 开始日期(yyyy-MM-dd HH:mm:ss) * @param endDate 结束日期(yyyy-MM-dd) * @return 号源集合 */ public List> getRegTimeSource(String deptCode, String subDeptCode, String doctCode, String begDate, String endDate) { if (DateHelper.isToday(begDate)) { begDate = begDate + " " + DateHelper.getCurTime(); } Map params = new HashMap<>(); params.put("DeptCode", deptCode); params.put("DoctCode", doctCode); params.put("RegistBegDate", begDate); params.put("RegistEndDate", endDate); params.put("CanRegistFlag", "1"); // 仅返回有号源的医师 { 空或0:所有; 1:仅返回可挂号源 } params.put("TimeInterval", 0); // 排班时段[ 0:所有时段、1:上午、2:中午、3:下午、4:晚上 ] if (!ObjectUtils.isEmpty(subDeptCode)) { params.put("DeptCode_YZKCode", subDeptCode); // 亚专科code } JsonResult jsonResult = HisFactory.His().getJsonResult(HisEnum.AP_Query_Register_Source_New, params); List> dataList = new ArrayList<>(); if (!jsonResult.success()) { log.info("[号源-分时段查询]{}", jsonResult.getMessage()); return dataList; } try { JSONArray jsonArray = jsonResult.getJsonArray("Dept", "Doct", "TimeInterval"); JSONObject timeNode, sourceNode; Map map; Register sourceItem; JSONArray sourceArr; BigDecimal regMoney; List list; String tid, tName; for (int i = 0; i < jsonArray.size(); i++) { timeNode = jsonArray.getJSONObject(i); map = new HashMap<>(); tid = timeNode.getString("TID"); tName = timeNode.getString("TName"); map.put("tid", tid); map.put("tName", tName); sourceArr = timeNode.getJSONArray("Source"); list = new ArrayList<>(); for (int k = 0; k < sourceArr.size(); k++) { sourceNode = sourceArr.getJSONObject(k); regMoney = sourceNode.getBigDecimal("RegistPrice"); if (regMoney == null) { regMoney = BigDecimal.ZERO; } if (k == 0) { map.put("regName", sourceNode.getString("RegistName")); map.put("payMoney", regMoney); } sourceItem = new Register(); sourceItem.setTid(tid); sourceItem.setTName(tName); sourceItem.setRegFee(regMoney); // ----------------------- sourceItem.setSourceId(sourceNode.getString("SourceId")); sourceItem.setQueueNum(sourceNode.getString("QueueNumber")); sourceItem.setBegTime(sourceNode.getString("BegTime")); sourceItem.setEndTime(sourceNode.getString("EndTime")); sourceItem.setRegCode(sourceNode.getString("RegistCode")); sourceItem.setRegName(sourceNode.getString("RegistName")); sourceItem.setRegDate(sourceNode.getString("RegistDate")); sourceItem.setAddress(sourceNode.getString("ClinicAddress")); sourceItem.setAllowReg(sourceNode.getInteger("AllowOnline")); sourceItem.setIsUsed(sourceNode.getInteger("IsUsed")); list.add(sourceItem); } map.put("sourceList", list); dataList.add(map); } } catch (Exception e) { e.printStackTrace(); ErrorHelper.println(e); } return dataList; } /** * [分时段]根据科室code和医生code查询医生号源 * * @param deptCode 科室code * @param doctCode 医生code * @param subDeptCode 亚专科code(可为空,为空查询大科室) * @param begDate 开始日期(yyyy-MM-dd HH:mm:ss) * @param endDate 结束日期(yyyy-MM-dd) * @return 号源集合 */ public List getTimeRegSource(String deptCode, String subDeptCode, String doctCode, String begDate, String endDate) { if (DateHelper.isToday(begDate)) { begDate = begDate + " " + DateHelper.getCurTime(); } Map params = new HashMap<>(); params.put("DeptCode", deptCode); params.put("DoctCode", doctCode); params.put("RegistBegDate", begDate); params.put("RegistEndDate", endDate); params.put("CanRegistFlag", "1"); // 仅返回有号源的医师 { 空或0:所有; 1:仅返回可挂号源 } params.put("TimeInterval", 0); // 排班时段[ 0:所有时段、1:上午、2:中午、3:下午、4:晚上 ] if (!ObjectUtils.isEmpty(subDeptCode)) { params.put("DeptCode_YZKCode", subDeptCode); // 亚专科code } JsonResult jsonResult = HisFactory.His().getJsonResult(HisEnum.AP_Query_Register_Source_New, params); List dataList = new ArrayList<>(); if (!jsonResult.success()) { log.info("[分时段挂号-号源查询]{}", jsonResult.getMessage()); return dataList; } try { JSONArray deptJsonArr = jsonResult.getJsonArray("Dept"); if (deptJsonArr == null || deptJsonArr.isEmpty()) { return dataList; } JSONObject deptJsonItem, doctJsonItem, timeJsonItem, sourceJsonItem; JSONArray doctJsonArr, timeJsonArr, sourceJsonArr; Register sourceItem; BigDecimal regMoney; String sourceDeptCode, sourceDeptName, sourceDoctName, sourceDoctCode, sourceTId, sourceTName; for (int deptIndex = 0; deptIndex < deptJsonArr.size(); deptIndex++) { deptJsonItem = deptJsonArr.getJSONObject(deptIndex); if (deptJsonItem == null) { continue; } sourceDeptCode = ParamHelper.spaceFormat(deptJsonItem.getString("DeptCode")); sourceDeptName = ParamHelper.spaceFormat(deptJsonItem.getString("DeptName")); doctJsonArr = deptJsonItem.getJSONArray("Doct"); if (doctJsonArr == null || doctJsonArr.isEmpty()) { continue; } for (int doctIndex = 0; doctIndex < doctJsonArr.size(); doctIndex++) { doctJsonItem = doctJsonArr.getJSONObject(doctIndex); if (doctJsonItem == null) { continue; } sourceDoctCode = ParamHelper.spaceFormat(doctJsonItem.getString("DoctCode")); sourceDoctName = ParamHelper.spaceFormat(doctJsonItem.getString("DoctName")); timeJsonArr = doctJsonItem.getJSONArray("TimeInterval"); if (timeJsonArr == null || timeJsonArr.isEmpty()) { continue; } for (int timeIndex = 0; timeIndex < timeJsonArr.size(); timeIndex++) { timeJsonItem = timeJsonArr.getJSONObject(timeIndex); if (timeJsonItem == null) { continue; } sourceTId = ParamHelper.spaceFormat(timeJsonItem.getString("TID")); sourceTName = ParamHelper.spaceFormat(timeJsonItem.getString("TName")); sourceJsonArr = timeJsonItem.getJSONArray("Source"); if (sourceJsonArr == null || sourceJsonArr.isEmpty()) { continue; } for (int sourceIndex = 0; sourceIndex < sourceJsonArr.size(); sourceIndex++) { sourceJsonItem = sourceJsonArr.getJSONObject(sourceIndex); if (sourceJsonItem == null) { continue; } regMoney = sourceJsonItem.getBigDecimal("RegistPrice"); if (regMoney == null) { regMoney = BigDecimal.ZERO; } sourceItem = new Register(); sourceItem.setDeptCode(sourceDeptCode); sourceItem.setDeptName(sourceDeptName); sourceItem.setDoctCode(sourceDoctCode); sourceItem.setDoctName(sourceDoctName); sourceItem.setTid(sourceTId); sourceItem.setTName(sourceTName); sourceItem.setRegFee(regMoney); // ----------------------- sourceItem.setSourceId(sourceJsonItem.getString("SourceId")); sourceItem.setQueueNum(sourceJsonItem.getString("QueueNumber")); sourceItem.setBegTime(sourceJsonItem.getString("BegTime")); sourceItem.setEndTime(sourceJsonItem.getString("EndTime")); sourceItem.setRegCode(sourceJsonItem.getString("RegistCode")); sourceItem.setRegName(sourceJsonItem.getString("RegistName")); sourceItem.setRegDate(sourceJsonItem.getString("RegistDate")); sourceItem.setAddress(sourceJsonItem.getString("ClinicAddress")); sourceItem.setAllowReg(sourceJsonItem.getInteger("AllowOnline")); sourceItem.setIsUsed(sourceJsonItem.getInteger("IsUsed")); sourceItem.setTotalFee(regMoney); sourceItem.setPayMoney(regMoney); sourceItem.setEnPayMoney(AesWxHelper.encode(regMoney)); dataList.add(sourceItem); } } } } } catch (Exception e) { ErrorHelper.println(e); } return dataList; } /** * 执行分时段挂号 * * @param reg 挂号信息 * @return 结果 */ public JsonResult handleTimeReg(Register reg, MerchantEnum merchantEnum) { Map params = new HashMap<>(); params.put("PatientID", reg.getPatientId()); params.put("SourceId", reg.getSourceId()); params.put("DeptCode", reg.getDeptCode()); params.put("DoctCode", reg.getDoctCode()); params.put("TimeInterval", reg.getTid()); params.put("BegTime", reg.getBegTime()); params.put("EndTime", reg.getEndTime()); params.put("RegistCode", reg.getRegCode()); params.put("RegistDate", reg.getRegDate()); params.put("PayMoney", reg.getPayMoney()); params.put("PayDate", reg.getPayDate()); params.put("PayTime", reg.getPayTime()); params.put("TransNo", reg.getTradeNo()); params.put("PayWay", merchantEnum.HIS_PAY_WAY); if (!ObjectUtils.isEmpty(reg.getSubDeptCode())) { params.put("DeptCode_YZKCode", reg.getSubDeptCode()); // 亚专科code } params.put("OpenId", reg.getOpenid()); params.put("Token", WeChatConfig.TOKEN); return HisFactory.His().getJsonResultByMer(HisEnum.AP_Regist_New, merchantEnum, params); } /** * 执行挂号 * * @param reg 参数 * @return map */ public JsonResult handleReg(Register reg, MerchantEnum merchantEnum) { Map params = new HashMap<>(); String regDate = reg.getRegDate(); params.put("PatientID", reg.getPatientId()); params.put("DeptCode", reg.getDeptCode()); params.put("DoctCode", reg.getDoctCode()); params.put("TID", reg.getTid()); params.put("ClinicCode", reg.getClinicCode()); params.put("ClinicFee", reg.getClinicFee()); params.put("RegFee", reg.getRegFee()); params.put("PayMoney", reg.getPayMoney()); params.put("PayDate", reg.getPayDate()); params.put("PayTime", reg.getPayTime()); params.put("TransNo", reg.getTradeNo()); params.put("BankTransNo", reg.getBankTransNo()); params.put("PayDeviceID", "mobile"); params.put("PayWay", merchantEnum.HIS_PAY_WAY); if (!ObjectUtils.isEmpty(reg.getSubDeptCode())) { params.put("DeptCode_YZKCode", reg.getSubDeptCode()); // 亚专科code } if (DateHelper.isToday(regDate)) { // 今日挂号 return HisFactory.His().getJsonResultByMer(HisEnum.AP_Regist, merchantEnum, params); } // 预约挂号 params.put("ReservationDate", regDate); return HisFactory.His().getJsonResultByMer(HisEnum.AP_Reservation, merchantEnum, params); } /** * 分时段挂号--是否占号(不能作为查询号源是否占用的单独接口,容易被攻击) * * @param patientId 用于占号的患者id * @param sourceId 号源id * @return true:是; false:否 */ public synchronized static JsonResult hasOccupySource(String patientId, String sourceId, MerchantEnum merchantEnum) { Map params = new HashMap<>(); params.put("PatientID", patientId); params.put("SourceId", sourceId); params.put("TransNo", CodeHelper.get32UUID()); return HisFactory.His().getJsonResultByMer(HisEnum.AP_Occupy_Source_New, merchantEnum, params); } /** * 获取某个医生排班表 * * @param begDate 开始时间 * @param endDate 结束时间 * @param doctCode 医生编码 * @return 排班信息 */ public JSONArray getDoctorSchedule(String begDate, String endDate, String doctCode) { JsonResult jsonResult = HisFactory.His().getJsonResult(HisEnum.AP_Doctor_Schedule, params -> { params.put("BegDate", begDate); params.put("EndDate", endDate); params.put("DoctCode", doctCode); }); if (jsonResult.success()) { return jsonResult.getJsonArray("Items", "Item"); } return null; } /** * 查询预约待签到记录(不包含今日挂号的) * * @param begDate 开始时间 * @param endDate 结束时间 * @return 待签到记录 */ public JSONArray getReSignInRecord(String begDate, String endDate) { JsonResult jsonResult = HisFactory.His().getJsonResult(HisEnum.AP_Query_SignIn, params -> { params.put("BegDate", begDate); params.put("EndDate", endDate); }); if (jsonResult.success()) { return jsonResult.getJsonArray("Items"); } return null; } /** * 执行预约签到(即执行转入号源,又执行分时段) * * @param transNo 预约时的交易流水号 * @return 预约签到结果 */ public JsonResult handleSignIn(String transNo) { Map params = new HashMap<>(); params.put("TransNo", transNo); return HisFactory.His().getJsonResult(HisEnum.AP_SignIN, params); } /** * 查询预约待签到记录(包含今日挂号的) * * @param begDate 开始时间 * @param endDate 结束时间 * @return 待签到记录 */ public JSONArray getRegLineSignInRecordsOld(String begDate, String endDate, String patientId) { JsonResult jsonResult = HisFactory.His().getJsonResult(HisEnum.AP_Query_Line_SignIn, params -> { params.put("BegDate", begDate); params.put("EndDate", endDate); params.put("PatientID", patientId); }); if (jsonResult.success()) { return jsonResult.getJsonArray("Items", "Item"); } return null; } /** * 查询预约待签到记录(包含今日挂号的) * * @param begDate 开始时间 * @param endDate 结束时间 * @return list */ public List getRegLineSignInRecords(String begDate, String endDate) { JsonResult jsonResult = HisFactory.His().getJsonResult(HisEnum.AP_Query_Line_SignIn, params -> { params.put("BegDate", begDate); params.put("EndDate", endDate); }); if (!jsonResult.success()) { return new ArrayList<>(); } List regSignList = new ArrayList<>(); JSONArray jsonArray = jsonResult.getJsonArray("Items", "Item"); RegSign regSign; JSONObject item; for (int i = 0; i < jsonArray.size(); i++) { item = jsonArray.getJSONObject(i); regSign = new RegSign(); regSign.setTreatNum(item.getString("MZNum")); regSign.setPatientId(item.getString("PatientId")); regSign.setPatientName(item.getString("PatientName")); regSign.setDeptCode(item.getString("DeptCode")); regSign.setDeptName(item.getString("DeptName")); regSign.setDoctCode(item.getString("DoctCode")); regSign.setDoctName(item.getString("DoctName")); regSign.setBegTime(item.getString("BegTime")); regSign.setEndTime(item.getString("EndTime")); regSign.setReservationDate(item.getString("ReservationDate")); regSign.setScheduleDate(item.getString("ScheduleDate")); regSign.setRegDateTime(item.getString("RegistDate")); regSign.setLineDateTime(item.getString("LineDate")); regSignList.add(regSign); } return regSignList; } /** * 执行预约签到(只执行分时段) * * @param treatNum 门诊号 * @return 预约签到结果1 */ public JsonResult handleLineSignIn(String treatNum) { Map params = new HashMap<>(); params.put("MZNum", treatNum); return HisFactory.His().getJsonResult(HisEnum.AP_Line_SignIN, params); } /** * 第三方扫码挂号 */ public JsonResult tppQRReg(MerchantEnum merchantEnum, String sourceId, String payMoney, String payDate, String payTime, String openId, String bankTransNo, String tradeNo) { Map params = new HashMap<>(); params.put("SourceId", sourceId); params.put("PayMoney", payMoney); params.put("PayDate", payDate); params.put("PayTime", payTime); params.put("PayWay", merchantEnum.HIS_PAY_WAY); params.put("PayDeviceID", "mobile"); params.put("OpenId", openId); params.put("TransNo", tradeNo); params.put("BankTransNo", bankTransNo); return HisFactory.His().getJsonResult(HisEnum.TPP_QR_Reg, params); } }