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