Quellcode durchsuchen

Merge remote-tracking branch 'origin/develop' into develop

# Conflicts:
#	src/main/java/com/persagy/proxy/adm/constant/AdmRelationTypeEnum.java
#	src/main/java/com/persagy/proxy/adm/service/impl/RelationReportService.java
lijie vor 3 Jahren
Ursprung
Commit
0474494705
26 geänderte Dateien mit 799 neuen und 396 gelöschten Zeilen
  1. 4 3
      src/main/java/com/persagy/proxy/adm/controller/AdmDictController.java
  2. 158 287
      src/main/java/com/persagy/proxy/adm/controller/AdmEquipShaftController.java
  3. 1 18
      src/main/java/com/persagy/proxy/adm/controller/AdmShaftController.java
  4. 1 0
      src/main/java/com/persagy/proxy/adm/controller/ComponentBuildingController.java
  5. 6 11
      src/main/java/com/persagy/proxy/adm/controller/RelationReportController.java
  6. 11 14
      src/main/java/com/persagy/proxy/adm/controller/RelationShInBdController.java
  7. 26 0
      src/main/java/com/persagy/proxy/adm/model/AdmDefFuncIdGather.java
  8. 4 1
      src/main/java/com/persagy/proxy/adm/model/AdmDictQueryCriteria.java
  9. 1 1
      src/main/java/com/persagy/proxy/adm/model/AdmShaft.java
  10. 7 2
      src/main/java/com/persagy/proxy/adm/model/AdmSpace.java
  11. 53 0
      src/main/java/com/persagy/proxy/adm/request/AdmQueryCriteria.java
  12. 2 0
      src/main/java/com/persagy/proxy/adm/service/IAdmBaseService.java
  13. 20 0
      src/main/java/com/persagy/proxy/adm/service/IAdmDictBaseService.java
  14. 15 5
      src/main/java/com/persagy/proxy/adm/service/IAdmDictService.java
  15. 10 0
      src/main/java/com/persagy/proxy/adm/service/IAdmFloorService.java
  16. 37 3
      src/main/java/com/persagy/proxy/adm/service/IAdmSpaceService.java
  17. 19 1
      src/main/java/com/persagy/proxy/adm/service/IRelationReportService.java
  18. 5 2
      src/main/java/com/persagy/proxy/adm/service/impl/AbstractAdmBaseServiceImpl.java
  19. 58 11
      src/main/java/com/persagy/proxy/adm/service/impl/AbstractAdmDictBaseServiceImpl.java
  20. 146 10
      src/main/java/com/persagy/proxy/adm/service/impl/AdmDictServiceImpl.java
  21. 8 0
      src/main/java/com/persagy/proxy/adm/service/impl/AdmFloorServiceImpl.java
  22. 86 1
      src/main/java/com/persagy/proxy/adm/service/impl/AdmSpaceServiceImpl.java
  23. 78 24
      src/main/java/com/persagy/proxy/adm/service/impl/RelationReportService.java
  24. 14 2
      src/main/java/com/persagy/proxy/adm/utils/AdmQueryCriteriaHelper.java
  25. 19 0
      src/main/java/com/persagy/proxy/common/client/DmpRwdClient.java
  26. 10 0
      src/main/java/com/persagy/proxy/common/constant/DmpUrlConstant.java

+ 4 - 3
src/main/java/com/persagy/proxy/adm/controller/AdmDictController.java

@@ -1,6 +1,7 @@
 package com.persagy.proxy.adm.controller;
 
 import cn.hutool.core.collection.CollUtil;
+import com.persagy.dmp.define.entity.ObjectInfoCollect;
 import com.persagy.proxy.adm.constant.AdmCommonConstant;
 import com.persagy.proxy.adm.constant.AdmDictConstant;
 import com.persagy.proxy.adm.constant.enums.AdmDictCategoryEnum;
@@ -88,7 +89,7 @@ public class AdmDictController {
         // 组装上下文条件
         InstanceUrlParam context = AdmContextUtil.toDmpContext();
         request.setName(request.getType());
-        return service.doQueryObjectInfo(context, request, AdmDictConstant.CLASS_CODE, AdmObjectInfo.class);
+        return service.query(context, request, AdmDictConstant.CLASS_CODE, AdmObjectInfo.class);
     }
 
     /**
@@ -151,10 +152,10 @@ public class AdmDictController {
      */
     @PostMapping("/setting-dic-project")
     public AdmResponse settingDicProject(@QueryParam("projectId") String projectId,
-                                 @RequestBody AdmCreateRequest<AdmObjectInfo> request) throws Exception {
+                                 @RequestBody AdmCreateRequest<AdmDefFuncIdGather> request) throws Exception {
         // 组装上下文条件
         InstanceUrlParam context = AdmContextUtil.toDmpContext();
-        return service.settingDicProject(context,request,AdmObjectInfo.class);
+        return service.settingDicProject(context,request, ObjectInfoCollect.class);
     }
 
     /**

+ 158 - 287
src/main/java/com/persagy/proxy/adm/controller/AdmEquipShaftController.java

@@ -1,24 +1,24 @@
 package com.persagy.proxy.adm.controller;
 
 
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.map.MapUtil;
 import cn.hutool.core.text.TextSimilarity;
+import cn.hutool.core.util.BooleanUtil;
 import cn.hutool.core.util.StrUtil;
-import com.alibaba.fastjson.JSONObject;
 import com.fasterxml.jackson.databind.node.JsonNodeFactory;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.persagy.dmp.basic.model.QueryCriteria;
+import com.persagy.dmp.common.model.entity.BaseEntity;
 import com.persagy.dmp.digital.entity.ObjectRelation;
 import com.persagy.proxy.adm.model.*;
 import com.persagy.proxy.adm.model.equip.ShaftSpaceVertical;
-import com.persagy.proxy.adm.model.equip.SpVerticalSp;
 import com.persagy.proxy.adm.request.AdmQueryCriteria;
 import com.persagy.proxy.adm.request.AdmResponse;
 import com.persagy.proxy.adm.service.*;
 import com.persagy.proxy.adm.utils.AdmContextUtil;
 import com.persagy.proxy.common.entity.InstanceUrlParam;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.*;
@@ -35,332 +35,195 @@ public class AdmEquipShaftController {
 
     @Autowired
     private IAdmSystemService systemService;
-
     @Autowired
     private IAdmEquipmentService equipmentService;
-
     @Autowired
     private IAdmShaftService shaftService;
-
-    @Autowired
-    private IAdmBuildingService buildingService;
-
-    @Autowired
-    private IAdmSpVerticalSpService spVerticalSpService;
-
     @Autowired
     private IAdmSpaceService spaceService;
-
     @Autowired
     private IAdmRelationService relationService;
-
     @Autowired
     private IAdmFloorService floorService;
 
-    @Autowired
-    private IAdmDtRelationService dtRelationService;
-
-    @Value("${middleware.group.code}")
-    private String groupCode;
-
     /**
      * 查询没有和当前竖井绑定的系统
-     *
-     * @param param 竖井
+     * @param shaftId
+     * @param request
      */
     @PostMapping("/unshaft-in-sys")
