lyhzzz hace 1 año
padre
commit
5cfa5d3788
Se han modificado 42 ficheros con 1029 adiciones y 145 borrados
  1. 11 0
      pom.xml
  2. 9 8
      src/main/java/com/fdkankan/fusion/common/FilePath.java
  3. 18 2
      src/main/java/com/fdkankan/fusion/common/util/LocalToOssUtil.java
  4. 250 0
      src/main/java/com/fdkankan/fusion/common/util/MinIoUploadService.java
  5. 23 2
      src/main/java/com/fdkankan/fusion/common/util/ShellUtil.java
  6. 0 1
      src/main/java/com/fdkankan/fusion/common/util/VideoUtil.java
  7. 22 0
      src/main/java/com/fdkankan/fusion/config/MinIOConfig.java
  8. 1 1
      src/main/java/com/fdkankan/fusion/config/SaTokenConfigure.java
  9. 1 1
      src/main/java/com/fdkankan/fusion/controller/CameraVersionAppController.java
  10. 1 21
      src/main/java/com/fdkankan/fusion/controller/CaseExtractDetailController.java
  11. 1 23
      src/main/java/com/fdkankan/fusion/controller/CaseInquestController.java
  12. 17 0
      src/main/java/com/fdkankan/fusion/controller/CaseScriptController.java
  13. 13 2
      src/main/java/com/fdkankan/fusion/controller/DownOfflinePackageController.java
  14. 28 6
      src/main/java/com/fdkankan/fusion/controller/SceneController.java
  15. 2 2
      src/main/java/com/fdkankan/fusion/controller/SceneDownLogController.java
  16. 0 7
      src/main/java/com/fdkankan/fusion/controller/TestController.java
  17. 1 1
      src/main/java/com/fdkankan/fusion/controller/TmRoleController.java
  18. 3 3
      src/main/java/com/fdkankan/fusion/controller/TmUserController.java
  19. 325 43
      src/main/java/com/fdkankan/fusion/down/CaseDownService.java
  20. 46 0
      src/main/java/com/fdkankan/fusion/entity/CaseOffline.java
  21. 5 5
      src/main/java/com/fdkankan/fusion/generate/AutoGenerate.java
  22. 2 1
      src/main/java/com/fdkankan/fusion/httpClient/FdService.java
  23. 9 0
      src/main/java/com/fdkankan/fusion/httpClient/LaserService.java
  24. 5 4
      src/main/java/com/fdkankan/fusion/httpClient/client/LaserClient.java
  25. 1 0
      src/main/java/com/fdkankan/fusion/httpClient/request/FdkkLoginRequest.java
  26. 18 0
      src/main/java/com/fdkankan/fusion/mapper/ICaseOfflineMapper.java
  27. 3 0
      src/main/java/com/fdkankan/fusion/service/ICaseExtractDetailService.java
  28. 3 0
      src/main/java/com/fdkankan/fusion/service/ICaseInquestService.java
  29. 19 0
      src/main/java/com/fdkankan/fusion/service/ICaseOfflineService.java
  30. 2 0
      src/main/java/com/fdkankan/fusion/service/ICaseScriptService.java
  31. 2 2
      src/main/java/com/fdkankan/fusion/service/IDownService.java
  32. 33 0
      src/main/java/com/fdkankan/fusion/service/impl/CaseExtractDetailServiceImpl.java
  33. 37 0
      src/main/java/com/fdkankan/fusion/service/impl/CaseInquestServiceImpl.java
  34. 3 1
      src/main/java/com/fdkankan/fusion/service/impl/CaseNumServiceImpl.java
  35. 40 0
      src/main/java/com/fdkankan/fusion/service/impl/CaseOfflineServiceImpl.java
  36. 38 0
      src/main/java/com/fdkankan/fusion/service/impl/CaseScriptServiceImpl.java
  37. 8 1
      src/main/java/com/fdkankan/fusion/service/impl/DataService.java
  38. 9 5
      src/main/java/com/fdkankan/fusion/service/impl/DownService.java
  39. 2 3
      src/main/java/com/fdkankan/fusion/service/impl/SceneService.java
  40. 1 0
      src/main/java/com/fdkankan/fusion/service/impl/TmUserServiceImpl.java
  41. 12 0
      src/main/resources/application.yaml
  42. 5 0
      src/main/resources/mapper/fusion/CaseOfflineMapper.xml

+ 11 - 0
pom.xml

@@ -155,6 +155,17 @@
             <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>

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

