Изменение состояния карточки
ObjectContext context = this.LocalContext; (1)
BaseCard taskGroupCard = GetParentCard(); (2)
if (taskGroupCard != null)
{
if (this.LocalContext.LockObject(taskGroupCard, false)) (3)
{
ObjectModel.Services.IStateService stateService = context.GetService<ObjectModel.Services.IStateService>(); (4)
StatesStateMachineBranch branch = stateService.FindBranchByBuiltIn(TaskGroup.PerformanceToCompletedByCompleteBranch, taskGroupCard.SystemInfo.State); (5)
if (branch = null)
return false;
taskGroupCard.SystemInfo.State = branch.EndState; (6)
this.LocalContext.SaveObject<BaseCard>(taskGroupCard); (7)
this.LocalContext.UnlockObject(taskGroupCard); (8)
}
}
| 1 | Получаем контекст. |
| 2 | Получаем карточку. |
| 3 | Блокируем карточку. |
| 4 | Получаем сервис состояний. |
| 5 | Получаем ветку перехода по встроенной ветке перехода. |
| 6 | Получаем конечное состояние веки и присваиваем его полю состояния в карточке. |
| 7 | Сохраняем карточку группового задания. |
| 8 | Разблокируем карточку. |
Изменение методов обработки событий заданий и групп заданий
Разработчик может переопределить процедуру обработки событий запуска и выполнения заданий и групп заданий. Например, изменить механизм создания заданий по группе заданий.
-
Обработчик событий заданий
-
Обработчик событий группы заданий
-
Создайте библиотеку с классом, унаследованным от
DocsVision.BackOffice.ObjectModel.Services.TaskGroupEventHandlerService(содержит стандартную реализацию). -
Добавьте метод, аналогичный стандартному методу.
Список стандартных методов:-
OnSendToPerformance— обрабатывает событие отправки согласования исполнителям группы заданий (ГЗ). В стандартной реализации создаёт события на запуск задания отдельному исполнителю. -
OnTaskCreateRequest— обрабатывает запрос на создание задания отдельного исполнителя. В стандартной реализации, создаёт задание группы и запускает его. -
OnTaskGroupRecallRequested— обрабатывает запрос отзыва ГЗ. В стандартной реализации, создаёт события отзыва для заданий данной ГЗ. -
OnTaskGroupTaskCompleted— обрабатывает завершение ГЗ. В стандартной реализации не используется, работаетOnCardStateChanged. -
OnTaskGroupTaskRecalled— обрабатывает отзыв ГЗ. В стандартной реализации не используется, работаетOnCardStateChanged. -
OnCardStateChanged— обрабатывает событие изменения состояния ГЗ или одного из заданий ГЗ. В стандартной реализации, данный метод обеспечивает все изменения, связанные с изменением состояния:-
Завершения ГЗ, если завершились все дочерние задания.
-
Завершение родительского задания при завершении ГЗ, если это предусмотрено
-
Пррочие события изменения состояния.
-
Добавленный собственный метод должен иметь другое название (например,
OnSendToPerformanceOwn), но ту же сигнатуру, что оригинальный. -
-
Переопределите метод
GetHandlersInfoбазового классаTaskGroupEventHandlerService, указав список действующих обработчиков в реализованном компоненте:protected override IDictionary<Guid, EventHandlerInfo> GetHandlersInfo() { return new Dictionary<Guid, EventHandlerInfo> { { BaseCard.StateChangedEvent.Id, new EventHandlerInfo { EventId = BaseCard.StateChangedEvent.Id, EventArgsType = typeof(OnStateChangedEventArgs), EventHandlerName = nameof(OnCardStateChanged) } }, { TaskGroup.SentToPerformanceEvent.Id, new EventHandlerInfo { EventId = TaskGroup.SentToPerformanceEvent.Id, EventArgsType = typeof(OnSendToPerformanceEventArgs), EventHandlerName = nameof(OnSendToPerformanceOwn) } }, { TaskGroup.TaskCreateRequestedEvent.Id, new EventHandlerInfo { EventId = TaskGroup.TaskCreateRequestedEvent.Id, EventArgsType = typeof(OnTaskCreateEventArgs), EventHandlerName = nameof(OnTaskCreateRequest) } }, { TaskGroup.RecallRequestedEvent.Id, new EventHandlerInfo { EventId = TaskGroup.RecallRequestedEvent.Id, EventArgsType = typeof(EventServiceEventArgs), EventHandlerName = nameof(OnTaskGroupRecallRequested) } }, { TaskGroup.TaskCompletedEvent.Id, new EventHandlerInfo { EventId = TaskGroup.TaskCompletedEvent.Id, EventArgsType = typeof(ChildCardEventArgs), EventHandlerName = nameof(OnTaskGroupTaskCompleted) } }, { TaskGroup.TaskRecalledEvent.Id, new EventHandlerInfo { EventId = TaskGroup.TaskRecalledEvent.Id, EventArgsType = typeof(ChildCardEventArgs), EventHandlerName = nameof(OnTaskGroupTaskRecalled) } } }; }Для TaskGroup.SentToPerformanceEvent.Idбыл указан собственный обработчик события —OnSendToPerformanceOwn.Вместо наследования
TaskGroupEventHandlerServiceможно наследоватьEventHandlerServiceи реализоватьITaskGroupEventHandlerService. В таком случае нужно будет обеспечить обработку всех событий самостоятельно. -
Укажите компонент, содержащий собственную реализацию
TaskGroupEventHandlerServiceв Справочнике видов (в секцииServicesу нужного вида ГЗ) с помощью программы DVExplorer. Для данного вида нужно установить флагUseOwnServicesв значениеTrueи добавить все обработчики, которые были бы активны для этого вида в обычном режиме. Добавлять обработчики необходимо от родительского вида ГЗ, за исключением обработчикаTaskGroupEventHandlerService(теперь реализован собственный).
Реализация собственного обработчика заданий
-
Создайте библиотеку с классом, унаследованным от
DocsVision.BackOffice.ObjectModel.Services.TaskEventHandlerService(содержит стандартную реализацию). -
Добавьте метод, аналогичный стандартному методу.
Список стандартных методов:-
OnCardStateChanged— обрабатывает событие изменения состояния самого задания или связанной с ним карточки (дочернего задания, группы заданий). В стандартной реализации обеспечивает все изменения, связанные с изменением состояния: уведомляет родительское задание о завершении или отзыве дочернего; завершает задание, если завершилась связанная группа заданий. -
OnTaskRecallRequested— обрабатывает запрос отзыва задания. В стандартной реализации распространяет событие отзыва на все незавершённые дочерние задания и вызывает процедуру отзыва задания. -
OnChildTaskCreated— обрабатывает создание дочернего задания. В стандартной реализации устанавливает двустороннюю подписку на событие StateChangedEvent между родительским и дочерним заданиями. -
OnChildTaskCopied— обрабатывает копирование дочернего задания. В стандартной реализации выполняет ту же подписку, что иOnChildTaskCreated. -
OnChildTaskRemoved— обрабатывает удаление дочернего задания. В стандартной реализации не используется. -
OnChildTaskCompleted— обрабатывает завершение дочернего задания. В стандартной реализации переустанавливает подписку на события дочернего задания. -
OnChildTaskRecalled— обрабатывает отзыв дочернего задания. В стандартной реализации не используется. -
OnChildTaskGroupCreated— обрабатывает создание дочерней группы заданий. В стандартной реализации подписывает родительское задание на событиеStateChangedEventдочерней группы. -
OnChildTaskGroupRemoved— обрабатывает удаление дочерней группы заданий. В стандартной реализации не используется.
Добавленный собственный метод должен иметь другое название (например,
OnTaskRecallRequestedOwn), но ту же сигнатуру, что и оригинальный. -
-
Переопределите метод
GetHandlersInfoбазового классаTaskEventHandlerService, указав список действующих обработчиков в реализованном компоненте:protected override IDictionary<Guid, EventHandlerInfo> GetHandlersInfo() { return new Dictionary<Guid, EventHandlerInfo> { { BaseCard.StateChangedEvent.Id, new EventHandlerInfo { EventId = BaseCard.StateChangedEvent.Id, EventArgsType = typeof(OnStateChangedEventArgs), EventHandlerName = nameof(OnCardStateChanged) } }, { Task.RecallRequestedEvent.Id, new EventHandlerInfo { EventId = Task.RecallRequestedEvent.Id, EventArgsType = typeof(EventServiceEventArgs), EventHandlerName = nameof(OnTaskRecallRequestedOwn) } }, { Task.ChildTaskCreatedEvent.Id, new EventHandlerInfo { EventId = Task.ChildTaskCreatedEvent.Id, EventArgsType = typeof(ChildCardEventArgs), EventHandlerName = nameof(OnChildTaskCreated) } }, { Task.ChildTaskCopiedEvent.Id, new EventHandlerInfo { EventId = Task.ChildTaskCopiedEvent.Id, EventArgsType = typeof(ChildCardEventArgs), EventHandlerName = nameof(OnChildTaskCopied) } }, { Task.ChildTaskRemovedEvent.Id, new EventHandlerInfo { EventId = Task.ChildTaskRemovedEvent.Id, EventArgsType = typeof(ChildCardEventArgs), EventHandlerName = nameof(OnChildTaskRemoved) } }, { Task.ChildTaskCompletedEvent.Id, new EventHandlerInfo { EventId = Task.ChildTaskCompletedEvent.Id, EventArgsType = typeof(ChildCardEventArgs), EventHandlerName = nameof(OnChildTaskCompleted) } }, { Task.ChildTaskRecalledEvent.Id, new EventHandlerInfo { EventId = Task.ChildTaskRecalledEvent.Id, EventArgsType = typeof(ChildCardEventArgs), EventHandlerName = nameof(OnChildTaskRecalled) } }, { Task.ChildTaskGroupCreatedEvent.Id, new EventHandlerInfo { EventId = Task.ChildTaskGroupCreatedEvent.Id, EventArgsType = typeof(ChildCardEventArgs), EventHandlerName = nameof(OnChildTaskGroupCreated) } }, { Task.ChildTaskGroupRemovedEvent.Id, new EventHandlerInfo { EventId = Task.ChildTaskGroupRemovedEvent.Id, EventArgsType = typeof(ChildCardEventArgs), EventHandlerName = nameof(OnChildTaskGroupRemoved) } } }; }Для Task.RecallRequestedEvent.Idбыл указан собственный обработчик —OnTaskRecallRequestedOwn.Вместо наследования
TaskEventHandlerServiceможно наследоватьEventHandlerServiceи реализоватьITaskEventHandlerService. В таком случае нужно будет обеспечить обработку всех событий самостоятельно. -
Укажите компонент, содержащий собственную реализацию в Справочнике видов (в секции
Servicesу нужного вида задания) с помощью DVExplorer. При этом у данного вида нужно установить флагUseOwnServicesв значение True и добавить все обработчики, унаследованные от родительских видов задания (с учётом всей цепочки иерархии), за исключениемTaskEventHandlerService.