Merge remote-tracking branch 'origin/main'
This commit is contained in:
@@ -8,9 +8,9 @@ import java.util.Objects;
|
|||||||
@Getter
|
@Getter
|
||||||
public enum KeyResultTypeEnum {
|
public enum KeyResultTypeEnum {
|
||||||
IMAGE("图片/动画", 1, "图片结果"),
|
IMAGE("图片/动画", 1, "图片结果"),
|
||||||
VALUE("数值", 2, "曲线结果"),
|
CURVE("曲线", 2, "曲线结果"),
|
||||||
DOCUMENT("报告", 3, "报告结果"),
|
DOCUMENT("报告", 3, "报告结果"),
|
||||||
CURVE("曲线", 4, "数值结果");
|
VALUE("数值", 4, "数值结果");
|
||||||
|
|
||||||
private final String name;
|
private final String name;
|
||||||
private final Integer keyResultType;
|
private final Integer keyResultType;
|
||||||
|
|||||||
@@ -0,0 +1,27 @@
|
|||||||
|
package com.sdm.project.model.bo;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 从曲线结果提取的参数
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class CurveParamDto {
|
||||||
|
@JsonProperty("max")
|
||||||
|
@Schema(description = "最大值")
|
||||||
|
private Double max;
|
||||||
|
|
||||||
|
@JsonProperty("min")
|
||||||
|
@Schema(description = "最小值")
|
||||||
|
private Double min;
|
||||||
|
|
||||||
|
@JsonProperty("unit")
|
||||||
|
@Schema(description = "单位")
|
||||||
|
private String unit;
|
||||||
|
}
|
||||||
@@ -47,6 +47,7 @@ import com.sdm.project.common.TaskExeStatusEnum;
|
|||||||
import com.sdm.project.dao.SimulationProjectMapper;
|
import com.sdm.project.dao.SimulationProjectMapper;
|
||||||
import com.sdm.project.dao.SimulationRunMapper;
|
import com.sdm.project.dao.SimulationRunMapper;
|
||||||
import com.sdm.project.model.bo.ApprovalDeliverableContentsModel;
|
import com.sdm.project.model.bo.ApprovalDeliverableContentsModel;
|
||||||
|
import com.sdm.project.model.bo.CurveParamDto;
|
||||||
import com.sdm.project.model.bo.TaskNode;
|
import com.sdm.project.model.bo.TaskNode;
|
||||||
import com.sdm.project.model.bo.TaskNodeTag;
|
import com.sdm.project.model.bo.TaskNodeTag;
|
||||||
import com.sdm.project.model.entity.*;
|
import com.sdm.project.model.entity.*;
|
||||||
@@ -71,8 +72,13 @@ import org.springframework.beans.BeanUtils;
|
|||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
import java.nio.file.StandardCopyOption;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@@ -125,8 +131,13 @@ public class SimulationRunServiceImpl extends ServiceImpl<SimulationRunMapper, S
|
|||||||
@Autowired
|
@Autowired
|
||||||
private DataAnalysisFeignClientImpl analysisFeignClient;
|
private DataAnalysisFeignClientImpl analysisFeignClient;
|
||||||
|
|
||||||
|
private final ObjectMapper objectMapper = new ObjectMapper();
|
||||||
|
|
||||||
private static final String TEMP_REPORT_PATH = "/opt/report/";
|
private static final String TEMP_REPORT_PATH = "/opt/report/";
|
||||||
|
|
||||||
|
// 临时文件存储目录
|
||||||
|
private final String tempFileDir = System.getProperty("user.dir") + "/csv_uploads/";
|
||||||
|
|
||||||
private int getCurrentNodeDepth(NodeAllBase eachNode) {
|
private int getCurrentNodeDepth(NodeAllBase eachNode) {
|
||||||
String tag1 = eachNode.getTag1();
|
String tag1 = eachNode.getTag1();
|
||||||
String tag2 = eachNode.getTag2();
|
String tag2 = eachNode.getTag2();
|
||||||
@@ -732,6 +743,11 @@ public class SimulationRunServiceImpl extends ServiceImpl<SimulationRunMapper, S
|
|||||||
@Override
|
@Override
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public SdmResponse addSimulationKeyResult(KeyResultReq req) {
|
public SdmResponse addSimulationKeyResult(KeyResultReq req) {
|
||||||
|
if (KeyResultTypeEnum.CURVE.getKeyResultType().equals(req.getKeyResultType())) {
|
||||||
|
CurveParamDto curveParamDto = getCurveParamsFromUpload(req.getFile(), 2);
|
||||||
|
return SdmResponse.success(curveParamDto);
|
||||||
|
}
|
||||||
|
|
||||||
SimulationRunKeyResult simulationRunKeyResult = new SimulationRunKeyResult();
|
SimulationRunKeyResult simulationRunKeyResult = new SimulationRunKeyResult();
|
||||||
BeanUtils.copyProperties(req, simulationRunKeyResult);
|
BeanUtils.copyProperties(req, simulationRunKeyResult);
|
||||||
simulationRunKeyResult.setUuid(RandomUtil.generateString(32));
|
simulationRunKeyResult.setUuid(RandomUtil.generateString(32));
|
||||||
@@ -759,6 +775,133 @@ public class SimulationRunServiceImpl extends ServiceImpl<SimulationRunMapper, S
|
|||||||
return SdmResponse.success(simulationRunKeyResult.getUuid());
|
return SdmResponse.success(simulationRunKeyResult.getUuid());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 保存上传的文件到临时目录
|
||||||
|
*/
|
||||||
|
private String saveUploadedFile(MultipartFile file) throws IOException {
|
||||||
|
// 确保临时目录存在
|
||||||
|
Path uploadPath = Paths.get(tempFileDir);
|
||||||
|
if (!Files.exists(uploadPath)) {
|
||||||
|
Files.createDirectories(uploadPath);
|
||||||
|
}
|
||||||
|
// 生成唯一的文件名
|
||||||
|
String fileName = RandomUtil.generateString(16) + "_" + file.getOriginalFilename();
|
||||||
|
Path filePath = uploadPath.resolve(fileName);
|
||||||
|
// 保存文件
|
||||||
|
Files.copy(file.getInputStream(), filePath, StandardCopyOption.REPLACE_EXISTING);
|
||||||
|
log.info("文件已保存到临时目录: {}", filePath.toString());
|
||||||
|
return filePath.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 清理临时文件
|
||||||
|
*/
|
||||||
|
private void cleanupTempFile(String filePath) {
|
||||||
|
try {
|
||||||
|
Path path = Paths.get(filePath);
|
||||||
|
if (Files.exists(path)) {
|
||||||
|
Files.delete(path);
|
||||||
|
log.info("临时文件已删除: {}", filePath);
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
log.warn("删除临时文件失败: {}", filePath, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 执行 Python 脚本获取曲线参数(通过上传的文件)
|
||||||
|
*/
|
||||||
|
public CurveParamDto getCurveParamsFromUpload(MultipartFile file, Integer decimal) {
|
||||||
|
String tempFilePath = null;
|
||||||
|
try {
|
||||||
|
// 保存上传的文件到临时目录
|
||||||
|
tempFilePath = saveUploadedFile(file);
|
||||||
|
// 执行 Python 脚本
|
||||||
|
return executePythonScript(tempFilePath, decimal);
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("处理上传文件时发生错误", e);
|
||||||
|
throw new RuntimeException("处理文件失败: " + e.getMessage());
|
||||||
|
} finally {
|
||||||
|
// 清理临时文件
|
||||||
|
if (tempFilePath != null) {
|
||||||
|
cleanupTempFile(tempFilePath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 执行 Python 脚本
|
||||||
|
*/
|
||||||
|
private CurveParamDto executePythonScript(String filePath, Integer decimal) {
|
||||||
|
try {
|
||||||
|
String pythonInterpreter = "python";
|
||||||
|
|
||||||
|
// 构建 Python 脚本路径
|
||||||
|
// String projectRoot = System.getProperty("user.dir") + File.separator + "project";
|
||||||
|
// String pythonScriptPath = projectRoot + File.separator +"get_curve_params.py";
|
||||||
|
String pythonScriptPath = "/opt/script/get_curve_params.py";
|
||||||
|
|
||||||
|
// 构建命令参数
|
||||||
|
List<String> command = new ArrayList<>();
|
||||||
|
command.add(pythonInterpreter);
|
||||||
|
command.add(pythonScriptPath);
|
||||||
|
command.add(filePath);
|
||||||
|
|
||||||
|
if (decimal != null) {
|
||||||
|
command.add(decimal.toString());
|
||||||
|
}
|
||||||
|
String commands = String.join(" ", command);
|
||||||
|
log.info("执行 Python 命令: {}", commands);
|
||||||
|
|
||||||
|
// 执行命令
|
||||||
|
Process process = Runtime.getRuntime().exec(commands);
|
||||||
|
|
||||||
|
// 读取输出
|
||||||
|
StringBuilder output = new StringBuilder();
|
||||||
|
StringBuilder errors = new StringBuilder();
|
||||||
|
try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
|
||||||
|
BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream()))) {
|
||||||
|
// 读取标准输出
|
||||||
|
String line;
|
||||||
|
while ((line = reader.readLine()) != null) {
|
||||||
|
output.append(line);
|
||||||
|
log.info("Python输出: {}", line);
|
||||||
|
}
|
||||||
|
// 读取错误输出
|
||||||
|
while (errorReader.ready()) {
|
||||||
|
String errorLine = errorReader.readLine();
|
||||||
|
if (errorLine != null) {
|
||||||
|
errors.append(errorLine).append("\n");
|
||||||
|
log.error("Python错误: {}", errorLine);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 等待进程结束
|
||||||
|
int exitCode = process.waitFor();
|
||||||
|
if (exitCode != 0) {
|
||||||
|
throw new RuntimeException("Python执行失败,退出码: " + exitCode + "错误信息: " + errors.toString());
|
||||||
|
}
|
||||||
|
// 解析结果
|
||||||
|
if (!output.isEmpty()) {
|
||||||
|
log.info("Python返回JSON: {}", output.toString());
|
||||||
|
return objectMapper.readValue(output.toString(), CurveParamDto.class);
|
||||||
|
} else {
|
||||||
|
throw new RuntimeException("Python脚本没有输出");
|
||||||
|
}
|
||||||
|
} catch (IOException | InterruptedException e) {
|
||||||
|
log.error("执行Python脚本时发生错误", e);
|
||||||
|
throw new RuntimeException("执行Python脚本时发生错误: " + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 重载方法,不指定小数位数
|
||||||
|
*/
|
||||||
|
public CurveParamDto getCurveParamsFromUpload(MultipartFile file) {
|
||||||
|
return getCurveParamsFromUpload(file, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public SdmResponse<List<BatchAddFileInfoResp>> batchAddSimulationKeyResult(KeyResultReq req) {
|
public SdmResponse<List<BatchAddFileInfoResp>> batchAddSimulationKeyResult(KeyResultReq req) {
|
||||||
|
|||||||
Reference in New Issue
Block a user