wuweihao пре 4 година
родитељ
комит
ffd098f2fa
20 измењених фајлова са 869 додато и 49 уклоњено
  1. 22 0
      laser/pom.xml
  2. 32 0
      laser/src/main/java/com/fdkankan/indoor/base/constant/CmdConstant.java
  3. 17 17
      laser/src/main/java/com/fdkankan/indoor/base/constant/ConfigConstant.java
  4. 261 0
      laser/src/main/java/com/fdkankan/indoor/base/util/AliYunOssUtil.java
  5. 114 0
      laser/src/main/java/com/fdkankan/indoor/base/util/CmdUtils.java
  6. 79 0
      laser/src/main/java/com/fdkankan/indoor/base/util/StreamGobblerLine.java
  7. 14 5
      laser/src/main/java/com/fdkankan/indoor/core/controller/ControlPointController.java
  8. 2 1
      laser/src/main/java/com/fdkankan/indoor/core/controller/FilterController.java
  9. 5 5
      laser/src/main/java/com/fdkankan/indoor/core/controller/InitController.java
  10. 11 0
      laser/src/main/java/com/fdkankan/indoor/core/controller/TestController.java
  11. 3 1
      laser/src/main/java/com/fdkankan/indoor/core/mapper/InitMapper.java
  12. 2 0
      laser/src/main/java/com/fdkankan/indoor/core/service/ControlPointService.java
  13. 1 0
      laser/src/main/java/com/fdkankan/indoor/core/service/FilterService.java
  14. 7 0
      laser/src/main/java/com/fdkankan/indoor/core/service/InitService.java
  15. 26 7
      laser/src/main/java/com/fdkankan/indoor/core/service/impl/ControlPointServiceImpl.java
  16. 145 8
      laser/src/main/java/com/fdkankan/indoor/core/service/impl/FilterServiceImpl.java
  17. 102 3
      laser/src/main/java/com/fdkankan/indoor/core/service/impl/InitServiceImpl.java
  18. 11 1
      laser/src/main/resources/application-dev.properties
  19. 11 1
      laser/src/main/resources/application-test.properties
  20. 4 0
      laser/src/main/resources/data/ossupload.sh

+ 22 - 0
laser/pom.xml

@@ -22,6 +22,9 @@
 		<hutool.version>5.3.3</hutool.version>
 		<jwt.version>3.2.0</jwt.version>
 		<jjwt.version>0.6.0</jjwt.version>
+		<aliyun.core.version>4.0.3</aliyun.core.version>
+		<aliyun.dysmsapi.version>1.1.0</aliyun.dysmsapi.version>
+		<aliyun.oss.version>2.5.0</aliyun.oss.version>
 		<spring.boot.version>2.3.4.RELEASE</spring.boot.version>
 	</properties>
 
@@ -154,6 +157,25 @@
 			<!--<version>2.3</version>-->
 		<!--</dependency>-->
 
+		<!--aliyun sdk-->
+		<dependency>
+			<groupId>com.aliyun</groupId>
+			<artifactId>aliyun-java-sdk-core</artifactId>
+			<version>${aliyun.core.version}</version>
+		</dependency>
+
+		<dependency>
+			<groupId>com.aliyun</groupId>
+			<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
+			<version>${aliyun.dysmsapi.version}</version>
+		</dependency>
+
+		<!--aliyun oss-->
+		<dependency>
+			<groupId>com.aliyun.oss</groupId>
+			<artifactId>aliyun-sdk-oss</artifactId>
+			<version>${aliyun.oss.version}</version>
+		</dependency>
 
 	</dependencies>
 

+ 32 - 0
laser/src/main/java/com/fdkankan/indoor/base/constant/CmdConstant.java

@@ -0,0 +1,32 @@
+package com.fdkankan.indoor.base.constant;
+
+
+/**
+ * Created by owen on 2020/12/31 0031 14:22
+ *
+ */
+public class CmdConstant {
+
+
+    /**
+     * ossUtil上传目录
+     * ./ossutil cp -r localfolder/ oss://examplebucket/desfolder/
+     * opt/ossutil/ossutil64 cp -r /root/owen/720yun/vtour/ oss://oss-xiaoan/720yun_fd_manage/
+     *
+     */
+//    public final static String OSSUTIL_UPLOAD_DIR = "/opt/ossutil/ossutil64 cp -r /mnt/720yun_fd_manage_data/@sceneCode oss://oss-xiaoan/720yun_fd_manage/@sceneCode";
+
+    /**
+     * 用脚本的好处会自动结束线程, java直接跑命令容易出问题
+     * 调用oss上传目录脚本
+     * bash /opt/ossutil/ossupload.sh @dir @ossDir
+     *  bash /opt/ossutil/ossupload.sh /mnt/720yun_fd_manage_data/fd720_1A4Tba8mA 720yun_fd_manage/fd720_1A4Tba8mA
+     *  @uploadDir :服务器资源目录
+     *  @target oss目录名字
+     */
+//    public final static String OSSUTIL_UPLOAD_DIR = "bash /opt/ossutil/ossupload.sh /mnt/720yun_fd_manage_data/@sceneCode 720yun_fd_manage/@sceneCode";
+    public final static String OSSUTIL_UPLOAD_DIR = "bash /root/user/java/jar_run/ossupload.sh @uploadDir data/@sceneCode/data/chunk1/@target";
+
+
+
+}

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

