Ver código fonte

合并场景

wuweihao 4 anos atrás
pai
commit
7e4b3777f2
23 arquivos alterados com 776 adições e 39 exclusões
  1. 49 2
      README.md
  2. 4 0
      laser/src/main/java/com/fdkankan/indoor/base/constant/ConfigConstant.java
  3. 48 0
      laser/src/main/java/com/fdkankan/indoor/base/convert/ModifyDataSets.java
  4. 1 1
      laser/src/main/java/com/fdkankan/indoor/core/controller/ConfigController.java
  5. 3 2
      laser/src/main/java/com/fdkankan/indoor/core/controller/DateSetController.java
  6. 35 0
      laser/src/main/java/com/fdkankan/indoor/core/controller/MergeSceneController.java
  7. 4 4
      laser/src/main/java/com/fdkankan/indoor/core/controller/SiteController.java
  8. 1 2
      laser/src/main/java/com/fdkankan/indoor/core/controller/TestController.java
  9. 3 0
      laser/src/main/java/com/fdkankan/indoor/core/entity/InitEntity.java
  10. 3 0
      laser/src/main/java/com/fdkankan/indoor/core/entity/dto/InitDto.java
  11. 19 0
      laser/src/main/java/com/fdkankan/indoor/core/entity/merge/MergeDateSetDto.java
  12. 4 0
      laser/src/main/java/com/fdkankan/indoor/core/service/DataSetService.java
  13. 7 0
      laser/src/main/java/com/fdkankan/indoor/core/service/FilterService.java
  14. 10 0
      laser/src/main/java/com/fdkankan/indoor/core/service/MergeSceneService.java
  15. 3 1
      laser/src/main/java/com/fdkankan/indoor/core/service/SiteService.java
  16. 2 3
      laser/src/main/java/com/fdkankan/indoor/core/service/impl/CloudServiceImpl.java
  17. 15 8
      laser/src/main/java/com/fdkankan/indoor/core/service/impl/DataSetServiceImpl.java
  18. 6 6
      laser/src/main/java/com/fdkankan/indoor/core/service/impl/FilterServiceImpl.java
  19. 7 0
      laser/src/main/java/com/fdkankan/indoor/core/service/impl/IBaseServiceImpl.java
  20. 2 1
      laser/src/main/java/com/fdkankan/indoor/core/service/impl/InitServiceImpl.java
  21. 484 0
      laser/src/main/java/com/fdkankan/indoor/core/service/impl/MergeSceneServiceImpl.java
  22. 4 9
      laser/src/main/java/com/fdkankan/indoor/core/service/impl/SiteServiceImpl.java
  23. 62 0
      laser/src/main/resources/data/site_mode_room.json

+ 49 - 2
README.md

@@ -111,6 +111,19 @@ t-RJlwqtc /mnt/data/00001002/872519700045627392/74ee2a39e656_202108041610248900/
 
 t-p307mDm
 
+t-iksBApb: /mnt/data/00001001/872819769751896064/74ee2a32dbde_202108051208519930/results
+t-vZkqRV8: /mnt/data/00001002/879394956404326400/00001002_202108231433277420/results
+
+t-30 (t-iksBApb): 
+    /mnt/data/00001001/872819769751896064/74ee2a32dbde_202108051208519930/results
+    /mnt/data/00001001/t-30
+    
+    
+t-40 (t-vZkqRV8): 
+    /mnt/data/00001002/879394956404326400/00001002_202108231433277420/results
+    /mnt/data/00001001/t-40
+
+
 
 # doc
  sit: http://test.4dkankan.com:9294/doc.html#/home
@@ -121,6 +134,40 @@ t-p307mDm
  
 # 流程
   
-  2021-8-24
+  2021-8-24 (废弃)
   前端上传点云数据 -> 调用算法 -> 按顺序生成chunk1、chunk2目录 -> 将chunk1目录上传oss -> 修改dateSet、siteModel表, 跟cloud.js相关的数据都修改一遍
-  -> siteModel 加一个房间  -> dataSet加一条数据           
+  -> siteModel 加一个房间  -> dataSet加一条数据   
+  
+  2021-08-25
+  合并场景,将B数据添加到A
+    -> t_dataSet : 数据重新需要改id, site_model_entity_ids, location(gps转原点再转gps, 用a的基础数据)
+    -> t_filter 数据重新初始化一次,改相应的id值
+    -> t_site_model, 只加房间 改对应的id值
+  
+  
+  
+# db
+    2021-8-25
+   sys_user   系统用户表
+   t_configs   配置信息
+   t_control_point   控制点表
+   t_cut_model  模型剪切表(las文件剪切信息)
+   t_data_set   数据集的位置和旋转角度 
+   t_filter   漫游点表
+   t_group      (写死的,登录区分)
+   t_health      (写死的,登录区分)
+   t_init   初始场景表(四维看看场景-> 激光场景)
+   t_license   (写死的,登录区分)
+   t_map    小地图 (可能弃用,之前洪果上传切图) :暂时弃用
+   t_map_small  小地图(编辑端,提供志彬接口) :暂时弃用
+   t_measurement  测量表
+   t_poi  热点表
+   t_poi_type_groups  热点分组表
+   t_poi_type  热点分类表
+   t_recount_info  重算记录表
+   t_route  路径规划信息表
+   t_site_model  数据集的分类信息
+   t_special_point 特殊点
+   t_tiled_map  地图 (展示端)
+   t_user  (写死的,登录区分)
+   t_users   (写死的,不区分)