@@ -4,19 +4,20 @@ public class FilePath {
 
     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 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 IMAGES_OSS_PATH = "fusion/%s/image/%s";
-    public final static String MODEL_OSS_PATH = "fusion/%s/model/%s";
-    public final static String DEFAULT_OSS_PATH = "fusion/default/%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 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 SCENE_LOCAL_PATH = LOCAL_BASE_PATH + "%s/scene/%s";
+    public final static String FFMPEG_IMG_PATH  = "/mnt/fusion/ffmpeg_imgs";
 
-    public final static String OFFLINE_PACKAGE_PATH = "/mnt/fusion/offline_package/%s";
+    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";
 }

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

@@ -102,8 +102,24 @@ public class LocalToOssUtil {
         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) {
-        String ossPath = getOssPath(bucket, filePath);
-        return new File(ossPath).length();
+        return getSizeCount( getOssPath(bucket, filePath));
     }
 }

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

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

@@ -58,7 +58,7 @@ public class ShellUtil {
                 String line = null;
                 try {
                     while((line = in.readLine()) != null) {
-                       log.info("output: " + line);
+                       log.debug("output: " + line);
                     }
                 }
                 catch (IOException e) {
@@ -81,7 +81,7 @@ public class ShellUtil {
                 String line = null;
                 try {
                     while((line = err.readLine()) != null) {
-                        log.info("err: " + line);
+                        log.debug("err: " + line);
                     }
                 }
                 catch (IOException e) {
@@ -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;
@@ -171,4 +186,10 @@ public class ShellUtil {
         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);
+    }
 }

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

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

@@ -51,7 +51,7 @@ public class SaTokenConfigure {
                     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") );
 
                     // 登录认证 -- 拦截所有路由,并排除/user/doLogin 用于开放登录
                     SaRouter.match("/**", "/fdLogin", r ->checkLogin() );

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

@@ -53,7 +53,7 @@ public class CameraVersionAppController {
                              @RequestParam("version") String version,
                              @RequestParam("description") String description,
                              @RequestParam("minVersion") String minVersion,
-                             @RequestParam(value = "type",defaultValue = "1") Integer type) throws IOException {
+                             @RequestParam(value = "type",defaultValue = "0") Integer type) throws IOException {
         cameraVersionAppService.addAndUpload(file,version,description,minVersion,type);
         return ResultData.ok();
     }

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

@@ -67,28 +67,8 @@ public class CaseExtractDetailController {
             throw new BusinessException(ResultCode.INQUEST_ERROR2);
         }
 
-        InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("template/extract-template.docx");
-        // 渲染模板
-
-        // 定义行循环插件
-        LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
-        /**
-         * [{"num":"331","part":"3131","name":"222","id":"1","spec":"222","desc":"313"},{"num":"22","part":"1","name":"222","id":"2","spec":"33","desc":"vvvv "}]
-         * [{"address":"222","name":"111","id":"","workplace":"222"},{"address":"22222","name":"333","id":"","workplace":"444"}]
-         * [{"name":"2221","address":"222","phone":"2221","id":"2221"},{"name":"222","address":"2111122","phone":"2","id":"222"}]
-         */
-        JSONArray detail = caseExtractDetail.getDetail();
-        Integer index = 0;
-        for (Object object : detail) {
-            index ++;
-            JSONObject jsonObject = (JSONObject) object;
-            jsonObject.put("index",index);
+        XWPFTemplate template = caseExtractDetailService.getWordByTemplate(caseExtractDetail);
 
-        }
-        Configure config = Configure.builder()
-                .bind("detail", policy).bind("extractUser", policy).bind("witnessInfo", policy).build();
-
-        XWPFTemplate template = XWPFTemplate.compile(inputStream,config).render(caseExtractDetail);
 
         // 设置响应头,指定文件类型和内容长度
         res.setContentType("application/octet-stream");

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

@@ -63,29 +63,7 @@ public class CaseInquestController {
         if(caseInquest == null){
             throw new BusinessException(ResultCode.INQUEST_ERROR2);
         }
-
-        InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("template/inquest-template.docx");
-        // 渲染模板
-
-        CaseInquestVo vo = new CaseInquestVo();
-        BeanUtils.copyProperties(caseInquest,vo);
-
-
-        String info = "证人或当事人(签名):%s  %s年 %s月 %s日 身份证件号码:%s\n"
-                +"   单位或住址:%s\n";
-        StringBuilder msg = new StringBuilder();
-        for (Object object : vo.getWitnessInfo()) {
-            JSONObject obj = (JSONObject) object;
-            WitnessVo witnessVo = JSONObject.toJavaObject(obj,WitnessVo.class);
-            String format = String.format(info, witnessVo.getName(), witnessVo.getYear(), witnessVo.getMonth(), witnessVo.getDay(), witnessVo.getId(), witnessVo.getAddress());
-            msg.append(format);
-        }
-        TextRenderData text = new TextRenderData("000000",msg.toString());
-        Style style = text.getStyle();
-        style.setUnderlinePatterns(UnderlinePatterns.SINGLE);
-        vo.setText(text);
-
-        XWPFTemplate template = XWPFTemplate.compile(inputStream).render(vo);
+        XWPFTemplate template = caseInquestService.getWordByTemplate(caseInquest);
 
         // 设置响应头,指定文件类型和内容长度
         res.setContentType("application/octet-stream");

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

@@ -1,14 +1,22 @@
 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>
  *  前端控制器
@@ -38,5 +46,14 @@ public class CaseScriptController {
         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));
+    }
 }
 

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

@@ -3,6 +3,7 @@ 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.*;
 
@@ -22,10 +23,20 @@ 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.createDataJson(caseId);
-        return ResultData.ok();
+        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));
     }
 }
 

