package com.vci.ubcs.code.service.impl; import com.alibaba.cloud.commons.lang.StringUtils; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.io.xml.DomDriver; import com.vci.ubcs.code.bo.CodeClassifyFullInfoBO; import com.vci.ubcs.code.dto.CodeOrderDTO; import com.vci.ubcs.code.dto.CodeOrderSecDTO; import com.vci.ubcs.code.entity.CodeBasicSec; import com.vci.ubcs.code.entity.CodeClassify; import com.vci.ubcs.code.entity.DockingLog; import com.vci.ubcs.code.enumpack.CodeSecTypeEnum; import com.vci.ubcs.code.service.*; import com.vci.ubcs.code.util.gennerAttrMapUtil; import com.vci.ubcs.code.vo.pagemodel.*; import com.vci.ubcs.code.vo.webserviceModel.apply.*; import com.vci.ubcs.code.vo.webserviceModel.attrmap.*; import com.vci.ubcs.code.vo.webserviceModel.result.json.*; import com.vci.ubcs.code.vo.webserviceModel.result.xml.XMLResultClassfyVO; import com.vci.ubcs.code.vo.webserviceModel.result.xml.XMLResultDataObjectDetailDO; import com.vci.ubcs.code.vo.webserviceModel.result.xml.XMLResultSystemVO; import com.vci.ubcs.starter.web.pagemodel.SessionInfo; import com.vci.ubcs.starter.web.util.BeanUtilForVCI; import com.vci.ubcs.starter.web.util.VciBaseUtil; import com.vci.ubcs.webservice.annotation.VciWebservice; import com.vci.ubcs.webservice.config.AttributeMapConfig; import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import javax.annotation.Resource; import javax.jws.WebService; import java.util.*; import java.util.stream.Collectors; import static com.vci.ubcs.code.constant.MdmEngineConstant.DEFAULT_SYNC_ATTR_LIST; /*** * 统一接口 */ @Service @Slf4j @VciWebservice(path = "/universalInterface") public class UniversalInterfaceImpl implements UniversalInterfaceI { /** * 日志 */ private Logger logger = LoggerFactory.getLogger(getClass()); @Autowired(required = false) private AttributeMapConfig attributeMapConfig; /** * 缓存服务 */ //@Autowired //private RedisService redisService; /** * 主题库分类的服务 */ @Autowired(required = false) private ICodeClassifyService classifyService; /** * 主数据引擎的服务 */ //@Resource //private MdmEngineService engineService; /** * 密级的服务 */ @Resource private MdmIOService mdmIOService; /*** * 集成接口日志服务的配置 */ @Resource private IDockingLogeService dockingLogeService; private static String separator="##VCI##"; private String errorid="0"; private String msg="成功"; private String objerrorCode="0"; private String objerrorMsg="成功"; /*** * 申请编码接口 * @param data 传递的数据参数 * @param dataType 标识data是xml格式还是json格式,接口返回数据也是按照这个格式,以下接口类同 * @return * @throws Throwable */ @Override public String applyCode(String data, String dataType) throws Throwable { { // String resultStr = ""; // String errorid="0"; // msg="成功"; // objerrorCode="0"; // objerrorMsg="成功"; // logger.info("申请编码的数据参数:->"+data); // logger.info("申请编码的数据类型:->"+dataType); // String systemId=""; // List resultClassfyVOList = new ArrayList<>(); // try { // if(StringUtils.isBlank(data)) { // errorid="101"; // throw new Throwable("接口参数:传递为空"); // } // InterParameterVO interParameterVO =new InterParameterVO(); // //如果dataType是xml则,通过xml序列化成对象形式,如果是json则通过json转换成对象格式 // try { // if ("xml".equals(dataType)) { // XStream xStream = new XStream(new DomDriver()); // xStream.processAnnotations(RootDataVO.class); // xStream.autodetectAnnotations(true); // RootDataVO rootDataVO = (RootDataVO) xStream.fromXML(data); // interParameterVO.setData(rootDataVO); // } else { // interParameterVO = JSONObject.toJavaObject(JSONObject.parseObject(data), InterParameterVO.class); // } // }catch (Throwable e){ // errorid="101"; // throw new Throwable("接口参数:传入数据参数解析失败"); // } // ClassfysVO classfysVO = interParameterVO.getData().getClassifys(); // systemId = interParameterVO.getData().getSystemId(); // UserVO userVo = interParameterVO.getData().getUser(); // List classVOList = classfysVO.getClassify(); // InterParameterVO finalInterParameterVO = interParameterVO; // // //这是账号信息 // SessionInfo sessionInfo = new SessionInfo(); // sessionInfo.setUserId(userVo.getUserName()); // sessionInfo.setUserName(userVo.getTrueName()); // sessionInfo.setIp(userVo.getIp()); // VciBaseUtil.setCurrentUserSessionInfo(sessionInfo); // // String finalSystemId = systemId; // classVOList.stream().forEach(classVO -> { // logger.info("参数:分类COde:" + classVO.getClassCode()); // LinkedList resultDataObjectDetailDOs = new LinkedList<>(); // //获取分类信息 // try { // String libray = classVO.getLibrary(); // CodeClassifyVO codeClassifyVO = getClassfy(classVO); // logger.info("end:分类查询完毕"); // //获取分类模板信息 // if(codeClassifyVO==null || StringUtils.isBlank(codeClassifyVO.getOid())){ // objerrorCode="100"; // throw new Throwable ("根据传输的分类,未获取到分类信息"); // } // CodeClstemplateVO templateVO = engineService.getUsedTemplateByClassifyOid(codeClassifyVO.getOid()); // if(templateVO==null||StringUtils.isBlank(templateVO.getOid())){ // objerrorCode="1"; // throw new Throwable ("根据传输的分类,未获取MDM系统中对应模板"); // } // logger.info("end:模板查询完毕"); // ApplyDatasVO applyDatasVO = classVO.getObjects(); // DataObjectVO dataObjectVO = new DataObjectVO(); // List attrVOS = templateVO.getAttributes().stream().filter(s -> !DEFAULT_SYNC_ATTR_LIST.contains(s.getId()) && VciBaseUtil.getBoolean(s.getFormDisplayFlag()) // ).collect(Collectors.toList()); // this.getConfigDatas(finalSystemId, libray, applyDatasVO, attrVOS, dataObjectVO); // logger.info("end:数据组织完毕"); // //规则的主键需要去获取 // CodeClassifyFullInfoBO classifyFullInfo = classifyService.getClassifyFullInfo(codeClassifyVO.getOid()); // if(classifyFullInfo==null ||classifyFullInfo.getCurrentClassifyVO()==null || StringUtils.isBlank(classifyFullInfo.getCurrentClassifyVO().getOid())){ // objerrorCode="1"; // logger.info("classifyFullInfo:"+"根据传输的分类,未获取分类相关信息"); // throw new Throwable ("根据传输的分类,未获取分类相关信息"); // } // CodeRuleVO ruleVO = engineService.getCodeRuleByClassifyFullInfo(classifyFullInfo); // if(ruleVO==null|| StringUtils.isBlank(ruleVO.getOid())){ // objerrorCode="102"; // throw new Throwable ("根据传输的分类,未获取MDM系统中对应规则"); // } // logger.info("end:规则获取完毕"); // List codeOrderSecDTOList = getRuleCodeOrderSecDTOs(classVO.getSections().getSection(), ruleVO); // logger.info("end:码段获取完毕"); // CodeOrderDTO orderDTO = new CodeOrderDTO(); // orderDTO.setCodeClassifyOid(codeClassifyVO.getOid());//分类主键 // orderDTO.setSecDTOList(codeOrderSecDTOList);//分类码段 // mdmIOService.batchSyncApplyCode(orderDTO, dataObjectVO, resultDataObjectDetailDOs); // logger.info("end:申请获取完毕"); // } catch (Throwable e) { // XMLResultDataObjectDetailDO xmlResultDataObjectDetailDO=new XMLResultDataObjectDetailDO(); // xmlResultDataObjectDetailDO.setCode(""); // xmlResultDataObjectDetailDO.setId(""); // xmlResultDataObjectDetailDO.setErrorid(objerrorCode); // xmlResultDataObjectDetailDO.setMsg("编码申请失败:"+e.getMessage()); // resultDataObjectDetailDOs.add(xmlResultDataObjectDetailDO); // e.printStackTrace(); // }finally { // XMLResultClassfyVO resultClassfyVO = new XMLResultClassfyVO(); // resultClassfyVO.setClassCode(classVO.getClassCode()); // resultClassfyVO.setLibrary(classVO.getLibrary()); // resultClassfyVO.setFullclsfNamePath(classVO.getFullclsfNamePath()); // resultClassfyVO.setObjects(resultDataObjectDetailDOs); // resultClassfyVOList.add(resultClassfyVO); // } // }); // XMLResultSystemVO xmlResultSystemVO=new XMLResultSystemVO(); // xmlResultSystemVO.setClassifys(resultClassfyVOList); // xmlResultSystemVO.setMsg(msg); // xmlResultSystemVO.setErrorid(errorid); // resultStr= transferResultXMl(xmlResultSystemVO,dataType); // }catch (Throwable e){ // e.printStackTrace();; // msg="申请编码失败:"+e.getMessage(); // }finally { // XMLResultSystemVO xmlResultSystemVO=new XMLResultSystemVO(); // xmlResultSystemVO.setClassifys(resultClassfyVOList); // xmlResultSystemVO.setMsg(msg); // xmlResultSystemVO.setErrorid(errorid); // resultStr= transferResultXMl(xmlResultSystemVO,dataType); // final boolean[] issucess = {true}; // if(!errorid.equals("0")) { // issucess[0] = false; // }else { // if(!CollectionUtils.isEmpty(resultClassfyVOList)) { // resultClassfyVOList.stream().forEach(xMLResultClassfyVO -> { // xMLResultClassfyVO.getObjects().stream().forEach(objec -> { // if (!(objec.getErrorid().equals("0") || objec.getErrorid().equals("204"))) { // issucess[0] = false; // msg=objec.getMsg(); // } // }); // }); // } // // } // try { // //记录日志 // this.saveLogs(systemId, systemId, data, resultStr, issucess[0], msg, "applyCode"); // }catch (Throwable e){ // e.printStackTrace(); // } // } // logger.info("返回参数:"+resultStr); return ""; } } /*** * 统一更新接口(更改状态,更改属性信息)接口 * @param data * @param dataType * @return * @throws Throwable */ @Override public String syncEditData(String data, String dataType) throws Throwable { return null; } /*** * 分类查询 * @param data * @param dataType * @return * @throws Throwable */ @Override public String queryClassify(String data, String dataType) throws Throwable { return null; } /*** * 数据查询 * @param data * @param dataType * @return * @throws Throwable */ @Override public String queryData(String data, String dataType) throws Throwable { return null; } @Override public String queryClassifyRule(String data, String datatype) throws Throwable { return null; } /*** * 查询校验分类信息 * @param classfyVO */ private CodeClassifyVO getClassfy(ClassfyVO classfyVO) throws Throwable{ CodeClassifyVO classifyVO = new CodeClassifyVO(); try { String classCode = classfyVO.getClassCode(); String className = classfyVO.getFullclsfNamePath(); //根据分类代号查询分类信息 if (StringUtils.isNotBlank(classfyVO.getClassCode())) { Map conditionMap = new HashMap<>(); List codeClassifyList = classifyService.selectByWrapper(Wrappers.query().lambda().eq(CodeClassify::getId, classCode)); if (!CollectionUtils.isEmpty(codeClassifyList)) { CodeClassify classifyDO = codeClassifyList.get(0); //将DTO转换为DO classifyVO = new CodeClassifyVO(); BeanUtilForVCI.copyPropertiesIgnoreCase(classifyDO, classifyVO); if(StringUtils.isBlank(classifyVO.getOid())){ throw new Throwable("根据分类代号未查询到相应的分类信息"); } }else{ throw new Throwable("根据分类代号未查询到相应的分类信息"); } } else { //classifyVO = classifyService.getObjectByClsfNamePath(className.replace(separator, "/")); //if(StringUtils.isBlank(classifyVO.getOid())){ // throw new Throwable("根据分类名称路径未查询到相应的分类信息"); //} } }catch (Throwable e){ objerrorCode="100"; new Throwable("获取分类信息失败:"+e.getMessage()); } return classifyVO; } /*** * 根据穿入的参数信息校验码段规则 */ private List getRuleCodeOrderSecDTOs(List SectionVOList,CodeRuleVO ruleVO) throws Throwable{ List codeBasicSecVOS= ruleVO.getSecVOList(); Map sectionVOMap=new HashMap<>(); SectionVOList.stream().forEach(SectionVO->{ sectionVOMap.put(SectionVO.getName(),SectionVO.getValue()); }); List codeOrderSecDTOList=new ArrayList<>(); for(CodeBasicSecVO codeBasicSecVO: codeBasicSecVOS) { String sectype = codeBasicSecVO.getSecType(); if (!sectype.equals(CodeSecTypeEnum.CODE_SERIAL_SEC.getValue())) { String name = codeBasicSecVO.getName(); String sectypeText = codeBasicSecVO.getSecTypeText(); logger.info("码段名称:"+name); logger.info("描述:"+sectypeText); CodeOrderSecDTO CodeOrderSecDTO = new CodeOrderSecDTO(); if (sectionVOMap.containsKey(name)) { CodeOrderSecDTO.setSecOid(codeBasicSecVO.getOid()); String sectypeValue = sectionVOMap.get(name); logger.info("码段值:"+sectypeValue); CodeOrderSecDTO.setSecValue(sectypeValue); codeOrderSecDTOList.add(CodeOrderSecDTO); } else { objerrorCode="101"; throw new Throwable("传入的码段规则缺少" + name + "码段"); } } } return codeOrderSecDTOList; } /*** * 根据属性映射转换编码所需字段 */ public void getConfigDatas(String systemId,String libray, ApplyDatasVO applyDatasVO,List codeClassifyTemplateAttrVOList,DataObjectVO dataObjectVO) throws Throwable { List applyDataVOList=applyDatasVO.getObject(); LinkedHashMap> dataKeyValueMap=new LinkedHashMap<>(); //如果将数据转换成所需要的数据对象 Map attrMapConfigMap=new HashMap<>(); Map propMaps=new HashMap<>(); try { Map stringStringMap=attributeMapConfig.getSystem_attrmap(); //stringStringMap.put("RLM","D:\\RLM.xml"); LibraryDO libraryDO= gennerAttrMapUtil.getNewInstance().gennerAttrMapBySystem(systemId,stringStringMap); List libraryClsfDOList=libraryDO.getClsf(); Map> libPropMaps = libraryClsfDOList.stream().collect(Collectors.toMap(LibraryClsfDO::getLibrary, LibraryClsfDO::getProp, (key1, key2) -> key2)); if(libPropMaps.containsKey(libray)){ List clsfAttrMappingDOList=libPropMaps.get(libray); propMaps = clsfAttrMappingDOList.stream().collect(Collectors.toMap(ClsfAttrMappingDO::getSourceKey, ClsfAttrMappingDO::getTargetKey, (key1, key2) -> key2)); } }catch (Throwable e){ objerrorCode="1"; throw new Throwable("MDM集成属性配置文件读取失败"); } LinkedList rowNameList=new LinkedList<>(); LinkedHashMap filedIndexMap=new LinkedHashMap<>(); //根据分类模板组织数据 final int[] index = {0}; try { codeClassifyTemplateAttrVOList.stream().forEach(codeClassifyTemplateAttrVO -> { String attrName = codeClassifyTemplateAttrVO.getName(); String field = codeClassifyTemplateAttrVO.getId(); rowNameList.add(attrName); filedIndexMap.put(field, index[0]++); }); dataObjectVO.setColName(rowNameList);//放入属性 attrMapConfigMap.putAll(propMaps); LinkedList rowDataList = new LinkedList<>(); //Map> dataPropMap = applyDataVOList.stream().collect(Collectors.toMap(ApplyDataVO::getId, ApplyDataVO::getProp, (key1, key2) -> key2)); final int[] rowIndex = {0}; applyDataVOList.stream().forEach(applyDataVO -> { rowIndex[0]++; RowDatas rowDatas = new RowDatas(); rowDatas.setOid(applyDataVO.getId()); rowDatas.setCreator(applyDataVO.getCreator()); rowDatas.setEditor(applyDataVO.getEditor()); rowDatas.setCode(applyDataVO.getCode()); rowDatas.setOperation(applyDataVO.getOperate()); rowDatas.setStatus(applyDataVO.getStatus()); rowDatas.setRowIndex(rowIndex[0] + ""); List proppertyVOList = applyDataVO.getProp(); LinkedHashMap integerValueMap = new LinkedHashMap<>(); Map filedValueMap = new HashMap<>(); if (!CollectionUtils.isEmpty(proppertyVOList)) { Map sourceKeyValueMap = proppertyVOList.stream().collect(Collectors.toMap(ProppertyVO::getKey, ProppertyVO::getValue, (key1, key2) -> key2)); Map keyValueMap = new HashMap<>(); //判断attrMapConfigMap是否有值,如果没有则说明基础默认的是编码系统字段 if (!CollectionUtils.isEmpty(attrMapConfigMap)) { sourceKeyValueMap.keySet().forEach(sourceKey -> { String dataValue = sourceKeyValueMap.get(sourceKey); if (attrMapConfigMap.containsKey(sourceKey)) { String targetKey = attrMapConfigMap.get(sourceKey); keyValueMap.put(targetKey, StringUtils.isBlank(dataValue)?"":dataValue); } }); } else { sourceKeyValueMap.forEach((filed,value)->{ keyValueMap.put(filed,StringUtils.isBlank(value)?"":value) ; }); } filedIndexMap.forEach((attrKey, column) -> { String keyValue = ""; if (keyValueMap.containsKey(attrKey)) { keyValue =StringUtils.isBlank(keyValueMap.get(attrKey))?"":keyValueMap.get(attrKey); } integerValueMap.put(column, keyValue); filedValueMap.put(attrKey, keyValue); }); } rowDatas.setData(integerValueMap); rowDatas.setFiledValue(filedValueMap); rowDataList.add(rowDatas); }); dataObjectVO.setRowData(rowDataList); }catch (Throwable e){ objerrorCode="1"; throw new Throwable("组织数据映射值失败"); } } /*** * 记录日志信息 * @param systemId * @param parmaData * @param result * @return */ private void saveLogs(String systemId,String systemName,String parmaData, String result,boolean isSucess,String msg,String operation){ //记录日志信息 DockingLog dockingLoge=new DockingLog(); //String oid=redisService.getUUIDEveryDay(); dockingLoge.setSystemCode(StringUtils.isBlank(systemId)?"-":systemId);//设置系统标识 dockingLoge.setSystemName(StringUtils.isBlank(systemName)?"-":systemName); dockingLoge.setMsg(msg);//日志消息 dockingLoge.setClassifyId("-");//分类编号 dockingLoge.setClassifyName("-");//分类名称 dockingLoge.setClassifyOid("-");//分类主键 dockingLoge.setUniqueCode("-");//唯一标识 dockingLoge.setSystemOid("-");//系统标识 // dockingLogeDO.setName(operation); //dockingLogeDO.setOid(oid);//日志主键 dockingLoge.setParamString(parmaData);//参数信息 dockingLoge.setReturnString(result);//返回信息 dockingLoge.setType(operation);//日志操作类型 if(isSucess) { dockingLoge.setInterfaceStatus("true");//接口集成状态 }else{ dockingLoge.setInterfaceStatus("false");//接口集成状态 } dockingLogeService.save(dockingLoge); logger.info("集成推送数据成功,systemId:"+systemId+",systemname:"+systemName+",operation:"+operation+",param:"+parmaData); } /*** * 数据维护与编码申请返回 * @param resultSystemVO * @param dataType * @return */ private String transferResultXMl(XMLResultSystemVO resultSystemVO,String dataType){ String resultStr=""; if ("xml".equals(dataType)) { //组织返回接口信息 XStream xStream = new XStream(new DomDriver()); xStream.processAnnotations(XMLResultSystemVO.class); xStream.autodetectAnnotations(true); resultStr = "\n" + xStream.toXML(resultSystemVO); } else { List resultClassfyVOList =resultSystemVO.getClassifys(); JSONResultDataVO resultDataVO = new JSONResultDataVO(); JSONResultSystemVO jsonResultSystemVO = new JSONResultSystemVO(); JSONResultClassfysVO jsonResultClassfysVO = new JSONResultClassfysVO(); List jSONResultClassfyVOList = new ArrayList<>(); resultClassfyVOList.stream().forEach(resultClassfyVO -> { List xmlResultDataObjectDetailDOS = resultClassfyVO.getObjects(); List JSONResultDataObjectDetailDOList = new ArrayList<>(); xmlResultDataObjectDetailDOS.stream().forEach(xmlResultDataObjectDetail -> { JSONResultDataObjectDetailDO jsonResultDataObjectDetail = new JSONResultDataObjectDetailDO(); BeanUtilForVCI.copyPropertiesIgnoreCase(xmlResultDataObjectDetail, jsonResultDataObjectDetail); JSONResultDataObjectDetailDOList.add(jsonResultDataObjectDetail); }); JSONResultClassfyVO jsonResultClassfyVO = new JSONResultClassfyVO(); jsonResultClassfyVO.setClassCode(resultClassfyVO.getClassCode()); jsonResultClassfyVO.setLibrary(resultClassfyVO.getLibrary()); jsonResultClassfyVO.setFullclsfNamePath(resultClassfyVO.getFullclsfNamePath()); JSONResultDataObjectDO JSONResultDataObjectDO = new JSONResultDataObjectDO(); JSONResultDataObjectDO.setObject(JSONResultDataObjectDetailDOList); jsonResultClassfyVO.setObjects(JSONResultDataObjectDO); jSONResultClassfyVOList.add(jsonResultClassfyVO); }); jsonResultClassfysVO.setClassify(jSONResultClassfyVOList); jsonResultSystemVO.setClassifys(jsonResultClassfysVO); jsonResultSystemVO.setErrorid(resultSystemVO.getErrorid()); jsonResultSystemVO.setMsg(resultSystemVO.getMsg()); resultDataVO.setData(jsonResultSystemVO); Object object = JSONObject.toJSON(resultDataVO); resultStr = object.toString(); } return resultStr; } }