Parcourir la source

siteModel, dataSet, filter 比较高度
准备合并数据集功能前的代码, 只合并dataSet数据

wuweihao il y a 3 ans
Parent
commit
5b5788a57f

+ 8 - 0
README.md

@@ -161,6 +161,14 @@ t-40 (t-vZkqRV8):
     2.4 合并tiled_map: 直接复制被合并场景数据, 修改floor_id: 为site_model对应的类型为floor的id
     
     3. 部署时,注意修改模板siteModel模板,把房间数据删除
+    
+    
+    
+    2021-09-16
+    拿dataSet.location.z 值去siteModel判断是否在z_min,z.max之间, 在的话,更新dataSet.siteMdoel_id
+    然后返回siteModel值
+    
+    
    
   
   

+ 10 - 1
laser/src/main/java/com/fdkankan/indoor/core/controller/SiteModelController.java

@@ -169,10 +169,19 @@ public class SiteModelController {
     }
 
 
+    /**
+     * 2021-09-16
+     * 1. 重置site_model, 把所有房间数据去掉,保留floor类型
+     * 2. 更新data_set.site_model_ids, 如果data_set.location.z值在site_model.z_min,z_max之间, data_set.site_model_ids值是对的,否则把
+     *  id为floor的去掉, 且把房间id也去掉。
+     * @param sceneCode
+     * @return
+     */
     @WebControllerLog(description = "分类信息-初始化表")
     @ApiOperation(value = "初始化表", notes = "传入参数目前不处理")
     @PostMapping("indoor/{sceneCode}/api/site_model/generate")
-    public Object initSiteModel(@PathVariable String sceneCode, @RequestBody List<SiteDto> param) {
+//    public Object initSiteModel(@PathVariable String sceneCode, @RequestBody Object param) {
+    public Object initSiteModel(@PathVariable String sceneCode) {
         Result search = entityService.initSiteModel(sceneCode);
         return search.getData();
     }

+ 125 - 0
laser/src/main/java/com/fdkankan/indoor/core/service/impl/DataSetServiceImpl.java

@@ -10,6 +10,7 @@ import com.fdkankan.indoor.core.entity.*;
 import com.fdkankan.indoor.core.entity.dto.FilterHotDto;
 import com.fdkankan.indoor.core.entity.dto.PoiHotDto;
 import com.fdkankan.indoor.core.entity.dto.SecurityDto;
+import com.fdkankan.indoor.core.entity.dto.SiteDto;
 import com.fdkankan.indoor.core.entity.po.DataSetPo;
 import com.fdkankan.indoor.core.mapper.DataSetMapper;
 import com.fdkankan.indoor.core.service.*;
@@ -48,9 +49,16 @@ public class DataSetServiceImpl extends IBaseServiceImpl implements DataSetServi
     @Autowired
     ControlPointCalculateService controlPointCalculateService;
 
+    @Autowired
+    FilterService filterService;
+
+    @Autowired
+    SiteModelService siteModelService;
+
 
     @Override
     public void save(DataSetEntity entity) {
+        entity.setUpdateTime(LocalDateTime.now());
         dataSetMapper.save(entity);
     }
 
@@ -117,6 +125,10 @@ public class DataSetServiceImpl extends IBaseServiceImpl implements DataSetServi
         dataSetMapper.save(entity);
         log.info("更新dataSet数据完成");
 
+
+        // 2021-09-16 处理比较高度与是否在响应的楼层, 不在修改dateSet , filter表响应的siteModelId
+        executeDateSetBySetModelIds(sceneCode);
+
         return Result.success(getDataBySceneCodeAndDataSetId(sceneCode, newIds));
 
         // 2021-08-31 不需处理更新RouteMap并存入数据库
@@ -133,6 +145,119 @@ public class DataSetServiceImpl extends IBaseServiceImpl implements DataSetServi
     }
 
 
