AdmSpaceServiceImpl.java 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714
  1. package com.persagy.proxy.object.service.impl;
  2. import java.util.ArrayList;
  3. import java.util.Collection;
  4. import java.util.HashMap;
  5. import java.util.HashSet;
  6. import java.util.List;
  7. import java.util.Map;
  8. import java.util.Set;
  9. import java.util.stream.Collectors;
  10. import javax.servlet.http.HttpServletRequest;
  11. import org.springframework.beans.factory.annotation.Autowired;
  12. import org.springframework.stereotype.Service;
  13. import com.alibaba.fastjson.JSONArray;
  14. import com.alibaba.fastjson.JSONObject;
  15. import com.fasterxml.jackson.core.JsonProcessingException;
  16. import com.fasterxml.jackson.databind.ObjectMapper;
  17. import com.fasterxml.jackson.databind.node.ArrayNode;
  18. import com.fasterxml.jackson.databind.node.JsonNodeFactory;
  19. import com.fasterxml.jackson.databind.node.ObjectNode;
  20. import com.google.common.collect.Sets;
  21. import com.persagy.dmp.basic.model.QueryCriteria;
  22. import com.persagy.dmp.common.context.AppContext;
  23. import com.persagy.dmp.common.helper.SpringHelper;
  24. import com.persagy.dmp.common.model.entity.BaseEntity;
  25. import com.persagy.dmp.common.model.response.CommonResult;
  26. import com.persagy.dmp.define.entity.ObjectTypeDefine;
  27. import com.persagy.dmp.digital.client.DigitalObjectFacade;
  28. import com.persagy.dmp.digital.entity.ObjectRelation;
  29. import com.persagy.dmp.simple.client.DigitalObjectSimpleFacade;
  30. import com.persagy.proxy.adm.constant.AdmCommonConstant;
  31. import com.persagy.proxy.adm.constant.GraphCodeEnum;
  32. import com.persagy.proxy.adm.constant.RelCodeEnum;
  33. import com.persagy.proxy.adm.request.AdmDCSQueryRequest;
  34. import com.persagy.proxy.adm.request.AdmQueryCriteria;
  35. import com.persagy.proxy.adm.request.AdmResponse;
  36. import com.persagy.proxy.adm.service.IAdmRelationService;
  37. import com.persagy.proxy.adm.service.impl.AbstractAdmBaseServiceImpl;
  38. import com.persagy.proxy.adm.utils.AdmContextUtil;
  39. import com.persagy.proxy.common.client.DmpRwdClient;
  40. import com.persagy.proxy.common.entity.DmpResult;
  41. import com.persagy.proxy.common.entity.InstanceUrlParam;
  42. import com.persagy.proxy.common.entity.RelationDTO;
  43. import com.persagy.proxy.object.model.AdmEquipment;
  44. import com.persagy.proxy.object.model.AdmSpace;
  45. import com.persagy.proxy.object.model.AdmSystem;
  46. import com.persagy.proxy.object.service.IAdmEquipmentService;
  47. import com.persagy.proxy.object.service.IAdmSpaceService;
  48. import com.persagy.proxy.object.service.IAdmSystemService;
  49. import cn.hutool.core.collection.CollUtil;
  50. import cn.hutool.core.util.StrUtil;
  51. import cn.hutool.json.JSONUtil;
  52. import lombok.extern.slf4j.Slf4j;
  53. /**
  54. * ADM 空间 实现类
  55. * @author lvxy
  56. * @date 2021/8/18
  57. */
  58. @Slf4j
  59. @Service
  60. public class AdmSpaceServiceImpl extends AbstractAdmBaseServiceImpl<AdmSpace> implements IAdmSpaceService {
  61. @Autowired
  62. private DmpRwdClient rwdClient;
  63. @Autowired
  64. private ObjectMapper objectMapper;
  65. @Autowired
  66. private IAdmRelationService relationService;
  67. @Autowired
  68. private IAdmEquipmentService equipmentService;
  69. @Autowired
  70. private IAdmSystemService systemService;
  71. @Override
  72. public AdmResponse doQuery(InstanceUrlParam context, AdmQueryCriteria request, Class<AdmSpace> clazz) {
  73. AdmResponse response = super.doQuery(context, request, clazz);
  74. // 系统需要补充分类名称属性
  75. ensureSpecialValues(context, (List<AdmSpace>) response.getContent());
  76. return response;
  77. }
  78. @Override
  79. public List<AdmSpace> doInsertExt(InstanceUrlParam context, Class<AdmSpace> clazz, List<AdmSpace> voList) {
  80. Map<String, List<AdmSpace>> spaceMapByFlId = voList.stream().collect(Collectors.groupingBy(AdmSpace::getFloorId));
  81. //查询空间中floorId 对应的floor
  82. List<ObjectNode> floors = queryFloorsByFloorIds(context, spaceMapByFlId.keySet());
  83. if(CollUtil.isNotEmpty(floors)){
  84. //ArrayList<AdmFloor> floorList = CollUtil.newArrayList(JSONUtil.toList(floors.getData().toString(),AdmFloor.class));
  85. //space.height = floor.infos.height
  86. voList = processHeight(spaceMapByFlId, floors);
  87. }
  88. //插入空间
  89. List<AdmSpace> vosR = doInsert(context, clazz, voList);
  90. //添加绑定关系
  91. processRelations(vosR);
  92. //处理关系标记
  93. //TODO 处理关系标记
  94. //processRelationType();
  95. return vosR;
  96. }
  97. @Override
  98. public AdmResponse doQueryType(InstanceUrlParam context, AdmDCSQueryRequest request) {
  99. //查询定义类型
  100. ObjectNode criteriaEq = JsonNodeFactory.instance.objectNode();
  101. criteriaEq.put("parentCode", "space");
  102. DmpResult<JSONArray> resultDef = queryDefineType(context, criteriaEq);
  103. List<JSONObject> defineList = null;
  104. if(resultDef.getResult().equals(DmpResult.SUCCESS)){
  105. defineList = JSONUtil.toList(resultDef.getData().toString(), JSONObject.class);
  106. //获取实际空间对象的数量
  107. //根据classCode floorId 查询查询实际存在的空间
  108. assembleDefineTypes(context, defineList, request.getFloorId());
  109. // 设置返回值
  110. AdmResponse response = AdmResponse.success(defineList);
  111. Long total = resultDef.getCount() == null ? null : resultDef.getCount().longValue();
  112. response.setTotal(total);
  113. return response;
  114. }else{
  115. return null;
  116. }
  117. }
  118. @Override
  119. public AdmResponse doQuerySpaces(InstanceUrlParam context, AdmDCSQueryRequest request) {
  120. request.setName(AdmSpace.OBJ_TYPE);
  121. String classCodeFilter = "";
  122. if(StrUtil.isNotEmpty(request.getZoneType())){
  123. classCodeFilter = " classCode = '"+request.getZoneType()+"'";
  124. }else{
  125. classCodeFilter = " classCode in ['"+ String.join("', '",request.getZoneTypeList()) + "']";
  126. }
  127. String filters = request.getFilters();
  128. if(StrUtil.isBlank(filters)){
  129. request.setFilters(classCodeFilter);
  130. }else{
  131. request.setFilters(filters+"; "+classCodeFilter);
  132. }
  133. if(StrUtil.isNotEmpty(request.getBuildingId()) && StrUtil.isNotEmpty(request.getFloorId()) && !request.getFloorId().equals("isnull")){
  134. //明确建筑,明确楼层
  135. ObjectNode relationTo = JsonNodeFactory.instance.objectNode();
  136. relationTo.put("relCode", "Fl2Sp");
  137. relationTo.put("graphCode", "ArchSubset");
  138. relationTo.put("objFrom", request.getFloorId());
  139. request.setRelationTo(relationTo);
  140. }else if(StrUtil.isNotEmpty(request.getBuildingId()) && StrUtil.isNotEmpty(request.getFloorId()) && request.getFloorId().equals("isnull")){
  141. //明确建筑,不明确楼层
  142. //查询建筑下的楼层
  143. QueryCriteria queryCriteriaRelation = new QueryCriteria();
  144. ObjectNode criteria = JsonNodeFactory.instance.objectNode();
  145. criteria.put("relCode", "Bd2Fl");
  146. criteria.put("graphCode", "ArchSubset");
  147. criteria.put("objFrom", request.getBuildingId());
  148. queryCriteriaRelation.setCriteria(criteria);
  149. List<ObjectRelation> relations = relationService.queryByCondition(AdmContextUtil.toDmpContext(), queryCriteriaRelation);
  150. if(CollUtil.isNotEmpty(relations)){
  151. Map<String, ObjectRelation> objectRelationMap = CollUtil.fieldValueMap(relations, "objTo");
  152. //查询 建筑 不在楼层下 的空间
  153. //1 查询楼层下的空间 spaceIdList
  154. ObjectNode relationTo = JsonNodeFactory.instance.objectNode();
  155. relationTo.put("relCode", "Fl2Sp");
  156. relationTo.put("graphCode", "ArchSubset");
  157. ArrayNode arrayNode = relationTo.putObject("objFrom").putArray("$in");
  158. objectRelationMap.keySet().stream().forEach(floorId -> arrayNode.add(floorId));
  159. request.setRelationTo(relationTo);
  160. AdmResponse spaceFl = doQuery(AdmContextUtil.toDmpContext(), request, AdmSpace.class);
  161. request.setRelationTo(null);
  162. //2 查询建筑下的空间 and space not in spaceIdList
  163. if(CollUtil.isNotEmpty(spaceFl.getContent())){
  164. List<AdmSpace> admSpaceList = (List<AdmSpace>) spaceFl.getContent();
  165. Map<String, AdmSpace> admSpaceMap = CollUtil.fieldValueMap(admSpaceList, BaseEntity.PROP_ID);
  166. String ids = request.getFilters() +"; not id in ['"+ String.join("', '", admSpaceMap.keySet())+"']";
  167. request.setFilters(ids);
  168. }
  169. request.setFilters(request.getFilters() + "; buildingId = '"+request.getBuildingId()+"'");
  170. }else{
  171. //查询建筑下的空间
  172. ObjectNode relationTo = JsonNodeFactory.instance.objectNode();
  173. relationTo.put("relCode", "Bd2Sp");
  174. relationTo.put("graphCode", "ArchSubset");
  175. relationTo.put("objFrom", request.getBuildingId());
  176. request.setRelationTo(relationTo);
  177. }
  178. }else if(StrUtil.isNotEmpty(request.getBuildingId()) && StrUtil.isEmpty(request.getFloorId()) && !request.getBuildingId().equals("isnull")){
  179. //查询建筑下的空间
  180. ObjectNode relationTo = JsonNodeFactory.instance.objectNode();
  181. relationTo.put("relCode", "Bd2Sp");
  182. relationTo.put("graphCode", "ArchSubset");
  183. relationTo.put("objFrom", request.getBuildingId());
  184. request.setRelationTo(relationTo);
  185. }else if(StrUtil.isNotEmpty(request.getBuildingId()) && StrUtil.isEmpty(request.getFloorId()) && request.getBuildingId().equals("isnull")){
  186. //未明确建筑下的空间
  187. //查询建筑下的空间
  188. ObjectNode relationTo = JsonNodeFactory.instance.objectNode();
  189. relationTo.put("relCode", "Bd2Sp");
  190. relationTo.put("graphCode", "ArchSubset");
  191. relationTo.put("$bindFlag", false);
  192. request.setRelationTo(relationTo);
  193. }else if(StrUtil.isEmpty(request.getBuildingId()) && StrUtil.isEmpty(request.getFloorId())){
  194. }
  195. AdmResponse response = query(request);
  196. //空间需要补充分类名称属性
  197. ensureSpecialValues(context, (List<AdmSpace>) response.getContent());
  198. return response;
  199. }
  200. @Override
  201. public void ensureSpecialValues(InstanceUrlParam context, List<AdmSpace> vos) {
  202. if(CollUtil.isEmpty(vos)) {
  203. return;
  204. }
  205. // 1. 收集空间的设备对象,扩展设备对象赋值
  206. List<AdmEquipment> equipmentList = new ArrayList<>();
  207. for(AdmSpace vo:vos) {
  208. // 收集设备对象
  209. if(CollUtil.isEmpty(vo.getEquipment()) && CollUtil.isEmpty(vo.getEquipmentFor())) {
  210. continue;
  211. }
  212. if(CollUtil.isNotEmpty(vo.getEquipment())) {
  213. equipmentList.addAll(vo.getEquipment());
  214. }
  215. if(CollUtil.isNotEmpty(vo.getEquipmentFor())) {
  216. equipmentList.addAll(vo.getEquipmentFor());
  217. }
  218. }
  219. // 对象扩展属性赋值
  220. equipmentService.ensureSpecialValues(context, equipmentList);
  221. //2.收集空间的系统 扩展系统、及系统下设备对象赋值
  222. List<AdmSystem> admSystemList = new ArrayList<>();
  223. for(AdmSpace vo:vos) {
  224. // 收集设备对象
  225. if(CollUtil.isEmpty(vo.getGeneralSystem())) {
  226. continue;
  227. }
  228. admSystemList.addAll(vo.getGeneralSystem());
  229. }
  230. // 对象扩展属性赋值
  231. systemService.ensureSpecialValues(context, admSystemList);
  232. }
  233. @Override
  234. public List<AdmSpace> querySpaceInShaft(InstanceUrlParam context, String shaftId, String spaceType) {
  235. AdmQueryCriteria request = new AdmQueryCriteria();
  236. request.setName(AdmSpace.OBJ_TYPE);
  237. request.resetRelationCond(false, "ArchSubset", "Sh2Sp", spaceType, shaftId, true);
  238. AdmResponse rs = query(request);
  239. return (List<AdmSpace>) rs.getContent();
  240. }
  241. @Override
  242. public List<AdmSpace> querySpaceInBuilding(InstanceUrlParam context, String buildingId, String spaceType) {
  243. AdmQueryCriteria request = new AdmQueryCriteria();
  244. request.setName(AdmSpace.OBJ_TYPE);
  245. request.resetRelationCond(false, "ArchSubset", "Bd2Sp", spaceType, buildingId, true);
  246. AdmResponse rs = query(request);
  247. return (List<AdmSpace>) rs.getContent();
  248. }
  249. @Override
  250. public Map<String, List<String>> querySpaceMapInFloors(InstanceUrlParam context, List<String> floorIds, String spaceType) {
  251. QueryCriteria queryRequest = new QueryCriteria();
  252. ObjectNode criteriaRel = JsonNodeFactory.instance.objectNode();
  253. criteriaRel.put("graphCode", "ArchSubset");
  254. criteriaRel.put("relCode", "Fl2Sp");
  255. criteriaRel.put("relValue", spaceType);
  256. ArrayNode objNode = criteriaRel.putArray("objFrom");
  257. floorIds.forEach(floorId -> objNode.add(floorId));
  258. queryRequest.setCriteria(criteriaRel);
  259. List<ObjectRelation> relations = relationService.queryByCondition(context, queryRequest);
  260. if(CollUtil.isEmpty(relations)) {
  261. return null;
  262. }
  263. return relations.stream().collect(Collectors.groupingBy(ObjectRelation::getObjFrom,
  264. Collectors.mapping(ObjectRelation::getObjTo, Collectors.toList())));
  265. }
  266. @Override
  267. public Map<String, Set<String>> queryTrafficSpaceMap(InstanceUrlParam context, Iterable<String> spaceIds, String spaceType) {
  268. Map<String, Set<String>> result = new HashMap<>();
  269. loadTrafficSpace(context, spaceIds, spaceType, true, result);
  270. loadTrafficSpace(context, spaceIds, spaceType, false, result);
  271. return result;
  272. }
  273. /***
  274. * Description: 查询多建筑楼层下的空间id
  275. * @param request : 请求参数
  276. * @return : java.util.Set<java.lang.String>
  277. * @author : lijie
  278. * @date :2021/10/28 17:56
  279. * Update By lijie 2021/10/28 17:56
  280. */
  281. @Override
  282. public Set<String> queryMultiBuildingOrFloorSpaceIds(HttpServletRequest request) {
  283. String groupCode = AppContext.getContext().getGroupCode();
  284. String projectId = AppContext.getContext().getProjectId();
  285. // 1.查询楼层下的空间的关系统计数据
  286. CommonResult<List<ObjectRelation>> floorCountByObjIds = DigitalObjectSimpleFacade
  287. .queryRelationCountByObjIds(groupCode, projectId, AdmCommonConstant.APP_ID, AdmCommonConstant.USER_ID,
  288. getMultiBuildingOrFloorQueryWrapper(request,RelCodeEnum.Fl2Sp.name()));
  289. List<ObjectRelation> floorSpaceData = floorCountByObjIds.getData();
  290. // 2.查询建筑下的空间的关系统计数据
  291. CommonResult<List<ObjectRelation>> buildingCountByObjIds = DigitalObjectSimpleFacade
  292. .queryRelationCountByObjIds(groupCode, projectId, AdmCommonConstant.APP_ID, AdmCommonConstant.USER_ID,
  293. getMultiBuildingOrFloorQueryWrapper(request, RelCodeEnum.Bd2Sp.name()));
  294. List<ObjectRelation> buildingSpaceData = buildingCountByObjIds.getData();
  295. Set<String> spaceIds = CollUtil.newHashSet(CollUtil.isNotEmpty(floorSpaceData), floorSpaceData
  296. .stream().filter(objectRelation -> objectRelation.getCount()>1)
  297. .map(ObjectRelation::getObjTo).collect(Collectors.toSet()));
  298. spaceIds.addAll(CollUtil.newHashSet(CollUtil.isNotEmpty(buildingSpaceData),
  299. buildingSpaceData.stream().filter(objectRelation -> objectRelation.getCount()>1)
  300. .map(ObjectRelation::getObjTo).collect(Collectors.toSet())));
  301. return spaceIds;
  302. }
  303. /***
  304. * Description: 查询多建筑楼层下的空间列表
  305. * @param request : 请求参数
  306. * @return : java.util.Set<java.lang.String>
  307. * @author : lijie
  308. * @date :2021/10/28 17:56
  309. * Update By lijie 2021/10/28 17:56
  310. */
  311. @Override
  312. public AdmResponse queryMultiBuildingOrFloorSpaces(HttpServletRequest request) {
  313. // 1.查询多建筑楼层下的空间id列表
  314. Set<String> spaceIds = queryMultiBuildingOrFloorSpaceIds(request);
  315. AdmQueryCriteria spaceCriteria = new AdmQueryCriteria();
  316. String filters = " id in ['"+ String.join("', '", spaceIds) +"'] ";
  317. spaceCriteria.setFilters(filters);
  318. AdmQueryCriteria floorCriteria = new AdmQueryCriteria();
  319. floorCriteria.setName("floorList");
  320. AdmQueryCriteria buildingCriteria = new AdmQueryCriteria();
  321. buildingCriteria.setName("building");
  322. floorCriteria.setCascade(CollUtil.newArrayList(buildingCriteria));
  323. spaceCriteria.setCascade(CollUtil.newArrayList(floorCriteria));
  324. return super.doQuery(AdmContextUtil.toDmpContext(), spaceCriteria, AdmSpace.class);
  325. }
  326. /***
  327. * Description: 根据查询条件查询空间统计数据
  328. * @param request : 请求参数
  329. * @return : com.persagy.proxy.adm.request.AdmResponse
  330. * @author : lijie
  331. * @date :2021/10/28 21:07
  332. * Update By lijie 2021/10/28 21:07
  333. */
  334. @Override
  335. public AdmResponse query(AdmQueryCriteria request) {
  336. InstanceUrlParam context = AdmContextUtil.toDmpContext();
  337. AdmResponse response = super.doQuery(context, request, AdmSpace.class);
  338. // 系统需要补充分类名称属性
  339. ensureSpecialValues(context, (List<AdmSpace>) response.getContent());
  340. return response;
  341. }
  342. /***
  343. * Description: 子类重写,以便处理带buildingId
  344. * @param dmpRequest : 中台查询参数
  345. * @return : void
  346. * @author : lijie
  347. * @date :2021/10/28 20:25
  348. * Update By lijie 2021/10/28 20:25
  349. */
  350. @Override
  351. protected void processDmpCriteria(QueryCriteria dmpRequest) {
  352. ObjectNode criteria = dmpRequest.getCriteria();
  353. if (null==criteria){
  354. return;
  355. }
  356. ObjectMapper objectMapper = SpringHelper.getBean(ObjectMapper.class);
  357. if (criteria.has("not id")) {
  358. ObjectNode objectNode = objectMapper.createObjectNode();
  359. objectNode.putPOJO("$not in", criteria.get("not id"));
  360. criteria.putPOJO("id", objectNode);
  361. criteria.remove("not id");
  362. }
  363. if (criteria.has("floorId")){
  364. // 有建筑id过滤
  365. ObjectNode relationTo = objectMapper.createObjectNode();
  366. relationTo.put("graphCode", GraphCodeEnum.ArchSubset.name());
  367. relationTo.put("relCode", RelCodeEnum.Fl2Sp.name());
  368. relationTo.set("objFrom",criteria.get("floorId"));
  369. criteria.set("relationTo",relationTo);
  370. criteria.remove("floorId");
  371. if (criteria.has("buildingId"))
  372. criteria.remove("buildingId");
  373. return;
  374. }
  375. if (criteria.has("buildingId")){
  376. // 有建筑id过滤
  377. ObjectNode relationTo = objectMapper.createObjectNode();
  378. relationTo.put("graphCode", GraphCodeEnum.ArchSubset.name());
  379. relationTo.put("relCode", RelCodeEnum.Bd2Sp.name());
  380. relationTo.set("objFrom",criteria.get("buildingId"));
  381. criteria.set("relationTo",relationTo);
  382. criteria.remove("buildingId");
  383. }
  384. }
  385. /***
  386. * Description: 获得多建筑楼层下的空间的查询条件
  387. * @param request : 请求参数
  388. * @param relCode : 边类型
  389. * @return : com.fasterxml.jackson.databind.node.ObjectNode
  390. * @author : lijie
  391. * @date :2021/10/28 17:55
  392. * Update By lijie 2021/10/28 17:55
  393. */
  394. private ObjectNode getMultiBuildingOrFloorQueryWrapper(HttpServletRequest request,String relCode) {
  395. ObjectMapper objectMapper = SpringHelper.getBean(ObjectMapper.class);
  396. ObjectNode objectNode = objectMapper.createObjectNode();
  397. if (StrUtil.isNotBlank(AppContext.getContext().getProjectId())){
  398. objectNode.putPOJO("projectIds", Sets.newHashSet(AppContext.getContext().getProjectId()));
  399. }
  400. objectNode.putPOJO("graphCodes", Sets.newHashSet(GraphCodeEnum.ArchSubset.name()));
  401. objectNode.putPOJO("relCodes", Sets.newHashSet(relCode));
  402. objectNode.putPOJO("groups", Sets.newHashSet("objTo"));
  403. return objectNode;
  404. }
  405. /**
  406. * 装载交通关系
  407. * @param context
  408. * @param spaceIds
  409. * @param spaceType
  410. * @param isFrom
  411. * @param result
  412. */
  413. private void loadTrafficSpace(InstanceUrlParam context, Iterable<String> spaceIds, String spaceType, boolean isFrom, Map<String, Set<String>> result) {
  414. // 关系查询条件
  415. QueryCriteria queryRequest = new QueryCriteria();
  416. ObjectNode criteriaRel = JsonNodeFactory.instance.objectNode();
  417. criteriaRel.put("graphCode", "TrafficNetwork");
  418. criteriaRel.put("relValue", spaceType);
  419. ArrayNode objNode = criteriaRel.putArray(isFrom?"objFrom":"objTo");
  420. spaceIds.forEach(spaceId -> objNode.add(spaceId));
  421. queryRequest.setCriteria(criteriaRel);
  422. List<ObjectRelation> relations = relationService.queryByCondition(context, queryRequest);
  423. if(CollUtil.isEmpty(relations)) {
  424. return;
  425. }
  426. // 存入Map
  427. for(ObjectRelation relation:relations) {
  428. String key = isFrom ? relation.getObjFrom() : relation.getObjTo();
  429. String value = isFrom ? relation.getObjTo() : relation.getObjFrom();
  430. Set<String> valueList = result.get(key);
  431. if(CollUtil.isEmpty(valueList)) {
  432. valueList = new HashSet<>();
  433. result.put(key, valueList);
  434. }
  435. valueList.add(value);
  436. }
  437. }
  438. /**
  439. * 空间的类型是根据项目自定义的
  440. * 参见中心
  441. * @Select("SELECT s.object_type as type,d.name FROM zone_space_base s
  442. * LEFT JOIN dict.dict_space_project d ON s.object_type = d.id WHERE s.project_id = #{projectId} AND d.project_id = #{projectId}
  443. * GROUP BY object_type, d.name")
  444. * @param context
  445. * @return
  446. */
  447. @Override
  448. public List<JSONObject> doQuerySpaceTypes(InstanceUrlParam context) {
  449. //根据项目id查询空间类型
  450. Map<String, String> codeNameMap = queryProjectDefineType(context);
  451. if(CollUtil.isNotEmpty(codeNameMap)){
  452. //查询object
  453. JSONArray demObjs = queryAndDealObjs(context, codeNameMap.keySet());
  454. if(CollUtil.isNotEmpty(demObjs)){
  455. List<AdmSpace> spaceList = JSONArray.parseArray(JSONUtil.toJsonStr(demObjs), AdmSpace.class);
  456. Set<String> classCodes = spaceList.stream().map(space -> space.getClassCode()).collect(Collectors.toSet());
  457. if(CollUtil.isNotEmpty(classCodes)){
  458. codeNameMap.keySet().removeIf(code -> !classCodes.contains(code));
  459. }
  460. }
  461. }
  462. if(CollUtil.isNotEmpty(codeNameMap)){
  463. List<JSONObject> list = new ArrayList<>(codeNameMap.size());
  464. codeNameMap.keySet().stream().forEach(code ->{
  465. JSONObject jsonObject = new JSONObject();
  466. jsonObject.put("name",codeNameMap.get(code));
  467. jsonObject.put("code",code);
  468. list.add(jsonObject);
  469. });
  470. return list;
  471. }else{
  472. return null;
  473. }
  474. }
  475. private List<ObjectNode> queryObject(InstanceUrlParam context, QueryCriteria criteriaObject){
  476. JSONObject paraPe = null;
  477. String groupCode = AppContext.getContext().getGroupCode();
  478. String projectId = AppContext.getContext().getProjectId();
  479. List<ObjectNode> query = DigitalObjectFacade.query(groupCode, projectId, AdmCommonConstant.APP_ID, AdmCommonConstant.USER_ID, criteriaObject);
  480. return query;
  481. }
  482. private DmpResult<JSONArray> queryObj(InstanceUrlParam context, QueryCriteria criteriaObject){
  483. JSONObject paraPe = null;
  484. try {
  485. String paraStr = objectMapper.writeValueAsString(criteriaObject);
  486. paraPe = JSONObject.parseObject(paraStr);
  487. } catch (JsonProcessingException e) {
  488. throw new RuntimeException("转换查询条件出错:" + e.getMessage());
  489. }
  490. return rwdClient.queryObject(context, paraPe);
  491. }
  492. private QueryCriteria ensureQueryCommParm(QueryCriteria dmpRequest, InstanceUrlParam context, Collection<String> classCodes, String objType){
  493. ObjectNode criteriaEq = null;
  494. if(JSONUtil.isNull(dmpRequest.getCriteria())){
  495. criteriaEq = JsonNodeFactory.instance.objectNode();
  496. }else{
  497. criteriaEq = dmpRequest.getCriteria();
  498. }
  499. if(CollUtil.isNotEmpty(classCodes)){
  500. ArrayNode array = criteriaEq.putObject("classCode").putArray("$in");
  501. classCodes.forEach(code -> array.add(code));
  502. }
  503. criteriaEq.put("objType", objType);
  504. dmpRequest.setCriteria(criteriaEq);
  505. return dmpRequest;
  506. }
  507. private JSONArray queryAndDealObjs(InstanceUrlParam context, Set<String> codes){
  508. QueryCriteria criteriaObject = ensureQueryCommParm(new QueryCriteria(), context, codes,AdmSpace.OBJ_TYPE);
  509. criteriaObject.setSize(50L);
  510. DmpResult<JSONArray> dmpResult = queryObj(context, criteriaObject);
  511. if(CollUtil.isEmpty(dmpResult.getData())){
  512. return null;
  513. }
  514. JSONArray demObjs = dmpResult.getData();
  515. if(dmpResult.getCount() > criteriaObject.getSize()){
  516. for(int page = 2; page < dmpResult.getCount()/criteriaObject.getSize()+1; page++){
  517. criteriaObject.setPage(page*1L);
  518. demObjs.addAll(queryObj(context, criteriaObject).getData());
  519. }
  520. }
  521. return demObjs;
  522. }
  523. private Map<String, String> queryProjectDefineType(InstanceUrlParam context){
  524. Map<String, String> codeNameMap = null;
  525. ObjectNode criteriaEq = JsonNodeFactory.instance.objectNode();
  526. criteriaEq.put("projectId", context.getProjectId());
  527. criteriaEq.put("objType", AdmSpace.OBJ_TYPE);
  528. DmpResult<JSONArray> resultDef = queryDefineType(context, criteriaEq);
  529. if(resultDef.getResult().equals(DmpResult.SUCCESS) && CollUtil.isNotEmpty(resultDef.getData())){
  530. List<ObjectTypeDefine> defineList = JSONUtil.toList(resultDef.getData().toString(), ObjectTypeDefine.class);
  531. codeNameMap = defineList.stream().collect(Collectors.toMap(ObjectTypeDefine::getCode, ObjectTypeDefine::getName, (k1,k2)->k1));
  532. }
  533. return codeNameMap;
  534. }
  535. /**
  536. * 查询空间flooId对应的infos中height存在的 flool
  537. * @param context
  538. * @param floolIds
  539. * @return
  540. */
  541. private List<ObjectNode> queryFloorsByFloorIds(InstanceUrlParam context, Collection<String> floolIds){
  542. QueryCriteria queryCriteria = ensureQueryCommParm(new QueryCriteria(),context, CollUtil.newArrayList("floor"),"floor");
  543. ObjectNode criteriaPe = queryCriteria.getCriteria();
  544. if(CollUtil.isNotEmpty(floolIds)){
  545. ArrayNode array = criteriaPe.putObject("id").putArray("$in");
  546. floolIds.forEach(floorId -> array.add(floorId));
  547. }
  548. JSONObject height = new JSONObject();
  549. height.put("$gt", 0f);
  550. criteriaPe.putPOJO("height", height);
  551. queryCriteria.setCriteria(criteriaPe);
  552. queryCriteria.setWithoutCount(true);
  553. return queryObject(context, queryCriteria);
  554. }
  555. /**
  556. * space.height = floor.infos.height
  557. * @param spaceMapByFlId
  558. * @param floorList
  559. * @return
  560. */
  561. private List<AdmSpace> processHeight(Map<String, List<AdmSpace>> spaceMapByFlId, List<ObjectNode> floorList){
  562. List<AdmSpace> resultList = new ArrayList<>();
  563. floorList.forEach(node -> {
  564. try {
  565. if (!node.has("id")
  566. || !node.get("id").isTextual()){
  567. return;
  568. }
  569. List<AdmSpace> spaces = spaceMapByFlId.get(node.get("id").asText());
  570. if (CollUtil.isEmpty(spaces)){
  571. return;
  572. }
  573. if(node.has("height")){
  574. String height = node.get("height").asText();
  575. if (StrUtil.isNotBlank(height)) {
  576. for (AdmSpace admSpace : spaces) {
  577. admSpace.setHeight(Float.parseFloat(height));
  578. resultList.add(admSpace);
  579. }
  580. }
  581. }
  582. } catch (Exception e) {}
  583. });
  584. return resultList;
  585. }
  586. /**
  587. * 添加绑定关系
  588. */
  589. private void processRelations(List<AdmSpace> vosR){
  590. if(CollUtil.isNotEmpty(vosR)) {
  591. List<RelationDTO> relationDTOS = new ArrayList<>(vosR.size());
  592. vosR.forEach(admSpace -> {
  593. if (StrUtil.isNotEmpty(admSpace.getBuildingId())) {
  594. relationDTOS.add(new RelationDTO("GtArchSubset001", "ArchSubset", "Bd2Sp", admSpace.getClassCode(), admSpace.getBuildingId(), admSpace.getId()));
  595. }
  596. if (StrUtil.isNotEmpty(admSpace.getFloorId())) {
  597. relationDTOS.add(new RelationDTO("GtArchSubset001", "ArchSubset", "Fl2Sp", admSpace.getClassCode(), admSpace.getFloorId(), admSpace.getId()));
  598. }
  599. });
  600. if (CollUtil.isNotEmpty(relationDTOS)) {
  601. relationService.doSave(AdmContextUtil.toDmpContext(), relationDTOS);
  602. }
  603. }
  604. }
  605. /**
  606. * 转换为目标实体,并增加属性
  607. */
  608. private void assembleDefineTypes(InstanceUrlParam context, List<JSONObject> defineList, String floorId){
  609. boolean needCount = true;
  610. defineList.stream().forEach(defineType -> {
  611. //查询空间数量
  612. int count = needCount ? countSpace(context, defineType.getString("code"), floorId) : 0;
  613. //处理单个对象
  614. assembleDefineObj(defineType, count, context.getProjectId());
  615. });
  616. }
  617. /**
  618. * 单个转换为目标实体,并增加属性
  619. */
  620. private void assembleDefineObj(JSONObject defineType, int count, String projectId){
  621. defineType.put("count", count);
  622. defineType.put("projectId", projectId);
  623. defineType.remove("aliasName");
  624. defineType.remove("aliasCode");
  625. defineType.remove("valid");
  626. defineType.remove("objType");
  627. defineType.remove("groupCode");
  628. defineType.remove("parentCode");
  629. defineType.remove("id");
  630. }
  631. private void addRelationTo(QueryCriteria rwdQueryCriteria, String objFrom, String relCode){
  632. ObjectNode relationTO = JsonNodeFactory.instance.objectNode();
  633. relationTO.put("relCode", relCode);
  634. relationTO.put("graphCode", "ArchSubset");
  635. relationTO.put("objFrom", objFrom);
  636. ObjectNode criteria = rwdQueryCriteria.getCriteria();
  637. criteria.putPOJO("relationTo", relationTO);
  638. rwdQueryCriteria.setCriteria(criteria);
  639. }
  640. private void addRelationFrom(QueryCriteria rwdQueryCriteria, String objTo, String relCode){
  641. ObjectNode relationFrom = JsonNodeFactory.instance.objectNode();
  642. if(StrUtil.isNotEmpty(objTo)){
  643. relationFrom.put("objTo", objTo);
  644. }
  645. ObjectNode criteria = rwdQueryCriteria.getCriteria();
  646. criteria.putPOJO("relationFrom", relationFrom);
  647. rwdQueryCriteria.setCriteria(criteria);
  648. }
  649. /**
  650. * 查询存在空间的数量
  651. * @param context
  652. * @param classCode
  653. * @param objFrom
  654. * @return
  655. */
  656. private int countSpace(InstanceUrlParam context, String classCode, String objFrom){
  657. QueryCriteria queryCriteria = ensureQueryCommParm(new QueryCriteria(), context, CollUtil.newArrayList(classCode),"space");
  658. addRelationTo(queryCriteria, objFrom,"Fl2Sp");
  659. queryCriteria.setOnlyCount(true);
  660. DmpResult<JSONArray> dmpResult = queryObj(context, queryCriteria);
  661. return dmpResult.getCount();
  662. }
  663. private DmpResult<JSONArray> queryDefineType(InstanceUrlParam context, ObjectNode criteriaEq){
  664. QueryCriteria criteriaObject = new QueryCriteria();
  665. criteriaObject.setCriteria(criteriaEq);
  666. JSONObject paraPe = null;
  667. try {
  668. String paraStr = objectMapper.writeValueAsString(criteriaObject);
  669. paraPe = JSONObject.parseObject(paraStr);
  670. } catch (JsonProcessingException e) {
  671. throw new RuntimeException("查询公共定义的空间类型,转换查询条件出错:" + e.getMessage());
  672. }
  673. return rwdClient.queryDefClass(context, paraPe);
  674. }
  675. }