# 工作流引擎 **Repository Path**: doublespring168/workflow-engine ## Basic Information - **Project Name**: 工作流引擎 - **Description**: 该流程引擎完全开源免费,致力于打造与平台组织架构无关、高扩展的工作流引擎。 通过自定义用户选择器和条件处理器实现既有业务的组织架构关联和审批过程处理。 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 73 - **Created**: 2022-01-24 - **Last Updated**: 2022-01-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 演示地址 http://81.71.14.205:8083/index.html#/workflow/list # 简介 该流程引擎完全开源免费,致力于打造与平台组织架构无关、高扩展的工作流引擎。 通过自定义用户选择器和条件处理器实现既有业务的组织架构关联和审批过程处理。 * 前台流程引擎用的是 https://gitee.com/xiaoka2017/easy-flow ,相关应用api需前往查看 ## 截图效果 ![输入图片说明](WorkFlowCore/image3.png) ![输入图片说明](WorkFlowCore/image2.png) ![输入图片说明](WorkFlowCore/image1.png) # 使用介绍 ## 编辑流程 ### 节点 * 开始/结束 节点 这两个节点是流程的起始和结束节点。每个流程都只能有一个开始节点 和 一个结束节点。 * 普通 节点 普通节点是流程主要的审批节点,在普通节点上指定审批的人员。人员可以多个,同时审批可以单个审核即到下一个节点或者等待所有人审批才跳到下一个节点。 点击节点即可对该节点进行配置。 ![输入图片说明](WorkFlowCore/image4.png) 一个节点可以指定不同、多个的用户选择条件,以根据实际情况选择不同的人员进行审批或者阅读(抄送) ![输入图片说明](WorkFlowCore/image6.png) ![输入图片说明](WorkFlowCore/image7.png) 节点还可以指定拒绝(驳回)节点,如果配置了拒绝节点,在进行拒绝操作时,会退回到指定的节点重新开始。 拒绝节点还可以配置条件,满足条件才会跳回指定节点,否则默认退回到来源。 ![输入图片说明](WorkFlowCore/image12.png) 用户选择器可以根据实际对接的业务系统具体的实现(详见开发介绍) * 会签节点 会签节点是一个特殊节点,在该节点之前有多个前置节点时,需要等待前置节点所有人员审批通过才可以继续,另外会签节点本身也是需要指定人员审批,跟普通节点一样。 * 节点审批人员等信息配置之后,需先点击节点编辑面板保存: ![输入图片说明](WorkFlowCore/image13.png) ### 线条 线条是连接节点的桥梁,而且节点应该是单向。一个节点可以指向多个目标节点,当线条配置有条件时,则会根据条件跳转,否则默认派发到所有指向节点。利用线条可以轻松实现派发或者判断(注意到我们没有判断节点,所有的判断由线条决定)。 鼠标放在节点的左侧图标,出现十字标记时,按住 鼠标拖动到目标节点方向鼠标即可实现连线 ![输入图片说明](WorkFlowCore/image20.png) 点击线条进行线条的名称和条件配置。 ![输入图片说明](WorkFlowCore/image5.png) 线条可以配置不同的条件解析器对流程、表单等进行数据解析判断是否符合流程。同样也可以通过自定义扩展实现复杂的判断逻辑(比如默认情况下表单是json,一般条件解析器可以简单的解析,若是数据是其它格式的数据,则需要自定义解析器来判读) * 与节点编辑一样,在配置好线条的名称和条件后,点击保存确认当前配置 * 最后点击右上角保存整个流程 ![输入图片说明](WorkFlowCore/image14.png) ## 流程模拟 流程模拟功能可以对配好的流程进行模拟审批,以判断流程的合理性以及人员和条件的解析是否正确,保证流程的通过性。 ![输入图片说明](WorkFlowCore/image8.png) ### 发起流程 选择一个发起人,并且配置相应的表单数据即可发起一个流程。 ![输入图片说明](WorkFlowCore/image10.png) ### 审批 通过选择审批人员可以模拟不同人的审批。也只有流程走到该人员才允许审批。 ![输入图片说明](WorkFlowCore/image9.png) 审批有普通的拒绝(驳回)与通过外,还有转发代办功能,可以转发给其他人办理。人员的选择 与节点的审批人员选择一致。 ![输入图片说明](WorkFlowCore/image11.png) ### 审批记录 此处显示模拟审批的操作记录,即审批记录。 ![输入图片说明](WorkFlowCore/image21.png) 对于审批过后的记录,可以有相应的“撤回”操作,撤回自己前一步操作。但是撤回也是有条件: 1.下一步审批人员未阅读时才能进行撤回, 2.已结束的流程无法撤回 3.间隔一个节点也无法撤回 除了框架默认实现的几个用户选择器和条件解析器外,还允许在实际使用中扩展贴合自身业务系统的选择器和解析器。这也是这个引擎的目标。 通过简单的实现相应的接口,即可将系统与现有的组织架构关联。 # 运行介绍 项目默认实现了 文件仓库 ef 仓储,在启动入口可以配置使用哪种数据实现(建议选择EF) ``` services.AddWorkFlowCoreFramework(options=> { options.OrmType = WorkFlowCoreFrameworkService.FrameworkConfigOrmType.EF; }); ``` ## 选择EF数据仓储实现 如果选择了EF的实现,通过简单操作即可进行数据表迁移: 1.设置 Host 为项目启动项 2.配置数据链接字符串 3.打开 程序包管理控制台 4.在控制台中选择 Framework 项目 5.在控制台执行 update-database 等待迁移 完成。 # 开发介绍 直接从git下载源码编译。 建议以分布式子系统或者微服务形式部署。 项目自带流程编辑器,以及 简单的流程模拟功能. ## 后台结构介绍 ![输入图片说明](https://images.gitee.com/uploads/images/2021/0409/152645_fc78f0e0_1547296.png "屏幕截图.png") ### WorkFlowCore 是整个引擎的核心,核心通过抽象,允许 部分功能通过外部扩展 ### WorkFlowCore.Framework 是抽象的其中一个扩展,默认实现了以json文件为持久化的仓储 Repository和两个事件处理demo ### WorkFlowCore.Host 是web服务的启动项目,在这里写接口代码 ### WorkFlowCore.Selector 是抽象的其中一个扩展,默认实现两个 用户选择器和条件处理器, ### WorkFlowCore.Test 单元测试 ## 需要自己实现的内容: ### Repository 框架默认实现的只是一个以json文件为持久化的仓储,实际使用应该实现自己的持久化程序,实现 IBasicRepository 接口,将程序注册到容器服务中。 ![输入图片说明](https://images.gitee.com/uploads/images/2021/0409/154857_7981d612_1547296.png "屏幕截图.png") ![输入图片说明](https://images.gitee.com/uploads/images/2021/0409/154911_3ce47eca_1547296.png "屏幕截图.png") ![输入图片说明](https://images.gitee.com/uploads/images/2021/0409/154927_a2942b2b_1547296.png "屏幕截图.png") ### 实现自己的用户选择器 不同项目的组织架构不同,这也是为什么要写这个框架,就是要把用户的选择从框架中抽取出来。 实现自定义用户选择器需要实现 IUserSelector 接口: GetSelections 方法返回用户的选项类型,可以返回一些类型(比如角色,职位等组织架构信息)也可以直接返回用户列表 GetUsers 方法是在流程审批过程中,结合流程的各项参数去解析获取实际的用户数据,这里返回的是根据条件匹配到的用户列表。 ![输入图片说明](https://images.gitee.com/uploads/images/2021/0409/155650_8abf820b_1547296.png "屏幕截图.png") 自己实现的选择器需要注册到容器服务中 ![输入图片说明](https://images.gitee.com/uploads/images/2021/0409/160736_83cb6b12_1547296.png "屏幕截图.png") ### 实现自己的条件处理器 一般的条件处理使用默认的条件处理可以完成,但是需要复杂的条件处理就需要自定义实现。比如需要根据表单中某个值去获取其它信息进行判断,就需要自己解析。 具体解析要看表单数据格式,具体问题具体分析。 要自定义 条件处理器 需要实现 ICondition 接口,该接口只有一个方法 CanAccept,结合流程数据判断某个路径是否能走。 ![输入图片说明](https://images.gitee.com/uploads/images/2021/0409/160556_96bd8d01_1547296.png "屏幕截图.png") 注册选择器到容器服务中 ![输入图片说明](https://images.gitee.com/uploads/images/2021/0409/160732_99b5eea7_1547296.png "屏幕截图.png") ### 事件扩展 目前系统提供 流程推送事件和流程结束事件,需要实现更多扩展功能比如通知处理流程,流程结束后推送消息之类的需求,需要自己实现 ISendTaskEventHandler 和 ITaskFinishedEventHandler 实现的事件扩展需要注册到服务中 ![输入图片说明](https://images.gitee.com/uploads/images/2021/0409/160811_9b5965a3_1547296.png "屏幕截图.png") ## 分布式应用场景下的使用 当前流程引擎有自己完整的一套工作方式,并不适合进行拆解融合到其它系统,最适合的方式就是以分布式的方式进行部署。通过分布式部署的情况下,与业务系统的对接则通过接口进行。 一般情况下,业务系统表单自己维护一个审批状态,业务系统通过调用流程系统接口发起一个审批。 流程系统成功新建一个流程后,将发起一个审批开始的事件,通过订阅该事件进行回调更新业务表单的审批状态。 其它的诸如新建流程设计、流程审批记录等,可通过接口查询,或者自行实现相应的查询接口。