diff --git a/common/src/main/java/com/sdm/common/utils/FilesUtil.java b/common/src/main/java/com/sdm/common/utils/FilesUtil.java index e3de72cf..cff63072 100644 --- a/common/src/main/java/com/sdm/common/utils/FilesUtil.java +++ b/common/src/main/java/com/sdm/common/utils/FilesUtil.java @@ -6,6 +6,8 @@ import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; import java.io.*; +import java.net.HttpURLConnection; +import java.net.URL; import java.nio.MappedByteBuffer; import java.nio.charset.StandardCharsets; import java.nio.file.*; @@ -582,4 +584,115 @@ public class FilesUtil { } } + /** + * 从指定URL下载文件到本地 + * @param fileUrl 远程文件的URL地址 + * @param savePath 本地保存路径(包含文件名,例如:/opt/demand/report/有限元仿真结果报告.pdf) + * @throws IOException 处理IO异常 + */ + public static void downloadFile(String fileUrl, String savePath) throws IOException { + + createDirectoryIfNotExists(savePath); + + // 声明连接和流对象 + HttpURLConnection connection = null; + BufferedInputStream in = null; + BufferedOutputStream out = null; + + try { + // 1. 创建URL对象 + URL url = new URL(fileUrl); + + // 2. 打开连接并设置属性 + connection = (HttpURLConnection) url.openConnection(); + // 设置连接超时时间(5秒) + connection.setConnectTimeout(5000); + // 设置读取超时时间(10秒) + connection.setReadTimeout(10000); + // 设置请求方法 + connection.setRequestMethod("GET"); + // 允许输入流 + connection.setDoInput(true); + + // 3. 检查响应码,200表示成功 + int responseCode = connection.getResponseCode(); + if (responseCode != HttpURLConnection.HTTP_OK) { + throw new IOException("下载失败,HTTP响应码:" + responseCode); + } + + // 4. 获取文件大小(用于进度显示) + long fileSize = connection.getContentLengthLong(); + log.info("文件大小:{}", formatFileSize(fileSize)); + + // 5. 创建输入输出流 + in = new BufferedInputStream(connection.getInputStream()); + out = new BufferedOutputStream(new FileOutputStream(savePath)); + + // 6. 缓冲区读写数据 + byte[] buffer = new byte[4096]; // 4KB缓冲区 + int bytesRead; + while ((bytesRead = in.read(buffer)) != -1) { + out.write(buffer, 0, bytesRead); + } + + log.info("文件下载完成!保存路径:{}",savePath); + + } finally { + // 7. 关闭所有流和连接,确保资源释放 + if (out != null) { + try { + out.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (in != null) { + try { + in.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (connection != null) { + connection.disconnect(); + } + } + } + + /** + * 格式化文件大小显示(字节转KB/MB) + * @param size 字节数 + * @return 格式化后的大小字符串 + */ + private static String formatFileSize(long size) { + if (size < 1024) { + return size + " B"; + } else if (size < 1024 * 1024) { + return String.format("%.2f KB", size / 1024.0); + } else { + return String.format("%.2f MB", size / (1024.0 * 1024.0)); + } + } + + /** + * 解析保存路径,创建不存在的目录 + * @param savePath 完整的文件保存路径 + */ + private static void createDirectoryIfNotExists(String savePath) { + // 1. 创建File对象 + File file = new File(savePath); + // 2. 获取文件所在的目录(去掉文件名部分) + File parentDir = file.getParentFile(); + + // 3. 如果目录不为空且不存在,则创建(mkdirs会创建多级目录) + if (parentDir != null && !parentDir.exists()) { + boolean isCreated = parentDir.mkdirs(); + if (isCreated) { + log.info("目录不存在,已自动创建:" + parentDir.getAbsolutePath()); + } else { + log.error("创建目录失败:" + parentDir.getAbsolutePath()); + } + } + } + } diff --git a/outbridge/src/main/java/com/sdm/outbridge/entity/LyricVAttachmentConfigToDM.java b/outbridge/src/main/java/com/sdm/outbridge/entity/LyricVAttachmentConfigToDM.java new file mode 100644 index 00000000..d4e5d6ff --- /dev/null +++ b/outbridge/src/main/java/com/sdm/outbridge/entity/LyricVAttachmentConfigToDM.java @@ -0,0 +1,82 @@ +package com.sdm.outbridge.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.util.Date; + +/** + * 附件配置视图实体类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName(value = "v_attachment_config_to_DM", autoResultMap = true) +@Schema(description = "附件配置视视图") +public class LyricVAttachmentConfigToDM { + + @Schema(description = "附件配置视id") + @TableField(value = "id") + private Integer id; + + @Schema(description = "文件名") + @TableField(value = "name") + private String name; + + @Schema(description = "文件链接地址") + @TableField(value = "project_name") + private String filePath; + + @Schema(description = "缩略图地址") + @TableField(value = "thumbnail_Path") + private String thumbnailPath; + + @Schema(description = "文件id") + @TableField(value = "file_id") + private Integer fileId; + + @Schema(description = "文件大小") + @TableField(value = "file_size") + private Long fileSize; + + @Schema(description = "文件类型") + @TableField(value = "file_type") + private String fileType; + + @Schema(description = "创建人") + @TableField(value = "create_by") + private String createBy; + + @Schema(description = "修改人") + @TableField(value = "modify_by") + private String modifyBy; + + @Schema(description = "创建时间") + @TableField(value = "create_time") + private String createTime; + + @Schema(description = "修改时间") + @TableField(value = "modify_time") + private String modifyTime; + + @Schema(description = "in 内网 out 外网") + @TableField(value = "source") + private String source; + + @Schema(description = "内拷外审批流程ID") + @TableField(value = "copy_id") + private String copyId; + + @Schema(description = "OA内靠外审批实例ID") + @TableField(value = "oa_process_id") + private String oaProcessId; + + @Schema(description = "海葵文件key") + @TableField(value = "hai_kui_file_key") + private String haiKuiFileKey; + +} \ No newline at end of file diff --git a/project/src/main/java/com/sdm/project/model/entity/SimulationTask.java b/project/src/main/java/com/sdm/project/model/entity/SimulationTask.java index 0a36011d..a9a9c6a4 100644 --- a/project/src/main/java/com/sdm/project/model/entity/SimulationTask.java +++ b/project/src/main/java/com/sdm/project/model/entity/SimulationTask.java @@ -219,5 +219,9 @@ public class SimulationTask implements Serializable { @TableField("reportContent") private String reportContent; + @Schema(description= "关联的待办的结果文件路径") + @TableField(exist = false) + private String reportFileUrl; + } diff --git a/project/src/main/java/com/sdm/project/service/impl/ProjectServiceImpl.java b/project/src/main/java/com/sdm/project/service/impl/ProjectServiceImpl.java index 0eab9ac7..8a07ce73 100644 --- a/project/src/main/java/com/sdm/project/service/impl/ProjectServiceImpl.java +++ b/project/src/main/java/com/sdm/project/service/impl/ProjectServiceImpl.java @@ -1475,6 +1475,9 @@ public class ProjectServiceImpl extends BaseService implements IProjectService { projectNode.setTaskCode(projectNode.getNodeCode()); } projectNode.setAnalyseSoftwares(projectNode.getAnalyseSoftware()); + log.info("任务节点为:{}",projectNode); + log.info("tagList为:{}",tagList); + log.info("taskIdMap为:{}",taskIdMap); if (CollectionUtils.isNotEmpty(tagList)) { // List needAddTagList = new ArrayList<>(); // List tags = tagList.stream().map(TaskNodeTag::getValue).toList(); @@ -1593,9 +1596,13 @@ public class ProjectServiceImpl extends BaseService implements IProjectService { List tag5List = projectNode.getTag5(); + log.info("tag5List111为:{}",tag5List); if (CollectionUtils.isNotEmpty(tag5List)) { if (tag5List.contains(null)) { + log.info("tag5List222为:{}",tag5List); tag5List = tag5List.stream().filter(ObjectUtils::isNotEmpty).collect(Collectors.toList()); + log.info("tag5List333为:{}",tag5List); + log.info("tag5List tagList为:{}",tagList); for (TaskNodeTag taskNodeTag : tagList) { if ("tag5".equals(taskNodeTag.getValue())) { if (CollectionUtils.isNotEmpty(tag5List)) { @@ -1610,6 +1617,7 @@ public class ProjectServiceImpl extends BaseService implements IProjectService { } } }else { + log.info("tag5List为空,tagList为:{},taskIdMap为:{}",tagList,taskIdMap); for (TaskNodeTag taskNodeTag : tagList) { if ("tag5".equals(taskNodeTag.getValue())) { tag5List = taskIdMap.get(taskNodeTag.getKey()); diff --git a/project/src/main/java/com/sdm/project/service/impl/SimulationTaskServiceImpl.java b/project/src/main/java/com/sdm/project/service/impl/SimulationTaskServiceImpl.java index d4599eb0..efc784e9 100644 --- a/project/src/main/java/com/sdm/project/service/impl/SimulationTaskServiceImpl.java +++ b/project/src/main/java/com/sdm/project/service/impl/SimulationTaskServiceImpl.java @@ -10,6 +10,7 @@ import com.sdm.common.entity.enums.FilePermissionEnum; import com.sdm.common.entity.enums.NodeTypeEnum; import com.sdm.common.entity.req.data.*; import com.sdm.common.feign.inter.data.IDataFeignClient; +import com.sdm.common.utils.FilesUtil; import com.sdm.common.utils.RandomUtil; import com.sdm.project.common.MemberTypeEnum; import com.sdm.project.dao.SimulationTaskAttentionMapper; @@ -32,6 +33,9 @@ import com.sdm.project.model.entity.SimulationDemandMember; import com.sdm.project.model.entity.SimulationTaskExtra; import com.sdm.common.enums.DemandMemberTypeEnum; import lombok.extern.slf4j.Slf4j; + +import java.io.IOException; +import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.apache.commons.collections4.CollectionUtils; @@ -81,6 +85,8 @@ public class SimulationTaskServiceImpl extends ServiceImpl { +// try { +// FilesUtil.downloadFile(task.getReportFileUrl(), REPORT_PATH_PREFIX + task.getUuid()); +// // 上传到minio +// UploadFilesReq fileReq = new UploadFilesReq(); +// fileReq.setSourceFiles(); +// fileReq.setUploadTaskId(); +// fileReq.setType(); +// fileReq.setFileType(); +// fileReq.setUuid(); +// fileReq.setFileTypeDictValue(); +// fileReq.setFileTypeDictClass(); +// fileReq.setDisciplineDictValue(); +// fileReq.setDisciplineTypeDictClass(); +// fileReq.setDictTags(); +// SdmResponse uploadRespond = dataFeignClient.uploadFiles(fileReq); +// } catch (IOException e) { +// throw new RuntimeException(e); +// } +// }); } // 批量更新任务权限(使用批量接口) batchUpdateTaskPermissions(tasksToCreate);