+ 28 - 6
src/main/java/com/fdkankan/fusion/controller/SceneController.java

@@ -4,6 +4,7 @@ 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;
@@ -72,28 +73,49 @@ public class SceneController extends BaseController{
 
     @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 {
-            String sceneObjPath = String.format(FilePath.OBJ_OSS_PATH, num)+"/data/scene.json" ;
-
-            FileInfoVo fileInfo = uploadToOssUtil.getFileInfo(sceneObjPath);
+            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);
             }
-            String scenePath = String.format(FilePath.OBJ_OSS_PATH, num);
-            Long size = uploadToOssUtil.getSize(scenePath);
             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();

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

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

@@ -52,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(){

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

@@ -36,7 +36,7 @@ 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());
         }
         return ResultData.ok(tmRoleService.list(wrapper));

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

@@ -108,9 +108,9 @@ public class TmUserController {
             throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
         }
         param.setClear("YES");
-        param.setPassword("Xj123456");
-        param.setConfirmPwd("Xj123456");
-        param.setOldPassword("Xj123456");
+        param.setPassword("Xj12345678");
+        param.setConfirmPwd("Xj12345678");
+        param.setOldPassword("Xj12345678");
         tmUserService.changePassword(param);
         return ResultData.ok();
     }

+ 325 - 43
src/main/java/com/fdkankan/fusion/down/CaseDownService.java

@@ -2,26 +2,39 @@ 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.StringUtils;
-import com.fdkankan.fusion.controller.*;
-import com.fdkankan.fusion.entity.CaseFusion;
-import com.fdkankan.fusion.entity.CaseTag;
-import com.fdkankan.fusion.entity.CaseVideoFolder;
-import com.fdkankan.fusion.entity.FusionGuide;
+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}")
@@ -48,6 +61,7 @@ public class CaseDownService {
 
     public static String model =      "/model/getInfo?modelId=";
 
+    public static String laserData = "/laser/dataset/%s/getDataSet";
 
     @Autowired
     ICaseService caseService;
@@ -83,76 +97,344 @@ public class CaseDownService {
     IFusionMeterService fusionMeterService;
     @Autowired
     IModelService modelService;
+    @Autowired
+    LaserService laserService;
+    @Autowired
+    ICaseOfflineService caseOfflineService;
+
+    @Autowired
+    RedisUtil redisUtil;
+
+    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 {
+            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);
+            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){
+        log.info("down-offline-process:{},{},{}",caseId,num,url);
+        String redisKey = String.format(downProcessKey, caseId);
+        DownloadProcessVo processVo = new DownloadProcessVo();
+        processVo.setStatus(status);
+        processVo.setPercent(num);
+        processVo.setUrl(queryPath + 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)));
+        //设置案件信息
+        jsonObject.put(basePath+caseInfo+caseId, ResultData.ok(caseService.getInfo(caseId)));
 
-        jsonObject.put(basePath+caseSettingsInfo+caseId,
-                ResultData.ok(caseSettingsService.getByCaseId(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));
+        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)));
+            jsonObject.put(basePath+fusionMeter+fusion.getFusionId(), ResultData.ok(fusionMeterService.getListByFusionId(fusion.getFusionId(),null)));
+            jsonObject.put(basePath+model+fusion.getModelId(), ResultData.ok(modelService.getInfo(fusion.getModelId())));
 
-            jsonObject.put(basePath+model+fusion.getModelId(),
-                    ResultData.ok(modelService.getInfo(fusion.getModelId())));
+            //下载模型
+            SceneVo sceneData = fusion.getSceneData();
+            if(StringUtils.isNotBlank(sceneData.getModelGlbUrl())){
+                downModel(caseId,sceneData.getModelGlbUrl());
+            }
+            if(sceneData.getType() != 3){
+                //下载场景离线包
+                downSwkk(caseId,sceneData.getNum(),sceneData.getType());
+            }
+            if(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);
+                }
+
+            }
         }
 
-        jsonObject.put(basePath+caseScene+caseId,
-                ResultData.ok(caseService.sceneList(param)));
+        jsonObject.put(basePath+caseScene+caseId, ResultData.ok(caseService.sceneList(param)));
 
