lyhzzz 1 year ago
parent
commit
caf6735006
59 changed files with 2474 additions and 44 deletions
  1. 13 0
      pom.xml
  2. 2 1
      src/main/java/com/fdkankan/fusion/common/ResultCode.java
  3. 21 0
      src/main/java/com/fdkankan/fusion/common/enums/DownloadStatusEnum.java
  4. 13 0
      src/main/java/com/fdkankan/fusion/common/util/CameraUtil.java
  5. 7 0
      src/main/java/com/fdkankan/fusion/common/util/DataUtil.java
  6. 52 1
      src/main/java/com/fdkankan/fusion/common/util/DateUtils.java
  7. 79 0
      src/main/java/com/fdkankan/fusion/controller/DataController.java
  8. 66 0
      src/main/java/com/fdkankan/fusion/controller/SceneDownLogController.java
  9. 2 0
      src/main/java/com/fdkankan/fusion/controller/TestController.java
  10. 84 0
      src/main/java/com/fdkankan/fusion/entity/Camera.java
  11. 168 0
      src/main/java/com/fdkankan/fusion/entity/CameraDetail.java
  12. 109 0
      src/main/java/com/fdkankan/fusion/entity/SceneDownLog.java
  13. 201 0
      src/main/java/com/fdkankan/fusion/entity/SceneEditInfo.java
  14. 120 0
      src/main/java/com/fdkankan/fusion/entity/ScenePlus.java
  15. 193 0
      src/main/java/com/fdkankan/fusion/entity/ScenePlusExt.java
  16. 5 3
      src/main/java/com/fdkankan/fusion/generate/AutoGenerate.java
  17. 68 0
      src/main/java/com/fdkankan/fusion/httpClient/LaserService.java
  18. 16 0
      src/main/java/com/fdkankan/fusion/httpClient/client/LaserClient.java
  19. 8 0
      src/main/java/com/fdkankan/fusion/httpClient/request/SSDownSceneParam.java
  20. 10 0
      src/main/java/com/fdkankan/fusion/httpClient/response/SSDownSceneVo.java
  21. 22 0
      src/main/java/com/fdkankan/fusion/mapper/ICameraDetailMapper.java
  22. 18 0
      src/main/java/com/fdkankan/fusion/mapper/ICameraMapper.java
  23. 18 0
      src/main/java/com/fdkankan/fusion/mapper/ISceneDownLogMapper.java
  24. 18 0
      src/main/java/com/fdkankan/fusion/mapper/ISceneEditInfoMapper.java
  25. 18 0
      src/main/java/com/fdkankan/fusion/mapper/IScenePlusExtMapper.java
  26. 27 0
      src/main/java/com/fdkankan/fusion/mapper/IScenePlusMapper.java
  27. 11 0
      src/main/java/com/fdkankan/fusion/mapper/ITmProjectMapper.java
  28. 29 0
      src/main/java/com/fdkankan/fusion/request/DataParam.java
  29. 17 0
      src/main/java/com/fdkankan/fusion/request/SceneDownLogParam.java
  30. 9 0
      src/main/java/com/fdkankan/fusion/response/DataGroupVo.java
  31. 9 0
      src/main/java/com/fdkankan/fusion/response/DownVo.java
  32. 10 0
      src/main/java/com/fdkankan/fusion/response/DownloadProcessVo.java
  33. 20 0
      src/main/java/com/fdkankan/fusion/service/ICameraDetailService.java
  34. 17 0
      src/main/java/com/fdkankan/fusion/service/ICameraService.java
  35. 17 0
      src/main/java/com/fdkankan/fusion/service/IDataService.java
  36. 14 0
      src/main/java/com/fdkankan/fusion/service/IDownService.java
  37. 20 0
      src/main/java/com/fdkankan/fusion/service/ISceneDownLogService.java
  38. 17 0
      src/main/java/com/fdkankan/fusion/service/ISceneEditInfoService.java
  39. 16 0
      src/main/java/com/fdkankan/fusion/service/IScenePlusExtService.java
  40. 25 0
      src/main/java/com/fdkankan/fusion/service/IScenePlusService.java
  41. 10 4
      src/main/java/com/fdkankan/fusion/service/ITmProjectService.java
  42. 26 0
      src/main/java/com/fdkankan/fusion/service/impl/CameraDetailServiceImpl.java
  43. 26 0
      src/main/java/com/fdkankan/fusion/service/impl/CameraServiceImpl.java
  44. 211 0
      src/main/java/com/fdkankan/fusion/service/impl/DataService.java
  45. 267 0
      src/main/java/com/fdkankan/fusion/service/impl/DownService.java
  46. 75 0
      src/main/java/com/fdkankan/fusion/service/impl/SceneDownLogServiceImpl.java
  47. 29 0
      src/main/java/com/fdkankan/fusion/service/impl/SceneEditInfoServiceImpl.java
  48. 22 0
      src/main/java/com/fdkankan/fusion/service/impl/ScenePlusExtServiceImpl.java
  49. 44 0
      src/main/java/com/fdkankan/fusion/service/impl/ScenePlusServiceImpl.java
  50. 22 4
      src/main/java/com/fdkankan/fusion/service/impl/TmProjectServiceImpl.java
  51. 16 16
      src/main/resources/application-local.yaml
  52. 17 15
      src/main/resources/application-test.yaml
  53. 6 0
      src/main/resources/mapper/fusion/CameraDetailMapper.xml
  54. 5 0
      src/main/resources/mapper/fusion/CameraMapper.xml
  55. 5 0
      src/main/resources/mapper/fusion/SceneDownLogMapper.xml
  56. 5 0
      src/main/resources/mapper/fusion/SceneEditInfoMapper.xml
  57. 5 0
      src/main/resources/mapper/fusion/ScenePlusExtMapper.xml
  58. 36 0
      src/main/resources/mapper/fusion/ScenePlusMapper.xml
  59. 58 0
      src/main/resources/mapper/fusion/TmProjectMapper.xml