+ 4 - 0
laser/src/main/java/com/fdkankan/indoor/base/constant/ConfigConstant.java

@@ -24,6 +24,10 @@ public class ConfigConstant {
     @Value("${web.site}")
     public String webSitePath;
 
+    @Value("${spring.profiles.active}")
+    public String active;
+
+
 
     /**redis token前缀*/
 //    @Value("${redis.prefix}")

+ 48 - 0
laser/src/main/java/com/fdkankan/indoor/base/convert/ModifyDataSets.java

@@ -6,6 +6,7 @@ import java.util.Map;
 
 import com.fdkankan.indoor.base.constant.TypeConstant;
 import com.fdkankan.indoor.core.entity.dto.SecurityDto;
+import com.fdkankan.indoor.core.entity.merge.MergeDateSetDto;
 import com.fdkankan.indoor.core.entity.po.DataSetPo;
 import net.sf.json.JSON;
 import net.sf.json.JSONArray;
@@ -99,6 +100,53 @@ public class ModifyDataSets {
 	}
 
 
+	/**
+	 * 合并场景使用
+	 * @param param
+	 * @return
+	 */
+	public static DataSetPo mergeDataSetPo(Map<String ,Double[]> param, MergeDateSetDto mergeDto){
+		DataSetPo po = new DataSetPo();
+
+		SecurityDto securityDto = new SecurityDto();
+
+		securityDto.setGroup_read(0);
+		securityDto.setGroup_write(1);
+		// 默认true
+		securityDto.setCan_write(true);
+		// 默认true
+		po.setSecurity(securityDto);
+
+		po.setId(mergeDto.getId());
+		po.setBundle_id(1);
+		po.setType("4dage");
+		po.setName(mergeDto.getName());
+		po.setTitle(mergeDto.getTitle());
+		po.setColor("pink");
+		po.setVisible(false);
+
+		//double[] location = {0,0,0};
+		//location = TransformGPS.convert(location);
+		//原点 ,获取特征点的原点
+//		Double[] doubles = param.get(TypeConstant.POI_ORIGIN);
+		po.setLocation(param.get(TypeConstant.POI_ORIGIN));
+		po.setOrientation(0.0);
+//		Integer[] site_model_entity_ids = {mergeDto.getSite_model_entity_ids()};
+		po.setSite_model_entity_ids(mergeDto.getSite_model_entity_ids());
+		po.setPoint_cloud_type("POTREE");
+
+		//添加boundingbox,从modifyCloud里的convertFromBoundingBox获取
+
+		// 使用的是虚拟坐标
+		po.setBounding_box_max(param.get(TypeConstant.POI_BOUNDINGBOX_MAX));
+		po.setBounding_box_min(param.get(TypeConstant.POI_BOUNDINGBOX_MIN));
+
+		po.setHas_depth_images(true);
+		po.setHas_images(true);
+		return po;
+	}
+
+
 	
 	public static JSONArray readSiteModel() throws IOException { 
 		String str = FileUtil.readStringFile(inputFilePath);

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

@@ -12,7 +12,7 @@ import org.springframework.web.bind.annotation.RestController;
 /**
  * Created by owen on 2021/8/5 0005 20:56
  */
-@Api(tags = "Config管理")
+@Api(tags = "config-配置信息")
 @RestController
 public class ConfigController {
 

+ 3 - 2
laser/src/main/java/com/fdkankan/indoor/core/controller/DateSetController.java

@@ -18,7 +18,7 @@ import java.util.List;
  *
  */
 @Slf4j
-@Api(tags = "场景信息接口(dataSet)")
+@Api(tags = "dataSet-数据集的位置和旋转角度")
 @RestController
 public class DateSetController {
 
@@ -40,8 +40,9 @@ public class DateSetController {
     }
 
 
+
     @WebControllerLog(description = "场景信息接口-修改")
-    @ApiOperation(value = "修改数据")
+    @ApiOperation(value = "修改数据", notes = "会修改route数据")
     @PutMapping("indoor/{sceneCode}/api/datasets")
     public Object update(@PathVariable String sceneCode, @RequestBody List<DataSetPo> param) {
         Result result = entityService.update(sceneCode, param);

+ 35 - 0
laser/src/main/java/com/fdkankan/indoor/core/controller/MergeSceneController.java

@@ -0,0 +1,35 @@
+package com.fdkankan.indoor.core.controller;
+
+import com.fdkankan.indoor.base.aop.WebControllerLog;
+import com.fdkankan.indoor.base.util.Result;
+import com.fdkankan.indoor.core.service.MergeSceneService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.Map;
+
+/**
+ * Created by owen on 2021/8/25 0025 10:03
+ *
+ */
+@Api(tags = "合并场景管理")
+@RestController
+public class MergeSceneController {
+
+
+    @Autowired
+    MergeSceneService mergeSceneService;
+
+    @WebControllerLog(description = "合并场景")
+    @ApiOperation(value = "合并场景", notes = "将mergeCode场景合并到sceneCode场景")
+    @PostMapping("indoor/{sceneCode}/api/merge/{mergeCode}")
+    public Result merge(@PathVariable String sceneCode, @PathVariable String mergeCode){
+        return mergeSceneService.merge(sceneCode, mergeCode);
+    }
+}

+ 4 - 4
laser/src/main/java/com/fdkankan/indoor/core/controller/SiteController.java

@@ -5,7 +5,7 @@ import com.fdkankan.indoor.base.aop.WebControllerLog;
 import com.fdkankan.indoor.base.util.Result;
 import com.fdkankan.indoor.core.entity.dto.SiteDto;
 import com.fdkankan.indoor.core.entity.dto.SiteModelSearchDto;
-import com.fdkankan.indoor.core.service.SiteService;
+import com.fdkankan.indoor.core.service.SiteModelService;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -27,14 +27,14 @@ import java.util.List;
  * 数据集的分类信息
  */
 @Slf4j
-@Api(tags = "分类信息-SiteModel")
+@Api(tags = "siteModel-数据集的分类信息")
 @RestController
 @AllArgsConstructor
-public class SiteController {
+public class SiteModelController {
 
 
     @Autowired
-    SiteService entityService;
+    SiteModelService entityService;
 
 
     /**

+ 1 - 2
laser/src/main/java/com/fdkankan/indoor/core/controller/TestController.java

@@ -1,7 +1,6 @@
 package com.fdkankan.indoor.core.controller;
 
 import com.fdkankan.indoor.base.util.AliYunOssUtil;
-import com.fdkankan.indoor.base.util.CmdUtils;
 import com.fdkankan.indoor.base.util.Result;
 import com.fdkankan.indoor.base.util.SnowFlakeUUidUtils;
 import com.fdkankan.indoor.core.entity.OwenEntity;
@@ -37,7 +36,7 @@ public class TestController {
     SpecialPointService specialPointService;
 
     @Autowired
-    SiteService siteService;
+    SiteModelService siteService;
 
     @Autowired
     MeasurementService measurementService;

+ 3 - 0
laser/src/main/java/com/fdkankan/indoor/core/entity/InitEntity.java

@@ -51,4 +51,7 @@ public class InitEntity {
     @ApiModelProperty(value = "用户Id")
     private Long userId;
 
+    @ApiModelProperty(value = "手机号")
+    private String phone;
+
 }

+ 3 - 0
laser/src/main/java/com/fdkankan/indoor/core/entity/dto/InitDto.java

@@ -37,6 +37,9 @@ public class InitDto {
     @ApiModelProperty(value = "用户Id")
     private Long userId;
 
+    @ApiModelProperty(value = "手机号")
+    private String phone;
+
 
 
 }

+ 19 - 0
laser/src/main/java/com/fdkankan/indoor/core/entity/merge/MergeDateSetDto.java

@@ -0,0 +1,19 @@
+package com.fdkankan.indoor.core.entity.merge;
+
+import lombok.Data;
+
+/**
+ * Created by owen on 2021/8/25 0025 15:42
+ */
+@Data
+public class MergeDateSetDto {
+
+    private Integer id;
+
+    private String name;
+
+    private String title;
+
+    // 这里入参不用数组
+    private Integer[] site_model_entity_ids;
+}

+ 4 - 0
laser/src/main/java/com/fdkankan/indoor/core/service/DataSetService.java

@@ -19,4 +19,8 @@ public interface DataSetService {
     void remove(String sceneCode);
 
     Result findByDataSetId(String sceneCode, Integer dataSetId);
+
+    List<DataSetPo> getDataBySceneCode(String sceneCode);
+
+    DataSetEntity findById(String sceneCode);
 }

+ 7 - 0
laser/src/main/java/com/fdkankan/indoor/core/service/FilterService.java

@@ -5,6 +5,7 @@ import com.fdkankan.indoor.core.entity.dto.*;
 import com.fdkankan.indoor.core.entity.FilterEntity;
 
 import java.util.List;
+import java.util.Optional;
 
 /**
  * Created by owen on 2021/7/15 0015 16:00
@@ -26,4 +27,10 @@ public interface FilterService {
     Result findByDataSetId(String code, Integer dataset_id);
 
     Result updateDataSet(String sceneCode, List<FilterDataSetPutDto> param);
+
+
+     FilterEntity findBySceneCode(String sceneCode);
+
+     List<FilterHotDto> getDataBySceneCode(String sceneCode);
+
 }

+ 10 - 0
laser/src/main/java/com/fdkankan/indoor/core/service/MergeSceneService.java

@@ -0,0 +1,10 @@
+package com.fdkankan.indoor.core.service;
+
+import com.fdkankan.indoor.base.util.Result;
+
+/**
+ * Created by owen on 2021/8/25 0025 10:58
+ */
+public interface MergeSceneService {
+    Result merge(String sceneCode, String mergeCode);
+}

+ 3 - 1
laser/src/main/java/com/fdkankan/indoor/core/service/SiteService.java

@@ -11,7 +11,7 @@ import java.util.List;
 /**
  * Created by owen on 2021/7/28 0028 12:02
  */
-public interface SiteService {
+public interface SiteModelService {
     Result findBySceneCodeAndId(String sceneCode, Long id);
 
     Result search(String sceneCode, SiteModelSearchDto searchDto);
@@ -35,4 +35,6 @@ public interface SiteService {
     Result initSiteModel(String sceneCode);
 
     SiteModelEntity findById(String sceneCode);
+
+    List<SiteDto> getDataBySceneCode(String sceneCode);
 }

+ 2 - 3
laser/src/main/java/com/fdkankan/indoor/core/service/impl/CloudServiceImpl.java

@@ -13,7 +13,7 @@ import com.fdkankan.indoor.core.entity.SpecialPointEntity;
 import com.fdkankan.indoor.core.entity.dto.SiteDto;
 import com.fdkankan.indoor.core.entity.dto.SitePolygon;
 import com.fdkankan.indoor.core.service.CloudService;
-import com.fdkankan.indoor.core.service.SiteService;
+import com.fdkankan.indoor.core.service.SiteModelService;
 import com.fdkankan.indoor.core.service.SpecialPointService;
 import lombok.extern.slf4j.Slf4j;
 import net.sf.json.JSONArray;
@@ -25,7 +25,6 @@ import org.springframework.web.multipart.MultipartFile;
 import java.io.IOException;
 import java.time.LocalDateTime;
 import java.util.Arrays;
-import java.util.HashMap;
 import java.util.List;
 import java.util.UUID;
 
@@ -40,7 +39,7 @@ public class CloudServiceImpl extends IBaseServiceImpl implements CloudService {
     SpecialPointService specialPointService;
 
     @Autowired
-    SiteService siteService;
+    SiteModelService siteService;
 
 
     @Override

+ 15 - 8
laser/src/main/java/com/fdkankan/indoor/core/service/impl/DataSetServiceImpl.java

@@ -179,8 +179,8 @@ public class DataSetServiceImpl extends IBaseServiceImpl implements DataSetServi
         return Result.success();
     }
 
-
-    private List<DataSetPo> getDataBySceneCode(String sceneCode){
+    @Override
+    public List<DataSetPo> getDataBySceneCode(String sceneCode){
         DataSetEntity entity = findById(sceneCode);
         return entity.getData();
     }
@@ -203,13 +203,20 @@ public class DataSetServiceImpl extends IBaseServiceImpl implements DataSetServi
 
 
 
-    private DataSetEntity findById(String sceneCode){
-        Optional<DataSetEntity> optional = dataSetMapper.findById(sceneCode);
-        if (!optional.isPresent()) {
-            throw new BaseRuntimeException(MsgCode.e3001, "对象不存在");
-        }
-        return optional.orElseGet(optional::get);
+//    private DataSetEntity findById(String sceneCode){
+//        Optional<DataSetEntity> optional = dataSetMapper.findById(sceneCode);
+//        if (!optional.isPresent()) {
+//            throw new BaseRuntimeException(MsgCode.e3001, "对象不存在");
+//        }
+//        return optional.orElseGet(optional::get);
+//
+//    }
 
+
+    @Override
+    public DataSetEntity findById(String sceneCode){
+        Optional<DataSetEntity> optional = dataSetMapper.findById(sceneCode);
+        return optional.orElse(null);
     }
 
 

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

@@ -7,11 +7,10 @@ import com.fdkankan.indoor.base.exception.BaseRuntimeException;
 import com.fdkankan.indoor.base.util.*;
 import com.fdkankan.indoor.core.entity.dto.*;
 import com.fdkankan.indoor.core.entity.FilterEntity;
-import com.fdkankan.indoor.core.entity.po.DataSetPo;
 import com.fdkankan.indoor.core.entity.vo.FilterDataSetHotVo;
 import com.fdkankan.indoor.core.mapper.FilterMapper;
 import com.fdkankan.indoor.core.service.FilterService;
-import com.fdkankan.indoor.core.service.SiteService;
+import com.fdkankan.indoor.core.service.SiteModelService;
 import lombok.extern.slf4j.Slf4j;
 import org.junit.Test;
 import org.springframework.beans.BeanUtils;
@@ -37,7 +36,7 @@ public class FilterServiceImpl implements FilterService {
     MongoTemplate mongoTemplate;
 
     @Autowired
-    SiteService siteService;
+    SiteModelService siteService;
 
 
 
@@ -48,13 +47,14 @@ public class FilterServiceImpl implements FilterService {
 
 
 
-
-    private FilterEntity findBySceneCode(String sceneCode){
+    @Override
+    public FilterEntity findBySceneCode(String sceneCode){
         Optional<FilterEntity> optional = filterMapper.findById(sceneCode);
         return optional.orElse(null);
     }
 
-    private List<FilterHotDto> getDataBySceneCode(String sceneCode){
+    @Override
+    public List<FilterHotDto> getDataBySceneCode(String sceneCode){
         FilterEntity entity = findBySceneCode(sceneCode);
         List<FilterHotDto> data = entity.getData();
         return data;

+ 7 - 0
laser/src/main/java/com/fdkankan/indoor/core/service/impl/IBaseServiceImpl.java

@@ -2,6 +2,7 @@ package com.fdkankan.indoor.core.service.impl;
 
 import com.fdkankan.indoor.base.constant.ConfigConstant;
 import com.fdkankan.indoor.base.constant.TypeConstant;
+import com.fdkankan.indoor.base.util.RedisUtil;
 import com.fdkankan.indoor.core.entity.dto.PageDto;
 import com.fdkankan.indoor.core.entity.dto.SecurityDto;
 import lombok.extern.slf4j.Slf4j;
@@ -26,6 +27,10 @@ public class IBaseServiceImpl {
     RedisTemplate<String, String> redisTemplate;
 
 
+    @Autowired
+    RedisUtil redisUtil;
+
+
 
 
 
@@ -82,6 +87,8 @@ public class IBaseServiceImpl {
         return param;
     }
 
+
+
 }
 
 

+ 2 - 1
laser/src/main/java/com/fdkankan/indoor/core/service/impl/InitServiceImpl.java

@@ -55,7 +55,7 @@ public class InitServiceImpl implements InitService {
 
 
     @Autowired
-    SiteService siteService;
+    SiteModelService siteService;
 
     @Autowired
     SpecialPointService specialPointService;
@@ -139,6 +139,7 @@ public class InitServiceImpl implements InitService {
             // https://testlaser.4dkankan.com/maxkk/ + 场景码
             init.setWebSite(configConstant.webSitePath + sceneCode);
             init.setUserId(param.getUserId());
+            init.setPhone(param.getPhone());
 
             initMapper.save(init);
 

+ 484 - 0
laser/src/main/java/com/fdkankan/indoor/core/service/impl/MergeSceneServiceImpl.java

@@ -0,0 +1,484 @@
+package com.fdkankan.indoor.core.service.impl;
+
+import com.fdkankan.indoor.base.constant.ConfigConstant;
+import com.fdkankan.indoor.base.constant.MsgCode;
+import com.fdkankan.indoor.base.constant.TypeConstant;
+import com.fdkankan.indoor.base.convert.ConvertToVision;
+import com.fdkankan.indoor.base.convert.ModifyCloud;
+import com.fdkankan.indoor.base.convert.ModifyDataSets;
+import com.fdkankan.indoor.base.exception.BaseRuntimeException;
+import com.fdkankan.indoor.base.util.Result;
+import com.fdkankan.indoor.core.entity.*;
+import com.fdkankan.indoor.core.entity.dto.FilterHotDto;
+import com.fdkankan.indoor.core.entity.dto.SiteDto;
+import com.fdkankan.indoor.core.entity.dto.SitePolygon;
+import com.fdkankan.indoor.core.entity.merge.MergeDateSetDto;
+import com.fdkankan.indoor.core.entity.po.DataSetPo;
+import com.fdkankan.indoor.core.service.*;
+import lombok.extern.slf4j.Slf4j;
+import net.sf.json.JSONArray;
+import net.sf.json.JSONObject;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.time.LocalDateTime;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Created by owen on 2021/8/25 0025 10:59
+ */
+@Service
+@Slf4j
+public class MergeSceneServiceImpl extends IBaseServiceImpl implements MergeSceneService {
+
+
+
+    @Autowired
+    DataSetService dataSetService;
+
+    @Autowired
+    FilterService filterService;
+
+    @Autowired
+    SiteModelService siteModelService;
+
+    @Autowired
+    SpecialPointService specialPointService;
+
+    @Autowired
+    ConvertToVision convertToVision;
+
+    @Autowired
+    ControlPointService controlPointService;
+
+    @Autowired
+    ConfigConstant configConstant;
+
+    @Autowired
+    InitService initService;
+
+
+    /**
+     * 目前只支持没有合并过的场景
+     * @param sceneCode
+     * @param mergeCode
+     * @return
+     */
+    @Override
+    public Result merge(String sceneCode, String mergeCode) {
+
+        ControlPointEntity controlPoint = controlPointService.findById(sceneCode);
+
+        String mergePath = "";
+
+        if ("dev".equals(configConstant.active)) {
+            mergePath = configConstant.serverBasePath  + "/" + mergeCode + "/laserData";
+        } else {
+            mergePath = redisPath(mergeCode) + "/laserData";
+        }
+        log.info("合并场景路径:{}", mergePath);
+
+        // siteMode要优先处理;
+        Map<Object, Object> resMap = mergeSiteModel(sceneCode, mergeCode, mergePath, controlPoint);
+
+        Integer maxId = (Integer)resMap.get("maxId");
+
+        // dateSet.siteModelId是数组
+        List<Integer> siteModeIds = (List<Integer>)resMap.get("ids");
+        mergeDateSet(sceneCode, mergeCode, siteModeIds);
+
+
+        mergeFilter(sceneCode, mergeCode, controlPoint, mergePath, maxId);
+
+
+        return Result.success();
+    }
+
+    private void  mergeDateSet(String sceneCode, String mergeCode, List<Integer> siteModeIds){
+
+        // 获取原场景数据
+        DataSetEntity entity = dataSetService.findById(sceneCode);
+        if (entity == null) {
+            throw new BaseRuntimeException("原dataSet数据不存在: " + sceneCode);
+        }
+
+        List<DataSetPo> originalData = entity.getData();
+
+
+        Integer originalMaxId = 0;
+        // 获取原场景数据最大id
+        if (originalData.size() != 0) {
+            Optional<DataSetPo> max = originalData.stream().max(Comparator.comparingInt(DataSetPo::getId));
+            originalMaxId = max.get().getId();
+        }
+
+        // 更新添加数据
+        MergeDateSetDto mergeDto = new MergeDateSetDto();
+        mergeDto.setId(originalMaxId + 1);
+        // 使用场景码
+        mergeDto.setName(mergeCode);
+        mergeDto.setTitle(mergeCode);
+        // new Integer[0]:实例化一个Integer类的对象,并给该对象附值为0
+        mergeDto.setSite_model_entity_ids(siteModeIds.toArray(new Integer[0]));
+
+
+        List<DataSetPo> dataSetPos = initMergeDataSet(sceneCode, mergeDto);
+
+        // 添加数据
+        originalData.addAll(dataSetPos);
+
+        entity.setData(originalData);
+
+        dataSetService.save(entity);
+        log.info("dataSet合并完成");
+
+
+    }
+
+
+    private void  mergeFilter(String sceneCode, String mergeCode, ControlPointEntity controlPoint, String mergePath, Integer newSiteModelId){
+
+
+        // 获取原场景数据
+        FilterEntity entity = filterService.findBySceneCode(sceneCode);
+        if (entity == null) {
+            throw new BaseRuntimeException("原Filter数据不存在: " + sceneCode);
+        }
+
+        List<FilterHotDto> originalData = entity.getData();
+
+
+        Integer originalMaxId = 0;
+        // 获取原场景数据最大id
+        if (originalData.size() != 0) {
+            Optional<FilterHotDto> max = originalData.stream().max(Comparator.comparingInt(FilterHotDto::getId));
+            originalMaxId = max.get().getId();
+        }
+
+        // 获取合并的场景码数据
+        List<FilterHotDto>  mergeData = initMergeFilter(mergeCode, mergePath, controlPoint);
+
+
+        for (FilterHotDto merge : mergeData) {
+            originalMaxId ++;
+            log.info("处理后maxId: {}", originalMaxId);
+            merge.setId(originalMaxId);
+
+            // todo 使用场景码作为路径
+            merge.setFile_path("data/" + mergeCode);
+            merge.setSite_model_entity_id(newSiteModelId);
+            // 添加数据
+            originalData.add(merge);
+        }
+
+        entity.setData(originalData);
+
+        filterService.save(entity);
+        log.info("filter合并完成");
+
+    }
+
+
+    private Map<Object, Object>  mergeSiteModel(String sceneCode, String mergeCode, String mergePath, ControlPointEntity controlPoint){
+
+        // 获取原场景数据
+        SiteModelEntity entity = siteModelService.findById(sceneCode);
+        if (entity == null) {
+            throw new BaseRuntimeException("原SiteModel数据不存在: " + sceneCode);
+        }
+
+        List<SiteDto> originalData = entity.getData();
+
+
+        // 初始化房间数据
+        SiteDto roomDto = initMergeSiteModel(mergeCode, mergePath,controlPoint);
+
+        // 添加数据
+        Map<Object, Object> resMap = setRoom(originalData, roomDto);
+         originalData = (List<SiteDto>) resMap.get("data");
+
+
+        // 添加数据
+
+        entity.setData(originalData);
+        entity.setUpdateTime(LocalDateTime.now());
+
+        siteModelService.save(entity);
+        log.info("siteModel合并完成");
+
+        return resMap;
+
+    }
+
+    /**
+     * 
+     * @param dto 原数据
+     * @param roomDto  需要加入的房间
+     */
+    private Map<Object, Object> setRoom(List<SiteDto> dto, SiteDto roomDto) {
+        // 用来获取最大id
+        List<Integer> ids = new ArrayList<>();
+        dto.forEach(p -> {
+            ids.add(p.getId());
+            List<SiteDto> floorChild = p.getChildren();
+            floorChild.forEach(f -> {
+                ids.add(f.getId());
+
+                List<SiteDto> roomChild = f.getChildren();
+                roomChild.forEach(r -> {
+                    ids.add(r.getId());
+                        });
+
+            });
+
+        });
+
+        // 获取最大id
+        Integer maxId = ids.stream().reduce(Integer::max).get();
+        log.info("最大id: {}" , maxId);
+
+        for (SiteDto buildingDto : dto) {
+            List<SiteDto> floorChild = buildingDto.getChildren();
+            for (SiteDto roomDtos : floorChild) {
+                maxId ++;
+                roomDto.setId(maxId);
+                List<SiteDto> children = roomDtos.getChildren();
+                // 加入房间
+                children.add(roomDto);
+            }
+            
+        }
+
+
+        Map<Object, Object> result = new HashMap<>();
+        log.info("返回值最大id: {}" , maxId);
+        result.put("maxId", maxId);
+        result.put("data", dto);
+
+        // 提供给dataSet使用
+        ids.add(maxId);
+        result.put("ids", ids);
+        return result;
+
+    }
+
+
+    /**
+     * 初始化DataSet
+     * location: 原点坐标(特殊点表)
+     * bounding_box_max:(特殊点表)
+     * bounding_box_min:(特殊点表)
+     * @param sceneCode
+     *
+     */
+    private List<DataSetPo> initMergeDataSet(String sceneCode, MergeDateSetDto mergeDto){
+        // 设置原点坐标,通过场景码查询特殊点表的原点
+        List<SpecialPointEntity> spList =  specialPointService.findBySceneCode(sceneCode);
+        // 正常是5条记录: db.getCollection('t_special_point').find({"sceneCode":"t97"})
+        if (spList.size() != 5) {
+            throw new BaseRuntimeException(MsgCode.e3001, "特殊点表坐标异常");
+        }
+
+        Map<String, Double[]> map = new HashMap<>();
+        for (SpecialPointEntity sp : spList) {
+            String key = sp.getPoiKey();
+            // 使用虚拟坐标
+            if (TypeConstant.POI_BOUNDINGBOX_MAX.equals(key) || TypeConstant.POI_BOUNDINGBOX_MIN.equals(key)) {
+                map.put(key, sp.getPoi());
+            }
+            // 使用gps坐标
+            if (TypeConstant.POI_ORIGIN.equals(key)){
+                map.put(key, sp.getGpsPoi());
+            }
+        }
+
+        DataSetPo po = ModifyDataSets.mergeDataSetPo(map, mergeDto);
+        List<DataSetPo> dataSetPos = Arrays.asList(po);
+        log.info("DataSet数据初始化创建完成");
+
+        return dataSetPos;
+    }
+
+
+    /**
+     *
+     * @param sceneCode
+     * @param mergePath 合并文件地址
+     * @param dto
+     * @return
+     */
+    private List<FilterHotDto> initMergeFilter(String sceneCode, String mergePath, ControlPointEntity dto){
+        String path = mergePath +"/vision.txt";
+        log.info("path: {}", path);
+        if (!cn.hutool.core.io.FileUtil.isFile(path)){
+            throw new BaseRuntimeException(MsgCode.e3001, "vision.txt不存在");
+        }
+        JSONArray jsonArray = convertToVision.createFilter(sceneCode, path, dto);
+        FilterEntity entity = new FilterEntity();
+        entity.setId(sceneCode);
+        entity.setCreateTime(LocalDateTime.now());
+        //将array数组转换成对象
+        List<FilterHotDto> list = JSONArray.toList(jsonArray, FilterHotDto.class);
+        return list;
+    }
+
+    /**
+     * 初始化点云、siteModel
+     * @param maxId
+     * @param mergeCode
+     * @param mergePath
+     * @param dto
+     */
+    private SiteDto initMergeSiteModel(String mergeCode, String mergePath, ControlPointEntity dto){
+        SiteDto siteDto =  processCould(mergeCode, mergePath, dto);
+        return siteDto;
+    }
+
+    /**
+     * 处理could.js 并做相应的计算
+     * @param sceneCode
+     * @param path
+     */
+    private SiteDto processCould(String sceneCode, String path, ControlPointEntity dto){
+        path = path + "/webcloud/cloud.js";
+
+        try {
+            // 修改cloud.js文件
+            JSONObject info = ModifyCloud.fixCloud(path);
+
+            cn.hutool.core.io.FileUtil.writeUtf8String(info.toString(), path);
+            log.info("新的cloud.js写入服务器完成:{}", path);
+
+            /**
+             * 将boundingBox坐标转换成gis坐标, site_model需要
+             * boundingBox:虚拟点坐标,存特殊点, dataSet数据要使用
+             */
+            JSONObject boundingBox = ModifyCloud.getBoundingBox(info);
+            Double maxX = boundingBox.getDouble("maxX");
+            Double maxY = boundingBox.getDouble("maxY");
+            Double maxZ = boundingBox.getDouble("maxZ");
+
+            Double minX = boundingBox.getDouble("minX");
+            Double minY = boundingBox.getDouble("minY");
+            Double minZ = boundingBox.getDouble("minZ");
+
+            Double centreX = boundingBox.getDouble("centreX");
+            Double centreY = boundingBox.getDouble("centreY");
+            Double centreZ = boundingBox.getDouble("centreZ");
+
+
+            // 虚拟点坐标(四维看看坐标)
+//            Double[] ageMax = {maxX,maxY,maxZ};
+//            Double[] ageMin = {minX,minY,minZ};
+//            Double[] ageCentre = {centreX,centreY,centreZ};
+
+            JSONObject resJson = ModifyCloud.convertFromBoundingBox(boundingBox, dto);
+
+            Double[] gpsMax = getKey(resJson, "max");
+            Double[] gpsMin = getKey(resJson, "min");
+            Double[] gpsCentre = getKeyZ(resJson, "centre");
+
+            // 将数据保存到db
+//            saveSpecialPoint(sceneCode, TypeConstant.POI_BOUNDINGBOX_MAX, ageMax, gpsMax);
+//            saveSpecialPoint(sceneCode, TypeConstant.POI_BOUNDINGBOX_MIN, ageMin, gpsMin);
+//            saveSpecialPoint(sceneCode, TypeConstant.POI_CENTRE, ageCentre, gpsCentre);
+            log.info("max、min、中心点保存成功");
+
+
+            // 创建sitModel
+            SiteDto siteModel = createSiteModel(sceneCode, gpsMax, gpsMin, gpsCentre, maxZ, minZ);
+            return siteModel;
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+            return null;
+    }
+
+
+    /**
+     * 获取两个值的
+     * json数组转 double[]
+     * @param resJson
+     * @param key
+     * @return
+     */
+    private Double[] getKey(JSONObject resJson , String key){
+        JSONArray array = resJson.getJSONArray(key);
+        Double[] res = {array.getDouble(0), array.getDouble(1)};
+        return res;
+    }
+
+    /**
+     * 获取三个值的
+     * @param resJson
+     * @param key
+     * @return
+     */
+    private Double[] getKeyZ(JSONObject resJson , String key){
+        JSONArray array = resJson.getJSONArray(key);
+        Double[] res = {array.getDouble(0), array.getDouble(1), array.getDouble(2)};
+        return res;
+    }
+
+
+    private SiteDto createSiteModel(String sceneCode,  Double[] max,  Double[] min,  Double[] centre, Double maxZ, Double minZ){
+        // z_max、z_min 替换site_model的Floor、root类型
+        // max、min四个顶点替换BUILDING、FLOOR 的coordinates,
+        // 顺时针,(x_max,y_max),(x_max,y_min),(x_min,y_min),(x_min,y_max)
+        // 一般参数1:x, 参数2:Y
+        Double[] peak_1 = {max[0],max[1]};
+        Double[] peak_2 = {max[0],min[1]};
+        Double[] peak_3 = {min[0],min[1]};
+        Double[] peak_4 = {min[0],max[1]};
+        List<List<Double[]>> doubles = Arrays.asList(Arrays.asList(peak_1, peak_2, peak_3, peak_4));
+
+        // centre 替换BUILDING、FLOOR、ROOM 的center
+        log.info("中心点:{}, {}, {}", centre[0], centre[1], centre[2]);
+
+        // 获取模板对象
+        SiteDto siteDto = initSiteModelRoom();
+        siteDto.setCenter(centre);
+        siteDto.setZ_max(maxZ);
+        siteDto.setZ_min(minZ);
+
+        SitePolygon rPolygon = new SitePolygon();
+        rPolygon.setCoordinates(doubles);
+        rPolygon.setType("Polygon");
+        siteDto.setPolygon(rPolygon);
+
+        log.info("siteModel数据初始化创建完成");
+        return siteDto;
+    }
+
+
+    private SiteDto initSiteModelRoom(){
+        SiteDto dto = new SiteDto();
+        dto.setType("ROOM");
+        dto.setName("港10-1");
+        dto.setArea(2503.30551910935);
+        dto.setVolume(295513.21880627);
+        dto.setGeometry_hash(1605756229L);
+        return dto;
+    }
+
+
+    private String redisPath(String sceneCode) {
+        String initKey = TypeConstant.REDIS_INIT_PATH + sceneCode;
+        log.info("initKey: {}", initKey);
+        String initPath = redisTemplate.opsForValue().get(initKey);
+        if (initPath == null) {
+            log.info("initPath走数据库");
+            InitEntity initEntity = initService.findById(sceneCode);
+            if (initEntity == null) {
+                throw new BaseRuntimeException("init初始化数据不存: {}" +sceneCode);
+            }
+            initPath = initEntity.getPath();
+            redisTemplate.opsForValue().set(initKey, initPath, 24, TimeUnit.HOURS);
+        }
+        return initPath;
+    }
+
+
+}

+ 4 - 9
laser/src/main/java/com/fdkankan/indoor/core/service/impl/SiteServiceImpl.java

@@ -2,26 +2,20 @@ package com.fdkankan.indoor.core.service.impl;
 
 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.ControlPointEntity;
 import com.fdkankan.indoor.core.entity.SiteModelEntity;
-import com.fdkankan.indoor.core.entity.dto.PoiTypeDto;
 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.mapper.SiteModelMapper;
 import com.fdkankan.indoor.core.service.ControlPointService;
 import com.fdkankan.indoor.core.service.InitService;
-import com.fdkankan.indoor.core.service.SiteService;
-import com.sun.org.apache.bcel.internal.generic.IF_ACMPEQ;
+import com.fdkankan.indoor.core.service.SiteModelService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.mongodb.core.MongoTemplate;
-import org.springframework.data.mongodb.core.query.Criteria;
-import org.springframework.data.mongodb.core.query.Query;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
@@ -35,7 +29,7 @@ import java.util.stream.Collectors;
  */
 @Slf4j
 @Service
-public class SiteServiceImpl implements SiteService {
+public class SiteModelServiceImpl implements SiteModelService {
 
     @Autowired
     MongoTemplate mongoTemplate;
@@ -426,7 +420,8 @@ public class SiteServiceImpl implements SiteService {
         return optional.orElse(null);
     }
 
-    private List<SiteDto> getDataBySceneCode(String sceneCode){
+    @Override
+    public List<SiteDto> getDataBySceneCode(String sceneCode){
         SiteModelEntity entity = findById(sceneCode);
         List<SiteDto> data = entity.getData();
         return data;

+ 62 - 0
laser/src/main/resources/data/site_mode_room.json

@@ -0,0 +1,62 @@
+[
+  {
+    "_id" : 10,
+    "type" : "BUILDING",
+    "name" : "港湾一号",
+    "polygon" : {
+      "type" : "Polygon",
+      "coordinates" : [
+
+      ]
+    },
+    "z_min" : null,
+    "z_max" : null,
+    "children" : [
+      {
+        "_id" : 11,
+        "type" : "FLOOR",
+        "name" : "一楼",
+        "polygon" : null,
+        "z_min" : null,
+        "z_max" : null,
+        "children" : [
+          {
+            "_id" : 12,
+            "type" : "ROOM",
+            "name" : "港10",
+            "polygon" : {
+              "type" : "Polygon",
+              "coordinates" : [
+
+              ]
+            },
+            "z_min" : null,
+            "z_max" : null,
+            "children" : [],
+            "center" : [
+
+            ],
+            "attributes" : {},
+            "area" : 2503.30551910935,
+            "volume" : 295513.21880627,
+            "geometry_hash" : 1605756229
+          }
+        ],
+        "center" : [
+
+        ],
+        "attributes" : {},
+        "area" : null,
+        "volume" : 295513.21880627,
+        "geometry_hash" : -200081285
+      }
+    ],
+    "center" : [
+
+    ],
+    "attributes" : {},
+    "area" : 2503.30551910935,
+    "volume" : null,
+    "geometry_hash" : 1891071345
+  }
+]