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.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.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; import lombok.extern.log4j.Log4j2; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.authz.annotation.RequiresAuthentication; 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 springfox.documentation.annotations.ApiIgnore; 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 2019/11/12 0012 9:40 *

* 3D模型数据 */ @Api(tags = "模型模块") @Log4j2 @RequestMapping("api/fdModel") @RestController public class ModelController { @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 ModelServer modelServer; /** * 队列 */ private static BlockingQueue modelQueue = new LinkedBlockingQueue(2); /** * 保证线程安全的 */ private static AtomicInteger count = new AtomicInteger(); @ApiOperation("上传数据,校验文件名") @GetMapping("check/{fileName}/") @ApiImplicitParam(name = "fileName", value = "文件名", required = true) public R checkFileName(@PathVariable("fileName") String fileName) { log.info("run checkFileName {}", fileName); // 文件是否包含中文字符 // if (RegexUtils.regexChinese(fileName)) { // return new R(51005, MsgCode.E51005); // } String s = StringUtils.substringAfterLast(fileName, "."); if (!"zip".equals(s)) { return new R(50007, MsgCode.E50007); } List list = modelServer.findByFileName(fileName); if (list.size() > 0) { return new R(51006, MsgCode.E51006); } return new R(200, MsgCode.SUCCESS); } @ApiOperation("上传3D模型数据") @PostMapping(value = "upload", consumes = {"multipart/form-data"}) @ApiImplicitParam(name = "file", value = "只能上传zip文件", required = true) public R upload(@RequestParam("file") MultipartFile file, HttpServletRequest req) { log.info("run upload"); String token = req.getHeader("Authorization"); // 文件名全名 String fileName = file.getOriginalFilename(); // 文件是否包含中文字符 // if (RegexUtils.regexChinese(fileName)) { // return new R(51005, MsgCode.E51005); // } String s = StringUtils.substringAfterLast(fileName, "."); if (!"zip".equals(s)) { return new R(50007, MsgCode.E50007); } List list = modelServer.findByFileName(fileName); if (list.size() > 0) { return new R(51006, MsgCode.E51006); } return modelServer.uploadBigFile(file, token); } @ApiOperation("解压zip文件") @GetMapping("unzip/{fileId}/") @ApiImplicitParam(name = "fileId", value = "文件id", required = true) public R fileUnzip(@PathVariable("fileId") Long fileId) { log.info("run fileUnzip: {}", fileId); OutputFileEntity entity = modelServer.findById(fileId); String outputPath = OUTPUT_FILE_PATH + "unzip"; FileUtils.createDir(outputPath); boolean unzip = FileUtils.unzip(entity.getUploadPath(), outputPath); if (!unzip) { log.info("zip error: {}", MsgCode.E51001); return new R(50001, MsgCode.E51001); } String fileName = StringUtils.substringBeforeLast(entity.getFileName(), "."); entity.setStatus(4); entity.setUpdateTime(new Date()); entity.setUnZipPath(outputPath + File.separator + fileName); entity = modelServer.save(entity); return new R(200, entity); } @ApiOperation("获取3D模型数据列表") @PostMapping(value = "list") public R list(@RequestBody PageDto param, HttpServletRequest req) { String token = req.getHeader("Authorization"); Page page = modelServer.findByList(TypeCode.FILE_TYPE_MODEL, param, token); return new R(200, page); } @ApiImplicitParam(name = "fileId", value = "文件id", required = true) @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); } @ApiImplicitParam(name = "fileId", value = "文件id", required = true) @ApiOperation("倾斜摄影数据切片") @GetMapping("command/osgb/{fileId}/") public R cmdModelSlice(@PathVariable("fileId") Long fileId) { log.info("run cmdModelSlice: {}", fileId); OutputFileEntity entity = modelServer.findById(fileId); String fileName = StringUtils.substringBeforeLast(entity.getFileName(), "."); String outputPath = OUTPUT_FILE_PATH + "slice"; FileUtils.createDir(outputPath); outputPath = outputPath + File.separator + fileName; // 传入的是目录 String cmd = Command.MODEL_SLICE_OSGB; cmd = cmd.replace("@inputFile", entity.getUnZipPath()); cmd = cmd.replace("@outputFile", outputPath); log.info("cmd: {}", cmd); // 把数据放入队列中 boolean offer = false; try { offer = modelQueue.offer(count.incrementAndGet(), 1, TimeUnit.SECONDS); log.info("model slice 入队成功"); } catch (Exception e) { log.error("error producer queue model cmdModelSlice: {}", e); e.printStackTrace(); } log.info("end cmdModelSlice"); if (offer) { // 命令产生的是文件夹 entity.setStatus(6); entity.setUpdateTime(new Date()); entity.setSlicePath(outputPath); entity = modelServer.save(entity); asyncTask.modelSlice(modelQueue, modelServer, entity, cmd); return new R(200, entity); } // 入队失败 return new R(52000, MsgCode.E52000); } @ApiImplicitParam(name = "fileId", value = "文件id", required = true) @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); } @ApiIgnore @RequiresRoles("admin") @ApiOperation("测试") @PostMapping("test") public R test() { log.info("run test "); return new R(2000, "admin 权限可以查看 model"); } }