AdmSpaceServiceImpl.java 29 KB

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