任务是工作流的核心,一个工作流系统如何方便的表达任务分发的逻辑是衡量这个工作流系统可用性的重要标准之一.

SharePoint默认提供了CreateTask , OnTaskChanged,CompleteTask来实现对一个任务的分配和处理.

每次分配一个任务都要处理三个Activity,有点"麻烦",所以QuickFlow将这三个活动整合成一个活动—Task,通过单一的Task活动,即可实现任务的处理逻辑.

将Task活动拖入Flowchart设计器后,可以发现其如下的属性:

image

User : 用来指定任务的操作人,Task内部会自动给这个用户分配任务,并设置任务的操作权限。

TaskTitle:任务的名称

TaskType : 任务表单的ID,跟workflow.xml中的TaskX_URN配置对应。

TaskStep : 任务所属的步骤,这个步骤会直接显示到列表中的WorkflowStep字段中.WorkflowStep是QuickFlow自动给工作流管理的列表或文档库添加的栏,用来记录当前流程步骤。 很多客户都会要求列表中能明确的现实出当前流程处于那个步骤,这是,你要你启动工作流后,修改视图,将那个WorkflowStep字段显示出来即可,你可以修改WorkflowStep的字段名。

AutoReturn : 当为true时,任务完成后自动返回到来源的任务,可以用于多次审批拒绝时都返回给提交人,然后提交人提交或自动返回上一次的审批人。

TaskOutcome:任务结果。可以在InfoPath表单中设置一个__TaskOutome字段,这个字段的最终值及是TaskOutcome的值。

IncomeSync:输入同步.当上一级审批是多个同步的活动时,不要设置这个属性为true,这样,只有上一级的所有活动都执行完成后才会执行此活动。

Task同时具有如下事件:

Initialized :  活动初始化事件。

TaskCreating : 任务创建事件,一般在此事件中给任务属性赋值。如:

private void task1_TaskCreating(object sender, TaskEventArgs e)
       {
           //set infopath form field value
           e.TaskProperties.ExtendedProperties["someInfoField"] = "";
           Task t = (Task)sender;
           t.User = "domain/userAccount";
       }

Competed : 活动完成事件,一般在此事件中可以获取到用户的输入数据,如:

private void task1_Completed(object sender, EventArgs e)
       {
            Task t = (Task)sender;
            string approveResult = t.TaskOutcome;
           string approveComments = t.TaskProperties.ExtendedProperties["comments"];
       }

 

常见开发问题:

1)多级审批时如何将上一级审批的审批意见显示到下级审批?

答:在上级活动的Completed事件中将审批意见保存到一个全局字段中,然后在下级审批任务的TaskCreating事件中给InfoPath赋值。如:

string approval1Comments ; //用来保存上级审批意见的字段

       private void task1_Completed(object sender, EventArgs e)
       {
           Task t = (Task)sender;
           string approveResult = t.TaskOutcome;
           approval1Comments = ""+t.TaskProperties.ExtendedProperties["comments"];
       }

private void task2_TaskCreating(object sender, TaskEventArgs e)
        {
            e.ExtendedProperties["comments"] = approval1Comments;
        }

2)为什么有时候直接访问Task的属性不能获取到值?

答:为了实现一个活动可以执行任意多次,QuickFlow的Activity调度服务会在活动执行时动态创建一个活动,而不是执行原始的活动,设计器上那个活动只是一个原型 ,所以通过活动的事件访问活动时,除了通过事件参数,还可以将事件的第一个参数(object sender),进行类型转换,这个object一定就是执行中的活动。

为了Decision活动可以直接访问”原型”活动,QuickFlow在活动执行完成后会进行属性同步,所有Decision是可以直接访问

原型活动的TaskOutcome属性的。

要完全避免属性访问的问题,可以将要访问的属性绑定到工作流类的字段,这样就总是可以访问了。

image

示例代码下载:

https://files.cnblogs.com/jianyi0115/QuickExample.zip

posted on 2009-08-28 17:00  jianyi  阅读(3636)  评论(30编辑  收藏  举报