Browse Source

Merge remote-tracking branch 'origin/xj-1.0.0' into v1.8.0

# Conflicts:
#	pom.xml
#	src/main/java/com/fdkankan/fusion/common/FilePath.java
#	src/main/java/com/fdkankan/fusion/common/ResultCode.java
#	src/main/java/com/fdkankan/fusion/common/util/UploadToOssUtil.java
#	src/main/java/com/fdkankan/fusion/config/SaTokenConfigure.java
#	src/main/java/com/fdkankan/fusion/entity/TmProject.java
#	src/main/java/com/fdkankan/fusion/request/ModelPram.java
#	src/main/java/com/fdkankan/fusion/request/ScenePram.java
#	src/main/java/com/fdkankan/fusion/service/impl/CaseNumServiceImpl.java
#	src/main/java/com/fdkankan/fusion/service/impl/SceneService.java
#	src/main/java/com/fdkankan/fusion/service/impl/TmProjectServiceImpl.java
#	src/main/resources/application-prod.yaml
lyhzzz 10 months ago
parent
commit
eb616df242
100 changed files with 9293 additions and 160 deletions
  1. 32 17
      README.md
  2. 3958 0
      doc/4dkankan_v4-init.sql
  3. 1183 0
      doc/fd_fusion_xj-init.sql
  4. 25 3
      pom.xml
  5. 11 9
      src/main/java/com/fdkankan/fusion/common/FilePath.java
  6. 13 1
      src/main/java/com/fdkankan/fusion/common/ResultCode.java
  7. 1 0
      src/main/java/com/fdkankan/fusion/common/enums/RoleKeyEnum.java
  8. 49 0
      src/main/java/com/fdkankan/fusion/common/util/Base64Converter.java
  9. 7 0
      src/main/java/com/fdkankan/fusion/common/util/DateUtils.java
  10. 89 0
      src/main/java/com/fdkankan/fusion/common/util/FileMd5Util.java
  11. 1 1
      src/main/java/com/fdkankan/fusion/common/util/FileWriterUtil.java
  12. 125 0
      src/main/java/com/fdkankan/fusion/common/util/LocalToOssUtil.java
  13. 140 0
      src/main/java/com/fdkankan/fusion/common/util/MD5Checksum.java
  14. 250 0
      src/main/java/com/fdkankan/fusion/common/util/MinIoUploadService.java
  15. 30 11
      src/main/java/com/fdkankan/fusion/common/util/OBJToGLBUtil.java
  16. 2 2
      src/main/java/com/fdkankan/fusion/common/util/ShellCmd.java
  17. 23 2
      src/main/java/com/fdkankan/fusion/common/util/ShellUtil.java
  18. 167 7
      src/main/java/com/fdkankan/fusion/common/util/UploadToOssUtil.java
  19. 0 1
      src/main/java/com/fdkankan/fusion/common/util/VideoUtil.java
  20. 22 0
      src/main/java/com/fdkankan/fusion/config/MinIOConfig.java
  21. 2 2
      src/main/java/com/fdkankan/fusion/config/SaTokenConfigure.java
  22. 34 0
      src/main/java/com/fdkankan/fusion/config/SecurityUtil.java
  23. 104 0
      src/main/java/com/fdkankan/fusion/controller/CameraVersionAppController.java
  24. 104 0
      src/main/java/com/fdkankan/fusion/controller/CameraVersionController.java
  25. 14 11
      src/main/java/com/fdkankan/fusion/controller/CaseController.java
  26. 92 0
      src/main/java/com/fdkankan/fusion/controller/CaseExtractDetailController.java
  27. 1 1
      src/main/java/com/fdkankan/fusion/controller/CaseFilesController.java
  28. 121 0
      src/main/java/com/fdkankan/fusion/controller/CaseImgController.java
  29. 39 0
      src/main/java/com/fdkankan/fusion/controller/CaseImgTagController.java
  30. 87 0
      src/main/java/com/fdkankan/fusion/controller/CaseInquestController.java
  31. 59 0
      src/main/java/com/fdkankan/fusion/controller/CaseScriptController.java
  32. 61 0
      src/main/java/com/fdkankan/fusion/controller/CaseSettingsResourceController.java
  33. 4 0
      src/main/java/com/fdkankan/fusion/controller/CaseVideoController.java
  34. 42 0
      src/main/java/com/fdkankan/fusion/controller/DownOfflinePackageController.java
  35. 3 0
      src/main/java/com/fdkankan/fusion/controller/FusionGuidePathController.java
  36. 2 2
      src/main/java/com/fdkankan/fusion/controller/LoginController.java
  37. 72 0
      src/main/java/com/fdkankan/fusion/controller/ModelController.java
  38. 4 4
      src/main/java/com/fdkankan/fusion/controller/TmSceneController.java
  39. 24 3
      src/main/java/com/fdkankan/fusion/controller/NoLoginController.java
  40. 82 0
      src/main/java/com/fdkankan/fusion/controller/SceneController.java
  41. 2 2
      src/main/java/com/fdkankan/fusion/controller/SceneDownLogController.java
  42. 64 0
      src/main/java/com/fdkankan/fusion/controller/SystemSettingController.java
  43. 17 7
      src/main/java/com/fdkankan/fusion/controller/TestController.java
  44. 14 2
      src/main/java/com/fdkankan/fusion/controller/TmDepartmentController.java
  45. 6 1
      src/main/java/com/fdkankan/fusion/controller/TmRoleController.java
  46. 16 0
      src/main/java/com/fdkankan/fusion/controller/TmUserController.java
  47. 0 21
      src/main/java/com/fdkankan/fusion/controller/TmUserRoleController.java
  48. 466 0
      src/main/java/com/fdkankan/fusion/down/CaseDownService.java
  49. 102 0
      src/main/java/com/fdkankan/fusion/entity/CameraVersion.java
  50. 102 0
      src/main/java/com/fdkankan/fusion/entity/CameraVersionApp.java
  51. 81 0
      src/main/java/com/fdkankan/fusion/entity/CaseExtractDetail.java
  52. 75 0
      src/main/java/com/fdkankan/fusion/entity/CaseImg.java
  53. 59 0
      src/main/java/com/fdkankan/fusion/entity/CaseImgTag.java
  54. 153 0
      src/main/java/com/fdkankan/fusion/entity/CaseInquest.java
  55. 46 0
      src/main/java/com/fdkankan/fusion/entity/CaseOffline.java
  56. 54 0
      src/main/java/com/fdkankan/fusion/entity/CaseScript.java
  57. 24 0
      src/main/java/com/fdkankan/fusion/entity/CaseSettings.java
  58. 65 0
      src/main/java/com/fdkankan/fusion/entity/CaseSettingsResource.java
  59. 15 0
      src/main/java/com/fdkankan/fusion/entity/CaseTag.java
  60. 6 0
      src/main/java/com/fdkankan/fusion/entity/FusionGuide.java
  61. 7 0
      src/main/java/com/fdkankan/fusion/entity/Model.java
  62. 63 0
      src/main/java/com/fdkankan/fusion/entity/MqSendLog.java
  63. 51 0
      src/main/java/com/fdkankan/fusion/entity/SystemSetting.java
  64. 153 0
      src/main/java/com/fdkankan/fusion/entity/User.java
  65. 3 3
      src/main/java/com/fdkankan/fusion/generate/AutoGenerate.java
  66. 14 2
      src/main/java/com/fdkankan/fusion/httpClient/FdService.java
  67. 9 0
      src/main/java/com/fdkankan/fusion/httpClient/LaserService.java
  68. 0 20
      src/main/java/com/fdkankan/fusion/httpClient/address/NewFdkkAddressSource.java
  69. 0 20
      src/main/java/com/fdkankan/fusion/httpClient/address/OverallAddressSource.java
  70. 3 0
      src/main/java/com/fdkankan/fusion/httpClient/client/FdKKClient.java
  71. 5 4
      src/main/java/com/fdkankan/fusion/httpClient/client/LaserClient.java
  72. 3 1
      src/main/java/com/fdkankan/fusion/httpClient/request/FdkkCameraParam.java
  73. 1 0
      src/main/java/com/fdkankan/fusion/httpClient/request/FdkkLoginRequest.java
  74. 18 0
      src/main/java/com/fdkankan/fusion/mapper/ICameraVersionAppMapper.java
  75. 18 0
      src/main/java/com/fdkankan/fusion/mapper/ICameraVersionMapper.java
  76. 18 0
      src/main/java/com/fdkankan/fusion/mapper/ICaseExtractDetailMapper.java
  77. 18 0
      src/main/java/com/fdkankan/fusion/mapper/ICaseImgMapper.java
  78. 18 0
      src/main/java/com/fdkankan/fusion/mapper/ICaseImgTagMapper.java
  79. 18 0
      src/main/java/com/fdkankan/fusion/mapper/ICaseInquestMapper.java
  80. 18 0
      src/main/java/com/fdkankan/fusion/mapper/ICaseOfflineMapper.java
  81. 18 0
      src/main/java/com/fdkankan/fusion/mapper/ICaseScriptMapper.java
  82. 18 0
      src/main/java/com/fdkankan/fusion/mapper/ICaseSettingsResourceMapper.java
  83. 18 0
      src/main/java/com/fdkankan/fusion/mapper/IMqSendLogMapper.java
  84. 18 0
      src/main/java/com/fdkankan/fusion/mapper/ISystemSettingMapper.java
  85. 18 0
      src/main/java/com/fdkankan/fusion/mapper/IUserMapper.java
  86. 10 0
      src/main/java/com/fdkankan/fusion/request/CameraVersionParam.java
  87. 22 0
      src/main/java/com/fdkankan/fusion/request/CaseImgParam.java
  88. 1 0
      src/main/java/com/fdkankan/fusion/request/ModelPram.java
  89. 2 0
      src/main/java/com/fdkankan/fusion/request/ProjectRequestDto.java
  90. 2 0
      src/main/java/com/fdkankan/fusion/request/ScenePram.java
  91. 8 0
      src/main/java/com/fdkankan/fusion/response/BindCameraDto.java
  92. 9 0
      src/main/java/com/fdkankan/fusion/response/CameraVersionVo.java
  93. 118 0
      src/main/java/com/fdkankan/fusion/response/CaseInquestVo.java
  94. 29 0
      src/main/java/com/fdkankan/fusion/response/FileInfoVo.java
  95. 5 0
      src/main/java/com/fdkankan/fusion/response/UserAddRequest.java
  96. 39 0
      src/main/java/com/fdkankan/fusion/response/WitnessVo.java
  97. 28 0
      src/main/java/com/fdkankan/fusion/service/ICameraVersionAppService.java
  98. 24 0
      src/main/java/com/fdkankan/fusion/service/ICameraVersionService.java
  99. 22 0
      src/main/java/com/fdkankan/fusion/service/ICaseExtractDetailService.java
  100. 0 0
      src/main/java/com/fdkankan/fusion/service/ICaseImgService.java

+ 32 - 17
README.md

@@ -1,9 +1,24 @@
 ###**v1.0.0**
 ~~~~
 部署须知:
-服务器需提供 obj2gltf,unzip,unrar,ffmpeg命令支持
+服务器需提供 obj2gltf,unzip,unrar,ffmpeg,Obj2Tiles命令支持
+服务器需提供
+/home/ubuntu/bin/PotreeConverter.sh    算法切图,ply,las转3dtiles
+/opt/ossutil/fyun-upload.sh            上传文件
+/opt/ossutil/fyun-download.sh          下载文件
+/mnt/fusion/3dtile.sh                  第三方切图,osgb转3dtiles
+/mnt/fusion/offline/zip_offline.sh     离线包打包
+/mnt/fusion/offline/template           离线包前端资源
 
-提供/home/ubuntu/bin/PotreeConverter.sh 脚本
+/oss/4dkankan/fusion/default/tag_icon_default.svg  默认标注icon
+
+sql
+内置有创库语句,直接执行就好
+4dkankan_v4-init.sql
+fd_fusion_xj-init.sql
+
+测试接口:
+/fusion-ucenter/notAuth/getLoginAuthCode
 ~~~~
 
 ###**v1.1.0**
@@ -15,30 +30,15 @@
 ###**v1.2.0**
 ~~~~
 1.添加现场图和方位图:
-    t_case_files表 
-    添加字段: user_name,    创建人账号
-              nick_name,    创建人昵称
-              img_type,     0现场图,1方位图
-              content       现场图或方位图json
-    新增接口  /caseFiles/addOrUpdateImg      //添加或修改现场图或方位图
-    新增接口  /caseFiles/info                //根据fileId获取详情
-
 2.添加融合场景设置
-    t_case_settings 表
-    新增接口    /caseSettings/info              //设置列表
-                /caseSettings/saveOrUpdate      //新增或修改
 ~~~~
 
 ###**v1.4.0**
 ~~~~
 合并火调项目
 1.登录修改返回
-    http://120.25.146.52:3090/project/193/interface/api/6602
 2.新增根据场景码获取四维token
-    http://120.25.146.52:3090/project/193/interface/api/9800
 3.新增用户管理
-    http://120.25.146.52:3090/project/193/interface/api/9802
-4.
 ~~~~
 
 
@@ -49,4 +49,19 @@
 3.添加多数据源配置
 4.下载记录日志记录
 5.所属架构数据过滤
+~~~~
+
+
+###**xj-1.0.0**
+~~~~
+1.设置支持上传自定义图片
+2.案件设置地图链接,接口添加参数 mapUrl和latAndLong
+3.添加场景复制,模型复制,场景下载hash,模型下载hash
+4.添加系统设置管理
+5.添加勘验笔录管理
+6.照片制卷管理
+7.修改密码接口修改,去掉code参数,增加oldPassword参数
+8.新增接口,重置密码
+9.固件管理
+10.APP管理
 ~~~~

File diff suppressed because it is too large
+ 3958 - 0
doc/4dkankan_v4-init.sql


File diff suppressed because it is too large
+ 1183 - 0
doc/fd_fusion_xj-init.sql


+ 25 - 3
pom.xml

@@ -21,7 +21,7 @@
         <dependency>
             <groupId>com.fdkankan</groupId>
             <artifactId>4dkankan-utils-redis</artifactId>
-            <version>2.0.0-SNAPSHOT</version>
+            <version>3.0.0-SNAPSHOT</version>
         </dependency>
 
         <dependency>
@@ -107,7 +107,7 @@
         <dependency>
             <groupId>com.alibaba</groupId>
             <artifactId>easyexcel</artifactId>
-            <version>3.1.0</version>
+            <version>4.0.0</version>
         </dependency>
 
         <dependency>
@@ -120,7 +120,7 @@
         <dependency>
             <groupId>com.aliyun.oss</groupId>
             <artifactId>aliyun-sdk-oss</artifactId>
-            <version>2.8.3</version>
+            <version>3.6.0</version>
         </dependency>
 
 
@@ -149,6 +149,28 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-websocket</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.deepoove</groupId>
+            <artifactId>poi-tl</artifactId>
+            <version>1.12.2</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+            <version>5.2.5</version>
+        </dependency>
+
+        <dependency>
+            <groupId>io.minio</groupId>
+            <artifactId>minio</artifactId>
+            <version>8.5.7</version>
+        </dependency>
+        <dependency>
+            <groupId>com.squareup.okhttp3</groupId>
+            <artifactId>okhttp</artifactId>
+            <version>4.3.1</version>
+        </dependency>
+
     </dependencies>
 
     <build>

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

@@ -2,20 +2,22 @@ package com.fdkankan.fusion.common;
 
 public class FilePath {
 
-    public final static String LOCAL_BASE_PATH = "/home/tomcat/jar-fusion-8808/";
+    public final static String LOCAL_BASE_PATH = "/mnt/fusion/";
     public final static String MNT_BASE_PATH = "/mnt/fusion/";
-
     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";
     public final static String File_OSS_PATH = "fusion/%s/file/%s";
     public final static String ICON_OSS_PATH = "fusion/%s/icon/%s";
-    public final static String DEFAULT_OSS_PATH = "fusion/default/%s";
-
-   // public final static String VIDEO_LOCAL_PATH = "D:\\video\\merge";
-   public final static String VIDEO_LOCAL_PATH = LOCAL_BASE_PATH + "%s/video/merge";
-   public final static String OBJ_LOCAL_PATH = LOCAL_BASE_PATH + "%s/model/%s";
+    public final static String IMAGES_OSS_PATH = "fusion/%s/image/%s";
+     public final static String VIDEO_LOCAL_PATH = LOCAL_BASE_PATH + "%s/video/merge";
+     public final static String OBJ_LOCAL_PATH = LOCAL_BASE_PATH + "%s/model/%s";
 
+    public final static String FFMPEG_IMG_PATH  = "/mnt/fusion/ffmpeg_imgs";
 
+    public final static String OFFLINE_PACKAGE_PATH = "/mnt/fusion/offline/offline_";
+    public final static String OFFLINE_TEMPLATE_PATH = "/mnt/fusion/offline/template";
+    public final static String OFFLINE_RESOURCE_PACKAGE_PATH = OFFLINE_PACKAGE_PATH + "%s/www/package/resource/";
+    public final static String OFFLINE_OSS_PATH = OFFLINE_PACKAGE_PATH + "%s/www";
+    public final static String OFFLINE_LASER_OSS_PATH =  "/swss/%s/www/%s/";
+    public final static String LASER_OSS_PATH = "laser-prod/%s/data/%s/webcloud";
 }

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

