feat:查询需求待办附件/算例结果归档/编辑报告上传报告结果/任务文件查询修改

This commit is contained in:
2026-01-20 20:32:03 +08:00
parent 0a984643ed
commit bbe7e97387
36 changed files with 578 additions and 13 deletions

View File

@@ -34,16 +34,16 @@ public enum FileBizTypeEnum {
CLOUD_FILE(5), CLOUD_FILE(5),
/** /**
* 网格文件 * 流程脚本
*/ */
@Schema(description = "网格文件", example = "6") @Schema(description = "流程脚本", example = "6")
GRID_FILE(6), FLOW_SCRIPT_FILE(6),
/** /**
* 计算过程文 * 需求附
*/ */
@Schema(description = "计算过程文", example = "7") @Schema(description = "需求附", example = "7")
COMPUTE_PROCESS_FILE(7), DEMAND_FILE(7),
/** /**
* 交付物文件 * 交付物文件

View File

@@ -0,0 +1,14 @@
package com.sdm.common.entity.req.data;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class CopyFileToTaskReq {
@Schema(description = "源文件id")
private Long sourceFileId;
@Schema(description = "要复制到的文件夹关联uuid")
private String parentUuid;
}

View File

@@ -59,4 +59,8 @@ public class GetSimulationTaskFileReq extends BaseReq {
@Schema(description = "标签10") @Schema(description = "标签10")
private String tag10; private String tag10;
@Schema(description = "查询层级task 只查task下面的文件不查子目录下的")
private String level;
} }

View File

@@ -182,6 +182,10 @@ public class FileMetadataInfoResp extends BaseResp implements Serializable {
@Schema(description= "完成时间") @Schema(description= "完成时间")
private LocalDateTime finishTime; private LocalDateTime finishTime;
@Schema(description = "文件来源 DM/EP")
private String fileResource;
// 算列信息属性放在上面 // 算列信息属性放在上面
public void setSimulationRunResp(SimulationRunResp simulationRunResp) { public void setSimulationRunResp(SimulationRunResp simulationRunResp) {

View File

@@ -258,4 +258,16 @@ public class DataClientFeignClientImpl implements IDataFeignClient {
} }
} }
@Override
public SdmResponse copyFileToTask(CopyFileToTaskReq req) {
SdmResponse response;
try {
response = dataClient.copyFileToTask(req);
return response;
} catch (Exception e) {
log.error("复制文件失败:", e);
return SdmResponse.failed("复制文件失败");
}
}
} }

View File

@@ -7,6 +7,7 @@ import com.sdm.common.entity.req.system.QueryGroupDetailReq;
import com.sdm.common.entity.req.system.UserListReq; import com.sdm.common.entity.req.system.UserListReq;
import com.sdm.common.entity.req.system.UserQueryReq; import com.sdm.common.entity.req.system.UserQueryReq;
import com.sdm.common.entity.resp.PageDataResp; import com.sdm.common.entity.resp.PageDataResp;
import com.sdm.common.entity.resp.system.CIDStaffResp;
import com.sdm.common.entity.resp.system.CIDUserResp; import com.sdm.common.entity.resp.system.CIDUserResp;
import com.sdm.common.entity.resp.system.SysUserGroupDetailResp; import com.sdm.common.entity.resp.system.SysUserGroupDetailResp;
import com.sdm.common.feign.inter.system.ISysUserFeignClient; import com.sdm.common.feign.inter.system.ISysUserFeignClient;
@@ -98,4 +99,19 @@ public class SysUserFeignClientImpl implements ISysUserFeignClient {
return SdmResponse.failed("根据角色编码查询用户失败"); return SdmResponse.failed("根据角色编码查询用户失败");
} }
} }
@Override
public SdmResponse<List<CIDStaffResp>> listUserDetailByIds(UserQueryReq req) {
SdmResponse<List<CIDStaffResp>> sdmResponse;
try {
sdmResponse = sysUserClient.listUserDetailByIds(req);
if (!sdmResponse.isSuccess() || sdmResponse.getData() == null){
return SdmResponse.failed("查询用户详细信息失败");
}
return sdmResponse;
} catch (Exception e) {
log.error("查询用户详细信息失败", e);
return SdmResponse.failed("查询用户详细信息失败");
}
}
} }

View File

@@ -97,4 +97,7 @@ public interface IDataFeignClient {
@GetMapping("/data/getMultipartFileByFileId") @GetMapping("/data/getMultipartFileByFileId")
SdmResponse<byte[]> getMultipartFileByFileId(@RequestParam(value = "fileId") @Validated Long fileId); SdmResponse<byte[]> getMultipartFileByFileId(@RequestParam(value = "fileId") @Validated Long fileId);
@PostMapping("/data/copyFileToTask")
SdmResponse copyFileToTask(@RequestBody CopyFileToTaskReq req);
} }

View File

@@ -5,6 +5,7 @@ import com.sdm.common.entity.req.system.LaunchApproveReq;
import com.sdm.common.entity.req.system.QueryGroupDetailReq; import com.sdm.common.entity.req.system.QueryGroupDetailReq;
import com.sdm.common.entity.req.system.UserListReq; import com.sdm.common.entity.req.system.UserListReq;
import com.sdm.common.entity.req.system.UserQueryReq; import com.sdm.common.entity.req.system.UserQueryReq;
import com.sdm.common.entity.resp.system.CIDStaffResp;
import com.sdm.common.entity.resp.system.CIDUserResp; import com.sdm.common.entity.resp.system.CIDUserResp;
import com.sdm.common.entity.resp.PageDataResp; import com.sdm.common.entity.resp.PageDataResp;
import com.sdm.common.entity.resp.system.SysUserGroupDetailResp; import com.sdm.common.entity.resp.system.SysUserGroupDetailResp;
@@ -36,4 +37,7 @@ public interface ISysUserFeignClient {
@GetMapping("/user/getUserByRoleCode") @GetMapping("/user/getUserByRoleCode")
SdmResponse<List<Long>> getUserByRoleCode(@RequestParam("roleCode") String roleCode, @RequestParam("tenantId") Long tenantId); SdmResponse<List<Long>> getUserByRoleCode(@RequestParam("roleCode") String roleCode, @RequestParam("tenantId") Long tenantId);
@PostMapping("/user/listUserDetailByIds")
SdmResponse<List<CIDStaffResp>> listUserDetailByIds(@RequestBody UserQueryReq req);
} }

View File

@@ -603,4 +603,10 @@ public class DataFileController implements IDataFeignClient {
return IDataFileService.queryFileIdByNodeId(queryFileIdReq); return IDataFileService.queryFileIdByNodeId(queryFileIdReq);
} }
@PostMapping("/copyFileToTask")
@Operation(summary = "复制关键结果文件到task下", description = "复制关键结果文件到task下")
public SdmResponse copyFileToTask(@RequestBody CopyFileToTaskReq req) {
return IDataFileService.copyFileToTask(req);
}
} }

View File

@@ -2,6 +2,7 @@ package com.sdm.data.service;
import com.sdm.common.common.SdmResponse; import com.sdm.common.common.SdmResponse;
import com.sdm.common.entity.req.data.*; import com.sdm.common.entity.req.data.*;
import com.sdm.common.entity.req.data.CopyFileToTaskReq;
import com.sdm.common.entity.req.system.LaunchApproveReq; import com.sdm.common.entity.req.system.LaunchApproveReq;
import com.sdm.common.entity.resp.PageDataResp; import com.sdm.common.entity.resp.PageDataResp;
import com.sdm.common.entity.resp.data.BatchAddFileInfoResp; import com.sdm.common.entity.resp.data.BatchAddFileInfoResp;
@@ -336,6 +337,8 @@ public interface IDataFileService {
SdmResponse<List<BatchAddFileInfoResp>> batchAddFileInfo(UploadFilesReq req); SdmResponse<List<BatchAddFileInfoResp>> batchAddFileInfo(UploadFilesReq req);
SdmResponse copyFileToTask(CopyFileToTaskReq req);
SdmResponse<ChunkUploadMinioFileResp> chunkUploadToMinio(ChunkUploadMinioFileReq req); SdmResponse<ChunkUploadMinioFileResp> chunkUploadToMinio(ChunkUploadMinioFileReq req);
SdmResponse chunkUploadCallback(KnowledgeCallBackReq req); SdmResponse chunkUploadCallback(KnowledgeCallBackReq req);

View File

@@ -76,6 +76,8 @@ public interface IMinioService {
void renameFile(String oldObjectName, String newObjectName, String bucketName); void renameFile(String oldObjectName, String newObjectName, String bucketName);
void copyFile(String oldObjectName, String newObjectName, String bucketName);
/** /**
* 从MinIO下载文件 * 从MinIO下载文件
* @param objectName 文件名objectKey * @param objectName 文件名objectKey

View File

@@ -2,13 +2,15 @@ package com.sdm.data.service.impl;
import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.JSONObject;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import com.sdm.common.common.SdmResponse; import com.sdm.common.common.SdmResponse;
import com.sdm.common.common.ThreadLocalContext; import com.sdm.common.common.ThreadLocalContext;
import com.sdm.common.entity.enums.NodeTypeEnum;
import com.sdm.common.entity.req.export.FileAnalysisExportExcelFormat; import com.sdm.common.entity.req.export.FileAnalysisExportExcelFormat;
import com.sdm.common.entity.req.export.FileAnalysisExportExcelParam; import com.sdm.common.entity.req.export.FileAnalysisExportExcelParam;
import com.sdm.common.entity.req.export.TaskAnalysisExportExcelParam;
import com.sdm.common.entity.resp.PageDataResp; import com.sdm.common.entity.resp.PageDataResp;
import com.sdm.common.utils.FileSizeUtils;
import com.sdm.common.utils.PageUtils; import com.sdm.common.utils.PageUtils;
import com.sdm.common.utils.SystemOperate; import com.sdm.common.utils.SystemOperate;
import com.sdm.data.bo.ExportOperate; import com.sdm.data.bo.ExportOperate;
@@ -33,6 +35,7 @@ import java.io.BufferedReader;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.File; import java.io.File;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.math.BigDecimal;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -75,6 +78,10 @@ public class DataAnalysisServiceImpl implements IDataAnalysisService {
return PageUtils.getJsonObjectSdmResponse(new ArrayList<>(), new PageInfo<>()); return PageUtils.getJsonObjectSdmResponse(new ArrayList<>(), new PageInfo<>());
} }
} }
// 查询层级是task 只查task目录下的直系文件
if (NodeTypeEnum.TASK.getValue().equals(getSimulationTaskFileReq.getLevel())) {
return getTaskLevelFile(getSimulationTaskFileReq, queryBigFileReq);
}
// 2. 调用大文件查询服务 // 2. 调用大文件查询服务
SdmResponse<PageDataResp<List<FileStorage>>> searchResult = dataStorageAnalysis.listBigFile(queryBigFileReq); SdmResponse<PageDataResp<List<FileStorage>>> searchResult = dataStorageAnalysis.listBigFile(queryBigFileReq);
@@ -103,6 +110,27 @@ public class DataAnalysisServiceImpl implements IDataAnalysisService {
return PageUtils.getJsonObjectSdmResponse(finalResultList, pageInfo); return PageUtils.getJsonObjectSdmResponse(finalResultList, pageInfo);
} }
private SdmResponse<PageDataResp<List<SimulationTaskResultCurveResp>>> getTaskLevelFile(GetSimulationTaskFileReq req, QueryBigFileReq queryBigFileReq) {
PageHelper.startPage(req.getCurrent(), req.getSize());
List<FileMetadataInfo> fileMetadataInfoList = fileMetadataInfoService.lambdaQuery().eq(FileMetadataInfo::getParentId, queryBigFileReq.getDirId())
.eq(FileMetadataInfo::getFileType, req.getFileBizType())
.eq(FileMetadataInfo::getTenantId, ThreadLocalContext.getTenantId())
.list();
PageInfo<FileMetadataInfo> page = new PageInfo<>(fileMetadataInfoList);
long total = page.getTotal();
List<SimulationTaskResultCurveResp> resultCurveRespList = fileMetadataInfoList.stream().map(i -> {
SimulationTaskResultCurveResp resultCurveResp = new SimulationTaskResultCurveResp();
BeanUtils.copyProperties(i,resultCurveResp);
resultCurveResp.setFormatFileSize(FileSizeUtils.formatFileSize(BigDecimal.valueOf(i.getFileSize())));
return resultCurveResp;
}).toList();
PageInfo<SimulationTaskResultCurveResp> page1 = new PageInfo<>(resultCurveRespList);
page1.setTotal(total);
return PageUtils.getJsonObjectSdmResponse(resultCurveRespList, page1);
}
@Override @Override
public SdmResponse getCSVData(List<Long> fileIds) { public SdmResponse getCSVData(List<Long> fileIds) {
try { try {

View File

@@ -16,6 +16,7 @@ import com.sdm.common.entity.constants.PermConstants;
import com.sdm.common.entity.enums.*; import com.sdm.common.entity.enums.*;
import com.sdm.common.entity.pojo.task.TaskBaseInfo; import com.sdm.common.entity.pojo.task.TaskBaseInfo;
import com.sdm.common.entity.req.data.*; import com.sdm.common.entity.req.data.*;
import com.sdm.common.entity.req.data.CopyFileToTaskReq;
import com.sdm.common.entity.req.project.SpdmNodeListReq; import com.sdm.common.entity.req.project.SpdmNodeListReq;
import com.sdm.common.entity.req.system.LaunchApproveReq; import com.sdm.common.entity.req.system.LaunchApproveReq;
import com.sdm.common.entity.req.system.UserListReq; import com.sdm.common.entity.req.system.UserListReq;
@@ -1028,6 +1029,37 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
} }
} }
@Override
public SdmResponse copyFileToTask(CopyFileToTaskReq req) {
// 源文件
FileMetadataInfo sourceMetadataInfo = fileMetadataInfoService.lambdaQuery().eq(FileMetadataInfo::getId, req.getSourceFileId()).one();
if (ObjectUtils.isEmpty(sourceMetadataInfo)) {
return SdmResponse.failed("源文件不存在");
}
boolean hasWritePermission = fileUserPermissionService.hasFilePermission(sourceMetadataInfo.getId(), ThreadLocalContext.getUserId(), FilePermissionEnum.WRITE);
if (!hasWritePermission) {
return SdmResponse.failed("没有写入权限");
}
String oldDirMinioObjectKey = sourceMetadataInfo.getObjectKey();
// 要挪到的task文件夹
FileMetadataInfo targetParentMetadataInfo = fileMetadataInfoService.lambdaQuery().eq(FileMetadataInfo::getRelatedResourceUuid, req.getParentUuid()).one();
// 新的路径名
String newDirMinioObjectKey = getDirMinioObjectKey(targetParentMetadataInfo.getObjectKey() + sourceMetadataInfo.getOriginalName());
try {
minioService.copyFile(oldDirMinioObjectKey, newDirMinioObjectKey,sourceMetadataInfo.getBucketName());
// 创建目录元数据并保存到数据库
FileMetadataInfo fileInfo = createFileMetadata(newDirMinioObjectKey, sourceMetadataInfo.getOriginalName(), sourceMetadataInfo.getFileType(),
null, null, null, targetParentMetadataInfo.getId(), sourceMetadataInfo.getFileSize());
fileMetadataInfoService.save(fileInfo);
return SdmResponse.success("复制文件成功");
} catch (Exception e) {
log.error("复制文件失败", e);
throw new RuntimeException("复制文件失败: " + e.getMessage(), e);
}
}
@Override @Override
public SdmResponse zipFiles(ZipFilesReq req) { public SdmResponse zipFiles(ZipFilesReq req) {
return null; return null;

View File

@@ -1296,6 +1296,11 @@ public class SystemFileIDataFileServiceImpl implements IDataFileService {
return null; return null;
} }
@Override
public SdmResponse copyFileToTask(CopyFileToTaskReq req) {
return null;
}
// 未实现,勿使用 // 未实现,勿使用
@Override @Override
public SdmResponse chunkUploadCallback(KnowledgeCallBackReq req) { public SdmResponse chunkUploadCallback(KnowledgeCallBackReq req) {

View File

@@ -381,6 +381,41 @@ public class MinioService implements IMinioService {
} }
} }
public void copyFile(String oldObjectName, String newObjectName, String bucketName) {
try {
bucketName = getBucketName(bucketName);
// 参数校验
if (!StringUtils.hasText(oldObjectName)) {
throw new IllegalArgumentException("原文件名不能为空");
}
if (!StringUtils.hasText(newObjectName)) {
throw new IllegalArgumentException("新文件名不能为空");
}
// 检查原文件是否存在
StatObjectResponse stat = minioClient.statObject(
StatObjectArgs.builder()
.bucket(bucketName)
.object(oldObjectName)
.build());
// 复制文件到新名称
minioClient.copyObject(
CopyObjectArgs.builder()
.bucket(bucketName)
.object(newObjectName)
.source(CopySource.builder()
.bucket(bucketName)
.object(oldObjectName)
.build())
.build());
} catch (Exception e) {
log.error("复制文件失败: 从 {} 到 {}", oldObjectName, newObjectName, e);
throw new RuntimeException(e);
}
}
/** /**
* 从MinIO下载文件 * 从MinIO下载文件

View File

@@ -116,4 +116,8 @@ public class LyricVProjectToDM {
@TableField(value = "sign_num") @TableField(value = "sign_num")
public Integer signNum; public Integer signNum;
@Schema(description = "项目承接主体")
@TableField(value = "project_undertaker")
public String projectUndertaker;
} }

View File

@@ -1,5 +1,8 @@
package com.sdm.outbridge.mode; package com.sdm.outbridge.mode;
import lombok.Data;
@Data
public class LyricAttachmentInfo { public class LyricAttachmentInfo {
public int id; public int id;

View File

@@ -0,0 +1,31 @@
package com.sdm.project.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
/**
* 客户定制化查询需求附件配置
*/
@Data
@ConfigurationProperties(prefix = "project")
@Component
public class CustomDemandFileConfig {
/**
* 客户配置映射
*/
private Map<String, CustomerProperties> customers = new HashMap<>();
/**
* 当前活跃客户配置
*/
private String activeCustomer;
@Data
public static class CustomerProperties {
private boolean enabled = false;
}
}

View File

@@ -1,9 +1,12 @@
package com.sdm.project.controller; package com.sdm.project.controller;
import com.sdm.common.common.SdmResponse; import com.sdm.common.common.SdmResponse;
import com.sdm.common.entity.req.data.QueryDirReq;
import com.sdm.common.entity.req.data.UploadFilesReq; import com.sdm.common.entity.req.data.UploadFilesReq;
import com.sdm.common.entity.req.task.DemandExportExcelFormat; import com.sdm.common.entity.req.task.DemandExportExcelFormat;
import com.sdm.common.entity.req.task.TaskExportExcelFormat; import com.sdm.common.entity.req.task.TaskExportExcelFormat;
import com.sdm.common.entity.resp.PageDataResp;
import com.sdm.common.entity.resp.data.FileMetadataInfoResp;
import com.sdm.common.feign.inter.data.IDataFeignClient; import com.sdm.common.feign.inter.data.IDataFeignClient;
import com.sdm.common.log.annotation.SysLog; import com.sdm.common.log.annotation.SysLog;
import com.sdm.project.model.bo.ModifyProjectNode; import com.sdm.project.model.bo.ModifyProjectNode;
@@ -19,6 +22,8 @@ import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
@RestController @RestController
@RequestMapping("/demand") @RequestMapping("/demand")
@@ -116,4 +121,10 @@ public class SimulationDemandController {
return demandService.detail(demandId); return demandService.detail(demandId);
} }
@PostMapping("/queryDemandFiles")
@Operation(summary = "查询需求待办附件")
public SdmResponse<PageDataResp<List<FileMetadataInfoResp>>> queryDemandFiles(@RequestBody QueryDirReq req) {
return demandService.queryDemandFiles(req);
}
} }

