AdmSpaceServiceImpl.java 32 KB

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