AdmModelRelServiceImpl.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361
  1. package com.persagy.proxy.adm.service.impl;
  2. import cn.hutool.core.collection.CollUtil;
  3. import com.alibaba.fastjson.JSON;
  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.proxy.adm.constant.AdmCommonConstant;
  8. import com.persagy.proxy.adm.constant.AdmRelationTypeEnum;
  9. import com.persagy.proxy.adm.model.*;
  10. import com.persagy.proxy.adm.request.AdmQueryCriteria;
  11. import com.persagy.proxy.adm.request.AdmResponse;
  12. import com.persagy.proxy.adm.service.*;
  13. import com.persagy.proxy.adm.utils.GeoToolsUtil;
  14. import com.persagy.proxy.common.entity.InstanceUrlParam;
  15. import lombok.extern.slf4j.Slf4j;
  16. import org.apache.commons.lang.StringUtils;
  17. import org.springframework.beans.factory.annotation.Autowired;
  18. import org.springframework.stereotype.Service;
  19. import java.util.ArrayList;
  20. import java.util.List;
  21. import java.util.Map;
  22. /**
  23. * @ClassName AdmModelRelServiceImpl
  24. * @Description: 模型修改设备元空间的建筑楼层信息
  25. * @Author linhuili
  26. * @Date 2021/8/31 14:31
  27. * @Version V1.0
  28. **/
  29. @Service
  30. @Slf4j
  31. public class AdmModelRelServiceImpl extends AbstractAdmBaseServiceImpl<AdmModelRel> implements IAdmModelRelService {
  32. @Autowired
  33. private IAdmFloorService floorService;
  34. @Autowired
  35. private IAdmEquipmentService equipmentService;
  36. @Autowired
  37. private IAdmISpaceService iSpaceService;
  38. /**
  39. * 模型修改设备元空间的建筑楼层信息
  40. * @param context
  41. * @param clazz
  42. * @param vo
  43. * @return
  44. */
  45. @Override
  46. public List<AdmModelRel> doUpdateModelInfo(InstanceUrlParam context, Class<AdmModelRel> clazz, AdmModelRel vo) throws Exception{
  47. //1.查询模型文件是否有楼层在使用
  48. AdmModelRel floorCriteria = new AdmModelRel();
  49. floorCriteria.setModelId(vo.getModelId());
  50. List<AdmFloor> floorList = queryFloorEntity(context,floorCriteria);
  51. if(CollUtil.isNotEmpty(floorList)){
  52. List<String> floorQueryTypes = getFloorQueryTypes(floorList);
  53. //根据类型查询relation_type_project
  54. //更新边类型计算状态:computationalState为2
  55. }
  56. //2.修改设备和元空间的建筑楼层信息
  57. String oldBimId = vo.getOldBimId();
  58. String bimId = vo.getBimId();
  59. if(StringUtils.isNotEmpty(oldBimId) && !oldBimId.equals(bimId)){
  60. //根据模型id重置设备元空间的建筑楼层信息
  61. resetEquipIspaceInfo(context,vo);
  62. }
  63. //查询楼层实体
  64. floorCriteria = new AdmModelRel();
  65. floorCriteria.setFloorId(vo.getFloorId());
  66. List<AdmFloor> admFloors = queryFloorEntity(context, floorCriteria);
  67. if(CollUtil.isEmpty(admFloors)){
  68. throw new Exception("楼层不存在");
  69. }
  70. AdmFloor floorEntity = admFloors.get(0);
  71. //2.1 模型修改设备的建筑楼层信息
  72. if(CollUtil.isEmpty(floorEntity.getOutline())){
  73. //如果楼层的轮廓线为空的话,直接修改
  74. updateEquipModelInfo(context, vo,floorEntity);
  75. }else{
  76. //判断该设备的坐标是否在层楼的轮廓中,若在,修改;不在,不修改
  77. List<AdmEquipment> admEquipments = queryModelEquip(context, vo);
  78. Boolean pointInPolygon = isPointInPolygon(admEquipments, floorEntity);
  79. if(pointInPolygon){
  80. updateEquipModelInfo(context, vo,floorEntity);
  81. }
  82. }
  83. //2.2 模型修改元空间的建筑楼层信息
  84. updateIspaceModelInfo(context, vo,floorEntity);
  85. //3. 修改楼层平面图地址
  86. if(StringUtils.isNotEmpty(vo.getFloorMap())){
  87. floorEntity.setFloorMap(vo.getFloorMap());
  88. }
  89. floorEntity.setModelId(vo.getModelId());
  90. floorEntity.setBimIdPre(vo.getBimId());
  91. //4.处理楼层自定义属性:楼层标高
  92. ObjectNode attributeMap = vo.getAttributeMap();
  93. if(attributeMap!=null){
  94. updateFloorElevation(vo.getAttributeMap().toString(),floorEntity);
  95. }
  96. //5.修改楼层信息
  97. ArrayList<AdmFloor> floors = new ArrayList<>();
  98. floors.add(floorEntity);
  99. List<AdmFloor> floorUpresult = floorService.doUpdate(context, AdmFloor.class, floors);
  100. if(CollUtil.isEmpty(floorUpresult)) {
  101. //6.发送消息,BDTP已发送,不再重复发送修改对象消息
  102. }
  103. return null;
  104. }
  105. /**
  106. * 模型修改设备的建筑楼层信息
  107. */
  108. private void updateEquipModelInfo(InstanceUrlParam context, AdmModelRel modelRel,AdmFloor floorEntity){
  109. //查询模型下的设备信息
  110. AdmQueryCriteria criteria = new AdmQueryCriteria();
  111. criteria.setFilters("bimId = "+modelRel.getBimId());
  112. criteria.setFilters("floorId = "+modelRel.getFloorId());
  113. AdmResponse admResponse = equipmentService.doQuery(context, criteria, AdmEquipment.class);
  114. List<AdmEquipment> content = (List<AdmEquipment>) admResponse.getContent();
  115. if(CollUtil.isEmpty(content)){
  116. return;
  117. }
  118. for (AdmEquipment admEquipment : content) {
  119. //修改设备的建筑楼层信息
  120. admEquipment.setBuildingId(floorEntity.getBuildingId());
  121. admEquipment.setFloorId(floorEntity.getId());
  122. }
  123. List<AdmEquipment> admEquipments = equipmentService.doUpdate(context, AdmEquipment.class, content);
  124. log.info("模型修改设备建筑楼层信息结果"+admEquipments);
  125. }
  126. /**
  127. * 模型修改元空间的建筑楼层信息
  128. */
  129. private void updateIspaceModelInfo(InstanceUrlParam context, AdmModelRel modelRel,AdmFloor floorEntity){
  130. //查询模型下的元空间信息
  131. AdmQueryCriteria criteria = new AdmQueryCriteria();
  132. criteria.setFilters("bimId = "+modelRel.getBimId());
  133. criteria.setFilters("floorId = "+modelRel.getFloorId());
  134. AdmResponse admResponse = iSpaceService.doQuery(context, criteria, AdmISpace.class);
  135. List<AdmISpace> content = (List<AdmISpace>) admResponse.getContent();
  136. if(CollUtil.isEmpty(content)){
  137. return;
  138. }
  139. for (AdmISpace admIspace : content) {
  140. //修改设备的建筑楼层信息
  141. admIspace.setBuildingId(floorEntity.getBuildingId());
  142. admIspace.setFloorId(floorEntity.getId());
  143. }
  144. List<AdmISpace> admEquipments = iSpaceService.doUpdate(context, AdmISpace.class, content);
  145. log.info("模型修改元空间的建筑楼层信息结果"+admEquipments);
  146. }
  147. /**
  148. * 判断点是否在面中
  149. * @return
  150. */
  151. private Boolean isPointInPolygon(List<AdmEquipment> equipments,AdmFloor floor){
  152. if(CollUtil.isEmpty(equipments)){
  153. return false;
  154. }
  155. Boolean flag = true;
  156. //楼层轮廓线
  157. List<ObjectNode> outline = floor.getOutline();
  158. for (AdmEquipment equipment : equipments) {
  159. //设备BIM坐标
  160. String bimLocation = equipment.getBimLocation();
  161. //判断点是否在面中:即设备位置是否在该楼层轮廓线中
  162. if(StringUtils.isEmpty(bimLocation)){
  163. continue;
  164. }
  165. String[] split = bimLocation.split(",");
  166. ObjectNode node = JsonNodeFactory.instance.objectNode();
  167. node.put("X",split[0]);
  168. node.put("Y",split[1]);
  169. node.put("Z",split[2]);
  170. flag = GeoToolsUtil.isPointInPoly(node,outline);
  171. if(!flag){
  172. return flag;
  173. }
  174. }
  175. return flag;
  176. }
  177. /**
  178. * 楼层属性修改
  179. * @param floorMapStr
  180. * @param floorEntity
  181. */
  182. private void updateFloorMap(String floorMapStr,AdmFloor floorEntity){
  183. if(StringUtils.isEmpty(floorMapStr)){
  184. return;
  185. }
  186. Map<String, Object> floorMap = JSONObject.toJavaObject(JSON.parseObject(floorMapStr), Map.class);
  187. Map<String, Object> infos = floorEntity.getInfos();
  188. for(Map.Entry<String,Object> map : floorMap.entrySet()){
  189. infos.put(map.getKey(),map.getValue());
  190. }
  191. floorEntity.setInfos(infos);
  192. }
  193. /**
  194. * 处理楼层标高
  195. * @param floorMapStr
  196. * @param floorEntity
  197. */
  198. private void updateFloorElevation(String floorMapStr,AdmFloor floorEntity){
  199. if(StringUtils.isEmpty(floorMapStr)){
  200. return;
  201. }
  202. Map<String, Object> floorMap = JSONObject.toJavaObject(JSON.parseObject(floorMapStr), Map.class);
  203. Map<String, Object> infos = floorEntity.getInfos();
  204. if(floorMap.containsKey(AdmCommonConstant.FLOOR_ELEVATION)){
  205. Object object = floorMap.get(AdmCommonConstant.FLOOR_ELEVATION);
  206. if(object != null){
  207. double floorElevation = (Double) object / 1000;
  208. infos.put(AdmCommonConstant.FLOOR_ELEVATION,floorElevation);
  209. }
  210. }
  211. }
  212. /**
  213. * 根据模型id重置设备元空间的建筑楼层信息
  214. * @param context
  215. * @param vo
  216. */
  217. private void resetEquipIspaceInfo(InstanceUrlParam context, AdmModelRel vo){
  218. //重置历史设备的建筑楼层信息
  219. List<AdmEquipment> admEquipments = queryEquipmentByBimId(context, vo);
  220. if(CollUtil.isNotEmpty(admEquipments)){
  221. admEquipments.forEach(item->{
  222. item.setFloorId(null);
  223. item.setBuildingId(null);
  224. });
  225. }
  226. equipmentService.doUpdate(context,AdmEquipment.class,admEquipments);
  227. //重置历史元空间的建筑楼层信息
  228. List<AdmISpace> admISpaces = queryIspaceByBimId(context, vo);
  229. if(CollUtil.isNotEmpty(admISpaces)){
  230. admISpaces.forEach(item->{
  231. item.setFloorId(null);
  232. item.setBuildingId(null);
  233. });
  234. }
  235. iSpaceService.doUpdate(context,AdmISpace.class,admISpaces);
  236. }
  237. /**
  238. * 查询设备信息
  239. * @param context
  240. * @param modelRel
  241. */
  242. private List<AdmEquipment> queryModelEquip(InstanceUrlParam context, AdmModelRel modelRel){
  243. //查询模型下的设备信息
  244. AdmQueryCriteria criteria = new AdmQueryCriteria();
  245. criteria.setFilters("bimId = '"+modelRel.getBimId()+"'");
  246. criteria.setFilters("floorId = '"+modelRel.getFloorId()+"'");
  247. AdmResponse admResponse = equipmentService.doQuery(context, criteria, AdmEquipment.class);
  248. if(CollUtil.isEmpty(admResponse.getContent())){
  249. return new ArrayList<>();
  250. }
  251. return (List<AdmEquipment>) admResponse.getContent();
  252. }
  253. /**
  254. * 根据BIMID查询历史设备信息
  255. */
  256. private List<AdmEquipment> queryEquipmentByBimId(InstanceUrlParam context, AdmModelRel vo){
  257. AdmQueryCriteria criteria = new AdmQueryCriteria();
  258. criteria.setFilters("bimId = '"+vo.getOldBimId()+"'");
  259. AdmResponse admResponse = equipmentService.doQuery(context, criteria, AdmEquipment.class);
  260. return (List<AdmEquipment>)admResponse.getContent();
  261. }
  262. /**
  263. * 根据BIMID查询历史元空间信息
  264. */
  265. private List<AdmISpace> queryIspaceByBimId(InstanceUrlParam context, AdmModelRel vo){
  266. AdmQueryCriteria criteria = new AdmQueryCriteria();
  267. criteria.setFilters("bimId = '"+vo.getOldBimId()+"'");
  268. AdmResponse admResponse = iSpaceService.doQuery(context, criteria, AdmISpace.class);
  269. return (List<AdmISpace>)admResponse.getContent();
  270. }
  271. /**
  272. * 查询模型文件是否有楼层在使用
  273. */
  274. private List<AdmFloor> queryFloorEntity(InstanceUrlParam context, AdmModelRel vo){
  275. AdmQueryCriteria criteria = new AdmQueryCriteria();
  276. if(StringUtils.isNotEmpty(vo.getModelId())){
  277. criteria.setFilters("modelId = '"+vo.getModelId()+"'");
  278. }
  279. if(StringUtils.isNotEmpty(vo.getFloorId())){
  280. criteria.setFilters("id = '"+vo.getFloorId()+"'");
  281. }
  282. AdmResponse admResponse = floorService.doQuery(context, criteria, AdmFloor.class);
  283. return (List<AdmFloor>)admResponse.getContent();
  284. }
  285. /**
  286. * 获取楼层查询类型
  287. * @param floorList
  288. */
  289. private List<String> getFloorQueryTypes(List<AdmFloor> floorList){
  290. List<String> types = new ArrayList<>();
  291. for (AdmFloor admFloor : floorList) {
  292. if(CollUtil.isNotEmpty(admFloor.getOutline())){
  293. types.add("eq2fl");
  294. types.add("fl2sp");
  295. types.add("bd2sp");
  296. }
  297. types.add(AdmRelationTypeEnum.EQ2SP_IN.getRelCode());
  298. types.add(AdmRelationTypeEnum.EQ2EQ_ACAIRNETWORK_2.getRelCode());
  299. types.add(AdmRelationTypeEnum.EQ2EQ_CONDWATERNETWORK_1.getRelCode());
  300. types.add(AdmRelationTypeEnum.EQ2EQ_VENTNETWORK_2.getRelCode());
  301. types.add(AdmRelationTypeEnum.EQ2EQ_ACAIRNETWORK_3.getRelCode());
  302. types.add(AdmRelationTypeEnum.EQ2EQ_HEATWATERLOOP_4.getRelCode());
  303. types.add(AdmRelationTypeEnum.EQ2EQ_HEATWATERLOOP_1.getRelCode());
  304. types.add(AdmRelationTypeEnum.EQ2EQ_DHWNETWORK_1.getRelCode());
  305. types.add(AdmRelationTypeEnum.EQ2EQ_RECYCLEWATERNETWORK_1.getRelCode());
  306. types.add(AdmRelationTypeEnum.EQ2EQ_FIREVENTNETWORK_1.getRelCode());
  307. types.add(AdmRelationTypeEnum.EQ2EQ_FIREWATERNETWORK_1.getRelCode());
  308. types.add(AdmRelationTypeEnum.EQ2EQ_VRFNETWORK_1.getRelCode());
  309. types.add(AdmRelationTypeEnum.EQ2EQ_CHILLWATERLOOP_2.getRelCode());
  310. types.add(AdmRelationTypeEnum.EQ2EQFRESHAIRNETWORK_1.getRelCode());
  311. types.add(AdmRelationTypeEnum.EQ2EQ_CHILLWATERLOOP_1.getRelCode());
  312. types.add(AdmRelationTypeEnum.EQ2EQ_DRINKINGWATERNETWORK_1.getRelCode());
  313. types.add(AdmRelationTypeEnum.EQ2EQ_COOLINGWATERLOOP_2.getRelCode());
  314. types.add(AdmRelationTypeEnum.EQ2EQ_VENTNETWORK_1.getRelCode());
  315. types.add(AdmRelationTypeEnum.EQ2EQ_HEATWATERLOOP_2.getRelCode());
  316. types.add(AdmRelationTypeEnum.EQ2EQ_COOLINGWATERLOOP_1.getRelCode());
  317. types.add(AdmRelationTypeEnum.EQ2EQ_ACAIRNETWORK_1.getRelCode());
  318. types.add(AdmRelationTypeEnum.EQ2EQ_SUPPLYWATERNETWORK_1.getRelCode());
  319. types.add(AdmRelationTypeEnum.EQ2EQ_DRAININGWATERNETWORK_1.getRelCode());
  320. }
  321. return types;
  322. }
  323. }