AdmSpaceServiceImpl.java 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411
  1. package com.persagy.proxy.adm.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.JsonNode;
  9. import com.fasterxml.jackson.databind.ObjectMapper;
  10. import com.fasterxml.jackson.databind.node.ArrayNode;
  11. import com.fasterxml.jackson.databind.node.JsonNodeFactory;
  12. import com.fasterxml.jackson.databind.node.ObjectNode;
  13. import com.persagy.dmp.basic.model.QueryCriteria;
  14. import com.persagy.dmp.basic.utils.JsonNodeUtils;
  15. import com.persagy.dmp.common.model.entity.BaseEntity;
  16. import com.persagy.dmp.define.entity.ObjectTypeDefine;
  17. import com.persagy.proxy.adm.model.*;
  18. import com.persagy.proxy.adm.request.AdmQueryCriteria;
  19. import com.persagy.proxy.adm.request.AdmResponse;
  20. import com.persagy.proxy.adm.service.IAdmSpaceService;
  21. import com.persagy.proxy.common.client.DmpRwdClient;
  22. import com.persagy.proxy.common.entity.DmpResult;
  23. import com.persagy.proxy.common.entity.InstanceUrlParam;
  24. import com.persagy.proxy.common.entity.ObjRelationDTO;
  25. import lombok.extern.slf4j.Slf4j;
  26. import org.apache.poi.ss.formula.functions.T;
  27. import org.springframework.beans.factory.annotation.Autowired;
  28. import org.springframework.stereotype.Service;
  29. import java.util.*;
  30. import java.util.stream.Collectors;
  31. /**
  32. * ADM 空间 实现类
  33. * @author lvxy
  34. * @date 2021/8/18
  35. */
  36. @Slf4j
  37. @Service
  38. public class AdmSpaceServiceImpl extends AbstractAdmBaseServiceImpl<AdmSpace> implements IAdmSpaceService {
  39. @Autowired
  40. private DmpRwdClient rwdClient;
  41. @Autowired
  42. private ObjectMapper objectMapper;
  43. @Override
  44. public List<AdmSpace> doInsertExt(InstanceUrlParam context, Class<AdmSpace> clazz, List<AdmSpace> voList) {
  45. Map<String, AdmSpace> spaceIdMap = CollUtil.fieldValueMap(voList, BaseEntity.PROP_ID);
  46. //key spid, value floorId
  47. Map<String, String> spId2FlId_map = voList.stream().filter(admSpace -> StrUtil.isNotEmpty(admSpace.getFloorId())).collect(Collectors.toMap(AdmSpace::getId,AdmSpace::getFloorId));
  48. //查询空间中floorId 对应的flool
  49. DmpResult<JSONArray> floors = queryFloors(context, spId2FlId_map);
  50. ArrayList<AdmFloor> floorList = CollUtil.newArrayList(JSONUtil.toList(floors.getData().toString(),AdmFloor.class));
  51. //space.height = floor.infos.height
  52. List<AdmSpace> vos = processHeight(spaceIdMap, floorList, spId2FlId_map);
  53. //插入空间
  54. List<AdmSpace> vosR = doInsert(context, clazz, vos);
  55. //添加绑定关系
  56. DmpResult<List<ObjRelationDTO>> dmpResult = processRelations(context, vosR);
  57. //处理关系标记
  58. //TODO 处理关系标记
  59. //processRelationType();
  60. return doInsert(context, clazz, vosR);
  61. }
  62. @Override
  63. public List<AdmSpace> doUpdateExt(InstanceUrlParam context, Class<AdmSpace> clazz, List<AdmSpace> voList) {
  64. return null;
  65. }
  66. @Override
  67. public List<AdmSpace> doUpdateFloorORBuilding(InstanceUrlParam context, List<AdmUpDataFloorAndBuildingRequests> voList) {
  68. voList.stream().forEach(requestData -> {
  69. });
  70. //根据id查询对象集合
  71. //处理关系
  72. return null;
  73. }
  74. @Override
  75. public List<AdmSpace> doUpdateOutline(InstanceUrlParam context, Class<AdmSpace> clazz, List<AdmSpace> voList) {
  76. return null;
  77. }
  78. @Override
  79. public void doDeleteExt(InstanceUrlParam context, List<AdmSpace> voList) {
  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. return null;
  105. }
  106. /**
  107. * 空间的类型是根据项目自定义的
  108. * 参见中心
  109. * @Select("SELECT s.object_type as type,d.name FROM zone_space_base s
  110. * LEFT JOIN dict.dict_space_project d ON s.object_type = d.id WHERE s.project_id = #{projectId} AND d.project_id = #{projectId}
  111. * GROUP BY object_type, d.name")
  112. * @param context
  113. * @return
  114. */
  115. @Override
  116. public List<JSONObject> doQuerySpaceTypes(InstanceUrlParam context) {
  117. //根据项目id查询空间类型
  118. Map<String, String> codeNameMap = queryProjectDefineType(context);
  119. if(CollUtil.isNotEmpty(codeNameMap)){
  120. //查询object
  121. JSONArray demObjs = queryAndDealObjs(context, codeNameMap.keySet());
  122. if(CollUtil.isNotEmpty(demObjs)){
  123. List<AdmSpace> spaceList = JSONArray.parseArray(JSONUtil.toJsonStr(demObjs), AdmSpace.class);
  124. Set<String> classCodes = spaceList.stream().map(space -> space.getClassCode()).collect(Collectors.toSet());
  125. if(CollUtil.isNotEmpty(classCodes)){
  126. codeNameMap.keySet().removeIf(code -> !classCodes.contains(code));
  127. }
  128. }
  129. }
  130. if(CollUtil.isNotEmpty(codeNameMap)){
  131. List<JSONObject> list = new ArrayList<>(codeNameMap.size());
  132. codeNameMap.keySet().stream().forEach(code ->{
  133. JSONObject jsonObject = new JSONObject();
  134. jsonObject.put("name",codeNameMap.get(code));
  135. jsonObject.put("code",code);
  136. list.add(jsonObject);
  137. });
  138. return list;
  139. }else{
  140. return null;
  141. }
  142. }
  143. private DmpResult<JSONArray> queryObj(InstanceUrlParam context, QueryCriteria criteriaObject){
  144. JSONObject paraPe = null;
  145. try {
  146. String paraStr = objectMapper.writeValueAsString(criteriaObject);
  147. paraPe = JSONObject.parseObject(paraStr);
  148. } catch (JsonProcessingException e) {
  149. throw new RuntimeException("转换查询条件出错:" + e.getMessage());
  150. }
  151. return rwdClient.queryObject(context, paraPe);
  152. }
  153. private JSONArray queryAndDealObjs(InstanceUrlParam context, Set<String> codes){
  154. QueryCriteria criteriaObject = new QueryCriteria();
  155. ObjectNode criteriaEq = JsonNodeFactory.instance.objectNode();
  156. ArrayNode array = criteriaEq.putObject("classCode").putArray("$in");
  157. codes.forEach(code -> array.add(code));
  158. criteriaEq.put("objType", "space");
  159. criteriaObject.setSize(1000L);
  160. criteriaObject.setPage(1L);
  161. criteriaObject.setCriteria(criteriaEq);
  162. DmpResult<JSONArray> dmpResult = queryObj(context, criteriaObject);
  163. if(CollUtil.isEmpty(dmpResult.getData())){
  164. return null;
  165. }
  166. JSONArray demObjs = dmpResult.getData();
  167. if(dmpResult.getCount() > criteriaObject.getSize()){
  168. for(int page = 2; page < dmpResult.getCount()/criteriaObject.getSize()+1; page++){
  169. criteriaObject.setPage(page*1L);
  170. demObjs.addAll(queryObj(context, criteriaObject).getData());
  171. }
  172. }
  173. return demObjs;
  174. }
  175. private Map<String, String> queryProjectDefineType(InstanceUrlParam context){
  176. Map<String, String> codeNameMap = null;
  177. ObjectNode criteriaEq = JsonNodeFactory.instance.objectNode();
  178. criteriaEq.put("projectId", context.getProjectId());
  179. criteriaEq.put("objType", "space");
  180. DmpResult<JSONArray> resultDef = queryDefineType(context, criteriaEq);
  181. if(resultDef.getResult().equals(DmpResult.SUCCESS) && CollUtil.isNotEmpty(resultDef.getData())){
  182. List<ObjectTypeDefine> defineList = JSONUtil.toList(resultDef.getData().toString(), ObjectTypeDefine.class);
  183. codeNameMap = defineList.stream().collect(Collectors.toMap(ObjectTypeDefine::getCode, ObjectTypeDefine::getName, (k1,k2)->k1));
  184. }
  185. return codeNameMap;
  186. }
  187. /**
  188. * 查询空间flooId对应的infos中height存在的 flool
  189. * @param context
  190. * @param spId2FlId_map
  191. * @return
  192. */
  193. private DmpResult<JSONArray> queryFloors(InstanceUrlParam context, Map<String, String> spId2FlId_map){
  194. QueryCriteria criteriaObject = new QueryCriteria();
  195. ObjectNode criteriaPe = JsonNodeFactory.instance.objectNode();
  196. ArrayNode array = criteriaPe.putObject("id").putArray("$in");
  197. spId2FlId_map.values().forEach(floorId -> array.add(floorId));
  198. criteriaPe.put("classCode", "floor");
  199. criteriaPe.put("objType", "floor");
  200. JSONObject height = new JSONObject();
  201. height.put("$gt", 0f);
  202. criteriaPe.putPOJO("height", height);
  203. criteriaObject.setCriteria(criteriaPe);
  204. criteriaObject.setSize(spId2FlId_map.size() * 1L);
  205. criteriaObject.setPage(1L);
  206. criteriaObject.setWithoutCount(true);
  207. // 转换参数
  208. JSONObject paraPe = null;
  209. try {
  210. String paraStr = objectMapper.writeValueAsString(criteriaObject);
  211. paraPe = JSONObject.parseObject(paraStr);
  212. } catch (JsonProcessingException e) {
  213. log.error(e.getMessage(), e);
  214. return null;
  215. }
  216. return rwdClient.queryObject(context, paraPe);
  217. }
  218. /**
  219. * space.height = floor.infos.height
  220. * @param spaceIdMap
  221. * @param floorList
  222. * @param spId2FlId_map
  223. * @return
  224. */
  225. private List<AdmSpace> processHeight(Map<String, AdmSpace> spaceIdMap, List<AdmFloor> floorList, Map<String, String> spId2FlId_map){
  226. Map<String, String> newMap = spId2FlId_map.entrySet().stream().collect(Collectors.toMap(entry -> entry.getValue(), entry -> entry.getKey()));
  227. floorList.forEach(admFloor -> {
  228. if(CollUtil.isNotEmpty(admFloor.getInfos())){
  229. Float height = (Float) admFloor.getInfos().get("height");
  230. AdmSpace admSpace = spaceIdMap.get(newMap.get(admFloor.getId()));
  231. admSpace.setHeight(height);
  232. }
  233. });
  234. return (List<AdmSpace>) spaceIdMap.values();
  235. }
  236. /**
  237. * 添加绑定关系
  238. */
  239. private DmpResult<List<ObjRelationDTO>> processRelations(InstanceUrlParam context, List<AdmSpace> vosR){
  240. if(CollUtil.isNotEmpty(vosR)){
  241. JSONArray jsonArray = new JSONArray();
  242. vosR.forEach(admSpace -> {
  243. JSONObject requestData = new JSONObject();
  244. if (StrUtil.isNotEmpty(admSpace.getBuildingId())) {
  245. addXParam("Bd2Sp", admSpace.getBuildingId(), admSpace.getId(), requestData);
  246. addCommParam(context, requestData);
  247. jsonArray.add(requestData);
  248. }
  249. if (StrUtil.isNotEmpty(admSpace.getFloorId())) {
  250. addXParam("Fl2Sp", admSpace.getFloorId(), admSpace.getId(), requestData);
  251. addCommParam(context, requestData);
  252. jsonArray.add(requestData);
  253. }
  254. });
  255. DmpResult<List<ObjRelationDTO>> dmpResult = rwdClient.createObjRelations(context,jsonArray);
  256. return dmpResult;
  257. }else{
  258. return null;
  259. }
  260. }
  261. private JSONObject addXParam(String relCode, String masterObjType, String slaveObjType, JSONObject requestData){
  262. requestData.put("relCode", "Bd2Sp");
  263. requestData.put("masterObjType", masterObjType);
  264. requestData.put("slaveObjType", slaveObjType);
  265. return requestData;
  266. }
  267. private JSONObject addCommParam(InstanceUrlParam context, JSONObject requestData){
  268. requestData.put("sign", 1);
  269. requestData.put("graphCode", context.getGroupCode());
  270. requestData.put("projectId", context.getProjectId());
  271. return requestData;
  272. }
  273. /**
  274. * TODO 处理关系标记
  275. */
  276. private void processRelationType(InstanceUrlParam context, List<AdmSpace> vosR){
  277. String[] relationTypes = {"sp2sp_SpaceNeighborhood_5", "sp2sp_TrafficNetwork_1", "sp2sp_ConvectionNetwork_1", "sp2sp_RadiationNetwork_1"};
  278. List<String> listtype = Arrays.asList(relationTypes);
  279. JSONArray jsonArray = new JSONArray();
  280. listtype.forEach(type -> {
  281. JSONObject relationProjectCal = new JSONObject();
  282. addCommParam(context, relationProjectCal);
  283. //relationProjectCal.put("");
  284. });
  285. String relationType = "eq2sp_in";
  286. /**
  287. * val relationType = relationTypeProjectservice.select(SFilter.eq("projectId", projectId!!), SFilter.eq("relationType", "eq2sp_in"),SFilter.eq("zoneType", zoneSpace.classCode!!)).entity()
  288. * if (relationType!=null){
  289. * relationType.computationalState = 2
  290. * relationTypeProjectservice.update(relationType)
  291. * }
  292. */
  293. }
  294. /**
  295. * 清楚和空间关联的数据
  296. */
  297. private void deleteRelation(InstanceUrlParam context, String relCode, String ObjType){
  298. }
  299. /**
  300. * 转换为目标实体,并增加属性
  301. */
  302. private void assembleDefineTypes(InstanceUrlParam context, List<JSONObject> defineList, String floorId){
  303. boolean needCount = true;
  304. defineList.stream().forEach(defineType -> {
  305. //查询空间数量
  306. int count = needCount ? countSpace(context, defineType.getString("code"), floorId) : 0;
  307. //处理单个对象
  308. assembleDefineObj(defineType, count, context.getProjectId());
  309. });
  310. }
  311. /**
  312. * 单个转换为目标实体,并增加属性
  313. */
  314. private void assembleDefineObj(JSONObject defineType, int count, String projectId){
  315. defineType.put("count", count);
  316. defineType.put("projectId", projectId);
  317. defineType.remove("aliasName");
  318. defineType.remove("aliasCode");
  319. defineType.remove("valid");
  320. defineType.remove("objType");
  321. defineType.remove("groupCode");
  322. defineType.remove("parentCode");
  323. defineType.remove("id");
  324. }
  325. /**
  326. * 查询存在空间的数量
  327. * @param context
  328. * @param classCode
  329. * @param objFrom
  330. * @return
  331. */
  332. private int countSpace(InstanceUrlParam context, String classCode, String objFrom){
  333. QueryCriteria rwdQueryCriteria = new QueryCriteria();
  334. ObjectNode rwdCriteria = JsonNodeFactory.instance.objectNode();
  335. rwdCriteria.put("objType", "space");
  336. rwdCriteria.put("classCode", classCode);
  337. ObjectNode relationTO = JsonNodeFactory.instance.objectNode();
  338. relationTO.put("relCode", "Fl2Sp");
  339. if(StrUtil.isNotEmpty(objFrom)){
  340. relationTO.put("objFrom", objFrom);
  341. }
  342. rwdCriteria.putPOJO("relationTo", relationTO);
  343. rwdQueryCriteria.setCriteria(rwdCriteria);
  344. rwdQueryCriteria.setOnlyCount(true);
  345. // 转换参数
  346. JSONObject paraRel = null;
  347. try {
  348. String paraStr = objectMapper.writeValueAsString(rwdQueryCriteria);
  349. paraRel = JSONObject.parseObject(paraStr);
  350. } catch (JsonProcessingException e) {
  351. log.error(e.getMessage(), e);
  352. }
  353. return rwdClient.queryObject(context, paraRel).getCount();
  354. }
  355. private DmpResult<JSONArray> queryDefineType(InstanceUrlParam context, ObjectNode criteriaEq){
  356. QueryCriteria criteriaObject = new QueryCriteria();
  357. criteriaObject.setCriteria(criteriaEq);
  358. JSONObject paraPe = null;
  359. try {
  360. String paraStr = objectMapper.writeValueAsString(criteriaObject);
  361. paraPe = JSONObject.parseObject(paraStr);
  362. } catch (JsonProcessingException e) {
  363. throw new RuntimeException("查询公共定义的空间类型,转换查询条件出错:" + e.getMessage());
  364. }
  365. return rwdClient.queryDefClass(context, paraPe);
  366. }
  367. }