-        jsonObject.put(basePath+caseView+caseId,
-                ResultData.ok(caseViewService.allList(caseId,null,null,null,null)));
+        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));
+        jsonObject.put(basePath+caseVideoFolder+caseId, ResultData.ok(videoFolders));
         for (CaseVideoFolder videoFolder : videoFolders) {
-            jsonObject.put(basePath+caseVideo+videoFolder.getVideoFolderId(),
-                    ResultData.ok(caseVideoService.getAllList(videoFolder.getVideoFolderId())));
+            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) {
+            downResource(caseId,files.getFilesUrl());
         }
+        jsonObject.put(basePath+caseFiles+caseId, ResultData.ok(caseFilesList));
 
-        jsonObject.put(basePath+caseFiles+caseId,
-                ResultData.ok(caseFilesService.allList(caseId,null)));
 
-        jsonObject.put(basePath+caseFilesType+caseId,
-                ResultData.ok(caseFilesTypeService.list()));
+        jsonObject.put(basePath+caseFilesType+caseId, ResultData.ok(caseFilesTypeService.list()));
 
-        jsonObject.put(basePath+hostIcon+caseId,
-                ResultData.ok(hotIconService.getListByCaseId(caseId)));
+        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));
+        jsonObject.put(basePath+caseTag+caseId, ResultData.ok(caseTagList));
         for (CaseTag tag : caseTagList) {
-            jsonObject.put(basePath+caseTagPoint+tag.getTagId(),
-                    ResultData.ok(caseTagPointService.allList(tag.getTagId())));
+            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));
+        jsonObject.put(basePath+fusionGuide+caseId, ResultData.ok(fusionGuides));
 
         for (FusionGuide guide : fusionGuides) {
-            jsonObject.put(basePath+fusionGuidePath+guide.getFusionGuideId(),
-                    ResultData.ok(fusionGuidePathService.getListByGuideId(guide.getFusionGuideId())));
+            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));
 
-        jsonObject.put(basePath+caseInquest+caseId,
-                ResultData.ok(caseInquestService.getByCaseId(caseId)));
+        FileUtil.writeString(JSON.toJSONString(jsonObject), FilePath.OFFLINE_PACKAGE_PATH+caseId+"/www/package/"+jsonDataName,"UTF-8");
 
-        jsonObject.put(basePath+caseExtractDetail+caseId,
-                ResultData.ok(caseExtractDetailService.getByCaseId(caseId)));
+    }
+
+
+
+
+    //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);
 
-        FileUtil.writeString(JSON.toJSONString(jsonObject), String.format(FilePath.OFFLINE_PACKAGE_PATH,caseId)+ File.separator+jsonDataName,"UTF-8");
+               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);
+        }
+    }
+
+
+
 }

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

+ 5 - 5
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_version_app"
+               "t_case_offline"
         }));
 
 //        generate(path,"goods", getTables(new String[]{