+
+    /**
+     * 2021-9-16
+     * 处理dataSet.site_model_ids, 是否在site_model.z_min,z_max范围内,且去掉房间ids
+     */
+    private void executeDateSetBySetModelIds(String sceneCode){
+        DataSetEntity dataSetEntity = this.findById(sceneCode);
+        if (dataSetEntity == null) {
+            String msg = "DataSet表数据不存在,请检查表数据, 场景码:" + sceneCode;
+            log.error(msg);
+            throw new BaseRuntimeException(msg);
+        }
+
+        List<DataSetPo> dataSetPoList = dataSetEntity.getData();
+
+        List<DataSetPo> resDataSet = new ArrayList<>();
+
+        SiteModelEntity modelEntity = siteModelService.findById(sceneCode);
+        if (modelEntity == null) {
+            String msg = "siteModel表数据不存在,请检查表数据, 场景码:" + sceneCode;
+            log.error(msg);
+            throw new BaseRuntimeException(msg);
+        }
+
+        List<SiteDto> modelData = modelEntity.getData();
+
+
+        // dataSet
+        for (DataSetPo dataSetPo : dataSetPoList) {
+            Double[] location = dataSetPo.getLocation();
+            // 高度值
+            Double z = location[2];
+
+            List<Integer> siteModelIds = new ArrayList<>();
+            // siteModel
+            for (SiteDto dto : modelData) {
+                siteModelIds.add(dto.getId());
+                List<SiteDto> children = dto.getChildren();
+                if (children.size() > 0) {
+                    // floor层
+                    for (SiteDto childFloor : children) {
+                        Double z_max = childFloor.getZ_max();
+                        Double z_min = childFloor.getZ_min();
+                        // 高度在该楼层范围之内
+                        if (z_max > z && z > z_min) {
+                            siteModelIds.add(childFloor.getId());
+                        }
+
+                        // 房间id
+                        List<SiteDto> childRoom = childFloor.getChildren();
+                        if (childRoom.size() > 0) {
+                            for (SiteDto siteDto : childRoom) {
+                                siteModelIds.add(siteDto.getId());
+                            }
+                        }
+
+                    }
+                }
+            }
+            dataSetPo.setSite_model_entity_ids(siteModelIds.toArray(new Integer[0]));
+            resDataSet.add(dataSetPo);
+        }
+
+        dataSetEntity.setData(resDataSet);
+        this.save(dataSetEntity);
+
+        // 处理Filter.site_model_id
+        executeFilterBySetModelId(sceneCode, resDataSet);
+    }
+
+
+    /**
+     * 2021-09-16
+     * @param sceneCode
+     * @param dataSets
+     */
+    private void executeFilterBySetModelId(String sceneCode, List<DataSetPo> dataSets){
+        FilterEntity filterEntity = filterService.findBySceneCode(sceneCode);
+        if (filterEntity == null) {
+            String msg = "filter表数据不存在,请检查表数据, 场景码:" + sceneCode;
+            log.error(msg);
+            throw new BaseRuntimeException(msg);
+        }
+
+        List<FilterHotDto> filterDatas = filterEntity.getData();
+        boolean flag = false;
+        List<FilterHotDto> resFilter = new ArrayList<>();
+        for (FilterHotDto dto : filterDatas) {
+            Integer datasetId = dto.getDataset_id();
+            Integer filterSiteModelEntityId = dto.getSite_model_entity_id();
+            for (DataSetPo dataSet : dataSets) {
+                if (datasetId == dataSet.getId()) {
+                    Integer[] ids = dataSet.getSite_model_entity_ids();
+                    List<Integer> idsList = Arrays.asList(ids);
+                    // 判断原filter.siteModelId是否包含在新的数组里, 包含则没变化,否则需要更新
+                    if (!idsList.contains(filterSiteModelEntityId)) {
+                        // 默认拿父级id
+                        dto.setSite_model_entity_id(ids[0]);
+                        flag = true;
+                    }
+                }
+            }
+            resFilter.add(dto);
+        }
+
+        if (flag) {
+            filterEntity.setData(resFilter);
+            filterService.save(filterEntity);
+        }
+
+
+    }
+
     /**
      *
      * @param location

+ 1 - 0
laser/src/main/java/com/fdkankan/indoor/core/service/impl/FilterServiceImpl.java

@@ -42,6 +42,7 @@ public class FilterServiceImpl implements FilterService {
 
     @Override
     public void save(FilterEntity entity) {
+        entity.setUpdateTime(LocalDateTime.now());
         filterMapper.save(entity);
     }
 

+ 149 - 8
laser/src/main/java/com/fdkankan/indoor/core/service/impl/SiteModelServiceImpl.java

@@ -4,16 +4,19 @@ import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.fdkankan.indoor.base.convert.DistanceUtil;
+import com.fdkankan.indoor.base.exception.BaseRuntimeException;
 import com.fdkankan.indoor.base.util.GisUtils;
 import com.fdkankan.indoor.base.util.Result;
+import com.fdkankan.indoor.core.entity.DataSetEntity;
+import com.fdkankan.indoor.core.entity.FilterEntity;
 import com.fdkankan.indoor.core.entity.SiteModelEntity;
+import com.fdkankan.indoor.core.entity.dto.FilterHotDto;
 import com.fdkankan.indoor.core.entity.dto.SiteDto;
 import com.fdkankan.indoor.core.entity.dto.SiteModelSearchDto;
 import com.fdkankan.indoor.core.entity.dto.SitePolygon;
+import com.fdkankan.indoor.core.entity.po.DataSetPo;
 import com.fdkankan.indoor.core.mapper.SiteModelMapper;
-import com.fdkankan.indoor.core.service.ControlPointService;
-import com.fdkankan.indoor.core.service.InitService;
-import com.fdkankan.indoor.core.service.SiteModelService;
+import com.fdkankan.indoor.core.service.*;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -45,6 +48,14 @@ public class SiteModelServiceImpl implements SiteModelService {
     @Autowired
     InitService initService;
 
+    @Autowired
+    DataSetService dataSetService;
+
+    @Autowired
+    FilterService filterService;
+
+
+    // updateSiteMode 只是这个方法用的
     private Integer maxId;
 
     @Override
@@ -272,13 +283,144 @@ public class SiteModelServiceImpl implements SiteModelService {
     @Override
     public Result initSiteModel(String sceneCode) {
 
-        initService.initSiteModel(sceneCode);
-        log.info("初始化siteModel完成: " + sceneCode);
+//        initService.initSiteModel(sceneCode);
+//        log.info("初始化siteModel完成: " + sceneCode);
+
+        SiteModelEntity entity = findById(sceneCode);
+        if (entity == null) {
+            String msg = "siteModel表数据不存在,请检查表数据, 场景码:" + sceneCode;
+            log.error(msg);
+            throw new BaseRuntimeException(msg);
+        }
+
+        // 去掉房间数据
+        List<SiteDto> data = entity.getData();
+        recursionRemoveRoom(data);
+
+        entity.setData(data);
+        this.save(entity);
+
+        // 更新dataSet.site_model_ids
+        executeDateSetBySetModelIds(sceneCode, data);
 
         return Result.success(getDataBySceneCode(sceneCode));
     }
 
 
+    /**
+     * 2021-9-16
+     * 处理dataSet.site_model_ids, 是否在site_model.z_min,z_max范围内,且去掉房间ids
+     */
+    private void executeDateSetBySetModelIds(String sceneCode, List<SiteDto> data){
+        DataSetEntity dataSetEntity = dataSetService.findById(sceneCode);
+        if (dataSetEntity == null) {
+            String msg = "DataSet表数据不存在,请检查表数据, 场景码:" + sceneCode;
+            log.error(msg);
+            throw new BaseRuntimeException(msg);
+        }
+
+        List<DataSetPo> dataSetPoList = dataSetEntity.getData();
+
+        List<DataSetPo> resDataSet = new ArrayList<>();
+        // dataSet
+        for (DataSetPo dataSetPo : dataSetPoList) {
+            Double[] location = dataSetPo.getLocation();
+            // 高度值
+            Double z = location[2];
+
+            List<Integer> siteModelIds = new ArrayList<>();
+            // siteModel
+            for (SiteDto dto : data) {
+                siteModelIds.add(dto.getId());
+                List<SiteDto> children = dto.getChildren();
+                if (children.size() > 0) {
+                    // floor层
+                    for (SiteDto childFloor : children) {
+                        Double z_max = childFloor.getZ_max();
+                        Double z_min = childFloor.getZ_min();
+                        // 高度在该楼层范围之内
+                        if (z_max > z && z > z_min) {
+                            siteModelIds.add(childFloor.getId());
+                        }
+                    }
+                }
+            }
+            dataSetPo.setSite_model_entity_ids(siteModelIds.toArray(new Integer[0]));
+            resDataSet.add(dataSetPo);
+        }
+
+        dataSetEntity.setData(resDataSet);
+        dataSetService.save(dataSetEntity);
+
+        // 处理Filter.site_model_id
+        executeFilterBySetModelId(sceneCode, resDataSet);
+    }
+
+
+    /**
+     * 2021-09-16
+     * @param sceneCode
+     * @param dataSets
+     */
+    private void executeFilterBySetModelId(String sceneCode, List<DataSetPo> dataSets){
+        FilterEntity filterEntity = filterService.findBySceneCode(sceneCode);
+        if (filterEntity == null) {
+            String msg = "filter表数据不存在,请检查表数据, 场景码:" + sceneCode;
+            log.error(msg);
+            throw new BaseRuntimeException(msg);
+        }
+
+        List<FilterHotDto> filterDatas = filterEntity.getData();
+        boolean flag = false;
+        List<FilterHotDto> resFilter = new ArrayList<>();
+        for (FilterHotDto dto : filterDatas) {
+            Integer datasetId = dto.getDataset_id();
+            Integer filterSiteModelEntityId = dto.getSite_model_entity_id();
+            for (DataSetPo dataSet : dataSets) {
+                if (datasetId == dataSet.getId()) {
+                    Integer[] ids = dataSet.getSite_model_entity_ids();
+                    List<Integer> idsList = Arrays.asList(ids);
+                    // 判断原filter.siteModelId是否包含在新的数组里, 包含则没变化,否则需要更新
+                    if (!idsList.contains(filterSiteModelEntityId)) {
+                        // 默认拿父级id
+                        dto.setSite_model_entity_id(ids[0]);
+                        flag = true;
+                    }
+                }
+            }
+            resFilter.add(dto);
+        }
+
+        if (flag) {
+            filterEntity.setData(resFilter);
+            filterService.save(filterEntity);
+        }
+
+
+    }
+
+
+
+    /**
+     * 2021-9-16
+     * 递归方法遍历, 删除房间
+     */
+    private  void recursionRemoveRoom(List<SiteDto> param){
+        for (SiteDto dto : param) {
+            // 递归调用
+            List<SiteDto> children = dto.getChildren();
+            if ("FLOOR".equals(dto.getType())){
+                children = new ArrayList<>();
+                dto.setChildren(children);
+            }
+            if (children.size() > 0) {
+                recursionRemoveRoom(children);
+            }
+        }
+    }
+
+
+
     // 判断的坐标在那个空间位置
     private boolean getSm(SiteDto model, Point2D.Double pointParam) {
         if (CollectionUtils.isEmpty(model.getPolygon().getCoordinates())
@@ -411,7 +553,6 @@ public class SiteModelServiceImpl implements SiteModelService {
     @Override
     public SiteModelEntity findById(String sceneCode){
         Optional<SiteModelEntity> optional = entityMapper.findById(sceneCode);
-
         return optional.orElse(null);
     }
 
@@ -499,6 +640,8 @@ public class SiteModelServiceImpl implements SiteModelService {
 
 
 
+
+
     /**
      * 2021-07-16
      * 递归出每一个对象
@@ -532,7 +675,6 @@ public class SiteModelServiceImpl implements SiteModelService {
                 organizeModels2(child, models);
             }
         }
-//        log.info("models.size: {}", models.size());
     }
 
 
@@ -545,7 +687,6 @@ public class SiteModelServiceImpl implements SiteModelService {
                 organizeModels3(child, models);
             }
         }
-//        log.info("models.size: {}", models.size());
     }
 
     // 把当前节点的children 设为空数组