Index: ssts-web/src/main/resources/spring/projects/stdxfsdyyy/HIS.xml =================================================================== diff -u -r27706 -r27793 --- ssts-web/src/main/resources/spring/projects/stdxfsdyyy/HIS.xml (.../HIS.xml) (revision 27706) +++ ssts-web/src/main/resources/spring/projects/stdxfsdyyy/HIS.xml (.../HIS.xml) (revision 27793) @@ -48,7 +48,7 @@ --> - + - + - + @@ -116,4 +116,8 @@ + + + + \ No newline at end of file Index: ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/stdxfsdyyy/MQDataDaoImpl.java =================================================================== diff -u --- ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/stdxfsdyyy/MQDataDaoImpl.java (revision 0) +++ ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/stdxfsdyyy/MQDataDaoImpl.java (revision 27793) @@ -0,0 +1,319 @@ +package com.forgon.disinfectsystem.mq.dao.stdxfsdyyy; + +import java.text.SimpleDateFormat; +import java.util.Date; + +import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.DocumentHelper; +import org.springframework.beans.factory.annotation.Autowired; + +import com.ewell.mq.queue.MessageEntity; +import com.ewell.mq.queue.QueueTools; +import com.ewell.mq.queue.async.EwellMQMutiImpl; +import com.ewell.mq.queue.async.QueueCallback; +import com.forgon.disinfectsystem.datasynchronization.model.OrgUnitVo; +import com.forgon.disinfectsystem.datasynchronization.model.PatientInfoVO; +import com.forgon.disinfectsystem.datasynchronization.model.UserVo; +import com.forgon.disinfectsystem.datasynchronization.service.DataSynchronizationManager; +import com.forgon.disinfectsystem.entity.useRecord.gyey.PatientAdmissionInfo; +import com.forgon.disinfectsystem.inventorymanagement.dao.BaseDataDao; +import com.forgon.tools.SpringBeanManger; +import com.forgon.tools.hibernate.ObjectDao; + +/** + * MQ队列数据处理类 + * @author zhouPeiMian + * @since 2020-04-15 + * + */ +public class MQDataDaoImpl implements BaseDataDao { + + private static Logger logger = Logger.getLogger(MQDataDaoImpl.class); + @Autowired + private ObjectDao objectDao; + + @Override + public PatientInfoVO[] getAllPatientData() throws Exception { + return null; + } + + @Override + public OrgUnitVo[] getAllOrgUnitVoData() throws Exception { + return MQHelper.getOrgUnitMessage(); + } + + @Override + public UserVo[] getAllUserVoData() throws Exception { + return MQHelper.getUserMessage(); + } + + @Override + public Object[] getAllBaseData() { + return null; + } + + @Override + public Object[] getAllDepartAndUserData() { + return null; + } + + @Override + public void invokeMethodOnceAfterStart() throws Exception { + synchAllOrgUnitVoData(); + synchAllUserVoData(); + } + + /** + * 同步科室信息(平台主动推送模式) + */ + private void synchAllOrgUnitVoData () { + //异步消息获取对象创建 + QueueTools queueTools = new QueueTools(); + EwellMQMutiImpl mutiImpl = queueTools.getMutiMQImpl(); + //设定操作对象。第一个参数同connect函数为配置文件中队列管理器配置标签名,第二个参数为配置文件中取消息对应对应的标签名。 + // 科室 + mutiImpl.init("QMGR.P17", "PS10032_COLLECT"); + // 人员 + // mutiImpl.init("QMGR.P17", "PS10033_COLLECT"); + try { + logger.debug("开始实时监控科室消息队列"); + mutiImpl.run(new QueueCallback() { + @Override + public void onMessage(MessageEntity message) { + try { + // 解析入库 + String orgUnitString = message.getMsg(); + if (StringUtils.isNotBlank(orgUnitString)) { + // 解析xml + logger.debug("开始同步科室" + orgUnitString); + Document doc = DocumentHelper.parseText(orgUnitString); + String actionXpath = "/ESBEntry/MsgInfo/Msg/@action"; //action判断增、删、改 + String codingXpath = "/ESBEntry/MsgInfo/Msg/DEPT_CODE"; // 科室代码 + String nameXpath = "/ESBEntry/MsgInfo/Msg/DEPT_NAME"; // 科室名称 + String parentCodingXpath = "/ESBEntry/MsgInfo/Msg/SUPERIOR_DEPT_CODE"; // 上级科室代码 + String action = MQHelper.processDataByXpath(doc, actionXpath); + String coding = MQHelper.processDataByXpath(doc, codingXpath); + String name = MQHelper.processDataByXpath(doc, nameXpath); + String parentCoding = MQHelper.processDataByXpath(doc, parentCodingXpath); + // 构建科室VO + OrgUnitVo orgUnitVo = new OrgUnitVo(); + orgUnitVo.setCoding(coding); + orgUnitVo.setName(name); + orgUnitVo.setParentCoding(parentCoding); + OrgUnitVo[] allVos = {orgUnitVo}; + DataSynchronizationManager dataSynchronizationManager = + ((DataSynchronizationManager)SpringBeanManger.getBean("dataSynchronizationManager")); + // 根据action执行操作 + if ("INSERT".equals(action) || "UPDATE".equals(action)) { + // 添加或更新科室信息 + if (null != dataSynchronizationManager) { + logger.debug("同步科室成功!action = " + action); + logger.debug(orgUnitString); + dataSynchronizationManager.processSyncOrgUnitData(allVos); + } + } else if ("DELETE".equals(action)) { + // 同步删除科室信息 + /*if (null != orgUnitManager) { + OrgUnit orgUnit = orgUnitManager.getByCode(coding); + if (null != orgUnit) { + THTreeNode thTreeNode = thTreeNodeManager.getTHTreeNodeById(OrgUnit.class.getSimpleName(), orgUnit.getId()); + thTreeNodeManager.deleteTHTreeNode(thTreeNode); + } + logger.debug("同步科室成功!action = " + action); + logger.debug(orgUnitString); + }*/ + } else { + logger.debug("成功接收科室同步的数据!action = " + action + " 不同步科室!"); + } + } + } catch (DocumentException e) { + logger.debug("同步科室错误!"); + logger.debug(message.getMsg()); + e.printStackTrace(); + } + + } + + @Override + public void onException(Exception exception) { + exception.printStackTrace(); + } + }); + } catch (Exception e) { + logger.debug("同步科室错误!"); + e.printStackTrace(); + } + } + + /** + * 同步职工信息(平台主动推送模式) + */ + private void synchAllUserVoData () { + //异步消息获取对象创建 + QueueTools queueTools = new QueueTools(); + EwellMQMutiImpl mutiImpl = queueTools.getMutiMQImpl(); + //设定操作对象。第一个参数同connect函数为配置文件中队列管理器配置标签名,第二个参数为配置文件中取消息对应对应的标签名。 + // 科室 + // mutiImpl.init("QMGR.P17", "PS10032_COLLECT"); + // 人员 + mutiImpl.init("QMGR.P17", "PS10033_COLLECT"); + try { + logger.debug("开始实时监控职工消息队列"); + mutiImpl.run(new QueueCallback() { + @Override + public void onMessage(MessageEntity message) { + try { + // 解析入库 + String userString = message.getMsg(); + if (StringUtils.isNotBlank(userString)) { + // 解析xml + logger.debug("开始同步人员信息" + userString); + Document doc = DocumentHelper.parseText(userString); + String actionXpath = "/ESBEntry/MsgInfo/Msg/@action"; //action判断增、删、改 + String codeXpath = "/ESBEntry/MsgInfo/Msg/STAFF_CODE"; // 职工工号 + String staffNameXpath = "/ESBEntry/MsgInfo/Msg/STAFF_NAME"; // 职工姓名 + String orgUnitCodingXpath = "/ESBEntry/MsgInfo/Msg/SUBOR_DEPT_CODE"; // 从属科室代码 + String action = MQHelper.processDataByXpath(doc, actionXpath); + String staffCode = MQHelper.processDataByXpath(doc, codeXpath); + String staffName = MQHelper.processDataByXpath(doc, staffNameXpath); + String orgUnitCoding = MQHelper.processDataByXpath(doc, orgUnitCodingXpath); + // 构建人员VO + UserVo userVo = new UserVo(); + userVo.setCoding(staffCode); + userVo.setName(staffName); + userVo.setDeptCode(orgUnitCoding); + UserVo[] allVos = {userVo}; + DataSynchronizationManager dataSynchronizationManager = + ((DataSynchronizationManager)SpringBeanManger.getBean("dataSynchronizationManager")); + // 根据action执行操作 + if ("INSERT".equals(action) || "UPDATE".equals(action)) { + // 添加或更新科室信息 + if (null != dataSynchronizationManager) { + logger.debug("同步人员成功!action = " + action); + logger.debug(userString); + dataSynchronizationManager.processSyncUserData(allVos); + } + } else if ("DELETE".equals(action)) { + // 同步删除科室信息 + /*if (null != orgUnitManager) { + User user = userManager.getUserByUserCode(staffCode); + if (null != user) { + userManager.delete(user); + } + logger.debug("同步人员成功!action = " + action); + logger.debug(userString); + }*/ + } else { + logger.debug("成功接收人员同步的数据!action = " + action + " 不同步人员!"); + } + } + } catch (DocumentException e) { + logger.debug("同步人员错误!"); + logger.debug(message.getMsg()); + e.printStackTrace(); + } + + } + + @Override + public void onException(Exception exception) { + exception.printStackTrace(); + } + }); + } catch (Exception e) { + logger.debug("同步科室错误!"); + e.printStackTrace(); + } + } + + @Override + public PatientInfoVO[] syncMqPatientInfoByHospitalNumber(String hospitalNum) { + // 从EHSB平台获取住院病人信息(优先同步“住院病人接口”) + //PatientInfoVO[] patientInfoVOArray = MQHelper.getHospitalPatientMessage(hospitalNum); + //if (null == patientInfoVOArray || patientInfoVOArray.length == 0) { + // 从“非手术住院病人接口”同步数据 + PatientInfoVO[] patientInfoVOArray = MQHelper.getNonoperativeHospitalPatientMessage(hospitalNum); + //} + // 保存到数据库 + if (null != patientInfoVOArray && patientInfoVOArray.length > 0) { + try { + for (PatientInfoVO patientInfoVO : patientInfoVOArray) { + PatientAdmissionInfo patientAdmissionInfo = new PatientAdmissionInfo(); + patientAdmissionInfo.setHospitalNumber(patientInfoVO.getHospitalNumber()); + patientAdmissionInfo.setHospitalSerialNumber(patientInfoVO.getPatientNumber()); + patientAdmissionInfo.setTreatmentNum(patientInfoVO.getClinicNumber()); + patientAdmissionInfo.setPatientName(patientInfoVO.getPatientName()); + patientAdmissionInfo.setPatientAge(patientInfoVO.getPatientAge()); + patientAdmissionInfo.setPatientSex(patientInfoVO.getPatientSex()); + patientAdmissionInfo.setPatientIDCard(patientInfoVO.getPatientIDCard()); + patientAdmissionInfo.setPatientArea(patientInfoVO.getPatientArea()); + patientAdmissionInfo.setRoomNumber(patientInfoVO.getRoomNumber()); + patientAdmissionInfo.setBedNumber(patientInfoVO.getBedNumber()); + patientAdmissionInfo.setOrgunitId(null); + patientAdmissionInfo.setOrgunitName(patientInfoVO.getAscriptionDepartment()); + patientAdmissionInfo.setDoctorName(patientInfoVO.getDoctorName()); + patientAdmissionInfo.setSurgeryName(patientInfoVO.getOperation()); + patientAdmissionInfo.setTime(new Date()); + if (StringUtils.isNotBlank(patientInfoVO.getOperationTime())) { + //2019-06-26T10:25:40 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date inDate; + inDate = sdf.parse(patientInfoVO.getOperationTime().replace('T', ' ').trim()); + patientAdmissionInfo.setInDate(inDate); + } + if(StringUtils.isNotBlank(patientInfoVO.getVisitAmount())) { + patientAdmissionInfo.setVisitAmount(Long.parseLong(patientInfoVO.getVisitAmount())); + } + objectDao.saveOrUpdate(patientAdmissionInfo); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + return patientInfoVOArray; + } + + @Override + public PatientInfoVO[] syncMqPatientInfoByTreatmentNum(String treatmentNum) { + PatientInfoVO[] patientInfoVOArray = MQHelper.getClinicPatientMessage(treatmentNum); + if (patientInfoVOArray != null && patientInfoVOArray.length > 0) { + try { + for (PatientInfoVO patientInfoVO : patientInfoVOArray) { + PatientAdmissionInfo patientAdmissionInfo = new PatientAdmissionInfo(); + patientAdmissionInfo.setHospitalNumber(patientInfoVO.getHospitalNumber()); + patientAdmissionInfo.setHospitalSerialNumber(patientInfoVO.getPatientNumber()); + patientAdmissionInfo.setTreatmentNum(patientInfoVO.getClinicNumber()); + patientAdmissionInfo.setPatientName(patientInfoVO.getPatientName()); + patientAdmissionInfo.setPatientAge(patientInfoVO.getPatientAge()); + patientAdmissionInfo.setPatientSex(patientInfoVO.getPatientSex()); + patientAdmissionInfo.setPatientIDCard(patientInfoVO.getPatientIDCard()); + patientAdmissionInfo.setPatientArea(patientInfoVO.getPatientArea()); + patientAdmissionInfo.setRoomNumber(patientInfoVO.getRoomNumber()); + patientAdmissionInfo.setBedNumber(patientInfoVO.getBedNumber()); + patientAdmissionInfo.setOrgunitId(null); + patientAdmissionInfo.setOrgunitName(patientInfoVO.getAscriptionDepartment()); + patientAdmissionInfo.setDoctorName(patientInfoVO.getDoctorName()); + patientAdmissionInfo.setSurgeryName(patientInfoVO.getOperation()); + patientAdmissionInfo.setTime(new Date()); + if (StringUtils.isNotBlank(patientInfoVO.getOperationTime())) { + //2019-06-26T10:25:40 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date inDate; + inDate = sdf.parse(patientInfoVO.getOperationTime().replace('T', ' ').trim()); + patientAdmissionInfo.setInDate(inDate); + } + if(StringUtils.isNotBlank(patientInfoVO.getVisitAmount())) { + patientAdmissionInfo.setVisitAmount(Long.parseLong(patientInfoVO.getVisitAmount())); + } + objectDao.saveOrUpdate(patientAdmissionInfo); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + return patientInfoVOArray; + } +} Index: ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/stdxfsdyyy/SDKCaller.java =================================================================== diff -u --- ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/stdxfsdyyy/SDKCaller.java (revision 0) +++ ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/stdxfsdyyy/SDKCaller.java (revision 27793) @@ -0,0 +1,117 @@ +package com.forgon.disinfectsystem.mq.dao.stdxfsdyyy; + +import java.io.IOException; + +import com.ewell.mq.queue.QueueTools; +import com.ibm.mq.MQException; +import com.ibm.mq.MQQueueManager; + +/* + * 请求响应模式消费方 和 有推送结果的推送模式发送方 使用的SDK操作类 + */ +public abstract class SDKCaller { + + private QueueTools queueTools; + private MQQueueManager queueManager; + + /* + * gateKeeper为配置文件 EWELL。MQCONFIG下的子节点名字,用于指定连接那个队列管理器 + */ + public SDKCaller(String gateKeeper) { + // TODO Auto-generated constructor stub + queueTools = new QueueTools(); + try { + queueManager = queueTools.connect(gateKeeper); + } catch (MQException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + //不写gateKeeper,则连接默认"default" + public SDKCaller() { + // TODO Auto-generated constructor stub + this("default"); + } + + //放消息后取出一条消息,等待时间自定 + public String putReqAndGetResp(String fid,String Req,int waittime){ + String Resp = ""; + String msgId = ""; + try { + msgId = queueTools.putMsg(queueManager, fid, Req); + Resp = queueTools.getMsgById(queueManager, fid, msgId, waittime); + } catch (MQException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return Resp; + } + //不写时间,默认等待5秒 + public String putReqAndGetResp(String fid,String Req){ + String Resp = ""; + Resp = putReqAndGetResp(fid,Req,5); + return Resp; + } + //不写时间,默认等待5秒 + public void putReqAndGetResps(String fid,String Req){ + putReqAndGetResps(fid,Req,5); + } + //放消息后取出多条消息,等待时间自定 + public void putReqAndGetResps(String fid,String Req,int waittime){ + String Resp = ""; + String msgId = ""; + + try { + msgId = queueTools.putMsg(queueManager, fid, Req); + } catch (MQException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + while(true){ + try { + + Resp = queueTools.getMsgById(queueManager, fid, msgId, waittime); + if(Resp != null) OnMessage(Resp,msgId); + else break; + } catch (MQException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + + public abstract Object OnMessage(String msg, String msgid); + + @Override + protected void finalize() throws Throwable { + // TODO Auto-generated method stub + queueTools.disconnect(queueManager); + queueTools = null; + super.finalize(); + } + public QueueTools getQueueTools() { + return queueTools; + } + public void setQueueTools(QueueTools queueTools) { + this.queueTools = queueTools; + } + public MQQueueManager getQueueManager() { + return queueManager; + } + public void setQueueManager(MQQueueManager queueManager) { + this.queueManager = queueManager; + } + +} Index: ssts-web/build.gradle =================================================================== diff -u -r27735 -r27793 --- ssts-web/build.gradle (.../build.gradle) (revision 27735) +++ ssts-web/build.gradle (.../build.gradle) (revision 27793) @@ -301,6 +301,19 @@ into springSecurityDir rename ('applicationContext-acegi-security-' + suffix + '.xml.back', 'applicationContext-acegi-security.xml') } + + // esbmq-config.xml文件名的目录 + if (projectName == 'bjcylyy' || projectName == 'stdxfsdyyy'){ + suffix = projectName + def MQConfigDir = webProjectDir + "/src/main/resources/mqConfig"; + // 拷贝各项目的esbmq-config.xml,到/src/main/resources/mqConfig目录下 + copy { + from MQConfigDir + '/esbmq-config-' + suffix + '.xml.back' + into MQConfigDir + rename ('esbmq-config-' + suffix + '.xml.back', 'esbmq-config.xml') + } + } + } def copyToWebappClasses_Method(){ Index: ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/stdxfsdyyy/MQHelper.java =================================================================== diff -u --- ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/stdxfsdyyy/MQHelper.java (revision 0) +++ ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/stdxfsdyyy/MQHelper.java (revision 27793) @@ -0,0 +1,805 @@ +package com.forgon.disinfectsystem.mq.dao.stdxfsdyyy; + +import java.io.File; +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Comparator; +import java.util.Date; +import java.util.LinkedList; +import java.util.List; + +import net.sf.json.JSON; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.log4j.Logger; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.DocumentHelper; +import org.dom4j.Node; +import org.dom4j.XPath; +import org.dom4j.io.SAXReader; + +import com.forgon.disinfectsystem.common.CssdUtils; +import com.forgon.disinfectsystem.datasynchronization.model.OrgUnitVo; +import com.forgon.disinfectsystem.datasynchronization.model.PatientInfoVO; +import com.forgon.disinfectsystem.datasynchronization.model.UserVo; +import com.forgon.tools.date.DateTools; + +/** + * MQ队列帮助类 + * @author zhouPeiMian + * @since 2020-04-15 + * + */ +public class MQHelper { + + private static Logger logger = Logger.getLogger(MQHelper.class); + + /** + * 获取入院病人信息(汕头大学附属第一医院) + * 需要发送带有住院号的xml消息到平台,然后平台再返回对应的住院病人信息 + * @return + * @throws Exception + */ + public static PatientInfoVO[] getHospitalPatientMessage(String HospitalNumber) { + // 查询消息 + /* 消息内容如下: + * + + 1 + XG + 123456 + BS35008 + + + BS35008 + S17 + S00 + 2019-05-25 14:00:0 + + + 0 + 500 + + + + + // + + + + + + + */ + if (StringUtils.isBlank(HospitalNumber)) { + logger.debug("住院号为空!"); + return null; + } + //请求响应消费方:一次请求,一条响应 或者 推送发送方:一次推送,一条推送结果(EHSB平台提供的平台接入方法) + logger.debug("开始查询并解析手术申请单住院病人信息"); + String fid = "BS35008"; + String Req = "1XDGYSXDGYSBS35008" + + "BS35008S17S00" + DateTools.getCurrentDayByFormat("yyyy-MM-dd HH:mm:ss")+ "" + + "0500" + + "" + + ""; + logger.debug("请求信息:" + Req); + String responce = null; + try { + SDKCaller sc = new SDKCaller("QMGR.S17") { + @Override + public Object OnMessage(String msg, String msgid) { + return null; + } + }; + responce = sc.putReqAndGetResp(fid, Req, 15); + logger.debug("成功接收住院病人信息:" + responce); + } catch (Exception e) { + e.printStackTrace(); + logger.debug("连接消息队列失败!" + e); + } + if (StringUtils.isNotBlank(responce)) { + // 开始解析 + try { + Document doc = DocumentHelper.parseText(responce); + String RetConXpath = "/ESBEntry/RetInfo/RetCon"; // 查询结果返回状态 + String RetCon = processDataByXpath(doc, RetConXpath); + if ("查询成功".equals(RetCon)) { + // 解析住院病人信息并入库 + String MsgXpath = "/ESBEntry/MsgInfo/Msg"; // 返回结果可能存在多条住院病人信息 + XPath xpath = doc.createXPath(MsgXpath); + List nodeList2 = xpath.selectNodes(doc, xpath); + if (nodeList2 != null && nodeList2.size() > 0) { + List patientInfoVOList = new LinkedList(); + // 解析返回信息中所有住院病人信息 + for (int i = 1; i <= nodeList2.size(); i++) { + String msgXpath = "/ESBEntry/MsgInfo/Msg[" + i + "]"; + String patientInfo = processDataByXpath(doc, msgXpath); // 住院病人信息 + if (StringUtils.isNotBlank(patientInfo)) { + Document document = DocumentHelper.parseText(patientInfo); + // 解析住院病人信息并入库 + String hospitalNumberXpath = "/msg/body/row/MR_NO"; + String serialNumberXpath = "/msg/body/row/INHOSP_NO"; + String patientNameXpath = "/msg/body/row/PAT_NAME"; + String patientBirthdayXpath = "/msg/body/row/DATE_BIRTH"; + String patientSexXpath = "/msg/body/row/PHYSI_SEX_NAME"; + String patientIDCardXpath = "/msg/body/row/ID_NUMBER"; + String doctorNameXpath = "/msg/body/row/APPLY_DR_NAME"; + String operationXpath = "/msg/body/row/SURGERY_OPER_NAME"; + String operationTimeXpath = "/msg/body/row/SURGERY_APPLY_DATE"; + String patientAreaXpath = "/msg/body/row/WARD_NAME"; + String ascriptionDepartmentXpath = "/msg/body/row/APPLY_DEPT_NAME"; + String roomNumberXpath = null; // 没有对应的房间号字段 + String bedNumberXpath = "/msg/body/row/BED_INDEX_NO"; + String remarkXpath = "/msg/body/row/NOTE"; + String visitDateXpath = "/msg/body/row/RECORD_DATE"; + + String hospitalNumber = processDataByXpath(document, hospitalNumberXpath); + String serialNumber = processDataByXpath(document, serialNumberXpath); + String patientName = processDataByXpath(document, patientNameXpath); + String patientBirthday = processDataByXpath(document, patientBirthdayXpath); + String patientSex = processDataByXpath(document, patientSexXpath); + String patientIDCard = processDataByXpath(document, patientIDCardXpath); + String doctorName = processDataByXpath(document, doctorNameXpath); + String operation = processDataByXpath(document, operationXpath); + String operationTime = processDataByXpath(document, operationTimeXpath); + String patientArea = processDataByXpath(document, patientAreaXpath); + String ascriptionDepartment = processDataByXpath(document, ascriptionDepartmentXpath); + String roomNumber = processDataByXpath(document, roomNumberXpath); + String bedNumber = processDataByXpath(document, bedNumberXpath); + String remark = processDataByXpath(document, remarkXpath); + String visitDate = processDataByXpath(document, visitDateXpath); // 记录录入时间 + if (StringUtils.isNotBlank(visitDate)) { + visitDate = visitDate.replace("T", " "); + } + if (StringUtils.isNotBlank(patientBirthday)) { + patientBirthday = patientBirthday.replace("T", " "); + } + + PatientInfoVO patientInfoVO = new PatientInfoVO(); + patientInfoVO.setHospitalNumber(hospitalNumber); + patientInfoVO.setSerialNumber(serialNumber); + patientInfoVO.setPatientName(patientName); + patientInfoVO.setPatientAge(birthdayToAge(patientBirthday)); + patientInfoVO.setPatientSex(patientSex); + patientInfoVO.setPatientIDCard(patientIDCard); + patientInfoVO.setDoctorName(doctorName); + patientInfoVO.setOperation(operation); + patientInfoVO.setOperationTime(operationTime); + patientInfoVO.setPatientArea(patientArea); + patientInfoVO.setAscriptionDepartment(ascriptionDepartment); + patientInfoVO.setRoomNumber(roomNumber); + patientInfoVO.setBedNumber(bedNumber); + patientInfoVO.setRemark(remark); + patientInfoVO.setVisitDate(visitDate); + + if (!checkObjAllFieldsIsNull(patientInfoVO)) { + patientInfoVOList.add(patientInfoVO); + } + } + } + if (CollectionUtils.isNotEmpty(patientInfoVOList)) { + // 根据记录录入时间visitDate排序,只取最新记录 + patientInfoVOList.sort(new Comparator() { + @Override + public int compare(PatientInfoVO o1, PatientInfoVO o2) { + if (StringUtils.isBlank(o1.getVisitDate()) && StringUtils.isNotBlank(o2.getVisitDate())) { + return -1; + } + if (StringUtils.isBlank(o2.getVisitDate()) && StringUtils.isNotBlank(o1.getVisitDate())) { + return 1; + } + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + try { + Date date1 = sdf.parse(o1.getVisitDate()); + Date date2 = sdf.parse(o2.getVisitDate()); + return date2.compareTo(date1); + } catch (ParseException e) { + logger.debug("住院病人信息排序出错(录入时间【RECORD_DATE】字段格式错误)!"); + e.printStackTrace(); + } + return 0; + } + }); + // 只取最新录入的一条记录 + PatientInfoVO[] patientInfoArray = {patientInfoVOList.get(0)}; + logger.debug("完成解析住院病人信息,住院号为:" + patientInfoVOList.get(0).getHospitalNumber()); + return patientInfoArray; + } + } else { + logger.debug("查询返回的数据不包含住院病人信息!"); + return null; + } + } else { + logger.debug("查询失败!【RetCon】 = " + RetCon); + return null; + } + } catch (Exception e) { + e.printStackTrace(); + } + } else { + logger.debug("查询住院病人信息失败,未找到住院号为:【" + HospitalNumber + "】的住院病人信息!"); + return null; + } + logger.debug("查询失败!"); + return null; + } + + /** + * 获取非手术住院病人信息 + * @param HospitalNumber + * @return + */ + public static PatientInfoVO[] getNonoperativeHospitalPatientMessage(String HospitalNumber) { + if (StringUtils.isBlank(HospitalNumber)) { + logger.debug("住院号为空!"); + return null; + } + //请求响应消费方:一次请求,一条响应 或者 推送发送方:一次推送,一条推送结果(EHSB平台提供的平台接入方法) + logger.debug("开始查询并解析非手术住院病人信息"); + String fid = "BS10003"; + String Req = "XDGYSXDGYS1BS10003" + + "BS10003S17S00" + DateTools.getCurrentDayByFormat("yyyy-MM-dd HH:mm:ss")+ "" + + "0500" + + "" + + ""; + logger.debug("请求信息:" + Req); + String responce = null; + try { + SDKCaller sc = new SDKCaller("QMGR.S17") { + @Override + public Object OnMessage(String msg, String msgid) { + return null; + } + }; + responce = sc.putReqAndGetResp(fid, Req, 15); + logger.debug("成功接收住院病人信息:" + responce); + } catch (Exception e) { + e.printStackTrace(); + logger.debug("连接消息队列失败!" + e); + } + if (StringUtils.isNotBlank(responce)) { + // 开始解析 + try { + Document doc = DocumentHelper.parseText(responce); + String RetConXpath = "/ESBEntry/RetInfo/RetCon"; // 查询结果返回状态 + String RetCon = processDataByXpath(doc, RetConXpath); + if ("查询成功".equals(RetCon)) { + // 解析住院病人信息并入库 + String MsgXpath = "/ESBEntry/MsgInfo/Msg"; // 返回结果可能存在多条住院病人信息 + XPath xpath = doc.createXPath(MsgXpath); + List nodeList2 = xpath.selectNodes(doc, xpath); + if (nodeList2 != null && nodeList2.size() > 0) { + List patientInfoVOList = new LinkedList(); + // 解析返回信息中所有住院病人信息 + for (int i = 1; i <= nodeList2.size(); i++) { + String msgXpath = "/ESBEntry/MsgInfo/Msg[" + i + "]"; + String patientInfo = processDataByXpath(doc, msgXpath); // 住院病人信息 + if (StringUtils.isNotBlank(patientInfo)) { + Document document = DocumentHelper.parseText(patientInfo); + // 解析住院病人信息并入库 + String patientIDCardXpath = "/msg/body/row/ID_NUMBER"; + String patientNameXpath = "/msg/body/row/PAT_NAME"; + String patientSexXpath = "/msg/body/row/PHYSI_SEX_NAME"; + String patientBirthdayXpath = "/msg/body/row/DATE_BIRTH"; + String hospitalNumberXpath = "/msg/body/row/MR_NO"; + String serialNumberXpath = "/msg/body/row/INHOSP_NO"; + String operationXpath = "/msg/body/row/ADMIT_DIAG_NAME"; + String patientAreaXpath = "/msg/body/row/CURR_DEPT_NAME"; + String doctorNameXpath = "/msg/body/row/ATTEND_DR_NAME"; + String visitDateXpath = "/msg/body/row/ADMIT_DATE"; + + String hospitalNumber = processDataByXpath(document, hospitalNumberXpath); + String serialNumber = processDataByXpath(document, serialNumberXpath); + String patientName = processDataByXpath(document, patientNameXpath); + String patientBirthday = processDataByXpath(document, patientBirthdayXpath); + String patientSex = processDataByXpath(document, patientSexXpath); + String patientIDCard = processDataByXpath(document, patientIDCardXpath); + String doctorName = processDataByXpath(document, doctorNameXpath); + String operation = processDataByXpath(document, operationXpath); + String patientArea = processDataByXpath(document, patientAreaXpath); + String visitDate = processDataByXpath(document, visitDateXpath); // 记录录入时间 + if (StringUtils.isNotBlank(visitDate)) { + visitDate = visitDate.replace("T", " "); + } + if (StringUtils.isNotBlank(patientBirthday)) { + patientBirthday = patientBirthday.replace("T", " "); + } + + PatientInfoVO patientInfoVO = new PatientInfoVO(); + patientInfoVO.setHospitalNumber(hospitalNumber); + patientInfoVO.setSerialNumber(serialNumber); + patientInfoVO.setPatientName(patientName); + patientInfoVO.setPatientAge(birthdayToAge(patientBirthday)); + patientInfoVO.setPatientSex(patientSex); + patientInfoVO.setPatientIDCard(patientIDCard); + patientInfoVO.setDoctorName(doctorName); + patientInfoVO.setOperation(operation); + patientInfoVO.setPatientArea(patientArea); + patientInfoVO.setVisitDate(visitDate); + + if (!checkObjAllFieldsIsNull(patientInfoVO)) { + patientInfoVOList.add(patientInfoVO); + } + } + } + if (CollectionUtils.isNotEmpty(patientInfoVOList)) { + // 根据记录录入时间visitDate排序,只取最新记录 + patientInfoVOList.sort(new Comparator() { + @Override + public int compare(PatientInfoVO o1, PatientInfoVO o2) { + if (StringUtils.isBlank(o1.getVisitDate()) && StringUtils.isNotBlank(o2.getVisitDate())) { + return -1; + } + if (StringUtils.isBlank(o2.getVisitDate()) && StringUtils.isNotBlank(o1.getVisitDate())) { + return 1; + } + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + try { + Date date1 = sdf.parse(o1.getVisitDate()); + Date date2 = sdf.parse(o2.getVisitDate()); + return date2.compareTo(date1); + } catch (ParseException e) { + logger.debug("住院病人信息排序出错(录入时间【RECORD_DATE】字段格式错误)!"); + e.printStackTrace(); + } + return 0; + } + }); + // 只取最新录入的一条记录 + PatientInfoVO[] patientInfoArray = {patientInfoVOList.get(0)}; + logger.debug("完成解析住院病人信息,住院号为:" + patientInfoVOList.get(0).getHospitalNumber()); + return patientInfoArray; + } + } else { + logger.debug("查询返回的数据不包含住院病人信息!"); + return null; + } + } else { + logger.debug("查询失败!【RetCon】 = " + RetCon); + return null; + } + } catch (Exception e) { + e.printStackTrace(); + } + } else { + logger.debug("查询住院病人信息失败,未找到住院号为:【" + HospitalNumber + "】的住院病人信息!"); + return null; + } + logger.debug("查询失败!"); + return null; + } + + /** + * 获取门诊病人信息 + * @param ClinicNumber + * @return + */ + public static PatientInfoVO[] getClinicPatientMessage(String ClinicNumber) { + if (StringUtils.isBlank(ClinicNumber)) { + logger.debug("诊疗号为空!"); + return null; + } + //请求响应消费方:一次请求,一条响应 或者 推送发送方:一次推送,一条推送结果(EHSB平台提供的平台接入方法) + logger.debug("开始查询并解析门诊病人信息"); + String fid = "BS10002"; + String Req = "XDGYSXDGYS1BS10002" + + "BS10002S17S00" + DateTools.getCurrentDayByFormat("yyyy-MM-dd HH:mm:ss")+ "" + + "0500" + + "" + + ""; + logger.debug("请求信息:" + Req); + String responce = null; + try { + SDKCaller sc = new SDKCaller("QMGR.S17") { + @Override + public Object OnMessage(String msg, String msgid) { + return null; + } + }; + responce = sc.putReqAndGetResp(fid, Req, 15); + logger.debug("成功接收门诊病人信息:" + responce); + } catch (Exception e) { + e.printStackTrace(); + logger.debug("连接消息队列失败!" + e); + } + if (StringUtils.isNotBlank(responce)) { + // 开始解析 + try { + Document doc = DocumentHelper.parseText(responce); + String RetConXpath = "/ESBEntry/RetInfo/RetCon"; // 查询结果返回状态 + String RetCon = processDataByXpath(doc, RetConXpath); + if ("查询成功".equals(RetCon)) { + // 解析门诊病人信息并入库 + String MsgXpath = "/ESBEntry/MsgInfo/Msg"; // 返回结果可能存在多条门诊病人信息 + XPath xpath = doc.createXPath(MsgXpath); + List nodeList2 = xpath.selectNodes(doc, xpath); + if (nodeList2 != null && nodeList2.size() > 0) { + List patientInfoVOList = new LinkedList(); + // 解析返回信息中所有门诊病人信息 + for (int i = 1; i <= nodeList2.size(); i++) { + String msgXpath = "/ESBEntry/MsgInfo/Msg[" + i + "]"; + String patientInfo = processDataByXpath(doc, msgXpath); // 门诊病人信息 + if (StringUtils.isNotBlank(patientInfo)) { + Document document = DocumentHelper.parseText(patientInfo); + // 解析门诊病人信息并入库 + String clinicNumberXpath = "/msg/body/row/OUTHOSP_INDEX_NO"; + String serialNumberXpath = "/msg/body/row/OUTHOSP_NO"; + String patientNameXpath = "/msg/body/row/PAT_NAME"; + String patientBirthdayXpath = "/msg/body/row/DATE_BIRTH"; + String patientSexXpath = "/msg/body/row/PHYSI_SEX_NAME"; + String patientIDCardXpath = "/msg/body/row/ID_NUMBER"; + String doctorNameXpath = "/msg/body/row/RECEPT_TREAT_DR_NAME"; + String operationXpath = "/msg/body/row/OUTHOSP_DIAG_NAME"; + String patientAreaXpath = "/msg/body/row/VISIT_DEPT_NAME"; + String visitDateXpath = "/msg/body/row/VISIT_DATE"; + + String clinicNumber = processDataByXpath(document, clinicNumberXpath); + String serialNumber = processDataByXpath(document, serialNumberXpath); + String patientName = processDataByXpath(document, patientNameXpath); + String patientBirthday = processDataByXpath(document, patientBirthdayXpath); + String patientSex = processDataByXpath(document, patientSexXpath); + String patientIDCard = processDataByXpath(document, patientIDCardXpath); + String doctorName = processDataByXpath(document, doctorNameXpath); + String operation = processDataByXpath(document, operationXpath); + String patientArea = processDataByXpath(document, patientAreaXpath); + String visitDate = processDataByXpath(document, visitDateXpath); // 记录录入时间 + if (StringUtils.isNotBlank(visitDate)) { + visitDate = visitDate.replace("T", " "); + } + if (StringUtils.isNotBlank(patientBirthday)) { + patientBirthday = patientBirthday.replace("T", " "); + } + + PatientInfoVO patientInfoVO = new PatientInfoVO(); + patientInfoVO.setClinicNumber(clinicNumber); + patientInfoVO.setSerialNumber(serialNumber); + patientInfoVO.setPatientName(patientName); + patientInfoVO.setPatientAge(birthdayToAge(patientBirthday)); + patientInfoVO.setPatientSex(patientSex); + patientInfoVO.setPatientIDCard(patientIDCard); + patientInfoVO.setDoctorName(doctorName); + patientInfoVO.setOperation(operation); + patientInfoVO.setPatientArea(patientArea); + patientInfoVO.setVisitDate(visitDate); + + if (!checkObjAllFieldsIsNull(patientInfoVO)) { + patientInfoVOList.add(patientInfoVO); + } + } + } + if (CollectionUtils.isNotEmpty(patientInfoVOList)) { + // 根据记录录入时间visitDate排序,只取最新记录 + patientInfoVOList.sort(new Comparator() { + @Override + public int compare(PatientInfoVO o1, PatientInfoVO o2) { + if (StringUtils.isBlank(o1.getVisitDate()) && StringUtils.isNotBlank(o2.getVisitDate())) { + return -1; + } + if (StringUtils.isBlank(o2.getVisitDate()) && StringUtils.isNotBlank(o1.getVisitDate())) { + return 1; + } + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + try { + Date date1 = sdf.parse(o1.getVisitDate()); + Date date2 = sdf.parse(o2.getVisitDate()); + return date2.compareTo(date1); + } catch (ParseException e) { + logger.debug("门诊病人信息排序出错(录入时间【VISIT_DATE】字段格式错误)!"); + e.printStackTrace(); + } + return 0; + } + }); + // 只取最新录入的一条记录 + PatientInfoVO[] patientInfoArray = {patientInfoVOList.get(0)}; + logger.debug("完成解析门诊病人信息,诊疗号为:" + patientInfoVOList.get(0).getClinicNumber()); + return patientInfoArray; + } + } else { + logger.debug("查询返回的数据不包含门诊病人信息!"); + return null; + } + } else { + logger.debug("查询失败!【RetCon】 = " + RetCon); + return null; + } + } catch (Exception e) { + e.printStackTrace(); + } + } else { + logger.debug("查询门诊病人信息失败,未找到诊疗号为:【" + ClinicNumber + "】的门诊病人信息!"); + return null; + } + logger.debug("查询失败!"); + return null; + } + + /** + * 获取组织机构消息 + * @return + */ + public static OrgUnitVo[] getOrgUnitMessage() { + //请求响应消费方:一次请求,一条响应 或者 推送发送方:一次推送,一条推送结果(EHSB平台提供的平台接入方法) + logger.debug("开始查询并解析组织机构信息"); + String fid = "BS02001"; + String Req = "XDGYSXDGYS1BS02001" + + "BS02001S17S00" + DateTools.getCurrentDayByFormat("yyyy-MM-dd HH:mm:ss")+ "" + + "0500" + + "" + + ""; + logger.debug("请求信息:" + Req); + String responce = null; + try { + SDKCaller sc = new SDKCaller("QMGR.S17") { + @Override + public Object OnMessage(String msg, String msgid) { + return null; + } + }; + responce = sc.putReqAndGetResp(fid, Req, 50); + logger.debug("成功接收组织机构信息:" + responce); + } catch (Exception e) { + e.printStackTrace(); + logger.debug("连接消息队列失败!" + e); + } + if (StringUtils.isNotBlank(responce)) { + // 开始解析 + try { + Document doc = DocumentHelper.parseText(responce); + String RetConXpath = "/ESBEntry/RetInfo/RetCon"; // 查询结果返回状态 + String RetCon = processDataByXpath(doc, RetConXpath); + if ("查询成功".equals(RetCon)) { + // 查询成功 + // 解析组织结构并入库 + String MsgXpath = "/ESBEntry/MsgInfo/Msg"; // 返回结果可能存在多条组织结构 + XPath xpath = doc.createXPath(MsgXpath); + List nodeList2 = xpath.selectNodes(doc, xpath); + if (nodeList2 != null && nodeList2.size() > 0) { + List orgUnitVoList = new ArrayList(); + // 解析返回信息中所有组织机构 + for (int i = 1; i <= nodeList2.size(); i++) { + String msgXpath = "/ESBEntry/MsgInfo/Msg[" + i + "]"; + String orgUnitInfo = processDataByXpath(doc, msgXpath); // 组织机构 + if (StringUtils.isNotBlank(orgUnitInfo)) { + Document document = DocumentHelper.parseText(orgUnitInfo); + // 解析住院病人信息并入库 + String codingXpath = "/msg/body/row/DEPT_CODE"; // 科室编码 + String nameXpath = "/msg/body/row/DEPT_NAME"; // 科室名称 + String parentCodingXpath = "/ESBEntry/MsgInfo/Msg/SUPERIOR_DEPT_CODE"; // 上级科室代码 + String coding = processDataByXpath(document, codingXpath); + String name = processDataByXpath(document, nameXpath); + String parentCoding = processDataByXpath(document, parentCodingXpath); + // 构建科室VO + OrgUnitVo orgUnitVo = new OrgUnitVo(); + orgUnitVo.setCoding(coding); + orgUnitVo.setName(name); + orgUnitVo.setParentCoding(parentCoding); + orgUnitVoList.add(orgUnitVo); + } + } + OrgUnitVo[] allVos = new OrgUnitVo[orgUnitVoList.size()]; + allVos = orgUnitVoList.toArray(allVos); + return allVos; + } else { + logger.debug("查询返回的数据为空!"); + return null; + } + } else { + // 查询失败 + logger.debug("查询失败!【RetCon】 = " + RetCon); + return null; + } + } catch (Exception e) { + + } + } else { + logger.debug("查询组织结构失败,未找到组织结构信息!"); + return null; + } + logger.debug("查询失败!"); + return null; + } + + /** + * 获取人员消息 + * @return + */ + public static UserVo[] getUserMessage() { + //请求响应消费方:一次请求,一条响应 或者 推送发送方:一次推送,一条推送结果(EHSB平台提供的平台接入方法) + logger.debug("开始查询并解析人员信息"); + String fid = "BS02004"; + String Req = "XDGYSXDGYS1BS02004" + + "BS02004S17S00" + DateTools.getCurrentDayByFormat("yyyy-MM-dd HH:mm:ss")+ "" + + "0500" + + "" + + ""; + logger.debug("请求信息:" + Req); + String responce = null; + try { + SDKCaller sc = new SDKCaller("QMGR.S17") { + @Override + public Object OnMessage(String msg, String msgid) { + return null; + } + }; + responce = sc.putReqAndGetResp(fid, Req, 50); + logger.debug("成功接收人员信息:" + responce); + } catch (Exception e) { + e.printStackTrace(); + logger.debug("连接消息队列失败!" + e); + } + if (StringUtils.isNotBlank(responce)) { + // 开始解析 + try { + Document doc = DocumentHelper.parseText(responce); + String RetConXpath = "/ESBEntry/RetInfo/RetCon"; // 查询结果返回状态 + String RetCon = processDataByXpath(doc, RetConXpath); + if ("查询成功".equals(RetCon)) { + // 查询成功 + // 解析人员信息并入库 + String MsgXpath = "/ESBEntry/MsgInfo/Msg"; // 返回结果可能存在多条人员信息 + XPath xpath = doc.createXPath(MsgXpath); + List nodeList2 = xpath.selectNodes(doc, xpath); + if (nodeList2 != null && nodeList2.size() > 0) { + List userVoList = new ArrayList(); + // 解析返回信息中所有人员信息 + for (int i = 1; i <= nodeList2.size(); i++) { + String msgXpath = "/ESBEntry/MsgInfo/Msg[" + i + "]"; + String orgUnitInfo = processDataByXpath(doc, msgXpath); // 人员信息 + if (StringUtils.isNotBlank(orgUnitInfo)) { + Document document = DocumentHelper.parseText(orgUnitInfo); + // 解析人员信息信息并入库 + String codingXpath = "/msg/body/row/STAFF_CODE"; // 职工工号 + String nameXpath = "/msg/body/row/STAFF_NAME"; // 职工姓名 + String parentCodingXpath = "/msg/body/row/SUBOR_DEPT_CODE"; // 从属科室代码 + String coding = processDataByXpath(document, codingXpath); + String name = processDataByXpath(document, nameXpath); + String orgUnitCoding = processDataByXpath(document, parentCodingXpath); + // 构建人员信息VO + UserVo userVo = new UserVo(); + userVo.setCoding(coding); + userVo.setName(name); + userVo.setOrgUnitCoding(orgUnitCoding); + userVoList.add(userVo); + } + } + UserVo[] allVos = new UserVo[userVoList.size()]; + allVos = userVoList.toArray(allVos); + return allVos; + } else { + logger.debug("查询返回的数据为空!"); + return null; + } + } else { + // 查询失败 + logger.debug("查询失败!【RetCon】 = " + RetCon); + return null; + } + } catch (Exception e) { + + } + } else { + logger.debug("查询组织结构失败,未找到组织结构信息!"); + return null; + } + logger.debug("查询失败!"); + return null; + } + + /** + * 根据xml结果同步数据 + * + * @param xmlData + */ + private static JSON processData(String xmlData) { + logger.debug("processData xmlData:\n" + xmlData); + try { + // {head:{msgId:'',msgName:''},body:[{}]} + JSON json = CssdUtils.xml2JsonCommon(xmlData); + return json; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + /** + * 根据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; + } + + /** + * 判断实体对象是否为空、对象所有非静态属性是否都为空 + * @param object + * @return + */ + public static boolean checkObjAllFieldsIsNull (Object object) { + if (null == object) { + return true; + } + try { + for (Field f : object.getClass().getDeclaredFields()) { + f.setAccessible(true); + if (f.get(object) != null && + StringUtils.isNotBlank(f.get(object).toString()) && + !Modifier.isStatic(f.getModifiers())) { + return false; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return true; + } + + /** + * 测试用:从xml文件读取xml字符串 + */ + @SuppressWarnings("unused") + private static List xmlFileToStr(String path) { + List strList = new ArrayList(); + String message = null; + try { + SAXReader saxReader = new SAXReader(); + File f = new File(path); + Document doc; + doc = saxReader.read(f); + message = doc.asXML(); + System.out.println(message); + strList.add(message); + } catch (DocumentException e) { + e.printStackTrace(); + } + return strList; + } + + /** + * 患者年龄处理: + * 根据患者出生日期(YYYY-MM-DD hh:mm:ss )计算年龄 + * @param birthday(YYYY-MM-DD hh:mm:ss ) + * @return age + */ + private static String birthdayToAge(String birthday) { + if(StringUtils.isNotBlank(birthday)) { + 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; + } + +}