我在Visual Studio 2010中完成了自定义工作流(适用于SharePoint 2010网站)。我有一个任务分配给一个小组。所有用户都可以毫无问题地收到任务分配通知电子邮件默认情况下,任何批准它的人都会将任务显示为已完成。
只有当小组的所有成员都批准我的任务时,我的任务才会被视为已批准。如何实现这一目标?
任何帮助将不胜感激。
由于
答案 0 :(得分:0)
每次我看到多批准工作流程时,它总是包含多个任务。我不认为单个任务可以被批准一定比例。它正在等待或批准(或拒绝等)。
我可以想到两种可能性:
答案 1 :(得分:0)
有人建议使用Until条件的Replicator Activity是正确的方法。根据我的研究,这听起来是一个很好的解决方案。
http://wiki.windowsworkflowfoundation.eu/default.aspx/WF/UntilConditionAndTheReplicatorActivity.html
我欢迎任何进一步的建议/方法。
答案 2 :(得分:0)
尝试跟踪分配的各个任务的数量以及完成的各个任务。完成==已分配后,请检查以确保所有任务都获得批准并从那里采取所需的操作。
答案 3 :(得分:0)
从技术上讲,您可以创建一个使用不同字段的自定义任务类型,并将所有用户名存储在其中,并使用自定义任务表单逐个检查它们......但实际上,如果您实际上要简单得多并行创建多个任务。
以下是如何执行此操作的示例http://msdn.microsoft.com/en-us/library/hh128696.aspx(观看视频也是如此!)但是 - 他的示例中有一部分是不好的做法:他在Initialzed事件中初始化InitialChildData IList Replicator活动......这就是为什么他必须在那里初始化第一个孩子,其余的在ChildInitialized事件中...正确的方法是在你到达复制器并设置你的IList之前立即运行代码活动。然后,您可以将所有实际初始化代码保留在childInitialized处理程序中。在我的现实生活中,我根本没有复制器初始化处理程序。
我即将进入一个与上面链接的Scot Hilier相关的例子,如勘误表附加类型的东西,所以当你意识到这个代码不是整个解决方案时,不要感到沮丧。
例如,如果我的多审批人列表使用我的工作流程中名为Assignees的逗号分隔字符串属性(也许我从工作流的初始化数据中获取它,也许是以前的任务表单......这是您自己的业务)< / p>
private void prepareCodeActivity_Invoked(object sender, EventArgs e) {
Assignees = DesignatedApprovers.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).ToList();
}
Assignees是一个List&lt; string&gt;在这种情况下,我已将复制器的InitialChildData属性绑定到它
private void replicateTasks_ChildInitialized(object sender, ReplicatorChildEventArgs e) {
// do all of your task setup here (e.InstanceData is the single string for this child)
// note I'm setting properties of my custom activity, not the task itself
// each child instance of the replicator gets it's own instance of it.
generalApprovalTask.TaskAssignedTo = e.InstanceData.ToString();
generalApprovalTask.TaskTitle = string.Format(MyStrings.GeneralApprovalTaskTitle,
workflowProperties.Item.File.Name)
// log something!
}
希利尔先生只是一个小小的疏忽,但这通常是一个很好的例子,所以我们原谅他。
如果要检查结果,请在复制器的ChildCompleted处理程序中执行此操作。 (希利尔先生也没有涉及这一部分。)
public int FailedApprovals { get; set; }
/// <summary>
/// This is called upon the completion of the child tasks. Here is where we check the outcome.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void replicateTasks_ChildCompleted(object sender, ReplicatorChildEventArgs e) {
if (e.Activity is MyGeneralApprovalTaskActivity) {
var act = e.Activity as MyGeneralApprovalTaskActivity;
if (act.TheTaskOutcome != MyStrings.ApprovedString) {
FailedApprovals++;
}
// log something!
}
}