AX2012的workflow不再需要IIS在web上宿主runtime,而是随AOS一起安装,也在AOS宿主运行态组件,总体上分为x++ workflow runtime和managed workflow runtime两块,通过workflow request及事件、回调在两者间交互,用到.net interop from x++及.net interop to x++等技术,所以如果用X++编写了workflow的实现,别忘了做一次incremental CIL编译。更详细的workflow体系结构参见http://technet.microsoft.com/en-us/library/dd309641.aspx。
所有AX2012 workflow有关的编程对象都位于AOT/Workflow节点下,主要包括这些类型:
- Workflow categories:对workflow分类,在workflow category的module属性指定所属模块信息,包括Customer、Vendor、SalesOrder等,取值来自于base enum “ModuleAxapta”。
- Workflow type:这是workflow的核心构建单元,由它定义某种workflow的类型,它的属性定义所用到的下层处理Class。
- 属性Document确定一个从WorkflowDocument扩展的类,最重要的方法getQueryName()返回一个Query的名称,由这个Query确定workflow所应用的表纪录,比如要将workflow type应用到Customer,我们可以新建一个包含CustTable表的Query,从这个类返回。和这个属性相关的DocumentMenuItem和DocumentWebMenuItem属性指定打开所引用表纪录的菜单项,比如打开Customer详细信息的菜单项“CustTable”。在我们打开表详细纪录form时,要出现workflow工具栏还需要重载form或者表的canSubmitToWorkflow()的方法,返回true表示当前纪录可以提交到workflow,当前纪录的recid被纪录到内部变量,由它唯一确定workflow所操作的原始纪录。
- 属性SubmitToWorkflowMenuItem和SubmitToWorkflowWebMenuItem:由它们确定在把表纪录提交到workflow需要做的动作,关联到一个带static main()方法的类,这个方法中最重要的就是调用Workflow::activateFromWorkflowType()激活一个该类型workflow的实例。
- 属性StartedEventHandler、CompletedEventHandler、CanceledEventHandler:都需要指向一个Class,分别需要实现WorkflowCanceledEventHandler、WorkflowCompletedEventHandler、WorkflowStartedEventHandler接口,用于响应workflow状态变换时启动某些操作。这些属性并非一定要实现的。
- 属性CancelMenuItem和CancelWebMenuItem:和提交的菜单项一样,用于表示取消workflow的操作,如果不需要自定义操作,可将这两个菜单项指向系统自带的WorkflowCancelManager类。
- 除了这些属性外,wokflow type下有Supported elements和Line item workflows。Supported elments包含workflow type下可以使用的Task及Approval,只有包含在该节点下的对象才能在后续workflow编辑窗口中看到并使用。Line item workflow用于一个workflow中包含多个子workflow的情况,比如一个project中可能包含多个子project,其下的子project可以单独提交到workflow。
- wokflow type可以使用AOT->Workflow type->Add-ins->Work type wizard向导模式创建,这会自动生成相应的document类、submit类、EventHandler类及MenuItems等。
- Tasks:定义针对某种workflow document可以进行的操作,注册到workflow type的supported elements节点下后,可以在workflow编辑窗口中拖拉使用。
- 属性Document、DocumentMenuItem、DocumentWebMenuItem和Workflow type类似,多了一个DocumentPreviewFieldGroup属性,定义对workflow涉及的表纪录预览字段。
- 属性StartedEventHandler、WorkItemsCreatedEventHandler、CanceledEventHandler:指向实现WorkflowElementCanceledEventHandler、WorkflowWorkItemsCreatedEventHandler、WorkflowElementStartedEventHandler接口的类,响应相应的workflow事件。
- 属性ResubmitMenuItem和ResubmitWebMenuItem:指向某个类,类的main()静态方法中处理workflow的重提交。
- 属性DelegateMenuItem和DelegateWebMenuItem,和resubmit类似,指定将work item代理给他人的操作,可以使用系统默认的WorkflowWorkItemActionManager类。
- Task的AOT节点Outcomes定义Task动作的输出,包含Complete、Return、RequestChange、Deny四种类型。每个Outcome有ActionMenuItem和ActionWebMenuItem属性,指定相应的动作操作,可以使用系统自带的WorkflowWorkItemActionManager类;EventHandler属性指定相应的事件处理类,实现相应的接口,比如WorkflowElementCompletedEventHandler、WorkflowElementReturnedEventHandler。
- Task可以使用Task wizard创建,相应的事件处理类、菜单项等一并创建,简化了操作。
- Approvals:就我看似乎和Tasks没有太多区别,唯一的就是Task的Outcom节点下的内容可以删除添加,而Approval下的Complete、Return、RequestChange、Deny四个节点始终存在,靠其属性Enable来控制是否启用。
- Automated Tasks:自动任务,不需要人工参与,没有outcome,属性Document指定相关workflow document类型,ExecutionEventHandler指向一个继承MyWorkflowAutomatedTaskEventHandler的类。
- Providers:包含Hierarchy assignment、Participant Assignment、Queque Assigment和Due data calculate四种,其下的各元素指向实现相应的接口类,前三者用于在workflow编辑窗口指定相应task、approval动作的操作者,后者指定相应的到期期限。Provider可以是用于所有workflow type的,也可以是用于指定workflow type,在workflow types节点下指定;可以是跨公司全局使用的,也可以是限定在Company范围内,通过Assocation属性指定。可以自定义自己的Provider类实现特殊的逻辑,详见http://msdn.microsoft.com/EN-US/library/cc633997.aspx。
构建了workflow的基本单元,并不意味着就可以直接使用它,还需要在相应模块下配置workflow,比如Accounts receivable->Setup->Accounts receivable workflows,在这里创建要应用的workflow,在workflow编辑窗口中编辑,可以使用已经构建好的Task、Approval实现特定的操作,创建好的workflow需要激活方能使用,AX同时提供对workflow的版本管理。
workflow看似复杂,涉及到的东西很多,可以通过演练来熟悉一下大概的过程。去这里(http://mukesh-ax.blogspot.com/2012/06/ax-2012-workflow-customization.html)下载一位外国同学提供的销售订单审核的workflow例子吧,那位兄弟做得很好,配有很多插图。更多的内容就见MSDN了:http://msdn.microsoft.com/en-us/library/cc585061.aspx。