+ 13 - 0
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>

+ 2 - 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,7 @@ public enum ResultCode {
     SCENE_DATA_SOURCE_EMPTY(7018,"场景资源文件为空,无法添加"),
     CASE_HAVE_SETTINGS(7019,"案件已有设置,无法新增"),
 
-    HOT_ICON_NOT_EXIST(7004,"热点icon不存在");
+    SS_SCENE_DOWN_ERROR(7020,"深时点云场景下载失败");
 
     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 = {"放火","电气火灾","产作业","用火不慎","吸烟","玩火","燃放烟花爆竹","自燃","雷击","静电","遗留火种","其他","不排除原因"};
+}

+ 52 - 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,51 @@ 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){
+        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())));
     }
 }

+ 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));
+    }
+
+}
+

+ 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;

+ 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;
+
+
+}

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

@@ -0,0 +1,109 @@
+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 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;
+
+    /**
+     * 组织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 Date createTime;
+
+    @TableField("update_time")
+    private Date updateTime;
+
+
+
+}

+ 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;
+
+
+}

+ 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目录)

+ 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) ;
 }

+ 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;
+}

+ 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);
 }

+ 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();
+        }
+        return startTime;
+    }
+
+    public String getEndTime() {
+        if(StringUtils.isBlank(endTime)){
+            return DateUtils.getMonthStr(new Date());
+        }
+        return endTime;
+    }
+}

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

@@ -0,0 +1,17 @@
+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;
+
+}

+ 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;         //下载连击
+}

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

@@ -0,0 +1,10 @@
+package com.fdkankan.fusion.response;
+
+import lombok.Data;
+
+@Data
+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);
+}

+ 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);
+}

+ 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);
+    }
+}

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

@@ -0,0 +1,211 @@
+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.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+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<>();
+        List<TmCamera> list = tmCameraService.getByDeptIds();
+        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 = 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.getChildren() != null && department.getChildren().size() >0){
+                    count += addCountByDept(department.getChildren(), deptIdMap, cameraIdMap);
+                }
+            }
+            DataGroupVo vo = new DataGroupVo();
+            vo.setDataCount(count);
+            vo.setGroupKey(department.getName());
+            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){
+                    return 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){
+                return 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){  //超管
+            deptList = department1.getChildren().get(0).getChildren();
+        }
+        if(department1.getParentId() != null && department1.getParentId().equals("0")){  //总队
+            deptList = department1.getChildren();
+        }
+        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.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();
+        List<Long> cameraIds = tmCameras.stream().map(TmCamera::getFdCameraId).collect(Collectors.toList());
+        List<DataGroupVo> groupVoList =  scenePlusService.groupByType(param,cameraIds);
+
+        HashMap<String,Long> countMap = new HashMap<>();
+        for (DataGroupVo dataGroupVo : groupVoList) {
+            String key = CameraUtil.getCameraNameByType(Integer.valueOf(dataGroupVo.getGroupKey()));
+            countMap.merge(key, dataGroupVo.getDataCount(), Long::sum);
+        }
+        return getListByMap(countMap);
+
+    }
+
+    @Override
+    public Object FireTrend(DataParam param) {
+        List<String> monthdateList = DateUtils.getMonthdateList(param.getStartTime(), param.getEndTime());
+        HashMap<String,Long> countMap = new HashMap<>();
+        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,tmDepartmentService.getDeptIds());
+        HashMap<String,Long> countMap = new HashMap<>();
+        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,tmDepartmentService.getDeptIds());
+        HashMap<String,Long> countMap = new HashMap<>();
+        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( HashMap<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;
+    }
+}

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

@@ -0,0 +1,267 @@
+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.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){
+            SceneEditInfo sceneEditInfo = sceneEditInfoService.getByScenePlusId(scenePlus.getId());
+            if(sceneEditInfo == null){
+                throw new BusinessException(ResultCode.SCENE_NOT_EXIST);
+            }
+            version = sceneEditInfo.getVersion();
+        }
+        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);
+        }
+
+        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.getLevel());
+        sceneDownloadLogEntity.setDeptId(deptId);
+        sceneDownloadLogEntity.setStatus(0);
+        sceneDownloadLogEntity.setVersion(sceneVersion);
+        sceneDownloadLogService.save(sceneDownloadLogEntity);
+    }
+
+    @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));
+        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;
+    }
+
+}

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

@@ -0,0 +1,75 @@
+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());
+        }
+        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);
+        return this.getOne(wrapper);
+    }
+}

+ 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);
+    }
+}

+ 22 - 4
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;
@@ -353,4 +351,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);
+    }
 }

+ 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://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

+ 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>

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

@@ -2,4 +2,62 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.fdkankan.fusion.mapper.ITmProjectMapper">
 
+    <select id="groupByDeptId" resultType="com.fdkankan.fusion.response.DataGroupVo">
+        select dept_id as groupKey ,count(1) as dataCount from tm_project where is_delete = 0
+        <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 dept_id
+    </select>
+    <select id="groupByMonth" resultType="com.fdkankan.fusion.response.DataGroupVo">
+        SELECT DATE_FORMAT(create_time,'%Y-%m') AS groupKey,count(1) AS dataCount FROM tm_project WHERE is_delete = 0
+        <if test="deptIds != null and deptIds.size >0">
+            and dept_id in
+            <foreach item="deptId" collection="deptIds" open="(" separator="," close=")">
+                #{deptId}
+            </foreach>
+        </if>
+        <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 groupKey
+    </select>
+    <select id="groupByPlace" resultType="com.fdkankan.fusion.response.DataGroupVo">
+        select project_site as groupKey ,count(1) as dataCount from tm_project where is_delete = 0
+        <if test="deptIds != null and deptIds.size >0">
+            and dept_id in
+            <foreach item="deptId" collection="deptIds" open="(" separator="," close=")">
+                #{deptId}
+            </foreach>
+        </if>
+        <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 project_site
+    </select>
+    <select id="groupByReason" resultType="com.fdkankan.fusion.response.DataGroupVo">
+        select fire_reason as groupKey ,count(1) as dataCount from tm_project where is_delete = 0
+        <if test="deptIds != null and deptIds.size >0">
+            and dept_id in
+            <foreach item="deptId" collection="deptIds" open="(" separator="," close=")">
+                #{deptId}
+            </foreach>
+        </if>
+        <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 fire_reason
+    </select>
 </mapper>