@@ -66,13 +66,25 @@ public enum ResultCode {
     SS_SCENE_DOWN_ERROR(7020,"深时点云场景下载失败"),
     FILE_NOT_EXIST(7021,"文件不存在,或已被刪除"),
 
+    FILE_NOT_EXIST(7021,"文件不存在,或已被刪除"),
     HOST_ICON_LIMIT(7022,"案件图标超过上限"),
-
     CASE_REMOVE_SCENE(7023,"场景被移除"),
 
+    CAMERA_SPACE_ERROR(7022, "相机容量不足"),
+    INQUEST_ERROR(7023, "该案件已有勘验笔录"),
+    INQUEST_ERROR2(7024, "该案件未有勘验笔录"),
+    CAMERA_VERSION_EXIT(7025, "相机版本号已存在"),
+    CAMERA_VERSION_NOTEXIT(7026, "相机版本号不存在"),
+    CAMERA_VERSION_STATUS_ERROR(7027, "相机版本状态错误"),
+
+
     ;
 
 
+
+
+
+
     public int code;
     public String msg;
 

+ 1 - 0
src/main/java/com/fdkankan/fusion/common/enums/RoleKeyEnum.java

@@ -5,6 +5,7 @@ public enum RoleKeyEnum {
     ADMIN(2,"admin" , "平台运营管理员"),
     ADMIN_DEPT(3,"admin-dept" , "组织总管理员"),
     ADMIN_ORDINARY(4,"admin-ordinary" , "普通管理员"),
+    ADMIN_SYSTEM(5,"admin-system" , "系统管理员"),
     ;
 
     private Integer id;

+ 49 - 0
src/main/java/com/fdkankan/fusion/common/util/Base64Converter.java

@@ -0,0 +1,49 @@
+package com.fdkankan.fusion.common.util;
+
+import java.io.UnsupportedEncodingException;
+import java.util.Base64;
+
+public class Base64Converter {
+
+    public static final Base64.Encoder encoder = Base64.getEncoder();
+    static final Base64.Decoder decoder = Base64.getDecoder();
+
+    public Base64Converter() {
+    }
+
+    public static String encode(String text) {
+        byte[] textByte = new byte[0];
+
+        try {
+            textByte = text.getBytes("UTF-8");
+        } catch (UnsupportedEncodingException var3) {
+            var3.printStackTrace();
+        }
+
+        String encodedText = encoder.encodeToString(textByte);
+        return encodedText;
+    }
+
+    public static String encode(byte[] textByte) {
+        return encoder.encodeToString(textByte);
+    }
+
+    public static String decode(String encodedText) {
+        String text = null;
+
+        try {
+            text = new String(decoder.decode(encodedText), "UTF-8");
+        } catch (UnsupportedEncodingException var3) {
+            var3.printStackTrace();
+        }
+
+        return text;
+    }
+
+    public static String subText(String text) {
+        text = text.substring(8);
+        text = text.substring(0, text.length() - 8);
+        String result = text.substring(text.length() - 2) + text.substring(0, text.length() - 10);
+        return result;
+    }
+}

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

@@ -72,4 +72,11 @@ public class DateUtils {
        // System.out.println(getMonthdateList(getYearAgo(),getMonthStr(new Date())));
         System.out.println(getHoursTime(new Date()));
     }
+
+    public static String dateStr() {
+        SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");
+        String format = df.format(new Date());
+        long timeMillis = System.currentTimeMillis();
+        return format + "_" + timeMillis + "_";
+    }
 }

+ 89 - 0
src/main/java/com/fdkankan/fusion/common/util/FileMd5Util.java

@@ -0,0 +1,89 @@
+package com.fdkankan.fusion.common.util;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.security.MessageDigest;
+
+public class FileMd5Util {
+    public static final String KEY_MD5 = "MD5";
+    public static final String CHARSET_ISO88591 = "ISO-8859-1";
+
+    public FileMd5Util() {
+    }
+
+    public static String getFileMD5(File file) {
+        if (file.exists() && file.isFile()) {
+            MessageDigest digest = null;
+            FileInputStream in = null;
+            byte[] buffer = new byte[1024];
+
+            try {
+                digest = MessageDigest.getInstance("MD5");
+                in = new FileInputStream(file);
+
+                while(true) {
+                    int len;
+                    if ((len = in.read(buffer, 0, 1024)) == -1) {
+                        in.close();
+                        break;
+                    }
+
+                    digest.update(buffer, 0, len);
+                }
+            } catch (Exception var9) {
+                var9.printStackTrace();
+                return null;
+            }
+
+            byte[] by = digest.digest();
+            StringBuffer sbf = new StringBuffer();
+
+            for(int j = 0; j < by.length; ++j) {
+                int i = by[j];
+                if (i < 0) {
+                    i += 256;
+                } else if (i < 16) {
+                    sbf.append("0");
+                }
+
+                sbf.append(Integer.toHexString(i));
+            }
+
+            return sbf.toString();
+        } else {
+            return null;
+        }
+    }
+
+    public static String getFileMD5(String filepath) {
+        File file = new File(filepath);
+        return getFileMD5(file);
+    }
+
+    public static byte[] encryptMD5(byte[] data) throws Exception {
+        MessageDigest md5 = MessageDigest.getInstance("MD5");
+        md5.update(data);
+        return md5.digest();
+    }
+
+    public static byte[] encryptMD5(String data) throws Exception {
+        return encryptMD5(data.getBytes("ISO-8859-1"));
+    }
+
+    public static boolean isSameMd5(File file1, File file2) {
+        String md5_1 = getFileMD5(file1);
+        String md5_2 = getFileMD5(file2);
+        return md5_1.equals(md5_2);
+    }
+
+    public static boolean isSameMd5(String filepath1, String filepath2) {
+        File file1 = new File(filepath1);
+        File file2 = new File(filepath2);
+        return isSameMd5(file1, file2);
+    }
+
+    public static void main(String[] args) {
+        System.out.println("obj1: " + getFileMD5(new File("F:\\桌面\\c11m-T11-EA\\log\\i6VhiQ2Q-copy.obj")));
+        System.out.println("obj: " + getFileMD5(new File("F:\\桌面\\c11m-T11-EA\\log\\i6VhiQ2Q.obj")));
+    }
+}

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

@@ -71,7 +71,7 @@ public class FileWriterUtil {
         for (File file1 : files) {
             if(file1.isFile()){
                 if(file1.getName().endsWith(".obj") || file1.getName().endsWith(".las") || file1.getName().endsWith(".ply")
-                || file1.getName().endsWith(".osgb") || file1.getName().endsWith(".b3dm")){
+                || file1.getName().endsWith(".osgb") || file1.getName().endsWith(".b3dm") || file1.getName().endsWith(".laz")){
                     fileList.add(file1);
                 }
             }else {

+ 125 - 0
src/main/java/com/fdkankan/fusion/common/util/LocalToOssUtil.java

@@ -0,0 +1,125 @@
+package com.fdkankan.fusion.common.util;
+
+import cn.hutool.core.io.FileUtil;
+import com.fdkankan.fusion.response.FileInfoVo;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.io.FileUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import java.io.File;
+import java.nio.charset.Charset;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Component
+@Slf4j
+public class LocalToOssUtil {
+
+    @Value("${oss.bucket:4dkankan}")
+    private String bucket;
+
+    @Value("${oss.basePath:/oss/}")
+    private String basePath;
+
+    private String getOssPath(String bucket, String filePath) {
+        return basePath.concat(bucket).concat(File.separator).concat(filePath);
+
+    }
+
+    public boolean existKey(String objectName) {
+        return FileUtil.exist(getOssPath(bucket, objectName));
+    }
+
+
+    public boolean downFormAli(String objectName, String localPath) {
+        try {
+            FileUtil.copy(getOssPath(bucket, objectName), localPath, true);
+        }catch (Exception e){
+            log.info("下载文件失败,remoteFilePath:{},localPath:{}", objectName, localPath);
+            log.info("下载文件失败", e);
+            return false;
+        }
+        return true;
+    }
+
+    public String uploadFile(String bucket, String filePath, String remoteFilePath, Map<String, String> headers) {
+        try {
+            if (!new File(filePath).exists()) {
+                log.warn("文件不存在:{}", filePath);
+                return null;
+            }
+            FileUtil.copy(filePath, getOssPath(bucket, remoteFilePath), true);
+            //FileUtils.contentEqualsIgnoreEOL(new File(filePath),new File(getOssPath(bucket, remoteFilePath)), "UTF-8");
+        }catch (Exception e){
+            log.error("上传文件失败,filePath:{},remoteFilePath:{}", filePath, remoteFilePath);
+            log.error("上传文件失败", e);
+        }
+
+        return null;
+    }
+    public void uploadOss(String filePath, String key1) {
+        uploadFile(bucket, filePath, key1, null);
+    }
+
+    public void delete(String objectName) {
+        FileUtil.del(getOssPath(bucket, objectName));
+
+    }
+
+    public void uploadFileOss(File file) {
+        if(file.isFile()){
+            String ossPath = file.getPath();
+            ossPath = ossPath.replace("/mnt/","");
+            ossPath =  ossPath.replace("\\","/");
+            this.uploadOss(file.getPath(),ossPath);
+        }else {
+            File[] files = file.listFiles();
+            for (File file1 : files) {
+                uploadFileOss(file1);
+            }
+        }
+
+    }
+
+    public List<String> listKeysFromAli(String sourcePath) {
+        return FileUtil.loopFiles(getOssPath(bucket, sourcePath)).stream()
+                .map(f -> f.getAbsolutePath().replace(basePath.concat(bucket).concat(File.separator), ""))
+                .collect(Collectors.toList());
+    }
+
+    public void copyFile(String sourcePath, String targetPath) {
+        try {
+            FileUtil.copyContent(new File(getOssPath(bucket, sourcePath)), new File(getOssPath(bucket, targetPath)), true);
+        }catch (Exception e){
+            log.error("复制文件失败,sourcePath:{},targetPath:{}",sourcePath,targetPath);
+            log.error("复制文件失败", e);
+        }
+    }
+
+    public FileInfoVo getFileInfo(String filePath) {
+        return MD5Checksum.getFileInfo(getOssPath(bucket, filePath));
+    }
+
+    public Long getSizeCount(String filePath) {
+        log.info("getSize:{}",filePath);
+        File file = new File(filePath);
+        if(file.isFile()){
+            return file.length();
+        }
+        File[] files = file.listFiles();
+        if(files == null){
+            return 0L;
+        }
+        Long size = 0L;
+        for (File file1 : files) {
+            size+= getSizeCount(file1.getPath());
+        }
+        return size;
+    }
+
+    public Long getSize(String filePath) {
+        return getSizeCount( getOssPath(bucket, filePath));
+    }
+}

+ 140 - 0
src/main/java/com/fdkankan/fusion/common/util/MD5Checksum.java

@@ -0,0 +1,140 @@
+package com.fdkankan.fusion.common.util;
+
+import cn.hutool.core.io.FileUtil;
+import com.aliyun.oss.OSSClient;
+import com.aliyun.oss.model.GetObjectRequest;
+import com.fdkankan.fusion.response.FileInfoVo;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.security.MessageDigest;
+import java.util.Date;
+
+public class MD5Checksum {
+    public static byte[] createChecksum(String filePath,String sign)  {
+        try {
+            InputStream fis = new FileInputStream(filePath);
+            byte[] buffer = new byte[1024];
+            MessageDigest complete = MessageDigest.getInstance(sign);
+            int numRead;
+
+            do {
+                numRead = fis.read(buffer);
+                if (numRead > 0) {
+                    complete.update(buffer, 0, numRead);
+                }
+            } while (numRead != -1);
+
+            fis.close();
+            return complete.digest();
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+
+        return null;
+    }
+
+    public static byte[] createChecksum(InputStream fis,String sign)  {
+        try {
+            byte[] buffer = new byte[1024];
+            MessageDigest complete = MessageDigest.getInstance(sign);
+            int numRead;
+
+            do {
+                numRead = fis.read(buffer);
+                if (numRead > 0) {
+                    complete.update(buffer, 0, numRead);
+                }
+            } while (numRead != -1);
+
+            return complete.digest();
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+
+        return null;
+    }
+
+    public static String getMD5(String filePath)  {
+        byte[] b = createChecksum(filePath,"MD5");
+        if(b == null){
+            return null;
+        }
+        StringBuilder result = new StringBuilder();
+
+        for (byte element : b) {
+            result.append(Integer.toString((element & 0xff) + 0x100, 16).substring(1));
+        }
+
+        return result.toString();
+    }
+
+    public static String getMD5(InputStream filePath)  {
+        byte[] b = createChecksum(filePath,"MD5");
+        if(b == null){
+            return null;
+        }
+        StringBuilder result = new StringBuilder();
+
+        for (byte element : b) {
+            result.append(Integer.toString((element & 0xff) + 0x100, 16).substring(1));
+        }
+
+        return result.toString();
+    }
+
+    public static String getSHA1(String filePath)  {
+        byte[] b = createChecksum(filePath,"SHA1");
+        StringBuilder result = new StringBuilder();
+        if(b == null){
+            return null;
+        }
+        for (byte element : b) {
+            result.append(Integer.toString((element & 0xff) + 0x100, 16).substring(1));
+        }
+
+        return result.toString();
+    }
+    public static String getSHA1(InputStream filePath)  {
+        byte[] b = createChecksum(filePath,"SHA1");
+        StringBuilder result = new StringBuilder();
+        if(b == null){
+            return null;
+        }
+        for (byte element : b) {
+            result.append(Integer.toString((element & 0xff) + 0x100, 16).substring(1));
+        }
+
+        return result.toString();
+    }
+
+    public static Long getLastModifiedTime(String filePath)  {
+        File file = new File(filePath);
+        return file.lastModified();
+    }
+    public static Long getSize(String filePath)  {
+        File file = new File(filePath);
+        return file.length();
+    }
+
+
+    public static FileInfoVo getFileInfo(String filePath){
+        try {
+            return new FileInfoVo(
+                    getMD5(filePath).toUpperCase(),
+                    getSHA1(filePath).toUpperCase(),
+                    getLastModifiedTime(filePath),
+                    getSize(filePath));
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    public static void main(String[] args) {
+        FileInfoVo fileInfo = getFileInfo("D:\\abc\\1.txt");
+        FileUtil.writeString(fileInfo.toString(),new File("D:\\abc\\hash.txt"),"UTF-8");
+        System.out.println();
+    }
+}

+ 250 - 0
src/main/java/com/fdkankan/fusion/common/util/MinIoUploadService.java

@@ -0,0 +1,250 @@
+package com.fdkankan.fusion.common.util;
+
+import com.aliyun.oss.OSSClient;
+import com.aliyun.oss.model.GetObjectRequest;
+import com.fdkankan.fusion.config.MinIOConfig;
+import com.fdkankan.fusion.response.FileInfoVo;
+import io.minio.*;
+import io.minio.messages.Item;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.util.ObjectUtils;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.Resource;
+import java.io.InputStream;
+import java.time.ZonedDateTime;
+import java.util.Date;
+import java.util.List;
+
+@Slf4j
+@Service
+public class MinIoUploadService {
+    @Resource
+    private MinIOConfig minIOConfig;
+
+    private MinioClient minioClient;
+
+    private String endpoint;
+    private String bucketName;
+    private String accessKey;
+    private String secretKey;
+    private Integer imgSize;
+    private Integer fileSize;
+
+
+    private final String SEPARATOR = "/";
+
+    @PostConstruct
+    public void init() {
+        this.endpoint = minIOConfig.getEndpoint();
+        this.bucketName = minIOConfig.getBucketName();
+        this.accessKey = minIOConfig.getAccessKey();
+        this.secretKey = minIOConfig.getSecretKey();
+        createMinioClient();
+    }
+
+    /**
+     * 创建基于Java端的MinioClient
+     */
+    public void createMinioClient() {
+        try {
+            if (null == minioClient) {
+                log.info("开始创建 MinioClient...");
+                minioClient = MinioClient
+                        .builder()
+                        .endpoint(endpoint)
+                        .credentials(accessKey, secretKey)
+                        .build();
+                createBucket(bucketName);
+                log.info("创建完毕 MinioClient...");
+            }
+        } catch (Exception e) {
+            log.error("MinIO服务器异常:{}", e);
+        }
+    }
+
+    /**
+     * 启动SpringBoot容器的时候初始化Bucket
+     * 如果没有Bucket则创建
+     *
+     * @throws Exception
+     */
+    private void createBucket(String bucketName) throws Exception {
+        if (!bucketExists(bucketName)) {
+            minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
+        }
+    }
+
+    /**
+     * 判断Bucket是否存在,true:存在,false:不存在
+     *
+     * @return
+     * @throws Exception
+     */
+    public boolean bucketExists(String bucketName) throws Exception {
+        return minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
+    }
+
+    /**
+     * 获得Bucket的策略
+     *
+     * @param bucketName
+     * @return
+     * @throws Exception
+     */
+    public String getBucketPolicy(String bucketName) throws Exception {
+        String bucketPolicy = minioClient
+                .getBucketPolicy(
+                        GetBucketPolicyArgs
+                                .builder()
+                                .bucket(bucketName)
+                                .build()
+                );
+        return bucketPolicy;
+    }
+
+    /**
+     * 判断文件是否存在
+     *
+     * @param bucketName 存储桶
+     * @param objectName 文件名
+     * @return
+     */
+    public boolean isObjectExist(String bucketName, String objectName) {
+        boolean exist = true;
+        try {
+            minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(objectName).build());
+        } catch (Exception e) {
+            exist = false;
+        }
+        return exist;
+    }
+
+    public boolean isObjectExist(String objectName) {
+        return isObjectExist(bucketName,objectName);
+    }
+
+
+    /**
+     * 判断文件夹是否存在
+     *
+     * @param bucketName 存储桶
+     * @param objectName 文件夹名称
+     * @return
+     */
+    public boolean isFolderExist(String bucketName, String objectName) {
+        boolean exist = false;
+        try {
+            Iterable<Result<Item>> results = minioClient.listObjects(
+                    ListObjectsArgs.builder().bucket(bucketName).prefix(objectName).recursive(false).build());
+            for (Result<Item> result : results) {
+                Item item = result.get();
+                if (item.isDir() && objectName.equals(item.objectName())) {
+                    exist = true;
+                }
+            }
+        } catch (Exception e) {
+            exist = false;
+        }
+        return exist;
+    }
+
+    public boolean isFolderExist( String objectName) {
+        return isFolderExist(bucketName,objectName);
+    }
+
+    /**
+     * 获取路径下文件列表
+     *
+     * @param bucketName 存储桶
+     * @param prefix     文件名称
+     * @param recursive  是否递归查找,false:模拟文件夹结构查找
+     * @return 二进制流
+     */
+    public Iterable<Result<Item>> listObjects(String bucketName, String prefix,
+                                              boolean recursive) {
+        return minioClient.listObjects(
+                ListObjectsArgs.builder()
+                        .bucket(bucketName)
+                        .prefix(prefix)
+                        .recursive(recursive)
+                        .build());
+    }
+
+    /**
+     * 获取文件流
+     *
+     * @param bucketName 存储桶
+     * @param objectName 文件名
+     * @return 二进制流
+     */
+    public InputStream getObject(String bucketName, String objectName) throws Exception {
+        return minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(objectName).build());
+    }
+
+    public InputStream getObject( String objectName)  {
+        try {
+            return minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(objectName).build());
+        }catch (Exception e){
+            log.info("minio获取文件失败:{}",objectName,e);
+        }
+        return null;
+    }
+
+
+
+    /**
+     * 获取文件信息, 如果抛出异常则说明文件不存在
+     *
+     * @param bucketName 存储桶
+     * @param objectName 文件名称
+     */
+    public FileInfoVo getFileStatusInfo(String bucketName, String objectName) throws Exception {
+
+        StatObjectResponse statObjectResponse = minioClient.statObject(
+                StatObjectArgs.builder()
+                        .bucket(bucketName)
+                        .object(objectName)
+                        .build());
+        String md5 = statObjectResponse.etag().toUpperCase();
+        ZonedDateTime zonedDateTime = statObjectResponse.lastModified();
+        Date LastMo = Date.from(zonedDateTime.toInstant());
+        Long size = statObjectResponse.size();
+
+        InputStream inputStream = getObject(bucketName, objectName);
+        String sha1 = MD5Checksum.getSHA1(inputStream);
+        return new FileInfoVo(md5,sha1.toUpperCase(),LastMo.getTime(),size);
+
+    }
+    public FileInfoVo getFileStatusInfo( String objectName)  {
+        try {
+            return getFileStatusInfo(bucketName,objectName);
+        }catch (Exception e){
+            log.info("获取文件失败或文件不存在:{},{}",bucketName,objectName,e);
+        }
+         return null;
+    }
+
+
+    public Long getSize(String filePath){
+        Long total = 0L;
+        try {
+            Iterable<Result<Item>> results = listObjects(bucketName, filePath, true);
+            if (ObjectUtils.isEmpty(results)) {
+                return 0L;
+            }
+            for (Result<Item> result : results) {
+                Item item = result.get();
+                long size = item.size();
+                total += size;
+            }
+
+        }catch (Exception e){
+            log.info("oss-getFileInfo-error:{}",e);
+        }
+        return total;
+    }
+
+
+}

+ 30 - 11
src/main/java/com/fdkankan/fusion/common/util/OBJToGLBUtil.java

@@ -35,6 +35,29 @@ public class OBJToGLBUtil {
         log.info("obj转换glb完毕:" + command);
     }
 
+    public static String objToB3dm(String objPath, String glbPath)  {
+        Integer lodNum = getLodNum(objPath);
+        log.info("obj转换b3dm开始,{}",objPath);
+        log.info("obj转换b3dm开始");
+        //String command = "Obj2Tiles --lods "+lodNum+" --divisions 3 " + objPath + " " + glbPath;
+        String command = "Obj2Tiles " + objPath + " " + glbPath;
+        log.info("执行obj转换glb命令路径-{}", command);
+        ShellUtil.execCmd(command);
+        log.info("obj转换b3dm完毕:" + command);
+        return glbPath;
+    }
+
+    private static Integer getLodNum(String objPath) {
+
+//        long length = new File(objPath).length();
+//        long mb = length / 1024 /1024;
+//        if(mb >100){
+//            return  (mb /10) >10 ?10:Integer.parseInt(String.valueOf(mb /10));
+//        }
+
+        return 3;
+    }
+
     public static boolean checkObj(String objPath) {
         File file = new File(objPath);
         File file1 = file.getParentFile();
@@ -120,22 +143,18 @@ public class OBJToGLBUtil {
     }
 
     public static File lasOrPlyToBin(File srcFile) throws IOException {
-        String mntPath = srcFile.getPath().replace(FilePath.LOCAL_BASE_PATH,FilePath.MNT_BASE_PATH);
-        String mntPathEmt = srcFile.getParent().replace(FilePath.LOCAL_BASE_PATH,FilePath.MNT_BASE_PATH)+"/res";
-        File file = new File(mntPathEmt);
-        if(!file.exists()){
-            file.mkdirs();
+        if(!srcFile.exists()){
+            srcFile.mkdirs();
         }
-        FileUtil.copy(srcFile.getPath(),mntPath,true);
         String cmd = ShellUtil.LAS_TO_BIN;
-        cmd =  cmd.replace("@inPath",mntPath);
-        cmd = cmd.replace("@outPath",mntPathEmt);
+        cmd =  cmd.replace("@inPath",srcFile.getPath());
+        cmd = cmd.replace("@outPath",srcFile.getParentFile().getPath());
         ShellUtil.execCmd(cmd);
         log.info("lasOrPlyToBin---------cmd-over");
-        String cloudJs = mntPathEmt +"/webcloud/"+ "cloud.js";
+        String cloudJs = srcFile.getParentFile().getPath() +"/webcloud/"+ "cloud.js";
         JSONObject jsonObject = ShellUtil.fixCloud(cloudJs);
-        FileWriterUtil.writerJson(mntPathEmt +"/webcloud/","cloud.js",jsonObject.toJSONString());
-        return file;
+        FileWriterUtil.writerJson(srcFile.getParentFile().getPath() +"/webcloud/","cloud.js",jsonObject.toJSONString());
+        return srcFile.getParentFile();
     }
 
     public static String OsgbToB3dm(File objPathFile) {

+ 2 - 2
src/main/java/com/fdkankan/fusion/common/util/ShellCmd.java

@@ -7,8 +7,8 @@ public class ShellCmd {
 	 * opType: file or folder
 	 * fyunType : oss ,aws
 	 */
-	public static final String FYUN_UPLOAD = "sudo bash /opt/ossutil/fyun-upload.sh %s %s /%s %s %s";
-	public static final String FYUN_DOWN = "sudo bash /opt/ossutil/fyun-download.sh %s /%s %s %s %s";
+	public static final String FYUN_UPLOAD = "bash /opt/ossutil/fyun-upload.sh %s %s /%s %s %s";
+	public static final String FYUN_DOWN = "bash /opt/ossutil/fyun-download.sh %s /%s %s %s %s";
 
 	public static final String osgbTob3dmCmd = "sudo docker run --rm -v /mnt/fusion:/mnt/fusion 3dtile:v2 /mnt/fusion/3dtile.sh -f osgb -i " +
 			"@inputFile -o @outputFile";

+ 23 - 2
src/main/java/com/fdkankan/fusion/common/util/ShellUtil.java

@@ -116,6 +116,21 @@ public class ShellUtil {
         log.info("解压zip完毕:" + command);
     }
 
+    public static void zip(String zipPath, String dataPath) {
+        log.info("打包zip开始");
+        String command = "zip -r -m " + zipPath + "  " ;
+        execCmd(command);
+        log.info("打包zip完毕:" + command);
+    }
+
+    public static String zipCommand = "bash /mnt/fusion/offline/zip_offline.sh %s %s";
+    public static void zipOffline(String zipPath, String dataPath) {
+        log.info("打包zip开始");
+        String command = String.format(zipCommand,zipPath,dataPath);
+        execCmd(command);
+        log.info("打包zip完毕:" + command);
+    }
+
     public static void unRar(String rarPath, String dataPath) {
         log.info("解压rar开始");
         String command = "unrar e " + rarPath + " " + dataPath;
@@ -163,12 +178,18 @@ public class ShellUtil {
      */
     public static void yunUpload(String srcPath,String destPath){
         String opType = srcPath.contains(".")? "file":"folder" ;
-        String cmd = String.format(ShellCmd.FYUN_UPLOAD, "4dkankan",srcPath,destPath,"oss",opType);
+        String cmd = String.format(ShellCmd.FYUN_UPLOAD, "4dkankan",srcPath,destPath,"local",opType);
         execCmd(cmd);
     }
     public static void yunDownload(String srcPath,String destPath){
         String opType = srcPath.contains(".")? "file":"folder" ;
-        String cmd = String.format(ShellCmd.FYUN_DOWN,"4dkankan",srcPath,destPath,"oss",opType);
+        String cmd = String.format(ShellCmd.FYUN_DOWN,"4dkankan",srcPath,destPath,"local",opType);
+        execCmd(cmd);
+    }
+
+    public static void yunDownloadSs(String srcPath,String destPath){
+        String opType = srcPath.contains(".")? "file":"folder" ;
+        String cmd = String.format(ShellCmd.FYUN_DOWN,"laser-data",srcPath,destPath,"minio",opType);
         execCmd(cmd);
     }
 }

+ 167 - 7
src/main/java/com/fdkankan/fusion/common/util/UploadToOssUtil.java

@@ -3,10 +3,13 @@ package com.fdkankan.fusion.common.util;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.io.FileUtil;
 import com.aliyun.oss.OSSClient;
+import com.aliyun.oss.common.utils.BinaryUtil;
 import com.aliyun.oss.model.*;
+import com.fdkankan.fusion.response.FileInfoVo;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
 import org.springframework.util.ObjectUtils;
@@ -15,10 +18,7 @@ import org.springframework.web.multipart.commons.CommonsMultipartFile;
 
 import java.io.*;
 import java.net.*;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 @Slf4j
@@ -26,19 +26,26 @@ import java.util.stream.Collectors;
 public class UploadToOssUtil {
 
 
-	@Value("${oss.point:http://oss-cn-shenzhen-internal.aliyuncs.com}")
+	@Value("${oss.point}")
 	private String point;
 
-	@Value("${oss.key:LTAIUrvuHqj8pvry}")
+	@Value("${oss.key}")
 	private String key;
 
-	@Value("${oss.secrey:JLOVl0k8Ke0aaM8nLMMiUAZ3EiiqI4}")
+	@Value("${oss.secrey}")
 	private String secrey;
 
 	@Value("${oss.bucket:4dkankan}")
 	private String bucket;
 
+	@Value("${upload.type:oss}")
+	private String type;
 
+	@Value("${upload.query-path}")
+	private String queryPath;
+
+	@Autowired
+	LocalToOssUtil localToOssUtil;
 
 
 	/**
@@ -48,6 +55,9 @@ public class UploadToOssUtil {
 	 */
 	public boolean existKey(String objectName){
 		//创建oss客户端
+		if("local".equals(type)){
+			return localToOssUtil.existKey(objectName);
+		}
 		OSSClient ossClient = new OSSClient(point, key, secrey);
 		// ossObject包含文件所在的存储空间名称、文件名称、文件元信息以及一个输入流。
 		try{
@@ -70,6 +80,9 @@ public class UploadToOssUtil {
 	 * @return
 	 */
 	public boolean downFormAli(String objectName, String localPath){
+		if("local".equals(type)){
+			return localToOssUtil.downFormAli(objectName,localPath);
+		}
 		OSSClient ossClient = new OSSClient(point, key, secrey);
 		try {
 			com.aliyun.oss.model.GetObjectRequest request  = new com.aliyun.oss.model.GetObjectRequest(bucket,objectName);
@@ -92,6 +105,10 @@ public class UploadToOssUtil {
 
 
 	public  void uploadOss(String filePath, String key1){
+		if("local".equals(type)){
+			localToOssUtil.uploadOss(filePath,key1);
+			return ;
+		}
 		OSSClient ossClient = new OSSClient(point, key, secrey);
 		try {
 			log.info("upload-to-oss:file-path:{},oss-path:{}",filePath,key1);
@@ -109,6 +126,10 @@ public class UploadToOssUtil {
 		}
 	}
 	public void delete(String objectName){
+		if("local".equals(type)){
+			localToOssUtil.delete(objectName);
+			return ;
+		}
 		OSSClient ossClient = new OSSClient(point, key, secrey);
 		try {
 			ossClient.deleteObject(bucket, objectName);
@@ -126,6 +147,9 @@ public class UploadToOssUtil {
 	 * @return
 	 */
 	public List<String> listKeysFromAli(String sourcePath) {
+		if("local".equals(type)){
+			return localToOssUtil.listKeysFromAli(sourcePath);
+		}
 		List<String> keyList = new ArrayList<>();
 		OSSClient ossClient = new OSSClient(point, key, secrey);
 		try {
@@ -202,6 +226,10 @@ public class UploadToOssUtil {
 	}
 
 	public  void uploadFileOss(File file) {
+		if("local".equals(type)){
+			localToOssUtil.uploadFileOss(file);
+			return ;
+		}
 		if(file.isFile()){
 			String ossPath = file.getPath();
 			ossPath = ossPath.replace("/mnt/","");
@@ -237,4 +265,136 @@ public class UploadToOssUtil {
 		}
 		return total;
 	}
+
+	public void copyFile( String sourcePath, String targetPath) {
+		if("local".equals(type)){
+			 localToOssUtil.copyFile(sourcePath,targetPath);
+			return;
+		}
+
+		OSSClient ossClient = new OSSClient(point, key, secrey);
+
+		try {
+			List<String> files = listKeysFromAli( sourcePath);
+			if (ObjectUtils.isEmpty(files)) {
+				return;
+			}
+			files.stream().forEach(file -> {
+				log.info("oss-copy-file---sourcePath:{},targetPath:{}",sourcePath,targetPath);
+				ossClient.copyObject(this.bucket, file, this.bucket, file.replace(sourcePath, targetPath));
+			});
+		} catch (Exception e) {
+			log.error("列举文件目录失败,key:" + sourcePath, e);
+		}finally {
+			if(ossClient != null){
+				ossClient.shutdown();
+			}
+		}
+	}
+
+	private String getMd5(String filePath){
+		OSSClient ossClient = new OSSClient(point, key, secrey);
+		String md5 = null;
+		try {
+			InputStream inputStream = ossClient.getObject(bucket, filePath).getObjectContent();
+			md5 = MD5Checksum.getMD5(inputStream);
+			log.info("Calculated MD5 for " + filePath + " is " + md5);
+			inputStream.close();
+		}catch (Exception e){
+			log.info("oss-getMd5-error:{}",e);
+		}finally {
+			if(ossClient != null){
+				ossClient.shutdown();
+			}
+		}
+		return md5;
+	}
+
+	private String getSHA1(String filePath){
+		OSSClient ossClient = new OSSClient(point, key, secrey);
+		String md5 = null;
+		try {
+			InputStream inputStream = ossClient.getObject(bucket, filePath).getObjectContent();
+			md5 = MD5Checksum.getSHA1(inputStream);
+			log.info("Calculated MD5 for " + filePath + " is " + md5);
+			inputStream.close();
+		}catch (Exception e){
+			log.info("oss-getMd5-error:{}",e);
+		}finally {
+			if(ossClient != null){
+				ossClient.shutdown();
+			}
+		}
+		return md5;
+	}
+	private Long getLastModified(String filePath){
+		OSSClient ossClient = new OSSClient(point, key, secrey);
+		try {
+			GetObjectRequest getObjectMetadataRequest = new GetObjectRequest(bucket, filePath);
+			Date  LastMo = ossClient.getObjectMetadata(getObjectMetadataRequest).getLastModified();
+			return LastMo.getTime();
+		}catch (Exception e){
+			log.info("oss-getMd5-error:{}",e);
+		}finally {
+			if(ossClient != null){
+				ossClient.shutdown();
+			}
+		}
+		return null;
+	}
+
+	public FileInfoVo getFileInfo(String filePath){
+		if("local".equals(type)){
+			return localToOssUtil.getFileInfo(filePath);
+		}
+		OSSClient ossClient = new OSSClient(point, key, secrey);
+		try {
+			GetObjectRequest getObjectMetadataRequest = new GetObjectRequest(bucket, filePath);
+			Date LastMo = ossClient.getObjectMetadata(getObjectMetadataRequest).getLastModified();
+			String md5 = ossClient.getObjectMetadata(getObjectMetadataRequest).getETag();
+			Long size = ossClient.getObjectMetadata(getObjectMetadataRequest).getContentLength();
+
+			InputStream inputStream = ossClient.getObject(bucket, filePath).getObjectContent();
+			String sha1 = MD5Checksum.getSHA1(inputStream);
+			return new FileInfoVo(md5,sha1.toUpperCase(),LastMo.getTime(),size);
+		}catch (Exception e){
+			log.info("oss-getFileInfo-error:{}",filePath,e);
+		}finally {
+			if(ossClient != null){
+				ossClient.shutdown();
+			}
+		}
+		return null;
+	}
+
+	public Long getSize(String filePath){
+		if("local".equals(type)){
+			return localToOssUtil.getSize(filePath);
+		}
+		OSSClient ossClient = new OSSClient(point, key, secrey);
+		Long total = 0L;
+		try {
+			List<String> files = listKeysFromAli( filePath);
+			if (ObjectUtils.isEmpty(files)) {
+				return 0L;
+			}
+			for (String file : files) {
+				GetObjectRequest getObjectMetadataRequest = new GetObjectRequest(bucket, file);
+				Long size = ossClient.getObjectMetadata(getObjectMetadataRequest).getContentLength();
+				total += size;
+			}
+
+		}catch (Exception e){
+			log.info("oss-getFileInfo-error:{}",e);
+		}finally {
+			if(ossClient != null){
+				ossClient.shutdown();
+			}
+		}
+		return total;
+	}
+
+	public String getOssPath(String path) {
+		return path.replace(queryPath,"");
+	}
 }

+ 0 - 1
src/main/java/com/fdkankan/fusion/common/util/VideoUtil.java

@@ -81,5 +81,4 @@ public class VideoUtil {
         }
         return true;
     }
-
 }

+ 22 - 0
src/main/java/com/fdkankan/fusion/config/MinIOConfig.java

@@ -0,0 +1,22 @@
+package com.fdkankan.fusion.config;
+
+import lombok.Data;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@Data
+public class MinIOConfig {
+
+    @Value("${minio.endpoint}")
+    private String endpoint;
+    @Value("${minio.fileHost}")
+    private String fileHost;
+    @Value("${minio.bucketName}")
+    private String bucketName;
+    @Value("${minio.accessKey}")
+    private String accessKey;
+    @Value("${minio.secretKey}")
+    private String secretKey;
+
+}

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

@@ -44,14 +44,14 @@ public class SaTokenConfigure {
     public SaServletFilter getSaServletFilter() {
         return new SaServletFilter()
                 // 指定 拦截路由 与 放行路由
-                .addInclude("/**").addExclude("/**/test/**","/**/inner/**","/**/notAuth/**","/**ws/**")
+                .addInclude("/**").addExclude("/**/test/**","/**/inner/**","/**/notAuth/**","/**/systemSetting/**","/**/downMD5/**","/**/downDocx/**","/**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"));
+                    SaRouter.match("/sceneDownLog/list", r -> StpUtil.checkRoleOr("admin-super","admin-system","admin") );
 
                     // 登录认证 -- 拦截所有路由,并排除/user/doLogin 用于开放登录
                     SaRouter.match("/**", "/fdLogin", r ->checkLogin() );

+ 34 - 0
src/main/java/com/fdkankan/fusion/config/SecurityUtil.java

@@ -0,0 +1,34 @@
+package com.fdkankan.fusion.config;
+
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+public class SecurityUtil {
+    public static String MD52(String md5) {
+        try {
+            MessageDigest md = MessageDigest.getInstance("MD5");
+            byte[] digest = md.digest(md5.getBytes());
+            StringBuffer sb = new StringBuffer();
+
+            for(int i = 0; i < digest.length; ++i) {
+                sb.append(Integer.toHexString(digest[i] & 255 | 256).substring(1, 3));
+            }
+
+            return sb.toString();
+        } catch (NoSuchAlgorithmException var5) {
+            var5.printStackTrace();
+            return null;
+        }
+    }
+
+    public static String MD5(String inStr) {
+        char[] a = inStr.toCharArray();
+
+        for(int i = 0; i < a.length; ++i) {
+            a[i] = (char)(a[i] ^ 116);
+        }
+
+        String s = new String(a);
+        return s;
+    }
+}

+ 104 - 0
src/main/java/com/fdkankan/fusion/controller/CameraVersionAppController.java

@@ -0,0 +1,104 @@
+package com.fdkankan.fusion.controller;
+
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fdkankan.fusion.common.PageInfo;
+import com.fdkankan.fusion.common.ResultCode;
+import com.fdkankan.fusion.common.ResultData;
+import com.fdkankan.fusion.entity.CameraVersion;
+import com.fdkankan.fusion.entity.CameraVersionApp;
+import com.fdkankan.fusion.entity.TmUser;
+import com.fdkankan.fusion.entity.User;
+import com.fdkankan.fusion.exception.BusinessException;
+import com.fdkankan.fusion.request.CameraVersionParam;
+import com.fdkankan.fusion.response.CameraVersionVo;
+import com.fdkankan.fusion.service.ICameraVersionAppService;
+import com.fdkankan.fusion.service.ICameraVersionService;
+import com.fdkankan.fusion.service.ITmUserService;
+import com.fdkankan.fusion.service.IUserService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * <p>
+ * 相机版本表 前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2024-07-24
+ */
+@RestController
+@RequestMapping("/cameraVersionApp")
+public class CameraVersionAppController extends BaseController{
+
+    @Autowired
+    ICameraVersionAppService cameraVersionAppService;
+    @Autowired
+    ITmUserService tmUserService;
+    @Autowired
+    IUserService userService;
+
+    /**
+     * 上传文件
+     * type     相机类型,1八目,2双目,不传默认八目
+     * file       文件流
+     * version    版本
+     * description  描述
+     */
+    @PostMapping(value = "/addAndUpload", consumes = { "multipart/form-data" })
+    public ResultData upload(@RequestParam("file") MultipartFile file,
+                             @RequestParam("version") String version,
+                             @RequestParam("description") String description,
+                             @RequestParam("minVersion") String minVersion,
+                             @RequestParam(value = "type",defaultValue = "0") Integer type) throws IOException {
+        cameraVersionAppService.addAndUpload(file,version,description,minVersion,type,getUserName());
+        return ResultData.ok();
+    }
+
+    @PostMapping("/update")
+    public ResultData update(@RequestBody CameraVersionApp param){
+        cameraVersionAppService.updateByParam(param);
+        return ResultData.ok();
+    }
+
+    @PostMapping("/delete")
+    public ResultData delete(@RequestBody CameraVersion param){
+        if(param.getId() == null){
+            throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
+        }
+        cameraVersionAppService.removeById(param.getId());
+        return ResultData.ok();
+    }
+
+    @PostMapping("/list")
+    public ResultData list(@RequestBody CameraVersionParam param){
+        Page<CameraVersionApp> page = cameraVersionAppService.pageList(param);
+        List<CameraVersionVo> voList = new ArrayList<>();
+        for (CameraVersionApp record : page.getRecords()) {
+            CameraVersionVo vo = new CameraVersionVo();
+            BeanUtils.copyProperties(record,vo);
+            if(record.getSysUserId() !=null){
+                User user = userService.getById(record.getSysUserId());
+                if(user != null){
+                    TmUser tmUser = tmUserService.getByUserName(user.getUserName());
+                    if(tmUser != null){
+                        vo.setCreateName(tmUser.getNickName());
+                    }
+                }
+            }
+            voList.add(vo);
+        }
+        Page<CameraVersionVo> voPage = new Page<>(param.getPageNum(),param.getPageSize());
+        voPage.setRecords(voList);
+        voPage.setTotal(page.getTotal());
+        return ResultData.ok(PageInfo.PageInfo(voPage));
+    }
+}
+

+ 104 - 0
src/main/java/com/fdkankan/fusion/controller/CameraVersionController.java

@@ -0,0 +1,104 @@
+package com.fdkankan.fusion.controller;
+
+
+import cn.dev33.satoken.stp.StpUtil;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fdkankan.fusion.common.PageInfo;
+import com.fdkankan.fusion.common.ResultCode;
+import com.fdkankan.fusion.common.ResultData;
+import com.fdkankan.fusion.entity.CameraVersion;
+import com.fdkankan.fusion.entity.CameraVersionApp;
+import com.fdkankan.fusion.entity.TmUser;
+import com.fdkankan.fusion.entity.User;
+import com.fdkankan.fusion.exception.BusinessException;
+import com.fdkankan.fusion.request.CameraVersionParam;
+import com.fdkankan.fusion.response.CameraVersionVo;
+import com.fdkankan.fusion.service.ICameraVersionService;
+import com.fdkankan.fusion.service.ITmUserService;
+import com.fdkankan.fusion.service.IUserService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * <p>
+ * 相机版本表 前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2024-07-23
+ */
+@RestController
+@RequestMapping("/cameraVersion")
+public class CameraVersionController extends BaseController {
+
+    @Autowired
+    ICameraVersionService cameraVersionService;
+    @Autowired
+    ITmUserService tmUserService;
+    @Autowired
+    IUserService userService;
+
+    /**
+     * 上传文件
+     * type     相机类型,1八目,2双目,不传默认八目
+     * file       文件流
+     * version    版本
+     * description  描述
+     */
+    @PostMapping(value = "/addAndUpload", consumes = { "multipart/form-data" })
+    public ResultData upload(@RequestParam("file") MultipartFile file,
+                             @RequestParam("version") String version,
+                             @RequestParam("description") String description,
+                             @RequestParam("minVersion") String minVersion,
+                             @RequestParam(value = "type",defaultValue = "1") Integer type) throws IOException {
+        cameraVersionService.addAndUpload(file,version,description,minVersion,type,getUserName());
+        return ResultData.ok();
+    }
+
+    @PostMapping("/update")
+    public ResultData update(@RequestBody CameraVersion param){
+        cameraVersionService.updateByParam(param);
+        return ResultData.ok();
+    }
+
+    @PostMapping("/delete")
+    public ResultData delete(@RequestBody CameraVersion param){
+        if(param.getId() == null){
+            throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
+        }
+        cameraVersionService.removeById(param.getId());
+        return ResultData.ok();
+    }
+
+    @PostMapping("/list")
+    public ResultData list(@RequestBody CameraVersionParam param){
+        Page<CameraVersion> page = cameraVersionService.pageList(param);
+        List<CameraVersionVo> voList = new ArrayList<>();
+        for (CameraVersion record : page.getRecords()) {
+            CameraVersionVo vo = new CameraVersionVo();
+            BeanUtils.copyProperties(record,vo);
+            if(record.getSysUserId() !=null){
+                User user = userService.getById(record.getSysUserId());
+                if(user != null){
+                    TmUser tmUser = tmUserService.getByUserName(user.getUserName());
+                    if(tmUser != null){
+                        vo.setCreateName(tmUser.getNickName());
+                    }
+                }
+            }
+            voList.add(vo);
+        }
+        Page<CameraVersionVo> voPage = new Page<>(param.getPageNum(),param.getPageSize());
+        voPage.setRecords(voList);
+        voPage.setTotal(page.getTotal());
+        return ResultData.ok(PageInfo.PageInfo(voPage));
+    }
+}
+

+ 14 - 11
src/main/java/com/fdkankan/fusion/controller/CaseController.java

@@ -3,6 +3,7 @@ package com.fdkankan.fusion.controller;
 
 import cn.hutool.core.bean.BeanUtil;
 import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.fusion.common.ResultCode;
 import com.fdkankan.fusion.entity.TmProject;
 import com.fdkankan.fusion.exception.BusinessException;
 import com.fdkankan.fusion.common.ResultData;
@@ -12,6 +13,7 @@ import com.fdkankan.fusion.response.CaseVo;
 import com.fdkankan.fusion.service.ICaseNumService;
 import com.fdkankan.fusion.service.ICaseService;
 import com.fdkankan.fusion.service.ITmProjectService;
+import com.fdkankan.fusion.service.impl.CopyCaseService;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
@@ -27,6 +29,8 @@ public class CaseController extends BaseController{
     ICaseService caseService;
     @Autowired
     ITmProjectService tmProjectService;
+    @Autowired
+    CopyCaseService copyCaseService;
 
     @PostMapping("/list")
     public ResultData list(@RequestBody CaseParam param ){
@@ -65,18 +69,17 @@ public class CaseController extends BaseController{
 
     @GetMapping("/getInfo")
     public ResultData getInfo(@RequestParam(required = false)Integer caseId){
-        CaseEntity caseEntity = caseService.getById(caseId);
-        if(caseEntity == null){
-            return ResultData.ok();
-        }
-        CaseVo caseVo = new CaseVo();
-        BeanUtil.copyProperties(caseEntity,caseVo);
-        if(caseEntity.getTmProjectId() != null){
-            TmProject tmProject = tmProjectService.getById(caseEntity.getTmProjectId());
-            caseVo.setTmProject(tmProject);
-            caseVo.setCaseTitle(tmProject.getProjectName());
+
+        return ResultData.ok(caseService.getInfo(caseId));
+    }
+
+    @PostMapping("/copyCase")
+    public ResultData copyCase(@RequestBody CaseParam param){
+        if(param.getCaseId() == null){
+            throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
         }
-        return ResultData.ok(caseVo);
+        copyCaseService.copyCase(param.getCaseId());
+        return ResultData.ok();
     }
 }
 

+ 92 - 0
src/main/java/com/fdkankan/fusion/controller/CaseExtractDetailController.java

@@ -0,0 +1,92 @@
+package com.fdkankan.fusion.controller;
+
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.deepoove.poi.data.TextRenderData;
+import com.deepoove.poi.data.style.Style;
+import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy;
+import com.deepoove.poi.util.PoitlIOUtils;
+import com.fdkankan.fusion.common.ResultCode;
+import com.fdkankan.fusion.common.ResultData;
+import com.fdkankan.fusion.entity.CaseExtractDetail;
+import com.fdkankan.fusion.entity.CaseInquest;
+import com.fdkankan.fusion.exception.BusinessException;
+import com.fdkankan.fusion.response.CaseInquestVo;
+import com.fdkankan.fusion.response.WitnessVo;
+import com.fdkankan.fusion.service.ICaseExtractDetailService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.BufferedOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2024-07-05
+ */
+@RestController
+@RequestMapping("/caseExtractDetail")
+public class CaseExtractDetailController {
+
+    @Autowired
+    ICaseExtractDetailService caseExtractDetailService;
+
+
+    @GetMapping("/info")
+    public ResultData info(@RequestParam(required = false) Integer caseId){
+        return ResultData.ok(caseExtractDetailService.getByCaseId(caseId));
+    }
+
+    @PostMapping("/saveOrUpdate")
+    public ResultData saveOrUpdate(@RequestBody CaseExtractDetail caseExtractDetail){
+        caseExtractDetailService.saveByParam(caseExtractDetail);
+        return ResultData.ok();
+    }
+
+    @GetMapping("/downDocx")
+    public void downDocx(@RequestParam(required = false) Integer caseId,
+                         HttpServletResponse res, HttpServletRequest req) throws IOException {
+
+        if(caseId == null){
+            throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
+        }
+        CaseExtractDetail caseExtractDetail = caseExtractDetailService.getByCaseId(caseId);
+        if(caseExtractDetail == null){
+            throw new BusinessException(ResultCode.INQUEST_ERROR2);
+        }
+
+        XWPFTemplate template = caseExtractDetailService.getWordByTemplate(caseExtractDetail);
+
+        // 设置响应头,指定文件类型和内容长度
+        res.setContentType("application/octet-stream");
+        res.setHeader("Content-Disposition", "attachment; filename=output.docx");
+
+        try {
+            // 返回网络流
+            OutputStream out = res.getOutputStream();
+            BufferedOutputStream bos = new BufferedOutputStream(out);
+            template.write(bos);
+            bos.flush();
+            out.flush();
+            // 关闭流
+            PoitlIOUtils.closeQuietlyMulti(template, bos, out);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+
+    }
+
+}
+

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

@@ -80,7 +80,7 @@ public class CaseFilesController extends BaseController{
             caseFiles.setFilesUrl(url);
             caseFilesService.saveOrUpdate(caseFiles);
             //上传认定书,修改案例状态
-            if(filesTypeId == 4){
+            if(filesTypeId == 5){
                 caseService.updateIdenTityStatus(caseId,1);
             }
         }

+ 121 - 0
src/main/java/com/fdkankan/fusion/controller/CaseImgController.java

@@ -0,0 +1,121 @@
+package com.fdkankan.fusion.controller;
+
+
+import com.fdkankan.fusion.common.FilePath;
+import com.fdkankan.fusion.common.RequestBase;
+import com.fdkankan.fusion.common.ResultCode;
+import com.fdkankan.fusion.common.ResultData;
+import com.fdkankan.fusion.common.util.StringUtils;
+import com.fdkankan.fusion.entity.CaseImg;
+import com.fdkankan.fusion.exception.BusinessException;
+import com.fdkankan.fusion.request.CaseImgParam;
+import com.fdkankan.fusion.service.ICaseImgService;
+import com.fdkankan.fusion.service.impl.UploadService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2024-07-04
+ */
+@RestController
+@RequestMapping("/caseImg")
+public class CaseImgController {
+
+    @Autowired
+    ICaseImgService caseImgService;
+
+
+    @PostMapping("/list")
+    public ResultData list(@RequestBody CaseImgParam param){
+        if(param.getCaseId() == null){
+            throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
+        }
+        return ResultData.ok(caseImgService.getByCaseId(param.getCaseId(),0));
+    }
+
+    @PostMapping("/saveOrUpdate")
+    public ResultData saveOrUpdate(@RequestBody CaseImg caseImg){
+        if(caseImg.getCaseId() == null){
+            throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
+        }
+        return ResultData.ok(caseImgService.saveOrUpdate(caseImg));
+    }
+
+    @PostMapping("/addBatch")
+    public ResultData saveBatch(@RequestBody CaseImgParam param){
+
+        if(param.getImgUrls() == null || param.getImgUrls().isEmpty()){
+            throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
+        }
+        for (CaseImg imgUrl : param.getImgUrls()) {
+            if(imgUrl.getCaseId() == null){
+                throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
+            }
+            caseImgService.save(imgUrl);
+        }
+        return ResultData.ok();
+    }
+
+    @PostMapping("/delete")
+    public ResultData delete(@RequestBody CaseImg caseImg){
+        if(caseImg.getId() == null){
+            throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
+        }
+        return ResultData.ok(caseImgService.removeById(caseImg.getId()));
+    }
+
+    @PostMapping("/updateSort")
+    public ResultData updateSort(@RequestBody CaseImgParam param){
+        caseImgService.updateSort(param);
+        return ResultData.ok();
+    }
+
+    @Autowired
+    UploadService uploadService;
+    @Value("${spring.profiles.active}")
+    private String environment;
+
+    @PostMapping("/uploadImagesAndSave")
+    public ResultData uploadImagesAndSave(@RequestParam(required = false)MultipartFile[] files,
+                                          @RequestParam(required = false)Integer caseId) {
+        if(caseId == null || files.length==0){
+            throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
+        }
+        for (MultipartFile file : files) {
+            String fileName = file.getOriginalFilename();
+            if (fileName != null && fileName.contains(".")) {
+                fileName = fileName.substring(0,fileName.lastIndexOf("."));
+            }
+            String url = uploadService.uploadFile(file, true, String.format(FilePath.IMAGES_OSS_PATH, environment, caseId));
+            CaseImg caseImg = new CaseImg();
+            caseImg.setCaseId(caseId);
+            caseImg.setImgUrl(url);
+            caseImg.setImgInfo(fileName);
+            caseImgService.save(caseImg);
+        }
+        return ResultData.ok();
+    }
+
+
+    @GetMapping("/getFfmpegImage")
+    public ResultData getFfmpegImage( @RequestParam(required = false)Integer caseId){
+        if(caseId == null){
+            throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
+        }
+        return ResultData.ok(caseImgService.getByCaseId(caseId,1));
+    }
+
+    @PostMapping("/ffmpegImage")
+    public ResultData ffmpegImage(@RequestParam(required = false)MultipartFile[] files,
+                                  @RequestParam(required = false)Integer caseId) {
+        return ResultData.ok(caseImgService.ffmpegImage(files,caseId));
+    }
+}
+

+ 39 - 0
src/main/java/com/fdkankan/fusion/controller/CaseImgTagController.java

@@ -0,0 +1,39 @@
+package com.fdkankan.fusion.controller;
+
+
+import com.fdkankan.fusion.common.ResultData;
+import com.fdkankan.fusion.entity.CaseExtractDetail;
+import com.fdkankan.fusion.entity.CaseImgTag;
+import com.fdkankan.fusion.service.ICaseExtractDetailService;
+import com.fdkankan.fusion.service.ICaseImgTagService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2024-07-12
+ */
+@RestController
+@RequestMapping("/caseImgTag")
+public class CaseImgTagController {
+
+    @Autowired
+    ICaseImgTagService caseImgTagService;
+
+
+    @GetMapping("/info")
+    public ResultData info(@RequestParam(required = false) Integer caseId){
+        return ResultData.ok(caseImgTagService.getByCaseId(caseId));
+    }
+
+    @PostMapping("/saveOrUpdate")
+    public ResultData saveOrUpdate(@RequestBody CaseImgTag caseImgTag){
+        caseImgTagService.saveByParam(caseImgTag);
+        return ResultData.ok();
+    }
+}
+

+ 87 - 0
src/main/java/com/fdkankan/fusion/controller/CaseInquestController.java

@@ -0,0 +1,87 @@
+package com.fdkankan.fusion.controller;
+
+
+import com.alibaba.fastjson.JSONObject;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.data.*;
+import com.deepoove.poi.data.style.Style;
+import com.deepoove.poi.util.PoitlIOUtils;
+import com.fdkankan.fusion.common.ResultCode;
+import com.fdkankan.fusion.common.ResultData;
+import com.fdkankan.fusion.entity.CaseInquest;
+import com.fdkankan.fusion.exception.BusinessException;
+import com.fdkankan.fusion.response.CaseInquestVo;
+import com.fdkankan.fusion.response.WitnessVo;
+import com.fdkankan.fusion.service.ICaseInquestService;
+import org.apache.poi.xwpf.usermodel.UnderlinePatterns;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.*;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+
+import static java.nio.file.Files.newOutputStream;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2024-07-04
+ */
+@RestController
+@RequestMapping("/caseInquest")
+public class CaseInquestController {
+
+    @Autowired
+    ICaseInquestService caseInquestService;
+
+    @GetMapping("/info")
+    public ResultData info(@RequestParam(required = false) Integer caseId){
+        return ResultData.ok(caseInquestService.getByCaseId(caseId));
+    }
+
+    @PostMapping("/saveOrUpdate")
+    public ResultData saveOrUpdate(@RequestBody CaseInquest caseInquest){
+        caseInquestService.saveByParam(caseInquest);
+        return ResultData.ok();
+    }
+
+    @GetMapping("/downDocx")
+    public void downDocx(@RequestParam(required = false) Integer caseId,
+                         HttpServletResponse res, HttpServletRequest req) throws IOException {
+
+        if(caseId == null){
+            throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
+        }
+        CaseInquest caseInquest = caseInquestService.getByCaseId(caseId);
+        if(caseInquest == null){
+            throw new BusinessException(ResultCode.INQUEST_ERROR2);
+        }
+        XWPFTemplate template = caseInquestService.getWordByTemplate(caseInquest);
+
+        // 设置响应头,指定文件类型和内容长度
+        res.setContentType("application/octet-stream");
+        res.setHeader("Content-Disposition", "attachment; filename=output.docx");
+
+        try {
+            // 返回网络流
+            OutputStream out = res.getOutputStream();
+            BufferedOutputStream bos = new BufferedOutputStream(out);
+            template.write(bos);
+            bos.flush();
+            out.flush();
+            // 关闭流
+            PoitlIOUtils.closeQuietlyMulti(template, bos, out);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+
+    }
+}
+

+ 59 - 0
src/main/java/com/fdkankan/fusion/controller/CaseScriptController.java

@@ -0,0 +1,59 @@
+package com.fdkankan.fusion.controller;
+
+
+import cn.hutool.core.io.FileUtil;
+import com.fdkankan.fusion.common.FilePath;
+import com.fdkankan.fusion.common.ResultCode;
+import com.fdkankan.fusion.common.ResultData;
+import com.fdkankan.fusion.common.util.ShellUtil;
+import com.fdkankan.fusion.common.util.VideoUtil;
+import com.fdkankan.fusion.entity.CaseScript;
+import com.fdkankan.fusion.exception.BusinessException;
+import com.fdkankan.fusion.service.ICaseScriptService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.*;
+
+import java.io.File;
+import java.util.UUID;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2024-07-11
+ */
+@RestController
+@RequestMapping("/caseScript")
+public class CaseScriptController {
+
+    @Autowired
+    ICaseScriptService caseScriptService;
+
+
+    @GetMapping("/info")
+    public ResultData info(@RequestParam(required = false) Integer caseId){
+        if(caseId == null){
+            throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
+        }
+        return ResultData.ok(caseScriptService.getByCaseId(caseId));
+    }
+
+    @PostMapping("/saveOrUpdate")
+    public ResultData saveOrUpdate(@RequestBody CaseScript caseScript){
+        caseScriptService.saveByParam(caseScript);
+        return ResultData.ok();
+    }
+
+
+
+    @GetMapping("/ffmpegVideoImage")
+    public ResultData ffmpegVideo(@RequestParam(required = false) String videoPath,
+                                  @RequestParam(required = false,defaultValue = "200") String width,
+                                  @RequestParam(required = false,defaultValue = "200") String high){
+        return ResultData.ok(caseScriptService.getFfmpegVideoImage(videoPath,width,high));
+    }
+}
+

+ 61 - 0
src/main/java/com/fdkankan/fusion/controller/CaseSettingsResourceController.java

@@ -0,0 +1,61 @@
+package com.fdkankan.fusion.controller;
+
+
+import com.fdkankan.fusion.common.ResultCode;
+import com.fdkankan.fusion.common.ResultData;
+import com.fdkankan.fusion.entity.CaseSettings;
+import com.fdkankan.fusion.entity.CaseSettingsResource;
+import com.fdkankan.fusion.exception.BusinessException;
+import com.fdkankan.fusion.service.ICaseSettingsResourceService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2024-07-03
+ */
+@RestController
+@RequestMapping("/settingsResource")
+public class CaseSettingsResourceController {
+
+    @Autowired
+    ICaseSettingsResourceService caseSettingsResourceService;
+
+
+    @GetMapping("/info")
+    public ResultData info(@RequestParam(required = false) Integer caseId){
+        if(caseId == null){
+            throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
+        }
+        return ResultData.ok(caseSettingsResourceService.getByCaseId(caseId));
+    }
+
+
+    @PostMapping("/saveOrUpdate")
+    public ResultData saveOrUpdate(@RequestBody CaseSettingsResource settingsResource){
+        if(settingsResource.getCaseId() == null){
+            throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
+        }
+        caseSettingsResourceService.saveOrUpdate(settingsResource);
+        return ResultData.ok();
+    }
+
+    @PostMapping("/delete")
+    public ResultData delete(@RequestBody CaseSettingsResource settingsResource){
+        if(settingsResource.getId() == null){
+            throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
+        }
+        CaseSettingsResource byId = caseSettingsResourceService.getById(settingsResource.getId());
+        if(byId != null){
+            caseSettingsResourceService.removeById(settingsResource.getId());
+        }
+        return ResultData.ok();
+    }
+}
+

+ 4 - 0
src/main/java/com/fdkankan/fusion/controller/CaseVideoController.java

@@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.fdkankan.fusion.common.ResultCode;
 import com.fdkankan.fusion.common.ResultData;
 import com.fdkankan.fusion.entity.CaseVideo;
+import com.fdkankan.fusion.exception.BusinessException;
 import com.fdkankan.fusion.request.CaseParam;
 import com.fdkankan.fusion.request.CaseVideoParam;
 import com.fdkankan.fusion.service.ICaseVideoService;
@@ -33,6 +34,9 @@ public class CaseVideoController {
 
     @GetMapping("/allList")
     public ResultData allList(@RequestParam(required = false) Integer folderId){
+        if(folderId == null){
+            throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
+        }
         return ResultData.ok(caseVideoService.getAllList(folderId));
     }
 

+ 42 - 0
src/main/java/com/fdkankan/fusion/controller/DownOfflinePackageController.java

@@ -0,0 +1,42 @@
+package com.fdkankan.fusion.controller;
+
+
+import com.fdkankan.fusion.common.ResultData;
+import com.fdkankan.fusion.down.CaseDownService;
+import com.fdkankan.fusion.response.DownVo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+
+/**
+ * <p>
+ * 相机版本表 前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2024-07-23
+ */
+@RestController
+@RequestMapping("/offlinePackage")
+public class DownOfflinePackageController {
+
+    @Autowired
+    CaseDownService caseDownService;
+
+    @GetMapping("/checkDown")
+    public ResultData checkDown(@RequestParam(required = false) Integer caseId){
+        return ResultData.ok(caseDownService.checkDown(caseId));
+    }
+    @GetMapping("/down")
+    public ResultData down(@RequestParam(required = false) Integer caseId){
+        caseDownService.downOffline(caseId);
+        DownVo downVo = new DownVo();
+        downVo.setDownloadStatus(1);
+        return ResultData.ok(downVo);
+    }
+    @GetMapping("/process")
+    public ResultData process(@RequestParam(required = false) Integer caseId){
+        return ResultData.ok(caseDownService.process(caseId));
+    }
+}
+

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

@@ -29,6 +29,9 @@ public class FusionGuidePathController {
 
     @GetMapping("/allList")
     public ResultData allList(@RequestParam(required = false) Integer guideId){
+        if(guideId == null){
+            throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
+        }
         return ResultData.ok(fusionGuidePathService.getListByGuideId(guideId));
     }
 

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

@@ -50,8 +50,8 @@ public class LoginController extends BaseController{
                 || StringUtils.isBlank(param.getCode()) || StringUtils.isBlank(param.getDeptId())){
             throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
         }
-        //String id = request.getSession().getId();
-        String id = param.getCode();
+        String id = request.getSession().getId();
+        //String id = param.getCode();
         if(!redisUtil.hasKey(String.format(RedisKeyUtil.loginAuthCode,id))){
             throw new BusinessException(ResultCode.LOGIN_AUTH_NOT_EXIST);
         }

+ 72 - 0
src/main/java/com/fdkankan/fusion/controller/ModelController.java

@@ -1,21 +1,34 @@
 package com.fdkankan.fusion.controller;
 
 
+import cn.hutool.core.io.FileUtil;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.fdkankan.fusion.common.FilePath;
 import com.fdkankan.fusion.common.ResultCode;
 import com.fdkankan.fusion.common.ResultData;
 import com.fdkankan.fusion.common.ResultCode;
+import com.fdkankan.fusion.common.util.MD5Checksum;
+import com.fdkankan.fusion.common.util.UploadToOssUtil;
 import com.fdkankan.fusion.entity.Model;
 import com.fdkankan.fusion.exception.BusinessException;
 import com.fdkankan.fusion.request.ModelPram;
 import com.fdkankan.fusion.request.ScenePram;
+import com.fdkankan.fusion.response.FileInfoVo;
 import com.fdkankan.fusion.service.*;
+import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.web.bind.annotation.*;
 
 import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.IOException;
+import java.io.OutputStream;
+
 /**
  * <p>
  *  前端控制器
@@ -74,13 +87,72 @@ public class ModelController extends BaseController{
         if(param.getModelId() == null){
             throw  new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
         }
+        if(StringUtils.isBlank(param.getModelTitle()) && StringUtils.isBlank(param.getRenderType())){
+            throw  new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
+        }
+
         LambdaUpdateWrapper<Model> wrapper = new LambdaUpdateWrapper<>();
         wrapper.eq(Model::getModelId,param.getModelId());
+
+        if(StringUtils.isNotBlank(param.getRenderType())){
+            wrapper.set(Model::getRenderType,param.getRenderType());
+        }
         if(StringUtils.isNotBlank(param.getModelTitle())){
             wrapper.set(Model::getModelTitle,param.getModelTitle());
         }
         modelService.update(wrapper);
         return ResultData.ok();
     }
+
+    @PostMapping("/copyModel")
+    public ResultData copyModel(@RequestBody ModelPram param){
+        if(param.getModelId() == null){
+            throw  new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
+        }
+        modelService.copyModel(param.getModelId());
+        return ResultData.ok();
+    }
+
+    @Value("${spring.profiles.active}")
+    private String environment;
+    @Autowired
+    UploadToOssUtil uploadToOssUtil;
+    @Value("${upload.query-path}")
+    private String queryPath;
+    @GetMapping("/downMD5")
+    public void downMD5(@RequestParam(required = false) Integer modelId,
+                        HttpServletResponse res, HttpServletRequest req) throws IOException {
+        OutputStream os = null;
+        try {
+            Model model = modelService.getById(modelId);
+            if(model == null){
+                throw new BusinessException(ResultCode.MODEL_NOT_EXIST);
+            }
+            if(StringUtils.isBlank(model.getFileNewName())){
+                throw new BusinessException(ResultCode.FILE_NOT_EXIST);
+            }
+            String sceneObjPath = model.getFileNewName().replace(queryPath,"");
+
+            FileInfoVo fileInfo = uploadToOssUtil.getFileInfo(sceneObjPath);
+            if(fileInfo == null){
+                throw new BusinessException(ResultCode.FILE_NOT_EXIST);
+            }
+            String objPath = String.format(FilePath.OBJ_LOCAL_PATH,environment ,modelId) ;
+
+            File file = new File(objPath +"/"+modelId + "_hash.txt");
+
+            res.setContentType("application/octet-stream");
+            res.setHeader("Content-Disposition", "attachment; filename="+modelId + "_hash.txt");
+            os = res.getOutputStream();
+            FileUtil.writeString(fileInfo.toString(),file,"UTF-8");
+            os.write(FileUtils.readFileToByteArray(file));
+            os.flush();
+        } finally {
+            if(os!=null){
+                os.close();
+            }
+        }
+    }
+
 }
 

+ 4 - 4
src/main/java/com/fdkankan/fusion/controller/TmSceneController.java

@@ -7,15 +7,15 @@ import org.springframework.web.bind.annotation.RestController;
 
 /**
  * <p>
- * 场景关联关系表 前端控制器
+ *  前端控制器
  * </p>
  *
  * @author 
- * @since 2023-07-28
+ * @since 2024-08-07
  */
 @RestController
-@RequestMapping("/fusion/tmScene")
-public class TmSceneController {
+@RequestMapping("/fusion/mqSendLog")
+public class MqSendLogController {
 
 }
 

+ 24 - 3
src/main/java/com/fdkankan/fusion/controller/NoLoginController.java

@@ -1,27 +1,39 @@
 package com.fdkankan.fusion.controller;
 
 import cn.hutool.captcha.CaptchaUtil;
+import cn.hutool.captcha.CircleCaptcha;
 import cn.hutool.captcha.LineCaptcha;
+import cn.hutool.captcha.ShearCaptcha;
+import cn.hutool.captcha.generator.CodeGenerator;
+import cn.hutool.captcha.generator.MathGenerator;
+import cn.hutool.captcha.generator.RandomGenerator;
+import cn.hutool.crypto.digest.MD5;
 import cn.hutool.http.ContentType;
 import com.alibaba.fastjson.JSONObject;
 import com.fdkankan.fusion.common.ResultCode;
 import com.fdkankan.fusion.common.ResultData;
+import com.fdkankan.fusion.common.util.MD5Checksum;
 import com.fdkankan.fusion.common.util.RedisKeyUtil;
 import com.fdkankan.fusion.common.util.StringUtils;
 import com.fdkankan.fusion.exception.BusinessException;
 import com.fdkankan.fusion.response.UserAddRequest;
 import com.fdkankan.fusion.service.ITmUserService;
 import com.fdkankan.redis.util.RedisUtil;
+import jdk.nashorn.internal.runtime.regexp.joni.Config;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.compress.utils.OsgiUtils;
 import org.apache.http.HttpHeaders;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.kafka.KafkaProperties;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.awt.image.BufferedImage;
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
-
+import java.security.Security;
+import java.util.Properties;
 @RestController
 @RequestMapping("/notAuth")
 @Slf4j
@@ -38,8 +50,10 @@ public class NoLoginController {
         response.setContentType("image/jpeg");
         String id = request.getSession().getId();
         try {
-            LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(200, 100,4,60);
-            redisUtil.set(String.format(RedisKeyUtil.loginAuthCode,lineCaptcha.getCode()),lineCaptcha.getCode(),60*5);
+            LineCaptcha lineCaptcha = new LineCaptcha(200, 100);
+            RandomGenerator mathGenerator = new RandomGenerator("1234567890",4);
+            lineCaptcha.setGenerator(mathGenerator);
+            redisUtil.set(String.format(RedisKeyUtil.loginAuthCode,id),lineCaptcha.getCode(),60*5);
             lineCaptcha.write(response.getOutputStream());
             response.getOutputStream().close();
         } catch (Exception e){
@@ -59,4 +73,11 @@ public class NoLoginController {
         return ResultData.ok( tmUserService.getMsgAuthCode(phoneNum));
     }
 
+
+    public static void main(String[] args) {
+        String passwordHash = MD5.create().digestHex("6N^KJTG*GkWj3C");
+        System.out.println(passwordHash);
+        String passwordHash2 = MD5.create().digestHex(passwordHash);
+        System.out.println(passwordHash2);
+    }
 }

+ 82 - 0
src/main/java/com/fdkankan/fusion/controller/SceneController.java

@@ -1,15 +1,32 @@
 package com.fdkankan.fusion.controller;
 
+import cn.hutool.core.io.FileUtil;
+import com.fdkankan.fusion.common.FilePath;
 import com.fdkankan.fusion.common.ResultCode;
 import com.fdkankan.fusion.common.ResultData;
+import com.fdkankan.fusion.common.util.MinIoUploadService;
+import com.fdkankan.fusion.common.util.UploadToOssUtil;
 import com.fdkankan.fusion.exception.BusinessException;
 import com.fdkankan.fusion.httpClient.request.LaserSceneParam;
 import com.fdkankan.fusion.request.ScenePram;
+import com.fdkankan.fusion.response.FileInfoVo;
 import com.fdkankan.fusion.response.SceneProEntityVo;
 import com.fdkankan.fusion.service.ISceneService;
+import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
 
 @RestController
 @RequestMapping("/scene")
@@ -47,4 +64,69 @@ public class SceneController extends BaseController{
         sceneService.buildSceneObj(param);
         return ResultData.ok();
     }
+
+    @PostMapping("/copyScene")
+    public ResultData copyScene(@RequestBody ScenePram param){
+        sceneService.copyScene(param);
+        return ResultData.ok();
+    }
+
+    @Autowired
+    UploadToOssUtil uploadToOssUtil;
+    @Autowired
+    MinIoUploadService minIoUploadService;
+
+    @Value("${spring.profiles.active}")
+    private String environment;
+    @GetMapping("/downMD5")
+    public void downMD5(@RequestParam(required = false) String num,
+                        @RequestParam(required = false) Integer type,
+                               HttpServletResponse res, HttpServletRequest req) throws IOException {
+        if(StringUtils.isBlank(num) || type == null){
+            throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
+        }
+
+        // 设置响应头,指定文件类型和内容长度
+        OutputStream os = null;
+        try {
+            FileInfoVo fileInfo = null;
+            Long size = null;
+            String sceneObjPath =null;
+
+            if(type == 2 || type == 5){  //点云
+                sceneObjPath = String.format(FilePath.LASER_OSS_PATH, num,num)+"/cloud.js" ;
+                fileInfo = minIoUploadService.getFileStatusInfo(sceneObjPath);
+                String scenePath = String.format(FilePath.LASER_OSS_PATH, num,num);
+                size = minIoUploadService.getSize(scenePath);
+            }else {
+                sceneObjPath = String.format(FilePath.OBJ_OSS_PATH,num) + "/images/3dtiles/tileset.json";
+                if(!uploadToOssUtil.existKey(sceneObjPath)){
+                    sceneObjPath = String.format(FilePath.OBJ_OSS_PATH,num) + "/data/mesh/mesh.json";
+                }
+                if(!uploadToOssUtil.existKey(sceneObjPath)){
+                    sceneObjPath = String.format(FilePath.OBJ_OSS_PATH,num) + "/data/mesh/mesh.obj";
+                }
+                fileInfo = uploadToOssUtil.getFileInfo(sceneObjPath);
+                String scenePath = String.format(FilePath.OBJ_OSS_PATH, num);
+                size = uploadToOssUtil.getSize(scenePath);
+            }
+            if(fileInfo == null){
+                throw new BusinessException(ResultCode.FILE_NOT_EXIST);
+            }
+            fileInfo.setSize(size);
+            String objPath = String.format(FilePath.OBJ_LOCAL_PATH,environment , num) ;
+            File file = new File(objPath +"/"+num + "_hash.txt");
+            res.setContentType("application/octet-stream");
+            res.setHeader("Content-Disposition", "attachment; filename="+num + "_hash.txt");
+            os = res.getOutputStream();
+            FileUtil.writeString(fileInfo.toString(),file,"UTF-8");
+            os.write(FileUtils.readFileToByteArray(file));
+            os.flush();
+        } finally {
+            if(os!=null){
+                os.close();
+            }
+        }
+    }
+
 }

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

@@ -40,7 +40,7 @@ public class SceneDownLogController extends BaseController{
     @GetMapping("/checkDownLoad")
     public ResultData checkDownLoad(@RequestParam(required = false) String num,
                                     @RequestParam(required = false,defaultValue = "0") Integer isObj){
-        return ResultData.ok(downService.checkDownLoad(num,isObj));
+        return ResultData.ok(downService.checkDownLoad(num,isObj,"scene"));
     }
 
     /**
@@ -50,7 +50,7 @@ public class SceneDownLogController extends BaseController{
     @GetMapping("/downScene")
     public ResultData downScene(@RequestParam(required = false) String num,
                                 @RequestParam(required = false,defaultValue = "0") Integer isObj){
-        return ResultData.ok(downService.down(num,isObj));
+        return ResultData.ok(downService.down(num,isObj,"scene"));
     }
 
     /**

+ 64 - 0
src/main/java/com/fdkankan/fusion/controller/SystemSettingController.java

@@ -0,0 +1,64 @@
+package com.fdkankan.fusion.controller;
+
+
+import com.fdkankan.fusion.common.ResultCode;
+import com.fdkankan.fusion.common.ResultData;
+import com.fdkankan.fusion.entity.SystemSetting;
+import com.fdkankan.fusion.exception.BusinessException;
+import com.fdkankan.fusion.service.ISystemSettingService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2024-07-04
+ */
+@RestController
+@RequestMapping("/systemSetting")
+public class SystemSettingController {
+
+    @Autowired
+    ISystemSettingService systemSettingService;
+
+
+    @GetMapping("/info")
+    public ResultData info(){
+        List<SystemSetting> list = systemSettingService.list();
+        if(list == null || list.isEmpty()){
+            return ResultData.ok();
+        }
+        return ResultData.ok(list.get(0));
+    }
+
+
+    @PostMapping("/save")
+    public ResultData save(@RequestBody SystemSetting systemSetting){
+        List<SystemSetting> list = systemSettingService.list();
+        if(list == null || list.isEmpty()){
+            systemSettingService.save(systemSetting);
+        }else {
+            SystemSetting systemSetting1 = list.get(0);
+            systemSetting.setId(systemSetting1.getId());
+            systemSettingService.updateById(systemSetting);
+        }
+        return ResultData.ok();
+    }
+
+    @PostMapping("/delete")
+    public ResultData delete(@RequestBody SystemSetting systemSetting){
+        if(systemSetting.getId() == null){
+            throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
+        }
+        systemSettingService.removeById(systemSetting.getId());
+        return ResultData.ok();
+    }
+
+}
+

+ 17 - 7
src/main/java/com/fdkankan/fusion/controller/TestController.java

@@ -1,20 +1,37 @@
 package com.fdkankan.fusion.controller;
 
 import cn.hutool.http.HttpUtil;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.data.*;
+import com.deepoove.poi.data.style.Style;
+import com.deepoove.poi.util.PoitlIOUtils;
 import com.dtflys.forest.annotation.Post;
+import com.fdkankan.fusion.common.ResultCode;
 import com.fdkankan.fusion.common.ResultData;
 import com.fdkankan.fusion.common.util.ShellUtil;
 import com.fdkankan.fusion.entity.*;
+import com.fdkankan.fusion.exception.BusinessException;
+import com.fdkankan.fusion.response.CaseInquestVo;
+import com.fdkankan.fusion.response.WitnessVo;
 import com.fdkankan.fusion.service.*;
 import com.fdkankan.redis.util.RedisUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.ibatis.annotations.Case;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 import sun.java2d.pipe.SpanIterator;
 
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import javax.xml.transform.Result;
+import java.io.BufferedOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.ThreadPoolExecutor;
 
@@ -35,13 +52,6 @@ public class TestController {
     @Autowired
     ICaseNumService caseNumService;
 
-    @RequestMapping("/test")
-    public ResultData test(){
-        //String cmd = "docker exec -d 3dtile /bin/bash -c '/mnt/fusion/3dtile.sh -f osgb -i /mnt/fusion/osgb/modelId_576/OSGB -o /mnt/fusion/b3dm/modelId_576/OSGB'";
-        String cmd = "sudo docker run --rm -v /mnt/fusion:/mnt/fusion 3dtile:v2 /mnt/fusion/3dtile.sh -f osgb -i /mnt/fusion/osgb/modelId_576/OSGB -o /mnt/fusion/b3dm/modelId_576/OSGB";
-        ShellUtil.execCmd(cmd);
-        return ResultData.ok();
-    }
 
     @RequestMapping("/projectAddCase")
     public ResultData projectAddCase(){

+ 14 - 2
src/main/java/com/fdkankan/fusion/controller/TmDepartmentController.java

@@ -3,9 +3,15 @@ package com.fdkankan.fusion.controller;
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.hutool.core.util.ObjectUtil;
+import com.fdkankan.fusion.common.ResultCode;
 import com.fdkankan.fusion.common.ResultData;
+import com.fdkankan.fusion.entity.CaseEntity;
 import com.fdkankan.fusion.entity.TmDepartment;
+import com.fdkankan.fusion.entity.TmProject;
+import com.fdkankan.fusion.exception.BusinessException;
+import com.fdkankan.fusion.service.ICaseService;
 import com.fdkankan.fusion.service.ITmDepartmentService;
+import com.fdkankan.fusion.service.ITmProjectService;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.util.CollectionUtils;
@@ -30,6 +36,10 @@ public class TmDepartmentController {
 
     @Autowired
     private ITmDepartmentService departmentService;
+    @Autowired
+    private ICaseService caseService;
+    @Autowired
+    ITmProjectService tmProjectService;
 
 
     /**
@@ -45,8 +55,10 @@ public class TmDepartmentController {
      * 获取部门下拉树列表
      */
     @GetMapping("/treeselect")
-    public ResultData treeselect() {
-
+    public ResultData treeselect(@RequestParam(required = false) String deptId) {
+        if(StringUtils.isNotBlank(deptId)){
+            return ResultData.ok(departmentService.getDeptList(deptId));
+        }
         return ResultData.ok(departmentService.getDeptList());
     }
 

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

@@ -36,9 +36,14 @@ public class TmRoleController {
         LambdaQueryWrapper<TmRole> wrapper = new LambdaQueryWrapper<>();
         wrapper.ne(TmRole::getRoleKey, RoleKeyEnum.ADMIN_SUPER.getKey());
         TmRole tmRole = tmRoleService.getByUserId((String) StpUtil.getLoginId());
-        if(!tmRole.getRoleKey().equals(RoleKeyEnum.ADMIN_SUPER.getKey())){
+        if(!tmRole.getRoleKey().equals(RoleKeyEnum.ADMIN_SUPER.getKey())
+                && !tmRole.getRoleKey().equals(RoleKeyEnum.ADMIN.getKey())){
             wrapper.ne(TmRole::getRoleKey, RoleKeyEnum.ADMIN.getKey());
         }
+        if(!tmRole.getRoleKey().equals(RoleKeyEnum.ADMIN_SUPER.getKey())
+                && !tmRole.getRoleKey().equals(RoleKeyEnum.ADMIN_SYSTEM.getKey())){
+            wrapper.ne(TmRole::getRoleKey, RoleKeyEnum.ADMIN_SYSTEM.getKey());
+        }
         return ResultData.ok(tmRoleService.list(wrapper));
     }
 }

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

@@ -98,5 +98,21 @@ public class TmUserController {
     public ResultData getUserListSelect( @RequestParam(name = "deptId", required = false) String deptId) {
         return ResultData.ok(tmUserService.getUserListSelect(deptId));
     }
+
+    /**
+     * 重置密码
+     */
+    @PostMapping("/restPassword")
+    public ResultData restPassword(@RequestBody UserAddRequest param){
+        if(StringUtils.isBlank(param.getUserName())){
+            throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
+        }
+        param.setClear("YES");
+        param.setPassword("Xj12345678");
+        param.setConfirmPwd("Xj12345678");
+        param.setOldPassword("Xj12345678");
+        tmUserService.changePassword(param);
+        return ResultData.ok();
+    }
 }
 

+ 0 - 21
src/main/java/com/fdkankan/fusion/controller/TmUserRoleController.java

@@ -1,21 +0,0 @@
-package com.fdkankan.fusion.controller;
-
-
-import org.springframework.web.bind.annotation.RequestMapping;
-
-import org.springframework.web.bind.annotation.RestController;
-
-/**
- * <p>
- * 用户角色关系表 前端控制器
- * </p>
- *
- * @author 
- * @since 2023-07-28
- */
-@RestController
-@RequestMapping("/fusion/tmUserRole")
-public class TmUserRoleController {
-
-}
-

+ 466 - 0
src/main/java/com/fdkankan/fusion/down/CaseDownService.java

@@ -0,0 +1,466 @@
+package com.fdkankan.fusion.down;
+
+import cn.hutool.core.io.FileUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.deepoove.poi.XWPFTemplate;
+import com.fdkankan.fusion.common.FilePath;
+import com.fdkankan.fusion.common.ResultData;
+import com.fdkankan.fusion.common.util.MinIoUploadService;
+import com.fdkankan.fusion.common.util.ShellUtil;
+import com.fdkankan.fusion.common.util.UploadToOssUtil;
+import com.fdkankan.fusion.entity.*;
+import com.fdkankan.fusion.httpClient.LaserService;
+import com.fdkankan.fusion.httpClient.response.FdkkResponse;
+import com.fdkankan.fusion.request.CaseParam;
+import com.fdkankan.fusion.response.DownVo;
+import com.fdkankan.fusion.response.DownloadProcessVo;
+import com.fdkankan.fusion.response.FusionNumVo;
+import com.fdkankan.fusion.response.SceneVo;
+import com.fdkankan.fusion.service.*;
+import com.fdkankan.fusion.service.impl.DownService;
+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.beans.factory.annotation.Value;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.nio.charset.StandardCharsets;
+import java.util.List;
+
+@Service
+@Slf4j
+public class CaseDownService {
+
+    @Value("${server.servlet.context-path}")
+    String basePath;
+
+    public static String jsonDataName = "data.json";
+    public static String caseInfo =     "/case/getInfo?caseId=";
+    public static String caseSettingsInfo =     "/caseSettings/info?caseId=";
+    public static String hostIcon =     "/edit/hotIcon/list?caseId=";
+    public static String caseView =     "/caseView/allList?caseId=";
+    public static String caseFiles =      "/caseFiles/allList?caseId=";
+    public static String caseFilesType =      "/caseFilesType/allList?caseId=";
+    public static String caseScene =      "/case/sceneList?caseId=";
+    public static String caseFusion =      "/caseFusion/list?caseId=";
+    public static String caseVideoFolder =      "/caseVideoFolder/allList?caseId=";
+    public static String caseVideo =      "/caseVideo/allList?folderId=";
+    public static String caseTag =      "/caseTag/allList?caseId=";
+    public static String caseTagPoint =      "/caseTagPoint/allList?tagId=";
+    public static String caseInquest =      "/caseInquest/info?caseId=";
+    public static String caseExtractDetail =      "/caseExtractDetail/info?caseId=";
+    public static String fusionGuide =      "/fusionGuide/allList?caseId=";
+    public static String fusionGuidePath =     "/fusionGuidePath/allList?guideId=";
+    public static String fusionMeter =      "/fusionMeter/allList?fusionId=";
+
+    public static String model =      "/model/getInfo?modelId=";
+    public static String caseImg =      "/caseImg/getFfmpegImage?caseId=";
+
+    public static String laserData = "/laser/dataset/%s/getDataSet";
+
+    @Autowired
+    ICaseService caseService;
+    @Autowired
+    ICaseSettingsService caseSettingsService;
+    @Autowired
+    IFusionNumService fusionNumService;
+    @Autowired
+    ICaseViewService caseViewService;
+    @Autowired
+    ICaseVideoFolderService caseVideoFolderService;
+    @Autowired
+    ICaseVideoService caseVideoService;
+    @Autowired
+    ICaseFilesService caseFilesService;
+    @Autowired
+    ICaseFilesTypeService caseFilesTypeService;
+    @Autowired
+    IHotIconService hotIconService;
+    @Autowired
+    ICaseTagService caseTagService;
+    @Autowired
+    ICaseTagPointService caseTagPointService;
+    @Autowired
+    IFusionGuideService fusionGuideService;
+    @Autowired
+    IFusionGuidePathService fusionGuidePathService;
+    @Autowired
+    ICaseInquestService caseInquestService;
+    @Autowired
+    ICaseExtractDetailService caseExtractDetailService;
+    @Autowired
+    IFusionMeterService fusionMeterService;
+    @Autowired
+    IModelService modelService;
+    @Autowired
+    LaserService laserService;
+    @Autowired
+    ICaseOfflineService caseOfflineService;
+    @Autowired
+    ICaseImgService caseImgService;
+
+    @Autowired
+    RedisUtil redisUtil;
+
+    @Value("${spring.profiles.active}")
+    private String environment;
+    public static String downProcessKey = "fusion:down:offline:process:caseId:%s";
+
+    public DownVo checkDown(Integer caseId) {
+        DownVo downVo = new DownVo();
+//        CaseOffline byCaseId = caseOfflineService.getByCaseId(caseId);
+//        if(byCaseId != null){
+//            downVo.setDownloadStatus(3);
+//            downVo.setDownloadUrl(byCaseId.getOfflineUrl());
+//        }
+        return downVo;
+    }
+    @Async
+    public void downOffline(Integer caseId){
+        try {
+            String redisKey = String.format(downProcessKey, caseId);
+            if( redisUtil.hasKey(redisKey)){
+                String res = redisUtil.get(redisKey);
+                DownloadProcessVo downloadProcessVo = JSONObject.parseObject(res, DownloadProcessVo.class);
+                if(downloadProcessVo.getPercent()== null || downloadProcessVo.getPercent() != 100){
+                    return;
+                }
+            }
+
+            setRedisProcess(caseId,0);
+            //复制前端资源
+            cpIndexHtml(caseId);
+            setRedisProcess(caseId,10);
+            //创建data.json并下载资源
+            createDataJson(caseId);
+            setRedisProcess(caseId,50);
+            //打包zip
+            String path = "/mnt/fusion/offline";
+            String name = "offline_"+ caseId;
+            String zipName = path+File.separator+name+".zip";
+            ShellUtil.zipOffline(zipName,name);
+            setRedisProcess(caseId,70);
+            //上传oss
+            String ossUrl = zipName.replace("/mnt/", "");
+            ShellUtil.yunUpload(zipName,ossUrl);
+            Thread.sleep(2000L);
+            FileUtil.del(zipName);
+            ossUrl = queryPath + ossUrl;
+            caseOfflineService.saveByCase(caseId,ossUrl);
+            setRedisProcess(caseId,100,ossUrl);
+        }catch (Exception e){
+            log.info("down-offline-error:{}",caseId,e);
+            setRedisProcess(caseId,0,null,1003);
+        }
+
+    }
+
+    public void setRedisProcess(Integer caseId,Integer num){
+        setRedisProcess(caseId,num,null,1000);
+    }
+
+    public void setRedisProcess(Integer caseId,Integer num,String url){
+       setRedisProcess(caseId,num,url,1000);
+    }
+
+    public void setRedisProcess(Integer caseId,Integer num,String url,Integer status){
+        String redisKey = String.format(downProcessKey, caseId);
+        log.info("down-offline-process:{},{},{}",caseId,num,url);
+        DownloadProcessVo processVo = new DownloadProcessVo();
+        processVo.setStatus(status);
+        processVo.setPercent(num);
+        processVo.setUrl( url);
+        redisUtil.set(redisKey,JSONObject.toJSONString(processVo));
+    }
+
+    public DownloadProcessVo process(Integer caseId) {
+        DownloadProcessVo downVo = new DownloadProcessVo();
+        String redisKey = String.format(downProcessKey, caseId);
+        if(redisUtil.hasKey(redisKey)){
+            return JSONObject.parseObject(redisUtil.get(redisKey),DownloadProcessVo.class);
+        }
+        return downVo;
+    }
+
+    public void createDataJson(Integer caseId){
+        log.info("down-offline-createDataJson:{}",caseId);
+        JSONObject jsonObject = new JSONObject();
+        CaseParam param = new CaseParam();
+        param.setCaseId(caseId);
+
+        //设置案件信息
+        jsonObject.put(basePath+caseInfo+caseId, ResultData.ok(caseService.getInfo(caseId)));
+
+        List<CaseSettings> caseSettings = caseSettingsService.getByCaseId(caseId);
+        jsonObject.put(basePath+caseSettingsInfo+caseId, ResultData.ok(caseSettings));
+        for (CaseSettings caseSetting : caseSettings) {
+            downResource(caseId,caseSetting.getBack());
+            downResource(caseId,caseSetting.getCover());
+        }
+
+        List<FusionNumVo> listByCaseId = fusionNumService.getListByCaseId(caseId,null);
+        jsonObject.put(basePath+caseFusion+caseId, ResultData.ok(listByCaseId));
+        for (FusionNumVo fusion : listByCaseId) {
+            jsonObject.put(basePath+fusionMeter+fusion.getFusionId(), ResultData.ok(fusionMeterService.getListByFusionId(fusion.getFusionId(),null)));
+        }
+
+        List<SceneVo> sceneVos = caseService.sceneList(param);
+        for (SceneVo sceneData : sceneVos) {
+            //下载模型
+            if(StringUtils.isNotBlank(sceneData.getModelGlbUrl())){
+                downModel(caseId,sceneData.getModelGlbUrl());
+            }
+            if(sceneData.getType() != 3){
+                //下载场景离线包
+                downSwkk(caseId,sceneData.getNum(),sceneData.getType());
+            }
+            if(sceneData.getType() == 2 || sceneData.getType() == 5){
+                FdkkResponse sceneInfo = laserService.getSceneInfo(sceneData.getNum());
+                if(sceneInfo != null){
+                    JSONArray jsonArray = JSONArray.parseArray(JSONArray.toJSONString(sceneInfo.getData()));
+                    JSONArray newJsonArray = new JSONArray();
+                    for (Object object : jsonArray) {
+                        JSONObject sceneInfoObj = (JSONObject) object;
+                        String newPath = String.format(FilePath.OFFLINE_LASER_OSS_PATH, sceneData.getNum(), sceneData.getNum());
+                        String oldPath = sceneInfoObj.getString("webBin");
+                        sceneInfoObj.put("oldWebBin",oldPath);
+                        sceneInfoObj.put("webBin",newPath + oldPath);
+                        newJsonArray.add(sceneInfoObj);
+                    }
+                    sceneInfo.setData(newJsonArray);
+                    jsonObject.put(String.format(laserData,sceneData.getNum()),sceneInfo);
+                }
+
+            }
+            if(sceneData.getModelId() != null){
+                jsonObject.put(basePath+model+sceneData.getModelId(), ResultData.ok(modelService.getInfo(sceneData.getModelId())));
+            }
+        }
+        jsonObject.put(basePath+caseScene+caseId, ResultData.ok(sceneVos));
+
+        List<CaseView> caseViews = caseViewService.allList(caseId, null, null, null, null);
+        jsonObject.put(basePath+caseView+caseId, ResultData.ok(caseViews));
+        for (CaseView view : caseViews) {
+            downResource(caseId,view.getViewImg());
+            downResource(caseId,view.getViewImgSmall());
+        }
+
+        List<CaseVideoFolder> videoFolders = caseVideoFolderService.getAllList(caseId);
+        jsonObject.put(basePath+caseVideoFolder+caseId, ResultData.ok(videoFolders));
+        for (CaseVideoFolder videoFolder : videoFolders) {
+            downResource(caseId,videoFolder.getVideoFolderCover());
+            downResource(caseId,videoFolder.getVideoMergeUrl());
+
+            List<CaseVideo> allList = caseVideoService.getAllList(videoFolder.getVideoFolderId());
+            for (CaseVideo video : allList) {
+                downResource(caseId,video.getVideoCover());
+                downResource(caseId,video.getVideoPath());
+            }
+            jsonObject.put(basePath+caseVideo+videoFolder.getVideoFolderId(), ResultData.ok(allList));
+        }
+
+        List<CaseFiles> caseFilesList = caseFilesService.allList(caseId, null);
+        for (CaseFiles files : caseFilesList) {
+            String fileUrl = String.format(FilePath.File_OSS_PATH,environment,files.getFilesId());
+            downResource(caseId,queryPath +fileUrl);
+        }
+        jsonObject.put(basePath+caseFiles+caseId, ResultData.ok(caseFilesList));
+
+
+        jsonObject.put(basePath+caseFilesType+caseId, ResultData.ok(caseFilesTypeService.list()));
+
+        List<HotIcon> hotIconList = hotIconService.getListByCaseId(caseId);
+        for (HotIcon hotIcon : hotIconList) {
+            downResource(caseId,hotIcon.getIconUrl());
+        }
+        jsonObject.put(basePath+hostIcon+caseId, ResultData.ok(hotIconList));
+
+        List<CaseTag> caseTagList = caseTagService.allList(caseId, null);
+        jsonObject.put(basePath+caseTag+caseId, ResultData.ok(caseTagList));
+        for (CaseTag tag : caseTagList) {
+            jsonObject.put(basePath+caseTagPoint+tag.getTagId(), ResultData.ok(caseTagPointService.allList(tag.getTagId())));
+            downResources(caseId,tag.getTagImgUrl());
+            downResource(caseId,tag.getHotIconUrl());
+        }
+
+        List<FusionGuide> fusionGuides = fusionGuideService.getAllList(caseId);
+        jsonObject.put(basePath+fusionGuide+caseId, ResultData.ok(fusionGuides));
+
+        for (FusionGuide guide : fusionGuides) {
+            downResource(caseId,guide.getCover());
+            List<FusionGuidePath> listByGuideId = fusionGuidePathService.getListByGuideId(guide.getFusionGuideId());
+            for (FusionGuidePath guidePath : listByGuideId) {
+                downResource(caseId,guidePath.getCover());
+            }
+            jsonObject.put(basePath+fusionGuidePath+guide.getFusionGuideId(), ResultData.ok(listByGuideId));
+        }
+        CaseInquest caseInquest1 = caseInquestService.getByCaseId(caseId);
+        if(caseInquest1 != null){
+            XWPFTemplate inquestTemp = caseInquestService.getWordByTemplate(caseInquest1);
+            downWordByTemplate(caseId,inquestTemp,"caseInquest.doc");
+        }
+        jsonObject.put(basePath+caseInquest+caseId, ResultData.ok(caseInquest1));
+
+        CaseExtractDetail caseExtractDetail1 = caseExtractDetailService.getByCaseId(caseId);
+        if(caseExtractDetail1 != null){
+            XWPFTemplate detailTemp = caseExtractDetailService.getWordByTemplate(caseExtractDetail1);
+            downWordByTemplate(caseId,detailTemp,"caseExtractDetail.doc");
+        }
+        jsonObject.put(basePath+caseExtractDetail+caseId, ResultData.ok(caseExtractDetail1));
+
+        List<CaseImg> caseImgList = caseImgService.getByCaseId(caseId, 1);
+        for (CaseImg img : caseImgList) {
+            downResource(img.getCaseId(),img.getImgUrl());
+        }
+        jsonObject.put(basePath+caseImg+caseId, ResultData.ok(caseImgList));
+
+
+        FileUtil.writeString(JSON.toJSONString(jsonObject), FilePath.OFFLINE_PACKAGE_PATH+caseId+"/www/package/"+jsonDataName,"UTF-8");
+
+    }
+
+
+
+
+    //http://127.0.0.1:8080/offline.html?caseId=362&app=1&share=1#/show/summary
+
+    static String batName = "start-browser.bat";
+   public void cpIndexHtml(Integer caseId){
+       log.info("down-offline-cpIndexHtml:{}",caseId);
+
+       String caseOfflinePath = FilePath.OFFLINE_PACKAGE_PATH+caseId;
+       FileUtil.copyContent(new File(FilePath.OFFLINE_TEMPLATE_PATH),new File(caseOfflinePath),true);
+
+       String s = FileUtil.readString(caseOfflinePath + File.separator + batName, StandardCharsets.UTF_8);
+       String s1 = s.replaceAll("@caseId", String.valueOf(caseId));
+       FileUtil.writeString(s1, caseOfflinePath + File.separator + batName,"UTF-8");
+   }
+
+
+   @Autowired
+    DownService downService;
+   @Autowired
+    UploadToOssUtil uploadToOssUtil;
+   @Autowired
+    MinIoUploadService minIoUploadService;
+
+   public void downSwkk(Integer caseId,String num,Integer type){
+
+       String swkkPath = FilePath.OFFLINE_PACKAGE_PATH+caseId + "/www/swkk/"+num;
+       String swkkZipPath = swkkPath +".zip";
+       String swssPath = FilePath.OFFLINE_PACKAGE_PATH+caseId + "/www/swss/"+num;
+       String swssZipPath = swssPath +".zip";
+
+       Integer isObj = 0;
+       if(type == 4 || type == 6){
+           isObj =1;
+       }
+       try {
+
+           DownVo downVo = downService.checkDownLoad(num, isObj,"offline");
+           log.info("down:{}",downVo);
+           if(downVo.getDownloadStatus() == 3 && StringUtils.isNotBlank(downVo.getDownloadUrl())){
+               downZip(type,downVo.getDownloadUrl(),swkkZipPath,swkkPath,swssZipPath,swssPath);
+           }else {
+               DownVo down = downService.down(num, isObj,"offline");
+               if(down.getDownloadStatus() == 1){
+                   DownloadProcessVo downloadProcessVo = downService.downloadProcess(num, isObj);
+                   while (downloadProcessVo.getStatus() != 1002 ){
+                       downloadProcessVo =  downService.downloadProcess(num, isObj);
+                       Thread.sleep(2000L);
+                   }
+                   downZip(type,downloadProcessVo.getUrl(),swkkZipPath,swkkPath,swssZipPath,swssPath);
+               }
+           }
+       }catch (Exception e){
+           log.info("下载场景离线包失败:{}",num,e);
+       }
+
+   }
+    @Value("${upload.query-path}")
+    private String queryPath;
+   public void downZip(Integer type ,String uri,String kkzipPath,String kknumPath,String sszipPath,String ssNumPath){
+       try {
+           if(type != 2 && type != 5){ //深时点云
+               if(uri.contains("?")){
+                   uri = uri.split("[?]")[0];
+               }
+               ShellUtil.yunDownload(uri.replace(queryPath, ""), kkzipPath);
+
+               ShellUtil.unZip(kkzipPath,kknumPath);
+               FileUtil.del(kkzipPath);
+           }else {
+//               InputStream in = minIoUploadService.getObject(uri);
+//               FileOutputStream out = new FileOutputStream(sszipPath);
+//               byte[] buffer = new byte[1024];
+//               int bytesRead;
+//               while ((bytesRead = in.read(buffer)) != -1) {
+//                   out.write(buffer, 0, bytesRead);
+//               }
+//               out.flush();
+//               out.close();
+//               in.close();
+               ShellUtil.yunDownloadSs(uri.replace(queryPath, ""), sszipPath);
+               ShellUtil.unZip(sszipPath,ssNumPath);
+               FileUtil.del(sszipPath);
+           }
+       }catch (Exception e){
+            log.info("下载场景离线包失败:{}",uri,e);
+       }
+
+   }
+    public void downModel(Integer caseId, String modelGlbUrl) {
+        String path = String.format(FilePath.OFFLINE_OSS_PATH,caseId);
+
+        JSONArray jsonArray = JSONArray.parseArray(modelGlbUrl);
+        for (Object object : jsonArray) {
+            String res = (String) object;
+            res = res.replace(queryPath, "");
+            File file = new File(res);
+            ShellUtil.yunDownload(file.getParentFile().getPath(), path +queryPath + file.getParentFile().getPath());
+        }
+    }
+    public void downResources(Integer caseId,String urls) {
+
+        JSONArray jsonArray = JSONArray.parseArray(urls);
+        for (Object object : jsonArray) {
+            String res = (String) object;
+            downResource(caseId,res);
+        }
+    }
+
+    public void downResource(Integer caseId,String url) {
+        if(StringUtils.isBlank(url) ){
+            return;
+        }
+        url = url.replace(queryPath, "");
+        if( !uploadToOssUtil.existKey(url)){
+            log.info("downResource文件不存在:{},{}",caseId,url);
+            return;
+        }
+        String path = String.format(FilePath.OFFLINE_OSS_PATH,caseId);
+        ShellUtil.yunDownload(url,path+queryPath+url);
+    }
+
+    public void downWordByTemplate(Integer caseId,XWPFTemplate template,String name){
+        // 指定输出文件的路径
+        String outputPath = String.format(FilePath.OFFLINE_RESOURCE_PACKAGE_PATH,caseId) + name;
+        try {
+            FileOutputStream out = new FileOutputStream(outputPath);
+            template.write(out);
+            out.close();
+            log.info("文档已成功写入到: " + outputPath);
+        } catch (Exception e) {
+           log.info("写出文档失败:{},{}",caseId,name,e);
+        }
+    }
+
+
+
+}

+ 102 - 0
src/main/java/com/fdkankan/fusion/entity/CameraVersion.java

@@ -0,0 +1,102 @@
+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-07-23
+ */
+@Getter
+@Setter
+@TableName("t_camera_version")
+public class CameraVersion implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 名称
+     */
+    @TableField("name")
+    private String name;
+
+    /**
+     * 文件rul
+     */
+    @TableField("file_url")
+    private String fileUrl;
+
+    /**
+     * 文件MD5
+     */
+    @TableField("file_md5")
+    private String fileMd5;
+
+    /**
+     * 描述
+     */
+    @TableField("description")
+    private String description;
+
+    /**
+     * 相机版本
+     */
+    @TableField("version")
+    private String version;
+
+    /**
+     * 相机类型,1八目,2双目, 3转台双目, 4激光转台
+     */
+    @TableField("type")
+    private Integer type;
+
+    /**
+     * 活动状态:A: 生效,I: 禁用
+     */
+    @TableField("status")
+    private String status;
+
+    /**
+     * 记录的状态,A: 生效,I: 禁用
+     */
+    @TableField("rec_status")
+    @TableLogic(value = "A",delval = "I")
+    private String recStatus;
+
+    /**
+     * 创建日期
+     */
+    @TableField("create_time")
+    private String createTime;
+
+    /**
+     * 修改日期
+     */
+    @TableField("update_time")
+    private Date updateTime;
+
+    /**
+     * 相机版本(最小)
+     */
+    @TableField("min_version")
+    private String minVersion;
+
+    /**
+     * 创建人
+     */
+    @TableField("sys_user_id")
+    private Long sysUserId;
+
+
+}

+ 102 - 0
src/main/java/com/fdkankan/fusion/entity/CameraVersionApp.java

@@ -0,0 +1,102 @@
+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-07-24
+ */
+@Getter
+@Setter
+@TableName("t_camera_version_app")
+public class CameraVersionApp implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 名称
+     */
+    @TableField("name")
+    private String name;
+
+    /**
+     * 文件rul
+     */
+    @TableField("file_url")
+    private String fileUrl;
+
+    /**
+     * 文件MD5
+     */
+    @TableField("file_md5")
+    private String fileMd5;
+
+    /**
+     * 描述
+     */
+    @TableField("description")
+    private String description;
+
+    /**
+     * 相机版本
+     */
+    @TableField("version")
+    private String version;
+
+    /**
+     * app 类型0安卓,1iOS
+     */
+    @TableField("type")
+    private Integer type;
+
+    /**
+     * 活动状态:A: 生效,I: 禁用
+     */
+    @TableField("status")
+    private String status;
+
+    /**
+     * 记录的状态,A: 生效,I: 禁用
+     */
+    @TableField("rec_status")
+    @TableLogic(value = "A",delval = "I")
+    private String recStatus;
+
+    /**
+     * 创建日期
+     */
+    @TableField("create_time")
+    private String createTime;
+
+    /**
+     * 修改日期
+     */
+    @TableField("update_time")
+    private Date updateTime;
+
+    /**
+     * 相机版本(最小)
+     */
+    @TableField("min_version")
+    private String minVersion;
+
+    /**
+     * 创建人
+     */
+    @TableField("sys_user_id")
+    private Long sysUserId;
+
+
+}

+ 81 - 0
src/main/java/com/fdkankan/fusion/entity/CaseExtractDetail.java

@@ -0,0 +1,81 @@
+package com.fdkankan.fusion.entity;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+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 com.fdkankan.fusion.typehandle.JsonArrayTypeHandler;
+import com.fdkankan.fusion.typehandle.JsonObjTypeHandler;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2024-07-05
+ */
+@Getter
+@Setter
+@TableName(value = "t_case_extract_detail",autoResultMap = true)
+public class CaseExtractDetail implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+
+    @TableField("case_id")
+    private Integer caseId;
+
+    /**
+     * 地址
+     */
+    @TableField("address")
+    private String address;
+
+    /**
+     * 提取时间
+     */
+    @TableField(typeHandler = JsonObjTypeHandler.class)
+    private JSONObject time;
+
+    /**
+     * 提取清单
+     */
+    @TableField(typeHandler = JsonArrayTypeHandler.class)
+    private JSONArray detail;
+
+    /**
+     * 提取人信息
+     */
+    @TableField(typeHandler = JsonArrayTypeHandler.class)
+    private JSONArray extractUser;
+
+    /**
+     * 证人信息
+     */
+    @TableField(typeHandler = JsonArrayTypeHandler.class)
+    private JSONArray witnessInfo;
+
+    @TableField("tb_status")
+    @TableLogic
+    private Integer tbStatus;
+
+    @TableField("create_time")
+    private Date createTime;
+
+    @TableField("update_time")
+    private Date updateTime;
+
+
+}

+ 75 - 0
src/main/java/com/fdkankan/fusion/entity/CaseImg.java

@@ -0,0 +1,75 @@
+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.TableName;
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2024-07-04
+ */
+@Getter
+@Setter
+@TableName("t_case_img")
+public class CaseImg implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 案例id
+     */
+    @TableField("case_id")
+    private Integer caseId;
+
+    /**
+     * 图片链接
+     */
+    @TableField("img_url")
+    private String imgUrl;
+
+    /**
+     * 图片说明
+     */
+    @TableField("img_info")
+    private String imgInfo;
+
+    /**
+     * 0未应用,1已应用
+     */
+    @TableField("status")
+    private Integer status;
+
+    /**
+     * 排序
+     */
+    @TableField("sort")
+    private Integer sort;
+
+    /**
+     * 0未应用,1已应用
+     */
+    @TableField("type")
+    private Integer type;
+
+    @TableField("create_time")
+    private Date createTime;
+
+    @TableField("update_time")
+    private Date updateTime;
+
+
+}

+ 59 - 0
src/main/java/com/fdkankan/fusion/entity/CaseImgTag.java

@@ -0,0 +1,59 @@
+package com.fdkankan.fusion.entity;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+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 com.fdkankan.fusion.typehandle.JsonArrayTypeHandler;
+import com.fdkankan.fusion.typehandle.JsonObjTypeHandler;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2024-07-12
+ */
+@Getter
+@Setter
+@TableName(value = "t_case_img_tag",autoResultMap = true)
+public class CaseImgTag implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("case_id")
+    private Integer caseId;
+
+    @TableField("name")
+    private String name;
+
+    @TableField("is_horizontal")
+    private Boolean isHorizontal;
+
+    @TableField(typeHandler = JsonObjTypeHandler.class)
+    private JSONObject data;
+
+    @TableField("tb_status")
+    @TableLogic
+    private Integer tbStatus;
+
+    @TableField("create_time")
+    private Date createTime;
+
+    @TableField("update_time")
+    private Date updateTime;
+
+
+}

+ 153 - 0
src/main/java/com/fdkankan/fusion/entity/CaseInquest.java

@@ -0,0 +1,153 @@
+package com.fdkankan.fusion.entity;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+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 com.deepoove.poi.data.TableRenderData;
+import com.fdkankan.fusion.typehandle.JsonArrayTypeHandler;
+import com.fdkankan.fusion.typehandle.JsonObjTypeHandler;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2024-07-04
+ */
+@Getter
+@Setter
+@TableName(value = "t_case_inquest",autoResultMap = true)
+public class CaseInquest implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("case_id")
+    private Integer caseId;
+
+    /**
+     * 勘验次数
+     */
+    @TableField("count")
+    private String count;
+
+    /**
+     * 勘验开始时间
+     */
+    @TableField(typeHandler = JsonObjTypeHandler.class)
+    private JSONObject startTime;
+
+    /**
+     * 勘验结束时间
+     */
+    @TableField(typeHandler = JsonObjTypeHandler.class)
+    private JSONObject endTime;
+
+    /**
+     * 勘验地点
+     */
+    @TableField("address")
+    private String address;
+
+    /**
+     * 勘验人员信息
+     */
+    @TableField("user_info")
+    private String userInfo;
+
+    /**
+     * 勘验气象条件
+     */
+    @TableField("weather")
+    private String weather;
+
+    /**
+     * 勘验情况
+     */
+    @TableField("situation")
+    private String situation;
+
+    /**
+     * 环境勘验
+     */
+    @TableField("environment")
+    private String environment;
+
+    /**
+     * 初步勘验
+     */
+    @TableField("first_inquest")
+    private String firstInquest;
+
+    /**
+     * 细项勘验
+     */
+    @TableField("careful_inquest")
+    private String carefulInquest;
+
+    /**
+     * 专项勘验
+     */
+    @TableField("special_inquest")
+    private String specialInquest;
+
+    /**
+     * 提取物品描述
+     */
+    @TableField("item_description")
+    private String itemDescription;
+
+    /**
+     * 现场拍照制图描述
+     */
+    @TableField("img_description")
+    private String imgDescription;
+
+    /**
+     * 负责人
+     */
+    @TableField("leader")
+    private String leader;
+
+    /**
+     * 记录人
+     */
+    @TableField("recorder")
+    private String recorder;
+
+    /**
+     * 勘验人
+     */
+    @TableField("inspector")
+    private String inspector;
+
+    /**
+     * 证人信息数组
+     */
+    @TableField(typeHandler = JsonArrayTypeHandler.class)
+    private JSONArray witnessInfo;
+
+    @TableField("tb_status")
+    @TableLogic
+    private Integer tbStatus;
+
+    @TableField("create_time")
+    private Date createTime;
+
+    @TableField("update_time")
+    private Date updateTime;
+
+
+}

+ 46 - 0
src/main/java/com/fdkankan/fusion/entity/CaseOffline.java

@@ -0,0 +1,46 @@
+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.TableName;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2024-07-26
+ */
+@Getter
+@Setter
+@TableName("t_case_offline")
+public class CaseOffline implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("case_id")
+    private Integer caseId;
+
+    @TableField("offline_url")
+    private String offlineUrl;
+
+    @TableField("version")
+    private Integer version;
+
+    @TableField("create_time")
+    private Date createTime;
+
+    @TableField("update_time")
+    private Date updateTime;
+
+
+}

+ 54 - 0
src/main/java/com/fdkankan/fusion/entity/CaseScript.java

@@ -0,0 +1,54 @@
+package com.fdkankan.fusion.entity;
+
+import com.alibaba.fastjson.JSONArray;
+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 com.fdkankan.fusion.typehandle.JsonArrayTypeHandler;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2024-07-11
+ */
+@Getter
+@Setter
+@TableName(value = "t_case_script",autoResultMap = true)
+public class CaseScript implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("case_id")
+    private Integer caseId;
+
+    @TableField("name")
+    private String name;
+
+    @TableField(typeHandler = JsonArrayTypeHandler.class)
+    private JSONArray content;
+
+    @TableField("tb_status")
+    @TableLogic
+    private Integer tbStatus;
+
+    @TableField("create_time")
+    private Date createTime;
+
+    @TableField("update_time")
+    private Date updateTime;
+
+
+}

+ 24 - 0
src/main/java/com/fdkankan/fusion/entity/CaseSettings.java

@@ -55,6 +55,23 @@ public class CaseSettings implements Serializable {
     @TableField("back")
     private String back;
 
+    /**
+     * 背景类型
+     *   color = "color",
+     *   envImage = "img",
+     *   bottomImage = "bimg",
+     *   icon = "icon",
+     */
+    @TableField("back_type")
+    private String backType;
+
+    @TableField("open_compass")
+    private Boolean openCompass;
+    @TableField("map_open")
+    private Boolean mapOpen;
+    @TableField("map_type")
+    private String mapType;
+
     @TableField("tb_status")
     @TableLogic
     private Integer tbStatus;
@@ -65,5 +82,12 @@ public class CaseSettings implements Serializable {
     @TableField("update_time")
     private Date updateTime;
 
+    @TableField("scale")
+    private Double scale;
+
+    @TableField("fov")
+    private Double fov;
 
+    @TableField("rotate")
+    private Double rotate;
 }

+ 65 - 0
src/main/java/com/fdkankan/fusion/entity/CaseSettingsResource.java

@@ -0,0 +1,65 @@
+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 2024-07-03
+ */
+@Getter
+@Setter
+@TableName("t_case_settings_resource")
+public class CaseSettingsResource implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("case_id")
+    private Integer caseId;
+
+    /**
+     * 名称
+     */
+    @TableField("name")
+    private String name;
+
+    /**
+     * 资源链接
+     */
+    @TableField("resource")
+    private String resource;
+
+    /**
+     */
+    @TableField("back_type")
+    private String backType;
+
+    @TableField("tb_status")
+    @TableLogic
+    private Integer tbStatus;
+
+    @TableField("create_time")
+    private Date createTime;
+
+    @TableField("update_time")
+    private Date updateTime;
+
+    @TableField("scale")
+    private Double scale;
+
+
+}

+ 15 - 0
src/main/java/com/fdkankan/fusion/entity/CaseTag.java

@@ -94,6 +94,21 @@ public class CaseTag implements Serializable {
     @TableField("sort")
     private Integer sort;
 
+    @TableField("mtype")
+    private String mtype;
+
+    @TableField("cat")
+    private String cat;
+
+    @TableField("time")
+    private String time;
+
+    @TableField("tsms")
+    private String tsms;
+
+    @TableField("type")
+    private String type;
+
     @TableField("tb_status")
     @TableLogic
     private Integer tbStatus;

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

@@ -51,6 +51,12 @@ public class FusionGuide implements Serializable {
     private String title;
 
     /**
+     * 恢复录屏时内容
+     */
+    @TableField("recovery_content")
+    private String recoveryContent;
+
+    /**
      * 排序
      */
     @TableField("sort")

+ 7 - 0
src/main/java/com/fdkankan/fusion/entity/Model.java

@@ -88,4 +88,11 @@ public class Model implements Serializable {
 
     @TableField(exist = false)
     private String deptName;
+
+
+    @TableField("file_new_name")
+    private String fileNewName;
+
+    @TableField("render_type")
+    private String renderType;
 }

+ 63 - 0
src/main/java/com/fdkankan/fusion/entity/MqSendLog.java

@@ -0,0 +1,63 @@
+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-08-07
+ */
+@Getter
+@Setter
+@TableName("mq_send_log")
+public class MqSendLog implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("num")
+    private String num;
+
+    /**
+     * 发送的队列
+     */
+    @TableField("queue")
+    private String queue;
+
+    /**
+     * 发送的mq消息
+     */
+    @TableField("content")
+    private String content;
+
+    /**
+     * 0未发送,1已发送
+     */
+    @TableField("status")
+    private Integer status;
+
+    @TableField("create_time")
+    private Date createTime;
+
+    @TableField("update_time")
+    private Date updateTime;
+
+    @TableField("sort")
+    private Integer sort;
+
+    @TableField("rec_status")
+    @TableLogic(value = "A",delval = "I")
+    private String recStatus;
+
+
+}

+ 51 - 0
src/main/java/com/fdkankan/fusion/entity/SystemSetting.java

@@ -0,0 +1,51 @@
+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 2024-07-04
+ */
+@Getter
+@Setter
+@TableName("t_system_setting")
+public class SystemSetting implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 系统标题
+     */
+    @TableField("title")
+    private String title;
+
+    @TableField("theme_colour")
+    private String themeColour;
+
+    @TableField("tb_status")
+    @TableLogic
+    private Integer tbStatus;
+
+    @TableField("create_time")
+    private Date createTime;
+
+    @TableField("update_time")
+    private Date updateTime;
+
+
+}

+ 153 - 0
src/main/java/com/fdkankan/fusion/entity/User.java

@@ -0,0 +1,153 @@
+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-07-29
+ */
+@Getter
+@Setter
+@TableName("t_user")
+public class User implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 头像对应的链接地址
+     */
+    @TableField("head")
+    private String head;
+
+    /**
+     * 用户密码
+     */
+    @TableField("password")
+    private String password;
+
+    /**
+     * 用户邮箱
+     */
+    @TableField("email")
+    private String email;
+
+    /**
+     * 注册时间
+     */
+    @TableField("register_time")
+    private Date registerTime;
+
+    /**
+     * 用户名
+     */
+    @TableField("user_name")
+    private String userName;
+
+    /**
+     * 昵称
+     */
+    @TableField("nick_name")
+    private String nickName;
+
+    /**
+     * 0表示禁言(bbs)
+     */
+    @TableField("status")
+    private Integer status;
+
+    /**
+     * 0表示拒绝通知,1表示接受通知
+     */
+    @TableField("is_notice")
+    private Integer isNotice;
+
+    /**
+     * 机构名称
+     */
+    @TableField("organization_name")
+    private String organizationName;
+
+    /**
+     * 主页链接
+     */
+    @TableField("main_page")
+    private String mainPage;
+
+    /**
+     * 所在国家,默认是86
+     */
+    @TableField("country")
+    private String country;
+
+    /**
+     * 所在省份
+     */
+    @TableField("province")
+    private String province;
+
+    /**
+     * 所在城市
+     */
+    @TableField("city")
+    private String city;
+
+    /**
+     * 可下载场景总数
+     */
+    @TableField("download_num_total")
+    private Integer downloadNumTotal;
+
+    /**
+     * 已下载场景总数
+     */
+    @TableField("download_num")
+    private Integer downloadNum;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private Date createTime;
+
+    /**
+     * 记录的状态,A: 生效,I: 禁用
+     */
+    @TableField("rec_status")
+    @TableLogic(value = "A",delval = "I")
+    private String recStatus;
+
+    /**
+     * 更新时间
+     */
+    @TableField("update_time")
+    private Date updateTime;
+
+    @TableField("sys_user_id")
+    private Integer sysUserId;
+
+    /**
+     * 深时场景下载总次数
+     */
+    @TableField("ss_download_num_total")
+    private Integer ssDownloadNumTotal;
+
+    /**
+     * 深时场景已下载次数
+     */
+    @TableField("ss_download_num")
+    private Integer ssDownloadNum;
+
+
+}

+ 3 - 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_camera","t_camera_detail"
+               "mq_send_log"
         }));
 
 //        generate(path,"goods", getTables(new String[]{
@@ -46,8 +46,8 @@ 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://192.168.0.25:3306/fd_fusion_xj",
+//                "root","mysql123!ROOT.")
         FastAutoGenerator.create("jdbc:mysql://120.24.144.164:3306/4dkankan_v4",
                 "root","4Dage@4Dage#@168")
                 .globalConfig(builder -> {

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

@@ -27,6 +27,7 @@ import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -81,8 +82,8 @@ public class FdService {
         return fdKKClient.fdkkCameraDetails(request,getFdToken());
     }
 
-    public FdkkResponse fdkKBind(String cameraSn,String userName) {
-        FdkkCameraParam request = new FdkkCameraParam(cameraSn,cameraSn,userName);
+    public FdkkResponse fdkKBind(String cameraSn,String userName,Integer cameraType) {
+        FdkkCameraParam request = new FdkkCameraParam(cameraSn,cameraSn,userName,cameraType);
         return fdKKClient.fdkKBind(request,getFdToken());
     }
 
@@ -123,4 +124,15 @@ public class FdService {
         }
         return fdkkResponse.getData();
     }
+
+    public void copyScene(String num) {
+        HashMap<String, Object> param = new HashMap<>();
+        param.put("num",num);
+        JSONObject jsonObject = fdKKClient.copyScene(param, new Date().getTime());
+        Integer code = jsonObject.getInteger("code");
+        String message = jsonObject.getString("message");
+        if(code != 0){
+            throw new BusinessException(code,message);
+        }
+    }
 }

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

@@ -65,4 +65,13 @@ public class LaserService {
         return null ;
     }
 
+    public FdkkResponse getSceneInfo(String num) {
+        try {
+           return laserClient.getSceneInfo(num);
+
+        }catch (Exception e){
+            log.info("获取激光场景信息失败getSceneInfo-error:{}",num,e);
+        }
+        return  null;
+    }
 }

+ 0 - 20
src/main/java/com/fdkankan/fusion/httpClient/address/NewFdkkAddressSource.java

@@ -1,20 +0,0 @@
-package com.fdkankan.fusion.httpClient.address;
-
-import com.dtflys.forest.callback.AddressSource;
-import com.dtflys.forest.http.ForestAddress;
-import com.dtflys.forest.http.ForestRequest;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Component;
-
-@Component
-public class NewFdkkAddressSource implements AddressSource {
-
-    @Value("${4dkk.newFdService.basePath}")
-    private String basePath;
-
-
-    @Override
-    public ForestAddress getAddress(ForestRequest forestRequest) {
-        return new ForestAddress("","",null,basePath);
-    }
-}

+ 0 - 20
src/main/java/com/fdkankan/fusion/httpClient/address/OverallAddressSource.java

@@ -1,20 +0,0 @@
-package com.fdkankan.fusion.httpClient.address;
-
-import com.dtflys.forest.callback.AddressSource;
-import com.dtflys.forest.http.ForestAddress;
-import com.dtflys.forest.http.ForestRequest;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Component;
-
-@Component
-public class OverallAddressSource implements AddressSource {
-
-    @Value("${4dkk.overallService.basePath}")
-    private String basePath;
-
-
-    @Override
-    public ForestAddress getAddress(ForestRequest forestRequest) {
-        return new ForestAddress("","",null,basePath);
-    }
-}

+ 3 - 0
src/main/java/com/fdkankan/fusion/httpClient/client/FdKKClient.java

@@ -107,4 +107,7 @@ public interface FdKKClient {
      */
     @Post("/api/user/scene/delete")
     void deleteNum(@JSONBody FdkkDelNumParam param, @Header("token")  String fdToken);
+
+    @Get("/service/manage/inner/copyScene")
+    JSONObject copyScene( @Query HashMap<String, Object> param ,@Header("sign") Long sign);
 }

+ 5 - 4
src/main/java/com/fdkankan/fusion/httpClient/client/LaserClient.java

@@ -1,9 +1,6 @@
 package com.fdkankan.fusion.httpClient.client;
 
-import com.dtflys.forest.annotation.Address;
-import com.dtflys.forest.annotation.Header;
-import com.dtflys.forest.annotation.JSONBody;
-import com.dtflys.forest.annotation.Post;
+import com.dtflys.forest.annotation.*;
 import com.fdkankan.fusion.httpClient.address.LaserAddressSource;
 import com.fdkankan.fusion.httpClient.request.LaserSceneParam;
 import com.fdkankan.fusion.httpClient.request.SSDownSceneParam;
@@ -49,4 +46,8 @@ public interface LaserClient {
      */
     @Post("/laser/4dage/downOfflineSceneStatus")
     FdkkResponse downOfflineSceneStatus(@JSONBody SSDownSceneParam param) ;
+
+
+    @Get("/laser/dataset/{num}/getDataSet")
+    FdkkResponse getSceneInfo(@Var("num")String num);
 }

+ 3 - 1
src/main/java/com/fdkankan/fusion/httpClient/request/FdkkCameraParam.java

@@ -16,6 +16,7 @@ public class FdkkCameraParam {
     private String snCode;
     private String userName;
     private String platform = "fusion";
+    private Integer cameraType;
 
     public FdkkCameraParam(Long cameraId) {
         this.cameraId = cameraId;
@@ -25,10 +26,11 @@ public class FdkkCameraParam {
         this.ids = ids;
     }
 
-    public FdkkCameraParam(String childName, String snCode,String userName) {
+    public FdkkCameraParam(String childName, String snCode,String userName,Integer cameraType) {
         this.childName = childName;
         this.snCode = snCode;
         this.userName = userName;
+        this.cameraType = cameraType;
     }
     public FdkkCameraParam(String childName, String snCode) {
         this.childName = childName;

+ 1 - 0
src/main/java/com/fdkankan/fusion/httpClient/request/FdkkLoginRequest.java

@@ -13,6 +13,7 @@ public class  FdkkLoginRequest {
     private String areaNum ="86";
     private String code;
     private String deptId;
+    private String clear;
 
     public FdkkLoginRequest(String phoneNum) {
         this.phoneNum = phoneNum;

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

@@ -0,0 +1,18 @@
+package com.fdkankan.fusion.mapper;
+
+import com.fdkankan.fusion.entity.CameraVersionApp;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 相机版本表 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2024-07-24
+ */
+@Mapper
+public interface ICameraVersionAppMapper extends BaseMapper<CameraVersionApp> {
+
+}

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

@@ -0,0 +1,18 @@
+package com.fdkankan.fusion.mapper;
+
+import com.fdkankan.fusion.entity.CameraVersion;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 相机版本表 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2024-07-23
+ */
+@Mapper
+public interface ICameraVersionMapper extends BaseMapper<CameraVersion> {
+
+}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

@@ -0,0 +1,18 @@
+package com.fdkankan.fusion.mapper;
+
+import com.fdkankan.fusion.entity.User;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 用户信息表 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2024-07-29
+ */
+@Mapper
+public interface IUserMapper extends BaseMapper<User> {
+
+}

+ 10 - 0
src/main/java/com/fdkankan/fusion/request/CameraVersionParam.java

@@ -0,0 +1,10 @@
+package com.fdkankan.fusion.request;
+
+import com.fdkankan.fusion.common.RequestBase;
+import lombok.Data;
+
+@Data
+public class CameraVersionParam  extends RequestBase {
+    private String version;
+    private Integer type;
+}

+ 22 - 0
src/main/java/com/fdkankan/fusion/request/CaseImgParam.java

@@ -0,0 +1,22 @@
+package com.fdkankan.fusion.request;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fdkankan.fusion.common.RequestBase;
+import com.fdkankan.fusion.entity.CaseImg;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class CaseImgParam extends RequestBase {
+    private Integer caseId;
+    private Integer status;
+
+    private Integer id;
+    private Integer sort;
+
+    private List<CaseImgParam> paramList;
+
+
+    private List<CaseImg> imgUrls;
+}

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

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

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

@@ -51,6 +51,8 @@ public class ProjectRequestDto extends RequestBase {
     private String accidentDateStart;
     private String accidentDateEnd;
 
+    private Integer isDelete = 0;
+
     public String getAccidentDateStart() {
         if(StringUtils.isNotBlank(accidentDate)){
            return accidentDate +" 00:00:00";

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

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

+ 8 - 0
src/main/java/com/fdkankan/fusion/response/BindCameraDto.java

@@ -10,4 +10,12 @@ public class BindCameraDto {
     private String deptId;
 
     private String userId;
+
+    /**
+     * 1		四维看看
+     * 9		四维看见
+     * 10		四维深时
+     * 11		四维深光
+     */
+    private Integer cameraType;
 }

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

@@ -0,0 +1,9 @@
+package com.fdkankan.fusion.response;
+
+import com.fdkankan.fusion.entity.CameraVersion;
+import lombok.Data;
+
+@Data
+public class CameraVersionVo extends CameraVersion {
+    private String createName;
+}

+ 118 - 0
src/main/java/com/fdkankan/fusion/response/CaseInquestVo.java

@@ -0,0 +1,118 @@
+package com.fdkankan.fusion.response;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+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.deepoove.poi.data.TableRenderData;
+import com.deepoove.poi.data.TextRenderData;
+import com.fdkankan.fusion.typehandle.JsonArrayTypeHandler;
+import com.fdkankan.fusion.typehandle.JsonObjTypeHandler;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class CaseInquestVo {
+
+    private Integer id;
+
+    private Integer caseId;
+
+    /**
+     * 勘验次数
+     */
+    private String count;
+
+    /**
+     * 勘验开始时间
+     */
+    private JSONObject startTime;
+
+    /**
+     * 勘验结束时间
+     */
+    private JSONObject endTime;
+
+    /**
+     * 勘验地点
+     */
+    private String address;
+
+    /**
+     * 勘验人员信息
+     */
+    private String userInfo;
+
+    /**
+     * 勘验气象条件
+     */
+    private String weather;
+
+    /**
+     * 勘验情况
+     */
+    private String situation;
+
+    /**
+     * 环境勘验
+     */
+    private String environment;
+
+    /**
+     * 初步勘验
+     */
+    private String firstInquest;
+
+    /**
+     * 细项勘验
+     */
+    private String carefulInquest;
+
+    /**
+     * 专项勘验
+     */
+    private String specialInquest;
+
+    /**
+     * 提取物品描述
+     */
+    private String itemDescription;
+
+    /**
+     * 现场拍照制图描述
+     */
+    private String imgDescription;
+
+    /**
+     * 负责人
+     */
+    private String leader;
+
+    /**
+     * 记录人
+     */
+    private String recorder;
+
+    /**
+     * 勘验人
+     */
+    private String inspector;
+
+    /**
+     * 证人信息数组
+     */
+    private JSONArray witnessInfo;
+
+    private Integer tbStatus;
+
+    private Date createTime;
+
+    private Date updateTime;
+
+    private TextRenderData text;
+
+    private String page = " ";
+}

+ 29 - 0
src/main/java/com/fdkankan/fusion/response/FileInfoVo.java

@@ -0,0 +1,29 @@
+package com.fdkankan.fusion.response;
+
+
+import cn.hutool.core.date.DateUtil;
+import com.fdkankan.fusion.common.util.DateUtils;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+@AllArgsConstructor
+public class FileInfoVo {
+
+    private String MD5;
+    private String SHA1;
+    private Long lastModified;
+    private Long size;
+
+    @Override
+    public String toString() {
+        return
+                "MD5:" + MD5 + '\n' +
+                "SHA1:" + SHA1 + '\n' +
+                "修改时间:" + DateUtil.format(new Date(lastModified),"yyyy-MM-dd HH:mm:ss") +'\n' +
+                "大小:" + size +"字节"
+                ;
+    }
+}

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

@@ -26,4 +26,9 @@ public class UserAddRequest extends RequestBase {
 
     //状态:1->可用;0->禁用
     private Integer status;
+
+    private String oldPassword;
+
+    private String clear;
+
 }

+ 39 - 0
src/main/java/com/fdkankan/fusion/response/WitnessVo.java

@@ -0,0 +1,39 @@
+package com.fdkankan.fusion.response;
+
+import lombok.Data;
+
+@Data
+public class WitnessVo {
+    //[{"name":"","year":"","month":"","day":"","id":""},{"name":"","year":"","month":"","day":"","id":""}]
+
+    private String name;
+    private String year;
+    private String month;
+    private String day;
+    private String id;
+    private String address;
+
+    public String getName() {
+        return name == null?"":name;
+    }
+
+    public String getYear() {
+        return year== null?"":year;
+    }
+
+    public String getMonth() {
+        return month== null?"":month;
+    }
+
+    public String getDay() {
+        return day== null?"":day;
+    }
+
+    public String getId() {
+        return id== null?"":id;
+    }
+
+    public String getAddress() {
+        return address== null?"":address;
+    }
+}

+ 28 - 0
src/main/java/com/fdkankan/fusion/service/ICameraVersionAppService.java

@@ -0,0 +1,28 @@
+package com.fdkankan.fusion.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fdkankan.fusion.entity.CameraVersion;
+import com.fdkankan.fusion.entity.CameraVersionApp;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fdkankan.fusion.request.CameraVersionParam;
+import com.fdkankan.fusion.response.CameraVersionVo;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 相机版本表 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2024-07-24
+ */
+public interface ICameraVersionAppService extends IService<CameraVersionApp> {
+
+    void addAndUpload(MultipartFile file, String version, String description, String minVersion, Integer type,String userName);
+
+    void updateByParam(CameraVersionApp param);
+
+    Page<CameraVersionApp> pageList(CameraVersionParam param);
+}

+ 24 - 0
src/main/java/com/fdkankan/fusion/service/ICameraVersionService.java

@@ -0,0 +1,24 @@
+package com.fdkankan.fusion.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fdkankan.fusion.entity.CameraVersion;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fdkankan.fusion.request.CameraVersionParam;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * <p>
+ * 相机版本表 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2024-07-23
+ */
+public interface ICameraVersionService extends IService<CameraVersion> {
+
+    void addAndUpload(MultipartFile file, String version, String description, String minVersion, Integer type,String userName);
+
+    void updateByParam(CameraVersion param);
+
+    Page<CameraVersion> pageList(CameraVersionParam param);
+}

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

@@ -0,0 +1,22 @@
+package com.fdkankan.fusion.service;
+
+import com.deepoove.poi.XWPFTemplate;
+import com.fdkankan.fusion.entity.CaseExtractDetail;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2024-07-05
+ */
+public interface ICaseExtractDetailService extends IService<CaseExtractDetail> {
+
+    CaseExtractDetail getByCaseId(Integer caseId);
+
+    void saveByParam(CaseExtractDetail caseExtractDetail);
+
+    XWPFTemplate getWordByTemplate(CaseExtractDetail caseExtractDetail);
+}

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


Some files were not shown because too many files changed in this diff