Изменение состояния карточки

Пример кода, переводящего карточку группы заданий в завершённое состояние:
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 Разблокируем карточку.

Изменение методов обработки событий заданий и групп заданий

Разработчик может переопределить процедуру обработки событий запуска и выполнения заданий и групп заданий. Например, изменить механизм создания заданий по группе заданий.

Данная возможность обеспечивается двумя специальными компонентами:
  • Обработчик событий заданий

  • Обработчик событий группы заданий

Чтобы реализовать собственный обработчик группы заданий:
  1. Создайте библиотеку с классом, унаследованным от DocsVision.BackOffice.ObjectModel.Services.TaskGroupEventHandlerService (содержит стандартную реализацию).

  2. Добавьте метод, аналогичный стандартному методу.

    Список стандартных методов:
    • OnSendToPerformance — обрабатывает событие отправки согласования исполнителям группы заданий (ГЗ). В стандартной реализации создаёт события на запуск задания отдельному исполнителю.

    • OnTaskCreateRequest — обрабатывает запрос на создание задания отдельного исполнителя. В стандартной реализации, создаёт задание группы и запускает его.

    • OnTaskGroupRecallRequested — обрабатывает запрос отзыва ГЗ. В стандартной реализации, создаёт события отзыва для заданий данной ГЗ.

    • OnTaskGroupTaskCompleted — обрабатывает завершение ГЗ. В стандартной реализации не используется, работает OnCardStateChanged.

    • OnTaskGroupTaskRecalled — обрабатывает отзыв ГЗ. В стандартной реализации не используется, работает OnCardStateChanged.

    • OnCardStateChanged — обрабатывает событие изменения состояния ГЗ или одного из заданий ГЗ. В стандартной реализации, данный метод обеспечивает все изменения, связанные с изменением состояния:

      • Завершения ГЗ, если завершились все дочерние задания.

      • Завершение родительского задания при завершении ГЗ, если это предусмотрено

      • Пррочие события изменения состояния.

    Добавленный собственный метод должен иметь другое название (например, OnSendToPerformanceOwn), но ту же сигнатуру, что оригинальный.

  3. Переопределите метод 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. В таком случае нужно будет обеспечить обработку всех событий самостоятельно.

  4. Укажите компонент, содержащий собственную реализацию TaskGroupEventHandlerService в Справочнике видов (в секции Services у нужного вида ГЗ) с помощью программы DVExplorer. Для данного вида нужно установить флаг UseOwnServices в значение True и добавить все обработчики, которые были бы активны для этого вида в обычном режиме. Добавлять обработчики необходимо от родительского вида ГЗ, за исключением обработчика TaskGroupEventHandlerService (теперь реализован собственный).

Реализация собственного обработчика заданий

Чтобы реализовать собственный обработчик заданий:
  1. Создайте библиотеку с классом, унаследованным от DocsVision.BackOffice.ObjectModel.Services.TaskEventHandlerService (содержит стандартную реализацию).

  2. Добавьте метод, аналогичный стандартному методу.

    Список стандартных методов:
    • OnCardStateChanged — обрабатывает событие изменения состояния самого задания или связанной с ним карточки (дочернего задания, группы заданий). В стандартной реализации обеспечивает все изменения, связанные с изменением состояния: уведомляет родительское задание о завершении или отзыве дочернего; завершает задание, если завершилась связанная группа заданий.

    • OnTaskRecallRequested — обрабатывает запрос отзыва задания. В стандартной реализации распространяет событие отзыва на все незавершённые дочерние задания и вызывает процедуру отзыва задания.

    • OnChildTaskCreated — обрабатывает создание дочернего задания. В стандартной реализации устанавливает двустороннюю подписку на событие StateChangedEvent между родительским и дочерним заданиями.

    • OnChildTaskCopied — обрабатывает копирование дочернего задания. В стандартной реализации выполняет ту же подписку, что и OnChildTaskCreated.

    • OnChildTaskRemoved — обрабатывает удаление дочернего задания. В стандартной реализации не используется.

    • OnChildTaskCompleted — обрабатывает завершение дочернего задания. В стандартной реализации переустанавливает подписку на события дочернего задания.

    • OnChildTaskRecalled — обрабатывает отзыв дочернего задания. В стандартной реализации не используется.

    • OnChildTaskGroupCreated — обрабатывает создание дочерней группы заданий. В стандартной реализации подписывает родительское задание на событие StateChangedEvent дочерней группы.

    • OnChildTaskGroupRemoved — обрабатывает удаление дочерней группы заданий. В стандартной реализации не используется.

    Добавленный собственный метод должен иметь другое название (например, OnTaskRecallRequestedOwn), но ту же сигнатуру, что и оригинальный.

  3. Переопределите метод 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. В таком случае нужно будет обеспечить обработку всех событий самостоятельно.

  4. Укажите компонент, содержащий собственную реализацию в Справочнике видов (в секции Services у нужного вида задания) с помощью DVExplorer. При этом у данного вида нужно установить флаг UseOwnServices в значение True и добавить все обработчики, унаследованные от родительских видов задания (с учётом всей цепочки иерархии), за исключением TaskEventHandlerService.