工作流里面,分配一个任务给多个用户是很常见的操作,比如会签,通知等,但是VS工作流默认只能将一个任务分配给一个用户:

如下:

this.workflowTask1Properties.AssignedTo = this.ReviewerName;

其中this.ReviewerName格式只能是“mydomain\\user01”,想当然的,我们会想到多个用户可以使用“mydomain\\user01;mydomain\\user02”,但是如果你这样做了,那么承担者会变成了空值。

而且即使你能这样做,实现多用户下的条件控制也很难,这些控制包括:

1)一个用户同意即通过

2)所有用户同意才通过

3)多数用户同意才通过

那怎样才能实现呢?

我们可以把CreateTask活动放入Replicator里面,但是这样还不够,因为当Replicator复制出多个任务后,它的CorrelationToken会是重复的,这就相当于HTML里面RadioButtion组里面每个GroupID都一样,WF是不允许的,这样做的结果就是总是创建出一个Task然后工作流Break掉,那如何才能既复制Task,同时又让CorrelationToken不同呢,我们只需要将Task再放入一个Sequence中,然后将Task的Owner ActivityName设置为该Sequence就可以了,Replicator下的Sequence会自动给每个Task不同的token值,

工作流图示如下:

SpxImage01

 

代码如下:

private void OnWorkflowActivated(object sender, ExternalDataEventArgs e)
        {
            …

            List<string> principles = new  List<string>();
            foreach (Person user in initform.Reviewer)
            {
                principles.Add(user.AccountId);
            }

            this.replicatorActivity1_InitialChildData1 = principles;

            …

        }

private void CreateTask1(object sender, EventArgs e)
       {

            ReplicatorActivity rep = ((Activity)sender).Parent.Parent as ReplicatorActivity;
            string strPrinciple = rep.InitialChildData[rep.CurrentIndex].ToString();

            this.taskID_ReviewerApproval = Guid.NewGuid(); //initialize the task id
            this.workflowTask1Properties = new SPWorkflowTaskProperties();
            this.workflowTask1Properties.Title = "会签者: 请会签文档" + workflowProperties.Item.DisplayName;
            //this.workflowTask1Properties.AssignedTo = this.ReviewerName;
            this.workflowTask1Properties.AssignedTo = strPrinciple;
            this.workflowTask1Properties.Description = this.instruction;
            this.workflowTask1Properties.TaskType = 0; //specify task type so that the workflow knows which form to use (set in workflow.xml)

         }

至于会签后的条件处理,可以在Replicator的UtilCondiation里面处理。

posted on 2010-01-12 16:35  重金属  阅读(440)  评论(0编辑  收藏  举报