Я разрабатываю рабочий процесс SharePoint с действием Replicator для репликации настраиваемого действия для каждого утверждающего. Настраиваемое действие реализует ветвь утверждения для конкретного пользователя. Он имеет классическую форму с действиями CreateTask, While, OnTaskChanged и CompleteTask.
Я настраиваю UntilCondition на репликаторе, чтобы отменить выполнение после того, как один утверждающий решит отклонить утверждение, а затем рабочий процесс завершится. Проблема возникает с другими незавершенными задачами, которые «зависают» в своем текущем состоянии. Пользователь не видит этого состояния при открытии задачи.
Я помещаю UpdateAllTasks после репликатора, чтобы установить статус задачи «Отменено». Но поскольку между CompleteTask (для отклоненной задачи) и UpdateAllTasks нет событийных действий, для отклоненной задачи также установлено действие UpdateAllTask «Отменено».
Возникает вопрос, что я могу сделать, чтобы очистить отложенное изменение, внесенное CompleteTask перед UpdateAllTasks?
Или, возможно, есть другой способ реализовать такой рабочий процесс. Я думал о том, как реализовать обработчик отмены для настраиваемого действия с помощью UpdateTask. Но я не знаю, как это реализовать и сообщить обработчику отмены, что он выполняется в случае отказа.





Вы пытались поместить действие кода между полной задачей и действием updatealltasks?
Структурируйте свою деятельность следующим образом: Create Task -> OnTaskChanged -> If / Else Activity (установите условие true, если утверждающим было принято решение «отклонить») -> (Внутри ветви If) UpdateAllTasks Activity (установите статус для отмены в свойствах Activity) -> (Вне ветка If) CompleteTask Activity.
Когда утверждающий решает отклонить задачу, WF отменяет все задачи. Это также отменит задачу человека, который отклонил, но сразу после того, как действие «CompleteTask» будет запущено и установит соответствующую задачу как завершенную.
Сегодня я столкнулся с похожей проблемой. Я решил это с помощью:
Столкнувшись с той же проблемой и потратив много времени на изучение и опробование различных вариантов, я думаю, что нашел действительно хорошее решение. Выкладываю сюда для потомков.
Если у вас вообще есть опыт работы с этим сценарием, вы собираетесь сообщить мне, что UpdateAllTasks также обновляет первоначально отклоненную задачу, поскольку «CompleteTask» еще не сохранен в базе данных. Магия заключается в атрибуте, который вы можете определить для настраиваемого действия (ReviewActivity) под названием PersistOnClose.
[Designer(typeof(ActivityDesigner), typeof(IDesigner))]
[PersistOnClose]
public partial class ReviewActivity : SequenceActivity
Этот атрибут гарантирует, что после завершения ReviewActivity все изменения сохранятся в базе данных. Поскольку последним действием в ReviewActivity является «CompleteTask», задача сохраняется в БД. Поэтому UpdateAllTasks его не трогает.
Я надеюсь, что это поможет кому-то.