package com.vci.ubcs.code.service.impl; import cn.hutool.json.XML; import com.alibaba.fastjson.JSONObject; import com.vci.ubcs.code.constant.MdmDuckingConstant; import com.vci.code.dao.*; import com.vci.code.model.*; import com.vci.code.service.*; import com.vci.code.utils.*; import com.vci.starter.web.enumpck.UserSecretEnum; import com.vci.starter.web.exception.VciBaseException; import com.vci.starter.web.pagemodel.BaseResult; import com.vci.starter.web.pagemodel.DataGrid; import com.vci.starter.web.pagemodel.PageHelper; import com.vci.starter.web.pagemodel.SessionInfo; import com.vci.starter.web.util.VciBaseUtil; import com.vci.starter.web.wrapper.VciQueryWrapperForDO; import com.vci.ubcs.code.dao.*; import com.vci.ubcs.code.model.*; import com.vci.ubcs.code.service.*; import com.vci.ubcs.code.utils.*; import com.vci.web.pageModel.BatchCBO; import com.vci.web.redis.RedisService; import com.vci.web.service.WebBoServiceI; import com.vci.web.util.PlatformClientUtil; import com.vci.web.util.WebUtil; import org.apache.commons.io.FileUtils; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springblade.code.dao.*; import com.vci.ubcs.code.dto.DockingPreApplyDataDTO; import com.vci.ubcs.code.dto.DockingPreApplyDataInfoDTO; import org.springblade.code.model.*; import org.springblade.code.service.*; import org.springblade.code.utils.*; import com.vci.ubcs.code.vo.pagemodel.CodeClassifyTemplateVO; import com.vci.ubcs.code.vo.pagemodel.SysIntInfoVO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import plm.bs.bom.clientobject.ClientBusinessObject; import javax.annotation.Resource; import java.io.File; import java.io.IOException; import java.util.*; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.stream.Collectors; import static com.vci.frameworkcore.constant.FrameWorkDefaultValueConstant.*; /** * 主题库集成服务 * @author wangyi * @date 2022-03-20 */ @Service public class CodeDuckingServiceImpl implements CodeDuckingServiceI { /** * 日志 */ private Logger logger = LoggerFactory.getLogger(getClass()); /** * 集成推送任务数据操作层 */ @Resource private DockingTaskDaoI dockingTaskDaoI; /** * 集成推送任务数据操作层 */ @Resource private DockingDataDaoI dockingDataDaoI; /** * 集成日志数据操作层 */ @Resource private DockingLogeDaoI dockingLogeDaoI; /** * 集成接口head数据操作层 */ @Resource private SysIntHeaderDaoI sysIntHeaderDaoI; /** * 模板属性数据操作层 */ @Resource @Lazy private CodeClassifyDaoI codeClassifyDaoI; /** * 业务类型操作的服务 */ @Autowired @Lazy private WebBoServiceI boService; /** * 缓存服务 */ @Autowired private RedisService redisService; /** * 数据服务 */ @Autowired(required = false) @Lazy private MdmEngineServiceI mdmEngineServiceI; /** * 编码预申请服务 */ @Autowired(required = false) @Lazy private DockingPreApplyDataServiceI dockingPreApplyDataServiceI; /** * 要推送系统的服务 */ @Autowired private SysIntInfoServiceI sysIntInfoServiceI; /** * 分类服务 */ @Autowired private CodeClassifyServiceI codeClassifyServiceI; @Value("${docking.tuhao:tuhao}") public String tuhao; @Value("${docking.tranTemp:D:\\PLT-2022\\web\\tranTemp}") public String tranTemp; @Value("${docking.preXmlTemp:D:\\PLT-2022\\web\\preXmlTemp}") public String preXmlTemp; /** * 二、1、2、3、4、 * 处理预申请数据 * @param xmlDatas * @return 接收的xmlDate */ @Override public String applicateCode(String xmlDatas){ long start = System.currentTimeMillis(); Map datasMap = null; //解析xmlData try { datasMap = XmlUtil.readPreXmlData(xmlDatas); }catch (Exception e){ logger.info("接收预申请数据,解析xmlData失败,xmlDatas: "+xmlDatas+",e: "+e.getMessage()); e.printStackTrace(); //返回提示 return XmlUtil.writePreBackXmlData(MdmDuckingConstant.XML_CODE_FAIL,"解析xmlData失败,e: "+e.getMessage(),null); } List xmlDataList = Collections.synchronizedList(new ArrayList()); String systemid = datasMap.getOrDefault(MdmDuckingConstant.XML_SYSTEMID,"").toString(); List> dataMapList = (ArrayList>)datasMap.get(MdmDuckingConstant.XML_DATAS); //记录这次数据信息,并且把xmldata写入文件 String currentDate = DateUtils.getCurrentDate(DateUtils.DATE_TO_STRING_DETAIAL_PATTERN); File preXmlFile = new File(preXmlTemp+ File.separator+systemid+"-"+currentDate+".xml"); try { FileUtils.write(preXmlFile, xmlDatas); }catch (Exception e){ logger.error(currentDate+" 接收"+systemid+"系统预申请数据,写入文件失败!e:"+e.getMessage()+",xmlDatas: "+xmlDatas); e.printStackTrace(); } //处理每一条申请的数据 ExecutorService pool = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()+1); SessionInfo sessionInfo = WebUtil.getSessionInfo(); CountDownLatch countDownLatch = new CountDownLatch(dataMapList.size()); for (int i =0;i dataMap = dataMapList.get(i); pool.execute(()-> { String unique = dataMap.getOrDefault(MdmDuckingConstant.XML_UNIQUE,"").toString(); String type = dataMap.getOrDefault(MdmDuckingConstant.XML_TYPE,"").toString(); //要插入的data DockingPreApplyDataDTO dockingPreApplyDataDO = new DockingPreApplyDataDTO(); //要插入的datainfo List dockingPreApplyDataInfoDOList = new ArrayList(); XmlData xmlData_ = new XmlData(); try { WebUtil.setSessionInfo(sessionInfo); String num = ""; String datacode = ""; String datamsg = ""; String datamsglog = ""; //state=400,处理成功,没有找到编码 datamsg = "接收预申请数据,未查询到对应编码,赋码后推送编码信息"; datacode = MdmDuckingConstant.XML_STATE_400; XmlData xmlData = new XmlData(); xmlData.setState(MdmDuckingConstant.XML_STATE_400); xmlData.setMsg(datamsg); xmlData.setUnique(unique); xmlData.setNum(null); logger.info(datamsg+",data: "+dataMap.get(unique)+",num: "); xmlData_ = xmlData; //如果是MPM集成过来的数据,unique作为图号查询 if(MdmDuckingConstant.XML_SYSTEMID_MPM.equals(systemid)&& StringUtils.isNotEmpty(unique)) { //1、先查询这个unique根据图号查询,有数据就就返回 Map conditonMap = new HashMap(); conditonMap.put("tuhao",unique); // conditonMap.put("lcstatus",FRAMEWORK_RELEASE_RELEASED); List clientBusinessObjectList = boService.queryCBO(type,conditonMap); if(clientBusinessObjectList.size()>0) { num = clientBusinessObjectList.get(0).getId(); String lcstatus = clientBusinessObjectList.get(0).getLcStatus(); datamsg = "接收预申请数据,未查询到对应编码,赋码后推送编码信息"; if(FRAMEWORK_RELEASE_RELEASED.equals(lcstatus)) { datamsg = "接收预申请数据,查询编码成功"; datamsglog = datamsg+",data: " + dataMap.get(unique) + ",num: " + num; datacode = MdmDuckingConstant.XML_STATE_200; }else if(FRAMEWORK_RELEASE_SUBMIT.equals(lcstatus)){ datamsglog = datamsg+",编码数据状态:已提交,data: " + dataMap.get(unique) + ",num: " + num; datacode = MdmDuckingConstant.XML_STATE_400; }else if(FRAMEWORK_RELEASE_AUDITING.equals(lcstatus)){ datamsglog = datamsg+",编码数据状态:审核中,data: " + dataMap.get(unique) + ",num: " + num; datacode = MdmDuckingConstant.XML_STATE_400; }else if(FRAMEWORK_RELEASE_EDITING.equals(lcstatus)){ datamsglog = datamsg+",编码数据状态:编辑中,data: " + dataMap.get(unique) + ",num: " + num; datacode = MdmDuckingConstant.XML_STATE_400; }else if(FRAMEWORK_DATA_DISABLED.equals(lcstatus)){ datamsglog = datamsg+",编码数据状态:停用,data: " + dataMap.get(unique) + ",num: " + num; datacode = MdmDuckingConstant.XML_STATE_400; } xmlData.setState(datacode); xmlData.setMsg(datamsg); xmlData.setUnique(unique); xmlData.setNum(num); logger.info(datamsglog); xmlData_ = xmlData; } } dockingPreApplyDataDO.setNum(num); dockingPreApplyDataDO.setDatacode(datacode); dockingPreApplyDataDO.setDatamsg(datamsg); //2、根据unique查询DockingPreApplyDataDO,有数据就修改别的所有的usedflag=false,设置这个为true //3、再插入DockingPreApplyDataDO和DockingPreApplyDataInfoDO //其实,2、和3、这两步在dockingPreApplyDataServiceI.addSaveDataAndInfo()这个方法中一起做了 String dataoid = redisService.getUUIDEveryDay(); // String dataoid = "1"; dockingPreApplyDataDO.setOid(dataoid); dockingPreApplyDataDO.setPreapplyoid("1"); dockingPreApplyDataDO.setUniquecode(unique); dockingPreApplyDataDO.setType(type); dockingPreApplyDataDO.setSystemid(systemid); Object attro = dataMap.get(MdmDuckingConstant.XML_PROS); //要插入的datainfo List> attrList = null; if (attro == null) { attrList = new ArrayList>(); }else { attrList = (ArrayList>)attro; } String mpm_model = null; String mpm_parttype = null; String mpm_unit = null; for (Map attrMap : attrList) { String datainfooid = redisService.getUUIDEveryDay(); // datainfooid = "1"; String key = attrMap.getOrDefault(MdmDuckingConstant.XML_KEY,""); String mean = attrMap.getOrDefault(MdmDuckingConstant.XML_MEAN,""); String text = attrMap.getOrDefault(MdmDuckingConstant.XML_TEXT,""); DockingPreApplyDataInfoDTO dockingPreApplyDataInfoDO = new DockingPreApplyDataInfoDTO(); dockingPreApplyDataInfoDO.setDataoid(dataoid); dockingPreApplyDataInfoDO.setOid(datainfooid); dockingPreApplyDataInfoDO.setKey(key); dockingPreApplyDataInfoDO.setValue(text); dockingPreApplyDataInfoDO.setMean(mean); dockingPreApplyDataInfoDOList.add(dockingPreApplyDataInfoDO); //取三个值 if(MdmDuckingConstant.XML_MPM_MODEL.equals(key)){//取MPM规格 mpm_model = text; dockingPreApplyDataDO.setModel(mpm_model); } if(MdmDuckingConstant.XML_MPM_PARTTYPE.equals(key)){//取MPM零件型号 mpm_parttype = text; dockingPreApplyDataDO.setParttype(mpm_parttype); } if(MdmDuckingConstant.XML_MPM_UNIT.equals(key)){//单位 mpm_unit = text; dockingPreApplyDataDO.setUnit(mpm_unit); } } dockingPreApplyDataServiceI.addSaveDataAndInfo(dockingPreApplyDataDO, dockingPreApplyDataInfoDOList); } catch (Exception e) { String datamsg = "接收预申请数据失败!,data: "+dataMap.get(unique)+",e: "+e.getMessage(); XmlData xmlData = new XmlData(); xmlData.setState(MdmDuckingConstant.XML_STATE_500); xmlData.setMsg(datamsg); xmlData.setUnique(unique); xmlData.setNum(null); logger.error(datamsg+".dockingPreApplyDataDO: "+dockingPreApplyDataDO+",dockingPreApplyDataInfoDOList: "+dockingPreApplyDataInfoDOList); xmlData_ = xmlData; e.printStackTrace(); }finally { xmlDataList.add(xmlData_); countDownLatch.countDown(); } }); } //等待所有线程执行完成 try { countDownLatch.await(); } catch (InterruptedException e) { e.printStackTrace(); } String backXmlData = XmlUtil.writePreBackXmlData(MdmDuckingConstant.XML_CODE_SUCCESS,"接收预申请数据成功!",xmlDataList); long end = System.currentTimeMillis(); //拼接返回的xmlData int dataMapSise = dataMapList.size(); int xmlDataSise = xmlDataList.size(); System.out.println("========================dataMapSise: "+dataMapSise+",xmlDataSise:"+xmlDataSise); System.out.println("========================处理预申请数据一共耗时 "+(end-start)/1000+"秒"); return backXmlData; } /** * 四、1、2、3 * 查询redis中数据,对比后插入dockingtask */ @Override public void insertCache2(){ initSysadmin(); //sysintinfo查询要推送的主题库和相关系统信息 Map conditionMap = new HashMap<>(); conditionMap.put("usedflag","true"); List sysIntInfoVOList = sysIntInfoServiceI.selectAll(conditionMap); //distinct出主题库btmname,存储key-value结构的分类数据,这里的分类是主题库root节点 Set btmtypeidSet = new HashSet<>(); Map> sysIntInfoDOMap = new HashMap>();//key=classifyoid,value=list for (SysIntInfoDO sysIntInfoVOi:sysIntInfoVOList){ btmtypeidSet.add(sysIntInfoVOi.getBtmTypeId()); List SysIntInfoVOListi = sysIntInfoDOMap.get(sysIntInfoVOi.getClassifyoid()); if(SysIntInfoVOListi==null){ SysIntInfoVOListi = new ArrayList(); } SysIntInfoVOListi.add(sysIntInfoVOi); sysIntInfoDOMap.put(sysIntInfoVOi.getClassifyoid(),SysIntInfoVOListi); } //查询dockingdata:oid,classifyoid,btmid,btmoid,sendtype,classifyid,classifyname // List dataList = getDockingDatas(); VciQueryWrapperForDO queryWrapperForDO = new VciQueryWrapperForDO(DockingDataDO.class); queryWrapperForDO.addQueryMap("sendflag","false"); List dataList = dockingDataDaoI.selectByWrapper(queryWrapperForDO); for (DockingDataDO mapi:dataList){ WebUtil.setPersistence(false); BatchCBO batchCBO = new BatchCBO(); String dataoid = mapi.getOid();//data对象的oid String classifyoid = mapi.getClassifyoid(); String id = mapi.getId(); String uniquecode = mapi.getUniquecode(); String btmid = mapi.getBtmid(); String btmoid = mapi.getBtmoid(); String sendtype = mapi.getSendtype(); String classifyid = mapi.getClassifyid(); String classifyname = mapi.getClassifyname(); //设置uniquecode if(StringUtils.isEmpty(uniquecode)){ uniquecode = getTuhao(btmoid);//查询图号 if(StringUtils.isNotEmpty(uniquecode)) { updateDockingDatasUniqueCode(dataoid, uniquecode); } } List effectiveSysIntInfoVOs=new ArrayList<>(); String rootClassifyoid = ""; String pushType="1"; if(MdmDuckingConstant.DOCKING_DEFAULT_CLASSIFY.equalsIgnoreCase(classifyoid)){//这个对应sysintinfo中的主题库id,如果是分类数据,就是DOCKING_DEFAULT_CLASSIFY=CODECLASSIFY rootClassifyoid = MdmDuckingConstant.DOCKING_DEFAULT_CLASSIFY; //判断是否属于分类树,如果是组织、人员、附录之类的不生成任务,并且自动清除这个data boolean iswupin = codeClassifyDaoI.isWupin(btmoid); if(!"TakeBack".equals(sendtype)&&!iswupin){ boolean u = delteDockingData(dataoid); logger.error("集成data删除非分类data失败!dataoid:"+dataoid); continue; } pushType="2"; rootClassifyoid=btmoid; }else { /* CodeClassifyDO rootClassify = codeClassifyDaoI.getRootClassify(classifyoid);//root分类 if(rootClassify==null){ continue;//说明这个分类被删掉了,不做处理 } rootClassifyoid = rootClassify.getOid();*/ rootClassifyoid=classifyoid; } List parentLeveDO= codeClassifyDaoI.selectAllLevelParentByOid(rootClassifyoid); if(CollectionUtils.isEmpty(parentLeveDO)){ continue;//说明这个分类被删掉了,不做处理 } Map oidCodeclassifyDOMap = parentLeveDO.stream().filter(codeClassifyDO -> codeClassifyDO != null && StringUtils.isNotBlank(codeClassifyDO.getOid())).collect(Collectors.toList()).stream().collect(Collectors.toMap(s -> s.getOid(), t -> t)); String finalPushType = pushType; oidCodeclassifyDOMap.keySet().forEach(oid->{ if(sysIntInfoDOMap.containsKey(oid)){ List sysIntInfoDOS= sysIntInfoDOMap.get(oid); sysIntInfoDOS.stream().forEach(sysIntInfoDO -> { String sysPushType= sysIntInfoDO.getPushType(); if(sysPushType.equalsIgnoreCase(finalPushType)){ effectiveSysIntInfoVOs.add(sysIntInfoDO); } }); } }); if(CollectionUtils.isEmpty(effectiveSysIntInfoVOs)){ continue; } List dockingTaskDO_insert = new ArrayList(); for (SysIntInfoDO sysIntInfoVOi:effectiveSysIntInfoVOs){ // String sysinfoclassifyoid = sysIntInfoVOi.getClassifyoid();//intinfo的classifyoid // if(!rootClassifyoid.equals(sysinfoclassifyoid)){ // continue; // } DockingTaskDO dockingTaskDO = new DockingTaskDO(); String oid=redisService.getUUIDEveryDay(); // logger.error("===================================================oid: "+redisService.getUUIDEveryDay()); dockingTaskDO.setOid(oid); dockingTaskDO.setSendflag(MdmDuckingConstant.SEND_FLAG_FALSE); dockingTaskDO.setId(id);//编码 dockingTaskDO.setUniquecode(uniquecode); dockingTaskDO.setBtmoid(btmoid);//数据oid dockingTaskDO.setBtmid(btmid);//数据业务类型id dockingTaskDO.setClassifyid(classifyid);//数据在分类id dockingTaskDO.setClassifyoid(classifyoid);//数据所在分类oid dockingTaskDO.setClassifyname(classifyname);//数据所在分类名称 dockingTaskDO.setSendtype(sendtype);//数据推送类型 dockingTaskDO.setDataoid(dataoid); //intinfo dockingTaskDO.setSysinfooid(sysIntInfoVOi.getOid());//intinfo的oid dockingTaskDO.setSystemoid(sysIntInfoVOi.getSysbaseoid());//系统oid dockingTaskDO.setSystemcode(sysIntInfoVOi.getSysbaseid());//系统编码 dockingTaskDO.setSystemname(sysIntInfoVOi.getSysbasename());//系统name dockingTaskDO_insert.add(dockingTaskDO); } BatchCBO bi = null; if(dockingTaskDO_insert.size()!=0) { bi = dockingTaskDaoI.batchInsert(dockingTaskDO_insert); batchCBO.copyFromOther(bi); } WebUtil.setPersistence(true); boService.persistenceBatch(batchCBO); //dockingTaskDaoI.updateByPrimaryKey方法报错了,所以手写了这个 boolean u = updateDockingDatasSendFlag(dataoid, MdmDuckingConstant.SEND_FLAG_TRUE); if(!u){ logger.error("集成data分解任务失败!dataoid:"+dataoid); continue; } } } /** * 四、3、 * 1、 */ @Override public void sendData3(){ initSysadmin(); //查询哪些任务还没有执行完成 VciQueryWrapperForDO queryWrapper = new VciQueryWrapperForDO(DockingTaskDO.class); queryWrapper.addQueryMap("sendFlag", MdmDuckingConstant.SEND_FLAG_FALSE); List dockingTaskDOS = dockingTaskDaoI.selectByWrapper(queryWrapper); //每个task依次执行推送 for (DockingTaskDO dockingTaskDO:dockingTaskDOS){ //每个task一个事务,开启 WebUtil.setPersistence(false); BatchCBO batchCBO = new BatchCBO(); String paramString = null; //查询系统接口信息,ip method,dataType String systeminfooid = dockingTaskDO.getSysinfooid();//sysininfo 的oid String systemcode = dockingTaskDO.getSystemcode(); String systemname = dockingTaskDO.getSystemname(); String systemoid = dockingTaskDO.getSystemoid(); String dataid = dockingTaskDO.getId();//编码 String uniquecode = dockingTaskDO.getUniquecode();//uniquecode //查询推送接口参数 SysIntInfoVO sysIntInfoVO = sysIntInfoServiceI.getObjectByOid(systeminfooid); String url = sysIntInfoVO.getRequesturl();//url String type = sysIntInfoVO.getInterfacetype().toLowerCase(Locale.ROOT);//get/post/webserver/corba String paramType = sysIntInfoVO.getParamtype();//xml/json String returnType = sysIntInfoVO.getReturntype();//xml/json String interfaceFunction = sysIntInfoVO.getInterfaceFunction();//主要是webservice的方法名 String namespace = sysIntInfoVO.getNamespace();//namespace String soapaction = sysIntInfoVO.getSoapaction();//soapaction String targName = sysIntInfoVO.getTargName();//targName String cxfaxis = sysIntInfoVO.getCxfaxis();//webservice是cxf/axis //查询param List sysIntParamDOList = sysIntInfoServiceI.getParamsBySystemInfoOid(systeminfooid); //查询header List sysIntHeaderDOList = sysIntInfoServiceI.getHeadersBySystemInfoOid(systeminfooid); //查询要推送的数据 String btmoid = dockingTaskDO.getBtmoid();//数据oid String btmid = dockingTaskDO.getBtmid();//数据btmid String classifyoid = dockingTaskDO.getClassifyoid(); String classifyid = dockingTaskDO.getClassifyid(); String classifyname= dockingTaskDO.getClassifyname(); String sendtype = dockingTaskDO.getSendtype(); //组装数据 XmlData xmlData = new XmlData(); xmlData.setSendtype(sendtype); if(!MdmDuckingConstant.DOCKING_DEFAULT_CLASSIFY.equals(btmid)) { xmlData.setType(btmid); } String ret_xml = null; String id = null; String name = null; String idpath = null; String namepath = null; //表示是分类信息数据 if(MdmDuckingConstant.DOCKING_DEFAULT_CLASSIFY.equals(btmid)){ xmlData.setNamepath(""); xmlData.setIdpath(""); xmlData.setNum(""); CodeClassifyDO codeClassifyDO = null; try { codeClassifyDO = codeClassifyDaoI.selectByPrimaryKey(btmoid); }catch (Exception e){ } String classifyoid_parent = ""; int orderNum = 0; if(codeClassifyDO==null){//查不到数据,说明被删除了,从DOCKING_CACHE2_DELETE取 CodeClassifyDO codeClassifyDOJson = (CodeClassifyDO)redisService.getCacheObject(MdmDuckingConstant.DOCKING_CACHE2_DELETE+btmoid); if(codeClassifyDOJson==null){ BatchCBO insertLoge = taskFail(systemcode,systemname,systemoid,classifyoid,classifyid,classifyname,dataid,uniquecode,"",url,"主数据系统未查询到删除的数据,未执行推送。"); batchCBO.copyFromOther(insertLoge); WebUtil.setPersistence(true); boService.persistenceBatch(batchCBO); } id = codeClassifyDOJson.getId(); name = codeClassifyDOJson.getName(); orderNum = codeClassifyDOJson.getOrderNum(); classifyoid_parent = codeClassifyDOJson.getParentCodeClassifyOid(); }else { id = codeClassifyDO.getId(); name = codeClassifyDO.getName(); orderNum = codeClassifyDO.getOrderNum(); classifyoid_parent = codeClassifyDO.getParentCodeClassifyOid(); } //父级,idpath,namepath,分类数据视图中没有查询出路径,需要手动去查询 CodeClassifyDO codeClassifyDO_parent = null; try { codeClassifyDO_parent = codeClassifyDaoI.selectByPrimaryKey(classifyoid_parent); xmlData.setParentId(codeClassifyDO_parent.getId()); //idpath,namepath List codeClassifyDOList = codeClassifyDaoI.listParentClassify(codeClassifyDO_parent.getOid()); for (int i=codeClassifyDOList.size()-1;i>=0;i--){ CodeClassifyDO codeClassifyDOi=codeClassifyDOList.get(i); String idi = codeClassifyDOi.getId(); String namei = codeClassifyDOi.getName(); idpath = idpath==null?idi:idpath+"#"+idi; namepath = namepath==null?namei:namepath+"#"+namei; } }catch (Exception e){ } idpath = idpath==null?id:idpath+"#"+id; namepath = namepath==null?name:namepath+"#"+name; //查询分类路径 xmlData.setName(name); xmlData.setNamepath(namepath); xmlData.setIdpath(idpath); xmlData.setId(id); xmlData.setOrderNum(orderNum); List xmlDataList = new ArrayList(); xmlDataList.add(xmlData); ret_xml = XmlUtil.writeSendXmlData_classify(xmlDataList);//xml格式数据 }else { Map data = null; try { //表示是主数据 CodeClassifyTemplateVO codeClassifyTemplateVO = mdmEngineServiceI.getUsedTemplateByClassifyOid(classifyoid); BaseResult> baseResult = mdmEngineServiceI.getDataByOid(btmoid, codeClassifyTemplateVO.getOid()); if (baseResult == null) { JSONObject josni = redisService.getCacheObject(MdmDuckingConstant.DOCKING_CACHE2_DELETE + btmoid); data = (Map) josni; } else { data = baseResult.getObj(); } }catch (Throwable e){ BatchCBO failCbo = taskFail(systemcode,systemname,systemoid,classifyoid,classifyid,classifyname,dataid,uniquecode,paramString,url,"未查询到相应数据!"); batchCBO.copyFromOther(failCbo); continue; } //处理计量单位等转换 // data = tran(data); //如果是集成erp部门数据集成,parentcode=null建立一级部门,无人机比较只有部门,没有科室,所以系统的科室其实就是他们的部门 if("organization".equals(btmid.toLowerCase())){ String materialclassify = data.get("materialclassify"); if("科室".equals(materialclassify)){ data.put("parentcode",""); } } //数据转换d String tran_xml = null; try { //D:\MDM_important\PLT-2022\web\tranTemp\+系统名称,会去找这个文件读取数据转换信息 tran_xml = FileUtils.readFileToString(new File(tranTemp+File.separator+systemcode+".xml"),"utf-8"); }catch (IOException e){ e.printStackTrace(); } if(StringUtils.isNotEmpty(tran_xml)){ //通过tran_xml对data数据转换 Map tran_map = null; try { tran_map = XmlUtil.readTranXml(tran_xml,btmid); }catch (Exception e){ e.printStackTrace(); } if(tran_map!=null){//读取到这个btmid设置的转换关系了才做处理 for (String key:tran_map.keySet()){//key=materialtype Object data_pro_mapo = tran_map.get(key);//data_pro_map if(data_pro_mapo!=null){//这个值设置转换了才处理 Map data_pro_map = (Map)data_pro_mapo; String mdm_value = data.get(key); String system_value = data_pro_map.get(mdm_value); if(StringUtils.isNotEmpty(mdm_value)){ data.put(key,system_value); } } } } } String unique = null; List pros = new ArrayList(); String codeclassifyoid = null; for (String key:data.keySet()){ Pro pro = new Pro(); pro.setKey(key); pro.setMean(""); pro.setValue(data.getOrDefault(key,"")); pros.add(pro); if(tuhao.equals(key)){ unique = data.getOrDefault(key,""); } if("oid".equals(key)){ codeclassifyoid = data.getOrDefault(key,""); } } xmlData.setNum(data.getOrDefault("id","")); xmlData.setPros(pros); xmlData.setUnique(unique); //查询分类路径,主数据在视图中已经查询出了路径,只不过是,间隔的 namepath = classifyname.replaceAll(",","#"); idpath = classifyid.replaceAll(",","#"); xmlData.setNamepath(namepath); xmlData.setIdpath(idpath); List xmlDataList = new ArrayList(); xmlDataList.add(xmlData); ret_xml = XmlUtil.writeSendXmlData(xmlDataList);//xml格式数据 } //切换xml/json String sendString = null; String backString = null; if(paramType.equals(MdmDuckingConstant.DATATYPE_JSON)){ sendString = XML.toJSONObject(ret_xml).toString(); }else { sendString = ret_xml; } logger.info("系统:"+systemcode); logger.info("接口地址:"+url); logger.info("接口函数:"+interfaceFunction); logger.info("接口传递参数:"+sendString); //推送数据 try { if (type.equals(MdmDuckingConstant.URLTYPE_GET)) {//GET请求 String sendurl = url + "?" + MdmDuckingConstant.PARAM_XMLDATA + "=" + sendString; //拼接param for (SysIntParamDO sysIntParamDO : sysIntParamDOList) { sendurl = sendurl + "&" + sysIntParamDO.getParamkey() + "=" + sysIntParamDO.getParamvalue(); } paramString=sendurl; backString = HttpUtils.get(sendurl); } else if (type.equals(MdmDuckingConstant.URLTYPE_POST)) {//POST请求 MultiValueMap params = new LinkedMultiValueMap<>(); for (SysIntParamDO sysIntParamDO : sysIntParamDOList) { params.add(sysIntParamDO.getParamkey(), sysIntParamDO.getParamvalue()); } paramString=params.toString(); MultiValueMap headers = new LinkedMultiValueMap<>(); for (SysIntHeaderDO sysIntHeaderDO : sysIntHeaderDOList) { headers.add(sysIntHeaderDO.getHeaderkey(), sysIntHeaderDO.getHeaderalue()); } backString = HttpUtils.post(url, params, headers); } else if (type.equals(MdmDuckingConstant.URLTYPE_WEBSERVICE)) {//webserver请求 MultiValueMap params = new LinkedMultiValueMap<>(); for (SysIntParamDO sysIntParamDO : sysIntParamDOList) { params.add(sysIntParamDO.getParamkey(), sysIntParamDO.getParamvalue()); } paramString=sendString; MultiValueMap headers = new LinkedMultiValueMap<>(); for (SysIntHeaderDO sysIntHeaderDO : sysIntHeaderDOList) { headers.add(sysIntHeaderDO.getHeaderkey(), sysIntHeaderDO.getHeaderalue()); } backString = WsErpClientUtil.sendMsg(url, namespace, soapaction,interfaceFunction,targName, paramString, 10000); } else {//corba接口 } paramString=sendString; }catch (Exception e){ e.printStackTrace(); BatchCBO failCbo = taskFail(systemcode,systemname,systemoid,classifyoid,classifyid,classifyname,dataid,uniquecode,paramString,url,"推送数据失败!"); batchCBO.copyFromOther(failCbo); } logger.info("接口返回参数:"+backString); //解析返还参数 try { BackXml backXml = null; if(returnType.equals(MdmDuckingConstant.DATATYPE_JSON)){ backXml = XmlUtil.readSendJsonData(backString);//目前只读取主数据json返回信息 }else { if(MdmDuckingConstant.DOCKING_DEFAULT_CLASSIFY.equals(btmid)){ backXml = XmlUtil.readSendXmlData_classify(backString);//分类xml返回信息 }else { backXml = XmlUtil.readSendXmlData(backString);//主数据xml返回信息 } } List datas = backXml.getDatas(); boolean isSend = false; for (XmlData xmlDatai:datas){ String xml_datacode = xmlDatai.getState(); String xml_datamsg = xmlDatai.getMsg(); if(MdmDuckingConstant.XML_DATACODE_200.equals(xml_datacode)){ BatchCBO insertLoge = taskSuccess(systemcode,systemname,systemoid,classifyoid,classifyid,classifyname,dataid,uniquecode,paramString,url,xml_datamsg); batchCBO.copyFromOther(insertLoge); isSend = true; }else if(MdmDuckingConstant.XML_DATACODE_500.equals(xml_datacode)){ BatchCBO failCbo = taskFail(systemcode,systemname,systemoid,classifyoid,classifyid,classifyname,dataid,uniquecode,paramString,url,xml_datamsg); batchCBO.copyFromOther(failCbo); }else if("true".equals(xml_datacode.toLowerCase())){ BatchCBO insertLoge = taskSuccess(systemcode,systemname,systemoid,classifyoid,classifyid,classifyname,dataid,uniquecode,paramString,url,xml_datamsg); batchCBO.copyFromOther(insertLoge); isSend = true; }else if("false".equals(xml_datacode)){ BatchCBO failCbo = taskFail(systemcode,systemname,systemoid,classifyoid,classifyid,classifyname,dataid,uniquecode,paramString,url,xml_datamsg); batchCBO.copyFromOther(failCbo); }else{ BatchCBO failCbo = taskFail(systemcode,systemname,systemoid,classifyoid,classifyid,classifyname,dataid,uniquecode,paramString,url,"返还xml格式不正确,缺少code!"); batchCBO.copyFromOther(failCbo); } } //全都接收成功的情况下,修改dockingtask sendflag为已发送 if(isSend) { dockingTaskDO.setSendflag(MdmDuckingConstant.SEND_FLAG_TRUE); BatchCBO updateTask = dockingTaskDaoI.updateByPrimaryKey(dockingTaskDO); batchCBO.copyFromOther(updateTask); } }catch (Exception e){ e.printStackTrace(); BatchCBO failCbo = taskFail(systemcode,systemname,systemoid,classifyoid,classifyid,classifyname,dataid,uniquecode,paramString,url,"解析返还数据失败!"); batchCBO.copyFromOther(failCbo); } //每一个task一个事物 WebUtil.setPersistence(true); boService.persistenceBatch(batchCBO); } } public static Map tranMap = new HashMap(); public Map tran(Map data){ if(tranMap.isEmpty()){ // tranMap.put("jiliangdw","jiliangdwname"); } for (String key:tranMap.keySet()){ String tran_key = tranMap.get(key); String tran_key_value = data.get(tran_key); if(StringUtils.isNotEmpty(tran_key_value)){ data.put(key,tran_key_value); } } data.put("shifoupihaoguanli","0"); return data; } /** * 定时任务推送 */ @Override public void DockingScheduing(){ //data 2 task insertCache2(); //推送数据 sendData3(); } /** * 数据删除的时候,缓存到redis * @param oid */ @Override public void cacheDeleteData(String oid,Object obj){ logger.info("删除数据插入redis,key: "+ MdmDuckingConstant.DOCKING_CACHE2_DELETE+",oid: "+oid+",obj: "+obj); redisService.setCacheObject(MdmDuckingConstant.DOCKING_CACHE2_DELETE + oid, obj); } @Override public DataGrid gridData(Map conditionMap, PageHelper pageHelper) throws VciBaseException { if (pageHelper == null) { pageHelper = new PageHelper(-1); } pageHelper.addDefaultDesc("createTime"); pageHelper.addDefaultAsc("sendflag"); List doList = dockingDataDaoI.selectByCondition(conditionMap,pageHelper); DataGrid dataGrid=new DataGrid(); if (!CollectionUtils.isEmpty(doList)) { dataGrid.setData(doList); dataGrid.setTotal(VciBaseUtil.getInt(String.valueOf(dockingDataDaoI.countByCondition(conditionMap)))); } return dataGrid; } @Override public DataGrid gridTask(Map conditionMap, PageHelper pageHelper) throws VciBaseException{ if (pageHelper == null) { pageHelper = new PageHelper(-1); } pageHelper.addDefaultDesc("createTime"); pageHelper.addDefaultAsc("sendflag"); List doList = dockingTaskDaoI.selectByCondition(conditionMap,pageHelper); DataGrid dataGrid=new DataGrid(); if (!CollectionUtils.isEmpty(doList)) { dataGrid.setData(doList); dataGrid.setTotal(VciBaseUtil.getInt(String.valueOf(dockingTaskDaoI.countByCondition(conditionMap)))); } return dataGrid; } @Override public DataGrid gridLoge(Map conditionMap, PageHelper pageHelper) throws VciBaseException{ if (pageHelper == null) { pageHelper = new PageHelper(-1); } pageHelper.addDefaultDesc("createTime"); List doList = dockingLogeDaoI.selectByCondition(conditionMap,pageHelper); DataGrid dataGrid=new DataGrid(); if (!CollectionUtils.isEmpty(doList)) { dataGrid.setData(doList); dataGrid.setTotal(VciBaseUtil.getInt(String.valueOf(dockingLogeDaoI.countByCondition(conditionMap)))); } return dataGrid; } @Override public DataGrid gridHeader(Map conditionMap, PageHelper pageHelper) throws VciBaseException{ if (pageHelper == null) { pageHelper = new PageHelper(-1); } pageHelper.addDefaultDesc("createTime"); List doList = sysIntHeaderDaoI.selectByCondition(conditionMap,pageHelper); DataGrid dataGrid=new DataGrid(); if (!CollectionUtils.isEmpty(doList)) { dataGrid.setData(doList); dataGrid.setTotal(VciBaseUtil.getInt(String.valueOf(sysIntHeaderDaoI.countByCondition(conditionMap)))); } return dataGrid; } /** * 推送成功,插入dockingtask,同时记录loge * @param systemcode * @param systemname * @param systemoid * @param paramString * @param url */ public BatchCBO taskSuccess(String systemcode,String systemname,String systemoid,String classifyoid,String classifyid,String classifyname,String id,String uniquecode,String paramString,String url,String msg){ String oid=redisService.getUUIDEveryDay(); DockingLogeDO dockingLogeDO = new DockingLogeDO(); dockingLogeDO.setOid(oid); dockingLogeDO.setSystemcode(systemcode); dockingLogeDO.setSystemname(systemname); dockingLogeDO.setSystemoid(systemoid); dockingLogeDO.setClassifyoid(classifyoid); dockingLogeDO.setClassifyid(classifyid); dockingLogeDO.setClassifyname(classifyname); dockingLogeDO.setId(id); dockingLogeDO.setUniquecode(uniquecode); /** if(paramString.length()>100){ paramString = paramString.substring(0,100); }***/ dockingLogeDO.setParamstring(paramString); dockingLogeDO.setType(MdmDuckingConstant.DATA_LOGE_OUT); // dockingLogeDO.setReturnstring(retString); dockingLogeDO.setMsg(msg); dockingLogeDO.setInterfacestatus(MdmDuckingConstant.INTERFACE_STATUS_TRUE); BatchCBO insert = dockingLogeDaoI.insert(dockingLogeDO); logger.info("集成推送数据成功,systemcode:"+systemcode+",systemname:"+systemcode+",url:"+url+",param:"+paramString); return insert; } /** * 推送失败,插入dockingtask,同时记录loge * @param systemcode * @param systemname * @param systemoid * @param paramString * @param url */ public BatchCBO taskFail(String systemcode,String systemname,String systemoid,String classifyoid,String classifyid,String classifyname,String id,String uniquecode,String paramString,String url,String msg){ String oid=redisService.getUUIDEveryDay(); DockingLogeDO dockingLogeDO = new DockingLogeDO(); dockingLogeDO.setOid(oid); dockingLogeDO.setSystemcode(systemcode); dockingLogeDO.setSystemname(systemname); dockingLogeDO.setSystemoid(systemoid); dockingLogeDO.setClassifyoid(classifyoid); dockingLogeDO.setClassifyid(classifyid); dockingLogeDO.setClassifyname(classifyname); dockingLogeDO.setId(id); dockingLogeDO.setUniquecode(uniquecode); /** if(StringUtils.isNotEmpty(paramString)&¶mString.length()>100){ paramString = paramString.substring(0,100); }***/ dockingLogeDO.setParamstring(paramString); dockingLogeDO.setType(MdmDuckingConstant.DATA_LOGE_OUT); dockingLogeDO.setMsg(msg); dockingLogeDO.setInterfacestatus(MdmDuckingConstant.INTERFACE_STATUS_FALSE); BatchCBO insert = dockingLogeDaoI.insert(dockingLogeDO); logger.error("集成推送数据失败,systemcode:"+systemcode+",systemname:"+systemcode+",url:"+url+",param:"+paramString+",e:"+msg); return insert; } public void initSysadmin(){ SessionInfo sessionInfo = new SessionInfo(); sessionInfo.setUserId("sysAdmin"); sessionInfo.setUserName("系统管理员"); sessionInfo.setIp(WebUtil.getLocalIp()); sessionInfo.setUserOid("193C026F-7DB8-27B4-F383-4E8BE083FB07"); sessionInfo.setUserSecret(UserSecretEnum.PRIVACY.getValue()+""); WebUtil.setSessionInfo(sessionInfo); } /** * dockingdata查询需要推送的数据 * @return */ public List getDockingDatas(){ String sql = "select oid,id,classifyoid,btmid,btmoid,sendtype,classifyid,classifyname from PLATFORMBTM_codedockingDATA where sendflag = 'false'"; List datas = boService.queryBySqlForMap(sql,null); return datas; } /** * dockingdata删除 * @return */ public boolean delteDockingData(String oid){ boolean u = false; String sql = "delete from PLATFORMBTM_codedockingDATA where oid = '"+oid+"'"; try { u=platformClientUtil.getBOFactoryService().executeUpdateSql(sql); }catch (Exception e){ } return u; } /** * 查询图号 * @return */ public String getTuhao(String oid){ String tuhao = ""; String sql = "select tuhao from PLATFORMBTM_wupin where oid = '"+oid+"'"; List datas = boService.queryBySqlForMap(sql,null); if(datas!=null&&datas.size()!=0){ tuhao = datas.get(0).getOrDefault("tuhao","").toString(); } return tuhao; } @Autowired private PlatformClientUtil platformClientUtil; /** * dockingdata根据oid修改sendflag * @param oid * @param sendflag * @return */ public boolean updateDockingDatasSendFlag(String oid,String sendflag){ boolean u=false; String sql = "update PLATFORMBTM_codedockingdata set sendFlag = '"+sendflag+"' where oid='"+oid+"'"; try { u=platformClientUtil.getBOFactoryService().executeUpdateSql(sql); }catch (Exception e){ } return u; } public boolean updateDockingDatasUniqueCode(String oid,String uniquecode){ boolean u=false; String sql = "update PLATFORMBTM_codedockingdata set uniquecode = '"+uniquecode+"' where oid='"+oid+"'"; try { u=platformClientUtil.getBOFactoryService().executeUpdateSql(sql); }catch (Exception e){ } return u; } }