AdmShaftController.java 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415
  1. package com.persagy.proxy.object.controller;
  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.JSONObject;
  6. import com.fasterxml.jackson.databind.node.ArrayNode;
  7. import com.fasterxml.jackson.databind.node.JsonNodeFactory;
  8. import com.fasterxml.jackson.databind.node.ObjectNode;
  9. import com.persagy.dmp.basic.dto.RequestData;
  10. import com.persagy.dmp.basic.model.QueryCriteria;
  11. import com.persagy.dmp.basic.utils.JsonNodeUtils;
  12. import com.persagy.dmp.common.model.entity.BaseEntity;
  13. import com.persagy.dmp.define.client.DigitalObjectInfoFacade;
  14. import com.persagy.dmp.define.entity.ObjectInfoDefine;
  15. import com.persagy.dmp.digital.client.DigitalObjectFacade;
  16. import com.persagy.dmp.digital.client.DigitalRelationFacade;
  17. import com.persagy.dmp.simple.client.DigitalObjectSimpleFacade;
  18. import com.persagy.proxy.adm.request.AdmCreateRequest;
  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.utils.AdmContextUtil;
  23. import com.persagy.proxy.adm.utils.AdmQueryCriteriaHelper;
  24. import com.persagy.proxy.adm.utils.ObjectNameUtil;
  25. import com.persagy.proxy.common.entity.RelationDTO;
  26. import com.persagy.proxy.object.model.*;
  27. import com.persagy.proxy.object.service.IAdmBuildingService;
  28. import com.persagy.proxy.object.service.IAdmShaftService;
  29. import com.persagy.proxy.object.service.IAdmSpaceService;
  30. import org.springframework.beans.factory.annotation.Autowired;
  31. import org.springframework.web.bind.annotation.*;
  32. import javax.ws.rs.QueryParam;
  33. import java.util.*;
  34. import java.util.stream.Collectors;
  35. /**
  36. * Adm 竖井 API
  37. * @author lvxy
  38. * @date 2021/8/16
  39. */
  40. @RestController
  41. @RequestMapping("/object/shaft")
  42. public class AdmShaftController {
  43. @Autowired
  44. private IAdmShaftService service;
  45. @Autowired
  46. private IAdmRelationService relationService;
  47. @Autowired
  48. private IAdmBuildingService buildingService;
  49. @Autowired
  50. private IAdmSpaceService spaceService;
  51. /**
  52. * 统计
  53. *
  54. * @param request
  55. * @return
  56. * @throws Exception
  57. */
  58. @PostMapping("/count")
  59. public AdmResponse count(@RequestBody AdmQueryCriteria request) throws Exception {
  60. request.setName("shaft");
  61. request.setOnlyCount(true);
  62. return service.doQuery(AdmContextUtil.toDmpContext(), request, AdmShaft.class);
  63. }
  64. /**
  65. * 创建
  66. * @param createRequest
  67. * @return
  68. * @throws Exception
  69. */
  70. @PostMapping("/create")
  71. public AdmResponse create(@RequestBody AdmCreateRequest<AdmShaft> createRequest) throws Exception {
  72. List<AdmShaft> vos = CollUtil.newArrayList(createRequest.getContent());
  73. List<AdmShaft> unRelationShaft = new ArrayList<>();
  74. List<AdmShaft> admShafts = new ArrayList<>(vos.size());
  75. List<RelationDTO> relationDTOS = new ArrayList<>(vos.size());
  76. vos.stream().forEach(admShaft -> {
  77. if (StrUtil.isEmpty(admShaft.getName())) {
  78. admShaft.setName(ObjectNameUtil.objectName("竖井-"));
  79. }
  80. if(CollUtil.isEmpty(admShaft.getBuildingList())){
  81. unRelationShaft.add(admShaft);
  82. }else{
  83. //插入对象 添加关系
  84. List<AdmShaft> shafts = service.doInsert(AdmContextUtil.toDmpContext(), AdmShaft.class, CollUtil.newArrayList(admShaft));
  85. admShaft.getBuildingList().stream().forEach(admBuilding ->{
  86. if(StrUtil.isNotEmpty(admBuilding.getId())){
  87. relationDTOS.add(new RelationDTO(null, "ArchSubset", "Bd2Sh", null , admBuilding.getId(), shafts.get(0).getId()));
  88. }
  89. });
  90. admShafts.addAll(shafts);
  91. }
  92. });
  93. if(CollUtil.isNotEmpty(relationDTOS)){
  94. relationService.doSave(AdmContextUtil.toDmpContext(), relationDTOS);
  95. }
  96. if(CollUtil.isNotEmpty(unRelationShaft)){
  97. List shaftList = service.doInsert(AdmContextUtil.toDmpContext(), AdmShaft.class, unRelationShaft);
  98. admShafts.addAll(shaftList);
  99. }
  100. return AdmResponse.success(admShafts);
  101. }
  102. /**
  103. * 根据ID删除
  104. * @param vos
  105. * @return
  106. * @throws Exception
  107. */
  108. @PostMapping("/delete")
  109. public AdmResponse delete( @RequestBody List<AdmShaft> vos) throws Exception {
  110. service.doDelete(AdmContextUtil.toDmpContext(), vos);
  111. return AdmResponse.success();
  112. }
  113. /**
  114. * 更新
  115. * @param createRequest
  116. * @return
  117. * @throws Exception
  118. */
  119. @PostMapping("/update")
  120. public AdmResponse update(@RequestBody AdmCreateRequest<AdmShaft> createRequest) throws Exception {
  121. List<AdmShaft> vos = CollUtil.newArrayList(createRequest.getContent());
  122. vos = service.doUpdate(AdmContextUtil.toDmpContext(), AdmShaft.class, vos);
  123. return AdmResponse.success(vos);
  124. }
  125. /**
  126. * 查询
  127. *
  128. * @param request
  129. * @return
  130. * @throws Exception
  131. */
  132. @PostMapping("/query")
  133. public AdmResponse query(@RequestBody AdmQueryCriteria request) throws Exception {
  134. request.setName(AdmShaft.OBJ_TYPE);
  135. return service.doQuery(AdmContextUtil.toDmpContext(), request, AdmShaft.class);
  136. }
  137. /**
  138. * 查询竖井信息-包含统计信息
  139. * 此方法可能会弃用
  140. *
  141. * 暂不实现
  142. *
  143. * @param request
  144. * @return
  145. * @throws Exception
  146. */
  147. @PostMapping("/query-with-count")
  148. public AdmResponse queryWithCount(@RequestBody AdmQueryCriteria request) throws Exception {
  149. request.setName("shaft");
  150. return service.doQuery(AdmContextUtil.toDmpContext(), request, AdmShaft.class);
  151. }
  152. /**
  153. * 查询关联元空间
  154. * 可能移至关系
  155. *
  156. * @param request
  157. * @return
  158. * @throws Exception
  159. */
  160. @PostMapping("/relate-space")
  161. public AdmResponse queryRelateSp(@RequestBody JSONObject request) throws Exception {
  162. //Sh2Sp
  163. // 先取消后重新建立
  164. if(JSONUtil.isNull(request)){
  165. return AdmResponse.failure("参数为空");
  166. }
  167. String shaftId = request.getString("shaftId");
  168. String spaceId = request.getString("spaceId");
  169. // 组装条件
  170. QueryCriteria criteria = new QueryCriteria();
  171. if(!StrUtil.isAllNotEmpty(shaftId,spaceId)) {
  172. return AdmResponse.failure("必填项:shaftId(竖井id)、spaceId(空间id)");
  173. }
  174. ObjectNode node = JsonNodeFactory.instance.objectNode();
  175. node.put("graphCode", "ArchSubset");
  176. node.put("relCode", "Sh2Sp");
  177. node.put("objFrom", shaftId);
  178. criteria.setCriteria(node);
  179. relationService.doDelete(AdmContextUtil.toDmpContext(), criteria);
  180. List<String> spaceIds = Arrays.asList(spaceId.split(","));
  181. Set<String> existsIds = spaceExists(spaceIds);
  182. List<String> failureList = null;
  183. if(CollUtil.isNotEmpty(existsIds)){
  184. failureList = spaceIds.stream().filter(isId -> !existsIds.contains(isId)).collect(Collectors.toList());
  185. List<RelationDTO> relationDTOS = new ArrayList<>();
  186. existsIds.stream().forEach(spId -> {
  187. RelationDTO relationDTO = new RelationDTO();
  188. relationDTO.setGraphCode("ArchSubset");
  189. relationDTO.setObjFrom(shaftId);
  190. relationDTO.setRelCode("Sh2Sp");
  191. relationDTO.setObjTo(spId);
  192. relationDTOS.add(relationDTO);
  193. });
  194. List<ObjectNode> nodeList = JsonNodeUtils.toListNode(relationDTOS, null, null);
  195. DigitalRelationFacade.create(AdmContextUtil.toDmpContext().getGroupCode(), AdmContextUtil.toDmpContext().getProjectId(),AdmContextUtil.toDmpContext().getAppId(), null, nodeList);
  196. }else{
  197. failureList = spaceIds;
  198. }
  199. if(CollUtil.isNotEmpty(failureList))
  200. return AdmResponse.failure("元空间 " +failureList.stream().collect(Collectors.joining(","))+ " 不存在");
  201. else
  202. return AdmResponse.success();
  203. }
  204. /**
  205. * 查询项目下已有的竖井类型
  206. * 此方法可能会弃用
  207. * {
  208. * "id":"shaftFuncType",
  209. * "name":"竖井功能"
  210. * }
  211. *
  212. * @return
  213. * @throws Exception
  214. */
  215. @PostMapping("/query-shaft-functype")
  216. public AdmResponse queryShFuncType() throws Exception {
  217. String projectId = AdmContextUtil.toDmpContext().getProjectId();
  218. if(StrUtil.isNotEmpty(projectId)){
  219. AdmResponse admResponse = AdmResponse.success();
  220. //查询参数请求查询的类型是否存在
  221. AdmQueryCriteria admQueryCriteria = new AdmQueryCriteria();
  222. StringBuilder filters = new StringBuilder(" code = '");
  223. filters.append("shaftFuncType").append("';");
  224. filters.append(" classCode ='").append("shaft").append(" '");
  225. admQueryCriteria.setFilters(filters.toString());
  226. QueryCriteria dmpRequest = AdmQueryCriteriaHelper.toDmpCriteria(admQueryCriteria);
  227. List<ObjectInfoDefine> defineList = DigitalObjectInfoFacade.query(AdmContextUtil.toDmpContext().getGroupCode(),AdmContextUtil.toDmpContext().getProjectId(),AdmContextUtil.toDmpContext().getAppId(),null,dmpRequest);
  228. //是否有该类型的竖井信息
  229. if(CollUtil.isNotEmpty(defineList)){
  230. //查询中台项目实际使用该信息点的竖井
  231. RequestData requestData = new RequestData();
  232. requestData.setObjType(AdmShaft.OBJ_TYPE);
  233. requestData.setGroups(Arrays.asList("shaftFuncType"));
  234. List<Map<String, Object>> listInfos = DigitalObjectSimpleFacade.queryObjectCountByObjInfos(AdmContextUtil.toDmpContext().getGroupCode(),AdmContextUtil.toDmpContext().getAppId(),null, requestData);
  235. if(CollUtil.isNotEmpty(listInfos)){
  236. ArrayNode datasource = defineList.get(0).getDataSource();
  237. List<HashMap> datasourceList = JSONUtil.toList(datasource.toString(), HashMap.class);
  238. Map<String, String> datasourceMap = new HashMap<>(datasourceList.size());
  239. for (HashMap map : datasourceList){
  240. datasourceMap.put(map.get("code").toString(),map.get("name").toString());
  241. }
  242. Map<String, Object> datasourceMapUsed = new HashMap<>(datasourceMap.size());
  243. listInfos.stream().forEach(map -> {
  244. if(!datasourceMapUsed.containsKey(map.get("shaftFuncType")) || datasourceMap.containsKey(map.get("shaftFuncType"))){
  245. JSONObject jsonObject = new JSONObject();
  246. jsonObject.put("id", map.get("shaftFuncType").toString());
  247. jsonObject.put("name", datasourceMap.get(map.get("shaftFuncType").toString()));
  248. datasourceMapUsed.put(map.get("shaftFuncType").toString(),jsonObject);
  249. }
  250. });
  251. if(CollUtil.isNotEmpty(datasourceMapUsed)){
  252. admResponse = AdmResponse.success(datasourceMapUsed.values().stream().collect(Collectors.toList()));
  253. }
  254. }
  255. }
  256. return admResponse;
  257. }else{
  258. return AdmResponse.failure("项目Id为空");
  259. }
  260. }
  261. /**
  262. * 查询和当前竖井有关联的业务空间
  263. * shaftId 为竖井id
  264. *
  265. * @param request
  266. * @return
  267. * @throws Exception
  268. */
  269. @PostMapping("/shaft-zoneSpaceBaseTable")
  270. public AdmResponse queryZoneSp(@QueryParam("ShaftId") String ShaftId, @RequestBody AdmQueryCriteria request) throws Exception {
  271. // 组装条件
  272. request.setName(AdmSpace.OBJ_TYPE);
  273. QueryCriteria queryCriteria = AdmQueryCriteriaHelper.toDmpCriteria(request);
  274. if(!StrUtil.isNotEmpty(ShaftId)) {
  275. return AdmResponse.failure("必填项:shaftId(竖井id)");
  276. }
  277. ObjectNode criteria = JsonNodeFactory.instance.objectNode();
  278. ObjectNode relationTO = JsonNodeFactory.instance.objectNode();
  279. relationTO.put("relCode", "Sh2Sp");
  280. relationTO.put("graphCode","ArchSubset");
  281. relationTO.put("objFrom", ShaftId);
  282. criteria.putPOJO("relationTo", relationTO);
  283. queryCriteria.setCriteria(criteria);
  284. AdmResponse admResponse = spaceService.doQuery(AdmContextUtil.toDmpContext(), queryCriteria, AdmSpace.class);
  285. return admResponse;
  286. }
  287. /**
  288. * 查询和当前竖井有关联的业务空间所在建筑及楼层信息
  289. * shaftId 为竖井id
  290. *
  291. * @return
  292. * @throws Exception
  293. */
  294. @GetMapping("/shaft-zoneSpaceBaseTable-building")
  295. public AdmResponse queryZoneSpBd(@QueryParam("shaftId") String shaftId,
  296. @QueryParam("objectType") String objectType) throws Exception {
  297. if(!StrUtil.isAllNotEmpty(shaftId,AdmContextUtil.toDmpContext().getProjectId())) {
  298. return AdmResponse.failure("必填项:shaftId(竖井id)、projectId(项目id)");
  299. }
  300. // 组装条件 查询竖井下的空间
  301. AdmQueryCriteria admQueryCriteria = new AdmQueryCriteria();
  302. admQueryCriteria.setName(AdmSpace.OBJ_TYPE);
  303. if(StrUtil.isNotEmpty(objectType)){
  304. admQueryCriteria.setFilters(" classCode = '"+objectType+"'");
  305. }
  306. //转化为中台的查询条件
  307. QueryCriteria queryCriteria = AdmQueryCriteriaHelper.toDmpCriteria(admQueryCriteria);
  308. ObjectNode criteria = JsonNodeFactory.instance.objectNode();
  309. ObjectNode relationTO = JsonNodeFactory.instance.objectNode();
  310. relationTO.put("relCode", "Sh2Sp");
  311. relationTO.put("graphCode","ArchSubset");
  312. relationTO.put("objFrom", shaftId);
  313. criteria.putPOJO("relationTo", relationTO);
  314. criteria.put("objType", AdmSpace.OBJ_TYPE);
  315. queryCriteria.setCriteria(criteria);
  316. List<ObjectNode> spaceList = DigitalObjectFacade.query(AdmContextUtil.toDmpContext().getGroupCode(), AdmContextUtil.toDmpContext().getProjectId(), AdmContextUtil.toDmpContext().getAppId(), null, queryCriteria);
  317. if(CollUtil.isNotEmpty(spaceList)){
  318. AdmQueryCriteria queryCriteriaBd = new AdmQueryCriteria();
  319. queryCriteriaBd.setName(AdmBuilding.OBJ_TYPE);
  320. queryCriteriaBd.setProjection(Arrays.asList("id","name","localName","floor"));
  321. //建筑级联楼层
  322. List<AdmQueryCriteria> cascade = new ArrayList<>(1);
  323. AdmQueryCriteria cascadeFloor = new AdmQueryCriteria();
  324. cascadeFloor.setName(AdmFloor.OBJ_TYPE);
  325. cascadeFloor.setProjection(Arrays.asList("id","name","localName"));
  326. cascade.add(cascadeFloor);
  327. cascadeFloor.setOrders("floorSequenceId desc");
  328. queryCriteriaBd.setCascade(cascade);
  329. List<AdmSpace> vos = JSONUtil.toList(spaceList.toString(), AdmSpace.class);
  330. Map<String, AdmSpace> admSpaceMap = CollUtil.fieldValueMap(vos, "buildingId");
  331. ObjectNode relationFrom = JsonNodeFactory.instance.objectNode();
  332. relationFrom.put("relCode", "Bd2Sp");
  333. relationFrom.put("graphCode","ArchSubset");
  334. ArrayNode arrayNode = relationFrom.putObject("objTo").putArray("$in");
  335. admSpaceMap.keySet().stream().forEach(spaceId -> arrayNode.add(spaceId));
  336. AdmResponse response = buildingService.doQuery(AdmContextUtil.toDmpContext(), queryCriteriaBd, AdmBuilding.class);
  337. return response;
  338. }else{
  339. return AdmResponse.success();
  340. }
  341. }
  342. /**
  343. * 查询和当前竖井没有关联的业务空间
  344. * shaftId 为竖井id
  345. *
  346. * @param request
  347. * @return
  348. * @throws Exception
  349. */
  350. @PostMapping("/un-shaft-zoneSpaceBaseTable")
  351. public AdmResponse queryUnZoneSp(@QueryParam("shaftId") String shaftId,
  352. @RequestBody AdmQueryCriteria request) throws Exception {
  353. // 组装条件
  354. if(!StrUtil.isNotEmpty(shaftId)) {
  355. return AdmResponse.failure("必填项:shaftId(竖井id)");
  356. }
  357. request.setName(AdmSpace.OBJ_TYPE);
  358. request.resetRelationCond(false, "ArchSubset", "Sh2Sp", AdmSpace.OBJ_TYPE, shaftId, false);
  359. QueryCriteria queryCriteria = AdmQueryCriteriaHelper.toDmpCriteria(request);
  360. List<ObjectNode> spaceList = DigitalObjectFacade.query(AdmContextUtil.toDmpContext().getGroupCode(), AdmContextUtil.toDmpContext().getProjectId(), AdmContextUtil.toDmpContext().getAppId(), null, queryCriteria);
  361. if(CollUtil.isNotEmpty(spaceList)){
  362. List<AdmSpace> vos = JSONUtil.toList(spaceList.toString(), AdmSpace.class);
  363. return AdmResponse.success(spaceList);
  364. }else{
  365. return AdmResponse.success();
  366. }
  367. }
  368. /**
  369. * 元空间是否存在
  370. *
  371. * @param spaceIds failureList
  372. * @return 是否存在
  373. */
  374. private Set<String> spaceExists(List<String> spaceIds) {
  375. QueryCriteria queryCriteria = new QueryCriteria();
  376. ObjectNode node = JsonNodeFactory.instance.objectNode();
  377. ArrayNode arrayNode = node.putObject("id").putArray("$in");
  378. spaceIds.stream().forEach(spaceId -> arrayNode.add(spaceId));
  379. node.put("objType","ispace");
  380. queryCriteria.setCriteria(node);
  381. List<ObjectNode> ispaces = DigitalObjectFacade.query(AdmContextUtil.toDmpContext().getGroupCode(),AdmContextUtil.toDmpContext().getProjectId(),AdmContextUtil.toDmpContext().getAppId(),AdmContextUtil.toDmpContext().getAppId(),queryCriteria);
  382. if(CollUtil.isNotEmpty(ispaces)){
  383. List<AdmISpace> iSpaceList = JSONUtil.toList(JSONUtil.parseArray(ispaces.toString()), AdmISpace.class);
  384. Map<String, AdmISpace> admISpaceMap = CollUtil.fieldValueMap(iSpaceList, BaseEntity.PROP_ID);
  385. return admISpaceMap.keySet();
  386. }else{
  387. return null;
  388. }
  389. }
  390. }