Index: ssts-webservice/src/main/java/com/forgon/disinfectsystem/webservice/datasync/szhzyy/OrgUserDataWebServiceManagerImpl.java =================================================================== diff -u --- ssts-webservice/src/main/java/com/forgon/disinfectsystem/webservice/datasync/szhzyy/OrgUserDataWebServiceManagerImpl.java (revision 0) +++ ssts-webservice/src/main/java/com/forgon/disinfectsystem/webservice/datasync/szhzyy/OrgUserDataWebServiceManagerImpl.java (revision 28726) @@ -0,0 +1,140 @@ +package com.forgon.disinfectsystem.webservice.datasync.szhzyy; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.jws.WebMethod; +import javax.jws.WebService; + +import net.sf.json.JSONArray; +import net.sf.json.JSONException; +import net.sf.json.JSONObject; +import net.sf.json.xml.XMLSerializer; + +import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; + +import com.forgon.disinfectsystem.datasynchronization.model.OrgUnitVo; +import com.forgon.disinfectsystem.datasynchronization.model.UserVo; +import com.forgon.disinfectsystem.datasynchronization.service.DataSynchronizationManager; + + +@WebService(serviceName = "/SysUserAndOrgService") +public class OrgUserDataWebServiceManagerImpl implements OrgUserDataWebServiceManager { + + private final Logger logger = Logger.getLogger(this.getClass()); + + @Autowired + private DataSynchronizationManager dataSynchronizationManager; + + @Override + @WebMethod + public String dealOrgUnit(String xmlData) { + logger.debug("调用接口推送组织机构数据xmlData="+xmlData); + String resultCode = "1"; + String resultMessage = ""; + if (StringUtils.isNotBlank(xmlData)) { + try { + xmlData = fomartParam(xmlData); + XMLSerializer xmlSerializer = new XMLSerializer(); + JSONObject json = (JSONObject) xmlSerializer.read(xmlData); + if(json == null){ + resultMessage = "入参格式不正确"; + return " " + resultCode + " " + resultMessage + ""; + } + Object msg = json.opt("Msg"); + if(msg == null){ + resultMessage = "未找到相关数据"; + return " " + resultCode + " " + resultMessage + ""; + } + + if(msg instanceof JSONObject){ + JSONObject orgJsonObject = (JSONObject)msg; + OrgUnitVo vo = new OrgUnitVo(); + vo.setCoding(orgJsonObject.optString("DEPT_CODE")); + vo.setName(orgJsonObject.optString("DEPT_NAME")); + vo.setParentCoding(orgJsonObject.optString("SUPERIOR_DEPT_CODE")); + OrgUnitVo[] allVos = {vo}; + logger.debug(JSONArray.fromObject(allVos)); + dataSynchronizationManager.processSyncOrgUnitData(allVos); + }else{ + resultMessage = "组织机构数据格式不正确"; + return " " + resultCode + " " + resultMessage + ""; + } + resultCode = "0"; + resultMessage = "成功"; + } catch (JSONException e) { + resultMessage = "数据格式有误"; + e.printStackTrace(); + } catch (Exception e) { + resultMessage = "后台报错"; + e.printStackTrace(); + } + }else{ + resultMessage = "入参数据为空"; + } + return " " + resultCode + " " + resultMessage + ""; + } + + @Override + @WebMethod + public String dealUser(String xmlData) { + logger.error("调用接口推送用户数据xmlData="+xmlData); + String resultCode = "1"; + String resultMessage = ""; + if (StringUtils.isNotBlank(xmlData)) { + try { + xmlData = fomartParam(xmlData); + XMLSerializer xmlSerializer = new XMLSerializer(); + JSONObject json = (JSONObject) xmlSerializer.read(xmlData); + if(json == null){ + resultMessage = "入参格式不正确"; + return " " + resultCode + " " + resultMessage + ""; + } + Object msg = json.opt("Msg"); + if(msg == null){ + resultMessage = "未找到"; + return " " + resultCode + " " + resultMessage + ""; + } + + if(msg instanceof JSONObject){ + JSONObject useJsonObject = (JSONObject)msg; + UserVo vo = new UserVo(); + vo.setCoding(useJsonObject.optString("STAFF_CODE")); + vo.setName(useJsonObject.optString("STAFF_NAME")); + vo.setOrgUnitCoding(useJsonObject.optString("SUBOR_DEPT_CODE")); + UserVo[] allVos = {vo}; + logger.debug(JSONArray.fromObject(allVos)); + dataSynchronizationManager.processSyncUserData(allVos); + }else{ + resultMessage = "用户数据格式不正确"; + return " " + resultCode + " " + resultMessage + ""; + } + resultCode = "0"; + resultMessage = "成功"; + } catch (JSONException e) { + resultMessage = "数据格式有误"; + e.printStackTrace(); + } catch (Exception e) { + resultMessage = "后台报错"; + e.printStackTrace(); + } + }else{ + resultMessage = "入参数据为空"; + } + return " " + resultCode + " " + resultMessage + ""; + } + + /** + * 文本格式化 + * @param str + * @return + */ + private String fomartParam(String str) { + Pattern p = Pattern.compile("\\s*|\t|\r|\n"); + Matcher m = p.matcher(str); + return m.replaceAll(""); + } + +} Index: ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/szhzyy/MQHelper.java =================================================================== diff -u --- ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/szhzyy/MQHelper.java (revision 0) +++ ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/szhzyy/MQHelper.java (revision 28726) @@ -0,0 +1,635 @@ +package com.forgon.disinfectsystem.mq.dao.szhzyy; + +import java.io.File; +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Comparator; +import java.util.Date; +import java.util.LinkedList; +import java.util.List; + +import net.sf.json.JSON; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.log4j.Logger; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.DocumentHelper; +import org.dom4j.Node; +import org.dom4j.XPath; +import org.dom4j.io.SAXReader; + +import com.forgon.disinfectsystem.common.CssdUtils; +import com.forgon.disinfectsystem.datasynchronization.model.OrgUnitVo; +import com.forgon.disinfectsystem.datasynchronization.model.PatientInfoVO; +import com.forgon.disinfectsystem.datasynchronization.model.UserVo; +import com.forgon.tools.date.DateTools; + +/** + * MQ队列帮助类 + * @author zhouPeiMian + * @since 2020-08-11 + * + */ +public class MQHelper { + + private static Logger logger = Logger.getLogger(MQHelper.class); + + /** + * 获取入院病人信息(深圳禾正医院) + * 需要发送带有住院号的xml消息到平台,然后平台再返回对应的住院病人信息 + * @return + * @throws Exception + */ + @SuppressWarnings("unchecked") + public static PatientInfoVO[] getHospitalPatientMessage(String HospitalNumber) { + // 查询消息 + /* 消息内容如下: + * + + 1 + XG + 123456 + BS35008 + + + BS35008 + S17 + S00 + 2019-05-25 14:00:0 + + + 0 + 500 + + + + + // + + + + + + + */ + if (StringUtils.isBlank(HospitalNumber)) { + logger.debug("住院号为空!"); + return null; + } + //请求响应消费方:一次请求,一条响应 或者 推送发送方:一次推送,一条推送结果(EHSB平台提供的平台接入方法) + logger.debug("开始查询并解析手术申请单住院病人信息"); + String fid = "BS10001"; + String Req = "1XDGYS123456" + fid + "" + + "" + fid + "S16S00" + DateTools.getCurrentDayByFormat("yyyy-MM-dd HH:mm:ss")+ "" + + "0500" + + "" + + ""; + logger.debug("请求信息:" + Req); + String responce = null; + try { + SDKCaller sc = new SDKCaller("QMGR.S16_1") { + @Override + public Object OnMessage(String msg, String msgid) { + return null; + } + }; + responce = sc.putReqAndGetResp(fid, Req, 15); + logger.debug("成功接收住院病人信息:" + responce); + } catch (Exception e) { + e.printStackTrace(); + logger.debug("连接消息队列失败!" + e); + } + if (StringUtils.isNotBlank(responce)) { + // 开始解析 + try { + Document doc = DocumentHelper.parseText(responce); + String RetConXpath = "/ESBEntry/RetInfo/RetCon"; // 查询结果返回状态 + String RetCon = processDataByXpath(doc, RetConXpath); + if ("查询成功".equals(RetCon)) { + // 解析住院病人信息并入库 + String MsgXpath = "/ESBEntry/MsgInfo/Msg"; // 返回结果可能存在多条住院病人信息 + XPath xpath = doc.createXPath(MsgXpath); + List nodeList2 = xpath.selectNodes(doc, xpath); + if (nodeList2 != null && nodeList2.size() > 0) { + List patientInfoVOList = new LinkedList(); + // 解析返回信息中所有住院病人信息 + for (int i = 1; i <= nodeList2.size(); i++) { + String msgXpath = "/ESBEntry/MsgInfo/Msg[" + i + "]"; + String patientInfo = processDataByXpath(doc, msgXpath); // 住院病人信息 + if (StringUtils.isNotBlank(patientInfo)) { + Document document = DocumentHelper.parseText(patientInfo); + // 解析住院病人信息并入库 + String hospitalNumberXpath = "/msg/body/row/MR_NO"; + String serialNumberXpath = "/msg/body/row/INHOSP_NO"; + String patientNameXpath = "/msg/body/row/PAT_NAME"; + String patientBirthdayXpath = "/msg/body/row/DATE_BIRTH"; + String patientSexXpath = "/msg/body/row/PHYSI_SEX_NAME"; + String patientIDCardXpath = "/msg/body/row/ID_NUMBER"; + String doctorNameXpath = "/msg/body/row/APPLY_DR_NAME"; + String operationXpath = "/msg/body/row/SURGERY_OPER_NAME"; + String operationTimeXpath = "/msg/body/row/SURGERY_APPLY_DATE"; + String patientAreaXpath = "/msg/body/row/WARD_NAME"; + String ascriptionDepartmentXpath = "/msg/body/row/APPLY_DEPT_NAME"; + String roomNumberXpath = null; // 没有对应的房间号字段 + String bedNumberXpath = "/msg/body/row/BED_INDEX_NO"; + String remarkXpath = "/msg/body/row/NOTE"; + String visitDateXpath = "/msg/body/row/RECORD_DATE"; + + String hospitalNumber = processDataByXpath(document, hospitalNumberXpath); + String serialNumber = processDataByXpath(document, serialNumberXpath); + String patientName = processDataByXpath(document, patientNameXpath); + String patientBirthday = processDataByXpath(document, patientBirthdayXpath); + String patientSex = processDataByXpath(document, patientSexXpath); + String patientIDCard = processDataByXpath(document, patientIDCardXpath); + String doctorName = processDataByXpath(document, doctorNameXpath); + String operation = processDataByXpath(document, operationXpath); + String operationTime = processDataByXpath(document, operationTimeXpath); + String patientArea = processDataByXpath(document, patientAreaXpath); + String ascriptionDepartment = processDataByXpath(document, ascriptionDepartmentXpath); + String roomNumber = processDataByXpath(document, roomNumberXpath); + String bedNumber = processDataByXpath(document, bedNumberXpath); + String remark = processDataByXpath(document, remarkXpath); + String visitDate = processDataByXpath(document, visitDateXpath); // 记录录入时间 + if (StringUtils.isNotBlank(visitDate)) { + visitDate = visitDate.replace("T", " "); + } + if (StringUtils.isNotBlank(patientBirthday)) { + patientBirthday = patientBirthday.replace("T", " "); + } + + PatientInfoVO patientInfoVO = new PatientInfoVO(); + patientInfoVO.setHospitalNumber(hospitalNumber); + patientInfoVO.setSerialNumber(serialNumber); + patientInfoVO.setPatientName(patientName); + patientInfoVO.setPatientAge(birthdayToAge(patientBirthday)); + patientInfoVO.setPatientSex(patientSex); + patientInfoVO.setPatientIDCard(patientIDCard); + patientInfoVO.setDoctorName(doctorName); + patientInfoVO.setOperation(operation); + patientInfoVO.setOperationTime(operationTime); + patientInfoVO.setPatientArea(patientArea); + patientInfoVO.setAscriptionDepartment(ascriptionDepartment); + patientInfoVO.setRoomNumber(roomNumber); + patientInfoVO.setBedNumber(bedNumber); + patientInfoVO.setRemark(remark); + patientInfoVO.setVisitDate(visitDate); + + if (!checkObjAllFieldsIsNull(patientInfoVO)) { + patientInfoVOList.add(patientInfoVO); + } + } + } + if (CollectionUtils.isNotEmpty(patientInfoVOList)) { + // 根据记录录入时间visitDate排序,只取最新记录 + patientInfoVOList.sort(new Comparator() { + @Override + public int compare(PatientInfoVO o1, PatientInfoVO o2) { + if (StringUtils.isBlank(o1.getVisitDate()) && StringUtils.isNotBlank(o2.getVisitDate())) { + return -1; + } + if (StringUtils.isBlank(o2.getVisitDate()) && StringUtils.isNotBlank(o1.getVisitDate())) { + return 1; + } + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + try { + Date date1 = sdf.parse(o1.getVisitDate()); + Date date2 = sdf.parse(o2.getVisitDate()); + return date2.compareTo(date1); + } catch (ParseException e) { + logger.debug("住院病人信息排序出错(录入时间【RECORD_DATE】字段格式错误)!"); + e.printStackTrace(); + } + return 0; + } + }); + // 只取最新录入的一条记录 + PatientInfoVO[] patientInfoArray = {patientInfoVOList.get(0)}; + logger.debug("完成解析住院病人信息,住院号为:" + patientInfoVOList.get(0).getHospitalNumber()); + return patientInfoArray; + } + } else { + logger.debug("查询返回的数据不包含住院病人信息!"); + return null; + } + } else { + logger.debug("查询失败!【RetCon】 = " + RetCon); + return null; + } + } catch (Exception e) { + e.printStackTrace(); + } + } else { + logger.debug("查询住院病人信息失败,未找到住院号为:【" + HospitalNumber + "】的住院病人信息!"); + return null; + } + logger.debug("查询失败!"); + return null; + } + + /** + * 获取非手术住院病人信息 + * @param HospitalNumber + * @return + */ + @SuppressWarnings("unchecked") + public static PatientInfoVO[] getNonoperativeHospitalPatientMessage(String HospitalNumber) { + if (StringUtils.isBlank(HospitalNumber)) { + logger.debug("住院号为空!"); + return null; + } + //请求响应消费方:一次请求,一条响应 或者 推送发送方:一次推送,一条推送结果(EHSB平台提供的平台接入方法) + logger.debug("开始查询并解析非手术住院病人信息"); + String fid = "BS10001"; + String Req = "XDGYS1234561" + fid + "" + + "" + fid + "S16S00" + DateTools.getCurrentDayByFormat("yyyy-MM-dd HH:mm:ss")+ "" + + "0500" + + "" + + ""; + logger.debug("请求信息:" + Req); + String responce = null; + try { + SDKCaller sc = new SDKCaller("QMGR.S16_1") { + @Override + public Object OnMessage(String msg, String msgid) { + return null; + } + }; + responce = sc.putReqAndGetResp(fid, Req, 15); + logger.debug("成功接收住院病人信息:" + responce); + } catch (Exception e) { + e.printStackTrace(); + logger.debug("连接消息队列失败!" + e); + } + if (StringUtils.isNotBlank(responce)) { + // 开始解析 + try { + Document doc = DocumentHelper.parseText(responce); + String RetConXpath = "/ESBEntry/RetInfo/RetCon"; // 查询结果返回状态 + String RetCon = processDataByXpath(doc, RetConXpath); + if ("查询成功".equals(RetCon)) { + // 解析住院病人信息并入库 + String MsgXpath = "/ESBEntry/MsgInfo/Msg"; // 返回结果可能存在多条住院病人信息 + XPath xpath = doc.createXPath(MsgXpath); + List nodeList2 = xpath.selectNodes(doc, xpath); + if (nodeList2 != null && nodeList2.size() > 0) { + List patientInfoVOList = new LinkedList(); + // 解析返回信息中所有住院病人信息 + for (int i = 1; i <= nodeList2.size(); i++) { + String msgXpath = "/ESBEntry/MsgInfo/Msg[" + i + "]"; + String patientInfo = processDataByXpath(doc, msgXpath); // 住院病人信息 + if (StringUtils.isNotBlank(patientInfo)) { + Document document = DocumentHelper.parseText(patientInfo); + // 解析住院病人信息并入库 + String patientIDCardXpath = "/msg/body/row/ID_NUMBER"; + String patientNameXpath = "/msg/body/row/PAT_NAME"; + String patientSexXpath = "/msg/body/row/PHYSI_SEX_NAME"; + String patientBirthdayXpath = "/msg/body/row/DATE_BIRTH"; + String hospitalNumberXpath = "/msg/body/row/MR_NO"; + String serialNumberXpath = "/msg/body/row/INHOSP_NO"; + String operationXpath = "/msg/body/row/ADMIT_DIAG_NAME"; + String patientAreaXpath = "/msg/body/row/CURR_DEPT_NAME"; + String doctorNameXpath = "/msg/body/row/ATTEND_DR_NAME"; + String visitDateXpath = "/msg/body/row/ADMIT_DATE"; + + String hospitalNumber = processDataByXpath(document, hospitalNumberXpath); + String serialNumber = processDataByXpath(document, serialNumberXpath); + String patientName = processDataByXpath(document, patientNameXpath); + String patientBirthday = processDataByXpath(document, patientBirthdayXpath); + String patientSex = processDataByXpath(document, patientSexXpath); + String patientIDCard = processDataByXpath(document, patientIDCardXpath); + String doctorName = processDataByXpath(document, doctorNameXpath); + String operation = processDataByXpath(document, operationXpath); + String patientArea = processDataByXpath(document, patientAreaXpath); + String visitDate = processDataByXpath(document, visitDateXpath); // 记录录入时间 + if (StringUtils.isNotBlank(visitDate)) { + visitDate = visitDate.replace("T", " "); + } + if (StringUtils.isNotBlank(patientBirthday)) { + patientBirthday = patientBirthday.replace("T", " "); + } + + PatientInfoVO patientInfoVO = new PatientInfoVO(); + patientInfoVO.setHospitalNumber(hospitalNumber); + patientInfoVO.setSerialNumber(serialNumber); + patientInfoVO.setPatientName(patientName); + patientInfoVO.setPatientAge(birthdayToAge(patientBirthday)); + patientInfoVO.setPatientSex(patientSex); + patientInfoVO.setPatientIDCard(patientIDCard); + patientInfoVO.setDoctorName(doctorName); + patientInfoVO.setOperation(operation); + patientInfoVO.setPatientArea(patientArea); + patientInfoVO.setVisitDate(visitDate); + + if (!checkObjAllFieldsIsNull(patientInfoVO)) { + patientInfoVOList.add(patientInfoVO); + } + } + } + if (CollectionUtils.isNotEmpty(patientInfoVOList)) { + // 根据记录录入时间visitDate排序,只取最新记录 + patientInfoVOList.sort(new Comparator() { + @Override + public int compare(PatientInfoVO o1, PatientInfoVO o2) { + if (StringUtils.isBlank(o1.getVisitDate()) && StringUtils.isNotBlank(o2.getVisitDate())) { + return -1; + } + if (StringUtils.isBlank(o2.getVisitDate()) && StringUtils.isNotBlank(o1.getVisitDate())) { + return 1; + } + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + try { + Date date1 = sdf.parse(o1.getVisitDate()); + Date date2 = sdf.parse(o2.getVisitDate()); + return date2.compareTo(date1); + } catch (ParseException e) { + logger.debug("住院病人信息排序出错(录入时间【RECORD_DATE】字段格式错误)!"); + e.printStackTrace(); + } + return 0; + } + }); + // 只取最新录入的一条记录 + PatientInfoVO[] patientInfoArray = {patientInfoVOList.get(0)}; + logger.debug("完成解析住院病人信息,住院号为:" + patientInfoVOList.get(0).getHospitalNumber()); + return patientInfoArray; + } + } else { + logger.debug("查询返回的数据不包含住院病人信息!"); + return null; + } + } else { + logger.debug("查询失败!【RetCon】 = " + RetCon); + return null; + } + } catch (Exception e) { + e.printStackTrace(); + } + } else { + logger.debug("查询住院病人信息失败,未找到住院号为:【" + HospitalNumber + "】的住院病人信息!"); + return null; + } + logger.debug("查询失败!"); + return null; + } + + /** + * 获取门诊病人信息 + * @param ClinicNumber + * @return + */ + @SuppressWarnings("unchecked") + public static PatientInfoVO[] getClinicPatientMessage(String ClinicNumber) { + if (StringUtils.isBlank(ClinicNumber)) { + logger.debug("诊疗号为空!"); + return null; + } + //请求响应消费方:一次请求,一条响应 或者 推送发送方:一次推送,一条推送结果(EHSB平台提供的平台接入方法) + logger.debug("开始查询并解析门诊病人信息"); + String fid = "BS10001"; + String Req = "XDGYS1234561" + fid + "" + + "" + fid + "S16S00" + DateTools.getCurrentDayByFormat("yyyy-MM-dd HH:mm:ss")+ "" + + "0500" + + "" + + ""; + logger.debug("请求信息:" + Req); + String responce = null; + try { + SDKCaller sc = new SDKCaller("QMGR.S16_1") { + @Override + public Object OnMessage(String msg, String msgid) { + return null; + } + }; + responce = sc.putReqAndGetResp(fid, Req, 15); + logger.debug("成功接收门诊病人信息:" + responce); + } catch (Exception e) { + e.printStackTrace(); + logger.debug("连接消息队列失败!" + e); + } + if (StringUtils.isNotBlank(responce)) { + // 开始解析 + try { + Document doc = DocumentHelper.parseText(responce); + String RetConXpath = "/ESBEntry/RetInfo/RetCon"; // 查询结果返回状态 + String RetCon = processDataByXpath(doc, RetConXpath); + if ("查询成功".equals(RetCon)) { + // 解析门诊病人信息并入库 + String MsgXpath = "/ESBEntry/MsgInfo/Msg"; // 返回结果可能存在多条门诊病人信息 + XPath xpath = doc.createXPath(MsgXpath); + List nodeList2 = xpath.selectNodes(doc, xpath); + if (nodeList2 != null && nodeList2.size() > 0) { + List patientInfoVOList = new LinkedList(); + // 解析返回信息中所有门诊病人信息 + for (int i = 1; i <= nodeList2.size(); i++) { + String msgXpath = "/ESBEntry/MsgInfo/Msg[" + i + "]"; + String patientInfo = processDataByXpath(doc, msgXpath); // 门诊病人信息 + if (StringUtils.isNotBlank(patientInfo)) { + Document document = DocumentHelper.parseText(patientInfo); + // 解析门诊病人信息并入库 + String clinicNumberXpath = "/msg/body/row/OUTHOSP_INDEX_NO"; + String serialNumberXpath = "/msg/body/row/OUTHOSP_NO"; + String patientNameXpath = "/msg/body/row/PAT_NAME"; + String patientBirthdayXpath = "/msg/body/row/DATE_BIRTH"; + String patientSexXpath = "/msg/body/row/PHYSI_SEX_NAME"; + String patientIDCardXpath = "/msg/body/row/ID_NUMBER"; + String doctorNameXpath = "/msg/body/row/RECEPT_TREAT_DR_NAME"; + String operationXpath = "/msg/body/row/OUTHOSP_DIAG_NAME"; + String patientAreaXpath = "/msg/body/row/VISIT_DEPT_NAME"; + String visitDateXpath = "/msg/body/row/VISIT_DATE"; + + String clinicNumber = processDataByXpath(document, clinicNumberXpath); + String serialNumber = processDataByXpath(document, serialNumberXpath); + String patientName = processDataByXpath(document, patientNameXpath); + String patientBirthday = processDataByXpath(document, patientBirthdayXpath); + String patientSex = processDataByXpath(document, patientSexXpath); + String patientIDCard = processDataByXpath(document, patientIDCardXpath); + String doctorName = processDataByXpath(document, doctorNameXpath); + String operation = processDataByXpath(document, operationXpath); + String patientArea = processDataByXpath(document, patientAreaXpath); + String visitDate = processDataByXpath(document, visitDateXpath); // 记录录入时间 + if (StringUtils.isNotBlank(visitDate)) { + visitDate = visitDate.replace("T", " "); + } + if (StringUtils.isNotBlank(patientBirthday)) { + patientBirthday = patientBirthday.replace("T", " "); + } + + PatientInfoVO patientInfoVO = new PatientInfoVO(); + patientInfoVO.setClinicNumber(clinicNumber); + patientInfoVO.setSerialNumber(serialNumber); + patientInfoVO.setPatientName(patientName); + patientInfoVO.setPatientAge(birthdayToAge(patientBirthday)); + patientInfoVO.setPatientSex(patientSex); + patientInfoVO.setPatientIDCard(patientIDCard); + patientInfoVO.setDoctorName(doctorName); + patientInfoVO.setOperation(operation); + patientInfoVO.setPatientArea(patientArea); + patientInfoVO.setVisitDate(visitDate); + + if (!checkObjAllFieldsIsNull(patientInfoVO)) { + patientInfoVOList.add(patientInfoVO); + } + } + } + if (CollectionUtils.isNotEmpty(patientInfoVOList)) { + // 根据记录录入时间visitDate排序,只取最新记录 + patientInfoVOList.sort(new Comparator() { + @Override + public int compare(PatientInfoVO o1, PatientInfoVO o2) { + if (StringUtils.isBlank(o1.getVisitDate()) && StringUtils.isNotBlank(o2.getVisitDate())) { + return -1; + } + if (StringUtils.isBlank(o2.getVisitDate()) && StringUtils.isNotBlank(o1.getVisitDate())) { + return 1; + } + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + try { + Date date1 = sdf.parse(o1.getVisitDate()); + Date date2 = sdf.parse(o2.getVisitDate()); + return date2.compareTo(date1); + } catch (ParseException e) { + logger.debug("门诊病人信息排序出错(录入时间【VISIT_DATE】字段格式错误)!"); + e.printStackTrace(); + } + return 0; + } + }); + // 只取最新录入的一条记录 + PatientInfoVO[] patientInfoArray = {patientInfoVOList.get(0)}; + logger.debug("完成解析门诊病人信息,诊疗号为:" + patientInfoVOList.get(0).getClinicNumber()); + return patientInfoArray; + } + } else { + logger.debug("查询返回的数据不包含门诊病人信息!"); + return null; + } + } else { + logger.debug("查询失败!【RetCon】 = " + RetCon); + return null; + } + } catch (Exception e) { + e.printStackTrace(); + } + } else { + logger.debug("查询门诊病人信息失败,未找到诊疗号为:【" + ClinicNumber + "】的门诊病人信息!"); + return null; + } + logger.debug("查询失败!"); + return null; + } + + /** + * 获取组织机构消息 + * @return + */ + public static OrgUnitVo[] getOrgUnitMessage() { + 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: ssts-webservice/src/main/java/com/forgon/disinfectsystem/webservice/datasync/szhzyy/OrgUserDataWebServiceManager.java =================================================================== diff -u --- ssts-webservice/src/main/java/com/forgon/disinfectsystem/webservice/datasync/szhzyy/OrgUserDataWebServiceManager.java (revision 0) +++ ssts-webservice/src/main/java/com/forgon/disinfectsystem/webservice/datasync/szhzyy/OrgUserDataWebServiceManager.java (revision 28726) @@ -0,0 +1,95 @@ +package com.forgon.disinfectsystem.webservice.datasync.szhzyy; + +import javax.jws.WebMethod; +import javax.jws.WebParam; +import javax.jws.WebService; + +/** + * 科室人员数据webserivce + * @author zhoupeimian + * @since 2020-08-11 + * + */ +@WebService +public interface OrgUserDataWebServiceManager { + + /** + * 调用接口推送科室数据 + * @param xmlData 入参: + + + + + + + + + + + + + + + ... ... + + + + + * @return 出参: + * + + + 0/1 + + 成功/失败原因描述 + + + * + */ + @WebMethod + public String dealOrgUnit(@WebParam(name = "xmlData") String xmlData); + + /** + * 调用接口推送人员数据 + * @param xmlData 入参: + + + + + + + + + + + + + + + + + + + + + ... ... + + + + + + + * @return 出参: + * + + + 0/1 + + 成功/失败原因描述 + + + */ + @WebMethod + public String dealUser(@WebParam(name = "xmlData") String xmlData); + +} Index: ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/bjcylyy/SDKCaller.java =================================================================== diff -u -r26566 -r28726 --- ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/bjcylyy/SDKCaller.java (.../SDKCaller.java) (revision 26566) +++ ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/bjcylyy/SDKCaller.java (.../SDKCaller.java) (revision 28726) @@ -47,6 +47,9 @@ } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); } return Resp; } @@ -73,6 +76,9 @@ } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); } while(true){ @@ -87,7 +93,10 @@ } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); - } + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } } } Index: ssts-web/src/main/webapp/disinfectsystem/config/szhzyy/spring/webservice-cxf.xml =================================================================== diff -u --- ssts-web/src/main/webapp/disinfectsystem/config/szhzyy/spring/webservice-cxf.xml (revision 0) +++ ssts-web/src/main/webapp/disinfectsystem/config/szhzyy/spring/webservice-cxf.xml (revision 28726) @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + \ No newline at end of file Index: ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/stdxfsdyyy/SDKCaller.java =================================================================== diff -u -r27793 -r28726 --- ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/stdxfsdyyy/SDKCaller.java (.../SDKCaller.java) (revision 27793) +++ ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/stdxfsdyyy/SDKCaller.java (.../SDKCaller.java) (revision 28726) @@ -47,6 +47,9 @@ } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); } return Resp; } @@ -73,6 +76,9 @@ } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); } while(true){ @@ -87,6 +93,9 @@ } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); } } Index: ssts-web/build.gradle =================================================================== diff -u -r27959 -r28726 --- ssts-web/build.gradle (.../build.gradle) (revision 27959) +++ ssts-web/build.gradle (.../build.gradle) (revision 28726) @@ -305,7 +305,8 @@ // 排除lib和classes文件夹,因为war命令会把src\main\java和src\main\resources的所有文件打包进war文件 // 如果不排除,会导致war包内的文件重复 exclude 'WEB-INF/lib/*' - exclude 'WEB-INF/classes/**' + // 排除WEB-INF/classes/目录下的文件 + exclude 'WEB-INF/classes/*.*' // 排除各项目的定制文件,本项目需要的文件已经拷贝为web.xml exclude 'WEB-INF/web-*.xml' @@ -316,6 +317,14 @@ } } + // 排除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 + '/**' + } + } + } def cleanDir_Method(){ @@ -372,6 +381,22 @@ } */ + // 拷贝各项目的esbmq-config.xml,到/src/main/webapp/disinfectsystem/config/" + projectName + "/interfaces/mqConfig/目录下 + def mqConfigFileSource = webProjectDir + "/src/main/webapp/disinfectsystem/config/" + projectName + "/interfaces/mqConfig/esbmq-config.xml" + def mqConfigFileDirTarget = webAppClassesDir + "/mqConfig"; + def existFile = new File(mqConfigFileSource).exists(); + if(existFile){ + println "拷贝esbmq-config.xml到" + mqConfigFileDirTarget; + file = new File(mqConfigFileDirTarget); + if (!file.exists()) { + file.mkdir(); + } + copy { + from mqConfigFileSource + into mqConfigFileDirTarget + } + } + } def copyToWebappClasses_Method(){ Index: ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/szhzyy/SDKCaller.java =================================================================== diff -u --- ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/szhzyy/SDKCaller.java (revision 0) +++ ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/szhzyy/SDKCaller.java (revision 28726) @@ -0,0 +1,126 @@ +package com.forgon.disinfectsystem.mq.dao.szhzyy; + +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(); + } catch (Exception 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(); + } catch (Exception 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(); + } catch (Exception 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-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/szhzyy/MQDataDaoImpl.java =================================================================== diff -u --- ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/szhzyy/MQDataDaoImpl.java (revision 0) +++ ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/mq/dao/szhzyy/MQDataDaoImpl.java (revision 28726) @@ -0,0 +1,144 @@ +package com.forgon.disinfectsystem.mq.dao.szhzyy; + +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) { + // 从“非手术住院病人接口”同步数据 + PatientInfoVO[] patientInfoVOArray = MQHelper.getNonoperativeHospitalPatientMessage(hospitalNum); + //} + // 保存到数据库 + if (null != patientInfoVOArray && patientInfoVOArray.length > 0) { + try { + for (PatientInfoVO patientInfoVO : patientInfoVOArray) { + PatientAdmissionInfo patientAdmissionInfo = new PatientAdmissionInfo(); + patientAdmissionInfo.setHospitalNumber(patientInfoVO.getHospitalNumber()); + patientAdmissionInfo.setHospitalSerialNumber(patientInfoVO.getPatientNumber()); + patientAdmissionInfo.setTreatmentNum(patientInfoVO.getClinicNumber()); + patientAdmissionInfo.setPatientName(patientInfoVO.getPatientName()); + patientAdmissionInfo.setPatientAge(patientInfoVO.getPatientAge()); + patientAdmissionInfo.setPatientSex(patientInfoVO.getPatientSex()); + patientAdmissionInfo.setPatientIDCard(patientInfoVO.getPatientIDCard()); + patientAdmissionInfo.setPatientArea(patientInfoVO.getPatientArea()); + patientAdmissionInfo.setRoomNumber(patientInfoVO.getRoomNumber()); + patientAdmissionInfo.setBedNumber(patientInfoVO.getBedNumber()); + patientAdmissionInfo.setOrgunitId(null); + patientAdmissionInfo.setOrgunitName(patientInfoVO.getAscriptionDepartment()); + patientAdmissionInfo.setDoctorName(patientInfoVO.getDoctorName()); + patientAdmissionInfo.setSurgeryName(patientInfoVO.getOperation()); + patientAdmissionInfo.setTime(new Date()); + if (StringUtils.isNotBlank(patientInfoVO.getOperationTime())) { + //2019-06-26T10:25:40 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date inDate; + inDate = sdf.parse(patientInfoVO.getOperationTime().replace('T', ' ').trim()); + patientAdmissionInfo.setInDate(inDate); + } + if(StringUtils.isNotBlank(patientInfoVO.getVisitAmount())) { + patientAdmissionInfo.setVisitAmount(Long.parseLong(patientInfoVO.getVisitAmount())); + } + objectDao.saveOrUpdate(patientAdmissionInfo); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + return patientInfoVOArray; + } + + @Override + public PatientInfoVO[] syncMqPatientInfoByTreatmentNum(String treatmentNum) { + PatientInfoVO[] patientInfoVOArray = MQHelper.getClinicPatientMessage(treatmentNum); + if (patientInfoVOArray != null && patientInfoVOArray.length > 0) { + try { + for (PatientInfoVO patientInfoVO : patientInfoVOArray) { + PatientAdmissionInfo patientAdmissionInfo = new PatientAdmissionInfo(); + patientAdmissionInfo.setHospitalNumber(patientInfoVO.getHospitalNumber()); + patientAdmissionInfo.setHospitalSerialNumber(patientInfoVO.getPatientNumber()); + patientAdmissionInfo.setTreatmentNum(patientInfoVO.getClinicNumber()); + patientAdmissionInfo.setPatientName(patientInfoVO.getPatientName()); + patientAdmissionInfo.setPatientAge(patientInfoVO.getPatientAge()); + patientAdmissionInfo.setPatientSex(patientInfoVO.getPatientSex()); + patientAdmissionInfo.setPatientIDCard(patientInfoVO.getPatientIDCard()); + patientAdmissionInfo.setPatientArea(patientInfoVO.getPatientArea()); + patientAdmissionInfo.setRoomNumber(patientInfoVO.getRoomNumber()); + patientAdmissionInfo.setBedNumber(patientInfoVO.getBedNumber()); + patientAdmissionInfo.setOrgunitId(null); + patientAdmissionInfo.setOrgunitName(patientInfoVO.getAscriptionDepartment()); + patientAdmissionInfo.setDoctorName(patientInfoVO.getDoctorName()); + patientAdmissionInfo.setSurgeryName(patientInfoVO.getOperation()); + patientAdmissionInfo.setTime(new Date()); + if (StringUtils.isNotBlank(patientInfoVO.getOperationTime())) { + //2019-06-26T10:25:40 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date inDate; + inDate = sdf.parse(patientInfoVO.getOperationTime().replace('T', ' ').trim()); + patientAdmissionInfo.setInDate(inDate); + } + if(StringUtils.isNotBlank(patientInfoVO.getVisitAmount())) { + patientAdmissionInfo.setVisitAmount(Long.parseLong(patientInfoVO.getVisitAmount())); + } + objectDao.saveOrUpdate(patientAdmissionInfo); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + return patientInfoVOArray; + } + +} Index: localrepo/com.ibm.mq/MQSDK1.6/3.0.1/MQSDK1.6-3.0.1.jar =================================================================== diff -u -r26566 -r28726 Binary files differ Index: ssts-web/src/main/webapp/disinfectsystem/config/szhzyy/interfaces/mqConfig/esbmq-config.xml =================================================================== diff -u --- ssts-web/src/main/webapp/disinfectsystem/config/szhzyy/interfaces/mqConfig/esbmq-config.xml (revision 0) +++ ssts-web/src/main/webapp/disinfectsystem/config/szhzyy/interfaces/mqConfig/esbmq-config.xml (revision 28726) @@ -0,0 +1,26 @@ + + + + + + 192.168.1.241 + + 5016 + + QMGR.S16_1 + + C.S16.C + + 1381 + + 1392 + + D:\test + + + EQ.S16.BS10001.PUT + EQ.S16.BS10001.GET + + + + \ No newline at end of file Index: ssts-web/src/main/webapp/disinfectsystem/config/szhzyy/spring/HIS.xml =================================================================== diff -u -r28698 -r28726 --- ssts-web/src/main/webapp/disinfectsystem/config/szhzyy/spring/HIS.xml (.../HIS.xml) (revision 28698) +++ ssts-web/src/main/webapp/disinfectsystem/config/szhzyy/spring/HIS.xml (.../HIS.xml) (revision 28726) @@ -116,4 +116,8 @@ + + + + \ No newline at end of file