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(); + } + } + } + }