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