Index: ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/bjcylyy/log4j.xml
===================================================================
diff -u
--- ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/bjcylyy/log4j.xml (revision 0)
+++ ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/bjcylyy/log4j.xml (revision 26566)
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Index: ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/bjcylyy/MQDataDaoImpl.java
===================================================================
diff -u
--- ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/bjcylyy/MQDataDaoImpl.java (revision 0)
+++ ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/bjcylyy/MQDataDaoImpl.java (revision 26566)
@@ -0,0 +1,278 @@
+package com.forgon.disinfectsystem.mq.dao.bjcylyy;
+
+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 2019-06-20
+ *
+ */
+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;
+ }
+
+ public static void main(String[] args) {
+ MQDataDaoImpl obj = new MQDataDaoImpl();
+
+ }
+
+ @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() 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("开始同步科室");
+ 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("开始同步人员信息");
+ 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) {
+ 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())) {
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
+ Date inDate;
+ inDate = sdf.parse(patientInfoVO.getOperationTime().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/mqConfig/esbmq-config.xml
===================================================================
diff -u
--- ssts-datasync-default-impl/src/main/java/mqConfig/esbmq-config.xml (revision 0)
+++ ssts-datasync-default-impl/src/main/java/mqConfig/esbmq-config.xml (revision 26566)
@@ -0,0 +1,63 @@
+
+
+
+
+ 20.100.2.6
+
+ 5017
+
+ QMGR.S17
+
+ C.S17.C
+
+ 1381
+
+ 1392
+
+ D:\test
+
+ EQ.S17.BS35008.PUT
+ EQ.S17.BS35008.GET
+
+
+
+ 20.100.2.4
+
+ 4017
+
+ QMGR.P17_1
+
+ C.P17.C
+
+ 1381
+
+ 1386
+
+ D:\test
+
+ EQ.S17.PS10032.PUT
+ EQ.S17.PS10032.GET
+ EQ.S17.PS10032.COLLECT
+ EQ.S17.PS10033.PUT
+ EQ.S17.PS10033.GET
+ EQ.S17.PS10033.COLLECT
+
+
+
+ 20.100.2.6
+ 4001
+ QMGR.P01
+ C.P01.C
+ 1381
+ 1386
+ D:\test
+
+ EQ.S01.PS10032.PUT
+ EQ.S01.PS10032.GET
+
+ EQ.S01.PS10033.PUT
+ EQ.S01.PS10033.GET
+
+
+
+
\ No newline at end of file
Index: build.gradle
===================================================================
diff -u -r26538 -r26566
--- build.gradle (.../build.gradle) (revision 26538)
+++ build.gradle (.../build.gradle) (revision 26566)
@@ -486,6 +486,8 @@
compile group: 'com.ibm.mq', name: 'hamcrest-core', version: '1.1'
compile group: 'com.ibm.mq', name: 'connector', version: '1.0'
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.db2.jcc', name: 'db2jcc', version: '3.66.46'
compile group: 'com.ibm.db2.jcc', name: 'db2jcc4', version: '4.16.53'
Index: ssts-datasync/src/main/java/com/forgon/disinfectsystem/inventorymanagement/dao/BaseDataDao.java
===================================================================
diff -u -r26249 -r26566
--- ssts-datasync/src/main/java/com/forgon/disinfectsystem/inventorymanagement/dao/BaseDataDao.java (.../BaseDataDao.java) (revision 26249)
+++ ssts-datasync/src/main/java/com/forgon/disinfectsystem/inventorymanagement/dao/BaseDataDao.java (.../BaseDataDao.java) (revision 26566)
@@ -43,5 +43,19 @@
* @throws Exception
*/
OrgUnitVo[] getAllOrgUnitVoData() throws Exception;
-
+
+ /**
+ * 系统启动后调用一次(用于同步队列-针对北京垂杨柳)
+ * @return
+ * @throws Exception
+ */
+ void invokeMethodOnceAfterStart() throws Exception;
+
+ /**
+ * 根据住院号同步病人信息(北京垂杨柳医院)
+ * @param hospitalNum
+ * @return
+ */
+ PatientInfoVO[] syncMqPatientInfoByHospitalNumber(String hospitalNum);
+
}
Index: ssts-web/src/main/resources/config/bjscylyy/mybatis/FindPatientInfoByHospitalNumMapper.xml
===================================================================
diff -u -r26380 -r26566
--- ssts-web/src/main/resources/config/bjscylyy/mybatis/FindPatientInfoByHospitalNumMapper.xml (.../FindPatientInfoByHospitalNumMapper.xml) (revision 26380)
+++ ssts-web/src/main/resources/config/bjscylyy/mybatis/FindPatientInfoByHospitalNumMapper.xml (.../FindPatientInfoByHospitalNumMapper.xml) (revision 26566)
@@ -5,7 +5,7 @@
-
\ No newline at end of file
Index: ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/bjcylyy/MQHelper.java
===================================================================
diff -u
--- ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/bjcylyy/MQHelper.java (revision 0)
+++ ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/bjcylyy/MQHelper.java (revision 26566)
@@ -0,0 +1,312 @@
+package com.forgon.disinfectsystem.mq.dao.bjcylyy;
+
+import java.io.File;
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import net.sf.json.JSON;
+import net.sf.json.JSONArray;
+import net.sf.json.JSONObject;
+
+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.disinfectsystem.entity.useRecord.gyey.PatientAdmissionInfo;
+import com.forgon.disinfectsystem.useRecord.service.gyey.PatientAdmissionInfoManager;
+import com.forgon.log.service.LogManager;
+import com.forgon.tools.util.ConfigUtils;
+import com.ibm.mq.MQException;
+import com.ibm.mq.MQGetMessageOptions;
+import com.ibm.mq.MQMessage;
+import com.ibm.mq.MQQueue;
+import com.ibm.mq.MQQueueManager;
+import com.ibm.mq.constants.MQConstants;
+
+/**
+ * MQ队列帮助类
+ * @author zhouPeiMian
+ * @since 2019-06-20
+ *
+ */
+public class MQHelper {
+
+ private static Logger logger = Logger.getLogger(MQHelper.class);
+
+ /**
+ * 该main方法可以直接运行
+ *
+ * @param args
+ * @throws Exception
+ */
+ public static void main(String[] args) throws Exception {
+
+ }
+
+ /**
+ * 获取入院病人信息(北京垂杨柳医院)
+ * 需要发送带有住院号的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("开始查询并解析住院病人信息");
+ SDKCaller sc = new SDKCaller("QMGR.S17") {
+ @Override
+ public Object OnMessage(String msg, String msgid) {
+ return null;
+ }
+ };
+ String fid = "BS35008";
+ String Req = "1XG123456BS35008"
+ + "BS35008S17S002019-05-25 14:00:0"
+ + "0500"
+ + ""
+ + "";
+ String responce = sc.putReqAndGetResp(fid, Req, 5);
+ if (StringUtils.isNotBlank(responce)) {
+ logger.debug("成功接收住院病人信息:" + 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[1]"; // 返回结果可能存在多条住院病人信息,暂时只取第一条
+ String patientInfo = processDataByXpath(doc, MsgXpath); // 住院病人信息
+ if (StringUtils.isNoneBlank(patientInfo)) {
+ System.out.println(patientInfo);
+ 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/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 roomNumberXpath = null; // 没有对应的房间号字段
+ String bedNumberXpath = "/msg/body/row/BED_INDEX_NO";
+ String remarkXpath = "/msg/body/row/NOTE";
+
+ 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 roomNumber = processDataByXpath(document, roomNumberXpath);
+ String bedNumber = processDataByXpath(document, bedNumberXpath);
+ String remark = processDataByXpath(document, remarkXpath);
+
+ 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.setRoomNumber(roomNumber);
+ patientInfoVO.setBedNumber(bedNumber);
+ patientInfoVO.setRemark(remark);
+
+ if (!checkObjAllFieldsIsNull(patientInfoVO)) {
+ PatientInfoVO[] patientInfoArray = {patientInfoVO};
+ logger.debug("完成解析住院病人信息,住院号为:" + patientInfoVO.getHospitalNumber());
+ return patientInfoArray;
+ }
+ logger.debug("解析住院病人信息出错,接收到的信息为:" + responce);
+ return null;
+ }
+ }
+ } else {
+ logger.debug("查询失败!");
+ return null;
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ } else {
+ logger.debug("查询住院病人信息失败,未找到住院号为:【" + HospitalNumber + "】的住院病人信息!");
+ return null;
+ }
+ 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) {
+ logger.debug("调用processDataByXpath方法解析数据...");
+ 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: ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/bjcylyy/SDKCaller.java
===================================================================
diff -u
--- ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/bjcylyy/SDKCaller.java (revision 0)
+++ ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/bjcylyy/SDKCaller.java (revision 26566)
@@ -0,0 +1,117 @@
+package com.forgon.disinfectsystem.mq.dao.bjcylyy;
+
+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/src/main/resources/spring/projects/bjscylyy/HIS.xml
===================================================================
diff -u -r26380 -r26566
--- ssts-web/src/main/resources/spring/projects/bjscylyy/HIS.xml (.../HIS.xml) (revision 26380)
+++ ssts-web/src/main/resources/spring/projects/bjscylyy/HIS.xml (.../HIS.xml) (revision 26566)
@@ -115,5 +115,9 @@
-
+
+
+
+
+
\ No newline at end of file
Index: ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/gzs12rmyy/MQDataDaoImpl.java
===================================================================
diff -u -r26314 -r26566
--- ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/gzs12rmyy/MQDataDaoImpl.java (.../MQDataDaoImpl.java) (revision 26314)
+++ ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/gzs12rmyy/MQDataDaoImpl.java (.../MQDataDaoImpl.java) (revision 26566)
@@ -79,4 +79,14 @@
public Object[] getAllDepartAndUserData() {
return null;
}
+
+ @Override
+ public void invokeMethodOnceAfterStart() throws Exception {
+
+ }
+
+ @Override
+ public PatientInfoVO[] syncMqPatientInfoByHospitalNumber(String hospitalNum) {
+ return null;
+ }
}
Index: localrepo/com.ibm.mq/MQSDK1.6/3.0.1/MQSDK1.6-3.0.1.jar
===================================================================
diff -u
Binary files differ
Index: ssts-datasync/src/main/java/com/forgon/disinfectsystem/datasynchronization/service/DataSynchronizationManager.java
===================================================================
diff -u -r26249 -r26566
--- ssts-datasync/src/main/java/com/forgon/disinfectsystem/datasynchronization/service/DataSynchronizationManager.java (.../DataSynchronizationManager.java) (revision 26249)
+++ ssts-datasync/src/main/java/com/forgon/disinfectsystem/datasynchronization/service/DataSynchronizationManager.java (.../DataSynchronizationManager.java) (revision 26566)
@@ -99,4 +99,9 @@
*/
public void syncMqPatientInfo() throws Exception;
+ /**
+ * 同步住院病人信息及科室人员信息,项目启动时开始监听消息队列(北京垂杨柳医院)
+ */
+ void initializeRunOnceSyncData();
+
}
Index: ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/zsykzx/WebsphereMqDaoImpl.java
===================================================================
diff -u -r26249 -r26566
--- ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/zsykzx/WebsphereMqDaoImpl.java (.../WebsphereMqDaoImpl.java) (revision 26249)
+++ ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/zsykzx/WebsphereMqDaoImpl.java (.../WebsphereMqDaoImpl.java) (revision 26566)
@@ -284,5 +284,17 @@
public OrgUnitVo[] getAllOrgUnitVoData() {
return null;
}
+
+ @Override
+ public void invokeMethodOnceAfterStart() throws Exception {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public PatientInfoVO[] syncMqPatientInfoByHospitalNumber(String hospitalNum) {
+ // TODO Auto-generated method stub
+ return null;
+ }
}
Index: ssts-web/src/main/java/com/forgon/disinfectsystem/initdata/service/InitializeDataManagerImpl.java
===================================================================
diff -u -r24238 -r26566
--- ssts-web/src/main/java/com/forgon/disinfectsystem/initdata/service/InitializeDataManagerImpl.java (.../InitializeDataManagerImpl.java) (revision 24238)
+++ ssts-web/src/main/java/com/forgon/disinfectsystem/initdata/service/InitializeDataManagerImpl.java (.../InitializeDataManagerImpl.java) (revision 26566)
@@ -46,6 +46,7 @@
import com.forgon.disinfectsystem.basedatamanager.urgent.service.UrgentLevelManager;
import com.forgon.disinfectsystem.basedatamanager.warehouse.service.WareHouseManager;
import com.forgon.disinfectsystem.common.CssdUtils;
+import com.forgon.disinfectsystem.datasynchronization.service.DataSynchronizationManager;
import com.forgon.disinfectsystem.entity.basedatamanager.container.Container;
import com.forgon.disinfectsystem.entity.basedatamanager.operationRoom.OperationRoom;
import com.forgon.disinfectsystem.entity.basedatamanager.supplyroomconfig.SupplyRoomConfig;
@@ -113,7 +114,13 @@
private InitializeDataProcess initializeDataProcess;
private UrgentLevelManager urgentLevelManager;
private OperationRoomManager operationRoomManager;
+ private DataSynchronizationManager dataSynchronizationManager;
+ public void setDataSynchronizationManager(
+ DataSynchronizationManager dataSynchronizationManager) {
+ this.dataSynchronizationManager = dataSynchronizationManager;
+ }
+
public void setUrgentLevelManager(UrgentLevelManager urgentLevelManager) {
this.urgentLevelManager = urgentLevelManager;
}
@@ -265,6 +272,8 @@
// 初始化标签模板
initLabelTemplates();
+
+ dataSynchronizationManager.initializeRunOnceSyncData();
// **********系统参数配置*********
// initSystemParamSetting();
Index: ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/service/DataSynchronizationManagerImpl.java
===================================================================
diff -u -r26249 -r26566
--- ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/service/DataSynchronizationManagerImpl.java (.../DataSynchronizationManagerImpl.java) (revision 26249)
+++ ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/service/DataSynchronizationManagerImpl.java (.../DataSynchronizationManagerImpl.java) (revision 26566)
@@ -49,6 +49,7 @@
import com.forgon.disinfectsystem.inventorymanagement.dao.InventoryDao;
import com.forgon.disinfectsystem.inventorymanagement.model.Inventory;
import com.forgon.disinfectsystem.inventorymanagement.model.entity.InventoryTemporaryData;
+import com.forgon.disinfectsystem.mq.dao.bjcylyy.MQHelper;
import com.forgon.disinfectsystem.tousse.materialdefinition.service.MaterialDefinitionManager;
import com.forgon.disinfectsystem.useRecord.service.gyey.PatientAdmissionInfoManager;
import com.forgon.log.model.Log;
@@ -64,6 +65,7 @@
import com.forgon.tools.GB2WB;
import com.forgon.tools.db.DatabaseUtil;
import com.forgon.tools.hibernate.ObjectDao;
+import com.forgon.tools.util.ConfigUtils;
import com.forgon.treenode.model.THTreeNode;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
@@ -250,6 +252,17 @@
});
logger.info("调用findPatientInfoByHospitalNum方法根据住院号查询病人信息.hospitalNum=" + hospitalNum + ",sourcePage=" + sourcePage);
+ // 北京垂杨柳医院:根据住院号从平台获取住院病人信息
+ if (baseDataDao != null) {
+ // 根据住院号在EHSB平台上同步住院病人信息
+ logger.info("调用findPatientInfoByHospitalNum方法根据住院号同步病人信息.hospitalNum=" + hospitalNum);
+ // 住院病人信息解析入库
+ PatientInfoVO[] patientInfoVOArray = baseDataDao.syncMqPatientInfoByHospitalNumber(hospitalNum);
+ if (null != patientInfoVOArray && patientInfoVOArray.length > 0) {
+ // 直接返回从平台查询到的住院病人信息,不再到数据库中查询
+ return patientInfoVOArray;
+ }
+ }
//条码腕带住院号前缀,扫描时去掉条码腕带住院号前缀,然后补上调岱嘉平台接口的前辍
String wristBandHospitalNumberPrefix = CssdUtils.getSystemSetConfigByName("wristBandHospitalNumberPrefix");
if(StringUtils.isNotBlank(hospitalNum) && StringUtils.isNotBlank(wristBandHospitalNumberPrefix)
@@ -1099,4 +1112,15 @@
return vos;
}
+ @Override
+ public void initializeRunOnceSyncData() {
+ if(baseDataDao != null){
+ try {
+ baseDataDao.invokeMethodOnceAfterStart();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
}