飞龙工作流FlowLong:企业级审批场景
飞龙工作流(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 事件和任务队列。以下是其流程:
- 任务分发:通过
TaskServiceImpl分发任务,按顺序通知参与者。 - 任务执行:前一人完成任务后,触发下一人的任务通知。
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. 并行会签实现
并行会签的实现通过同时分发任务给所有参与者,并等待所有任务完成:
- 任务分发:通过
TaskServiceImpl同时通知所有参与者。 - 任务完成:系统检查所有任务是否完成,完成后进入下一节点。
flowchart TD
A[发起流程] --> B[通知审批人1]
A --> C[通知审批人2]
B --> D[审批人1完成]
C --> E[审批人2完成]
D --> F[检查所有完成]
E --> F
F --> G[流程结束]
5. 或签实现
或签的实现较为简单,只需任意一人完成任务即可:
- 任务分发:同时通知所有参与者。
- 任务完成:任意一人完成任务后,流程继续。
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. 总结
飞龙工作流通过 TaskServiceImpl、GeneralTaskActorProvider 和 GeneralAccessStrategy 等核心类,实现了灵活的顺序会签、并行会签和或签功能。这些功能可以满足复杂的审批场景需求,同时支持动态配置和扩展。
动态分配与转办(DynamicAssignee、TaskAccessStrategy)
在飞龙工作流(FlowLong)中,动态分配与转办是实现企业级审批场景的核心功能之一。通过DynamicAssignee和TaskAccessStrategy两个关键组件,FlowLong提供了灵活的任务分配和权限控制机制,满足复杂审批流程的需求。
动态分配(DynamicAssignee)
DynamicAssignee类用于动态指定任务的处理人,支持用户、角色、部门等多种分配方式。以下是其核心功能:
-
动态分配类型:
- 用户列表(
assigneeUserList) - 角色列表(
assigneeRoleList) - 部门列表(
assigneeDeptList)
- 用户列表(
-
使用方法:
// 动态分配用户列表 DynamicAssignee.assigneeUserList(userList); // 动态分配角色列表 DynamicAssignee.assigneeRoleList(roleList); // 动态分配部门列表 DynamicAssignee.assigneeDeptList(deptList); -
示例代码:
List<NodeAssignee> assignees = new ArrayList<>(); assignees.add(NodeAssignee.ofUser("user1", "张三")); assignees.add(NodeAssignee.ofUser("user2", "李四")); DynamicAssignee dynamicAssignee = DynamicAssignee.assigneeUserList(assignees); -
流程图:
flowchart TD A[发起任务] --> B{动态分配类型} B -->|用户| C[分配用户列表] B -->|角色| D[分配角色列表] B -->|部门| E[分配部门列表] C --> F[执行任务] D --> F E --> F
任务访问策略(TaskAccessStrategy)
TaskAccessStrategy接口定义了任务访问的权限控制逻辑,默认实现为GeneralAccessStrategy。其主要功能包括:
-
权限校验:
- 检查用户是否有权限处理任务。
- 支持自定义权限逻辑。
-
核心方法:
public interface TaskAccessStrategy { FlwTaskActor isAllowed(String userId, List<FlwTaskActor> taskActors); } -
示例代码:
// 自定义权限策略 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); } } -
表格说明:
方法名 参数说明 返回值说明 isAlloweduserId: 用户ID;taskActors: 任务参与者列表返回符合条件的任务参与者对象或 null
动态分配与转办的结合
在实际应用中,动态分配与转办通常结合使用。例如,当任务需要转办时,可以通过DynamicAssignee动态指定新的处理人,并通过TaskAccessStrategy验证权限。
-
转办流程:
sequenceDiagram participant A as 当前处理人 participant B as 系统 participant C as 新处理人 A->>B: 请求转办任务 B->>B: 动态分配新处理人 B->>C: 分配任务 C->>B: 确认处理权限 B->>A: 转办成功 -
代码示例:
// 转办逻辑 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); }
通过DynamicAssignee和TaskAccessStrategy的灵活组合,FlowLong能够高效支持复杂的审批场景,满足企业级工作流的需求。
驳回与跳转策略
在飞龙工作流(FlowLong)中,驳回与跳转策略是企业级审批场景中的核心功能之一。这些策略不仅支持灵活的审批流程控制,还能满足复杂业务场景的需求。以下将详细介绍驳回与跳转策略的设计与实现。
驳回策略
飞龙工作流提供了多种驳回策略,用户可以根据实际需求选择适合的方式:
-
驳回到发起人
将审批任务退回到流程的发起人,适用于需要发起人重新确认或修改的场景。 -
驳回到上一节点
将审批任务退回到上一个处理节点,适用于需要前一步骤重新审核的情况。 -
驳回到指定节点
用户可以选择将任务退回到流程中的任意指定节点,适用于需要特定节点重新处理的场景。 -
终止审批流程
直接终止当前流程实例,适用于审批流程需要完全终止的情况。 -
驳回到模型父节点
将任务退回到当前节点的父节点,适用于嵌套流程或子流程的场景。
代码示例
// 设置驳回策略
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[父节点]
跳转策略
跳转策略允许在流程执行过程中动态调整审批路径,支持以下功能:
-
自动跳转
根据条件自动跳转到指定节点,适用于需要动态调整流程路径的场景。 -
驳回跳转
在驳回时跳转到指定节点,支持重新审批策略(继续执行或回到上一节点)。 -
路由跳转
根据路由分支条件跳转到指定节点,适用于多分支流程。
代码示例
// 执行跳转任务
engine.executeJumpTask(taskId, targetNodeKey, flowCreator, args, TaskType.rejectJump);
状态图
stateDiagram
[*] --> 审批节点1
审批节点1 --> 审批节点2
审批节点2 --> 驳回跳转
驳回跳转 --> 审批节点1: 驳回到上一节点
驳回跳转 --> 指定节点: 驳回到指定节点
驳回跳转 --> [*]: 终止流程
驳回重新审批策略
飞龙工作流支持两种驳回重新审批策略:
-
继续往下执行
驳回后,流程继续从当前节点往下执行。 -
回到上一个节点
驳回后,流程回到上一个审批节点重新执行。
表格对比
| 策略类型 | 适用场景 | 实现方式 |
|---|---|---|
| 继续往下执行 | 需要快速推进流程的场景 | 设置 rejectStart=1 |
| 回到上一个节点 | 需要重新审核前一步骤的场景 | 设置 rejectStart=2 |
技术实现
飞龙工作流通过以下核心类实现驳回与跳转功能:
-
NodeModel
定义驳回策略和跳转逻辑,包括rejectStrategy和rejectStart属性。 -
FlowLongEngineImpl
提供executeJumpTask方法,处理跳转任务的执行。 -
TaskType和TaskEventType
枚举类型,标识任务类型和事件类型(如rejectJump和jump)。
类图
classDiagram
class NodeModel {
+Integer rejectStrategy
+Integer rejectStart
+execute()
}
class FlowLongEngineImpl {
+executeJumpTask()
}
class TaskType {
<<enumeration>>
+rejectJump
+jump
}
NodeModel --> FlowLongEngineImpl
FlowLongEngineImpl --> TaskType
通过以上设计,飞龙工作流能够灵活应对各种审批场景,确保流程的高效性和可扩展性。
超时审批与自动提醒
在飞龙工作流(FlowLong)中,超时审批与自动提醒功能是企业级审批场景的重要组成部分。该功能通过智能化的时间管理和任务提醒机制,确保审批流程的高效运行,避免因人为疏忽导致的流程阻塞。以下将详细介绍其实现原理、配置方式以及实际应用场景。
功能概述
超时审批与自动提醒功能主要包括两个核心模块:
- 超时审批:当任务在预设的时间内未被处理时,系统会自动执行预设的审批动作(如自动通过或拒绝)。
- 自动提醒:在任务接近超时或需要处理时,系统会通过多种方式(如短信、邮件、微信、钉钉等)提醒审批人及时处理。
实现原理
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);
实际应用场景
- 紧急审批:对于紧急流程,设置较短的超时时间(如2小时),确保任务快速流转。
- 批量处理:对于需要多人审批的任务,通过自动提醒避免因某一人未处理而阻塞整个流程。
- 节假日处理:在节假日期间,延长超时时间并配置多次提醒,确保任务不被遗漏。
代码示例
以下是一个完整的超时审批与自动提醒的代码示例:
// 配置超时审批
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());
}
}
通过以上配置和实现,飞龙工作流的超时审批与自动提醒功能能够显著提升审批效率,适应多样化的业务需求。
Kimi-K2.5Kimi K2.5 是一款开源的原生多模态智能体模型,它在 Kimi-K2-Base 的基础上,通过对约 15 万亿混合视觉和文本 tokens 进行持续预训练构建而成。该模型将视觉与语言理解、高级智能体能力、即时模式与思考模式,以及对话式与智能体范式无缝融合。Python00
GLM-4.7-FlashGLM-4.7-Flash 是一款 30B-A3B MoE 模型。作为 30B 级别中的佼佼者,GLM-4.7-Flash 为追求性能与效率平衡的轻量化部署提供了全新选择。Jinja00
VLOOKVLOOK™ 是优雅好用的 Typora/Markdown 主题包和增强插件。 VLOOK™ is an elegant and practical THEME PACKAGE × ENHANCEMENT PLUGIN for Typora/Markdown.Less00
PaddleOCR-VL-1.5PaddleOCR-VL-1.5 是 PaddleOCR-VL 的新一代进阶模型,在 OmniDocBench v1.5 上实现了 94.5% 的全新 state-of-the-art 准确率。 为了严格评估模型在真实物理畸变下的鲁棒性——包括扫描伪影、倾斜、扭曲、屏幕拍摄和光照变化——我们提出了 Real5-OmniDocBench 基准测试集。实验结果表明,该增强模型在新构建的基准测试集上达到了 SOTA 性能。此外,我们通过整合印章识别和文本检测识别(text spotting)任务扩展了模型的能力,同时保持 0.9B 的超紧凑 VLM 规模,具备高效率特性。Python00
KuiklyUI基于KMP技术的高性能、全平台开发框架,具备统一代码库、极致易用性和动态灵活性。 Provide a high-performance, full-platform development framework with unified codebase, ultimate ease of use, and dynamic flexibility. 注意:本仓库为Github仓库镜像,PR或Issue请移步至Github发起,感谢支持!Kotlin07
compass-metrics-modelMetrics model project for the OSS CompassPython00