feat: 签字

dev
zhanglei 2026-07-24 14:48:31 +08:00
parent b779cfc748
commit 6a2b962fb0
9 changed files with 127 additions and 27 deletions

View File

@ -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")

View File

@ -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<EvalSignTaskEnumsCO> enums() {
return evalSignTaskApi.enums();
@ApiOperation("签字上传")
@PostMapping("/signAndUpload")
public SingleResponse<Boolean> signAndUpload(@RequestBody EditSignTaskSaveCmd cmd) {
return evalSignTaskApi.signAndUpload(cmd);
}
}

View File

@ -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<EvalSignTaskCO> 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<String, Object> params = new HashMap<>();
params.put("title", cmd.getTaskTitle());
Map<String, String> 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<EvalProjectMemberDO> evalProjectMemberDOS = evalProjectMemberMapper.selectList(new LambdaQueryWrapper<EvalProjectMemberDO>()
.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<Boolean> 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<EvalSignTaskDO>()
.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<EvalRiskParticipantDO>()
.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);
}
}

View File

@ -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<EvalSignTaskCO> page(EvalSignTaskPageQuery query);
SingleResponse<EvalSignTaskEnumsCO> enums();
SingleResponse<Boolean> signAndUpload(EditSignTaskSaveCmd cmd);
}

View File

@ -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;
}

View File

@ -20,7 +20,7 @@ public class EvalSignTaskSaveCmd {
@ApiModelProperty("待签人员id")
private String signerPersonnelId;
@ApiModelProperty("签字任务标题")
@ApiModelProperty("签字任务标题,当前节点名称")
private String taskTitle;
@ApiModelProperty(value = "任务状态编码1待签 2已签 3已作废", example = "1")

View File

@ -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;

View File

@ -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<String> vals = Arrays.asList(val.split(","));
for (ProjectStageEnum stage : values()) {
if (vals.contains(stage.val)) {
sb.append(stage.msg).append(",");
}
}
return sb.toString();
}
}

View File

@ -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", "监督检查告知不存在"),