View File

@@ -365,4 +365,12 @@ public class SimulationRunController implements ISimulationRunFeignClient {
return runService.detail(req); return runService.detail(req);
} }
/**
* 归档算例下指标图片报告等结果数据到任务下
*/
@PostMapping("/synKeyResultToTask")
public SdmResponse synKeyResultToTask(@RequestBody KeyResultReq req) {
return runService.synKeyResultToTask(req);
}
} }

View File

@@ -96,4 +96,8 @@ public class KeyResultReq extends BaseReq {
@Schema(description = "所属任务uuid") @Schema(description = "所属任务uuid")
private String taskId; private String taskId;
// ------------------归档关键结果使用-----------------
@Schema(description = "关键结果uuid列表")
private List<String> keyResultIdList;
} }

View File

@@ -1,9 +1,12 @@
package com.sdm.project.service; package com.sdm.project.service;
import com.sdm.common.common.SdmResponse; import com.sdm.common.common.SdmResponse;
import com.sdm.common.entity.req.data.QueryDirReq;
import com.sdm.common.entity.req.data.UploadFilesReq; import com.sdm.common.entity.req.data.UploadFilesReq;
import com.sdm.common.entity.req.task.DemandExportExcelFormat; import com.sdm.common.entity.req.task.DemandExportExcelFormat;
import com.sdm.common.entity.req.task.TaskExportExcelFormat; import com.sdm.common.entity.req.task.TaskExportExcelFormat;
import com.sdm.common.entity.resp.PageDataResp;
import com.sdm.common.entity.resp.data.FileMetadataInfoResp;
import com.sdm.project.model.req.*; import com.sdm.project.model.req.*;
import com.sdm.project.model.vo.SpdmDemandVo; import com.sdm.project.model.vo.SpdmDemandVo;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
@@ -40,4 +43,6 @@ public interface IDemandService {
List<SpdmDemandVo> getAllList(); List<SpdmDemandVo> getAllList();
SdmResponse<PageDataResp<List<FileMetadataInfoResp>>> queryDemandFiles(QueryDirReq req);
} }

