前言
第一版:博主在2008年工作时接手前同事基于微软WWF开发的工作流引擎,开发十余个国企、事业单位OA系统、ERP系统等
第二版:博主在2012年参与ccflow工作流引擎的二次开发、bug修复,曾是ccflow论坛超级版主,当时使用微软SelverLight技术(可惜被淘汰)。ccflow的老板周总也是咱前辈,目前开源ccflow工作流引擎仍在维护中,强烈推荐关注
第三版:博主在2014年应公司要求使用微软最新WWF自主研发第三版工作流引擎,配合AvalonJs + UEditor开发低代码平台,应用数十家国企、事业单位、计量单位
第四版:博主在2018年使用Microi吾码表单引擎驱动工作流引擎,采用.NET core + Vue完全自研第4代工作流引擎(由于微软WWF不支持.net core,因此自研)
吾码第四代工作流引擎优势
- 流程属性、节点属性均由表单引擎驱动,灵活性更强
- 具有丰富的前端事件、后端事件,满足复杂的业务需求
- 配合集成的前后端V8引擎,没有实现不了的复杂场景
- 流程引擎与业务表单解耦,可集成第三方表单、二次开发
- 流程设计器源码在Microi吾码个人版中完全开源(开源版/个人版/企业版区别:https://microi.net/microi-price)
- 目前已经在上百家客户中应用流程业务管理
预览图
流程引擎相关物理表说明
WF_FlowDesign:流程图设计表,一个流程图对应一条数据
WF_Node:流程节点属性表
WF_Line:流程条件(线)属性表
WF_Flow:流程实例表,发起一个流程,就会生成一条实例数据,一条实例数据对应WF_Work表N条工作数据
WF_Work:流程工作待办表,如发起一个流程实例,产生了3个待办,会写入3条WF_Work数据
WF_History:流程轨迹表,详细记录流程每一步、每个人的所有操作,如同意、拒绝、撤回等
节点属性
节点开始V8事件:会在表单提交前执行
if(V8.Form.Money > 1000){
V8.Tips('金额不能大于1000!', false);//前端提示
V8.Result= false;//阻止表单和流程提交
}
- 可访问的内置对象:
V8.WF.ApprovalType:用户点击的审批类型。可能的值:‘Auto’(发起流程(开始节点)/业务节点)、‘Agree’(同意)、‘Disagree’(拒绝)、‘Recall’(撤回)
V8.WF.ApprovalIdea:用户填写的审批意见
V8.WF.AddUsers:用户添加的审批人
V8.WF.SelectUsers:用户选择的审批人
V8.WF.CurrentFlowDesign:当前流程设计图实体
V8.WF.CurrentNode:当前节点实体
V8.WF.BackNodeId:如果用户点击的是拒绝,并且选择了退回到哪个节点,这就是那个节点Id
- 金额加1
V8.Form.Money = V8.Form.Money + 1;
- 强制指定下一节点审批人
V8.WF.ForceSelectUsers=[‘userid’];
- 这里可以还执行大部分V8内置函数,如同步接口请求等
节点开始V8服务器端事件
可使用V8.Result = { Code : 0, Msg : ‘阻止流程提交’ }; 进行回滚事务、阻止流程提交
条件判断V8:
在服务器端执行
//这里赋值LineValue就是条件属性设置的【条件值】
if(V8.Form.Money <= 100){
V8.LineValue = 1;
}else{
V8.LineValue = 2;
}
节点结束V8事件
- 分前端事件、后端事件
- 在表单和流程提交成功后执行
- 用法同【开始V8】
V8.WF.WorkResult:流程执行成功后返回的数据,如发送到了哪个节点、哪些审批人
V8.WF.NextNode:访问下一节点实体
V8.WF.NextTodoUsers:访问接收人,格式:[{Id:‘’,Name:‘’}]
撤回:
- A节点提交到B节点后,在B节点审批之前,A节点提交人可随时主动撤回到自己手上,重新编辑表单数据并重新提交。
- B节点审批后,A节点无法再撤回,但B节点可以在C节点审批之前撤回到自己B节点手上。
- A节点实再想撤回,只有找C节点拒绝并退回到A节点。
- 注意:撤回时,也会执行节点开始V8、结束V8。
- 将来也可以在流程属性中增加提交人可以随时任意撤回
我的待办
获取WF_Work表中,待我处理的工作。
我发起的
获取WF_Flow表中,我发起的流程实例。
我处理的
获取WF_Work表中,我处理过的工作。
之所以不从WF_Flow表中获取我处理的工作,是为了实现每个节点的字段权限控制,同时为了实现撤回功能。
抄送我的
获取WF_History表中,抄送过给我的工作。
之所以不从WF_Flow表中获取抄送过给我的工作,是为了实现每个节点的字段权限控制。
我相关的
获取WF_Work表中,我接收过的待办工作,但不是由我处理的工作。
所有实例
管理员权限,获取WF_Flow表中,所有人发起的所有流程实例(非工作)
相关截图
相关V8
//将某条数据打开Form表单并可以发起流程,第三个object参数若不传,即为查看流程
V8.OpenFormWF(V8.Form, 'Edit', {
//StartWork:发起流程,ViewWork:查看流程。当为ViewWork时,可以不传FlowDesignId
WorkType:'StartWork',
FlowDesignId:'',//流程图Id
});