ソースを参照

fix:空间查询优化

lvxianyun 3 年 前
コミット
762cd73cb6

+ 75 - 77
src/main/java/com/persagy/proxy/adm/service/impl/AdmSpaceServiceImpl.java

@@ -10,20 +10,19 @@ 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.google.common.collect.Sets;
 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.dmp.digital.entity.ObjectRelation;
 import com.persagy.proxy.adm.model.AdmDCSQueryRequest;
+import com.persagy.proxy.adm.model.AdmEquipment;
 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.IAdmEquipmentService;
 import com.persagy.proxy.adm.service.IAdmRelationService;
 import com.persagy.proxy.adm.service.IAdmSpaceService;
 import com.persagy.proxy.adm.utils.AdmContextUtil;
-import com.persagy.proxy.adm.utils.AdmQueryCriteriaHelper;
 import com.persagy.proxy.common.client.DmpRwdClient;
 import com.persagy.proxy.common.entity.DmpResult;
 import com.persagy.proxy.common.entity.InstanceUrlParam;
@@ -49,6 +48,8 @@ public class AdmSpaceServiceImpl extends AbstractAdmBaseServiceImpl<AdmSpace> im
     private ObjectMapper objectMapper;
     @Autowired
     private IAdmRelationService relationService;
+    @Autowired
+    protected IAdmEquipmentService equipmentService;
 
     @Override
     public List<AdmSpace> doInsertExt(InstanceUrlParam context, Class<AdmSpace> clazz, List<AdmSpace> voList) {
@@ -94,91 +95,88 @@ public class AdmSpaceServiceImpl extends AbstractAdmBaseServiceImpl<AdmSpace> im
 
     @Override
     public AdmResponse doQuerySpaces(InstanceUrlParam context, AdmDCSQueryRequest request) {
-        QueryCriteria dmpRequest = AdmQueryCriteriaHelper.toDmpCriteria(request);
-        //查询的时候,floorId,buildingId 按照空间对象的自定义信息点处理
-        //TODO 这个ifelse判断是原来的代码实现,写此方法实现的时候不清楚实际业务,保留原来的判断,之后了解业务再根据业务调整
-        DmpResult<JSONArray> result = new DmpResult<>();
-        List spaceArray = new ArrayList();
-        Set<String> zoneTypeList = StrUtil.isNotEmpty(request.getZoneType()) ? Sets.newHashSet(request.getZoneType()) 
-				: (request.getZoneTypeList() == null ? Sets.newHashSet() : request.getZoneTypeList());
+        AdmQueryCriteria admQueryCriteria = new AdmQueryCriteria();
+        admQueryCriteria.setName(AdmSpace.OBJ_TYPE);
+        String classCodeFilter = "";
+        if(StrUtil.isNotEmpty(request.getZoneType())){
+            classCodeFilter = "classCode = '"+request.getZoneType()+"'";
+        }else{
+            StringBuffer zoneTypefilters = new StringBuffer(" classCode ");
+            zoneTypefilters.append("in ['");
+            request.getZoneTypeList().stream().forEach(code ->{
+                zoneTypefilters.append(code).append("',");
+            });
+            classCodeFilter = StrUtil.sub(zoneTypefilters.toString(),0,-1)+"']";
+        }
+        String filters = request.getFilters();
+        if(StrUtil.isBlank(filters)){
+            admQueryCriteria.setFilters(filters);
+        }else{
+            admQueryCriteria.setFilters(filters+";"+classCodeFilter);
+        }
         if(StrUtil.isNotEmpty(request.getBuildingId()) && StrUtil.isNotEmpty(request.getFloorId()) && !request.getFloorId().equals("isnull")){
-            querySpaceByFl(dmpRequest,context, spaceArray, zoneTypeList, request.getFloorId(), "Fl2Sp");
+            //明确建筑,明确楼层
+            ObjectNode relationTo = JsonNodeFactory.instance.objectNode();
+            relationTo.put("relCode", "Fl2Sp");
+            relationTo.put("graphCode", "MechInArch");
+            relationTo.put("objFrom", request.getFloorId());
+            admQueryCriteria.setRelationFrom(relationTo);
 
         }else if(StrUtil.isNotEmpty(request.getBuildingId()) && StrUtil.isNotEmpty(request.getFloorId()) && request.getFloorId().equals("isnull")){
-            QueryCriteria queryFloor = ensureQueryCommParm(dmpRequest,context, Arrays.asList("floor"), AdmFloor.OBJ_TYPE);
-            ObjectNode criteriaFl = queryFloor.getCriteria();
-            criteriaFl.put("buildingId", request.getBuildingId());
-            queryFloor.setCriteria(criteriaFl);
-            DmpResult<JSONArray> dmpResultFloors = queryObj(context, queryFloor);
-            List<AdmFloor> floorList = JSONUtil.toList(JSONUtil.toJsonStr(dmpResultFloors.getData()), AdmFloor.class);
-            Map<String, AdmFloor> floorMap = CollUtil.fieldValueMap(floorList, BaseEntity.PROP_ID);
-
-            if(CollUtil.isNotEmpty(floorMap)){
-                QueryCriteria queryCriteria = ensureQueryCommParm(dmpRequest, context, zoneTypeList, AdmSpace.OBJ_TYPE);
-                ObjectNode criteriaPe = queryCriteria.getCriteria();
-                JSONArray jsonArray = new JSONArray();
-                floorMap.keySet().forEach(floorId -> jsonArray.add(floorId));
-                criteriaPe.putPOJO("floorId", jsonArray);
-                queryCriteria.setCriteria(criteriaPe);
-                result = queryObj(context, queryCriteria);
-                if(CollUtil.isNotEmpty(result.getData())){
-                    spaceArray.addAll(result.getData());
-                }
-                querySpaceByFl(dmpRequest, context, spaceArray, zoneTypeList, request.getBuildingId(), "Bd2Sp");
+            //明确建筑,不明确楼层
+            //查询建筑下的楼层
+            QueryCriteria queryCriteriaRelation = new QueryCriteria();
+            ObjectNode criteria = JsonNodeFactory.instance.objectNode();
+            criteria.put("relCdoe", "Bd2Fl");
+            criteria.put("graphCode", "ArchSubset");
+            criteria.put("objFrom", request.getBuildingId());
+            queryCriteriaRelation.setCriteria(criteria);
+            List<ObjectRelation> relations = relationService.queryByCondition(AdmContextUtil.toDmpContext(), queryCriteriaRelation);
+            if(CollUtil.isNotEmpty(relations)){
+                Map<String, ObjectRelation> objectRelationMap = CollUtil.fieldValueMap(relations, "objTo");
+                //查询 建筑 不在楼层下 的空间
+                ObjectNode relationTo = JsonNodeFactory.instance.objectNode();
+                relationTo.put("relCode", "Fl2Sp");
+                relationTo.put("graphCode", "MechInArch");
+                ArrayNode arrayNode = relationTo.putObject("objFrom").putArray("$in");
+                objectRelationMap.keySet().stream().forEach(floorId -> arrayNode.add(floorId));
+                relationTo.put("$bindFlag", false);
+                admQueryCriteria.setRelationFrom(relationTo);
+                admQueryCriteria.setFilters(admQueryCriteria.getFilters() + "; buildingId = '"+request.getBuildingId()+"'");
+            }else{
+                //查询建筑下的空间
+                ObjectNode relationTo = JsonNodeFactory.instance.objectNode();
+                relationTo.put("relCode", "Bd2Sp");
+                relationTo.put("graphCode", "MechInArch");
+                relationTo.put("objFrom", request.getBuildingId());
+                admQueryCriteria.setRelationFrom(relationTo);
             }
+
         }else if(StrUtil.isNotEmpty(request.getBuildingId()) && StrUtil.isEmpty(request.getFloorId()) && !request.getBuildingId().equals("isnull")){
-            querySpaceByFl(dmpRequest,context, spaceArray, zoneTypeList, request.getBuildingId(), "Bd2Sp");
+            //查询建筑下的空间
+            ObjectNode relationTo = JsonNodeFactory.instance.objectNode();
+            relationTo.put("relCode", "Bd2Sp");
+            relationTo.put("graphCode", "MechInArch");
+            relationTo.put("objFrom", request.getBuildingId());
+            admQueryCriteria.setRelationFrom(relationTo);
         }else if(StrUtil.isNotEmpty(request.getBuildingId()) && StrUtil.isEmpty(request.getFloorId()) && request.getBuildingId().equals("isnull")){
-            //未明确建筑
-            QueryCriteria queryCriteria = ensureQueryCommParm(dmpRequest, context, zoneTypeList, "space");
-            ObjectNode criteriaPe = queryCriteria.getCriteria();
-            JSONObject isnull = new JSONObject();
-            isnull.put("$null", true);
-            criteriaPe.putPOJO("buildingId", isnull);
-            queryCriteria.setCriteria(criteriaPe);
-            result = queryObj(context, queryCriteria);
-            if(CollUtil.isNotEmpty(result.getData())){
-                spaceArray.addAll(result.getData());
-            }
+            //未明确建筑下的空间
+            //查询建筑下的空间
+            ObjectNode relationTo = JsonNodeFactory.instance.objectNode();
+            relationTo.put("relCode", "Bd2Sp");
+            relationTo.put("graphCode", "MechInArch");
+            relationTo.put("$bindFlag", false);
+            admQueryCriteria.setRelationFrom(relationTo);
         }else if(StrUtil.isEmpty(request.getBuildingId()) && StrUtil.isEmpty(request.getFloorId())){
-            QueryCriteria queryCriteria = ensureQueryCommParm(dmpRequest, context, zoneTypeList, "space");
-           /* ObjectNode criteriaPe = queryCriteria.getCriteria();
-            JSONObject isnull = new JSONObject();
-            isnull.put("$null", true);
-            criteriaPe.putPOJO("floorId", isnull);
-            queryCriteria.setCriteria(criteriaPe);*/
-            result = queryObj(context, queryCriteria);
-            if(CollUtil.isNotEmpty(result.getData())){
-                spaceArray.addAll(result.getData());
-            }
         }
-        AdmResponse admResponse = new AdmResponse();
-        admResponse.setContent(spaceArray);
-        admResponse.setTotal(spaceArray.size()*1l);
-        admResponse.setPageSize(request.getPageSize());
-        admResponse.setPageNumber(request.getPageNumber());
-        admResponse.setResult(DmpResult.SUCCESS);
-        admResponse.setMessage("");
-        return admResponse;
-    }
 
-    /**
-     * 根据信息点查询空间
-     * @param context
-     * @param spaceArray
-     * @param zoneTypeList
-     * @param objFrom  flooIds /  bulidingIds
-     * @param relCode
-     */
-    private void querySpaceByFl(QueryCriteria dmpRequest, InstanceUrlParam context, List spaceArray, Set<String> zoneTypeList, String objFrom, String relCode){
-        QueryCriteria queryCriteria = ensureQueryCommParm(dmpRequest,context, zoneTypeList, AdmSpace.OBJ_TYPE);
-        addRelationTo(queryCriteria,objFrom,relCode);
-        DmpResult<JSONArray> dmpResult = queryObj(context, queryCriteria);
-        if(CollUtil.isNotEmpty(dmpResult.getData())){
-            spaceArray.addAll(dmpResult.getData());
-        }
+        AdmResponse response = doQuery(AdmContextUtil.toDmpContext(), admQueryCriteria, AdmSpace.class);
+        // 空间需要补充分类名称属性
+        equipmentService.ensureSpecialValues(context, (List<AdmEquipment>) response.getContent());
+        return response;
     }
 
+
     @Override
     public List<AdmSpace> querySpaceInShaft(InstanceUrlParam context, String shaftId, String spaceType) {
         AdmQueryCriteria request = new AdmQueryCriteria();