工作流里面,分配一个任务给多个用户是很常见的操作,比如会签,通知等,但是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值,
工作流图示如下:
代码如下:
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里面处理。