package jnpf.flowable.service;
|
|
import jnpf.exception.WorkFlowException;
|
import jnpf.flowable.entity.OperatorEntity;
|
import jnpf.flowable.entity.TaskEntity;
|
import jnpf.flowable.entity.TemplateNodeEntity;
|
import jnpf.flowable.mapper.TaskMapper;
|
import jnpf.flowable.mapper.TemplateNodeMapper;
|
import jnpf.flowable.model.filepermission.WorkflowAuditContextResolver;
|
import jnpf.flowable.util.OperatorUtil;
|
import lombok.RequiredArgsConstructor;
|
import org.springframework.stereotype.Service;
|
import java.util.LinkedHashMap;
|
import java.util.Map;
|
import java.util.Objects;
|
|
/** 仅由 DMS 原生保存的专属分支调用;节点名不接受请求自报值。 */
|
@Service
|
@RequiredArgsConstructor
|
public class WorkflowAuditContextResolverImpl implements WorkflowAuditContextResolver {
|
private final OperatorUtil operators;
|
private final TaskMapper tasks;
|
private final TemplateNodeMapper nodes;
|
|
@Override
|
public Map<String, String> resolve(String taskId, String formId, String operatorId) throws WorkFlowException {
|
OperatorEntity operator = operators.checkOperator(operatorId);
|
if (!Objects.equals(taskId, operator.getTaskId()))
|
throw new WorkFlowException("文件审计的流程与办理记录不匹配");
|
// An authenticated development run has already checked its switch, form allowlist and electronic signer.
|
// The scope exists only during the local native save; HTTP callers cannot supply it.
|
if (!jnpf.flowable.model.util.DevApprovalActor.active()
|
|| !jnpf.flowable.model.util.DevApprovalActor.isActing(operatorId, jnpf.util.UserProvider.getLoginUserId()))
|
operators.checkOperatorPermission(operatorId);
|
TaskEntity task = tasks.getInfo(taskId);
|
TemplateNodeEntity node = nodes.getList(task.getFlowId()).stream()
|
.filter(n -> Objects.equals(n.getNodeCode(), operator.getNodeCode()))
|
.findFirst().orElse(null);
|
if (node == null || !Objects.equals(formId, node.getFormId()))
|
throw new WorkFlowException("文件审计的表单与办理节点不匹配");
|
Map<String, String> context = new LinkedHashMap<>();
|
context.put("taskId", taskId);
|
context.put("operatorId", operator.getId());
|
context.put("nodeId", operator.getNodeId());
|
context.put("nodeCode", operator.getNodeCode());
|
context.put("nodeName", operator.getNodeName());
|
return context;
|
}
|
}
|