Преглед на файлове

Merge remote-tracking branch 'origin/v1.7.0'

# Conflicts:
#	src/main/java/com/fdkankan/fusion/service/impl/CaseNumServiceImpl.java
#	src/main/resources/application.yaml
lyhzzz преди 10 месеца
родител
ревизия
a9f2d2cdcf
променени са 100 файла, в които са добавени 3196 реда и са изтрити 111 реда
  1. 8 0
      README.md
  2. 18 1
      pom.xml
  3. 1 0
      src/main/java/com/fdkankan/fusion/FusionApplication.java
  4. 1 1
      src/main/java/com/fdkankan/fusion/common/FilePath.java
  5. 9 0
      src/main/java/com/fdkankan/fusion/common/PageInfo.java
  6. 10 1
      src/main/java/com/fdkankan/fusion/common/ResultCode.java
  7. 21 0
      src/main/java/com/fdkankan/fusion/common/enums/DownloadStatusEnum.java
  8. 13 0
      src/main/java/com/fdkankan/fusion/common/util/CameraUtil.java
  9. 7 0
      src/main/java/com/fdkankan/fusion/common/util/DataUtil.java
  10. 55 1
      src/main/java/com/fdkankan/fusion/common/util/DateUtils.java
  11. 3 0
      src/main/java/com/fdkankan/fusion/common/util/RedisKeyUtil.java
  12. 6 4
      src/main/java/com/fdkankan/fusion/config/SaTokenConfigure.java
  13. 6 0
      src/main/java/com/fdkankan/fusion/controller/CaseFilesController.java
  14. 79 0
      src/main/java/com/fdkankan/fusion/controller/DataController.java
  15. 9 1
      src/main/java/com/fdkankan/fusion/controller/HotIconController.java
  16. 1 1
      src/main/java/com/fdkankan/fusion/controller/LoginController.java
  17. 66 0
      src/main/java/com/fdkankan/fusion/controller/SceneDownLogController.java
  18. 2 0
      src/main/java/com/fdkankan/fusion/controller/TestController.java
  19. 3 0
      src/main/java/com/fdkankan/fusion/controller/TmUserController.java
  20. 84 0
      src/main/java/com/fdkankan/fusion/entity/Camera.java
  21. 168 0
      src/main/java/com/fdkankan/fusion/entity/CameraDetail.java
  22. 6 0
      src/main/java/com/fdkankan/fusion/entity/CaseEntity.java
  23. 3 0
      src/main/java/com/fdkankan/fusion/entity/FusionGuidePath.java
  24. 2 0
      src/main/java/com/fdkankan/fusion/entity/HotIcon.java
  25. 129 0
      src/main/java/com/fdkankan/fusion/entity/SceneDownLog.java
  26. 201 0
      src/main/java/com/fdkankan/fusion/entity/SceneEditInfo.java
  27. 120 0
      src/main/java/com/fdkankan/fusion/entity/ScenePlus.java
  28. 193 0
      src/main/java/com/fdkankan/fusion/entity/ScenePlusExt.java
  29. 3 0
      src/main/java/com/fdkankan/fusion/entity/TmDepartment.java
  30. 8 0
      src/main/java/com/fdkankan/fusion/entity/TmProject.java
  31. 2 0
      src/main/java/com/fdkankan/fusion/entity/TmUser.java
  32. 5 3
      src/main/java/com/fdkankan/fusion/generate/AutoGenerate.java
  33. 0 2
      src/main/java/com/fdkankan/fusion/httpClient/FdService.java
  34. 68 0
      src/main/java/com/fdkankan/fusion/httpClient/LaserService.java
  35. 16 0
      src/main/java/com/fdkankan/fusion/httpClient/client/LaserClient.java
  36. 2 0
      src/main/java/com/fdkankan/fusion/httpClient/request/LaserSceneParam.java
  37. 8 0
      src/main/java/com/fdkankan/fusion/httpClient/request/SSDownSceneParam.java
  38. 0 5
      src/main/java/com/fdkankan/fusion/httpClient/response/FdRoomVo.java
  39. 10 0
      src/main/java/com/fdkankan/fusion/httpClient/response/SSDownSceneVo.java
  40. 22 0
      src/main/java/com/fdkankan/fusion/mapper/ICameraDetailMapper.java
  41. 18 0
      src/main/java/com/fdkankan/fusion/mapper/ICameraMapper.java
  42. 18 0
      src/main/java/com/fdkankan/fusion/mapper/ISceneDownLogMapper.java
  43. 18 0
      src/main/java/com/fdkankan/fusion/mapper/ISceneEditInfoMapper.java
  44. 18 0
      src/main/java/com/fdkankan/fusion/mapper/IScenePlusExtMapper.java
  45. 27 0
      src/main/java/com/fdkankan/fusion/mapper/IScenePlusMapper.java
  46. 11 0
      src/main/java/com/fdkankan/fusion/mapper/ITmProjectMapper.java
  47. 5 0
      src/main/java/com/fdkankan/fusion/request/CaseParam.java
  48. 29 0
      src/main/java/com/fdkankan/fusion/request/DataParam.java
  49. 2 0
      src/main/java/com/fdkankan/fusion/request/ModelPram.java
  50. 20 0
      src/main/java/com/fdkankan/fusion/request/SceneDownLogParam.java
  51. 2 0
      src/main/java/com/fdkankan/fusion/request/ScenePram.java
  52. 9 0
      src/main/java/com/fdkankan/fusion/response/DataGroupVo.java
  53. 9 0
      src/main/java/com/fdkankan/fusion/response/DownVo.java
  54. 12 0
      src/main/java/com/fdkankan/fusion/response/DownloadProcessVo.java
  55. 20 0
      src/main/java/com/fdkankan/fusion/service/ICameraDetailService.java
  56. 17 0
      src/main/java/com/fdkankan/fusion/service/ICameraService.java
  57. 17 0
      src/main/java/com/fdkankan/fusion/service/IDataService.java
  58. 14 0
      src/main/java/com/fdkankan/fusion/service/IDownService.java
  59. 2 1
      src/main/java/com/fdkankan/fusion/service/IHotIconService.java
  60. 20 0
      src/main/java/com/fdkankan/fusion/service/ISceneDownLogService.java
  61. 17 0
      src/main/java/com/fdkankan/fusion/service/ISceneEditInfoService.java
  62. 16 0
      src/main/java/com/fdkankan/fusion/service/IScenePlusExtService.java
  63. 25 0
      src/main/java/com/fdkankan/fusion/service/IScenePlusService.java
  64. 3 0
      src/main/java/com/fdkankan/fusion/service/ITmDepartmentService.java
  65. 10 4
      src/main/java/com/fdkankan/fusion/service/ITmProjectService.java
  66. 26 0
      src/main/java/com/fdkankan/fusion/service/impl/CameraDetailServiceImpl.java
  67. 26 0
      src/main/java/com/fdkankan/fusion/service/impl/CameraServiceImpl.java
  68. 29 5
      src/main/java/com/fdkankan/fusion/service/impl/CaseNumServiceImpl.java
  69. 4 4
      src/main/java/com/fdkankan/fusion/service/impl/CaseServiceImpl.java
  70. 237 0
      src/main/java/com/fdkankan/fusion/service/impl/DataService.java
  71. 278 0
      src/main/java/com/fdkankan/fusion/service/impl/DownService.java
  72. 20 6
      src/main/java/com/fdkankan/fusion/service/impl/HotIconServiceImpl.java
  73. 2 4
      src/main/java/com/fdkankan/fusion/service/impl/ModelServiceImpl.java
  74. 86 0
      src/main/java/com/fdkankan/fusion/service/impl/SceneDownLogServiceImpl.java
  75. 29 0
      src/main/java/com/fdkankan/fusion/service/impl/SceneEditInfoServiceImpl.java
  76. 22 0
      src/main/java/com/fdkankan/fusion/service/impl/ScenePlusExtServiceImpl.java
  77. 44 0
      src/main/java/com/fdkankan/fusion/service/impl/ScenePlusServiceImpl.java
  78. 20 13
      src/main/java/com/fdkankan/fusion/service/impl/SceneService.java
  79. 4 2
      src/main/java/com/fdkankan/fusion/service/impl/TmCameraServiceImpl.java
  80. 49 6
      src/main/java/com/fdkankan/fusion/service/impl/TmDepartmentServiceImpl.java
  81. 31 8
      src/main/java/com/fdkankan/fusion/service/impl/TmProjectServiceImpl.java
  82. 10 5
      src/main/java/com/fdkankan/fusion/service/impl/TmUserServiceImpl.java
  83. 99 0
      src/main/java/com/fdkankan/fusion/websocket/MyWebSocketServer.java
  84. 128 0
      src/main/java/com/fdkankan/fusion/websocket/SessionService.java
  85. 25 0
      src/main/java/com/fdkankan/fusion/websocket/WebSocketConfig.java
  86. 85 0
      src/main/java/com/fdkankan/fusion/websocket/WebSocketConfigurator.java
  87. 7 0
      src/main/java/com/fdkankan/fusion/websocket/enums/CommonEnum.java
  88. 40 0
      src/main/java/com/fdkankan/fusion/websocket/service/MessageService.java
  89. 45 0
      src/main/java/com/fdkankan/fusion/websocket/vo/RequestMsg.java
  90. 26 0
      src/main/java/com/fdkankan/fusion/websocket/vo/WsMessage.java
  91. 16 16
      src/main/resources/application-local.yaml
  92. 17 15
      src/main/resources/application-test.yaml
  93. 2 2
      src/main/resources/application.yaml
  94. 6 0
      src/main/resources/mapper/fusion/CameraDetailMapper.xml
  95. 5 0
      src/main/resources/mapper/fusion/CameraMapper.xml
  96. 5 0
      src/main/resources/mapper/fusion/SceneDownLogMapper.xml
  97. 5 0
      src/main/resources/mapper/fusion/SceneEditInfoMapper.xml
  98. 5 0
      src/main/resources/mapper/fusion/ScenePlusExtMapper.xml
  99. 36 0
      src/main/resources/mapper/fusion/ScenePlusMapper.xml
  100. 0 0
      src/main/resources/mapper/fusion/TmProjectMapper.xml

+ 8 - 0
README.md

@@ -42,3 +42,11 @@
 ~~~~
 
 
+###**v1.6.0**
+~~~~
+1.场景下载功能
+2.首页统计
+3.添加多数据源配置
+4.下载记录日志记录
+5.所属架构数据过滤
+~~~~

+ 18 - 1
pom.xml

@@ -38,6 +38,19 @@
             <version>3.4.3.4</version>
         </dependency>
 
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
+            <version>3.5.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid-spring-boot-starter</artifactId>
+            <version>1.1.22</version>
+        </dependency>
+
+
         <!--mybatis-plus代码生成器-->
         <dependency>
             <groupId>com.baomidou</groupId>
@@ -131,7 +144,11 @@
             <version>5.8.6</version>
         </dependency>
 
-
+        <!--websocket-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-websocket</artifactId>
+        </dependency>
     </dependencies>
 
     <build>

+ 1 - 0
src/main/java/com/fdkankan/fusion/FusionApplication.java

@@ -6,6 +6,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.context.annotation.ComponentScan;
 import org.springframework.scheduling.annotation.EnableScheduling;
 import org.springframework.transaction.annotation.EnableTransactionManagement;
+import org.springframework.web.socket.config.annotation.EnableWebSocket;
 
 @SpringBootApplication
 @EnableTransactionManagement//开启事务

+ 1 - 1
src/main/java/com/fdkankan/fusion/common/FilePath.java

