Здесь собраны образчики моего кода, надерганные из недавнего проекта, в котором я участвовал.
Код к сборке не готов, он только для демонстрации. Где-то чего-то может не хватать. Во многих местах будут нестыковки из-за того, что при выдергивании своего кода из проекта я изменил структуру каталогов и кое-какие файлы.
Комменты в коде могут быть как на русском, так и на английском, потому что во мне периодически просыпается давняя привычка комментить код на буржуйском.
-
Подсистема отчетов
Представляет собой настраиваемый и расширяемый движок, или если угодно микро-фреймворк, позволяющий выдавать отчеты в форматах XLSX, HTML и PDF из Excel-шаблонов на основе данных из БД (и не только).Для того чтобы сделать новый отчет, нужно нарисовать новый шаблон в виде Excel-файла, и реализовать новый класс Fetcher'а для выборки данных.
Верстка в PDF была написана с нуля, т.к. имеющиеся библиотеки были либо проприетарны, либо не предоставляли нужного функционала.
См. также: Презентация к докладу на внутреннем митапе
-
"Умный поиск" на основе Elacticsearch
В разных местах веб-интерфейса пользователь имеет возможность ввести строку поиска, тут же в реальном времени ему выдается список результатов, динамически обновляющийся по мере ввода в строку поиска. Поиск ведется в соответствии с бизнес-контекстом формы, откуда ведется поиск.Обновление поисковых индексов ведется в режиме, приближенном к риалтайму. Триггерами БД заполняется таблица с очередью изменений, которая постоянно обрабатывается джобом инкрементальной индексации.
Здесь представлена вторая версия поискового движка, пришедшая на смену более ранней, которую в свое время разрабатывал тоже я.
См. также: Описание API для фронтэндеров
-
Функционал согласования изменений в объектах системы
Пользователь что-то изменяет в интерфейсе, при этом регистрируется запрос, который передается в смежную систему. Изменения согласовываются, либо отклоняются оператором (возможно с задержкой), после чего ответ возвращается обратно. Обмен происходит через Кафку. Далее, если решение положительное, изменения применяются к экземплярам сущностей.По каждому атрибуту решение может быть принято независимо от остальных. Запросы могут включать в себя иерархически связанные между собой сущности.
Задача решалась максимально обобщенно, с тем чтобы в любой момент можно было расшириться на любые типы сущностей.
См. также: Описание формата обмена для смежных разработчиков
-
Также россыпью представлены кое-какие утилиты за моим авторством, использующиеся в проекте.