View File

@@ -104,4 +104,6 @@ public interface ISimulationRunService extends IService<SimulationRun> {
SdmResponse<TaskRunPo> detail(SpdmTaskRunReq req); SdmResponse<TaskRunPo> detail(SpdmTaskRunReq req);
SdmResponse synKeyResultToTask(KeyResultReq req);
} }

View File

@@ -0,0 +1,31 @@
package com.sdm.project.service.handle;
import com.sdm.common.common.SdmResponse;
import com.sdm.common.entity.req.data.QueryDirReq;
import com.sdm.common.entity.resp.PageDataResp;
import com.sdm.common.entity.resp.data.FileMetadataInfoResp;
import com.sdm.common.feign.impl.data.DataClientFeignClientImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
@Slf4j
public class BasicQueryDemandFileHandler implements IQueryDemandFileHandler {
@Autowired
private DataClientFeignClientImpl dataFeignClient;
@Override
public SdmResponse<PageDataResp<List<FileMetadataInfoResp>>> queryDemandFile(QueryDirReq req) {
log.info("BasicQueryDemandFileSender start....");
return dataFeignClient.queryDir(req);
}
@Override
public boolean supports(String customerCode) {
return "basic".equals(customerCode);
}
}

View File

@@ -0,0 +1,20 @@
package com.sdm.project.service.handle;
import com.sdm.common.common.SdmResponse;
import com.sdm.common.entity.req.data.QueryDirReq;
import com.sdm.common.entity.resp.PageDataResp;
import com.sdm.common.entity.resp.data.FileMetadataInfoResp;
import java.util.List;
public interface IQueryDemandFileHandler {
/**
* 查询需求附件
*/
SdmResponse<PageDataResp<List<FileMetadataInfoResp>>> queryDemandFile(QueryDirReq req);
/**
* 是否支持该客户
*/
boolean supports(String customerCode);
}

