Введение
Для того чтобы создать плагин, можно использовать любой язык программирования из .Net-семейства, на выходе должна быть сборка под .Net 4.7.2, которую iikoFront загрузит при запуске. Для загрузки каждого плагина iikoFront создаёт отдельный процесс-контейнер и загружает плагин в него, это позволяет избежать конфликтов зависимостей и обеспечивает надёжность системы (сбой в одном из плагинов не обрушит всё остальное). Каждый плагин устанавливается в отдельную подпапку папки Plugins
, по умолчанию расположенной в C:\Program Files\iiko\iikoRMS\Front.Net
. Сборка плагина должна содержать класс, имеющий публичный конструктор по умолчанию (без параметров) и реализующий интерфейс IFrontPlugin
. Взаимодействие между процессами плагина и приложения iikoFront осуществляется через IPC-канал, передача объектов происходит либо по ссылке (такие объекты должны наследоваться от MarshalByRefObject
), либо по значению (классы данных, они должны быть сериализуемыми).
Точкой входа является класс плагина. При запуске плагина создаётся экземпляр этого класса, в его конструкторе можно загрузить необходимые для работы данные, установить какие-то подключения, подписаться на интересующие события и так далее. Перед остановкой работы и выгрузкой плагина вызывается метод Dispose
, предназначенный для отписки от событий, закрытия подключений и освобождения прочих ресурсов.
Взаимодействие с API начинается со статического класса PluginContext
, в котором собраны все функции и сервисы:
PluginContext.Operations
— сервис операций,PluginContext.Notifications
— сервис уведомлений,PluginContext.Licensing
— лицензирование,PluginContext.Services
— все доступные сервисы, включая перечисленные выше, а также сервисы других версий API,PluginContext.Log
— логирование,PluginContext.Shutdown()
— выключение плагина.
Основные контракты
Структуры данных
Данные собраны в пространстве имён Resto.Front.Api.Data
и сгруппированы по направлениям:
Organization
— структура предприятия и его настройки,Assortment
— номенклатура меню,Orders
— заказы, включая гостей, блюда, модификаторы, скидки и т. п.,Kitchen
— кухонные заказы,Brd
— аббревиатура от «банкеты, резервы и доставки»,Security
— данные, необходимые для авторизации плагина,Licensing
— управление лицензиями,- …
В основном объекты данных доступны только для чтения — для них публикуется интерфейс с get-only свойствами, так что плагин не может создавать новые экземпляры таких объектов или изменять значения полей существующих. Многие объекты, например, IProduct
, ITable
или IUser
, нельзя редактировать в принципе, это справочники, задаваемые через приложение iikoOffice. Некоторые типы объектов можно редактировать опосредованно путём применения к ним тех или иных действий. Наконец, существует специальная категория объектов, расположенных в пространстве имён Resto.Front.Api.Data.DataTransferObjects
, которые могут быть созданы и отредактированы на стороне плагина.
Сервис операций
Практически все действия выполняются через IOperationService
. Входящие в состав этого интерфейса методы можно разделить на группы:
- чтение данных — получение всех объектов некоторого типа (
GetProductGroups
), получение конкретного объекта (GetProductGroupById
), получение связанных объектов (GetChildGroupsByProductGroup
), - изменение данных — одиночные действия (
PrintBillCheque
), пакетные действия (черезCreateEditSession
), - другие операции — отображение сообщений (
AddWarningMessage
), проверка прав (CheckCanEditOrder
) и прочие.
При работе с IOperationService
инициатива на стороне плагина.
Сервис уведомлений
INotificationService
позволяет подписаться на интересующие события. Уведомления об изменении данных реализованы с использованием библиотеки Reactive Extensions (Rx), события публикуются в виде IObservable<T>
-последовательностей, где T
— аргумент события (изменившийся объект). Rx позволяет работать с потоком событий так же удобно, как LINQ с IEnumerable<T>
. Для знакомства с возможностями реактивного программирования есть хороший ресурс Introduction to Rx. Здесь же можно подписаться на такие операции как открытие или закрытие кассовой смены, печать сервисного или кассового чека и так далее. Помимо непосредственно уведомления о выполняющейся операции, могут быть доступны дополнительные возможности, например, при закрытии кассовой смены можно распечатать дополнительный отчёт, при печати чека добавить в него маркетинговую информацию, при переходе на экран оплаты добавить в заказ подарочное блюдо и платёж с бонусного счёта, а выполнение некоторых операций можно и вовсе отменить, сгенерировав исключение OperationCanceledException
.
При работе с INotificationService
инициатором действий является iikoFront, а плагин является наблюдателем.
Примеры
Помимо прочего в состав SDK входит несколько примеров плагинов в исходных кодах. Имеет смысл ознакомиться с ними, прежде чем приступать к разработке собственного плагина.
SamplePlugin
Данный пример демонстрирует различные сценарии использования API:
- дополнение чеков рекламной информацией,
- работа с заказами (создание заказа, добавление гостей, добавление и удаление блюд и модификаторов, изменение количества порций, печать сервисного чека и пречека, оплата и прочее),
- работа с доставками,
- работа с банкетами и резервами,
- работа со справочниками клиентов, улиц,
- отображение немодальных уведомлений на экране терминала,
- просмотр структуры предприятия (залы, столы, сотрудники),
- просмотр иерархического меню,
- просмотр статистики о работе кухни,
- управление лицензионными подключениями,
- регистрация дополнительных операций в меню iikoFront,
- …
CustomerScreenPlugin
Этот пример представляет собой готовую реализацию экрана покупателя для терминалов с двумя мониторами, где на основном мониторе, обращённом к кассиру, развёрнуто приложение iikoFront, а на дополнительном мониторе находящемся со стороны покупателя, демонстрируются логотип предприятия и рекламные видеоролики, в упрощённом виде отображается состав текущего заказа.
Resto.Front.Api.SampleScalePlugin
Пример плагина, реализующего интеграцию с весами. Показывает, как с помощью плагина можно подключить и использовать весы, которые не поддерживаются штатно.
Resto.Front.Api.SampleCashRegisterPlugin
Демонстрирует работу с произвольным фискальным регистратором.