组中的所有用户都必须批准工作流任务 - 自定义Visual Studio工作流 - SharePoint 2010

时间:2012-01-25 18:14:32

标签: visual-studio sharepoint-workflow

我在Visual Studio 2010中完成了自定义工作流(适用于SharePoint 2010网站)。我有一个任务分配给一个小组。所有用户都可以毫无问题地收到任务分配通知电子邮件默认情况下,任何批准它的人都会将任务显示为已完成。

只有当小组的所有成员都批准我的任务时,我的任务才会被视为已批准。如何实现这一目标?

任何帮助将不胜感激。

由于

4 个答案:

答案 0 :(得分:0)

每次我看到多批准工作流程时,它总是包含多个任务。我不认为单个任务可以被批准一定比例。它正在等待或批准(或拒绝等)。

我可以想到两种可能性:

  1. 在自定义工作流程中,在分配任务时,不是将单个任务分配给组,而是将一个任务分配给该组的每个成员。
  2. 将ItemUpdating事件接收器添加到任务列表项,该项列表项维护(另一个列表,数据库等?)用户列表已批准该任务。一旦组中的所有用户都批准了该任务,就允许更新通过,否则将状态保留为待处理。

答案 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!
        }
    }