Swing-приложение для учета отсканированных DataMatrix/QR-кодов по магазинам с хранением данных в H2 и экспортом в Excel.
- выбор города и магазина из загруженного списка;
- сканирование кодов в привязке к магазину;
- раздельный учет по видам продукции:
РыбаНапитки
- просмотр позиций за день по магазину;
- ручной экспорт позиций в
.xls; - плановый экспорт по Quartz;
- автоматический экспорт при смене ИНН магазина.
В приложении есть глобальный переключатель вида продукции.
- Выбор выполняется в главном окне до выбора магазина.
- Текущее значение отображается в заголовке окна.
- Сканирование, счетчики, просмотр позиций и экспорт работают в рамках выбранного вида продукции.
- В именах экспортируемых файлов используется суффикс:
fishdrinks
- Java 8+
- Maven
- Swing
- Hibernate
- H2
- Apache POI
- Quartz
- Lombok
- src/main/java/com/miirrr/qrscan/App.java - точка входа
- src/main/java/com/miirrr/qrscan/views/MainGUI.java - главное окно
- src/main/java/com/miirrr/qrscan/views/ReportMenu.java - окно фильтрации и экспорта
- src/main/java/com/miirrr/qrscan/services/engine/ReportExport.java - Excel-экспорт
- src/main/java/com/miirrr/qrscan/services/engine/ParseShopImpl.java - загрузка списка магазинов
- src/main/java/com/miirrr/qrscan/services/entities/ProductTypeContext.java - текущий вид продукции
- src/main/java/com/miirrr/qrscan/db/DBConnector.java - инициализация БД
Приложение ищет файл конфигурации в таком порядке:
%USER_HOME%/QRScan/qrscan.cfg./qrscan.cfg
Пример текущего файла: qrscan.cfg
Основные параметры:
dbUrl- URL HTTP-сервиса 1С для получения магазинов и других данныхdbPath- каталог хранения файла H2scheduler- включение планировщика (yes/true/1илиno/false/0)schedulerCron- Quartz cron-expressionoutPath- директория экспорта Excel-файловdataMatrixLength- минимальная длина сканируемого кода
mvn clean packageАртефакт сборки:
target/QRScan-jar-with-dependencies.jar
java -jar target/QRScan-jar-with-dependencies.jarПри старте приложение:
- Инициализирует H2 и Hibernate.
- При включенном
schedulerзапускает Quartz. - Загружает список магазинов.
- Открывает главное окно.
Для запуска приложения без реального сервиса 1С добавлены runtime launcher-ы:
- MockWebServerLauncher.java - поднимает только mock-сервер
- LocalAppWithMockServerLauncher.java - поднимает mock-сервер и сразу запускает приложение против него
Запуск только mock-сервера:
java -cp target/QRScan-jar-with-dependencies.jar com.miirrr.qrscan.mockserver.MockWebServerLauncherЗапуск приложения против mock-сервера:
java -cp target/QRScan-jar-with-dependencies.jar com.miirrr.qrscan.mockserver.LocalAppWithMockServerLauncherЧто делает LocalAppWithMockServerLauncher:
- создает временный
user.home; - пишет временный
QRScan/qrscan.cfg; - направляет
dbUrlна локальный mock-сервер; - создает отдельные временные директории для H2 и экспорта;
- запускает обычный
App.main(...).
- Выберите вид продукции.
- Выберите город.
- Выберите магазин.
- Отсканируйте код в нижнее поле.
- Для просмотра позиций магазина выполните двойной клик по строке магазина.
- Для выгрузки нажмите
Экспорт, задайте период и директорию сохранения.
Ручной экспорт:
ВСЕ- формирует отдельные файлы по магазинам за выбранный период;- выбранный магазин - формирует файл только по нему.
Плановый экспорт:
- запускается Quartz-задачей;
- выгружает позиции за последнюю неделю;
- проходит отдельно по
fishиdrinks; - после успешной выгрузки помечает позиции как
scheduled=true.
Формат имен файлов зависит от сценария, но всегда включает:
- магазин или ИП/ИНН;
- дату;
- суффикс вида продукции
fishилиdrinks.
Используется файловая H2-база.
- таблицы создаются и обновляются Hibernate через
hbm2ddl=update; - позиции сохраняются с признаком
product_type; - старый уникальный индекс по
qr_codeснимается при старте, чтобы одинаковый код мог существовать в разных видах продукции.
- GUI частично сгенерирован IntelliJ UI Designer;
- для части сущностей и DTO используются Lombok-аннотации;
- проект ориентирован на Windows-пути в примере конфигурации, но сам код не ограничен Windows.
В проект добавлен test support модуль для имитации HTTP-сервера 1С. Сами классы mock-сервера лежат в runtime-коде и могут использоваться и тестами, и локальным запуском:
- MockWebServerModule.java - локальный mock-сервер
- MockResponses.java - готовые JSON-ответы
- IntegrationTestEnvironment.java - изолированное окружение с временным
qrscan.cfg, H2 и mock-сервером
Типовой сценарий использования:
import com.miirrr.qrscan.mockserver.MockResponses;
try (IntegrationTestEnvironment env = IntegrationTestEnvironment.create()) {
env.getMockServer().setShopsListResponse(
MockResponses.singleShop("k1", "Тестовый магазин", "1234567890", "127.0.0.1", "Сургут")
);
// далее вызывается код приложения, который читает Config и ходит в WebServiceImpl
}