diff --git a/docs/db/phase2/init-phase2.sql b/docs/db/phase2/init-phase2.sql index 053a80ec..a4a41c2d 100644 --- a/docs/db/phase2/init-phase2.sql +++ b/docs/db/phase2/init-phase2.sql @@ -682,6 +682,8 @@ create table `eval_process_control` ( `result_name` varchar(50) default null comment '结论名称', `opinion_content` varchar(2000) default null comment '过程控制意见', `archive_flag` tinyint default 2 comment '是否归档(1是2否)', + `handover_form_url` varchar(500) default null comment '归档交接单URL', + `handover_form_status` varchar(32) default 'not_create' comment '归档交接单状态(not_create未生成,created已生成)', `control_time` datetime default null comment '办理时间', `status_code` int default null comment '节点状态(1未开始2进行中3已完成4退回)', `status_name` varchar(50) default null comment '节点状态名称', diff --git a/docs/db/todo.sql b/docs/db/todo.sql index 0c4150e0..3475f990 100644 --- a/docs/db/todo.sql +++ b/docs/db/todo.sql @@ -53,6 +53,15 @@ ALTER TABLE `org_personnel_cert` ADD COLUMN `industry_professional_standards_id` BIGINT DEFAULT NULL COMMENT '行业专业标准ID' AFTER `professional_capability_code`; +-- ============================================= +-- eval_process_control 表添加归档交接单字段 +-- ============================================= +ALTER TABLE `eval_process_control` + ADD COLUMN `handover_form_url` varchar(500) DEFAULT NULL COMMENT '归档交接单URL' AFTER `archive_flag`; + +ALTER TABLE `eval_process_control` + ADD COLUMN `handover_form_status` varchar(32) DEFAULT 'not_create' COMMENT '归档交接单状态(not_create未生成,created已生成)' AFTER `handover_form_url`; + -- 2. qual_filing_personnel_cert 表添加行业专业标准ID字段 ALTER TABLE `qual_filing_personnel_cert` ADD COLUMN `industry_professional_standards_id` BIGINT DEFAULT NULL COMMENT '行业专业标准ID' diff --git a/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/web/institution/EvalProcessControlController.java b/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/web/institution/EvalProcessControlController.java index be1180fb..5e9e954f 100644 --- a/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/web/institution/EvalProcessControlController.java +++ b/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/web/institution/EvalProcessControlController.java @@ -5,9 +5,12 @@ import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; 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.dto.SingleResponse; import org.qinan.safetyeval.client.dto.institution.EvalProcessArchiveCmd; +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.web.bind.annotation.*; @@ -21,7 +24,7 @@ public class EvalProcessControlController { @Resource private EvalProcessControlApi evalProcessControlApi; - @ApiOperation("按项目获取或保存") + /* @ApiOperation("按项目获取或保存") @PostMapping("/get-or-save") public SingleResponse getOrSave(@Validated @RequestBody EvalProcessControlSaveCmd cmd) { return evalProcessControlApi.getOrSave(cmd); @@ -31,6 +34,24 @@ public class EvalProcessControlController { @GetMapping("/get") public SingleResponse get(@ApiParam("项目ID") @RequestParam String projectId) { return evalProcessControlApi.getByProject(projectId); + } */ + + @ApiOperation("过程控制确认") + @PostMapping("/confirm") + public SingleResponse confirm(@Validated @RequestBody EvalProcessControlConfirmCmd cmd) { + return evalProcessControlApi.confirm(cmd); + } + + @ApiOperation("按项目查询详情(过程控制负责人成员+审核项)") + @GetMapping("/detail") + public SingleResponse detail(@ApiParam("项目ID") @RequestParam Long projectId) { + return evalProcessControlApi.getDetailByProject(projectId); + } + + @ApiOperation("生成归档交接单") + @PostMapping("/generate-handover-form") + public SingleResponse generateHandoverForm(@Validated @RequestBody EvalProcessHandoverFormCmd cmd) { + return evalProcessControlApi.generateHandoverForm(cmd); } @ApiOperation("归档项目并入库报告") @@ -38,4 +59,5 @@ public class EvalProcessControlController { public SingleResponse archive(@Validated @RequestBody EvalProcessArchiveCmd cmd) { return evalProcessControlApi.archive(cmd); } + } 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 621a7043..6ec09369 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 @@ -3,31 +3,54 @@ package org.qinan.safetyeval.app.executor.institution; import org.qinan.safetyeval.app.executor.institution.support.EvalCmdCopy; import org.qinan.safetyeval.app.executor.institution.support.EvalNodeCoConverter; 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; import org.qinan.safetyeval.client.co.institution.EvalProcessControlCO; +import org.qinan.safetyeval.client.co.institution.EvalProcessControlDetailCO; import org.qinan.safetyeval.client.dto.SingleResponse; import org.qinan.safetyeval.client.dto.institution.EvalProcessArchiveCmd; +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.qinan.safetyeval.client.item.request.EvalReviewItemAddCmd; +import org.qinan.safetyeval.client.item.response.EvalReviewItemCo; import org.qinan.safetyeval.domain.constant.EvalTypeEnum; +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.EvalProjectMemberEntity; import org.qinan.safetyeval.domain.entity.EvalProcessControlEntity; import org.qinan.safetyeval.domain.entity.EvalReportDraftEntity; import org.qinan.safetyeval.domain.entity.EvalReportEntity; +import org.qinan.safetyeval.domain.entity.EvalSignTaskEntity; import org.qinan.safetyeval.domain.exception.BizException; import org.qinan.safetyeval.domain.exception.ErrorCode; import org.qinan.safetyeval.domain.gateway.EvalProcessControlGateway; +import org.qinan.safetyeval.domain.gateway.EvalProjectMemberGateway; import org.qinan.safetyeval.domain.gateway.EvalReportDraftGateway; import org.qinan.safetyeval.domain.gateway.EvalReportGateway; +import org.qinan.safetyeval.domain.gateway.EvalSignTaskGateway; +import org.qinan.safetyeval.domain.item.gateway.EvalReviewItemGateway; +import org.qinan.safetyeval.domain.item.model.EvalReviewItemE; import org.qinan.safetyeval.domain.query.EvalReportDraftQuery; +import org.qinan.safetyeval.domain.query.EvalSignTaskQuery; import org.qinan.safetyeval.domain.query.PageResult; import org.qinan.safetyeval.domain.service.EvalArchivePrecheckService; import org.qinan.safetyeval.domain.service.ProjectStageSyncService; import org.qinan.safetyeval.domain.support.EvalNodeCodes; +import org.qinan.safetyeval.domain.waring.gateway.EvalProjectWaringGateway; +import org.qinan.safetyeval.domain.waring.model.EvalProjectWaringE; +import org.qinan.safetyeval.infrastructure.convertor.EvalProcessControlConvertor; +import org.qinan.safetyeval.infrastructure.persistence.queryservice.EvalReviewItemQueryService; +import org.qinan.safetyeval.infrastructure.support.NodeWriteAuthority; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import javax.annotation.Resource; import java.time.LocalDateTime; +import java.util.List; +import java.util.stream.Collectors; @Service public class EvalProcessControlExecutor implements EvalProcessControlApi { @@ -44,6 +67,20 @@ public class EvalProcessControlExecutor implements EvalProcessControlApi { private EvalReportDraftGateway evalReportDraftGateway; @Resource private ProjectStageSyncService projectStageSyncService; + @Resource + private EvalSignTaskGateway evalSignTaskGateway; + @Resource + private EvalProcessControlConvertor evalProcessControlConvertor; + @Resource + private EvalProjectMemberGateway evalProjectMemberGateway; + @Resource + private EvalReviewItemQueryService evalReviewItemQueryService; + @Resource + private EvalReviewItemGateway evalReviewItemGateway; + @Resource + private EvalReviewItemCmdConvertor evalReviewItemCmdConvertor; + @Resource + private EvalProjectWaringGateway evalProjectWaringGateway; @Override public SingleResponse getOrSave(EvalProcessControlSaveCmd cmd) { @@ -66,6 +103,43 @@ public class EvalProcessControlExecutor implements EvalProcessControlApi { return SingleResponse.success(EvalNodeCoConverter.toProcessCO(entity)); } + @Override + @Transactional(rollbackFor = Exception.class) + public SingleResponse confirm(EvalProcessControlConfirmCmd 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 = evalProcessControlConvertor.applyConfirmCmd(cmd); + + // 过程控制结论为通过时推进项目阶段 + if (cmd.getResultCode() != null && cmd.getResultCode() == 1) { + projectStageSyncService.onNodeCompleted(projectId, ProjectStageEnum.PROCESS_CONTROL.getNode()); + } + + if (cmd.getId() != null) { + entity = evalProcessControlGateway.modify(entity); + } else { + // id为空,新增数据 + entity.setOrgId(project.getOrgId()); + entity = evalProcessControlGateway.save(entity); + } + + // 审核项:根据bizId和bizType先删后增 + String bizType = ReviewDimensionEnum.TypeEnum.EVAL_PROCESS_CONTROL.getCode(); + evalReviewItemGateway.deletedEvalReviewItemByBizIdAndBizType(entity.getId(), bizType); + for (EvalReviewItemAddCmd itemCmd : cmd.getReviewItems()) { + EvalReviewItemE itemE = evalReviewItemCmdConvertor.convertCmdToE(itemCmd); + itemE.setBizId(entity.getId()); + itemE.setBizType(bizType); + evalReviewItemGateway.add(itemE); + } + return SingleResponse.success(); + } + @Override public SingleResponse getByProject(String projectId) { Long pid = Long.parseLong(projectId); @@ -78,6 +152,44 @@ public class EvalProcessControlExecutor implements EvalProcessControlApi { return SingleResponse.success(EvalNodeCoConverter.toProcessCO(entity)); } + @Override + public SingleResponse getDetailByProject(Long projectId) { + // 1. 查询项目成员中的过程控制负责人信息 + List members = evalProjectMemberGateway + .listByProjectIdAndRoleCode(projectId, NodeWriteAuthority.ROLE_PROCESS_OWNER); + + // 2. 查询过程控制记录,未查询到则过程控制记录字段为空 + EvalProcessControlEntity entity = evalProcessControlGateway.getByProjectId(projectId, null); + EvalProcessControlDetailCO detailCO = new EvalProcessControlDetailCO(); + detailCO.setControllers(evalProcessControlConvertor.toMemberCOs(members)); + if (entity != null) { + detailCO.setProcessControl(EvalNodeCoConverter.toProcessCO(entity)); + // 3. 通过过程控制记录id查询审核项列表 + detailCO.setReviewItems(evalReviewItemQueryService.listByBizIdAndBizType( + entity.getId(), ReviewDimensionEnum.TypeEnum.EVAL_PROCESS_CONTROL.getCode())); + } else { + // 未查询到过程控制记录,按审核维度枚举构建默认审核项 + detailCO.setReviewItems(ReviewDimensionEnum.getListByType(ReviewDimensionEnum.TypeEnum.EVAL_PROCESS_CONTROL) + .stream() + .map(dimension -> { + EvalReviewItemCo item = new EvalReviewItemCo(); + item.setBizType(ReviewDimensionEnum.TypeEnum.EVAL_PROCESS_CONTROL.getCode()); + item.setReviewDimensionCode(dimension.getCode()); + item.setReviewDimensionName(dimension.getLabel()); + item.setReviewFocus(dimension.getReviewFocus()); + return item; + }) + .collect(Collectors.toList())); + } + return SingleResponse.success(detailCO); + } + + @Override + public SingleResponse generateHandoverForm(EvalProcessHandoverFormCmd cmd) { + // TODO 归档交接单生成功能暂未实现 + return SingleResponse.success(null); + } + @Override public SingleResponse archive(EvalProcessArchiveCmd cmd) { Long projectId = Long.parseLong(cmd.getProjectId()); @@ -92,6 +204,15 @@ public class EvalProcessControlExecutor implements EvalProcessControlApi { if (entity != null && entity.getArchiveFlag() != null && entity.getArchiveFlag() == 1) { throw new BizException(ErrorCode.EVAL_ARCHIVE_ALREADY_DONE); } + + // 验证签字是否完成 + assertSignTaskCompleted(projectId, project.getOrgId()); + + // 验证归档交接单是否已生成 + if (entity == null || !"created".equals(entity.getHandoverFormStatus())) { + throw new BizException(ErrorCode.EVAL_HANDOVER_FORM_NOT_CREATED); + } + if (entity == null) { entity = new EvalProcessControlEntity(); entity.setOrgId(project.getOrgId()); @@ -111,6 +232,8 @@ public class EvalProcessControlExecutor implements EvalProcessControlApi { EvalReportEntity report = buildReport(project); evalReportGateway.saveInternal(report); projectStageSyncService.onArchived(projectId); + // 写入项目预警记录(存在则更新,不存在则新增) + upsertProjectWaring(project); return SingleResponse.success(EvalNodeCoConverter.toProcessCO(entity)); } @@ -160,4 +283,46 @@ public class EvalProcessControlExecutor implements EvalProcessControlApi { }) .orElse(null); } + + /** + * 归档时写入项目预警记录:根据projectId判断,存在则更新,不存在则新增。 + */ + private void upsertProjectWaring(EvalProjectEntity project) { + LocalDateTime now = LocalDateTime.now(); + EvalProjectWaringE waring = evalProjectWaringGateway.getByProjectId(project.getId()); + if (waring == null) { + waring = EvalProjectWaringE.of(); + waring.setProjectId(project.getId()); + } + waring.setProjectCompleteTime(now); + waring.setArchiveDate(now); + waring.setProjectNode(project.getProjectNode()); + waring.setIndustryCode(project.getIndustryCode()); + if (waring.getId() == null) { + waring.add(); + } else { + waring.update(); + } + } + + /** + * 验证项目所有签字任务是否已完成(taskStatusCode=2 已签)。 + * 无签字任务或存在未完成/未作废的任务均视为未完成。 + */ + private void assertSignTaskCompleted(Long projectId, Long orgId) { + EvalSignTaskQuery query = new EvalSignTaskQuery(); + query.setProjectId(projectId); + query.setOrgId(orgId); + query.setPageNum(1L); + query.setPageSize(1000L); + PageResult tasks = evalSignTaskGateway.page(query); + if (tasks == null || CollectionUtils.isEmpty(tasks.getRecords())) { + throw new BizException(ErrorCode.EVAL_ARCHIVE_SIGN_INCOMPLETE); + } + boolean allSigned = tasks.getRecords().stream() + .allMatch(t -> t.getTaskStatusCode() != null && t.getTaskStatusCode() == 2); + if (!allSigned) { + throw new BizException(ErrorCode.EVAL_ARCHIVE_SIGN_INCOMPLETE); + } + } } diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/api/institution/EvalProcessControlApi.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/api/institution/EvalProcessControlApi.java index 4f98247d..644c9bbe 100644 --- a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/api/institution/EvalProcessControlApi.java +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/api/institution/EvalProcessControlApi.java @@ -1,12 +1,18 @@ package org.qinan.safetyeval.client.api.institution; import org.qinan.safetyeval.client.co.institution.EvalProcessControlCO; +import org.qinan.safetyeval.client.co.institution.EvalProcessControlDetailCO; import org.qinan.safetyeval.client.dto.SingleResponse; import org.qinan.safetyeval.client.dto.institution.EvalProcessArchiveCmd; +import org.qinan.safetyeval.client.dto.institution.EvalProcessControlConfirmCmd; import org.qinan.safetyeval.client.dto.institution.EvalProcessControlSaveCmd; +import org.qinan.safetyeval.client.dto.institution.EvalProcessHandoverFormCmd; public interface EvalProcessControlApi { SingleResponse getOrSave(EvalProcessControlSaveCmd cmd); + SingleResponse confirm(EvalProcessControlConfirmCmd cmd); SingleResponse getByProject(String projectId); + SingleResponse getDetailByProject(Long projectId); + SingleResponse generateHandoverForm(EvalProcessHandoverFormCmd cmd); SingleResponse archive(EvalProcessArchiveCmd cmd); } diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/co/institution/EvalProcessControlDetailCO.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/co/institution/EvalProcessControlDetailCO.java new file mode 100644 index 00000000..98c2d657 --- /dev/null +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/co/institution/EvalProcessControlDetailCO.java @@ -0,0 +1,23 @@ +package org.qinan.safetyeval.client.co.institution; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.qinan.safetyeval.client.item.response.EvalReviewItemCo; + +import java.util.List; + +/** + * 过程控制详情CO,聚合过程控制记录、过程控制负责人成员信息与审核项列表。 + */ +@Data +public class EvalProcessControlDetailCO { + + @ApiModelProperty("过程控制记录信息") + private EvalProcessControlCO processControl; + + @ApiModelProperty("过程控制负责人成员信息") + private List controllers; + + @ApiModelProperty("审核项列表") + private List reviewItems; +} diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/institution/EvalProcessControlConfirmCmd.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/institution/EvalProcessControlConfirmCmd.java new file mode 100644 index 00000000..53f22032 --- /dev/null +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/institution/EvalProcessControlConfirmCmd.java @@ -0,0 +1,46 @@ +package org.qinan.safetyeval.client.dto.institution; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.qinan.safetyeval.client.item.request.EvalReviewItemAddCmd; + +import javax.validation.Valid; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.time.LocalDateTime; +import java.util.List; + +@Data +public class EvalProcessControlConfirmCmd { + + @ApiModelProperty("id") + private Long id; + + @ApiModelProperty("项目id") + private Long projectId; + + @ApiModelProperty(value = "节点状态编码:1未开始 2进行中 3已完成 4退回", example = "2") + private Integer statusCode; + + @ApiModelProperty(value = "过程控制负责人人员id") + private Long controllerPersonnelId; + + @ApiModelProperty(value = "过程控制负责人姓名") + private String controllerName; + + @ApiModelProperty(value = "过程控制结论编码:1通过 2退回", example = "1") + private Integer resultCode; + + @ApiModelProperty(value = "总体过程控制意见") + @Size(max = 2000) + private String opinionContent; + + @ApiModelProperty(value = "过程控制时间", hidden = true) + private LocalDateTime controlTime; + + @ApiModelProperty("审核项列表") + @NotNull + @Size(min = 1, max = 16) + @Valid + private List reviewItems; +} diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/institution/EvalProcessHandoverFormCmd.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/institution/EvalProcessHandoverFormCmd.java new file mode 100644 index 00000000..44a9e2bd --- /dev/null +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/institution/EvalProcessHandoverFormCmd.java @@ -0,0 +1,12 @@ +package org.qinan.safetyeval.client.dto.institution; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +@Data +public class EvalProcessHandoverFormCmd { + + @NotBlank + private String projectId; +} diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/waring/request/EvalProjectWaringAddCmd.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/waring/request/EvalProjectWaringAddCmd.java index 11f7fad4..55734acf 100644 --- a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/waring/request/EvalProjectWaringAddCmd.java +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/waring/request/EvalProjectWaringAddCmd.java @@ -25,6 +25,9 @@ public class EvalProjectWaringAddCmd implements Serializable { @ApiModelProperty(value = "项目归档时间",required = true) @NotNull(message = "项目归档时间不能为空") private LocalDateTime archiveDate; + /** 项目完成时间 */ + @ApiModelProperty(value = "项目完成时间") + private LocalDateTime projectCompleteTime; /** 项目 预警 状态: non_warn 暂时不预警,first_waring 首次预警,second_waring 二次预警,emergency_waring 紧急预警,overdue_warning 逾期预警 ,end_warning 结束预警 */ @ApiModelProperty(value = "项目 预警 状态: non_warn 暂时不预警,first_waring 首次预警,second_waring 二次预警,emergency_waring 紧急预警,overdue_warning 逾期预警 ,end_warning 结束预警",required = true) @NotBlank(message = "项目 预警 状态: non_warn 暂时不预警,first_waring 首次预警,second_waring 二次预警,emergency_waring 紧急预警,overdue_warning 逾期预警 ,end_warning 结束预警不能为空") diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/waring/request/EvalProjectWaringUpdateCmd.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/waring/request/EvalProjectWaringUpdateCmd.java index 9b1db86e..e6f923ee 100644 --- a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/waring/request/EvalProjectWaringUpdateCmd.java +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/waring/request/EvalProjectWaringUpdateCmd.java @@ -26,6 +26,9 @@ public class EvalProjectWaringUpdateCmd implements Serializable { @ApiModelProperty(value = "项目归档时间",required = true) @NotNull(message = "项目归档时间不能为空") private LocalDateTime archiveDate; + /** 项目完成时间 */ + @ApiModelProperty(value = "项目完成时间") + private LocalDateTime projectCompleteTime; /** 项目 预警 状态: non_warn 暂时不预警,first_waring 首次预警,second_waring 二次预警,emergency_waring 紧急预警,overdue_warning 逾期预警 ,end_warning 结束预警 */ @ApiModelProperty(value = "项目 预警 状态: non_warn 暂时不预警,first_waring 首次预警,second_waring 二次预警,emergency_waring 紧急预警,overdue_warning 逾期预警 ,end_warning 结束预警",required = true) @NotBlank(message = "项目 预警 状态: non_warn 暂时不预警,first_waring 首次预警,second_waring 二次预警,emergency_waring 紧急预警,overdue_warning 逾期预警 ,end_warning 结束预警不能为空") diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/waring/response/EvalProjectWaringCo.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/waring/response/EvalProjectWaringCo.java index 6f1f870d..ba902a67 100644 --- a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/waring/response/EvalProjectWaringCo.java +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/waring/response/EvalProjectWaringCo.java @@ -23,6 +23,10 @@ public class EvalProjectWaringCo extends ClientObject { @ApiModelProperty(value = "项目归档时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") private LocalDateTime archiveDate; + /** 项目完成时间 */ + @ApiModelProperty(value = "项目完成时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime projectCompleteTime; /** 项目 预警 状态: non_warn 暂时不预警,first_waring 首次预警,second_waring 二次预警,emergency_waring 紧急预警,overdue_warning 逾期预警 ,end_warning 结束预警 */ @ApiModelProperty(value = "项目 预警 状态: non_warn 暂时不预警,first_waring 首次预警,second_waring 二次预警,emergency_waring 紧急预警,overdue_warning 逾期预警 ,end_warning 结束预警") private String waringStatus; diff --git a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/entity/EvalProcessControlEntity.java b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/entity/EvalProcessControlEntity.java index 8e9d7eec..6a7899c1 100644 --- a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/entity/EvalProcessControlEntity.java +++ b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/entity/EvalProcessControlEntity.java @@ -17,6 +17,10 @@ public class EvalProcessControlEntity { private String resultName; private String opinionContent; private Integer archiveFlag; + /** 归档交接单URL */ + private String handoverFormUrl; + /** 归档交接单状态:not_create未生成,created已生成 */ + private String handoverFormStatus; private LocalDateTime controlTime; private Integer statusCode; private String statusName; 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 49b919c2..4ab74381 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 @@ -156,6 +156,8 @@ public enum ErrorCode { EVAL_SIGN_TASK_INVALID("06-05-014", "签字任务状态无效"), EVAL_TEAM_ROLE_INVALID("06-05-015", "项目组负责人与过程控制负责人须各设1人且不可为同一人"), EVAL_ARCHIVE_ALREADY_DONE("06-05-016", "项目已归档,请勿重复归档"), + EVAL_ARCHIVE_SIGN_INCOMPLETE("06-05-017", "签字未完成,无法归档"), + EVAL_HANDOVER_FORM_NOT_CREATED("06-05-018", "归档交接单未生成,无法归档"), // ---- 监督检查告知(phase2 P3) ---- INSP_NOTICE_NOT_FOUND("06-06-001", "监督检查告知不存在"), diff --git a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/waring/gateway/EvalProjectWaringGateway.java b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/waring/gateway/EvalProjectWaringGateway.java index e634f52f..2cf8ee99 100644 --- a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/waring/gateway/EvalProjectWaringGateway.java +++ b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/waring/gateway/EvalProjectWaringGateway.java @@ -36,4 +36,11 @@ public interface EvalProjectWaringGateway { * @return 结果 */ Boolean deletedEvalProjectWaringByIds(Long[] ids); + + /** + * 根据项目ID查找项目预警 + * @param projectId 项目ID + * @return 项目预警,不存在返回null + */ + EvalProjectWaringE getByProjectId(Long projectId); } diff --git a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/waring/model/EvalProjectWaringE.java b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/waring/model/EvalProjectWaringE.java index 2a3a5ecb..a486d1dc 100644 --- a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/waring/model/EvalProjectWaringE.java +++ b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/waring/model/EvalProjectWaringE.java @@ -24,6 +24,8 @@ public class EvalProjectWaringE extends BaseE{ private Long projectId; /** 项目归档时间 */ private LocalDateTime archiveDate; + /** 项目完成时间 */ + private LocalDateTime projectCompleteTime; /** 项目 预警 状态: non_warn 暂时不预警,first_waring 首次预警,second_waring 二次预警,emergency_waring 紧急预警,overdue_warning 逾期预警 ,end_warning 结束预警 */ private String waringStatus; /** 预警开始时间 */ diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/convertor/EvalProcessControlConvertor.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/convertor/EvalProcessControlConvertor.java new file mode 100644 index 00000000..9179948e --- /dev/null +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/convertor/EvalProcessControlConvertor.java @@ -0,0 +1,25 @@ +package org.qinan.safetyeval.infrastructure.convertor; + +import org.mapstruct.Mapper; +import org.qinan.safetyeval.client.co.institution.EvalProjectMemberCO; +import org.qinan.safetyeval.client.dto.institution.EvalProcessControlConfirmCmd; +import org.qinan.safetyeval.domain.entity.EvalProcessControlEntity; +import org.qinan.safetyeval.domain.entity.EvalProjectMemberEntity; + +import java.util.List; + +/** + * 过程控制相关对象转换器。 + */ +@Mapper(componentModel = "spring") +public interface EvalProcessControlConvertor { + + /** + * 将 ConfirmCmd 转换为新的 entity。 + */ + EvalProcessControlEntity applyConfirmCmd(EvalProcessControlConfirmCmd cmd); + + EvalProjectMemberCO toMemberCO(EvalProjectMemberEntity entity); + + List toMemberCOs(List entities); +} diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/convertor/EvalProjectWaringDoConvertor.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/convertor/EvalProjectWaringDoConvertor.java index cf5910d8..ae5913fc 100644 --- a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/convertor/EvalProjectWaringDoConvertor.java +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/convertor/EvalProjectWaringDoConvertor.java @@ -22,6 +22,13 @@ public interface EvalProjectWaringDoConvertor { */ EvalProjectWaringDO convertEeToDo(EvalProjectWaringE evalProjectWaringE); + /** + * DO转领域对象 + * @param evalProjectWaringDo DO + * @return + */ + EvalProjectWaringE converDoToE(EvalProjectWaringDO evalProjectWaringDo); + /** * DO转Co * @param evalProjectWaringDo DO diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/dataobject/EvalProcessControlDO.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/dataobject/EvalProcessControlDO.java index a1451a21..2b8ee02b 100644 --- a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/dataobject/EvalProcessControlDO.java +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/dataobject/EvalProcessControlDO.java @@ -22,6 +22,10 @@ public class EvalProcessControlDO { private String opinionContent; /** 是否归档:1是 2否,示例:2 */ private Integer archiveFlag; + /** 归档交接单URL */ + private String handoverFormUrl; + /** 归档交接单状态:not_create未生成,created已生成 */ + private String handoverFormStatus; private LocalDateTime controlTime; /** 节点状态编码:1未开始 2进行中 3已完成 4退回,示例:2 */ private Integer statusCode; diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gateway/EvalProjectWaringGatewayImpl.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gateway/EvalProjectWaringGatewayImpl.java index 38bfa0ab..86025f7e 100644 --- a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gateway/EvalProjectWaringGatewayImpl.java +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gateway/EvalProjectWaringGatewayImpl.java @@ -42,4 +42,13 @@ public class EvalProjectWaringGatewayImpl implements EvalProjectWaringGateway { public Boolean deletedEvalProjectWaringByIds(Long[] ids) { return evalProjectWaringRepository.deletedEvalProjectWaringByIds(ids); } + + @Override + public EvalProjectWaringE getByProjectId(Long projectId) { + EvalProjectWaringDO waringDO = evalProjectWaringRepository.getByProjectId(projectId); + if (waringDO == null) { + return null; + } + return evalProjectWaringDoConvertor.converDoToE(waringDO); + } } diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/persistence/domainobject/EvalProjectWaringDO.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/persistence/domainobject/EvalProjectWaringDO.java index ca88dc93..f4277de2 100644 --- a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/persistence/domainobject/EvalProjectWaringDO.java +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/persistence/domainobject/EvalProjectWaringDO.java @@ -22,6 +22,9 @@ public class EvalProjectWaringDO extends BaseDO { /** 项目归档时间 */ @JSONField(format = "yyyy-MM-dd HH:mm:ss") private LocalDateTime archiveDate; + /** 项目完成时间 */ + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime projectCompleteTime; /** 项目 预警 状态: non_warn 暂时不预警,first_waring 首次预警,second_waring 二次预警,emergency_waring 紧急预警,overdue_warning 逾期预警 ,end_warning 结束预警 */ private String waringStatus; /** 预警开始时间 */ diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/persistence/repository/EvalProjectWaringRepository.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/persistence/repository/EvalProjectWaringRepository.java index 6156a16b..7e52ee11 100644 --- a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/persistence/repository/EvalProjectWaringRepository.java +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/persistence/repository/EvalProjectWaringRepository.java @@ -18,6 +18,13 @@ public interface EvalProjectWaringRepository extends BaseRepository listEvalProjectWaringPage(IPage iPage, EvalProjectWaringPageQry evalProjectWaringPageQry) { QueryWrapper evalProjectWaringDoQueryWrapper = new QueryWrapper<>(); diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/support/NodeWriteAuthority.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/support/NodeWriteAuthority.java index f63fc646..5b03175b 100644 --- a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/support/NodeWriteAuthority.java +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/support/NodeWriteAuthority.java @@ -33,7 +33,7 @@ public class NodeWriteAuthority { private static final String ROLE_DRAFT_OWNER = "DRAFT_OWNER"; public static final String ROLE_INTERNAL_REVIEWER = "INTERNAL_REVIEWER"; public static final String ROLE_TECH_REVIEWER = "TECH_REVIEWER"; - private static final String ROLE_PROCESS_OWNER = "PROCESS_OWNER"; + public static final String ROLE_PROCESS_OWNER = "PROCESS_OWNER"; private static final String ROLE_MEMBER = "MEMBER"; @Resource