|
@@ -1,24 +1,336 @@
|
|
|
package com.persagy.proxy.adm.service.impl;
|
|
|
|
|
|
+import cn.hutool.core.collection.CollUtil;
|
|
|
+import cn.hutool.core.util.StrUtil;
|
|
|
+import cn.hutool.json.JSONUtil;
|
|
|
+import com.alibaba.fastjson.JSON;
|
|
|
+import com.alibaba.fastjson.JSONArray;
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
|
|
+import com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
import com.fasterxml.jackson.databind.node.ArrayNode;
|
|
|
import com.fasterxml.jackson.databind.node.JsonNodeFactory;
|
|
|
import com.fasterxml.jackson.databind.node.ObjectNode;
|
|
|
import com.persagy.dmp.basic.model.QueryCriteria;
|
|
|
-import com.persagy.proxy.adm.model.AdmBuilding;
|
|
|
-import com.persagy.proxy.adm.model.AdmSpace;
|
|
|
+import com.persagy.dmp.common.model.entity.BaseEntity;
|
|
|
+import com.persagy.dmp.define.entity.ObjectTypeDefine;
|
|
|
+import com.persagy.proxy.adm.model.*;
|
|
|
import com.persagy.proxy.adm.request.AdmQueryCriteria;
|
|
|
import com.persagy.proxy.adm.request.AdmResponse;
|
|
|
import com.persagy.proxy.adm.service.IAdmSpaceService;
|
|
|
+import com.persagy.proxy.common.client.DmpRwdClient;
|
|
|
+import com.persagy.proxy.common.entity.DmpResult;
|
|
|
import com.persagy.proxy.common.entity.InstanceUrlParam;
|
|
|
+import com.persagy.proxy.common.entity.ObjRelationDTO;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
+import java.util.*;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
/**
|
|
|
* ADM 空间 实现类
|
|
|
* @author lvxy
|
|
|
* @date 2021/8/18
|
|
|
*/
|
|
|
+@Slf4j
|
|
|
@Service
|
|
|
public class AdmSpaceServiceImpl extends AbstractAdmBaseServiceImpl<AdmSpace> implements IAdmSpaceService {
|
|
|
+ @Autowired
|
|
|
+ private DmpRwdClient rwdClient;
|
|
|
+ @Autowired
|
|
|
+ private ObjectMapper objectMapper;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<AdmSpace> doInsertExt(InstanceUrlParam context, Class<AdmSpace> clazz, List<AdmSpace> voList) {
|
|
|
+ Map<String, AdmSpace> spaceIdMap = CollUtil.fieldValueMap(voList, BaseEntity.PROP_ID);
|
|
|
+ //key spid, value floorId
|
|
|
+ Map<String, String> spId2FlId_map = voList.stream().filter(admSpace -> StrUtil.isNotEmpty(admSpace.getFloorId())).collect(Collectors.toMap(AdmSpace::getId,AdmSpace::getFloorId));
|
|
|
+ //查询空间中floorId 对应的flool
|
|
|
+ DmpResult<JSONArray> floors = queryFloors(context, spId2FlId_map);
|
|
|
+ ArrayList<AdmFloor> floorList = CollUtil.newArrayList(JSONUtil.toList(floors.getData().toString(),AdmFloor.class));
|
|
|
+ //space.height = floor.infos.height
|
|
|
+ List<AdmSpace> vos = processHeight(spaceIdMap, floorList, spId2FlId_map);
|
|
|
+ //插入空间
|
|
|
+ List<AdmSpace> vosR = doInsert(context, clazz, vos);
|
|
|
+ //添加绑定关系
|
|
|
+ DmpResult<List<ObjRelationDTO>> dmpResult = processRelations(context, vosR);
|
|
|
+ //处理关系标记
|
|
|
+ //TODO 处理关系标记
|
|
|
+ //processRelationType();
|
|
|
+ return doInsert(context, clazz, vosR);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<AdmSpace> doUpdateExt(InstanceUrlParam context, Class<AdmSpace> clazz, List<AdmSpace> voList) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<AdmSpace> doUpdateFloorORBuilding(InstanceUrlParam context, List<AdmUpDataFloorAndBuildingRequests> voList) {
|
|
|
+
|
|
|
+ voList.stream().forEach(requestData -> {
|
|
|
+
|
|
|
+ });
|
|
|
+
|
|
|
+ //根据id查询对象集合
|
|
|
+ //处理关系
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<AdmSpace> doUpdateOutline(InstanceUrlParam context, Class<AdmSpace> clazz, List<AdmSpace> voList) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void doDeleteExt(InstanceUrlParam context, List<AdmSpace> voList) {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public AdmResponse doQueryType(InstanceUrlParam context, AdmDCSQueryRequest request) {
|
|
|
+ //查询定义类型
|
|
|
+ DmpResult<JSONArray> resultDef = queryDefineType(context);
|
|
|
+ List<JSONObject> defineList = null;
|
|
|
+ if(resultDef.getResult().equals(DmpResult.SUCCESS)){
|
|
|
+ defineList = JSONUtil.toList(resultDef.getData().toString(), JSONObject.class);
|
|
|
+ //获取实际空间对象的数量
|
|
|
+ Map<String, JSONObject> classCodeMap = CollUtil.fieldValueMap(defineList, "code");
|
|
|
+ if(StrUtil.isNotEmpty(request.getFloorId())){
|
|
|
+ //根据classCode floorId 查询查询实际存在的空间
|
|
|
+ //根据floorId查询关系 Fl2Sp
|
|
|
+ DmpResult<List<ObjRelationDTO>> relationDmpResult = queryRelationByFloorId(context, "Fl2Sp", request.getFloorId());
|
|
|
+ //根据关系查询结果中的spaceId查询存在的空间数量
|
|
|
+ Map<String, ObjRelationDTO> relationMap = new HashMap<>(16);
|
|
|
+ if(CollUtil.isEmpty(relationDmpResult.getData())){
|
|
|
+ relationMap = CollUtil.fieldValueMap(relationDmpResult.getData(), "objTo");
|
|
|
+ }
|
|
|
+ transTo(context, defineList, relationMap.keySet());
|
|
|
+ }
|
|
|
+ // 设置返回值
|
|
|
+ AdmResponse response = AdmResponse.success(defineList);
|
|
|
+ Long total = resultDef.getCount() == null ? null : resultDef.getCount().longValue();
|
|
|
+ response.setTotal(total);
|
|
|
+ return response;
|
|
|
+ }else{
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public AdmResponse doQuerySpaces(InstanceUrlParam context, AdmQueryCriteria request, Class<AdmSpace> clazz) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询空间flooId对应的infos中height存在的 flool
|
|
|
+ * @param context
|
|
|
+ * @param spId2FlId_map
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private DmpResult<JSONArray> queryFloors(InstanceUrlParam context, Map<String, String> spId2FlId_map){
|
|
|
+ QueryCriteria criteriaObject = new QueryCriteria();
|
|
|
+ ObjectNode criteriaPe = JsonNodeFactory.instance.objectNode();
|
|
|
+ ArrayNode array = criteriaPe.putObject("id").putArray("$in");
|
|
|
+ spId2FlId_map.values().forEach(floorId -> array.add(floorId));
|
|
|
+ criteriaPe.put("classCode", "floor");
|
|
|
+ criteriaPe.put("objType", "floor");
|
|
|
+
|
|
|
+ JSONObject height = new JSONObject();
|
|
|
+ height.put("$gt", 0f);
|
|
|
+ criteriaPe.putPOJO("height", height);
|
|
|
+
|
|
|
+ criteriaObject.setCriteria(criteriaPe);
|
|
|
+ criteriaObject.setSize(spId2FlId_map.size() * 1L);
|
|
|
+ criteriaObject.setPage(1L);
|
|
|
+ criteriaObject.setWithoutCount(true);
|
|
|
+ // 转换参数
|
|
|
+ JSONObject paraPe = null;
|
|
|
+ try {
|
|
|
+ String paraStr = objectMapper.writeValueAsString(criteriaObject);
|
|
|
+ paraPe = JSONObject.parseObject(paraStr);
|
|
|
+ } catch (JsonProcessingException e) {
|
|
|
+ log.error(e.getMessage(), e);
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ return rwdClient.queryObject(context, paraPe);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * space.height = floor.infos.height
|
|
|
+ * @param spaceIdMap
|
|
|
+ * @param floorList
|
|
|
+ * @param spId2FlId_map
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private List<AdmSpace> processHeight(Map<String, AdmSpace> spaceIdMap, List<AdmFloor> floorList, Map<String, String> spId2FlId_map){
|
|
|
+ Map<String, String> newMap = spId2FlId_map.entrySet().stream().collect(Collectors.toMap(entry -> entry.getValue(), entry -> entry.getKey()));
|
|
|
+ floorList.forEach(admFloor -> {
|
|
|
+ if(CollUtil.isNotEmpty(admFloor.getInfos())){
|
|
|
+ Float height = (Float) admFloor.getInfos().get("height");
|
|
|
+ AdmSpace admSpace = spaceIdMap.get(newMap.get(admFloor.getId()));
|
|
|
+ admSpace.setHeight(height);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ return (List<AdmSpace>) spaceIdMap.values();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 添加绑定关系
|
|
|
+ */
|
|
|
+ private DmpResult<List<ObjRelationDTO>> processRelations(InstanceUrlParam context, List<AdmSpace> vosR){
|
|
|
+ if(CollUtil.isNotEmpty(vosR)){
|
|
|
+ JSONArray jsonArray = new JSONArray();
|
|
|
+ vosR.forEach(admSpace -> {
|
|
|
+ JSONObject requestData = new JSONObject();
|
|
|
+ if (StrUtil.isNotEmpty(admSpace.getBuildingId())) {
|
|
|
+ addXParam("Bd2Sp", admSpace.getBuildingId(), admSpace.getId(), requestData);
|
|
|
+ addCommParam(context, requestData);
|
|
|
+ jsonArray.add(requestData);
|
|
|
+ }
|
|
|
+ if (StrUtil.isNotEmpty(admSpace.getFloorId())) {
|
|
|
+ addXParam("Fl2Sp", admSpace.getFloorId(), admSpace.getId(), requestData);
|
|
|
+ addCommParam(context, requestData);
|
|
|
+ jsonArray.add(requestData);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ DmpResult<List<ObjRelationDTO>> dmpResult = rwdClient.createObjRelations(context,jsonArray);
|
|
|
+ return dmpResult;
|
|
|
+ }else{
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private JSONObject addXParam(String relCode, String masterObjType, String slaveObjType, JSONObject requestData){
|
|
|
+ requestData.put("relCode", "Bd2Sp");
|
|
|
+ requestData.put("masterObjType", masterObjType);
|
|
|
+ requestData.put("slaveObjType", slaveObjType);
|
|
|
+ return requestData;
|
|
|
+ }
|
|
|
+
|
|
|
+ private JSONObject addCommParam(InstanceUrlParam context, JSONObject requestData){
|
|
|
+ requestData.put("sign", 1);
|
|
|
+ requestData.put("graphCode", context.getGroupCode());
|
|
|
+ requestData.put("projectId", context.getProjectId());
|
|
|
+ return requestData;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * TODO 处理关系标记
|
|
|
+ */
|
|
|
+ private void processRelationType(InstanceUrlParam context, List<AdmSpace> vosR){
|
|
|
+ String[] relationTypes = {"sp2sp_SpaceNeighborhood_5", "sp2sp_TrafficNetwork_1", "sp2sp_ConvectionNetwork_1", "sp2sp_RadiationNetwork_1"};
|
|
|
+ List<String> listtype = Arrays.asList(relationTypes);
|
|
|
+ JSONArray jsonArray = new JSONArray();
|
|
|
+ listtype.forEach(type -> {
|
|
|
+ JSONObject relationProjectCal = new JSONObject();
|
|
|
+ addCommParam(context, relationProjectCal);
|
|
|
+ //relationProjectCal.put("");
|
|
|
+
|
|
|
+ });
|
|
|
+ String relationType = "eq2sp_in";
|
|
|
+ /**
|
|
|
+ * val relationType = relationTypeProjectservice.select(SFilter.eq("projectId", projectId!!), SFilter.eq("relationType", "eq2sp_in"),SFilter.eq("zoneType", zoneSpace.classCode!!)).entity()
|
|
|
+ * if (relationType!=null){
|
|
|
+ * relationType.computationalState = 2
|
|
|
+ * relationTypeProjectservice.update(relationType)
|
|
|
+ * }
|
|
|
+ */
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 清楚和空间关联的数据
|
|
|
+ */
|
|
|
+ private void deleteRelation(InstanceUrlParam context, String relCode, String ObjType){
|
|
|
+ }
|
|
|
+
|
|
|
+ /** 根据floorId查询关系 Fl2Sp
|
|
|
+ * @return*/
|
|
|
+ private DmpResult<List<ObjRelationDTO>> queryRelationByFloorId(InstanceUrlParam context, String relCode, String objFrom){
|
|
|
+ QueryCriteria dmpRequest = new QueryCriteria();
|
|
|
+ ObjectNode criteria = JsonNodeFactory.instance.objectNode();
|
|
|
+ criteria.put("relCode", relCode);
|
|
|
+ if(StrUtil.isNotEmpty(objFrom)){
|
|
|
+ criteria.put("objFrom", objFrom);
|
|
|
+ }
|
|
|
+ dmpRequest.setCriteria(criteria);
|
|
|
+ dmpRequest.setPage(1L);
|
|
|
+ dmpRequest.setWithoutCount(true);
|
|
|
+ // 转换参数
|
|
|
+ JSONObject paraRel = null;
|
|
|
+ try {
|
|
|
+ String paraStr = objectMapper.writeValueAsString(dmpRequest);
|
|
|
+ paraRel = JSONObject.parseObject(paraStr);
|
|
|
+ } catch (JsonProcessingException e) {
|
|
|
+ log.error(e.getMessage(), e);
|
|
|
+ }
|
|
|
+ return rwdClient.queryRelation(context, dmpRequest);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 转换为目标实体,并增加属性
|
|
|
+ */
|
|
|
+ private void transTo(InstanceUrlParam context, List<JSONObject> defineList, Set<String> relations){
|
|
|
+ boolean needCount = true;
|
|
|
+ defineList.stream().forEach(defineType -> {
|
|
|
+ //查询空间数量
|
|
|
+ int count = needCount ? countSpace(context, defineType.getString("code"), relations) : 0;
|
|
|
+ defineType.put("count", count);
|
|
|
+ defineType.put("projectId", context.getProjectId());
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询存在空间的数量
|
|
|
+ * @param context
|
|
|
+ * @param classCode
|
|
|
+ * @param spaceIds
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private int countSpace(InstanceUrlParam context, String classCode, Set<String> spaceIds){
|
|
|
+ QueryCriteria rwdQueryCriteria = new QueryCriteria();
|
|
|
+ ObjectNode rwdCriteria = JsonNodeFactory.instance.objectNode();
|
|
|
+ ArrayNode arrayIds = rwdCriteria.putObject("id").putArray("$in");
|
|
|
+ spaceIds.forEach(spaceId -> arrayIds.add(spaceId));
|
|
|
+ rwdCriteria.put("objType", "space");
|
|
|
+ rwdCriteria.put("classCode", classCode);
|
|
|
+ rwdQueryCriteria.setCriteria(rwdCriteria);
|
|
|
+ rwdQueryCriteria.setOnlyCount(true);
|
|
|
+ // 转换参数
|
|
|
+ JSONObject paraRel = null;
|
|
|
+ try {
|
|
|
+ String paraStr = objectMapper.writeValueAsString(rwdQueryCriteria);
|
|
|
+ paraRel = JSONObject.parseObject(paraStr);
|
|
|
+ } catch (JsonProcessingException e) {
|
|
|
+ log.error(e.getMessage(), e);
|
|
|
+ }
|
|
|
+ return rwdClient.queryObject(context, paraRel).getCount();
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ private DmpResult<JSONArray> queryDefineType(InstanceUrlParam context){
|
|
|
+ QueryCriteria criteriaObject = new QueryCriteria();
|
|
|
+ ObjectNode criteriaEq = JsonNodeFactory.instance.objectNode();
|
|
|
+ criteriaEq.put("parentCode", "space");
|
|
|
+ JSONObject paraPe = null;
|
|
|
+ try {
|
|
|
+ String paraStr = objectMapper.writeValueAsString(criteriaObject);
|
|
|
+ paraPe = JSONObject.parseObject(paraStr);
|
|
|
+ } catch (JsonProcessingException e) {
|
|
|
+ throw new RuntimeException("查询公共定义的空间类型,转换查询条件出错:" + e.getMessage());
|
|
|
+ }
|
|
|
+ return rwdClient.queryDefClass(context, paraPe);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
}
|