From dda4e046e5e8d5df4f836dded4938e3e3891e0d6 Mon Sep 17 00:00:00 2001 From: gulongcheng <474084054@qq.com> Date: Tue, 9 Dec 2025 20:31:20 +0800 Subject: [PATCH] =?UTF-8?q?=E7=94=9F=E6=88=90=E6=8A=A5=E5=91=8A=E8=84=9A?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/req/project}/ProjecInfoReq.java | 3 +- .../req/project}/SimulationPerformance.java | 2 +- .../entity/req/project}/SpdmReportReq.java | 17 +-- .../project/SimulationRunFeignClientImpl.java | 12 ++ .../project/ISimulationRunFeignClient.java | 18 ++- .../data/service/impl/ModelServiceImpl.java | 5 +- .../handler/ExportWordScriptHandler.java | 138 +++++++++--------- .../controller/SimulationRunController.java | 17 ++- .../dao/SimulationPerformanceMapper.java | 2 +- .../sdm/project/model/resp/RunResultResp.java | 2 +- .../ISimulationPerformanceService.java | 2 +- .../service/ISimulationRunService.java | 11 +- .../SimulationPerformanceServiceImpl.java | 2 +- .../impl/SimulationRunServiceImpl.java | 124 ++++++++++++++++ .../project/service/impl/TaskServiceImpl.java | 4 +- 15 files changed, 259 insertions(+), 100 deletions(-) rename {project/src/main/java/com/sdm/project/model/req => common/src/main/java/com/sdm/common/entity/req/project}/ProjecInfoReq.java (89%) rename {project/src/main/java/com/sdm/project/model/entity => common/src/main/java/com/sdm/common/entity/req/project}/SimulationPerformance.java (98%) rename {project/src/main/java/com/sdm/project/model/req => common/src/main/java/com/sdm/common/entity/req/project}/SpdmReportReq.java (68%) diff --git a/project/src/main/java/com/sdm/project/model/req/ProjecInfoReq.java b/common/src/main/java/com/sdm/common/entity/req/project/ProjecInfoReq.java similarity index 89% rename from project/src/main/java/com/sdm/project/model/req/ProjecInfoReq.java rename to common/src/main/java/com/sdm/common/entity/req/project/ProjecInfoReq.java index d311469a..8a2b69ee 100644 --- a/project/src/main/java/com/sdm/project/model/req/ProjecInfoReq.java +++ b/common/src/main/java/com/sdm/common/entity/req/project/ProjecInfoReq.java @@ -1,6 +1,5 @@ -package com.sdm.project.model.req; +package com.sdm.common.entity.req.project; -import jakarta.validation.constraints.NotNull; import lombok.Data; import java.io.Serializable; diff --git a/project/src/main/java/com/sdm/project/model/entity/SimulationPerformance.java b/common/src/main/java/com/sdm/common/entity/req/project/SimulationPerformance.java similarity index 98% rename from project/src/main/java/com/sdm/project/model/entity/SimulationPerformance.java rename to common/src/main/java/com/sdm/common/entity/req/project/SimulationPerformance.java index 67d569df..1ba21422 100644 --- a/project/src/main/java/com/sdm/project/model/entity/SimulationPerformance.java +++ b/common/src/main/java/com/sdm/common/entity/req/project/SimulationPerformance.java @@ -1,4 +1,4 @@ -package com.sdm.project.model.entity; +package com.sdm.common.entity.req.project; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; diff --git a/project/src/main/java/com/sdm/project/model/req/SpdmReportReq.java b/common/src/main/java/com/sdm/common/entity/req/project/SpdmReportReq.java similarity index 68% rename from project/src/main/java/com/sdm/project/model/req/SpdmReportReq.java rename to common/src/main/java/com/sdm/common/entity/req/project/SpdmReportReq.java index 903fa56a..81e9970c 100644 --- a/project/src/main/java/com/sdm/project/model/req/SpdmReportReq.java +++ b/common/src/main/java/com/sdm/common/entity/req/project/SpdmReportReq.java @@ -1,16 +1,10 @@ -package com.sdm.project.model.req; +package com.sdm.common.entity.req.project; + -import com.sdm.project.model.bo.TaskNode; -import com.sdm.project.model.entity.SimulationPerformance; import lombok.Data; import java.util.List; -/** - * @Author xuyundi - * @Date 2024/3/5 - * @Note - */ @Data public class SpdmReportReq { @@ -28,5 +22,10 @@ public class SpdmReportReq { * 算例父节点信息 */ private ProjecInfoReq projecInfoReq; + + /** + * 报告复制路径地址 + */ + private String outPutDirPath; -} +} \ No newline at end of file diff --git a/common/src/main/java/com/sdm/common/feign/impl/project/SimulationRunFeignClientImpl.java b/common/src/main/java/com/sdm/common/feign/impl/project/SimulationRunFeignClientImpl.java index 82d2a399..06e5f619 100644 --- a/common/src/main/java/com/sdm/common/feign/impl/project/SimulationRunFeignClientImpl.java +++ b/common/src/main/java/com/sdm/common/feign/impl/project/SimulationRunFeignClientImpl.java @@ -1,6 +1,7 @@ package com.sdm.common.feign.impl.project; import com.sdm.common.common.SdmResponse; +import com.sdm.common.entity.req.project.SpdmReportReq; import com.sdm.common.entity.req.system.LaunchApproveReq; import com.sdm.common.entity.resp.AllNodeByProjectIdAndTypeResp; import com.sdm.common.feign.inter.project.ISimulationRunFeignClient; @@ -39,4 +40,15 @@ public class SimulationRunFeignClientImpl implements ISimulationRunFeignClient { } return response; } + + @Override + public SdmResponse generateReportInternal(SpdmReportReq req) { + try { + simulationRunFeignClient.generateReportInternal(req); + return SdmResponse.success(); + }catch (Exception e){ + log.error("内部调用生成自动化报告失败", e); + return SdmResponse.failed("内部调用生成自动化报告失败"); + } + } } diff --git a/common/src/main/java/com/sdm/common/feign/inter/project/ISimulationRunFeignClient.java b/common/src/main/java/com/sdm/common/feign/inter/project/ISimulationRunFeignClient.java index a95db528..f7d9303f 100644 --- a/common/src/main/java/com/sdm/common/feign/inter/project/ISimulationRunFeignClient.java +++ b/common/src/main/java/com/sdm/common/feign/inter/project/ISimulationRunFeignClient.java @@ -1,16 +1,13 @@ package com.sdm.common.feign.inter.project; import com.sdm.common.common.SdmResponse; +import com.sdm.common.entity.req.project.SpdmReportReq; import com.sdm.common.entity.req.system.LaunchApproveReq; import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.*; import java.util.List; - @FeignClient(name = "project",contextId = "runFeignClient") public interface ISimulationRunFeignClient { @@ -19,5 +16,14 @@ public interface ISimulationRunFeignClient { @GetMapping(value = "/run/getSimulationKeyResultFileIds") SdmResponse> getSimulationKeyResultFileIds(@RequestParam String runId); + + /** + * 内部调用生成报告 + * + * @param req 报告请求参数 + * @return SdmResponse + */ + @PostMapping("/run/generateReportInternal") + SdmResponse generateReportInternal(@RequestBody SpdmReportReq req); -} +} \ No newline at end of file diff --git a/data/src/main/java/com/sdm/data/service/impl/ModelServiceImpl.java b/data/src/main/java/com/sdm/data/service/impl/ModelServiceImpl.java index 4b973249..4cdfd0d4 100644 --- a/data/src/main/java/com/sdm/data/service/impl/ModelServiceImpl.java +++ b/data/src/main/java/com/sdm/data/service/impl/ModelServiceImpl.java @@ -261,7 +261,8 @@ public class ModelServiceImpl implements IModelService { } if (trainingModel.getHandleStatus().equals("失败")) { String errLog = parseStringFromStream(dataFileService.getMinioInputStream(trainingModel.getTrainingDataHandleErrorLogFileId())); - return SdmResponse.failed("数据处理失败: errLog: " + errLog); + log.error("数据处理失败: errLog: {}", errLog); + return SdmResponse.failed("数据处理失败"); } Long trainingDataHandleFileId = trainingModel.getTrainingDataHandleFileId(); if (trainingDataHandleFileId == null) { @@ -280,7 +281,7 @@ public class ModelServiceImpl implements IModelService { return SdmResponse.success(jsonObject); } catch (Exception e) { log.error("处理JSON文件失败", e); - return SdmResponse.failed("处理JSON文件失败: " + e.getMessage()); + return SdmResponse.failed("处理JSON文件失败"); } finally { try { if (minioInputStream != null) { diff --git a/flowable/src/main/java/com/sdm/flowable/delegate/handler/ExportWordScriptHandler.java b/flowable/src/main/java/com/sdm/flowable/delegate/handler/ExportWordScriptHandler.java index 8a59225f..39ab92ff 100644 --- a/flowable/src/main/java/com/sdm/flowable/delegate/handler/ExportWordScriptHandler.java +++ b/flowable/src/main/java/com/sdm/flowable/delegate/handler/ExportWordScriptHandler.java @@ -5,14 +5,20 @@ import com.sdm.common.common.SdmResponse; import com.sdm.common.entity.flowable.executeConfig.ExportWordScriptExecuteConfig; import com.sdm.common.entity.req.data.GetFileBaseInfoReq; import com.sdm.common.entity.req.data.UploadFilesReq; +import com.sdm.common.entity.req.project.ProjecInfoReq; +import com.sdm.common.entity.req.project.SimulationPerformance; +import com.sdm.common.entity.req.project.SpdmReportReq; import com.sdm.common.entity.resp.data.FileMetadataInfoResp; +import com.sdm.common.entity.resp.task.PerformanceResp; import com.sdm.common.feign.inter.data.IDataFeignClient; +import com.sdm.common.feign.inter.project.ISimulationRunFeignClient; +import com.sdm.common.feign.inter.task.ISimuluationPerformanceFeignClient; import com.sdm.flowable.constants.FlowableConfig; import com.sdm.flowable.entity.ProcessNodeParam; import com.sdm.flowable.service.IProcessNodeParamService; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.ObjectUtils; import org.flowable.engine.delegate.DelegateExecution; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; @@ -39,6 +45,12 @@ public class ExportWordScriptHandler implements ExecutionHandler params, ExportWordScriptExecuteConfig config) { try { @@ -50,15 +62,32 @@ public class ExportWordScriptHandler implements ExecutionHandler> runPerformance = simuluationPerformanceFeignClient.getRunPerformance(runId); + if(!runPerformance.isSuccess()){ + log.error("获取算列性能指标失败"); + throw new RuntimeException("获取算列性能指标失败"); + } + List performanceList = new ArrayList<>(); + for (PerformanceResp datum : runPerformance.getData()) { + SimulationPerformance performance = new SimulationPerformance(); + BeanUtils.copyProperties(datum, performance); + performanceList.add(performance); + } + log.info("ExportWordScriptHandler的返回参数 runPerformance:{}", runPerformance); + + SdmResponse> simulationKeyResultFileIds = simulationRunFeignClient.getSimulationKeyResultFileIds(runId); + if(!simulationKeyResultFileIds.isSuccess()){ + log.error("获取算列关键结果文件失败"); + throw new RuntimeException("获取算列关键结果文件失败"); + } + log.info("ExportWordScriptHandler的返回参数 simulationKeyResultFileIds:{}", simulationKeyResultFileIds); + ProcessNodeParam currentProcessNodeParam = processNodeParamService.lambdaQuery() .eq(ProcessNodeParam::getRunId, runId) @@ -66,18 +95,6 @@ public class ExportWordScriptHandler implements ExecutionHandler result = new ArrayList<>(); - int runningStatus = -1; - try { - log.info("开始同步执行脚本"); - Process process = Runtime.getRuntime().exec(commands); - log.info("准备获取脚本输出"); - log.info("开始获取脚本输出"); - BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); - String line; - while ((line = reader.readLine()) != null) { - log.info("executePython:" + line); - result.add(line); - } - log.info("脚本执行完成"); - runningStatus = process.waitFor(); - log.info("脚本运行状态:" + runningStatus); - } catch (IOException | InterruptedException e) { - log.error("执行脚本失败:" + e); - return; - } - if (runningStatus != 0) { - log.error("执行脚本失败"); - return; - } else { - log.info(commands + "执行脚本完成!"); + // todo 生成脚本的接口 + SpdmReportReq req = new SpdmReportReq(); + req.setProjecInfoReq(projecInfoReq); + req.setOutPutDirPath(currentNodeOutputDirPath); + req.setImageFileIdList(simulationKeyResultFileIds.getData()); + req.setPerformanceList(performanceList); + SdmResponse voidSdmResponse = simulationRunFeignClient.generateReportInternal(req); + if(!voidSdmResponse.isSuccess()){ + log.error("生成自动化报告失败"); + throw new RuntimeException("生成自动化报告失败"); } try { + String reportPath = currentNodeOutputDirPath + "report.docx"; + log.info("报告路径:{}", reportPath); // 获取临时路径中脚本生成的报告 - uploadResultFileToMinio(targetPath + "report.docx",currentNodeOutputDirId); + uploadResultFileToMinio(currentNodeOutputDirPath + "report.docx",currentNodeOutputDirId); } catch (Exception ex) { log.error("生成自动化报告失败:{}", ex.getMessage(), ex); throw new RuntimeException("生成自动化报告失败"); @@ -147,6 +133,26 @@ public class ExportWordScriptHandler implements ExecutionHandler params) { + ProjecInfoReq projectInfoReq = new ProjecInfoReq(); + projectInfoReq.setDepartment((String)params.get("department")); + projectInfoReq.setApplicants((String)params.get("applicants")); + projectInfoReq.setDate((String)params.get("date")); + projectInfoReq.setProjectNum((String)params.get("projectNum")); + projectInfoReq.setWorkspaceNum((String)params.get("workspaceNum")); + projectInfoReq.setWorkspace((String)params.get("workspace")); + projectInfoReq.setTaskType((String)params.get("taskType")); + projectInfoReq.setReportVer((String)params.get("reportVer")); + projectInfoReq.setFileNum((String)params.get("fileNum")); + projectInfoReq.setFormulateTime((String)params.get("formulateTime")); + projectInfoReq.setCheckTime((String)params.get("checkTime")); + projectInfoReq.setApproveTime((String)params.get("approveTime")); + projectInfoReq.setIsBatch(Boolean.parseBoolean((String) params.get("isBatch"))); + projectInfoReq.setLoadcaseName((String)params.get("loadcaseName")); + projectInfoReq.setReportCommand((String)params.get("reportCommand")); + return projectInfoReq; + } + private FileMetadataInfoResp getFileBaseInfo(Long outputDirId) { GetFileBaseInfoReq getFileBaseInfoReq = new GetFileBaseInfoReq(); getFileBaseInfoReq.setFileId(outputDirId); diff --git a/project/src/main/java/com/sdm/project/controller/SimulationRunController.java b/project/src/main/java/com/sdm/project/controller/SimulationRunController.java index 28bbb4db..67948c8f 100644 --- a/project/src/main/java/com/sdm/project/controller/SimulationRunController.java +++ b/project/src/main/java/com/sdm/project/controller/SimulationRunController.java @@ -1,11 +1,10 @@ package com.sdm.project.controller; import com.sdm.common.common.SdmResponse; -import com.sdm.common.entity.req.capability.FlowNodeDto; import com.sdm.common.entity.req.data.CreateDirReq; -import com.sdm.common.entity.req.data.KnowledgeCallBackReq; import com.sdm.common.entity.req.data.QueryDirReq; import com.sdm.common.entity.req.data.UploadFilesReq; +import com.sdm.common.entity.req.project.SpdmReportReq; import com.sdm.common.entity.req.system.LaunchApproveReq; import com.sdm.common.entity.resp.PageDataResp; import com.sdm.common.entity.resp.data.BatchAddFileInfoResp; @@ -15,7 +14,6 @@ import com.sdm.common.log.annotation.SysLog; import com.sdm.project.model.entity.SimulationRun; import com.sdm.project.model.entity.SimulationRunKeyResult; import com.sdm.project.model.req.*; -import com.sdm.project.model.req.*; import com.sdm.project.model.resp.FlowInfoDto; import com.sdm.project.model.resp.KeyResultAndTaskInfoResp; import com.sdm.project.model.resp.RunVersionInfoResp; @@ -211,6 +209,17 @@ public class SimulationRunController implements ISimulationRunFeignClient { public void generateReport(@RequestBody SpdmReportReq req, HttpServletResponse response) { runService.generateReport(req,response); } + + /** + * 内部调用生成报告 + * + * @return + */ + @PostMapping("/generateReportInternal") + @Operation(summary = "内部调用生成报告", description = "内部调用生成报告") + public SdmResponse generateReportInternal(@RequestBody SpdmReportReq req) { + return runService.generateReportInternal(req); + } /** * 任务执行 一键执行 启动流程 @@ -237,4 +246,4 @@ public class SimulationRunController implements ISimulationRunFeignClient { return runService.listFlowNodes(req); } -} +} \ No newline at end of file diff --git a/project/src/main/java/com/sdm/project/dao/SimulationPerformanceMapper.java b/project/src/main/java/com/sdm/project/dao/SimulationPerformanceMapper.java index 9c88669f..66750653 100644 --- a/project/src/main/java/com/sdm/project/dao/SimulationPerformanceMapper.java +++ b/project/src/main/java/com/sdm/project/dao/SimulationPerformanceMapper.java @@ -1,6 +1,6 @@ package com.sdm.project.dao; -import com.sdm.project.model.entity.SimulationPerformance; +import com.sdm.common.entity.req.project.SimulationPerformance; import com.baomidou.mybatisplus.core.mapper.BaseMapper; /** diff --git a/project/src/main/java/com/sdm/project/model/resp/RunResultResp.java b/project/src/main/java/com/sdm/project/model/resp/RunResultResp.java index 7de1265d..6d8e8683 100644 --- a/project/src/main/java/com/sdm/project/model/resp/RunResultResp.java +++ b/project/src/main/java/com/sdm/project/model/resp/RunResultResp.java @@ -1,6 +1,6 @@ package com.sdm.project.model.resp; -import com.sdm.project.model.entity.SimulationPerformance; +import com.sdm.common.entity.req.project.SimulationPerformance; import com.sdm.project.model.entity.SimulationRun; import lombok.Data; diff --git a/project/src/main/java/com/sdm/project/service/ISimulationPerformanceService.java b/project/src/main/java/com/sdm/project/service/ISimulationPerformanceService.java index a4495f49..3176a043 100644 --- a/project/src/main/java/com/sdm/project/service/ISimulationPerformanceService.java +++ b/project/src/main/java/com/sdm/project/service/ISimulationPerformanceService.java @@ -1,6 +1,6 @@ package com.sdm.project.service; -import com.sdm.project.model.entity.SimulationPerformance; +import com.sdm.common.entity.req.project.SimulationPerformance; import com.baomidou.mybatisplus.extension.service.IService; /** diff --git a/project/src/main/java/com/sdm/project/service/ISimulationRunService.java b/project/src/main/java/com/sdm/project/service/ISimulationRunService.java index a1b7c6d6..15d6f4fd 100644 --- a/project/src/main/java/com/sdm/project/service/ISimulationRunService.java +++ b/project/src/main/java/com/sdm/project/service/ISimulationRunService.java @@ -1,11 +1,10 @@ package com.sdm.project.service; import com.sdm.common.common.SdmResponse; -import com.sdm.common.entity.req.capability.FlowNodeDto; import com.sdm.common.entity.req.data.CreateDirReq; -import com.sdm.common.entity.req.data.KnowledgeCallBackReq; import com.sdm.common.entity.req.data.QueryDirReq; import com.sdm.common.entity.req.data.UploadFilesReq; +import com.sdm.common.entity.req.project.SpdmReportReq; import com.sdm.common.entity.req.system.LaunchApproveReq; import com.sdm.common.entity.resp.PageDataResp; import com.sdm.common.entity.resp.data.BatchAddFileInfoResp; @@ -66,10 +65,16 @@ public interface ISimulationRunService extends IService { SdmResponse deleteSimulationKeyResult(KeyResultReq req); void generateReport(SpdmReportReq req, HttpServletResponse response); + + /** + * 内部调用生成报告 + * @param req 报告请求参数 + */ + SdmResponse generateReportInternal(SpdmReportReq req); SdmResponse startProcessInstance(SpdmTaskRunReq req); SdmResponse saveNodeParams(SpdmNodeParamReq req); SdmResponse listFlowNodes(SpdmTaskRunReq req); -} +} \ No newline at end of file diff --git a/project/src/main/java/com/sdm/project/service/impl/SimulationPerformanceServiceImpl.java b/project/src/main/java/com/sdm/project/service/impl/SimulationPerformanceServiceImpl.java index a9838c5a..d8d87e57 100644 --- a/project/src/main/java/com/sdm/project/service/impl/SimulationPerformanceServiceImpl.java +++ b/project/src/main/java/com/sdm/project/service/impl/SimulationPerformanceServiceImpl.java @@ -1,6 +1,6 @@ package com.sdm.project.service.impl; -import com.sdm.project.model.entity.SimulationPerformance; +import com.sdm.common.entity.req.project.SimulationPerformance; import com.sdm.project.dao.SimulationPerformanceMapper; import com.sdm.project.service.ISimulationPerformanceService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; diff --git a/project/src/main/java/com/sdm/project/service/impl/SimulationRunServiceImpl.java b/project/src/main/java/com/sdm/project/service/impl/SimulationRunServiceImpl.java index 0adad985..eb51dda2 100644 --- a/project/src/main/java/com/sdm/project/service/impl/SimulationRunServiceImpl.java +++ b/project/src/main/java/com/sdm/project/service/impl/SimulationRunServiceImpl.java @@ -17,6 +17,9 @@ import com.sdm.common.entity.flowable.dto.FlowElementDTO; import com.sdm.common.entity.flowable.dto.ProcessDefinitionDTO; import com.sdm.common.entity.req.capability.FlowNodeDto; import com.sdm.common.entity.req.data.*; +import com.sdm.common.entity.req.project.ProjecInfoReq; +import com.sdm.common.entity.req.project.SimulationPerformance; +import com.sdm.common.entity.req.project.SpdmReportReq; import com.sdm.common.entity.req.system.LaunchApproveReq; import com.sdm.common.entity.req.system.UserQueryReq; import com.sdm.common.entity.resp.PageDataResp; @@ -1214,6 +1217,127 @@ public class SimulationRunServiceImpl extends ServiceImpl generateReportInternal(SpdmReportReq req) { + log.info("内部调用生成自动化报告参数为:{}", req); + + // 父节点信息 + ProjecInfoReq projecInfoReq = req.getProjecInfoReq(); + if (ObjectUtils.isEmpty(projecInfoReq) || StringUtils.isBlank(projecInfoReq.getLoadcaseName())) { + log.error("父节点信息不能为空"); + return SdmResponse.failed("父节点信息不能为空"); + } + + // 根据文件id下载文件到临时目录 + List imageFileIdList = req.getImageFileIdList(); + String randomId = RandomUtil.generateString(16); + String tempPath = TEMP_REPORT_PATH + randomId; + + if (CollectionUtils.isNotEmpty(imageFileIdList)) { + for (Long fileId : imageFileIdList) { + dataFeignClient.downloadFileToLocal(fileId, tempPath); + } + } + + Path folder = Paths.get(tempPath); + if (!Files.exists(folder) || !Files.isDirectory(folder)) { + if (!new File(tempPath).mkdir()) { + log.error("创建临时文件夹:{}失败", tempPath); + throw new RuntimeException("生成报告失败,原因为:创建临时文件夹失败"); + } + } + + log.info("临时路径为:{}", randomId); + String commands = "python /opt/script/exportWord.py " + tempPath + File.separator + TEMPLATE_PATH + projecInfoReq.getLoadcaseName() + "Analyse"; + + // 生成projectInfo.json + projecInfoReq.setReportCommand(commands); + try (FileOutputStream projectInfoOutputStream = new FileOutputStream(tempPath + File.separator + "projectInfo.json")) { + projectInfoOutputStream.write(JSON.toJSONString(projecInfoReq).getBytes(StandardCharsets.UTF_8)); + projectInfoOutputStream.flush(); + } catch (Exception e) { + throw new RuntimeException(e); + } + + // 生成performance.json + List performanceList = req.getPerformanceList(); + if (CollectionUtils.isNotEmpty(performanceList)) { + JSONObject allPerformanceInfoJson = new JSONObject(); + for (SimulationPerformance performance : performanceList) { + PerformanceInfoReq performanceInfoReq = new PerformanceInfoReq(); + performanceInfoReq.setValue(StringUtils.isNotBlank(performance.getTargetValue()) ? performance.getTargetValue() : ""); + performanceInfoReq.setEnglishName(StringUtils.isNotBlank(performance.getEnglishName()) ? performance.getEnglishName() : ""); + performanceInfoReq.setHighValue(StringUtils.isNotBlank(performance.getHighValue()) ? performance.getHighValue() : ""); + performanceInfoReq.setPerformanceName(StringUtils.isNotBlank(performance.getPerformanceName()) ? performance.getPerformanceName() : ""); + performanceInfoReq.setMethod(StringUtils.isNotBlank(performance.getMethod()) ? performance.getMethod() : ""); + performanceInfoReq.setUnit(StringUtils.isNotBlank(performance.getUnit()) ? performance.getUnit() : ""); + allPerformanceInfoJson.put(performanceInfoReq.getEnglishName(), performanceInfoReq); + } + allPerformanceInfoJson.put("type", "insert"); + + try (FileOutputStream performanceOutputStream = new FileOutputStream(tempPath + File.separator + "performance.json")) { + performanceOutputStream.write(JSON.toJSONString(allPerformanceInfoJson).getBytes(StandardCharsets.UTF_8)); + performanceOutputStream.flush(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + // 调用脚本 + log.info("调用脚本中。。。。。。"); + log.info("command:" + commands); + int runningStatus = -1; + try { + log.info("开始同步执行脚本"); + Process process = Runtime.getRuntime().exec(commands); + log.info("准备获取脚本输出"); + log.info("开始获取脚本输出"); + BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); + String line; + while ((line = reader.readLine()) != null) { + log.info("executePython:" + line); + } + log.info("脚本执行完成"); + runningStatus = process.waitFor(); + log.info("脚本运行状态:" + runningStatus); + } catch (IOException | InterruptedException e) { + log.error("执行脚本失败:" + e); + return SdmResponse.failed("执行脚本失败:" + e.getMessage()); + } + + if (runningStatus != 0) { + log.error("执行脚本失败"); + return SdmResponse.failed("执行脚本失败"); + } else { + log.info(commands + "执行脚本完成!"); + } + + try { + // 获取临时路径中脚本生成的报告 + Path reportPath = Paths.get(tempPath + File.separator + "report" + File.separator + "report.docx"); + Path outputPath = Paths.get(req.getOutPutDirPath()); + + // 移动文件到目标路径 + if (Files.exists(reportPath) && Files.exists(outputPath) && Files.isDirectory(outputPath)) { + Path targetPath = outputPath.resolve("report.docx"); + Files.move(reportPath, targetPath, StandardCopyOption.REPLACE_EXISTING); + log.info("报告已移动至: {}", targetPath); + } else { + log.error("源文件或目标目录不存在"); + return SdmResponse.failed("源文件或目标目录不存在"); + } + } catch (Exception ex) { + log.error("移动报告文件失败:{}", ex.getMessage()); + throw new RuntimeException("移动报告文件失败"); + } finally { + // 删除临时路径 + log.info("删除临时路径:{},中。。。。。。", randomId); + deleteFolder(new File(tempPath)); + } + + return SdmResponse.success(); + } @Override @Transactional(rollbackFor = Exception.class) diff --git a/project/src/main/java/com/sdm/project/service/impl/TaskServiceImpl.java b/project/src/main/java/com/sdm/project/service/impl/TaskServiceImpl.java index 8ae5bd51..5c341822 100644 --- a/project/src/main/java/com/sdm/project/service/impl/TaskServiceImpl.java +++ b/project/src/main/java/com/sdm/project/service/impl/TaskServiceImpl.java @@ -1,6 +1,5 @@ package com.sdm.project.service.impl; -import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import com.sdm.common.common.ResultCode; @@ -11,13 +10,13 @@ import com.sdm.common.entity.constants.ProjectConstants; import com.sdm.common.entity.enums.DirTypeEnum; import com.sdm.common.entity.enums.NodeTypeEnum; import com.sdm.common.entity.req.data.CreateDirReq; +import com.sdm.common.entity.req.project.SimulationPerformance; import com.sdm.common.entity.req.system.UserQueryReq; import com.sdm.common.entity.req.task.TaskExportExcelFormat; import com.sdm.common.entity.req.task.TaskExportExcelParam; import com.sdm.common.entity.resp.system.CIDUserResp; import com.sdm.common.feign.impl.data.DataClientFeignClientImpl; import com.sdm.common.feign.impl.system.SysUserFeignClientImpl; -import com.sdm.common.utils.RandomUtil; import com.sdm.common.utils.excel.ExcelUtil; import com.sdm.project.common.MemberTypeEnum; import com.sdm.project.common.RunPerformanceStatusEnum; @@ -39,7 +38,6 @@ import com.sdm.project.service.*; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils;