iikoFront предоставляет возможность для создания плагинов, работающих с заказами, банкетами/резервами и доставками. Важно! 1. Все интерфейсы API v1 находятся в сборке iikoRMS/Front.Net Resto.Front.Api.V1.dll 2. Для подключения плагина к iikoFront достаточно положить сборку в каталог iikoRMS/Front.Net/Plugins и перезапустить iikoFront. 3. Поскольку каждый плагин работает в своем отдельном процессе, то для отладки плагина необходимо подключиться дебаггером к процессуResto.CashServer.OutOfProcHost.exe Процессов будет столько же, сколько загружено плагинов. Входной точкой для плагина является интерфейс IFrontPlugin: public interface IFrontPlugin : IDisposable { Guid Id { get; } void Init([NotNull] IServiceProvider serviceProvider); void Dispose(); } Свойство Id должно возвращать уникальный идентификатор плагина. Идентификатор должен быть константным и не меняться в процессе работы плагина. Метод Init вызывается в момент инициализации плагина. Он предназначен для подписки на события iikoFront, восстановления сохраненных ранее данных, а также сохранения ссылок на сервисы для дальнейшего использования. Сервис-провайдер, передающийся в метод, позволяет получить доступ к следующим сервисам: 1. Resto.Front.Api.V1.InCurrentUser.IOperationService – предоставляет доступ к методам API, выполняемых от имени пользователя, залогиненного в iikoFront в момент их выполнения. 2. Resto.Front.Api.V1.OutCurrentUser.IOperationService – предоставляет доступ к методам API, выполняемых от имени пользователя, чей токен аутентификации был передан в вызываемый метод. 3. Resto.Front.Api.V1.InCurrentUser.INotificationService – предоставляет доступ к событиям iikoFront, доступным залогиненному в момент срабатывания события в iikoFront пользователю. 4. Resto.Front.Api.V1.OutCurrentUser.INotificationService – предоставляет доступ к событиям iikoFront, доступным пользователю на основании токена аутентификации. 5. Resto.Front.Api.V1.IPluginEnvironmentService – позволяет доступ к каталогу, созданному для хранения собственных данных плагина. Метод Dispose вызывается перед остановкой процесса плагина и предназначен для отписки от событий и освобождения прочих ресурсов. Важно понимать, что в случае некорректного закрытия iikoFront нельзя гарантировать, что метод Dispose будет вызван. Поскольку каждый плагин запускается в отдельном процессе, то для взаимодействия с iikoFront класс, реализующий IFrontPlugin, должен быть унаследован от MarshalByRefObject. А кроме того, такой класс должен иметь конструктор без параметров, чтобы iikoFront мог создать его экземпляр: namespace MyNamespace { using InCurrentUser = Resto.Front.Api.V1.InCurrentUser; using OutCurrentUser = Resto.Front.Api.V1.OutCurrentUser; [UsedImplicitly] public class MyPlugin : MarshalByRefObject, IFrontPlugin { private static readonly Guid id = new Guid("F3AB38C2-DF81-E603-A134-1234567890AB"); public Guid Id { get { return id; } } private CompositeDisposable unsubscribe; private OutCurrentUser.IOperationService operationService; private InCurrentUser.INotificationService notificationService; public void Init(IServiceProvider serviceProvider) { unsubscribe = new CompositeDisposable(); operationService = (OutCurrentUser.IOperationService) serviceProvider.GetService(typeof(OutCurrentUser.IOperationService)); notificationService = (InCurrentUser.INotificationService) serviceProvider.GetService(typeof(InCurrentUser.INotificationService)); } public void Dispose() { unsubscribe.Dispose(); } } } В интерфейсе IOperationService можно выделить несколько основных групп методов: -Методы вида GetSomeEntities – позволяют получить полный набор сущностей типа SomeEntity, актуальный для iikoFront на момент вызова. -Методы вида GetSomeEntityById / TryGetSomeEntityById – позволяют получить сущность типа SomeEntity по ее идентификатору. Если сущность более недоступна, то первый вид методов падает с исключением, а второй возвращает false. -Методы вида GetSomeEntitiesBySomeOtherEntity – позволяют получить набор сущностей типа SomeEntity по сущности типа SomeOtherEntity. Если сущность типа SomeOtherEntity более недоступна или не существует, метод падает с исключением. -Метод AuthenticateByPin – позволяют получить токен аутентификации по пинкоду пользователя. Токен требуется для большинства операций на редактирование и для некоторых операций на получение данных. В случае если аутентификация оказалась неудачной, метод возвращает null. -Метод CreateEditSession – создает объект типа IEditSession, позволяющий выполнять несколько действий в рамках одной транзакции. public void CreateOrderWithTwoProducts() { var credentials = operationService.AuthenticateByPin("1234"); if (credentials == null) return; var section = operationService.GetRestaurantSections().First(); var table = section.Tables.Last(); var editSession = operationService.CreateEditSession(); var newOrder = editSession.CreateOrder(table.ToEntityStub()); var guest = editSession.AddOrderGuest("Guest Name", newOrder); var result = operationService.SubmitChanges(credentials, editSession); var previouslyCreatedOrder = result.Get(newOrder); var previouslyAddedGuest = result.Get(guest); var product1 = operationService.GetProducts().First(); var product2 = operationService.GetProducts().Last(); operationService.AddOrderItemProduct(Guid.NewGuid(), 17.3d, product1, previouslyCreatedOrder, previouslyAddedGuest, credentials); operationService.AddOrderItemProduct(Guid.NewGuid(), 17.3d, product2, previouslyCreatedOrder, previouslyAddedGuest, credentials); return; } INotificationService предоставляет возможность подписаться на события изменения объектов iikoFront, произошедшие в результате действий пользователя или других плагинов. События реализованы с использованием фреймворка Reactive Extensions: unsubscribe.Add(notificationService.ProductChanged.Subscribe(OnProductChanged)); Поскольку внутри iikoFront действует механизм пессимистических блокировок для объектов, то полученные обработчиком событий объекты в большинстве случаев в этот момент недоступны для изменений. Тем не менее, отдельные события предоставляют возможность для внесения изменений. Например,BillChequePrinted: unsubscribe.Add(notificationService.BillChequePrinted.Subscribe(c => { c.BeforeHeader = new XElement("center", "Hello from plugin!"); })); Для каждого плагина создается его собственный лог, используя библиотеку Log4Net. Плагин может писать свои сообщения в этот лог, используяResto.Framework.Common.LogFactory: static readonly ILog Log = LogFactory.Instance.GetLogger(typeof(MyPlugin)); API v1 не позволяет плагинам напрямую управлять или изменять GUI iikoFront, однако плагины могут создавать свои собственные окна, используя WPF. Для получения доступа к UI-потоку используется класс Resto.Framework.Common.UiDispatcher: UiDispatcher.Execute(() => MessageBox.Show("Sample text")); API v1 позволяет выводить в iikoFront немодальные сообщения - Вывести сообщение об ошибке: operationService.AddErrorMessage("Error message"); - Вывести предупреждение: operationService.AddWarningMessage("Warning message"); - Вывести предупреждение, которое закроется само через 15 секунд: operationService.AddWarningMessage( "Warning message", TimeSpan.FromSeconds(15)); - Вывести обычное сообщение: operationService.AddNotificationMessage("Simple message"); - Вывести обычное сообщение, которое закроется само через 15 секунд: operationService.AddNotificationMessage( "Simple message", TimeSpan.FromSeconds(15)); |