소스 검색

add demSlice function

wuweihao 5 년 전
부모
커밋
f11723820c

+ 42 - 1
src/main/java/com/fd/config/Swagger2.java

@@ -1,15 +1,23 @@
 package com.fd.config;
 
+import com.google.common.collect.Lists;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import springfox.documentation.builders.ApiInfoBuilder;
 import springfox.documentation.builders.PathSelectors;
 import springfox.documentation.builders.RequestHandlerSelectors;
 import springfox.documentation.service.ApiInfo;
+import springfox.documentation.service.ApiKey;
+import springfox.documentation.service.AuthorizationScope;
+import springfox.documentation.service.SecurityReference;
 import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spi.service.contexts.SecurityContext;
 import springfox.documentation.spring.web.plugins.Docket;
 import springfox.documentation.swagger2.annotations.EnableSwagger2;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * Created by owen on 2018/4/1
  *
@@ -31,7 +39,11 @@ public class Swagger2 {
                 .select()
                 .apis(RequestHandlerSelectors.basePackage("com.fd.controller"))
                 .paths(PathSelectors.any())
-                .build();
+                .build()
+                //添加登录认证,可以使用token
+                .securityContexts(securityContexts())
+                .securitySchemes(securitySchemes())
+                ;
     }
 
     private ApiInfo apiInfo() {
@@ -41,4 +53,33 @@ public class Swagger2 {
                 .version("1.0")
                 .build();
     }
+
+    private List<ApiKey> securitySchemes() {
+        //设置请求头信息
+        List<ApiKey> result = new ArrayList<>();
+        ApiKey apiKey = new ApiKey("Authorization", "Authorization", "header");
+        result.add(apiKey);
+        return result;
+
+    }
+
+
+    private List<SecurityContext> securityContexts() {
+
+        SecurityContext context = SecurityContext.builder()
+                .securityReferences(defaultAuth())
+                .build();
+
+        return Lists.newArrayList(context);
+
+    }
+
+    private List<SecurityReference> defaultAuth() {
+        List<SecurityReference> result = new ArrayList<>();
+        AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
+        AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
+        authorizationScopes[0] = authorizationScope;
+        result.add(new SecurityReference("Authorization", authorizationScopes));
+        return result;
+    }
 }

+ 13 - 0
src/main/java/com/fd/constant/Command.java

@@ -9,6 +9,8 @@ public class Command {
 
     public static String DOCKER_GDAL = "docker run --rm -v /root/gis/data:/root/gis/data osgeo/gdal:latest ";
 
+    public static String DOCKER_CTB = "docker run --rm -v /root/gis/data:/root/gis/data tumgis/ctb-quantized-mesh:latest ";
+
     /**
      * 输入目录:/root/gis/cesium/input/@fileName fileName:是目录名
      * 输出目录:/root/gis/cesium/output/@fileName fileName:是目录名
@@ -110,5 +112,16 @@ public class Command {
     public static String CMD_CHOMD_755 = "chmod 755 -R @path";
 
 
+    /**
+     * 地形数据打包
+     */
+    public static String DEM_BUILD = DOCKER_GDAL + "gdalbuildvrt @outputFile @inputFile";
+
+
+    /**
+     * 地形数据切片
+     */
+    public static String DEM_SLICE = DOCKER_CTB + "ctb-tile -f Mesh -C -N -o @outputFile @inputFile && " + DOCKER_CTB + "ctb-tile -f Mesh -C -N -l -o @outputFile @inputFile";
+
 
 }

+ 5 - 0
src/main/java/com/fd/constant/TypeCode.java

