Index: ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/gzykdxfskqyy/FindPatientInfoByHospitalNumDaoImpl.java =================================================================== diff -u --- ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/gzykdxfskqyy/FindPatientInfoByHospitalNumDaoImpl.java (revision 0) +++ ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/gzykdxfskqyy/FindPatientInfoByHospitalNumDaoImpl.java (revision 33615) @@ -0,0 +1,177 @@ +package com.forgon.disinfectsystem.datasynchronization.dao.gzykdxfskqyy; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang.StringEscapeUtils; +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.string.StringTools; + +/** + * 根据住院号查询病人信息(广州医科大学附属口腔医院) + * @author ZhouPeiMian + * @since 2022-04-15 + * + */ +public class FindPatientInfoByHospitalNumDaoImpl implements + FindPatientInfoByHospitalNumDao { + + Logger logger = Logger.getLogger(FindPatientInfoByHospitalNumDaoImpl.class); + + @Override + public PatientInfoVO[] findPatientInfoByHospitalNum(String hospitalNum) { + try { + String inputXml = WebServiceClientHelper.buildInputString(DatasyncConstant.HospitalNumInfoQueryWebserviceAddress, hospitalNum); + logger.info("住院号信息查询服务接口请求信息:" + DatasyncConstant.HospitalNumInfoQueryWebserviceAddress); + logger.info("住院号查询接口请求信息:" + inputXml); + //String result = " "; + String result = WebServiceClientHelper.doPostSoap1_2(DatasyncConstant.HospitalNumInfoQueryWebserviceAddress, inputXml); + logger.info("住院号查询接口返回信息:" + result); + //解析xml获取患者手术单信息 + PatientInfoVO[] patientInfoVOs = buidPatientInfoByXML(result); + return patientInfoVOs; + } catch (Exception e) { + logger.error("查询失败" + e); + e.printStackTrace(); + } + return null; + } + + /** + * 解析xml获取患者基本信息 + * @param responce + * @return + * @throws Exception + */ + @SuppressWarnings("unchecked") + private PatientInfoVO[] buidPatientInfoByXML(String responce) throws Exception { + List patientInfoVOList = new ArrayList(); + if(StringUtils.isBlank(responce)){ + return null; + } + responce = StringEscapeUtils.unescapeHtml(responce); + + int beginIndex = responce.indexOf(""); + if(beginIndex == -1 || endIndex == -1){ + return null; + } + responce = responce.substring(beginIndex, endIndex + "".length()); + Document document = DocumentHelper.parseText(responce.trim()); + Map nameSpaceURIMap = new HashMap(); + nameSpaceURIMap.put("s", "urn:hl7-org:v3"); + + //typeCode为处理结果,AA表示成功 AE表示失败 + String typeCodeXpath = "/PRPA_IN900350UV/s:acknowledgement/@typeCode"; + String typeCode = WebServiceClientHelper.processDataByXpath(document, nameSpaceURIMap, typeCodeXpath); + if(StringUtils.equals(typeCode, DatasyncConstant.FAIL_STATUS)){ + return null; + } + + //subject节点可以有多个,一个节点代表一个手术申请单 + String subjectXpath = "/PRPA_IN900350UV/s:controlActProcess/s:subject"; + XPath xpath = document.createXPath(subjectXpath); + xpath.setNamespaceURIs(nameSpaceURIMap); + List subjectNodeList = xpath.selectNodes(document, xpath); + if(CollectionUtils.isEmpty(subjectNodeList)){ + return null; + } + + for(int i=1;i<=subjectNodeList.size();i++){ + PatientInfoVO patientInfoVO = new PatientInfoVO(); + + //入院日期时间 + String visitDateXpath = subjectXpath + "[" + i + "]/s:encounterEvent/s:effectiveTime/s:low/@value"; + String visitDate = WebServiceClientHelper.processDataByXpath(document, nameSpaceURIMap, visitDateXpath); + patientInfoVO.setVisitDate(visitDate); + //住院次数 + String visitIdXpath = subjectXpath + "[" + i + "]/s:encounterEvent/s:lengthOfStayQuantity/@value"; + String visitIdStr = WebServiceClientHelper.processDataByXpath(document, nameSpaceURIMap, visitIdXpath); + Long visitId = Long.valueOf(visitIdStr); + patientInfoVO.setVisitId(visitId); + + //患者信息 + String patientXpath = subjectXpath + "[" + i + "]/s:encounterEvent/s:subject/s:patient/s:patientPerson"; + //姓名 + String patientNameXpath = patientXpath + "/s:name/s:item/s:part/@value"; + String patientName = WebServiceClientHelper.processDataByXpath(document, nameSpaceURIMap, patientNameXpath); + patientInfoVO.setPatientName(patientName); + //身份证号码 + String patientIDCardXpath = patientXpath + "/s:id/s:item/@extension"; + String patientIDCard = WebServiceClientHelper.processDataByXpath(document, nameSpaceURIMap, patientIDCardXpath);; + patientInfoVO.setPatientIDCard(patientIDCard); + //年龄 + String birthTimeXpath = patientXpath + "/s:birthTime/@value"; + String birthTime = WebServiceClientHelper.processDataByXpath(document, nameSpaceURIMap, birthTimeXpath); + String patientAge = WebServiceClientHelper.birthdayToAge(birthTime); + patientInfoVO.setPatientAge(patientAge); + //性别 + String patientSexXpath = patientXpath + "/s:administrativeGenderCode/s:displayName/@value"; + String patientSex = WebServiceClientHelper.processDataByXpath(document, nameSpaceURIMap, patientSexXpath); + patientInfoVO.setPatientSex(patientSex); + + //科室名称 + String ascriptionDepartmentXpath = subjectXpath + "[" + i + "]/s:encounterEvent/s:location/s:serviceDeliveryLocation/s:location/s:name/s:item/s:part/@value"; + String ascriptionDepartment = WebServiceClientHelper.processDataByXpath(document, nameSpaceURIMap, ascriptionDepartmentXpath); + patientInfoVO.setAscriptionDepartment(ascriptionDepartment); + + //病区名称 + String patientAreaXpath = subjectXpath + "[" + i + "]/s:encounterEvent/s:location/s:serviceDeliveryLocation/s:location/s:locatedEntityHasParts/s:locatedPlace/s:name/s:item/s:part/@value"; + String patientArea = WebServiceClientHelper.processDataByXpath(document, nameSpaceURIMap, patientAreaXpath); + patientInfoVO.setPatientArea(patientArea); + //病房名称 + String roomNumberXpath = subjectXpath + "[" + i + "]/s:encounterEvent/s:location/s:serviceDeliveryLocation/s:location/s:locatedEntityHasParts/s:locatedPlace/s:locatedEntityHasParts/s:locatedPlace/s:name/s:item/s:part/@value"; + String roomNumber = WebServiceClientHelper.processDataByXpath(document, nameSpaceURIMap, roomNumberXpath); + patientInfoVO.setRoomNumber(roomNumber); + //病床名称 + String bedNumberXpath = subjectXpath + "[" + i + "]/s:encounterEvent/s:location/s:serviceDeliveryLocation/s:location/s:locatedEntityHasParts/s:locatedPlace/s:locatedEntityHasParts/s:locatedPlace/s:locatedEntityHasParts/s:locatedPlace/s:name/s:item/s:part/@value"; + String bedNumber = WebServiceClientHelper.processDataByXpath(document, nameSpaceURIMap, bedNumberXpath); + patientInfoVO.setBedNumber(bedNumber); + + //诊断医师信息 + String doctorXpath = subjectXpath + "[" + i + "]/s:encounterEvent/s:admitter/s:assignedPerson/s:assignedPerson/s:name/s:item/s:part/@value"; + String doctorName = WebServiceClientHelper.processDataByXpath(document, nameSpaceURIMap, doctorXpath); + patientInfoVO.setDoctorName(doctorName); + + //诊断描述 + List operationList = new ArrayList(); + String operationXpathStr = subjectXpath + "[" + i + "]/s:encounterEvent/s:reason"; + XPath operationXpath = document.createXPath(operationXpathStr); + operationXpath.setNamespaceURIs(nameSpaceURIMap); + List operationNodeList = operationXpath.selectNodes(document, operationXpath); + if(CollectionUtils.isNotEmpty(operationNodeList)){ + for(int j=1;j<=operationNodeList.size();j++){ + String operationJXpath = operationXpathStr + "[" + j + "]/s:observationDx/s:value/s:displayName/@value"; + String operationJ = WebServiceClientHelper.processDataByXpath(document, nameSpaceURIMap, operationJXpath); + operationList.add(operationJ); + } + patientInfoVO.setOperation(StringTools.join(operationList, ";")); + patientInfoVOList.add(patientInfoVO); + } + + if(CollectionUtils.isNotEmpty(patientInfoVOList)){ + PatientInfoVO[] patientInfoVOs = new PatientInfoVO[]{patientInfoVOList.get(0)}; + return patientInfoVOs; + } + + } + return null; + } + + @Override + public PatientInfoVO[] findPatientInfoByHospitalNumBeforeOperation(String hospitalNum) { + return findPatientInfoByHospitalNum(hospitalNum); + } + +} Index: ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/gzykdxfskqyy/WebServiceClientHelper.java =================================================================== diff -u --- ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/gzykdxfskqyy/WebServiceClientHelper.java (revision 0) +++ ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/gzykdxfskqyy/WebServiceClientHelper.java (revision 33615) @@ -0,0 +1,292 @@ +package com.forgon.disinfectsystem.datasynchronization.dao.gzykdxfskqyy; + +import java.nio.charset.Charset; +import java.util.Calendar; +import java.util.Map; +import java.util.UUID; + +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; + +import com.forgon.tools.date.DateTools; + +/** + * 广州医科大学附属口腔医院webservice帮助类 + * @author ZhouPeiMian + * @since 2022-04-15 + * + */ +public class WebServiceClientHelper { + + public static Logger logger = Logger.getLogger(WebServiceClientHelper.class); + + /** + * 构造接口输入参数 + * @param transIdName + * @param arg + * @return + */ + public static String buildInputString(String interactionId , String patientId){ + String inputXml = ""; + StringBuffer inputXmlSB = new StringBuffer(); + UUID uuid = UUID.randomUUID(); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + // good:Message + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + + } else if(StringUtils.equals(interactionId, DatasyncConstant.TreatmentNumInfoQueryWebserviceAddress)){ + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + } + + inputXmlSB.append("]]>"); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXmlSB.append(""); + inputXml = inputXmlSB.toString(); + return inputXml; + } + + /** + * 使用SOAP1.2发送消息 + * + * @param postUrl + * @param soapXml + * @param soapAction + * @return + * @throws Exception + */ + public static String doPostSoap1_2(String postUrl, String soapXml) throws Exception { + String retStr = ""; + // 创建HttpClientBuilder + HttpClientBuilder httpClientBuilder = HttpClientBuilder.create(); + // HttpClient + CloseableHttpClient closeableHttpClient = httpClientBuilder.build(); + HttpPost httpPost = new HttpPost(postUrl); + // 设置请求和传输超时时间 + RequestConfig requestConfig = RequestConfig.custom() + .setSocketTimeout(3000000) + .setConnectTimeout(3000000).build(); + httpPost.setConfig(requestConfig); + httpPost.setHeader("Content-Type", "application/soap+xml;charset=UTF-8;action=\"HIPMessageServer\""); + 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(); + return retStr; + } + + + /** + * 解析xml字段 + * @param document + * @param nameSpaceURIMap + * @param xpathExp + * @return + */ + public static String processDataByXpath(Document document, Map nameSpaceURIMap, String xpathExp) { + if ((StringUtils.isNotBlank(xpathExp)) && (document != null) && (nameSpaceURIMap != null)) { + XPath xpath = document.createXPath(xpathExp); + xpath.setNamespaceURIs(nameSpaceURIMap); + Node node = xpath.selectSingleNode(document); + if (node != null) { + return node.getStringValue(); + } + } + return ""; + } + + /** + * 根据出生年月日就算年龄 + * @param birthTime 19570323 + * @return + */ + public static String birthdayToAge(String birthTime) { + if(StringUtils.isBlank(birthTime)){ + return null; + } + //19570323 + Integer year = Integer.parseInt(birthTime.substring(0,4)); + Integer month = Integer.parseInt(birthTime.substring(4,6)); + Integer day = Integer.parseInt(birthTime.substring(6)); + 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(); + } + +} Index: ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/gzykdxfskqyy/DatasyncConstant.java =================================================================== diff -u -r24557 -r33615 --- ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/gzykdxfskqyy/DatasyncConstant.java (.../DatasyncConstant.java) (revision 24557) +++ ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/gzykdxfskqyy/DatasyncConstant.java (.../DatasyncConstant.java) (revision 33615) @@ -18,6 +18,35 @@ // 注册员工的接入系统编码 public final static String INSERTUSER = "registerEmployeeCast"; - + + /** + * 门诊挂号信息查询服务地址 + */ + public final static String TreatmentNumInfoQueryWebserviceAddress = "http://10.16.144.16/soap/JHIPLIB.SOAP.BS.HL7V3Service.cls?CfgItem=JH0106门诊挂号信息查询服务"; + /** + * 住院就诊信息查询服务地址 + */ + public final static String HospitalNumInfoQueryWebserviceAddress = "http://10.16.144.16/soap/JHIPLIB.SOAP.BS.HL7V3Service.cls?CfgItem=JH0113住院就诊信息查询服务"; + + /** + * 消息接收方系统编号 + */ + public final static String receiverSystemCode = "his"; + + /** + * 消息发送方系统编号 + */ + public final static String senderSystemCode = "XDGY"; + + /** + * 病人信息查询成功标识 + */ + public final static String SUCCESS_STATUS = "AA"; + + /** + * 病人信息查询失败标识 + */ + public final static String FAIL_STATUS = "AE"; + } Index: ssts-web/src/main/webapp/disinfectsystem/config/gzykdxfskqyy/spring/his.xml =================================================================== diff -u -r28119 -r33615 --- ssts-web/src/main/webapp/disinfectsystem/config/gzykdxfskqyy/spring/his.xml (.../his.xml) (revision 28119) +++ ssts-web/src/main/webapp/disinfectsystem/config/gzykdxfskqyy/spring/his.xml (.../his.xml) (revision 33615) @@ -85,28 +85,10 @@ - - - - - - - - - - + + - - - - - - - - - - + + \ No newline at end of file Index: ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/gzykdxfskqyy/FindPatientInfoByTreatmentNumDaoImpl.java =================================================================== diff -u --- ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/gzykdxfskqyy/FindPatientInfoByTreatmentNumDaoImpl.java (revision 0) +++ ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/gzykdxfskqyy/FindPatientInfoByTreatmentNumDaoImpl.java (revision 33615) @@ -0,0 +1,147 @@ +package com.forgon.disinfectsystem.datasynchronization.dao.gzykdxfskqyy; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang.StringEscapeUtils; +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.string.StringTools; + +/** + * 根据诊疗号查询病人信息(广州医科大学附属口腔医院) + * @author ZhouPeiMian + * @since 2022-04-15 + * + */ +public class FindPatientInfoByTreatmentNumDaoImpl implements + FindPatientInfoByTreatmentNumDao { + + Logger logger = Logger.getLogger(FindPatientInfoByTreatmentNumDaoImpl.class); + + @Override + public PatientInfoVO[] findPatientInfoByTreatmentNum(String treatmentNum) { + try { + String inputXml = WebServiceClientHelper.buildInputString(DatasyncConstant.TreatmentNumInfoQueryWebserviceAddress, treatmentNum); + logger.info("门诊挂号信息查询服务接口地址:" + DatasyncConstant.TreatmentNumInfoQueryWebserviceAddress); + logger.info("门诊挂号信息查询服务接口请求信息:" + inputXml); + + //String result = "4514text/xml;charset=UTF-8Wed, 06 Apr 2022 04:35:42 GMT<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:pushResponse xmlns:ns2="http://webservice.fp.com"><return><PRPA_IN900350UV xmlns="urn:hl7-org:v3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ITSVersion="XML_1.0" xsi:schemaLocation="urn:hl7-org:v3 ../multicacheschemas/PRPA_IN900350UV.xsd"><id extension="22a0f9e0-4454-11dc-a6be-8888888"/><creationTime value="20210501130624"/><interactionId root="2.16.840.1.113883.1.6" extension="JH0106"/><processingCode code="P"/><processingModeCode/><acceptAckCode code="AL"/><receiver typeCode="RCV"><device classCode="DEV" determinerCode="INSTANCE"><id><item extension="JHPT"/></id></device></receiver><sender typeCode="SND"><device classCode="DEV" determinerCode="INSTANCE"><id><item extension="HIS"/></id></device></sender><acknowledgement typeCode="AA"><targetMessage><id extension="22a0f9e0-4454-11dc-a6be-8888888"/></targetMessage><acknowledgementDetail><text value="成功"/></acknowledgementDetail></acknowledgement><controlActProcess classCode="ACTN" moodCode="PRMS"><subject typeCode="SUBJ"><encounterEvent classCode="ENC" moodCode="EVN"><id><item root="2.16.156.10011.1.11" extension="6000978516"/><item extension="12428490"/><item extension="2"/></id><code code="1" codeSystem="2.16.156.10011.2.3.1.271" codeSystemName="患者类型代码表"><displayName value="门诊"/><originalText value="初诊"/></code><statusCode/><effectiveTime><low value="20220308"/><high value="20220308"/><any value="上午"/></effectiveTime><reasonCode><item><originalText value=""/><dispalyName value=""/></item></reasonCode><admissionReferralSourceCode code="212" codeSystem="2.16.156.10011.2.3.1.248" codeSystemName="医疗保险类别代码"><displayName value="API广州医保"/></admissionReferralSourceCode><subject typeCode="SBJ"><patient classCode="PAT"><id><item extension="6000978516"/></id><patientPerson><id><item root="2.16.156.10011.1.3" extension="440903201604111256"/></id><name xsi:type="DSET_EN"><item><part value="冯颢文"/></item></name><administrativeGenderCode code="1" codeSystem="2.16.156.10011.2.3.3.4"><displayName value="男"/></administrativeGenderCode><birthTime value="20160411"/></patientPerson></patient></subject><admitter typeCode="ADM"><time/><assignedPerson classCode="ASSIGNED"><id><item root="2.16.156.10011.1.4" extension="053249"/></id><assignedPerson classCode="PSN" determinerCode="INSTANCE"><name xsi:type="DSET_EN"><item><part value="李键文"/></item></name></assignedPerson></assignedPerson></admitter><location typeCode="LOC"><time/><statusCode code="active"/><serviceDeliveryLocation classCode="SDLOC"><location classCode="PLC" determinerCode="INSTANCE"><id><item root="2.16.156.10011.1.26" extension="0189"/></id><name xsi:type="DSET_EN"><item><part value="荔湾院区儿童口腔科"/></item></name></location><serviceProviderOrganization classCode="ORG" determinerCode="INSTANCE"><id><item root="2.16.156.10011.1.5" extension=""/></id></serviceProviderOrganization></serviceDeliveryLocation></location><reason typeCode="RSON"><observationDx classCode="OBS" moodCode="EVN"><code/><statusCode/><value code="K02.001" codeSystem="2.16.156.10011.2.3.3.11" codeSystemName="ICD-10"><displayName value="牙齿白斑点损害"/></value><author typeCode="AUT"><assignedEntity classCode="ASSIGNED"><id><item root="2.16.156.10011.1.4" extension="06"/></id></assignedEntity></author></observationDx></reason></encounterEvent></subject><queryAck><queryId extension="22a0f9e0-4454-11dc-a6be-8888888"/><queryResponseCode code="OK"/><resultTotalQuantity value="1"/></queryAck></controlActProcess></PRPA_IN900350UV></return></ns2:pushResponse></soap:Body></soap:Envelope>"; + String result = WebServiceClientHelper.doPostSoap1_2(DatasyncConstant.TreatmentNumInfoQueryWebserviceAddress, inputXml); + logger.info("门诊挂号信息查询服务接口返回信息:" + result); + //解析xml获取患者手术单信息 + PatientInfoVO[] patientInfoVOs = buidPatientInfoByXML(result); + return patientInfoVOs; + } catch (Exception e) { + e.printStackTrace(); + logger.info("门诊挂号信息查询服务接口查询失败:" + e.getMessage()); + } + return null; + } + + @SuppressWarnings("unchecked") + private PatientInfoVO[] buidPatientInfoByXML(String responce) throws Exception { + + List patientInfoVOList = new ArrayList(); + if(StringUtils.isBlank(responce)){ + return null; + } + + responce = StringEscapeUtils.unescapeHtml(responce); + + int beginIndex = responce.indexOf(""); + if(beginIndex == -1 || endIndex == -1){ + return null; + } + responce = responce.substring(beginIndex, endIndex + "".length()); + Document document = DocumentHelper.parseText(responce.trim()); + Map nameSpaceURIMap = new HashMap(); + nameSpaceURIMap.put("s", "urn:hl7-org:v3"); + + //typeCode为处理结果,AA表示成功 AE表示失败 + String typeCodeXpath = "/PRPA_IN900350UV/s:acknowledgement/@typeCode"; + String typeCode = WebServiceClientHelper.processDataByXpath(document, nameSpaceURIMap, typeCodeXpath); + if(StringUtils.equals(typeCode, DatasyncConstant.FAIL_STATUS)){ + /*String messageXpath = "/PRPA_IN201306UV02/s:acknowledgement/s:acknowledgementDetail/s:text/@value"; + String message = processDataByXpath(document, nameSpaceURIMap, messageXpath); + throw new SystemException("typeCode = " + DatasyncConstant.FAIL_STATUS + ",处理结果说明:" + message);*/ + return null; + } + + //subject节点可以有多个,一个节点代表一个手术申请单 + String subjectXpath = "/PRPA_IN900350UV/s:controlActProcess/s:subject"; + XPath xpath = document.createXPath(subjectXpath); + xpath.setNamespaceURIs(nameSpaceURIMap); + List subjectNodeList = xpath.selectNodes(document, xpath); + if(CollectionUtils.isEmpty(subjectNodeList)){ + return null; + } + + for(int i=1;i<=subjectNodeList.size();i++){ + PatientInfoVO patientInfoVO = new PatientInfoVO(); + String patientXpath = subjectXpath + "[" + i + "]/s:encounterEvent/s:subject/s:patient/s:patientPerson"; + //姓名 + String patientNameXpath = patientXpath + "/s:name/s:item/s:part/@value"; + String patientName = WebServiceClientHelper.processDataByXpath(document, nameSpaceURIMap, patientNameXpath); + patientInfoVO.setPatientName(patientName); + //年龄 + String birthTimeXpath = patientXpath + "/s:birthTime/@value"; + String birthTime = WebServiceClientHelper.processDataByXpath(document, nameSpaceURIMap, birthTimeXpath); + String patientAge = WebServiceClientHelper.birthdayToAge(birthTime); + patientInfoVO.setPatientAge(patientAge); + //性别 + String patientSexXpath = patientXpath + "/s:administrativeGenderCode/s:displayName/@value"; + String patientSex = WebServiceClientHelper.processDataByXpath(document, nameSpaceURIMap, patientSexXpath); + patientInfoVO.setPatientSex(patientSex); + //身份证号码 + String patientIDCardXpath = patientXpath + "/s:id/s:item/@extension"; + String patientIDCard = WebServiceClientHelper.processDataByXpath(document, nameSpaceURIMap, patientIDCardXpath);; + patientInfoVO.setPatientIDCard(patientIDCard); + + //科室名称 + String ascriptionDepartmentXpath = subjectXpath + "[" + i + "]/s:encounterEvent/s:location/s:serviceDeliveryLocation/s:location/s:name/s:item/s:part/@value"; + String ascriptionDepartment = WebServiceClientHelper.processDataByXpath(document, nameSpaceURIMap, ascriptionDepartmentXpath); + patientInfoVO.setAscriptionDepartment(ascriptionDepartment); + + //诊断医师信息 + String doctorXpath = subjectXpath + "[" + i + "]/s:encounterEvent/s:admitter/s:assignedPerson/s:assignedPerson/s:name/s:item/s:part/@value"; + String doctorName = WebServiceClientHelper.processDataByXpath(document, nameSpaceURIMap, doctorXpath); + patientInfoVO.setDoctorName(doctorName); + + //诊断描述 + List operationList = new ArrayList(); + String operationXpathStr = subjectXpath + "[" + i + "]/s:encounterEvent/s:reason"; + XPath operationXpath = document.createXPath(operationXpathStr); + operationXpath.setNamespaceURIs(nameSpaceURIMap); + List operationNodeList = operationXpath.selectNodes(document, operationXpath); + if(CollectionUtils.isNotEmpty(operationNodeList)){ + for(int j=1;j<=operationNodeList.size();j++){ + String operationJXpath = operationXpathStr + "[" + j + "]/s:observationDx/s:value/s:displayName/@value"; + String operationJ = WebServiceClientHelper.processDataByXpath(document, nameSpaceURIMap, operationJXpath); + operationList.add(operationJ); + } + patientInfoVO.setOperation(StringTools.join(operationList, ";")); + patientInfoVOList.add(patientInfoVO); + } + + if(CollectionUtils.isNotEmpty(patientInfoVOList)){ + PatientInfoVO[] patientInfoVOs = new PatientInfoVO[]{patientInfoVOList.get(0)}; + return patientInfoVOs; + } + + } + return null; + } + +}