首页
/ 飞龙工作流FlowLong:企业级审批场景

飞龙工作流FlowLong:企业级审批场景

2026-02-04 04:13:22作者:伍希望

飞龙工作流(FlowLong)针对企业级审批场景提供了全面的解决方案,包括会签与或签实现、动态分配与转办、驳回与跳转策略以及超时审批与自动提醒功能。这些功能通过灵活的配置和强大的技术实现,满足了复杂审批流程的需求。

会签与或签实现(顺序会签、并行会签)

在飞龙工作流(FlowLong)中,会签和或签是实现企业级审批场景的核心功能之一。它们分别对应顺序会签和并行会签,适用于多人参与的审批场景。本节将详细介绍其实现原理、代码逻辑以及使用示例。

1. 会签与或签概述

会签和或签是多人审批的两种模式:

  • 顺序会签:审批人按顺序依次审批,前一人审批完成后,后一人才能收到待办任务。
  • 并行会签:所有审批人同时收到待办任务,需全部审批完成后才能进入下一节点。
  • 或签:任意一人审批完成后即可进入下一节点。

2. 核心实现类

2.1 TaskServiceImpl

TaskServiceImpl 是会签和或签的核心实现类,负责任务的分发和执行。以下关键方法实现了会签逻辑:

public FlwTask executeTask(Long taskId, FlowCreator flowCreator, Map<String, Object> args, TaskState taskState, TaskEventType eventType) {
    // 处理会签任务
    if (eventType == TaskEventType.addCountersign) {
        this.taskNotify(TaskEventType.addCountersign, () -> newFlwTask, Collections.singletonList(taskActor), null, flowCreator);
    }
}

2.2 GeneralTaskActorProvider

GeneralTaskActorProvider 实现了 TaskActorProvider 接口,用于动态分配任务参与者:

public Integer getActorType(NodeModel nodeModel) {
    // 根据节点配置返回参与者类型
    return nodeModel.getActorType();
}

2.3 GeneralAccessStrategy

GeneralAccessStrategy 实现了 TaskAccessStrategy 接口,用于验证任务参与者的权限:

public FlwTaskActor isAllowed(String userId, List<FlwTaskActor> taskActors) {
    // 验证用户是否有权限执行任务
    return taskActors.stream().filter(ta -> ta.getActorId().equals(userId)).findFirst().orElse(null);
}

3. 顺序会签实现

顺序会签的实现依赖于 TaskEventType.addCountersign 事件和任务队列。以下是其流程:

  1. 任务分发:通过 TaskServiceImpl 分发任务,按顺序通知参与者。
  2. 任务执行:前一人完成任务后,触发下一人的任务通知。
sequenceDiagram
    participant A as 发起人
    participant B as 审批人1
    participant C as 审批人2
    participant D as 系统
    A->>D: 发起流程
    D->>B: 通知审批人1
    B->>D: 完成审批
    D->>C: 通知审批人2
    C->>D: 完成审批
    D->>A: 流程结束

4. 并行会签实现

并行会签的实现通过同时分发任务给所有参与者,并等待所有任务完成:

  1. 任务分发:通过 TaskServiceImpl 同时通知所有参与者。
  2. 任务完成:系统检查所有任务是否完成,完成后进入下一节点。
flowchart TD
    A[发起流程] --> B[通知审批人1]
    A --> C[通知审批人2]
    B --> D[审批人1完成]
    C --> E[审批人2完成]
    D --> F[检查所有完成]
    E --> F
    F --> G[流程结束]

5. 或签实现

或签的实现较为简单,只需任意一人完成任务即可:

  1. 任务分发:同时通知所有参与者。
  2. 任务完成:任意一人完成任务后,流程继续。
public FlwTask executeTask(Long taskId, FlowCreator flowCreator, Map<String, Object> args, TaskState taskState, TaskEventType eventType) {
    if (eventType == TaskEventType.orSign) {
        // 任意一人完成即可
        this.taskNotify(TaskEventType.orSign, () -> newFlwTask, taskActors, null, flowCreator);
    }
}

6. 代码示例

以下是一个顺序会签的配置示例:

