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