首页 > 代码库 > [开源]起步,这只是一个开始。开源Qoss Flow Engine项目pre-alpha版本
[开源]起步,这只是一个开始。开源Qoss Flow Engine项目pre-alpha版本
迈开的第一步,至少证明已然开始。
这还只是以个pre-alpha的版本,意味着,它目前就根本没有多少功能,它也许只还有那一点点尚未搭建完成的骨头架子,但它会慢慢成长。
…..
哈哈,废话真多。步入正题吧。
1. Qoss Flow Engine是什么?
Qoss其实它的定位是一个开源的BPM(Business Process Management,业务流程管理) ,现在说它是个BPM,就说大了,其实,它现在就还只是个控制流程流转的类库而已。在一个BPM系统中需要很多完善的功能,而它目前根本没有实现。
对Qoss的期望是一个完整的BPM系统,它的alpha版应该包含的功能应该有:
表单引擎流程引擎流程设计引擎
而现在Qoss Flow Engine项目,将是BPM中流程引擎的pre-alpha版本。
2 、希望Qoss Flow Engine能做什么
总的来说,引擎主要关注四个方面的问题:
(1) 流程定义问题:不是说如何图形化的定义流程,而是如何用一套定义对象,来诠释所定义的流程。
(2) 流程调度问题:提供什么的机制,可以确保流程能够处理复杂的“流程图结构”,诸如串行、并行、分支、聚合等等,并在这复杂结构中确保流程从一个节点运行到另一个节点。
(3) 流程执行问题:当流程运行到某个节点的时候,需要一套机制来解决:是否执行此节点,并如何执行此节点的问题,并维持节点状态生命周期。
(4) 流程实例对象:需要一整套流程实例对象来描述流程实例运行的状态和结果。
3、Qoss Flow Engine 做了什么
1、 能够通过xml文件描述一个复杂的业务流程,是开发人员能够轻松快捷的配置复杂流程[在bpm系统中通过可视化的流程设计引擎设置生成xml文件]。
2、 提供了可扩展的Event-Action机制,来辅助扩展处理流程流转控制
3、 提供了灵活的条件表达式机制,来辅助条件解析、脚本计算的处理。
4、 节点的类型和扩展,可以通过定义自己的Node节点对象,来补充节点对象,满足流程对业务逻辑的控制需求
4、 Qoss Flow Engine 目前能做什么?
1、 流程的定义流转,支持普通节点(多任务单人处理),多任务并行
2、 灵活的条件判断,允许配置与表单数据相关的流转条件
<nextNode> <code>OPLeaderApproval</code> <condition> <key>MutilExecutor</key> <expression>{Monney}>99999 && {opiniontype}=1</expression> </condition> </nextNode>
<plugin> <key>Notice</key> <config>{Roles:"role1,role2",Users:"user1,user2"}</config> </plugin>
4、插件式任务适配器模式,允许自定义任务的实现
5、Qoss Flow Engine 怎么用
对于pre-alpha版本而言,如何用还不是重点,更何况它现在都还没有一个完整的运行环境(当然,我自己搭了一套集成环境,包括用户组织机构,授权等应用)。
在发布pre-alpha版本中,已经可以实现以下图表中的流程实现了,当然了只有流程引擎部分的实现。
由于目前测试程序的代码依托于商业项目的基础环境,因此暂时不能发布测试项目的代码给大家。
这里简单的给出项目中关于流程引擎的调用代码,在下一篇的博文中将详细介绍如何用pre-alpha版本实现上述流程的流转,同时也将整理出Qoss Flow Engine的源代码提供大家下载。
IFlowEngine flowEngine = FlowFactory.GetFlowEngine(); //new FlowEngine(); var currentUser = new UserWrapper() { Account = "administrator", MainOrg = "Org", Name = "超级管理员", Orgs = new List<string>(){ "Org1","Org2" }, Posts = new List<string>(){ "administrator", "admin"}, Roles = new List<string>(){"administrator","admin"}, UnitCode = "Qoss.BPM"}; FormDataDictionary formData = new FormDataDictionary(); formData.Add("Title", "here is the title"); var instance = flowEngine.CreateInstance("TestFlow", currentUser, formData); //启动流程并流转至下一个节点 //这一系列操作均是在用户提交数据后处理 instance.Start(currentUser, formData); //获取下个节点 var nextNodeList = instance.GetNextNodes(); var node = nextNodeList.FirstOrDefault(); instance.ProcessNext(new ProcessInfo() { NextNode = node, Operator = new List<UserWrapper>() { currentUser } }); Assert.AreEqual(instance.Context.TransferInfo.CurrentNodeCode,node.Code); //由于web应用此步骤是分开的 //context上下文是需要重新获取的 //对于客户端能保持的数据有: //任务Id,flowCode,当前用户,实例id(instanceid) var taskId = "Node1"; var newContext = flowEngine.GetInstance(taskId, currentUser, formData); nextNodeList = newContext.GetNextNodes(); node = nextNodeList.FirstOrDefault(); newContext.ProcessNext(new ProcessInfo() { NextNode = node, Operator = new List<UserWrapper>() { currentUser } }); Assert.AreEqual(newContext.Context.TransferInfo.CurrentNodeCode , "Node2");