View File

@@ -0,0 +1,100 @@
package com.sdm.project.service.handle;
import com.alibaba.fastjson2.JSONArray;
import com.github.pagehelper.PageInfo;
import com.sdm.common.common.SdmResponse;
import com.sdm.common.entity.enums.FileBizTypeEnum;
import com.sdm.common.entity.req.data.QueryDirReq;
import com.sdm.common.entity.resp.PageDataResp;
import com.sdm.common.entity.resp.data.FileMetadataInfoResp;
import com.sdm.common.utils.PageUtils;
import com.sdm.outbridge.mode.LyricAttachmentInfo;
import com.sdm.outbridge.service.lyric.LyricIntegrateService;
import com.sdm.project.model.entity.SimulationDemand;
import com.sdm.project.service.ISimulationLyricDemandService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
@Service
@Slf4j
public class LyricQueryDemandFileHandler implements IQueryDemandFileHandler {
@Autowired
private LyricIntegrateService lyricIntegrateService;
@Autowired
private BasicQueryDemandFileHandler basicSender;
@Autowired
private ISimulationLyricDemandService lyricDemandService;
@Override
public SdmResponse<PageDataResp<List<FileMetadataInfoResp>>> queryDemandFile(QueryDirReq req) {
log.info("LyricQueryDemandFileSender start....");
List<FileMetadataInfoResp> resultList = new ArrayList<>();
// 1、先调用基础查询文件接口
QueryDirReq newReq = new QueryDirReq();
BeanUtils.copyProperties(req,newReq);
newReq.setCurrent(1);
newReq.setSize(999);
SdmResponse<PageDataResp<List<FileMetadataInfoResp>>> basicResp = basicSender.queryDemandFile(newReq);
if (basicResp.isSuccess() && basicResp.getData() != null && basicResp.getData().getData() != null) {
resultList.addAll(basicResp.getData().getData());
}
SimulationDemand demand = lyricDemandService.lambdaQuery().eq(SimulationDemand::getUuid, req.getUuid()).one();
if (demand != null) {
// 2、再调用利元亨查询待办接口
SdmResponse sdmResponse = lyricIntegrateService.queryTodoAttachments(Integer.valueOf(demand.getDemandCode()));
if (sdmResponse.isSuccess() && sdmResponse.getData() != null) {
JSONArray jsonArray = (JSONArray) sdmResponse.getData();
List<LyricAttachmentInfo> attachmentInfos = jsonArray.toJavaList(LyricAttachmentInfo.class);
if (CollectionUtils.isNotEmpty(attachmentInfos)) {
for (LyricAttachmentInfo attachmentInfo : attachmentInfos) {
FileMetadataInfoResp fileMetadataInfoResp = new FileMetadataInfoResp();
fileMetadataInfoResp.setFileResource("EP");
fileMetadataInfoResp.setOriginalName(attachmentInfo.getName());
fileMetadataInfoResp.setFileUrl(attachmentInfo.getFilePath());
fileMetadataInfoResp.setFileType(FileBizTypeEnum.DEMAND_FILE.getValue());
fileMetadataInfoResp.setFileSize(attachmentInfo.getFileSize());
fileMetadataInfoResp.setCreatorName(StringUtils.isNotBlank(attachmentInfo.getCreateBy()) ? attachmentInfo.getCreateBy() : "EPUser");
fileMetadataInfoResp.setCreateTime(LocalDateTime.parse(attachmentInfo.getCreateTime()));
fileMetadataInfoResp.setUpdateTime(LocalDateTime.parse(attachmentInfo.getModifyTime()));
resultList.add(fileMetadataInfoResp);
}
}
}
}
// 手动分页
int pageSize = req.getSize();
int currentPage = req.getCurrent();
int fromIndex = (currentPage - 1) * pageSize;
int toIndex = Math.min(fromIndex + pageSize, resultList.size());
List<FileMetadataInfoResp> pagedResults = new ArrayList<>();
if (fromIndex < resultList.size()) {
pagedResults = resultList.subList(fromIndex, toIndex);
}
PageInfo<FileMetadataInfoResp> pageInfo = new PageInfo<>(pagedResults);
pageInfo.setTotal(resultList.size());
pageInfo.setPageNum(currentPage);
pageInfo.setPageSize(pageSize);
return PageUtils.getJsonObjectSdmResponse(pagedResults, pageInfo);
}
@Override
public boolean supports(String customerCode) {
return "lyric".equals(customerCode);
}
}

