Index: ssts-web/src/main/webapp/disinfectsystem/config/jmszxyy/spring/HIS.xml =================================================================== diff -u -r29371 -r38602 --- ssts-web/src/main/webapp/disinfectsystem/config/jmszxyy/spring/HIS.xml (.../HIS.xml) (revision 29371) +++ ssts-web/src/main/webapp/disinfectsystem/config/jmszxyy/spring/HIS.xml (.../HIS.xml) (revision 38602) @@ -67,34 +67,10 @@ - - - - - - - - - - - - + + + + - - - - - - - - - - - - - - \ No newline at end of file Index: ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/jmszxyy/FindPatientInfoByTreatmentNumDaoImpl.java =================================================================== diff -u --- ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/jmszxyy/FindPatientInfoByTreatmentNumDaoImpl.java (revision 0) +++ ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/jmszxyy/FindPatientInfoByTreatmentNumDaoImpl.java (revision 38602) @@ -0,0 +1,177 @@ +package com.forgon.disinfectsystem.mq.dao.jmszxyy; + +import java.util.LinkedList; +import java.util.List; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; +import org.dom4j.Document; +import org.dom4j.DocumentHelper; +import org.dom4j.Node; +import org.dom4j.XPath; + +import com.forgon.disinfectsystem.datasynchronization.dao.FindPatientInfoByTreatmentNumDao; +import com.forgon.disinfectsystem.datasynchronization.model.PatientInfoVO; +import com.forgon.tools.date.DateTools; + +/** + * 查询 BS10085 诊疗卡信息JMSZXYY-105 + */ +public class FindPatientInfoByTreatmentNumDaoImpl implements FindPatientInfoByTreatmentNumDao { + + private Logger logger = Logger.getLogger(this.getClass()); + + @Override + public PatientInfoVO[] findPatientInfoByTreatmentNum(String treatmentNum) { + if(StringUtils.isBlank(treatmentNum)){ + logger.debug("诊疗号为空!"); + return null; + } + + List patientInfoVOList = null; + try { + //请求响应消费方:一次请求,一条响应 或者 推送发送方:一次推送,一条推送结果(EHSB平台提供的平台接入方法) + logger.debug(String.format("开始查询%s诊疗卡信息(诊疗卡信息接口)接口", MQHelper.treatmentNumFID)); + //请求信息 + String msgbody = buildTreatmentNumMsgbody(treatmentNum); + logger.debug(String.format("%s诊疗卡信息(诊疗卡信息接口)接口请求信息:%s", MQHelper.treatmentNumFID, msgbody)); + //调用接口 + String responce = MQHelper.composePutAndGetMsg(msgbody); + /*StringBuffer responceBuf = new StringBuffer(); + responceBuf.append("BS10085BS10085S90001S00S90JMZX2024-07-09 16:18:47.630"); + responceBuf.append("1query success1 1"); + responceBuf.append("-391259204039202023-07-17T18:38:42"); + responceBuf.append("20403920测试病人11994-03-23156"); + responceBuf.append("中国01汉族U未知99"); + responceBuf.append("不详或不便分类的其他劳动者19925503991广东省江门市蓬江区白沙街道440701199403230323"); + responceBuf.append("N]]>"); + String responce = responceBuf.toString();*/ + + logger.debug(String.format("成功接收%s诊疗卡信息(诊疗卡信息接口)接口返回信息:%s", MQHelper.treatmentNumFID, responce)); + //解析返回参数 + patientInfoVOList = buildTreatmentPatientInfoVO(responce); + if(CollectionUtils.isEmpty(patientInfoVOList)){ + logger.debug(String.format("不存在诊疗号为%s的%s诊疗卡信息", treatmentNum, MQHelper.treatmentNumFID)); + }else{ + PatientInfoVO[] array = new PatientInfoVO[patientInfoVOList.size()]; + for(int i=0;i buildTreatmentPatientInfoVO(String responce) throws Exception { + + if(StringUtils.isBlank(responce)){ + throw new RuntimeException("接口返回的参数为空!"); + } + + // 开始解析 + Document doc = DocumentHelper.parseText(responce); + // 查询结果返回状态 + String RetCodeXpath = "/ESBEntry/RetInfo/RetCode"; + String RetCode = MQHelper.processDataByXpath(doc, RetCodeXpath); + String RetConXpath = "/ESBEntry/RetInfo/RetCon"; + String RetCon = MQHelper.processDataByXpath(doc, RetConXpath); + if (!MQHelper.RET_CODE_SUCCESS.equals(RetCode)) { + throw new RuntimeException("接口返回信息为" + RetCon); + } + // 解析住院病人信息并入库 + String MsgXpath = "/ESBEntry/MsgInfo/Msg"; // 返回结果可能存在多条住院病人信息 + XPath xpath = doc.createXPath(MsgXpath); + List nodeList2 = xpath.selectNodes(doc, xpath); + if (nodeList2 == null || nodeList2.size() == 0) { + throw new RuntimeException("查询返回的数据不包含/ESBEntry/MsgInfo/Msg节点!"); + } + List patientInfoVOList = new LinkedList(); + // 解析返回信息中所有住院病人信息 + for (int i = 1; i <= nodeList2.size(); i++) { + String msgXpath = "/ESBEntry/MsgInfo/Msg[" + i + "]"; + String patientInfo = MQHelper.processDataByXpath(doc, msgXpath); // 住院病人信息 + if (StringUtils.isNotBlank(patientInfo)) { + Document document = DocumentHelper.parseText(patientInfo); + + String clinicNumberXpath = "/msg/body/row/TREAT_CARD_NO"; + String patientNameXpath = "/msg/body/row/PAT_NAME"; + String patientSexXpath = "/msg/body/row/PHYSI_SEX_NAME"; + String patientIDCardXpath = "/msg/body/row/ID_NUMBER"; + + String clinicNumber = MQHelper.processDataByXpath(document, clinicNumberXpath); + String patientName = MQHelper.processDataByXpath(document, patientNameXpath); + String patientSex = MQHelper.processDataByXpath(document, patientSexXpath); + String patientIDCard = MQHelper.processDataByXpath(document, patientIDCardXpath); + + + PatientInfoVO vo = new PatientInfoVO(); + vo.setClinicNumber(clinicNumber); + vo.setPatientName(patientName); + vo.setPatientSex(patientSex); + vo.setPatientIDCard(patientIDCard); + + patientInfoVOList.add(vo); + } + } + + if(CollectionUtils.isEmpty(patientInfoVOList)){ + throw new RuntimeException("返回的诊疗好患者信息为空!"); + } + + return patientInfoVOList; + } + + /** + * 构建BS10085 诊疗卡信息接口请求信息 + * @param treatmentNum + * @return + */ + private String buildTreatmentNumMsgbody(String treatmentNum) { + StringBuffer msgbody = new StringBuffer(); + msgbody.append(""); + msgbody.append(""); + msgbody.append("1"); + msgbody.append("" + MQHelper.userName + ""); + msgbody.append("" + MQHelper.password + ""); + msgbody.append("" + MQHelper.treatmentNumFID + ""); + msgbody.append("" + MQHelper.treatmentNumOrderNo + ""); + msgbody.append(""); + msgbody.append(""); + msgbody.append("" + MQHelper.treatmentNumFID + ""); + msgbody.append("" + MQHelper.treatmentNumOrderNo + ""); + msgbody.append("S90"); + msgbody.append("S00"); + msgbody.append("JMZX"); + //2024-06-28 09:08:04 + msgbody.append("" + DateTools.getCurrentDayByFormat(DateTools.COMMON_DATE_HMS) + ""); + msgbody.append(""); + msgbody.append(""); + msgbody.append("0"); + msgbody.append("500"); + msgbody.append(""); + msgbody.append(""); + msgbody.append(""); + msgbody.append(""); + msgbody.append(""); + msgbody.append(""); + msgbody.append(""); + msgbody.append(""); + msgbody.append(""); + msgbody.append(""); + return msgbody.toString(); + } + +} Index: ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/jmszxyy/MQHelper.java =================================================================== diff -u --- ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/jmszxyy/MQHelper.java (revision 0) +++ ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/jmszxyy/MQHelper.java (revision 38602) @@ -0,0 +1,93 @@ +package com.forgon.disinfectsystem.mq.dao.jmszxyy; + +import org.apache.commons.lang3.StringUtils; +import org.dom4j.Document; +import org.dom4j.Node; +import org.dom4j.XPath; + +import com.ewell.sdk.business.EwellServiceTool; +import com.ewell.sdk.domain.MessageEntity; +import com.ewell.sdk.exception.SDKException; + +/** + * 百慧MQ信息队列服务的患者信息接口开发JMSZXYY-105 + */ +public class MQHelper { + + public static final String queueManagerName = "QMGR.S90"; + + public static final String RET_CODE_SUCCESS = "1"; + + public static final String userName = "XDGY"; + + public static final String password = "XDGY123456"; + + /** + * BS30005 手术申请单信息接口 + */ + public static final String hospitalNumFID = "BS30005"; + + public static final String hospitalNumOrderNo = "BS30005S90001"; + + /** + * BS10091 在院患者信息接口 + */ + public static final String patientInfoFID = "BS10091"; + + public static final String patientInfoOrderNo = "BS10091S90001"; + + /** + * BS10085诊疗卡信息的fid + */ + public static final String treatmentNumFID = "BS10085"; + + public static final String treatmentNumOrderNo = "BS10085S90001"; + + /** + * 调用接口获取返回信息 + * @param msgbody + * @return + */ + public static String composePutAndGetMsg(String msgbody) { + String responce = null; + EwellServiceTool ewellServiceTool = null; + try { + ewellServiceTool = new EwellServiceTool(); + MessageEntity messageEntity = ewellServiceTool.composePutAndGetMsg(queueManagerName, null, 5000, msgbody); + if(messageEntity != null){ + responce = messageEntity.getMsg(); + } + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException(e.getMessage()); + } finally { + if(ewellServiceTool != null){ + try { + ewellServiceTool.disconnect(); + } catch (SDKException e) { + e.printStackTrace(); + } + } + } + return responce; + } + + /** + * 根据document和Xpath表达式解析数据 + * @param document + * @param nameSpaceURIMap + * @param xpathExp + * @return + */ + public static String processDataByXpath(Document document, String xpathExp) { + if ((StringUtils.isNotBlank(xpathExp)) && (document != null)) { + XPath xpath = document.createXPath(xpathExp); + Node node = xpath.selectSingleNode(document); + if (node != null) { + return node.getStringValue(); + } + } + return null; + } + +} Index: ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/jmszxyy/FindPatientInfoByHospitalNumDaoImpl.java =================================================================== diff -u --- ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/jmszxyy/FindPatientInfoByHospitalNumDaoImpl.java (revision 0) +++ ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/jmszxyy/FindPatientInfoByHospitalNumDaoImpl.java (revision 38602) @@ -0,0 +1,435 @@ +package com.forgon.disinfectsystem.mq.dao.jmszxyy; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Comparator; +import java.util.Date; +import java.util.LinkedList; +import java.util.List; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.log4j.Logger; +import org.dom4j.Document; +import org.dom4j.DocumentHelper; +import org.dom4j.Node; +import org.dom4j.XPath; + +import com.forgon.disinfectsystem.datasynchronization.dao.FindPatientInfoByHospitalNumDao; +import com.forgon.disinfectsystem.datasynchronization.model.PatientInfoVO; +import com.forgon.tools.date.DateTools; + +/** + * 先查询 BS30005 手术申请单信息(手术患者信息接口),查不到手术申请单信息再查询 BS10091 在院患者信息JMSZXYY-105 + */ +public class FindPatientInfoByHospitalNumDaoImpl implements FindPatientInfoByHospitalNumDao { + + private Logger logger = Logger.getLogger(this.getClass()); + + @Override + public PatientInfoVO[] findPatientInfoByHospitalNum(String hospitalNum) { + if (StringUtils.isBlank(hospitalNum)) { + logger.debug("住院号为空!"); + return null; + } + List patientInfoVOList = null; + try { + //请求响应消费方:一次请求,一条响应 或者 推送发送方:一次推送,一条推送结果(EHSB平台提供的平台接入方法) + logger.debug(String.format("开始查询%s手术申请单信息(住院病人)接口", MQHelper.hospitalNumFID)); + //请求信息 + String msgbody = buildOperationApplyMsgbody(hospitalNum); + logger.debug(String.format("%s手术申请单信息(住院病人)接口请求信息:%s", MQHelper.hospitalNumFID, msgbody)); + //调用接口 + String responce = MQHelper.composePutAndGetMsg(msgbody); + /*StringBuffer responceBuf = new StringBuffer(); + responceBuf.append("BS30005BS30005S90001S00S90JMZX2024-07-09 17:32:14.350"); + responceBuf.append("1query success11"); + responceBuf.append("2228628610000071000007100000712024-0449353-0-22511733605544269462024-06-23T08:00:0051.1104腹腔镜下胆总管探查术1E+0门诊1E+0NO_SCHEDULE14243三级手术53545354测试医生53545354测试医生ZYCS1ZYCS1住院测试科室创伤性膀胱破裂44072219410718111X测试"); + responceBuf.append("21989-01-01T00:00:0001汉族U未知2024-06-22T09:15:492024-06-24T08:12:2708麻醉中心2024-06-23T08:00:00手术30101手术间5354江门市中心医院01ZYCS01,0808-2251173010029静脉麻醉0001双侧鼻孔N]]>"); + responceBuf.append("2228628610000071000007100000712024-0449353-0-22511733601944106132024-06-04T08:00:0053.1401双侧腹股沟直疝无张力修补术1E+0门诊1E+0NO_SCHEDULE打号机3三级手术53545354测试医生53545354测试医生ZYCS1ZYCS1住院测试科室创伤性膀胱破裂44072219410718111X测试"); + responceBuf.append("21989-01-01T00:00:0001汉族U未知2024-06-03T08:24:082024-06-03T10:54:5008手术中心2024-06-04T08:00:00手术301手术间5354江门市中心医院01ZYCS01,0808-2251173010028吸入麻醉9999其他N]]>"); + responceBuf.append("2228628610000071000007100000712024-0449353-0-22511733602544137552024-06-06T08:00:0053.2100x001腹腔镜下单侧股疝无张力修补术1E+0门诊1E+0NO_SCHEDULE是的是的2二级手术53545354测试医生53545354测试医生ZYCS1ZYCS1住院测试科室创伤性膀胱破裂44072219410718111X测试"); + responceBuf.append("21989-01-01T00:00:0001汉族U未知2024-06-05T15:05:302024-06-05T17:05:5508手术中心2024-06-06T08:00:00手术301手术间P23001江门市中心医院01ZYCS01,0808-2251173010028吸入麻醉0001双侧鼻孔N]]>"); + responceBuf.append("2228628610000071000007100000712024-0449353-0-22511733605544269462024-06-23T08:00:0053.2101单侧股疝无张力修补术1E+0门诊1E+0NO_SCHEDULE14243三级手术53545354测试医生53545354测试医生ZYCS1ZYCS1住院测试科室创伤性膀胱破裂44072219410718111X测试"); + responceBuf.append("21989-01-01T00:00:0001汉族U未知2024-06-22T09:15:492024-06-24T08:12:2708麻醉中心2024-06-23T08:00:00手术30101手术间5354江门市中心医院01ZYCS01,0808-2251173010029静脉麻醉0001双侧鼻孔N]]>"); + responceBuf.append(""); + String responce = responceBuf.toString();*/ + logger.debug(String.format("成功接收%s手术申请单信息(住院病人)接口返回信息:%s", MQHelper.hospitalNumFID, responce)); + //解析返回参数 + patientInfoVOList = buildHospitalNumberPatientInfoVO(responce); + if(CollectionUtils.isEmpty(patientInfoVOList)){ + logger.debug(String.format("不存在住院号为%s的%s手术申请单信息", hospitalNum, MQHelper.hospitalNumFID)); + }else{ + PatientInfoVO[] array = new PatientInfoVO[patientInfoVOList.size()]; + for(int i=0;iBS10091BS10091S90001S00S9010001422024-07-09 17:51:14.106"); + responceBuf.append("1query success11"); + responceBuf.append(""); + responceBuf.append("7656044072219410718111X雷柏森11941-07-1801汉族2已婚居民身份证44072219410718111X156中国70无业人员广东省江门市台山市大江镇@河木肿闸村23--1号广东省江门市台山市大江镇@河木肿闸村23--1号广东省江门市1370227846813702278468广东省江门市台山市大江镇@13702278468广东省江门市台山市大江镇@大江镇河木中闸村23-1号"); + responceBuf.append("0本人或户主雷柏森广东省江门市台山市大江镇@13702278468100014210001423001694612024-0651074-030016946141国家江门城乡医保3住院2Ⅱ级护理3E+0一般E11.9002型糖尿病E11.9002型糖尿病E11.9002型糖尿病"); + responceBuf.append("2024-06-28 15:19:2533其他医疗机构转入01江门中心医院210306210306内分泌科2103060121030601内分泌科病区病室06280628062801江门中心医院210418210418烧伤整形与创面修复科2104180121041801烧伤整形与创面修复科病区"); + responceBuf.append("17010170101701001江门中心医院210418210418烧伤整形与创面修复科2104180121041801烧伤整形与创面修复科病区17010170101701011771177余文昊11771177余文昊"); + responceBuf.append("212105212105林丽秋11771177余文昊2024-06-28 15:03:322024-07-08 11:45:3282岁1000.003]]>"); + String responce = responceBuf.toString();*/ + logger.debug(String.format("成功接收%s在院患者信息:%s", MQHelper.patientInfoFID, responce)); + //解析 + patientInfoVOList = buildPatientInfoVO(responce); + if(CollectionUtils.isEmpty(patientInfoVOList)){ + logger.debug(String.format("不存在住院号为%s的%s住院患者信息", hospitalNum, MQHelper.patientInfoFID)); + }else{ + PatientInfoVO[] array = new PatientInfoVO[patientInfoVOList.size()]; + for(int i=0;i"); + msgbody.append(""); + msgbody.append("1"); + msgbody.append("" + MQHelper.userName + ""); + msgbody.append("" + MQHelper.password + ""); + msgbody.append("" + MQHelper.hospitalNumFID + ""); + msgbody.append("" + MQHelper.hospitalNumOrderNo + ""); + msgbody.append(""); + msgbody.append(""); + msgbody.append("" + MQHelper.hospitalNumFID + ""); + msgbody.append("" + MQHelper.hospitalNumOrderNo + ""); + msgbody.append("S90"); + msgbody.append("S00"); + msgbody.append("JMZX"); + //2024-06-28 09:08:04 + msgbody.append("" + DateTools.getCurrentDayByFormat(DateTools.COMMON_DATE_HMS) + ""); + msgbody.append(""); + msgbody.append(""); + msgbody.append("0"); + msgbody.append("500"); + msgbody.append(""); + msgbody.append(""); + msgbody.append(""); + msgbody.append(""); + msgbody.append(""); + msgbody.append(""); + msgbody.append(""); + msgbody.append(""); + msgbody.append(""); + msgbody.append(""); + return msgbody.toString(); + } + + /** + * BS10091 在院患者信息的请求参数 + * @param hospitalNum + * @return + */ + private String buildPatientInfoMsgBody(String hospitalNum) { + StringBuffer msgbody = new StringBuffer(); + msgbody.append(""); + msgbody.append(""); + msgbody.append("1"); + msgbody.append("" + MQHelper.userName + ""); + msgbody.append("" + MQHelper.password + ""); + msgbody.append("" + MQHelper.patientInfoFID + ""); + msgbody.append("" + MQHelper.patientInfoOrderNo + ""); + msgbody.append(""); + msgbody.append(""); + msgbody.append("" + MQHelper.patientInfoFID + ""); + msgbody.append("" + MQHelper.patientInfoOrderNo + ""); + msgbody.append("S90"); + msgbody.append("S00"); + msgbody.append("JMZX"); + //2024-06-28 09:08:04 + msgbody.append("" + DateTools.getCurrentDayByFormat(DateTools.COMMON_DATE_HMS) + ""); + msgbody.append(""); + msgbody.append(""); + msgbody.append("0"); + msgbody.append("500"); + msgbody.append(""); + msgbody.append(""); + msgbody.append(""); + msgbody.append(""); + msgbody.append(""); + msgbody.append(""); + msgbody.append(""); + msgbody.append(""); + msgbody.append(""); + msgbody.append(""); + return msgbody.toString(); + } + + /** + * 解析并返回BS10091 在院患者信息 + * @param responce + * @return + * @throws Exception + */ + @SuppressWarnings("unchecked") + private List buildPatientInfoVO(String responce) throws Exception { + + if(StringUtils.isBlank(responce)){ + throw new RuntimeException("接口返回的参数为空!"); + } + + // 开始解析 + Document doc = DocumentHelper.parseText(responce); + // 查询结果返回状态 + String RetCodeXpath = "/ESBEntry/RetInfo/RetCode"; + String RetCode = MQHelper.processDataByXpath(doc, RetCodeXpath); + String RetConXpath = "/ESBEntry/RetInfo/RetCon"; + String RetCon = MQHelper.processDataByXpath(doc, RetConXpath); + if (!MQHelper.RET_CODE_SUCCESS.equals(RetCode)) { + throw new RuntimeException("接口返回信息为" + RetCon); + } + // 解析住院病人信息并入库 + String MsgXpath = "/ESBEntry/MsgInfo/Msg"; // 返回结果可能存在多条住院病人信息 + XPath xpath = doc.createXPath(MsgXpath); + List nodeList2 = xpath.selectNodes(doc, xpath); + if (nodeList2 == null || nodeList2.size() == 0) { + throw new RuntimeException("查询返回的数据不包含/ESBEntry/MsgInfo/Msg节点!"); + } + List patientInfoVOList = new LinkedList(); + // 解析返回信息中所有住院病人信息 + for (int i = 1; i <= nodeList2.size(); i++) { + String msgXpath = "/ESBEntry/MsgInfo/Msg[" + i + "]"; + String patientInfo = MQHelper.processDataByXpath(doc, msgXpath); // 住院病人信息 + if (StringUtils.isNotBlank(patientInfo)) { + Document document = DocumentHelper.parseText(patientInfo); + // 解析住院病人信息并入库 + String hospitalNumberXpath = "/msg/body/row/INHOSP_INDEX_NO"; + String clinicNumberXpath = "/msg/body/row/VISIT_CARD_NO"; + String patientNameXpath = "/msg/body/row/PAT_NAME"; + String patientAgeXpath = "/msg/body/row/AGE"; + + String patientSexXpath = "/msg/body/row/PHYSI_SEX_NAME"; + String patientAreaXpath = "/msg/body/row/ADMIT_WARD_NAME"; + String ascriptionDepartmentXpath = "/msg/body/row/ADMIT_DEPT_NAME"; + String roomNumberXpath = "/msg/body/row/ADMIT_SICKROOM_CODE"; + + String bedNumberXpath = "/msg/body/row/ADMIT_BED_CODE"; + String patientIDCardXpath = "/msg/body/row/ID_NUMBER"; + + String hospitalNumber = MQHelper.processDataByXpath(document, hospitalNumberXpath); + String clinicNumber = MQHelper.processDataByXpath(document, clinicNumberXpath); + String patientName = MQHelper.processDataByXpath(document, patientNameXpath); + String patientAge = MQHelper.processDataByXpath(document, patientAgeXpath); + + String patientSex = MQHelper.processDataByXpath(document, patientSexXpath); + String patientArea = MQHelper.processDataByXpath(document, patientAreaXpath); + String ascriptionDepartment = MQHelper.processDataByXpath(document, ascriptionDepartmentXpath); + String roomNumber = MQHelper.processDataByXpath(document, roomNumberXpath); + + String bedNumber = MQHelper.processDataByXpath(document, bedNumberXpath); + String patientIDCard = MQHelper.processDataByXpath(document, patientIDCardXpath); + + PatientInfoVO vo = new PatientInfoVO(); + vo.setHospitalNumber(hospitalNumber); + vo.setClinicNumber(clinicNumber); + vo.setPatientName(patientName); + vo.setPatientAge(patientAge); + vo.setPatientSex(patientSex); + vo.setPatientArea(patientArea); + vo.setAscriptionDepartment(ascriptionDepartment); + vo.setRoomNumber(roomNumber); + vo.setBedNumber(bedNumber); + vo.setPatientIDCard(patientIDCard); + + patientInfoVOList.add(vo); + } + } + + if(CollectionUtils.isEmpty(patientInfoVOList)){ + throw new RuntimeException("返回的住院患者信息为空!"); + } + + return patientInfoVOList; + } + + /** + * 解析并返回BS30005手术申请单患者信息 + * @return + * @throws Exception + */ + @SuppressWarnings("unchecked") + private List buildHospitalNumberPatientInfoVO(String responce) throws Exception { + + if(StringUtils.isBlank(responce)){ + throw new RuntimeException("接口返回的参数为空!"); + } + + // 开始解析 + Document doc = DocumentHelper.parseText(responce); + // 查询结果返回状态 + String RetCodeXpath = "/ESBEntry/RetInfo/RetCode"; + String RetCode = MQHelper.processDataByXpath(doc, RetCodeXpath); + String RetConXpath = "/ESBEntry/RetInfo/RetCon"; + String RetCon = MQHelper.processDataByXpath(doc, RetConXpath); + if (!MQHelper.RET_CODE_SUCCESS.equals(RetCode)) { + throw new RuntimeException("接口返回信息为" + RetCon); + } + // 解析住院病人信息并入库 + String MsgXpath = "/ESBEntry/MsgInfo/Msg"; // 返回结果可能存在多条住院病人信息 + XPath xpath = doc.createXPath(MsgXpath); + List nodeList2 = xpath.selectNodes(doc, xpath); + if (nodeList2 == null || nodeList2.size() == 0) { + throw new RuntimeException("查询返回的数据不包含/ESBEntry/MsgInfo/Msg节点!"); + } + List patientInfoVOList = new LinkedList(); + // 解析返回信息中所有住院病人信息 + for (int i = 1; i <= nodeList2.size(); i++) { + String msgXpath = "/ESBEntry/MsgInfo/Msg[" + i + "]"; + String patientInfo = MQHelper.processDataByXpath(doc, msgXpath); // 住院病人信息 + if (StringUtils.isNotBlank(patientInfo)) { + Document document = DocumentHelper.parseText(patientInfo); + // 解析住院病人信息并入库 + String hospitalNumberXpath = "/msg/body/row/INHOSP_INDEX_NO"; + String operationRoomXpath = "/msg/body/row/SURGERY_ROOM_NO"; + String patientNameXpath = "/msg/body/row/PAT_NAME"; + String patientBirthdayXpath = "/msg/body/row/DATE_BIRTH"; + + String patientSexXpath = "/msg/body/row/PHYSI_SEX_NAME"; + String bedNumberXpath = "/msg/body/row/BED_NO"; + String patientIDCardXpath = "/msg/body/row/ID_NUMBER"; + String doctorNameXpath = "/msg/body/row/SURGEON_CODE"; + + String operationXpath = "/msg/body/row/SURGERY_OPER_NAME"; + String operationScheduleIdXpath = "/msg/body/row/ELECTR_REQUISITION_NO"; + String operationTimeXpath = "/msg/body/row/RESERVE_DATE"; + + String hospitalNumber = MQHelper.processDataByXpath(document, hospitalNumberXpath); + String opRoomId = MQHelper.processDataByXpath(document, operationRoomXpath); + String patientName = MQHelper.processDataByXpath(document, patientNameXpath); + String patientBirthday = MQHelper.processDataByXpath(document, patientBirthdayXpath); + + String patientSex = MQHelper.processDataByXpath(document, patientSexXpath); + String bedNumber = MQHelper.processDataByXpath(document, bedNumberXpath); + String patientIDCard = MQHelper.processDataByXpath(document, patientIDCardXpath); + String doctorName = MQHelper.processDataByXpath(document, doctorNameXpath); + + String operation = MQHelper.processDataByXpath(document, operationXpath); + String operationScheduleId = MQHelper.processDataByXpath(document, operationScheduleIdXpath); + String operationTime = MQHelper.processDataByXpath(document, operationTimeXpath); + if(StringUtils.isNotBlank(operationTime)){ + operationTime= operationTime.replace("T", " "); + } + + PatientInfoVO patientInfoVO = new PatientInfoVO(); + patientInfoVO.setHospitalNumber(hospitalNumber); + patientInfoVO.setOpRoomId(opRoomId); + patientInfoVO.setPatientName(patientName); + patientInfoVO.setPatientAge(birthdayToAge(patientBirthday)); + + patientInfoVO.setPatientSex(patientSex); + patientInfoVO.setBedNumber(bedNumber); + patientInfoVO.setPatientIDCard(patientIDCard); + patientInfoVO.setDoctorName(doctorName); + + patientInfoVO.setOperation(operation); + patientInfoVO.setOperationScheduleId(operationScheduleId); + patientInfoVO.setOperationTime(operationTime); + + patientInfoVOList.add(patientInfoVO); + } + } + + if(CollectionUtils.isEmpty(patientInfoVOList)){ + throw new RuntimeException("返回的住院患者信息为空!"); + } + + // 根据记录手术时间排序,只取最新记录 + patientInfoVOList.sort(new Comparator() { + @Override + public int compare(PatientInfoVO o1, PatientInfoVO o2) { + if (StringUtils.isBlank(o1.getOperationTime()) && StringUtils.isNotBlank(o2.getOperationTime())) { + return -1; + } + if (StringUtils.isBlank(o2.getOperationTime()) && StringUtils.isNotBlank(o1.getOperationTime())) { + return 1; + } + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + try { + Date date1 = sdf.parse(o1.getOperationTime()); + Date date2 = sdf.parse(o2.getOperationTime()); + return date2.compareTo(date1); + } catch (ParseException e) { + logger.debug(String.format("%s手术申请单信息(住院病人)排序出错(录入时间【RECORD_DATE】字段格式错误)!", MQHelper.hospitalNumFID)); + e.printStackTrace(); + } + return 0; + } + }); + return patientInfoVOList; + } + + /** + * 患者年龄处理: + * 根据患者出生日期(yyyy-MM-ddTHH:mm:ss)计算年龄(1989-01-01T00:00:00) + * @param birthday(yyyy-MM-ddTHH:mm:ss) + * @return age + */ + private static String birthdayToAge(String birthday) { + if(StringUtils.isNotBlank(birthday)) { + if (StringUtils.isNotBlank(birthday)) { + birthday = birthday.replace("T", " "); + } + String[] arr = birthday.split("-"); + Integer year = Integer.parseInt(arr[0]); + Integer month = Integer.parseInt(arr[1]); + Integer day = Integer.parseInt(arr[2].split(" ")[0]); + Calendar now = Calendar.getInstance(); + Integer currentYear = now.get(Calendar.YEAR); + Integer currentMonth = now.get(Calendar.MONTH) + 1; + Integer currentDay = now.get(Calendar.DAY_OF_MONTH); + Integer age = currentYear - year; + if(currentMonth == month) { + if(currentDay < day) { + age -= 1; + } + } else if(currentMonth < month) { + age -= 1; + } + return age.toString(); + } + return null; + } + + @Override + public PatientInfoVO[] findPatientInfoByHospitalNumBeforeOperation(String hospitalNum) { + return this.findPatientInfoByHospitalNum(hospitalNum); + } + +}