3

我开发了一个带有复制器活动的 SharePoint 工作流,以便为每个审批者复制一个自定义活动。自定义活动为特定用户实现了一个批准分支。它具有 CreateTask、While、OnTaskChanged 和 CompleteTask 活动的经典形式。

我在复制器上设置了 UntilCondition 以在一位批准者选择拒绝批准然后工作流程完成后取消执行。问题发生在其他“挂起”在当前状态的未完成任务上。用户在打开任务时看不到此状态。

我将 UpdateAllTask​​s 放在替换器之后以将任务状态设置为已取消。但是由于 CompleteTask(对于被拒绝的任务)和 UpdateAllTask​​s 之间没有事件活动,因此 UpdateAllTask​​ 活动也为被拒绝的任务设置了 Canceled。

问题是,我该怎么做才能在 UpdateAllTask​​s 之前刷新 CompleteTask 所做的待处理更改?

或者,也许还有另一种方式来实现这样的工作流程。我正在考虑使用 UpdateTask 为自定义活动实现 Cancel 处理程序的方法。但我不知道如何实现它并告诉取消处理程序它在拒绝的情况下执行。

4

4 回答 4

3

在面对同样的问题并花费大量时间研究和尝试不同的选择之后,我认为我找到了一个非常好的解决方案。我把它贴在这里以供后代使用。

  1. 创建一个扩展名为 ReviewActivity 的 SequenceActivity 的自定义活动
  2. ReviewActivity 包括典型的 CreateTask -> While -> OnTaskChanged -> CompleteTask 场景
  3. 在我的工作流程中,我有一个复制器,它创建了许多 ReviewActivity 实例(因此也创建了许多任务)。
  4. 复制器实现了一个 UntilCondition 来检查任务是否被拒绝(这是在 ChildCompleted 中设置的)
  5. 在复制器之后,我有一个 UpdateAllTask​​s 来关闭剩余的任务

如果您对这种情况有任何经验,那么您准备告诉我,UpdateAllTask​​s 还会更新最初被拒绝的任务,因为“CompleteTask”尚未持久化到数据库中。神奇之处在于您可以为名为 PersistOnClose 的自定义活动 (ReviewActivity) 定义一个属性。

[Designer(typeof(ActivityDesigner), typeof(IDesigner))]
[PersistOnClose]
public partial class ReviewActivity : SequenceActivity

此属性确保一旦 ReviewActivity 完成,所有更改都将持久保存到数据库中。由于 ReviewActivity 中的最后一个活动是“CompleteTask”,因此该任务被保存到数据库中。因此,UpdateAllTask​​s 不会触及它。

我希望这可以帮助别人。

于 2011-02-23T18:32:39.093 回答
0

我今天遇到了类似的问题。我解决了它:

  1. 如果任务被取消,则在 ontaskchanged 方法中将变量 taskCancelled 设置为 true(基于字段已完成和百分比已完成)
  2. updateAllTask​​s 方法运行以在每个 ontaskchanged 事件后取消每个任务(在复制器内的序列中),仅当 taskCancelled 变量为真时
  3. 如果 taskCancelled 变量为真,则将复制器的直到条件设置为真
于 2010-11-25T13:26:03.303 回答
0

您是否尝试在完成任务和 updatealltasks 活动之间放置一个代码活动?

于 2009-10-18T22:15:14.993 回答
0

将您的活动构造如下: Create Task -> OnTaskChanged -> If/Else Activity(如果批准者决定为“reject”,则将条件设置为 true)->(在 If 分支内)UpdateAllTask​​s Activity(将状态设置为在Activity 属性)->(在 If 分支之外)CompleteTask Activity。

当审批者决定拒绝某个任务时,WF 将取消所有任务。它还将取消拒绝的人的任务,但在“CompleteTask”活动将触发并将相应的任务设置为已完成之后。

于 2009-11-24T18:10:36.043 回答