src/main/java/com/se/simu/controller/FilesUploadController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/se/simu/controller/SimuController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/se/simu/service/SimuFilesService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/resources/application-prod.yml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/resources/application-zyy.yml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/main/java/com/se/simu/controller/FilesUploadController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,183 @@ package com.se.simu.controller; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.zip.ZipEntry; @Api(tags = "0-æä»¶ç¸å ³æ¥å£") @Slf4j @CrossOrigin(origins = "*") @RestController @RequestMapping("/v1/files") public class FilesUploadController { @Value("${simu-app.filePath}") // private final String uploadedFolder = "D:/home/scheme/upload"; private String uploadedFolder; @ApiOperation("0-æä»¶ä¸ä¼ å°å") @GetMapping("/getUploadPath") public ResponseEntity<String> getUploadPath() throws Exception { return ResponseEntity.ok("æä»¶ä¸ä¼ å°å为ï¼" + uploadedFolder); } @ApiOperation("1-ä¸ä¼ å个æä»¶") @ApiImplicitParam(name = "filePathName", value = "æä»¶å¤¹åç§°", required = true, dataType = "String", paramType = "query", example = "upload", dataTypeClass = String.class) @PostMapping("/uploadSingleFile") public ResponseEntity<String> uploadSingleFile(@RequestParam("file") MultipartFile file, @RequestParam("filePathName") String filePathName) throws IOException { if (file.isEmpty()) { return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("æä»¶ä¸è½ä¸ºç©º"); } // 夿 filePathName æ¯å¦ä¸ºç©º if (filePathName == null || filePathName.isEmpty()) { filePathName = "upload"; //return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("æä»¶å¤¹åç§°ä¸è½ä¸ºç©º"); } String targetDir = Paths.get(uploadedFolder, filePathName).toString(); log.info("ç®æ ç®å½: {}", targetDir); createDirectoriesIfNotExists(targetDir); try { file.transferTo(Paths.get(targetDir, file.getOriginalFilename())); return ResponseEntity.ok("æä»¶ä¸ä¼ æå"); } catch (IOException e) { log.error("æä»¶ä¸ä¼ 失败", e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("æä»¶ä¸ä¼ 失败"); } } @ApiOperation("2-ä¸ä¼ å¤ä¸ªæä»¶") @ApiImplicitParam(name = "filePathName", value = "æä»¶å¤¹åç§°", required = true, dataType = "String", paramType = "query", example = "upload", dataTypeClass = String.class) @PostMapping("/uploadMultipleFiles") public ResponseEntity<String> uploadMultipleFiles(List<MultipartFile> files, @RequestParam("filePathName") String filePathName) throws IOException { // 夿 filePathName æ¯å¦ä¸ºç©º if (filePathName == null || filePathName.isEmpty()) { // return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("æä»¶å¤¹åç§°ä¸è½ä¸ºç©º"); filePathName = "upload"; } // ä¸ä¼ æä»¶è·¯å¾ String targetDir = Paths.get(uploadedFolder, filePathName).toString(); log.info("ç®æ ç®å½: {}", targetDir); createDirectoriesIfNotExists(targetDir); CompletableFuture<Void> allUploadTasks = CompletableFuture.allOf(files.stream() .map(file -> CompletableFuture.runAsync(() -> { try { file.transferTo(Paths.get(targetDir, file.getOriginalFilename())); } catch (IOException e) { log.error("æä»¶ä¸ä¼ 失败", e); throw new RuntimeException("æä»¶ä¸ä¼ 失败"); } })).toArray(CompletableFuture[]::new)); try { allUploadTasks.get(); return ResponseEntity.ok("æææä»¶ä¸ä¼ æå!ä¸ä¼ ç®å½ä¸ºï¼" + targetDir); } catch (InterruptedException | ExecutionException e) { log.error("æä»¶ä¸ä¼ 失败", e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("æä»¶ä¸ä¼ 失败"); } } @ApiOperation("2-1ä¸ä¼ å¤ä¸ªæä»¶") @ApiImplicitParam(name = "filePathName", value = "æä»¶å¤¹åç§°", required = true, dataType = "String", paramType = "query", example = "upload", dataTypeClass = String.class) @PostMapping("/uploadMultipleFile") public ResponseEntity<String> uploadMultipleFile(List<MultipartFile> files, @RequestParam("filePathName") String filePathName) throws IOException { // ä¸ä¼ æä»¶è·¯å¾ String targetDir = Paths.get(uploadedFolder, filePathName).toString(); log.info("ç®æ ç®å½: {}", targetDir); createDirectoriesIfNotExists(targetDir); try { for (MultipartFile file : files) { String fileName = file.getOriginalFilename(); File targetFile = new File(targetDir, fileName); file.transferTo(targetFile); } return ResponseEntity.ok("æææä»¶ä¸ä¼ æå!ä¸ä¼ ç®å½ä¸ºï¼" + targetDir); } catch (IOException e) { log.error("æä»¶ä¸ä¼ 失败", e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("æä»¶ä¸ä¼ 失败"); } } private File newFile(File destinationDir, ZipEntry zipEntry) throws Exception { File destFile = new File(destinationDir, zipEntry.getName()); String destDirPath = destinationDir.getCanonicalPath(); String destFilePath = destFile.getCanonicalPath(); if (!destFilePath.startsWith(destDirPath + File.separator)) { throw new Exception("Entry is outside of the target dir: " + zipEntry.getName()); } return destFile; } /** * ææä»¶è·¯å¾å 餿件夹 * éå½å 餿件夹åæä»¶çæ¹æ³ * * @param folder æä»¶å¤¹ */ private void deleteFolderByFilePath(File folder) { if (folder.exists()) { File[] files = folder.listFiles(); if (files != null) { for (File file : files) { if (file.isDirectory()) { // éå½å é¤åæä»¶å¤¹ deleteFolderByFilePath(file); } else { // å 餿件 file.delete(); } } } // å 餿件夹æ¬èº« folder.delete(); } } /** * @param targetDir ç®æ ç®å½ * @throws IOException */ private void createDirectoriesIfNotExists(String targetDir) throws IOException { Path path = Paths.get(targetDir); if (!Files.exists(path)) { Files.createDirectories(path); } } private Boolean directoriesIfNotExists(String targetDir) throws IOException { Path path = Paths.get(targetDir); if (!Files.exists(path)) { // Files.createDirectories(path); return false; } else { return true; } } } src/main/java/com/se/simu/controller/SimuController.java
@@ -1,6 +1,7 @@ package com.se.simu.controller; import com.baomidou.mybatisplus.core.metadata.IPage; import com.se.simu.config.PropertiesConfig; import com.se.simu.domain.dto.GeDb; import com.se.simu.domain.dto.GeLayer; import com.se.simu.domain.po.DataPo; @@ -8,19 +9,26 @@ import com.se.simu.domain.vo.CreateSimuVo; import com.se.simu.domain.vo.R; import com.se.simu.domain.vo.SimuVo; import com.se.simu.service.GedbService; import com.se.simu.service.ResultService; import com.se.simu.service.SimuService; import com.se.simu.service.UwService; import com.se.simu.service.*; import io.swagger.annotations.*; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.stream.Collectors; @Api(tags = "仿ç管ç") @Slf4j @@ -36,6 +44,12 @@ @Resource SimuService simuService; @Resource SimuFilesService simuFilesService; @Resource PropertiesConfig config; @Resource ResultService resultService; @@ -164,4 +178,135 @@ return fail(ex, false); } } @ApiOperation("test-ä¸ä¼ å¤ä¸ªæä»¶") @ApiImplicitParam(name = "schemeName", value = "æ¹æ¡åç§°", required = true, dataType = "String", paramType = "query", example = "edf243d3-3bec-4c51-9930-1ba862d9b5a3", dataTypeClass = String.class) @PostMapping("/uploadMultipleFiles") public ResponseEntity<String> uploadMultipleFiles(List<MultipartFile> files, @RequestParam("schemeName") String schemeName) throws IOException { // ä¸ä¼ æä»¶è·¯å¾ String targetDir = Paths.get(config.getOutPath(), schemeName).toString(); log.info("ç®æ ç®å½: {}", targetDir); createDirectoriesIfNotExists(targetDir); List<CompletableFuture<Void>> uploadTasks = files.stream() .map(file -> CompletableFuture.runAsync(() -> { try { file.transferTo(Paths.get(targetDir, file.getOriginalFilename())); } catch (IOException e) { log.error("æä»¶ä¸ä¼ 失败", e); throw new RuntimeException("æä»¶ä¸ä¼ 失败"); } })) .collect(Collectors.toList()); CompletableFuture<Void> allUploadTasks = CompletableFuture.allOf(uploadTasks.toArray(new CompletableFuture[0])); try { allUploadTasks.get(); return ResponseEntity.ok("æææä»¶ä¸ä¼ æå"); } catch (InterruptedException | ExecutionException e) { log.error("æä»¶ä¸ä¼ 失败", e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("æä»¶ä¸ä¼ 失败"); } } /** * @param targetDir ç®æ ç®å½ * @throws IOException */ private void createDirectoriesIfNotExists(String targetDir) throws IOException { Path path = Paths.get(targetDir); if (!Files.exists(path)) { Files.createDirectories(path); } } /** * æä»¶å建模æ * * @param vo VO * @return {@link R}<{@link Object}> */ @ApiOperation(value = "æä»¶å建") @PostMapping(value = "/file_create", produces = "application/json; charset=UTF-8") public R<Object> fileCreate(List<MultipartFile> files,@RequestBody @ApiParam("å建仿çè§å¾ç±»") CreateSimuVo vo) throws IOException { // ä¸ä¼ æä»¶è·¯å¾ String targetDir = Paths.get(config.getOutPath(), "files").toString(); log.info("ç®æ ç®å½: {}", targetDir); createDirectoriesIfNotExists(targetDir); List<CompletableFuture<Void>> uploadTasks = files.stream() .map(file -> CompletableFuture.runAsync(() -> { try { file.transferTo(Paths.get(targetDir, file.getOriginalFilename())); } catch (IOException e) { log.error("æä»¶ä¸ä¼ 失败", e); throw new RuntimeException("æä»¶ä¸ä¼ 失败"); } })) .collect(Collectors.toList()); CompletableFuture<Void> allUploadTasks = CompletableFuture.allOf(uploadTasks.toArray(new CompletableFuture[0])); try { allUploadTasks.get(); log.info("æä»¶ä¸ä¼ æå"); } catch (InterruptedException | ExecutionException e) { log.error("æä»¶ä¸ä¼ 失败", e); } try { if (null == vo.getTotal() || vo.getTotal() < 1 || vo.getTotal() > 1000) { return fail("éé¨éä¸è½ä¸ºç©ºï¼ä¸åå¼å¨1~1000ä¹é´"); } if (null == vo.getDuration() || vo.getDuration() < 1 || vo.getDuration() > 10080) { return fail("ä»¿çæ¶é¿ä¸è½ä¸ºç©ºï¼ä¸åå¼å¨1~10080ä¹é´"); } if (null == vo.getMinx() || null == vo.getMiny() || null == vo.getMaxx() || null == vo.getMaxy()) { return fail("éæ©èå´ä¸è½ä¸ºç©º", false); } if (null == vo.getPid() || vo.getPid() < 0) { vo.setPid(0); } if (null == vo.getNum() || vo.getNum() < 1) { vo.setNum(simuService.getMaxId() + 1); } if (null == vo.getPid() || vo.getPid() < 0) { vo.setPid(0); } if (null == vo.getStartTime()) { vo.setStartTime(new Date()); } if (vo.getPid() > 0) { SimuPo pp = simuService.getSimuByPid(vo.getPid()); if (null == pp) { return fail("pidä¸åå¨"); } if (null == vo.getFloodStart() || vo.getFloodStart() < 1 || vo.getFloodStart() > vo.getDuration() * 60) { return fail("鲿±å¼å§æ¶é´ä¸è½ä¸ºç©ºï¼ä¸åå¼å¨1~" + (vo.getDuration() * 60) + "ä¹é´"); } if (null == vo.getFloodEnd() || vo.getFloodEnd() < vo.getFloodStart() || vo.getFloodEnd() > vo.getDuration() * 60) { return fail("鲿±ç»ææ¶é´ä¸è½ä¸ºç©ºï¼ä¸åå¼å¨" + vo.getFloodStart() + "~" + (vo.getDuration() * 60) + "ä¹é´"); } if (null == vo.getFloodHeight() || vo.getFloodHeight() < 1 || vo.getFloodHeight() > 2000) { return fail("鲿±é«åº¦ä¸è½ä¸ºç©ºï¼ä¸åå¼å¨1~2000ä¹é´"); } if (!FLOOD_TYPE.contains(vo.getFloodType())) { return fail("鲿±ç±»åä¸è½ä¸ºç©ºï¼ä¸åªè½æ¯æ²è¢å鲿°´æ¿"); } if (null == vo.getFloodMinx() || null == vo.getFloodMiny() || null == vo.getFloodMaxx() || null == vo.getFloodMaxy()) { return fail("鲿±èå´ä¸è½ä¸ºç©º", false); } } boolean flag = simuFilesService.createByfiles(vo); return success(flag, flag ? "æå" : "失败"); } catch (Exception ex) { return fail(ex, null); } } } src/main/java/com/se/simu/service/SimuFilesService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,213 @@ package com.se.simu.service; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.OrderItem; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.se.simu.config.PropertiesConfig; import com.se.simu.domain.dto.GeDb; import com.se.simu.domain.po.DataPo; import com.se.simu.domain.po.SimuPo; import com.se.simu.domain.vo.CreateSimuVo; import com.se.simu.domain.vo.SimuVo; import com.se.simu.helper.StringHelper; import com.se.simu.helper.WebHelper; import com.se.simu.mapper.SimuMapper; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.io.File; import java.sql.Timestamp; import java.util.Date; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * SIMU æä»¶æå¡ * * @author xingjinshuang@smartearth.cn * @date 2024/12/24 */ @Slf4j @Service public class SimuFilesService { @Resource SimuMapper simuMapper; @Resource PropertiesConfig config; @Resource GedbService gedbService; @Resource UwService uwService; @Resource ResultService resultService; public IPage<SimuPo> get(SimuVo vo) { QueryWrapper<SimuPo> wrapper = getPageWrapper(vo); Page<SimuPo> page = new Page<>(vo.getPageIndex(), vo.getPageSize()); page.addOrder(OrderItem.desc("id")); IPage<SimuPo> paged = simuMapper.selectPage(page, wrapper); return paged; } private QueryWrapper<SimuPo> getPageWrapper(SimuVo vo) { QueryWrapper<SimuPo> wrapper = new QueryWrapper<>(); if (null != vo.getId()) { wrapper.eq("id", vo.getId()); } if (null != vo.getPid()) { wrapper.eq("pid", vo.getPid()); } if (null != vo.getNum()) { wrapper.eq("num", vo.getNum()); } if (!StringHelper.isEmpty(vo.getName())) { wrapper.like("lower(name)", vo.getName().trim().toLowerCase()); } if (!CollUtil.isEmpty(vo.getStatus())) { wrapper.in("status", vo.getStatus()); } return wrapper; } private boolean delDir(String dir) { File file = new File(dir); if (!file.exists() || !file.isDirectory()) { return false; } return FileUtil.del(dir); } public boolean createByfiles(CreateSimuVo vo) { Date now = new Date(); String date = StringHelper.YMDHMS2_FORMAT.format(now); if (StringHelper.isEmpty(vo.getName())) { vo.setName(date); } DataPo data = BeanUtil.copyProperties(vo, DataPo.class); data.setPath(date, date); initPath(data); SimuPo simu = new SimuPo(vo.getNum(), vo.getPid(), vo.getName(), JSONUtil.toJsonStr(data), 0, vo.getBak()); simu.setServiceName(date); simu.setCreateTime(new Timestamp(now.getTime())); int rows = simuMapper.insert(simu); if (rows > 0) { asyncCall(simu); } return rows > 0; } private void initPath(DataPo data) { createDir(config.getInPath() + File.separator + data.getInPath()); createDir(config.getOutPath() + File.separator + data.getOutPath()); } private void createDir(String path) { File f = new File(path); if (f.exists() && f.isDirectory()) { FileUtil.del(f); } f.mkdirs(); } private void asyncCall(SimuPo simu) { ExecutorService executor = Executors.newSingleThreadExecutor(); executor.execute(new Runnable() { @Override @SneakyThrows public void run() { cope(simu); } }); executor.shutdown(); } /** * "ç¶æï¼ * 0-å建仿çä»»å¡ï¼ * 1-è¿æ¥GEDBåºï¼ * 2-ä¸è½½ç©ºé´æ°æ®ï¼ * 3-ä¸è½½é«ç¨æ°æ®ï¼ * 4-çæéé¨æä»¶ï¼ * 5-çæé ç½®æä»¶ï¼ * 6-模æå æ¶ä»¿çï¼ * 7-å¤çæ°´ä½æä»¶ï¼ * 8-å¤çææ°´æä»¶ï¼ * 9-å¤ç仿çç»æï¼ * 10-宿ï¼-10-åºé * * @param simu 模æ */ private void cope(SimuPo simu) { try { DataPo data = JSONUtil.toBean(simu.getData(), DataPo.class); update(simu, 1, null); String token = gedbService.getToken(); GeDb db = gedbService.connectGedb(token, data); simu.setData(JSONUtil.toJsonStr(data)); update(simu, 2, null); gedbService.copeVectors(token, data, db); update(simu, 3, null); gedbService.copeDem(token, data); update(simu, 4, null); uwService.createRainFile(data); update(simu, 5, null); uwService.createConfig(data); update(simu, 6, null); uwService.callExe(data); update(simu, 7, null); //uwService.copeWaterFiles(); update(simu, 8, null); uwService.copeDrainFiles(data); update(simu, 9, null); resultService.process(data); update(simu, 10, "宿"); } catch (Exception ex) { log.error(ex.getMessage(), ex); update(simu, -simu.getStatus(), ex.getMessage()); } } private void update(SimuPo simu, int status, String rs) { simu.setStatus(status); if (null != rs) simu.setResult(rs); simu.setUpdateTime(WebHelper.getCurrentTimestamp()); simuMapper.updateById(simu); } } src/main/resources/application-prod.yml
@@ -104,8 +104,8 @@ # æ¥è¯¢ä¸åæ°æ®åºç±»åä¸çæ°æ®å°å queryUrl: http://106.120.22.26:8024/geo-service/entitydbdata/layer/query # é¡¹ç®æ¨¡ææä»¶ä¸ä¼ åæ¾çä½ç½® simu-file: # 模æé¡¹ç® simu-app: # é¡¹ç®æ¨¡ææä»¶ä¸ä¼ åæ¾çä½ç½® filePath: D:\simu\app\upload src/main/resources/application-zyy.yml
@@ -102,10 +102,10 @@ # æ¥è¯¢ä¸åæ°æ®åºç±»åä¸çæ°æ®å°å queryUrl: http://106.120.22.26:8024/geo-service/entitydbdata/layer/query # é¡¹ç®æ¨¡ææä»¶ä¸ä¼ åæ¾çä½ç½® simu-file: # 模æé¡¹ç® simu-app: # é¡¹ç®æ¨¡ææä»¶ä¸ä¼ åæ¾çä½ç½® filePath: D:\simu\app\upload filePath: D:\simu\files config: ver: 0.2