View File

@@ -0,0 +1,42 @@
package com.sdm.project.service.handle;
import com.sdm.project.config.CustomDemandFileConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class QueryDemandFileSelector {
@Autowired
private List<IQueryDemandFileHandler> handlers;
@Autowired
private BasicQueryDemandFileHandler basicHandler;
@Autowired
private CustomDemandFileConfig demandFileConfig;
/**
* 根据客户选择发送策略
*/
public IQueryDemandFileHandler selectHandler() {
String customerCode = demandFileConfig.getActiveCustomer();
if (customerCode == null) {
return basicHandler;
}
CustomDemandFileConfig.CustomerProperties config = demandFileConfig.getCustomers().get(customerCode);
// 如果配置不存在或未启用,直接返回基础策略
if (config == null || !config.isEnabled()) {
return basicHandler;
}
for (IQueryDemandFileHandler sender : handlers) {
if (sender.supports(customerCode)) {
return sender;
}
}
return basicHandler;
}
}

View File

@@ -12,12 +12,15 @@ import com.sdm.common.entity.enums.FilePermissionEnum;
import com.sdm.common.entity.enums.MessageTemplateEnum; import com.sdm.common.entity.enums.MessageTemplateEnum;
import com.sdm.common.entity.enums.ValueTypeEnum; import com.sdm.common.entity.enums.ValueTypeEnum;
import com.sdm.common.entity.req.data.CreateDirReq; import com.sdm.common.entity.req.data.CreateDirReq;
import com.sdm.common.entity.req.data.QueryDirReq;
import com.sdm.common.entity.req.data.UpdatePermissionReq; import com.sdm.common.entity.req.data.UpdatePermissionReq;
import com.sdm.common.entity.req.data.UploadFilesReq; import com.sdm.common.entity.req.data.UploadFilesReq;
import com.sdm.common.entity.req.system.SendMsgReq; import com.sdm.common.entity.req.system.SendMsgReq;
import com.sdm.common.entity.req.system.UserQueryReq; import com.sdm.common.entity.req.system.UserQueryReq;
import com.sdm.common.entity.req.task.DemandExportExcelFormat; import com.sdm.common.entity.req.task.DemandExportExcelFormat;
import com.sdm.common.entity.req.task.DemandExportExcelParam; import com.sdm.common.entity.req.task.DemandExportExcelParam;
import com.sdm.common.entity.resp.PageDataResp;
import com.sdm.common.entity.resp.data.FileMetadataInfoResp;
import com.sdm.common.entity.resp.project.SpdmTaskVo; import com.sdm.common.entity.resp.project.SpdmTaskVo;
import com.sdm.common.entity.resp.system.CIDUserResp; import com.sdm.common.entity.resp.system.CIDUserResp;
import com.sdm.common.feign.impl.data.DataClientFeignClientImpl; import com.sdm.common.feign.impl.data.DataClientFeignClientImpl;
@@ -41,6 +44,8 @@ import com.sdm.project.model.po.TaskNodePo;
import com.sdm.project.model.req.*; import com.sdm.project.model.req.*;
import com.sdm.project.model.vo.*; import com.sdm.project.model.vo.*;
import com.sdm.project.service.IDemandService; import com.sdm.project.service.IDemandService;
import com.sdm.project.service.handle.IQueryDemandFileHandler;
import com.sdm.project.service.handle.QueryDemandFileSelector;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
@@ -86,6 +91,9 @@ public class DemandServiceImpl extends BaseService implements IDemandService {
@Autowired @Autowired
private MessageFeignClientImpl messageFeignClient; private MessageFeignClientImpl messageFeignClient;
@Autowired
private QueryDemandFileSelector queryDemandFileSelector;
@Transactional @Transactional
@Override @Override
@@ -1008,6 +1016,12 @@ public class DemandServiceImpl extends BaseService implements IDemandService {
return mapper.getAllList(); return mapper.getAllList();
} }
@Override
public SdmResponse<PageDataResp<List<FileMetadataInfoResp>>> queryDemandFiles(QueryDirReq req) {
IQueryDemandFileHandler queryDemandFileHandler = queryDemandFileSelector.selectHandler();
return queryDemandFileHandler.queryDemandFile(req);
}
private String getLastNodeId(TaskNode taskNode) { private String getLastNodeId(TaskNode taskNode) {
List<String> tagListProperty; List<String> tagListProperty;
String lastNodeId = ""; String lastNodeId = "";

View File

@@ -0,0 +1,12 @@
package com.sdm.project.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sdm.project.dao.SimulationDemandMapper;
import com.sdm.project.model.entity.SimulationDemand;
import com.sdm.project.service.ISimulationLyricDemandService;
import org.springframework.stereotype.Service;
@Service
public class ISimulationLyricDemandServiceImpl extends ServiceImpl<SimulationDemandMapper, SimulationDemand> implements ISimulationLyricDemandService {
}

View File

@@ -477,6 +477,7 @@ public class NodeServiceImpl extends ServiceImpl<SimulationNodeMapper, Simulatio
phaseNode.setUuid(RandomUtil.generateString(32)); phaseNode.setUuid(RandomUtil.generateString(32));
phaseNode.setNodeCode(currentPhase); phaseNode.setNodeCode(currentPhase);
phaseNode.setNodeName(currentPhase); phaseNode.setNodeName(currentPhase);
phaseNode.setNodeType(NodeTypeEnum.PHASE.getValue());
phaseNode.setCreateTime(curDateStr); phaseNode.setCreateTime(curDateStr);
phaseNode.setCreator(jobNumber); phaseNode.setCreator(jobNumber);
phaseNode.setTenantId(tenantId); phaseNode.setTenantId(tenantId);
@@ -492,6 +493,7 @@ public class NodeServiceImpl extends ServiceImpl<SimulationNodeMapper, Simulatio
machineNode.setUuid(RandomUtil.generateString(32)); machineNode.setUuid(RandomUtil.generateString(32));
machineNode.setNodeCode(machineNumber); machineNode.setNodeCode(machineNumber);
machineNode.setNodeName(projectStationByMachineNumberList.get(0).getMachineName()); machineNode.setNodeName(projectStationByMachineNumberList.get(0).getMachineName());
machineNode.setNodeType(NodeTypeEnum.MACHINE.getValue());
machineNode.setCreateTime(curDateStr); machineNode.setCreateTime(curDateStr);
machineNode.setCreator(jobNumber); machineNode.setCreator(jobNumber);
machineNode.setTenantId(tenantId); machineNode.setTenantId(tenantId);
@@ -503,6 +505,7 @@ public class NodeServiceImpl extends ServiceImpl<SimulationNodeMapper, Simulatio
workspaceNode.setUuid(RandomUtil.generateString(32)); workspaceNode.setUuid(RandomUtil.generateString(32));
workspaceNode.setNodeCode(lyricVProjectStationToDM.getStationNum()); workspaceNode.setNodeCode(lyricVProjectStationToDM.getStationNum());
workspaceNode.setNodeName(lyricVProjectStationToDM.getStationName()); workspaceNode.setNodeName(lyricVProjectStationToDM.getStationName());
workspaceNode.setNodeType(NodeTypeEnum.WORKSPACE.getValue());
workspaceNode.setCreateTime(curDateStr); workspaceNode.setCreateTime(curDateStr);
workspaceNode.setCreator(jobNumber); workspaceNode.setCreator(jobNumber);
workspaceNode.setTenantId(tenantId); workspaceNode.setTenantId(tenantId);

View File

@@ -13,6 +13,7 @@ import com.sdm.common.config.FlowableConfig;
import com.sdm.common.entity.constants.NumberConstants; import com.sdm.common.entity.constants.NumberConstants;
import com.sdm.common.entity.enums.ApproveTypeEnum; import com.sdm.common.entity.enums.ApproveTypeEnum;
import com.sdm.common.entity.enums.DirTypeEnum; import com.sdm.common.entity.enums.DirTypeEnum;
import com.sdm.common.entity.enums.FileBizTypeEnum;
import com.sdm.common.entity.enums.NodeTypeEnum; import com.sdm.common.entity.enums.NodeTypeEnum;
import com.sdm.common.entity.flowable.dto.FlowElementDTO; import com.sdm.common.entity.flowable.dto.FlowElementDTO;
import com.sdm.common.entity.flowable.dto.ProcessDefinitionDTO; import com.sdm.common.entity.flowable.dto.ProcessDefinitionDTO;
@@ -64,6 +65,7 @@ import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mock.web.MockMultipartFile;
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 org.springframework.web.multipart.MultipartFile;
@@ -1421,8 +1423,28 @@ public class SimulationRunServiceImpl extends ServiceImpl<SimulationRunMapper, S
try { try {
// 获取临时路径中脚本生成的报告 // 获取临时路径中脚本生成的报告
String reportName = "report_" + String reportName = "report_" +
LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")) + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) +
".docx"; ".docx";
// 上传到算例下的报告文件夹下
KeyResultReq resultReq = new KeyResultReq();
resultReq.setKeyResultType(KeyResultTypeEnum.DOCUMENT.getKeyResultType());
resultReq.setRunId(req.getRunId());
resultReq.setName(reportName);
// 创建临时MultipartFile
MockMultipartFile multipartFile = new MockMultipartFile(
reportName,
reportName,
"application/json",
fileData);
resultReq.setFile(multipartFile);
resultReq.setFileName(reportName);
resultReq.setFileType(FileBizTypeEnum.REPORT_FILE.getValue());
SdmResponse sdmResponse = addSimulationKeyResult(resultReq);
if (!sdmResponse.isSuccess()) {
throw new RuntimeException("生成自动化报告上传报告结果目录失败");
}
// 下载到本地
FileInputStream fileInputStream = new FileInputStream(TEMP_REPORT_PATH + randomId + File.separator + reportName); FileInputStream fileInputStream = new FileInputStream(TEMP_REPORT_PATH + randomId + File.separator + reportName);
fileData = fileInputStream.readAllBytes(); fileData = fileInputStream.readAllBytes();
// 设置响应头 // 设置响应头
@@ -1900,4 +1922,49 @@ public class SimulationRunServiceImpl extends ServiceImpl<SimulationRunMapper, S
return SdmResponse.success(taskRunPo); return SdmResponse.success(taskRunPo);
} }
@Override
public SdmResponse synKeyResultToTask(KeyResultReq req) {
SimulationRun simulationRun = this.lambdaQuery().eq(SimulationRun::getUuid, req.getRunId()).one();
if (simulationRun == null) {
return SdmResponse.failed("算例不存在");
}
if (CollectionUtils.isNotEmpty(req.getKeyResultIdList())) {
for (String keyResultId : req.getKeyResultIdList()) {
SimulationRunKeyResult keyResult = simulationKeyResultService.lambdaQuery().eq(SimulationRunKeyResult::getUuid, keyResultId).one();
if (keyResult == null) {
return SdmResponse.failed("关键结果不存在");
}
// 将算例下的指标分析值同步到任务指标
if (KeyResultTypeEnum.VALUE.getKeyResultType().equals(keyResult.getKeyResultType())) {
List<SimulationPerformance> runPerformanceList = simulationPerformanceService.lambdaQuery()
.eq(SimulationPerformance::getRunId, req.getRunId())
.list();
Map<String, String> resultValueMap = new HashMap<>();
if (CollectionUtils.isNotEmpty(runPerformanceList)) {
resultValueMap = runPerformanceList.stream().collect(Collectors.toMap(SimulationPerformance::getNodeCode, SimulationPerformance::getResultValue));
}
List<SimulationPerformance> simulationTaskPerformances = simulationPerformanceService.lambdaQuery()
.eq(SimulationPerformance::getTaskId, simulationRun.getTaskId())
.isNull(SimulationPerformance::getRunId)
.list();
if (CollectionUtils.isNotEmpty(simulationTaskPerformances)) {
for (SimulationPerformance simulationTaskPerformance : simulationTaskPerformances) {
simulationTaskPerformance.setResultValue(resultValueMap.get(simulationTaskPerformance.getNodeCode()));
}
simulationPerformanceService.updateBatchById(simulationTaskPerformances);
}
} else {
// 图片/曲线/报告结果同步
CopyFileToTaskReq copyFileToTaskReq = new CopyFileToTaskReq();
copyFileToTaskReq.setSourceFileId(keyResult.getFileId());
copyFileToTaskReq.setParentUuid(simulationRun.getTaskId());
SdmResponse response = dataFeignClient.copyFileToTask(copyFileToTaskReq);
if (!response.isSuccess()) {
return SdmResponse.failed("归档文件失败");
}
}
}
}
return SdmResponse.success();
}
} }

