Skip to content

Изменение заказа пока он редактируется кассиром #583

Open

Description

@maksudnishanov

Здравствуйте! Поступила задача внедрять систему акций и бонусов в режиме онлайн, когда кассир добавляет товар в заказ сразу отправляем состав заказ в внешний АПИ и исходя из полученных данных можем добавить акционные товары, применять скидки. Но пока заказ редактируется кассиром при применении скидов получаем ошибку
[24.12.2025 18:58:54.830] | ERROR | ApplyMindboxDiscounts error for order 20: One or more objects used in edit session are already in use.
Server stack trace:
в Resto.Front.Api.V9Preview7.Editors.EditSessionWriter.LockEntities(ILockedObjectsToken lockedObjectsToken) в H:\BuildAgent\work\release-installer\dev\iikoFront.Net\Api\Resto.Front.Api\V9Preview7\Editors\EditSessionWriter.cs:строка 111
в Resto.Front.Api.V9Preview7.OperationServiceInternal.SubmitChanges(IUser user, IEditSession editSession) в H:\BuildAgent\work\release-installer\dev\iikoFront.Net\Api\Resto.Front.Api\V9Preview7\OperationServiceInternal.cs:строка 2430
в Resto.Front.Api.V9Preview7.OperationServiceInternal.Resto.Front.Api.IOperationServiceInternal.SubmitChanges(IEditSession editSession, ICredentials credentials) в H:\BuildAgent\work\release-installer\dev\iikoFront.Net\Api\Resto.Front.Api\Generated\Api_V9Preview7\Operations.g2.cs:строка 3137
в System.Runtime.Remoting.Messaging.StackBuilderSink._PrivateProcessMessage(IntPtr md, Object[] args, Object server, Object[]& outArgs)
в System.Runtime.Remoting.Messaging.StackBuilderSink.SyncProcessMessage(IMessage msg)

Exception rethrown at [0]:
в System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
в System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
в Resto.Front.Api.IOperationServiceInternal.SubmitChanges(IEditSession editSession, ICredentials credentials)
в Resto.Front.Api.OperationServiceFacade.Resto.Front.Api.IOperationService.SubmitChanges(IEditSession editSession, ICredentials credentials)
в Resto.Front.Api.Extensions.OperationServiceExtensions.AddCardLoyaltyDiscounts(IOperationService operationService, IReadOnlyCollection`1 discounts, IOrder order, ICredentials credentials)
в EvosPlugin.Subscriptions.OrderChangedHandler.ApplyMindboxDiscounts(IOrder order, JObject response) в ....Plugin\Subscriptions\OrderChangedHandler.cs:строка 348

как мы можем добиться к выполнению задачи, т.е., изменить состав заказа , применять скидки пока заказ формируется кассиром ?

Activity

  1. baddev1337 commented on Dec 25, 2025

    @baddev1337

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

  2. rgalk commented on Jan 12, 2026

    @rgalk
    Contributor

    @maksudnishanov, ознакомьтесь с информацией в статье про Редактирование данных. В ней есть описание и рекомендации с том как работать с исключениями типа EntityAlreadyInUseException.
    Если не разберетесь, то приведите кусок кода с описанием логики его работы и описанием ожиданий как этот код должен работать. Потребуются также пояснения действий и условий, при которых выбрасывается исключение.

  3. serjmors commented on May 5, 2026

    @serjmors

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

    Добрый день. Мне необходимо реализовать аналогичный сценарий с удаленным расчетом скидок и их применением к текущему заказу. Со статьями я ознакомился, если я правильно понял в версии SDK 9.5.6059 ограничение на изменение открытого пользователем заказа уже снято. Однако, возникает проблема с редактированием через обертку TryEditCurrentOrder.

    Что сделано:

    В конструкторе плагина добавляю кнопку на экран

    PluginContext.Operations.AddButtonToOrderEditScreen(
        "Рассичтать скидки",
        _ => DocumentService.CalculateCommand()
    )

    Код команды:

    public static void CalculateCommand()
    {
        PluginContext.Log.Info("executing calculate command");
        try
        {
            PluginContext.Operations.TryEditCurrentOrder(args =>
            {
                PluginContext.Log.Info("current order defered callback");
                args.vm.ShowOkPopup("title", "message");
            });
        }
        catch (Exception e)
        {
            // Исключений не возникает
            PluginContext.Log.Error(e.ToString());
        }
        // Эта строчка не выполняется
        PluginContext.Log.Info("returning from command body");
    }

    В консоль выводится только первая строка "executing calculate command", не возникает никаких исключений, выполнение блокируется на вызове TryEditCurrentOrder.
    Касса показывает лоадер с пояснением "Выполняется сторонний плагин".

    Разве метод TryEditCurrentOrder не должен выполниться и поставить колбэк в некую очередь? Может я концепцию не верно уловил?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions