我使用Replicator活动开发SharePoint工作流,以便为每个批准者复制自定义活动。自定义活动为特定用户实现批准分支。它具有CreateTask,While,OnTaskChanged和CompleteTask活动的经典形式。
我在复制器上设置UntilCondition以在一个批准者选择拒绝批准然后工作流完成后取消执行。问题发生在其他未完成的任务中,这些任务在当前状态下“挂起”。打开任务时,用户看不到此状态。
我在更换器后面放了UpdateAllTasks,将任务状态设置为Canceled。但由于CompleteTask(对于被拒绝的任务)和UpdateAllTasks之间没有事件活动,因此UpdateAllTask活动也为被拒绝的任务设置了“已取消”。
问题是,如何在UpdateAllTasks之前清除CompleteTask所做的挂起更改?
或许,还有另一种方法可以实现这样的工作流程。我正在考虑使用UpdateTask为自定义活动实现Cancel处理程序的方法。但我不知道如何实现它并告诉取消处理程序它在拒绝的情况下执行。
答案 0 :(得分:3)
在面对同样的问题并花费大量时间研究和尝试不同的选择后,我想我找到了一个非常好的解决方案。我在这里发帖给后人。
如果您对此方案有任何经验,那么您正准备告诉我UpdateAllTasks还会更新最初被拒绝的任务,因为“CompleteTask”尚未持久保存到数据库中。神奇之处在于您可以为名为PersistOnClose的自定义活动(ReviewActivity)定义的属性。
[Designer(typeof(ActivityDesigner), typeof(IDesigner))]
[PersistOnClose]
public partial class ReviewActivity : SequenceActivity
此属性可确保在ReviewActivity完成后,所有更改都会持久保存到数据库中。由于ReviewActivity中的最后一个活动是“CompleteTask”,因此任务将保存到数据库中。因此,UpdateAllTasks不会触及它。
我希望这有助于某人。
答案 1 :(得分:0)
您是否尝试在完整任务和updatealltasks活动之间设置代码活动?
答案 2 :(得分:0)
按以下方式构建您的活动: 创建任务 - > OnTaskChanged - > If / Else Activity(如果批准者决定是“拒绝”,则设置条件为真) - > (在If分支内)UpdateAllTasks活动(在活动属性中将状态设置为取消) - > (在If分支之外)CompleteTask Activity。
当审批者决定拒绝任务时,WF将取消所有任务。它还将取消被拒绝的人的任务,但在“CompleteTask”活动发生后将立即触发,并将相应的任务设置为已完成。
答案 3 :(得分:0)
我今天遇到了类似的问题。我解决了它: