Skip to content
广告❤️成为赞助商

任务参与者

任务参与者提供处理接口,用于判断执行节点的合法性及提供下一个执行任务的参与者。

任务参与者提供接口

  • 实现任务参与者提供处理接口 TaskActorProvider 在实际使用情况 getTaskActors 需要根据业务要求自己控制。
java
public interface TaskActorProvider {

    /**
     * 流程创建者是否允许操作执行当前节点
     *
     * @param nodeModel   当前执行节点
     * @param flowCreator 流程创建者
     * @return true 允许 false 不被允许
     */
    default boolean isAllowed(NodeModel nodeModel, FlowCreator flowCreator) {
        List<NodeAssignee> nodeAssigneeList = nodeModel.getNodeAssigneeList();
        if (NodeSetType.specifyMembers.eq(nodeModel.getSetType()) && ObjectUtils.isNotEmpty(nodeAssigneeList)) {
            return nodeAssigneeList.stream().anyMatch(t -> Objects.equals(t.getId(), flowCreator.getCreateId()));
        }

        if (TaskType.major.eq(nodeModel.getType()) && !NodeSetType.initiatorSelected.eq(nodeModel.getSetType())) {
            // 发起人且非自选情况
            return true;
        }

        // 角色判断必须要求子类实现
        Assert.isEmpty(nodeAssigneeList, "Please implement the interface TaskActorProvider method isAllow");
        return true;
    }

    /**
     * 根据Task模型的assignee、assignmentHandler属性以及运行时数据,确定参与者
     *
     * @param nodeModel 节点模型
     * @param execution 执行对象
     * @return 参与者数组
     */
    List<FlwTaskActor> getTaskActors(NodeModel nodeModel, Execution execution);

    /**
     * 非正常创建任务处理逻辑,默认抛出异常
     *
     * @param flwTask     当前任务
     * @param performType 任务参与类型 {@link PerformType}
     * @param taskActors  任务参与者
     * @param execution   执行对象 {@link Execution}
     * @param nodeModel   模型节点 {@link NodeModel}
     * @return 返回 true 不再创建任务,返回 false 解决异常补充回写 taskActors 信息
     */
    default boolean abnormal(FlwTask flwTask, PerformType performType, List<FlwTaskActor> taskActors, Execution execution, NodeModel nodeModel) {
        Assert.illegal("taskActors cannot be empty. taskName = " + flwTask.getTaskName() + ", taskKey = " +
                flwTask.getTaskKey() + ", performType = " + performType.getValue());
        return true;
    }

    /**
     * 参与者类型转换处理方法
     *
     * @param nodeModel 当前审批节点 {@link NodeModel}
     * @return 返回值对应 flw_task_actor flw_his_task_actor 表字段参与者类型 actorType
     */
    Integer getActorType(NodeModel nodeModel);
}

任务参与者提供接口实现

该测提供者类继承 GeneralTaskActorProvider 默认实现,并重写 getTaskActors 方法,返回任务参与者列表。 所在源码位置 test.mysql.config

  • 角色,部门 动态提供处理人员可以通过该类进行实现。
java
public class TestTaskActorProvider extends GeneralTaskActorProvider {

    @Override
    public List<FlwTaskActor> getTaskActors(NodeModel nodeModel, Execution execution) {
        if (NodeSetType.role.eq(nodeModel.getSetType())) {
            for (NodeAssignee nodeAssignee: nodeModel.getNodeAssigneeList()) {
                // 测试用例 TestAutoSkip 测试角色自动分配处理人员
                if ("100100".equals(nodeAssignee.getId())) {
                    return Arrays.asList(
                            FlwTaskActor.ofFlowCreator(FlowCreator.of("test001", "测试001")),
                            FlwTaskActor.ofFlowCreator(FlowCreator.of("test002", "测试002"))
                    );
                }

                // 测试用例 TestAutoClaimRole 测试自动认领角色审批
                if ("100200".equals(nodeAssignee.getId())) {
                    return Collections.singletonList(
                            FlwTaskActor.ofRole(nodeAssignee.getTenantId(), nodeAssignee.getId(), nodeAssignee.getName())
                    );
                }
            }
        }
        return super.getTaskActors(nodeModel, execution);
    }
}

更适合中国人的工作流引擎