Index: ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/szszyy/FindPatientInfoByTreatmentNumDaoImpl.java =================================================================== diff -u --- ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/szszyy/FindPatientInfoByTreatmentNumDaoImpl.java (revision 0) +++ ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/szszyy/FindPatientInfoByTreatmentNumDaoImpl.java (revision 31676) @@ -0,0 +1,192 @@ +package com.forgon.disinfectsystem.datasynchronization.dao.szszyy; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.Date; +import java.util.List; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.log4j.Logger; +import org.dom4j.Document; +import org.dom4j.DocumentHelper; +import org.dom4j.Node; +import org.dom4j.XPath; + +import com.forgon.disinfectsystem.datasynchronization.dao.FindPatientInfoByTreatmentNumDao; +import com.forgon.disinfectsystem.datasynchronization.model.PatientInfoVO; +import com.forgon.tools.db.DatabaseUtil; + +/** + * 根据诊疗号查询病人信息(深圳市中医院) + * @author ZhouPeiMian + * @since 2021-07-27 + * + */ +public class FindPatientInfoByTreatmentNumDaoImpl implements + FindPatientInfoByTreatmentNumDao { + + Logger logger = Logger.getLogger(FindPatientInfoByTreatmentNumDaoImpl.class); + + @Override + public PatientInfoVO[] findPatientInfoByTreatmentNum(String clinicNumber) { + try { + String soapXml = WebServiceClientHelper.buildInputStr(DatasyncConstant.FunctionName_MZ, clinicNumber); + logger.info("门诊病人信息同步接口请求信息:" + soapXml); + String endpoint = DatasyncConstant.WebserviceAddress; + String targetNamespace = "http://www.dhcc.com.cn"; + String soapActionURI = "http://www.dhcc.com.cn/DHC.Published.PUB0016.BS.PUB0016.HIPMessageServer"; + String method = "HIPMessageServer"; + String paramName1 = "input1"; + String paramName2 = "input2"; + String encodingStyle = "utf-8"; + String result = WebServiceClientHelper.axisInvokeWebservice(endpoint, targetNamespace, soapActionURI, method, paramName1, paramName2, DatasyncConstant.FunctionName_MZ, soapXml, encodingStyle); + logger.info("门诊病人信息同步接口返回信息:" + result); + /*String result = "" + + "0" + + "成功" + + "" + + "" + + "03179318" + + "杨利仲" + + "21岁9月20天" + + "" + + "" + + "孙志涛" + + "急诊外科" + + "" + + "2017-08-03" + + "13634557" + + "" + + "" + + "" + + ""; + logger.info("门诊病人信息同步接口返回信息:" + result);*/ + logger.info("病人信息同步接口返回信息:" + result); + int startIndex = result.indexOf(""); + if(startIndex == -1){ + logger.info("门诊病人接口返回信息没有标签!"); + return null; + } + int endIndex = result.indexOf(""); + if(endIndex == -1 || endIndex < startIndex){ + logger.info("门诊病人接口返回信息没有标签"); + return null; + } + String xmlString = result.substring(startIndex + "".length(), endIndex); + if(StringUtils.isBlank(xmlString)){ + logger.info("门诊病人接口返回信息为空!" + xmlString); + return null; + } + xmlString = "" + xmlString + ""; + Document document = DocumentHelper.parseText(xmlString); + // 查询结果 + String resultCodeXpath = "/Response/ResultCode"; + String resultCotentXpath = "/Response/ResultCotent"; + String resultCode = WebServiceClientHelper.processDataByXpath(document, resultCodeXpath); + String resultCotent = WebServiceClientHelper.processDataByXpath(document, resultCotentXpath); + if(!StringUtils.equals(resultCode, DatasyncConstant.SuccessCode)){ + logger.info("门诊病人接口查询失败:" + resultCotent); + return null; + } + String itemXpath = "/Response/items/item"; // 返回结果可能存在多条门诊病人信息 + XPath xpath = document.createXPath(itemXpath); + @SuppressWarnings("unchecked") + List nodeList = xpath.selectNodes(document, xpath); + if(CollectionUtils.isNotEmpty(nodeList)){ + List patientInfoVOList = new ArrayList(); + for (int i = 1; i <= nodeList.size(); i++) { + String msgXpath = "/Response/items/item[" + i + "]"; + // 门诊号 + String clinicNumberXpath = msgXpath + "/clinicNumber"; + // 病人姓名 + String patientNameXpath = msgXpath + "/patientName"; + // 病人年龄 + String patientAgeXpath = msgXpath + "/patientAge"; + // 病人性别 + String patientSexXpath = msgXpath + "/patientSex"; + // 病人身份证号 + String patientIDCardXpath = msgXpath + "/patientIDCard"; + // 就诊日期 + String operationTimeXpath = msgXpath + "/visitDate"; + // 病人床位号 + String bedNumberXpath = msgXpath + "/bedNumber"; + // 所属科室 + String ascriptionDepartmentXpath = msgXpath + "/ascriptionDepartment"; + // 就诊次数 + String visitIdXpath = msgXpath + "/visitId"; + + String clinicNum = WebServiceClientHelper.processDataByXpath(document, clinicNumberXpath); + String patientName = WebServiceClientHelper.processDataByXpath(document, patientNameXpath); + String patientAge = WebServiceClientHelper.processDataByXpath(document, patientAgeXpath); + String patientSex = WebServiceClientHelper.processDataByXpath(document, patientSexXpath); + String patientIDCard = WebServiceClientHelper.processDataByXpath(document, patientIDCardXpath); + String operationTime = WebServiceClientHelper.processDataByXpath(document, operationTimeXpath); + String bedNumber = WebServiceClientHelper.processDataByXpath(document, bedNumberXpath); + String ascriptionDepartment = WebServiceClientHelper.processDataByXpath(document, ascriptionDepartmentXpath); + String visitId = WebServiceClientHelper.processDataByXpath(document, visitIdXpath); + + PatientInfoVO patientInfoVO = new PatientInfoVO(); + patientInfoVO.setClinicNumber(clinicNum); + patientInfoVO.setPatientName(patientName); + patientInfoVO.setPatientAge(patientAge); + patientInfoVO.setPatientSex(patientSex); + patientInfoVO.setPatientIDCard(patientIDCard); + patientInfoVO.setOperationTime(operationTime); + patientInfoVO.setBedNumber(bedNumber); + patientInfoVO.setAscriptionDepartment(ascriptionDepartment); + if(DatabaseUtil.isPoIdValid(visitId)){ + patientInfoVO.setVisitId(Long.parseLong(visitId)); + } + + patientInfoVOList.add(patientInfoVO); + } + + if (CollectionUtils.isNotEmpty(patientInfoVOList)) { + // 根据记录手术时间operationTime排序,只取最新记录 + patientInfoVOList.sort(new Comparator() { + @Override + public int compare(PatientInfoVO o1, PatientInfoVO o2) { + if (StringUtils.isBlank(o1.getOperationTime()) && StringUtils.isNotBlank(o2.getOperationTime())) { + return -1; + } + if (StringUtils.isBlank(o2.getOperationTime()) && StringUtils.isNotBlank(o1.getOperationTime())) { + return 1; + } + if (StringUtils.isBlank(o1.getOperationTime()) && StringUtils.isBlank(o2.getOperationTime())){ + return 0; + } + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + try { + Date date1 = sdf.parse(o1.getOperationTime()); + Date date2 = sdf.parse(o2.getOperationTime()); + return date2.compareTo(date1); + } catch (ParseException e) { + logger.debug("病人信息排序出错(手术时间【visitDate】字段格式错误)!"); + e.printStackTrace(); + } + return 0; + } + }); + // 只取最新录入的一条记录 + PatientInfoVO patientInfoVO = patientInfoVOList.get(0); + logger.debug("完成门诊病人信息解析,病人门诊号为:" + patientInfoVO.getHospitalNumber()); + PatientInfoVO[] patientInfoArray = {patientInfoVO}; + return patientInfoArray; + } + } + } catch (Exception e) { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + e.printStackTrace(new PrintStream(baos)); + String exception = baos.toString(); + logger.error("根据病人门诊号查询病人信息失败" + exception); + e.printStackTrace(); + } + return null; + } + +} Index: ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/szszyy/DatasyncConstant.java =================================================================== diff -u --- ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/szszyy/DatasyncConstant.java (revision 0) +++ ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/szszyy/DatasyncConstant.java (revision 31676) @@ -0,0 +1,31 @@ +package com.forgon.disinfectsystem.datasynchronization.dao.szszyy; + +/** + * 深圳市中医院接口相关常量 + * @author ZhouPeiMian + * @since 2021-07-26 + * + */ +public class DatasyncConstant { + + /** + * 门诊病人接口地址:http://172.18.0.60/csp/hsb/DHC.Published.PUB0016.BS.PUB0016.cls + */ + public final static String WebserviceAddress = "http://172.18.0.60/csp/hsb/DHC.Published.PUB0016.BS.PUB0016.cls"; + + /** + * 获取门诊病人信息的方法名称(入参) + */ + public final static String FunctionName_MZ = "MES0220"; + + /** + * 获取住院病人信息的方法名称(入参) + */ + public final static String FunctionName_ZY = "MES0221"; + + /** + * 接口调用成功的编码 + */ + public final static String SuccessCode = "0"; + +} Index: ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/szszyy/FindPatientInfoByHospitalNumDaoImpl.java =================================================================== diff -u --- ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/szszyy/FindPatientInfoByHospitalNumDaoImpl.java (revision 0) +++ ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/szszyy/FindPatientInfoByHospitalNumDaoImpl.java (revision 31676) @@ -0,0 +1,210 @@ +package com.forgon.disinfectsystem.datasynchronization.dao.szszyy; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.Date; +import java.util.List; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.log4j.Logger; +import org.dom4j.Document; +import org.dom4j.DocumentHelper; +import org.dom4j.Node; +import org.dom4j.XPath; + +import com.forgon.disinfectsystem.datasynchronization.dao.FindPatientInfoByHospitalNumDao; +import com.forgon.disinfectsystem.datasynchronization.model.PatientInfoVO; +import com.forgon.tools.db.DatabaseUtil; + +/** + * 根据住院号查询病人信息(深圳市中医院) + * @author ZhouPeiMian + * @since 2021-07-27 + * + */ +public class FindPatientInfoByHospitalNumDaoImpl implements + FindPatientInfoByHospitalNumDao { + + Logger logger = Logger.getLogger(FindPatientInfoByHospitalNumDaoImpl.class); + + @Override + public PatientInfoVO[] findPatientInfoByHospitalNum(String hospitalNum) { + try { + String soapXml = WebServiceClientHelper.buildInputStr(DatasyncConstant.FunctionName_ZY, hospitalNum); + logger.info("住院病人信息同步接口请求信息:" + soapXml); + String endpoint = DatasyncConstant.WebserviceAddress; + String targetNamespace = "http://www.dhcc.com.cn"; + String soapActionURI = "http://www.dhcc.com.cn/DHC.Published.PUB0016.BS.PUB0016.HIPMessageServer"; + String method = "HIPMessageServer"; + String paramName1 = "input1"; + String paramName2 = "input2"; + String encodingStyle = "utf-8"; + String result = WebServiceClientHelper.axisInvokeWebservice(endpoint, targetNamespace, soapActionURI, method, paramName1, paramName2, DatasyncConstant.FunctionName_ZY, soapXml, encodingStyle); + logger.info("病人信息同步接口返回信息:" + result); + /*String result = "" + + "0" + + "成功" + + "" + + "" + + "00000305" + + "13505405" + + "王燕" + + "49岁2月25天" + + "" + + "440301196805167820" + + "胡越" + + "全子宫切除术" + + "2017-07-17" + + "妇科病区" + + "妇科护士站" + + "" + + "" + + "" + + "" + + ""; + logger.info("病人信息同步接口返回信息:" + result);*/ + int startIndex = result.indexOf(""); + if(startIndex == -1){ + logger.info("住院病人接口返回信息没有标签!"); + return null; + } + int endIndex = result.indexOf(""); + if(endIndex == -1 || endIndex < startIndex){ + logger.info("住院病人接口返回信息没有标签"); + return null; + } + String xmlString = result.substring(startIndex + "".length(), endIndex); + if(StringUtils.isBlank(xmlString)){ + logger.info("住院病人接口返回信息为空!" + xmlString); + return null; + } + xmlString = "" + xmlString + ""; + Document document = DocumentHelper.parseText(xmlString); + // 查询结果 + String resultCodeXpath = "/Response/ResultCode"; + String resultCotentXpath = "/Response/ResultContent"; + String resultCode = WebServiceClientHelper.processDataByXpath(document, resultCodeXpath); + String resultCotent = WebServiceClientHelper.processDataByXpath(document, resultCotentXpath); + if(!StringUtils.equals(resultCode, DatasyncConstant.SuccessCode)){ + logger.info("住院病人接口查询失败:" + resultCotent); + return null; + } + String itemXpath = "/Response/items/item"; // 返回结果可能存在多条住院病人信息 + XPath xpath = document.createXPath(itemXpath); + @SuppressWarnings("unchecked") + List nodeList = xpath.selectNodes(document, xpath); + if(CollectionUtils.isNotEmpty(nodeList)){ + List patientInfoVOList = new ArrayList(); + for (int i = 1; i <= nodeList.size(); i++) { + String msgXpath = "/Response/items/item[" + i + "]"; + // 住院号 + String hospitalNumberXpath = msgXpath + "/hospitalNumber"; + // 病人姓名 + String patientNameXpath = msgXpath + "/patientName"; + // 病人年龄 + String patientAgeXpath = msgXpath + "/patientAge"; + // 病人性别 + String patientSexXpath = msgXpath + "/patientSex"; + // 病人身份证号 + String patientIDCardXpath = msgXpath + "/patientIDCard"; + // 医生姓名 + String doctorNameXpath = msgXpath + "/doctorName"; + // 手术名称 + String operationXpath = msgXpath + "/operation"; + // 手术时间 + String operationTimeXpath = msgXpath + "/operationTime"; + // 病人所属病区 + String patientAreaXpath = msgXpath + "/patientArea"; + // 病人床位号 + String bedNumberXpath = msgXpath + "/bedNumber"; + // 所属科室 + String ascriptionDepartmentXpath = msgXpath + "/ascriptionDepartment"; + // 住院次数 + String visitIdXpath = msgXpath + "/visitId"; + + String hospitalNumber = WebServiceClientHelper.processDataByXpath(document, hospitalNumberXpath); + String patientName = WebServiceClientHelper.processDataByXpath(document, patientNameXpath); + String patientAge = WebServiceClientHelper.processDataByXpath(document, patientAgeXpath); + String patientSex = WebServiceClientHelper.processDataByXpath(document, patientSexXpath); + String patientIDCard = WebServiceClientHelper.processDataByXpath(document, patientIDCardXpath); + String doctorName = WebServiceClientHelper.processDataByXpath(document, doctorNameXpath); + String operation = WebServiceClientHelper.processDataByXpath(document, operationXpath); + String operationTime = WebServiceClientHelper.processDataByXpath(document, operationTimeXpath); + String patientArea = WebServiceClientHelper.processDataByXpath(document, patientAreaXpath); + String bedNumber = WebServiceClientHelper.processDataByXpath(document, bedNumberXpath); + String ascriptionDepartment = WebServiceClientHelper.processDataByXpath(document, ascriptionDepartmentXpath); + String visitId = WebServiceClientHelper.processDataByXpath(document, visitIdXpath); + + PatientInfoVO patientInfoVO = new PatientInfoVO(); + patientInfoVO.setHospitalNumber(hospitalNumber); + patientInfoVO.setPatientName(patientName); + patientInfoVO.setPatientAge(patientAge); + patientInfoVO.setPatientSex(patientSex); + patientInfoVO.setPatientIDCard(patientIDCard); + patientInfoVO.setDoctorName(doctorName); + patientInfoVO.setOperation(operation); + patientInfoVO.setOperationTime(operationTime); + patientInfoVO.setPatientArea(patientArea); + patientInfoVO.setBedNumber(bedNumber); + patientInfoVO.setAscriptionDepartment(ascriptionDepartment); + if(DatabaseUtil.isPoIdValid(visitId)){ + patientInfoVO.setVisitId(Long.parseLong(visitId)); + } + + patientInfoVOList.add(patientInfoVO); + } + if (CollectionUtils.isNotEmpty(patientInfoVOList)) { + // 根据记录手术时间operationTime排序,只取最新记录 + patientInfoVOList.sort(new Comparator() { + @Override + public int compare(PatientInfoVO o1, PatientInfoVO o2) { + if (StringUtils.isBlank(o1.getOperationTime()) && StringUtils.isNotBlank(o2.getOperationTime())) { + return -1; + } + if (StringUtils.isBlank(o2.getOperationTime()) && StringUtils.isNotBlank(o1.getOperationTime())) { + return 1; + } + if (StringUtils.isBlank(o1.getOperationTime()) && StringUtils.isBlank(o2.getOperationTime())){ + return 0; + } + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + try { + Date date1 = sdf.parse(o1.getOperationTime()); + Date date2 = sdf.parse(o2.getOperationTime()); + return date2.compareTo(date1); + } catch (ParseException e) { + logger.debug("病人信息排序出错(手术时间【operationTime】字段格式错误)!"); + e.printStackTrace(); + } + return 0; + } + }); + // 只取最新录入的一条记录 + PatientInfoVO patientInfoVO = patientInfoVOList.get(0); + logger.debug("完成住院病人信息解析,病人住院号为:" + patientInfoVO.getHospitalNumber()); + PatientInfoVO[] patientInfoArray = {patientInfoVO}; + return patientInfoArray; + } + } + } catch (Exception e) { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + e.printStackTrace(new PrintStream(baos)); + String exception = baos.toString(); + logger.error("根据病人住院号查询病人信息失败" + exception); + e.printStackTrace(); + } + return null; + } + + @Override + public PatientInfoVO[] findPatientInfoByHospitalNumBeforeOperation( + String hospitalNum) { + return findPatientInfoByHospitalNum(hospitalNum); + } + +} Index: ssts-web/src/main/webapp/disinfectsystem/config/szszyy/spring/HIS.xml =================================================================== diff -u -r28299 -r31676 --- ssts-web/src/main/webapp/disinfectsystem/config/szszyy/spring/HIS.xml (.../HIS.xml) (revision 28299) +++ ssts-web/src/main/webapp/disinfectsystem/config/szszyy/spring/HIS.xml (.../HIS.xml) (revision 31676) @@ -51,10 +51,8 @@ - - - + - + \ No newline at end of file Index: ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/szszyy/WebServiceClientHelper.java =================================================================== diff -u --- ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/szszyy/WebServiceClientHelper.java (revision 0) +++ ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/szszyy/WebServiceClientHelper.java (revision 31676) @@ -0,0 +1,103 @@ +package com.forgon.disinfectsystem.datasynchronization.dao.szszyy; + +import javax.xml.namespace.QName; +import org.apache.axis.client.Call; +import org.apache.axis.client.Service; +import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; +import org.dom4j.Document; +import org.dom4j.Node; +import org.dom4j.XPath; +import com.forgon.exception.SystemException; + +/** + * 深圳市中医院webservice帮助类 + * @author ZhouPeiMian + * @since 2021-07-26 + * + */ +public class WebServiceClientHelper { + + public static Logger logger = Logger.getLogger(WebServiceClientHelper.class); + + /** + * 根据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; + } + + /** + * 构建请求信息 + **/ + public static String buildInputStr(String function, String value){ + StringBuffer inputSb = new StringBuffer(); + + if(StringUtils.equals(function, DatasyncConstant.FunctionName_MZ)){ + //inputSb.append("" + value + ""); + inputSb.append(""); + inputSb.append("" + value + ""); + inputSb.append(""); + return inputSb.toString(); + }else if(StringUtils.equals(function, DatasyncConstant.FunctionName_ZY)){ + inputSb.append(""); + inputSb.append("" + value + ""); + inputSb.append(""); + return inputSb.toString(); + }else{ + throw new SystemException("FunctionName错误:" + function); + } + } + + /** + * axis调用webservice + * @param endpoint + * @param targetNamespace 命名空间,在WSDL中对应的标签是:targetNamespace  + * @param soapActionURI 具体方法的调用URI,在WSDL中对应的标签是: + * @param method 具体调用的方法名,在WSDL中对应的标签是: + * @param paramName 调用接口的参数的名字 + * @param input 参数值 + * @param encodingStyle 字符集"utf-8" + * @return + * @throws Exception + */ + public static String axisInvokeWebservice(String endpoint, String targetNamespace, String soapActionURI, String method, + String paramName1, String paramName2, String input1, String input2, String encodingStyle) throws Exception { + String param1 = input1; + String param2 = input2; + logger.info("input1 : " + param1); + logger.info("input2 : " + param2); + Service service = new Service(); + Call call = (Call) service.createCall(); + //call.setTimeout(new Integer(20000)); //设置超时时间 + call.setSOAPActionURI(soapActionURI); + call.setTargetEndpointAddress(new java.net.URL(endpoint)); //设置目标接口的地址 + call.setEncodingStyle(encodingStyle);//设置传入服务端的字符集格式如utf-8等 + call.setOperationName(new QName(targetNamespace, method));// 具体调用的方法名,可以由接口提供方告诉你,也可以自己从WSDL中找 + call.setUseSOAPAction(true); + call.addParameter(paramName1, + org.apache.axis.encoding.XMLType.XSD_STRING, + javax.xml.rpc.ParameterMode.IN);// 接口的参数 + call.addParameter(paramName2, + org.apache.axis.encoding.XMLType.XSD_STRING, + javax.xml.rpc.ParameterMode.IN);// 接口的参数 + call.setReturnClass(java.lang.String.class); //返回字符串类型 + // 给方法传递参数,并且调用方法 ,如果无参,则new Obe + String result = (String)call.invoke(new String[] {param1, param2}); + // 打印返回值 + logger.info("result is " + result); + return result; + } + +}