SimpleUI фреймворк для быстрого создания бизнес приложений на Android

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Добрый день! Меня зовут Дмитрий Воронцов. Несколько лет назад, я сделал небольшую локальную разработку под нужды своих 1С проектов (ERP, MES, WMS) – андроид клиент для ТСД и планшетов, который по сути являлся тонким клиентом для 1С и работал через HTTP сервис. Он был написан на Java и Android SDK и причина его создания была такая – нужен был легковесный  и высокроизводительный клиент для работы с оборудованием и с возможностью быстрой разработки бизнес логики. Довольно простой бизнес-логики, укладывающейся в рамки того, что обычно делается на ТСД. Он был достаточно примитивен и умел отрисовывать экраны на мобильном устройстве, а логика выполнялась на стороне 1С в рамках HTTP-запроса. Постепенно он обрастал функционалом, добавились возможности для offline работы, добавился Python, CV-функционал и многое другое. Им стали пользоваться кроме меня и моих коллег другие комманды разработчиков. И вот сегодня, в феврале 2023 я хочу подвести определенные и рассказать о том, во что превратился этот проект сейчас и что из себя представляет фреймфорк на текущий момент.

Сейчас SimpleUI для Android – это бесплатный full-app фреймворк для упрощенного создания широкого спектра бизнес-приложений (клиентских приложений для ERP,WMS и других корпоративных систем, а также самостоятельных приложений). За счет особой архитектуры и принципов проектирования значительно сокращается время разработки, распространение и администрирование, поддержка.

Принципы и цели

SimpleUI для Android – не кроссплатформенная система, вместо этого этот фреймворк глубоко использует возможности Android и нативные подходы к разработке. Все реализовано с максимальным стандартным использованием Android SDK что позволяет создавать быстрые и легкие решения с максимальной производительностью и надежностью.

Приложение для Android запускает конфигурации (UI-файлы) которые разрабатываются в «Конструкторе» и представляют из себя JSON-файл, либо просто JSON-строку каким либо образом переданную приложению (через файл на устройство, через веб-севис и т.д.). Конфигурация включает в себя структуру процессов приложения, формы(экраны), обработчики событий и т.д.

И собственно основная цель, ради которой это делалось – сделать процесс создания и поддержки решений максимально простым и быстрым. Ведь все тоже самое можно сделать на другом фреймворке, например взять Android Studio и написать на Kotlin/Java. Лично я разработчик с большим опытом использования этих инструментов, но когда речь идет о том чтобы быстро накидать несколько АРМ(рабочих мест) для корпоративной системы – я выбираю Simple. Simple дает структуру для решений – некий унифицированный формат, возможность другому разработчику быстро присоединиться к проекту и знать где что лежит. Делая большие корпоративные системы так или иначе приходят к необходимости использования внутренних библиотек, унифицированных подходов внутри компании, так сказать внутренних фреймворков – вот это он и есть.

Кроме того – низкий порог вхождения. Знаешь Python? Отлично, ты можешь создавать самостоятельные приложения для Android Не, знаешь Python, но знаешь к примеру 1С? Не беда, можно создавать те же самые приложения в онлайн-режиме (еще с CV, AI-штуками, графикой и многими другими плюшками) с обработчиками в бек-системе.

Общая структура конфигурации и основные принципы

Конфигурация(ui-файл) – это набор Процессов. Процессы чаще всего соответствуют какому то бизнес – процессу, например «Приемка товара по заказу» и состоят из одно или нескольких экранов (в случае с ActiveCV вместо обычных экранов – видеопоток, но есть «шаги»). Также могут быть общие для всех процессов сущности, например задание, выполняющееся по расписанию.

Экраны содержат элементы в контейнерах, т.е. разметка осуществляется с помощью контейнера (он как минимум один-корневой). Это различные активные или декоративные визуальные элементы. Также невизуальные элементы – например запуск камеры или сканирование штрихкода.

