AdmSpaceController.java 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467
  1. package com.persagy.proxy.object.controller;
  2. import cn.hutool.core.collection.CollUtil;
  3. import cn.hutool.core.util.StrUtil;
  4. import com.alibaba.fastjson.JSONObject;
  5. import com.fasterxml.jackson.databind.node.JsonNodeFactory;
  6. import com.fasterxml.jackson.databind.node.ObjectNode;
  7. import com.persagy.dmp.basic.model.QueryCriteria;
  8. import com.persagy.dmp.basic.utils.JsonNodeUtils;
  9. import com.persagy.proxy.adm.constant.AdmRelationTypeEnum;
  10. import com.persagy.proxy.adm.handler.SpaceRelationInfoHandler;
  11. import com.persagy.proxy.adm.request.*;
  12. import com.persagy.proxy.adm.service.IAdmRelationService;
  13. import com.persagy.proxy.adm.utils.AdmContextUtil;
  14. import com.persagy.proxy.adm.utils.ObjectNameUtil;
  15. import com.persagy.proxy.common.entity.RelationDTO;
  16. import com.persagy.proxy.object.model.AdmBuilding;
  17. import com.persagy.proxy.object.model.AdmFloor;
  18. import com.persagy.proxy.object.model.AdmSpace;
  19. import com.persagy.proxy.object.service.IAdmBuildingService;
  20. import com.persagy.proxy.object.service.IAdmFloorService;
  21. import com.persagy.proxy.object.service.IAdmSpaceService;
  22. import org.springframework.beans.factory.annotation.Autowired;
  23. import org.springframework.web.bind.annotation.PostMapping;
  24. import org.springframework.web.bind.annotation.RequestBody;
  25. import org.springframework.web.bind.annotation.RequestMapping;
  26. import org.springframework.web.bind.annotation.RestController;
  27. import javax.ws.rs.QueryParam;
  28. import java.util.*;
  29. /**
  30. * Adm 空间 API
  31. * @author lvxy
  32. * @date 2021/8/16
  33. */
  34. @RestController
  35. @RequestMapping("/object/zone")
  36. public class AdmSpaceController {
  37. @Autowired
  38. private IAdmSpaceService service;
  39. @Autowired
  40. private IAdmBuildingService buildingService;
  41. @Autowired
  42. private IAdmRelationService relationService;
  43. @Autowired
  44. private IAdmFloorService floorService;
  45. @Autowired
  46. private SpaceRelationInfoHandler spaceRelationInfoHandler;
  47. /**
  48. * 统计
  49. *
  50. * @param request
  51. * @return
  52. * @throws Exception
  53. */
  54. @PostMapping("/count")
  55. public AdmResponse count(@RequestBody AdmQueryCriteria request) throws Exception {
  56. request.setName(AdmSpace.OBJ_TYPE);
  57. request.setOnlyCount(true);
  58. //return service.doQuery( AdmContextUtil.toDmpContext(), request, AdmSpace.class);
  59. return service.query(request);
  60. }
  61. /**
  62. * 创建
  63. * @param createRequest
  64. * @return
  65. * @throws Exception
  66. */
  67. @PostMapping("/create")
  68. public AdmCreateResponse create(@RequestBody AdmCreateRequest<AdmSpace> createRequest) throws Exception {
  69. List<AdmSpace> vos = CollUtil.newArrayList(createRequest.getContent());
  70. String msg = null;
  71. for (AdmSpace admSpace : vos) {
  72. if(StrUtil.isEmpty(admSpace.getClassCode())){
  73. msg = "classCode不可以为空!";
  74. break;
  75. }
  76. if (StrUtil.isEmpty(admSpace.getName())) {
  77. admSpace.setName(ObjectNameUtil.objectName("空间-"));
  78. }
  79. }
  80. if(StrUtil.isEmpty(msg)){
  81. vos = service.doInsertExt(AdmContextUtil.toDmpContext(), AdmSpace.class, vos);
  82. AdmCreateResponse admResponseObj = AdmCreateResponse.success(vos);
  83. return admResponseObj;
  84. }else{
  85. return AdmCreateResponse.failure(msg);
  86. }
  87. }
  88. /**
  89. * 根据ID删除
  90. * @param vos
  91. * @return
  92. * @throws Exception
  93. */
  94. @PostMapping("/delete")
  95. public AdmResponse delete( @RequestBody List<AdmSpace> vos) throws Exception {
  96. service.doDelete( AdmContextUtil.toDmpContext(), vos);
  97. QueryCriteria queryCriteria = new QueryCriteria();
  98. vos.forEach(vo -> {
  99. /** 清除空间和建筑楼层的的数据 */
  100. dealRelation(vo.getId(), queryCriteria,"Bd2Sp", false);
  101. dealRelation(vo.getId(), queryCriteria,"Fl2Sp", false);
  102. dealRelation(vo.getId(), queryCriteria,"Sp2Si", true);
  103. });
  104. return AdmResponse.success();
  105. }
  106. /**
  107. * 更新分区对象信息
  108. * @param createRequest
  109. * @return
  110. * @throws Exception
  111. */
  112. @PostMapping("/update")
  113. public AdmResponse update(@RequestBody AdmCreateRequest<AdmSpace> createRequest, @QueryParam("projectId") String projectId) throws Exception {
  114. List<AdmSpace> vos = CollUtil.newArrayList(createRequest.getContent());
  115. if(CollUtil.isNotEmpty(vos)) {
  116. AdmRelationTypeEnum typeEnumBd = AdmRelationTypeEnum.BD2SP;
  117. AdmRelationTypeEnum typeEnumFl = AdmRelationTypeEnum.FL2SP;
  118. QueryCriteria criteria = new QueryCriteria();
  119. ObjectNode node = JsonNodeFactory.instance.objectNode();
  120. List<RelationDTO> relationDTOList = new ArrayList<>(vos.size());
  121. vos.forEach(admSpace -> {
  122. //处理建筑 楼层信息点
  123. int removeflBd = 0 ;//关系处理 0 不删除 1 删除bd 2 删除fl 3 都删除
  124. if(StrUtil.isNotEmpty(admSpace.getFlowBuild())){
  125. String flowBuild = admSpace.getFlowBuild();
  126. if(!flowBuild.contains("-")){
  127. if(flowBuild.startsWith("Bd")){
  128. admSpace.setBuildingId(flowBuild);
  129. if(StrUtil.isNotEmpty(admSpace.getFloorId())){
  130. Map<String, Object> infos = new HashMap<String,Object>(16);
  131. infos.put("$remove", Arrays.asList("floorId"));
  132. admSpace.setInfos(infos);
  133. removeflBd = 2;
  134. }
  135. }
  136. }else {
  137. String[] str = flowBuild.split("-");
  138. if(str[0].startsWith("Bd")){
  139. admSpace.setBuildingId(str[0]);
  140. admSpace.setFloorId(str[1]);
  141. }else{
  142. admSpace.setBuildingId(str[1]);
  143. admSpace.setFloorId(str[0]);
  144. }
  145. removeflBd = 3;
  146. }
  147. admSpace.setFlowBuild(null);
  148. }else{
  149. Map<String, Object> infos = new HashMap<String,Object>(16);
  150. infos.put("$remove",Arrays.asList("floorId","buildingId"));
  151. admSpace.setInfos(infos);
  152. removeflBd = 3;
  153. }
  154. //删除关系 然后重建
  155. if(removeflBd == 3 || removeflBd == 2){
  156. node.put("relCode", typeEnumFl.getRelCode());
  157. node.put("objTo", admSpace.getId());
  158. node.put("graphCode", typeEnumFl.getGraphCode());
  159. criteria.setCriteria(node);
  160. relationService.doDelete(AdmContextUtil.toDmpContext(), criteria);
  161. }
  162. if(removeflBd == 3 || removeflBd == 1){
  163. node.put("relCode", typeEnumBd.getRelCode());
  164. node.put("objTo", admSpace.getId());
  165. node.put("graphCode", typeEnumBd.getGraphCode());
  166. criteria.setCriteria(node);
  167. relationService.doDelete(AdmContextUtil.toDmpContext(), criteria);
  168. }
  169. });
  170. vos.stream().forEach(space -> {
  171. if (StrUtil.isNotEmpty(space.getBuildingId())) {
  172. RelationDTO relationBd = new RelationDTO(null, typeEnumBd.getGraphCode(), typeEnumBd.getRelCode(), null, space.getBuildingId(), space.getId());
  173. relationDTOList.add(relationBd);
  174. }
  175. if (StrUtil.isNotEmpty(space.getFloorId())) {
  176. RelationDTO relationFl = new RelationDTO(null, typeEnumFl.getGraphCode(), typeEnumFl.getRelCode(), null, space.getFloorId(), space.getId());
  177. relationDTOList.add(relationFl);
  178. }
  179. });
  180. if (CollUtil.isNotEmpty(relationDTOList)) {
  181. relationService.doSave(AdmContextUtil.toDmpContext(), relationDTOList);
  182. }
  183. vos = service.doUpdate(AdmContextUtil.toDmpContext(), AdmSpace.class, vos);
  184. }
  185. return AdmResponse.success(vos);
  186. }
  187. /**
  188. * 查询
  189. *
  190. * @param request
  191. * @return
  192. * @throws Exception
  193. */
  194. @PostMapping("/query")
  195. public ObjectNode query(@RequestBody AdmDCSQueryRequest request) throws Exception {
  196. AdmResponse response = service.doQuerySpaces( AdmContextUtil.toDmpContext(), request);
  197. ObjectNode objectNode = JsonNodeUtils.toObjectNode(response, null, null);
  198. if(StrUtil.isNotEmpty(request.getZoneType())){
  199. objectNode.put("zoneType", request.getZoneType());
  200. }
  201. return objectNode;
  202. /*ObjectNode criteria = AdmQueryCriteriaHelper.toCriteria(null, request.getFilters());
  203. List<OrderItem> orderItem = AdmQueryCriteriaHelper.toOrderItem(request.getOrders());
  204. return this.spaceRelationInfoHandler.querySpaceInfo(request, criteria, orderItem);*/
  205. }
  206. /**
  207. * 查询业务空间的建筑楼层,包含受影响的空间数量
  208. *
  209. * @param request
  210. * @return
  211. * @throws Exception
  212. */
  213. @PostMapping("/building-floor")
  214. public AdmResponse queryBuildingFloor(@RequestBody AdmQueryCriteria request) throws Exception {
  215. request.setName(AdmBuilding.OBJ_TYPE);
  216. AdmQueryCriteria criteriaFloor = new AdmQueryCriteria();
  217. criteriaFloor.setName(AdmFloor.OBJ_TYPE);
  218. AdmQueryCriteria criteriaSpace = new AdmQueryCriteria();
  219. criteriaSpace.setName("spaceList");
  220. criteriaSpace.setFilters("state = 1");
  221. criteriaFloor.setCascade(CollUtil.newArrayList(criteriaSpace));
  222. criteriaFloor.setOrders("floorSequenceID desc");
  223. request.setCascade(CollUtil.newArrayList(criteriaFloor));
  224. AdmResponse response = buildingService.doQueryBuildingFloor(AdmContextUtil.toDmpContext(), request);
  225. List<AdmBuilding> buildings = (List<AdmBuilding>) response.getContent();
  226. buildings.forEach(building -> {
  227. if(CollUtil.isNotEmpty(building.getFloor())){
  228. List<AdmFloor> floors = building.getFloor();
  229. floors.forEach(floor -> {
  230. if(CollUtil.isNotEmpty(floor.getSpaceList())){
  231. floor.setCount(floor.getSpaceList().size());
  232. floor.setSpaceList(null);
  233. }else{
  234. floor.setCount(0);
  235. }
  236. });
  237. }
  238. });
  239. return response;
  240. }
  241. /**
  242. * 修改业务空间对象和建筑楼层的关系
  243. * spaceId 业务空间id,id 楼层或建筑id,type 业务空间的类型
  244. * @param voList
  245. * @return
  246. * @throws Exception
  247. */
  248. @PostMapping("/update-fl-bd")
  249. public AdmResponse updateFlBd(@RequestBody List<AdmUpDataFloorAndBuildingRequests> voList, @QueryParam("projectId") String projectId) throws Exception {
  250. if(CollUtil.isEmpty(voList)){
  251. return AdmResponse.failure("不可以传入空数据");
  252. }
  253. //TODO 循环删除 需要改为 批量删除
  254. List<RelationDTO> RSpInBd_up = new ArrayList<>();
  255. List<RelationDTO> RSpInFl_up = new ArrayList<>();
  256. List<AdmSpace> space_up = new ArrayList<>();
  257. QueryCriteria queryCriteria = new QueryCriteria();
  258. voList.stream().forEach(requestData -> {
  259. String spaceId = requestData.getSpaceId();
  260. String id = requestData.getId();
  261. String type = requestData.getType();//classCode
  262. //更新实体
  263. AdmSpace space = new AdmSpace();
  264. space.setId(spaceId);
  265. space.setObjectType(AdmSpace.OBJ_TYPE);
  266. space.setClassCode(type);
  267. /** 清除空间和建筑楼层的的数据 */
  268. dealRelation(spaceId, queryCriteria,"Bd2Sp", false);
  269. dealRelation(spaceId, queryCriteria,"Fl2Sp", false);
  270. if(StrUtil.isNotEmpty(id)){
  271. if(id.startsWith("Fl") && StrUtil.isNotEmpty(spaceId)){
  272. AdmQueryCriteria admQueryCriteria = new AdmQueryCriteria();
  273. admQueryCriteria.setName(AdmFloor.OBJ_TYPE);
  274. admQueryCriteria.setFilters("id = '"+id+"'");
  275. AdmResponse admResponseFl = floorService.query(admQueryCriteria);
  276. if(CollUtil.isNotEmpty(admResponseFl.getContent())){
  277. AdmFloor floor = (AdmFloor) admResponseFl.getContent().get(0);
  278. if (floor!=null){
  279. //更新关系
  280. RelationDTO rBd_up = new RelationDTO();
  281. rBd_up.setObjTo(spaceId);
  282. rBd_up.setRelCode("Bd2Sp");
  283. rBd_up.setGraphCode("ArchSubset");
  284. rBd_up.setObjFrom(floor.getBuildingId());
  285. RSpInBd_up.add(rBd_up);
  286. RelationDTO rFl_up = new RelationDTO();
  287. rFl_up.setObjTo(spaceId);
  288. rFl_up.setRelCode("Fl2Sp");
  289. rFl_up.setGraphCode("ArchSubset");
  290. rFl_up.setObjFrom(floor.getId());
  291. RSpInFl_up.add(rFl_up);
  292. //楼层 建筑信息点维护
  293. space.setBuildingId(floor.getBuildingId());
  294. space.setFloorId(floor.getId());
  295. space_up.add(space);
  296. }
  297. }
  298. }else if(id.startsWith("Bd")){
  299. //更新关系
  300. QueryCriteria criteria = new QueryCriteria();
  301. ObjectNode node = JsonNodeFactory.instance.objectNode();
  302. //删除关系 然后重建
  303. node.put("relCode", "Bd2Sp");
  304. node.put("objTo", "spaceId");
  305. node.put("graphCode", "ArchSubset");
  306. criteria.setCriteria(node);
  307. relationService.doDelete(AdmContextUtil.toDmpContext(), criteria);
  308. RelationDTO rBd_up = new RelationDTO();
  309. rBd_up.setObjTo(spaceId);
  310. rBd_up.setRelCode("Bd2Sp");
  311. rBd_up.setGraphCode("ArchSubset");
  312. rBd_up.setObjFrom(id);
  313. RSpInBd_up.add(rBd_up);
  314. //楼层 建筑信息点维护
  315. space.setBuildingId(id);
  316. Map<String, Object> info = new HashMap<>(1);
  317. info.put("$remove",Arrays.asList("floorId"));
  318. space.setInfos(info);
  319. space_up.add(space);
  320. }
  321. }else{
  322. //楼层 建筑信息点维护 清除
  323. Map<String, Object> info = new HashMap<>(1);
  324. info.put("$remove",Arrays.asList("floorId","buildingId"));
  325. space.setInfos(info);
  326. space_up.add(space);
  327. }
  328. });
  329. service.doUpdate( AdmContextUtil.toDmpContext(), AdmSpace.class, space_up);
  330. relationService.doSave( AdmContextUtil.toDmpContext(), RSpInBd_up);
  331. relationService.doSave( AdmContextUtil.toDmpContext(), RSpInFl_up);
  332. return AdmResponse.success(space_up);
  333. }
  334. /**
  335. * 更新分区对象信息-Outline
  336. * @param createRequest
  337. * @return
  338. * @throws Exception
  339. */
  340. @PostMapping("/update-outline")
  341. public AdmResponse updateOutLine(@RequestBody AdmCreateRequest<AdmSpace> createRequest) throws Exception {
  342. List<AdmSpace> vos = CollUtil.newArrayList(createRequest.getContent());
  343. vos = service.doUpdate( AdmContextUtil.toDmpContext(), AdmSpace.class, vos);
  344. //TODO 更新计算关系ZoneSpaceBaseService.upDateOutline
  345. return AdmResponse.success(vos);
  346. }
  347. /**
  348. * 查询空间信息-outline 级联查询:建筑(building),楼层(floor),空间类型(objectType)
  349. *
  350. * @param request
  351. * @return
  352. * @throws Exception
  353. */
  354. @PostMapping("/query-outline")
  355. public ObjectNode queryOutline(@RequestBody AdmDCSQueryRequest request) throws Exception {
  356. request.setName(AdmSpace.OBJ_TYPE);
  357. request.setProjection(null);
  358. List<String> list = new ArrayList<>();
  359. list.add("id");
  360. list.add("name");
  361. list.add("localId");
  362. list.add("localName");
  363. list.add("outline");
  364. list.add("classCode");
  365. list.add("buildingId");
  366. list.add("floorId");
  367. list.add("state");
  368. list.add("floorSequenceId");
  369. list.add("modelId");
  370. list.add("infos");
  371. list.add("properties");
  372. request.setProjection(list);
  373. AdmResponse response = service.doQuerySpaces(AdmContextUtil.toDmpContext(), request);
  374. ObjectNode objectNode = JsonNodeUtils.toObjectNode(response, null, null);
  375. if(StrUtil.isNotEmpty(request.getZoneType())){
  376. objectNode.put("zoneType", request.getZoneType());
  377. }
  378. if(StrUtil.isNotEmpty(request.getFloorId())){
  379. objectNode.put("floorId", request.getFloorId());
  380. }
  381. if(StrUtil.isNotEmpty(request.getBuildingId())){
  382. objectNode.put("buildingId", request.getBuildingId());
  383. }
  384. return objectNode;
  385. }
  386. /**
  387. * 获取项目下已有的空间类型
  388. *
  389. * @return
  390. * @throws Exception
  391. */
  392. @PostMapping("/space-type")
  393. public List<JSONObject> querySpaceType() throws Exception {
  394. return service.doQuerySpaceTypes( AdmContextUtil.toDmpContext());
  395. }
  396. /**
  397. * 查询业务空间所有类型
  398. *
  399. * @param request
  400. * @return
  401. * @throws Exception
  402. */
  403. @PostMapping("/type")
  404. public ObjectNode queryType(@RequestBody AdmDCSQueryRequest request) throws Exception {
  405. AdmResponse response = service.doQueryType( AdmContextUtil.toDmpContext(), request);
  406. ObjectNode objectNode = JsonNodeUtils.toObjectNode(response, null, null);
  407. if(StrUtil.isNotEmpty(request.getZoneType())){
  408. objectNode.put("zoneType", request.getZoneType());
  409. }
  410. return objectNode;
  411. }
  412. /**
  413. * 上传EXCEL 识别镜头信息点
  414. *
  415. * @param
  416. * @return
  417. * @throws Exception
  418. */
  419. @PostMapping("/import")
  420. public AdmResponse importExcel() throws Exception {
  421. return null;
  422. }
  423. private void dealRelation(String spaceId, QueryCriteria queryCriteria, String relCode, Boolean isObjFrom){
  424. ObjectNode rBd = JsonNodeFactory.instance.objectNode();
  425. if(isObjFrom){
  426. rBd.put("objFrom",spaceId);
  427. }else{
  428. rBd.put("objTo",spaceId);
  429. }
  430. rBd.put("relCode",relCode);
  431. queryCriteria.setCriteria(rBd);
  432. relationService.doDelete( AdmContextUtil.toDmpContext(), queryCriteria);
  433. }
  434. }