View File

@@ -141,4 +141,12 @@ YA:
scheduler: scheduler:
todo: 10.10.00 todo: 10.10.00
project: 10.11.00 project: 10.11.00
project:
active-customer: basic
customers:
basic:
enabled: true
lyric:
enabled: false

View File

@@ -141,4 +141,12 @@ YA:
scheduler: scheduler:
todo: 10.10.00 todo: 10.10.00
project: 10.11.00 project: 10.11.00
project:
active-customer: basic
customers:
basic:
enabled: true
lyric:
enabled: false

View File

@@ -145,4 +145,12 @@ YA:
scheduler: scheduler:
todo: 20.00.00 todo: 20.00.00
project: 20.00.00 project: 20.00.00
project:
active-customer: basic
customers:
basic:
enabled: true
lyric:
enabled: false

View File

@@ -142,4 +142,12 @@ YA:
scheduler: scheduler:
todo: 20.00.00 todo: 20.00.00
project: 20.00.00 project: 20.00.00
project:
active-customer: lyric
customers:
basic:
enabled: false
lyric:
enabled: true

View File

@@ -141,4 +141,12 @@ YA:
scheduler: scheduler:
todo: 10.10.00 todo: 10.10.00
project: 10.11.00 project: 10.11.00
project:
active-customer: basic
customers:
basic:
enabled: true
lyric:
enabled: false