@@ -46,10 +46,10 @@ public class AutoGenerate {
 
 
     public static void  generate(String path,String moduleName,  List<String> tables){
-//        FastAutoGenerator.create("jdbc:mysql://120.25.146.52:13306/fd_fusion_xj",
-//                "root","JK123456%JIK")
-        FastAutoGenerator.create("jdbc:mysql://120.24.144.164:3306/4dkankan_v4",
-                "root","4Dage@4Dage#@168")
+        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 -> {
                     builder.author("")               //作者
                             .outputDir(path+"\\src\\main\\java")    //输出路径(写到java目录)

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

@@ -132,8 +132,9 @@ public class FdService {
         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(ResultCode.CAMERA_SPACE_ERROR);
+            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;
+    }
 }

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

+ 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/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> {
+
+}

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

@@ -1,5 +1,6 @@
 package com.fdkankan.fusion.service;
 
+import com.deepoove.poi.XWPFTemplate;
 import com.fdkankan.fusion.entity.CaseExtractDetail;
 import com.baomidou.mybatisplus.extension.service.IService;
 
@@ -16,4 +17,6 @@ public interface ICaseExtractDetailService extends IService<CaseExtractDetail> {
     CaseExtractDetail getByCaseId(Integer caseId);
 
     void saveByParam(CaseExtractDetail caseExtractDetail);
+
+    XWPFTemplate getWordByTemplate(CaseExtractDetail caseExtractDetail);
 }

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

@@ -1,5 +1,6 @@
 package com.fdkankan.fusion.service;
 
+import com.deepoove.poi.XWPFTemplate;
 import com.fdkankan.fusion.entity.CaseInquest;
 import com.baomidou.mybatisplus.extension.service.IService;
 
@@ -16,4 +17,6 @@ public interface ICaseInquestService extends IService<CaseInquest> {
     CaseInquest getByCaseId(Integer caseId);
 
     void saveByParam(CaseInquest caseInquest);
+
+    XWPFTemplate getWordByTemplate(CaseInquest caseInquest);
 }

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

@@ -0,0 +1,19 @@
+package com.fdkankan.fusion.service;
+
+import com.fdkankan.fusion.entity.CaseOffline;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2024-07-26
+ */
+public interface ICaseOfflineService extends IService<CaseOffline> {
+
+    void saveByCase(Integer caseId, String ossUrl);
+
+    CaseOffline getByCaseId(Integer caseId);
+}

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

@@ -16,4 +16,6 @@ public interface ICaseScriptService extends IService<CaseScript> {
     CaseScript getByCaseId(Integer caseId);
 
     void saveByParam(CaseScript caseScript);
+
+    String getFfmpegVideoImage(String videoPath, String width, String high);
 }

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

@@ -6,9 +6,9 @@ import com.fdkankan.fusion.response.DownloadProcessVo;
 
 public interface IDownService {
 
-    DownVo checkDownLoad(String sceneNum, Integer isObj);
+    DownVo checkDownLoad(String sceneNum, Integer isObj,String type);
 
-    DownVo down(String sceneNum,Integer isObj);
+    DownVo down(String sceneNum,Integer isObj,String type);
 
     DownloadProcessVo downloadProcess(String num, Integer isObj);
 }

+ 33 - 0
src/main/java/com/fdkankan/fusion/service/impl/CaseExtractDetailServiceImpl.java

@@ -1,6 +1,11 @@
 package com.fdkankan.fusion.service.impl;
 
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy;
 import com.fdkankan.fusion.common.ResultCode;
 import com.fdkankan.fusion.entity.CaseExtractDetail;
 import com.fdkankan.fusion.entity.CaseInquest;
@@ -10,6 +15,8 @@ import com.fdkankan.fusion.service.ICaseExtractDetailService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.stereotype.Service;
 
+import java.io.InputStream;
+
 /**
  * <p>
  *  服务实现类
@@ -39,4 +46,30 @@ public class CaseExtractDetailServiceImpl extends ServiceImpl<ICaseExtractDetail
         }
         this.saveOrUpdate(caseExtractDetail);
     }
+
+    @Override
+    public XWPFTemplate getWordByTemplate(CaseExtractDetail caseExtractDetail) {
+        InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("template/extract-template.docx");
+        // 渲染模板
+
+        // 定义行循环插件
+        LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
+        /**
+         * [{"num":"331","part":"3131","name":"222","id":"1","spec":"222","desc":"313"},{"num":"22","part":"1","name":"222","id":"2","spec":"33","desc":"vvvv "}]
+         * [{"address":"222","name":"111","id":"","workplace":"222"},{"address":"22222","name":"333","id":"","workplace":"444"}]
+         * [{"name":"2221","address":"222","phone":"2221","id":"2221"},{"name":"222","address":"2111122","phone":"2","id":"222"}]
+         */
+        JSONArray detail = caseExtractDetail.getDetail();
+        Integer index = 0;
+        for (Object object : detail) {
+            index ++;
+            JSONObject jsonObject = (JSONObject) object;
+            jsonObject.put("index",index);
+
+        }
+        Configure config = Configure.builder()
+                .bind("detail", policy).bind("extractUser", policy).bind("witnessInfo", policy).build();
+
+        return XWPFTemplate.compile(inputStream,config).render(caseExtractDetail);
+    }
 }

+ 37 - 0
src/main/java/com/fdkankan/fusion/service/impl/CaseInquestServiceImpl.java

@@ -1,14 +1,24 @@
 package com.fdkankan.fusion.service.impl;
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.data.TextRenderData;
+import com.deepoove.poi.data.style.Style;
 import com.fdkankan.fusion.common.ResultCode;
 import com.fdkankan.fusion.entity.CaseInquest;
 import com.fdkankan.fusion.exception.BusinessException;
 import com.fdkankan.fusion.mapper.ICaseInquestMapper;
+import com.fdkankan.fusion.response.CaseInquestVo;
+import com.fdkankan.fusion.response.WitnessVo;
 import com.fdkankan.fusion.service.ICaseInquestService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.apache.poi.xwpf.usermodel.UnderlinePatterns;
