From 4bda2ada082739cc5ec5e6c012060c55a52ea305 Mon Sep 17 00:00:00 2001 From: luotaiqian <1147642922@qq.com> Date: Tue, 25 Aug 2026 18:20:42 +0800 Subject: [PATCH] archive file --- .../web/EvalProjectArchiveFileController.java | 9 ++ .../EvalProcessControlExecutor.java | 76 +------------ .../EvalProjectArchiveFileSupport.java | 105 ++++++++++++++++++ .../EvalProjectArchiveFileListQueryExe.java | 56 ++++++++++ .../EvalProjectArchiveFileServiceI.java | 12 ++ .../EvalProjectArchiveFileServiceImpl.java | 8 ++ 6 files changed, 195 insertions(+), 71 deletions(-) create mode 100644 safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/institution/support/EvalProjectArchiveFileSupport.java diff --git a/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/web/EvalProjectArchiveFileController.java b/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/web/EvalProjectArchiveFileController.java index 71e4f0f9..3433c20c 100644 --- a/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/web/EvalProjectArchiveFileController.java +++ b/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/web/EvalProjectArchiveFileController.java @@ -5,6 +5,7 @@ import com.alibaba.cola.dto.Response; import com.alibaba.cola.dto.SingleResponse; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; import lombok.AllArgsConstructor; import org.qinan.safetyeval.app.file.service.EvalProjectArchiveFileServiceI; import org.qinan.safetyeval.client.file.request.EvalProjectArchiveFileAddCmd; @@ -17,6 +18,7 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.io.Serializable; +import java.util.List; /** * 安全评价项目档案文件 @@ -40,6 +42,13 @@ public class EvalProjectArchiveFileController implements Serializable { return evalProjectArchiveFileServiceI.listEvalProjectArchiveFileOrgPage(qry); } + @GetMapping("/org/list") + @ApiOperation("查询安全评价项目档案文件列表-机构端按项目不分页") + public org.qinan.safetyeval.client.dto.SingleResponse> orgListByProject( + @ApiParam("项目ID") @RequestParam String projectId) { + return evalProjectArchiveFileServiceI.listEvalProjectArchiveFileByProject(ThreadLocalUserInfoAdapter.getOrgId(), projectId); + } + @GetMapping("/monitor/page") @ApiOperation("查询安全评价项目档案文件列表-监管端分页") public PageResponse monitorList(@Validated EvalProjectArchiveFileMonitorPageQry qry) { diff --git a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/institution/EvalProcessControlExecutor.java b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/institution/EvalProcessControlExecutor.java index 6907fbeb..0ea88056 100644 --- a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/institution/EvalProcessControlExecutor.java +++ b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/institution/EvalProcessControlExecutor.java @@ -9,6 +9,7 @@ import com.alibaba.fastjson2.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.extern.slf4j.Slf4j; import org.qinan.safetyeval.app.executor.institution.support.EvalCmdCopy; +import org.qinan.safetyeval.app.executor.institution.support.EvalProjectArchiveFileSupport; import org.qinan.safetyeval.app.executor.institution.support.EvalProjectNodeSupport; import org.qinan.safetyeval.app.item.convertor.EvalReviewItemCmdConvertor; import org.qinan.safetyeval.client.api.institution.EvalProcessControlApi; @@ -103,6 +104,8 @@ public class EvalProcessControlExecutor implements EvalProcessControlApi { @Resource private EvalProjectArchiveFileMapper evalProjectArchiveFileMapper; @Resource + private EvalProjectArchiveFileSupport evalProjectArchiveFileSupport; + @Resource private EvalSignTaskMapper evalSignTaskMapper; @Resource private WpsDocQueryService wpsDocQueryService; @@ -541,77 +544,8 @@ public class EvalProcessControlExecutor implements EvalProcessControlApi { .eq(EvalProjectArchiveFileDO::getRecordSource, ProjectArchiveFileSourceEnum.AUTO_PROCESS_RECORD.getCode())); List files = listProjectFiles(projectId).getData(); - if (CollectionUtils.isEmpty(files)) { - return; - } - for (EvalProjectFileCO file : files) { - if (!StringUtils.hasText(file.getProjectDocUrl())) { - continue; - } - ProjectStageEnum stage = resolveStageByMsg(file.getProcessName()); - evalProjectArchiveFileMapper.insert(buildArchiveFileDO(projectId, project, file, stage)); - } - } - - /** - * 构建单条档案文件记录:files 存文件 JSON 数组原文,archiveType 按业务节点映射 ArchiveTypeEnum, - * businessNode 存 ProjectStageEnum 英文标识。 - */ - private EvalProjectArchiveFileDO buildArchiveFileDO(Long projectId, EvalProjectEntity project, - EvalProjectFileCO file, ProjectStageEnum stage) { - EvalProjectArchiveFileDO archiveFileDO = new EvalProjectArchiveFileDO(); - archiveFileDO.setOrgId(project.getOrgId()); - archiveFileDO.setProjectId(String.valueOf(projectId)); - archiveFileDO.setFiles(file.getProjectDocUrl()); - archiveFileDO.setArchiveType(resolveArchiveType(stage).getCode()); - archiveFileDO.setBusinessNode(stage != null ? stage.getVal() : file.getProcessName()); - archiveFileDO.setRecordSource(ProjectArchiveFileSourceEnum.AUTO_PROCESS_RECORD.getCode()); - InsertFieldDefaults.apply(archiveFileDO); - return archiveFileDO; - } - - /** - * 根据流程中文名(ProjectStageEnum.msg,如 业务合同/现场踏勘)查找对应阶段枚举,未匹配返回 null。 - */ - private ProjectStageEnum resolveStageByMsg(String processName) { - if (!StringUtils.hasText(processName)) { - return null; - } - for (ProjectStageEnum stage : ProjectStageEnum.values()) { - if (stage.getMsg().equals(processName)) { - return stage; - } - } - return null; - } - - /** - * 按业务节点映射档案类型:风险分析→项目风险分析,业务合同→技术服务合同,项目组→项目组织文件, - * 现场踏勘→现场勘察资料,报告编制→评价报告,内部审核/技术审核→审核记录,过程控制→过程控制文件, - * 其余→其他。 - */ - private ArchiveTypeEnum resolveArchiveType(ProjectStageEnum stage) { - if (stage == null) { - return ArchiveTypeEnum.OTHER; - } - switch (stage) { - case RISK_ANALYSIS: - return ArchiveTypeEnum.RISK_ANALYSIS; - case BUSINESS_CONTRACT: - return ArchiveTypeEnum.TECH_SERVICE_CONTRACT; - case PROJECT_GROUP: - return ArchiveTypeEnum.PROJECT_ORG_FILE; - case SITE_SURVEY: - return ArchiveTypeEnum.SITE_SURVEY; - case REPORT_PREPARATION: - return ArchiveTypeEnum.EVALUATION_REPORT; - case INTERNAL_REVIEW: - case TECHNICAL_REVIEW: - return ArchiveTypeEnum.REVIEW_RECORD; - case PROCESS_CONTROL: - return ArchiveTypeEnum.PROCESS_CONTROL; - default: - return ArchiveTypeEnum.OTHER; + for (EvalProjectArchiveFileDO archiveFileDO : evalProjectArchiveFileSupport.buildAutoArchiveFiles(projectId, project, files)) { + evalProjectArchiveFileMapper.insert(archiveFileDO); } } diff --git a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/institution/support/EvalProjectArchiveFileSupport.java b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/institution/support/EvalProjectArchiveFileSupport.java new file mode 100644 index 00000000..1b6228f9 --- /dev/null +++ b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/institution/support/EvalProjectArchiveFileSupport.java @@ -0,0 +1,105 @@ +package org.qinan.safetyeval.app.executor.institution.support; + +import org.qinan.safetyeval.client.co.institution.EvalProjectFileCO; +import org.qinan.safetyeval.domain.constant.ArchiveTypeEnum; +import org.qinan.safetyeval.domain.constant.ProjectArchiveFileSourceEnum; +import org.qinan.safetyeval.domain.constant.ProjectStageEnum; +import org.qinan.safetyeval.domain.entity.EvalProjectEntity; +import org.qinan.safetyeval.infrastructure.persistence.domainobject.EvalProjectArchiveFileDO; +import org.qinan.safetyeval.infrastructure.support.InsertFieldDefaults; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; + +import java.util.ArrayList; +import java.util.List; + +/** + * 项目档案文件构建支持类:按归档规则将项目过程文件构建为 eval_project_archive_file 记录(不落库)。 + * 供归档落库(EvalProcessControlExecutor)与未归档项目档案查询实时构造共用。 + */ +@Component +public class EvalProjectArchiveFileSupport { + + /** + * 按归档规则构建流程自动记录档案文件列表:files 存文件 JSON 数组原文, + * archiveType 按业务节点映射 ArchiveTypeEnum,businessNode 存 ProjectStageEnum 英文标识。 + * + * @param projectId 项目ID + * @param project 项目实体 + * @param files 项目过程文件列表 + * @return 档案文件DO列表(未落库) + */ + public List buildAutoArchiveFiles(Long projectId, EvalProjectEntity project, + List files) { + List result = new ArrayList<>(); + for (EvalProjectFileCO file : files) { + if (!StringUtils.hasText(file.getProjectDocUrl())) { + continue; + } + ProjectStageEnum stage = resolveStageByMsg(file.getProcessName()); + result.add(buildArchiveFileDO(projectId, project, file, stage)); + } + return result; + } + + /** + * 构建单条档案文件记录:files 存文件 JSON 数组原文。 + */ + private EvalProjectArchiveFileDO buildArchiveFileDO(Long projectId, EvalProjectEntity project, + EvalProjectFileCO file, ProjectStageEnum stage) { + EvalProjectArchiveFileDO archiveFileDO = new EvalProjectArchiveFileDO(); + archiveFileDO.setOrgId(project.getOrgId()); + archiveFileDO.setProjectId(String.valueOf(projectId)); + archiveFileDO.setFiles(file.getProjectDocUrl()); + archiveFileDO.setArchiveType(resolveArchiveType(stage).getCode()); + archiveFileDO.setBusinessNode(stage != null ? stage.getVal() : file.getProcessName()); + archiveFileDO.setRecordSource(ProjectArchiveFileSourceEnum.AUTO_PROCESS_RECORD.getCode()); + InsertFieldDefaults.apply(archiveFileDO); + return archiveFileDO; + } + + /** + * 根据流程中文名(ProjectStageEnum.msg,如 业务合同/现场踏勘)查找对应阶段枚举,未匹配返回 null。 + */ + private ProjectStageEnum resolveStageByMsg(String processName) { + if (!StringUtils.hasText(processName)) { + return null; + } + for (ProjectStageEnum stage : ProjectStageEnum.values()) { + if (stage.getMsg().equals(processName)) { + return stage; + } + } + return null; + } + + /** + * 按业务节点映射档案类型:风险分析→项目风险分析,业务合同→技术服务合同,项目组→项目组织文件, + * 现场踏勘→现场勘察资料,报告编制→评价报告,内部审核/技术审核→审核记录,过程控制→过程控制文件, + * 其余→其他。 + */ + private ArchiveTypeEnum resolveArchiveType(ProjectStageEnum stage) { + if (stage == null) { + return ArchiveTypeEnum.OTHER; + } + switch (stage) { + case RISK_ANALYSIS: + return ArchiveTypeEnum.RISK_ANALYSIS; + case BUSINESS_CONTRACT: + return ArchiveTypeEnum.TECH_SERVICE_CONTRACT; + case PROJECT_GROUP: + return ArchiveTypeEnum.PROJECT_ORG_FILE; + case SITE_SURVEY: + return ArchiveTypeEnum.SITE_SURVEY; + case REPORT_PREPARATION: + return ArchiveTypeEnum.EVALUATION_REPORT; + case INTERNAL_REVIEW: + case TECHNICAL_REVIEW: + return ArchiveTypeEnum.REVIEW_RECORD; + case PROCESS_CONTROL: + return ArchiveTypeEnum.PROCESS_CONTROL; + default: + return ArchiveTypeEnum.OTHER; + } + } +} diff --git a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/file/executor/query/EvalProjectArchiveFileListQueryExe.java b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/file/executor/query/EvalProjectArchiveFileListQueryExe.java index 000beeaa..a13dcbe4 100644 --- a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/file/executor/query/EvalProjectArchiveFileListQueryExe.java +++ b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/file/executor/query/EvalProjectArchiveFileListQueryExe.java @@ -1,12 +1,25 @@ package org.qinan.safetyeval.app.file.executor.query; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.AllArgsConstructor; +import org.qinan.safetyeval.app.executor.institution.support.EvalProjectArchiveFileSupport; +import org.qinan.safetyeval.app.executor.institution.support.EvalProjectNodeSupport; +import org.qinan.safetyeval.client.api.institution.EvalProcessControlApi; +import org.qinan.safetyeval.client.co.institution.EvalProjectFileCO; +import org.qinan.safetyeval.client.dto.SingleResponse; import org.qinan.safetyeval.client.file.response.EvalProjectArchiveFileCo; +import org.qinan.safetyeval.domain.constant.BooleanQAEnum; +import org.qinan.safetyeval.domain.constant.ProjectArchiveFileSourceEnum; +import org.qinan.safetyeval.domain.entity.EvalProjectEntity; import org.qinan.safetyeval.infrastructure.convertor.EvalProjectArchiveFileDoConvertor; import org.qinan.safetyeval.infrastructure.persistence.domainobject.EvalProjectArchiveFileDO; +import org.qinan.safetyeval.infrastructure.persistence.mapper.EvalProjectArchiveFileMapper; import org.qinan.safetyeval.infrastructure.persistence.queryservice.EvalProjectArchiveFileQueryService; import org.springframework.stereotype.Component; +import java.util.ArrayList; +import java.util.List; + /** * 安全评价项目档案文件查询执行器 * @@ -19,6 +32,10 @@ public class EvalProjectArchiveFileListQueryExe { private final EvalProjectArchiveFileQueryService evalProjectArchiveFileQueryService; private final EvalProjectArchiveFileDoConvertor evalProjectArchiveFileDoConvertor; + private final EvalProjectNodeSupport evalProjectNodeSupport; + private final EvalProcessControlApi evalProcessControlApi; + private final EvalProjectArchiveFileSupport evalProjectArchiveFileSupport; + private final EvalProjectArchiveFileMapper evalProjectArchiveFileMapper; /** * 根据ID查找安全评价项目档案文件对象 @@ -31,4 +48,43 @@ public class EvalProjectArchiveFileListQueryExe { return evalProjectArchiveFileDoConvertor.converDoToCo(evalProjectArchiveFileDO); } + /** + * 按机构ID+项目ID查询档案文件列表(不分页)。 + * 项目已归档:直接返回档案表记录; + * 项目未归档:档案表流程自动记录尚未写入,仅返回补充上传记录, + * 并按归档规则实时构造流程过程数据(不落库)合并返回。 + * + * @param orgId 机构ID + * @param projectId 项目ID + * @return 档案文件列表 + */ + public SingleResponse> execute(Long orgId, String projectId) { + Long pid = Long.parseLong(projectId); + EvalProjectEntity project = evalProjectNodeSupport.requireProject(pid); + // 已归档:直接查询档案表数据返回 + if (project.getArchiveFlag() != null && project.getArchiveFlag() == 1) { + return SingleResponse.success(evalProjectArchiveFileDoConvertor.converDosToCos(listArchiveFiles(orgId, projectId, null))); + } + // 未归档:仅查补充上传记录,流程过程数据按归档规则实时构造(不落库)合并返回 + List result = new ArrayList<>( + listArchiveFiles(orgId, projectId, ProjectArchiveFileSourceEnum.UPLOAD_ADDITIONAL_FILES.getCode())); + List files = evalProcessControlApi.listProjectFiles(pid).getData(); + result.addAll(evalProjectArchiveFileSupport.buildAutoArchiveFiles(pid, project, files)); + return SingleResponse.success(evalProjectArchiveFileDoConvertor.converDosToCos(result)); + } + + /** + * 查询档案表记录:按机构+项目过滤并排除已删除;recordSource 非空时按来源过滤。 + */ + private List listArchiveFiles(Long orgId, String projectId, String recordSource) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper() + .eq(EvalProjectArchiveFileDO::getOrgId, orgId) + .eq(EvalProjectArchiveFileDO::getProjectId, projectId) + .eq(EvalProjectArchiveFileDO::getDeleteEnum, BooleanQAEnum.FALSE.getValue()); + if (recordSource != null) { + wrapper.eq(EvalProjectArchiveFileDO::getRecordSource, recordSource); + } + return evalProjectArchiveFileMapper.selectList(wrapper); + } + } diff --git a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/file/service/EvalProjectArchiveFileServiceI.java b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/file/service/EvalProjectArchiveFileServiceI.java index 91cc6f3d..7e729abb 100644 --- a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/file/service/EvalProjectArchiveFileServiceI.java +++ b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/file/service/EvalProjectArchiveFileServiceI.java @@ -1,12 +1,15 @@ package org.qinan.safetyeval.app.file.service; import com.alibaba.cola.dto.PageResponse; +import org.qinan.safetyeval.client.dto.SingleResponse; import org.qinan.safetyeval.client.file.request.EvalProjectArchiveFileAddCmd; import org.qinan.safetyeval.client.file.request.EvalProjectArchiveFileMonitorPageQry; import org.qinan.safetyeval.client.file.request.EvalProjectArchiveFilePageQry; import org.qinan.safetyeval.client.file.request.EvalProjectArchiveFileUpdateCmd; import org.qinan.safetyeval.client.file.response.EvalProjectArchiveFileCo; +import java.util.List; + /** * 安全评价项目档案文件 * @@ -30,6 +33,15 @@ public interface EvalProjectArchiveFileServiceI { */ PageResponse listEvalProjectArchiveFileMonitorPage(EvalProjectArchiveFileMonitorPageQry evalProjectArchiveFileMonitorPageQry); + /** + * 按机构ID+项目ID查询档案文件列表(不分页;未归档项目实时构造流程过程数据) + * + * @param orgId 机构ID + * @param projectId 项目ID + * @return 档案文件列表 + */ + SingleResponse> listEvalProjectArchiveFileByProject(Long orgId, String projectId); + /** * 根据ID获取安全评价项目档案文件详情 * diff --git a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/file/service/impl/EvalProjectArchiveFileServiceImpl.java b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/file/service/impl/EvalProjectArchiveFileServiceImpl.java index 11f482d6..781f8d18 100644 --- a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/file/service/impl/EvalProjectArchiveFileServiceImpl.java +++ b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/file/service/impl/EvalProjectArchiveFileServiceImpl.java @@ -8,6 +8,7 @@ import org.qinan.safetyeval.app.file.executor.command.EvalProjectArchiveFileUpda import org.qinan.safetyeval.app.file.executor.query.EvalProjectArchiveFileListQueryExe; import org.qinan.safetyeval.app.file.executor.query.EvalProjectArchiveFilePageQueryExe; import org.qinan.safetyeval.app.file.service.EvalProjectArchiveFileServiceI; +import org.qinan.safetyeval.client.dto.SingleResponse; import org.qinan.safetyeval.client.file.request.EvalProjectArchiveFileAddCmd; import org.qinan.safetyeval.client.file.request.EvalProjectArchiveFileMonitorPageQry; import org.qinan.safetyeval.client.file.request.EvalProjectArchiveFilePageQry; @@ -15,6 +16,8 @@ import org.qinan.safetyeval.client.file.request.EvalProjectArchiveFileUpdateCmd; import org.qinan.safetyeval.client.file.response.EvalProjectArchiveFileCo; import org.springframework.stereotype.Service; +import java.util.List; + /** * 安全评价项目档案文件 * @@ -41,6 +44,11 @@ public class EvalProjectArchiveFileServiceImpl implements EvalProjectArchiveFile return evalProjectArchiveFilePageQueryExe.listEvalProjectArchiveFileMonitorPage(evalProjectArchiveFileMonitorPageQry); } + @Override + public SingleResponse> listEvalProjectArchiveFileByProject(Long orgId, String projectId) { + return evalProjectArchiveFileListQueryExe.execute(orgId, projectId); + } + @Override public EvalProjectArchiveFileCo getEvalProjectArchiveFileById(Long id) { return evalProjectArchiveFileListQueryExe.execute(id);