Перейти к основному содержимому

Конструктор форм (List/Edit Templates)

Назначение

Декларативное описание UI-форм для просмотра списков и редактирования сущностей и документов в Employee API. Разработчик создаёт пару шаблонов (ListTemplate + EditTemplate), описывая колонки, фильтры, поля, таблицы и действия. Фреймворк автоматически разрешает типы, заголовки и значения через рефлексию и локализацию. Фронтенд получает шаблон + данные в едином ответе и отрисовывает форму без знания о конкретной сущности.

Иерархия описания полей

Param (abstract)
└── EntityField<E> — поле сущности (fieldName, поддержка вложенности через ".")
├── ReadableField<E> — чтение значения (valueGetter или рефлексия)
├── UpdateableField<E> — запись значения (valueSetter или рефлексия)
├── ReadOnlyField<E> — динамическое read-only
├── RequiredField<E> — динамическая обязательность
├── FieldWithAvailableValues<E> — список допустимых значений
├── FieldWithAdditionalData<E> — вложенная таблица
└── FieldWithRelatedField — каскадная зависимость от другого поля

Типы полей (ParamType)

ТипОтображение
TEXTТекстовое поле
INTEGERЦелое число
FRACTIONAL_NUMBERДробное число (BigDecimal)
DATEДата (LocalDate)
DATE_TIMEДата и время (LocalDateTime)
BOOLEANЧекбокс
SELECTВыпадающий список (одно значение)
MULTISELECTМножественный выбор
ENTITYСсылка на справочник
DOCUMENTСсылка на документ
SKU_PACKAGINGВиджет выбора упаковки товара
SKU_BATCHВиджет выбора партии
WAREHOUSE_SPACEВиджет выбора складского места
GROUPГруппировка вложенных полей
BASE64Бинарные данные

Автоматическое определение: Integer/Long → INTEGER, BigDecimal → FRACTIONAL_NUMBER, LocalDateTime → DATE_TIME, Enum → SELECT, BaseDoc → DOCUMENT, BaseEntity → ENTITY.

Шаблон списка

Компоненты

КомпонентКлассРоль
КолонкаListColumn<E>Отображение значения, сортировка, ссылка на редактирование
ФильтрListFilterParam<E>Фильтрация по значениям, автоматическая генерация JPA Specification
ДействиеListActionМассовые операции над выбранными записями

Автоматическая генерация фильтров

Тип поляГенерируемый фильтр
EnumIN (множественный выбор из списка значений)
StringLIKE (поиск по подстроке)
BooleanisTrue / isFalse
Entity-ссылкаIN по ID
DatedateFrom / dateTo (диапазон)
DateTimedatetimeFrom / datetimeTo

Сортировка

  • Для enum-полей: автоматический CASE WHEN по локализованным значениям
  • Для обычных полей: прямая JPA Criteria сортировка
  • Кастомная: через sortExpressionGetter

Шаблон формы редактирования

Компоненты

КомпонентКлассРоль
ПолеEditFormField<E>Ввод/отображение значения, все интерфейсы поведения
ТаблицаEditFormTable<E, I>Табличный блок (позиции документа), CRUD строк
Колонка таблицыEditFormTableColumn<E, I>Колонка в табличном блоке
ДействиеEditFormAction<E>Операция из формы (смена статуса и т.п.)
ФайлыEditFormFileList<E, F>Блок файлов (загрузка, скачивание, удаление)

Алгоритм сохранения (saveEntity)

  1. Загрузка существующей сущности (по ID) или создание новой (createEntity())
  2. Проверка привилегий на обновление
  3. Разбор параметров запроса, проверка обязательных полей, удаление read-only
  4. Для каждого параметра: valueSetteradditionalDataTable → рефлексия
  5. Обработка таблиц: сопоставление строк по ID, создание/обновление/soft-delete
  6. beforeEntitySaved()saveEntity()afterEntitySaved()

Базовые классы

Иерархия списков

BaseEntityViewTemplate<S, E>        — общая основа (рефлексия, локализация, контроль доступа)
└── BaseEntityListTemplate<S, E> — списки (фильтры, колонки, действия, пагинация)
└── BaseDocListTemplate<M, ES, D, S> — списки документов (статусы, humanId, раскраска)

Иерархия форм

BaseEntityViewTemplate<S, E>
└── BaseEntityEditTemplate<S, E> — формы (поля, таблицы, действия, файлы)
└── BaseDocEditTemplate<M, ES, D, S> — формы документов (статус, сохранение через DocManager)

Жизненный цикл шаблона

  1. Конструктор → init()addDefaultsToTop() (стандартные поля/колонки сверху)
  2. Код наследника в конструкторе (свои поля/колонки)
  3. @PostConstructaddDefaultsToEnd() (стандартные поля/колонки снизу)

Автоматические возможности

ФункцияМеханизм
Определение типа поляРефлексия по Java-типу
Заголовок поляentities_ru.properties по ключу ClassName.fieldName (с подъёмом по иерархии)
Значение поляIntrospector / bean-property getter
Допустимые значенияАвтоматически для enum-полей (с локализацией)
ОбязательностьПо аннотациям @NotNull / @NotBlank
Раскраска статусовПервый=серый, последний/DONE=зелёный, CANCELED=серый, ERROR=красный

Готовые группы полей

  • addDimensionsFieldGroup — ширина/высота/глубина
  • addPersonFieldGroup — ФИО/телефон/email
  • addLegalEntityFieldGroup — название/ИНН/КПП/ОГРН
  • addAddressFieldGroup — страна/регион/город/.../полный адрес

API контроллеры

EntityController (/employee-api/entities)

МетодEndpointОписание
GET/typesТипы сущностей по категориям (ORGANIZATIONS, EMPLOYEE, SKU, WAREHOUSE, OTHER)
GET/Быстрый поиск по типу и строке
GET/list/templateШаблон колонок, фильтров, действий
POST/listДанные списка с пагинацией
POST/list/actionВыполнение действия над записями
GET/edit/templateШаблон формы + данные
POST/editСохранение
POST/edit/actionДействие из формы
GET/POST/DELETE/edit/file/*Файлы
GET/changesИстория изменений (Envers)

DocumentController (/employee-api/documents)

Аналогичный набор + дополнительно:

МетодEndpointОписание
GET/typesТипы документов по категориям (WAREHOUSE, RECEIPT, SHIPMENT)
GET/relatedДерево связанных документов (parent-child)
GET/status-historyИстория смены статусов

Layout (пользовательские шаблоны)

FormTemplateElementEntityService + FormTemplateController — хранение кастомного расположения элементов формы. Позволяет администратору переопределять layout без изменения бэкенда.