Index: ssts-web/src/main/webapp/disinfectsystem/config/gdskqyy/spring/HIS.xml
===================================================================
diff -u -r32744 -r33359
--- ssts-web/src/main/webapp/disinfectsystem/config/gdskqyy/spring/HIS.xml (.../HIS.xml) (revision 32744)
+++ ssts-web/src/main/webapp/disinfectsystem/config/gdskqyy/spring/HIS.xml (.../HIS.xml) (revision 33359)
@@ -45,42 +45,11 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
\ No newline at end of file
Index: ssts-webservice/src/main/java/com/forgon/disinfectsystem/webservice/datasync/gdskqyy/OrgUserDataWebServiceManagerImpl.java
===================================================================
diff -u
--- ssts-webservice/src/main/java/com/forgon/disinfectsystem/webservice/datasync/gdskqyy/OrgUserDataWebServiceManagerImpl.java (revision 0)
+++ ssts-webservice/src/main/java/com/forgon/disinfectsystem/webservice/datasync/gdskqyy/OrgUserDataWebServiceManagerImpl.java (revision 33359)
@@ -0,0 +1,227 @@
+package com.forgon.disinfectsystem.webservice.datasync.gdskqyy;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.jws.WebMethod;
+import javax.jws.WebService;
+
+import net.sf.json.JSONArray;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang.StringUtils;
+import org.apache.log4j.Logger;
+import org.dom4j.Document;
+import org.dom4j.DocumentHelper;
+import org.dom4j.Node;
+import org.dom4j.XPath;
+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;
+import com.forgon.exception.SystemException;
+
+@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 = "0";
+ String resultMessage = "";
+ if (StringUtils.isNotBlank(xmlData)) {
+ try {
+ //解析xml获取科室VO
+ OrgUnitVo[] allVos = buildOrgUnitVoByXML(xmlData);
+ if(allVos != null){
+ logger.debug(JSONArray.fromObject(allVos));
+ dataSynchronizationManager.processSyncOrgUnitData(allVos);
+ }
+ resultCode = "1";
+ resultMessage = "成功";
+ } catch (Exception e) {
+ resultMessage = "同步失败:" + e.getMessage();
+ e.printStackTrace();
+ }
+ }else{
+ resultMessage = "入参数据为空";
+ }
+ return "" + resultCode + "" + resultMessage + "";
+ }
+
+ /**
+ * 解析xml获取科室VO
+ * @param xmlData
+ * @return
+ * @throws Exception
+ */
+ @SuppressWarnings("unchecked")
+ private OrgUnitVo[] buildOrgUnitVoByXML(String xmlData) throws Exception {
+ List orgUnitVoList = new ArrayList();
+ Document document = DocumentHelper.parseText(xmlData.trim());
+ Map nameSpaceURIMap = new HashMap();
+ nameSpaceURIMap.put("s", "urn:hl7-org:v3");
+
+ //subject节点可以有多个,一个节点代表一个科室
+ String subjectXpath = "/PRPM_IN401030UV01/s:controlActProcess/s:subject";
+ XPath xpath = document.createXPath(subjectXpath);
+ xpath.setNamespaceURIs(nameSpaceURIMap);
+ List subjectNodeList = xpath.selectNodes(document, xpath);
+ if(CollectionUtils.isEmpty(subjectNodeList)){
+ throw new SystemException("未找到科室信息");
+ }
+
+ for(int i=1;i<=subjectNodeList.size();i++){
+
+ OrgUnitVo orgUnitVo = new OrgUnitVo();
+ //科室编码
+ String deptCodeXpath = subjectXpath + "[" + i + "]/s:registrationRequest/s:subject1/s:assignedEntity/s:id/@extension";
+ String deptCode = processDataByXpath(document, nameSpaceURIMap, deptCodeXpath);
+ orgUnitVo.setDeptCode(deptCode);
+ //科室名称
+ String deptNameXpath = subjectXpath + "[" + i + "]/s:registrationRequest/s:subject1/s:assignedEntity/s:name";
+ String deptName = processDataByXpath(document, nameSpaceURIMap, deptNameXpath);
+ orgUnitVo.setDeptName(deptName);
+ //上级科室编码
+ String parentCodingXpath = subjectXpath + "[" + i + "]/s:registrationRequest/s:subject1/s:assignedEntity/s:assignedPrincipalOrganization"
+ + "/s:asAffiliate/s:affiliatedPrincipalOrganization/s:id/@extension";
+ String parentCoding = processDataByXpath(document, nameSpaceURIMap, parentCodingXpath);
+ orgUnitVo.setParentCoding(parentCoding);
+ orgUnitVoList.add(orgUnitVo);
+ }
+
+ if(CollectionUtils.isNotEmpty(orgUnitVoList)){
+ OrgUnitVo[] allVos = new OrgUnitVo[orgUnitVoList.size()];
+ for (int i=0;i" + resultCode + "" + resultMessage + "";
+ }
+
+ /**
+ * 解析xml获取用户vo
+ * @param xmlData
+ * @return
+ * @throws Exception
+ */
+ @SuppressWarnings("unchecked")
+ private UserVo[] buildUserVoByXML(String xmlData) throws Exception {
+ List userVoList = new ArrayList();
+ Document document = DocumentHelper.parseText(xmlData.trim());
+ Map nameSpaceURIMap = new HashMap();
+ nameSpaceURIMap.put("s", "urn:hl7-org:v3");
+
+ //subject节点可以有多个,一个节点代表一个科室
+ String subjectXpath = "/PRPM_IN301010UV01/s:controlActProcess/s:subject";
+ XPath xpath = document.createXPath(subjectXpath);
+ xpath.setNamespaceURIs(nameSpaceURIMap);
+ List subjectNodeList = xpath.selectNodes(document, xpath);
+ if(CollectionUtils.isEmpty(subjectNodeList)){
+ throw new SystemException("未找到人员信息");
+ }
+ for(int i=1;i<=subjectNodeList.size();i++){
+ UserVo userVo = new UserVo();
+ //工号,包含在translation扩展字段中,需要循环获取
+ String translationXpathStr = subjectXpath + "[" + i + "]/s:registrationRequest/s:subject1/s:assignedEntity"
+ + "/s:subjectOf2/s:roleActivation/s:reasonCode/s:displayName/s:translation";
+ XPath translationXpath = document.createXPath(translationXpathStr);
+ translationXpath.setNamespaceURIs(nameSpaceURIMap);
+ List translationNodeList = translationXpath.selectNodes(document, translationXpath);
+ if(CollectionUtils.isNotEmpty(translationNodeList)){
+ for (int j=1;j<=translationNodeList.size();j++) {
+ String flavorIdXpath = translationXpathStr + "[" + j + "]/@flavorId";
+ String flavorId = processDataByXpath(document, nameSpaceURIMap, flavorIdXpath);
+ if(StringUtils.equals("USER_LOGIN_NAME", flavorId)){
+ String valueXpath = translationXpathStr + "[" + j + "]/@value";
+ String value = processDataByXpath(document, nameSpaceURIMap, valueXpath);
+ userVo.setCoding(value);
+ }
+ }
+ }
+
+ //姓名
+ String nameXpath = subjectXpath + "[" + i + "]/s:registrationRequest/s:subject1/s:healthCareProvider/s:healthCarePrincipalPerson/s:name";
+ String name = processDataByXpath(document, nameSpaceURIMap, nameXpath);
+ userVo.setName(name);
+ //所属科室编码
+ String deptCodeXpath = subjectXpath + "[" + i + "]/s:registrationRequest/s:subject1/s:healthCareProvider/s:healthCarePrincipalPerson/s:asAffiliate/s:affiliatedPrincipalOrganization/s:id/@extension";
+ String deptCode = processDataByXpath(document, nameSpaceURIMap, deptCodeXpath);
+ userVo.setDeptCode(deptCode);
+ userVoList.add(userVo);
+ }
+
+ if(CollectionUtils.isNotEmpty(userVoList)){
+ UserVo[] userVos = new UserVo[userVoList.size()];
+ for(int i=0;i 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 "";
+ }
+
+}
Index: ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/gdskqyy/WebServiceClientHelper.java
===================================================================
diff -u
--- ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/gdskqyy/WebServiceClientHelper.java (revision 0)
+++ ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/gdskqyy/WebServiceClientHelper.java (revision 33359)
@@ -0,0 +1,221 @@
+package com.forgon.disinfectsystem.datasynchronization.dao.gdskqyy;
+
+import java.nio.charset.Charset;
+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 com.forgon.tools.date.DateTools;
+
+/**
+ * 广东省口腔医院webservice帮助类
+ * @author ZhouPeiMian
+ * @since 2022-03-09
+ *
+ */
+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("");
+ // receiver
+ inputXmlSB.append("");
+ inputXmlSB.append("");
+ inputXmlSB.append("");
+ inputXmlSB.append("- ");
+ inputXmlSB.append("
");
+ inputXmlSB.append("");
+ // sender
+ inputXmlSB.append("");
+ inputXmlSB.append("");
+ inputXmlSB.append("");
+ inputXmlSB.append("- ");
+ inputXmlSB.append("
");
+ inputXmlSB.append("");
+ // controlActProcess
+ 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("");
+
+ //查询条件:患者ID@extension
+ 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.PatientInfoQueryInteractionId)){
+ inputXmlSB.append("");
+ inputXmlSB.append("");
+ inputXmlSB.append("");
+ inputXmlSB.append("");
+ inputXmlSB.append("");
+ inputXmlSB.append("");
+ inputXmlSB.append("");
+ // receiver
+ inputXmlSB.append("");
+ inputXmlSB.append("");
+ inputXmlSB.append("");
+ inputXmlSB.append(" ");
+ inputXmlSB.append("");
+ inputXmlSB.append("");
+ // sender
+ 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;
+ }
+
+}
Index: ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/gdskqyy/FindPatientInfoByTreatmentNumDaoImpl.java
===================================================================
diff -u
--- ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/gdskqyy/FindPatientInfoByTreatmentNumDaoImpl.java (revision 0)
+++ ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/gdskqyy/FindPatientInfoByTreatmentNumDaoImpl.java (revision 33359)
@@ -0,0 +1,31 @@
+package com.forgon.disinfectsystem.datasynchronization.dao.gdskqyy;
+
+import org.apache.log4j.Logger;
+
+import com.forgon.disinfectsystem.datasynchronization.dao.FindPatientInfoByHospitalNumDao;
+import com.forgon.disinfectsystem.datasynchronization.dao.FindPatientInfoByTreatmentNumDao;
+import com.forgon.disinfectsystem.datasynchronization.model.PatientInfoVO;
+
+/**
+ * 根据诊疗号查询病人信息(广东省口腔医院)
+ * @author ZhouPeiMian
+ * @since 2022-03-09
+ *
+ */
+public class FindPatientInfoByTreatmentNumDaoImpl implements
+ FindPatientInfoByTreatmentNumDao {
+
+ Logger logger = Logger.getLogger(FindPatientInfoByTreatmentNumDaoImpl.class);
+
+ private FindPatientInfoByHospitalNumDao findPatientInfoByHospitalNumDao;
+
+ public void setFindPatientInfoByHospitalNumDao(FindPatientInfoByHospitalNumDao findPatientInfoByHospitalNumDao) {
+ this.findPatientInfoByHospitalNumDao = findPatientInfoByHospitalNumDao;
+ }
+
+ @Override
+ public PatientInfoVO[] findPatientInfoByTreatmentNum(String clinicNumber) {
+ return findPatientInfoByHospitalNumDao.findPatientInfoByHospitalNum(clinicNumber);
+ }
+
+}
Index: ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/gdskqyy/FindPatientInfoByHospitalNumDaoImpl.java
===================================================================
diff -u
--- ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/gdskqyy/FindPatientInfoByHospitalNumDaoImpl.java (revision 0)
+++ ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/gdskqyy/FindPatientInfoByHospitalNumDaoImpl.java (revision 33359)
@@ -0,0 +1,372 @@
+package com.forgon.disinfectsystem.datasynchronization.dao.gdskqyy;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.collections.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.dao.gdskqyy.DatasyncConstant;
+import com.forgon.disinfectsystem.datasynchronization.model.PatientInfoVO;
+import com.forgon.tools.date.DateTools;
+import com.forgon.tools.db.DatabaseUtil;
+
+/**
+ * 根据住院号查询病人信息(广东省口腔医院)
+ * @author ZhouPeiMian
+ * @since 2022-03-09
+ *
+ */
+public class FindPatientInfoByHospitalNumDaoImpl implements
+ FindPatientInfoByHospitalNumDao {
+
+ Logger logger = Logger.getLogger(FindPatientInfoByHospitalNumDaoImpl.class);
+
+ @Override
+ public PatientInfoVO[] findPatientInfoByHospitalNum(String hospitalNum) {
+ try {
+ //根据患者ID查询手术申请单信息
+ PatientInfoVO[] patientInfoVOs = findOperationApplication(hospitalNum);
+
+ //查不到手术申请单时,再根据患者ID查询患者基本信息
+ if(patientInfoVOs == null || patientInfoVOs.length == 0){
+ logger.info("未找到患者ID=" + hospitalNum + "的手术申请单信息;开始查询患者基本信息");
+ patientInfoVOs = findPatientInfo(hospitalNum);
+ }
+
+ return patientInfoVOs;
+ } catch (Exception e) {
+ logger.error("查询失败" + e);
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ /**
+ * 根据患者ID查询患者基本信息
+ * @param hospitalNum
+ * @return
+ * @throws Exception
+ */
+ private PatientInfoVO[] findPatientInfo(String patientID) throws Exception {
+ String inputXml = WebServiceClientHelper.buildInputString(DatasyncConstant.PatientInfoQueryInteractionId, patientID);
+ logger.info("患者基本信息查询接口请求信息:" + inputXml);
+ String result = WebServiceClientHelper.doPostSoap1_2(DatasyncConstant.PatientInfoQueryWebserviceAddress, inputXml);
+ logger.info("患者基本信息查询接口返回信息:" + result);
+ //解析xml获取患者手术单信息
+ PatientInfoVO[] patientInfoVOs = buidPatientInfoByXML(result);
+ return patientInfoVOs;
+ }
+
+ /**
+ * 解析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;
+ }
+ int beginIndex = responce.indexOf("");
+ if(beginIndex == -1 || endIndex == -1){
+ return null;
+ }
+ responce = responce.substring(beginIndex + " nameSpaceURIMap = new HashMap();
+ nameSpaceURIMap.put("s", "urn:hl7-org:v3");
+
+ //typeCode为处理结果,AA表示成功 AE表示失败
+ String typeCodeXpath = "/PRPA_IN201306UV02/s:acknowledgement/@typeCode";
+ String typeCode = 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_IN201306UV02/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:registrationRequest/s:subject1/s:patient/s:patientPerson";
+ //姓名
+ String patientNameXpath = patientXpath + "/s:name/s:item/s:part/@value";
+ String patientName = processDataByXpath(document, nameSpaceURIMap, patientNameXpath);
+ patientInfoVO.setPatientName(patientName);
+ //年龄
+ String birthTimeXpath = patientXpath + "/s:birthTime/@value";
+ String birthTime = processDataByXpath(document, nameSpaceURIMap, birthTimeXpath);
+ String patientAge = birthdayToAge(birthTime);
+ patientInfoVO.setPatientAge(patientAge);
+ //性别
+ String patientSexXpath = patientXpath + "/s:administrativeGenderCode/s:displayName/@value";
+ String patientSex = processDataByXpath(document, nameSpaceURIMap, patientSexXpath);
+ patientInfoVO.setPatientSex(patientSex);
+ //身份证号码
+ String patientIDCardXpath = patientXpath + "/s:id/s:item/@extension";
+ String patientIDCard = processDataByXpath(document, nameSpaceURIMap, patientIDCardXpath);;
+ patientInfoVO.setPatientIDCard(patientIDCard);
+ patientInfoVOList.add(patientInfoVO);
+ }
+
+ if(CollectionUtils.isNotEmpty(patientInfoVOList)){
+ PatientInfoVO[] patientInfoVOs = new PatientInfoVO[]{patientInfoVOList.get(0)};
+ return patientInfoVOs;
+ }
+
+ return null;
+ }
+
+ /**
+ * 根据患者ID查询手术申请单信息
+ * @param hospitalNum
+ * @return
+ * @throws Exception
+ */
+ private PatientInfoVO[] findOperationApplication(String hospitalNum) throws Exception {
+ String inputXml = WebServiceClientHelper.buildInputString(DatasyncConstant.OperationInfoQueryInteractionId, hospitalNum);
+ logger.info("手术申请信息查询接口请求信息:" + inputXml);
+ String result = WebServiceClientHelper.doPostSoap1_2(DatasyncConstant.OperationInfoQueryWebserviceAddress, inputXml);
+ logger.info("手术申请信息查询接口返回信息:" + result);
+ //解析xml获取患者手术单信息
+ PatientInfoVO[] patientInfoVOs = buidOperationInfoByXML(result);
+ return patientInfoVOs;
+ }
+
+ /**
+ * 解析xml获取手术信息
+ * @param result
+ * @return
+ * @throws Exception
+ */
+ @SuppressWarnings("unchecked")
+ private PatientInfoVO[] buidOperationInfoByXML(String responce) throws Exception {
+ List patientInfoVOList = new ArrayList();
+ if(StringUtils.isBlank(responce)){
+ return null;
+ }
+ int beginIndex = responce.indexOf("");
+ if(beginIndex == -1 || endIndex == -1){
+ return null;
+ }
+ responce = responce.substring(beginIndex + " nameSpaceURIMap = new HashMap();
+ nameSpaceURIMap.put("s", "urn:hl7-org:v3");
+
+ //typeCode为处理结果,AA表示成功 AE表示失败
+ String typeCodeXpath = "/QUMT_IN020040UV01/s:acknowledgement/@typeCode";
+ String typeCode = processDataByXpath(document, nameSpaceURIMap, typeCodeXpath);
+ if(StringUtils.equals(typeCode, DatasyncConstant.FAIL_STATUS)){
+ /*String messageXpath = "/QUMT_IN020040UV01/s:acknowledgement/s:acknowledgementDetail/s:text/@value";
+ String message = processDataByXpath(document, nameSpaceURIMap, messageXpath);
+ throw new SystemException(message);*/
+ return null;
+ }
+
+ //subject节点可以有多个,一个节点代表一个手术申请单
+ String subjectXpath = "/QUMT_IN020040UV01/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 tempSubjectXpath = subjectXpath + "[" + i + "]" + "/s:procedureRequest";
+
+ //手术申请单号
+ String operationScheduleIdXpath = tempSubjectXpath + "/s:id/s:item/@extension";
+ String operationScheduleId = processDataByXpath(document, nameSpaceURIMap, operationScheduleIdXpath);
+ patientInfoVO.setOperationScheduleId(operationScheduleId);
+
+ //component2节点为手术信息,包含手术名称、手术预约时间
+ //手术名称
+ String opeartionXpath = tempSubjectXpath + "/s:component2/s:procedureRequest/s:code/s:displayName/@value";
+ String opeartion = processDataByXpath(document, nameSpaceURIMap, opeartionXpath);
+ patientInfoVO.setOperation(opeartion);
+ //手术医生
+ String doctorNameXpath = tempSubjectXpath + "/s:component2/s:procedureRequest/s:performer/s:assignedEntity/s:code/s:displayName/@value";
+ String doctorName = processDataByXpath(document, nameSpaceURIMap, doctorNameXpath);
+ patientInfoVO.setDoctorName(doctorName);
+ //预订手术时间
+ String operationTimeXpath = tempSubjectXpath + "/s:component2/s:procedureRequest/s:performer/s:time/s:low/@value";
+ String operationTime = processDataByXpath(document, nameSpaceURIMap, operationTimeXpath);
+ Date operationDateTime = DateTools.coverStrToDate(operationTime, "yyyyMMddHHmm");
+ if(operationDateTime != null){
+ operationTime = DateTools.getFormatDateStr(operationDateTime, DateTools.COMMON_DATE_HMS);
+ patientInfoVO.setOperationTime(operationTime);
+ }
+
+ //componentOf1节点为就诊信息,包含患者基本信息和住院信息
+ //就诊次数
+ String visitIdXpath = tempSubjectXpath + "/s:componentOf1/s:encounter/s:id/s:item/@extension";
+ String visitId = processDataByXpath(document, nameSpaceURIMap, visitIdXpath);
+ patientInfoVO.setVisitId(DatabaseUtil.isPoIdValid(visitId) ? Long.valueOf(visitId) : null);
+
+ //患者基本信息
+ //患者姓名
+ String patientNameXpath = tempSubjectXpath + "/s:componentOf1/s:encounter/s:subject/s:patient/s:patientPerson/s:name/s:item/s:part/@value";
+ String patientName = processDataByXpath(document, nameSpaceURIMap, patientNameXpath);
+ patientInfoVO.setPatientName(patientName);
+ //性别代码
+ String patientSexXpath = tempSubjectXpath + "/s:componentOf1/s:encounter/s:subject/s:patient/s:patientPerson/s:administrativeGenderCode/s:displayName/@value";
+ String patientSex = processDataByXpath(document, nameSpaceURIMap, patientSexXpath);
+ patientInfoVO.setPatientSex(patientSex);
+ //年龄
+ String patientAgeXpath = tempSubjectXpath + "/s:componentOf1/s:encounter/s:subject/s:patient/s:patientPerson/s:birthTime/s:originalText/@value";
+ String patientAge = processDataByXpath(document, nameSpaceURIMap, patientAgeXpath);
+ patientInfoVO.setPatientAge(patientAge);
+ //门诊号
+ String clinicNumberXpath = tempSubjectXpath + "/s:componentOf1/s:encounter/s:subject/s:patient/s:id/s:item[3]/@extension";
+ String clinicNumber = processDataByXpath(document, nameSpaceURIMap, clinicNumberXpath);
+ patientInfoVO.setClinicNumber(clinicNumber);
+ //住院号
+ String hospitalNumberXpath = tempSubjectXpath + "/s:componentOf1/s:encounter/s:subject/s:patient/s:id/s:item[4]/@extension";
+ String hospitalNumber = processDataByXpath(document, nameSpaceURIMap, hospitalNumberXpath);
+ patientInfoVO.setHospitalNumber(hospitalNumber);
+ //身份证号码
+ String patientIDCardXpath = tempSubjectXpath + "/s:componentOf1/s:encounter/s:subject/s:patient/s:patientPerson/s:id/s:item[1]/@extension";
+ String patientIDCard = processDataByXpath(document, nameSpaceURIMap, patientIDCardXpath);
+ patientInfoVO.setPatientIDCard(patientIDCard);
+ //病床号
+ String bedNumberXpath = tempSubjectXpath + "/s:componentOf1/s:encounter/s:location/s:serviceDeliveryLocation/s:location/s:name/s:item/s:part/@value";
+ String bedNumber = processDataByXpath(document, nameSpaceURIMap, bedNumberXpath);
+ patientInfoVO.setBedNumber(bedNumber);
+ //病房号
+ String roomNumberXpath = tempSubjectXpath + "/s:componentOf1/s:encounter/s:location/s:serviceDeliveryLocation/s:location/s:asLocatedEntityPartOf/s:location/s:name/s:item/s:part/@value";
+ String roomNumber = processDataByXpath(document, nameSpaceURIMap, roomNumberXpath);
+ patientInfoVO.setRoomNumber(roomNumber);
+ //病区名称
+ String patientAreaXpath = tempSubjectXpath + "/s:componentOf1/s:encounter/s:location/s:serviceDeliveryLocation/s:serviceProviderOrganization/s:asOrganizationPartOf/s:wholeOrganization/s:name/s:item/s:part/@value";
+ String patientArea = processDataByXpath(document, nameSpaceURIMap, patientAreaXpath);
+ patientInfoVO.setPatientArea(patientArea);
+ //科室名称
+ String ascriptionDepartmentXpath = tempSubjectXpath + "/s:componentOf1/s:encounter/s:location/s:serviceDeliveryLocation/s:serviceProviderOrganization/s:name/s:item/s:part/@value";
+ String ascriptionDepartment = processDataByXpath(document, nameSpaceURIMap, ascriptionDepartmentXpath);
+ patientInfoVO.setAscriptionDepartment(ascriptionDepartment);
+
+ //此节点可以重复使用,作为扩展节点(洗手护士、巡回护士)
+ String translationXpathStr = subjectXpath + "[" + i + "]" + "/s:procedureRequest/s:code/s:translation";
+ XPath translationXpath = document.createXPath(translationXpathStr);
+ translationXpath.setNamespaceURIs(nameSpaceURIMap);
+ List translationNodeList = translationXpath.selectNodes(document, translationXpath);
+ if(translationNodeList != null && translationNodeList.size() > 0){
+ for(int j=1;j<=translationNodeList.size();j++){
+ String translationXpathJ = translationXpathStr + "[" + j + "]";
+ String codeXpathStr = translationXpathJ + "/@code";
+ String code = processDataByXpath(document, nameSpaceURIMap, codeXpathStr);
+ String value = processDataByXpath(document, nameSpaceURIMap, translationXpathJ);
+ if(StringUtils.equals("巡回护士姓名", code)){
+ patientInfoVO.setCircuitNurse(value);
+ }
+ if(StringUtils.equals("器械护士姓名", code)){
+ patientInfoVO.setWashHandNurse(value);
+ }
+ if(StringUtils.equals("手术间", code)){
+ patientInfoVO.setOpRoomId(value);
+ }
+ }
+ }
+
+ patientInfoVOList.add(patientInfoVO);
+ }
+
+ if(CollectionUtils.isNotEmpty(patientInfoVOList)){
+ //根据手术时间倒序排序,返回最新的手术申请单
+ patientInfoVOList.sort(new Comparator() {
+ @Override
+ public int compare(PatientInfoVO o1, PatientInfoVO o2) {
+ return StringUtils.compare(o2.getOperationTime(), o1.getOperationTime());
+ }
+
+ });
+ PatientInfoVO[] patientInfoVOs = new PatientInfoVO[]{patientInfoVOList.get(0)};
+ return patientInfoVOs;
+ }
+
+ return null;
+ }
+
+ @Override
+ public PatientInfoVO[] findPatientInfoByHospitalNumBeforeOperation(String hospitalNum) {
+ return findPatientInfoByHospitalNum(hospitalNum);
+ }
+
+ /**
+ * 解析xml字段
+ * @param document
+ * @param nameSpaceURIMap
+ * @param xpathExp
+ * @return
+ */
+ private 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
+ */
+ private 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-web/src/main/webapp/disinfectsystem/config/gdskqyy/spring/webservice-cxf.xml
===================================================================
diff -u
--- ssts-web/src/main/webapp/disinfectsystem/config/gdskqyy/spring/webservice-cxf.xml (revision 0)
+++ ssts-web/src/main/webapp/disinfectsystem/config/gdskqyy/spring/webservice-cxf.xml (revision 33359)
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
Index: ssts-webservice/src/main/java/com/forgon/disinfectsystem/webservice/datasync/gdskqyy/OrgUserDataWebServiceManager.java
===================================================================
diff -u
--- ssts-webservice/src/main/java/com/forgon/disinfectsystem/webservice/datasync/gdskqyy/OrgUserDataWebServiceManager.java (revision 0)
+++ ssts-webservice/src/main/java/com/forgon/disinfectsystem/webservice/datasync/gdskqyy/OrgUserDataWebServiceManager.java (revision 33359)
@@ -0,0 +1,28 @@
+package com.forgon.disinfectsystem.webservice.datasync.gdskqyy;
+
+import javax.jws.WebMethod;
+import javax.jws.WebParam;
+import javax.jws.WebService;
+
+/**
+ * 科室人员数据webserivce
+ * @author zhoupeimian
+ * @since 2022-03-10
+ *
+ */
+@WebService
+public interface OrgUserDataWebServiceManager {
+
+ /**
+ * 调用接口推送科室数据
+ */
+ @WebMethod(action="dealOrgUnit")
+ public String dealOrgUnit(@WebParam(name = "xmlData") String xmlData);
+
+ /**
+ * 调用接口推送人员数据
+ */
+ @WebMethod(action="dealUser")
+ public String dealUser(@WebParam(name = "xmlData") String xmlData);
+
+}
Index: ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/gdskqyy/DatasyncConstant.java
===================================================================
diff -u
--- ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/gdskqyy/DatasyncConstant.java (revision 0)
+++ ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/gdskqyy/DatasyncConstant.java (revision 33359)
@@ -0,0 +1,41 @@
+package com.forgon.disinfectsystem.datasynchronization.dao.gdskqyy;
+
+/**
+ * 广东省口腔医院接口相关常量
+ * @author ZhouPeiMian
+ * @since 2022-03-09
+ *
+ */
+public class DatasyncConstant {
+
+ /**
+ * 手术信息查询调用地址Webservice地址
+ */
+ public final static String OperationInfoQueryWebserviceAddress = "http://172.16.1.14/soap/JHIPLIB.SOAP.BS.HL7V3Service.cls?CfgItem=JH0215手术申请信息查询服务";
+
+ /**
+ * 患者基础信息查询服务调用地址
+ */
+ public final static String PatientInfoQueryWebserviceAddress = "http://172.16.1.14/soap/JHIPLIB.SOAP.BS.HL7V3Service.cls?CfgItem=JH0004患者基本信息查询服务";
+
+ /**
+ * 手术信息查询的服务标识
+ */
+ public final static String OperationInfoQueryInteractionId = "JH0215";
+
+ /**
+ * 患者基础信息查询服务标识
+ */
+ public final static String PatientInfoQueryInteractionId = "JH0004";
+
+ /**
+ * 病人信息查询成功标识
+ */
+ public final static String SUCCESS_STATUS = "AA";
+
+ /**
+ * 病人信息查询失败标识
+ */
+ public final static String FAIL_STATUS = "AE";
+
+}