+import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 
+import java.io.InputStream;
+
 /**
  * <p>
  *  服务实现类
@@ -40,4 +50,31 @@ public class CaseInquestServiceImpl extends ServiceImpl<ICaseInquestMapper, Case
         this.saveOrUpdate(caseInquest);
 
     }
+
+    @Override
+    public XWPFTemplate getWordByTemplate(CaseInquest caseInquest) {
+
+        InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("template/inquest-template.docx");
+        // 渲染模板
+
+        CaseInquestVo vo = new CaseInquestVo();
+        BeanUtils.copyProperties(caseInquest,vo);
+
+        String info = "证人或当事人(签名):%s  %s年 %s月 %s日 身份证件号码:%s\n"
+                +"   单位或住址:%s\n";
+        StringBuilder msg = new StringBuilder();
+        for (Object object : vo.getWitnessInfo()) {
+            JSONObject obj = (JSONObject) object;
+            WitnessVo witnessVo = JSONObject.toJavaObject(obj,WitnessVo.class);
+            String format = String.format(info, witnessVo.getName(), witnessVo.getYear(), witnessVo.getMonth(), witnessVo.getDay(), witnessVo.getId(), witnessVo.getAddress());
+            msg.append(format);
+        }
+        TextRenderData text = new TextRenderData("000000",msg.toString());
+        Style style = text.getStyle();
+        style.setUnderlinePatterns(UnderlinePatterns.SINGLE);
+        vo.setText(text);
+
+        XWPFTemplate template = XWPFTemplate.compile(inputStream).render(vo);
+        return template;
+    }
 }

+ 3 - 1
src/main/java/com/fdkankan/fusion/service/impl/CaseNumServiceImpl.java

@@ -95,7 +95,7 @@ public class CaseNumServiceImpl extends ServiceImpl<ICaseNumMapper, CaseNumEntit
                     continue;
                 }
                 Model model = modelService.getIsNullNewByNum(num,param.getType());
-                if(model.getModelId() != null && StringUtils.isNotBlank(model.getModelGlbUrl())){
+                if(model.getModelId() != null && StringUtils.isNotBlank(model.getModelGlbUrl()) && StringUtils.isNotBlank(model.getModelSize())){
                     continue;
                 }
                 model.setModelDateType("obj");
@@ -104,10 +104,12 @@ public class CaseNumServiceImpl extends ServiceImpl<ICaseNumMapper, CaseNumEntit
                 model.setCreateStatus(1);
                 if(param.getType() == 0 || param.getType() == 1 || param.getType() == 4 || param.getType() == 6){           //看看,看见
                     String mesh3DtilesPath  = String.format(FilePath.OBJ_OSS_PATH,num) + "/images/3dtiles/tileset.json";
+                    String sizePath = String.format(FilePath.OBJ_OSS_PATH,num) + "/images/3dtiles";
                     if(uploadToOssUtil.existKey(mesh3DtilesPath)){
                         model.setModelDateType("b3dm");
                         model.setModelType("b3dm");
                         model.setModelGlbUrl(JSONArray.toJSONString(Arrays.asList(queryPath +mesh3DtilesPath)));
+                        model.setModelSize(FileWriterUtil.setFileSize(uploadToOssUtil.getSize( sizePath)));
                     }else {
                         model.setCreateStatus(2);
                         threadService.objToB3dm(num,param.getType());

+ 40 - 0
src/main/java/com/fdkankan/fusion/service/impl/CaseOfflineServiceImpl.java

@@ -0,0 +1,40 @@
+package com.fdkankan.fusion.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fdkankan.fusion.entity.CaseOffline;
+import com.fdkankan.fusion.mapper.ICaseOfflineMapper;
+import com.fdkankan.fusion.service.ICaseOfflineService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2024-07-26
+ */
+@Service
+public class CaseOfflineServiceImpl extends ServiceImpl<ICaseOfflineMapper, CaseOffline> implements ICaseOfflineService {
+
+    @Override
+    public void saveByCase(Integer caseId, String ossUrl) {
+        CaseOffline caseOffline = this.getByCaseId(caseId);
+        if(caseOffline == null){
+            caseOffline = new CaseOffline();
+        }
+        caseOffline.setId(null);
+        caseOffline.setCaseId(caseId);
+        caseOffline.setOfflineUrl(ossUrl);
+        caseOffline.setVersion(caseOffline.getVersion() == null ? 0: caseOffline.getVersion() + 1);
+        this.save(caseOffline);
+    }
+
+    @Override
+    public CaseOffline getByCaseId(Integer caseId) {
+        LambdaQueryWrapper<CaseOffline> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(CaseOffline::getCaseId,caseId);
+        return this.getOne(wrapper);
+    }
+}

+ 38 - 0
src/main/java/com/fdkankan/fusion/service/impl/CaseScriptServiceImpl.java

@@ -1,15 +1,26 @@
 package com.fdkankan.fusion.service.impl;
 
+import cn.hutool.core.io.FileUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fdkankan.fusion.common.FilePath;
 import com.fdkankan.fusion.common.ResultCode;