На экран или в систему в целом приходят события – нажатие кнопки, сканирование штрихкода и т.д. Эти события обрабатываются в обработчиках – синхронно либо асинхронно. Все управление начиная от возникновения собственно события, данных по событию до управляющих команд и вспомогательных переменных проходят через стек переменных. У процесса пока он существует свой стек переменных, есть также глобальные переменные на весь сеанс. В этот стек система помещает например события, а обработчики пишут данные и команды.

На картинке выше происходит следующее: при нажатии кнопки, возникает событие onInput, в стек переменных записываются данные формы и переменная liatener, далее передается в обработчик на python где происходит вычисление inp_1+inp_2 и служебная команда ShowScreen для показа некоего другого экрана

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

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

 

Например система пишет в стек listener=barcode, barcode=22001221112 – что означает что пользователь отсканировал штрихкод и в переменной barcode содержится сам штрихкод. Обработчик к примеру в бек-системе находит по этому штрихкоду товар , например “Шоколад Ritter sport” и пишет в переменные переменную product_name “Шоколад Ritter sport” которую он хочет отобразить на экране

А в экране есть некая надпись в которой есть привязка переменной product_name через @

Вот таким образом все примерно и работает

Экраны поддерживают все визуальные элементы и много чего сверху - готовые блоки. Это позволяет делать яркие, выразительные приложения

ActiveCV

Помимо традиционного способа проектирования приложений – с экранами, кнопками и т.д. есть альтернативный способ, который представляет огромное преимущество для бизнеса в некоторых случаях – режим работы в видеопотоке ActiveCV. Суть этого режима в том что вместо экрана включается камера с видеопотоком в которой происходит непрерывное распознавание объектов различными детекторами:

  • штрихкоды, QR,

  • распознавание текста (OCR)

  • чисел и дат (тоже OCR, но по шаблонам)

  • автомобильных номеров

  • лиц

 , которое связано с обработчиками в которых реализуется некоторая логика по полученным с детекторов данных и в результате поверх объектов в видеопотоке выводятся данные – рисуется подсветка разными цветами, выводится текст и т.д.

Примерно такие могут быть решаемые задачи:

  • Показывать в кадре товары по которым проведена инвентаризация зеленым цветом, товары оп которым не провдена – желтым, а те, которых не должно быть на складе – красным.

  • Выводить рядом с товаром остаток и цену

  • Показывать заказы по которым просрочена дата производства – красным цветом

  • Показывать сотрудников смены зеленым цветом, а лишних на участке – красным

Ознакомиться с ActiveCV можно в этих видео:

https://youtu.be/aLWSw9Rl-CA

https://youtu.be/9Gwho6bWeKk

https://youtu.be/Gwi2tEJnVfo

https://youtu.be/N2nRmewAUAU

Или в этом посте https://infostart.ru/1c/articles/1427287/

