基于Word的工作流表单引擎设计和实现 1.引言 工作流技术是当今信息系统中应用最广泛的技术,广泛应用于办公自动化系统、电子政务应用等多个信息化应用领域。根据国际工作流管理联盟(WfMC)的定义“工作流是一类能够完全或者部分自动执行的业务过程,根据一系列过程规则,文档、信息或任务能够在不同的执行者之间传递、执行”。 表单在工作流系统中承载着各种信息的收集和发布的任务,在应用系统中存在着大量的表单驱动的业务流程,业务的灵活多变必然要求工作流表单引擎也要具有灵活、易用的特性。在当今工作流的发展中,“缺少一个表单定制工具来定制流程所对应的页面”成为新的研究课题。然而,由于UI开发不属于流程引擎的范畴,很多工作流产品不包含表单开发工具,或者只包含一个简单而死板的页面开发工具,对应用的UI开发不能提供很好的帮助。 随着近年来Microsoft Word在办公领域的普及,使得Word已成为各种文档、表单事实上的标准。本文在对Microsoft Word深入研究的基础上,给出了基于Word的工作流表单引擎的设计思路和实现方案,借助Word具有的普及性、易用性等诸多优点,对于实现大量的以表单驱动的业务流程自动化,具有很高的应用价值。 2.Microsoft Word对象模型 构建基于Microsoft Word的工作流表单引擎,首先要对Word有足够的了解。一篇Word文档是由若干诸如段(Paragraph),表(Table)等对象构成。Word文档中经常操作的对象主要有以下一些: Application : 代表Word应用程序。 Documents : Word当前打开的所有文档对象所组成的集合。 Document : 代表一篇文档。 InlineShapes : 代表由InlineShape对象组成的集合,代表文档、区域或选定内容的所有嵌入式图形。 InlineShape : 代表文档的文字层中的对象,只能是图片、OLE对象或ActiveX控件。 Paragraphs : 代表所选内容、范围或文档中的所有段落。 图1 Word对象模型 Fig.1 Word Object Model Range : 该对象代表文档中的一个范围。每一个Range 对象由一起始和一终止字符位置定义。 若要针对Microsoft Word开发解决方案,就需要与Word对象模型[1] (图1)进行交互。 3.表单信息模型的建立 针对政府、企业需要处理的大量的基于表单的业务流程,本文提出了一种利用表单来表达工作流信息的方法,流程运行中的各种信息,如表单的结构、表单的数据、该表单所代表的业务类型和内容、任务创建时间、任务涉及到的参与者等信息都是记录在表单中的。表单是这种模式下的主要信息载体,也是系统和用户交互的主要方式。 定义1(过程) 一个过程是定义好的一个有向图p=(A,L),这里A={αi|i=1…,n}是活动集;L{(αi,αj)|αi,αjA}∈是链接集,一个链接如(αi,αj)表示第i个活动是第j个活动的前置活动。 定义2(表单) 一个表单Fk(k=1,…,K),由一系列的表单单元组成,每个表单单元由最基本的表单元素组成,即Fk={Um|m=1,…,M},Um={fl|l=1,…,L},f表示表单的基本元素。 根据表单信息的范围和表现形式,可以把表单信息模型分为三层:表示层、数据层和控制层,其结构如图2所示: 图2 表单信息模型 Fig.2 Form Information Model 表示层即表单的外观,包括表单的样式和表单域。表单样式主要由文字、表格、图形等元素构成。表单域是进行数据交互的接口,常用的表单域对象有:标签(Label)、文本框(TextBox)、复选框(CheckBox)、选项按钮(OptionButton)等。 数据层包含了表单中的全部数据信息。其中,表单域数据是数据信息的主体,用于系统与用户以及用户之间的数据交互。表单的相关信息包含两部分内容:用户基本信息和用户权限。其中,用户的基本信息包括参与者的部分重要属性,如姓名、角色和E-Mail等。用户的权限信息描述了不同的参与者对表单的操作权限,如只读、只写、无权、可见或不可见等。 控制层用于控制表示层和数据层的实现。对表示层的控制主要包括对表单样式和表单域的添加、编辑、删除等,对各种表单元素属性的控制,如颜色、大小、位置等,以及对表单域对象的属性控制,如默认值、名称等。对数据层的控制,目的是将表单的相关数据提取出来进行处理,并存放到后台数据库中。 4.Word表单引擎的系统设计 4.1 需求分析 在政府、企业中大量的以表单驱动的业务流程中,表单是处于核心地位的,表单的样式、内容和组合方式决定了业务的种类和特点。因此,客观上要求表单引擎在工作流管理系统中应该成为核心部件,并以此作为整个系统设计的根本原则和出发点。 在软件开发的开始阶段,通常由用例图来描述客户的需求,用例图用图形化的方式表示系统需求,具有简单、直观的特点。Word表单引擎的用例图如下: 图3 用例图 Fig.3 Use-Case Diagram 4.2 总体设计 从总体架构上分析,工作流管理系统是以表单引擎为核心和基础的一套悬挂式系统,表单引擎的内部结构以及与其他子系统的关系如图4所示: 图4 表单引擎结构 Fig.4 Structure of the Form Engine 表单定义工具属于表单信息模型中的表示层。根据表单定义创建表单,包括表单样式和表单域。 表单管理器、表单调度管理器和访问控制管理器同属于表单信息模型中的控制层。表单管理器主要功能包括创建新表单、修改现存表单和删除表单等操作。表单调度管理器在工作流引擎的支持下,实现表单的发布和提交。访问控制管理器在相关服务系统得支持下,对组织机构中与该业务相关的参与者进行访问控制。 表单数据属于表单信息模型中的数据层。其中,持久化数据是指表单中的各个元素,将以模板的形式整体存入模板库。动态数据是指表单域中的数据,在提交的同时会发送到数据库中相应的数据表中。数据访问基础服务则通过ADO(ActiveX Data Objects)来实现表单引擎与后台数据库的连接。 4.3 数据库设计 根据系统的总体设计,表单引擎的数据库结构如图5所示: 图5 数据库设计 Fig.5 Database Design 其中,表单和数据项之间是一对多的关系,它们共同构成表单模板。表单实例和数据实例之间也是一对多的关系,它们构成具体的表单实例。同样,同一表单模板也可创建多个表单实例。 5.Word表单引擎的系统设计 5.1 Word电子表单的创建 (1)创建表单样式。根据相关的业务需求和规范,利用Word所提供的功能,可以在已有的Word文档上进行修改,也可以重新定义一份表单。这样完成的表单是静态的,不具有数据交互能力。 (2)添加表单域。将创建表单域的功能以Word工具栏的形式提供给用户。Word中,CommandBars集合代表 Microsoft Word 中的菜单栏和所有的工具栏,要自定义工具栏,首先创建CommandBars对象,如:myCommandBar,通过CommandBars.Add()方法将其添加到CommandBars集合,再定义各Button对象,再用myCommandBar.Controls.Add()方法将自定义Button对象添加到工具栏。 表单域实质上是ActiveX控件,在Word中可用OLE编程标识符(有时也称ProgID)创建Automation对象。表1列出了AxtiveX控件的OLE编程标识符[4]。 表1 ActiveX控件的OLE编程标识符 Tab.1 OLE programmatic identifier of the ActiveX controls
要在光标所在处添加表单域,需要用到Selection对象和InlineShapes集合对象,前者代表某个选定的范围或插入点,后者代表文档、区域或选定内容中的所有嵌入式图形。利用InlineShapes集合对象的AddOLEControl方法,并设置ClassType(对象类型)的值为相应的OLE编程标识符,可以将控件添加至文档,如:添加文本框:ClassType:="Forms.TextBox.1"。 为使表单域能通过鼠标拖动而自由移动位置,需要将InlineShapes对象转换位Shape对象,可以使用ConvertToShape方法来完成图形的类型转换。 5.2 Word电子表单的维护 维护一张已创建的Word电子表单,可使用Word自身的功能编辑表单样式,使用表单引擎的扩展功能修改其中的表单域。以编辑文本框为例,主要涉及到的属性[4]如表2所示: 表2 文本框常用属性 Tab.2 Common properties of the TextBox Object
在为Application对象编写过程之前,必须创建新的类模块并声明一个包含事件的Application类型对象。例如,假定已创建新的类模块并命名为EventClassModule。该类模块包含下列代码: Public WithEvents App As Word.Application 定义了包含事件的新对象后,为其编写事件过程,双击鼠标时,App_WindowBeforeDoubleClick()事件发生,单击鼠标右键,App_WindowBeforeRightClick()事件发生,在相应的过程中自定义功能。 在运行过程前,必须将类模块中已声明的对象连接到Application对象,可在任何模块中实现过程:Register_Event_Handler(),使App对象指向Microsoft Word Application。事件发生时,将运行类模块中的事件过程,即根据对象的不同类型,弹出相应的属性设置窗体,对各个属性进行设置。 5.3 访问控制 表单引擎可以对组织机构中的各个角色以及个人进行权限设置,主要支持3种类型的访问控制: (1) 对Word自身功能的控制 (2) 对表单引擎扩充功能的控制 (3) 对表单域的访问控制 Word菜单栏、工具栏(包括表单引擎自定义的工具栏)中的每一个子项目都有唯一的标识,通过该标识可以设置每一个项目的可见性与可用性,对应于Visible和Enabled属性,从而达到限制Word功能的目的。 同样,在表单中的表单域对象是一个集合,通过ActiveDocument.Shapes.count可以统计出表单中表单域的总个数,其中的表单域对象可表示为Shapes(i).OLEFormat.Object,其中i是索引号,因此只需对各个对象的Visible、Enabled属性进行相应得设置,即可实现对表单域的控制。 5.4 使用Jmail组件发布表单 Word表单引擎不是基于B/S结构的,表单的流转方式是在邮件服务器的支持下,通过E-Mail方式实现的。E-Mail服务和技术自从因特网建立到现在,已经发展的非常成熟,普及率也很高,因此表单流转采用E-Mail方式实现,更容易被用户接受和使用。 在众多的邮件发送组件中,Jmail组件功能强大,可支持多种格式的邮件发送,比如以HTML或TXT的方式发送,用户也可设置邮件发送的优先级等。Jmail支持发送附件,并具有密件发送/抄送/紧急信件发送能力,此外Jmail能详细的记录日志,便于维护,最关键的是Jmail是免费的,因此可以降低开发成本,所以非常值得使用。 在系统中注册Jmail.dll控件,将控件添加到工程中,就可以调用Jmail的各项功能。例如:可以使用Subject属性设定消息的标题,用Body属性设置邮件正文,用Recipients、Sender属性指定收件人、发件人的邮件地址,ServerAddress指定邮件服务器的地址等,最后调用Execute()方法将表单送出。 5.5 表单引擎与数据库的连接 表单引擎通过ADO(ActiveX Data Object)建立无源数据库连接。ADO[4]是Microsoft数据库应用程序开发接口,是建立在OLE DB之上的高层数据库访问技术。它封装了OLE DB提供的接口,相比于OLE DB提供者,ADO的接口可以使程序员在更高级别上进行数据交互,大大简化了程序编制,增加了程序的可移植性。而采用无源数据库连接方式,无需用户配置ODBC环境,利用ADO就可通过代码进行连接。 在连接数据库前,需要在工程中引入 Microsoft ActiveX Data Objects 2.0 Library,然后创建Connection对象并设置ConnectionString属性进行连接。ConnectionString为可读写string类型,用于指定一个连接字符串,告诉ADO如何连接数据库,如: ConnectionString = "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=DB_NAME;Data Source=127.0.0.1" 其中Initial Catalog指定数据库的名称,Data Source指定数据库服务器的IP地址。 用open方法打开建立的连接,创建结果集对象Recordset,根据需求编写SQL语句,利用Connection对象的Execute()方法可将结果集返回到客户端,进行各种处理。 最后用Connection对象的Close方法关闭已建立的连接。 6.结论 传统的基于HTML/XML表单的工作流管理系统(WFMS),在用户友好性、扩展性和灵活性方面存在较大的缺陷,采用基于Word的表单引擎能够很好的解决这些问题。在实践中,我们已经将Word表单引擎与工作流管理系统集成,通过在具体业务中的应用和对应用情况的认真分析,得出结论如下: (1) 基于Word构建的工作流表单引擎能使用户轻松的创建、维护各种动态电子表单而不需要用户具有专业的技术,且能对企业、政府中现存的大量静态电子表单进行升级,较好的解决了各种表单驱动的业务流程中表单的不确定性问题。 (2) Word表单引擎采用电子邮件作为表单流转的方式,提高了工作流系统的灵活性和易用性,较好的解决了各种表单驱动的业务中流程的不确定性问题。 (3) Word电子表单继承了Microsoft Word的全部功能,功能强大,操作简单,且具有“所见即所得”的打印特性,使得政府或企业可以轻松完成电子表单的打印存档工作,而且用户不需要花费专门的时间和经费接受培训,就可以很好的适应系统,从多方面为组织降低成本。
基于表单的分布式工作流系统研究与实现 |
|