@@ -26,6 +26,11 @@ public class TypeCode {
     public static final String FILE_TYPE_MODEL = "model";
 
     /**
+     * 地形数据
+     */
+    public static final String FILE_TYPE_DEM = "dem";
+
+    /**
      * 不需要转坐标,显示WGS84
      */
     public static final String COORD_WGS84 = "WGS84";

+ 136 - 0
src/main/java/com/fd/controller/DemController.java

@@ -0,0 +1,136 @@
+package com.fd.controller;
+
+import com.fd.constant.Command;
+import com.fd.constant.MsgCode;
+import com.fd.constant.TypeCode;
+import com.fd.dto.ConfigJsonDto;
+import com.fd.dto.PageDto;
+import com.fd.entity.FileEntity;
+import com.fd.entity.OutputFileEntity;
+import com.fd.server.DemServer;
+import com.fd.server.ModelServer;
+import com.fd.thread.AsyncTask;
+import com.fd.util.FileUtils;
+import com.fd.util.R;
+import com.fd.util.RegexUtils;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.log4j.Log4j2;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.shiro.authz.annotation.RequiresRoles;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.data.domain.Page;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.File;
+import java.util.Date;
+import java.util.List;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * Created by Owen on 2020/1/3 0012 9:40
+ * <p>
+ * 地形数据
+ */
+@Log4j2
+@RequestMapping("api/dem")
+@RestController
+public class DemController {
+
+    @Value("${input.file.path.model}")
+    private String INPUT_FILE_PATH;
+
+    @Value("${output.file.path.model}")
+    private String OUTPUT_FILE_PATH;
+
+
+    @Autowired
+    private AsyncTask asyncTask;
+
+    @Autowired
+    private DemServer demServer;
+
+
+    /**
+     * 队列
+     */
+    private static BlockingQueue<Integer> queue = new LinkedBlockingQueue<Integer>(2);
+
+    /**
+     * 保证线程安全的
+     */
+    private static AtomicInteger count = new AtomicInteger();
+
+
+    @ApiOperation("上传文件")
+    @PostMapping(value = "upload", consumes = {"multipart/form-data"})
+    public R upload(@RequestParam("file") MultipartFile[] file, HttpServletRequest req) {
+        log.warn("run upload");
+        OutputFileEntity entity = demServer.uploads(file, req);
+        log.warn("end upload");
+        return new R(200, entity);
+    }
+
+    /**
+     * 不做进度条的原因是:日志的进度结果是最后才出来,做的意义不大,每次出来的进度会不一样
+     * @param fileId 文件id
+     * @return R
+     */
+    @ApiOperation("数据切片")
+    @GetMapping("command/slice/{fileId}/")
+    public R cmdSlice(@PathVariable("fileId") Long fileId) {
+        return demServer.cmdSlice(fileId);
+
+    }
+
+
+    @GetMapping("test")
+    public R test(){
+        demServer.test();
+        return new R(200,"1111");
+    }
+
+
+//    @ApiOperation("获取3D模型数据列表")
+//    @PostMapping(value = "list")
+//    public R list(@RequestBody PageDto param, HttpServletRequest req) {
+//        String token = req.getHeader("Authorization");
+//
+//        Page<OutputFileEntity> page = modelServer.findByList(TypeCode.FILE_TYPE_MODEL, param, token);
+//        return new R(200, page);
+//    }
+
+
+//    @ApiOperation("删除文件")
+//    @GetMapping("delete/{fileId}/")
+//    public R deleteFile(@PathVariable("fileId") Long fileId) {
+//        log.info("run deleteFile: {}", fileId);
+//        OutputFileEntity entity = modelServer.findById(fileId);
+//        entity.setResStatus(1);
+//        modelServer.save(entity);
+//
+//        FileEntity fileEntity = modelServer.findByInputFileId(entity.getUploadId());
+//        fileEntity.setResStatus(1);
+//        modelServer.saveInputFile(fileEntity);
+//
+//        asyncTask.modelDelete(fileId, modelServer);
+//        return new R(200, MsgCode.SUCCESS);
+//    }
+
+
+
+//    @RequiresRoles("admin")
+//    @ApiOperation("移动数据到服务器上")
+//    @PostMapping("move/{fileId}/")
+//    public R moveFile(@PathVariable("fileId") Long fileId, @RequestBody ConfigJsonDto param) {
+//        log.info("run moveFile: {}", fileId);
+//        return modelServer.moveFileToServer(fileId, param);
+//    }
+
+
+}

+ 2 - 1
src/main/java/com/fd/controller/RasterController.java

@@ -15,6 +15,7 @@ import com.fd.util.RegexUtils;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.log4j.Log4j2;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.shiro.authz.annotation.RequiresRoles;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.data.domain.Page;
@@ -311,7 +312,7 @@ public class RasterController {
         return new R(200, entity);
     }
 
-
+    @RequiresRoles("admin")
     @ApiOperation("移动数据到服务器上")
     @PostMapping("move/{fileId}/")
     public R moveFile(@PathVariable("fileId") Long fileId, @RequestBody ConfigJsonDto param) {

+ 2 - 0
src/main/java/com/fd/controller/VectorController.java

@@ -18,6 +18,7 @@ import com.fd.util.RegexUtils;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.log4j.Log4j2;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.shiro.authz.annotation.RequiresRoles;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.data.domain.Page;
@@ -367,6 +368,7 @@ public class VectorController {
         return new R(200, entity);
     }
 
+    @RequiresRoles("admin")
     @ApiOperation("移动数据到服务器上")
     @PostMapping("move/{fileId}/")
     public R moveFile(@PathVariable("fileId") Long fileId, @RequestBody ConfigJsonDto param) {

+ 6 - 0
src/main/java/com/fd/entity/OutputFileEntity.java

@@ -124,4 +124,10 @@ public class OutputFileEntity extends BaseEntity implements Serializable {
     @Column
     private String layerRole;
 
+    /**
+     * 打包数据
+     */
+    @Column
+    private String buildPath;
+
 }

+ 27 - 0
src/main/java/com/fd/server/DemServer.java

@@ -0,0 +1,27 @@
+package com.fd.server;
+
+import com.fd.dto.ConfigJsonDto;
+import com.fd.dto.PageDto;
+import com.fd.dto.StyleDto;
+import com.fd.entity.FileEntity;
+import com.fd.entity.OutputFileEntity;
+import com.fd.entity.StyleEntity;
+import com.fd.util.R;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by Owen on 2019/11/21 0021 15:29
+ */
+public interface DemServer extends BaseServer {
+
+
+    OutputFileEntity uploads(MultipartFile[] file, HttpServletRequest req);
+
+    void test();
+
+    R cmdSlice(Long fileId);
+}

+ 589 - 0
src/main/java/com/fd/server/impl/DemServerImpl.java

@@ -0,0 +1,589 @@
+package com.fd.server.impl;
+
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.fd.constant.Command;
+import com.fd.constant.MsgCode;
+import com.fd.constant.TypeCode;
+import com.fd.dto.ConfigJsonDto;
+import com.fd.entity.FileEntity;
+import com.fd.entity.OutputFileEntity;
+import com.fd.entity.StyleEntity;
+import com.fd.entity.User;
+import com.fd.repository.FileRepository;
+import com.fd.repository.OutputFileRepository;
+import com.fd.repository.StyleRepository;
+import com.fd.repository.UserRepository;
+import com.fd.server.DemServer;
+import com.fd.server.ModelServer;
+import com.fd.shiro.JWTUtil;
+import com.fd.thread.AsyncTask;
+import com.fd.util.CmdUtil;
+import com.fd.util.FileUtils;
+import com.fd.util.R;
+import lombok.extern.log4j.Log4j2;
+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 org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.PostConstruct;
+import javax.servlet.http.HttpServletRequest;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.Date;
+import java.util.List;
+import java.util.Optional;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+
+
+/**
+ * Created by Owen on 2019/11/21 0021 15:29
+ */
+@Log4j2
+@Service
+public class DemServerImpl extends BaseServerImpl implements DemServer {
+
+    private String INPUT_PATH;
+
+    private String OUTPUT_PATH;
+
+    @Value("${copy.file.path.model}")
+    private String MOVE_FILE_TO_SERVER;
+
+    // config.json 地址
+    @Value("${config.path}")
+    private String CONFIG_JSON_PATH;
+
+    @Value("${base.path}")
+    private String BASE_PATH;
+
+    // config.json  teileset 的相对路径
+    @Value("${config.tileset}")
+    private String CONFIG_TILESET;
+
+    @Autowired
+    private AsyncTask asyncTask;
+
+
+    @PostConstruct
+    private void init(){
+        this.INPUT_PATH = BASE_PATH  + "/input/dem/";
+        this.OUTPUT_PATH = BASE_PATH + "/output/dem/";
+    }
+
+    @Autowired
+    private FileRepository fileRepository;
+
+    @Autowired
+    private OutputFileRepository outputFileRepository;
+
+    @Autowired
+    private StyleRepository styleRepository;
+
+
+    @Autowired
+    private UserRepository userRepository;
+
+    /**
+     * 队列
+     */
+    private static BlockingQueue<Integer> queue = new LinkedBlockingQueue<Integer>(2);
+
+    /**
+     * 保证线程安全的
+     */
+    private static AtomicInteger count = new AtomicInteger();
+
+
+    @Override
+    public OutputFileEntity uploads(MultipartFile[] files, HttpServletRequest req) {
+        log.warn("run uploads");
+        if (files != null && files.length > 0) {
+
+
+
+            // 创建目录
+            String time = DateUtil.format(new DateTime(), "yyyyMMdd_HHmmss");
+            String filePath = INPUT_PATH + time + "/";
+            FileUtils.createDir(filePath);
+            log.info("filePath: {}", filePath);
+
+            // 存储多个文件名
+            StringBuilder sb = new StringBuilder();
+
+            for (MultipartFile f : files) {
+                String filename = f.getOriginalFilename();
+                sb.append(filename).append(",");
+
+                try {
+                    FileUtils.bigFileWrite(f.getInputStream(), filePath + filename);
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            log.warn("FileWrite success");
+
+
+            // 数据打包
+//            String outPath = OUTPUT_PATH + "bulid/" + time + "/";
+            String outPath = OUTPUT_PATH + "bulid/";
+            FileUtils.createDir(outPath);
+            outPath = outPath + time + ".vrt";
+            String cmd = Command.DEM_BUILD;
+            cmd = cmd.replace("@inputFile", filePath + "*.tif");
+            cmd = cmd.replace("@outputFile", outPath);
+            log.warn("cmd: {}", cmd);
+            Integer integer = CmdUtil.exeCmdSingle(cmd);
+            log.warn("cmd success");
+
+            // 保存信息
+            OutputFileEntity outputFile = new OutputFileEntity();
+            if (integer == 0) {
+                FileEntity entity = new FileEntity();
+                entity.setDirectory(time);
+                entity.setFileName(sb.toString());
+                // 只存目录,没有存完整路径
+                entity.setFileUrl(filePath);
+                entity.setCreateTime(new Date());
+                entity.setUpdateTime(new Date());
+                entity.setType(TypeCode.FILE_TYPE_DEM);
+//                entity.setCoord(coord);
+                entity.setResStatus(0);
+                entity = fileRepository.save(entity);
+
+                outputFile.setUploadId(entity.getId());
+                outputFile.setUploadPath(entity.getFileUrl());
+                outputFile.setDirectory(entity.getDirectory());
+//                outputFile.setFileName(shpName);
+                // 等下在修改
+                outputFile.setStatus(2);
+                outputFile.setType(TypeCode.FILE_TYPE_DEM);
+//                outputFile.setCoord(entity.getCoord());
+                outputFile.setCreateTime(new Date());
+                outputFile.setUpdateTime(new Date());
+                outputFile.setResStatus(0);
+                outputFile.setBuildPath(outPath);
+
+                outputFile = outputFileRepository.save(outputFile);
+                log.warn("end uploads");
+                return outputFile;
+
+
+        }
+
+        }
+
+        return null;
+    }
+
+
+    @Override
+    public void test() {
+        log.warn("input: {}", INPUT_PATH);
+    }
+
+    @Override
+    public R cmdSlice(Long fileId) {
+        log.warn("run cmdSlice: {}", fileId);
+
+        OutputFileEntity entity = null;
+        Optional<OutputFileEntity> o = outputFileRepository.findById(fileId);
+        if (o.isPresent()) {
+            entity = o.get();
+        }
+
+
+        String outputPath = OUTPUT_PATH + "slice/" + entity.getDirectory();
+        FileUtils.createDir(outputPath);
+        log.warn("outputPath: {}", outputPath);
+
+        // 切片命令
+        String cmd = Command.DEM_SLICE;
+        cmd = cmd.replace("@inputFile", entity.getBuildPath());
+        cmd = cmd.replace("@outputFile", outputPath);
+//        log.info("cmd: {}", cmd);
+
+        // 把数据放入队列中
+        boolean offer = false;
+        try {
+            offer = queue.offer(count.incrementAndGet(), 1, TimeUnit.SECONDS);
+            log.info("dem slice enqueue success");
+        } catch (Exception e) {
+
+            log.error("error enqueue: {}", e);
+            e.printStackTrace();
+        }
+
+
+        if (offer) {
+            // 6:切片中
+            entity.setStatus(6);
+            entity.setUpdateTime(new Date());
+            // 是目录
+            entity.setServicePath(outputPath);
+
+            entity = outputFileRepository.save(entity);
+            asyncTask.demSlice(queue, outputFileRepository, entity, cmd);
+        } else {
+            // 0:切片失败
+            entity.setStatus(0);
+            entity.setUpdateTime(new Date());
+            outputFileRepository.save(entity);
+
+            return new R(5200, MsgCode.E52000);
+
+        }
+
+        log.warn("end cmdSlice");
+
+        return new R(200, entity);
+    }
+
+//    @Override
+//    public R deleteById(Long fileId) {
+//        // 删除服务器文件
+//        Optional<OutputFileEntity> e = outputFileRepository.findById(fileId);
+//        if (!e.isPresent()) {
+//            return new R(50002, MsgCode.E50002);
+//        }
+//        OutputFileEntity fileEntity = e.get();
+//
+//        // 删除配置文件config.json制定行
+//        StyleEntity styleEntity = styleRepository.findByOutputFileIdTop(fileId);
+//        if (styleEntity != null) {
+//            deleteRowConfigJson(styleEntity);
+//        }
+//
+//        // 删除数据库记录
+//        outputFileRepository.deleteById(fileId);
+//        fileRepository.deleteById(fileEntity.getUploadId());
+//        styleRepository.deleteByOutputFileId(fileId);
+//
+//        // 文件
+//        if (fileEntity.getUploadPath() != null) {
+//            FileUtils.delFolder(fileEntity.getUploadPath());
+//        }
+//
+//        if (fileEntity.getCoordGeneralPath() != null) {
+//            FileUtils.delFolder(fileEntity.getCoordGeneralPath());
+//        }
+//
+//        if (fileEntity.getUnZipPath() != null) {
+//            FileUtils.delFolder(fileEntity.getUnZipPath());
+//        }
+//
+//        if (fileEntity.getGeojsonPath() != null) {
+//            FileUtils.delFolder(fileEntity.getGeojsonPath());
+//        }
+//
+//        if (fileEntity.getCoordStrictPath() != null) {
+//            FileUtils.delFolder(fileEntity.getCoordStrictPath());
+//        }
+//
+//        if (fileEntity.getSlicePath() != null) {
+//            FileUtils.delFolder(fileEntity.getSlicePath());
+//        }
+//
+//
+//
+//
+//        return new R(200, MsgCode.SUCCESS);
+//    }
+//
+//
+//    /**
+//     * 删除指定行的config.json 数据
+//     */
+//    private void deleteRowConfigJson(StyleEntity entity) {
+//        String s = FileUtils.readFile(CONFIG_JSON_PATH);
+//        JSONObject original = JSON.parseObject(s);
+//        log.info("original: {}", s);
+//
+//        JSONArray layers = JSON.parseArray(original.getString("layers"));
+//
+//        for (int i = 0; i < layers.size(); i++) {
+//            JSONObject o = (JSONObject) layers.get(i);
+//            if (o.getString("name").equals(entity.getName())) {
+//                // 删除对象
+//                layers.remove(i);
+//            }
+//        }
+//
+//        // 更新json
+//        original.put("layers", layers);
+//        log.info("original update: {}", original.toJSONString());
+//
+//        // 更新config.json
+//        try {
+//            FileUtils.fileWriter(JSON.toJSONString(original), CONFIG_JSON_PATH);
+//        } catch (IOException e) {
+//            e.printStackTrace();
+//        }
+//
+//    }
+//
+//    @Override
+//    public List<FileEntity> findByFileName(String fileName) {
+//
+////        return fileRepository.findByFileNameAndType(fileName, TypeCode.FILE_TYPE_MODEL);
+//        return fileRepository.findByFileNameAndTypeAndResStatus(fileName, TypeCode.FILE_TYPE_MODEL, 0);
+//    }
+//
+//    @Override
+//    public Integer cmdSlice(String commandStr) {
+//
+//            // 命令运行结果 1:失败, 0:成功
+//            Integer isCmd = null;
+//            try {
+//                String[] cmd = new String[]{"/bin/sh", "-c", commandStr};
+//                Process ps = Runtime.getRuntime().exec(cmd);
+//
+//                BufferedReader br = new BufferedReader(new InputStreamReader(ps.getInputStream()));
+//                BufferedReader errorBuf = new BufferedReader(new InputStreamReader(ps.getErrorStream()));
+//
+//                StringBuffer sb = new StringBuffer();
+//                StringBuffer errorStr = new StringBuffer();
+//
+//                // error : 坑, 控制台信息是从errorBuf这里出来的
+//                String errorLine;
+//                while ((errorLine = errorBuf.readLine()) != null) {
+//                    errorStr.append(errorLine).append("\n");
+//                    log.info("line data: {}", errorLine);
+//                }
+//                if (StringUtils.isNotEmpty(errorStr)){
+//                    log.info("error result: {}", errorStr.toString());
+//                }
+//
+//                // success ,没有获取到信息
+//                String line;
+//                while ((line = br.readLine()) != null) {
+//                    //执行结果加上回车
+//                    sb.append(line).append("\n");
+//                    log.info("data: {}", line);
+//                }
+//                log.info("result: {}", sb.toString());
+//
+//                // 结束命令行
+//                isCmd = ps.waitFor();
+//
+//                // 关闭流
+//                br.close();
+//                errorBuf.close();
+//
+//            } catch (Exception e) {
+//                e.printStackTrace();
+//            }
+//
+//            if (isCmd == 0) {
+//                log.info("end exeCmd : {}", isCmd);
+//            } else {
+//                log.info("wsitFore cmd run error : {}", isCmd);
+//            }
+//            return isCmd;
+//        }
+//
+//
+//
+//
+//
+//
+//
+//
+//    @Override
+//    public R moveFileToServer(Long fileId, ConfigJsonDto param) {
+//        Optional<OutputFileEntity> o = outputFileRepository.findById(fileId);
+//        if (!o.isPresent()) {
+//            log.info("id:{} 不存在", fileId);
+//            return new R(50002, MsgCode.E50002);
+//        }
+//        OutputFileEntity entity = o.get();
+//        // 移动文件
+////        FileUtils.createDir(MOVE_FILE_TO_SERVER);
+//
+//        try {
+////            org.apache.commons.io.FileUtils.copyDirectoryToDirectory(new File(entity.getSlicePath()), new File(MOVE_FILE_TO_SERVER));
+//            // 修改前端的config.json 文件
+//            writeJsonFile(param, entity);
+//
+//            // 成功,状态
+//            entity.setStatus(8);
+//            entity.setUpdateTime(new Date());
+//
+//            // 添加图层角色
+//            entity.setLayerRole(param.getRole());
+//            outputFileRepository.save(entity);
+//
+//            return new R(200, MsgCode.SUCCESS);
+//        } catch (Exception e) {
+//
+//            // 发布失败
+//            entity.setStatus(10);
+//            entity.setUpdateTime(new Date());
+//            outputFileRepository.save(entity);
+//            e.printStackTrace();
+//            return new R(51004, MsgCode.E51004, e);
+//        }
+//
+//    }
+//
+//
+//    @Override
+//    public R uploadBigFile(MultipartFile file, String token) {
+//        log.warn("run uploadBigFile");
+//        long start = System.currentTimeMillis();
+//        if (file.isEmpty() || file.getSize() <= 0) {
+//            log.info("文件为空");
+//            return new R(50001, MsgCode.E50001);
+//        }
+//
+//        // 文件名全名
+//        String fullFileName = file.getOriginalFilename();
+//
+//        // 创建目录路径
+//        FileUtils.createDir(INPUT_FILE_PATH);
+//
+//        // 拼接唯一文件名
+//        long timeMillis = System.currentTimeMillis();
+////        String fileName = timeMillis + "_" + fullFileName;
+//        String fileName = fullFileName;
+//
+//        // 文件保存路径
+//        String filePath = INPUT_FILE_PATH + fileName;
+//
+//        // 写文件到本地
+//        try {
+//            FileUtils.bigFileWrite(file.getInputStream(), filePath);
+//        } catch (IOException e) {
+//            e.printStackTrace();
+//        }
+//        log.info("filePath: {}", filePath);
+//
+//
+//        String username = JWTUtil.getUsername(token);
+//
+//        // 根据用户名查找用户
+//        User user = userRepository.findByUsername(username);
+//
+//        // 保存信息到db
+//        FileEntity entity = new FileEntity();
+//        entity.setFileName(fileName);
+//        entity.setFileUrl(filePath);
+//        entity.setCreateTime(new Date());
+//        entity.setUpdateTime(new Date());
+//        entity.setType(TypeCode.FILE_TYPE_MODEL);
+////        entity.setStatus(1);
+//        entity.setResStatus(0);
+//        entity = fileRepository.save(entity);
+//
+//
+//
+//        OutputFileEntity outputFile = new OutputFileEntity();
+//        outputFile.setUploadId(entity.getId());
+//        outputFile.setUploadPath(entity.getFileUrl());
+//        outputFile.setFileName(entity.getFileName());
+//        outputFile.setStatus(1);
+//        outputFile.setResStatus(0);
+//        outputFile.setType(TypeCode.FILE_TYPE_MODEL);
+//        outputFile.setCreateTime(new Date());
+//        outputFile.setUpdateTime(new Date());
+//
+//        // 添加分组
+//        outputFile.setUserId(user.getId());
+//        outputFile.setUserGroup(user.getUserGroup());
+//
+//        outputFile = outputFileRepository.save(outputFile);
+//
+//
+//        long end = System.currentTimeMillis();
+//        log.info("end uploadBigFile, total time: {} s", (end - start)/1000);
+//        return new R(200, outputFile);
+//    }
+//
+//    @Override
+//    public OutputFileEntity findByUploadId(Long uploadId) {
+//        return outputFileRepository.findByUploadId(uploadId);
+//    }
+//
+//    @Override
+//    public OutputFileEntity save(OutputFileEntity fileSchedule) {
+//        return outputFileRepository.save(fileSchedule);
+//    }
+//
+//
+//
+//
+//
+//
+//    private void writeJsonFile(ConfigJsonDto param,  OutputFileEntity entity) {
+//        String s = FileUtils.readFile(CONFIG_JSON_PATH);
+//
+//        StyleEntity styleEntity = styleRepository.findByOutputFileIdTop(entity.getId());
+//        if (styleEntity == null) {
+//            styleEntity = new StyleEntity();
+//            styleEntity.setOutputFileId(entity.getId());
+//            styleEntity.setCreateTime(new Date());
+//            styleEntity.setResStatus(0);
+//        }
+//
+//
+//        JSONObject original = JSON.parseObject(s);
+//
+//        log.info("original: {}", s);
+//
+//        JSONArray layers = JSON.parseArray(original.getString("layers"));
+//
+//        JSONObject subJson = new JSONObject();
+//        long cu = System.currentTimeMillis();
+//        // 需要唯一
+//        String name = "model_" + cu;
+//        subJson.put("name", name);
+//        subJson.put("text", param.getText());
+//        // raster 就用这个类型
+//        subJson.put("type", "tileset");
+//        subJson.put("checked", false);
+//        subJson.put("show", true);
+//
+//        String slicePath = entity.getSlicePath();
+////        slicePath = slicePath.replace("/root/gis/data", "");
+//        slicePath = slicePath.replace(BASE_PATH, "");
+//
+//        subJson.put("url", slicePath);
+//
+//        layers.add(subJson);
+//
+//        original.put("layers", layers);
+//
+//        log.info("original update: {}", original.toJSONString());
+//        try {
+//            FileUtils.fileWriter(JSON.toJSONString(original), CONFIG_JSON_PATH);
+//
+//            // 将图层信息保存到db
+//            // 前端需要layer信息
+//            styleEntity.setLayer(subJson.toJSONString());
+//            styleEntity.setUpdateTime(new Date());
+//            styleEntity.setName(name);
+//            styleRepository.save(styleEntity);
+//        } catch (IOException e) {
+//            e.printStackTrace();
+//        }
+//    }
+//
+//    public static void main(String[] args) throws IOException {
+//        String path1 = "F:\\test\\a1";
+//        String path2 = "F:\\test\\vts.log";
+////        org.apache.commons.io.FileUtils.deleteDirectory(new File(path2));
+//        FileUtils.delFolder(path1);
+//    }
+
+
+
+}

+ 1 - 0
src/main/java/com/fd/shiro/ShiroConfig.java

@@ -84,6 +84,7 @@ public class ShiroConfig {
         filterRuleMap.put("/logout", "anon");
         filterRuleMap.put("/test/**", "anon");
         filterRuleMap.put("/manage/**", "anon");
+        filterRuleMap.put("/api/dem/**", "anon");
 
         // swagger 不拦截
         filterRuleMap.put("/swagger-resources/**", "anon");

+ 37 - 0
src/main/java/com/fd/thread/AsyncTask.java

@@ -6,9 +6,11 @@ import com.fd.constant.Command;
 import com.fd.constant.MsgCode;
 import com.fd.constant.TypeCode;
 import com.fd.entity.OutputFileEntity;
+import com.fd.repository.OutputFileRepository;
 import com.fd.server.ModelServer;
 import com.fd.server.RasterServer;
 import com.fd.server.VectorServer;
+import com.fd.util.CmdUtil;
 import com.fd.util.FileUtils;
 import lombok.extern.log4j.Log4j2;
 import org.apache.commons.lang3.StringUtils;
@@ -400,4 +402,39 @@ public class AsyncTask {
 
     }
 
+    @Async("taskExecutor")
+    public void test() {
+        log.warn("测试线程池");
+    }
+
+    @Async("taskExecutor")
+    public void demSlice(BlockingQueue<Integer> queue, OutputFileRepository outputFileRepository, OutputFileEntity entity, String cmd) {
+        log.warn("run demSliceThread");
+        // 保存数据开关
+        Integer flag = 1;
+        Integer data = null;
+        try {
+            log.info("cmd: {}", cmd);
+            flag = CmdUtil.exeCmdSingle(cmd);
+            data = queue.poll(2, TimeUnit.SECONDS);
+
+        } catch (Exception e) {
+            Thread.currentThread().interrupt();
+            e.printStackTrace();
+        }
+
+        if (flag == 0 && data != null) {
+            // 切片成功
+            entity.setStatus(5);
+        } else {
+            // 切片失败
+            entity.setStatus(0);
+        }
+        entity.setUpdateTime(new Date());
+        outputFileRepository.save(entity);
+
+        log.warn("end demSliceThread id {}", entity.getId());
+
+
+    }
 }

+ 66 - 0
src/main/java/com/fd/util/CmdUtil.java

@@ -0,0 +1,66 @@
+package com.fd.util;
+
+import lombok.extern.log4j.Log4j2;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+
+/**
+ * Created by Owen on 2020/1/3 0003 16:30
+ * 命令行工具类
+ */
+@Log4j2
+public class CmdUtil {
+
+    public static Integer exeCmdSingle(String commandStr) {
+
+        // 命令运行结果 1:失败, 0:成功
+        Integer isCmd = null;
+        try {
+            String[] cmd = new String[]{"/bin/sh", "-c", commandStr};
+            Process ps = Runtime.getRuntime().exec(cmd);
+
+            BufferedReader br = new BufferedReader(new InputStreamReader(ps.getInputStream()));
+            BufferedReader errorBuf = new BufferedReader(new InputStreamReader(ps.getErrorStream()));
+
+            StringBuffer sb = new StringBuffer();
+            StringBuffer errorStr = new StringBuffer();
+
+            // error : 坑, 控制台信息是从errorBuf这里出来的
+            String errorLine;
+            while ((errorLine = errorBuf.readLine()) != null) {
+                errorStr.append(errorLine).append("\n");
+            }
+            if (StringUtils.isNotEmpty(errorStr)){
+                log.info("error result: {}", errorStr.toString());
+            }
+
+            // success ,没有获取到信息
+            String line;
+            while ((line = br.readLine()) != null) {
+                //执行结果加上回车
+                sb.append(line).append("\n");
+            }
+            log.info("result: {}", sb.toString());
+
+            // 结束命令行
+            isCmd = ps.waitFor();
+
+            // 关闭流
+            br.close();
+            errorBuf.close();
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        if (isCmd == 0) {
+            log.info("end exeCmd : {}", isCmd);
+        } else {
+            log.info("wsitFore cmd run error : {}", isCmd);
+        }
+        return isCmd;
+    }
+
+}

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

@@ -52,7 +52,7 @@ spring.redis.jedis.pool.max-wait=-1ms
 
 logging.file=log/cesium.log
 
-base.path=/root/gis/data
+base.path=F:\\cesium
 
 input.file.path.model=/root/gis/cesium/input/model/
 output.file.path.model=/root/gis/cesium/output/model/

+ 1 - 1
src/main/resources/application.properties

@@ -1,7 +1,7 @@
 server.port=8082
 
 # file multipart
-spring.profiles.active=dev
+spring.profiles.active=uat
 spring.servlet.multipart.enabled=true
 spring.servlet.multipart.max-file-size=51200MB
 spring.servlet.multipart.max-request-size=51200MB