我们知道企业业务系统到处都可以审批工作流的,但也很少有像OA系统一样复杂多级多条件的审批工作流需要设计,所以我们需要一个轻量级的容易上手的workflow框架,通过GitHub,我发现danielgerlag/workflow-core 就非常合适,我下面我通过自己的一个开源项目利用Workflow core开发了一个文档审批工作流的原型,也算是我开源项目中的一个重要模块

什么是Workflow Core

Workflow Core is a light weight embeddable workflow engine targeting .NET Standard. Think: long running processes with multiple tasks that need to track state. It supports pluggable persistence and concurrency providers to allow for multi-node clusters.

这里我简单的说一下我对工作流的理解,一开始对工作流的映像就是审批工作流,一级批完二级,三级流转的审批,中间还有一些判断,比如金额>多少给什么批,而这些金额,判断逻辑最好是可配置化的,配置最好是图形化的,想怎么配都可以。但实际情况似乎并不能用简单的方式实现上述的功能,当然有类似的成熟的工作流引擎可以做到比如国内的泛微OA,还有一个开源的Elsa,而我想要的还是最简单的最快速,能满足一些简单的业务场景就可以了。 让我们开始吧。

新建一个审批工作流

业务场景:

A用户(neozhu@126.com)上传附件,发起一个新的workflow给B用户(new163@163.com)审批,如果5分钟内没有审批则系统自动取消该审批请求。

这里发起新的请求需要触发发邮件通知B用户有新的审批请求,B审批完成,需要发邮件通知A审批结果。

定义一个Workflow

参考上面的业务场景用代码来定义一个workflow的框架



分5个步骤

  1. InitialStep 初始化 发邮件通知审批人有新的请求
  2. UserTask 等待接收审批结果
  3. ApprovedStep 审批通过 发邮件通知申请人审批通过
  4. RejectedStep 被拒绝 发邮件通知申请人已被拒绝
  5. CancelStep 审批超时 发邮件通知申请超时被取消

InitialStep 定义

重点:initialStep 发邮件的内容是从外部输入的,因此这里的Input方法就是说明step是怎么接收输入参数的,Output表示输出把这个step执行的结果输出到外部

每一个Step就相当于是一个独立的执行单元,参数和结果的输入/输出,全靠input/output两个方法。

UserTask / WithOption 这是 HumanWorkflow 扩展的方法用户接收外部事件,这里就是人工提交审批结果

ApprovedStep 发邮件通知申请人

RejectedStep / CancelStep 功能和ApprovedStep 一致

运行看一下效果

当用户上传新的文件,就会开启一个新workflow,审批人会收到邮件通知.



因为超时流程已经结束



OK,一个简单的workflow就完成。

最后

如果你有什么问题可以留言告诉我

源代码库和测试环境

Github

关于这个项目详细介绍一个遵循CleanArchitecture原则的Asp.net core轻量级开源项目)

RazorPageCleanArchitecture

Demo

喜欢这个开源项目请给的星星,谢谢

