SyncOldAdmImpl.java 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569
  1. package com.persagy.bdtp.adm.service.impl;
  2. import cn.hutool.core.date.DatePattern;
  3. import cn.hutool.core.date.DateUtil;
  4. import cn.hutool.core.util.ArrayUtil;
  5. import cn.hutool.core.util.IdUtil;
  6. import cn.hutool.core.util.ReflectUtil;
  7. import cn.hutool.core.util.StrUtil;
  8. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  9. import com.fasterxml.jackson.databind.JsonNode;
  10. import com.fasterxml.jackson.databind.ObjectMapper;
  11. import com.fasterxml.jackson.databind.node.ArrayNode;
  12. import com.fasterxml.jackson.databind.node.ObjectNode;
  13. import com.persagy.bdtp.adm.client.OldAdmClient;
  14. import com.persagy.bdtp.adm.common.AdmConst;
  15. import com.persagy.bdtp.adm.common.AdmResult;
  16. import com.persagy.bdtp.adm.dao.AdmJobSpaceMapper;
  17. import com.persagy.bdtp.adm.dao.AdmObjectMapper;
  18. import com.persagy.bdtp.adm.entity.db.AdmJobSpace;
  19. import com.persagy.bdtp.adm.entity.db.AdmObject;
  20. import com.persagy.bdtp.adm.entity.oldadm.*;
  21. import com.persagy.bdtp.adm.service.CallException;
  22. import com.persagy.bdtp.adm.service.IAdmObjectService;
  23. import com.persagy.bdtp.adm.service.IQueryFromOldAdm;
  24. import com.persagy.bdtp.adm.service.ISyncOldAdm;
  25. import com.persagy.bdtp.adm.util.GeomUtil;
  26. import com.persagy.dmp.common.constant.ResponseCode;
  27. import com.persagy.dmp.common.constant.ValidEnum;
  28. import com.persagy.dmp.common.exception.BusinessException;
  29. import com.persagy.dmp.common.helper.SpringHelper;
  30. import com.persagy.dmp.file.client.FileClientFacade;
  31. import com.persagy.dmp.file.model.FileInfo;
  32. import com.persagy.dmp.file.model.FileInfoCreator;
  33. import com.persagy.dmp.storage.utils.FileStorageHelper;
  34. import feign.Response;
  35. import org.locationtech.jts.geom.Polygon;
  36. import org.springframework.beans.factory.annotation.Autowired;
  37. import org.springframework.stereotype.Service;
  38. import org.springframework.transaction.annotation.Transactional;
  39. import java.io.IOException;
  40. import java.io.InputStream;
  41. import java.lang.reflect.Field;
  42. import java.util.*;
  43. import java.util.stream.Collectors;
  44. @Service
  45. public class SyncOldAdmImpl implements ISyncOldAdm {
  46. @Autowired
  47. private IQueryFromOldAdm queryOldAdm;
  48. @Autowired
  49. private IAdmObjectService objectService;
  50. @Autowired
  51. private AdmObjectMapper objectMapper;
  52. @Autowired
  53. private AdmJobSpaceMapper jobSpaceMapper;
  54. @Override
  55. @Transactional(rollbackFor = Exception.class)
  56. public Map<String, Object> syncData(String groupCode, String projectId) {
  57. String token = queryOldAdm.login();
  58. if(StrUtil.isNotBlank(token)){
  59. List<OBuilding> bdList = queryOldAdm.queryBdAnFl(token, groupCode, projectId);
  60. List<OSpace> spList = queryOldAdm.querySpace(token, groupCode, projectId);
  61. spList = spList.stream().filter(space -> GeomUtil.checkPolygon(space.getOutline())).collect(Collectors.toList());
  62. List<OEquip> eqList = queryOldAdm.queryEquip(token, groupCode, projectId);
  63. List<AdmObject> bdObjs = new ArrayList<>(bdList.size());
  64. List<AdmObject> flObjs = new ArrayList<>();
  65. List<AdmObject> spObjs = new ArrayList<>(spList.size());
  66. List<AdmObject> eqObjs = new ArrayList<>(eqList.size());
  67. transEntities(bdObjs, bdList, (bdObj, oBd) -> {
  68. setBdData(bdObj, (OBuilding) oBd);
  69. if(((OBuilding) oBd).getFloor() != null)
  70. transEntities(flObjs, ((OBuilding) oBd).getFloor(), (flObj, oFl) -> setFlData(flObj, (OFloor) oFl));
  71. });
  72. transEntities(spObjs, spList, (spObj, oSp) -> setSpData(spObj, (OSpace) oSp));
  73. transEntities(eqObjs, eqList, (eqObj, oEq) -> setEqData(eqObj, (OEquip) oEq));
  74. Map<String, String> floorIdMap = new HashMap<>();
  75. List<AdmObject> dbBds = objectService.queryM2dByObjType(projectId, AdmConst.OBJ_TYPE_BUILDING);
  76. List<AdmObject> dbFls = objectService.queryM2dByObjType(projectId, AdmConst.OBJ_TYPE_FLOOR);
  77. List<AdmObject> dbSps = objectService.queryM2dByObjType(projectId, AdmConst.OBJ_TYPE_SPACE);
  78. List<AdmObject> dbEqs = objectService.queryM2dByObjType(projectId, AdmConst.OBJ_TYPE_EQUIPMENT);
  79. List<AdmObject>[] operations = new List[]{new ArrayList<>(), new ArrayList<>()};
  80. syncObjs(bdObjs, dbBds, operations, 1, floorIdMap);
  81. syncObjs(flObjs, dbFls, operations, 2, floorIdMap);
  82. syncObjs(spObjs, dbSps, operations, 3, floorIdMap);
  83. syncObjs(eqObjs, dbEqs, operations, 4, floorIdMap);
  84. objectService.insert(operations[0]);
  85. objectService.update(operations[1]);
  86. /*uploadFloorMap(flObjs, groupCode, projectId);*/
  87. HashMap<String, Object> rtn = new HashMap<>();
  88. rtn.put(AdmConst.OBJ_TYPE_BUILDING, bdObjs.size());
  89. rtn.put(AdmConst.OBJ_TYPE_FLOOR, flObjs.size());
  90. rtn.put(AdmConst.OBJ_TYPE_SPACE, spObjs.size());
  91. rtn.put(AdmConst.OBJ_TYPE_EQUIPMENT, eqObjs.size());
  92. return rtn;
  93. }
  94. throw new CallException(new AdmResult(ResponseCode.A0220.getCode(), "ADM platform: " + ResponseCode.A0220.getDesc()));
  95. }
  96. //TODO 设备同步时,按正逆向规则过滤
  97. private void syncObjs(List<AdmObject> objs, List<AdmObject> dbItems, List<AdmObject>[] operations, int objMark, Map<String, String> floorIdMap){
  98. HashMap<String, AdmObject> dbMap = new HashMap<>();
  99. for (AdmObject dbItem : dbItems){
  100. dbMap.put(getFixedIdForSync(dbItem, objMark), dbItem);
  101. }
  102. String timestamp = DateUtil.format(new Date(), DatePattern.PURE_DATETIME_PATTERN);
  103. for(AdmObject obj : objs) {
  104. AdmObject dbItem = dbMap.remove(getFixedIdForSync(obj, objMark));
  105. if(dbItem == null) {
  106. obj.setCreator(AdmConst.CREATOR_SYNC);
  107. obj.setModifiedTime(timestamp); //保留从老adm同步过来的createTime,设置updateTime
  108. obj.setD2mState(ValidEnum.TRUE.getType());
  109. obj.setDeliveryState(ValidEnum.FALSE.getType());
  110. if(objMark == 3 || objMark == 4) { //新增空间|设备
  111. if(floorIdMap.size() > 0){
  112. String fixedFloorId = floorIdMap.get(obj.getFloorId());
  113. if(fixedFloorId != null)
  114. obj.setFloorId(fixedFloorId);
  115. }
  116. }
  117. operations[0].add(obj); //add
  118. } else {
  119. AdmObject updateItem = mergeObj(obj, dbItem, timestamp, objMark);
  120. if(updateItem != null)
  121. operations[1].add(updateItem); //modify
  122. if(objMark == 2 && !obj.getId().equals(dbItem.getId())) {
  123. floorIdMap.put(obj.getId(), dbItem.getId());
  124. }
  125. }
  126. }
  127. if (dbMap.size() > 0) { //remove
  128. for(AdmObject obj : dbMap.values()){
  129. obj.setValid(ValidEnum.FALSE.getType());
  130. obj.setModifiedTime(timestamp);
  131. obj.setModifier(AdmConst.CREATOR_SYNC);
  132. obj.setUploadFlag(null);
  133. operations[1].add(obj);
  134. }
  135. }
  136. }
  137. /**
  138. * 同步数据时固定的id,优先取bimId,没有bimId取数据id
  139. */
  140. private String getFixedIdForSync(AdmObject obj, int objMark){
  141. String bimId = null;
  142. JsonNode node = obj.getInfo("bimId");
  143. if(node != null)
  144. bimId = node.asText();
  145. if(StrUtil.isNotBlank(bimId))
  146. return bimId;
  147. if(objMark == 1) //建筑
  148. return obj.getLocalId();
  149. else if(objMark == 2) //楼层
  150. return obj.getBuildingId() + ":" + obj.getLocalId();
  151. return obj.getId();
  152. }
  153. private AdmObject mergeObj(AdmObject obj, AdmObject dbItem, String timestamp, int objMark){
  154. if(objNotChange(obj, dbItem))
  155. return null;
  156. //合并属性和信息点
  157. // if(objMark == 3) {//space
  158. //
  159. // } else if(objMark == 4) {//equipment
  160. //
  161. // }
  162. if (obj.getInfos() != null) {
  163. if (dbItem.getInfos() == null)
  164. dbItem.setInfos(obj.getInfos());
  165. else
  166. dbItem.getInfos().setAll(obj.getInfos());
  167. }
  168. dbItem.setModifiedTime(timestamp);
  169. dbItem.setModifier(AdmConst.CREATOR_SYNC);
  170. dbItem.setUploadFlag(null);
  171. dbItem.setD2mState(ValidEnum.TRUE.getType());
  172. dbItem.setDeliveryState(ValidEnum.FALSE.getType());
  173. return dbItem;
  174. }
  175. private boolean objNotChange(AdmObject obj, AdmObject dbItem){
  176. //TODO 数据无变化判断
  177. return false;
  178. }
  179. private <T extends OBase> void transEntities(List<AdmObject> targetList, List<T> list, SetDataAction setDataAction){
  180. if(list != null && list.size() > 0) {
  181. for(T item : list) {
  182. AdmObject obj = buildAdmObject(item);
  183. setDataAction.setData(obj, item);
  184. targetList.add(obj);
  185. }
  186. }
  187. }
  188. private AdmObject buildAdmObject(OBase base){
  189. AdmObject obj = new AdmObject();
  190. obj.setId(base.getId());
  191. obj.setLocalId(base.getLocalId());
  192. obj.setName(base.getName());
  193. obj.setLocalName(base.getLocalName());
  194. obj.setObjType(base.getObjectType());
  195. if (base.getInfos() != null)
  196. obj.setInfos(mapToNode(base.getInfos()));
  197. if(base.getCreateTime() != null) //同步数据中没有createTime时,设置为当前时间
  198. obj.setCreationTime(DateUtil.format(new Date(), DatePattern.PURE_DATETIME_PATTERN));
  199. obj.setValid(ValidEnum.TRUE.getType());
  200. return obj;
  201. }
  202. private void setBdData(AdmObject obj, OBuilding bd){
  203. obj.setProjectId(bd.getProjectId());
  204. obj.setClassCode(bd.getObjectType());
  205. //obj.setBuildingId(bd.getId());
  206. if(bd.getDefaultQRCode() != null)
  207. getInfos(obj).put("defaultQRCode", bd.getDefaultQRCode());
  208. if(bd.getBuildQRCode() != null)
  209. getInfos(obj).put("buildQRCode", bd.getBuildQRCode());
  210. }
  211. private void setFlData(AdmObject obj, OFloor fl){
  212. obj.setProjectId(fl.getProjectId());
  213. obj.setBuildingId(fl.getBuildingId());
  214. //obj.setFloorId(fl.getId());
  215. obj.setClassCode(fl.getObjectType());
  216. setInfos(obj, fl, "projectId", "buildingId", "floorId");
  217. }
  218. private void setSpData(AdmObject obj, OSpace sp) {
  219. obj.setProjectId(sp.getProjectId());
  220. obj.setBuildingId(sp.getBuildingId());
  221. obj.setFloorId(sp.getFloorId());
  222. obj.setClassCode(sp.getClassCode());
  223. obj.setObjType(AdmConst.OBJ_TYPE_SPACE);
  224. setInfos(obj, sp, "projectId", "buildingId", "floorId", "classCode");
  225. }
  226. private void setEqData(AdmObject obj, OEquip eq) {
  227. obj.setProjectId(eq.getProjectId());
  228. obj.setBuildingId(eq.getBuildingId());
  229. obj.setFloorId(eq.getFloorId());
  230. obj.setClassCode(eq.getClassCode());
  231. setInfos(obj, eq, "projectId", "buildingId", "floorId", "propertyId", "classCode");
  232. }
  233. private void setInfos(AdmObject obj, OBase oEntity, String... ignoreFields){
  234. Field[] fields = oEntity.getClass().getDeclaredFields();
  235. for (Field field : fields) {
  236. if(ignoreFields.length == 0 || !ArrayUtil.contains(ignoreFields, field.getName())) {
  237. Object val = ReflectUtil.getFieldValue(oEntity, field);
  238. if(val != null) {
  239. ObjectNode infos = getInfos(obj);
  240. if(val instanceof String)
  241. infos.put(field.getName(), (String)val);
  242. else if(val instanceof Integer)
  243. infos.put(field.getName(), (Integer)val);
  244. else if(val instanceof Float)
  245. infos.put(field.getName(), (Float)val);
  246. else if(val instanceof Double)
  247. infos.put(field.getName(), (Double)val);
  248. else if(val instanceof List)
  249. infos.putArray(field.getName()).addAll(listToNode((List)val));
  250. else if(val instanceof Map)
  251. infos.putObject(field.getName()).setAll(mapToNode((Map)val));
  252. }
  253. }
  254. }
  255. }
  256. private ObjectNode getInfos(AdmObject obj) {
  257. ObjectNode objectNode = obj.getInfos();
  258. if(objectNode == null){
  259. ObjectMapper objectMapper = SpringHelper.getBean(ObjectMapper.class);
  260. objectNode = objectMapper.createObjectNode();
  261. obj.setInfos(objectNode);
  262. }
  263. return objectNode;
  264. }
  265. private ObjectNode mapToNode(Map<String, Object> map){
  266. ObjectMapper objectMapper = SpringHelper.getBean(ObjectMapper.class);
  267. try {
  268. String json = objectMapper.writeValueAsString(map);
  269. return objectMapper.readValue(json, ObjectNode.class);
  270. } catch (IOException e) {
  271. throw new BusinessException(ResponseCode.A0427.getCode(), ResponseCode.A0427.getDesc());
  272. }
  273. }
  274. private ArrayNode listToNode(List<Object> list){
  275. ObjectMapper objectMapper = SpringHelper.getBean(ObjectMapper.class);
  276. try {
  277. String json = objectMapper.writeValueAsString(list);
  278. return objectMapper.readValue(json, ArrayNode.class);
  279. } catch (IOException e) {
  280. throw new BusinessException(ResponseCode.A0427.getCode(), ResponseCode.A0427.getDesc());
  281. }
  282. }
  283. interface SetDataAction {
  284. void setData(AdmObject obj, OBase oldAdmEntity);
  285. }
  286. /**
  287. * 创建/合并任务空间数据
  288. */
  289. @Override
  290. @Transactional(rollbackFor = Exception.class)
  291. public void handleJobSpace(String projectId){
  292. QueryWrapper<AdmObject> queryWrapper = new QueryWrapper<>();
  293. queryWrapper.eq("project_id", projectId).eq("obj_type", AdmConst.OBJ_TYPE_SPACE).eq("valid", ValidEnum.TRUE.getType()).orderByAsc("floor_id");
  294. List<AdmObject> spaceList = objectMapper.selectList(queryWrapper);
  295. QueryWrapper<AdmJobSpace> wrapper = new QueryWrapper<>();
  296. wrapper.eq("project_id", projectId).eq("valid", ValidEnum.TRUE.getType());
  297. List<AdmJobSpace> jobSpaceList = jobSpaceMapper.selectList(wrapper);
  298. //空间按层分组,优先使用OtherZone,缺省GeneralZone
  299. LinkedHashMap<String, List<AdmObject>> map = new LinkedHashMap<>();
  300. String floorId = null;
  301. List<AdmObject> generalList = null;
  302. List<AdmObject> otherList = null;
  303. for(AdmObject sp : spaceList){
  304. if(floorId == null || !floorId.equals(sp.getFloorId())) {
  305. if(floorId != null)
  306. map.put(floorId, otherList.size() > 0 ? otherList : generalList);
  307. floorId = sp.getFloorId();
  308. generalList = new ArrayList<>();
  309. otherList = new ArrayList<>();
  310. }
  311. String zone = sp.getClassCode();
  312. if("GeneralZone".equals(zone))
  313. generalList.add(sp);
  314. else if("OtherZone".equals(zone))
  315. otherList.add(sp);
  316. }
  317. if(floorId != null)
  318. map.put(floorId, otherList.size() > 0 ? otherList : generalList);
  319. List<AdmJobSpace> toCreate = new ArrayList<>();
  320. List<AdmJobSpace> toModify = new ArrayList<>();
  321. String time = DateUtil.format(new Date(), DatePattern.PURE_DATETIME_PATTERN);
  322. //按楼层进行空间匹配操作
  323. for (Map.Entry<String, List<AdmObject>> entry : map.entrySet()) {
  324. floorId = entry.getKey();
  325. HashMap<String, AdmJobSpace> jobMap = new HashMap<>();
  326. for (int i = 0; i < jobSpaceList.size(); i++) {
  327. AdmJobSpace jobSpace = jobSpaceList.get(i);
  328. if(jobSpace.getFloorId().equals(floorId)){
  329. jobMap.put(jobSpace.getSpaceId(), jobSpace);
  330. jobSpaceList.remove(i);
  331. i--;
  332. }
  333. }
  334. List<AdmObject> sps = entry.getValue();
  335. for(AdmObject sp : sps){
  336. ArrayNode spOutline = (ArrayNode) sp.getInfo("outline");
  337. AdmJobSpace job = jobMap.remove(sp.getId());
  338. if(job != null) {
  339. //id匹配,轮廓变化的空间,重置任务状态
  340. if(!outlineMatch(job.getOutline(), spOutline)){
  341. job.setArchState(AdmConst.JOB_STATE_PROCESSING);
  342. job.setEquipState(AdmConst.JOB_STATE_PROCESSING);
  343. job.setOutline(spOutline);
  344. toModify.add(job);
  345. } // else id和轮廓都匹配,不做处理
  346. } else {
  347. //id未匹配,轮廓完全一致的任务空间,重新设置spaceId
  348. job = matchByOutline(jobMap, sp);
  349. if(job != null) {
  350. job.setSpaceId(sp.getId());
  351. toModify.add(job);
  352. }
  353. }
  354. if (job == null) {
  355. job = new AdmJobSpace();
  356. job.setId(IdUtil.fastUUID());
  357. job.setSpaceId(sp.getId());
  358. job.setOutline((ArrayNode) sp.getInfo("outline"));
  359. job.setArchState(AdmConst.JOB_STATE_PROCESSING);
  360. job.setEquipState(AdmConst.JOB_STATE_PROCESSING);
  361. job.setProjectId(projectId);
  362. job.setBuildingId(sp.getBuildingId());
  363. job.setFloorId(sp.getFloorId());
  364. job.setCreationTime(time);
  365. job.setCreator(AdmConst.CREATOR_SYNC);
  366. job.setValid(ValidEnum.TRUE.getType());
  367. toCreate.add(job);
  368. }
  369. }
  370. //楼层中未找到匹配关系的任务空间
  371. for(AdmJobSpace job : jobMap.values()){
  372. job.setValid(ValidEnum.FALSE.getType());
  373. toModify.add(job);
  374. }
  375. }
  376. //项目下未找到匹配关系的任务空间
  377. for(AdmJobSpace job : jobSpaceList){
  378. job.setValid(ValidEnum.FALSE.getType());
  379. toModify.add(job);
  380. }
  381. for(AdmJobSpace job : toCreate) {
  382. jobSpaceMapper.insert(job);
  383. }
  384. for(AdmJobSpace job : toModify) {
  385. job.setModifiedTime(time);
  386. job.setModifier(AdmConst.CREATOR_SYNC);
  387. job.setUploadFlag(null);
  388. jobSpaceMapper.updateById(job);
  389. }
  390. }
  391. private AdmJobSpace matchByOutline(HashMap<String, AdmJobSpace> jobMap, AdmObject space){
  392. if(jobMap.size() == 0)
  393. return null;
  394. ArrayNode o1 = (ArrayNode) space.getInfo("outline");
  395. if(!isValidOutline(o1))
  396. return null;
  397. Polygon[] ps = GeomUtil.getPolygon(o1);
  398. Map.Entry<String, AdmJobSpace> target = null;
  399. for(Map.Entry<String, AdmJobSpace> entry : jobMap.entrySet()){
  400. ArrayNode o2 = entry.getValue().getOutline();
  401. if(isValidOutline(o2) && polygonsMatch(ps, GeomUtil.getPolygon(o2))){
  402. target = entry;
  403. break;
  404. }
  405. }
  406. if(target != null){
  407. jobMap.remove(target.getKey());
  408. return target.getValue();
  409. }
  410. return null;
  411. }
  412. /**
  413. * 判断空间轮廓是否变化
  414. * TODO 区分覆盖等情况
  415. */
  416. private boolean outlineMatch(ArrayNode o1, ArrayNode o2){
  417. return polygonsMatch(GeomUtil.getPolygon(o1), GeomUtil.getPolygon(o2));
  418. }
  419. /**
  420. * 轮廓匹配判断
  421. * TODO 暂不考虑顺序
  422. */
  423. private boolean polygonsMatch(Polygon[] ps1, Polygon[] ps2){
  424. if (ps1.length == ps2.length) {
  425. for (int i = 0; i < ps2.length; i++) {
  426. if (!ps1[i].equalsExact(ps2[i]))
  427. return false;
  428. }
  429. return true;
  430. }
  431. return false;
  432. }
  433. private boolean isValidOutline(ArrayNode outline) {
  434. if(outline != null && outline.size() > 0 && outline.get(0).isArray()) {
  435. ArrayNode o1 = (ArrayNode) outline.get(0);
  436. if (o1.size() > 0 && o1.get(0).isArray()) {
  437. ArrayNode o2 = (ArrayNode) o1.get(0);
  438. return o2.size() >= 3;
  439. }
  440. }
  441. return false;
  442. }
  443. @Autowired
  444. private OldAdmClient oldAdmClient;
  445. /**
  446. * 把地图文件从image-service转存到文件服务
  447. */
  448. @Override
  449. @Transactional(rollbackFor = Exception.class)
  450. public void uploadFloorMap(String groupCode, String projectId) {
  451. List<AdmObject> floors = objectService.queryM2dByObjType(projectId, AdmConst.OBJ_TYPE_FLOOR);
  452. List<AdmObject> modifiedFloors = new ArrayList<>();
  453. for(AdmObject floor : floors) {
  454. ObjectNode infos = floor.getInfos();
  455. if(infos != null) {
  456. JsonNode mapNode = infos.get("floorMap");
  457. JsonNode mapIdNode = infos.get("floorMapId");
  458. if(mapNode != null){
  459. String map = mapNode.asText();
  460. String mapId = mapIdNode != null ? mapIdNode.asText() : null;
  461. if(mapId != null) {
  462. FileInfo fileInfo = FileClientFacade.load(mapId);
  463. if(fileInfo != null && fileInfo.getFileName().equals(map))
  464. continue; //文件无变化
  465. //删除之前的地图文件
  466. FileStorageHelper.deleteFile(mapId);
  467. }
  468. try {
  469. Response serviceResponse = oldAdmClient.getFloorMap(map, "revit");
  470. Response.Body body = serviceResponse.body();
  471. InputStream inputStream = body.asInputStream();
  472. FileInfo fileInfo = FileInfoCreator.of(groupCode, projectId, AdmConst.APP_ID, map);
  473. String fileId = FileStorageHelper.uploadFile(fileInfo, inputStream);
  474. infos.put("floorMapId", fileId);
  475. modifiedFloors.add(floor);
  476. } catch (Exception e) {
  477. e.printStackTrace();
  478. }
  479. }
  480. }
  481. }
  482. objectService.update(modifiedFloors);
  483. }
  484. }