From 6a2b962fb0c2e21f693ce2a987d356ddb47e8866 Mon Sep 17 00:00:00 2001 From: zhanglei Date: Fri, 24 Jul 2026 14:48:31 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=AD=BE=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EvalRiskAnalysisController.java | 15 ---- .../institution/EvalSignTaskController.java | 16 ++-- .../institution/EvalSignTaskExecutor.java | 84 +++++++++++++++++++ .../api/institution/EvalSignTaskApi.java | 3 + .../dto/institution/EditSignTaskSaveCmd.java | 14 ++++ .../dto/institution/EvalSignTaskSaveCmd.java | 2 +- .../domain/constant/NoticeTypeEnum.java | 2 +- .../domain/constant/ProjectStageEnum.java | 17 ++++ .../domain/exception/ErrorCode.java | 1 + 9 files changed, 127 insertions(+), 27 deletions(-) create mode 100644 safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/institution/EditSignTaskSaveCmd.java diff --git a/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/web/institution/EvalRiskAnalysisController.java b/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/web/institution/EvalRiskAnalysisController.java index ae43950..71fe1d7 100644 --- a/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/web/institution/EvalRiskAnalysisController.java +++ b/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/web/institution/EvalRiskAnalysisController.java @@ -54,21 +54,6 @@ public class EvalRiskAnalysisController { return evalRiskAnalysisApi.saveParticipant(cmd); } - /** - * // 站内信通知 - * SafetyMessageEntity safetyMessageEntity = new SafetyMessageEntity(); - * NoticeTypeEnum.ON_SITE_REVIEW_NOTICE - * safetyMessageEntity.setSendName(MsgConstant.MSG_TYPE_SYSTEM); - * safetyMessageEntity.setSendId(MsgConstant.MSG_TYPE_SYSTEM_ID); - * safetyMessageEntity.setSendType("系统发送"); - * safetyMessageEntity.setSendContent("您被添加为项目成员,请及时处理"); - * safetyMessageEntity.setReceiveId(entity.getPersonnelId()); - * safetyMessageEntity.setSendState(0); - * safetyMessageEntity.setCreateTime(LocalDateTime.now()); - * safetyMessageGateway.save(safetyMessageEntity); - * @param req - * @return - */ @ApiOperation("删除参与人") @PostMapping("/participant/delete") diff --git a/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/web/institution/EvalSignTaskController.java b/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/web/institution/EvalSignTaskController.java index 70de0f7..b66217c 100644 --- a/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/web/institution/EvalSignTaskController.java +++ b/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/web/institution/EvalSignTaskController.java @@ -4,17 +4,13 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.qinan.safetyeval.client.api.institution.EvalSignTaskApi; import org.qinan.safetyeval.client.co.institution.EvalSignTaskCO; -import org.qinan.safetyeval.client.co.institution.EvalSignTaskEnumsCO; import org.qinan.safetyeval.client.dto.PageResponse; import org.qinan.safetyeval.client.dto.SingleResponse; +import org.qinan.safetyeval.client.dto.institution.EditSignTaskSaveCmd; import org.qinan.safetyeval.client.dto.institution.EvalSignTaskPageQuery; import org.qinan.safetyeval.client.dto.institution.EvalSignTaskSaveCmd; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; @@ -38,9 +34,9 @@ public class EvalSignTaskController { return evalSignTaskApi.page(query); } - @ApiOperation("签字任务枚举映射") - @GetMapping("/enums") - public SingleResponse enums() { - return evalSignTaskApi.enums(); + @ApiOperation("签字上传") + @PostMapping("/signAndUpload") + public SingleResponse signAndUpload(@RequestBody EditSignTaskSaveCmd cmd) { + return evalSignTaskApi.signAndUpload(cmd); } } diff --git a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/institution/EvalSignTaskExecutor.java b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/institution/EvalSignTaskExecutor.java index 91a866c..c362eee 100644 --- a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/institution/EvalSignTaskExecutor.java +++ b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/institution/EvalSignTaskExecutor.java @@ -1,5 +1,8 @@ package org.qinan.safetyeval.app.executor.institution; +import com.alibaba.fastjson2.JSON; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import org.qinan.safetyeval.app.convertor.EvalSignTaskCmdConvertor; import org.qinan.safetyeval.client.api.institution.EvalSignTaskApi; import org.qinan.safetyeval.client.co.institution.EnumOptionCO; @@ -7,18 +10,38 @@ import org.qinan.safetyeval.client.co.institution.EvalSignTaskCO; import org.qinan.safetyeval.client.co.institution.EvalSignTaskEnumsCO; import org.qinan.safetyeval.client.dto.PageResponse; import org.qinan.safetyeval.client.dto.SingleResponse; +import org.qinan.safetyeval.client.dto.institution.EditSignTaskSaveCmd; import org.qinan.safetyeval.client.dto.institution.EvalSignTaskPageQuery; import org.qinan.safetyeval.client.dto.institution.EvalSignTaskSaveCmd; +import org.qinan.safetyeval.domain.constant.MsgConstant; +import org.qinan.safetyeval.domain.constant.NoticeTypeEnum; +import org.qinan.safetyeval.domain.constant.ProjectStageEnum; import org.qinan.safetyeval.domain.constant.SignTaskStatusEnum; import org.qinan.safetyeval.domain.entity.EvalSignTaskEntity; +import org.qinan.safetyeval.domain.entity.SafetyMessageEntity; +import org.qinan.safetyeval.domain.exception.BizException; +import org.qinan.safetyeval.domain.exception.ErrorCode; +import org.qinan.safetyeval.domain.gateway.SafetyMessageGateway; import org.qinan.safetyeval.domain.query.EvalSignTaskQuery; import org.qinan.safetyeval.domain.query.PageResult; import org.qinan.safetyeval.domain.service.EvalSignTaskDomainService; +import org.qinan.safetyeval.infrastructure.dataobject.EvalProjectMemberDO; +import org.qinan.safetyeval.infrastructure.dataobject.EvalRiskParticipantDO; +import org.qinan.safetyeval.infrastructure.dataobject.EvalSignTaskDO; +import org.qinan.safetyeval.infrastructure.mapper.EvalProjectMemberMapper; +import org.qinan.safetyeval.infrastructure.mapper.EvalRiskParticipantMapper; +import org.qinan.safetyeval.infrastructure.mapper.EvalSignTaskMapper; import org.qinan.safetyeval.infrastructure.support.InstitutionOrgSupport; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; +import java.time.LocalDateTime; import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.stream.Collectors; @Service @@ -32,6 +55,14 @@ public class EvalSignTaskExecutor implements EvalSignTaskApi { @Resource private InstitutionOrgSupport institutionOrgSupport; + @Autowired + private EvalSignTaskMapper evalSignTaskMapper; + @Autowired + private SafetyMessageGateway safetyMessageGateway; + @Autowired + private EvalProjectMemberMapper evalProjectMemberMapper; + @Autowired + private EvalRiskParticipantMapper evalRiskParticipantMapper; @Override public SingleResponse save(EvalSignTaskSaveCmd cmd) { @@ -39,6 +70,37 @@ public class EvalSignTaskExecutor implements EvalSignTaskApi { EvalSignTaskEntity entity = evalSignTaskCmdConvertor.convertSaveCmdToE(cmd); entity.setOrgId(orgId); EvalSignTaskEntity result = evalSignTaskDomainService.add(entity); + // todo 消息发送 + SafetyMessageEntity safetyMessageEntity = new SafetyMessageEntity(); + safetyMessageEntity.setSendName(MsgConstant.MSG_TYPE_SYSTEM); + safetyMessageEntity.setSendId(MsgConstant.MSG_TYPE_SYSTEM_ID); + safetyMessageEntity.setSendType(NoticeTypeEnum.SIGN_TASK_NOTICE.getMsg()); + Map params = new HashMap<>(); + params.put("title", cmd.getTaskTitle()); + Map fillMap = new HashMap<>(); + ProjectStageEnum projectStageEnum = ProjectStageEnum.fromNode(cmd.getNodeCode()); + if (projectStageEnum == null) { + throw new BizException(ErrorCode.EVAL_PROJECT_NODE_NOT_FOUND); + } + fillMap.put("fileName", projectStageEnum.getMsg()); + fillMap.put("version", "v1"); + if (ProjectStageEnum.RISK_ANALYSIS.getMsg().equals(cmd.getNodeCode())) { + fillMap.put("role", ""); + } else { + // 查询角色 + List evalProjectMemberDOS = evalProjectMemberMapper.selectList(new LambdaQueryWrapper() + .select(EvalProjectMemberDO::getRole) + .eq(EvalProjectMemberDO::getProjectId, cmd.getProjectId()) + .eq(EvalProjectMemberDO::getPersonnelId, cmd.getSignerPersonnelId()) + .last("limit 1")); + fillMap.put("role", ProjectStageEnum.fromVals(evalProjectMemberDOS.get(0).getRole())); + } + params.put("content", NoticeTypeEnum.SIGN_TASK_NOTICE.fillTemplate(fillMap)); + safetyMessageEntity.setSendContent(JSON.toJSONString(params)); + safetyMessageEntity.setReceiveId(Long.valueOf(cmd.getSignerPersonnelId())); + safetyMessageEntity.setSendState(0); + safetyMessageEntity.setCreateTime(LocalDateTime.now()); + safetyMessageGateway.save(safetyMessageEntity); return SingleResponse.success(evalSignTaskCmdConvertor.convertEToCO(result)); } @@ -60,4 +122,26 @@ public class EvalSignTaskExecutor implements EvalSignTaskApi { .collect(Collectors.toList())); return SingleResponse.success(co); } + + @Override + @Transactional(rollbackFor = Exception.class) + public SingleResponse signAndUpload(EditSignTaskSaveCmd cmd) { + EvalSignTaskDO evalSignTaskDO = evalSignTaskMapper.selectById(cmd.getId()); + if (evalSignTaskDO == null) { + throw new BizException(ErrorCode.EVAL_SIGN_TASK_NOT_FOUND); + } + evalSignTaskMapper.update(new LambdaUpdateWrapper() + .eq(EvalSignTaskDO::getId, cmd.getId()) + .set(EvalSignTaskDO::getTaskStatusCode, SignTaskStatusEnum.SIGNED.getCode()) + .set(EvalSignTaskDO::getSignerUrl, cmd.getSignerUrl())); + + if (ProjectStageEnum.RISK_ANALYSIS.getMsg().equals(evalSignTaskDO.getNodeCode())) { + evalRiskParticipantMapper.update(new LambdaUpdateWrapper() + .eq(EvalRiskParticipantDO::getPersonnelId, evalSignTaskDO.getSignerPersonnelId()) + .eq(EvalRiskParticipantDO::getProjectId, evalSignTaskDO.getProjectId()) + .set(EvalRiskParticipantDO::getSignFileUrl, cmd.getSignerUrl()) + .set(EvalRiskParticipantDO::getSignStatusCode, SignTaskStatusEnum.SIGNED.getCode())); + } + return SingleResponse.success(true); + } } diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/api/institution/EvalSignTaskApi.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/api/institution/EvalSignTaskApi.java index 9592e78..b9d46f3 100644 --- a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/api/institution/EvalSignTaskApi.java +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/api/institution/EvalSignTaskApi.java @@ -4,6 +4,7 @@ import org.qinan.safetyeval.client.co.institution.EvalSignTaskCO; import org.qinan.safetyeval.client.co.institution.EvalSignTaskEnumsCO; import org.qinan.safetyeval.client.dto.PageResponse; import org.qinan.safetyeval.client.dto.SingleResponse; +import org.qinan.safetyeval.client.dto.institution.EditSignTaskSaveCmd; import org.qinan.safetyeval.client.dto.institution.EvalSignTaskPageQuery; import org.qinan.safetyeval.client.dto.institution.EvalSignTaskSaveCmd; @@ -14,4 +15,6 @@ public interface EvalSignTaskApi { PageResponse page(EvalSignTaskPageQuery query); SingleResponse enums(); + + SingleResponse signAndUpload(EditSignTaskSaveCmd cmd); } diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/institution/EditSignTaskSaveCmd.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/institution/EditSignTaskSaveCmd.java new file mode 100644 index 0000000..2924722 --- /dev/null +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/institution/EditSignTaskSaveCmd.java @@ -0,0 +1,14 @@ +package org.qinan.safetyeval.client.dto.institution; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class EditSignTaskSaveCmd { + + @ApiModelProperty(value = "任务id") + private Long id; + + @ApiModelProperty("签字图片") + private String signerUrl; +} diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/institution/EvalSignTaskSaveCmd.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/institution/EvalSignTaskSaveCmd.java index fd61fc1..fff1cd2 100644 --- a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/institution/EvalSignTaskSaveCmd.java +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/institution/EvalSignTaskSaveCmd.java @@ -20,7 +20,7 @@ public class EvalSignTaskSaveCmd { @ApiModelProperty("待签人员id") private String signerPersonnelId; - @ApiModelProperty("签字任务标题") + @ApiModelProperty("签字任务标题,当前节点名称") private String taskTitle; @ApiModelProperty(value = "任务状态编码:1待签 2已签 3已作废", example = "1") diff --git a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/constant/NoticeTypeEnum.java b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/constant/NoticeTypeEnum.java index da8605a..ff8891e 100644 --- a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/constant/NoticeTypeEnum.java +++ b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/constant/NoticeTypeEnum.java @@ -36,7 +36,7 @@ public enum NoticeTypeEnum { SIGN_TASK_NOTICE( "SIGN_TASK_NOTICE", "签字任务通知", - "请签署《{fileName}》版本号{version}。您的角色:{role}。请核对内容后于{deadline}前完成手写签字。"); + "请签署《{fileName}》版本号{version}。您的角色:{role}。请核对内容完成手写签字。"); @Getter private final String val; diff --git a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/constant/ProjectStageEnum.java b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/constant/ProjectStageEnum.java index 1c5fef0..cf3fb3c 100644 --- a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/constant/ProjectStageEnum.java +++ b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/constant/ProjectStageEnum.java @@ -3,6 +3,9 @@ package org.qinan.safetyeval.domain.constant; import lombok.AllArgsConstructor; import lombok.Getter; +import java.util.Arrays; +import java.util.List; + /** * 项目阶段枚举 * val: 英文大写标识(如 RISK_ANALYSIS) @@ -49,4 +52,18 @@ public enum ProjectStageEnum { } return null; } + + /** + * 根据 val集合(英文大写)查找枚举 + */ + public static String fromVals(String val) { + StringBuilder sb = new StringBuilder(); + List vals = Arrays.asList(val.split(",")); + for (ProjectStageEnum stage : values()) { + if (vals.contains(stage.val)) { + sb.append(stage.msg).append(","); + } + } + return sb.toString(); + } } \ No newline at end of file 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 4bfc1af..1458797 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 @@ -162,6 +162,7 @@ public enum ErrorCode { EVAL_HANDOVER_FORM_NOT_CREATED("06-05-018", "归档交接单未生成,无法归档"), EVAL_PROJECT_ERROR("06-05-019", "项目不存在"), EVAL_PROCESS_PRE_NODES_INCOMPLETE("06-05-020", "前置节点未完成,无法操作过程控制"), + EVAL_PROJECT_NODE_NOT_FOUND("06-05-021", "节点不存在"), // ---- 监督检查告知(phase2 P3) ---- INSP_NOTICE_NOT_FOUND("06-06-001", "监督检查告知不存在"),