一、新建项目:ElsaFlowDemo

<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><OutputType>Exe</OutputType><TargetFramework>netcoreapp3.1</TargetFramework></PropertyGroup><ItemGroup><ProjectReference Include="..\..\..\..\项目\OpenSourceProject\elsa-core-1.2.2\src\activities\Elsa.Activities.Console\Elsa.Activities.Console.csproj" /><ProjectReference Include="..\..\..\..\项目\OpenSourceProject\elsa-core-1.2.2\src\activities\Elsa.Activities.Http\Elsa.Activities.Http.csproj" /><ProjectReference Include="..\..\..\..\项目\OpenSourceProject\elsa-core-1.2.2\src\activities\Elsa.Activities.Workflows\Elsa.Activities.Workflows.csproj" /><ProjectReference Include="..\..\..\..\项目\OpenSourceProject\elsa-core-1.2.2\src\core\Elsa\Elsa.csproj" /><ProjectReference Include="..\..\..\..\项目\OpenSourceProject\elsa-core-1.2.2\src\persistence\Elsa.Persistence.EntityFrameworkCore\Elsa.Persistence.EntityFrameworkCore.csproj" /></ItemGroup></Project>

Program.cs

using Elsa;
using Elsa.Activities;
using Elsa.Activities.Console;
using Elsa.Activities.Console.Activities;
using Elsa.Activities.Console.Extensions;
using Elsa.Activities.ControlFlow.Activities;
using Elsa.Activities.UserTask.Activities;
using Elsa.Activities.Workflows.Activities;
using Elsa.Expressions;
using Elsa.Extensions;
using Elsa.Models;
using Elsa.Persistence;
using Elsa.Persistence.EntityFrameworkCore.DbContexts;
using Elsa.Persistence.EntityFrameworkCore.Extensions;
using Elsa.Scripting.JavaScript;
using Elsa.Scripting.Liquid;
using Elsa.Services;
using Elsa.Services.Extensions;
using Elsa.Services.Models;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;namespace ElsaFlowDemo
{internal class Program{//Data Source=192.168.31.132;Initial Catalog=elsa;Persist Security Info=True;User ID=sa;Password=SQLOnLinux132"static async Task Main(string[] args){var services = BuildServices();using var scope = services.CreateScope();var dbContext = scope.ServiceProvider.GetRequiredService<ElsaContext>();// Ensure DB exists.await dbContext.Database.EnsureCreatedAsync();// Create a workflow definition.var registry = services.GetService<IWorkflowRegistry>();var workflowDefinition = await registry.GetWorkflowDefinitionAsync<HelloWorldWorkflow>();// Mark this definition as the "latest" version.//workflowDefinition.IsLatest = true;workflowDefinition.Version = 1;// Persist the workflow definition.var definitionStore = scope.ServiceProvider.GetRequiredService<IWorkflowDefinitionStore>();await definitionStore.SaveAsync(workflowDefinition);// Flush to DB.await dbContext.SaveChangesAsync();// Load the workflow definition.workflowDefinition = await definitionStore.GetByIdAsync(workflowDefinition.DefinitionId,VersionOptions.SpecificVersion(1));//VersionOptions.Latest// Execute the workflow.var invoker = scope.ServiceProvider.GetRequiredService<IWorkflowInvoker>();var correlationId = Guid.NewGuid().ToString("N");var executionContext = await invoker.StartAsync(workflowDefinition, new Variables() { ["Operator"] = new Variable("zhangshan") }, correlationId: correlationId);// Persist the workflow instance.var instanceStore = scope.ServiceProvider.GetRequiredService<IWorkflowInstanceStore>();var workflowInstance = executionContext.Workflow.ToInstance();await instanceStore.SaveAsync(workflowInstance);// Flush to DB.await dbContext.SaveChangesAsync();//一级审批Console.WriteLine("What action will you take? Choose one of: Approve, Reject, Needs Work");var userAction = "Approve";var instance = await instanceStore.GetByCorrelationIdAsync(correlationId);var input = new Variables { ["Signal"] = new Variable(userAction), ["Operator"] = new Variable("zhangshan") };WorkflowExecutionContext workflowContext = null;if (instance.Status == WorkflowStatus.Faulted && instance.Fault != null){workflowContext = await invoker.ResumeAsync(instance, input, startActivityIds: new string[] { instance.Fault.FaultedActivityId });}workflowContext = (await invoker.TriggerAsync(nameof(Signaled), input, correlationId: correlationId)).FirstOrDefault();//查询指定实例当前的活动instance = await instanceStore.GetByCorrelationIdAsync(correlationId);if (!(instance.Status == WorkflowStatus.Aborted || instance.Status == WorkflowStatus.Finished || !instance.Scopes.Any(s => s.Variables.Any()))){var scopes = instance.Scopes.ToList();var variables = instance.Scopes.LastOrDefault().Variables;var variable = variables.Skip(variables.Count - 1).Take(1).FirstOrDefault();var v = variable.Value.Value.ToString();}//查询指定实例审批等级及审批人instance = await instanceStore.GetByCorrelationIdAsync(correlationId);if (instance.Scopes.Any(s => s.Variables.Any())){var scopes = instance.Scopes.ToList();var variables = instance.Scopes.LastOrDefault().Variables;var v = variables["Approvers"].Value.ToString();}//二级审批(拒绝)Console.WriteLine("What action will you take? Choose one of: Approve, Reject, Needs Work");userAction = "Reject";instance = await instanceStore.GetByCorrelationIdAsync(correlationId);input = new Variables { ["Signal"] = new Variable(userAction), ["Operator"] = new Variable("zhangshan") };if (instance.Status == WorkflowStatus.Faulted && instance.Fault != null){workflowContext = await invoker.ResumeAsync(instance, input, startActivityIds: new string[] { instance.Fault.FaultedActivityId });}workflowContext = (await invoker.TriggerAsync(nameof(Signaled), input, correlationId: correlationId)).FirstOrDefault();//从暂停的位置开始userAction = "Approve";input = new Variables { ["Signal"] = new Variable(userAction), ["Operator"] = new Variable("zhangshan") };instance = await instanceStore.GetByCorrelationIdAsync(correlationId);workflowContext = (await invoker.TriggerAsync(nameof(Signaled), input, correlationId: correlationId)).FirstOrDefault();}private static IServiceProvider BuildServices(){return new ServiceCollection().AddElsa(x => x.AddEntityFrameworkStores<SqlServerContext>(options => options.UseSqlServer(@"Data Source=192.168.31.132;Initial Catalog=elsa;Persist Security Info=True;User ID=sa;Password=SQLOnLinux132"))).AddConsoleActivities().AddWorkflow<HelloWorldWorkflow>().AddActivity<DemoActivity>().AddActivity<DemoLegalActivity>().BuildServiceProvider();}}public class HelloWorldWorkflow : IWorkflow{private void SetCurrentApprovers(DemoActivity demoActivity, List<string> approvers){demoActivity.Approvers = approvers;demoActivity.CurrentApprover = new LiquidExpression<string>("{{Input.Operator}}");}private void SetCurrentApprovers(DemoLegalActivity demoActivity, List<string> approvers){demoActivity.Approvers = approvers;demoActivity.CurrentApprover = new LiquidExpression<string>("{{Input.Operator}}");}private List<string> GetApprovers(){return new List<string> { "王五" };}public void Build(IWorkflowBuilder builder){builder.StartWith<WriteLine>(activity => activity.TextExpression = new LiteralExpression("Hello Worlduuuu!")).Then<SetVariable>(p => { p.VariableName = "name"; p.ValueExpression = new LiteralExpression<string>("李四"); }).Then<SetVariable>(x =>{x.VariableName = "Approvers";var approvers = new Dictionary<string, List<string>>() { { "一级", new List<string> { "a001员工" } }, { "二级", new List<string> { "a001员工" } } };x.ValueExpression = new LiteralExpression<string>(Newtonsoft.Json.JsonConvert.SerializeObject(approvers));}).Then<DemoActivity>(x => SetCurrentApprovers(x, GetApprovers()))//一级审批.Then<Fork>(x => { x.Branches = new[] { "Approve", "Reject" }; }, fork =>{fork.When($"Approve").Then<Signaled>(x => x.Signal = new LiteralExpression("Approve")).Then<WriteLine>(activity => activity.TextExpression = new LiteralExpression("一级审批Great! Your work has been accepted.")).Then($"Join_0001");fork.When($"Reject").Then<Signaled>(x => x.Signal = new LiteralExpression("Reject")).Then<WriteLine>(activity => activity.TextExpression = new LiteralExpression("一级审批Sorry! Your work has been rejected.")).Then($"Join_0001");}).Then<Join>(x => x.Mode = Join.JoinMode.WaitAny).WithName($"Join_0001").Then<SetVariable>(x =>{x.VariableName = $"Approved_v0001";x.ValueExpression = new JavaScriptExpression<object>("input('Signal') === 'Approve'");}).Then<IfElse>(x => x.ConditionExpression = new JavaScriptExpression<bool>($"!!Approved_v0001"),ifElse =>{ifElse.When(OutcomeNames.True).Then<WriteLine>(activity => activity.TextExpression = new LiteralExpression("一级审批OutcomeNames.True")).Then($"Approvel_0001");ifElse.When(OutcomeNames.False).Then<WriteLine>(activity => activity.TextExpression = new LiteralExpression("一级审批OutcomeNames.False")).Then($"Approvel_0001");}).Then<Join>(x => x.Mode = Join.JoinMode.WaitAny).WithName($"Approvel_0001")//二级审批.Then<DemoActivity>(x => SetCurrentApprovers(x, GetApprovers())).Then<Fork>(x => { x.Branches = new[] { "Approve", "Reject" }; }, fork =>{fork.When($"Approve").Then<Signaled>(x => x.Signal = new LiteralExpression("Approve")).Then<WriteLine>(activity => activity.TextExpression = new LiteralExpression("二级审批Great! Your work has been accepted.")).Then($"Join_0002");fork.When($"Reject").Then<Signaled>(x => x.Signal = new LiteralExpression("Reject")).Then<WriteLine>(activity => activity.TextExpression = new LiteralExpression("二级审批Sorry! Your work has been rejected.")).Then<DemoLegalActivity>(x => SetCurrentApprovers(x, GetApprovers()))//校验.Then($"Join_0002");}).Then<Join>(x => x.Mode = Join.JoinMode.WaitAny).WithName($"Join_0002").Then<SetVariable>(x =>{x.VariableName = $"Approved_v0002";x.ValueExpression = new JavaScriptExpression<object>("input('Signal') === 'Approve'");}).Then<IfElse>(x => x.ConditionExpression = new JavaScriptExpression<bool>($"!!Approved_v0002"),ifElse =>{ifElse.When(OutcomeNames.True).Then<WriteLine>(activity => activity.TextExpression = new LiteralExpression("二级审批OutcomeNames.True")).Then($"Approvel_0002");ifElse.When(OutcomeNames.False).Then<WriteLine>(activity => activity.TextExpression = new LiteralExpression("二级审批OutcomeNames.False"));//.Then($"Approvel_0002");}).Then<Join>(x => x.Mode = Join.JoinMode.WaitAny).WithName($"Approvel_0002").Then<WriteLine>(activity => activity.TextExpression = new LiteralExpression("Workflow finished."));}}
}

DemoLegalActivity.cs

using Elsa;
using Elsa.Attributes;
using Elsa.Expressions;
using Elsa.Results;
using Elsa.Services;
using Elsa.Services.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;namespace ElsaFlowDemo
{/// <summary>/// 校验./// </summary>[ActivityDefinition(Category = "Workflow",Description = "校验.",Type = "",Outcomes = new[] { OutcomeNames.Done })]public class DemoLegalActivity : Activity{[ActivityProperty(Hint = "合法操作人.")]public List<string> Approvers{get => GetState<List<string>>();set => SetState(value);}[ActivityProperty(Hint = "当前操作人.")]public WorkflowExpression<string> CurrentApprover{get => GetState(() => LiteralEvaluator.Expression<string>(null));set => SetState(value);}protected override async Task<ActivityExecutionResult> OnExecuteAsync(WorkflowExecutionContext workflowContext, CancellationToken cancellationToken){var employeeId = await workflowContext.EvaluateAsync(CurrentApprover, cancellationToken);if (Approvers != null && !Approvers.Any(a => a == employeeId)){var conn = workflowContext.Workflow.Connections.FirstOrDefault(c => c.Target.Activity.Id == workflowContext.CurrentActivity.Id);await conn.Source.Activity.ResumeAsync(workflowContext);workflowContext.Halt(conn.Source.Activity);return Halt();}if (workflowContext.Workflow.Status == Elsa.Models.WorkflowStatus.Faulted) workflowContext.Start();return Done();}}
}

DemoActivity.cs

using Elsa;
using Elsa.Attributes;
using Elsa.Expressions;
using Elsa.Results;
using Elsa.Services;
using Elsa.Services.Models;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Threading.Tasks;namespace ElsaFlowDemo
{[ActivityDefinition(Category = "Workflow",Description = "DemoActivity",Type = "",Outcomes = new[] { OutcomeNames.Done })]public class DemoActivity : Activity{public DemoActivity(){}[ActivityProperty(Hint = "审核操作人.")]public List<string> Approvers{get => GetState<List<string>>();set => SetState(value);}[ActivityProperty(Hint = "当前操作人.")]public WorkflowExpression<string> CurrentApprover{get => GetState(() => LiteralEvaluator.Expression<string>(null));set => SetState(value);}protected override async Task<ActivityExecutionResult> OnExecuteAsync(WorkflowExecutionContext workflowContext, CancellationToken cancellationToken){var empl= await workflowContext.EvaluateAsync(CurrentApprover, cancellationToken);return Done();}}
}

数据库:

delete from [dbo].ActivityDefinitions
delete from [dbo].ActivityInstances
delete from [dbo].BlockingActivities
delete from [dbo].ConnectionDefinitions
delete from [dbo].WorkflowDefinitionVersions
delete from [dbo].WorkflowInstancesselect * from [dbo].ActivityDefinitions
select * from [dbo].ActivityInstances
select * from [dbo].BlockingActivities
select * from [dbo].ConnectionDefinitions
select * from [dbo].WorkflowDefinitionVersions
select * from [dbo].WorkflowInstances

运行效果:

Elsa-审批流实现相关推荐

  1. SAP实施项目中采购员在非生产性采购申请审批流中的角色安排

    SAP实施项目中采购员在非生产性采购申请审批流中的角色安排 所谓非生产性物料,也叫间接物料,也有些企业称之为MRO物料.它主要包括而不限于如下物料:办公用品,劳保用品,备品备件,服务,固定资产等等.这 ...

  2. SVN工具的使用 和在Eclipse中安装GPD插件:(多步审批流,因此选择使用工作流(JBPM)来实现)...

    前言 重点解说SVN工具的还原版本号. 1.提交svn之前.要先更新文件.假设更新之后有版本号冲突的话.就线下解决掉冲突,在把该文件标记为已经解决冲突. 正文 使用SVN还原历史版本号 去除掉Ecli ...

  3. Asp.net生成工作流、审批流的解决方案(asp.net workflow svg)

    公司的上一个项目需要自定义工作流和审批流,那就需要一个可视化的定义工作流和审批流的工具,找了很多都不太适合我们的项目,项目是用Asp.net开发,需要在网页里实现工作流的自定义,说白了就是写一个程序, ...

  4. activiti 工作流设置并行审批_activity、jbpm5、snakerflow常用工作流审批流对比

    # 审批流调研 背景 由于目前产品研发组支持的产品项目越来越多, 同时几乎每个项目都会有导出审批,流程流转等需求,本着提高开发效率和组件化的目的,调研和开发通用的工作流组件,为后面的项目和新的需求提供 ...

  5. java 审批流_一文读懂工作流

    网上关于工作流引擎有比较多的简介,也有很多工作流的实际应用场景.本文结合笔者多年对工作流的经验来阐述一下对工作流的理解. 一.什么是工作流? 先贴上wiki百科对于工作流的定义 工作流(Workflo ...

  6. 只能是做的HTML5审批流项目

    这其实不叫工作流系统,更不能算是工作流产品了,只能是做的HTML5审批流项目.一个工作流软件产品,是能适用到各个行业,并且流程引擎的模型设计很健壮,利用流程引擎的模型能设计出各式各样的业务流程.飞鸽传 ...

  7. Asp.net生成工作流、审批流的解决方案

    Asp.net生成工作流.审批流的解决方案(asp.net workflow svg) 公司的上一个项目需要自定义工作流和审批流,那就需要一个可视化的定义工作流和审批流的工具,找了很多都不太适合我们的 ...

  8. 141_Power Query之获取钉钉审批流自动刷新Power BI报告

    博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 一.背景 钉钉办公给很多企业带来了很多方便,比如审批流线上化,通用化.线上化填写后,数据自动获取又是一个硬伤了,虽然数据可 ...

  9. python 审批流_Odoo 基于企业微信实现的通用审批流功能的自助配置及使用说明 - Oejia 技术栈,企业方案分享、Odoo顾问...

    ### 概述 以下为基于企业微信自建应用审批流程引擎实现的Odoo通用审批功能,基于企业微信官方审批应用实现的Odoo通用审批功能请移步到 http://oejia.net/blog/2020/05/ ...

  10. Dynamic CRM 2013学习笔记(三十三)自定义审批流4 - 规则节点 -有分支的流程处理...

    上次介绍过节点的基本配置<Dynamic CRM 2013学习笔记(三十二)自定义审批流3 - 节点及实体配置>,这次介绍下规则节点,因为有时流程里会有一些分支.合并,这时就要用到规则节点 ...

最新文章

  1. java聊天程序步骤解析_java网络之基于UDP的聊天程序示例解析
  2. 微信小程序模板消息(服务通知消息)原始post工具封装(不使用jar包--坑比较多),解决47001(JSON格式)和中文乱码问题
  3. (原創) 如何利用copy() algorithm將array輸出到cout? (C/C++) (STL)
  4. 从Java视角理解CPU上下文切换(Context Switch)
  5. 白话设计模式——Builder
  6. 云计算数据管理的4个关键因素
  7. fjblog佛教博客不错
  8. devops 文化_DevOps之外的无责文化示例
  9. 虚拟化不会增加安全复杂性
  10. 电子测量与仪器第四版pdf_电子技术经典资料汇总:模电篇800M
  11. vscode中控制台不能输入_vscode控制台不能输入怎么办
  12. Part2--排序算法类模板
  13. redis之列表字典操作
  14. win10与手机局域网内快速传输文件(免安装软件)
  15. vue 实现点击图片放大
  16. 洛谷 P4093 [HEOI2016/TJOI2016]序列(Cdq+dp)
  17. CSP2019滚粗记
  18. July:海量数据处理
  19. 2020-11-23抖音网络营销
  20. ChatGpt - 基于人工智能检索进行论文写作

热门文章

  1. halcon学习-算子学习
  2. EXCEL/WPS中的数组公式{},在钉钉用什么进行替代
  3. 第八周、第九周学习总结
  4. 模拟购物车系统(添加、修改、查询、结算)(Java实现)
  5. 如何在word中像LaTex那样打公式
  6. 使用Python进行Android自动化测试
  7. 24券的“天才”创始人如何打坏一手好牌(转载)
  8. 17家IT初创公司失败史
  9. 计算机网络经典面试题:在浏览器中输入URL并按下回车后会发生什么?
  10. c语言中int转string,C++中int型与string型互相转换