Вопрос

Добавление элемента очереди (обращения)

Коллеги, мне необходимо реализовать БП, где триггер - добавление обращения в очередь, см. скриншот

 

К сожалению такой тригер не ловится системой. Кто нибудь знает почему и что с этим можно сделать?

 

Прикрепленные файлы

Нравится

2 комментария

Татьяна, на вопрос «почему» ответить несложно: вся логика наполнения этой таблицы реализована в БП «Процесс наполнения очередей единого окна», где вызывают логику функции ProcessAutoUpdateQueues из QueuesUpdateUtilities.

 

Там добавление идёт при помощи Insert, который не вызывает событий:

  /// <summary>
  /// Adds elements from queue with filtration.
  /// </summary>
  /// <param name="entitySchemaName">Entity schema name of queue element.</param>
  /// <param name="entitySelect">Query to queue object with filtration.</param>
  /// <param name="queueId">Identifier of queue.</param>
  /// <param name="queueName">Queue name.</param>
  /// <param name="itemsCount">Count of not handled elements in queue.</param>
  /// <returns>Added queue items count.</returns>
  private int AddEntityQueueItemsByFilter(string entitySchemaName, Select entitySelect, Guid queueId,
    string queueName, int itemsCount) {
   try {
    if (itemsCount >= _maximumQueueItemsInQueue) {
     QueuesUtilities.LogWarn(string.Format(GetResourceValue("QueueMaximumItemsWarning"), queueName));
     return 0;
    }
    entitySelect.Top(_insertQueueItemTopValue)
     .Column(new QueryParameter("QueueId", queueId)).As("QueueId")
     .Column(new QueryParameter("StatusId", _newQueueItemStatusId)).As("StatusId");
    var selectCondition = new QueryCondition();
    selectCondition.IsNot = true;
    selectCondition.Exists(
     new Select(_userConnection)
      .Column("QueueItem", "Id")
     .From("QueueItem")
     .InnerJoin("QueueItemStatus")
     .On("QueueItemStatus", "Id").IsEqual("QueueItem", "StatusId")
     .Where(entitySchemaName, "Id").IsEqual("QueueItem", "EntityRecordId")
     .And("QueueItem", "QueueId").IsEqual(Column.Parameter(queueId))
     .And("QueueItemStatus", "IsFinal").IsNotEqual(Column.Parameter(true)));
    if (!entitySelect.HasCondition) {
     entitySelect.Where(selectCondition);
    } else {
     entitySelect.And(selectCondition);
    }
    var insertSelect = new InsertSelect(_userConnection)
     .Into("QueueItem")
     .Set("EntityRecordId", "QueueId", "StatusId")
     .FromSelect(entitySelect);
    DateTime addedRecordsStartTime = DateTime.Now;
    int addedRecords = insertSelect.Execute();
    if (addedRecordsStartTime.AddSeconds(60) < DateTime.Now) {
     insertSelect.BuildParametersAsValue = true;
     QueuesUtilities.LogDebug(string.Format(GetResourceValue("LongInsertQueueItemsMessage"),
      queueName, _autoUpdateQueuesProcessId.ToString(), insertSelect.GetSqlText()));
    }
    return addedRecords;
   } catch (Exception e) {
    QueuesUtilities.LogError(string.Format(GetResourceValue("InvokeMethodErrorMessage"),
     string.Concat("AddEntityQueueItemsByFilter ", queueName), e.Message), e);
    throw;
   }
  }

Аналогично и с удалением из очереди.

Сам процесс запускается по планировщику, задание создаётся в QueuesUtilities в функции UpdateQueuesTrigger.

А что делать, сказать сложнее. Возможно, сделать свой процесс, который тоже запускается по таймеру и анализирует наполнение этой таблицы, как-то помечая те, которые уже просмотрены и их повторно учитывать не нужно. Или переопределить упомянутую базовую логику, чтобы она ещё делала нужное Вам.

 

Зверев Александр,

Благодарю за подробный ответ!

Показать все комментарии