Вопрос

Вернуть в очередь (объект очереди)

Добрый день. Просьба помочь в ответе на следующий вопрос по очередям:

1) С чем может быть связана проблема, что после нажатия кнопки [Вернуть в очередь], в одном случае объект очереди остается в очереди, но увеличивается счетчик [Количество переносов], а в другом объект очереди исключается из очереди и через 5 минут снова входит в ней, но счетчик не сработал (т.к. создался новый объект очередь).

Какое поведение корректно при нажатии на кнопку [Вернуть в очередь]? Остаться в очереди с увеличенным счетчиком или исключение из очереди, и создание нового объекта очереди?

В документации описано такое поведение:

В результате выполнится возврат в раздел [Домашняя страница]. Отложенное
обращение будет помещено в конец очереди, независимо от настроенных
правил сортировки записей в данной очереди.

//из описания следует, что из очереди выпадать обращение не должно, верно?

У меня такой же вопрос

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

Логика этой кнопки сделана в схеме BasePageV2 в одном из пакетов OperatorSingleWindow:

    onPostponeQueueItemButtonClick: function() {
     var queueItemId = this.get("QueueItemId");
     if (!queueItemId) {
      this.error(this.get("Resources.Strings.QueueItemIsEmptyError"));
      //Страница не связана с элементом очереди единого окна. Действие отменено.
      return;
     }
     this.postponeQueueItem(queueItemId, function(success) {
      var messageString = (success)
       ? "QueueItemPostponeSucceedMessage"//Элемент успешно возвращен в очередь
       : "QueueItemPostponeFailedMessage";//Ошибка при возвращении элемента в очередь
      var message = this.get("Resources.Strings." + messageString);
      this.showInformationDialog(message, function() {
       if (success) {
        this.onQueueItemPostponed();
       }
      }.bind(this));
     }.bind(this));
    }
   },
    postponeQueueItem: function(queueItemId, callback) {
     var serviceCallBack = function(response, success) {
      if (!success) {
       var errorMessage =
        this.Ext.String.format(this.get("Resources.Strings.PostponeQueueItemError"),
         response.responseText);
         //Ошибка возвращения элемента в очередь. Сообщение об ошибке: {0}
       this.error(errorMessage);
       if (callback) {
        callback(false);
       }
       return;
      }
      if (callback) {
       callback(response === 1);
      }
 
     };
     ServiceHelper.callService({
      serviceName: "QueuesService",
      methodName: "PostponeQueueItem",
      data: {
       queueItemId: queueItemId
      },
      callback: serviceCallBack,
      scope: this
     });
    },

Там клиентская логика вызывает серверную функцию из QueuesService:

  [OperationContract]
  [WebInvoke(Method = "POST", UriTemplate = "PostponeQueueItem", BodyStyle = WebMessageBodyStyle.WrappedRequest,
   RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
  public int PostponeQueueItem(Guid queueItemId) {
   var userConnection = HttpContext.Current.Session["UserConnection"] as UserConnection;
   int updateCount = 0;
   string message = string.Empty;
   try {
    if (userConnection == null) {
     throw new ArgumentNullException("UserConnection");
    }
    var update =
     new Update(userConnection, "QueueItem")
      .Set("PostponesCount", new QueryColumnExpression(ArithmeticOperation.Addition,
       new QueryColumnExpression("PostponesCount"), new QueryColumnExpression(Column.Const(1))))
      .Set("OperatorId", Column.Parameter(null, "Guid"))
      .Set("NextProcessingDate", Column.Const(null))
     .Where("Id").IsEqual(new QueryParameter("QueueItemId", queueItemId));
    updateCount = update.Execute();
    message = string.Format(GetResourceValue(userConnection, "QueueItemPostponeUpdatedMessage"),
     queueItemId);
    QueuesUtilities.LogDebug(message);
   } catch (Exception e) {
    message = string.Format(GetResourceValue(userConnection, "InvokeMethodErrorMessage"),
     "PostponeQueueItem", e.Message);
    QueuesUtilities.LogError(message, e);
    throw;
   }
   return updateCount;
  }

По коду видно, что меняется существующая запись: счётчик, дата и очищается ссылка на оператора.

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

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

Спасибо большое за ваш комментарий, взял на вооружение!

Войдите или зарегистрируйтесь, чтобы комментировать