Workflow Core + asp.net core 5.0 实现简单审批工作流的更多相关文章

  1. .NET Core & ASP.NET Core 1.0在Redhat峰会上正式发布

    众所周知,Red Hat和微软正在努力使.NET Core成为Red Hat企业版Linux (RHEL)系统上的一流开发平台选项.这个团队已经一起工作好几个月了,RHEL对.NET有许多需求.今天在 ...

  2. .NET Core & ASP.NET Core 1.0

    .NET Core & ASP.NET Core 1.0在Redhat峰会上正式发布 众所周知,Red Hat和微软正在努力使.NET Core成为Red Hat企业版Linux (RHEL) ...

  3. Do You Kown Asp.Net Core -- Asp.Net Core 2.0 未来web开发新趋势 Razor Page

    Razor Page介绍 前言 上周期待已久的Asp.Net Core 2.0提前发布了,一下子Net圈热闹了起来,2.0带来了很多新的特性和新的功能,其中Razor Page引起我的关注,作为web ...

  4. ASP.NET Core 配置 Entity Framework Core - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 配置 Entity Framework Core - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 配置 Entity Fram ...

  5. .NET Core ASP.NET Core Basic 1-2 控制反转与依赖注入

    .NET Core ASP.NET Core Basic 1-2 本节内容为控制反转与依赖注入 简介 控制反转IOC 这个内容事实上在我们的C#高级篇就已经有所讲解,控制反转是一种设计模式,你可以这样 ...

  6. [.NET Core]ASP.NET Core中如何解决接收表单时的不支持的媒体类型(HTTP 415 Unsupported Media Type)错误呢?

    [.NET Core]ASP.NET Core中如何解决接收表单时的不支持的媒体类型(HTTP 415 Unsupported Media Type)错误呢? 在ASP.NET Core应用程序中,接 ...

  7. [译]初识.NET Core & ASP.NET Core

    原文:点这 本文的源代码在此: ASP.NET From Scratch Sample on GitHub 你过你是.NET Core的入门者,你可以先看看下面这篇文章: ASP.NET and .N ...

  8. ASP.NET Core - ASP.NET Core MVC 的功能划分

    概述 大型 Web 应用比小型 Web 应用需要更好的组织.在大型应用中,ASP.NET MVC(和 Core MVC)所用的默认组织结构开始成为你的负累.你可以使用两种简单的技术来更新组织方法并及时 ...

  9. 比较ASP.NET和ASP.NET Core[经典 Asp.Net v和 Asp.Net Core (Asp.Net Core MVC)]

    ASP.NET Core是.与.Net Core FrameWork一起发布的ASP.NET 新版本,最初被称为ASP.NET vNext,有一系列的命名变化,ASP.NET 5.0,ASP.NET ...

随机推荐

  1. Windows环境安装kafka

    前言 注意事项: 需要有jdk,jdk8以上.配置好环境变量. 参看链接:https://blog.csdn.net/weixin_38004638/article/details/91893910 ...

  2. 将base64Url对应图片保存到本地

    上图中的内容就是base64编码之后对应的Url  图中base64,之前的都是用于声明该图片的格式以及它的编码格式  base64,之后的就是该图片对应的数据了 我们只需要把数据转换为字节保存下来即 ...

  3. python里面的==,is的区别

    python中对象的三个要素:id(身份标示),type(数据类型).value(值) ==  比较操作符:用来比较两个对象值是否相等. is  同一性运算符:比较两个对象的id值是否相等,即是否是同 ...

  4. odoo里面条件写法

    attrs="{'invisible': ['|', ('probability', '>', 0), ('active', '=', True)]}"/>. 写法gt ...

  5. Java 正则表达式 简单用法

    正则表达式的具体写法网上有很多了,这里只记录在 Java 中怎么使用. java.util.regex.Matcher.java.util.regex.Pattern 主要有: String.matc ...

  6. Python实用案例,Python脚本,Python实现文件自动归类

    前言: 今天我们就利用Python脚本实现文件自动归类吧.直接开整~ 预备知识 这个脚本实现比较简单,我把涉及的知识点列了出来. 1.相对路径.绝对路径,绝对路径就是最完整的路径. 'D:/code/ ...

  7. anyRTC SDK 5月迭代:优化自定义加密功能,让通信更安全

    anyRTC SDK 5月上新,新增多种加密类型,让实时音视频通信更安全:新增移动端推流支持1080P分辨率的支持:此外还对事件上报.日志详情.数据统计.网络传输等多项功能进行了优化改进. 以下为更新 ...

  8. Mybatis学习笔记-分页

    为何要分页 减少数据处理量 便于前端展示数据 使用Limit分页 语法结构 SELECT * FROM user LIMIT startIndex,pageSize; SELECT * FROM us ...

  9. C++ 封装类 2 设计一个学生类 属性有姓名学号 可以给姓名 和学号赋值 可以显示学生的姓名和学号

    1 //设计一个学生类 属性有姓名学号 可以给姓名 和学号赋值 可以显示学生的姓名和学号 2 #include <iostream> 3 #include<string> 4 ...

  10. asp .net core中swagger的简单使用

    相信swagger大家不太陌生,简单来说就是把web api接口以ui的形式呈现到页面上,供方便调用和展示.这边文章就带大家初步简单使用swagger. (1)首先需要安装包:Swashbuckle. ...