Index: build.gradle
===================================================================
diff -u -r28910 -r29626
--- build.gradle (.../build.gradle) (revision 28910)
+++ build.gradle (.../build.gradle) (revision 29626)
@@ -545,6 +545,8 @@
compile group: 'com.ibm.mq', name: 'jsr305', version: '1.3.7'
compile group: 'com.ibm.mq', name: 'MQSDK1.6', version: '3.0.1'
+
+ compile group: 'com.ibm.mq', name: 'MQSDKJAVA', version: '1.0.1'
compile group: 'com.ibm.db2.jcc', name: 'db2jcc', version: '3.66.46'
compile group: 'com.ibm.db2.jcc', name: 'db2jcc4', version: '4.16.53'
Index: ssts-web/src/main/webapp/disinfectsystem/config/dgszyy/interfaces/mqConfig/SDKConfig.properties
===================================================================
diff -u
--- ssts-web/src/main/webapp/disinfectsystem/config/dgszyy/interfaces/mqConfig/SDKConfig.properties (revision 0)
+++ ssts-web/src/main/webapp/disinfectsystem/config/dgszyy/interfaces/mqConfig/SDKConfig.properties (revision 29626)
@@ -0,0 +1,67 @@
+#*****�������������******
+#�����IP��ַ----!ע�⣡----������Э������http/https��
+#--����������ַΪ�������� ������Ӷ˿�����
+#--����������ַΪip��ַ ����Ҫƴ�����ö˿�
+
+server.ip=http://10.12.88.71:7000
+
+#--����������ַΪ�������� ������Ӷ˿�����
+#--����������ַΪip��ַ ����Ҫƴ�����ö˿�
+
+websocket.ip=http://10.12.88.71:7000
+
+
+websocket.endpoint=endpointWisely
+
+#��Ⱥ�ݴ�FAIL_OVER FAIL_FAST
+cluster.type=FAIL_FAST
+cluster.retry=3
+
+
+#*****�ͻ�������******
+sys.code=S17
+client.key=cc36ca11f4ee4bdb997c5979df200cee
+#�ͻ���IP
+sys.ipaddr=10.12.0.56
+
+
+#v4.0.2.5 ����
+#*****apollo����******
+apollo.bootstrap.enabled=false
+app.id=sdk
+#apollo��������key
+env.key=env
+env=dev
+apollo.cluster=default
+apollo.namespace=application
+apollo.meta=http://192.168.10.11:8080
+local.meta=http://192.168.10.11:8080
+dev.meta=http://192.168.10.11:8080
+fat.meta=http://192.168.10.11:8080
+uat.meta=http://192.168.10.11:8080
+lpt.meta=http://192.168.10.11:8080
+pro.meta=http://192.168.10.11:8080
+tools.meta=http://192.168.10.11:8080
+
+
+
+#v4.0.2.6 ����
+#ACK��ִ�̳߳�����
+#�����߳���
+ack.core.pool.size=50
+#����߳���
+ack.max.pool.size=1000
+#������д�С
+ack.pool.queue.size=30
+#������ȡ���ֵ
+ack.batch.max.size=1000
+#������ȡ��Сֵ
+ack.batch.min.size=100
+#������ȡ��ʼֵ
+ack.batch.initial.size=500
+#������ȡֵ��̬����
+ack.batch.increase.size=100
+#������ȡ�����ȴ�
+ack.poll.delay.time=3
+#ACK����������
+ack.batch.send.size=100
Index: ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/dgszyy/SDKCaller.java
===================================================================
diff -u
--- ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/dgszyy/SDKCaller.java (revision 0)
+++ ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/dgszyy/SDKCaller.java (revision 29626)
@@ -0,0 +1,94 @@
+package com.forgon.disinfectsystem.mq.dao.dgszyy;
+
+import com.ewell.sdk.business.EwellServiceTool;
+import com.ewell.sdk.domain.MessageEntity;
+import com.ewell.sdk.exception.SDKException;
+
+/*
+ * 请求响应模式消费方 和 有推送结果的推送模式发送方 使用的SDK操作类
+ */
+public abstract class SDKCaller {
+
+ private EwellServiceTool queueTools;
+
+ /*
+ * gateKeeper为配置文件 EWELL。MQCONFIG下的子节点名字,用于指定连接那个队列管理器
+ */
+ public SDKCaller(String gateKeeper) {
+ // TODO Auto-generated constructor stub
+ queueTools = new EwellServiceTool();
+ }
+
+ //放消息后取出一条消息,等待时间自定
+ public String putReqAndGetResp(String queueManagerName, String channel, int waittime, String request){
+ String Resp = "";
+ MessageEntity msg;
+ try {
+ msg = queueTools.composePutAndGetMsg(queueManagerName, channel, waittime, request);
+ if(msg != null){
+ Resp = msg.getMsg();
+ }
+ } catch (SDKException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ return Resp;
+ }
+
+ //不写时间,默认等待5秒
+ public String putReqAndGetResp(String queueManagerName, String channel, String request){
+ String Resp = "";
+ Resp = putReqAndGetResp(queueManagerName, channel, 5000, request);
+ return Resp;
+ }
+
+ //不写时间,默认等待5秒
+ public void putReqAndGetResps(String queueManagerName, String channel, String request){
+ putReqAndGetResps(queueManagerName, channel, 5000, request);
+ }
+
+ //放消息后取出多条消息,等待时间自定
+ public void putReqAndGetResps(String queueManagerName, String channel, int waittime, String request){
+ String Resp = "";
+ String msgId = "";
+ MessageEntity msg = null;
+
+ try {
+ msgId = queueTools.composePutMsg(queueManagerName, channel, request);
+ } catch (SDKException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ while(true){
+ try {
+ msg = queueTools.composeGetMsgById(queueManagerName, channel, waittime, msgId);
+ if(msg != null) OnMessage(msg.getMsg(),msgId);
+ else break;
+ } catch (SDKException 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();
+ queueTools = null;
+ super.finalize();
+ }
+
+ public EwellServiceTool getQueueTools() {
+ return queueTools;
+ }
+
+ public void setQueueTools(EwellServiceTool queueTools) {
+ this.queueTools = queueTools;
+ }
+
+}
Index: ssts-web/build.gradle
===================================================================
diff -u -r28910 -r29626
--- ssts-web/build.gradle (.../build.gradle) (revision 28910)
+++ ssts-web/build.gradle (.../build.gradle) (revision 29626)
@@ -321,7 +321,6 @@
// 排除webapp/src/main/webapp/WEB-INF/classes/文件夹下除mqConfig文件夹外的其它文件夹
new File(webProjectDir + "/src/main/webapp/WEB-INF/classes").eachDir{
if (it.name != 'mqConfig'){
- println it.name
exclude 'WEB-INF/classes/' + it.name + '/**'
}
}
@@ -398,6 +397,22 @@
}
}
+ // 拷贝SDKConfig.properties,到/resources目录下(东莞中医院DGZYY-174)
+ def SDKConfigFileSource = webProjectDir + "/src/main/webapp/disinfectsystem/config/" + projectName + "/interfaces/mqConfig/SDKConfig.properties"
+ def SDKConfigFileDirTarget = webAppClassesDir;
+ def existSDKConfigFile = new File(SDKConfigFileSource).exists();
+ if(existSDKConfigFile){
+ println "拷贝SDKConfig.properties到" + SDKConfigFileDirTarget;
+ file = new File(SDKConfigFileDirTarget);
+ if (!file.exists()) {
+ file.mkdir();
+ }
+ copy {
+ from SDKConfigFileSource
+ into SDKConfigFileDirTarget
+ }
+ }
+
}
def copyToWebappClasses_Method(){
Index: ssts-web/src/main/webapp/disinfectsystem/config/dgszyy/spring/HIS.xml
===================================================================
diff -u -r28090 -r29626
--- ssts-web/src/main/webapp/disinfectsystem/config/dgszyy/spring/HIS.xml (.../HIS.xml) (revision 28090)
+++ ssts-web/src/main/webapp/disinfectsystem/config/dgszyy/spring/HIS.xml (.../HIS.xml) (revision 29626)
@@ -67,7 +67,7 @@
-
+
@@ -90,7 +90,7 @@
-
+
+
+
-
-
\ No newline at end of file
Index: ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/dgszyy/MQDataDaoImpl.java
===================================================================
diff -u
--- ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/dgszyy/MQDataDaoImpl.java (revision 0)
+++ ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/dgszyy/MQDataDaoImpl.java (revision 29626)
@@ -0,0 +1,140 @@
+package com.forgon.disinfectsystem.mq.dao.dgszyy;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+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.entity.useRecord.gyey.PatientAdmissionInfo;
+import com.forgon.disinfectsystem.inventorymanagement.dao.BaseDataDao;
+import com.forgon.tools.hibernate.ObjectDao;
+
+/**
+ * MQ队列数据处理类
+ * @author zhouPeiMian
+ * @since 2020-08-11
+ *
+ */
+public class MQDataDaoImpl implements BaseDataDao {
+
+ @Autowired
+ private ObjectDao objectDao;
+
+ @Override
+ public PatientInfoVO[] getAllPatientData() throws Exception {
+ return null;
+ }
+
+ @Override
+ public OrgUnitVo[] getAllOrgUnitVoData() throws Exception {
+ return null;
+ }
+
+ @Override
+ public UserVo[] getAllUserVoData() throws Exception {
+ return null;
+ }
+
+ @Override
+ public Object[] getAllBaseData() {
+ return null;
+ }
+
+ @Override
+ public Object[] getAllDepartAndUserData() {
+ return null;
+ }
+
+ @Override
+ public void invokeMethodOnceAfterStart(){
+
+ }
+
+ @Override
+ public PatientInfoVO[] syncMqPatientInfoByHospitalNumber(String hospitalNum) {
+ // 从EHSB平台获取住院病人信息(优先同步“住院病人接口”)
+ PatientInfoVO[] patientInfoVOArray = MQHelper.getHospitalPatientMessage(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/dgszyy/MQHelper.java
===================================================================
diff -u
--- ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/dgszyy/MQHelper.java (revision 0)
+++ ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/dgszyy/MQHelper.java (revision 29626)
@@ -0,0 +1,505 @@
+package com.forgon.disinfectsystem.mq.dao.dgszyy;
+
+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 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.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-11-05
+ *
+ */
+public class MQHelper {
+
+ private static Logger logger = Logger.getLogger(MQHelper.class);
+ /**
+ * 队列管理名称
+ */
+ public static String queueManagerName = "QMGR.S17";
+
+ /**
+ * 获取入院病人信息(东莞中医院)
+ * 需要发送带有住院号的xml消息到平台,然后平台再返回对应的住院病人信息
+ * @return
+ * @throws Exception
+ */
+ @SuppressWarnings("unchecked")
+ public static PatientInfoVO[] getHospitalPatientMessage(String HospitalNumber) {
+ // 查询消息
+ /* 消息内容如下:
+ *
+
+ 1
+ XD
+ 123456
+ BS35004
+ BS35004S08001
+
+
+ BS35004
+ BS35004S08001
+ S08
+ S00
+ DG01
+ 2019-05-25 14:00:0
+
+
+ 0
+ 500
+
+
+
+
+
+
+
+
+
+
+ */
+ if (StringUtils.isBlank(HospitalNumber)) {
+ logger.debug("住院号为空!");
+ return null;
+ }
+ //请求响应消费方:一次请求,一条响应 或者 推送发送方:一次推送,一条推送结果(EHSB平台提供的平台接入方法)
+ logger.debug("开始查询并解析手术申请单住院病人信息");
+ String fid = "BS10003";
+ String Req = "1XDGYZSXT123456" + fid + "" + fid + "S17001"
+ + "" + fid + "" + fid + "S17001S17S00DG01" + DateTools.getCurrentDayByFormat("yyyy-MM-dd HH:mm:ss")+ ""
+ + "0500"
+ + ""
+ + "";
+ logger.debug("请求信息:" + Req);
+ String responce = null;
+ try {
+ SDKCaller sc = new SDKCaller(queueManagerName) {
+ @Override
+ public Object OnMessage(String msg, String msgid) {
+ return null;
+ }
+ };
+ responce = sc.putReqAndGetResp(queueManagerName, null, Req);
+ 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 RetCodeXpath = "/ESBEntry/RetInfo/RetCode"; // 查询结果返回状态
+ String RetCon = processDataByXpath(doc, RetConXpath);
+ String RetCode = processDataByXpath(doc, RetCodeXpath);
+ if ("1".equals(RetCode)) {
+ // 解析住院病人信息并入库
+ 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/INHOSP_INDEX_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/CHIEF_DR_NAME";
+ String operationXpath = "/msg/body/row/SURGERY_HISTORY";
+ String operationTimeXpath = "/msg/body/row/RECORD_DATE";
+ String patientAreaXpath = "/msg/body/row/ADMIT_WARD_NAME";
+ String ascriptionDepartmentXpath = "/msg/body/row/ADMIT_DEPT_NAME";
+ String roomNumberXpath = null; // 没有对应的房间号字段
+ String bedNumberXpath = "/msg/body/row/ADMIT_BED_INDEX_NO";
+ 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 visitDate = processDataByXpath(document, visitDateXpath); // 记录录入时间
+ if (StringUtils.isNotBlank(visitDate)) {
+ visitDate = visitDate.replace("T", " ");
+ }
+ if (StringUtils.isNotBlank(patientBirthday)) {
+ patientBirthday = patientBirthday.replace("T", " ");
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
+ Date date = DateTools.convertTime(patientBirthday, sdf);
+ patientBirthday = DateTools.getFormatDateStr(date, "yyyy-MM-dd HH:mm:ss");
+ }
+
+ 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.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) {
+ return getHospitalPatientMessage(HospitalNumber);
+ }
+
+ /**
+ * 获取门诊病人信息
+ * @param ClinicNumber
+ * @return
+ */
+ @SuppressWarnings("unchecked")
+ public static PatientInfoVO[] getClinicPatientMessage(String ClinicNumber) {
+ if (StringUtils.isBlank(ClinicNumber)) {
+ logger.debug("诊疗号为空!");
+ return null;
+ }
+ //请求响应消费方:一次请求,一条响应 或者 推送发送方:一次推送,一条推送结果(EHSB平台提供的平台接入方法)
+ logger.debug("开始查询并解析门诊病人信息");
+ String fid = "BS10002";
+ String Req = "1XDGYZSXT123456" + fid + "" + fid + "S17001"
+ + "" + fid + "" + fid + "S17001S17S00DG01" + DateTools.getCurrentDayByFormat("yyyy-MM-dd HH:mm:ss")+ ""
+ + "0500"
+ + ""
+ + "";
+ logger.debug("请求信息:" + Req);
+ String responce = null;
+ try {
+ SDKCaller sc = new SDKCaller(queueManagerName) {
+ @Override
+ public Object OnMessage(String msg, String msgid) {
+ return null;
+ }
+ };
+ responce = sc.putReqAndGetResp(queueManagerName, null, Req);
+ 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 RetCodeXpath = "/ESBEntry/RetInfo/RetCode"; // 查询结果返回状态
+ String RetCon = processDataByXpath(doc, RetConXpath);
+ String RetCode = processDataByXpath(doc, RetCodeXpath);
+ if ("1".equals(RetCode)) {
+ // 解析门诊病人信息并入库
+ 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() {
+ return null;
+ }
+
+ /**
+ * 获取人员消息
+ * @return
+ */
+ public static UserVo[] getUserMessage() {
+ 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;
+ }
+
+}
Index: localrepo/com.ibm.mq/MQSDKJAVA/1.0.1/MQSDKJAVA-1.0.1.jar
===================================================================
diff -u
Binary files differ