From 99c291ca09f8eb3ca093ae6b59e1521a34f49a7c Mon Sep 17 00:00:00 2001 From: xiaohucoding <2307520758@qq.com> Date: Thu, 5 Jun 2025 11:51:01 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E7=AE=97=E6=B3=95=E5=88=9B=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/AlgorithmInfoController.java | 11 ++++ .../mapper/AlgorithmInfoMapper.java | 6 +- .../service/AlgorithmInfoService.java | 1 + .../Impl/AlgorithmInfoServiceImpl.java | 61 ++++++++++++++++++- 4 files changed, 76 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/controller/AlgorithmInfoController.java b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/controller/AlgorithmInfoController.java index 85d72da..5a6d6ca 100644 --- a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/controller/AlgorithmInfoController.java +++ b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/controller/AlgorithmInfoController.java @@ -73,5 +73,16 @@ public class AlgorithmInfoController { algorithmInfoService.save(algorithmInfo); return OptResult.success("算法创建成功"); } + /** + * 算法运行 + */ + @PostMapping("/run/{id}") + @Operation(summary = "运行") + public OptResult run(@PathVariable Long id){ + log.info("运行",id); + algorithmInfoService.run(id); + return OptResult.success("运行成功"); + } + } \ No newline at end of file diff --git a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/mapper/AlgorithmInfoMapper.java b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/mapper/AlgorithmInfoMapper.java index 0faf44e..7d54f14 100644 --- a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/mapper/AlgorithmInfoMapper.java +++ b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/mapper/AlgorithmInfoMapper.java @@ -29,4 +29,8 @@ public interface AlgorithmInfoMapper { @Delete("DELETE FROM algorithm_info WHERE id = #{id}") int deleteById(Long id); -} \ No newline at end of file + @Select("select description from algorithm_info where id = #{id}") + String getDescriptionById(Long id); + @Select("select algorithm_file from algorithm_info where id = #{id}") + String getFileById(Long id); +} \ No newline at end of file diff --git a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/service/AlgorithmInfoService.java b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/service/AlgorithmInfoService.java index 2ee1437..c02aa48 100644 --- a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/service/AlgorithmInfoService.java +++ b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/service/AlgorithmInfoService.java @@ -14,4 +14,5 @@ public interface AlgorithmInfoService { void save(AlgorithmInfo algorithmInfo); + void run(Long id); } \ No newline at end of file diff --git a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/service/Impl/AlgorithmInfoServiceImpl.java b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/service/Impl/AlgorithmInfoServiceImpl.java index 4c67999..b33ca5f 100644 --- a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/service/Impl/AlgorithmInfoServiceImpl.java +++ b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/service/Impl/AlgorithmInfoServiceImpl.java @@ -8,6 +8,9 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.util.ArrayList; import java.util.List; @Service @@ -72,11 +75,65 @@ public class AlgorithmInfoServiceImpl implements AlgorithmInfoService { //查找表里是否有重复的算法,如果有则报错 AlgorithmInfo duplicateName = algorithmInfoMapper.selectByName(algorithmName); if (duplicateName != null){ - throw new RuntimeException("算法已存在"); + throw new RuntimeException("算法已存在,请去修改算法"); } - //todo 算法文件分布式存入分布式存储中 + //todo 算法文件分布式存入分布式存储中 algorithmInfoMapper.insert(algorithmInfo); } + + /** + * 算法执行 + * @param id + */ + @Override + public void run(Long id) { + String description = algorithmInfoMapper.getDescriptionById(id); + /*//拿到传入的描述,并且用逗号分隔 + String[] commaParts = description.split(","); + + List results = new ArrayList<>(); + for (String part : commaParts) { + String[] semicolonParts = part.split(";", 2); + if (semicolonParts.length > 1) { + results.add(semicolonParts[1]); + } else { + throw new RuntimeException("描述格式错误,请修改描述格式"); + } + } + String bag = results.getFirst(); + String function = results.get(1);*/ + String file = algorithmInfoMapper.getFileById(id); + try { + // 构建命令,将 param 作为参数传递给 Python 脚本 + ProcessBuilder pb = new ProcessBuilder("python", file, description); + + // 设置工作目录(如果 Python 脚本不在当前目录) + // pb.directory(new File("/path/to/script")); + + // 启动进程 + Process process = pb.start(); + + // 获取进程输出 + BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); + String line; + while ((line = reader.readLine()) != null) { + System.out.println(line); + } + + // 获取错误输出 + BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream())); + String errorLine; + while ((errorLine = errorReader.readLine()) != null) { + System.err.println("Error: " + errorLine); + } + // 等待进程完成 + int exitCode = process.waitFor(); + System.out.println("Exit Code: " + exitCode); + } catch (Exception e) { + e.printStackTrace(); + } + + } } \ No newline at end of file From 46331fcadefecd686e8adbb10348a9953e369157 Mon Sep 17 00:00:00 2001 From: xiaohucoding <2307520758@qq.com> Date: Thu, 5 Jun 2025 12:37:44 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E7=AE=97=E6=B3=95=E5=88=9B=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/AlgorithmInfoController.java | 13 ++++++++++--- .../mapper/AlgorithmInfoMapper.java | 2 ++ .../service/AlgorithmInfoService.java | 4 +++- .../service/Impl/AlgorithmInfoServiceImpl.java | 11 ++++++++--- 4 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/controller/AlgorithmInfoController.java b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/controller/AlgorithmInfoController.java index 5a6d6ca..4fb6cfa 100644 --- a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/controller/AlgorithmInfoController.java +++ b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/controller/AlgorithmInfoController.java @@ -78,11 +78,18 @@ public class AlgorithmInfoController { */ @PostMapping("/run/{id}") @Operation(summary = "运行") - public OptResult run(@PathVariable Long id){ + public OptResult run(@PathVariable Long id,String param){ log.info("运行",id); - algorithmInfoService.run(id); + algorithmInfoService.run(id,param); return OptResult.success("运行成功"); } - + /** + * 前端列表返回算法名称 + */ + @GetMapping("/names") + @Operation(summary = "列表返回算法名称") + public List getNames(){ + return algorithmInfoService.getAllNames(); + } } \ No newline at end of file diff --git a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/mapper/AlgorithmInfoMapper.java b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/mapper/AlgorithmInfoMapper.java index 7d54f14..c0895e3 100644 --- a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/mapper/AlgorithmInfoMapper.java +++ b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/mapper/AlgorithmInfoMapper.java @@ -33,4 +33,6 @@ public interface AlgorithmInfoMapper { String getDescriptionById(Long id); @Select("select algorithm_file from algorithm_info where id = #{id}") String getFileById(Long id); + @Select("select algorithm_name from algorithm_info") + List getAllNames(); } \ No newline at end of file diff --git a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/service/AlgorithmInfoService.java b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/service/AlgorithmInfoService.java index c02aa48..02f0f63 100644 --- a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/service/AlgorithmInfoService.java +++ b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/service/AlgorithmInfoService.java @@ -14,5 +14,7 @@ public interface AlgorithmInfoService { void save(AlgorithmInfo algorithmInfo); - void run(Long id); + void run(Long id,String param); + + List getAllNames(); } \ No newline at end of file diff --git a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/service/Impl/AlgorithmInfoServiceImpl.java b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/service/Impl/AlgorithmInfoServiceImpl.java index b33ca5f..742e28c 100644 --- a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/service/Impl/AlgorithmInfoServiceImpl.java +++ b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/service/Impl/AlgorithmInfoServiceImpl.java @@ -88,8 +88,8 @@ public class AlgorithmInfoServiceImpl implements AlgorithmInfoService { * @param id */ @Override - public void run(Long id) { - String description = algorithmInfoMapper.getDescriptionById(id); + public void run(Long id,String param) { + /*String description = algorithmInfoMapper.getDescriptionById(id);*/ /*//拿到传入的描述,并且用逗号分隔 String[] commaParts = description.split(","); @@ -107,7 +107,7 @@ public class AlgorithmInfoServiceImpl implements AlgorithmInfoService { String file = algorithmInfoMapper.getFileById(id); try { // 构建命令,将 param 作为参数传递给 Python 脚本 - ProcessBuilder pb = new ProcessBuilder("python", file, description); + ProcessBuilder pb = new ProcessBuilder("python", file, param); // 设置工作目录(如果 Python 脚本不在当前目录) // pb.directory(new File("/path/to/script")); @@ -136,4 +136,9 @@ public class AlgorithmInfoServiceImpl implements AlgorithmInfoService { } } + + @Override + public List getAllNames() { + return algorithmInfoMapper.getAllNames(); + } } \ No newline at end of file From 09424cf223aef96e2a20d70a7fb3f2c2df0192cd Mon Sep 17 00:00:00 2001 From: xiaohucoding <2307520758@qq.com> Date: Mon, 16 Jun 2025 14:08:23 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E7=AE=97=E6=B3=95=E5=92=8C=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E9=9B=86=E7=9A=84=E5=90=8E=E7=AB=AF=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/AlgorithmInfoController.java | 48 +++++++--- .../controller/DatasetController.java | 70 +++++++++++--- .../mapper/AlgorithmInfoMapper.java | 2 + .../pojo/DatasetDTO.java | 1 + .../pojo/DatasetPageQueryDTO.java | 4 +- .../pojo/DatasetVO.java | 1 + .../service/AlgorithmInfoService.java | 7 +- .../service/DatasetService.java | 8 +- .../Impl/AlgorithmInfoServiceImpl.java | 89 +++++++++--------- .../service/Impl/DatasetServiceImpl.java | 91 +++++++++++-------- src/main/resources/application.properties | 8 +- .../resources/mapper/AlgorithmInfoMapper.xml | 8 ++ src/main/resources/mapper/DatasetMapper.xml | 18 ---- 13 files changed, 228 insertions(+), 127 deletions(-) create mode 100644 src/main/resources/mapper/AlgorithmInfoMapper.xml diff --git a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/controller/AlgorithmInfoController.java b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/controller/AlgorithmInfoController.java index 4fb6cfa..aee19fe 100644 --- a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/controller/AlgorithmInfoController.java +++ b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/controller/AlgorithmInfoController.java @@ -3,23 +3,31 @@ package com.bipt.intelligentapplicationorchestrationservice.controller; import com.bipt.intelligentapplicationorchestrationservice.pojo.AlgorithmInfo; import com.bipt.intelligentapplicationorchestrationservice.pojo.OptResult; import com.bipt.intelligentapplicationorchestrationservice.service.AlgorithmInfoService; +import com.fasterxml.jackson.databind.ObjectMapper; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import java.io.IOException; import java.util.List; @Tag(name ="算法创建相关接口") @RestController @RequestMapping("/api/algorithm") @Slf4j +@CrossOrigin(origins = "http://localhost:3000") public class AlgorithmInfoController { @Autowired private AlgorithmInfoService algorithmInfoService; + @Autowired + private ObjectMapper objectMapper; + @GetMapping("/{id}") public ResponseEntity getById(@PathVariable Long id) { AlgorithmInfo algorithmInfo = algorithmInfoService.getById(id); @@ -63,25 +71,43 @@ public class AlgorithmInfoController { ResponseEntity.badRequest().body("Delete failed"); } - /** - * 算法创建 - */ - @PostMapping + @PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE) @Operation(summary ="算法创建") - public OptResult save(@RequestBody AlgorithmInfo algorithmInfo){ - log.info("新增算法",algorithmInfo); - algorithmInfoService.save(algorithmInfo); - return OptResult.success("算法创建成功"); + public OptResult save(@RequestParam("algorithm") String algorithmJson, + @RequestPart(value = "algorithmFile") MultipartFile file) { + try { + AlgorithmInfo algorithmInfo = objectMapper.readValue(algorithmJson, AlgorithmInfo.class); + log.info("新增算法: {}, 文件: {}", algorithmInfo, (file != null ? file.getOriginalFilename() : "无文件")); + algorithmInfoService.save(algorithmInfo, file); + return OptResult.success("算法创建成功"); + } catch (IOException e) { + log.error("JSON转换失败", e); + return OptResult.error("新增算法失败: " + e.getMessage()); + } catch (Exception e) { + log.error("新增算法失败", e); + return OptResult.error("新增算法失败: " + e.getMessage()); + } + } + + /** + * 根据算法名称模糊查询算法信息 + * @param keyword 模糊查询关键词 + * @return 符合条件的算法信息列表 + */ + @GetMapping("/search") + public ResponseEntity> searchByName(@RequestParam String keyword) { + List algorithmInfos = algorithmInfoService.getByNameLike(keyword); + return ResponseEntity.ok(algorithmInfos); } /** * 算法运行 */ @PostMapping("/run/{id}") @Operation(summary = "运行") - public OptResult run(@PathVariable Long id,String param){ + public OptResult run(@PathVariable Long id,@RequestBody String param){ log.info("运行",id); - algorithmInfoService.run(id,param); - return OptResult.success("运行成功"); + String result = algorithmInfoService.run(id,param); + return OptResult.success("运行成功"+result); } /** * 前端列表返回算法名称 diff --git a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/controller/DatasetController.java b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/controller/DatasetController.java index fb86a00..be1f217 100644 --- a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/controller/DatasetController.java +++ b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/controller/DatasetController.java @@ -6,28 +6,44 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import java.io.IOException; +import java.io.InputStream; import java.util.List; @Tag(name ="数据集相关接口") @RestController @RequestMapping("/dataset") @Slf4j +@CrossOrigin(origins = "http://localhost:3000") public class DatasetController { @Autowired private DatasetService datasetService; /** - * 新增数据集 + * 新增数据集(整合文件上传) * @param datasetDTO + * @param file * @return */ - @Operation(summary ="新增数据集") - @PostMapping - public OptResult save(@RequestBody DatasetDTO datasetDTO) { - log.info("新增数据集:{}", datasetDTO); - datasetService.save(datasetDTO); - return OptResult.success(); + @Operation(summary = "新增数据集") + @PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + public OptResult save( + @ModelAttribute("dataset") DatasetDTO datasetDTO, + @RequestPart(value = "file", required = false) MultipartFile file) { + log.info("新增数据集: {}, 文件: {}", datasetDTO, (file != null ? file.getOriginalFilename() : "无文件")); + try { + datasetService.save(datasetDTO, file); + return OptResult.success(); + } catch (Exception e) { + log.error("新增数据集失败", e); + return OptResult.error("新增数据集失败: " + e.getMessage()); + } } /** @@ -43,17 +59,17 @@ public class DatasetController { return OptResult.success(pageResult); } - /** * 修改数据集 * @param datasetDTO * @return */ @Operation(summary ="修改数据集") - @PutMapping - public OptResult update(@RequestBody DatasetDTO datasetDTO){ - log.info("修改数据集",datasetDTO); - datasetService.update(datasetDTO); + @PutMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + public OptResult update(@ModelAttribute("dataset") DatasetDTO datasetDTO, + @RequestPart(value = "file", required = false) MultipartFile file){ + log.info("修改数据集{}, 文件: {}", datasetDTO, (file != null ? file.getOriginalFilename() : "无文件")); + datasetService.update(datasetDTO,file); return OptResult.success(); } @@ -72,4 +88,34 @@ public class DatasetController { return OptResult.success("批量删除成功"); } + /** + * 下载数据集 + * @param datasetId 数据集ID + * @return 数据集文件 + */ + @Operation(summary = "下载数据集") + @GetMapping("/download/{datasetId}") + public ResponseEntity downloadDataset(@PathVariable Long datasetId) { + log.info("下载数据集,ID:{}", datasetId); + try { + // TODO: 调用分布式存储系统的接口获取数据集文件的输入流 + InputStream inputStream = datasetService.downloadDataset(datasetId); + if (inputStream == null) { + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + } + byte[] fileBytes = inputStream.readAllBytes(); + inputStream.close(); + + // 设置响应头 + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); + headers.setContentDispositionFormData("attachment", "dataset_" + datasetId + ".zip"); + + return new ResponseEntity<>(fileBytes, headers, HttpStatus.OK); + } catch (IOException e) { + log.error("下载数据集失败", e); + return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); + } + } + } diff --git a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/mapper/AlgorithmInfoMapper.java b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/mapper/AlgorithmInfoMapper.java index c0895e3..38be830 100644 --- a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/mapper/AlgorithmInfoMapper.java +++ b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/mapper/AlgorithmInfoMapper.java @@ -35,4 +35,6 @@ public interface AlgorithmInfoMapper { String getFileById(Long id); @Select("select algorithm_name from algorithm_info") List getAllNames(); + + List selectByNameLike(String keyword); } \ No newline at end of file diff --git a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/pojo/DatasetDTO.java b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/pojo/DatasetDTO.java index fe7a3a9..ed9693d 100644 --- a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/pojo/DatasetDTO.java +++ b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/pojo/DatasetDTO.java @@ -19,6 +19,7 @@ public class DatasetDTO implements Serializable { private Long datasetId; private String datasetName; private int datasetType; + private int datasetStatus; private String dsPath; // private Map args; private String args; diff --git a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/pojo/DatasetPageQueryDTO.java b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/pojo/DatasetPageQueryDTO.java index 8971274..cd209e3 100644 --- a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/pojo/DatasetPageQueryDTO.java +++ b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/pojo/DatasetPageQueryDTO.java @@ -20,11 +20,11 @@ public class DatasetPageQueryDTO implements Serializable{ private int page; private int pageSize; private String datasetName; - private int datasetType; +/* private int datasetType; private int datasetStatus; private String dsPath; private String args; private LocalDateTime createTime; - private LocalDateTime updateTime; + private LocalDateTime updateTime;*/ } diff --git a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/pojo/DatasetVO.java b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/pojo/DatasetVO.java index 17b9194..9e9d309 100644 --- a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/pojo/DatasetVO.java +++ b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/pojo/DatasetVO.java @@ -17,6 +17,7 @@ import java.util.Map; @NoArgsConstructor @AllArgsConstructor public class DatasetVO implements Serializable { + private Long datasetId; private String datasetName; private Integer datasetType; private Integer datasetStatus; diff --git a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/service/AlgorithmInfoService.java b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/service/AlgorithmInfoService.java index 02f0f63..5b4a709 100644 --- a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/service/AlgorithmInfoService.java +++ b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/service/AlgorithmInfoService.java @@ -1,6 +1,7 @@ package com.bipt.intelligentapplicationorchestrationservice.service; import com.bipt.intelligentapplicationorchestrationservice.pojo.AlgorithmInfo; +import org.springframework.web.multipart.MultipartFile; import java.util.List; @@ -12,9 +13,11 @@ public interface AlgorithmInfoService { boolean delete(Long id); boolean validateAlgorithmInfo(AlgorithmInfo algorithmInfo); - void save(AlgorithmInfo algorithmInfo); + void save(AlgorithmInfo algorithmInfo, MultipartFile file); - void run(Long id,String param); + String run(Long id, String param); List getAllNames(); + + List getByNameLike(String keyword); } \ No newline at end of file diff --git a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/service/DatasetService.java b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/service/DatasetService.java index 8e99918..a7d11a3 100644 --- a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/service/DatasetService.java +++ b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/service/DatasetService.java @@ -3,18 +3,22 @@ package com.bipt.intelligentapplicationorchestrationservice.service; import com.bipt.intelligentapplicationorchestrationservice.pojo.DatasetDTO; import com.bipt.intelligentapplicationorchestrationservice.pojo.DatasetPageQueryDTO; import com.bipt.intelligentapplicationorchestrationservice.pojo.PageResult; +import org.springframework.web.multipart.MultipartFile; +import java.io.InputStream; import java.util.List; /** * @author hky */ public interface DatasetService { - void save(DatasetDTO datasetDTO); + void save(DatasetDTO datasetDTO, MultipartFile file); - void update(DatasetDTO datasetDTO); + void update(DatasetDTO datasetDTO, MultipartFile file); PageResult pageQuery(DatasetPageQueryDTO dataSetPageQueryDTO); void deleteBatch(List datasetIds); + + InputStream downloadDataset(Long datasetId); } diff --git a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/service/Impl/AlgorithmInfoServiceImpl.java b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/service/Impl/AlgorithmInfoServiceImpl.java index 742e28c..97f61d0 100644 --- a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/service/Impl/AlgorithmInfoServiceImpl.java +++ b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/service/Impl/AlgorithmInfoServiceImpl.java @@ -3,22 +3,28 @@ package com.bipt.intelligentapplicationorchestrationservice.service.Impl; import com.bipt.intelligentapplicationorchestrationservice.mapper.AlgorithmInfoMapper; import com.bipt.intelligentapplicationorchestrationservice.pojo.AlgorithmInfo; import com.bipt.intelligentapplicationorchestrationservice.service.AlgorithmInfoService; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; +import org.springframework.web.multipart.MultipartFile; import java.io.BufferedReader; import java.io.InputStreamReader; -import java.util.ArrayList; +import java.time.LocalDateTime; import java.util.List; @Service +@Slf4j public class AlgorithmInfoServiceImpl implements AlgorithmInfoService { @Autowired private AlgorithmInfoMapper algorithmInfoMapper; + @Value("${algorithm.upload.dir:/tmp/algorithm-files/}") // 默认上传目录 + private String uploadDir; @Override public AlgorithmInfo getById(Long id) { return algorithmInfoMapper.selectById(id); @@ -64,81 +70,80 @@ public class AlgorithmInfoServiceImpl implements AlgorithmInfoService { return true; } - /** - * 算法创建 - * @param algorithmInfo - */ @Override @Transactional - public void save(AlgorithmInfo algorithmInfo) { + public void save(AlgorithmInfo algorithmInfo, MultipartFile file) { String algorithmName = algorithmInfo.getAlgorithmName(); - //查找表里是否有重复的算法,如果有则报错 + // 检查同名算法 AlgorithmInfo duplicateName = algorithmInfoMapper.selectByName(algorithmName); - if (duplicateName != null){ + if (duplicateName != null) { throw new RuntimeException("算法已存在,请去修改算法"); } - //todo 算法文件分布式存入分布式存储中 + // 只接收文件但不进行保存操作 + if (file != null && !file.isEmpty()) { + log.info("已接收文件: {}", file.getOriginalFilename()); + log.info("文件大小: {} 字节", file.getSize()); + log.info("文件类型: {}", file.getContentType()); + // 临时设置一个空路径(避免数据库保存空值) + //todo 保存到分布式存储 + algorithmInfo.setAlgorithmFile(""); + } + algorithmInfo.setCreateTime(LocalDateTime.now()); + // 保存算法信息到数据库(注意:此时algorithmFile字段为空) algorithmInfoMapper.insert(algorithmInfo); } - /** - * 算法执行 - * @param id - */ @Override - public void run(Long id,String param) { - /*String description = algorithmInfoMapper.getDescriptionById(id);*/ - /*//拿到传入的描述,并且用逗号分隔 - String[] commaParts = description.split(","); - - List results = new ArrayList<>(); - for (String part : commaParts) { - String[] semicolonParts = part.split(";", 2); - if (semicolonParts.length > 1) { - results.add(semicolonParts[1]); - } else { - throw new RuntimeException("描述格式错误,请修改描述格式"); - } - } - String bag = results.getFirst(); - String function = results.get(1);*/ + public String run(Long id, String param) { String file = algorithmInfoMapper.getFileById(id); + StringBuilder result = new StringBuilder(); // 用于存储结果 + try { // 构建命令,将 param 作为参数传递给 Python 脚本 ProcessBuilder pb = new ProcessBuilder("python", file, param); - - // 设置工作目录(如果 Python 脚本不在当前目录) - // pb.directory(new File("/path/to/script")); - - // 启动进程 Process process = pb.start(); - // 获取进程输出 - BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); + // 读取标准输出(脚本执行结果) + BufferedReader reader = new BufferedReader( + new InputStreamReader(process.getInputStream())); String line; while ((line = reader.readLine()) != null) { - System.out.println(line); + result.append(line).append("\n"); } - // 获取错误输出 - BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream())); + // 读取错误输出 + BufferedReader errorReader = new BufferedReader( + new InputStreamReader(process.getErrorStream())); String errorLine; while ((errorLine = errorReader.readLine()) != null) { - System.err.println("Error: " + errorLine); + result.append("Error: ").append(errorLine).append("\n"); } - // 等待进程完成 + int exitCode = process.waitFor(); - System.out.println("Exit Code: " + exitCode); + result.append("Exit Code: ").append(exitCode); + } catch (Exception e) { + result.append("执行异常: ").append(e.getMessage()); e.printStackTrace(); } + return result.toString(); // 返回完整结果 } @Override public List getAllNames() { return algorithmInfoMapper.getAllNames(); } + + /** + * 模糊查询 + * @param keyword + * @return + */ + @Override + public List getByNameLike(String keyword) { + return algorithmInfoMapper.selectByNameLike(keyword); + } } \ No newline at end of file diff --git a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/service/Impl/DatasetServiceImpl.java b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/service/Impl/DatasetServiceImpl.java index 9e04dd4..fcb727b 100644 --- a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/service/Impl/DatasetServiceImpl.java +++ b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/service/Impl/DatasetServiceImpl.java @@ -12,12 +12,17 @@ import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; import java.time.LocalDateTime; -import java.util.Collections; import java.util.List; +import java.util.UUID; import static com.bipt.intelligentapplicationorchestrationservice.enumeration.DatasetType.FROM_DATABASE; +import static com.bipt.intelligentapplicationorchestrationservice.enumeration.DatasetType.UPLOAD; @Service @Slf4j @@ -25,63 +30,65 @@ public class DatasetServiceImpl implements DatasetService { @Autowired private DatasetMapper datasetMapper; - /** - * 新增数据集 - * @param datasetDTO - */ @Override @Transactional - public void save(DatasetDTO datasetDTO) { - //判断数据集类型,如果是本地上传则保存,若用调用数据仓库进入下一步 - // 获取数据集类型 + public void save(DatasetDTO datasetDTO, MultipartFile file) { DatasetType datasetType = DatasetType.fromCode(datasetDTO.getDatasetType()); - // 根据类型处理数据 - switch (datasetType) { - case UPLOAD: - //TODO 保存到分布式文件系统 - break; - case FROM_DATABASE: - String args = datasetDTO.getArgs(); - //TODO 根据筛选条件调用数据仓库中的数据 + if (datasetType == UPLOAD && file != null && !file.isEmpty()) { + try { + //todo存入分布式文件系统 - //TODO 调用数据仓库保存到分布式文件系统 - break; - default: - throw new IllegalArgumentException("不支持的数据集类型: " + datasetType); + // 生成文件名(建议使用 UUID 避免重复) + String fileName = UUID.randomUUID() + "-" + file.getOriginalFilename(); + // 假设使用本地存储(实际需对接分布式文件系统,如 MinIO、OSS 等) + String filePath = "/your/storage/path/" + fileName; + // 保存文件到磁盘(示例代码,需处理 IO 异常) + file.transferTo(new File(filePath)); + // 更新数据集路径 + datasetDTO.setDsPath(filePath); // 取消注释,并确保 datasetDTO 有 setDsPath 方法 + } catch (IOException e) { + throw new RuntimeException("文件上传失败: " + e.getMessage()); + } + } else if (datasetType == FROM_DATABASE){ + //todo 从数据仓库中查询 并选择筛选条件 } + // 保存数据集实体 DatasetEntity datasetEntity = new DatasetEntity(); - BeanUtils.copyProperties(datasetDTO,datasetEntity); - datasetEntity.setDatasetStatus(StatusConstant.ENABLE); + BeanUtils.copyProperties(datasetDTO, datasetEntity); datasetEntity.setCreateTime(LocalDateTime.now()); datasetEntity.setUpdateTime(LocalDateTime.now()); datasetMapper.insert(datasetEntity); - } + /** * 修改数据集 * * @param datasetDTO + * @param file */ @Override @Transactional - public void update(DatasetDTO datasetDTO) { - /*DatasetEntity datasetEntity = new DatasetEntity(); - BeanUtils.copyProperties(datasetDTO,datasetEntity);*/ + public void update(DatasetDTO datasetDTO, MultipartFile file) { DatasetType datasetType = DatasetType.fromCode(datasetDTO.getDatasetType()); - // 根据类型处理数据 - switch (datasetType) { - case UPLOAD: - //TODO 覆盖保存到分布式文件系统中 - break; - case FROM_DATABASE: - //TODO 覆盖数据文件 - - break; - default: - throw new IllegalArgumentException("不支持的数据集类型: " + datasetType); + if (datasetType == UPLOAD && file != null && !file.isEmpty()) { + try { + // 生成文件名(建议使用 UUID 避免重复) + String fileName = UUID.randomUUID() + "-" + file.getOriginalFilename(); + // 假设使用本地存储(实际需对接分布式文件系统,如 MinIO、OSS 等) + String filePath = "/your/storage/path/" + fileName; + // 保存文件到磁盘(示例代码,需处理 IO 异常) + file.transferTo(new File(filePath)); + // 更新数据集路径 + datasetDTO.setDsPath(filePath); // 取消注释,并确保 datasetDTO 有 setDsPath 方法 + } catch (IOException e) { + throw new RuntimeException("文件上传失败: " + e.getMessage()); + } + } else if (datasetType == FROM_DATABASE){ + //todo 从数据仓库中查询 并选择筛选条件 } + DatasetEntity datasetEntity = new DatasetEntity(); BeanUtils.copyProperties(datasetDTO,datasetEntity); datasetEntity.setUpdateTime(LocalDateTime.now()); @@ -112,4 +119,14 @@ public class DatasetServiceImpl implements DatasetService { datasetMapper.deleteBatch(datasetIds); } + /** + * 下载 + * @param datasetId + * @return + */ + @Override + public InputStream downloadDataset(Long datasetId) { + // TODO: 调用分布式存储系统的接口获取数据集文件的输入流 + return null; + } } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 7520e47..a76e857 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -40,4 +40,10 @@ logging.level.org.springframework.web=DEBUG logging.level.com.bipt.intelligentapplicationorchestrationservice.mapper=DEBUG mybatis.configuration.log-impl=org.apache.ibatis.logging.slf4j.Slf4jImpl -management.health.rabbit.enabled=false \ No newline at end of file +management.health.rabbit.enabled=false + +# 单个文件最大大小 +spring.servlet.multipart.max-file-size=10MB +# 单次请求最大大小(可包含多个文件) +spring.servlet.multipart.max-request-size=15MB + diff --git a/src/main/resources/mapper/AlgorithmInfoMapper.xml b/src/main/resources/mapper/AlgorithmInfoMapper.xml new file mode 100644 index 0000000..7490269 --- /dev/null +++ b/src/main/resources/mapper/AlgorithmInfoMapper.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/src/main/resources/mapper/DatasetMapper.xml b/src/main/resources/mapper/DatasetMapper.xml index 9a0e67f..b361166 100644 --- a/src/main/resources/mapper/DatasetMapper.xml +++ b/src/main/resources/mapper/DatasetMapper.xml @@ -44,24 +44,6 @@ dataset_name LIKE CONCAT('%', #{datasetName}, '%') - - and dataset_type=#{datasetType} - - - and dataset_status=#{datasetStatus} - - - and ds_path=#{dsPath} - - - and args=#{args} - - - and create_time=#{createTime} - - - and update_time=#{updateTime} - \ No newline at end of file