返回

在审批工作流中巧用会签功能

后端

引言

在日常的工作中,我们经常需要处理审批流程。通常情况下,一个审批流程只需要一个审批人即可。但是,在某些情况下,我们需要多个审批人共同审批某个任务。例如,在采购流程中,采购金额较大的订单可能需要部门经理和财务总监共同审批。此时,我们就需要用到工作流中的会签功能。

什么是会签

会签,是指在工作流中,某个任务需要多个用户共同审批。只有当所有审批人都同意时,该任务才算审批通过。

Spring Security 中的会签功能

Spring Security 提供了对会签功能的支持。我们可以通过配置 ApprovalVoteVoter 来实现会签。

@Configuration
public class ApprovalVoteVoterConfig {

    @Bean
    public ApprovalVoteVoter approvalVoteVoter() {
        ApprovalVoteVoter approvalVoteVoter = new ApprovalVoteVoter();
        approvalVoteVoter.setDecisionThreshold(AffirmativeBased.SID_UNANIMOUS_APPROVAL);
        return approvalVoteVoter;
    }
}

在上面的代码中,我们配置了 ApprovalVoteVoter,并设置了 decisionThresholdAffirmativeBased.SID_UNANIMOUS_APPROVAL,表示只有当所有审批人都同意时,该任务才算审批通过。

使用会签功能

要使用会签功能,我们需要在工作流定义中指定需要会签的任务。我们可以通过 DecisionVoter 接口来实现这一点。

public class MyDecisionVoter implements DecisionVoter {

    @Override
    public boolean supports(ConfigAttribute attribute) {
        return attribute.getAttribute().equals("ROLE_APPROVE");
    }

    @Override
    public int vote(Authentication authentication, Object object, Collection<ConfigAttribute> attributes) {
        // 获取当前用户
        String currentUser = authentication.getName();

        // 获取需要会签的用户列表
        List<String> approvers = getApprovers(object);

        // 判断当前用户是否在会签用户列表中
        if (approvers.contains(currentUser)) {
            // 当前用户需要会签
            return ACCESS_GRANTED;
        } else {
            // 当前用户不需要会签
            return ACCESS_ABSTAIN;
        }
    }
}

在上面的代码中,我们实现了 DecisionVoter 接口,并重写了 supportsvote 方法。在 supports 方法中,我们指定了该 DecisionVoter 适用于 ROLE_APPROVE 角色。在 vote 方法中,我们获取了需要会签的用户列表,并判断当前用户是否在列表中。如果当前用户在列表中,则返回 ACCESS_GRANTED,表示当前用户需要会签。否则,返回 ACCESS_ABSTAIN,表示当前用户不需要会签。

总结

会签功能可以使审批流程更加灵活高效。Spring Security 提供了对会签功能的支持,我们可以通过配置 ApprovalVoteVoter 和实现 DecisionVoter 接口来使用会签功能。