dev
luotaiqian 2026-07-23 15:40:28 +08:00
parent b124a86f85
commit 9aa4ca81d9
9 changed files with 125 additions and 30 deletions

View File

@ -8,10 +8,7 @@ import org.qinan.safetyeval.client.co.institution.EvalProcessControlCO;
import org.qinan.safetyeval.client.co.institution.EvalProcessControlDetailCO; import org.qinan.safetyeval.client.co.institution.EvalProcessControlDetailCO;
import org.qinan.safetyeval.client.co.institution.EvalProjectFileCO; import org.qinan.safetyeval.client.co.institution.EvalProjectFileCO;
import org.qinan.safetyeval.client.dto.SingleResponse; import org.qinan.safetyeval.client.dto.SingleResponse;
import org.qinan.safetyeval.client.dto.institution.EvalProcessArchiveCmd; import org.qinan.safetyeval.client.dto.institution.*;
import org.qinan.safetyeval.client.dto.institution.EvalProcessControlConfirmCmd;
import org.qinan.safetyeval.client.dto.institution.EvalProcessControlSaveCmd;
import org.qinan.safetyeval.client.dto.institution.EvalProcessHandoverFormCmd;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@ -44,6 +41,12 @@ public class EvalProcessControlController {
return evalProcessControlApi.confirm(cmd); return evalProcessControlApi.confirm(cmd);
} }
@ApiOperation("下发签字任务")
@PostMapping("/assign")
public SingleResponse<Void> assign(@Validated @RequestBody EvalProcessControlAssignCmd cmd) {
return evalProcessControlApi.assign(cmd);
}
@ApiOperation("按项目查询详情(过程控制负责人成员+审核项)") @ApiOperation("按项目查询详情(过程控制负责人成员+审核项)")
@GetMapping("/detail") @GetMapping("/detail")
public SingleResponse<EvalProcessControlDetailCO> detail(@ApiParam("项目ID") @RequestParam Long projectId) { public SingleResponse<EvalProcessControlDetailCO> detail(@ApiParam("项目ID") @RequestParam Long projectId) {

View File

@ -7,6 +7,7 @@ import org.qinan.safetyeval.client.api.institution.EvalTechReviewApi;
import org.qinan.safetyeval.client.co.institution.EvalTechReviewCO; import org.qinan.safetyeval.client.co.institution.EvalTechReviewCO;
import org.qinan.safetyeval.client.co.institution.EvalTechReviewDetailCO; import org.qinan.safetyeval.client.co.institution.EvalTechReviewDetailCO;
import org.qinan.safetyeval.client.dto.SingleResponse; import org.qinan.safetyeval.client.dto.SingleResponse;
import org.qinan.safetyeval.client.dto.institution.EvalTechReviewAssignCmd;
import org.qinan.safetyeval.client.dto.institution.EvalTechReviewConfirmCmd; import org.qinan.safetyeval.client.dto.institution.EvalTechReviewConfirmCmd;
import org.qinan.safetyeval.client.dto.institution.EvalTechReviewSaveCmd; import org.qinan.safetyeval.client.dto.institution.EvalTechReviewSaveCmd;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
@ -40,6 +41,12 @@ public class EvalTechReviewController {
return evalTechReviewApi.confirm(cmd); return evalTechReviewApi.confirm(cmd);
} }
@ApiOperation("下发签字任务")
@PostMapping("/assign")
public SingleResponse<Void> assign(@Validated @RequestBody EvalTechReviewAssignCmd cmd) {
return evalTechReviewApi.assign(cmd);
}
@ApiOperation("按项目查询详情(技审人成员+审核项)") @ApiOperation("按项目查询详情(技审人成员+审核项)")
@GetMapping("/detail") @GetMapping("/detail")
public SingleResponse<EvalTechReviewDetailCO> detail(@ApiParam("项目ID") @RequestParam Long projectId) { public SingleResponse<EvalTechReviewDetailCO> detail(@ApiParam("项目ID") @RequestParam Long projectId) {

View File

@ -100,13 +100,11 @@ public class EvalInternalReviewExecutor implements EvalInternalReviewApi {
// 修改数据是否存在 // 修改数据是否存在
EvalInternalReviewEntity entity = evalInternalReviewConvertor.applyConfirmCmd(cmd); EvalInternalReviewEntity entity = evalInternalReviewConvertor.applyConfirmCmd(cmd);
EvalInternalReviewDO evalInternalReviewDO = null; EvalInternalReviewDO evalInternalReviewDO = evalInternalReviewMapper.selectOne(new LambdaQueryWrapper<EvalInternalReviewDO>()
if (cmd.getId() != null) { .select(EvalInternalReviewDO::getId, EvalInternalReviewDO::getReviewerSignatureUrl)
evalInternalReviewDO = evalInternalReviewMapper.selectOne(new LambdaQueryWrapper<EvalInternalReviewDO>() .eq(EvalInternalReviewDO::getProjectId, cmd.getProjectId()));
.select(EvalInternalReviewDO::getId, EvalInternalReviewDO::getReviewerSignatureUrl)); if (cmd.getId() != null && evalInternalReviewDO == null) {
if (evalInternalReviewDO == null) { throw new BizException(ErrorCode.EVAL_INTERNAL_REVIEW_NOT_FOUND);
throw new BizException(ErrorCode.EVAL_INTERNAL_REVIEW_NOT_FOUND);
}
} }
// 是否签字完成 // 是否签字完成
@ -120,7 +118,7 @@ public class EvalInternalReviewExecutor implements EvalInternalReviewApi {
projectStageSyncService.onNodeCompleted(projectId, ProjectStageEnum.INTERNAL_REVIEW.getNode()); projectStageSyncService.onNodeCompleted(projectId, ProjectStageEnum.INTERNAL_REVIEW.getNode());
} }
if (cmd.getId() != null) { if (evalInternalReviewDO != null) {
entity = evalInternalReviewGateway.modify(entity); entity = evalInternalReviewGateway.modify(entity);
} else { } else {
// id为空新增数据 // id为空新增数据
@ -128,7 +126,6 @@ public class EvalInternalReviewExecutor implements EvalInternalReviewApi {
entity = evalInternalReviewGateway.save(entity); entity = evalInternalReviewGateway.save(entity);
} }
// 审核项根据bizId和bizType先删后增 // 审核项根据bizId和bizType先删后增
String bizType = ReviewDimensionEnum.TypeEnum.EVAL_INTERNAL_REVIEW.getCode(); String bizType = ReviewDimensionEnum.TypeEnum.EVAL_INTERNAL_REVIEW.getCode();
evalReviewItemGateway.deletedEvalReviewItemByBizIdAndBizType(entity.getId(), bizType); evalReviewItemGateway.deletedEvalReviewItemByBizIdAndBizType(entity.getId(), bizType);
@ -187,10 +184,10 @@ public class EvalInternalReviewExecutor implements EvalInternalReviewApi {
public SingleResponse<EvalInternalReviewDetailCO> getDetailByProject(Long projectId) { public SingleResponse<EvalInternalReviewDetailCO> getDetailByProject(Long projectId) {
// 1. 查询项目成员中的内审人信息role包含INTERNAL_AUDITOR // 1. 查询项目成员中的内审人信息role包含INTERNAL_AUDITOR
List<EvalProjectMemberEntity> reviewers = evalProjectMemberMapper.selectList( List<EvalProjectMemberEntity> reviewers = evalProjectMemberMapper.selectList(
new LambdaQueryWrapper<EvalProjectMemberDO>() new LambdaQueryWrapper<EvalProjectMemberDO>()
.eq(EvalProjectMemberDO::getProjectId, projectId) .eq(EvalProjectMemberDO::getProjectId, projectId)
.eq(EvalProjectMemberDO::getDeleteEnum, BooleanQAEnum.FALSE.getValue()) .eq(EvalProjectMemberDO::getDeleteEnum, BooleanQAEnum.FALSE.getValue())
.like(EvalProjectMemberDO::getRole, ProjectRoleEnum.INTERNAL_AUDITOR.getVal())) .like(EvalProjectMemberDO::getRole, ProjectRoleEnum.INTERNAL_AUDITOR.getVal()))
.stream() .stream()
.map(evalProjectMemberDoConvertor::convertDoToE) .map(evalProjectMemberDoConvertor::convertDoToE)
.collect(Collectors.toList()); .collect(Collectors.toList());

View File

@ -11,6 +11,7 @@ import org.qinan.safetyeval.client.co.institution.EvalProcessControlDetailCO;
import org.qinan.safetyeval.client.co.institution.EvalProjectFileCO; import org.qinan.safetyeval.client.co.institution.EvalProjectFileCO;
import org.qinan.safetyeval.client.dto.SingleResponse; import org.qinan.safetyeval.client.dto.SingleResponse;
import org.qinan.safetyeval.client.dto.institution.EvalProcessArchiveCmd; import org.qinan.safetyeval.client.dto.institution.EvalProcessArchiveCmd;
import org.qinan.safetyeval.client.dto.institution.EvalProcessControlAssignCmd;
import org.qinan.safetyeval.client.dto.institution.EvalProcessControlConfirmCmd; import org.qinan.safetyeval.client.dto.institution.EvalProcessControlConfirmCmd;
import org.qinan.safetyeval.client.dto.institution.EvalProcessControlSaveCmd; import org.qinan.safetyeval.client.dto.institution.EvalProcessControlSaveCmd;
import org.qinan.safetyeval.client.dto.institution.EvalProcessHandoverFormCmd; import org.qinan.safetyeval.client.dto.institution.EvalProcessHandoverFormCmd;
@ -152,6 +153,36 @@ public class EvalProcessControlExecutor implements EvalProcessControlApi {
return SingleResponse.success(); return SingleResponse.success();
} }
@Override
@Transactional(rollbackFor = Exception.class)
public SingleResponse<Void> assign(EvalProcessControlAssignCmd cmd) {
Long projectId = cmd.getProjectId();
EvalProjectEntity project = evalProjectNodeSupport.requireProject(projectId);
// 判断项目是否归档
if (project.getArchiveFlag() != null && project.getArchiveFlag() == 1) {
throw new BizException(ErrorCode.EVAL_PROJECT_ARCHIVED);
}
EvalProcessControlEntity entity = evalProcessControlGateway.getByProjectId(projectId, project.getOrgId());
if (entity == null) {
// 没有数据则新增,并下发签字任务
entity = new EvalProcessControlEntity();
entity.setOrgId(project.getOrgId());
entity.setProjectId(projectId);
entity.setStatusCode(1);
entity.setReviewerSignatureTaskStatus(SignatureTaskStatusEnum.DISPATCHED.getCode());
evalProcessControlGateway.save(entity);
} else {
// 已存在数据,若已下发则提示不要重复下发
if (SignatureTaskStatusEnum.DISPATCHED.getCode().equals(entity.getReviewerSignatureTaskStatus())) {
throw new BizException(ErrorCode.SIGN_TASK_ALREADY_DISPATCHED);
}
entity.setReviewerSignatureTaskStatus(SignatureTaskStatusEnum.DISPATCHED.getCode());
evalProcessControlGateway.modify(entity);
}
// todo 保存任务
return SingleResponse.success();
}
@Override @Override
public SingleResponse<EvalProcessControlCO> getByProject(String projectId) { public SingleResponse<EvalProcessControlCO> getByProject(String projectId) {
Long pid = Long.parseLong(projectId); Long pid = Long.parseLong(projectId);

View File

@ -10,14 +10,12 @@ import org.qinan.safetyeval.client.api.institution.EvalTechReviewApi;
import org.qinan.safetyeval.client.co.institution.EvalTechReviewCO; import org.qinan.safetyeval.client.co.institution.EvalTechReviewCO;
import org.qinan.safetyeval.client.co.institution.EvalTechReviewDetailCO; import org.qinan.safetyeval.client.co.institution.EvalTechReviewDetailCO;
import org.qinan.safetyeval.client.dto.SingleResponse; import org.qinan.safetyeval.client.dto.SingleResponse;
import org.qinan.safetyeval.client.dto.institution.EvalTechReviewAssignCmd;
import org.qinan.safetyeval.client.dto.institution.EvalTechReviewConfirmCmd; import org.qinan.safetyeval.client.dto.institution.EvalTechReviewConfirmCmd;
import org.qinan.safetyeval.client.dto.institution.EvalTechReviewSaveCmd; import org.qinan.safetyeval.client.dto.institution.EvalTechReviewSaveCmd;
import org.qinan.safetyeval.client.item.request.EvalReviewItemAddCmd; import org.qinan.safetyeval.client.item.request.EvalReviewItemAddCmd;
import org.qinan.safetyeval.client.item.response.EvalReviewItemCo; import org.qinan.safetyeval.client.item.response.EvalReviewItemCo;
import org.qinan.safetyeval.domain.constant.BooleanQAEnum; import org.qinan.safetyeval.domain.constant.*;
import org.qinan.safetyeval.domain.constant.ProjectRoleEnum;
import org.qinan.safetyeval.domain.constant.ProjectStageEnum;
import org.qinan.safetyeval.domain.constant.ReviewDimensionEnum;
import org.qinan.safetyeval.domain.entity.EvalProjectEntity; import org.qinan.safetyeval.domain.entity.EvalProjectEntity;
import org.qinan.safetyeval.domain.entity.EvalProjectMemberEntity; import org.qinan.safetyeval.domain.entity.EvalProjectMemberEntity;
import org.qinan.safetyeval.domain.entity.EvalTechReviewEntity; import org.qinan.safetyeval.domain.entity.EvalTechReviewEntity;
@ -113,18 +111,15 @@ public class EvalTechReviewExecutor implements EvalTechReviewApi {
} }
EvalTechReviewEntity entity = evalTechReviewConvertor.applyConfirmCmd(cmd); EvalTechReviewEntity entity = evalTechReviewConvertor.applyConfirmCmd(cmd);
EvalTechReviewDO evalTechReviewDO = null; EvalTechReviewDO evalTechReviewDO = evalTechReviewMapper.selectOne(new LambdaQueryWrapper<EvalTechReviewDO>()
if (cmd.getId() != null) { .eq(EvalTechReviewDO::getProjectId, cmd.getProjectId())
evalTechReviewDO = evalTechReviewMapper.selectOne(new LambdaQueryWrapper<EvalTechReviewDO>() .select(EvalTechReviewDO::getId, EvalTechReviewDO::getReviewerSignatureUrl));
.eq(EvalTechReviewDO::getId, cmd.getId()) if (cmd.getId() != null && evalTechReviewDO == null) {
.select(EvalTechReviewDO::getId, EvalTechReviewDO::getReviewerSignatureUrl)); throw new BizException(ErrorCode.EVAL_TECH_REVIEW_NOT_FOUND);
if (evalTechReviewDO == null) {
throw new BizException(ErrorCode.EVAL_TECH_REVIEW_NOT_FOUND);
}
} }
// 审核结果编码1通过 2退回修改 // 审核结果编码1通过 2退回修改
if (cmd.getResultCode() != null && cmd.getResultCode() == 1) { if (cmd.getResultCode().equals(EvalReviewEnum.PASSED.getCode())) {
if (evalTechReviewDO == null) { if (evalTechReviewDO == null) {
throw new BizException(ASSIGN_SIGN_TASK); throw new BizException(ASSIGN_SIGN_TASK);
} }
@ -154,6 +149,36 @@ public class EvalTechReviewExecutor implements EvalTechReviewApi {
return SingleResponse.success(); return SingleResponse.success();
} }
@Override
@Transactional(rollbackFor = Exception.class)
public SingleResponse<Void> assign(EvalTechReviewAssignCmd cmd) {
Long projectId = cmd.getProjectId();
EvalProjectEntity project = evalProjectNodeSupport.requireProject(projectId);
// 判断项目是否归档
if (project.getArchiveFlag() != null && project.getArchiveFlag() == 1) {
throw new BizException(ErrorCode.EVAL_PROJECT_ARCHIVED);
}
EvalTechReviewEntity entity = evalTechReviewGateway.getByProjectId(projectId, project.getOrgId());
if (entity == null) {
// 没有数据则新增,并下发签字任务
entity = new EvalTechReviewEntity();
entity.setOrgId(project.getOrgId());
entity.setProjectId(projectId);
entity.setStatusCode(1);
entity.setReviewerSignatureTaskStatus(SignatureTaskStatusEnum.DISPATCHED.getCode());
evalTechReviewGateway.save(entity);
} else {
// 已存在数据,若已下发则提示不要重复下发
if (SignatureTaskStatusEnum.DISPATCHED.getCode().equals(entity.getReviewerSignatureTaskStatus())) {
throw new BizException(ErrorCode.SIGN_TASK_ALREADY_DISPATCHED);
}
entity.setReviewerSignatureTaskStatus(SignatureTaskStatusEnum.DISPATCHED.getCode());
evalTechReviewGateway.modify(entity);
}
// todo 保存任务
return SingleResponse.success();
}
@Override @Override
public SingleResponse<EvalTechReviewDetailCO> getDetailByProject(Long projectId) { public SingleResponse<EvalTechReviewDetailCO> getDetailByProject(Long projectId) {
// 1. 查询项目成员中的技审人信息role包含TECHNICAL_LEAD // 1. 查询项目成员中的技审人信息role包含TECHNICAL_LEAD

View File

@ -5,6 +5,7 @@ import org.qinan.safetyeval.client.co.institution.EvalProcessControlDetailCO;
import org.qinan.safetyeval.client.co.institution.EvalProjectFileCO; import org.qinan.safetyeval.client.co.institution.EvalProjectFileCO;
import org.qinan.safetyeval.client.dto.SingleResponse; import org.qinan.safetyeval.client.dto.SingleResponse;
import org.qinan.safetyeval.client.dto.institution.EvalProcessArchiveCmd; import org.qinan.safetyeval.client.dto.institution.EvalProcessArchiveCmd;
import org.qinan.safetyeval.client.dto.institution.EvalProcessControlAssignCmd;
import org.qinan.safetyeval.client.dto.institution.EvalProcessControlConfirmCmd; import org.qinan.safetyeval.client.dto.institution.EvalProcessControlConfirmCmd;
import org.qinan.safetyeval.client.dto.institution.EvalProcessControlSaveCmd; import org.qinan.safetyeval.client.dto.institution.EvalProcessControlSaveCmd;
import org.qinan.safetyeval.client.dto.institution.EvalProcessHandoverFormCmd; import org.qinan.safetyeval.client.dto.institution.EvalProcessHandoverFormCmd;
@ -14,6 +15,7 @@ import java.util.List;
public interface EvalProcessControlApi { public interface EvalProcessControlApi {
SingleResponse<EvalProcessControlCO> getOrSave(EvalProcessControlSaveCmd cmd); SingleResponse<EvalProcessControlCO> getOrSave(EvalProcessControlSaveCmd cmd);
SingleResponse<Void> confirm(EvalProcessControlConfirmCmd cmd); SingleResponse<Void> confirm(EvalProcessControlConfirmCmd cmd);
SingleResponse<Void> assign(EvalProcessControlAssignCmd cmd);
SingleResponse<EvalProcessControlCO> getByProject(String projectId); SingleResponse<EvalProcessControlCO> getByProject(String projectId);
SingleResponse<EvalProcessControlDetailCO> getDetailByProject(Long projectId); SingleResponse<EvalProcessControlDetailCO> getDetailByProject(Long projectId);
SingleResponse<EvalProcessControlCO> generateHandoverForm(EvalProcessHandoverFormCmd cmd); SingleResponse<EvalProcessControlCO> generateHandoverForm(EvalProcessHandoverFormCmd cmd);

View File

@ -3,6 +3,7 @@ package org.qinan.safetyeval.client.api.institution;
import org.qinan.safetyeval.client.co.institution.EvalTechReviewCO; import org.qinan.safetyeval.client.co.institution.EvalTechReviewCO;
import org.qinan.safetyeval.client.co.institution.EvalTechReviewDetailCO; import org.qinan.safetyeval.client.co.institution.EvalTechReviewDetailCO;
import org.qinan.safetyeval.client.dto.SingleResponse; import org.qinan.safetyeval.client.dto.SingleResponse;
import org.qinan.safetyeval.client.dto.institution.EvalTechReviewAssignCmd;
import org.qinan.safetyeval.client.dto.institution.EvalTechReviewConfirmCmd; import org.qinan.safetyeval.client.dto.institution.EvalTechReviewConfirmCmd;
import org.qinan.safetyeval.client.dto.institution.EvalTechReviewSaveCmd; import org.qinan.safetyeval.client.dto.institution.EvalTechReviewSaveCmd;
@ -10,5 +11,6 @@ public interface EvalTechReviewApi {
SingleResponse<EvalTechReviewCO> getOrSave(EvalTechReviewSaveCmd cmd); SingleResponse<EvalTechReviewCO> getOrSave(EvalTechReviewSaveCmd cmd);
SingleResponse<EvalTechReviewCO> getByProject(String projectId); SingleResponse<EvalTechReviewCO> getByProject(String projectId);
SingleResponse<Void> confirm(EvalTechReviewConfirmCmd cmd); SingleResponse<Void> confirm(EvalTechReviewConfirmCmd cmd);
SingleResponse<Void> assign(EvalTechReviewAssignCmd cmd);
SingleResponse<EvalTechReviewDetailCO> getDetailByProject(Long projectId); SingleResponse<EvalTechReviewDetailCO> getDetailByProject(Long projectId);
} }

View File

@ -0,0 +1,14 @@
package org.qinan.safetyeval.client.dto.institution;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class EvalProcessControlAssignCmd {
@ApiModelProperty("项目id")
private Long projectId;
@ApiModelProperty(value = "审核签字任务状态 dispatched 下发non_dispatched 未下发", example = "non_dispatched", hidden = true)
private String reviewerSignatureTaskStatus;
}

View File

@ -0,0 +1,14 @@
package org.qinan.safetyeval.client.dto.institution;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class EvalTechReviewAssignCmd {
@ApiModelProperty("项目id")
private Long projectId;
@ApiModelProperty(value = "审核签字任务状态 dispatched 下发non_dispatched 未下发", example = "non_dispatched", hidden = true)
private String reviewerSignatureTaskStatus;
}