@@ -5,7 +5,7 @@ public class FilePath {
     public final static String LOCAL_BASE_PATH = "/home/tomcat/jar-fusion-8808/";
     public final static String MNT_BASE_PATH = "/mnt/fusion/";
 
-    public final static String OBJ_OSS_PATH = "scene_view_data/%s/data/mesh";
+    public final static String OBJ_OSS_PATH = "scene_view_data/%s";
     public final static String GLB_OSS_PATH = "fusion/%s/model/glb/%s/mesh.glb";
     public final static String B3DM_OSS_PATH = "fusion/%s/model/b3dm/%s";
     public final static String VIDEO_OSS_PATH = "fusion/%s/video/%s";

+ 9 - 0
src/main/java/com/fdkankan/fusion/common/PageInfo.java

@@ -6,6 +6,7 @@ import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import java.util.ArrayList;
 import java.util.List;
 
 @Data
@@ -30,6 +31,14 @@ public class PageInfo<T> {
             .list(page.getRecords())
             .build();
     }
+    public static PageInfo PageInfoEmpty(){
+        return PageInfo.builder()
+                .pageNum(1)
+                .pageSize(10)
+                .total(0)
+                .list(new ArrayList<>())
+                .build();
+    }
     public static PageInfo PageInfo(Long currentPage, Long pageSize, Long total, List<?> list){
         return PageInfo.builder()
             .pageNum(currentPage)

+ 10 - 1
src/main/java/com/fdkankan/fusion/common/ResultCode.java

@@ -46,6 +46,7 @@ public enum ResultCode {
     UPLOAD_ERROR(7001,"文件上传失败"),
     UPLOAD_FILE_NO_EXIST(7002,"上传文件不存在"),
     UPLOAD_FILE_TO_LONG(7003,"文件上传过大"),
+    HOT_ICON_NOT_EXIST(7004,"热点icon不存在"),
     UPLOAD_FILE_TYPE_ERROR(7005,"文件类型错误"),
     UPLOAD_FILE_MSG_ERROR(7006,"文件内容错误"),
     UPLOAD_FILE_OBJ_ERROR(7007,"文件内容错误,缺少obj,或者mtl文件"),
@@ -62,7 +63,15 @@ public enum ResultCode {
     SCENE_DATA_SOURCE_EMPTY(7018,"场景资源文件为空,无法添加"),
     CASE_HAVE_SETTINGS(7019,"案件已有设置,无法新增"),
 
-    HOT_ICON_NOT_EXIST(7004,"热点icon不存在");
+    SS_SCENE_DOWN_ERROR(7020,"深时点云场景下载失败"),
+    FILE_NOT_EXIST(7021,"文件不存在,或已被刪除"),
+
+    HOST_ICON_LIMIT(7022,"案件图标超过上限"),
+
+    CASE_REMOVE_SCENE(7023,"场景被移除"),
+
+    ;
+
 
     public int code;
     public String msg;

+ 21 - 0
src/main/java/com/fdkankan/fusion/common/enums/DownloadStatusEnum.java

@@ -0,0 +1,21 @@
+package com.fdkankan.fusion.common.enums;
+
+public enum DownloadStatusEnum {
+    DOWNLOADING(1000, "文件正在下载"),
+    DOWNLOAD_COMPRESSING(1001, "文件正在压缩"),
+    DOWNLOAD_SUCCESS(1002, "文件压缩成功/下载处理成功"),
+    DOWNLOAD_FAILED(1003, "下载处理失败");
+
+    public static final int DOWNLOADING_CODE = 1000;
+    public static final int DOWNLOAD_COMPRESSING_CODE = 1001;
+    public static final int DOWNLOAD_SUCCESS_CODE = 1002;
+    public static final int DOWNLOAD_FAILED_CODE = 1003;
+
+    private int status;
+    private String desc;
+
+    DownloadStatusEnum(int status, String desc) {
+        this.status = status;
+        this.desc = desc;
+    }
+}

+ 13 - 0
src/main/java/com/fdkankan/fusion/common/util/CameraUtil.java

@@ -0,0 +1,13 @@
+package com.fdkankan.fusion.common.util;
+
+public class CameraUtil {
+
+    public static String getCameraNameByType(Integer sceneSource){
+        switch (sceneSource){
+            case 3 : return "双目转台";
+            case 4 : return "激光转台";
+            case 5 : return "激光移动";
+            default: return "八目";
+        }
+    }
+}

+ 7 - 0
src/main/java/com/fdkankan/fusion/common/util/DataUtil.java

@@ -0,0 +1,7 @@
+package com.fdkankan.fusion.common.util;
+
+public class DataUtil {
+
+    public static String[] firePlace = {"非建构筑物","交通工具","建构筑物","垃圾及废弃物"};
+    public static String[] fireReason = {"放火","电气火灾","产作业","用火不慎","吸烟","玩火","燃放烟花爆竹","自燃","雷击","静电","遗留火种","其他","不排除原因"};
+}

+ 55 - 1
src/main/java/com/fdkankan/fusion/common/util/DateUtils.java

@@ -2,8 +2,15 @@ package com.fdkankan.fusion.common.util;
 
 import cn.hutool.core.date.DateUtil;
 
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.time.Period;
+import java.time.YearMonth;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Date;
+import java.util.List;
 
 public class DateUtils {
 
@@ -15,7 +22,54 @@ public class DateUtils {
         return calendar.getTime();
     }
 
+    /**
+     * 获取一年前的日期
+     */
+    public static String getYearAgo(){
+        Calendar calendar = Calendar.getInstance();
+        calendar.add(Calendar.YEAR, -1);
+        Date time = calendar.getTime();
+        return getMonthStr(time);
+    }
+
+    /**
+     * 获取当前时间
+     */
+    public static String getMonthStr(Date date){
+        SimpleDateFormat formatter = new SimpleDateFormat("yyy-MM-dd");
+        return  formatter.format(date);
+    }
+
+
+    /**
+     * 获取时间段之间的年月份
+     */
+    public static List<String> getMonthdateList(String startTime,String endTime){
+        startTime = startTime.replace(" 00:00:00","");
+        endTime = endTime.replace(" 23:59:59","");
+        List<String> dateList = new ArrayList<>();
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyy-MM-dd");
+        LocalDate start = LocalDate.parse(startTime, formatter);
+        LocalDate end = LocalDate.parse(endTime, formatter);
+
+        Period period = Period.between(start, end);
+        int years = period.getYears();
+        int months = period.getMonths() + years *12;
+
+        for(int i = 0 ;i <= months;i++){
+            YearMonth yearMonth = YearMonth.from(start.plusMonths(i));
+            int year = yearMonth.getYear();
+            int month = yearMonth.getMonthValue();
+            String monthStr = String.format("%02d", month);
+            dateList.add(year+"-"+monthStr);
+        }
+        return dateList;
+    }
+
+
+
     public static void main(String[] args) {
-        System.out.println("今天是:" + DateUtil.format(getHoursTime(new Date()), "yyyy-MM-dd HH:mm:ss"));
+       // System.out.println(getMonthdateList(getYearAgo(),getMonthStr(new Date())));
+        System.out.println(getHoursTime(new Date()));
     }
 }

+ 3 - 0
src/main/java/com/fdkankan/fusion/common/util/RedisKeyUtil.java

@@ -2,6 +2,7 @@ package com.fdkankan.fusion.common.util;
 
 public class RedisKeyUtil {
 
+
     public static Long tokenTime = 2 * 60 * 60L;
     public static Long projectRandCodeKeyTime = 14 * 24 * 60 * 60L ;
     public static String mergerVideoKey = "fusion:merger:video:";
@@ -17,4 +18,6 @@ public class RedisKeyUtil {
 
 
     public static String loginAuthCode = "fusion:login:auth:%s";
+
+    public static final String SCENE_VERSION = "scenejson:num:%s";
 }

+ 6 - 4
src/main/java/com/fdkankan/fusion/config/SaTokenConfigure.java

@@ -44,18 +44,20 @@ public class SaTokenConfigure {
     public SaServletFilter getSaServletFilter() {
         return new SaServletFilter()
                 // 指定 拦截路由 与 放行路由
-                .addInclude("/**").addExclude("/**/test/**","/**/inner/**","/**/notAuth/**")
+                .addInclude("/**").addExclude("/**/test/**","/**/inner/**","/**/notAuth/**","/**ws/**")
                 // 认证函数: 每次请求执行
                 .setAuth(obj -> {
                     String share = SaHolder.getRequest().getHeader("share");
                     if(StringUtils.isNotBlank(share) && "1".equals(share)){ //分享请求头
                         return;
                     }
+                    SaRouter.match("/sceneDownLog/list", r -> StpUtil.checkRole("admin-super"));
+
                     // 登录认证 -- 拦截所有路由,并排除/user/doLogin 用于开放登录
                     SaRouter.match("/**", "/fdLogin", r ->checkLogin() );
                     String menu = redisUtil.get(RedisKey.MANAGE_MENU);
                     if(StringUtils.isBlank(menu)){
-                        SaRouter.match("/**", r -> StpUtil.checkRole("super-admin"));
+                        SaRouter.match("/**", r -> StpUtil.checkRole("admin-super"));
                         return;
                     }
 
@@ -67,7 +69,7 @@ public class SaTokenConfigure {
                         if(StringUtils.isEmpty(url) || StringUtils.isEmpty(perm)){
                             continue;
                         }
-                        if(StpUtil.hasRole("super-admin")){
+                        if(StpUtil.hasRole("admin-super")){
                             continue;
                         }
                         SaRouter.match(url, r -> StpUtil.checkPermission(perm));
@@ -84,7 +86,7 @@ public class SaTokenConfigure {
                     }
                     else if(e instanceof NotRoleException) {		// 如果是角色异常
                         NotRoleException ee = (NotRoleException) e;
-                        aj =  ResultData.error(ResultCode.NOT_ROLE);
+                        aj =  ResultData.error(ResultCode.NOT_PERMISSION);
                     }
                     else if(e instanceof NotPermissionException) {	// 如果是权限异常
                         NotPermissionException ee = (NotPermissionException) e;

+ 6 - 0
src/main/java/com/fdkankan/fusion/controller/CaseFilesController.java

@@ -143,6 +143,12 @@ public class CaseFilesController extends BaseController{
                 || filesTypeId== null ){
             throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
         }
+        if(filesId != null){
+            CaseFiles caseFiles = caseFilesService.getById(filesId);
+            if(caseFiles == null){
+                throw new BusinessException(ResultCode.FILE_NOT_EXIST);
+            }
+        }
         CaseFiles caseFiles = new CaseFiles();
         caseFiles.setFilesId(filesId);
         caseFiles.setCaseId(caseId);

+ 79 - 0
src/main/java/com/fdkankan/fusion/controller/DataController.java

@@ -0,0 +1,79 @@
+package com.fdkankan.fusion.controller;
+
+
+import com.fdkankan.fusion.common.ResultData;
+import com.fdkankan.fusion.request.DataParam;
+import com.fdkankan.fusion.request.SceneDownLogParam;
+import com.fdkankan.fusion.service.IDataService;
+import com.fdkankan.fusion.service.IDownService;
+import com.fdkankan.fusion.service.ISceneDownLogService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2023-12-28
+ */
+@RestController
+@RequestMapping("/data")
+public class DataController extends BaseController{
+
+
+    @Autowired
+    IDataService dataService;
+
+    /**
+     * 火灾场景数据采集统计
+     */
+    @PostMapping("/sceneGroupByDept")
+    public ResultData sceneGroupByDept(@RequestBody DataParam param){
+        return ResultData.ok(dataService.sceneGroupByDept(param));
+    }
+
+    /**
+     * 火调项目统计
+     */
+    @PostMapping("/projectGroupByDept")
+    public ResultData projectGroupByDept(@RequestBody DataParam param){
+        return ResultData.ok(dataService.projectGroupByDept(param));
+    }
+
+    /**
+     * 采集设备类型统计
+     */
+    @PostMapping("/cameraGroupType")
+    public ResultData cameraGroupType(@RequestBody DataParam param){
+        return ResultData.ok(dataService.cameraGroupType(param));
+    }
+
+
+    /**
+     * 火灾趋势分析
+     */
+    @PostMapping("/FireTrend")
+    public ResultData FireTrend(@RequestBody DataParam param){
+        return ResultData.ok(dataService.FireTrend(param));
+    }
+
+    /**
+     * 起火场所统计
+     */
+    @PostMapping("/FirePlaceTrend")
+    public ResultData FirePlaceTrend(@RequestBody DataParam param){
+        return ResultData.ok(dataService.FirePlaceTrend(param));
+    }
+
+    /**
+     * 火灾原因统计
+     */
+    @PostMapping("/FireReasonTrend")
+    public ResultData FireReasonTrend(@RequestBody DataParam param){
+        return ResultData.ok(dataService.FireReasonTrend(param));
+    }
+
+}
+

+ 9 - 1
src/main/java/com/fdkankan/fusion/controller/HotIconController.java

@@ -49,10 +49,17 @@ public class HotIconController extends BaseController{
 
     @PostMapping("/add")
     public ResultData add(@RequestParam(required = false) MultipartFile file,
-                          @RequestParam(required = false) String iconTitle) throws IOException {
+                          @RequestParam(required = false) String iconTitle,
+                          @RequestParam(required = false) Integer caseId) throws IOException {
         if(file==null || StringUtils.isEmpty(iconTitle)){
             throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
         }
+        if(caseId != null){
+            List<HotIcon> hotIconList = hotIconService.getListByCaseId(caseId);
+            if(!hotIconList.isEmpty() && hotIconList.size() >=19){
+                throw new BusinessException(ResultCode.HOST_ICON_LIMIT);
+            }
+        }
 
         String iconUrl = uploadService.uploadFile(file, true, String.format(FilePath.ICON_OSS_PATH,environment,""));
 
@@ -60,6 +67,7 @@ public class HotIconController extends BaseController{
         HotIcon hotIcon = new HotIcon();
         hotIcon.setIconTitle(iconTitle);
         hotIcon.setIconUrl(iconUrl);
+        hotIcon.setCaseId(caseId);
         hotIcon.setUserName(username);
         if(StringUtils.isEmpty(hotIcon.getIconUrl())){
             throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);

+ 1 - 1
src/main/java/com/fdkankan/fusion/controller/LoginController.java

@@ -87,7 +87,7 @@ public class LoginController extends BaseController{
                     //.setExtra("fdToken",data.getToken())
                     .setExtra("userName",data.getUser().getUserName())
                     .setExtra("deptId",tmUser.getDeptId())
-                    .setExtra("nickName",data.getUser().getNickName()));
+                    .setExtra("nickName",tmUser.getNickName()));
             data.setFdToken(data.getToken());
             data.setToken(StpUtil.getTokenValue());
             tmUserService.setRoleAndPermToRedis(tmUser);

+ 66 - 0
src/main/java/com/fdkankan/fusion/controller/SceneDownLogController.java

@@ -0,0 +1,66 @@
+package com.fdkankan.fusion.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fdkankan.fusion.common.ResultData;
+import com.fdkankan.fusion.request.SceneDownLogParam;
+import com.fdkankan.fusion.service.IDownService;
+import com.fdkankan.fusion.service.ISceneDownLogService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2023-12-28
+ */
+@RestController
+@RequestMapping("/sceneDownLog")
+public class SceneDownLogController extends BaseController{
+
+    @Autowired
+    ISceneDownLogService sceneDownLogService;
+    @Autowired
+    IDownService downService;
+
+    @PostMapping("/list")
+    public ResultData list(@RequestBody SceneDownLogParam param){
+
+        return ResultData.ok(sceneDownLogService.pageList(param));
+    }
+
+
+    /**
+     * 检查下载
+     * num      场景码
+     */
+    @GetMapping("/checkDownLoad")
+    public ResultData checkDownLoad(@RequestParam(required = false) String num,
+                                    @RequestParam(required = false,defaultValue = "0") Integer isObj){
+        return ResultData.ok(downService.checkDownLoad(num,isObj));
+    }
+
+    /**
+     * 下载场景
+     * num      场景码
+     */
+    @GetMapping("/downScene")
+    public ResultData downScene(@RequestParam(required = false) String num,
+                                @RequestParam(required = false,defaultValue = "0") Integer isObj){
+        return ResultData.ok(downService.down(num,isObj));
+    }
+
+    /**
+     * 下载场景进度条
+     * num      场景码
+     */
+    @GetMapping("/downloadProcess")
+    public ResultData downloadProcess(@RequestParam(required = false) String num,
+                                      @RequestParam(required = false,defaultValue = "0") Integer isObj){
+        return ResultData.ok(downService.downloadProcess(num,isObj));
+    }
+}
+

+ 2 - 0
src/main/java/com/fdkankan/fusion/controller/TestController.java

@@ -1,5 +1,6 @@
 package com.fdkankan.fusion.controller;
 
+import cn.hutool.http.HttpUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.dtflys.forest.annotation.Post;
 import com.fdkankan.fusion.common.ResultData;
@@ -11,6 +12,7 @@ import org.apache.commons.lang3.StringUtils;
 import org.apache.ibatis.annotations.Case;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
+import sun.java2d.pipe.SpanIterator;
 
 import javax.xml.transform.Result;
 import java.util.List;

+ 3 - 0
src/main/java/com/fdkankan/fusion/controller/TmUserController.java

@@ -11,6 +11,7 @@ import com.fdkankan.fusion.common.util.RedisKeyUtil;
 import com.fdkankan.fusion.entity.TmUser;
 import com.fdkankan.fusion.exception.BusinessException;
 import com.fdkankan.fusion.response.UserAddRequest;
+import com.fdkankan.fusion.service.ITmDepartmentService;
 import com.fdkankan.fusion.service.ITmUserService;
 import com.fdkankan.redis.util.RedisUtil;
 import org.apache.commons.lang3.StringUtils;
@@ -35,6 +36,8 @@ public class TmUserController {
     @Autowired
     ITmUserService tmUserService;
     @Autowired
+    ITmDepartmentService departmentService;
+    @Autowired
     RedisUtil redisUtil;
 
     /**

+ 84 - 0
src/main/java/com/fdkankan/fusion/entity/Camera.java

@@ -0,0 +1,84 @@
+package com.fdkankan.fusion.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 相机主表
+ * </p>
+ *
+ * @author 
+ * @since 2024-01-09
+ */
+@Getter
+@Setter
+@TableName("t_camera")
+public class Camera implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 相机的Mac地址
+     */
+    @TableField("child_name")
+    private String childName;
+
+    /**
+     * 激活时间
+     */
+    @TableField("activated_time")
+    private Date activatedTime;
+
+    /**
+     * 相机密码
+     */
+    @TableField("child_password")
+    private String childPassword;
+
+    /**
+     * sn码
+     */
+    @TableField("sn_code")
+    private String snCode;
+
+    /**
+     * wifi名称
+     */
+    @TableField("wifi_name")
+    private String wifiName;
+
+    /**
+     * wifi密码
+     */
+    @TableField("wifi_password")
+    private String wifiPassword;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @TableField("update_time")
+    private Date updateTime;
+
+    /**
+     * 记录的状态,A: 生效,I: 禁用
+     */
+    @TableField("rec_status")
+    @TableLogic(value = "A",delval = "I")
+    private String recStatus;
+
+
+}

+ 168 - 0
src/main/java/com/fdkankan/fusion/entity/CameraDetail.java

@@ -0,0 +1,168 @@
+package com.fdkankan.fusion.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 相机子表
+ * </p>
+ *
+ * @author 
+ * @since 2024-01-09
+ */
+@Getter
+@Setter
+@TableName("t_camera_detail")
+public class CameraDetail implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 余额
+     */
+    @TableField("balance")
+    private String balance;
+
+    /**
+     * 用户表t_user的id
+     */
+    @TableField("user_id")
+    private Long userId;
+
+    /**
+     * 0表示客户,1表示员工,2表示赠送,3表示其他,4经销商销售
+     */
+    @TableField("own")
+    private Integer own;
+
+    /**
+     * 订单号
+     */
+    @TableField("order_sn")
+    private String orderSn;
+
+    /**
+     * 0表示本国,1表示国外
+     */
+    @TableField("country")
+    private Integer country;
+
+    /**
+     * 经销商
+     */
+    @TableField("agency")
+    private String agency;
+
+    /**
+     * 相机类型,0表示双目,1四维看看pro,2 四维看看lite,9 双目转台,10 激光转台
+     */
+    @TableField("type")
+    private Integer type;
+
+    /**
+     * 总容量
+     */
+    @TableField("total_space")
+    private Long totalSpace;
+
+    /**
+     * 已使用容量
+     */
+    @TableField("used_space")
+    private Long usedSpace;
+
+    /**
+     * 相机主表t_camera的id
+     */
+    @TableField("camera_id")
+    private Long cameraId;
+
+    /**
+     * 商品表t_goods的id
+     */
+    @TableField("goods_id")
+    private Long goodsId;
+
+    /**
+     * 企业表t_company的id
+     */
+    @TableField("company_id")
+    private Long companyId;
+
+    /**
+     * 代理商架构管理t_agent_framework的id
+     */
+    @TableField("agent_framework_id")
+    private Long agentFrameworkId;
+
+    /**
+     * 相机协作用户id
+     */
+    @TableField("cooperation_user")
+    private Long cooperationUser;
+
+    /**
+     * 设备地址(追溯管理后台)
+     */
+    @TableField("address")
+    private String address;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @TableField("update_time")
+    private Date updateTime;
+
+    /**
+     * 记录的状态,A: 生效,I: 禁用
+     */
+    @TableField("rec_status")
+    @TableLogic(value = "A",delval = "I")
+    private String recStatus;
+
+    @TableField("user_camera_version")
+    private String userCameraVersion;
+
+    @TableField("app_version")
+    private String appVersion;
+
+    @TableField("last_request_time")
+    private Date lastRequestTime;
+
+    @TableField("out_time")
+    private Date outTime;
+
+    /**
+     * 代理商id
+     */
+    @TableField("agent_id")
+    private Integer agentId;
+
+    /**
+     * 购买时间
+     */
+    @TableField("buy_date")
+    private Date buyDate;
+
+    /**
+     * 相机容量单位,GB ,SP
+     */
+    @TableField("unit")
+    private String unit;
+
+
+}

+ 6 - 0
src/main/java/com/fdkankan/fusion/entity/CaseEntity.java

@@ -62,6 +62,12 @@ public class CaseEntity implements Serializable {
     @TableField("dept_id")
     private String deptId;
 
+    @TableField("map_url")
+    private String mapUrl;
+
+    @TableField("lat_and_long")
+    private String latAndLong;
+
     @TableField(exist = false)
     private String deptName;
 }

+ 3 - 0
src/main/java/com/fdkankan/fusion/entity/FusionGuidePath.java

@@ -67,6 +67,9 @@ public class FusionGuidePath implements Serializable {
     @TableField("sort")
     private Long sort;
 
+    @TableField("pano_info")
+    private String panoInfo;
+
     @TableField("tb_status")
     @TableLogic
     private Integer tbStatus;

+ 2 - 0
src/main/java/com/fdkankan/fusion/entity/HotIcon.java

@@ -55,6 +55,8 @@ public class HotIcon implements Serializable {
      */
     @TableField("is_new")
     private Integer isNew;
+    @TableField("case_id")
+    private Integer caseId;
 
     @TableField("tb_status")
     @TableLogic

+ 129 - 0
src/main/java/com/fdkankan/fusion/entity/SceneDownLog.java

@@ -0,0 +1,129 @@
+package com.fdkankan.fusion.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+
+import jdk.nashorn.internal.ir.annotations.Ignore;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2023-12-28
+ */
+@Getter
+@Setter
+@TableName("t_scene_down_log")
+public class SceneDownLog implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 下载场景记录表
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 场景码
+     */
+    @TableField("scene_num")
+    private String sceneNum;
+
+    /**
+     * 场景标题
+     */
+    @TableField("scene_title")
+    private String sceneTitle;
+
+    /**
+     * 用户账号
+     */
+    @TableField("user_name")
+    private String userName;
+
+    /**
+     * 用户昵称
+     */
+    @TableField("nick_name")
+    private String nickName;
+
+    /**
+     * 场景相机sn
+     */
+    @TableField("sn_code")
+    private String snCode;
+
+    /**
+     * 组织名称
+     */
+    @TableField("dept_name")
+    private String deptName;
+
+    /**
+     * 组织类型
+     */
+    @TableField("dept_level")
+    private Integer deptLevel;
+
+    /**
+     * 组织类型
+     */
+    @TableField(exist = false)
+    private String deptLevelStr;
+
+    /**
+     * 组织id
+     */
+    @TableField("dept_id")
+    private String deptId;
+
+    /**
+     * 0下载中,1下载完成,2下载失败
+     */
+    @TableField("status")
+    private Integer status;
+
+    /**
+     * 场景版本
+     */
+    @TableField("version")
+    private Integer version;
+
+    @TableField("down_url")
+    private String downUrl;
+
+    @TableField("tb_status")
+    @TableLogic
+    private Integer tbStatus;
+
+    @TableField("create_time")
+    private String createTime;
+
+    @TableField("update_time")
+    private Date updateTime;
+
+
+    public String getDeptLevelStr() {
+        if(deptLevel != null){
+            switch (deptLevel){
+                case 0 : return "平台";
+                case 1 : return "总队";
+                case 2 : return "支队";
+                case 3 : return "大队";
+                default: return "";
+            }
+        }
+        return deptLevelStr;
+    }
+
+}

+ 201 - 0
src/main/java/com/fdkankan/fusion/entity/SceneEditInfo.java

@@ -0,0 +1,201 @@
+package com.fdkankan.fusion.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2024-01-09
+ */
+@Getter
+@Setter
+@TableName("t_scene_edit_info")
+public class SceneEditInfo implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @TableField("scene_pro_id")
+    private Long sceneProId;
+
+    @TableField("scene_plus_id")
+    private Long scenePlusId;
+
+    /**
+     * 地面logo名称
+     */
+    @TableField("floor_logo")
+    private String floorLogo;
+
+    /**
+     * 地面logo大小
+     */
+    @TableField("floor_logo_size")
+    private Integer floorLogoSize;
+
+    /**
+     * 地面logo文件名称
+     */
+    @TableField("floor_logo_file")
+    private String floorLogoFile;
+
+    /**
+     * 背景音乐名称
+     */
+    @TableField("music")
+    private String music;
+
+    /**
+     * 背景音乐文件名称
+     */
+    @TableField("music_file")
+    private String musicFile;
+
+    /**
+     * 浏览密码
+     */
+    @TableField("scene_password")
+    private String scenePassword;
+
+    /**
+     * 场景标题
+     */
+    @TableField("title")
+    private String title;
+
+    /**
+     * 场景描述
+     */
+    @TableField("description")
+    private String description;
+
+    /**
+     * 用户是否上传户型图(0-否,1-是)
+     */
+    @TableField("floor_plan_user")
+    private Integer floorPlanUser;
+
+    /**
+     * 是否有热点数据(0-否,1-是)
+     */
+    @TableField("tags")
+    private Integer tags;
+
+    /**
+     * 版本
+     */
+    @TableField("version")
+    private Integer version;
+
+    /**
+     * 图片版本
+     */
+    @TableField("img_version")
+    private Integer imgVersion;
+
+    /**
+     * 场景关联版本
+     */
+    @TableField("link_version")
+    private Integer linkVersion;
+
+    /**
+     * 是否上传模型
+     */
+    @TableField("is_upload_obj")
+    private Integer isUploadObj;
+
+    /**
+     * 重新建模的版本
+     */
+    @TableField("floor_edit_ver")
+    private Integer floorEditVer;
+
+    /**
+     * 正式发布重新建模的版本
+     */
+    @TableField("floor_publish_ver")
+    private Integer floorPublishVer;
+
+    /**
+     * 空间视频数据
+     */
+    @TableField("box_videos")
+    private String boxVideos;
+
+    /**
+     * 空间贴图数据
+     */
+    @TableField("box_photos")
+    private String boxPhotos;
+
+    /**
+     * 空间模型数据
+     */
+    @TableField("box_models")
+    private String boxModels;
+
+    /**
+     * 是否需要处理球幕视频
+     */
+    @TableField("build_video_status")
+    private Integer buildVideoStatus;
+
+    /**
+     * 初始点信息
+     */
+    @TableField("entry")
+    private String entry;
+
+    /**
+     * 加载logo名
+     */
+    @TableField("loading_logo")
+    private String loadingLogo;
+
+    /**
+     * 加载logo文件名
+     */
+    @TableField("loading_logo_file")
+    private String loadingLogoFile;
+
+    /**
+     * 用户上传自定义平面图数据
+     */
+    @TableField("floor_plan_upload")
+    private String floorPlanUpload;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private Date createTime;
+
+    /**
+     * 修改时间
+     */
+    @TableField("update_time")
+    private Date updateTime;
+
+    /**
+     * A-有效,I-无效
+     */
+    @TableField("rec_status")
+    @TableLogic(value = "A",delval = "I")
+    private String recStatus;
+
+
+}

+ 120 - 0
src/main/java/com/fdkankan/fusion/entity/ScenePlus.java

@@ -0,0 +1,120 @@
+package com.fdkankan.fusion.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 场景主表
+ * </p>
+ *
+ * @author 
+ * @since 2023-12-28
+ */
+@Getter
+@Setter
+@TableName("t_scene_plus")
+public class ScenePlus implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 场景码
+     */
+    @TableField("num")
+    private String num;
+
+    /**
+     * 用户id
+     */
+    @TableField("user_id")
+    private Long userId;
+
+    /**
+     * 相机id
+     */
+    @TableField("camera_id")
+    private Long cameraId;
+
+    /**
+     * 手机id
+     */
+    @TableField("phone_id")
+    private String phoneId;
+
+    /**
+     * 场景名称
+     */
+    @TableField("title")
+    private String title;
+
+    /**
+     * 场景描述
+     */
+    @TableField("description")
+    private String description;
+
+    /**
+     * 场景状态:0-未建好,1--已建好,-1-计算出错,-2--不在官网显示
+     */
+    @TableField("scene_status")
+    private Integer sceneStatus;
+
+    /**
+     * 场景来源:相机拍摄10以内表示,1表示八目,2双目,3转台,4 激光  其他来源10以上,11:一键换装,12:123看房,13文通虚拟场景
+     */
+    @TableField("scene_source")
+    private Integer sceneSource;
+
+    /**
+     * 支付状态:0表示未付款,1表示付款了,-1表示欠费,-2表示容量不足
+     */
+    @TableField("pay_status")
+    private Integer payStatus;
+
+    /**
+     * 场景类型  0-其他,1-文博,2-地产,3-电商,4-餐饮,5-家居,99-一件换装虚拟房源
+     */
+    @TableField("scene_type")
+    private Integer sceneType;
+
+    /**
+     * 是否推荐:0-否,1-是
+     */
+    @TableField("recommend")
+    private Integer recommend;
+
+    /**
+     * 是否有housetype文件(0-否,1-是)
+     */
+    @TableField("house_type")
+    private Integer houseType;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @TableField("update_time")
+    private Date updateTime;
+
+    /**
+     * A-有效,I-无效
+     */
+    @TableField("rec_status")
+    @TableLogic(value = "A",delval = "I")
+    private String recStatus;
+
+
+}

+ 193 - 0
src/main/java/com/fdkankan/fusion/entity/ScenePlusExt.java

@@ -0,0 +1,193 @@
+package com.fdkankan.fusion.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2023-12-28
+ */
+@Getter
+@Setter
+@TableName("t_scene_plus_ext")
+public class ScenePlusExt implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * t_scene_plus主键
+     */
+    @TableField("plus_id")
+    private Long plusId;
+
+    /**
+     * 场景数据目录
+     */
+    @TableField("data_source")
+    private String dataSource;
+
+    /**
+     * 场景链接
+     */
+    @TableField("web_site")
+    private String webSite;
+
+    /**
+     * 缩略图链接
+     */
+    @TableField("thumb")
+    private String thumb;
+
+    /**
+     * 方案:1-双目,2-转台,3-六目,4-八目,10-获取4k图,11-获取2k,12-获取1k
+     */
+    @TableField("scene_scheme")
+    private Integer sceneScheme;
+
+    /**
+     * 使用用量
+     */
+    @TableField("space")
+    private Long space;
+
+    /**
+     * 原始文件容量
+     */
+    @TableField("orig_space")
+    private Long origSpace;
+
+    /**
+     * 云服务器类型
+     */
+    @TableField("ecs")
+    private String ecs;
+
+    /**
+     * 点位数量
+     */
+    @TableField("shoot_count")
+    private Integer shootCount;
+
+    /**
+     * 浏览次数
+     */
+    @TableField("view_count")
+    private Integer viewCount;
+
+    /**
+     * gps定位
+     */
+    @TableField("gps")
+    private String gps;
+
+    /**
+     * 算法类型(slam、sfm)
+     */
+    @TableField("algorithm")
+    private String algorithm;
+
+    /**
+     * 固件版本
+     */
+    @TableField("firmware_version")
+    private String firmwareVersion;
+
+    /**
+     * 算法类型(V2,V3)
+     */
+    @TableField("build_type")
+    private String buildType;
+
+    /**
+     * 分辨率(2k,4k)
+     */
+    @TableField("scene_resolution")
+    private String sceneResolution;
+
+    /**
+     * 场景来源,lite:双目lite相机,pro:八目相机,minion:双面转台相机,laser:激光相机,virtual:虚拟场景,sketch:图片建模场景
+     */
+    @TableField("scene_from")
+    private String sceneFrom;
+
+    /**
+     * 切图方式(tiles:瓦片图,face:切片图,pano:全景图 ,local:本地切片,cube:立体图)
+     */
+    @TableField("scene_kind")
+    private String sceneKind;
+
+    /**
+     * 算法生成模型类型(dam,3dtiles)
+     */
+    @TableField("model_kind")
+    private String modelKind;
+
+    /**
+     * 点位视频
+     */
+    @TableField("videos")
+    private String videos;
+
+    /**
+     * oss桶名
+     */
+    @TableField("yun_file_bucket")
+    private String yunFileBucket;
+
+    /**
+     * 算法计算完成时间
+     */
+    @TableField("algorithm_time")
+    private Date algorithmTime;
+
+    /**
+     * 计算耗时
+     */
+    @TableField("compute_time")
+    private Long computeTime;
+
+    /**
+     * 拍摄模式:3(SFM架站式-看看场景), 
+ 
+4(SFM架站式-看见/深时/深光场景),
+5(SLAM移动定位模式) , 
+6(SLAM移动定位模式-有点位)
+     */
+    @TableField("location")
+    private Integer location;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @TableField("update_time")
+    private Date updateTime;
+
+    /**
+     * A-有效,I-无效
+     */
+    @TableField("rec_status")
+    @TableLogic(value = "A",delval = "I")
+    private String recStatus;
+
+    @TableField("is_obj")
+    private Integer isObj;
+
+
+}

+ 3 - 0
src/main/java/com/fdkankan/fusion/entity/TmDepartment.java

@@ -115,4 +115,7 @@ public class TmDepartment implements Serializable {
      */
     @TableField(exist = false)
     private List<TmDepartment> children;
+
+    @TableField(exist = false)
+    private Boolean noStatisticsSon = false;
 }

+ 8 - 0
src/main/java/com/fdkankan/fusion/entity/TmProject.java

@@ -186,6 +186,14 @@ public class TmProject implements Serializable {
     @TableField(exist = false)
     private Integer caseId;
 
+
+    @TableField(exist = false)
+    private String mapUrl;
+
+    @TableField(exist = false)
+    private String latAndLong;
+
+
     public String getStatusDesc() {
         if(status !=null){
             switch (status){

+ 2 - 0
src/main/java/com/fdkankan/fusion/entity/TmUser.java

@@ -105,6 +105,8 @@ public class TmUser implements Serializable {
     @TableField(exist = false)
     private String deptName;
     @TableField(exist = false)
+    private Integer deptLevel;
+    @TableField(exist = false)
     private String roleId;
     @TableField(exist = false)
     private String roleKey;

+ 5 - 3
src/main/java/com/fdkankan/fusion/generate/AutoGenerate.java

@@ -18,7 +18,7 @@ public class AutoGenerate {
         String path =System.getProperty("user.dir") ;
 
         generate(path,"fusion", getTables(new String[]{
-                "t_case_live"
+               "t_camera","t_camera_detail"
         }));
 
 //        generate(path,"goods", getTables(new String[]{
@@ -46,8 +46,10 @@ public class AutoGenerate {
 
 
     public static void  generate(String path,String moduleName,  List<String> tables){
-        FastAutoGenerator.create("jdbc:mysql://120.25.146.52:13306/fd_fusion",
-                "root","JK123456%JIK")
+//        FastAutoGenerator.create("jdbc:mysql://120.25.146.52:13306/fd_fusion",
+//                "root","JK123456%JIK")
+        FastAutoGenerator.create("jdbc:mysql://120.24.144.164:3306/4dkankan_v4",
+                "root","4Dage@4Dage#@168")
                 .globalConfig(builder -> {
                     builder.author("")               //作者
                             .outputDir(path+"\\src\\main\\java")    //输出路径(写到java目录)

+ 0 - 2
src/main/java/com/fdkankan/fusion/httpClient/FdService.java

@@ -97,8 +97,6 @@ public class FdService {
         param.setNumList(numList);
         param.setRoomId(roomId);
         param.setMaxMan(30);
-        param.setUseStartTime(new Date());
-        param.setUseEndTime(DateUtils.getHoursTime(new Date()));
         param.setPlatform("fd");
         return takeLookClient.roomAddOrUpdate(param,getFdToken());
     }

+ 68 - 0
src/main/java/com/fdkankan/fusion/httpClient/LaserService.java

@@ -0,0 +1,68 @@
+package com.fdkankan.fusion.httpClient;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fdkankan.fusion.httpClient.client.LaserClient;
+import com.fdkankan.fusion.httpClient.request.SSDownSceneParam;
+import com.fdkankan.fusion.httpClient.response.FdkkResponse;
+import com.fdkankan.fusion.httpClient.response.SSDownSceneVo;
+import com.fdkankan.redis.util.RedisUtil;
+import com.google.common.collect.Lists;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpStatus;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+@Slf4j
+public class LaserService {
+
+   @Autowired
+   LaserClient laserClient;
+
+    public SSDownSceneVo downOfflineSceneStatus(String num) {
+        try {
+            SSDownSceneVo vo ;
+            SSDownSceneParam param = new SSDownSceneParam();
+            param.setSceneCode(num);
+            FdkkResponse responseEntity = laserClient.downOfflineSceneStatus(param);
+            if( responseEntity.getCode() != HttpStatus.OK.value()){
+                log.error("downOfflineSceneStatus-根据场景码获取激光转台下载状态失败:{}",responseEntity);
+                return null;
+            }
+            vo = JSONObject.parseObject(JSONObject.toJSONString(responseEntity.getData()), SSDownSceneVo.class);
+            return vo;
+
+        }catch (Exception e){
+            log.error("downOfflineSceneStatus-根据场景码获取激光转台下载状态失败!",e);
+        }
+        return null ;
+    }
+
+    public SSDownSceneVo downOfflineScene(String num) {
+        try {
+            SSDownSceneVo vo ;
+            SSDownSceneParam param = new SSDownSceneParam();
+            param.setSceneCode(num);
+            FdkkResponse responseEntity = laserClient.downOfflineScene(param);
+            if( responseEntity.getCode() != HttpStatus.OK.value()){
+                log.error("downOfflineScene-根据场景码获取激光转台下载失败:{}",responseEntity);
+                return null;
+            }
+            vo = JSONObject.parseObject(JSONObject.toJSONString(responseEntity.getData()), SSDownSceneVo.class);
+            return vo ;
+        }catch (Exception e){
+            log.error("downOfflineScene-根据场景码获取激光转台下载状态失败!",e);
+        }
+        return null ;
+    }
+
+}

+ 16 - 0
src/main/java/com/fdkankan/fusion/httpClient/client/LaserClient.java

@@ -6,6 +6,7 @@ import com.dtflys.forest.annotation.JSONBody;
 import com.dtflys.forest.annotation.Post;
 import com.fdkankan.fusion.httpClient.address.LaserAddressSource;
 import com.fdkankan.fusion.httpClient.request.LaserSceneParam;
+import com.fdkankan.fusion.httpClient.request.SSDownSceneParam;
 import com.fdkankan.fusion.httpClient.response.FdkkResponse;
 import com.fdkankan.fusion.request.ScenePram;
 
@@ -33,4 +34,19 @@ public interface LaserClient {
 
     @Post("/laser/4dage/sceneDetail")
     FdkkResponse sceneDetail(@JSONBody LaserSceneParam param, @Header ("fdToken") String fdToken);
+
+
+    /**
+     * 下载深时场景
+     * status :0:正在生成 1,初次生成  2,已经生成直接下载 3,重新生成
+     */
+    @Post("/laser/4dage/downOfflineScene")
+    FdkkResponse downOfflineScene(@JSONBody SSDownSceneParam param) ;
+    /**
+     * 检测深时场景是否需要重新生成
+     *
+     * status :离线包状态是否需要重新生成 0未生成,1 不需要 2需要
+     */
+    @Post("/laser/4dage/downOfflineSceneStatus")
+    FdkkResponse downOfflineSceneStatus(@JSONBody SSDownSceneParam param) ;
 }

+ 2 - 0
src/main/java/com/fdkankan/fusion/httpClient/request/LaserSceneParam.java

@@ -14,6 +14,8 @@ public class LaserSceneParam {
     private String title;
     private Integer status;
     private List<String> snCodes = new ArrayList<>();
+    private String snCode;
+
     private Integer sceneSource = 4;
 
     private Integer id;

+ 8 - 0
src/main/java/com/fdkankan/fusion/httpClient/request/SSDownSceneParam.java

@@ -0,0 +1,8 @@
+package com.fdkankan.fusion.httpClient.request;
+
+import lombok.Data;
+
+@Data
+public class SSDownSceneParam {
+    private String sceneCode;
+}

+ 0 - 5
src/main/java/com/fdkankan/fusion/httpClient/response/FdRoomVo.java

@@ -69,11 +69,6 @@ public class FdRoomVo {
     //房间状态 ,0 不显示,1显示
     private Integer isShow;
 
-    //使用开始时间    v1.1.0添加字段
-    private Date useStartTime;
-
-    //使用结束时间    v1.1.0添加字段
-    private Date useEndTime;
 
     //房间密码  v1.1.0添加字段
     private String visitPassword;

+ 10 - 0
src/main/java/com/fdkankan/fusion/httpClient/response/SSDownSceneVo.java

@@ -0,0 +1,10 @@
+package com.fdkankan.fusion.httpClient.response;
+
+import lombok.Data;
+
+@Data
+public class SSDownSceneVo {
+                                //离线包状态是否需要重新生成 1 不需要 2需要
+    private Integer status;     //0:正在生成 1,初次生成  2,已经生成直接下载 3,重新生成
+    private String url;         //下载地址
+}

+ 22 - 0
src/main/java/com/fdkankan/fusion/mapper/ICameraDetailMapper.java

@@ -0,0 +1,22 @@
+package com.fdkankan.fusion.mapper;
+
+import com.fdkankan.fusion.entity.CameraDetail;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fdkankan.fusion.response.DataGroupVo;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 相机子表 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2024-01-09
+ */
+@Mapper
+public interface ICameraDetailMapper extends BaseMapper<CameraDetail> {
+
+}

+ 18 - 0
src/main/java/com/fdkankan/fusion/mapper/ICameraMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.fusion.mapper;
+
+import com.fdkankan.fusion.entity.Camera;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 相机主表 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2024-01-09
+ */
+@Mapper
+public interface ICameraMapper extends BaseMapper<Camera> {
+
+}

+ 18 - 0
src/main/java/com/fdkankan/fusion/mapper/ISceneDownLogMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.fusion.mapper;
+
+import com.fdkankan.fusion.entity.SceneDownLog;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2023-12-28
+ */
+@Mapper
+public interface ISceneDownLogMapper extends BaseMapper<SceneDownLog> {
+
+}

+ 18 - 0
src/main/java/com/fdkankan/fusion/mapper/ISceneEditInfoMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.fusion.mapper;
+
+import com.fdkankan.fusion.entity.SceneEditInfo;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2024-01-09
+ */
+@Mapper
+public interface ISceneEditInfoMapper extends BaseMapper<SceneEditInfo> {
+
+}

+ 18 - 0
src/main/java/com/fdkankan/fusion/mapper/IScenePlusExtMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.fusion.mapper;
+
+import com.fdkankan.fusion.entity.ScenePlusExt;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2023-12-28
+ */
+@Mapper
+public interface IScenePlusExtMapper extends BaseMapper<ScenePlusExt> {
+
+}

+ 27 - 0
src/main/java/com/fdkankan/fusion/mapper/IScenePlusMapper.java

@@ -0,0 +1,27 @@
+package com.fdkankan.fusion.mapper;
+
+import com.fdkankan.fusion.entity.ScenePlus;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fdkankan.fusion.request.DataParam;
+import com.fdkankan.fusion.response.DataGroupVo;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 场景主表 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2023-12-28
+ */
+@Mapper
+public interface IScenePlusMapper extends BaseMapper<ScenePlus> {
+
+    List<DataGroupVo> groupByCameraId(@Param("startTime") String startTime, @Param("endTime")String endTime,@Param("cameraIds") List<Long> cameraIds);
+
+    List<DataGroupVo> groupByType(@Param("startTime") String startTime, @Param("endTime") String endTime, @Param("cameraIds") List<Long> cameraIds);
+
+}

+ 11 - 0
src/main/java/com/fdkankan/fusion/mapper/ITmProjectMapper.java

@@ -2,7 +2,11 @@ package com.fdkankan.fusion.mapper;
 
 import com.fdkankan.fusion.entity.TmProject;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fdkankan.fusion.response.DataGroupVo;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * <p>
@@ -15,4 +19,11 @@ import org.apache.ibatis.annotations.Mapper;
 @Mapper
 public interface ITmProjectMapper extends BaseMapper<TmProject> {
 
+    List<DataGroupVo> groupByDeptId(@Param("startTime") String startTime, @Param("endTime") String endTime);
+
+    List<DataGroupVo> groupByMonth(@Param("startTime")String startTime,  @Param("endTime")String endTime, @Param("deptIds") List<String> deptIds);
+
+    List<DataGroupVo> groupByPlace(@Param("startTime")String startTime,  @Param("endTime")String endTime, @Param("deptIds") List<String> deptIds);
+
+    List<DataGroupVo> groupByReason(@Param("startTime")String startTime,  @Param("endTime")String endTime, @Param("deptIds") List<String> deptIds);
 }

+ 5 - 0
src/main/java/com/fdkankan/fusion/request/CaseParam.java

@@ -1,5 +1,6 @@
 package com.fdkankan.fusion.request;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.fdkankan.fusion.common.RequestBase;
 import lombok.Data;
 
@@ -14,4 +15,8 @@ public class CaseParam extends RequestBase {
     private HashMap<Integer,List<String>> typeMap;
 
     private String deptId;
+
+    private String mapUrl;
+
+    private String latAndLong;
 }

+ 29 - 0
src/main/java/com/fdkankan/fusion/request/DataParam.java

@@ -0,0 +1,29 @@
+package com.fdkankan.fusion.request;
+
+import cn.hutool.core.date.DateUtil;
+import com.fdkankan.fusion.common.util.DateUtils;
+import lombok.Data;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.Date;
+
+@Data
+public class DataParam {
+
+    private String startTime;
+    private String endTime;
+
+    public String getStartTime() {
+        if(StringUtils.isBlank(startTime)){
+            return DateUtils.getYearAgo() + " 00:00:00";
+        }
+        return startTime + " 00:00:00";
+    }
+
+    public String getEndTime() {
+        if(StringUtils.isBlank(endTime)){
+            return DateUtils.getMonthStr(new Date()) + " 23:59:59";
+        }
+        return endTime + " 23:59:59";
+    }
+}

+ 2 - 0
src/main/java/com/fdkankan/fusion/request/ModelPram.java

@@ -12,4 +12,6 @@ public class ModelPram extends RequestBase {
     private Integer modelId;
     private Integer caseId;
     private String deptId;
+
+    private Integer searchType = 0;
 }

+ 20 - 0
src/main/java/com/fdkankan/fusion/request/SceneDownLogParam.java

@@ -0,0 +1,20 @@
+package com.fdkankan.fusion.request;
+
+import com.fdkankan.fusion.common.RequestBase;
+import lombok.Data;
+
+@Data
+public class SceneDownLogParam extends RequestBase {
+
+    private String deptId;
+    private String userName;
+    private String nickName;
+    private String createTime;
+    private String sceneTitle;
+    private String sceneNum;
+    private String snCode;
+
+    private String startCreateTime;
+    private String endCreateTime;
+
+}

+ 2 - 0
src/main/java/com/fdkankan/fusion/request/ScenePram.java

@@ -21,6 +21,8 @@ public class ScenePram extends RequestBase {
 
     private String share;
 
+    private Integer searchType = 0;  //0 场景管理列表,1案件添加场景列表
+
     public String getSceneName() {
         return sceneName== null ?null :sceneName.trim();
     }

+ 9 - 0
src/main/java/com/fdkankan/fusion/response/DataGroupVo.java

@@ -0,0 +1,9 @@
+package com.fdkankan.fusion.response;
+
+import lombok.Data;
+
+@Data
+public class DataGroupVo {
+    private String groupKey;
+    private Long dataCount;
+}

+ 9 - 0
src/main/java/com/fdkankan/fusion/response/DownVo.java

@@ -0,0 +1,9 @@
+package com.fdkankan.fusion.response;
+
+import lombok.Data;
+
+@Data
+public class DownVo {
+    private Integer downloadStatus = 0;     //0未下载过,1打包资源下载,2已下载过,3下载过,并且没有修改过,无需打包直接返回下载地址,-1没下载次数不足
+    private String downloadUrl;         //下载连击
+}

+ 12 - 0
src/main/java/com/fdkankan/fusion/response/DownloadProcessVo.java

@@ -0,0 +1,12 @@
+package com.fdkankan.fusion.response;
+
+import lombok.Data;
+import lombok.ToString;
+
+@Data
+@ToString
+public class DownloadProcessVo {
+    private Integer status = 1000;
+    private String url;
+    private Integer percent = 0;
+}

+ 20 - 0
src/main/java/com/fdkankan/fusion/service/ICameraDetailService.java

@@ -0,0 +1,20 @@
+package com.fdkankan.fusion.service;
+
+import com.fdkankan.fusion.entity.CameraDetail;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fdkankan.fusion.request.DataParam;
+import com.fdkankan.fusion.response.DataGroupVo;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 相机子表 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2024-01-09
+ */
+public interface ICameraDetailService extends IService<CameraDetail> {
+
+}

+ 17 - 0
src/main/java/com/fdkankan/fusion/service/ICameraService.java

@@ -0,0 +1,17 @@
+package com.fdkankan.fusion.service;
+
+import com.fdkankan.fusion.entity.Camera;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 相机主表 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2024-01-09
+ */
+public interface ICameraService extends IService<Camera> {
+
+    Camera getByCameraId(Long cameraId);
+}

+ 17 - 0
src/main/java/com/fdkankan/fusion/service/IDataService.java

@@ -0,0 +1,17 @@
+package com.fdkankan.fusion.service;
+
+import com.fdkankan.fusion.request.DataParam;
+
+public interface IDataService {
+    Object sceneGroupByDept(DataParam param);
+
+    Object projectGroupByDept(DataParam param);
+
+    Object cameraGroupType(DataParam param);
+
+    Object FireTrend(DataParam param);
+
+    Object FirePlaceTrend(DataParam param);
+
+    Object FireReasonTrend(DataParam param);
+}

+ 14 - 0
src/main/java/com/fdkankan/fusion/service/IDownService.java

@@ -0,0 +1,14 @@
+package com.fdkankan.fusion.service;
+
+
+import com.fdkankan.fusion.response.DownVo;
+import com.fdkankan.fusion.response.DownloadProcessVo;
+
+public interface IDownService {
+
+    DownVo checkDownLoad(String sceneNum, Integer isObj);
+
+    DownVo down(String sceneNum,Integer isObj);
+
+    DownloadProcessVo downloadProcess(String num, Integer isObj);
+}

+ 2 - 1
src/main/java/com/fdkankan/fusion/service/IHotIconService.java

@@ -3,6 +3,7 @@ package com.fdkankan.fusion.service;
 import com.fdkankan.fusion.entity.HotIcon;
 import com.baomidou.mybatisplus.extension.service.IService;
 
+import java.util.HashSet;
 import java.util.List;
 
 /**
@@ -25,5 +26,5 @@ public interface IHotIconService extends IService<HotIcon> {
 
     List<HotIcon> getListByCaseId(Integer caseId);
 
-    List<HotIcon> getByIds(List<Integer> hotIconId);
+    List<HotIcon> getByIds( HashSet<Integer> hotIconId);
 }

+ 20 - 0
src/main/java/com/fdkankan/fusion/service/ISceneDownLogService.java

@@ -0,0 +1,20 @@
+package com.fdkankan.fusion.service;
+
+import com.fdkankan.fusion.entity.SceneDownLog;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fdkankan.fusion.request.SceneDownLogParam;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2023-12-28
+ */
+public interface ISceneDownLogService extends IService<SceneDownLog> {
+
+    Object pageList(SceneDownLogParam param);
+
+    SceneDownLog getByStatusAndNum(String sceneNum, Integer status,Integer version);
+}

+ 17 - 0
src/main/java/com/fdkankan/fusion/service/ISceneEditInfoService.java

@@ -0,0 +1,17 @@
+package com.fdkankan.fusion.service;
+
+import com.fdkankan.fusion.entity.SceneEditInfo;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2024-01-09
+ */
+public interface ISceneEditInfoService extends IService<SceneEditInfo> {
+
+    SceneEditInfo getByScenePlusId(Long plusId);
+}

+ 16 - 0
src/main/java/com/fdkankan/fusion/service/IScenePlusExtService.java

@@ -0,0 +1,16 @@
+package com.fdkankan.fusion.service;
+
+import com.fdkankan.fusion.entity.ScenePlusExt;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2023-12-28
+ */
+public interface IScenePlusExtService extends IService<ScenePlusExt> {
+
+}

+ 25 - 0
src/main/java/com/fdkankan/fusion/service/IScenePlusService.java

@@ -0,0 +1,25 @@
+package com.fdkankan.fusion.service;
+
+import com.fdkankan.fusion.entity.ScenePlus;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fdkankan.fusion.request.DataParam;
+import com.fdkankan.fusion.response.DataGroupVo;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 场景主表 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2023-12-28
+ */
+public interface IScenePlusService extends IService<ScenePlus> {
+
+    ScenePlus getByNum(String sceneNum);
+
+    List<DataGroupVo> groupByCameraId(DataParam param, List<Long> cameraIds);
+
+    List<DataGroupVo> groupByType(DataParam param, List<Long> cameraIds);
+}

+ 3 - 0
src/main/java/com/fdkankan/fusion/service/ITmDepartmentService.java

@@ -38,4 +38,7 @@ public interface ITmDepartmentService extends IService<TmDepartment> {
     List<String> getByZdDeptIds();
 
     List<TmDepartment> getLikeName(String organizerDeptName);
+
+    List<String> getSonByDeptIdAndDeptIds(List<String> deptIds, String deptId);
+    List<String> getSonByDeptIdAndDeptIds(List<String> deptIds, String deptId,Integer type);
 }

+ 10 - 4
src/main/java/com/fdkankan/fusion/service/ITmProjectService.java

@@ -3,10 +3,8 @@ package com.fdkankan.fusion.service;
 import com.fdkankan.fusion.entity.CaseEntity;
 import com.fdkankan.fusion.entity.TmProject;
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.fdkankan.fusion.request.CommonDto;
-import com.fdkankan.fusion.request.ProjectRandCodeDto;
-import com.fdkankan.fusion.request.ProjectRequest;
-import com.fdkankan.fusion.request.ProjectRequestDto;
+import com.fdkankan.fusion.request.*;
+import com.fdkankan.fusion.response.DataGroupVo;
 
 import java.util.HashMap;
 import java.util.List;
@@ -43,4 +41,12 @@ public interface ITmProjectService extends IService<TmProject> {
     void updateIdenTityStatus(String tmProjectId, Integer status);
 
     HashMap<String, TmProject> getMapByIds(Set<String> tmProIds);
+
+    List<DataGroupVo> groupByDeptId(DataParam param);
+
+    List<DataGroupVo> groupByMonth(DataParam param,List<String> deptIds);
+
+    List<DataGroupVo> groupByPlace(DataParam param,List<String> deptIds);
+
+    List<DataGroupVo> groupByReason(DataParam param,List<String> deptIds);
 }

+ 26 - 0
src/main/java/com/fdkankan/fusion/service/impl/CameraDetailServiceImpl.java

@@ -0,0 +1,26 @@
+package com.fdkankan.fusion.service.impl;
+
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.fdkankan.fusion.entity.CameraDetail;
+import com.fdkankan.fusion.mapper.ICameraDetailMapper;
+import com.fdkankan.fusion.request.DataParam;
+import com.fdkankan.fusion.response.DataGroupVo;
+import com.fdkankan.fusion.service.ICameraDetailService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 相机子表 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2024-01-09
+ */
+@Service
+@DS("db2")
+public class CameraDetailServiceImpl extends ServiceImpl<ICameraDetailMapper, CameraDetail> implements ICameraDetailService {
+
+}

+ 26 - 0
src/main/java/com/fdkankan/fusion/service/impl/CameraServiceImpl.java

@@ -0,0 +1,26 @@
+package com.fdkankan.fusion.service.impl;
+
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.fdkankan.fusion.entity.Camera;
+import com.fdkankan.fusion.mapper.ICameraMapper;
+import com.fdkankan.fusion.service.ICameraService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 相机主表 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2024-01-09
+ */
+@Service
+@DS("db2")
+public class CameraServiceImpl extends ServiceImpl<ICameraMapper, Camera> implements ICameraService {
+
+    @Override
+    public Camera getByCameraId(Long cameraId) {
+        return this.getById(cameraId);
+    }
+}

+ 29 - 5
src/main/java/com/fdkankan/fusion/service/impl/CaseNumServiceImpl.java

@@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSONArray;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.fdkankan.fusion.common.FilePath;
 import com.fdkankan.fusion.common.ResultCode;
+import com.fdkankan.fusion.common.ResultData;
 import com.fdkankan.fusion.common.util.*;
 import com.fdkankan.fusion.entity.CaseNumEntity;
 import com.fdkankan.fusion.entity.Model;
@@ -14,6 +15,9 @@ import com.fdkankan.fusion.mapper.ICaseNumMapper;
 import com.fdkankan.fusion.request.SceneNumParam;
 import com.fdkankan.fusion.service.*;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fdkankan.fusion.websocket.SessionService;
+import com.fdkankan.fusion.websocket.enums.CommonEnum;
+import com.fdkankan.fusion.websocket.vo.WsMessage;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -56,6 +60,8 @@ public class CaseNumServiceImpl extends ServiceImpl<ICaseNumMapper, CaseNumEntit
     ICaseTagService caseTagService;
     @Autowired
     ICaseTagPointService caseTagPointService;
+    @Autowired
+    SessionService sessionService;
 
     @Override
     public List<CaseNumEntity> getByCaseId(Integer caseId) {
@@ -91,14 +97,27 @@ public class CaseNumServiceImpl extends ServiceImpl<ICaseNumMapper, CaseNumEntit
                     continue;
                 }
                 Model model = modelService.getIsNullNewByNum(num,param.getType());
-                model.setUpdateTime(null);
+                if(model.getModelId() != null && StringUtils.isNotBlank(model.getModelGlbUrl()) && StringUtils.isNotBlank(model.getModelSize())){
+                    continue;
+                }
                 model.setModelDateType("obj");
                 model.setType(param.getType());
                 model.setModelType("pointcloud");    //深时点云类型
+                model.setCreateStatus(1);
                 if(param.getType() == 0 || param.getType() == 1 || param.getType() == 4 || param.getType() == 6){           //看看,看见
-                    model.setModelObjUrl(String.format(FilePath.OBJ_LOCAL_PATH,environment ,num) +"/mesh.obj");
-                    model.setModelGlbUrl(getGlbUrl(param.getType(),num,model));
-                    model.setModelType("glb");
+                    String mesh3DtilesPath  = String.format(FilePath.OBJ_OSS_PATH,num) + "/images/3dtiles/tileset.json";
+                    String sizePath = String.format(FilePath.OBJ_OSS_PATH,num) + "/images/3dtiles";
+                    if(uploadToOssUtil.existKey(mesh3DtilesPath)){
+                        model.setModelDateType("b3dm");
+                        model.setModelType("b3dm");
+                        model.setModelGlbUrl(JSONArray.toJSONString(Arrays.asList(queryPath +mesh3DtilesPath)));
+                        model.setModelSize(FileWriterUtil.setFileSize(uploadToOssUtil.getSize( sizePath)));
+                    }else {
+                        model.setModelObjUrl(String.format(FilePath.OBJ_LOCAL_PATH,environment ,num) +"/mesh.obj");
+                        model.setModelGlbUrl(getGlbUrl(param.getType(),num,model));
+                        model.setModelType("glb");
+                    }
+
                 }
                 model.setNum(num);
                 model.setCreateStatus(1);
@@ -122,7 +141,7 @@ public class CaseNumServiceImpl extends ServiceImpl<ICaseNumMapper, CaseNumEntit
 //            if(uploadToOssUtil.existKey(glbOssPath)){
 //                return queryPath + "/"+glbOssPath;
 //            }
-            ShellUtil.yunDownload(String.format(FilePath.OBJ_OSS_PATH, num) ,objPath);
+            ShellUtil.yunDownload(String.format(FilePath.OBJ_OSS_PATH, num)+"/data/mesh" ,objPath);
             List<String> localGlbPaths = new ArrayList<>();
             List<String> ossGlbPaths = new ArrayList<>();
             File localFile = new File(objPath);
@@ -166,6 +185,7 @@ public class CaseNumServiceImpl extends ServiceImpl<ICaseNumMapper, CaseNumEntit
 
     private List<String> updateByNumList(Integer caseId, List<SceneNumParam> sceneNumParam) {
         List<String> addList = new ArrayList<>();
+        List<String> delMsgList = new ArrayList<>();
         for (SceneNumParam param : sceneNumParam) {
             Integer type = param.getType();
             List<String> numList = param.getNumList();
@@ -178,6 +198,7 @@ public class CaseNumServiceImpl extends ServiceImpl<ICaseNumMapper, CaseNumEntit
             for (String num : hanNumList) {
                 if(!numList.contains(num)){
                     delList.add(num);
+                    delMsgList.add(num);
                 }
             }
             for (String num : numList) {
@@ -187,6 +208,9 @@ public class CaseNumServiceImpl extends ServiceImpl<ICaseNumMapper, CaseNumEntit
             }
             this.deleteByNum(caseId,delList,param.getType());
         }
+        if(!delMsgList.isEmpty()){
+            sessionService.sendSingleByCaseId(caseId, WsMessage.okResult(CommonEnum.NOTICE, ResultData.error(ResultCode.CASE_REMOVE_SCENE)));
+        }
 
         return addList;
     }

+ 4 - 4
src/main/java/com/fdkankan/fusion/service/impl/CaseServiceImpl.java

@@ -63,10 +63,8 @@ public class CaseServiceImpl extends ServiceImpl<ICaseMapper, CaseEntity> implem
         if(deptIds.size() <=0){
             return PageInfo.PageInfo(new Page<>(param.getPageNum(),param.getPageSize()));
         }
-        if(StringUtils.isNotBlank(param.getDeptId())){
-            wrapper.eq(CaseEntity::getDeptId,param.getDeptId());
-        }
-        wrapper.in(CaseEntity::getDeptId,deptIds);
+        List<String> deptIds2 = tmDepartmentService.getSonByDeptIdAndDeptIds(deptIds, param.getDeptId());
+        wrapper.in(CaseEntity::getDeptId,deptIds2);
         //wrapper.eq(CaseEntity::getUserName,userName);
         wrapper.eq(CaseEntity::getType,0);
         wrapper.orderByDesc(CaseEntity::getCreateTime);
@@ -231,6 +229,8 @@ public class CaseServiceImpl extends ServiceImpl<ICaseMapper, CaseEntity> implem
             caseEntity = this.getById(param.getCaseId());
         }
         caseEntity.setCaseTitle(param.getCaseTitle());
+        caseEntity.setLatAndLong(param.getLatAndLong());
+        caseEntity.setMapUrl(param.getMapUrl());
         caseEntity.setUpdateTime(null);
         this.saveOrUpdate(caseEntity);
     }

+ 237 - 0
src/main/java/com/fdkankan/fusion/service/impl/DataService.java

@@ -0,0 +1,237 @@
+package com.fdkankan.fusion.service.impl;
+
+import com.fdkankan.fusion.common.util.CameraUtil;
+import com.fdkankan.fusion.common.util.DataUtil;
+import com.fdkankan.fusion.common.util.DateUtils;
+import com.fdkankan.fusion.entity.TmCamera;
+import com.fdkankan.fusion.entity.TmDepartment;
+import com.fdkankan.fusion.request.DataParam;
+import com.fdkankan.fusion.response.DataGroupVo;
+import com.fdkankan.fusion.service.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+public class DataService implements IDataService {
+
+    @Autowired
+    ITmCameraService tmCameraService;
+    @Autowired
+    IScenePlusService scenePlusService;
+    @Autowired
+    ITmDepartmentService tmDepartmentService;
+    @Autowired
+    ITmProjectService tmProjectService;
+    @Autowired
+    ICameraDetailService cameraDetailService;
+
+    @Override
+    public Object sceneGroupByDept(DataParam param) {
+
+        HashMap<String,List<Long>> deptIdMap = new HashMap<>();
+        HashMap<Long,Long> cameraIdMap = new HashMap<>();
+        String deptId = tmDepartmentService.getDeptId();
+        List<TmDepartment> sonByDeptId = tmDepartmentService.getSonByDeptId(deptId);
+        List<String> deptIds = sonByDeptId.stream().map(TmDepartment::getId).collect(Collectors.toList());
+        deptIds.add(deptId);
+        List<TmCamera> list = tmCameraService.getByDeptIds(deptIds);
+        for (TmCamera tmCamera : list) {
+            if(deptIdMap.get(tmCamera.getDeptId()) == null){
+                List<Long> cameraIdList = new ArrayList<>();
+                cameraIdList.add(tmCamera.getFdCameraId());
+                deptIdMap.put(tmCamera.getDeptId(),cameraIdList);
+            }else {
+                deptIdMap.get(tmCamera.getDeptId()).add(tmCamera.getFdCameraId());
+            }
+        }
+
+        List<Long> cameraIds = list.stream().map(TmCamera::getFdCameraId).collect(Collectors.toList());
+        List<DataGroupVo> cameraCountList = new ArrayList<>();
+        if(!cameraIds.isEmpty()){
+          cameraCountList = scenePlusService.groupByCameraId(param,cameraIds);
+        }
+        for (DataGroupVo dataGroupVo : cameraCountList) {
+            cameraIdMap.put(Long.valueOf(dataGroupVo.getGroupKey()),dataGroupVo.getDataCount());
+        }
+
+        List<TmDepartment> deptList = getDeptVoList();
+
+        List<DataGroupVo> dataGroupVos = new ArrayList<>();
+        for (TmDepartment department : deptList) {
+            List<Long> cameraIdList = deptIdMap.get(department.getId());
+            Long count = 0L;
+
+            if(cameraIdList != null){
+                for (Long cameraId : cameraIdList) {
+                    count += cameraIdMap.get(cameraId) == null ? 0 : cameraIdMap.get(cameraId);
+                }
+                if(!department.getNoStatisticsSon() && department.getChildren() != null && department.getChildren().size() >0){
+                    count += addCountByDept(department.getChildren(), deptIdMap, cameraIdMap);
+                }
+            }else {
+                if(!department.getNoStatisticsSon() && department.getChildren() != null && department.getChildren().size() >0){
+                    count += addCountByDept(department.getChildren(), deptIdMap, cameraIdMap);
+                }
+            }
+            DataGroupVo vo = new DataGroupVo();
+            vo.setGroupKey(department.getName());
+            vo.setDataCount(count);
+            dataGroupVos.add(vo);
+        }
+
+        return dataGroupVos;
+    }
+
+    private Long addCountByDept(List<TmDepartment> departments,HashMap<String,List<Long>>deptIdMap ,HashMap<Long,Long> cameraIdMap){
+        Long count = 0L;
+        for (TmDepartment department : departments) {
+            List<Long> cameraIdList = deptIdMap.get(department.getId());
+            if(cameraIdList != null){
+                for (Long cameraId : cameraIdList) {
+                    count += cameraIdMap.get(cameraId) == null ? 0 : cameraIdMap.get(cameraId);
+                }
+                if(department.getChildren() != null && department.getChildren().size() >0){
+                    count += addCountByDept(department.getChildren(), deptIdMap, cameraIdMap);
+                }
+            }
+        }
+        return count;
+    }
+    private Long addCountByDept(List<TmDepartment> departments ,HashMap<String,Long> deptMap){
+        Long count = 0L;
+        for (TmDepartment department : departments) {
+            count += deptMap.get(department.getId()) == null? 0L :deptMap.get(department.getId());
+            if(department.getChildren() != null && department.getChildren().size() >0){
+                 count += addCountByDept(department.getChildren(), deptMap);
+            }
+        }
+        return count;
+    }
+
+    private List<TmDepartment>  getDeptVoList(){
+        List<TmDepartment> deptList = tmDepartmentService.getDeptList();
+        TmDepartment department1 = deptList.get(0);
+        if(department1.getParentId() == null){  //超管
+            return department1.getChildren().get(0).getChildren();
+        }
+        if(department1.getChildren()!= null && department1.getChildren().size() >0){  //总队
+            List<TmDepartment> departments = new ArrayList<>();
+            department1.setNoStatisticsSon(true);
+            departments.add(department1);
+            departments.addAll(department1.getChildren());
+            return departments;
+        }
+        return deptList;
+    }
+
+
+    @Override
+    public Object projectGroupByDept(DataParam param) {
+        List<DataGroupVo> groupVoList = tmProjectService.groupByDeptId(param);
+        HashMap<String,Long> map = new HashMap<>();
+        groupVoList.forEach(e -> map.put(e.getGroupKey(),e.getDataCount()));
+
+        List<TmDepartment> deptVoList = getDeptVoList();
+
+        List<DataGroupVo> dataGroupVos = new ArrayList<>();
+        for (TmDepartment department : deptVoList) {
+            Long count = map.get(department.getId()) == null? 0L : map.get(department.getId());
+            if(!department.getNoStatisticsSon() && department.getChildren() != null && department.getChildren().size() >0){
+                count += addCountByDept(department.getChildren(), map);
+            }
+            DataGroupVo vo = new DataGroupVo();
+            vo.setGroupKey(department.getName());
+            vo.setDataCount(count);
+            dataGroupVos.add(vo);
+        }
+        return dataGroupVos;
+    }
+
+    @Override
+    public Object cameraGroupType(DataParam param) {
+
+        List<TmCamera> tmCameras = tmCameraService.getByDeptIds(getSonDeptIds());
+        List<Long> cameraIds = tmCameras.stream().map(TmCamera::getFdCameraId).collect(Collectors.toList());
+
+        List<DataGroupVo> groupVoList = new ArrayList<>();
+        if(!cameraIds.isEmpty()){
+           groupVoList =  scenePlusService.groupByType(param,cameraIds);
+        }
+
+        TreeMap<String,Long> countMap = new TreeMap<>();
+        for (DataGroupVo dataGroupVo : groupVoList) {
+            String key = CameraUtil.getCameraNameByType(Integer.valueOf(dataGroupVo.getGroupKey()));
+            countMap.merge(key, dataGroupVo.getDataCount(), Long::sum);
+        }
+        return getListByMap(countMap);
+
+    }
+
+    private List<String> getSonDeptIds(){
+        String deptId = tmDepartmentService.getDeptId();
+        List<TmDepartment> sonByDeptId = tmDepartmentService.getSonByDeptId(deptId);
+        List<String> deptIds = sonByDeptId.stream().map(TmDepartment::getId).collect(Collectors.toList());
+        deptIds.add(deptId);
+        return deptIds;
+    }
+
+    @Override
+    public Object FireTrend(DataParam param) {
+        List<String> monthdateList = DateUtils.getMonthdateList(param.getStartTime(), param.getEndTime());
+        TreeMap<String,Long> countMap = new TreeMap<>();
+        monthdateList.forEach(e -> countMap.put(e,0L));
+
+        List<DataGroupVo> groupVoList = tmProjectService.groupByMonth(param,tmDepartmentService.getDeptIds());
+        for (DataGroupVo dataGroupVo : groupVoList) {
+            if(countMap.get(dataGroupVo.getGroupKey()) != null){
+                countMap.put(dataGroupVo.getGroupKey(),dataGroupVo.getDataCount());
+            }
+        }
+        return getListByMap(countMap);
+
+    }
+
+    @Override
+    public Object FirePlaceTrend(DataParam param) {
+        List<DataGroupVo> groupVoList = tmProjectService.groupByPlace(param,this.getSonDeptIds());
+        TreeMap<String,Long> countMap = new TreeMap<>();
+        for (String key : DataUtil.firePlace) {
+            countMap.put(key,0L);
+        }
+        for (DataGroupVo dataGroupVo : groupVoList) {
+            String key = dataGroupVo.getGroupKey().split(">")[0];
+            countMap.merge(key, dataGroupVo.getDataCount(), Long::sum);
+        }
+
+        return getListByMap(countMap);
+    }
+
+    @Override
+    public Object FireReasonTrend(DataParam param) {
+        List<DataGroupVo> groupVoList = tmProjectService.groupByReason(param,this.getSonDeptIds());
+        TreeMap<String,Long> countMap = new TreeMap<>();
+        for (String key : DataUtil.fireReason) {
+            countMap.put(key,0L);
+        }
+        for (DataGroupVo dataGroupVo : groupVoList) {
+            String key = dataGroupVo.getGroupKey().split(">")[0];
+            countMap.merge(key, dataGroupVo.getDataCount(), Long::sum);
+        }
+        return getListByMap(countMap);
+    }
+
+
+    private List<DataGroupVo> getListByMap( TreeMap<String,Long> countMap ){
+        List<DataGroupVo> dataGroupVos = new ArrayList<>();
+        for (String key : countMap.keySet()) {
+            DataGroupVo vo = new DataGroupVo();
+            vo.setGroupKey(key);
+            vo.setDataCount(countMap.get(key));
+            dataGroupVos.add(vo);
+        }
+        return dataGroupVos;
+    }
+}

+ 278 - 0
src/main/java/com/fdkankan/fusion/service/impl/DownService.java

@@ -0,0 +1,278 @@
+package com.fdkankan.fusion.service.impl;
+
+import cn.dev33.satoken.stp.StpUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.fdkankan.fusion.common.ResultCode;
+import com.fdkankan.fusion.common.enums.DownloadStatusEnum;
+import com.fdkankan.fusion.common.util.RedisKeyUtil;
+import com.fdkankan.fusion.entity.*;
+import com.fdkankan.fusion.exception.BusinessException;
+import com.fdkankan.fusion.httpClient.LaserService;
+import com.fdkankan.fusion.httpClient.response.SSDownSceneVo;
+import com.fdkankan.fusion.response.DownVo;
+import com.fdkankan.fusion.response.DownloadProcessVo;
+import com.fdkankan.fusion.service.*;
+import com.fdkankan.redis.constant.RedisKey;
+import com.fdkankan.redis.util.RedisUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Service
+@Slf4j
+public class DownService implements IDownService {
+
+    @Autowired
+    ISceneDownLogService sceneDownloadLogService;
+    @Autowired
+    IScenePlusService scenePlusService;
+    @Autowired
+    ISceneEditInfoService sceneEditInfoService;
+    @Autowired
+    RedisUtil redisUtil;
+    @Autowired
+    LaserService laserService;
+    @Autowired
+    ITmDepartmentService tmDepartmentService;
+    @Autowired
+    ICameraService cameraService;
+
+
+
+    private Integer getSceneVersion( ScenePlus scenePlus) {
+        Integer version = 0;
+        if(scenePlus !=null){
+            String redisKey = String.format(RedisKeyUtil.SCENE_VERSION,scenePlus.getNum());
+            if(!redisUtil.hasKey(redisKey) || StringUtils.isBlank(redisUtil.get(redisKey))) {
+                SceneEditInfo sceneEditInfo = sceneEditInfoService.getByScenePlusId(scenePlus.getId());
+                if(sceneEditInfo == null){
+                    throw new BusinessException(ResultCode.SCENE_NOT_EXIST);
+                }
+                version = sceneEditInfo.getVersion();
+            }else {
+                String redisObj = redisUtil.get(redisKey);
+                JSONObject obj = JSONObject.parseObject(redisObj);
+                version = obj.getInteger("version");
+            }
+
+        }
+        return version;
+    }
+
+    @Override
+    public DownVo checkDownLoad(String sceneNum, Integer isObj) {
+        if(StringUtils.isEmpty(sceneNum)){
+            throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
+        }
+        ScenePlus plus = scenePlusService.getByNum(sceneNum);
+        if(plus == null){
+            throw new BusinessException(ResultCode.SCENE_NOT_EXIST);
+        }
+        Integer sceneType =  plus.getSceneSource();
+        log.info("checkDownLoad--sceneType:{},isObj:{}",sceneType,isObj);
+        if((sceneType == 4 || sceneType == 5) && isObj !=1){ //深时场景
+            return SSCheckDownload(sceneNum);
+        }
+        SceneDownLog sceneDownloadLog;
+        Integer sceneVersion = getSceneVersion(plus);
+
+        sceneDownloadLog = sceneDownloadLogService.getByStatusAndNum(sceneNum,0,sceneVersion);
+        DownVo downVo = new DownVo();
+        if(sceneDownloadLog != null){
+            downVo.setDownloadStatus(1);
+            return downVo;
+        }
+        sceneDownloadLog = sceneDownloadLogService.getByStatusAndNum(sceneNum,1,sceneVersion);
+        //下载过,有更改
+        if(sceneDownloadLog == null){
+            String redisKey = RedisKey.PREFIX_DOWNLOAD_PROGRESS;
+            downVo.setDownloadStatus(2);
+            redisUtil.del(String.format(redisKey,sceneNum));  // 清除旧的下载信息
+            return downVo;
+        }
+        //3下载过,并且没有修改过
+        downVo.setDownloadStatus(3);
+        downVo.setDownloadUrl(sceneDownloadLog.getDownUrl());
+        return downVo;
+
+    }
+
+
+    @Override
+    public DownVo down(String sceneNum,Integer isObj) {
+        if(StringUtils.isEmpty(sceneNum) ){
+            throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
+        }
+        ScenePlus scenePlus = scenePlusService.getByNum(sceneNum);
+        if( scenePlus == null){
+            throw new BusinessException(ResultCode.SCENE_NOT_EXIST);
+        }
+
+        Long userId =  scenePlus.getUserId();
+
+        Integer sceneType =  scenePlus.getSceneSource();
+        Integer sceneVersion = getSceneVersion( scenePlus);
+        log.info("down--sceneType:{},isObj:{}",sceneType,isObj);
+        saveLog(scenePlus,sceneVersion);
+        if((sceneType == 4 || sceneType == 5) && isObj !=1){ //深时场景
+            return SSDownload(sceneNum,userId);
+        }
+        String redisKeyProcess = RedisKey.PREFIX_DOWNLOAD_PROGRESS_V4;
+        // 刪除下载进度
+        redisUtil.del(String.format(redisKeyProcess,sceneNum));
+        DownVo downVo = new DownVo();
+
+        String redisKey = RedisKey.SCENE_DOWNLOADS_TASK_V4;
+        Map<String,String> params = new HashMap<>(2);
+        params.put("type","local");
+        params.put("num",sceneNum);
+        redisUtil.lRightPush(redisKey, JSONObject.toJSONString(params));
+
+        downVo.setDownloadStatus(1);
+        return downVo;
+    }
+
+    private void saveLog(ScenePlus scenePlus,Integer sceneVersion){
+        String userName =  (String) StpUtil.getExtra("userName");
+        String nickName =  (String) StpUtil.getExtra("nickName");
+        String deptId = tmDepartmentService.getDeptId();
+        TmDepartment tmDepartment = tmDepartmentService.getById(deptId);
+        Camera camera = cameraService.getByCameraId(scenePlus.getCameraId());
+        SceneDownLog sceneDownloadLogEntity = new SceneDownLog();
+        sceneDownloadLogEntity.setSceneNum(scenePlus.getNum());
+        sceneDownloadLogEntity.setSceneTitle(scenePlus.getTitle());
+        sceneDownloadLogEntity.setUserName(userName);
+        sceneDownloadLogEntity.setNickName(nickName);
+        sceneDownloadLogEntity.setSnCode(camera.getSnCode());
+        sceneDownloadLogEntity.setDeptName(tmDepartment.getName());
+        sceneDownloadLogEntity.setDeptLevel(tmDepartment.getDeptType());
+        sceneDownloadLogEntity.setDeptId(deptId);
+        sceneDownloadLogEntity.setStatus(0);
+        sceneDownloadLogEntity.setVersion(sceneVersion);
+        sceneDownloadLogService.save(sceneDownloadLogEntity);
+    }
+
+    //downloads:progress:v4:SS-t-8H5pZsMnHGL
+    @Override
+    public DownloadProcessVo downloadProcess(String sceneNum, Integer isObj) {
+        if (StringUtils.isEmpty(sceneNum)) {
+            throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
+        }
+        ScenePlus scenePlus = scenePlusService.getByNum(sceneNum);
+        if( scenePlus == null){
+            throw new BusinessException(ResultCode.SCENE_NOT_EXIST);
+        }
+        Integer sceneType =  scenePlus.getSceneSource();
+        log.info("downloadProcess--sceneType:{},isObj:{}",sceneType,isObj);
+        if((sceneType == 4 || sceneType == 5) && isObj !=1){ //深时场景
+            return SSDownloadProcess(sceneNum);
+        }
+        String redisKey = RedisKey.PREFIX_DOWNLOAD_PROGRESS_V4;
+        // 获取下载进度
+        String result = redisUtil.get(String.format(redisKey,sceneNum));
+        log.info("redis-down-msg:{}",result);
+        if(StringUtils.isEmpty(result)){
+            return new DownloadProcessVo();
+        }
+        SceneDownLog sceneDownloadLog = sceneDownloadLogService.getByStatusAndNum(sceneNum,0,getSceneVersion(scenePlus));
+
+        DownloadProcessVo downloadProcessVo = JSONObject.parseObject(result, DownloadProcessVo.class);
+        if(sceneDownloadLog != null){
+            switch (downloadProcessVo.getStatus()) {
+                case DownloadStatusEnum.DOWNLOAD_SUCCESS_CODE:
+                    String url = downloadProcessVo.getUrl();
+                    if (!StringUtils.isEmpty(url)) {
+                        sceneDownloadLog.setDownUrl(url);
+                        sceneDownloadLog.setStatus(1);
+                        break;
+                    }
+                case DownloadStatusEnum.DOWNLOAD_FAILED_CODE:
+                    sceneDownloadLog.setStatus(-1);
+                    break;
+            }
+            sceneDownloadLogService.updateById(sceneDownloadLog);
+        }
+        return downloadProcessVo;
+    }
+
+    /**
+     * status :离线包状态是否需要重新生成  0 未生成:1 不需要  2需要   3 生成中
+     */
+    private DownVo SSCheckDownload(String sceneNum) {
+        DownVo downVo = new DownVo();
+        SSDownSceneVo vo = laserService.downOfflineSceneStatus(sceneNum);
+        if(vo == null){
+            throw new BusinessException(ResultCode.SS_SCENE_DOWN_ERROR);
+        }
+        downVo.setDownloadStatus(0);
+        if(vo.getStatus() == 1){
+            downVo.setDownloadStatus(3);
+            downVo.setDownloadUrl(vo.getUrl());
+        }
+        if(vo.getStatus() == 2){
+            downVo.setDownloadStatus(2);
+        }
+        if(vo.getStatus() == 3){
+            downVo.setDownloadStatus(1);
+        }
+        return downVo;
+    }
+
+    /**
+     * downloadStatus -1下载失败  1下载成功
+     */
+    private DownVo SSDownload(String sceneNum,Long userId) {
+        DownVo downVo = new DownVo();
+
+        //status :0:正在生成 1,初次生成  2,已经生成直接下载 3,重新生成
+        SSDownSceneVo vo = laserService.downOfflineScene(sceneNum);
+        if(vo == null){
+            throw new BusinessException(ResultCode.SS_SCENE_DOWN_ERROR);
+        }
+
+        downVo.setDownloadStatus(1);
+        return downVo;
+    }
+
+    public static HashMap<String,Integer> ssNumProcessNumMap = new HashMap<>();
+
+    private DownloadProcessVo SSDownloadProcess(String sceneNum) {
+        DownloadProcessVo downVo = new DownloadProcessVo();
+        SSDownSceneVo vo = laserService.downOfflineSceneStatus(sceneNum);
+        if(vo == null){
+            throw new BusinessException(ResultCode.SS_SCENE_DOWN_ERROR);
+        }
+        downVo.setStatus(1003);
+
+        if(vo.getStatus() == 0 || vo.getStatus() == 2 || vo.getStatus() == 3){    //下载中
+            ssNumProcessNumMap.merge(sceneNum, 1, Integer::sum);
+            Integer percent = ssNumProcessNumMap.get(sceneNum);
+            percent = percent /2;
+            if(percent >50){
+                percent = 50;
+            }
+            downVo.setStatus(1001);
+            downVo.setPercent(percent);
+        }
+        if(vo.getStatus() == 1){    //下载完成
+            ssNumProcessNumMap.remove(sceneNum);
+            downVo.setPercent(100);
+            downVo.setUrl(vo.getUrl());
+            downVo.setStatus(1002);
+
+            LambdaUpdateWrapper<SceneDownLog> wrapper = new LambdaUpdateWrapper<>();
+            wrapper.eq(SceneDownLog::getSceneNum,sceneNum);
+            wrapper.eq(SceneDownLog::getStatus,0);
+            wrapper.set(SceneDownLog::getDownUrl,vo.getUrl());
+            wrapper.set(SceneDownLog::getStatus,1);
+            sceneDownloadLogService.update(wrapper);
+        }
+        return downVo;
+    }
+
+}

+ 20 - 6
src/main/java/com/fdkankan/fusion/service/impl/HotIconServiceImpl.java

@@ -16,6 +16,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -87,19 +88,32 @@ public class HotIconServiceImpl extends ServiceImpl<IHotIconMapper, HotIcon> imp
 
     @Override
     public List<HotIcon> getListByCaseId(Integer caseId) {
-        List<Integer> hotIconId = new ArrayList<>();
+        HashSet<Integer> hotIconIds = new HashSet<>();
         List<CaseTag> list = caseTagService.getListByCaseId(caseId);
         if(list.size() >0){
-            hotIconId = list.parallelStream().map(CaseTag::getHotIconId).collect(Collectors.toList());
+            List<Integer> ids  = list.parallelStream().map(CaseTag::getHotIconId).collect(Collectors.toList());
+            if(!ids.isEmpty()){
+                hotIconIds.addAll(ids);
+            }
         }
-        hotIconId.add(getDefaultIcon().getIconId());
-        return this.getByIds(hotIconId);
+        hotIconIds.add(getDefaultIcon().getIconId());
+        LambdaQueryWrapper<HotIcon> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(HotIcon::getCaseId,caseId);
+        List<HotIcon> list1 = this.list(wrapper);
+        List<Integer> ids = list1.stream().map(HotIcon::getIconId).collect(Collectors.toList());
+        if(!ids.isEmpty()){
+            hotIconIds.addAll(ids);
+        }
+        if(hotIconIds.isEmpty()){
+            return new ArrayList<>();
+        }
+        return this.getByIds(hotIconIds);
     }
 
     @Override
-    public List<HotIcon> getByIds(List<Integer> hotIconId) {
+    public List<HotIcon> getByIds( HashSet<Integer> hotIconIds) {
         LambdaQueryWrapper<HotIcon> wrapper = new LambdaQueryWrapper<>();
-        wrapper.in(HotIcon::getIconId,hotIconId);
+        wrapper.in(HotIcon::getIconId,hotIconIds);
         wrapper.orderByDesc(HotIcon::getIsSystem)           // 官方默认
                 .orderByDesc(HotIcon::getIsNew)           // 新增
                 .orderByDesc(HotIcon::getLastUse)         // 上次使用

+ 2 - 4
src/main/java/com/fdkankan/fusion/service/impl/ModelServiceImpl.java

@@ -132,10 +132,8 @@ public class ModelServiceImpl extends ServiceImpl<IModelMapper, Model> implement
             String deptId =  caseService.getDeptId(param.getCaseId());
             wrapper.eq(Model::getDeptId,deptId);
         }
-        if(StringUtils.isNotBlank(param.getDeptId())){
-            wrapper.eq(Model::getDeptId,param.getDeptId());
-        }
-        wrapper.in(Model::getDeptId,deptIds);
+        List<String> deptIds2 = tmDepartmentService.getSonByDeptIdAndDeptIds(deptIds, param.getDeptId(),param.getSearchType());
+        wrapper.in(Model::getDeptId,deptIds2);
         wrapper.eq(Model::getType,3);
         wrapper.notIn(Model::getCreateStatus,-2);
         if(param.getStatus()!=null){    //参数2为成功,数据库中成功为1

+ 86 - 0
src/main/java/com/fdkankan/fusion/service/impl/SceneDownLogServiceImpl.java

@@ -0,0 +1,86 @@
+package com.fdkankan.fusion.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fdkankan.fusion.common.PageInfo;
+import com.fdkankan.fusion.entity.SceneDownLog;
+import com.fdkankan.fusion.entity.TmDepartment;
+import com.fdkankan.fusion.mapper.ISceneDownLogMapper;
+import com.fdkankan.fusion.request.SceneDownLogParam;
+import com.fdkankan.fusion.service.ISceneDownLogService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fdkankan.fusion.service.ITmDepartmentService;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2023-12-28
+ */
+@Service
+public class SceneDownLogServiceImpl extends ServiceImpl<ISceneDownLogMapper, SceneDownLog> implements ISceneDownLogService {
+
+    @Autowired
+    ITmDepartmentService departmentService;
+
+
+    @Override
+    public Object pageList(SceneDownLogParam param) {
+        LambdaQueryWrapper<SceneDownLog> wrapper = new LambdaQueryWrapper<>();
+        if(StringUtils.isNotBlank(param.getDeptId())){
+            List<TmDepartment> sonByDeptId = departmentService.getSonByDeptId(param.getDeptId());
+            List<String> deptIds = sonByDeptId.stream().map(TmDepartment::getId).collect(Collectors.toList());
+            deptIds.add(param.getDeptId());
+            wrapper.in(SceneDownLog::getDeptId,deptIds);
+        }
+        if(StringUtils.isNotBlank(param.getUserName())){
+            wrapper.like(SceneDownLog::getUserName,param.getUserName());
+        }
+        if(StringUtils.isNotBlank(param.getNickName())){
+            wrapper.like(SceneDownLog::getNickName,param.getNickName());
+        }
+        if(StringUtils.isNotBlank(param.getCreateTime())){
+            wrapper.like(SceneDownLog::getCreateTime,param.getCreateTime());
+        }
+        if(StringUtils.isNotBlank(param.getSceneTitle())){
+            wrapper.like(SceneDownLog::getSceneTitle,param.getSceneTitle());
+        }
+        if(StringUtils.isNotBlank(param.getSceneNum())){
+            wrapper.like(SceneDownLog::getSceneNum,param.getSceneNum());
+        }
+        if(StringUtils.isNotBlank(param.getSnCode())){
+            wrapper.like(SceneDownLog::getSnCode,param.getSnCode());
+        }
+        if(StringUtils.isNotBlank(param.getStartCreateTime())){
+            wrapper.ge(SceneDownLog::getCreateTime,param.getStartCreateTime());
+        }
+        if(StringUtils.isNotBlank(param.getEndCreateTime())){
+            wrapper.le(SceneDownLog::getCreateTime,param.getEndCreateTime());
+        }
+        wrapper.orderByDesc(SceneDownLog::getCreateTime);
+        Page<SceneDownLog> page = this.page(new Page<>(param.getPageNum(), param.getPageSize()), wrapper);
+        return PageInfo.PageInfo(page);
+    }
+
+    @Override
+    public SceneDownLog getByStatusAndNum(String sceneNum, Integer status,Integer sceneVersion) {
+        LambdaQueryWrapper<SceneDownLog> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(SceneDownLog::getSceneNum,sceneNum);
+        wrapper.eq(SceneDownLog::getStatus,status);
+        wrapper.eq(SceneDownLog::getVersion,sceneVersion);
+        wrapper.orderByDesc(SceneDownLog::getId);
+        List<SceneDownLog> list = this.list(wrapper);
+        if(list != null && !list.isEmpty()){
+            return list.get(0);
+        }
+        return null;
+    }
+}

+ 29 - 0
src/main/java/com/fdkankan/fusion/service/impl/SceneEditInfoServiceImpl.java

@@ -0,0 +1,29 @@
+package com.fdkankan.fusion.service.impl;
+
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fdkankan.fusion.entity.SceneEditInfo;
+import com.fdkankan.fusion.mapper.ISceneEditInfoMapper;
+import com.fdkankan.fusion.service.ISceneEditInfoService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2024-01-09
+ */
+@Service
+@DS("db2")
+public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper, SceneEditInfo> implements ISceneEditInfoService {
+
+    @Override
+    public SceneEditInfo getByScenePlusId(Long plusId) {
+        LambdaQueryWrapper<SceneEditInfo> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(SceneEditInfo::getScenePlusId,plusId);
+        return this.getOne(wrapper);
+    }
+}

+ 22 - 0
src/main/java/com/fdkankan/fusion/service/impl/ScenePlusExtServiceImpl.java

@@ -0,0 +1,22 @@
+package com.fdkankan.fusion.service.impl;
+
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.fdkankan.fusion.entity.ScenePlusExt;
+import com.fdkankan.fusion.mapper.IScenePlusExtMapper;
+import com.fdkankan.fusion.service.IScenePlusExtService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2023-12-28
+ */
+@Service
+@DS("db2")
+public class ScenePlusExtServiceImpl extends ServiceImpl<IScenePlusExtMapper, ScenePlusExt> implements IScenePlusExtService {
+
+}

+ 44 - 0
src/main/java/com/fdkankan/fusion/service/impl/ScenePlusServiceImpl.java

@@ -0,0 +1,44 @@
+package com.fdkankan.fusion.service.impl;
+
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fdkankan.fusion.entity.ScenePlus;
+import com.fdkankan.fusion.mapper.IScenePlusMapper;
+import com.fdkankan.fusion.request.DataParam;
+import com.fdkankan.fusion.response.DataGroupVo;
+import com.fdkankan.fusion.service.IScenePlusService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 场景主表 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2023-12-28
+ */
+@Service
+@DS("db2")
+public class ScenePlusServiceImpl extends ServiceImpl<IScenePlusMapper, ScenePlus> implements IScenePlusService {
+
+    @Override
+    public ScenePlus getByNum(String sceneNum) {
+        LambdaQueryWrapper<ScenePlus> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(ScenePlus::getNum,sceneNum);
+        return this.getOne(wrapper);
+    }
+
+    @Override
+    public List<DataGroupVo> groupByCameraId(DataParam param, List<Long> cameraIds) {
+        return getBaseMapper().groupByCameraId(param.getStartTime(),param.getEndTime(),cameraIds);
+    }
+
+
+    @Override
+    public List<DataGroupVo> groupByType(DataParam param, List<Long> cameraIds) {
+        return getBaseMapper().groupByType(param.getStartTime(),param.getEndTime(),cameraIds);
+    }
+}

+ 20 - 13
src/main/java/com/fdkankan/fusion/service/impl/SceneService.java

@@ -88,7 +88,13 @@ public class SceneService implements ISceneService {
             }
         }
         if(StringUtils.isNotBlank(param.getDeptId())){
-            List<TmCamera> tmCameras = tmCameraService.getByDeptIds(Arrays.asList(param.getDeptId()));
+            List<String> deptIds = new ArrayList<>();
+            if(param.getSearchType() == 0){
+                List<TmDepartment> sonByDeptId = tmDepartmentService.getSonByDeptId(param.getDeptId());
+                deptIds = sonByDeptId.stream().map(TmDepartment::getId).collect(Collectors.toList());
+            }
+            deptIds.add(param.getDeptId());
+            List<TmCamera> tmCameras = tmCameraService.getByDeptIds(deptIds);
             Set<String> snCodeSet = tmCameras.parallelStream().map(TmCamera::getCameraSn).collect(Collectors.toSet());
             List<String> snCodes = param.getSnCodes();
             if(snCodes == null){
@@ -98,17 +104,17 @@ public class SceneService implements ISceneService {
             }
             param.setSnCodes(snCodes);
         }
-        if(StringUtils.isNotBlank(param.getSnCode())){
-            List<String> snCodes = param.getSnCodes();
-            List<String> snCodes1 = new ArrayList<>();
-            snCodes1.add(param.getSnCode());
-            if(snCodes == null){
-                snCodes = snCodes1;
-            }else {
-                snCodes = snCodes.stream().filter(snCodes1::contains).collect(Collectors.toList());
-            }
-            param.setSnCodes(snCodes);
-        }
+//        if(StringUtils.isNotBlank(param.getSnCode())){
+//            List<String> snCodes = param.getSnCodes();
+//            List<String> snCodes1 = new ArrayList<>();
+//            snCodes1.add(param.getSnCode());
+//            if(snCodes == null){
+//                snCodes = snCodes1;
+//            }else {
+//                snCodes = snCodes.stream().filter(snCodes1::contains).collect(Collectors.toList());
+//            }
+//            param.setSnCodes(snCodes);
+//        }
         if(param.getCaseId() !=null){
             String deptId =  caseService.getDeptId(param.getCaseId());
             List<TmCamera> tmCameras = tmCameraService.getByDeptIds(Arrays.asList(deptId));
@@ -123,7 +129,7 @@ public class SceneService implements ISceneService {
             param.setSnCodes(snCodes);
         }
         if(CollectionUtil.isEmpty(param.getSnCodes()) && CollectionUtil.isEmpty(param.getNumList())){
-            param.setSnCodes( Arrays.asList("no_snCode"));
+            return PageInfo.PageInfoEmpty();
         }
         List<SceneVo> sceneVoList = new ArrayList<>();
         long total = 0;
@@ -145,6 +151,7 @@ public class SceneService implements ISceneService {
             laserSceneParam.setPageNum(param.getPageNum());
             laserSceneParam.setPageSize(param.getPageSize());
             laserSceneParam.setStatus(param.getStatus());
+            laserSceneParam.setSnCode(param.getSnCode());
             laserSceneParam.setSnCodes(param.getSnCodes());
             if(param.getType() == 5){
                 laserSceneParam.setSceneSource(5);

+ 4 - 2
src/main/java/com/fdkankan/fusion/service/impl/TmCameraServiceImpl.java

@@ -184,11 +184,13 @@ public class TmCameraServiceImpl extends ServiceImpl<ITmCameraMapper, TmCamera>
         if (StringUtils.isNotBlank(snCode)) {
             wrapper.like(TmCamera::getCameraSn,snCode);
         }
+
+        List<String> deptIds = tmDepartmentService.getDeptIds();
         if(StringUtils.isNotBlank(deptId)){
-            wrapper.eq(TmCamera::getDeptId,deptId);
+            deptIds = tmDepartmentService.getSonByDeptIdAndDeptIds(deptIds,deptId);
         }
-        List<String> deptIds = tmDepartmentService.getDeptIds();
         wrapper.in(TmCamera::getDeptId,deptIds);
+
         wrapper.orderByDesc(TmCamera::getCreateTime);
         Page<TmCamera> page = this.page(new Page<>(pageNum, pageSize), wrapper);
         if(page.getRecords().size()<=0){

+ 49 - 6
src/main/java/com/fdkankan/fusion/service/impl/TmDepartmentServiceImpl.java

@@ -8,10 +8,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.fdkankan.fusion.common.ResultCode;
 import com.fdkankan.fusion.common.enums.IdPreEnum;
-import com.fdkankan.fusion.entity.TmDepartment;
-import com.fdkankan.fusion.entity.TmRole;
-import com.fdkankan.fusion.entity.TmUser;
-import com.fdkankan.fusion.entity.TmUserRole;
+import com.fdkankan.fusion.entity.*;
 import com.fdkankan.fusion.exception.BusinessException;
 import com.fdkankan.fusion.mapper.ITmDepartmentMapper;
 import com.fdkankan.fusion.service.ITmDepartmentService;
@@ -82,7 +79,10 @@ public class TmDepartmentServiceImpl extends ServiceImpl<ITmDepartmentMapper, Tm
         if(dept.getId().equals(dept.getParentId())){
             throw new BusinessException(ResultCode.DEPT_EDIT_ERROR);
         }
-        if(dept.getLevel() >4){
+        List<TmDepartment> tmDepartments = new ArrayList<>();
+        this.getParentList(dept.getParentId(),tmDepartments);
+        List<TmDepartment> collect2 = tmDepartments.stream().filter(entity -> !entity.getId().equals("0")).collect(Collectors.toList());
+        if(collect2.size() >=4){
             throw new BusinessException(ResultCode.DEPT_ADD_ERROR);
         }
         List<TmDepartment> sonByDeptId = this.getSonByDeptId(dept.getId());
@@ -200,7 +200,7 @@ public class TmDepartmentServiceImpl extends ServiceImpl<ITmDepartmentMapper, Tm
         if(tmDepartment == null){
             throw new BusinessException(ResultCode.NOT_DEPT.code,ResultCode.NOT_DEPT.msg +":"+deptId);
         }
-        if(tmDepartment.getDeptType()==1 ){
+        if(tmDepartment.getDeptType()==0 || tmDepartment.getDeptType()==1 ){
             return tmDepartment.getId();
         }
         return getZdDeptId(tmDepartment.getParentId());
@@ -269,4 +269,47 @@ public class TmDepartmentServiceImpl extends ServiceImpl<ITmDepartmentMapper, Tm
         wrapper.like(TmDepartment::getName,organizerDeptName);
         return this.list(wrapper);
     }
+
+    @Override
+    public List<String> getSonByDeptIdAndDeptIds(List<String> deptIds, String deptId) {
+        List<String> deptIds2 = new ArrayList<>();
+        if(StringUtils.isNotBlank(deptId)){
+            List<TmDepartment> sonByDeptId = this.getSonByDeptId(deptId);
+            deptIds2 = sonByDeptId.stream().map(TmDepartment::getId).collect(Collectors.toList());
+            deptIds2.add(deptId);
+        }
+        if(!deptIds2.isEmpty()){
+            List<String> collect = deptIds.stream().filter(deptIds2::contains).collect(Collectors.toList());
+            if(collect.size()<=0){
+                collect.add("empty-dept");
+            }
+            return collect;
+        }
+        if(deptIds.size()<=0){
+            deptIds.add("empty-dept");
+        }
+        return deptIds;
+    }
+
+    @Override
+    public List<String> getSonByDeptIdAndDeptIds(List<String> deptIds, String deptId,Integer type) {
+        if(type == 0){
+            return getSonByDeptIdAndDeptIds(deptIds,deptId);
+        }
+        List<String> deptIds2 = new ArrayList<>();
+        if(StringUtils.isNotBlank(deptId)){
+            deptIds2.add(deptId);
+        }
+        if(!deptIds2.isEmpty()){
+            List<String> collect = deptIds.stream().filter(deptIds2::contains).collect(Collectors.toList());
+            if(collect.size()<=0){
+                collect.add("empty-dept");
+            }
+            return collect;
+        }
+        if(deptIds.size()<=0){
+            deptIds.add("empty-dept");
+        }
+        return deptIds;
+    }
 }

+ 31 - 8
src/main/java/com/fdkankan/fusion/service/impl/TmProjectServiceImpl.java

@@ -16,10 +16,8 @@ import com.fdkankan.fusion.common.util.RedisKeyUtil;
 import com.fdkankan.fusion.entity.*;
 import com.fdkankan.fusion.exception.BusinessException;
 import com.fdkankan.fusion.mapper.ITmProjectMapper;
-import com.fdkankan.fusion.request.CommonDto;
-import com.fdkankan.fusion.request.ProjectRandCodeDto;
-import com.fdkankan.fusion.request.ProjectRequest;
-import com.fdkankan.fusion.request.ProjectRequestDto;
+import com.fdkankan.fusion.request.*;
+import com.fdkankan.fusion.response.DataGroupVo;
 import com.fdkankan.fusion.response.ProjectRandCodeVo;
 import com.fdkankan.fusion.service.*;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -86,8 +84,9 @@ public class TmProjectServiceImpl extends ServiceImpl<ITmProjectMapper, TmProjec
             List<String> collect = list.stream().map(TmDepartment::getId).collect(Collectors.toList());
             deptIds = deptIds.stream().filter(collect::contains).collect(Collectors.toList());
         }
+        List<String> deptIds2 = tmDepartmentService.getSonByDeptIdAndDeptIds(deptIds, tmProject.getDeptId());
+        wrapper.in(TmProject::getDeptId,deptIds2);
 
-        wrapper.in(TmProject::getDeptId,deptIds);
         //起火项目对象
         if(StringUtils.isNotBlank(tmProject.getProjectSn())){
             wrapper.like(TmProject::getProjectSn , tmProject.getProjectSn());
@@ -112,9 +111,6 @@ public class TmProjectServiceImpl extends ServiceImpl<ITmProjectMapper, TmProjec
             wrapper.like(TmProject::getOrganizerUsers , tmProject.getOrganizerUsers());
         }
 
-        if(StringUtils.isNotBlank(tmProject.getDeptId())){
-            wrapper.eq(TmProject::getDeptId , tmProject.getDeptId());
-        }
         //事故日期
         if(StringUtils.isNotBlank(tmProject.getAccidentDate())){
             wrapper.ge(TmProject::getAccidentDate,tmProject.getAccidentDateStart());
@@ -143,6 +139,8 @@ public class TmProjectServiceImpl extends ServiceImpl<ITmProjectMapper, TmProjec
             CaseEntity caseEntity = map.get(record.getId());
             if(caseEntity != null){
                 record.setCaseId(caseEntity.getCaseId());
+                record.setLatAndLong(caseEntity.getLatAndLong());
+                record.setMapUrl(caseEntity.getMapUrl());
             }
             TmDepartment tmDepartment = mapByDeptIds.get(record.getDeptId());
             if(tmDepartment != null){
@@ -238,6 +236,8 @@ public class TmProjectServiceImpl extends ServiceImpl<ITmProjectMapper, TmProjec
         caseEntity.setUserName(tmUser.getUserName());
         caseEntity.setType(1);
         caseEntity.setTmProjectId(tmProject.getId());
+        caseEntity.setMapUrl(tmProject.getMapUrl());
+        caseEntity.setLatAndLong(tmProject.getLatAndLong());
         caseService.save(caseEntity);
     }
 
@@ -268,6 +268,9 @@ public class TmProjectServiceImpl extends ServiceImpl<ITmProjectMapper, TmProjec
 
         CaseEntity caseEntity = caseService.getByTmProjectId(tmProject.getId());
         caseEntity.setCaseTitle(tmProject.getProjectName());
+        caseEntity.setTmProjectId(tmProject.getId());
+        caseEntity.setMapUrl(tmProject.getMapUrl());
+        caseEntity.setLatAndLong(tmProject.getLatAndLong());
         caseService.updateById(caseEntity);
     }
 
@@ -353,4 +356,24 @@ public class TmProjectServiceImpl extends ServiceImpl<ITmProjectMapper, TmProjec
         }
         return map;
     }
+
+    @Override
+    public List<DataGroupVo> groupByDeptId(DataParam param) {
+        return getBaseMapper().groupByDeptId(param.getStartTime(),param.getEndTime());
+    }
+
+    @Override
+    public List<DataGroupVo> groupByMonth(DataParam param,List<String> deptIds) {
+        return getBaseMapper().groupByMonth(param.getStartTime(),param.getEndTime(),deptIds);
+    }
+
+    @Override
+    public List<DataGroupVo> groupByPlace(DataParam param,List<String> deptIds) {
+        return getBaseMapper().groupByPlace(param.getStartTime(),param.getEndTime(),deptIds);
+    }
+
+    @Override
+    public List<DataGroupVo> groupByReason(DataParam param,List<String> deptIds) {
+        return getBaseMapper().groupByReason(param.getStartTime(),param.getEndTime(),deptIds);
+    }
 }

+ 10 - 5
src/main/java/com/fdkankan/fusion/service/impl/TmUserServiceImpl.java

@@ -89,6 +89,12 @@ public class TmUserServiceImpl extends ServiceImpl<ITmUserMapper, TmUser> implem
         tmUser.setPermsList(permsList);
         tmUser.setRoleList(roleKeys);
         tmUser.setRoleIdList(roleIds);
+
+        TmDepartment tmDepartment = tmDepartmentService.getById(tmUser.getDeptId());
+        if(tmDepartment !=null){
+            tmUser.setDeptName(tmDepartment.getName());
+            tmUser.setDeptLevel(tmDepartment.getDeptType());
+        }
         redisUtil.set(redisKeyMenu, JSONArray.toJSONString(permsList),RedisKeyUtil.tokenTime);
         redisUtil.set(redisKeyRole,JSONArray.toJSONString(roleKeys),RedisKeyUtil.tokenTime);
     }
@@ -276,17 +282,16 @@ public class TmUserServiceImpl extends ServiceImpl<ITmUserMapper, TmUser> implem
         if(StringUtils.isNotBlank(nickName)){
             wrapper.like(TmUser::getNickName,nickName);
         }
-        if(StringUtils.isNotBlank(deptId)){
-            wrapper.eq(TmUser::getDeptId,deptId);
-        }
+
         if(status != null){
             wrapper.eq(TmUser::getStatus,status);
         }
         List<String> deptIds = tmDepartmentService.getDeptIds();
-        if(deptIds.size() <=0){
-            deptIds.add("not-dept");
+        if(StringUtils.isNotBlank(deptId)){
+            deptIds = tmDepartmentService.getSonByDeptIdAndDeptIds(deptIds,deptId);
         }
         wrapper.in(TmUser::getDeptId,deptIds);
+
         wrapper.orderByDesc(TmUser::getCreateTime);
         Page<TmUser> page = this.page(new Page<>(pageNum, pageSize), wrapper);
         Set<String> deptIdSet = page.getRecords().stream().map(TmUser::getDeptId).collect(Collectors.toSet());

+ 99 - 0
src/main/java/com/fdkankan/fusion/websocket/MyWebSocketServer.java

@@ -0,0 +1,99 @@
+package com.fdkankan.fusion.websocket;
+
+
+import com.fdkankan.fusion.common.ResultData;
+import com.fdkankan.fusion.websocket.enums.CommonEnum;
+import com.fdkankan.fusion.websocket.service.MessageService;
+import com.fdkankan.fusion.websocket.vo.WsMessage;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
+
+import javax.websocket.*;
+import javax.websocket.server.PathParam;
+import javax.websocket.server.ServerEndpoint;
+import java.io.IOException;
+
+@Component
+@ServerEndpoint(value = "/ws/{caseId}",configurator = WebSocketConfigurator.class)
+public class MyWebSocketServer {
+
+    private Logger webSocketLogger = LoggerFactory.getLogger("webSocketLogger");
+
+    private static SessionService sessionService;
+
+    private static MessageService messageService;
+
+    @Autowired
+    public void setWebSocketServerHandler(SessionService sessionService, MessageService messageService) {
+        MyWebSocketServer.sessionService = sessionService;
+        MyWebSocketServer.messageService = messageService;
+    }
+
+    @OnOpen
+    public void onOpen(Session session, @PathParam("caseId") Integer caseId) {
+        try {
+            Long startTime = System.currentTimeMillis();
+            session.getUserProperties().put("caseId" , caseId);
+            sessionService.onOpen(session, caseId);
+            sessionService.sendSingleBySession(WsMessage.okResult(CommonEnum.ON_OPEN, ResultData.ok("连接建立成功")),session);
+            Long endTime = System.currentTimeMillis();
+            if(endTime -startTime > 100){
+                webSocketLogger.info("WebSocketServer|onOpenStart|" + "session = [" + session.getId() + "]" +",startTime = "+ startTime);
+                webSocketLogger.info("WebSocketServer|onOpenOver|" + "session = [" + session.getId() + "]" +",endTime = "+ endTime+", totalTime = "+(endTime-startTime));
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @OnClose
+    public void onClose(Session session) {
+        try {
+            sessionService.onClose(session);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @OnError
+    public void onError(Session session, Throwable error) {
+        if (error instanceof IOException) {
+            webSocketLogger.error("错误,断开链接{},{}", session, error.getMessage());
+        } else {
+            webSocketLogger.error("错误,断开链接{}", session, error);
+        }
+        try {
+            session.close();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 收到客户端消息后调用的方法
+     *
+     * @param msg 客户端发送过来的消息
+     */
+    @OnMessage
+    public void onMessage(String msg, Session session) {
+        try {
+            if(StringUtils.isEmpty(msg)){
+                return;
+            }
+            Long startTime = System.currentTimeMillis();
+            messageService.onMessage(msg, session);
+            Long endTime = System.currentTimeMillis();
+            if(endTime -startTime > 100){
+                webSocketLogger.info("WebSocketServer|onMessageStart|" + "request = "+ msg + "session = [" + session.getId() + "]"+ ",startTime = "+ startTime);
+                webSocketLogger.info("WebSocketServer|onMessageOver|" + "request = "+ msg +"session = [" + session.getId() + "]" +",endTime = "+ endTime+", totalTime = "+(endTime-startTime));
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+
+}

+ 128 - 0
src/main/java/com/fdkankan/fusion/websocket/SessionService.java

@@ -0,0 +1,128 @@
+package com.fdkankan.fusion.websocket;
+
+import com.alibaba.druid.util.Utils;
+import com.fdkankan.fusion.entity.TmUser;
+import com.fdkankan.fusion.service.ITmUserService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.websocket.Session;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.locks.ReentrantLock;
+
+@Component("sessionService")
+public class SessionService {
+    private static Logger webSocketLogger = LoggerFactory.getLogger("webSocketLogger");
+
+    public static ConcurrentHashMap<Session, Integer> sessionMap = new ConcurrentHashMap<>();
+
+
+
+
+    /**
+     * 用户注册和离开都需要这个锁
+     */
+    private final ReentrantLock lock = new ReentrantLock();
+
+
+    /**
+     * 用户链接上来
+     *
+     * @param session
+     */
+    public void onOpen(Session session, Integer caseId) {
+
+        try {
+            lock.lock();
+            sessionMap.put(session,caseId);
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            lock.unlock();
+        }
+
+    }
+
+
+    /**
+     * 关闭
+     *
+     * @param session
+     */
+    public void onClose(Session session) {
+        try {
+            lock.lock();
+            sessionMap.remove(session.getId());
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            lock.unlock();
+        }
+    }
+
+
+    /**
+     * 服务端向 全体客户端广播消息
+     *
+     * @param message
+     */
+    public synchronized void sendALL(String message) {
+        Set<Session> keySet = sessionMap.keySet();
+        if (keySet.isEmpty()) {
+            return;
+        }
+        sessionMap.forEach((session, caseId) -> {
+            if (null != session && session.isOpen()) {
+                sendMessage(message,session);
+            }
+        });
+    }
+
+
+    /**
+     * 服务端向 通过token向客服端发送消息
+     *
+     * @param message
+     */
+    public synchronized void sendSingleByCaseId(Integer caseId, String message) {
+        Set<Session> keySet = sessionMap.keySet();
+        if (keySet.isEmpty()) {
+            return;
+        }
+        if(!sessionMap.containsValue(caseId)){
+            return;
+        }
+        sessionMap.forEach((session, caseIdMap) -> {
+            if (null != session && session.isOpen() && caseIdMap.equals(caseId)) {
+                sendMessage(message,session);
+            }
+        });
+    }
+
+    public void sendSingleBySession(String msg, Session session) {
+        sendMessage(msg, session);
+    }
+
+    private synchronized  void sendMessage(String msg, Session session) {
+
+
+        if (null == session || !session.isOpen()) {
+            return;
+        }
+        synchronized (session) {
+            try {
+                session.getBasicRemote().sendText(msg);
+            } catch(Exception e){
+                webSocketLogger.error("---------------------------------------------------->"+e.getMessage()+"\n"+ Utils.toString(e.getStackTrace()));
+            }
+        }
+    }
+
+
+}

+ 25 - 0
src/main/java/com/fdkankan/fusion/websocket/WebSocketConfig.java

@@ -0,0 +1,25 @@
+package com.fdkankan.fusion.websocket;
+
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.socket.config.annotation.EnableWebSocket;
+import org.springframework.web.socket.server.standard.ServerEndpointExporter;
+
+/**
+ * SpringBoot + WebSocket 是用@ServerEndpoint注入,必须有此配置
+ *
+ */
+@Configuration
+public class WebSocketConfig {
+
+    @Bean
+    public ServerEndpointExporter serverEndpointExporter() {
+        return new ServerEndpointExporter();
+    }
+
+
+}
+

+ 85 - 0
src/main/java/com/fdkankan/fusion/websocket/WebSocketConfigurator.java

@@ -0,0 +1,85 @@
+package com.fdkankan.fusion.websocket;
+
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.context.annotation.Configuration;
+
+import javax.servlet.http.HttpSession;
+import javax.websocket.HandshakeResponse;
+import javax.websocket.server.HandshakeRequest;
+import javax.websocket.server.ServerEndpointConfig;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.Map;
+
+@Slf4j
+@Configuration
+public class WebSocketConfigurator extends ServerEndpointConfig.Configurator{
+    public static final String HTTP_SESSION_ID_ATTR_NAME = "HTTP.SESSION.ID";
+
+    @Override
+    public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response) {
+
+        Map<String, Object> attributes = sec.getUserProperties();
+        HttpSession session = (HttpSession) request.getHttpSession();
+        if (session != null) {
+            attributes.put(HTTP_SESSION_ID_ATTR_NAME, session.getId());
+            Enumeration<String> names = session.getAttributeNames();
+            while (names.hasMoreElements()) {
+                String name = names.nextElement();
+                attributes.put(name, session.getAttribute(name));
+            }
+
+        }
+
+
+        Map<String, List<String>> headerList =   request.getHeaders();
+        String ip = getIpAddr(headerList);
+        attributes.put("clientIp" , ip);
+
+    }
+
+
+    private String getIpAddr(Map<String, List<String>> headerList) {
+        String ip = null;
+        try {
+            ip = getHeader("x-forwarded-for" , headerList);
+            if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
+                ip = getHeader("Proxy-Client-IP" , headerList);
+            }
+            if (StringUtils.isEmpty(ip) || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+                ip = getHeader("WL-Proxy-Client-IP" , headerList);
+            }
+            if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
+                ip = getHeader("HTTP_CLIENT_IP" , headerList);
+            }
+            if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
+                ip = getHeader("HTTP_X_FORWARDED_FOR" , headerList);
+            }
+            if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
+                ip = headerList.get("host").get(0);
+            }
+        } catch (Exception e) {
+            log.error("MyWebListener|getIpAddr|" + e.getMessage(), e);
+        }
+        // 使用代理,则获取第一个IP地址
+        if (StringUtils.isNotBlank(ip) && ip.length() > 15) {
+            if (StringUtils.contains(ip, ",")) {
+                ip = StringUtils.substringBefore(ip, ",");
+            }
+        }
+        if (StringUtils.startsWith(ip, "0:0:0:0:0:0:0")) {
+            ip = "127.0.0.1";
+        }
+        return ip;
+    }
+
+    private String getHeader(String key , Map<String, List<String>> headerList){
+        List<String> l = headerList.get(key);
+        if(null == l){
+            return null;
+        }
+
+        return l.get(0);
+    }
+}

+ 7 - 0
src/main/java/com/fdkankan/fusion/websocket/enums/CommonEnum.java

@@ -0,0 +1,7 @@
+package com.fdkankan.fusion.websocket.enums;
+
+public class CommonEnum {
+    public final static String ON_OPEN = "open";
+    public final static String PING = "ping";
+    public final static String NOTICE = "notice";
+}

+ 40 - 0
src/main/java/com/fdkankan/fusion/websocket/service/MessageService.java

@@ -0,0 +1,40 @@
+package com.fdkankan.fusion.websocket.service;
+
+import com.alibaba.fastjson.JSON;
+import com.fdkankan.fusion.common.ResultData;
+import com.fdkankan.fusion.websocket.SessionService;
+import com.fdkankan.fusion.websocket.enums.CommonEnum;
+import com.fdkankan.fusion.websocket.vo.RequestMsg;
+import com.fdkankan.fusion.websocket.vo.WsMessage;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.websocket.Session;
+
+@Service
+public class MessageService {
+
+    @Autowired
+    private SessionService sessionService;
+
+    public void onMessage(String msg, Session session) {
+        if (StringUtils.isBlank(msg)) {
+            return;
+        }
+        RequestMsg requestMsg = JSON.parseObject(msg, RequestMsg.class);
+
+        switch (requestMsg.getCommand()) {
+            case CommonEnum.PING:
+                messageByPing(requestMsg, session); //ping
+                break;
+            default:
+                break;
+        }
+    }
+
+    private void messageByPing(RequestMsg requestMsg, Session session) {
+        String msg = WsMessage.okResult(CommonEnum.PING, ResultData.ok("ping"));
+        sessionService.sendSingleBySession(msg, session);
+    }
+}

+ 45 - 0
src/main/java/com/fdkankan/fusion/websocket/vo/RequestMsg.java

@@ -0,0 +1,45 @@
+package com.fdkankan.fusion.websocket.vo;
+
+import java.io.Serializable;
+import java.util.Map;
+
+/***
+ * 前端发来的信息结构对象
+ */
+public class RequestMsg implements Serializable {
+
+    private String command;
+    private int requestId;
+    private Map<String, Object> content;
+
+    public Object getMapValue(String key){
+        if(content != null){
+            return  content.get(key);
+        }
+        return null;
+    }
+
+    public String getCommand() {
+        return command;
+    }
+
+    public void setCommand(String command) {
+        this.command = command;
+    }
+
+    public Map<String, Object> getContent() {
+        return content;
+    }
+
+    public void setContent(Map<String, Object> content) {
+        this.content = content;
+    }
+
+    public int getRequestId() {
+        return requestId;
+    }
+
+    public void setRequestId(int requestId) {
+        this.requestId = requestId;
+    }
+}

+ 26 - 0
src/main/java/com/fdkankan/fusion/websocket/vo/WsMessage.java

@@ -0,0 +1,26 @@
+package com.fdkankan.fusion.websocket.vo;
+
+import com.alibaba.fastjson.JSONObject;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author tang
+ */
+public class WsMessage {
+
+
+    public static String okResult(String command, Object content) {
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("command", command);
+        jsonObject.put("content", content);
+        return jsonObject.toJSONString();
+    }
+
+
+
+
+
+
+}

+ 16 - 16
src/main/resources/application-local.yaml

@@ -1,21 +1,22 @@
 spring:
   datasource:
-    type: com.zaxxer.hikari.HikariDataSource          # 数据源类型:HikariCP
-    driver-class-name: com.mysql.jdbc.Driver          # mysql驱动
+    type: com.alibaba.druid.pool.DruidDataSource
     #120.25.146.52
-    url: jdbc:mysql://120.25.146.52:13306/fd_fusion?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true
-    #url: jdbc:mysql://127.0.0.1:13306/fd_fusion?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true
-    username: root
-    password: JK123456%JIK
-    hikari:
-      connection-timeout: 30000         # 等待连接池分配连接的最大时长(毫秒),超过这个时长还没可用的连接则发生SQLException, 默认:30秒
-      minimum-idle: 5                   # 最小连接数
-      maximum-pool-size: 20             # 最大连接数
-      auto-commit: true                 # 事务自动提交
-      idle-timeout: 600000              # 连接超时的最大时长(毫秒),超时则被释放(retired),默认:10分钟
-      pool-name: DateSourceHikariCP     # 连接池名字
-      max-lifetime: 1800000             # 连接的生命时长(毫秒),超时而且没被使用则被释放(retired),默认:30分钟 1800000ms
-      connection-test-query: SELECT 1   # 连接测试语句
+    dynamic:
+      primary: db1
+      strict: false
+      datasource:
+        db1:
+          driver-class-name: com.mysql.jdbc.Driver
+          url: jdbc:mysql://120.25.146.52:13306/fd_fusion?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true
+          username: root
+          password: JK123456%JIK
+        db2:
+          driver-class-name: com.mysql.jdbc.Driver
+          url: jdbc:mysql://120.24.144.164:3306/4dkankan_v4?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true
+          username: root
+          password: 4Dage@4Dage#@168
+
   redis:
     host: 120.24.144.164
     port: 6379
@@ -50,7 +51,6 @@ spring:
   overallService:
     #全景看看生产环境 host: https://www.4dkankan.com/qjkankan
     basePath: http://test.4dkankan.com/qjkankan
-    port: 80
   takeLookService:
     basePath: https://v4-test.4dkankan.com
     port: 80

+ 17 - 15
src/main/resources/application-test.yaml

@@ -1,21 +1,23 @@
 spring:
   datasource:
-    type: com.zaxxer.hikari.HikariDataSource          # 数据源类型:HikariCP
-    driver-class-name: com.mysql.jdbc.Driver          # mysql驱动
+    type: com.alibaba.druid.pool.DruidDataSource
     #120.25.146.52
-    #url: jdbc:mysql://120.25.146.52:13306/fd_fusion?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true
-    url: jdbc:mysql://127.0.0.1:13306/fd_fusion?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true
-    username: root
-    password: JK123456%JIK
-    hikari:
-      connection-timeout: 30000         # 等待连接池分配连接的最大时长(毫秒),超过这个时长还没可用的连接则发生SQLException, 默认:30秒
-      minimum-idle: 5                   # 最小连接数
-      maximum-pool-size: 20             # 最大连接数
-      auto-commit: true                 # 事务自动提交
-      idle-timeout: 600000              # 连接超时的最大时长(毫秒),超时则被释放(retired),默认:10分钟
-      pool-name: DateSourceHikariCP     # 连接池名字
-      max-lifetime: 1800000             # 连接的生命时长(毫秒),超时而且没被使用则被释放(retired),默认:30分钟 1800000ms
-      connection-test-query: SELECT 1   # 连接测试语句
+    dynamic:
+      primary: db1
+      strict: false
+      datasource:
+        db1:
+          driver-class-name: com.mysql.jdbc.Driver
+          #url: jdbc:mysql://120.25.146.52:13306/fd_fusion?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true
+          url: jdbc:mysql://127.0.0.1:13306/fd_fusion?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true
+          username: root
+          password: JK123456%JIK
+        db2:
+          driver-class-name: com.mysql.jdbc.Driver
+          url: jdbc:mysql://172.18.156.39:3306/4dkankan_v4?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true
+          username: root
+          password: 4Dage@4Dage#@168
+
   redis:
     host: 172.18.156.39
     port: 6379

+ 2 - 2
src/main/resources/application.yaml

@@ -43,8 +43,8 @@ upload:
 oss:
   #point: http://oss-cn-shenzhen-internal.aliyuncs.com
   point: http://oss-cn-shenzhen-internal.aliyuncs.com
-  key: LTAI5tSkKQbEmxxuTbPtHqK6
-  secrey: JI21tOnZbJuqt5NDRcQq2qvAUA4KTf
+  key: LTAI5tJwboCj3r4vUNkSmbyX
+  secrey: meDy7VYAWbg8kZCKsoUZcIYQxigWOy
   bucket: 4dkankan
   small: ?x-oss-process=image/resize,m_fill,h_%s,w_%s
 

+ 6 - 0
src/main/resources/mapper/fusion/CameraDetailMapper.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fdkankan.fusion.mapper.ICameraDetailMapper">
+
+
+</mapper>

+ 5 - 0
src/main/resources/mapper/fusion/CameraMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fdkankan.fusion.mapper.ICameraMapper">
+
+</mapper>

+ 5 - 0
src/main/resources/mapper/fusion/SceneDownLogMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fdkankan.fusion.mapper.ISceneDownLogMapper">
+
+</mapper>

+ 5 - 0
src/main/resources/mapper/fusion/SceneEditInfoMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fdkankan.fusion.mapper.ISceneEditInfoMapper">
+
+</mapper>

+ 5 - 0
src/main/resources/mapper/fusion/ScenePlusExtMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fdkankan.fusion.mapper.IScenePlusExtMapper">
+
+</mapper>

+ 36 - 0
src/main/resources/mapper/fusion/ScenePlusMapper.xml

@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fdkankan.fusion.mapper.IScenePlusMapper">
+
+
+    <select id="groupByCameraId" resultType="com.fdkankan.fusion.response.DataGroupVo">
+        select camera_id as groupKey ,count(1) as dataCount from t_scene_plus where rec_status = 'A'
+        and  camera_id in
+        <foreach item="cameraId" collection="cameraIds" open="(" separator="," close=")">
+         #{cameraId}
+        </foreach>
+        <if test="startTime !=null and startTime !='' ">
+            and create_time &gt;= #{startTime}
+        </if>
+        <if test="endTime !=null and endTime !='' ">
+            and create_time &lt;= #{endTime}
+        </if>
+        group by camera_id
+
+    </select>
+
+    <select id="groupByType" resultType="com.fdkankan.fusion.response.DataGroupVo">
+        select scene_source as groupKey ,count(1) as dataCount from t_scene_plus where rec_status = 'A'
+        and  camera_id in
+        <foreach item="cameraId" collection="cameraIds" open="(" separator="," close=")">
+            #{cameraId}
+        </foreach>
+        <if test="startTime !=null and startTime !='' ">
+            and create_time &gt;= #{startTime}
+        </if>
+        <if test="endTime !=null and endTime !='' ">
+            and create_time &lt;= #{endTime}
+        </if>
+        group by scene_source
+    </select>
+</mapper>

+ 0 - 0
src/main/resources/mapper/fusion/TmProjectMapper.xml


Някои файлове не бяха показани, защото твърде много файлове са промени