Dromara Warm-Flow 功能详解
本文深入解析Dromara Warm-Flow工作流引擎的核心功能,包括审批功能设计、流程设计器使用、条件表达式与办理人变量配置以及监听器与流程变量机制。通过节点任务设计、动态条件审批、双模式流程设计器等特色功能,展示其如何满足企业级复杂业务流程需求。
审批功能全面解析
Warm-Flow作为一款国产工作流引擎,其审批功能设计灵活且全面,能够满足企业级应用中的复杂审批需求。本节将深入解析Warm-Flow的审批功能,包括其核心设计、功能特性以及实际应用场景。
审批功能的核心设计
Warm-Flow的审批功能基于节点(Node)和任务(Task)的设计,通过流程定义(Definition)和流程实例(Instance)实现动态审批流转。以下是一个典型的审批流程设计:
flowchart TD
A[开始节点] --> B[审批节点1]
B --> C{条件判断}
C -->|通过| D[审批节点2]
C -->|拒绝| E[退回节点]
D --> F[结束节点]
E --> B
关键组件
- 审批节点:通过
Node类型标识为审批节点,支持配置审批人、审批规则等属性。 - 任务实例:每个审批节点生成一个任务实例(
Task),记录审批状态和操作。 - 流程变量:动态传递审批参数,如审批意见、审批人信息等。
功能特性
Warm-Flow的审批功能支持以下操作:
| 功能 | 描述 |
|---|---|
| 通过 | 审批人同意当前任务,流程流转到下一节点。 |
| 退回 | 审批人拒绝当前任务,流程退回至上一节点或指定节点。 |
| 驳回到上一任务 | 将任务驳回至上一个处理节点。 |
| 撤销 | 发起人撤销当前流程实例。 |
| 拿回 | 审批人将任务拿回重新处理。 |
| 任意跳转 | 管理员或特定权限用户可将流程跳转至任意节点。 |
| 转办 | 审批人将任务转交给其他用户处理。 |
| 终止 | 终止当前流程实例。 |
| 会签 | 多人并行审批,需所有审批人同意。 |
| 票签 | 多人投票审批,按票数决定是否通过。 |
| 委派 | 临时将审批权限委托给其他用户。 |
| 加减签 | 动态增加或减少审批人。 |
代码示例
以下是一个通过审批任务的代码示例:
// 通过审批任务
Instance instance = FlowEngine.taskService().pass(taskId, "审批通过", variableMap);
条件审批
Warm-Flow支持通过条件表达式动态决定审批路径。例如:
// 动态条件审批
if (variableMap.get("amount") > 10000) {
FlowEngine.taskService().passAtWill(taskId, "managerApproval", "金额大于10000,需经理审批", variableMap);
} else {
FlowEngine.taskService().pass(taskId, "审批通过", variableMap);
}
实际应用场景
-
请假审批:
- 员工提交请假申请。
- 部门经理审批(通过或退回)。
- HR备案(通过后自动归档)。
-
采购审批:
- 采购申请提交。
- 财务审批(金额大于阈值需总监审批)。
- 采购执行。
-
合同审批:
- 法务初审。
- 业务负责人复审。
- 总经理终审。
总结
Warm-Flow的审批功能通过灵活的节点设计和丰富的操作选项,能够满足企业级应用中复杂的审批需求。无论是简单的线性审批还是动态条件审批,Warm-Flow都能提供高效、可靠的解决方案。
流程设计器使用指南
Warm-Flow的流程设计器是其核心功能之一,支持通过jar包快速集成到项目中,并原生支持经典和仿钉钉双模式。以下将详细介绍如何使用流程设计器,包括初始化、节点配置、流程设计以及常见操作。
初始化流程设计器
在Warm-Flow中,流程设计器的初始化非常简单。首先,确保项目中已引入相关依赖。以下是一个典型的初始化配置示例:
@Configuration
public class FlowDesignerConfig {
@Bean
public FlowDesigner flowDesigner() {
return new FlowDesigner()
.setMode(DesignMode.CLASSIC) // 设置为经典模式
.setNodePropertiesExtender(new CustomNodePropertiesExtender()); // 自定义节点属性扩展
}
}
节点配置
流程设计器支持多种节点类型,包括开始节点、审批节点、条件节点和结束节点等。每个节点可以通过JSON配置其属性。以下是一个审批节点的配置示例:
{
"type": "approval",
"name": "部门经理审批",
"assignee": "${deptManager}",
"formKey": "dept_approval_form",
"properties": {
"timeout": "24h",
"priority": "high"
}
}
流程图设计
Warm-Flow的流程设计器支持拖拽式设计,用户可以通过界面操作快速构建流程图。以下是一个简单的流程图设计示例:
flowchart TD
A[开始] --> B[部门经理审批]
B --> C{是否通过?}
C -->|是| D[财务审批]
C -->|否| E[退回申请人]
D --> F[结束]
E --> B
常见操作
-
保存流程
设计完成后,点击保存按钮将流程定义保存为JSON或XML格式。以下是一个保存操作的代码示例:function saveFlow() { const flowData = designer.getFlowData(); axios.post('/api/flow/save', flowData) .then(response => { console.log('流程保存成功'); }); } -
导入/导出流程
支持从JSON或XML文件导入流程定义,也可以将当前设计的流程导出为文件。 -
节点属性扩展
通过实现NodePropertiesExtender接口,可以自定义节点属性。例如:public class CustomNodePropertiesExtender implements NodePropertiesExtender { @Override public Map<String, Object> extendProperties(FlowNode node) { Map<String, Object> props = new HashMap<>(); props.put("customField", "自定义值"); return props; } }
表格:节点类型及其功能
| 节点类型 | 功能描述 |
|---|---|
| 开始节点 | 标识流程的开始,通常无需配置额外属性。 |
| 审批节点 | 用于设置审批人、表单和超时等属性。 |
| 条件节点 | 根据条件表达式决定流程走向。 |
| 并行网关 | 支持多个分支并行执行。 |
| 结束节点 | 标识流程的结束。 |
注意事项
- 流程设计器支持动态加载自定义表单,确保表单设计与流程节点匹配。
- 在设计复杂流程时,建议先绘制草图,再通过设计器实现。
- 使用条件节点时,确保条件表达式的语法正确,避免流程逻辑错误。
通过以上指南,您可以快速掌握Warm-Flow流程设计器的使用方法,高效完成流程设计与配置。
条件表达式与办理人变量
在Dromara Warm-Flow工作流引擎中,条件表达式和办理人变量是实现动态流程控制的核心功能之一。它们允许开发者根据业务需求灵活地定义流程的流转规则和任务分配逻辑。以下将详细介绍这两者的实现原理和使用方法。
条件表达式
条件表达式用于在流程流转过程中动态判断分支路径。Warm-Flow支持多种内置的条件表达式策略,同时也支持自定义扩展。
内置条件表达式
Warm-Flow提供了以下常见的内置条件表达式策略:
| 表达式类型 | 描述 | 示例 |
|---|---|---|
eq |
等于 | `eq@@flag |
ne |
不等于 | `ne@@flag |
gt |
大于 | `gt@@flag |
lt |
小于 | `lt@@flag |
ge |
大于等于 | `ge@@flag |
le |
小于等于 | `le@@flag |
like |
包含 | `like@@flag |
notLike |
不包含 | `notLike@@flag |
这些表达式可以通过组合使用,实现复杂的逻辑判断。例如:
notLike@@flag|4 and eq@@flag|5 or lt@@flag|6
自定义条件表达式
如果需要更复杂的逻辑,可以通过实现ConditionStrategy接口来自定义条件表达式策略。以下是一个示例:
public class CustomConditionStrategy implements ConditionStrategy {
@Override
public String getType() {
return "custom";
}
@Override
public Boolean eval(String expression, Map<String, Object> variable) {
// 自定义逻辑实现
return true;
}
}
注册自定义策略:
ExpressionUtil.setExpression(new CustomConditionStrategy());
办理人变量
办理人变量用于动态指定任务的办理人。Warm-Flow支持通过变量表达式动态解析办理人,常见的变量格式为${handler}或SpEL表达式。
变量替换
在任务创建或流程流转时,系统会自动替换办理人变量。例如:
// 办理人变量替换
FlowParams flowParams = FlowParams.build()
.handler("${user.leader}")
.variable(Map.of("user", user));
SpEL表达式支持
Warm-Flow支持使用SpEL表达式动态解析办理人。例如:
FlowParams flowParams = FlowParams.build()
.handler("#{@userService.getLeader(#user.id)}")
.variable(Map.of("user", user));
示例代码
以下是一个完整的示例,展示如何在流程中使用条件表达式和办理人变量:
// 定义流程参数
FlowParams flowParams = FlowParams.build()
.handler("#{@userService.getLeader(#user.id)}")
.variable(Map.of(
"user", user,
"flag", 5
));
// 启动流程
Instance instance = FlowEngine.insService().start(businessId, flowParams);
// 条件判断
String condition = "gt@@flag|4";
if (ExpressionUtil.eval(condition, flowParams.getVariable())) {
// 满足条件时的逻辑
}
总结
通过条件表达式和办理人变量,Warm-Flow实现了高度灵活的流程控制和任务分配机制。开发者可以根据业务需求,轻松扩展和定制这些功能,从而满足复杂的流程场景需求。
监听器与流程变量
在Dromara Warm-Flow工作流引擎中,监听器和流程变量是实现动态流程控制和业务逻辑扩展的核心机制。它们为流程的各个阶段提供了灵活的干预能力,同时也支持在流程执行过程中动态传递和修改数据。
监听器机制
监听器(Listener)是Warm-Flow中用于在流程执行的关键节点触发自定义逻辑的组件。通过监听器,开发者可以在流程启动、任务分配、任务完成等事件发生时执行特定的业务逻辑。
监听器类型
Warm-Flow支持以下四种监听器类型:
- 流程启动监听器(LISTENER_START):在流程实例启动时触发。
- 任务分配监听器(LISTENER_ASSIGNMENT):在任务分配给处理人时触发。
- 任务完成监听器(LISTENER_FINISH):在任务完成时触发。
- 表单加载监听器(LISTENER_FORM_LOAD):在表单加载时触发。
监听器配置
监听器可以通过以下两种方式配置:
- 全局监听器:通过
GlobalListener接口实现,适用于所有流程实例。 - 节点监听器:通过流程定义中的
listenerPath和listenerType字段配置,仅对特定节点生效。
监听器执行
监听器的执行逻辑由ListenerUtil工具类统一管理。例如:
ListenerUtil.executeListener(
new ListenerVariable(definition, instance, node, variableMap, task)
.setFlowParams(flowParams),
Listener.LISTENER_START
);
监听器变量
监听器执行时,可以通过ListenerVariable对象传递以下上下文信息:
- 流程定义(
Definition) - 流程实例(
Instance) - 当前节点(
Node) - 流程变量(
Map<String, Object>) - 当前任务(
Task)
流程变量
流程变量(Variable)是Warm-Flow中用于在流程实例和任务之间传递动态数据的机制。它们可以是简单的键值对,也可以是复杂的业务对象。
变量传递
流程变量可以通过FlowParams对象在流程执行过程中传递和修改。例如:
flowParams.variable(MapUtil.mergeAll(instance.getVariableMap(), flowParams.getVariable()));
变量存储
流程变量以JSON格式存储在流程实例的variable字段中。通过FlowEngine.jsonConvert工具类可以实现变量与JSON字符串的相互转换。
变量使用
流程变量在以下场景中发挥重要作用:
- 条件表达式:通过
ExpressionUtil.evalVariable方法动态计算条件表达式的结果。 - 任务分配:通过变量动态指定任务处理人。
- 监听器逻辑:监听器可以通过变量获取业务数据并执行自定义逻辑。
示例代码
以下是一个使用流程变量的示例:
// 设置流程变量
flowParams.variable(Map.of("formData", formData));
// 获取流程变量
String formData = instance.getVariableMap().get("formData");
结合使用监听器与流程变量
监听器和流程变量的结合使用可以实现更复杂的业务逻辑。例如:
- 动态任务分配:在任务分配监听器中根据流程变量动态指定处理人。
- 条件跳转:在流程启动监听器中根据变量值决定流程的初始路径。
- 数据校验:在表单加载监听器中校验流程变量的合法性。
示例场景
假设需要在任务完成时根据流程变量发送通知:
ListenerUtil.executeListener(
new ListenerVariable(definition, instance, node, variableMap, task)
.setFlowParams(flowParams),
Listener.LISTENER_FINISH
);
在监听器实现中,可以通过variableMap获取通知内容并触发发送逻辑。
总结
监听器和流程变量是Warm-Flow工作流引擎中实现动态流程控制和业务扩展的核心机制。通过灵活配置监听器和动态传递流程变量,开发者可以轻松应对复杂的业务流程需求。
Dromara Warm-Flow通过灵活的节点设计、可视化流程设计器、动态表达式引擎和可扩展的监听器机制,构建了一套完整的企业级工作流解决方案。从审批流转到条件分支控制,从变量传递到事件监听,其模块化设计兼顾了易用性与扩展性,能够有效支撑采购审批、合同会签等复杂业务场景,是国产工作流引擎中的优秀实践。
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