@@ -32,23 +32,23 @@ public class ConfigConstant {
 //    @Value("${project.name}")
 //    public String serverDomain;
 
-//    @Value("${oss.point}")
-//    public  String ossPoint;
-//
-//    @Value("${oss.key}")
-//    public  String ossKey;
-//
-//    @Value("${oss.secrecy}")
-//    public  String ossSecrecy;
-//
-//    @Value("${oss.bucket}")
-//    public  String ossBucket;
-//
-//    @Value("${oss.file.path}")
-//    public  String ossBasePath;
-//
-//    @Value("${oss.domain}")
-//    public  String ossDomain;
+    @Value("${oss.point}")
+    public  String ossPoint;
+
+    @Value("${oss.key}")
+    public  String ossKey;
+
+    @Value("${oss.secrecy}")
+    public  String ossSecrecy;
+
+    @Value("${oss.bucket}")
+    public  String ossBucket;
+
+    @Value("${oss.file.path}")
+    public  String ossBasePath;
+
+    @Value("${oss.domain}")
+    public  String ossDomain;
 
 
     @Value("${swagger.package}")

+ 261 - 0
laser/src/main/java/com/fdkankan/indoor/base/util/AliYunOssUtil.java

@@ -0,0 +1,261 @@
+package com.fdkankan.indoor.base.util;
+
+import com.aliyun.oss.OSSClient;
+import com.aliyun.oss.model.OSSObject;
+import com.aliyun.oss.model.OSSObjectSummary;
+import com.aliyun.oss.model.ObjectListing;
+import com.aliyun.oss.model.PutObjectResult;
+import com.fdkankan.indoor.base.constant.ConfigConstant;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 阿里云oss工具类
+ */
+@Slf4j
+@Component
+public class AliYunOssUtil {
+
+    @Autowired
+    ConfigConstant configConstant;
+
+    // 加载对象
+    private OSSClient init(){
+        return new OSSClient(configConstant.ossPoint, configConstant.ossKey, configConstant.ossSecrecy);
+    }
+
+
+
+    public  void delete(String key) throws IOException {
+        OSSClient ossClient = init();
+        try {
+
+            // 2019-2-28 启动aliyun oss 空间
+            ossClient.deleteObject(configConstant.ossBucket, key);
+            ossClient.deleteObject(configConstant.ossBucket, key);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    //上传的数据是byte[],key是上传后的文件名
+    public void upload(byte[] data, String key) throws IOException {
+        OSSClient ossClient = init();
+        try {
+            // 2019-2-28 启动aliyun oss 空间
+            ossClient.putObject(configConstant.ossBucket, key, new ByteArrayInputStream(data));
+        } catch (Exception e) {
+            log.error(e.toString() + key);
+        }
+    }
+
+
+    public void upload(String filePath, String key) {
+        OSSClient ossClient = init();
+        try {
+            File file = new File(filePath);
+            if (!file.exists()) {
+                log.error("要上传的文件不存在:" + filePath);
+            }
+            ossClient.putObject(configConstant.ossBucket, key, new File(filePath));
+
+        } catch (Exception e) {
+            log.error(e.toString() + filePath);
+        }
+    }
+
+    public  void upload2(String filePath, String key) {
+        OSSClient ossClient = init();
+        try {
+
+            // 2019-2-28 启动aliyun oss 空间
+            ossClient.putObject(configConstant.ossBucket, key, new File(filePath));
+        } catch (Exception e) {
+            log.error(e.toString() + filePath);
+        }
+    }
+
+
+    /**
+     * 上传的数据是文件夹,参数是文件夹路径,key是上传后的文件名
+     *
+     * @param filepaths key : 原文件路径
+     *                  value: oss路径, oss会自动创建目录
+     */
+    public  void uploadMulFiles(Map<String, String> filepaths) {
+        if (filepaths == null) {
+            return;
+        }
+        log.info("开始批量上传到阿里云:" + new Date().toString());
+        if (filepaths.size() > 50) {
+            for (String filePath : filepaths.keySet()) {
+                upload2(filePath, filepaths.get(filePath));
+            }
+        } else {
+            for (String filePath : filepaths.keySet()) {
+                log.info("文件:" + filePath + "到阿里云:" + filepaths.get(filePath));
+                upload(filePath, filepaths.get(filePath));
+            }
+        }
+        log.info("批量上传阿里云完毕:" + new Date().toString());
+    }
+
+
+    /**
+     * 可以删除目录
+     *
+     * @param prefix 图片路径
+     * @return
+     */
+    public  int deleteFile(String prefix) {
+        OSSClient ossClient = init();
+        ObjectListing objectListing = ossClient.listObjects(configConstant.ossBucket, prefix);
+        List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
+        try {
+            for (OSSObjectSummary s : sums) {
+                delete(s.getKey());
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return sums.size();
+    }
+
+    public  void main(String[] args) throws IOException {
+
+        HashMap<String, String> map = new HashMap<>();
+//		map.put("F:\\test\\aa.jpg", "kanfang/test/aa.jpg");
+        map.put("F:\\test\\oss\\floor.json", "kanfang/test/faa.json");
+        uploadMulFiles(map);
+
+//		deleteFile("kanfang/test/aa.jpg");
+
+    }
+
+//    /**
+//     * 上传目录到oss
+//     * @param dirPath 目录地址
+//     * @param sceneCode 场景码
+//     * @param ossBasePath oss基础地址
+//     * @throws IOException
+//     */
+//    public  void uploadDir(String dirPath, String sceneCode, String ossBasePath) throws IOException {
+//        Map map = FileUtils.eachFile(dirPath, sceneCode, ossBasePath);
+//        uploadMulFiles(map);
+//        log.info("oss上传完成");
+//    }
+
+
+    public  String upload5(String filePath, String key) {
+        OSSClient ossClient = init();
+        PutObjectResult result = null;
+        try {
+            File file = new File(filePath);
+            if (!file.exists()) {
+                log.error("要上传的文件不存在:" + filePath);
+            }
+
+
+            result = ossClient.putObject(configConstant.ossBucket, key, new File(filePath));
+
+        } catch (Exception e) {
+            log.error(e.toString() + filePath);
+        }
+
+        log.info(" getETag : " + result.getETag());
+        log.info("1 : " + result.toString());
+        log.info("2 : " + result.getRequestId());
+        log.info("3 : " + result.getClientCRC());
+        log.info("4 : " + result.getResponse());
+        log.info("5 : " + result.getServerCRC());
+        return result.getETag();
+    }
+
+
+    /**
+     * 通过文件名判断并获取OSS服务文件上传时文件的contentType
+     *
+     * @param fileName 文件名
+     * @return 文件的contentType
+     */
+    private static String getContentType(String fileName) {
+        log.info("getContentType:" + fileName);
+        // 文件的后缀名
+        String fileExtension = fileName.substring(fileName.lastIndexOf("."));
+        if (".bmp".equalsIgnoreCase(fileExtension)) {
+            return "image/bmp";
+        }
+        if (".gif".equalsIgnoreCase(fileExtension)) {
+            return "image/gif";
+        }
+        if (".jpeg".equalsIgnoreCase(fileExtension) || ".jpg".equalsIgnoreCase(fileExtension)
+                || ".png".equalsIgnoreCase(fileExtension)) {
+            return "image/jpeg";
+        }
+        if (".html".equalsIgnoreCase(fileExtension)) {
+            return "text/html";
+        }
+        if (".txt".equalsIgnoreCase(fileExtension)) {
+            return "text/plain";
+        }
+        if (".vsd".equalsIgnoreCase(fileExtension)) {
+            return "application/vnd.visio";
+        }
+        if (".ppt".equalsIgnoreCase(fileExtension) || "pptx".equalsIgnoreCase(fileExtension)) {
+            return "application/vnd.ms-powerpoint";
+        }
+        if (".doc".equalsIgnoreCase(fileExtension) || "docx".equalsIgnoreCase(fileExtension)) {
+            return "application/msword";
+        }
+        if (".xml".equalsIgnoreCase(fileExtension)) {
+            return "text/xml";
+        }
+        if (".pdf".equalsIgnoreCase(fileExtension)) {
+            return "application/pdf";
+        }
+        // 默认返回类型
+        return "image/jpeg";
+    }
+
+    /**
+     * 以流下载图片
+     *
+     * @param
+     * @return
+     * @Title: getInputStreamByFileUrl
+     * @Description: 根据文件路径获取InputStream流
+     * @return: InputStream
+     */
+    public  InputStream getInputStreamByFileUrl(String filePath) {
+        // ossObject包含文件所在的存储空间名称、文件名称、文件元信息以及一个输入流。
+        OSSClient ossClient = init();
+        OSSObject ossObject = ossClient.getObject(configConstant.ossBucket, filePath);
+        return ossObject.getObjectContent();
+    }
+
+
+
+    /**
+     * 生成图片
+     * @param inputFilePath
+     * @param savePath
+     */
+//	public static void writeFile(String inputFilePath, String savePath){
+//		try {
+//			FileUtils.bigFileWrite(getInputStreamByFileUrl(inputFilePath), savePath);
+//		} catch (IOException e) {
+//			e.printStackTrace();
+//		}
+//	}
+
+}

+ 114 - 0
laser/src/main/java/com/fdkankan/indoor/base/util/CmdUtils.java

@@ -0,0 +1,114 @@
+package com.fdkankan.indoor.base.util;
+
+import cn.hutool.core.util.RuntimeUtil;
+import com.fdkankan.indoor.base.constant.CmdConstant;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+/**
+ * Created by owen on 2021/1/4 0004 14:53
+ */
+@Slf4j
+public class CmdUtils {
+
+
+    /**
+     * 调用算法 xx.sh 脚本
+     * @param command
+     */
+//    public static void callshell(String command){
+//        try {
+//            String[] cmd = new String[]{"/bin/sh", "-c", command};
+//            Process process = Runtime.getRuntime().exec(cmd);
+//            StreamGobbler errorGobbler = new StreamGobbler(process.getErrorStream(), "ERROR");
+//            errorGobbler.start();
+//            StreamGobbler outGobbler = new StreamGobbler(process.getInputStream(), "STDOUT");
+//            outGobbler.start();
+//            process.waitFor();
+//        } catch (Exception e) {
+//            e.printStackTrace();
+//        }
+//    }
+
+
+
+    public static void callLineSh(String command){
+        callLineSh(command, null);
+
+    }
+
+    /**
+     * 直接java调用命令
+     * @param command
+     */
+    public static void callLine(String command){
+        callLine(command, null);
+
+    }
+
+    /**
+     * 直接java调用命令
+     * @param command
+     */
+    public static void callLine(String command, Integer lineSize){
+        log.info("cmd: " + command);
+        try {
+            Process process = Runtime.getRuntime().exec(command);
+            log.info("开始运行");
+            StreamGobblerLine errorGobbler = new StreamGobblerLine(process.getErrorStream(), "ERROR");
+            errorGobbler.start();
+            // 200行打印一次日志
+            StreamGobblerLine outGobbler = new StreamGobblerLine(process.getInputStream(), "STDOUT", lineSize);
+            outGobbler.start();
+            process.waitFor();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     *
+     * @param command 命令
+     * @param lineSize 日志输出行数 ,可以为null
+     */
+    public static void callLineSh(String command, Integer lineSize){
+        log.info("cmd: " + command);
+        try {
+            String[] cmd = new String[]{"/bin/sh", "-c", command};
+            Process process = Runtime.getRuntime().exec(cmd);
+            log.info("开始运行");
+            StreamGobblerLine errorGobbler = new StreamGobblerLine(process.getErrorStream(), "ERROR");
+            errorGobbler.start();
+            // 200行打印一次日志
+            StreamGobblerLine outGobbler = new StreamGobblerLine(process.getInputStream(), "STDOUT", lineSize);
+            outGobbler.start();
+            process.waitFor();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 调用sh脚本上传oss
+     */
+    public static void ossUploadDir(String sceneCode, String uploadDir, String target){
+
+        String cmd = CmdConstant.OSSUTIL_UPLOAD_DIR;
+        cmd = cmd.replaceAll("@sceneCode", sceneCode);
+        cmd = cmd.replaceAll("@uploadDir", uploadDir);
+        cmd = cmd.replaceAll("@target", target);
+
+        log.info("ossCmd: " + cmd);
+        long start = System.currentTimeMillis();
+        CmdUtils.callLineSh(cmd);
+        long end = System.currentTimeMillis();
+        log.info("场景码目录:{} 上传完成, 耗时:{} s" , sceneCode, (end-start)/1000 );
+    }
+
+
+
+
+}

+ 79 - 0
laser/src/main/java/com/fdkankan/indoor/base/util/StreamGobblerLine.java

@@ -0,0 +1,79 @@
+package com.fdkankan.indoor.base.util;
+
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.*;
+
+@Slf4j
+public class StreamGobblerLine extends Thread {
+
+	InputStream is;
+    String type;
+    OutputStream os;
+    Integer lineSize;  // 多少行打印日志一次
+
+    public StreamGobblerLine(InputStream is, String type) {
+        this(is, type, null, null);
+    }
+
+    public StreamGobblerLine(InputStream is, String type, Integer lineSize) {
+        this(is, type, null, lineSize);
+    }
+
+    StreamGobblerLine(InputStream is, String type, OutputStream redirect, Integer lineSize) {
+        this.is = is;  
+        this.type = type;  
+        this.os = redirect;
+        this.lineSize = lineSize;
+    }  
+
+    public void run() {
+        log.info("run StreamGobblerLine");
+
+        InputStreamReader isr = null;  
+        BufferedReader br = null;  
+        PrintWriter pw = null;  
+        try {  
+            if (os != null)  
+                pw = new PrintWriter(os);  
+
+            isr = new InputStreamReader(is);  
+            br = new BufferedReader(isr);  
+            String line=null;
+            int i = 1;
+            while ( (line = br.readLine()) != null) {
+                if (lineSize != null) {
+                    if (i % lineSize == 0) {
+                        log.info(type + "," + i +" : >" + line);
+                    }
+                } else {
+                    log.info(type + ","  + i +" : >" + line);
+                }
+                i++;
+
+            }
+
+            if (pw != null)  
+                pw.flush();  
+        } catch (IOException ioe) {  
+            ioe.printStackTrace();    
+        } finally{  
+            try {  
+            	if(pw!=null)
+            	{
+            		 pw.close();  
+            	}
+            	if(br!=null)
+            	{
+            		br.close();  
+            	}
+            	if(isr!=null)
+            	{
+            		isr.close();  
+            	}
+            } catch (IOException e) {  
+                e.printStackTrace();  
+            }  
+        }  
+    }  
+}

+ 14 - 5
laser/src/main/java/com/fdkankan/indoor/core/controller/ControlPointController.java

@@ -35,17 +35,26 @@ public class ControlPointController {
      */
     @WebControllerLog(description = "控制点管理-新增/修改控制点")
     @ApiOperation(value = "新增/修改控制点")
-    @PostMapping("save")
-    public Result save(@RequestBody ControlPointEntity param) {
+    @PostMapping("indoor/{sceneCode}/api/controlPoint/save")
+    public Result save(@PathVariable String sceneCode,  @RequestBody ControlPointEntity param) {
+        param.setId(sceneCode);
         return entityService.save(param);
     }
 
 
     @WebControllerLog(description = "控制点管理-详情")
     @ApiOperation(value = "详情")
-    @PostMapping("detail/{id}")
-    public Result detail(@PathVariable String id) {
-        return Result.success(entityService.findById(id));
+    @GetMapping("indoor/{sceneCode}/api/controlPoint/detail")
+    public Result detail(@PathVariable String sceneCode) {
+        return Result.success(entityService.findById(sceneCode));
+    }
+
+
+    @WebControllerLog(description = "控制点管理-列表(未初始化数据)")
+    @ApiOperation(value = "列表(未初始化数据)")
+    @GetMapping("indoor/api/controlPoint/unInitList")
+    public Result unInitList() {
+        return entityService.unInitList();
     }
 
 

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

@@ -58,7 +58,8 @@ public class FilterController {
     @GetMapping("indoor/{code}/api/images/filter")
     public Object filter(@PathVariable String code,
                                  QueryJsonDataOne queryJsonDataOne, QueryJsonDataTwo queryJsonDataTwo, JsonDataDetailDto jsonDataDetailDto) {
-        Result result = filterService.query(code, queryJsonDataOne, queryJsonDataTwo, jsonDataDetailDto);
+//        Result result = filterService.query(code, queryJsonDataOne, queryJsonDataTwo, jsonDataDetailDto);
+        Result result = filterService.query_5(code, queryJsonDataOne, queryJsonDataTwo, jsonDataDetailDto);
 
         return result.getData();
     }

+ 5 - 5
laser/src/main/java/com/fdkankan/indoor/core/controller/InitController.java

@@ -8,6 +8,7 @@ import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
@@ -18,7 +19,6 @@ import org.springframework.web.bind.annotation.RestController;
 @Slf4j
 @Api(tags = "四维看看数据转激光相机数据")
 @RestController
-@RequestMapping("indoor/api")
 public class InitController {
 
     @Autowired
@@ -30,14 +30,14 @@ public class InitController {
      * 2021-7-
      * 将4dkk vision.txt 转 激光相机可用数据并出入数据库
      * 4dkk 调用
-     * @param id 是场景码
+     * @param sceneCode 是场景码
      * @param path
      * @return
      */
     @WebControllerLog(description = "filter数据接口-创建初始数据")
     @ApiOperation(value = "创建初始数据")
-    @GetMapping("init")
-    public Result initData(String id, String path) {
-        return initService.initData(id, path);
+    @GetMapping("indoor/{sceneCode}/api/init")
+    public Result initData(@PathVariable String sceneCode, String path) {
+        return initService.initData(sceneCode, path);
     }
 }

+ 11 - 0
laser/src/main/java/com/fdkankan/indoor/core/controller/TestController.java

@@ -1,5 +1,6 @@
 package com.fdkankan.indoor.core.controller;
 
+import com.fdkankan.indoor.base.util.CmdUtils;
 import com.fdkankan.indoor.base.util.Result;
 import com.fdkankan.indoor.core.entity.OwenEntity;
 import com.fdkankan.indoor.core.service.OwenService;
@@ -81,4 +82,14 @@ public class TestController {
     }
 
 
+    @ApiOperation("oss上传目录")
+    @GetMapping("ossUploadDir/{sceneCode}")
+    public Result ossUploadDir(@PathVariable String sceneCode){
+        CmdUtils.ossUploadDir(sceneCode, "", "");
+        return Result.success();
+
+
+    }
+
+
 }

+ 3 - 1
laser/src/main/java/com/fdkankan/indoor/core/mapper/InitMapper.java

@@ -4,11 +4,13 @@ import com.fdkankan.indoor.core.entity.InitEntity;
 import org.springframework.data.mongodb.repository.MongoRepository;
 import org.springframework.stereotype.Component;
 
+import java.util.List;
+
 /**
  * Created by owen on 2021/7/27 0027 15:19
  */
 @Component
 public interface InitMapper extends MongoRepository<InitEntity, String> {
 
-
+    List<InitEntity> findByStatus(Integer status);
 }

+ 2 - 0
laser/src/main/java/com/fdkankan/indoor/core/service/ControlPointService.java

@@ -12,4 +12,6 @@ public interface ControlPointService {
     Result save(ControlPointEntity param);
 
     ControlPointEntity findById(String id);
+
+    Result unInitList();
 }

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

@@ -15,6 +15,7 @@ public interface FilterService {
     Result findById(String sceneCode, Integer id);
 
     Result query(String code, QueryJsonDataOne queryJsonDataOne, QueryJsonDataTwo queryJsonDataTwo, JsonDataDetailDto jsonDataDetailDto);
+    Result query_5(String code, QueryJsonDataOne queryJsonDataOne, QueryJsonDataTwo queryJsonDataTwo, JsonDataDetailDto jsonDataDetailDto);
 
     Result findById1(String sceneCode, Integer id);
 

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

@@ -1,6 +1,9 @@
 package com.fdkankan.indoor.core.service;
 
 import com.fdkankan.indoor.base.util.Result;
+import com.fdkankan.indoor.core.entity.InitEntity;
+
+import java.util.List;
 
 /**
  * Created by owen on 2021/7/28 0028 9:10
@@ -9,4 +12,8 @@ public interface InitService {
     Result initData(String sceneCode, String path);
 
     void initDataStep2(String sceneCode);
+
+    List<InitEntity> findByStatus(Integer status);
+
+    InitEntity findById(String id);
 }

+ 26 - 7
laser/src/main/java/com/fdkankan/indoor/core/service/impl/ControlPointServiceImpl.java

@@ -4,6 +4,7 @@ import cn.hutool.core.util.StrUtil;
 import com.fdkankan.indoor.base.util.Result;
 import com.fdkankan.indoor.core.entity.ConfigEntity;
 import com.fdkankan.indoor.core.entity.ControlPointEntity;
+import com.fdkankan.indoor.core.entity.InitEntity;
 import com.fdkankan.indoor.core.mapper.ConfigMapper;
 import com.fdkankan.indoor.core.mapper.ControlPointMapper;
 import com.fdkankan.indoor.core.service.ConfigService;
@@ -13,6 +14,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
 import java.util.Optional;
 
 /**
@@ -31,17 +33,26 @@ public class ControlPointServiceImpl implements ControlPointService {
 
     @Override
     public Result save(ControlPointEntity param) {
-        if (StrUtil.isAllEmpty(param.getId())){
+        String id = param.getId();
+        if (StrUtil.isAllEmpty(id)){
             return Result.failure("场景码不能为空");
         }
-        entityMapper.save(param);
-        log.info("控制点保存完成");
 
-        // 初始化step2 数据
-        initService.initDataStep2(param.getId());
-        log.info("初始化step2 完成");
+        InitEntity initEntity = initService.findById(id);
+        Integer status = initEntity.getStatus();
+        if (status == 0) {
+            // 查询初始化状态
+            entityMapper.save(param);
+            log.info("控制点保存完成");
 
-        return Result.success();
+            // 初始化step2 数据
+            initService.initDataStep2(id);
+            log.info("初始化step2 完成");
+            return Result.success();
+        }
+
+        log.info("已初始化, 不执行操作, 初始化状态为: {}", status);
+        return Result.failure("已初始化,不执行操作");
     }
 
     @Override
@@ -49,4 +60,12 @@ public class ControlPointServiceImpl implements ControlPointService {
         Optional<ControlPointEntity> optional = entityMapper.findById(id);
         return optional.get();
     }
+
+    @Override
+    public Result unInitList() {
+        // 未进行控制点初始化
+        Integer status = 0;
+        List<InitEntity> list = initService.findByStatus(status);
+        return Result.success(list);
+    }
 }

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

@@ -8,16 +8,14 @@ import com.fdkankan.indoor.core.entity.jsonData.JsonData;
 import com.fdkankan.indoor.core.mapper.FilterMapper;
 import com.fdkankan.indoor.core.service.FilterService;
 import lombok.extern.slf4j.Slf4j;
+import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.mongodb.core.MongoTemplate;
 import org.springframework.data.mongodb.core.query.Criteria;
 import org.springframework.data.mongodb.core.query.Query;
 import org.springframework.stereotype.Service;
 
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.List;
+import java.util.*;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
@@ -61,6 +59,17 @@ public class FilterServiceImpl implements FilterService {
         return null;
     }
 
+
+    @Override
+    public Result query_5(String code, QueryJsonDataOne queryJsonDataOne, QueryJsonDataTwo queryJsonDataTwo, JsonDataDetailDto jsonDataDetailDto) {
+
+
+            QueryJsonDataBase data = switchQueryData(queryJsonDataOne, queryJsonDataTwo);
+            return  Result.success(filterJsonData_5(code, data, jsonDataDetailDto));
+
+
+    }
+
     @Override
     public Result findById1(String sceneCode, Integer id) {
 
@@ -171,8 +180,7 @@ public class FilterServiceImpl implements FilterService {
 
     private List<JsonData> filterJsonData(String code, QueryJsonDataBase data) {
         log.info("code:{}, data:{}", code, data.toString());
-//        List<JsonData> list;
-//        String code1 = code;
+
         List<JsonData> list = findBySceneCode(code);
         if (data instanceof QueryJsonDataOne) {
             QueryJsonDataOne one = (QueryJsonDataOne) data;
@@ -189,6 +197,74 @@ public class FilterServiceImpl implements FilterService {
     }
 
 
+    private List<JsonData> filterJsonData_5(String code, QueryJsonDataBase data, JsonDataDetailDto jsonDataDetailDto) {
+        log.info("code:{}, data:{}", code, data.toString());
+
+        List<JsonData> list = findBySceneCode(code);
+        if (data instanceof QueryJsonDataOne) {
+            QueryJsonDataOne one = (QueryJsonDataOne) data;
+            list = queryDataOne(one, list);
+            log.info("走one");
+        } else if (data instanceof QueryJsonDataTwo) {
+            QueryJsonDataTwo two = (QueryJsonDataTwo) data;
+            list = queryDataTwo(two, list);
+            log.info("走two");
+        } else {
+            throw new RuntimeException("没有查询到数据,请检查入参");
+        }
+
+
+        // 过滤参数
+        list = filterJsonDataDetail_5(list, jsonDataDetailDto);
+
+
+        return list;
+    }
+
+
+    private List<JsonData> filterJsonDataDetail_5(List<JsonData> dbList, JsonDataDetailDto jsonDataDetailDto) {
+//        List<JsonData> dbList = findBySceneCode(code);
+
+        Integer datasetId = jsonDataDetailDto.getDataset();
+        Integer siteModelEntityId = jsonDataDetailDto.getSite_model_entity();
+        Integer limit = jsonDataDetailDto.getLimit();
+        limit = limit==null ? 10 : limit;
+        Boolean hidden = jsonDataDetailDto.getHidden();
+        // 对应db 根据那个字段排序
+        String sortOrder = jsonDataDetailDto.getSort_order();
+        sortOrder = sortOrder==null ? null :sortOrder.toLowerCase();
+        // 升序还是降序
+        String sortBy = jsonDataDetailDto.getSort_by();
+        sortBy = sortBy==null ? null :sortBy.toLowerCase();
+
+
+
+        // todo 这里的排序还需要处理一下, 如有异常看了hidden值
+
+        Stream<JsonData> dataStream = dbList.stream();
+        if (datasetId != null) {
+            dataStream = dataStream.filter(p -> datasetId.equals(p.getDataset_id()));
+        }
+
+        if (siteModelEntityId != null) {
+            dataStream = dataStream.filter(p -> siteModelEntityId.equals(p.getSite_model_entity_id()));
+        }
+
+
+        // 处理排序reversed()降序, 默认是升序
+        if ("desc".equals(sortBy) && "file_id".equals(sortOrder)) {
+            dataStream = dataStream.sorted(Comparator.comparing(JsonData::getFile_id).reversed());
+        } else if ("asc".equals(sortBy) && "file_id".equals(sortOrder)){
+            dataStream =  dataStream.sorted(Comparator.comparing(JsonData::getFile_id));
+        }
+
+        List<JsonData> collect = dataStream.collect(Collectors.toList());
+
+        log.info("返回数据数量: {}", collect.size());
+        return collect;
+    }
+
+
 
 
 
@@ -214,7 +290,8 @@ public class FilterServiceImpl implements FilterService {
         List<JsonData> newJsonData = new ArrayList<>();
         // radius:半径
         if (queryJsonData.getRadius() != null) {
-            newJsonData = calcule(queryJsonData, jsonDataList);
+//            newJsonData = calcule(queryJsonData, jsonDataList);
+            newJsonData = calcule_5(queryJsonData, jsonDataList);
         } else {
             // 没有半径,算最近的距离
             newJsonData = calculeMin(queryJsonData, jsonDataList);
@@ -308,6 +385,59 @@ public class FilterServiceImpl implements FilterService {
 
 
     /**
+     * 按最近距离排序
+     * @param queryJsonData
+     * @param jsonDataList
+     * @return
+     */
+    private List<JsonData> calcule_5(QueryJsonDataOne queryJsonData, List<JsonData> jsonDataList) {
+        log.info("run calcule");
+//        List<JsonData> newJsonData = new ArrayList<>();
+
+
+        // 计算距离后的结果集
+        Map<Double, JsonData> calResultMap = new HashMap<>();
+        for (JsonData jsonData : jsonDataList) {
+//            log.info("jsonData: {}", jsonData);
+            Double[] coordinates1 = new Double[2];
+            coordinates1[0] = queryJsonData.getLon();
+            coordinates1[1] = queryJsonData.getLat();
+
+            Double[] coordinates2 = new Double[2];
+            coordinates2[0] = jsonData.getLocation()[0];
+            coordinates2[1] = jsonData.getLocation()[1];
+
+            Double distance = JsonUtil.distance(coordinates1, coordinates2, new Options().setUnits("miles"));
+//            log.info("计算出的距离:{}", distance);
+
+            if (queryJsonData.getRadius() > distance) {
+                // 缓存对象
+                calResultMap.put(distance, jsonData);
+            }
+        }
+
+        // 从小到大排序, 冒泡排序
+        List<Double> list = new ArrayList<>();
+        calResultMap.forEach((k,v) -> {
+            list.add(k);
+        });
+        log.info("排序前: {}", list);
+        // 升序排列
+        List<Double> collect = list.stream().sorted().collect(Collectors.toList());
+        log.info("排序后: {}", collect);
+
+
+        // 通过key获取对象
+        List<JsonData> result = new ArrayList<>();
+        collect.forEach(p -> {
+            result.add(calResultMap.get(p));
+        });
+
+        return result;
+    }
+
+
+    /**
      * 计算最小距离
      * @param queryJsonData
      * @param jsonDataList
@@ -317,7 +447,7 @@ public class FilterServiceImpl implements FilterService {
         log.info("run calculeMin");
         List<JsonData> newJsonData = new ArrayList<>();
 
-        // 计算距离后的结果
+        // 计算距离后的结果
         HashMap<Double, JsonData> calResultMap = new HashMap<>();
 
         int i = 1;
@@ -378,5 +508,12 @@ public class FilterServiceImpl implements FilterService {
     }
 
 
+    @Test
+    public void test(){
+        double a= 8.346455383936777E-4;
+        double b= 0.001518440040006915;
+        System.out.println( a < b);
+    }
+
 
 }

+ 102 - 3
laser/src/main/java/com/fdkankan/indoor/core/service/impl/InitServiceImpl.java

@@ -2,9 +2,11 @@ package com.fdkankan.indoor.core.service.impl;
 
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSON;
+import com.fdkankan.indoor.base.constant.ConfigConstant;
 import com.fdkankan.indoor.base.constant.TypeConstant;
 import com.fdkankan.indoor.base.convert.*;
 import com.fdkankan.indoor.base.exception.BaseRuntimeException;
+import com.fdkankan.indoor.base.util.CmdUtils;
 import com.fdkankan.indoor.base.util.FileUtils;
 import com.fdkankan.indoor.base.util.Result;
 import com.fdkankan.indoor.base.util.SnowFlakeUUidUtils;
@@ -69,6 +71,9 @@ public class InitServiceImpl implements InitService {
     @Autowired
     ControlPointService controlPointService;
 
+    @Autowired
+    ConfigConstant configConstant;
+
     /**
      * initDataStep1
      * 有顺序分,不能乱
@@ -92,10 +97,19 @@ public class InitServiceImpl implements InitService {
         // step5 创建poi_type_group表
         createPoiTypeGroup(sceneCode);
 
-        // step8 创建t_route表
+        // step6 创建t_route表
         createRoute(sceneCode, path);
 
 
+        // step7 复制静态资源
+        copyDefault(sceneCode);
+
+
+        // step8 替换index.html、/locat/addDataSet.html的场景码, @replace
+        replaceHtml(sceneCode);
+
+
+
         // 保存initDataStep1 状态
         InitEntity entity = new InitEntity();
         entity.setId(sceneCode);
@@ -103,10 +117,51 @@ public class InitServiceImpl implements InitService {
         entity.setCreateTime(LocalDateTime.now());
         entity.setStatus(0);
         initMapper.save(entity);
+        log.info("initDataStep_1处理完成");
 
         return Result.success();
     }
 
+    /**
+     * 替换两个文件的c 换成场景码
+     * index.html
+     * /locat/addDataSet.html
+     * @param sceneCode
+     */
+    private void replaceHtml(String sceneCode) {
+        String indexName = "index.html";
+        String addDataSetName = "addDataSet.html";
+
+        String basePath = configConstant.serverBasePath + "/" + sceneCode + "/" ;
+        String indexPath = basePath + indexName;
+        String addDateSetPath = basePath + "locat/" + addDataSetName;
+
+        String indexStr = cn.hutool.core.io.FileUtil.readUtf8String(indexPath);
+        String dataSetStr = cn.hutool.core.io.FileUtil.readUtf8String(addDateSetPath);
+
+        indexStr = indexStr.replaceAll("@replace", sceneCode);
+        dataSetStr = dataSetStr.replaceAll("@replace", sceneCode);
+
+        cn.hutool.core.io.FileUtil.writeUtf8String(indexStr, indexPath);
+        cn.hutool.core.io.FileUtil.writeUtf8String(dataSetStr, addDateSetPath);
+        log.info("html文件替完成");
+
+    }
+
+
+    /**
+     * 复制静态资源
+     * @param sceneCode
+     */
+    private void copyDefault(String sceneCode) {
+        // /. 是复制该目录下所有文件
+        String source = configConstant.serverBasePath + "/default/.";
+        String target = configConstant.serverBasePath + "/" + sceneCode;
+        String cmd = "cp -r " + source + " " + target;
+        CmdUtils.callLine(cmd);
+        log.info("复制default目录完成");
+    }
+
 
     /**
      * 需要控制点,才能完成以下操作
@@ -139,10 +194,26 @@ public class InitServiceImpl implements InitService {
         // step7 创建t_datasets表, 需要处理原点之后执行
         createDataSet(sceneCode);
 
+
+        // step8 目录pano、pano_depth、webcloud上传oss,
+        ossUploadDir(sceneCode, path);
+
         // 更新 initDataStep2 状态
         init.setUpdateTime(LocalDateTime.now());
         init.setStatus(1);
         initMapper.save(init);
+        log.info("initDataStep_2处理完成");
+    }
+
+    @Override
+    public List<InitEntity> findByStatus(Integer status) {
+        return initMapper.findByStatus(status);
+    }
+
+    @Override
+    public InitEntity findById(String id) {
+        Optional<InitEntity> optional = initMapper.findById(id);
+        return optional.get();
     }
 
     private void createFilter(String sceneCode, String path, ControlPointEntity dto){
@@ -156,6 +227,7 @@ public class InitServiceImpl implements InitService {
         List<FilterHotDto> list = JSONArray.toList(jsonArray, FilterHotDto.class);
         entity.setData(list);
         filterService.save(entity);
+        log.info("filter数据初始化创建完成");
     }
 
     /**
@@ -164,7 +236,7 @@ public class InitServiceImpl implements InitService {
      * @param path
      */
     private void processCould(String sceneCode, String path, ControlPointEntity dto){
-        path = path + "/cloud.js";
+        path = path + "/webcloud/cloud.js";
         // 处理原点,将原点坐标转为坐标
         double[] doubles = ModifyCloud.convertFromOrigin(dto);
         Double[] origin = {doubles[0] ,doubles[1]};
@@ -175,6 +247,10 @@ public class InitServiceImpl implements InitService {
         try {
             // 修改cloud.js文件
             JSONObject info = ModifyCloud.fixCloud(path);
+
+            cn.hutool.core.io.FileUtil.writeUtf8String(info.toString(), path);
+            log.info("新的cloud.js写入完成:{}", path);
+
             // 将boundingbox坐标转换成gis坐标, site_model需要
             JSONObject boundingBox = ModifyCloud.getBoundingBox(info);
             Double minZ = boundingBox.getDouble("minZ");
@@ -260,6 +336,7 @@ public class InitServiceImpl implements InitService {
         // 默认热点为空
         entity.setData(siteModels);
         siteModelService.save(entity);
+        log.info("siteModel数据初始化创建完成");
     }
 
     @Test
@@ -307,6 +384,8 @@ public class InitServiceImpl implements InitService {
         // 默认热点为空
         entity.setData(new ArrayList<>());
         poiService.save(entity);
+        log.info("Poi数据初始化创建完成");
+
 
     }
 
@@ -320,6 +399,7 @@ public class InitServiceImpl implements InitService {
         List<PoiTypeDto> dtoList = com.alibaba.fastjson.JSONArray.parseArray(resourceContent, PoiTypeDto.class);
         entity.setData(dtoList);
         poiTypeService.save(entity);
+        log.info("poiType数据初始化创建完成");
     }
 
     private void createPoiTypeGroup(String sceneCode){
@@ -332,6 +412,7 @@ public class InitServiceImpl implements InitService {
         List<PoiTypeGroupDto> dtoList = com.alibaba.fastjson.JSONArray.parseArray(resourceContent, PoiTypeGroupDto.class);
         entity.setData(dtoList);
         poiTypeGroupService.save(entity);
+        log.info("PoiTypeGroup数据初始化创建完成");
 
     }
 
@@ -348,6 +429,7 @@ public class InitServiceImpl implements InitService {
         JSONObject dataSet = ModifyDataSets.createDataSet(poi);
         entity.setData(dataSet);
         dataSetService.save(entity);
+        log.info("DataSet数据初始化创建完成");
     }
 
     private void createConfig(String sceneCode){
@@ -380,6 +462,7 @@ public class InitServiceImpl implements InitService {
         entity.setUpdateTime(LocalDateTime.now());
         entity.setData(resData);
         configService.save(entity);
+        log.info(" Config数据初始化创建完成");
     }
 
 
@@ -390,7 +473,9 @@ public class InitServiceImpl implements InitService {
     private void createRoute(String sceneCode, String path){
         List<String> list = new ArrayList<>();
         try {
-            list = FileUtil.readFileByLines2(path + "/routeMap.txt");
+//            list = FileUtil.readFileByLines2(path + "/routeMap.txt");
+            list = FileUtil.readFileByLines2(path + "/final_freespace.csv");
+
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -400,6 +485,7 @@ public class InitServiceImpl implements InitService {
         entity.setUpdateTime(LocalDateTime.now());
         entity.setData(list);
         routeService.save(entity);
+        log.info(" Route数据初始化创建完成");
 
     }
 
@@ -407,4 +493,17 @@ public class InitServiceImpl implements InitService {
        return controlPointService.findById(sceneCode);
     }
 
+
+    private void ossUploadDir(String sceneCode, String path){
+        String panoPath = path + "/pano";
+        String panoDepthPath = path + "/pano_depth";
+        String webCloudPath = path + "/webcloud";
+        CmdUtils.ossUploadDir(sceneCode, panoPath, "pano");
+        log.info("pano目录上传oss完成");
+        CmdUtils.ossUploadDir(sceneCode, panoDepthPath, "pano_depth");
+        log.info("pano_depth目录上传oss完成");
+        CmdUtils.ossUploadDir(sceneCode, webCloudPath,"webcloud");
+        log.info("webcloud目录上传oss完成");
+    }
+
 }

+ 11 - 1
laser/src/main/resources/application-dev.properties

@@ -16,4 +16,14 @@ swagger.title=${project.sc}-dev
 swagger.description=${swagger.title}
 swagger.version=1.0
 
-server.file.path=F:\\test\\ngin\\${project.en}_data
+server.file.path=F:\\test\\ngin\\${project.en}_data
+
+
+oss.point=http://oss-cn-shenzhen-internal.aliyuncs.com
+oss.key=LTAIUrvuHqj8pvry
+oss.secrecy=JLOVl0k8Ke0aaM8nLMMiUAZ3EiiqI4
+oss.bucket=laser-data
+#oss.type=oss
+# \u524D\u7F00\u76EE\u5F55
+oss.file.path=data
+oss.domain=https://oss-xiaoan.oss-cn-shenzhen.aliyuncs.com/

+ 11 - 1
laser/src/main/resources/application-test.properties

@@ -13,4 +13,14 @@ swagger.description=${swagger.title}
 swagger.version=1.0
 
 # \u4E0A\u4F20\u6587\u4EF6\u4FDD\u5B58\u8DEF\u5F84
-server.file.path=/var/www/html/laser/maxkk
+server.file.path=/var/www/html/laser/maxkk
+
+
+oss.point=http://oss-cn-shenzhen-internal.aliyuncs.com
+oss.key=LTAIUrvuHqj8pvry
+oss.secrecy=JLOVl0k8Ke0aaM8nLMMiUAZ3EiiqI4
+oss.bucket=laser-data
+#oss.type=oss
+# \u524D\u7F00\u76EE\u5F55
+oss.file.path=data
+oss.domain=https://oss-xiaoan.oss-cn-shenzhen.aliyuncs.com/

+ 4 - 0
laser/src/main/resources/data/ossupload.sh

@@ -0,0 +1,4 @@
+#!/bin/bash
+directory=$1
+fileurl=$2
+/opt/ossutil/ossutil64 cp \-rf $directory oss://laser-data/$fileurl