DynamicAssignee dynamicAssignee = DynamicAssignee.builder()
    .type(ActorType.USER.getType())
    .assigneeList(Arrays.asList(
        NodeAssignee.ofUser("user1", "张三"),
        NodeAssignee.ofUser("user2", "李四")
    ))
    .build();

7. 总结

飞龙工作流通过 TaskServiceImplGeneralTaskActorProviderGeneralAccessStrategy 等核心类,实现了灵活的顺序会签、并行会签和或签功能。这些功能可以满足复杂的审批场景需求,同时支持动态配置和扩展。

动态分配与转办(DynamicAssignee、TaskAccessStrategy)

在飞龙工作流(FlowLong)中,动态分配与转办是实现企业级审批场景的核心功能之一。通过DynamicAssigneeTaskAccessStrategy两个关键组件,FlowLong提供了灵活的任务分配和权限控制机制,满足复杂审批流程的需求。

动态分配(DynamicAssignee)

DynamicAssignee类用于动态指定任务的处理人,支持用户、角色、部门等多种分配方式。以下是其核心功能:

  1. 动态分配类型

    • 用户列表(assigneeUserList
    • 角色列表(assigneeRoleList
    • 部门列表(assigneeDeptList
  2. 使用方法

    // 动态分配用户列表
    DynamicAssignee.assigneeUserList(userList);
    // 动态分配角色列表
    DynamicAssignee.assigneeRoleList(roleList);
    // 动态分配部门列表
    DynamicAssignee.assigneeDeptList(deptList);
    
  3. 示例代码

    List<NodeAssignee> assignees = new ArrayList<>();
    assignees.add(NodeAssignee.ofUser("user1", "张三"));
    assignees.add(NodeAssignee.ofUser("user2", "李四"));
    DynamicAssignee dynamicAssignee = DynamicAssignee.assigneeUserList(assignees);
    
  4. 流程图

    flowchart TD
        A[发起任务] --> B{动态分配类型}
        B -->|用户| C[分配用户列表]
        B -->|角色| D[分配角色列表]
        B -->|部门| E[分配部门列表]
        C --> F[执行任务]
        D --> F
        E --> F
    

任务访问策略(TaskAccessStrategy)

TaskAccessStrategy接口定义了任务访问的权限控制逻辑,默认实现为GeneralAccessStrategy。其主要功能包括:

  1. 权限校验

    • 检查用户是否有权限处理任务。
    • 支持自定义权限逻辑。
  2. 核心方法

    public interface TaskAccessStrategy {
        FlwTaskActor isAllowed(String userId, List<FlwTaskActor> taskActors);
    }
    
  3. 示例代码

    // 自定义权限策略
    public class CustomAccessStrategy implements TaskAccessStrategy {
        @Override
        public FlwTaskActor isAllowed(String userId, List<FlwTaskActor> taskActors) {
            return taskActors.stream()
                    .filter(actor -> actor.getActorId().equals(userId))
                    .findFirst()
                    .orElse(null);
        }
    }
    
  4. 表格说明

    方法名 参数说明 返回值说明
    isAllowed userId: 用户ID;taskActors: 任务参与者列表 返回符合条件的任务参与者对象或null

动态分配与转办的结合

在实际应用中,动态分配与转办通常结合使用。例如,当任务需要转办时,可以通过DynamicAssignee动态指定新的处理人,并通过TaskAccessStrategy验证权限。

  1. 转办流程

    sequenceDiagram
        participant A as 当前处理人
        participant B as 系统
        participant C as 新处理人
        A->>B: 请求转办任务
        B->>B: 动态分配新处理人
        B->>C: 分配任务
        C->>B: 确认处理权限
        B->>A: 转办成功
    
  2. 代码示例

    // 转办逻辑
    public void transferTask(Long taskId, String newAssigneeId) {
        FlwTask task = taskService.getTask(taskId);
        List<NodeAssignee> newAssignees = new ArrayList<>();
        newAssignees.add(NodeAssignee.ofUser(newAssigneeId, "新处理人"));
        DynamicAssignee dynamicAssignee = DynamicAssignee.assigneeUserList(newAssignees);
        FlowDataTransfer.dynamicAssignee(Collections.singletonMap("dynamicAssignee", dynamicAssignee));
        taskService.executeTask(taskId, task.getFlowCreator(), null, TaskState.TRANSFERRED, TaskEventType.TRANSFER);
    }
    

通过DynamicAssigneeTaskAccessStrategy的灵活组合,FlowLong能够高效支持复杂的审批场景,满足企业级工作流的需求。

驳回与跳转策略

在飞龙工作流(FlowLong)中,驳回与跳转策略是企业级审批场景中的核心功能之一。这些策略不仅支持灵活的审批流程控制,还能满足复杂业务场景的需求。以下将详细介绍驳回与跳转策略的设计与实现。


驳回策略

飞龙工作流提供了多种驳回策略,用户可以根据实际需求选择适合的方式:

  1. 驳回到发起人
    将审批任务退回到流程的发起人,适用于需要发起人重新确认或修改的场景。

  2. 驳回到上一节点
    将审批任务退回到上一个处理节点,适用于需要前一步骤重新审核的情况。

  3. 驳回到指定节点
    用户可以选择将任务退回到流程中的任意指定节点,适用于需要特定节点重新处理的场景。

  4. 终止审批流程
    直接终止当前流程实例,适用于审批流程需要完全终止的情况。

  5. 驳回到模型父节点
    将任务退回到当前节点的父节点,适用于嵌套流程或子流程的场景。

代码示例

// 设置驳回策略
nodeModel.setRejectStrategy(1); // 1: 驳回到发起人
nodeModel.setRejectStart(1);    // 1: 继续往下执行

流程图

flowchart TD
    A[发起人] --> B[审批节点1]
    B --> C[审批节点2]
    C --> D{驳回策略}
    D -->|驳回到发起人| A
    D -->|驳回到上一节点| B
    D -->|驳回到指定节点| E[指定节点]
    D -->|终止审批流程| F[终止]
    D -->|驳回到模型父节点| G[父节点]

跳转策略

跳转策略允许在流程执行过程中动态调整审批路径,支持以下功能:

  1. 自动跳转
    根据条件自动跳转到指定节点,适用于需要动态调整流程路径的场景。

  2. 驳回跳转
    在驳回时跳转到指定节点,支持重新审批策略(继续执行或回到上一节点)。

  3. 路由跳转
    根据路由分支条件跳转到指定节点,适用于多分支流程。

代码示例

// 执行跳转任务
engine.executeJumpTask(taskId, targetNodeKey, flowCreator, args, TaskType.rejectJump);

状态图

stateDiagram
    [*] --> 审批节点1
    审批节点1 --> 审批节点2
    审批节点2 --> 驳回跳转
    驳回跳转 --> 审批节点1: 驳回到上一节点
    驳回跳转 --> 指定节点: 驳回到指定节点
    驳回跳转 --> [*]: 终止流程

驳回重新审批策略

飞龙工作流支持两种驳回重新审批策略:

  1. 继续往下执行
    驳回后,流程继续从当前节点往下执行。

  2. 回到上一个节点
    驳回后,流程回到上一个审批节点重新执行。

表格对比

策略类型 适用场景 实现方式
继续往下执行 需要快速推进流程的场景 设置 rejectStart=1
回到上一个节点 需要重新审核前一步骤的场景 设置 rejectStart=2

技术实现

飞龙工作流通过以下核心类实现驳回与跳转功能:

  1. NodeModel
    定义驳回策略和跳转逻辑,包括 rejectStrategyrejectStart 属性。

  2. FlowLongEngineImpl
    提供 executeJumpTask 方法,处理跳转任务的执行。

  3. TaskTypeTaskEventType
    枚举类型,标识任务类型和事件类型(如 rejectJumpjump)。

类图

classDiagram
    class NodeModel {
        +Integer rejectStrategy
        +Integer rejectStart
        +execute()
    }
    class FlowLongEngineImpl {
        +executeJumpTask()
    }
    class TaskType {
        <<enumeration>>
        +rejectJump
        +jump
    }
    NodeModel --> FlowLongEngineImpl
    FlowLongEngineImpl --> TaskType

通过以上设计,飞龙工作流能够灵活应对各种审批场景,确保流程的高效性和可扩展性。

超时审批与自动提醒

在飞龙工作流(FlowLong)中,超时审批与自动提醒功能是企业级审批场景的重要组成部分。该功能通过智能化的时间管理和任务提醒机制,确保审批流程的高效运行,避免因人为疏忽导致的流程阻塞。以下将详细介绍其实现原理、配置方式以及实际应用场景。

功能概述

超时审批与自动提醒功能主要包括两个核心模块:

  1. 超时审批:当任务在预设的时间内未被处理时,系统会自动执行预设的审批动作(如自动通过或拒绝)。
  2. 自动提醒:在任务接近超时或需要处理时,系统会通过多种方式(如短信、邮件、微信、钉钉等)提醒审批人及时处理。

实现原理

1. 超时审批

超时审批的实现依赖于以下关键组件:

  • 任务超时检测:系统通过定时任务(FlowLongScheduler)定期扫描数据库中的待办任务,检查其是否超过预设的超时时间。
    List<FlwTask> flwTaskList = taskService.getTimeoutOrRemindTasks();
    
  • 自动审批逻辑:超时任务会被标记为自动处理,系统会根据配置执行通过或拒绝操作。
    public List<FlwTask> getTimeoutOrRemindTasks() {
        return taskDao.selectListTimeoutOrRemindTasks(DateUtils.getCurrentDate());
    }
    

2. 自动提醒

自动提醒的实现依赖于以下关键组件:

  • 提醒参数配置:通过RemindParam类定义提醒的时间、频率和方式。
    public class RemindParam {
        private Integer remindDelay; // 提醒延迟时间
        private Integer maxRemindTimes; // 最大提醒次数
    }
    
  • 任务提醒接口TaskReminder接口定义了提醒的具体实现逻辑,用户可以根据需求自定义提醒方式(如短信、邮件等)。
    public interface TaskReminder {
        void remind(FlwTask task, RemindParam remindParam);
    }
    

配置与使用

1. 超时审批配置

在流程设计器中,可以为每个审批节点配置超时时间及超时动作(自动通过或拒绝)。以下是一个配置示例:

flowchart TD
    A[审批节点] -->|超时时间: 24小时| B[自动通过]
    A -->|超时时间: 48小时| C[自动拒绝]

2. 自动提醒配置

通过RemindParam设置提醒参数,并实现TaskReminder接口以支持自定义提醒方式。以下是一个配置示例:

RemindParam remindParam = new RemindParam();
remindParam.setRemindDelay(3600); // 1小时后提醒
remindParam.setMaxRemindTimes(3); // 最多提醒3次
context.setRemindParam(remindParam);

实际应用场景

  1. 紧急审批:对于紧急流程,设置较短的超时时间(如2小时),确保任务快速流转。
  2. 批量处理:对于需要多人审批的任务,通过自动提醒避免因某一人未处理而阻塞整个流程。
  3. 节假日处理:在节假日期间,延长超时时间并配置多次提醒,确保任务不被遗漏。

代码示例

以下是一个完整的超时审批与自动提醒的代码示例:

// 配置超时审批
FlwTask task = taskService.getTask(taskId);
task.setExpireTime(DateUtils.parseDelayTime("24h")); // 设置24小时超时
taskService.updateTask(task);

// 配置自动提醒
RemindParam remindParam = new RemindParam();
remindParam.setRemindDelay(3600); // 1小时后提醒
remindParam.setMaxRemindTimes(3); // 最多提醒3次
context.setRemindParam(remindParam);

// 实现自定义提醒
public class CustomTaskReminder implements TaskReminder {
    @Override
    public void remind(FlwTask task, RemindParam remindParam) {
        // 发送邮件提醒
        EmailService.send(task.getAssignee(), "待办任务提醒", "请及时处理任务:" + task.getName());
    }
}

通过以上配置和实现,飞龙工作流的超时审批与自动提醒功能能够显著提升审批效率,适应多样化的业务需求。

登录后查看全文
热门项目推荐
相关项目推荐