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