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

Visual studio 组中的所有用户都必须批准工作流任务-自定义Visual Studio工作流-SharePoint 2010,visual-studio,sharepoint-workflow,Visual Studio,Sharepoint Workflow,我在Visual Studio 2010(SharePoint 2010网站)中完成了自定义工作流。我有一个任务分配给一个小组。所有用户都会毫无问题地收到任务分配通知电子邮件。默认情况下,他们中的任何人都会将任务显示为已完成 只有当组中所有成员都批准我的任务时,我的任务才会被视为已批准。请问如何做到这一点 任何帮助都将不胜感激 谢谢每次我看到多审批工作流时,它总是包含多个任务。我不认为一项任务可以获得一定百分比的批准。它不是挂起就是被批准(或者被拒绝,等等) 我可以想到两种可能性: 在自定义工作

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

只有当组中所有成员都批准我的任务时,我的任务才会被视为已批准。请问如何做到这一点

任何帮助都将不胜感激


谢谢

每次我看到多审批工作流时,它总是包含多个任务。我不认为一项任务可以获得一定百分比的批准。它不是挂起就是被批准(或者被拒绝,等等)

我可以想到两种可能性:

  • 在自定义工作流中,在分配任务时,不要将单个任务分配给组,而是将一个任务分配给组中的每个成员
  • 将ItemUpdating事件接收者添加到任务列表项,该任务列表项维护(另一个列表、数据库等)已批准任务的用户列表。一旦组中的所有用户都批准了任务,请允许更新进行,否则将状态保留为挂起

  • 有人建议,复制因子活动与直到条件是正确的方式去做这件事。根据我的研究,这听起来是一个很好的解决方案


    我欢迎任何进一步的建议/方法。

    尝试跟踪分配的单个任务和完成的单个任务的数量。完成==分配后,检查以确保所有任务均获得批准,并从此处采取所需的操作。

    从技术上讲,您可以创建一个使用不同字段的自定义任务类型,并在其中存储所有用户名,然后使用自定义任务表单逐个检查它们。。。但如果您同时创建多个任务,实际上会简单得多

    下面是一个如何操作的示例(也看视频!),但是--他的示例中有一部分是错误的做法:他在Replicator活动的初始化事件中初始化InitialChildData IList。。。这就是为什么他必须初始化其中的第一个孩子,以及ChildInitialized事件中的其余孩子。。。正确的方法是在到达replicator并设置IList之前立即运行代码活动。然后,您可以将所有实际的初始化代码保留在childInitialized处理程序中。在我的实际工作版本中,我根本没有复制器初始化的处理程序

    我将要进入一个与上面链接的Scot Hilier一起的示例,比如勘误表补遗类型的东西,所以当您意识到这段代码不是完整的解决方案时,不要感到不安

    例如,如果我的多批准人列表使用我的工作流的逗号分隔字符串属性Assignees(可能是从工作流的初始化数据中获取的,可能是以前的任务表单…这是您自己的业务)

    在本例中,Assignees是一个列表,我已将replicator的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!
        }
    
    这只是希利尔先生的一个小疏忽,但这通常是一个很好的例子,所以我们会原谅他的

    如果要检查结果,请在replicator的ChildCompleted处理程序中执行。(希利尔先生也不涉及这一部分。)

    public int FailedApprovals{get;set;}
    /// 
    ///这是在完成子任务时调用的。这里是我们检查结果的地方。
    /// 
    /// 
    /// 
    私有void replicateTasks_ChildCompleted(对象发送方,ReplicatorChildEventArgs e){
    如果(e.活动为MyGeneralApprovalTaskActivity){
    var act=e.活动作为MyGeneralApprovalTaskActivity;
    if(act.TheTaskOutcome!=MyStrings.ApprovedString){
    失败的Approvals++;
    }
    //记录一些东西!
    }
    }
    
    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!
        }
    
    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!
            }
        }