【问题标题】:All users in a group must approve workflow task - Custom Visual Studio Workflow - SharePoint 2010组中的所有用户都必须批准工作流任务 - 自定义 Visual Studio 工作流 - SharePoint 2010
【发布时间】:2020-03-17 04:00:51
【问题描述】:

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

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

任何帮助将不胜感激。

谢谢

【问题讨论】:

    标签: visual-studio sharepoint-workflow


    【解决方案1】:

    每次我看到多重批准工作流程时,它总是包含多个任务。我认为单个任务不可能获得一定百分比的批准。它处于待处理或已批准(或被拒绝等)状态。

    我能想到两种可能:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        这是一个如何做到这一点的示例,http://msdn.microsoft.com/en-us/library/hh128696.aspx(也请观看视频!)但是——他的示例中有一部分是一种不好的做法:他在 Replicator 的 Initialized 事件中初始化 InitialChildData IList活动...这就是为什么他必须在其中初始化第一个孩子,而其余的都在 ChildInitialized 事件中...正确的方法是在您到达复制器并设置您的 IList 之前立即运行代码活动。然后,您可以将所有实际初始化代码留在 childInitialized 处理程序中。在我现实生活中的工作版本中,我根本没有复制器初始化处理程序。

        我将介绍一个与上面链接的 Scot Hilier 一起使用的示例,例如勘误表附录类型的东西,所以当您意识到这段代码不是完整的解决方案时不要生气。

        例如,如果我的多审批者列表使用我的工作流的逗号分隔字符串属性,称为 Assignees(也许我从工作流的初始化数据中获取它,也许是以前的任务表单......那是你自己的事)

        private void prepareCodeActivity_Invoked(object sender, EventArgs e) {
                Assignees = DesignatedApprovers.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).ToList();
            }
        

        在这种情况下,Assignees 是一个 List,我已将复制器的 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 处理程序中进行。 (Hilier 先生也不涉及这部分。)

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

        【讨论】:

          【解决方案4】:

          有人建议,具有直到条件的复制器活动是解决此问题的正确方法。根据我的研究,这听起来是一个很好的解决方案。

          http://wiki.windowsworkflowfoundation.eu/default.aspx/WF/UntilConditionAndTheReplicatorActivity.html

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

          【讨论】:

            猜你喜欢
            • 2011-04-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多