123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770 |
- package com.persagy.bdtp.adm.service.impl;
- import cn.hutool.core.collection.CollUtil;
- import cn.hutool.core.date.DatePattern;
- import cn.hutool.core.date.DateUtil;
- import cn.hutool.core.util.IdUtil;
- import cn.hutool.core.util.StrUtil;
- import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
- import com.baomidou.mybatisplus.core.mapper.BaseMapper;
- import com.fasterxml.jackson.databind.JsonNode;
- import com.fasterxml.jackson.databind.ObjectMapper;
- import com.fasterxml.jackson.databind.node.ArrayNode;
- import com.fasterxml.jackson.databind.node.ObjectNode;
- import com.persagy.bdtp.adm.client.DicClient;
- import com.persagy.bdtp.adm.client.RwdClient;
- import com.persagy.bdtp.adm.common.AdmConst;
- import com.persagy.bdtp.adm.dao.*;
- import com.persagy.bdtp.adm.datatx.ObjectMapper4Tx;
- import com.persagy.bdtp.adm.entity.*;
- import com.persagy.bdtp.adm.entity.db.*;
- import com.persagy.bdtp.adm.service.*;
- import com.persagy.bdtp.adm.util.DataExtrasUtil;
- import com.persagy.dmp.basic.model.QueryCriteria;
- import com.persagy.dmp.basic.model.QueryOperator;
- import com.persagy.dmp.common.constant.ValidEnum;
- import com.persagy.dmp.define.entity.RelationDefine;
- import com.persagy.dmp.digital.client.DigitalObjectClient;
- import com.persagy.dmp.digital.client.DigitalRelationClient;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Service;
- import org.springframework.transaction.annotation.Transactional;
- import java.sql.Timestamp;
- import java.util.*;
- @Service
- public class SyncAppImpl implements ISyncApp {
- @Autowired
- private RwdClient rwdClient;
- @Autowired
- private DicClient dicClient;
- @Autowired
- private DigitalObjectClient objectClient;
- @Autowired
- private DigitalRelationClient relationClient;
- @Autowired
- private AdmClientFlagMapper clientFlagMapper;
- @Autowired
- private IConfigService configService;
- @Autowired
- private AdmPipeMapper pipeMapper;
- @Autowired
- private AdmJobSpaceMapper jobSpaceMapper;
- @Autowired
- private AdmProblemArchMapper problemArchMapper;
- @Autowired
- private AdmProblemEquipMapper problemEquipMapper;
- @Autowired
- private AdmFileMapper fileMapper;
- @Autowired
- private AdmQrCodeMapper qrCodeMapper;
- @Autowired
- private AdmServeAreaMapper serveAreaMapper;
- @Autowired
- private ISyncModel syncModel;
- @Autowired
- private ObjectMapper objectMapper;
- @Autowired
- private IAdmLogService logService;
- @Autowired
- private AdmUploadJobMapper uploadJobMapper;
- @Autowired
- private AdmMessagePMapper messageMapper;
- private final ObjectMapper4Tx mapper4Tx;
- @Autowired
- public SyncAppImpl(ObjectMapper4Tx mapper4Tx) {
- this.mapper4Tx = mapper4Tx;
- }
- @Override
- public String getClientId(String userId) {
- AdmClientFlag flagEntity = new AdmClientFlag();
- flagEntity.setUserId(userId);
- clientFlagMapper.insert(flagEntity);
- return String.valueOf(flagEntity.getId());
- }
- @Override
- public Dict downloadDict(String groupCode, String projectId, String userId) {
- return queryDict(groupCode, projectId, userId, true, true);
- }
- @Override
- public Dict queryDict(String groupCode, String projectId, String userId, boolean includeRel, boolean includeInfos){
- //从知识库服务获取专业分类
- QueryCriteria majorCriteria = ServiceUtil.getQueryCriteria(objectMapper);
- majorCriteria.getCriteria().put("type", "major");
- List<Map<String, Object>> majorList = ServiceUtil.call (() -> dicClient.dataQuery(groupCode, projectId, AdmConst.APP_ID, userId, majorCriteria));
- //查询系统和设备定义
- QueryCriteria criteria = ServiceUtil.getQueryCriteria(objectMapper, AdmConst.OBJ_TYPE_SYSTEM, AdmConst.OBJ_TYPE_EQUIPMENT);
- List<TypeDef> typeList = ServiceUtil.queryAllPage(() -> rwdClient.queryObjectType(groupCode, projectId, AdmConst.APP_ID, userId, criteria), criteria, new Pagination(500));
- LinkedList<TypeDef> sysList = new LinkedList<>();
- LinkedList<TypeDef> equipList = new LinkedList<>();
- for(TypeDef def : typeList){
- if(def.getObjType().equals(AdmConst.OBJ_TYPE_SYSTEM))
- sysList.add(def);
- else if(def.getObjType().equals(AdmConst.OBJ_TYPE_EQUIPMENT))
- equipList.add(def);
- }
- Dict data = new Dict();
- data.setMajor(majorList);
- data.setSystem(sysList);
- data.setEquipment(equipList);
- //查询关系定义
- if(includeRel) {
- List<RelationDefine> relList = ServiceUtil.call(() -> rwdClient.queryRelDef(groupCode, projectId, AdmConst.APP_ID, userId, new QueryCriteria()));
- data.setRelation(relList);
- }
- //查询信息点定义
- if(includeInfos) {
- QueryCriteria qc = new QueryCriteria();
- qc.setCriteria(objectMapper.createObjectNode());
- List<InfoDef> funcList = ServiceUtil.call(() -> rwdClient.queryFunc(groupCode, projectId, AdmConst.APP_ID, userId, qc));
- data.setInfos(funcList);
- }
- return data;
- }
- @Override
- public Map<String, Object> downloadConfig(String groupCode, String projectId, String userId) {
- //配置数据查询
- List<AdmM2dEquip> m2dTypes = configService.queryM2dEquip(projectId);
- List<AdmInfosConfig> infosConfig = configService.queryInfosConfig(projectId);
- List<AdmRelsConfig> relConfig = configService.queryRelsConfig(projectId);
- List<AdmPipeConfig> pipeConfig = configService.queryPipeConfig(projectId);
- List<AdmConfig> config = configService.queryCommonConfig(projectId);
- List<AdmComponent> component = configService.queryComponent(projectId);
- List<AdmContainerConfig> containerConfig = configService.queryContainerConfig(projectId);
- HashMap<String, Object> data = new HashMap<>();
- data.put("m2dTypes", m2dTypes);
- data.put("infosConfig", infosConfig);
- data.put("relConfig", relConfig);
- data.put("pipeConfig", pipeConfig);
- data.put("config", config);
- data.put("component", component);
- data.put("containerConfig", containerConfig);
- return data;
- }
- @Override
- public Map<String, Object> downloadFrameData(String groupCode, String projectId, String userId) {
- //TODO 项目修改为从运维平台查询
- QueryCriteria criteria = ServiceUtil.getQueryCriteria(objectMapper, AdmConst.OBJ_TYPE_PROJECT);
- List<ObjectNode> prjList = ServiceUtil.call(() -> objectClient.query(groupCode, null, AdmConst.APP_ID, userId, criteria));
- packInfos(prjList);
- QueryCriteria criteria2 = ServiceUtil.getQueryCriteria(objectMapper, AdmConst.OBJ_TYPE_BUILDING, AdmConst.OBJ_TYPE_FLOOR);
- List<ObjectNode> bdAndFl = ServiceUtil.call(() -> objectClient.query(groupCode, projectId, AdmConst.APP_ID, userId, criteria2));
- packInfos(bdAndFl);
- HashMap<String, Object> data = new HashMap<>();
- data.put("projects", prjList);
- data.put("buildingsAndFloors", bdAndFl);
- return data;
- }
- private void packInfos(List<ObjectNode> dataList){
- if(dataList != null) {
- for(ObjectNode node : dataList) {
- handle4Download(node);
- DataExtrasUtil.packObjExtras(node);
- }
- }
- }
- /** 下载前处理数据结构 */
- private void handle4Download(ObjectNode node){
- JsonNode ol = node.get("outline");
- if(ol != null){
- try {
- node.set("outline", objectMapper.readValue(ol.asText(), ArrayNode.class));
- }catch (Exception e) {
- }
- }
- JsonNode bl = node.get("bimLocation");
- if(bl != null) {
- try {
- String[] arr = bl.asText().split(",");
- ObjectNode ln = objectMapper.createObjectNode();
- ln.put("x", Double.parseDouble(arr[0]));
- ln.put("y", Double.parseDouble(arr[1]));
- ln.put("z", Double.parseDouble(arr[2]));
- node.set("location", ln);
- node.remove("bimLocation");
- }catch (Exception e) {
- }
- }
- }
- @Override
- public BuildingData downloadBuildingData(String projectId, String buildingId, String uploadFlag, String lastDownloadTime) {
- throw new RuntimeException("not supported");
- }
- @Override
- public BuildingData downloadBuildingData(String groupCode, String projectId, String userId, String clientId, String buildingId, Long bdtpDownloadTs, Long admDownloadTs) {
- String operator = getOperator(clientId, userId);
- // //从bdtp下载对象(空间、竖井)
- // QueryCriteria archCriteria = ServiceUtil.getQueryCriteria(objectMapper, AdmConst.OBJ_TYPE_SPACE, AdmConst.OBJ_TYPE_SHAFT);
- // buildDownloadQueryCriteria(archCriteria, operator, bdtpDownloadTs);
- // ObjectNode rt = archCriteria.getCriteria().putObject("relationTo");
- // rt.put("graphCode", "ArchSubset");
- // rt.put("objFrom", buildingId);
- // List<ObjectNode> archList = ServiceUtil.queryAllPage(() -> objectClient.query(groupCode, projectId, AdmConst.APP_ID, userId, archCriteria), archCriteria, new Pagination(500));
- // //系统、设备
- // QueryCriteria eqCriteria = ServiceUtil.getQueryCriteria(objectMapper, AdmConst.OBJ_TYPE_SYSTEM, AdmConst.OBJ_TYPE_EQUIPMENT);
- // buildDownloadQueryCriteria(eqCriteria, operator, bdtpDownloadTs);
- // ObjectNode rf = eqCriteria.getCriteria().putObject("relationFrom");
- // rf.put("graphCode", "MechInArch");
- // rf.put("objTo", buildingId);
- // List<ObjectNode> eqList = ServiceUtil.queryAllPage(() -> objectClient.query(groupCode, projectId, AdmConst.APP_ID, userId, eqCriteria), eqCriteria, new Pagination(500));
- //
- // List<ObjectNode> objs = new ArrayList<>();
- // if(archList != null)
- // objs.addAll(archList);
- // if(eqList != null)
- // objs.addAll(eqList);
- //从bdtp下载对象(空间、竖井、系统、设备、元空间)
- QueryCriteria criteria = ServiceUtil.getQueryCriteria(objectMapper, AdmConst.OBJ_TYPE_SPACE, AdmConst.OBJ_TYPE_SHAFT, AdmConst.OBJ_TYPE_SYSTEM, AdmConst.OBJ_TYPE_EQUIPMENT, "ispace");
- buildDownloadQueryCriteria(criteria, operator, bdtpDownloadTs);
- criteria.getCriteria().put("buildingId", buildingId);
- criteria.getCriteria().putObject("classCode").put(QueryOperator.NOT_LIKE.getIndex(), "__PP__");
- List<ObjectNode> objs = ServiceUtil.queryAllPage(() -> objectClient.query(groupCode, projectId, AdmConst.APP_ID, userId, criteria), criteria, new Pagination(500));
- if(objs == null)
- objs = new ArrayList<>(0);
- else {
- objs.removeIf(objNode -> {
- if (objNode.get("classCode") != null) {
- String clsCode = objNode.get("classCode").asText();
- return clsCode.startsWith("CF");
- }
- return true;
- });
- }
- packInfos(objs);
- test4Ts(objs);
- //关系数据按项目下载,不在建筑数据中处理
- //管道数据,实验方案
- List<AdmPipe> pipes = pipeMapper.selectList(buildDownloadQueryWrapper(new QueryWrapper<AdmPipe>(), projectId, buildingId, operator, admDownloadTs));
- //任务相关数据查询
- List<AdmJobSpace> jobSpace = jobSpaceMapper.selectList(buildDownloadQueryWrapper(new QueryWrapper<AdmJobSpace>(), projectId, buildingId, operator, admDownloadTs));
- List<AdmProblemArch> problemArch = problemArchMapper.selectList(buildDownloadQueryWrapper(new QueryWrapper<AdmProblemArch>(), projectId, buildingId, operator, admDownloadTs));
- List<AdmProblemEquip> problemEquip = problemEquipMapper.selectList(buildDownloadQueryWrapper(new QueryWrapper<AdmProblemEquip>(), projectId, buildingId, operator, admDownloadTs));
- List<AdmFile> file = fileMapper.selectList(buildDownloadQueryWrapper(new QueryWrapper<AdmFile>(), projectId, buildingId, operator, admDownloadTs));
- List<AdmQrCode> qrCode = qrCodeMapper.selectList(buildDownloadQueryWrapper(new QueryWrapper<AdmQrCode>(), projectId, buildingId, operator, admDownloadTs));
- List<AdmServeArea> serveArea = serveAreaMapper.selectList(buildDownloadQueryWrapper(new QueryWrapper<AdmServeArea>(), projectId, buildingId, operator, admDownloadTs));
- BuildingData data = new BuildingData();
- data.setBuildingId(buildingId);
- data.setObjects(objs);
- data.setPipes(pipes);
- data.setJobSpace(jobSpace);
- data.setProblemArch(problemArch);
- data.setProblemEquip(problemEquip);
- data.setFile(file);
- data.setQrCode(qrCode);
- data.setServeArea(serveArea);
- data.buildDownloadTs();
- return data;
- }
- private String getOperator(String clientId, String userId){
- return userId + ':' + clientId;
- }
- private <T> QueryWrapper<T> buildDownloadQueryWrapper(QueryWrapper<T> wrapper, String projectId, String buildingId, String operator, Long lastDownloadTime){
- wrapper.eq("project_id", projectId).eq("building_id", buildingId);
- if (lastDownloadTime != null && lastDownloadTime > 0) { //非初始化下载
- wrapper.gt("ts", lastDownloadTime);
- wrapper.and(
- w -> w.isNotNull("modifier").ne("modifier", operator)
- .or()
- .isNull("modifier").ne("creator", operator)
- );
- }
- return wrapper;
- }
- private void buildDownloadQueryCriteria(QueryCriteria criteria, String operator, Long lastDownloadTime){
- if (lastDownloadTime != null && lastDownloadTime > 0) {
- criteria.getCriteria().putObject("ts").put("$gt", lastDownloadTime);
- criteria.getCriteria().putObject("modifier").put("$ne", operator); //TODO 暂时只能处理modifier
- }
- }
- //TODO debug 接口未返回ts时,添加一个
- private void test4Ts(List<ObjectNode> dataList){
- long ts = System.currentTimeMillis();
- for(ObjectNode data : dataList) {
- if (data.get("ts") == null)
- data.put("ts", ts);
- }
- }
- @Override
- public ProjectData downloadProjectData(String groupCode, String projectId, String userId, String clientId, Long bdtpDownloadTs, Long admDownloadTs) {
- String operator = getOperator(clientId, userId);
- QueryCriteria criteria = ServiceUtil.getQueryCriteria(objectMapper);
- buildDownloadQueryCriteria(criteria, operator, bdtpDownloadTs);
- //criteria.getCriteria().put("createApp", AdmConst.CREATOR_APP); //TODO 临时逻辑,只下载app端创建的关系
- criteria.getCriteria().putObject("graphCode").put("$notInSql", "'MechInArch','MechSubset','ArchSubset'"); //过滤掉大量不需要使用的关系
- List<ObjectNode> rels = ServiceUtil.queryAllPage(() -> rwdClient.queryRelation(groupCode, projectId, AdmConst.APP_ID, userId, criteria), criteria, new Pagination(500));
- /*
- //debug 关系数据量过大,测试下载1000条
- criteria.setPage(1L);
- criteria.setSize(1000L);
- List<ObjectNode> rels = ServiceUtil.call(() -> rwdClient.queryRelation(groupCode, projectId, AdmConst.APP_ID, userId, criteria));
- */
- if(rels == null)
- rels = new ArrayList<>();
- //单独下载元空间和空间的对应关系
- QueryCriteria criteria2 = ServiceUtil.getQueryCriteria(objectMapper);
- buildDownloadQueryCriteria(criteria2, operator, bdtpDownloadTs);
- criteria2.getCriteria().put("graphCode", "MechInArch").put("relCode", "Sp2Si").put("relValue", "GeneralZone");
- List<ObjectNode> spRels = ServiceUtil.queryAllPage(() -> rwdClient.queryRelation(groupCode, projectId, AdmConst.APP_ID, userId, criteria2), criteria2, new Pagination(500));
- if(spRels != null)
- rels.addAll(spRels);
- test4Ts(rels);
- ProjectData data = new ProjectData();
- data.setRelations(rels);
- data.buildDownloadTs();
- return data;
- }
- @Override
- public UploadRtn uploadData(UploadData uploadData, String groupCode, String projectId, String userId, String clientId) {
- if(!uploadData.notEmpty())
- return new UploadRtn(AdmConst.UPLOAD_FINISHED);
- String operator = getOperator(clientId, userId);
- String timestamp = DateUtil.format(new Date(), DatePattern.PURE_DATETIME_PATTERN);
- UploadParams uploadParams = new UploadParams(groupCode, projectId, userId, uploadData.getUploadJobId(), operator, timestamp);
- //检查上传任务状态
- String status = checkUploadStatus(uploadParams);
- if(status != null)
- return new UploadRtn(status);
- List<AdmUploadLog> logs = new ArrayList<>();
- //TODO 分布式事务管理
- try {
- //上传bdtp数据
- List<ObjectNode> relations = new ArrayList<>();
- if (CollUtil.isNotEmpty(uploadData.getObjects())) {
- D2mMessage d2mMessage = new D2mMessage("object", groupCode, projectId);
- List<ObjectNode>[] objData = prepareBdtpData(uploadData.getObjects(), uploadParams, d2mMessage, logs);
- uploadObjs(uploadParams, objData);
- sendD2mMessage(d2mMessage, uploadParams);
- autoRelations(objData[0], relations, uploadParams);
- }
- if(uploadData.getRelations() != null)
- relations.addAll(uploadData.getRelations());
- if (relations.size() > 0) {
- List<ObjectNode>[] relData = prepareBdtpData(relations, uploadParams, null, logs);
- uploadRels(uploadParams, relData);
- }
- //上传adm数据
- uploadAdmData(uploadData, uploadParams, logs);
- } catch (Exception e) {
- markStatus(uploadData.getUploadJobId(), AdmConst.UPLOAD_ERROR);
- if(e instanceof RuntimeException)
- throw (RuntimeException)e;
- throw new RuntimeException(e);
- }
- //标注上传任务状态
- markStatus(uploadData.getUploadJobId(), AdmConst.UPLOAD_FINISHED);
- //记录日志
- logService.saveUploadLog(logs);
- return new UploadRtn(AdmConst.UPLOAD_FINISHED);
- }
- private void autoRelations(List<ObjectNode> newObjs, List<ObjectNode> relations, UploadParams ps){
- for(ObjectNode obj : newObjs) {
- if (obj.get("objType") != null && AdmConst.OBJ_TYPE_EQUIPMENT.equals(obj.get("objType").asText())) {
- String eqId = obj.get("id").asText();
- if(obj.get("buildingId") != null) {
- String bdId = obj.get("buildingId").asText();
- relations.add(createRelation(eqId, bdId, "MechInArch", "Eq2Bd", ps.groupCode, ps.projectId));
- }
- if(obj.get("floorId") != null) {
- String flId = obj.get("floorId").asText();
- relations.add(createRelation(eqId, flId, "MechInArch", "Eq2Fl", ps.groupCode, ps.projectId));
- }
- }
- }
- }
- private ObjectNode createRelation(String from, String to, String graphCode, String relCode, String groupCode, String projectId){
- ObjectNode r = objectMapper.createObjectNode();
- r.put("id", IdUtil.simpleUUID());
- r.put("objFrom", from);
- r.put("objTo", to);
- r.put("graphCode", graphCode);
- r.put("relCode", relCode);
- r.put("groupCode", groupCode);
- r.put("projectId", projectId);
- r.put("valid", ValidEnum.TRUE.getType());
- r.put("state", 0); //新增标识
- return r;
- }
- private String checkUploadStatus(UploadParams uploadParams){
- AdmUploadJob job = uploadJobMapper.selectOne(new QueryWrapper<AdmUploadJob>().eq("id", uploadParams.jobId));
- if(job != null) {
- if(!AdmConst.UPLOAD_ERROR.equals(job.getStatus()))
- return job.getStatus();
- } else {
- job = new AdmUploadJob();
- job.setId(uploadParams.jobId);
- job.setProjectId(uploadParams.projectId);
- job.setOperator(uploadParams.operator);
- job.setStatus(AdmConst.UPLOAD_PROCESSING);
- job.setStartTime(new Timestamp(System.currentTimeMillis()));
- uploadJobMapper.insert(job);
- }
- return null;
- }
- private void markStatus(String uploadJobId, String status) {
- AdmUploadJob job = new AdmUploadJob();
- job.setId(uploadJobId);
- job.setStatus(status);
- job.setFinishTime(new Timestamp(System.currentTimeMillis()));
- uploadJobMapper.updateById(job);
- }
- private void uploadObjs(UploadParams ps, List<ObjectNode>[] data) {
- if(data[0].size() > 0)
- ServiceUtil.call(() -> objectClient.create(ps.groupCode, ps.projectId, AdmConst.APP_ID, ps.userId, data[0]));
- if (data[1].size() > 0)
- ServiceUtil.call(() -> objectClient.update(ps.groupCode, ps.projectId, AdmConst.APP_ID, ps.userId, data[1]));
- }
- private void uploadRels(UploadParams ps, List<ObjectNode>[] data) {
- if(data[0].size() > 0)
- ServiceUtil.call(() -> relationClient.create(ps.groupCode, ps.projectId, AdmConst.APP_ID, ps.userId, data[0]));
- if (data[1].size() > 0)
- ServiceUtil.call(() -> relationClient.update(ps.groupCode, ps.projectId, AdmConst.APP_ID, ps.userId, data[1]));
- }
- private List<ObjectNode>[] prepareBdtpData(List<ObjectNode> list, UploadParams uploadParams, D2mMessage d2mMessage, List<AdmUploadLog> logs){
- List<ObjectNode> updateList = new ArrayList<>();
- Iterator<ObjectNode> iter = list.iterator();
- while (iter.hasNext()) {
- ObjectNode entity = iter.next();
- DataExtrasUtil.unpackObjExtras(entity);
- handle4Upload(entity);
- AdmUploadLog log;
- if (entity.get("state").asInt() == 1) {
- updateList.add(entity);
- iter.remove();
- boolean remove = entity.get("valid").asInt() == ValidEnum.FALSE.getType();
- //设备数据上传时向模型服务发同步消息
- if(d2mMessage != null && needsD2m(entity)) {
- if(remove)
- d2mMessage.appendRemoveItem(entity);
- else
- d2mMessage.appendModifyItem(entity);
- }
- log = new AdmUploadLog(uploadParams.jobId, uploadParams.operator, remove ? AdmUploadLog.REMOVE : AdmUploadLog.MODIFY);
- log.setData(entity, objectMapper);
- entity.put("updateApp", AdmConst.CREATOR_APP);
- entity.put("modifier", uploadParams.operator);
- entity.put("modifiedTime", uploadParams.time);
- //TODO 可能需要进行删除信息点操作
- } else {
- if(d2mMessage != null && needsD2m(entity))
- d2mMessage.appendAddItem(entity);
- log = new AdmUploadLog(uploadParams.jobId, uploadParams.operator, AdmUploadLog.ADD);
- log.setData(entity, objectMapper);
- entity.put("createApp", AdmConst.CREATOR_APP);
- entity.put("creator", uploadParams.operator);
- entity.put("creationTime", uploadParams.time);
- entity.put("modifier", uploadParams.operator);
- entity.put("modifiedTime", uploadParams.time);
- }
- logs.add(log);
- }
- return new List[] {list, updateList};
- }
- private boolean needsD2m(ObjectNode node){
- return node != null && node.get("objType") != null && AdmConst.OBJ_TYPE_EQUIPMENT.equals(node.get("objType").asText());
- }
- @Transactional(rollbackFor = Exception.class)
- public void uploadAdmData(UploadData uploadData, UploadParams uploadParams, List<AdmUploadLog> logs) {
- if (CollUtil.isNotEmpty(uploadData.getPipes())) {
- uploadAdmEntities(uploadData.getPipes(), uploadParams, pipeMapper, new D2mMessage("pipe", uploadParams.groupCode, uploadParams.projectId), logs, true);
- }
- if (CollUtil.isNotEmpty(uploadData.getJobSpace())) {
- uploadAdmEntities(uploadData.getJobSpace(), uploadParams, jobSpaceMapper, null, logs, false);
- }
- if (CollUtil.isNotEmpty(uploadData.getProblemArch())) {
- uploadAdmEntities(uploadData.getProblemArch(), uploadParams, problemArchMapper, null, logs, false);
- }
- if (CollUtil.isNotEmpty(uploadData.getProblemEquip())) {
- uploadAdmEntities(uploadData.getProblemEquip(), uploadParams, problemEquipMapper, null, logs, false);
- }
- if (CollUtil.isNotEmpty(uploadData.getFile())) {
- uploadAdmEntities(uploadData.getFile(), uploadParams, fileMapper, null, logs, false);
- }
- if (CollUtil.isNotEmpty(uploadData.getQrCode())) {
- uploadAdmEntities(uploadData.getQrCode(), uploadParams, qrCodeMapper, null, logs, false);
- }
- if (CollUtil.isNotEmpty(uploadData.getServeArea())) {
- uploadAdmEntities(uploadData.getServeArea(), uploadParams, serveAreaMapper, null, logs, false);
- }
- }
- private <T extends BaseAdmDataEntity> void uploadAdmEntities(List<T> list, UploadParams ps, BaseMapper<T> mapper, D2mMessage d2mMessage, List<AdmUploadLog> logs, boolean merge) {
- List<T> updateList = new ArrayList<>();
- Iterator<T> iter = list.iterator();
- while (iter.hasNext()) {
- T entity = iter.next();
- AdmUploadLog log;
- if (entity.getState() == 1) {
- updateList.add(entity);
- iter.remove();
- boolean remove = entity.getValid().intValue() == ValidEnum.FALSE.getType();
- if(d2mMessage != null) {
- if(remove)
- d2mMessage.appendRemoveItem(entity);
- else
- d2mMessage.appendModifyItem(entity);
- }
- log = new AdmUploadLog(ps.jobId, ps.operator, remove ? AdmUploadLog.REMOVE : AdmUploadLog.MODIFY);
- //任务空间不上传轮廓数据
- if(entity instanceof AdmJobSpace)
- ((AdmJobSpace) entity).setOutline(null);
- } else {
- if(d2mMessage != null)
- d2mMessage.appendAddItem(entity);
- log = new AdmUploadLog(ps.jobId, ps.operator, AdmUploadLog.ADD);
- }
- log.setData(entity, objectMapper);
- logs.add(log);
- entity.setTs(null); //保存数据前,删除ts字段
- }
- //insert
- if(list.size() > 0) {
- for(T entity : list) {
- entity.setCreator(ps.operator);
- entity.setCreationTime(ps.time);
- mapper.insert(entity);
- }
- }
- //update
- if (updateList.size() > 0) {
- Map<String, T> dbObjsMap = null;
- if(merge) {
- ArrayList<String> updateIds = new ArrayList<>(updateList.size());
- updateList.forEach(entity -> updateIds.add(entity.getId()));
- List<T> dbList = mapper.selectBatchIds(updateIds);
- dbObjsMap = new HashMap<>(dbList.size());
- for(T dbObj : dbList) {
- dbObjsMap.put(dbObj.getId(), dbObj);
- }
- }
- for(T entity : updateList) {
- if(merge)
- entity = mergeEntity(entity, dbObjsMap.get(entity.getId()));
- entity.setModifier(ps.operator);
- entity.setModifiedTime(ps.time);
- mapper.updateById(entity);
- }
- }
- sendD2mMessage(d2mMessage, ps);
- }
- private <T extends BaseAdmDataEntity> T mergeEntity(T obj, T dbObj) {
- if (dbObj != null) {
- if(dbObj instanceof AdmPipe)
- ((AdmPipe)obj).setInfos(mergeInfos(((AdmPipe) obj).getInfos(), ((AdmPipe) dbObj).getInfos()));
- }
- return obj;
- }
- private ObjectNode mergeInfos(ObjectNode infos, ObjectNode dbInfos){
- if (dbInfos != null) {
- if(infos != null)
- dbInfos.setAll(infos);
- return dbInfos;
- } else
- return infos;
- }
- private void sendD2mMessage(D2mMessage d2mMessage, UploadParams ps){
- if (d2mMessage != null && d2mMessage.isNotEmpty()) {
- // if(d2mMessage.getAddItems() != null){
- // for(Object o : d2mMessage.getAddItems()) {
- // markM2dState(o);
- // }
- // }
- // if(d2mMessage.getModifyItems() != null){
- // for(Object o : d2mMessage.getModifyItems()) {
- // markM2dState(o);
- // }
- // }
- // if(d2mMessage.getRemoveItems() != null) {
- // for(Object o : d2mMessage.getRemoveItems()) {
- // markM2dState(o);
- // }
- // }
- markM2dState(d2mMessage, ps);
- syncModel.sendMessageToModel(d2mMessage);
- }
- }
- /** 上传前处理数据结构 */
- private void handle4Upload(ObjectNode node){
- node.remove("ts"); //调用bdtp接口前,删除ts字段
- //轮廓不上传
- if(node.get("outline") != null)
- node.remove("outline");
- //location对象转为bimLocation
- JsonNode l = node.get("location");
- if(l != null) {
- try {
- if(l.get("x") != null)
- node.put("bimLocation", StrUtil.join(",", l.get("x").asDouble(), l.get("y").asDouble(), l.get("z").asDouble()));
- else if(l.get("X") != null)
- node.put("bimLocation", StrUtil.join(",", l.get("X").asDouble(), l.get("Y").asDouble(), l.get("Z").asDouble()));
- node.remove("location");
- }catch (Exception e) {
- }
- }
- }
- private void markM2dState(D2mMessage d2mMessage, UploadParams ps){
- AdmMessageP message = new AdmMessageP();
- message.setId(d2mMessage.getId());
- message.setProjectId(ps.projectId);
- message.setTriggerType("upload");
- message.setSender(ps.jobId);
- message.setContent(d2mMessage);
- message.setStatus(AdmConst.UPLOAD_PROCESSING);
- message.setSendTime(new Timestamp(System.currentTimeMillis()));
- messageMapper.insert(message);
- }
- private class UploadParams{
- String groupCode;
- String projectId;
- String userId;
- String jobId;
- String operator;
- String time;
- public UploadParams(String groupCode, String projectId, String userId, String jobId, String operator, String time) {
- this.groupCode = groupCode;
- this.projectId = projectId;
- this.userId = userId;
- this.jobId = jobId;
- this.operator = operator;
- this.time = time;
- }
- }
- }
|