Как реализовать отклонение в параллельном процессе утверждения? - PullRequest
3 голосов
/ 21 января 2009

Я разрабатываю рабочий процесс SharePoint с действием Replicator, чтобы реплицировать настраиваемое действие для каждого утверждающего. Пользовательское действие реализует ветвь утверждения для определенного пользователя. Он имеет классическую форму с действиями CreateTask, While, OnTaskChanged и CompleteTask.

Я настраиваю До-условие на репликаторе, чтобы отменить выполнение после того, как один утверждающий решит отклонить утверждение, а затем рабочий процесс завершится. Проблема возникает с другими незавершенными задачами, которые «зависают» в своем текущем состоянии. Пользователь не видит это состояние при открытии задачи.

Я поставил UpdateAllTasks после заменителя, чтобы установить статус задачи Отменено. Но поскольку между CompleteTask (для отклоненной задачи) и UpdateAllTasks нет никаких событийных событий, набор операций UpdateAllTask ​​отменен и для отклоненной задачи.

Вопрос, что я могу сделать, чтобы сбросить ожидающие изменения, внесенные CompleteTask перед UpdateAllTasks?

Или, возможно, есть другой способ реализовать такой рабочий процесс. Я думал о том, как реализовать обработчик отмены для пользовательского действия с UpdateTask. Но я не знаю, как реализовать это и сообщить обработчику отмены, что он выполняется в случае отклонения.

Ответы [ 4 ]

3 голосов
/ 23 февраля 2011

После того, как я столкнулся с той же проблемой и потратил много времени на изучение и опробование различных вариантов, я думаю, что нашел действительно хорошее решение. Я выкладываю это здесь для потомков.

  1. Создание настраиваемого действия, расширяющего SequenceActivity, под названием ReviewActivity
  2. Функция ReviewActivity включает в себя типичный сценарий CreateTask -> While -> OnTaskChanged -> CompleteTask
  3. В моем рабочем процессе у меня есть Replicator, который создает много экземпляров ReviewActivity (и, следовательно, много задач).
  4. В репликаторе реализовано условие OnlyCondition, которое проверяет, была ли отклонена задача (это задается в ChildCompleted)
  5. После репликатора у меня есть UpdateAllTasks, чтобы закрыть оставшиеся задачи

Если у вас есть опыт работы с этим сценарием, вы готовы сообщить мне, что UpdateAllTasks также обновляет первоначально отклоненную задачу, поскольку «CompleteTask» еще не был сохранен в базе данных. Волшебство заключается в атрибуте, который вы можете определить для пользовательского действия (ReviewActivity) с именем PersistOnClose.

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

Этот атрибут гарантирует, что после завершения ReviewActivity все изменения сохраняются в базе данных. Поскольку последним действием в ReviewActivity является «CompleteTask», задача сохраняется в БД. Таким образом, UpdateAllTasks не будет касаться его.

Надеюсь, это кому-нибудь поможет.

0 голосов
/ 24 ноября 2009

Структурируйте свою деятельность следующим образом: Создать задачу -> OnTaskChanged -> If / Else Activity (установите условие в true, если решение утверждающего было «отклонено») -> (Внутри ветви If) UpdateAllTasks Activity (установите статус для отмены в свойствах Activity) -> (Вне ветвь If) Активность CompleteTask.

Когда утверждающий решит отклонить задачу, WF отменит все задачи. Он также отменяет задачу человека, который отклонил ее, но сразу после запуска действия «CompleteTask» и устанавливает соответствующую задачу как выполненную.

0 голосов
/ 25 ноября 2010

Я столкнулся с подобной проблемой сегодня. Я решил это с помощью:

  1. установка переменной taskCancelled на true в методе ontaskchanged, если задача была отменена (на основе заполненного поля и процентного завершения)
  2. Метод updateAllTasks запускается для отмены каждой задачи после каждого события ontaskchanged (в последовательности внутри репликатора), только если переменная taskCancelled была истинной
  3. установка до условия для репликатора равным true, если переменная taskCancelled была истинной
0 голосов
/ 19 октября 2009

Вы пытались поместить действие кода между завершенной задачей и заданием updatealltasks?

...