Обратите внимание, что не смотря на то, что на экране в принципе можно вывести текст, всетаки больше внимания уделяется цветовой подсветке. Изначально эта технология проектировалась для задачи ускорения реального бизнес процесса (первая задача звучала так «Сотрудник заходит в кузов на X минут, ему нужно быстро проверить товар, ему нужно видеть уже посчитанный товар и тот, который не посчитан. Как можно ускорить этот процесс?». Т.е. в принципе непрерывное сканирование можно сделать и на обычном экране – например вывести таблицу и отмечать строки которые посчитаны цветом. Но подобная визуализация при наведении на объект дает преимущество ускорения самого процесса. Именно поэтому цветовая индикация более предпочтительна. И да, ActiveCV это больше не технология, а методология и организационная практика. И да, это не дополненная реальность, а «псевдо» дополненная реальность, т.к. настоящая на текущем уровне развития слишком прожорлива и ненадежна для реальных применений.

С объектами на экране можно взаимодействовать – нажимать. Также есть вывод кнопок, общих надписей и т.д.

Что еще есть структурно помимо экранов и ActiveCV?

Таймеры

Конечно, решения не обходятся без сервисных процедур по расписанию, работающих в фоне со своей периодичностью. Это может быть периодическая связь с сервером и т.д.

Сервис событий

Некоторые события могут работать не на экранах и даже кога приложение не запущено (не видно в списке приложений), потому что постоянно работает фоновый сервис, который отлавливает события и запускает обработчики. Например это может быть сообщение от другой программы, или штрихкод или распознавание голоса. Ссылка https://infostart.ru/1c/articles/1458666/

Веб сервер

В рамках одной подсети симплу можно посылать различные HTTP-запросы. Напрмиер можно работать с SQL напрямую или выполнять свои кастомные обработчики: например прислать заказ на устройство мгновенным способом или запросить активность.

Различные общие события системы

В системе есть единая точка входа для отлавливания всех общих для системы  событий. Например запись в SQL, приемка файла (кто то поделился файлом) и т.д.

Фоновые задачи WorkManager (*со следующего релиза)

Запуск фоновых задач периодических и однократных не зависимых от активного приложения с гарантированным выполнением

События и обработчики более подробно

Начиная с версии 11, работа с событиями и обработчиками максимально унифицирована.

События могут возникать в трех точках:

  • Экраны

  • ActiveCV

  • Общие события системы

На каждое событие можно подписать:

  • Любое количество любых обработчиков. Т.е. можно например выполнить Python, потом онлайн, потом снова Python

  • …Которые будут запускать синхронно или асинхронно (да, в том числе онлайн обработчики можно теперь запускать в асинхронно, что нивелирует задержки)

  • ...В случае асинхронного выполнения по завершении также можно назначить событие также синхронное либо асинхронное – т.е. рекурсивно

Обработчиками событий могут быть:

  • Python (выполняемый локально) – получает стек переменных, записывает в стек свои переменные и комманды

  • Онлайн – код обработчика содержится на стороне бек-системы и когда условно пользователь нажимает на экране кнопку, в бек систему посылается запрос с стеком переменных, там выполняется обработчик, в ответ посылается этот же стек с переменными и новыми командами.

  • Нативные обработчики. На текущий момент это SQL,HTTP и SET, которые непосредственно могут взаимодействовать с переменными, HTTP-соединениями, SQL-провайдером. Нюансы этого вида обработчиков лучше почитать в статье https://infostart.ru/1c/articles/1800568/

  • Также в будущем возможно использование других интерпретаторов помимо Python и других нативных обработчиков

Обработчики и события могут быть объявлены в конфигурации (чаще всего) и также запущены вручную из кода. Для этого используется единый формат. Пример того как это выглядит в конфигурации

Так и в коде:

hashMap.put("RunEvent",json.dumps([{"action": "run","type": "python","method": "post_online", "postExecute": "" }])) 

Хранение

Организация хранения нужно если конфигурация не чисто онлайн, а может работать без связи с сервером. Тогда данные нужно где то сохранять.

SQL, ORM

Стандартным для Android является встроенный SQLite. Его преимущества в том, что это классическая реляционная СУБД – быстрая работа, SQL запросы, агрегирующие функции. Например найти товар по штрихкоду из 1 миллиона записей, да еще по сложному условию -это не сделать быстрее чем на SQL с индексами. Или например посчитать агрегаты – сумму по строкам таблицы. Опять же быстрее SQL с этим никто не справиться.

Можно завести несколько СУБД в рамках приложения.

В Python обработчиках возможно использование Pony ORM

NoSQL

Также помимо SQL иногда удобнее хранить данные не в реляционном виде, а в виде ключ-значение. Например можно записать пользовательские настройки или например сохранить JSON для последующей обработки.

Работать с NoSQL можно как через стек переменных так и напрямую через импорт Java-классов (из Python)

Файлы, изображения

Из обработчиков Python можно создавать и работать с файлами из папки приложения без ограничений. Работа с внешними папками к сожалению отсутствует по причине безопасности Android т.е. если нужно файл передать например, то это можно сделать к примеру HTTP-запросом.

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

В платформе возможна работа как с ассетами, определенными в конфигурации (элементы декора) так и с проивольными картинками. Кстати, несмотря на то, что картинку можно вывести в элемент экрана как base64, способ через файлы предпочтительнее, так как быстрее . Особенно это заметно на списках с картинками.

Связь

Из решения можно связываться с внешним миром через произвольные HTTP-запросы в обработчиках или же собственно онлайн обработчики, которые тоже являются запросами и через которые можно передать данные в обе стороны (тем более с учетом того, что работа с SQL, NoSQL возможна через стек переменных, а сами обработчики могут работать в асинхроне, то можно не возиться с python и requests а просто вытягивать данные напрямую из бек-системы). Но однако данные бывают большие(например начальное заполнение или картинки), бывают данные требующие особой оперативности или вытраивающиеся в определенный корпоративный ландшафт. Поэтому иногда нужны и произвольные запросы.

Плюс на будущее запланированы другие технологии связи:

  • Работа через WebSocket

  • P2P cвязь через WIFIDirect устройств напрямую без какой либо сети

  • XMPP

  • Работа с очередями (MQTT)

  • Защита и шифрование на уровне приложения

Работа со штрихкодами и оборудованием

Работа с штрихкодами и QR-кодами может быть организована несколькими способами:

  • Подпиской на события(Intent broadcast) встроенного сканера (для терминалов сбора данных) – предпочтительный способ для ТСД, на которых это возможно

  • Распознаванием событий клавиатуры, генерируемых либо встроенным, либо внешним сканером. Это может быть как имитация нажатия клавиш (wedge keys) так и строка с Enter(CR, LF, CR/LF) на конце и некоторые другие варианты перехвата подобных событий.

  • Работа с внешним сканером через Bluetooth напрямую. Вариант бюджетного решения и в некоторых случаях очень удобного решения «телефон в кармане, сканер в руке»

  • Работа через камеру – это может быть как сканирование из экранов, так и ActiveCV

Работа с клавиатурой

Также есть возможность перехватывать аппаратную клавиатуру как на экранах так и на главном меню. Это может пригодиться в случае с ТСД для того чтобы назначать свои функции на аппаратные кнопки, в том числе кнопки для запуска процессов.

Работа с распознаванием, голосом, звуком

В режиме обычных экранов и в Active CV доступен OCR, причем вкупе с нехитрой методикой которая позволяет работать с текстовыми идентификаторами на предметах также надежно (и почти также быстро) как если бы это были обычные штрихкоды, считываемые камерой.

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

Воспроизведение и распознавание голоса

В платформе используется TTS Android поэтому командой speak можно озвучивать любые фразы. Также используется Voice Engine для распознавания голоса, поэтому можно использовать голосовой ввод как на экранах (по кнопке) так и в фоне. Логика может быть размещена в Сервисе событий, таким образом чтобы организовать свой голосовой ассистент – связать цикл «Вопрос-Ответ» с логикой приложения. Например вы сканируете товар, обработчик задает вопрос (speak: «Какое количество?»), и ожидает ответ voice:voice_result , фраза помещается в переменную, из которой ее можно достать обработать и поместить количество в таблицу. Кстати я лично считаю что если и можно как то использовать голосовых ассистентов, то только так- в привязке к обработчикам, полном доступе к данным и бизнес-логике.

Работа с макетами и HTML

Есть возможность работать с HTML-макетами через шаблонизатор (Jinja) из python-обработчиков. Это может пригодиться для того чтобы формировать выходные формы непосредственно на устройстве. Например печатать ярлыки с штрихкодами и сразу выводить их на мобильный принтер без связи с сервером. Там где связь невозможна.

Также HTML-поле содержит JS и в принципе с его помощи можно организовать свой какой то интерфейс внутри. Например туториал по конфигурации.  

Другая возможность – готовить их на сервере и передавать по запросу в PDF тоже присутствует.

Подробнее тут: https://infostart.ru/1c/articles/1716745/

Векторная графика

Можно создавать свои карты с интерактивными векторными объектами. Например можно создать свою карту склада и показывать в ней ячейки из которых предстоит сделать отбор, подсвечивать разными цветами, обрабатывать нажатия на объекты и многое другое. Подробности тут https://infostart.ru/1c/articles/1736200/

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

Все объекты интерактивны как из кода обработчиков так и от пользователя

Можно работать с векторным редактором прямо в экранах для того чтобы делать пометки на фото или просто заметки

Развёртывание, распространение конфигураций и настроек

Особое внимание уделено простоте и многообразию способов доставки конфигураций и обновлений а также настроек на устройство

Настройки приложения, чтобы не вводить их вручную, могут быть помещены в JSON файл и переданы в файлах, либо этот же JSON закодирован в QR при считывании которого настройки записываются на устройство.

Хостинг конфигурации

Часто удобным способом передачи конфигурации является устроить хостинг на каком то локальном веб-сервисе либо например на GitHub. Конфигуратор тоже хостит конфигурацию через Flask так как во время разработки изменения выходят часто и на устройстве достаточно либо перезапустить приложение либо нажать специальную команду в меню.

Также можно передать конфигурацию любыми способами на устройство и открыть приложением как файл – она сразу применится. Этот способ - если нет связи.

Репозиторий конфигураций

Есть механизм который позволяет хранить, обновлять конфигурации, быстро переключаться между ними, выполнять их фоновые задачи. Каждая конфиурация может иметь Поставщика, у поставщика может быть свой хостинг (Url) на который он выкладывает обновления. Таким образом конфигурация может быть «установлена» в репозиторий, где она всегда доступна в локальном виде без связи с сервером.

У нее может быть исполняемая фоновая часть (например доставка сообщений к конкретной конфигурации).

При выпуске обновлений они будут проверяться для каждой конфигурации при запуске приложения если поставщик публикует их на своем URL

suip-файлы

Одна из особенностей Simple – конфигурации очень маленькие, легкие. Это открывает необычные возможности. Одна из таких – возможность выделить любой процесс в виде самостоятельного файла (такой мини-конфигурации), которая сразу содержит в себе данные по этому процессу, т.е. автономная конфигурация с хранилищем внутри себя.

Так, например можно послать содержимое накладной вместе с процессом в виде suip-файла стороннему контрагенту любым способом, например по почте. Он откроет это на своем устройстве сразу же так, как если бы у него была ваша корпоративная конфигурация и сможет работать с ней без подключения к вашим ресурсам: необходимые данные – берутся из фала, а результат его деятельности также сразу пишется в файл, который может быть отослан обратно для обработки. О

Никаких настроек, никакой связи с вашими ресурсами – толкьо установленное приложение и файл.

Например вы можете отослать электронный упаковочный лист и suip-фалом проверки приемки у внешнего покупателя, а он откроет это у себя на телефоне или ТСД , просканирует и отошлет обратно.

Ссылки на ресурсы

ТГ-канал с новостями и анонсами: https://t.me/devsimpleui

Документация: https://uitxt.readthedocs.io/ru/latest/

Статьи на Инфостарте: https://t.me/devsimpleui

Сайт, на котором можно скачать комплект разработчика: http://simpleui.ru/

Источник: https://habr.com/ru/post/720610/


Интересные статьи

Интересные статьи

Один и тот же язык программирования одинаков в любой стране. Нет отличий Python в Китае от Python в Великобритании. Другое дело - модели ведения высокотехнологичного бизнеса. Они могут сильно различат...
Привет, хабровчане! Сектор корпоративных ноутбуков напоминает рынок военной техники. На первый план выходит надёжность и автономность. Дизайн, габариты и вес порой отходя...
Есть статьи о недостатках Битрикса, которые написаны программистами. Недостатки, описанные в них рядовому пользователю безразличны, ведь он не собирается ничего программировать.
Материал, перевод которого мы сегодня публикуем, раскрывает подходы, применяемые его автором при структурировании React-приложений. В частности, речь здесь пойдёт об используемой структуре папок,...
Согласно многочисленным исследованиям поведения пользователей на сайте, порядка 25% посетителей покидают ресурс, если страница грузится более 4 секунд.