WF工作流详细设计
本设计依据是WFMC(工作流管理联盟)规范和图论中的有向图理论;基于的技术是DOTNET MVC架构和Windows Workflow Foundation(WWF)工作流设计平台。
该节主要包括以下内容:实现技术与实现方案、工作流设计器、工作流调用服务(封装类、WFLocalService和WFWebService)、工作流分类、工作调用、工作流监控、页面流和工作流权限等
实现技术与实现方案
实现技术
WF(windows workflow foundation) 微软工作流组件,一个工作流是一个人类或系统活动的模型,该模型被定义为一组活动的地图。工作流通过拖放活动组件来设计,被编译为.Net程序集,然后在工作流运行时和.Net CLR中执行。
Activity:工作流组件中活动组件,一个活动是工作流中的一个步骤,是工作流中执行、重用、复合的基本单元,活动组件下包含事件组件(Event),接收外部事件组件(HandleExternalEvent),调用外部方法组件(CallExternalModthod)等。
本地服务组件:local service,规定业务与工作流组件交互的事件和方法接口,实现业务与工作流的交互,用于工作流活动组件调用。
系统工作流引擎采用微软WF,WF使用户可以直观地设计复杂的算法,从而解决业务问题并为业务建模,它为开发和执行基于复杂过程的多种应用程序提供了框架。如果用户具备由各活动(Activity)组成的基于工作流的系统(如 Windows Workflow Foundation),则可利用命令性代码和声明性活动地图的强大组合以及绑定它们的声明性规则来实现应用程序。主要好处在于用户可以为解决方案建模(甚至以直观方式建模),将 Windows Workflow 嵌入运行时服务器来解释图表,并使 Windows Workflow 遵循在创建块中定义的链接。进程越复杂,为其设计和实现的流程就越简单。进程动态更改越容易,用户需要编写和维护的代码数量就越少。WF运行时为工作流程序提供了托管执行环境,还为程序提供了持续时间、可靠性、挂起/恢复、事务以及补偿特征。在某种意义上,活动类似于中间语言 (IL) 操作码或程序语句,但包含特定领域的知识。简而言之,Windows Workflow Foundation 使程序语义具有声明性并且十分准确,使用户能够为接近实际进程的应用程序建模。它是最适合此工作的工具。用户无需使用 IL 编写前端可视应用程序,而是使用 RAD 开发工具和更具人类可读性的语言。Windows Workflow Foundation SDK 提供了广泛的编程语言,专门用于为复杂的业务程序建模,特别是在这些程序可能随着时间而改进的情况下。在这种情况下,主要好处在于用户可以添加特殊活动来进行工作流,并使用内置行为活动来控制该工作流。用户可以专注于任务,其他事情由运行时进行处理。
WF工作流引擎提供了以用户/角色机制的安全机制,实现与系统的无缝集成。
实现方案
二滩公司电力营销软件面临需求多变,流程变更频繁的环境,适于采用WF工作流技术来满足这一需求。工作流是用于说明数据和操作流的工具,因此,任何需要 IF 或 WHILE 语句的方案都可以是工作流。但是,任何人都不能使用仅包含 IF 语句的工作流,工作流运行时确实具有成本,该成本可以在流复杂性超出给定阈值时分摊。基于工作流的解决方案的真正优点是使复杂进程更易于建模和实现,更重要的是使其更易于改进和扩展。而这一优点正是二滩公司电力营销软件所需要的特性。
系统工作流设计模式
l 设计工具:利用VS.Net2005提供的工作流设计器进行工作流设计;
l 工作流类型:统一采用状态机模式;
l 基本结构:采用状态组件、Event Driven组件、HandleExternalEvent组件、CallExternalMethod组件、SetState组件配合本地服务组件等6类组件完成设计;
l 事件和状态接口参数:均在本地服务组件中以接口的形式规定;
l 统一外部调用接口:统一接口函数RaiseEvent(form,id),在工作流接口函数中根据form中状态不同决定引发不同事件,驱动工作流运行。 (测试中)
l 功能划分:业务实现主要放置在工作流本地服务组件函数中实现,而工作流组件主要起逻辑控制作用。
l 页面流由配置文件配置,根据返回状态决定跳转页面;数据流由Dynamic Form传递。
2、系统工作流运行模式
对于一个通用的预测、优化、报价业务来说,其业务逻辑和流程是可变的。在B/S模式下表现为两种可能:
1、页面间的跳转是可变的。为了实现这个目标,本系统必须要有一个总控程序来控制业务逻辑。控制器接收用户的请求,通过查询配置表调用模型中“正确”的工作流组件进行相应处理,工作流组件根据当前状态参数(State)驱动对应的活动组件,最后再根据返回状态参数(State)调用“正确”的视图来显示返回的处理结果。
总控程序本身也被封装成服务端组件,整个系统页面间跳转全部由Dispatch Form和WF共同完成。Dispatch Form根据一个定义好的配置文件实例化相应工作流组件执行任务,然后根据工作流组件执行返回状态参数,根据该返回状态参数决定跳转到哪个页面。通过WF和总控程序的耦合,实现了数据流和页面流的以一致的方式运行。
2、单一页面的数据流,总控组件根据配置表调用工作流组件,工作流组件根据状态参数调用各活动组件,各活动组件调用相应算法,以Dynamic form作为状态间数据流载体传递参数,其返回值后不跳转页面而直接刷新当前页面内容。
3、工作流组件加载模式
所有的工作流加载方式均通过配置文件(actioncontroller.xml)配置,动态加载工作流组件,动态加载本地服务组件。其基本原理与算法库管理相似,读取ActionController.xml文件中的配置项,利用对象工厂技术加载工作流组件和本地服务组件,执行相应的工作流程。(测试)
4、工作流内部运行模式
业务流程中调用本地服务(local service)组件来引发事件(Raise Event),利用统一规定的引发事件接口(RaiseEvent),传递统一的参数(form,工作流 ID),在活动组件中利用事件驱动组件中HandleExternalEvent组件监听接收外部事件,若事件发生,接着利用CallExternalModthod组件调用外部方法,跳转到下一状态,若一个状态下存在多个处理分支则添加多个事件驱动组件来处理。
工作流基本结构表述为:工作流——状态组件——事件驱动组件(多个)。
图3-1工作流结构图
工作流设计器
该系统工作流设计器主要是面向开发人员,实现对工作流程的定制和修改。
设计器功能介绍
设计器时基于微软的WF技术架构,采用DONET C/S的方式实现。
特征 |
功能明细 |
文件 |
对工作流文件的编辑功能: 1、工作流文件的新建、打开、保存等编辑操作 2、工作流打印操作 3、退出 |
编辑 |
对工作流流程中元素的编辑功能: 1、剪切 2、拷贝 3、粘贴 4、删除 |
工作流 |
对工作流流程图的操作: 1、展开 2、合并 3、缩放 4、导航(放大、缩小、移动、默认) |
参数设置 |
设计器涉及的参数配置包括: 1、LocalService 动态加载参数配置(xml) 2、页面流参数设置(xml) |
图形化编辑 |
图形化功能区,是创建工作流程的主要操作区,包括功能有: 1、工作流元素的拖放; 2、流程的变动调整; 3、创建流程的快捷方式等; |
基础工作流活动元素 |
1、StateActivity 状态活动 2、EventDrivenActivity 事件驱动活动 3、HandleExternalEventActivity 绑定外部时间活动 4、CallExternalMethodActivity 调用外部方法活动 5、SetStateActivity 状态转换活动 6、StateInitializationActivity 状态初始化活动,当状态开始运行的时间开始执行; 7、StateFinalizationActivity 状态结束活动,在一个状态转向另一个状态之前执行; 8、DelayActivity 延时活动 9、TerminateActivity 终止活动 |
性事件参数设置 |
属性事件参数设置,是通过设计器生成工作流的关键,包括的功能有: 1、接口服务的动态加载; 2、接口的设置; 3、事件的绑定; 4、外部事件的调用设置; |
8.2.2核心类结构图
备注:WorkflowLoader 工作流设计器加载服务类;
EventBindingService 事件绑定服务类;
WorkflowDesignerControl 工作六图形化设计服务类;
ToolBoxService 设计器工具箱(Activity容器)服务类;
PropertyValuesUIService 属性值窗口服务类;
MemberCreationService 成员创建服务类;
SelfHostToolboxItem 设计器宿主工具箱成员加载处理服务类;
WorkflowMenuCommandService 工作流目录事件命令服务类;
Helpers 工作流通用处理功能类(静态类)
设计器功能界面图示
(WF设计器功能图)
工作流调用服务
工作流调用服务包括:工作流引擎和运行时(WorkflowRuntime)及运行时服务(Service)的封装类(WorkflowModuleService)、工作流LocalService服务(WFLocalService)和工作流WebService服务(WFWebService)等;
封装类(WorkflowModuleService)
封装类是工作流运行的基础,封装的功能包括:
工作流引擎(运行时)WorflowRuntime的封装,对整个项目来说,只能有一个WorkflowRuntime实例,在同一个WorkflowRuntime可以同时运行多个工作流实例;
手动调度服务的加载(ManualWorkflowSchedulerService),手动调度服务为工作流执行中的手动调度提供了支持;
外部数据交互服务加载(ExternalDataExchangeService),外部数据交互服务为工作流内部与工作流外部(宿主程序)的数据交互提供支持;
工作流持久化服务的加载(SqlWorkflowPersistenceService),持久化是将工作流实例从工作流引擎中移出,存入持久性介质,以及从介质中将实例载入工作流引擎中,SqlWorkflowPersistenceService类是使用SQL数据库对工作流状态进行持久化的服务,实例使用Unload方式通过加载到引擎中的SqlWorkflowPersistenceService服务,完成实例的内存移出与保存到数据库的操作,引擎使用GetWorkflow方法,可通过SqlWorkflowPersistenceService服务将存于数据库中的实例加载并返回,实例使用load方法,可触发引擎的WorkflowLoaded事件
工作流跟踪服务的加载(SqlTrackingService),跟踪工作流及其接点状态是工作流平台的核心功能,WF提供的Tracking服务用以跟踪工作流的执行状态;工作流执行过程中会有各种状态的改变,Tracking能将这些状态改变信息记录到数据库并提供查询端口;
另外在封装类中还实现了对自定义服务的加载,同时负责工作流引擎的启动,并保证工作流引擎的唯一性;
封装类类图结构:
备注:
WorkflowModuleServiceHost 工作流模板服务宿主类,主要是对工作流引
擎、服务及功能的封装;启动工作流引擎;
WorkflowModuleServiceStart 启动一个工作流实例,并获得实例信息;
WorkflowModuleServiceLoad 加载一个已经存在的工作流;
工作流LocalService服务(WFLocalService)
LocalService 服务是工作流业务流程实现的核心服务,所有的LocalService服务类都继承统一的接口IBaseLocalService,同时每个LocalService 都继承自己特定的接口,所有的LocalService 对外提供统一的调用方式;
每个针对LocalService的借口必须以[ExternalDataExChange]属性来标记,以保证工作流和LocalService之间能进行数据交换;
数据交互的方式是通过DynamicForm 对象来实现,DynamicForm 是自定义封装用于参数传递的类;
LocalService 类结构示例图示:
工作流WebService服务(WFWebService)
系统通过WebService 服务实现工作流对外(UI或VIEW)提供统一的调用接口服务,同时利用WebService和AJAX结合,在需要的地方实现无刷新的异步处理功能;对内通过WebService 实现对封装类和LocalService 服务的调用;
WebService 对外主要的功能接口有:
StartWorkflow(string xomlFileName) 创建(启动)一个工作流实例;
GetWFStateUrl(string xomlFileName,string curStateName)获得工作流状态所绑定的页面流路径信息;
另外还有:
VertifyWFPermit(string strWFGuid , string curStateName)工作流权限验证;
UnloadWF(string strWFGuid) 强制持久化工作流;
LoadWF(string strWFGuid) 从持久化介质中加载工作流到工作流引擎中;
getWFInstanceStateList(string strWFGuid) 获得实例的运行状态列表;
工作流分类
工作流分类是对工作流模板文件(xoml) 归类,属于工作流基本信息维护的内容,包括对分类基本信息的编辑(添加、删除、修改)和文档所属分类的编辑两部分。
工作流分类数据结构图:
工作流调用
工作流调用部分,属于工作流的应用开发;根据实际业务的需要调用工作流,并在程序的运行中,对工作流进行调度;
该部分涉及到的主要界面包括:
1、工作流模型的选择页面(可以根据业务类型、人、时间,对工作流模型进行过滤);
2、工作流业务实例的生成页面,包括工作流业务实例GUID和实例有关的业务信息的创建
3、工作流实例的选择页面;
4、在工作流调用的期间,对工作流监控信息的显示页面;
工作流调用涉及的数据表结构图:
工作流监控
在目前WF的开发模式下,对工作流的监控可以从两个方面进行:一方面可以从工作流持久化服务(SqlWorkflowPersistenceService)和跟踪服务(SqlTrackingService)中获得工作流监控信息;另外,可以通过在工作流运行的过程中,实时的操作数据库记录表(自定义表)达到工作流监控的目的。
工作流监控的主要功能函数如下:
getWFInstanceStateList(string strWFGuid) 实例运行状态的监控;
getWFInstanceOperList(string InstanceID) 实例操作信息的监控;
getActivityStateList(string InstanceID) 实例节点信息的监控;
getBussinessStateList(string InstanceID) 实例业务状态的监控;
InsertInstanceStateInfo() 实时记录工作流状态信息;
SelectInstanceStateInfo() 获得记录的工作流状态信息;
工作流监控涉及到的主要的数据结构如下:
另外还可以根据实际的业务处理需要,对需要监空的信息,建立记录表和监控信息汇总表;
页面流
页面流是工作流处理的一部分,二滩实际业务中,页面流是其主要的特色,这里就把页面流单独提出来;页面流的实现是通过把页面流和工作流的状态接点邦定来实现的;在工作流的运行中,通过检测工作流的执行状态,通过状态变量来判断页面流的流程流转;页面流和工作流状态的邦定是在工作流模型设计的时间完成的;在工作流的调用执行中实现页面流流程;
页面流邦定图示:
工作流权限
工作流权限的处理,也是通过和工作流状态接点邦定的方式进行;接点邦定的对象有两种:
一种是和角色邦定;另一种是和权限人的邦定;实质上和角色的邦定最终也是和人员的邦定,因为人员归属了角色,所以这里统一采用和权限人的邦定。但是在处理中可以通过角色,对该角色下的全部人员进行权限的批量设置。
工作流权限验证后的处理是通过工作流自身的逻辑完成,也就是通过LocalService来实现;当验证通过时工作流就根据实际的流程往下执行,如果验证没有通过就给出验证没有通过提示或转到特定的页面,工作流保持在当前的状态。
工作流权限验证的数据结构示意图如下:
工作流WEB端简单图形展示
工作流Web端简单图形展示,是对工作流的整体运行状况的一个形象化显现,展现的内容包括:工作流实例的状态信息、工作流流程当前状态位置和各个状态主要信息提示(通过双击各个状态来实现)。
图形化展示图示如下