AdmSpaceServiceImpl.java 24 KB

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