AdmSpaceServiceImpl.java 24 KB

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