-    public AdmResponse unShaftSys(@RequestBody JSONObject param) {
-        //根据竖井Id,查询系统Id
-        InstanceUrlParam context = AdmContextUtil.toDmpContext();
-        QueryCriteria queryRequest = new QueryCriteria();
-        String shaftId = param.getString("shaftId");
-        ObjectNode criteriaRel = JsonNodeFactory.instance.objectNode();
-        criteriaRel.put("graphCode", "MechInArch");
-        criteriaRel.put("relCode", "Sy2Sh");
-        criteriaRel.put("objTo", shaftId);
-        queryRequest.setCriteria(criteriaRel);
-        List<ObjectRelation> objectRelations = relationService.queryByCondition(context, queryRequest);
-       List<String> sysIds = objectRelations.stream().map(ObjectRelation::getObjFrom).collect(Collectors.toList());
-//        String filter = "id = '" + shaftId + "'";
-//        //根据竖井Id查询竖井
-//        JSONObject request = param.getJSONObject("request");
-//        AdmQueryCriteria criteria = JSONObject.toJavaObject(request, AdmQueryCriteria.class);
-//        criteria.setFilters(filter);
-//        AdmResponse admResponse = shaftService.doQuery(context, criteria, AdmShaft.class);
-//        List<AdmShaft> admShafts = (List<AdmShaft>) admResponse.getContent();
-//        List<String> sysIds = new ArrayList<>();
-//        //获取竖井下的系统
-//        for (AdmShaft admShaft : admShafts) {
-//            List<AdmSystem> systemList = admShaft.getSystemList();
-//            if (!CollectionUtils.isEmpty(systemList)) {
-//                for (AdmSystem admSystem : systemList) {
-//                    sysIds.add(admSystem.getId());
-//                }
-//            }
-//        }
-        JSONObject request = param.getJSONObject("request");
-        AdmQueryCriteria criteria = JSONObject.toJavaObject(request, AdmQueryCriteria.class);
-        //查询全量系统
-        String filter = null;
-        criteria.setFilters(filter);
-        criteria.setName(AdmSystem.OBJ_TYPE);
-        AdmResponse admResponse = systemService.doQuery(context, criteria, AdmSystem.class);
-        List<AdmSystem> admSystems = (List<AdmSystem>) admResponse.getContent();
-        Iterator<AdmSystem> iterator = admSystems.iterator();
-        //去除竖井下的系统
-        while (iterator.hasNext()) {
-            AdmSystem next = iterator.next();
-            if (sysIds.contains(next.getId())) {
-                iterator.remove();
-            }
-        }
-        admResponse.setContent(admSystems);
-        return admResponse;
+    public AdmResponse unShaftSys(@RequestParam String shaftId, @RequestBody AdmQueryCriteria request) {
+        request.setName(AdmSystem.OBJ_TYPE);
+        // 设置关系条件
+        request.resetRelationCond(true, "MechInArch", "Sy2Sh", shaftId, false);
+        return systemService.doQuery(AdmContextUtil.toDmpContext(), request, AdmSystem.class);
     }
 
     /**
      * 查询没有和当前竖井绑定的设备
      */
     @PostMapping(value = "/unshaft-in-eq")
-    public AdmResponse unShaftEq(@RequestBody JSONObject param) {
-        String shaftId = param.getString("shaftId");
-        InstanceUrlParam context = AdmContextUtil.toDmpContext();
-        QueryCriteria queryRequest = new QueryCriteria();
-        ObjectNode criteriaRel = JsonNodeFactory.instance.objectNode();
-        criteriaRel.put("graphCode", "MechInArch");
-        criteriaRel.put("relCode", "Eq2Sh");
-        criteriaRel.put("objTo", shaftId);
-        queryRequest.setCriteria(criteriaRel);
-        List<ObjectRelation> objectRelations = relationService.queryByCondition(context, queryRequest);
-        List<String> equipIds = objectRelations.stream().map(ObjectRelation::getObjFrom).collect(Collectors.toList());
+    public AdmResponse unShaftEq(@RequestParam String shaftId, @RequestBody AdmQueryCriteria request) {
+        request.setName(AdmEquipment.OBJ_TYPE);
+        // 设置关系条件
+        request.resetRelationCond(true, "MechInArch", "Eq2Sh", shaftId, false);
+        // TODO 级别获取设备类别对象未处理,再单独查一次即可
 
-//        String filter = "id = '" + shaftId + "'";
-//        //根据竖井Id查询
-//        JSONObject request = param.getJSONObject("request");
-//        AdmQueryCriteria criteria = JSONObject.toJavaObject(request, AdmQueryCriteria.class);
-//        criteria.setFilters(filter);
-//        AdmResponse admResponse = shaftService.doQuery(context, criteria, AdmShaft.class);
-//        List<AdmShaft> admShafts = (List<AdmShaft>) admResponse.getContent();
-//        List<String> equipIds = new ArrayList<>();
-//        //获取竖井下的设备Id
-//        for (AdmShaft admShaft : admShafts) {
-//            List<AdmEquipment> equipmentList = admShaft.getEquipmentList();
-//            if (!CollectionUtils.isEmpty(equipmentList)) {
-//                for (AdmEquipment equipment : equipmentList) {
-//                    equipIds.add(equipment.getId());
-//                }
-//            }
-//        }
-        //查询所有设备
-        JSONObject request = param.getJSONObject("request");
-        AdmQueryCriteria criteria = JSONObject.toJavaObject(request, AdmQueryCriteria.class);
-        criteria.setFilters(null);
-        criteria.setName(AdmEquipment.OBJ_TYPE);
-        AdmResponse equipments = equipmentService.doQuery(context, criteria, AdmEquipment.class);
-        List<AdmEquipment> admEquipments = (List<AdmEquipment>) equipments.getContent();
-        //去除重复,竖井Id下的设备
-        Iterator<AdmEquipment> iterator = admEquipments.iterator();
-        while (iterator.hasNext()) {
-            AdmEquipment next = iterator.next();
-            if (equipIds.contains(next.getId())) {
-                iterator.remove();
-            }
-        }
-        equipments.setContent(admEquipments);
-        return equipments;
+        return equipmentService.doQuery(AdmContextUtil.toDmpContext(), request, AdmEquipment.class);
     }
 
     /**
      * 查询没有和当前竖井贯通的其它竖井
      */
     @PostMapping(value = "/unshaft-through-shaft")
-    public AdmResponse unShaftThroughShaft(@RequestBody JSONObject param) {
-        InstanceUrlParam context = AdmContextUtil.toDmpContext();
-        String shaftId = param.getString("shaftId");
-        JSONObject request = param.getJSONObject("request");
-
-//        (graphCode = "ThroughRelationship", relCode = "Sh2Sh")
-        QueryCriteria queryRequest = new QueryCriteria();
-        ObjectNode criteriaRel = JsonNodeFactory.instance.objectNode();
-        criteriaRel.put("graphCode", "ThroughRelationship");
-        criteriaRel.put("relCode", "Sh2Sh");
-        criteriaRel.put("objTo", shaftId);
-        queryRequest.setCriteria(criteriaRel);
-        List<ObjectRelation> objectRelations = relationService.queryByCondition(context, queryRequest);
-        List<String> shaftIds = objectRelations.stream().map(ObjectRelation::getObjFrom).collect(Collectors.toList());
-        queryRequest = new QueryCriteria();
-        criteriaRel = JsonNodeFactory.instance.objectNode();
-        criteriaRel.put("graphCode", "ThroughRelationship");
-        criteriaRel.put("relCode", "Sh2Sh");
-        criteriaRel.put("objFrom", shaftId);
-        queryRequest.setCriteria(criteriaRel);
-        List<ObjectRelation> objectRel = relationService.queryByCondition(context, queryRequest);
-        List<String> shaftIdTos = objectRel.stream().map(ObjectRelation::getObjTo).collect(Collectors.toList());
-        shaftIds.addAll(shaftIdTos);
-        shaftIds.add(shaftId);
-
-        AdmQueryCriteria criteria = JSONObject.toJavaObject(request, AdmQueryCriteria.class);
-        criteria.setName(AdmShaft.OBJ_TYPE);
-        AdmResponse admResponse = shaftService.doQuery(context, criteria, AdmShaft.class);
-        List<AdmShaft> admShafts = (List<AdmShaft>) admResponse.getContent();
-        Iterator<AdmShaft> iterator = admShafts.iterator();
-        //去除竖井和竖井Id相同的竖井,一部分是关联数据
-        while (iterator.hasNext()) {
-            AdmShaft admShaft = iterator.next();
-            List<AdmShaft> shaftThroughList = admShaft.getShaftThroughList();
-            if (shaftIds.contains(admShaft.getId())) {
-                iterator.remove();
-                continue;
-            }
-//            for (AdmShaft shaft : shaftThroughList) {
-//                if (shaft.getId().equals(shaftId)) {
-//                    iterator.remove();
-//                    break;
-//                }
-//            }
-        }
-        admResponse.setContent(admShafts);
-        return admResponse;
+    public AdmResponse unShaftThroughShaft(@RequestParam String shaftId, @RequestBody AdmQueryCriteria request) {
+        request.setName(AdmShaft.OBJ_TYPE);
+        // 设置关系条件
+        request.resetRelationCond(true, "ThroughRelationship", "Sh2Sh", shaftId, false);
+        return shaftService.doQuery(AdmContextUtil.toDmpContext(), request, AdmShaft.class);
     }
 
     /**
      * 查询竖井关联的空间垂直交通关系
+     * @param shaftSpaceVertical
      */
     @PostMapping("/shaft-vertical-space")
     public AdmResponse shaftSpaceVertical(@RequestBody ShaftSpaceVertical shaftSpaceVertical) {
+        // 参数校验
         String buildingId = shaftSpaceVertical.getBuildingId();
         String shaftId = shaftSpaceVertical.getShaftId();
         String objectType = shaftSpaceVertical.getObjectType();
         Boolean aiSwitch = shaftSpaceVertical.getAiSwitch();
-        if (StrUtil.isBlank(buildingId) || StrUtil.isBlank(shaftId)) {
-            return AdmResponse.failure("必填项:buildingId(建筑id)、shaftId(竖井Id)");
+        if (StrUtil.isBlank(buildingId) || StrUtil.isBlank(objectType) || StrUtil.isBlank(shaftId)) {
+            return AdmResponse.failure("必填项:buildingId(建筑id)、shaftId(竖井Id)、objectType(空间类型)");
         }
         InstanceUrlParam context = AdmContextUtil.toDmpContext();
-        QueryCriteria queryRequest = new QueryCriteria();
-        ObjectNode criteriaRel = JsonNodeFactory.instance.objectNode();
-        criteriaRel.put("graphCode", "ArchSubset");
-        criteriaRel.put("relCode", "Bd2Fl");
-        criteriaRel.put("objFrom", buildingId);
-        queryRequest.setCriteria(criteriaRel);
-        List<ObjectRelation> objectRelations = relationService.queryByCondition(context, queryRequest);
-//        putString(criteria, "graphCode", anno.graphCode());
-//        putString(criteria, "relCode", anno.relCode());
-//        putString(criteria, "relValue", anno.relValue());
-//        ArrayNode array = criteria.putObject(isSelectTo?"objFrom":"objTo").putArray("$in");
-//        idList.forEach(id -> array.add(id));
-        List<String> floorIds = objectRelations.stream().map(ObjectRelation::getObjTo).collect(Collectors.toList());
-        AdmQueryCriteria criteria = new AdmQueryCriteria();
-        String filter = " id in ('" + StrUtil.join("','", floorIds) + "') ";
-        criteria.setFilters(filter);
-        AdmResponse admBuild = floorService.doQuery(context, criteria, AdmFloor.class);
-        List<AdmFloor> floor = (List<AdmFloor>) admBuild.getContent();
-        //建筑下的楼层
-        AdmResponse admResult = new AdmResponse();
-        if (CollectionUtils.isEmpty(floor)) {
-            return admResult;
+        // 查询建筑下的楼层
+        List<AdmFloor> floors = floorService.queryFloorInBuilding(context, buildingId);
+        AdmResponse response = AdmResponse.success(floors);
+        if(CollUtil.isEmpty(floors)) {
+            return response;
+        }
+        // 查询竖井下的空间
+        List<AdmSpace> spaces = spaceService.querySpaceInShaft(context, shaftId, objectType);
+        if(CollUtil.isEmpty(spaces)) {
+            return response;
         }
-        List<AdmSpace> spaceList = new ArrayList<>();
-        //3 如果开关为true
-        if (aiSwitch) {
-            //1.查询竖井下的空间
-//            and relValue = " + objectType + "
-            filter = "graphCode = 'ArchSubset' and relCode = 'Sh2Sp' and projectId = " + context.getProjectId() + " and objFrom =" + shaftId + " and valid = 1";
-            criteria.setFilters(filter);
-            AdmResponse admResponse = dtRelationService.doQuery(context, criteria, AdmDtRelation.class);
-            List<AdmDtRelation> dtRelations = (List<AdmDtRelation>) admResponse.getContent();
-            List<String> spaceIdss = dtRelations.stream().map(AdmDtRelation::getObj_to).collect(Collectors.toList());
-            filter = " id in ('" + StrUtil.join("','", spaceIdss) + "') ";
-            criteria.setFilters(filter);
-            admResponse= spaceService.doQuery(context,criteria,AdmSpace.class);
-            spaceList = (List<AdmSpace>) admResponse.getContent();
-            //2.排除不在buildingId下的
-            Iterator<AdmSpace> iterator = spaceList.iterator();
-            while (iterator.hasNext()) {
-                AdmSpace admSpace = iterator.next();
-                if (!buildingId.equals(admSpace.getBuildingId())) {
-                    iterator.remove();
+        // 查询楼层下的空间
+        List<String> floorIds = CollUtil.getFieldValues(floors, BaseEntity.PROP_ID, String.class);
+        Map<String, List<String>> floorMap = spaceService.querySpaceMapInFloors(context, floorIds, objectType);
+        if(MapUtil.isEmpty(floorMap)) {
+            return response;
+        }
+        // 计算并收集垂直交通关系
+        groupSpaceToFloor(context, buildingId, floors, spaces, floorMap, objectType, aiSwitch);
+        return response;
+    }
+
+    /**
+     * 按楼层汇总空间信息
+     * @param context
+     * @param buildingId
+     * @param floors
+     * @param spaces
+     * @param floorMap
+     * @param objectType
+     * @param aiSwitch
+     */
+    private void groupSpaceToFloor(InstanceUrlParam context, String buildingId, List<AdmFloor> floors, List<AdmSpace> spaces,
+                                   Map<String, List<String>> floorMap, String objectType, Boolean aiSwitch) {
+        Map<String, AdmSpace> spaceMap = spaces.stream().collect(Collectors.toMap(AdmSpace::getId, space -> space, (k1,k2)->k1));
+        Set<String> spaceIds = spaceMap.keySet();
+        // 如果需要AI:相似度匹配
+        Map<String, List<AdmSpace>> aiSpaceMap = new HashMap<>();
+        Set<String> allIds = CollUtil.newHashSet(spaceIds);
+        if(BooleanUtil.isTrue(aiSwitch)) {
+            // 匹配结果
+            aiSpaceMap = matchingSpaces(context, buildingId, spaces, spaceIds, objectType);
+            // 收集id
+            for(String key:aiSpaceMap.keySet()) {
+                List<AdmSpace> aiSpaces = aiSpaceMap.get(key);
+                if(CollUtil.isEmpty(aiSpaces)) {
+                    continue;
                 }
+                Set<String> aiSpaceIds = aiSpaces.stream().map(AdmSpace::getId).collect(Collectors.toSet());
+                allIds.addAll(aiSpaceIds);
             }
-            List<AdmSpace> copy = spaceList.stream().collect(Collectors.toList());
-
-            List<String> classCodes = spaceList.stream().map(AdmSpace::getClassCode).collect(Collectors.toList());
-            //查询建筑下所有指定类型空间
-            String classCodeStr = "('" + StrUtil.join("','", classCodes) + "') ";
-            //查询空间对象
-            filter = "projectId = " + context.getProjectId() + " and buildingId = " + buildingId + " and classCode in " + classCodeStr + " and valid = 1";
-            criteria.setFilters(filter);
-            AdmResponse admSpaceRes = spaceService.doQuery(context, criteria, AdmSpace.class);
-            List<AdmSpace> spaces = (List<AdmSpace>) admSpaceRes.getContent();
-            for (AdmSpace space : spaces) {
-                boolean flag = false;
-                String localId = space.getLocalId();
-                String localName = space.getLocalName();
-                if (StrUtil.isBlank(localId) || StrUtil.isBlank(localName)) {
-                    for (AdmSpace admSpace : copy) {
-                        admSpace.getLocalId();
-                        admSpace.getLocalName();
-                        //如果名称或id匹配的大于90%
-                        if (TextSimilarity.similar(admSpace.getLocalId(), localId) > 0.9 || TextSimilarity.similar(admSpace.getLocalName(), localName) > 0.9) {
-                            flag = true;
-                            break;
-                        }
-                    }
-                    if (flag) {
-                        spaceList.add(space);
+        }
+        // 查询有垂直交通关系的空间
+        Map<String, Set<String>> trafficMap = spaceService.queryTrafficSpaceMap(context, allIds, objectType);
+        // 组装到Floor中
+        for(AdmFloor floor:floors) {
+            // 获取楼层下的空间
+            List<String> spInFls = floorMap.get(floor.getId());
+            if(CollUtil.isEmpty(spInFls)) {
+                continue;
+            }
+            Set<AdmSpace> spaceList = new HashSet<>();
+            for(String spInFlId:spInFls) {
+                // 取竖井中在本楼层的空间
+                AdmSpace spInSh = spaceMap.get(spInFlId);
+                if(spInSh == null) {
+                    continue;
+                }
+                // 设置垂直交通关系
+                spInSh.setSpaceIdList(trafficMap.get(spInFlId));
+                spaceList.add(spInSh);
+                // 获取此空间匹配的空间
+                List<AdmSpace> matchSpaces = aiSpaceMap.get(spInFlId);
+                if(CollUtil.isEmpty(matchSpaces)) {
+                    continue;
+                }
+                for(AdmSpace matchSpace:matchSpaces) {
+                    if(spaceList.add(matchSpace)) {
+                        // 设置垂直交通关系
+                        matchSpace.setSpaceIdList(trafficMap.get(matchSpace.getId()));
                     }
                 }
             }
-            //4 查询交通关系
-            classCodes = spaceList.stream().map(AdmSpace::getClassCode).collect(Collectors.toList());
-            classCodeStr = "('" + StrUtil.join("','", classCodes) + "') ";
-            filter = "graphCode = TrafficNetwork and projectId = " + context.getProjectId() + " and (objFrom in " + classCodeStr + " or objTo in " + classCodeStr + ") and valid = 1";
-            criteria.setFilters(filter);
-            AdmResponse admSp = spVerticalSpService.doQuery(context, criteria, SpVerticalSp.class);
-            List<SpVerticalSp> spVerticalSps = (List<SpVerticalSp>) admSp.getContent();
-            List<String> spaceIds = spVerticalSps.stream().map(SpVerticalSp::getSpaceId).collect(Collectors.toList());
-            String id = " id in ('" + StrUtil.join("','", spaceIds) + "') ";
-            criteria.setFilters(id);
-            admSpaceRes = spaceService.doQuery(context, criteria, AdmSpace.class);
-            spaces = (List<AdmSpace>) admSpaceRes.getContent();
-            spaceList.addAll(spaces);
-            Set<String> ids = new HashSet<>();
-            Iterator<AdmSpace> iter = spaceList.iterator();
-            while (iter.hasNext()) {
-                AdmSpace next = iter.next();
-                //去除重复
-                if (ids.contains(next.getId())) {
-                    iter.remove();
-                }
-                ids.add(next.getId());
+            if(CollUtil.isEmpty(spaceList)) {
+                continue;
             }
+            floor.setSpaceList(CollUtil.newArrayList(spaceList));
         }
-        //6将spaceList按照floor分组返回floor对象
-        if (!CollectionUtils.isEmpty(spaceList)) {
-            Map<String, List<AdmSpace>> map = new HashMap<>();
-            for (AdmSpace admSpace : spaceList) {
-                String floorId = admSpace.getFloorId();
-                List<AdmSpace> spaces = new ArrayList<>();
-                if (map.containsKey(floorId)) {
-                    spaces = map.get(floorId);
-                }
-                spaces.add(admSpace);
-                map.put(floorId, spaces);
-            }
-            Iterator<AdmFloor> iterator = floor.iterator();
-            while (iterator.hasNext()) {
-                AdmFloor admFloor = iterator.next();
-                String id = admFloor.getId();
-                List<AdmSpace> spaces = map.get(id);
-                if (CollectionUtils.isEmpty(spaces)) {
-                    iterator.remove();
+    }
+
+    /**
+     * 根据相似度匹配空间
+     * @param context
+     * @param buildingId 匹配此建筑下的空间
+     * @param spaces 按这些空间匹配
+     * @param spaceIds
+     * @param objectType
+     * @return
+     */
+    private Map<String, List<AdmSpace>> matchingSpaces(InstanceUrlParam context, String buildingId, List<AdmSpace> spaces,
+                                                       Set<String> spaceIds, String objectType) {
+        final double matchingPercent = 0.9;
+        Map<String, List<AdmSpace>> aiSpaceMap = new HashMap<>();
+        // 查询建筑下的空间
+        List<AdmSpace> spInBds = spaceService.querySpaceInBuilding(context, buildingId, objectType);
+        // 按竖井下的空间,逐个计算每个空间匹配的空间
+        for(AdmSpace space:spaces) {
+            for(AdmSpace spInBd:spInBds) {
+                // 已在竖井下的不用再匹配
+                if (spaceIds.contains(spInBd)) {
                     continue;
                 }
-                admFloor.setSpaceList(spaces);
+                // 字符串匹配度大于0.9的保留
+                if (TextSimilarity.similar(space.getLocalId(), spInBd.getLocalId()) > matchingPercent
+                        || TextSimilarity.similar(space.getLocalName(), spInBd.getLocalName()) > matchingPercent) {
+                    List<AdmSpace> ais = aiSpaceMap.get(space.getId());
+                    if (CollUtil.isEmpty(ais)) {
+                        ais = new ArrayList<>();
+                        aiSpaceMap.put(space.getId(), ais);
+                    }
+                    spInBd.setIsAi(true);
+                    ais.add(spInBd);
+                }
             }
         }
-
-        admResult.setContent(floor);
-        return admResult;
+        return aiSpaceMap;
     }
 
     /**
@@ -368,22 +231,30 @@ public class AdmEquipShaftController {
      */
     @PostMapping("/vertical-space")
     public AdmResponse shaftVerticalSp(@RequestBody ShaftSpaceVertical shaftSpaceVertical) {
-        String buildingId = shaftSpaceVertical.getBuildingId();
+                String buildingId = shaftSpaceVertical.getBuildingId();
         String shaftId = shaftSpaceVertical.getShaftId();
         String objectType = shaftSpaceVertical.getObjectType();
         if (StrUtil.isBlank(buildingId) || StrUtil.isBlank(shaftId) || StrUtil.isBlank(objectType)) {
             return AdmResponse.failure("必填项:buildingId(建筑id)、shaftId(竖井Id),objectType(空间类型)");
         }
+        // 查询竖井下的空间
         InstanceUrlParam context = AdmContextUtil.toDmpContext();
-        AdmQueryCriteria criteria = new AdmQueryCriteria();
-        String filter = "graphCode = 'ArchSubset' and relCode = 'Sh2Sp' and projectId = " + context.getProjectId() + " and objFrom =" + shaftId + " and valid = 1";
-        criteria.setFilters(filter);
-        AdmResponse admResponse = dtRelationService.doQuery(context, criteria, AdmDtRelation.class);
-        List<AdmDtRelation> dtRelations = (List<AdmDtRelation>) admResponse.getContent();
-        List<String> spaceIdss = dtRelations.stream().map(AdmDtRelation::getObj_to).collect(Collectors.toList());
-        filter = " id in ('" + StrUtil.join("','", spaceIdss) + "') ";
-        criteria.setFilters(filter);
-        return spaceService.doQuery(context,criteria,AdmSpace.class);
+        QueryCriteria queryRequest = new QueryCriteria();
+        ObjectNode criteriaRel = JsonNodeFactory.instance.objectNode();
+        criteriaRel.put("graphCode", "ArchSubset");
+        criteriaRel.put("relCode", "Sh2Sp");
+        criteriaRel.put("refValue", objectType);
+        criteriaRel.put("objFrom", shaftId);
+        queryRequest.setCriteria(criteriaRel);
+        List<ObjectRelation> relations = relationService.queryByCondition(context, queryRequest);
+        if(CollUtil.isEmpty(relations)) {
+            return AdmResponse.success();
+        }
+        // 收集空间ID
+        List<String> spaceIds = relations.stream().map(ObjectRelation::getObjTo).collect(Collectors.toList());
+        // TODO 异步调用垂直关系计算 public.is_vertically_overlap(#{projectId},#{buildingId},#{zoneType},ARRAY)
+
+        return AdmResponse.success();
     }
 
 }

+ 1 - 18
src/main/java/com/persagy/proxy/adm/controller/AdmShaftController.java

@@ -152,24 +152,7 @@ public class AdmShaftController {
     @PostMapping("/query")
     public AdmResponse query(@RequestBody AdmQueryCriteria request) throws Exception {      
         request.setName(AdmShaft.OBJ_TYPE);
-        QueryCriteria queryCriteria = AdmQueryCriteriaHelper.toDmpCriteria(request);
-        ObjectNode criteria = queryCriteria.getCriteria();
-        //查询参数特殊处理 处理成中台可以识别的条件
-        if(!JSONUtil.isNull(criteria)){
-           Map<String, Object> criteriaMap = objectMapper.convertValue(criteria, Map.class);
-           if(CollUtil.isNotEmpty(criteriaMap)){
-               ObjectNode criteriaNew = JsonNodeFactory.instance.objectNode();
-               criteriaMap.keySet().stream().forEach(key -> {
-                   if(key.startsWith("infos.")){
-                        criteriaNew.put(key.substring(6), criteriaMap.get(key).toString());
-                   }else{
-                       criteriaNew.put(key, criteriaMap.get(key).toString());
-                   }
-               });
-               queryCriteria.setCriteria(criteriaNew);
-           }
-        }
-        return service.doQuery(AdmContextUtil.toDmpContext(), queryCriteria, AdmShaft.class);
+        return service.doQuery(AdmContextUtil.toDmpContext(), request, AdmShaft.class);
     }
 
     /**

+ 1 - 0
src/main/java/com/persagy/proxy/adm/controller/ComponentBuildingController.java

@@ -25,6 +25,7 @@ import java.util.List;
  * @date 2021年9月8日 下午7:28:00
  */
 @RestController
+@SuppressWarnings("unchecked")
 public class ComponentBuildingController {
 
 	@Autowired

+ 6 - 11
src/main/java/com/persagy/proxy/adm/controller/RelationReportController.java

@@ -14,13 +14,10 @@ import java.util.Set;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-import com.fasterxml.jackson.core.JsonProcessingException;
-import lombok.RequiredArgsConstructor;
 import org.apache.poi.xssf.usermodel.XSSFCell;
 import org.apache.poi.xssf.usermodel.XSSFRow;
 import org.apache.poi.xssf.usermodel.XSSFSheet;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.util.ResourceUtils;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -32,6 +29,7 @@ import org.springframework.web.multipart.MultipartFile;
 import com.alibaba.excel.EasyExcel;
 import com.alibaba.excel.ExcelWriter;
 import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.google.common.collect.Lists;
 import com.persagy.proxy.adm.constant.AdmCommonConstant;
@@ -43,6 +41,7 @@ import com.persagy.proxy.adm.strategy.RelationObjectContext;
 
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.StrUtil;
+import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 
 /**
@@ -78,12 +77,10 @@ public class RelationReportController {
 	@RequestMapping("/graphic/query-count")
 	public AdmResponse queryCount(HttpServletRequest request) {
 		String groupCode = request.getHeader(AdmCommonConstant.GROUP_CODE_HEADER);
-		groupCode = StrUtil.isBlank(groupCode) ? defaultCode : groupCode;
 		String projectId = request.getHeader(AdmCommonConstant.PROJECT_ID_HEADER);
 		
-		JSONObject result = new JSONObject();
-		result.put("count", 0);
-		return AdmResponse.success(Lists.newArrayList(result));
+		List<JSONObject> relationProjectCal = this.relationReportService.getAllRelationProjectCalTree(groupCode, projectId);
+		return AdmResponse.success(relationProjectCal);
 	}
 	
 	/**
@@ -121,11 +118,9 @@ public class RelationReportController {
 	@RequestMapping("/graphic/relation_type_project")
 	public AdmResponse queryRelationObjects(@RequestBody AdmQueryCriteria queryCriteria, HttpServletRequest request) {
 		String groupCode = request.getHeader(AdmCommonConstant.GROUP_CODE_HEADER);
-		groupCode = StrUtil.isBlank(groupCode) ? defaultCode : groupCode;
 		String projectId = request.getHeader(AdmCommonConstant.PROJECT_ID_HEADER);
-		JSONObject result = new JSONObject();
-		result.put("count", 0);
-		return AdmResponse.success(Lists.newArrayList(result));
+		List<ObjectNode> relationProjectCal = this.relationReportService.getAllRelationProjectCal(groupCode, projectId);
+		return AdmResponse.success(relationProjectCal);
 	}
 	
 	/**

+ 11 - 14
src/main/java/com/persagy/proxy/adm/controller/RelationShInBdController.java

@@ -5,21 +5,22 @@ import com.persagy.proxy.adm.model.relation.ShInBdList;
 import com.persagy.proxy.adm.request.AdmResponse;
 import com.persagy.proxy.adm.service.IAdmRelationService;
 import com.persagy.proxy.adm.utils.AdmContextUtil;
-import com.persagy.proxy.common.entity.InstanceUrlParam;
 import com.persagy.proxy.common.entity.RelationDTO;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.util.CollectionUtils;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
 
 import java.util.ArrayList;
 import java.util.List;
 
 /**
+ * 关系-竖井所在建筑
  * @author zhangwencheng
- *关系-竖井所在建筑
  */
 @Slf4j
 @RestController
@@ -29,14 +30,11 @@ public class RelationShInBdController {
     @Autowired
     private IAdmRelationService service;
 
-    @Value("${middleware.group.code}")
-    private String groupCode;
     /**
      * 创建竖井所在建筑关系
      * @param shInBdList
      * @return
      */
-
     @PostMapping("link-bd")
     public AdmResponse createBd(@RequestBody ShInBdList shInBdList){
         log.info("创建系统所在建筑关系link-bd");
@@ -47,16 +45,15 @@ public class RelationShInBdController {
             return AdmResponse.failure("必填项:shaftId(竖井id)、BuildingIdList(建筑id列表)");
         }
         List<RelationDTO> voList = new ArrayList<>();
-        AdmRelationTypeEnum typeEnum = AdmRelationTypeEnum.BD2SH_ARCHFORARCH;
-        String graphCode = typeEnum.getGraphCode();
-        String relCode = typeEnum.getRelCode();
+        String graphCode = AdmRelationTypeEnum.BD2SH_ARCHFORARCH.getGraphCode();
+        String relCode = AdmRelationTypeEnum.BD2SH_ARCHFORARCH.getRelCode();
+        // 组装关系
         for (String buildingId : buildingIdList) {
-                                                                 //ArchForArch
-            RelationDTO relation = new RelationDTO(null, graphCode, relCode, "", shaftId,buildingId);
+            RelationDTO relation = RelationDTO.builder().graphCode(graphCode).relCode(relCode)
+                    .objFrom(buildingId).objTo(shaftId).build();
             voList.add(relation);
         }
-        InstanceUrlParam context = AdmContextUtil.toDmpContext();
-        service.doSave(context, voList);
+        service.doSave(AdmContextUtil.toDmpContext(), voList);
         return AdmResponse.success();
     }
 

+ 26 - 0
src/main/java/com/persagy/proxy/adm/model/AdmDefFuncIdGather.java

@@ -0,0 +1,26 @@
+package com.persagy.proxy.adm.model;
+
+import lombok.Data;
+
+/**
+ * 信息点采集DTO
+ * @author:linhuili
+ * @date:2021/10/14
+ */
+@Data
+public class AdmDefFuncIdGather {
+    /** id */
+    private String id;
+    /** 项目id */
+    private String projectId;
+    /** 集团编码 */
+    private String groupCode;
+    /** 类型编码 */
+    private String classCode;
+    /** 信息点编码 */
+    private String code;
+    /** 是否可见 */
+    private Boolean visible;
+    /** 采集类型 type-common 通用 type-project 项目级 */
+    private String type;
+}

+ 4 - 1
src/main/java/com/persagy/proxy/adm/model/AdmDictQueryCriteria.java

@@ -15,6 +15,9 @@ import lombok.EqualsAndHashCode;
 @EqualsAndHashCode(callSuper=true)
 public class AdmDictQueryCriteria extends AdmQueryCriteria {
 
-    /** 查询类型 */
+    /** 查询类型 common-平台级,project-项目级 */
+    private String dictType;
+
+    /** 信息点类型 */
     private String type;
 }

+ 1 - 1
src/main/java/com/persagy/proxy/adm/model/AdmShaft.java

@@ -49,7 +49,7 @@ public class AdmShaft extends AdmSBaseEntity<AdmShaft>{
     @CascadeColumn(graphCode = "MechInArch", relCode = "Eq2Sh", selectToObj = false)
     private List<AdmEquipment> equipmentList;
     /** 级联-竖井内的建筑 */
-    @CascadeColumn(graphCode = "ArchForArch", relCode = "Sh2Bd")
+    @CascadeColumn(graphCode = "ArchSubset", relCode = "Bd2Sh", selectToObj = false)
     private List<AdmBuilding> buildingList;
     /** 级联-竖井内的系统 */
     @CascadeColumn(graphCode = "MechInArch", relCode = "Sy2Sh", selectToObj = false)

+ 7 - 2
src/main/java/com/persagy/proxy/adm/model/AdmSpace.java

@@ -6,6 +6,7 @@ import lombok.EqualsAndHashCode;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Set;
 
 /**
  * ADM 空间 实体
@@ -39,8 +40,8 @@ public class AdmSpace extends AdmSBaseEntity<AdmSpace>{
     private ArrayList<ArrayList<ArrayList<AdmPointPosition>>> outline;
     /** 轮廓线2 未使用*/
     private ArrayList<ArrayList<ArrayList<AdmPointPosition>>> outline2;
-    /** 图片 */
-    private ArrayList<AdmTaskPic> pic;
+    /** 图片 - 信息点里已存在的信息点不应在实体中重复定义为其他格式 */
+//    private ArrayList<AdmTaskPic> pic;
     /** 空间是否受影响 */
     private String state;
     /** 空间常驻人数 */
@@ -92,6 +93,10 @@ public class AdmSpace extends AdmSBaseEntity<AdmSpace>{
     /** 二维码图片 */
     private String qrcodePic;
 
+    /** 二维码图片 */
+    private Boolean isAi = false;
+    /** 垂直交通关系空间id */
+    private Set<String> spaceIdList;
 
     /** 信息点 */
     //private Map<String, Object> infos;

+ 53 - 0
src/main/java/com/persagy/proxy/adm/request/AdmQueryCriteria.java

@@ -1,5 +1,7 @@
 package com.persagy.proxy.adm.request;
 
+import com.fasterxml.jackson.databind.node.JsonNodeFactory;
+import com.fasterxml.jackson.databind.node.ObjectNode;
 import lombok.Data;
 
 import java.util.List;
@@ -34,4 +36,55 @@ public class AdmQueryCriteria {
     private AdmQueryGroup group;
     /** 是否只统计总数 */
     private boolean onlyCount = false;
+    /** 关系查询条件 */
+    private ObjectNode relationFrom;
+    /** 关系查询条件 */
+    private ObjectNode relationTo;
+
+    /**
+     * 设置关系条件
+     * @param isFrom
+     * @param graphCode
+     * @param relCode
+     * @param objId
+     */
+    public void resetRelationCond(boolean isFrom, String graphCode, String relCode, String objId) {
+        resetRelationCond(isFrom, graphCode, relCode, objId, true);
+    }
+
+    /**
+     * 设置关系条件
+     * @param isFrom
+     * @param graphCode
+     * @param relCode
+     * @param objId
+     * @param bindFlag
+     */
+    public void resetRelationCond(boolean isFrom, String graphCode, String relCode, String objId, boolean bindFlag) {
+        resetRelationCond(isFrom, graphCode, relCode, null, objId, bindFlag);
+    }
+
+    /**
+     * 设置关系条件
+     * @param isFrom
+     * @param graphCode
+     * @param relCode
+     * @param relValue
+     * @param objId
+     * @param bindFlag
+     */
+    public void resetRelationCond(boolean isFrom, String graphCode, String relCode, String relValue, String objId, boolean bindFlag) {
+        ObjectNode relationCond = JsonNodeFactory.instance.objectNode();
+        relationCond.put("graphCode", graphCode);
+        relationCond.put("relCode", relCode);
+        relationCond.put("relValue", relValue);
+        relationCond.put("$bindFlag", bindFlag);
+        if(isFrom) {
+            relationCond.put("objTo", objId);
+            setRelationFrom(relationCond);
+        } else {
+            relationCond.put("objFrom", objId);
+            setRelationTo(relationCond);
+        }
+    }
 }

+ 2 - 0
src/main/java/com/persagy/proxy/adm/service/IAdmBaseService.java

@@ -16,7 +16,9 @@ public interface IAdmBaseService<T> {
 
     /**
      * 查询
+     * @param context
      * @param request
+     * @param clazz
      * @return
      */
     AdmResponse doQuery(InstanceUrlParam context, AdmQueryCriteria request, Class<T> clazz);

+ 20 - 0
src/main/java/com/persagy/proxy/adm/service/IAdmDictBaseService.java

@@ -62,4 +62,24 @@ public interface IAdmDictBaseService<T>{
     void doDeleteObjectInfo(InstanceUrlParam context, List<T> voList);
 
 
+    /**
+     * 查询采集信息点
+     * @param context
+     * @param request
+     * @param fieldName
+     * @param clazz
+     * @return
+     */
+    AdmResponse doQueryObjectInfoCollect(InstanceUrlParam context, AdmQueryCriteria request, String fieldName, Class<T> clazz);
+
+    /**
+     * 设置采集信息点
+     * @param context
+     * @param clazz
+     * @param voList
+     * @return
+     */
+    List<T> doSetObjectInfoCollect(InstanceUrlParam context, Class<T> clazz, List<T> voList);
+
+
 }

+ 15 - 5
src/main/java/com/persagy/proxy/adm/service/IAdmDictService.java

@@ -1,10 +1,8 @@
 package com.persagy.proxy.adm.service;
 
-import com.persagy.proxy.adm.model.AdmDict;
-import com.persagy.proxy.adm.model.AdmDictQueryCriteria;
-import com.persagy.proxy.adm.model.AdmLocationPoint;
-import com.persagy.proxy.adm.model.AdmObjectInfo;
+import com.persagy.proxy.adm.model.*;
 import com.persagy.proxy.adm.request.AdmCreateRequest;
+import com.persagy.proxy.adm.request.AdmQueryCriteria;
 import com.persagy.proxy.adm.request.AdmResponse;
 import com.persagy.proxy.common.entity.InstanceUrlParam;
 
@@ -46,7 +44,7 @@ public interface IAdmDictService<T> extends IAdmDictBaseService<T>{
      * @return
      * @throws Exception
      */
-    AdmResponse settingDicProject(InstanceUrlParam context , AdmCreateRequest<AdmObjectInfo> request, Class<T> clazz) throws Exception;
+    AdmResponse settingDicProject(InstanceUrlParam context , AdmCreateRequest<AdmDefFuncIdGather> request, Class<T> clazz) throws Exception;
 
 
     /**
@@ -56,4 +54,16 @@ public interface IAdmDictService<T> extends IAdmDictBaseService<T>{
      * @return
      */
     AdmResponse queryMorlDict(InstanceUrlParam context,List<String> dictTypeList);
+
+
+    /**
+     * 查询信息点
+     * @param context
+     * @param request
+     * @param fieldName
+     * @param clazz
+     * @return
+     */
+    AdmResponse query(InstanceUrlParam context, AdmDictQueryCriteria request,String fieldName, Class<T> clazz);
+
 }

+ 10 - 0
src/main/java/com/persagy/proxy/adm/service/IAdmFloorService.java

@@ -5,6 +5,8 @@ import com.persagy.proxy.adm.request.AdmQueryCriteria;
 import com.persagy.proxy.adm.request.AdmResponse;
 import com.persagy.proxy.common.entity.InstanceUrlParam;
 
+import java.util.List;
+
 /**
  * ADM 楼层 接口类
  * @author lvxy
@@ -18,4 +20,12 @@ public interface IAdmFloorService extends IAdmBaseService<AdmFloor>{
      * @return
      */
     AdmResponse doQueryOutLine(InstanceUrlParam context, AdmQueryCriteria request, Class<AdmFloor> clazz);
+
+    /**
+     * 查询建筑下的楼层
+     * @param context
+     * @param buildingId
+     * @return
+     */
+    List<AdmFloor> queryFloorInBuilding(InstanceUrlParam context, String buildingId);
 }

+ 37 - 3
src/main/java/com/persagy/proxy/adm/service/IAdmSpaceService.java

@@ -1,15 +1,14 @@
 package com.persagy.proxy.adm.service;
 
-import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.persagy.proxy.adm.model.AdmDCSQueryRequest;
 import com.persagy.proxy.adm.model.AdmSpace;
-import com.persagy.proxy.adm.model.AdmUpDataFloorAndBuildingRequests;
-import com.persagy.proxy.adm.request.AdmQueryCriteria;
 import com.persagy.proxy.adm.request.AdmResponse;
 import com.persagy.proxy.common.entity.InstanceUrlParam;
 
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 /**
  * ADM 空间 接口
@@ -36,4 +35,39 @@ public interface IAdmSpaceService extends IAdmBaseService<AdmSpace>{
      */
     AdmResponse doQuerySpaces(InstanceUrlParam context, AdmDCSQueryRequest request);
     List<JSONObject> doQuerySpaceTypes(InstanceUrlParam context);
+
+    /**
+     * 查询指定竖井下指定空间类型的空间
+     * @param context
+     * @param shaftId
+     * @param spaceType
+     * @return
+     */
+    List<AdmSpace> querySpaceInShaft(InstanceUrlParam context, String shaftId, String spaceType);
+
+    /**
+     * 查询指定建筑下指定空间类型的空间
+     * @param context
+     * @param buildingId
+     * @param spaceType
+     * @return
+     */
+    List<AdmSpace> querySpaceInBuilding(InstanceUrlParam context, String buildingId, String spaceType);
+
+    /**
+     * 查询楼层与空间关系映射
+     * @param context
+     * @param floorIds
+     * @param spaceType
+     * @return Map<FloorID, List<SpaceID>>
+     */
+    Map<String, List<String>> querySpaceMapInFloors(InstanceUrlParam context, List<String> floorIds, String spaceType);
+
+    /**
+     * 查询垂直交通关系映射
+     * @param context
+     * @param spaceIds
+     * @return
+     */
+    Map<String, Set<String>> queryTrafficSpaceMap(InstanceUrlParam context, Iterable<String> spaceIds, String spaceType);
 }

+ 19 - 1
src/main/java/com/persagy/proxy/adm/service/IRelationReportService.java

@@ -50,6 +50,24 @@ public interface IRelationReportService {
 	 * @param relCode
 	 */
 	List<RelationDefine> getRelationDefine(String groupCode, String projectId, String graphCode, String relCode);
+
+	/**
+	 * 获取所有的项目计算二级树数据
+	 * 
+	 * @param groupCode
+	 * @param projectId
+	 * @return
+	 */
+	List<JSONObject> getAllRelationProjectCalTree(String groupCode, String projectId);
+	
+	/**
+	 * 获取所有的项目计算数据
+	 * 
+	 * @param groupCode
+	 * @param projectId
+	 * @return
+	 */
+	List<ObjectNode> getAllRelationProjectCal(String groupCode, String projectId);
 	
 	/**
 	 * 获取项目计算关系
@@ -156,7 +174,7 @@ public interface IRelationReportService {
 	 * @return
 	 */
 	boolean createRelationProjectCal(String groupCode, String projectId) throws JsonProcessingException;
-	
+
 	/**
 	 * 查询出所有的关系信息
 	 * <p>因原代码中,不存在zoneType类型不为空时对应的方法,所以此处不再进行此数据的判断</p>

+ 5 - 2
src/main/java/com/persagy/proxy/adm/service/impl/AbstractAdmBaseServiceImpl.java

@@ -62,7 +62,7 @@ public class AbstractAdmBaseServiceImpl<T> implements IAdmBaseService<T> {
             para = JsonHelper.toJsonObject(dmpRequest);
         } catch (IOException e) {
             log.error(e.getMessage(), e);
-            return null;
+            return AdmResponse.failure("参数格式有误");
         }
         // 调用中台查询
         DmpResult<JSONArray> dmpResult = rwdClient.queryObject(context, para);
@@ -103,8 +103,11 @@ public class AbstractAdmBaseServiceImpl<T> implements IAdmBaseService<T> {
             }
             // 获取关联对象的Class
             Field casField = ReflectUtil.getField(simpleVO.getClass(), cascade.getName());
+            if(casField == null) {
+                continue;
+            }
+            // 获取级联信息
             CascadeColumn annotationInfo = casField.getAnnotation(CascadeColumn.class);
-            // 没有扩展信息不处理
             if(annotationInfo == null) {
                 continue;
             }

+ 58 - 11
src/main/java/com/persagy/proxy/adm/service/impl/AbstractAdmDictBaseServiceImpl.java

@@ -9,6 +9,7 @@ import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.persagy.dmp.basic.model.QueryCriteria;
 import com.persagy.dmp.basic.utils.JsonNodeUtils;
 import com.persagy.dmp.common.utils.JsonHelper;
+import com.persagy.dmp.define.entity.ObjectInfoCollect;
 import com.persagy.proxy.adm.constant.AdmCommonConstant;
 import com.persagy.proxy.adm.constant.AdmDictConstant;
 import com.persagy.proxy.adm.constant.enums.ValidEnum;
@@ -207,16 +208,11 @@ public class AbstractAdmDictBaseServiceImpl<T> implements IAdmDictBaseService<T>
                 admVO.setPath(AdmDictConstant.INFOS_EX+admVO.getCode());
             }
 
-            //信息点是否可见
+            //信息点是否可见设置默认值
             if(admVO.getVisible() == null){
-                /*if("localName".equals(admVO.getCode()) || "localId".equals(admVO.getCode())){
-                    admVO.setVisible(true);
-                }else{
-                    admVO.setVisible(false);
-                }*/
-                admVO.setVisible(true);
+                admVO.setVisible(false);
             }
-            //信息点是否可编辑
+            //信息点是否可编辑设置默认值
             if(admVO.getEditable() == null){
                 List<String> unEditableList = checkoutDefInfoUnEditable();
                 if(unEditableList.contains(admVO.getCode())){
@@ -225,7 +221,7 @@ public class AbstractAdmDictBaseServiceImpl<T> implements IAdmDictBaseService<T>
                     admVO.setEditable(true);
                 }
             }
-            //是否禁止操作
+            //是否禁止操作设置默认值
             if(admVO.getUnDisabled() == null){
                 List<String> unDisableList = checkoutDefInfoUnDisable();
                 if(unDisableList.contains(admVO.getCode())){
@@ -234,7 +230,6 @@ public class AbstractAdmDictBaseServiceImpl<T> implements IAdmDictBaseService<T>
                     admVO.setUnDisabled(true);
                 }
             }
-
         }
     }
 
@@ -347,7 +342,59 @@ public class AbstractAdmDictBaseServiceImpl<T> implements IAdmDictBaseService<T>
                 datum.setType("common");
             }
         }
-
         return data;
     }
+
+    /**
+     * 查询对象信息点
+     * @param request
+     * @return
+     */
+    @Override
+    public AdmResponse doQueryObjectInfoCollect(InstanceUrlParam context, AdmQueryCriteria request,String fieldName, Class<T> clazz) {
+        // 转换为数据中台查询条件
+        QueryCriteria dmpRequest = toDmpCriteria(request,fieldName);
+        // 转换参数
+        JSONObject para = null;
+        try {
+            para = JsonHelper.toJsonObject(dmpRequest);
+        } catch (IOException e) {
+            log.error(e.getMessage(), e);
+            return null;
+        }
+        // 调用中台查询
+        log.info(para.toString());
+        DmpResult<JSONArray> dmpResult = rwdClient.queryObjectInfoCollect(context, para);
+        List<ObjectInfoCollect> admVOs = AdmEntityTransferUtil.toAdmMultiEntity(dmpResult.getData(), request.getProjection(), ObjectInfoCollect.class);
+        // 设置返回值
+        AdmResponse response = AdmResponse.success(admVOs);
+        Long total = dmpResult.getCount() == null ? null : dmpResult.getCount().longValue();
+        response.setTotal(total);
+        response.setPageNumber(request.getPageNumber());
+        response.setPageSize(request.getPageSize());
+        return response;
+    }
+
+    /**
+     * 设置采集信息
+     * @param context
+     * @param clazz
+     * @param voList
+     * @return
+     */
+    @Override
+    public List<T> doSetObjectInfoCollect(InstanceUrlParam context, Class<T> clazz, List<T> voList) {
+        if(CollUtil.isEmpty(voList)) {
+            return null;
+        }
+        ArrayNode vos = JsonNodeUtils.toArrayNode(voList, null, null);
+        // 调用中台修改
+        DmpResult<cn.hutool.json.JSONArray> response = rwdClient.batchUpdateObjectInfoCollect(context, JSONArray.parseArray(vos.toString()));
+        if(!DmpResult.SUCCESS.equals(response.getResult())) {
+            throw new RuntimeException("调用中台查询接口出错:" + response.getMessage());
+        }
+        // 转换为结果
+        return AdmEntityTransferUtil.toAdmMultiEntity(response.getData(), null, clazz);
+    }
+
 }

+ 146 - 10
src/main/java/com/persagy/proxy/adm/service/impl/AdmDictServiceImpl.java

@@ -3,11 +3,14 @@ package com.persagy.proxy.adm.service.impl;
 import cn.hutool.core.collection.CollUtil;
 
 import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.fasterxml.jackson.databind.JsonNode;
 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.dmp.define.entity.ObjectInfoCollect;
+import com.persagy.dmp.define.entity.ObjectInfoDefine;
 import com.persagy.proxy.adm.constant.AdmDictConstant;
 import com.persagy.proxy.adm.constant.enums.AdmDictCategoryEnum;
 import com.persagy.proxy.adm.model.*;
@@ -261,16 +264,27 @@ public class AdmDictServiceImpl<T> extends AbstractAdmDictBaseServiceImpl<T> imp
      * @throws Exception
      */
     @Override
-    public AdmResponse settingDicProject(InstanceUrlParam context, AdmCreateRequest<AdmObjectInfo> request, Class<T> clazz) throws Exception {
-        List<AdmObjectInfo> content = request.getContent();
-        //信息点转换为中台格式
-        List<AdmObjectInfo> dmpObjectInfo = new ArrayList<>();
-        objectInfosTransforDmp(content, dmpObjectInfo ,context.getProjectId());
-        request.setContent(dmpObjectInfo);
-
-        //修改项目级信息点
-        List<T> vos = doUpdateObjectInfo(context, clazz, (List<T>) dmpObjectInfo);
-        return AdmResponse.success(vos);
+    public AdmResponse settingDicProject(InstanceUrlParam context, AdmCreateRequest<AdmDefFuncIdGather> request, Class<T> clazz) throws Exception {
+        List<AdmDefFuncIdGather> content = request.getContent();
+        if(CollUtil.isEmpty(content)){
+            return AdmResponse.success(content);
+        }
+        //参数转换为中台参数
+        List<T> list = new ArrayList<>();
+        for (AdmDefFuncIdGather funcIdGather : content) {
+            ObjectInfoCollect infoCollect = new ObjectInfoCollect();
+
+            infoCollect.setGroupCode(funcIdGather.getGroupCode());
+            infoCollect.setProjectId(funcIdGather.getProjectId());
+            infoCollect.setDefineInfoId(funcIdGather.getId());
+            infoCollect.setClassCode(funcIdGather.getClassCode());
+            infoCollect.setCode(funcIdGather.getCode());
+            infoCollect.setVisiable(funcIdGather.getVisible());
+            list.add((T) infoCollect);
+        }
+        //设置采集信息点
+        doSetObjectInfoCollect(context, clazz, list);
+        return AdmResponse.success(content);
     }
 
     /**
@@ -331,6 +345,128 @@ public class AdmDictServiceImpl<T> extends AbstractAdmDictBaseServiceImpl<T> imp
 
 
     /**
+     * 查询信息点
+     * @param context
+     * @param request
+     * @param fieldName
+     * @param clazz
+     * @return
+     */
+    @Override
+    public AdmResponse query(InstanceUrlParam context, AdmDictQueryCriteria request, String fieldName, Class<T> clazz) {
+        //查询类型下的所有信息点信息
+        AdmResponse admResponse = doQueryObjectInfo(context, request, AdmDictConstant.CLASS_CODE, clazz);
+        List<AdmObjectInfo> admObjectInfos = (List<AdmObjectInfo>) admResponse.getContent();
+        //查询平台级信息点采集信息
+        List<ObjectInfoCollect> commonObjectInfoCollect = queryObjectInfoCollect(context, "common", request.getType(), clazz);
+        Map<String, Boolean> commonObjectInfoCollectMap = commonObjectInfoCollect.stream().filter(item -> StrUtil.isNotEmpty(item.getDefineInfoId())).collect(Collectors.toMap(ObjectInfoCollect::getDefineInfoId,ObjectInfoCollect::getVisiable));
+
+        //查询项目级信息点采集信息
+        List<ObjectInfoCollect> projectObjectInfoCollect = queryObjectInfoCollect(context, "project", request.getType(), clazz);
+        Map<String, Boolean> projectObjectInfoCollectMap = projectObjectInfoCollect.stream().filter(item -> StrUtil.isNotEmpty(item.getDefineInfoId())).collect(Collectors.toMap(ObjectInfoCollect::getDefineInfoId,ObjectInfoCollect::getVisiable));
+
+        String dictType = request.getDictType();
+
+        //采集值配置查询
+        if(StringUtils.isNotEmpty(dictType)){
+            //查询平台级、项目级信息点采集信息
+            if("common".equals(dictType)){
+                setObjectInfoVisiable(admObjectInfos,commonObjectInfoCollectMap,dictType);
+            }
+            if("project".equals(dictType)){
+                setObjectInfoVisiable(admObjectInfos,projectObjectInfoCollectMap,dictType);
+            }
+            admResponse.setContent(admObjectInfos);
+            return admResponse;
+        }
+
+        //只查看采集值 todo
+        if(CollUtil.isNotEmpty(projectObjectInfoCollectMap)){
+            setOnlyQueryObjectInfoVisiable(admObjectInfos,projectObjectInfoCollectMap,dictType);
+        }else{
+            setOnlyQueryObjectInfoVisiable(admObjectInfos,commonObjectInfoCollectMap,dictType);
+        }
+        admResponse.setContent(admObjectInfos);
+        return admResponse;
+    }
+
+    /**
+     * 设置信息点是否可见
+     * @param admObjectInfos
+     * @param objectInfoCollectMap
+     */
+    private void setObjectInfoVisiable(List<AdmObjectInfo> admObjectInfos,Map<String, Boolean> objectInfoCollectMap,String dictType){
+        if(CollUtil.isEmpty(admObjectInfos)){
+            return;
+        }
+        for (AdmObjectInfo admObjectInfo : admObjectInfos) {
+            Boolean visiable = null;
+            String id = admObjectInfo.getId();
+            if(CollUtil.isNotEmpty(objectInfoCollectMap)){
+                visiable = objectInfoCollectMap.get(id);
+            }
+            if(visiable == null){
+                if("common".equals(dictType)){
+                    if("localId".equals(admObjectInfo.getCode()) || "localName".equals(admObjectInfo.getCode())){
+                        visiable = true;
+                    }
+                }
+                if(visiable == null){
+                    visiable =false;
+                }
+            }
+            admObjectInfo.setVisible(visiable);
+        }
+    }
+
+
+    /**
+     * 设置台账管理中只查看采集值的信息点是否可见
+     * @param admObjectInfos
+     * @param objectInfoCollectMap
+     */
+    private void setOnlyQueryObjectInfoVisiable(List<AdmObjectInfo> admObjectInfos,Map<String, Boolean> objectInfoCollectMap,String dictType){
+        if(CollUtil.isEmpty(admObjectInfos)){
+            return;
+        }
+        for (AdmObjectInfo admObjectInfo : admObjectInfos) {
+            Boolean visiable = null;
+            String id = admObjectInfo.getId();
+            if(CollUtil.isNotEmpty(objectInfoCollectMap)){
+                visiable = objectInfoCollectMap.get(id);
+            }else {
+                if(visiable == null && ("localId".equals(admObjectInfo.getCode()) || "localName".equals(admObjectInfo.getCode()))){
+                    visiable = true;
+                }
+            }
+            if(visiable == null){
+                visiable = false;
+            }
+            admObjectInfo.setVisible(visiable);
+        }
+    }
+
+    /**
+     * 查询信息点采集信息
+     * @param context
+     * @param dictType
+     * @param classCode
+     * @param clazz
+     * @return
+     */
+    private List<ObjectInfoCollect> queryObjectInfoCollect(InstanceUrlParam context, String dictType,String classCode, Class<T> clazz){
+        AdmQueryCriteria criteria = new AdmQueryCriteria();
+        if("common".equals(dictType)){
+            criteria.setFilters("groupCode = '0' and projectId = '0'");
+        }else{
+            criteria.setFilters("groupCode = '"+context.getGroupCode()+"' and projectId = '"+context.getProjectId()+"'");
+        }
+        criteria.setName(classCode);
+        AdmResponse admResponse = doQueryObjectInfoCollect(context, criteria, "classCode", clazz);
+        return (List<ObjectInfoCollect>) admResponse.getContent();
+    }
+
+    /**
      * 统计类型下的非静态信息点
      * @param context
      * @param code

+ 8 - 0
src/main/java/com/persagy/proxy/adm/service/impl/AdmFloorServiceImpl.java

@@ -35,4 +35,12 @@ public class AdmFloorServiceImpl extends AbstractAdmBaseServiceImpl<AdmFloor> im
         return doQuery(context, request, clazz);
     }
 
+    @Override
+    public List<AdmFloor> queryFloorInBuilding(InstanceUrlParam context, String buildingId) {
+        AdmQueryCriteria request = new AdmQueryCriteria();
+        request.setName(AdmFloor.OBJ_TYPE);
+        request.resetRelationCond(false, "ArchSubset", "Bd2Fl", buildingId);
+        AdmResponse rs = doQuery(context, request, AdmFloor.class);
+        return (List<AdmFloor>) rs.getContent();
+    }
 }

+ 86 - 1
src/main/java/com/persagy/proxy/adm/service/impl/AdmSpaceServiceImpl.java

@@ -13,8 +13,13 @@ import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.persagy.dmp.basic.model.QueryCriteria;
 import com.persagy.dmp.common.model.entity.BaseEntity;
 import com.persagy.dmp.define.entity.ObjectTypeDefine;
-import com.persagy.proxy.adm.model.*;
+import com.persagy.dmp.digital.entity.ObjectRelation;
+import com.persagy.proxy.adm.model.AdmDCSQueryRequest;
+import com.persagy.proxy.adm.model.AdmFloor;
+import com.persagy.proxy.adm.model.AdmSpace;
+import com.persagy.proxy.adm.request.AdmQueryCriteria;
 import com.persagy.proxy.adm.request.AdmResponse;
+import com.persagy.proxy.adm.service.IAdmRelationService;
 import com.persagy.proxy.adm.service.IAdmSpaceService;
 import com.persagy.proxy.adm.utils.AdmQueryCriteriaHelper;
 import com.persagy.proxy.common.client.DmpRwdClient;
@@ -40,6 +45,8 @@ public class AdmSpaceServiceImpl extends AbstractAdmBaseServiceImpl<AdmSpace> im
     private DmpRwdClient rwdClient;
     @Autowired
     private ObjectMapper objectMapper;
+    @Autowired
+    private IAdmRelationService relationService;
 
     @Override
     public List<AdmSpace> doInsertExt(InstanceUrlParam context, Class<AdmSpace> clazz, List<AdmSpace> voList) {
@@ -179,6 +186,84 @@ public class AdmSpaceServiceImpl extends AbstractAdmBaseServiceImpl<AdmSpace> im
         }
     }
 
+    @Override
+    public List<AdmSpace> querySpaceInShaft(InstanceUrlParam context, String shaftId, String spaceType) {
+        AdmQueryCriteria request = new AdmQueryCriteria();
+        request.setName(AdmSpace.OBJ_TYPE);
+        request.resetRelationCond(false, "ArchSubset", "Sh2Sp", spaceType, shaftId, true);
+        AdmResponse rs = doQuery(context, request, AdmSpace.class);
+        return (List<AdmSpace>) rs.getContent();
+    }
+
+    @Override
+    public List<AdmSpace> querySpaceInBuilding(InstanceUrlParam context, String buildingId, String spaceType) {
+        AdmQueryCriteria request = new AdmQueryCriteria();
+        request.setName(AdmSpace.OBJ_TYPE);
+        request.resetRelationCond(false, "ArchSubset", "Bd2Sp", spaceType, buildingId, true);
+        AdmResponse rs = doQuery(context, request, AdmSpace.class);
+        return (List<AdmSpace>) rs.getContent();
+    }
+
+    @Override
+    public Map<String, List<String>> querySpaceMapInFloors(InstanceUrlParam context, List<String> floorIds, String spaceType) {
+        QueryCriteria queryRequest = new QueryCriteria();
+        ObjectNode criteriaRel = JsonNodeFactory.instance.objectNode();
+        criteriaRel.put("graphCode", "ArchSubset");
+        criteriaRel.put("relCode", "Fl2Sp");
+        criteriaRel.put("refValue", spaceType);
+        ArrayNode objNode = criteriaRel.putArray("objFrom");
+        floorIds.forEach(floorId -> objNode.add(floorId));
+        queryRequest.setCriteria(criteriaRel);
+        List<ObjectRelation> relations = relationService.queryByCondition(context, queryRequest);
+        if(CollUtil.isEmpty(relations)) {
+            return null;
+        }
+        return relations.stream().collect(Collectors.groupingBy(ObjectRelation::getObjFrom,
+                Collectors.mapping(ObjectRelation::getObjTo, Collectors.toList())));
+    }
+
+    @Override
+    public Map<String, Set<String>> queryTrafficSpaceMap(InstanceUrlParam context, Iterable<String> spaceIds, String spaceType) {
+        Map<String, Set<String>> result = new HashMap<>();
+        loadTrafficSpace(context, spaceIds, spaceType, true, result);
+        loadTrafficSpace(context, spaceIds, spaceType, false, result);
+        return result;
+    }
+
+    /**
+     * 装载交通关系
+     * @param context
+     * @param spaceIds
+     * @param spaceType
+     * @param isFrom
+     * @param result
+     */
+    private void loadTrafficSpace(InstanceUrlParam context, Iterable<String> spaceIds, String spaceType, boolean isFrom, Map<String, Set<String>> result) {
+        // 关系查询条件
+        QueryCriteria queryRequest = new QueryCriteria();
+        ObjectNode criteriaRel = JsonNodeFactory.instance.objectNode();
+        criteriaRel.put("graphCode", "TrafficNetwork");
+        criteriaRel.put("refValue", spaceType);
+        ArrayNode objNode = criteriaRel.putArray(isFrom?"objFrom":"objTo");
+        spaceIds.forEach(spaceId -> objNode.add(spaceId));
+        queryRequest.setCriteria(criteriaRel);
+        List<ObjectRelation> relations = relationService.queryByCondition(context, queryRequest);
+        if(CollUtil.isEmpty(relations)) {
+            return;
+        }
+        // 存入Map
+        for(ObjectRelation relation:relations) {
+            String key = isFrom ? relation.getObjFrom() : relation.getObjTo();
+            String value = isFrom ? relation.getObjTo() : relation.getObjFrom();
+            Set<String> valueList = result.get(key);
+            if(CollUtil.isEmpty(valueList)) {
+                valueList = new HashSet<>();
+                result.put(key, valueList);
+            }
+            valueList.add(value);
+        }
+    }
+
     /**
      * 空间的类型是根据项目自定义的
      * 参见中心

+ 78 - 24
src/main/java/com/persagy/proxy/adm/service/impl/RelationReportService.java

@@ -4,6 +4,11 @@ import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.concurrent.ConcurrentLinkedQueue;
 import java.util.stream.Collectors;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateUtil;
@@ -18,11 +23,14 @@ import org.springframework.stereotype.Service;
 
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.metadata.OrderItem;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.google.common.collect.Lists;
 import com.persagy.dmp.basic.dto.RequestData;
 import com.persagy.dmp.basic.model.QueryCriteria;
+import com.persagy.dmp.common.context.AppContext;
 import com.persagy.dmp.common.helper.SpringHelper;
 import com.persagy.dmp.common.model.response.CommonResult;
 import com.persagy.dmp.define.client.DigitalGraphDefineFacade;
@@ -41,9 +49,9 @@ import com.persagy.proxy.adm.constant.ObjTypeMapping;
 import com.persagy.proxy.adm.service.IRelationReportService;
 import com.persagy.proxy.adm.strategy.relationdata.RelationObjectStrategy;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.date.DateTime;
-import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.StrUtil;
 
 /**
@@ -104,7 +112,72 @@ public class RelationReportService implements IRelationReportService {
 		List<RelationDefine> relationDefines = DigitalRelationDefineFacade.query(groupCode, projectId, AdmCommonConstant.APP_ID, AdmCommonConstant.USER_ID, queryCriteria);
 		return relationDefines;
 	}
-	
+
+	@Override
+	public List<ObjectNode> getAllRelationProjectCal(String groupCode, String projectId) {
+		groupCode = StrUtil.isBlank(groupCode) ? defaultCode : groupCode;
+
+		// 查询出对应项目关系计算数据
+		QueryCriteria projectCriteria = new QueryCriteria();
+		ObjectMapper objectMapper = SpringHelper.getBean(ObjectMapper.class);
+		ObjectNode criteria = objectMapper.createObjectNode();
+		criteria.put("projectId", projectId);
+		projectCriteria.setCriteria(criteria);
+		List<ObjectNode> projectList = DigitalRelationProjectCalFacade.query(groupCode, projectId, AdmCommonConstant.APP_ID, AdmCommonConstant.USER_ID, projectCriteria);
+		if (CollectionUtil.isEmpty(projectList)) {
+			return Lists.newArrayList();
+		}
+		for (ObjectNode objectNode : projectList) {
+			String graphCode = objectNode.get("graphCode") == null ? null : objectNode.get("graphCode").asText();
+			String relCode = objectNode.get("relCode") == null ? null : objectNode.get("relCode").asText();
+			AdmRelationTypeEnum relationTypeEnum = AdmCommonConstant.GRAPH_RELATION_TYPE_MAP.get(graphCode + AdmCommonConstant.UNDERLINE + relCode);
+			this.fillRelationProjectCal(objectNode, relationTypeEnum, groupCode, projectId);
+		}
+
+		return projectList;
+	}
+
+	@Override
+	public List<JSONObject> getAllRelationProjectCalTree(String groupCode, String projectId) {
+		groupCode = StrUtil.isBlank(groupCode) ? defaultCode : groupCode;
+
+		// 获取所有的二级标签
+		QueryCriteria secondCriteria = new QueryCriteria();
+		List<GraphDefine> secondList = DigitalGraphDefineFacade.query(groupCode, projectId, AdmCommonConstant.APP_ID, AdmCommonConstant.USER_ID, secondCriteria);
+		if (CollectionUtil.isEmpty(secondList)) {
+			return Lists.newArrayList();
+		}
+		// 获取此图类型对应项目计算数据
+		List<JSONObject> resultList = new ArrayList<JSONObject>();
+		for (GraphDefine graphDefine : secondList) {
+			String graphCode = graphDefine.getCode();
+			JSONObject graphObject = this.transfer(graphDefine);
+
+			// 查询出对应项目关系计算数据
+			QueryCriteria projectCriteria = new QueryCriteria();
+			ObjectMapper objectMapper = SpringHelper.getBean(ObjectMapper.class);
+			ObjectNode criteria = objectMapper.createObjectNode();
+			criteria.put("projectId", projectId);
+			criteria.put("graphCode", graphCode);
+			projectCriteria.setCriteria(criteria);
+			List<ObjectNode> projectList = DigitalRelationProjectCalFacade.query(groupCode, projectId, AdmCommonConstant.APP_ID, AdmCommonConstant.USER_ID, projectCriteria);
+			if (CollectionUtil.isEmpty(projectList)) {
+				graphObject.put("relationTypeProjectList", Lists.newArrayList());
+				continue;
+			}
+			// 再根据图类型、边类型,统计此类型下的数量
+			for (ObjectNode objectNode : projectList) {
+				String relCode = objectNode.get("relCode") == null ? null : objectNode.get("relCode").asText();
+				AdmRelationTypeEnum relationTypeEnum = AdmCommonConstant.GRAPH_RELATION_TYPE_MAP.get(graphCode + AdmCommonConstant.UNDERLINE + relCode);
+				this.fillRelationProjectCal(objectNode, relationTypeEnum, groupCode, projectId);
+			}
+			graphObject.put("relationTypeProjectList", projectList);
+			resultList.add(graphObject);
+		}
+
+		return resultList;
+	}
+
 	@Override
 	public ObjectNode getRelationProjectCal(String groupCode, String projectId, String relType) {
 		groupCode = StrUtil.isBlank(groupCode) ? defaultCode : groupCode;
@@ -116,26 +189,7 @@ public class RelationReportService implements IRelationReportService {
 		
 		ObjectNode objectNode = this.getRelationProjectCal(groupCode, projectId, relationTypeEnum.getGraphCode(), relationTypeEnum.getRelCode(), null);
 		if (objectNode != null) {
-			String zoneType = objectNode.get("zoneType") == null ? null : objectNode.get("zoneType").asText();
-			long count = this.countRelationObject(groupCode, projectId, relationTypeEnum.getGraphCode(), relationTypeEnum.getRelCode(), zoneType);
-			objectNode.put("count", count);
-			objectNode.put("relationType", relType);
-			
-			// 获取此图类型和边类型对应的数据记录
-			List<RelationDefine> relationDefines = this.getRelationDefine(groupCode, projectId, relationTypeEnum.getGraphCode(), relationTypeEnum.getRelCode());
-			if (CollectionUtil.isNotEmpty(relationDefines)) {
-				RelationDefine relationDefine = relationDefines.get(0);
-				objectNode.put("conneObject", relationDefine.getTargetObjs());
-				objectNode.put("relationTypeCode", relationDefine.getCode());
-				objectNode.put("relationTypeName", relationDefine.getName());
-				objectNode.put("automatic", (null == relationDefine.getAutomaticFlag() || relationDefine.getAutomaticFlag()) ? false : true);
-			}
-			
-			String prefix = ObjTypeMapping.getRelCodePrefix(relationTypeEnum.getRelCode());
-			String suffix = ObjTypeMapping.getRelCodeSuffix(relationTypeEnum.getRelCode());
-			objectNode.put("mainObject", ObjTypeMapping.PREFIX_NAME.get(prefix));
-			objectNode.put("fromObject", ObjTypeMapping.PREFIX_NAME.get(suffix));
-			objectNode.putPOJO("statistics", new JSONObject());
+			this.fillRelationProjectCal(objectNode, relationTypeEnum, groupCode, projectId);
 		}
 		
 		return objectNode;
@@ -518,7 +572,7 @@ public class RelationReportService implements IRelationReportService {
 	 * @param relationDefineMap
 	 * @return
 	 */
-	private JSONObject transfer(ObjectNode relationProject, String graphicId, String relCode,
+	private JSONObject fillRelationProjectCal(ObjectNode relationProject, String graphicId, String relCode,
 								Map<String, AdmRelationTypeEnum> graphRelTypeMap,
 								Map<String, RelationDefine> relationDefineMap) {
 		String key = graphicId + StrUtil.UNDERLINE + relCode;
@@ -549,5 +603,5 @@ public class RelationReportService implements IRelationReportService {
 		result.put("fromObject", relationDefine.getToObjType());
 		return result;
 	}
-	
+
 }

+ 14 - 2
src/main/java/com/persagy/proxy/adm/utils/AdmQueryCriteriaHelper.java

@@ -9,6 +9,9 @@ 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.dmp.basic.model.QueryOperator;
+import com.persagy.dmp.common.model.entity.BaseEntity;
+import com.persagy.proxy.adm.constant.enums.ValidEnum;
 import com.persagy.proxy.adm.request.AdmQueryCriteria;
 
 import java.math.BigDecimal;
@@ -68,8 +71,15 @@ public class AdmQueryCriteriaHelper {
             criteria.put("objType", admCriteria.getName());
         }
         // 补充valid = 1
-        if(!criteria.has("valid")) {
-            criteria.put("valid", 1);
+        if(!criteria.has(BaseEntity.PROP_VALID)) {
+            criteria.put(BaseEntity.PROP_VALID, ValidEnum.TRUE.getValue());
+        }
+        // 补充关系条件
+        if(admCriteria.getRelationFrom() != null) {
+            criteria.set(QueryOperator.RELATION_FROM.getIndex(), admCriteria.getRelationFrom());
+        }
+        if(admCriteria.getRelationTo() != null) {
+            criteria.set(QueryOperator.RELATION_TO.getIndex(), admCriteria.getRelationTo());
         }
         // 处理排序
         dmpCriteria.setOrders(toOrderItem(admCriteria.getOrders()));
@@ -211,6 +221,8 @@ public class AdmQueryCriteriaHelper {
      * @param value
      */
     private static void addCondition(String name, ObjectNode criteria, String column, String operator, String value) {
+        // 20211015 移除列名中的infos.
+        column = StrUtil.replaceIgnoreCase(column, "infos.", "");
         // 替换列名
         column = replaceColumns(name, column);
         if("=".equals(operator)) {

+ 19 - 0
src/main/java/com/persagy/proxy/common/client/DmpRwdClient.java

@@ -185,4 +185,23 @@ public interface DmpRwdClient {
     DmpResult<JSONArray> queryRelationProjectCal(@SpringQueryMap InstanceUrlParam objectUrlParam, @RequestBody JSONArray objectArr);
 
 
+    /**
+     * @description: 查询采集信息点
+     * @param: objectUrlParam 对象请求url通用参数
+     * @param: criteria post请求参数
+     * @return: com.persagy.dmp.common.DmpResult
+     */
+    @PostMapping(DmpUrlConstant.DEF_FUNCID_COLLECT)
+    DmpResult<JSONArray> queryObjectInfoCollect(@SpringQueryMap InstanceUrlParam objectUrlParam, @RequestBody JSONObject criteria);
+
+
+    /**
+     * @description: 批量修改信息点
+     * @param: objectUrlParam 对象请求url通用参数
+     * @param: criteria post请求参数
+     * @return: com.persagy.dmp.common.DmpResult
+     */
+    @PostMapping(DmpUrlConstant.DEF_FUNCID_COLLECT_SET)
+    DmpResult batchUpdateObjectInfoCollect(@SpringQueryMap InstanceUrlParam objectUrlParam, @RequestBody JSONArray objectArr);
+
 }

+ 10 - 0
src/main/java/com/persagy/proxy/common/constant/DmpUrlConstant.java

@@ -148,5 +148,15 @@ public class DmpUrlConstant {
      */
     public static final String RELATION_PROJECT_CAL_DELETE = "/rwd/instance/relation/project/cal/delete";
 
+    /**
+     * 查询采集信息点
+     */
+    public final static String DEF_FUNCID_COLLECT = "/rwd/def/funcid/collect/query";
+
+    /**
+     * 批量设置采集信息点
+     */
+    public final static String DEF_FUNCID_COLLECT_SET = "/rwd/def/funcid/collect/updateBatch";
+
 
 }