+import com.fdkankan.fusion.common.util.ShellUtil;
+import com.fdkankan.fusion.common.util.UploadToOssUtil;
+import com.fdkankan.fusion.common.util.VideoUtil;
 import com.fdkankan.fusion.entity.CaseExtractDetail;
 import com.fdkankan.fusion.entity.CaseScript;
 import com.fdkankan.fusion.exception.BusinessException;
 import com.fdkankan.fusion.mapper.ICaseScriptMapper;
 import com.fdkankan.fusion.service.ICaseScriptService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
+import java.io.File;
+import java.util.UUID;
+
 /**
  * <p>
  *  服务实现类
@@ -39,4 +50,31 @@ public class CaseScriptServiceImpl extends ServiceImpl<ICaseScriptMapper, CaseSc
         }
         this.saveOrUpdate(caseScript);
     }
+
+
+    @Value("${upload.query-path}")
+    private String queryPath;
+    @Autowired
+    UploadToOssUtil uploadToOssUtil;
+    @Override
+    public String getFfmpegVideoImage(String videoPath, String width, String high) {
+        if(StringUtils.isBlank(videoPath) || !videoPath.contains(".")){
+            throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
+        }
+        if(!uploadToOssUtil.existKey(videoPath.replace(queryPath,""))){
+            throw new BusinessException(ResultCode.FILE_NOT_EXIST);
+        }
+        String[] split = videoPath.split("\\.");
+        String localPath = FilePath.FFMPEG_IMG_PATH  + File.separator + "."+split[split.length -1];
+        ShellUtil.yunDownload(videoPath.replace(queryPath,""),localPath);
+
+        String name = UUID.randomUUID().toString().replace("-","")+".jpg";
+        String path = FilePath.FFMPEG_IMG_PATH  + File.separator + name;
+        VideoUtil.ffmpegVideo(localPath,FilePath.FFMPEG_IMG_PATH  +"/"+ name,width,high);
+        ShellUtil.yunUpload(path,path.replace("/mnt/",""));
+
+        FileUtil.del(localPath);
+        FileUtil.del(path);
+        return queryPath + path.replace("/mnt/","");
+    }
 }

+ 8 - 1
src/main/java/com/fdkankan/fusion/service/impl/DataService.java

@@ -1,10 +1,12 @@
 package com.fdkankan.fusion.service.impl;
 
+import com.fdkankan.fusion.common.ResultCode;
 import com.fdkankan.fusion.common.util.CameraUtil;
 import com.fdkankan.fusion.common.util.DataUtil;
 import com.fdkankan.fusion.common.util.DateUtils;
 import com.fdkankan.fusion.entity.TmCamera;
 import com.fdkankan.fusion.entity.TmDepartment;
+import com.fdkankan.fusion.exception.BusinessException;
 import com.fdkankan.fusion.request.DataParam;
 import com.fdkankan.fusion.response.DataGroupVo;
 import com.fdkankan.fusion.service.*;
@@ -115,7 +117,12 @@ public class DataService implements IDataService {
         List<TmDepartment> deptList = tmDepartmentService.getDeptList();
         TmDepartment department1 = deptList.get(0);
         if(department1.getParentId() == null){  //超管
-            return department1.getChildren().get(0).getChildren();
+            List<TmDepartment> departments = department1.getChildren();
+            List<TmDepartment> collect = departments.stream().filter(e -> e.getId().equals("1")).collect(Collectors.toList());
+            if(collect == null || collect.isEmpty()){
+                throw new BusinessException(ResultCode.DEPT_NOT_EXITS);
+            }
+            return collect.get(0).getChildren();
         }
         if(department1.getChildren()!= null && department1.getChildren().size() >0){  //总队
             List<TmDepartment> departments = new ArrayList<>();

+ 9 - 5
src/main/java/com/fdkankan/fusion/service/impl/DownService.java

@@ -65,7 +65,7 @@ public class DownService implements IDownService {
     }
 
     @Override
-    public DownVo checkDownLoad(String sceneNum, Integer isObj) {
+    public DownVo checkDownLoad(String sceneNum, Integer isObj,String type) {
         if(StringUtils.isEmpty(sceneNum)){
             throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
         }
@@ -95,7 +95,7 @@ public class DownService implements IDownService {
             redisUtil.del(String.format(redisKey,sceneNum));  // 清除旧的下载信息
             return downVo;
         }
-        saveLog(plus,sceneVersion);
+        saveLog(plus,sceneVersion,type);
         //3下载过,并且没有修改过
         downVo.setDownloadStatus(3);
         downVo.setDownloadUrl(sceneDownloadLog.getDownUrl());
@@ -105,7 +105,7 @@ public class DownService implements IDownService {
 
 
     @Override
-    public DownVo down(String sceneNum,Integer isObj) {
+    public DownVo down(String sceneNum,Integer isObj,String type) {
         if(StringUtils.isEmpty(sceneNum) ){
             throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
         }
@@ -119,7 +119,7 @@ public class DownService implements IDownService {
         Integer sceneType =  scenePlus.getSceneSource();
         Integer sceneVersion = getSceneVersion( scenePlus);
         log.info("down--sceneType:{},isObj:{}",sceneType,isObj);
-        saveLog(scenePlus,sceneVersion);
+        saveLog(scenePlus,sceneVersion,type);
         if((sceneType == 4 || sceneType == 5) && isObj !=1){ //深时场景
             return SSDownload(sceneNum,userId);
         }
@@ -138,7 +138,11 @@ public class DownService implements IDownService {
         return downVo;
     }
 
-    private void saveLog(ScenePlus scenePlus,Integer sceneVersion){
+    private void saveLog(ScenePlus scenePlus,Integer sceneVersion,String type){
+        //离线包调用,不记录场景下载日志
+        if("offline".equals(type)){
+            return;
+        }
         String userName =  (String) StpUtil.getExtra("userName");
         String nickName =  (String) StpUtil.getExtra("nickName");
         String deptId = tmDepartmentService.getDeptId();

+ 2 - 3
src/main/java/com/fdkankan/fusion/service/impl/SceneService.java

@@ -86,9 +86,8 @@ public class SceneService implements ISceneService {
            throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
         }
         List<TmCamera> tmCameraList = null;
-        String tokenValue = StpUtil.getTokenValue();
 
-        if(StringUtils.isNotBlank(tokenValue) && StringUtils.isBlank(param.getShare()) ){
+        if(StringUtils.isBlank(param.getShare() ) && StringUtils.isNotBlank(StpUtil.getTokenValue()) ){
             tmCameraList = tmCameraService.getByDeptIds();
             List<String> snCodes = tmCameraList.stream().map(TmCamera::getCameraSn).collect(Collectors.toList());
             if(CollectionUtil.isNotEmpty(snCodes)){
@@ -135,7 +134,7 @@ public class SceneService implements ISceneService {
         }
 
         if(CollectionUtil.isEmpty(param.getSnCodes()) && CollectionUtil.isEmpty(param.getNumList())){
-            if(StpUtil.hasRole("admin-super") && StringUtils.isBlank(param.getSnCode())){
+            if(StpUtil.hasRole("admin-super") && StringUtils.isBlank(param.getSnCode()) && StringUtils.isBlank(param.getDeptId())){
                 List<TmCamera> tmCameras = tmCameraService.list();
                 Set<String> snCodeSet = tmCameras.parallelStream().map(TmCamera::getCameraSn).collect(Collectors.toSet());
                 param.setSnCodes(new ArrayList<>(snCodeSet));

+ 1 - 0
src/main/java/com/fdkankan/fusion/service/impl/TmUserServiceImpl.java

@@ -207,6 +207,7 @@ public class TmUserServiceImpl extends ServiceImpl<ITmUserMapper, TmUser> implem
         }
 
         FdkkLoginRequest request = new FdkkLoginRequest(param.getUserName(),param.getPassword(),param.getConfirmPwd());
+        request.setClear(param.getClear());
         FdkkResponse fdkkResponse = fdKKClient.fdkkChangePassword(request);
         if(fdkkResponse.getCode() != 0){
             throw new BusinessException(fdkkResponse.getCode(),fdkkResponse.getMsg());

+ 12 - 0
src/main/resources/application.yaml

@@ -23,11 +23,13 @@ spring:
         db1:
           driver-class-name: com.mysql.jdbc.Driver
           #url: jdbc:mysql://120.25.146.52:13306/fd_fusion?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true
+          #url: jdbc:mysql://192.168.0.25:3306/fd_fusion_xj?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true
           url: jdbc:mysql://127.0.0.1:3306/fd_fusion_xj?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true
           username: root
           password: mysql123!ROOT.
         db2:
           driver-class-name: com.mysql.jdbc.Driver
+          #url: jdbc:mysql://192.168.0.25:3306/4dkankan_v4?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true
           url: jdbc:mysql://127.0.0.1:3306/4dkankan_v4?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true
           username: root
           password: mysql123!ROOT.
@@ -114,3 +116,13 @@ sa-token:
 fdkk:
   register:
     validCode: 2a22bac40f44af4d3b5fdc20ea706fc5
+
+# MinIO 配置
+minio:
+  endpoint: http://127.0.0.1:9000      # MinIO服务地址
+  fileHost: http://127.0.0.1:9000      # 文件地址host
+  bucketName: laser-data                      # 存储桶bucket名称
+  accessKey: Ux8mKEBFj4j2N63Kdj5g                         # 用户名
+  secretKey: cPA5XSYcDzTCIHbeBxaSqzt9ZQjLZFbgQe38EiRW      # 密码
+
+

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

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