Index: ssts-web/src/main/webapp/disinfectsystem/config/blxrmyy/spring/webservice-cxf.xml =================================================================== diff -u --- ssts-web/src/main/webapp/disinfectsystem/config/blxrmyy/spring/webservice-cxf.xml (revision 0) +++ ssts-web/src/main/webapp/disinfectsystem/config/blxrmyy/spring/webservice-cxf.xml (revision 37729) @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + \ No newline at end of file Index: ssts-webservice/src/main/java/com/forgon/disinfectsystem/webservice/datasync/blxrmyy/HIPMessageServiceManagerImpl.java =================================================================== diff -u --- ssts-webservice/src/main/java/com/forgon/disinfectsystem/webservice/datasync/blxrmyy/HIPMessageServiceManagerImpl.java (revision 0) +++ ssts-webservice/src/main/java/com/forgon/disinfectsystem/webservice/datasync/blxrmyy/HIPMessageServiceManagerImpl.java (revision 37729) @@ -0,0 +1,424 @@ +package com.forgon.disinfectsystem.webservice.datasync.blxrmyy; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.UUID; + +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.directory.acegi.tools.AcegiHelper; +import com.forgon.directory.service.OrgUnitManager; +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; +import com.forgon.log.model.Log; +import com.forgon.log.service.LogManager; +import com.forgon.tools.date.DateTools; + +@WebService(serviceName = "HIPMessageServer",targetNamespace="www.goodwillcis.com") +public class HIPMessageServiceManagerImpl implements HIPMessageServiceManager { + + private final Logger logger = Logger.getLogger(this.getClass()); + /** + * 医疗卫生机构信息注册服务 + */ + public final static String INTERACTION_ID_JH0601 = "JH0601"; + /** + * 医疗卫生机构信息更新服务 + */ + public final static String INTERACTION_ID_JH0602 = "JH0602"; + /** + * 医疗卫生机构信息删除服务 + */ + //public final static String INTERACTION_ID_JH0603 = "JH0603"; + /** + * 医疗卫生机构信息查询服务 + */ + //public final static String INTERACTION_ID_JH0604 = "JH0604"; + /** + * 医疗卫生人员信息注册服务 + */ + public final static String INTERACTION_ID_JH0701 = "JH0701"; + /** + * 医疗卫生人员信息更新服务 + */ + public final static String INTERACTION_ID_JH0702 = "JH0702"; + /** + * 医疗卫生人员信息删除服务 + */ + //public final static String INTERACTION_ID_JH0703 = "JH0703"; + /** + * 医疗卫生人员信息查询服务 + */ + //public final static String INTERACTION_ID_JH0704 = "JH0704"; + + @Autowired + private DataSynchronizationManager dataSynchronizationManager; + + @Autowired + private LogManager appLogManager; + + @Autowired + private OrgUnitManager orgUnitManager; + + @Override + @WebMethod + public String HIPMessageServer(String xmlData) { + logger.debug("调用接口syncService,message="+xmlData); + String resultCode = "AE"; + String resultMessage = ""; + String interactionId = ""; + if (StringUtils.isNotBlank(xmlData)) { + try { + //服务标识,extension为唯一事件编码,区分服务事件(更新或者注册) + interactionId = returnInteractionId(xmlData); + if(StringUtils.isBlank(interactionId)){ + throw new RuntimeException("事件编码不能为空"); + } + if(StringUtils.equals(INTERACTION_ID_JH0601, interactionId) + || StringUtils.equals(INTERACTION_ID_JH0602, interactionId)){ + syncOrgUnit(xmlData); + }else if(StringUtils.equals(INTERACTION_ID_JH0701, interactionId) + || StringUtils.equals(INTERACTION_ID_JH0702, interactionId)){ + syncUser(xmlData); + }else{ + throw new RuntimeException("不支持的事件编码:" + interactionId); + } + resultCode = "AA"; + resultMessage = "成功"; + } catch (Exception e) { + resultMessage = "同步失败:" + e.getMessage(); + e.printStackTrace(); + } + }else{ + resultMessage = "入参数据为空"; + } + String responce = buildResponce(interactionId, resultCode, resultMessage); + appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_SYNC, "消息推送", "嘉和美康平台调用接口(syncService),入参:" + xmlData + ",出参:" + responce); + return responce; + } + + /** + * 科室同步 + * @param xmlData + * @throws Exception + */ + public void syncOrgUnit(String xmlData) throws Exception { + logger.debug("调用接口推送组织机构数据xmlData="+xmlData); + if (StringUtils.isNotBlank(xmlData)) { + //解析xml获取科室VO + OrgUnitVo[] allVos = buildOrgUnitVoByXML(xmlData); + if(allVos != null){ + logger.debug(JSONArray.fromObject(allVos)); + validateOrgUnitVo(allVos); + dataSynchronizationManager.processSyncOrgUnitData(allVos); + } + }else{ + throw new RuntimeException("入参数据为空"); + } + } + + /** + * 科室的父级科室是否存在 + * @param allVos + */ + private void validateOrgUnitVo(OrgUnitVo[] allVos) { + if(allVos == null || allVos.length == 0){ + return; + } + Set parentOrgUnitCodeSet = new HashSet(); + for (OrgUnitVo vo : allVos) { + if(StringUtils.isNotBlank(vo.getParentCoding())){ + parentOrgUnitCodeSet.add(vo.getParentCoding()); + if(StringUtils.equals(vo.getCoding(), vo.getParentCoding())){ + throw new RuntimeException("标识(科室编码)为(" + vo.getCoding() + ")的医疗卫生机构(科室)上级科室编码异常!"); + } + } + } + if(CollectionUtils.isEmpty(parentOrgUnitCodeSet)){ + return; + } + Map parentOrgUnitCodeNameMap = orgUnitManager.getOrgUnitCodeAndNameMapByOrgUnitCodes(parentOrgUnitCodeSet); + for (OrgUnitVo vo : allVos) { + if(StringUtils.isNotBlank(vo.getParentCoding())){ + if(!parentOrgUnitCodeNameMap.containsKey(vo.getParentCoding())){ + throw new RuntimeException("标识(科室编码)为(" + vo.getParentCoding() + ")的上级医疗卫生机构(科室)不存在"); + } + } + } + } + + /** + * 返回参数的服务标识 + * @param requestMessage + * @return + */ + private String returnInteractionId(String requestMessage){ + //服务标识,extension为唯一事件编码,区分服务事件(更新或者注册) + String interactionId = ""; + try { + Document document = DocumentHelper.parseText(requestMessage.trim()); + Map nameSpaceURIMap = new HashMap(); + nameSpaceURIMap.put("s", "urn:hl7-org:v3"); + //注册科室 + String rootXpath = "/PRPM_IN401030UV01"; + if(StringUtils.contains(requestMessage, "PRPM_IN403010UV01")){ + //更新科室 + rootXpath = "/PRPM_IN403010UV01"; + }else if(StringUtils.contains(requestMessage, "PRPM_IN303010UV01")){ + //更新用户 + rootXpath = "/PRPM_IN303010UV01"; + }else if(StringUtils.contains(requestMessage, "PRPM_IN301010UV01")){ + //注册用户 + rootXpath = "/PRPM_IN301010UV01"; + } + + String interactionIdXpath = rootXpath + "/s:interactionId/@extension"; + interactionId = processDataByXpath(document, nameSpaceURIMap, interactionIdXpath); + + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException("参数格式异常"); + } + return interactionId; + } + + /** + * 构建返回信息 + * @param requestMessage 请求信息 + * @param resultCode 处理结果 + * @param resultMessage 处理结果的提示信息 + * @return + */ + private String buildResponce(String interactionId, String resultCode, String resultMessage) { + + StringBuffer responce = new StringBuffer(); + responce.append(""); + responce.append(""); + responce.append(""); + responce.append(""); + responce.append(""); + responce.append(""); + responce.append(""); + responce.append(""); + responce.append(""); + responce.append(""); + responce.append(""); + responce.append(""); + responce.append(""); + responce.append(""); + responce.append(""); + responce.append(""); + responce.append(""); + responce.append(""); + responce.append(""); + responce.append(""); + responce.append(""); + responce.append(""); + responce.append("" + resultMessage + ""); + responce.append(""); + responce.append(""); + responce.append(""); + + return responce.toString(); + } + + /** + * 解析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"; + if(StringUtils.contains(xmlData, "PRPM_IN403010UV01")){ + //更新科室 + subjectXpath = "/PRPM_IN403010UV01/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 orgUnitCodeSet = new HashSet(); + for (UserVo vo : allVos) { + if(StringUtils.isNotBlank(vo.getOrgUnitCoding())){ + orgUnitCodeSet.add(vo.getOrgUnitCoding()); + } + } + if(CollectionUtils.isEmpty(orgUnitCodeSet)){ + return; + } + Map orgUnitCodeNameMap = orgUnitManager.getOrgUnitCodeAndNameMapByOrgUnitCodes(orgUnitCodeSet); + for (UserVo vo : allVos) { + if(StringUtils.isNotBlank(vo.getOrgUnitCoding())){ + if(!orgUnitCodeNameMap.containsKey(vo.getOrgUnitCoding())){ + throw new RuntimeException("标识为(" + vo.getOrgUnitCoding() + ")的医疗卫生机构(科室)不存在"); + } + } + } + } + + /** + * 解析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"; + if(StringUtils.contains(xmlData, "PRPM_IN303010UV01")){ + subjectXpath = "/PRPM_IN303010UV01/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 codeXpath = subjectXpath + "[" + i + "]/s:registrationRequest/s:subject1/s:healthCareProvider/s:id/@extension"; + String code = processDataByXpath(document, nameSpaceURIMap, codeXpath); + userVo.setCoding(code); + + //姓名 + 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-webservice/src/main/java/com/forgon/disinfectsystem/webservice/datasync/blxrmyy/HIPMessageServiceManager.java =================================================================== diff -u --- ssts-webservice/src/main/java/com/forgon/disinfectsystem/webservice/datasync/blxrmyy/HIPMessageServiceManager.java (revision 0) +++ ssts-webservice/src/main/java/com/forgon/disinfectsystem/webservice/datasync/blxrmyy/HIPMessageServiceManager.java (revision 37729) @@ -0,0 +1,17 @@ +package com.forgon.disinfectsystem.webservice.datasync.blxrmyy; + +import javax.jws.WebMethod; +import javax.jws.WebParam; +import javax.jws.WebService; + +/** + * 科室人员数据webserivceBLXRMYY-38 + * + */ +@WebService(targetNamespace = "www.goodwillcis.com") +public interface HIPMessageServiceManager { + + @WebMethod(action="HIPMessageServer", operationName="HIPMessageServer") + public String HIPMessageServer(@WebParam(name = "message") String xmlData); + +}