Index: ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/zsszyy/WebServiceClientHelper.java =================================================================== diff -u --- ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/zsszyy/WebServiceClientHelper.java (revision 0) +++ ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/zsszyy/WebServiceClientHelper.java (revision 35438) @@ -0,0 +1,128 @@ +package com.forgon.disinfectsystem.datasynchronization.dao.zsszyy; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import java.nio.charset.Charset; + +import org.apache.commons.lang.StringUtils; +import org.apache.http.HttpEntity; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.http.util.EntityUtils; +import org.apache.log4j.Logger; +import org.dom4j.Document; +import org.dom4j.Node; +import org.dom4j.XPath; + +/** + * 中山市中医院接口相关常量 + * @since 2023-01-16 + */ +public class WebServiceClientHelper { + + public static Logger logger = Logger.getLogger(WebServiceClientHelper.class); + + /** + * 构造接口输入参数 + * @param methodName + * @param arg + * @return + */ + public static String buildInputXml(String methodName, int pageIndex, String... args){ + String inputXml = ""; + if(pageIndex <= 0){ + pageIndex = DatasyncConstant.PageIndex; + } + if (DatasyncConstant.MethodName_HospitalNumber.equals(methodName)) { + // 根据住院号查询病人信息 + String param = "" + + "" + args[0] + "" + + "" + DatasyncConstant.PageSize + "" + + "" + DatasyncConstant.PageIndex + "" + + "]]>"; + inputXml = "" + + "" + + "" + + "" + + "" + + "" + methodName + "XML" + DatasyncConstant.AccessKey + "]]>" + + "" + + "" + + param + + "" + + "" + +"" + +""; + } else { + throw new RuntimeException("不存在此methodName:" + methodName); + } + return inputXml; + } + + /** + * 根据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; + } + + /** + * 使用SOAP1.2发送消息 + * + * @param postUrl + * @param soapXml + * @param soapAction + * @return + */ + public static String doPostSoap1_2(String postUrl, String soapXml) { + String retStr = ""; + // 创建HttpClientBuilder + HttpClientBuilder httpClientBuilder = HttpClientBuilder.create(); + // HttpClient + CloseableHttpClient closeableHttpClient = httpClientBuilder.build(); + HttpPost httpPost = new HttpPost(postUrl); + // 设置请求和传输超时时间 + RequestConfig requestConfig = RequestConfig.custom() + .setSocketTimeout(100000) + .setConnectTimeout(100000).build(); + httpPost.setConfig(requestConfig); + try { + httpPost.setHeader("Content-Type", "text/xml; charset=utf-8"); + httpPost.setHeader("SOAPAction", ""); + StringEntity data = new StringEntity(soapXml,Charset.forName("UTF-8")); + httpPost.setEntity(data); + CloseableHttpResponse response = closeableHttpClient.execute(httpPost); + HttpEntity httpEntity = response.getEntity(); + if (httpEntity != null) { + // 打印响应内容 + retStr = EntityUtils.toString(httpEntity, "UTF-8"); + retStr = retStr.replaceAll("<", "<"); + retStr = retStr.replaceAll(">", ">"); + } + // 释放资源 + closeableHttpClient.close(); + } catch (Exception e) { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + e.printStackTrace(new PrintStream(baos)); + String exception = baos.toString(); + logger.info("exception in doPostSoap1_2:" + exception); + } + return retStr; + } + +} Index: ssts-web/src/main/webapp/disinfectsystem/config/zsszyy/spring/applicationContext-his.xml =================================================================== diff -u -r32361 -r35438 --- ssts-web/src/main/webapp/disinfectsystem/config/zsszyy/spring/applicationContext-his.xml (.../applicationContext-his.xml) (revision 32361) +++ ssts-web/src/main/webapp/disinfectsystem/config/zsszyy/spring/applicationContext-his.xml (.../applicationContext-his.xml) (revision 35438) @@ -69,17 +69,7 @@ - - - - - - - - - - + patientInfoVOList = new ArrayList(); + try { + patientInfoVOList = findPatientInfoByHospitalNumPage(hospitalNum); + } catch (Exception e) { + logger.info("住院号接口查询异常:" + e.getMessage()); + e.printStackTrace(); + } + if(CollectionUtils.isEmpty(patientInfoVOList)){ + return null; + } + PatientInfoVO[] patientInfoArray = {patientInfoVOList.get(0)}; + return patientInfoArray; + } + + /** + * 分页循环查询住院号病人信息,最多查询1000次 + * @param hospitalNum + * @return + * @throws Exception + */ + private List findPatientInfoByHospitalNumPage(String hospitalNum) throws Exception { + + List patientInfoVOList = new ArrayList(); + for(int pageIndex=1; pageIndex<=1000; pageIndex++){ + List patientInfoVOPageList = new ArrayList(); + String inputXml = WebServiceClientHelper.buildInputXml(DatasyncConstant.MethodName_HospitalNumber, pageIndex, hospitalNum); + //测试数据,建议代码保留往后可以本地调试 + /*String xmlResult = " AA成功1000424457 22102骨一科一区病区92023-02-03 18:25:582023-02-12 18:29:28R4672613 赖扬福13621321975101538352023-02-1493137 颈椎骨折切开复位内固定术03.53022103000 李世豪22101骨一科一区门诊22102 骨一科一区病区24203手术室]]>"; + if(pageIndex > 1){ + xmlResult = ""; + }*/ + String xmlResult = WebServiceClientHelper.doPostSoap1_2(DatasyncConstant.WebServiceAddress, inputXml); + logger.info("住院病人接口查询页码:" + pageIndex + ",每页最大行数:" + DatasyncConstant.PageSize); + logger.info("住院病人接口请求信息:" + inputXml); + logger.info("住院病人接口返回信息:" + xmlResult); + if(StringUtils.isBlank(xmlResult)){ + logger.info("根据住院号查询病人信息失败,接口返回信息为空!"); + break; + } + + int startIndex = xmlResult.indexOf(""); + int endIndex = xmlResult.indexOf(""); + + if(startIndex == -1 || endIndex == -1 || endIndex < startIndex){ + logger.info("根据住院号查询病人信息失败,接口返回信息没有节点!"); + break; + } + + xmlResult = xmlResult.substring(startIndex, endIndex + "".length()); + + Document document = DocumentHelper.parseText(xmlResult); + + if(document == null){ + break; + } + + if(document != null){ + //响应码 + String processResultCodeXpath = "/root/processResultCode"; + String processResultCode = WebServiceClientHelper.processDataByXpath(document, processResultCodeXpath); + //响应信息 + String processResultXpath = "/root/processResult"; + String processResult = WebServiceClientHelper.processDataByXpath(document, processResultXpath); + if(StringUtils.equals(DatasyncConstant.FAIL_CODE, processResultCode)){ + if(StringUtils.isBlank(processResult)){ + processResult = "processResultCode = AE"; + } + logger.info("根据住院号查询病人信息失败,接口返回信息:" + processResult); + break; + } + + String itemXpath = "/root/returnContents/returnContent"; + XPath xpath = document.createXPath(itemXpath); + @SuppressWarnings("unchecked") + List nodeList = xpath.selectNodes(document, xpath); + if(CollectionUtils.isEmpty(nodeList)){ + break; + } + for(int i=1; i <= nodeList.size(); i++){ + + String returnContentXpath = itemXpath + "[" + i + "]"; + + //病人标识号 + //String patientIdXpath = returnContentXpath + "/patientId"; + //所在病房名称 + String wardRoomNameXpath = returnContentXpath + "/wardRoomName"; + //所在科室代码 + String deptNameXpath = returnContentXpath + "/deptName"; + //床号 + String bedNoXpath = returnContentXpath + "/bedNo"; + + //入院日期及时间 + //String admissionDateTimeXpath = returnContentXpath + "/admissionDateTime"; + //住院号 + String eventNoXpath = returnContentXpath + "/eventNo"; + //姓名 + String patientNameXpath = returnContentXpath + "/patientName"; + //性别名称 + String sexNameXpath = returnContentXpath + "/sexName"; + + //身份证号码 + String identityNoXpath = returnContentXpath + "/identityNo"; + //手术时间 + String operateTimeXpath = returnContentXpath + "/operateTime"; + //手术申请单号 + String operationApplyNoXpath = returnContentXpath + "/operationApplyNo"; + //手术名称 + String operateNameXpath = returnContentXpath + "/operateName"; + + //手术医生姓名 + String doctorNameXpath = returnContentXpath + "/operatDoctorName"; + + String roomNumber = WebServiceClientHelper.processDataByXpath(document, wardRoomNameXpath); + String ascriptionDepartment = WebServiceClientHelper.processDataByXpath(document, deptNameXpath); + String bedNumber = WebServiceClientHelper.processDataByXpath(document, bedNoXpath); + hospitalNum = WebServiceClientHelper.processDataByXpath(document, eventNoXpath); + String patientName = WebServiceClientHelper.processDataByXpath(document, patientNameXpath); + String patientSex = WebServiceClientHelper.processDataByXpath(document, sexNameXpath); + String patientIDCard = WebServiceClientHelper.processDataByXpath(document, identityNoXpath); + String operationTime = WebServiceClientHelper.processDataByXpath(document, operateTimeXpath); + String operationApplyNo = WebServiceClientHelper.processDataByXpath(document, operationApplyNoXpath); + String operationName = WebServiceClientHelper.processDataByXpath(document, operateNameXpath); + String operDoctorName = WebServiceClientHelper.processDataByXpath(document, doctorNameXpath); + + PatientInfoVO patientInfoVO = new PatientInfoVO(); + patientInfoVO.setRoomNumber(roomNumber); + patientInfoVO.setPatientName(patientName); + patientInfoVO.setPatientSex(patientSex); + patientInfoVO.setPatientIDCard(patientIDCard); + if(StringUtils.isNotBlank(operationTime)){ + Date operationTimeObj = DateTools.coverStrToDate(operationTime, DateTools.COMMON_DATE_ONLY); + if(operationTimeObj != null){ + patientInfoVO.setOperationTime(DateTools.getFormatDateStr(operationTimeObj, DateTools.COMMON_DATE_HM)); + } + } + patientInfoVO.setAscriptionDepartment(ascriptionDepartment); + patientInfoVO.setBedNumber(bedNumber); + patientInfoVO.setHospitalNumber(hospitalNum); + patientInfoVO.setOperation(operationName); + patientInfoVO.setDoctorName(operDoctorName); + patientInfoVO.setOperationScheduleId(operationApplyNo); + patientInfoVOPageList.add(patientInfoVO); + } + logger.info("住院病人接口返回记录行数:" + patientInfoVOPageList.size()); + if(CollectionUtils.isEmpty(patientInfoVOPageList)){ + break; + } + patientInfoVOList.addAll(patientInfoVOPageList); + if(patientInfoVOPageList.size() < DatasyncConstant.PageSize){ + break; + } + } + } + + if(CollectionUtils.isNotEmpty(patientInfoVOList)){ + patientInfoVOList.sort(new Comparator() { + @Override + public int compare(PatientInfoVO o1, PatientInfoVO o2) { + return StringUtils.compare(o2.getOperationScheduleId(), o1.getOperationScheduleId()); + } + }); + } + + return patientInfoVOList; + } + + @Override + public PatientInfoVO[] findPatientInfoByHospitalNumBeforeOperation( + String hospitalNum) { + return findPatientInfoByHospitalNum(hospitalNum); + } + +} Index: ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/zsszyy/DatasyncConstant.java =================================================================== diff -u --- ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/zsszyy/DatasyncConstant.java (revision 0) +++ ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/zsszyy/DatasyncConstant.java (revision 35438) @@ -0,0 +1,44 @@ +package com.forgon.disinfectsystem.datasynchronization.dao.zsszyy; + +/** + * 中山市中医院接口相关常量 + * @since 2023-01-16 + */ +public class DatasyncConstant { + /** + * webService接口地址 + */ + //http://10.0.253.227:8688/Select-Service/SelectEntranceWs?wsdl + public final static String WebServiceAddress = "http://10.0.253.227:8688/Select-Service/SelectEntranceWs"; + + /** + * 授权码 + */ + public final static String AccessKey = "yvLX8eNAhtqXUbWrJqzaDgxsT57fPexSkG9ulDTUzEzcjykZvdnfew=="; + + /** + * 接口方法名:住院病人(作为输入参数) + */ + public final static String MethodName_HospitalNumber = "operationScheduleInfoQuery"; + + /** + * 每页行数(不超过1200)必填 + */ + public final static Integer PageSize = 1000; + + /** + * 页码 + */ + public final static Integer PageIndex = 1; + + /** + * 处理结果代码(AA成功AE失败) + */ + public final static String SUCC_CODE = "AA"; + + /** + * 处理结果代码(AA成功AE失败) + */ + public final static String FAIL_CODE = "AE"; + +}