目录
[3.1 并行流程](#3.1 并行流程)
[3.2 条件单行流程](#3.2 条件单行流程)
[3.4 撤销和驳回](#3.4 撤销和驳回)
[3.5 自动化节点](#3.5 自动化节点)
[5.1 环境准备](#5.1 环境准备)
[5.2 Elsa工作流的使用](#5.2 Elsa工作流的使用)
[5.2.1 最简单的工作流程-单个活动](#5.2.1 最简单的工作流程-单个活动)
[5.2.2 执行多个活动](#5.2.2 执行多个活动)
[5.2.3 自定义活动-实现IActivity接口](#5.2.3 自定义活动-实现IActivity接口)
一、什么是工作流?
自身理解:如果有一个技术,可以让我们可视化的分配,带有流程性,多个环节的处理。就是工作流。
工作流(Workflow): 是对工作流程及其各操作步骤之间业务规则的 抽象(规则的定义)、概括描述。
工作流建模,即将工作流程中的工作如何前后组织在一起的逻辑和规则,在计算机中以恰当的模型表达并对其实施计算。
**工作流要解决的主要问题是:**为实现某个业务目标,利用计算机在多个参与者之间按某种预定规则自动传递文档、信息或者任务。
**工作流引擎:**就是 一套用来解析工作流定义并根据定义驱动工作流正常执行和流转的系统。

示例:
常见的工作流,例如公司办公的 OA 系统或钉钉办公,就存在大量的申请审批流程。而在处理这些流程时,如果每一个流程都对应一套代码,显然是不现实的,这样会造成很大程度上的代码冗余,而且开发工作量也会增加。
这个时候就需要一个业务无关的, 高度抽象 和 封装 的 引擎来统一处理。通过这个引擎,可以灵活配置工作流程,并且可以自动化的根据配置进行状态变更和流程流转,这就是工作流引擎。
最简单的一个流程工单,申请人发起流程,每个节点审批人逐个审批,最终流程结束。(开始节点-》张三-》李四-》王五-》结束节点)
二、常见的工作流组件
1、 Workflow: 微软提供的早期的工作流的产品引擎。 .NET框架内置的工作流引擎,通过C#可设计、运行和管理工作流,适合企业级应用。
2、 Elsa: ELSA 是一个基于 .NET Core 的开源工作流引擎 ,提供可视化设计器、灵活的活动编排和事件驱动能力,适用于构建复杂业务流程如审批流 、订单处理 等。比较推荐。
3、 Activiti: 轻量级且易于使用,功能丰富,社区活跃,支持并行处理、分支、定时触发等常见功能
。 https://www.activiti.org/
三、常见的工作流执行流程
3.1 并行流程
同样属于复杂节点,其任何一个子节点处理完成后,都可以进入到下一个节点

3.2 条件单行流程
需要根据不同的表单内容进入不同的分支流程。

3.3动态审批人
审批节点的审批人需要动态获取,并且可配置。 审批人的获取方式可以分以下几种: 1、固定审批人 。2、从申请表单中获取 。3、根据组织架构,动态获取 。4、 从配置的角色组或者权限组中获取.
3.4 撤销和驳回
节点状态变更可以有申请人撤回,审批人同意,审批人驳回。那么在驳回时,可以直接驳回到开始节点,流程结束,也可以到上一个节点。更复杂一些,甚至可以到前面流程的任意一个节点。

3.5 自动化节点
有一些节点是不需要人工参与的,比如说联动其他系统自动处理,或者审批节点有时间限制,超时自动失效。

四、Elsa相关介绍
ELSA(Easy Language for Scripting Activities )是一个轻量级、可扩展的工作流框架,支持通过代码或可视化设计器定义流程。其核心特性包括:
- 可视化设计器:提供拖拽式界面设计工作流,支持实时调试和预览。
- 活动编排:内置基础活动(如变量操作、条件分支),支持自定义扩展。
- 持久化与调度:集成多种数据库(MongoDB、EF Core),支持定时触发和后台作业调度。
- 事件驱动:通过触发器(如 HTTP 端点、文件变更)自动启动流程。
Elsa开源地址: https://github.com/elsa-workflows
五、Elsa实操
5.1 环境准备
.NET7平台
Elsa 3.2.1
Nodejs
5.2 Elsa工作流的使用
5.2.1 最简单的工作流程-单个活动
以下是通过控制台程序运行Elsa,用于学习的最简单的示例。主要了解Elsa要执行需要的步骤有哪些。主要了解Elsa的使用,以及工作流的执行者和活动。这里的WriteLine是Elsa里的一个活动Activity。执行者RunAsync可支持单独执行活动,也可以运行一个workflow。
cs
//1.创建IOC容器实例
ServiceCollection services = new ServiceCollection();
//nuget:
// Elsa 3.2.1
services.AddElsa();
ServiceProvider serviceProvider = services.BuildServiceProvider();
//获取执行工作流的执行者
IWorkflowRunner runner = serviceProvider.GetRequiredService<IWorkflowRunner>();
WriteLine writeLine = new WriteLine("hello wold~~");
await runner.RunAsync(writeLine);
5.2.2 执行多个活动
使用Sequence定义一个活动队列
cs
ServiceCollection services = new ServiceCollection();
services.AddElsa();
ServiceProvider serviceProvider = services.BuildServiceProvider();
//获取执行工作流的执行者
IWorkflowRunner runner = serviceProvider.GetRequiredService<IWorkflowRunner>();
//定义一个活动队列
Sequence workflow = new Sequence()
{
Activities = {
new WriteLine("1 Activity~~"),
new WriteLine("2 Activity~~"),
new WriteLine("3 Activity~~"),
new WriteLine("4 Activity~~"),
new WriteLine("5 Activity~~")
}
};
await runner.RunAsync(workflow);
5.2.3 自定义活动-实现IActivity接口
通过继承Activity实现自定义活动对象
//自定义活动对象,支持ioc
cs
//自定义活动对象,支持ioc
internal class TestActivity : Activity
{
/// <summary>
/// 判断活动是否可以执行
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
protected override ValueTask<bool> CanExecuteAsync(ActivityExecutionContext context)
{
return ValueTask.FromResult(false);
//return base.CanExecuteAsync(context);
}
/// <summary>
/// 活动中执行的具体逻辑
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
protected override ValueTask ExecuteAsync(ActivityExecutionContext context)
{
Console.WriteLine("活动已执行!");
return base.ExecuteAsync(context);
}
自定义活动的方式: 1.直接实现接口 2.继承CodeActivity 3.继承Activity
cs
ServiceCollection services = new ServiceCollection();
services.AddElsa();
ServiceProvider serviceProvider = services.BuildServiceProvider();
//获取执行工作流的执行者
IWorkflowRunner runner = serviceProvider.GetRequiredService<IWorkflowRunner>();
//定义一个活动队列
Sequence workflow = new Sequence()
{
Activities = {
new TestActivity()
}
};
await runner.RunAsync(workflow);
六、文章总结
该篇为初学篇,适合初次接触Elsa工作流的同志们,后续会继续更新相关博客。以上是对Elsa的基础使用,了解以下Elsa的使用流程。一般来说这种审批场景我们会在后台服务中集成,这里我们集成到API即可。还有像现在的可视化的工作流,类似Coze等AI平台其实通过Elsa也可实现。