如何在并行审批工作流程中实施拒绝?

时间:2009-01-21 12:41:08

标签: sharepoint sharepoint-2007 moss workflow workflow-foundation

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

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

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

问题是,如何在UpdateAllTask​​s之前清除CompleteTask所做的挂起更改?

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

4 个答案:

答案 0 :(得分:3)

在面对同样的问题并花费大量时间研究和尝试不同的选择后,我想我找到了一个非常好的解决方案。我在这里发帖给后人。

  1. 创建一个扩展SequenceActivity的自定义活动,名为ReviewActivity
  2. ReviewActivity包括典型的CreateTask - >而 - > OnTaskChanged - > CompleteTask场景
  3. 在我的工作流程中,我有一个Replicator正在创建ReviewActivity的许多实例(以及许多任务)。
  4. 复制器实现一个UntilCondition,检查任务是否被拒绝(这是在ChildCompleted中设置的)
  5. 在Replicator之后,我有一个UpdateAllTask​​s来关闭剩余的任务
  6. 如果您对此方案有任何经验,那么您正准备告诉我UpdateAllTask​​s还会更新最初被拒绝的任务,因为“CompleteTask”尚未持久保存到数据库中。神奇之处在于您可以为名为PersistOnClose的自定义活动(ReviewActivity)定义的属性。

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

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

    我希望这有助于某人。

答案 1 :(得分:0)

您是否尝试在完整任务和updatealltasks活动之间设置代码活动?

答案 2 :(得分:0)

按以下方式构建您的活动: 创建任务 - > OnTaskChanged - > If / Else Activity(如果批准者决定是“拒绝”,则设置条件为真) - > (在If分支内)UpdateAllTask​​s活动(在活动属性中将状态设置为取消) - > (在If分支之外)CompleteTask Activity。

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

答案 3 :(得分:0)

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

  1. 如果任务被取消,则在ontaskchanged方法中将变量taskCancelled设置为true(基于已完成的字段和percentageCompleted)
  2. updateAllTask​​s方法运行以在每个ontaskchanged事件之后(在复制器内的序列中)取消每个任务仅当taskCancelled变量为真时
  3. 如果taskCancelled变量为真,则将replicator的条件设置为true