From ccf91b290c34928bcb2e2546b450317a65ad9f15 Mon Sep 17 00:00:00 2001 From: luotaiqian <1147642922@qq.com> Date: Fri, 24 Jul 2026 09:03:13 +0800 Subject: [PATCH] waring --- .../EvalProcessControlExecutor.java | 31 +++++++++++++++++++ .../domain/exception/ErrorCode.java | 1 + 2 files changed, 32 insertions(+) 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 10dc34d..6a85ba4 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 @@ -1,5 +1,6 @@ package org.qinan.safetyeval.app.executor.institution; +import com.alibaba.fastjson2.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import org.qinan.safetyeval.app.executor.institution.support.EvalCmdCopy; import org.qinan.safetyeval.app.executor.institution.support.EvalNodeCoConverter; @@ -9,6 +10,7 @@ import org.qinan.safetyeval.client.api.institution.EvalProcessControlApi; import org.qinan.safetyeval.client.co.institution.EvalProcessControlCO; import org.qinan.safetyeval.client.co.institution.EvalProcessControlDetailCO; import org.qinan.safetyeval.client.co.institution.EvalProjectFileCO; +import org.qinan.safetyeval.client.co.institution.ProjectNodeCO; import org.qinan.safetyeval.client.dto.SingleResponse; import org.qinan.safetyeval.client.dto.institution.EvalProcessArchiveCmd; import org.qinan.safetyeval.client.dto.institution.EvalProcessControlAssignCmd; @@ -43,6 +45,7 @@ import org.qinan.safetyeval.infrastructure.persistence.queryservice.*; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; import javax.annotation.Resource; import java.time.LocalDateTime; @@ -121,6 +124,8 @@ public class EvalProcessControlExecutor implements EvalProcessControlApi { public SingleResponse confirm(EvalProcessControlConfirmCmd cmd) { Long projectId = cmd.getProjectId(); EvalProjectEntity project = evalProjectNodeSupport.requireProject(projectId); + // 校验前置节点是否全部完成(过程控制节点除外) + assertPreNodesCompleted(project); // 判断项目是否归档 if (project.getArchiveFlag() != null && project.getArchiveFlag() == 1) { throw new BizException(ErrorCode.EVAL_PROJECT_ARCHIVED); @@ -158,6 +163,8 @@ public class EvalProcessControlExecutor implements EvalProcessControlApi { public SingleResponse assign(EvalProcessControlAssignCmd cmd) { Long projectId = cmd.getProjectId(); EvalProjectEntity project = evalProjectNodeSupport.requireProject(projectId); + // 校验前置节点是否全部完成(过程控制节点除外) + assertPreNodesCompleted(project); // 判断项目是否归档 if (project.getArchiveFlag() != null && project.getArchiveFlag() == 1) { throw new BizException(ErrorCode.EVAL_PROJECT_ARCHIVED); @@ -236,6 +243,10 @@ public class EvalProcessControlExecutor implements EvalProcessControlApi { @Override public SingleResponse generateHandoverForm(EvalProcessHandoverFormCmd cmd) { + Long projectId = Long.parseLong(cmd.getProjectId()); + EvalProjectEntity project = evalProjectNodeSupport.requireProject(projectId); + // 校验前置节点是否全部完成(过程控制节点除外) + assertPreNodesCompleted(project); // TODO 归档交接单生成功能暂未实现 return SingleResponse.success(null); } @@ -399,4 +410,24 @@ public class EvalProcessControlExecutor implements EvalProcessControlApi { throw new BizException(ErrorCode.EVAL_ARCHIVE_SIGN_INCOMPLETE); } } + + /** + * 过程控制前置节点校验:除 PROCESS_CONTROL 节点外,其余节点 state 必须全部为 1(完成)。 + */ + private void assertPreNodesCompleted(EvalProjectEntity project) { + String projectNode = project.getProjectNode(); + if (!StringUtils.hasText(projectNode)) { + throw new BizException(ErrorCode.EVAL_PROCESS_PRE_NODES_INCOMPLETE); + } + List nodes = JSON.parseArray(projectNode, ProjectNodeCO.class); + if (CollectionUtils.isEmpty(nodes)) { + throw new BizException(ErrorCode.EVAL_PROCESS_PRE_NODES_INCOMPLETE); + } + boolean allCompleted = nodes.stream() + .filter(n -> !ProjectStageEnum.PROCESS_CONTROL.getVal().equals(n.getType())) + .allMatch(n -> n.getState() != null && n.getState() == 1); + if (!allCompleted) { + throw new BizException(ErrorCode.EVAL_PROCESS_PRE_NODES_INCOMPLETE); + } + } } diff --git a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/exception/ErrorCode.java b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/exception/ErrorCode.java index 8da3260..1bc9066 100644 --- a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/exception/ErrorCode.java +++ b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/exception/ErrorCode.java @@ -160,6 +160,7 @@ public enum ErrorCode { EVAL_ARCHIVE_SIGN_INCOMPLETE("06-05-017", "签字未完成,无法归档"), EVAL_HANDOVER_FORM_NOT_CREATED("06-05-018", "归档交接单未生成,无法归档"), EVAL_PROJECT_ERROR("06-05-019", "项目不存在"), + EVAL_PROCESS_PRE_NODES_INCOMPLETE("06-05-020", "前置节点未完成,无法操作过程控制"), // ---- 监督检查告知(phase2 P3) ---- INSP_NOTICE_NOT_FOUND("06-06-001", "监督检查告知不存在"),