Раздел 4 · Модуль 2
Form Builder
Автономный конструктор шаблонов отчётных форм из терминов и FSD с генерацией JSON Schema и собственным согласованием.
Корень: form_builder/. Backend (8100) + Vue-фронт (5174, base /demo/form-builder/). Работает автономно, обращаясь к DG API за терминами/FSD.
4.1 · Данные (БД form_builder)
| Таблица | Поля / назначение |
|---|---|
report_template | Шаблон: code, name, domain_id, version, status (draft/review/approved/rejected), settings (JSON), json_schema (сгенерир.). |
form_section | Секция: order_index, is_repeatable. |
form_field | Поле: source_type (TERM/FSD/custom), source_id, field_label, override_properties (тип, ширина, режим привязки), column_span (1..12), is_required, is_readonly. |
form_layout | Плейсхолдер раскладки. |
4.2 · API
GET/POST /templates GET/PUT /templates/{id}
POST/PUT/DELETE /templates/{id}/sections[/{sid}]
POST/PUT/DELETE /templates/{id}/fields[/{fid}]
GET /templates/{id}/preview — сгенерированная JSON Schema
POST /templates/{id}/submit-review — на согласование
GET /approvals/pending
POST /templates/{id}/approve | /reject
GET /dg/domains | /dg/terms | /dg/fsd | /dg/organizations (прокси в DG)
Интеграция с DG (core/dg_client.py): получает bearer-токен через DG /auth/test-token/{username}, тянет объекты через DG /objects/search?class_code=…. Палитра классов настраивается (palette_class_codes, дефолт ["TERM","FSD"]).
4.3 · Генерация схемы и версионирование
_generate_schema() перебирает поля по order_index, формирует JSON Schema (draft-07) + кастомный ui:sections. Схема не обращается заново к DG — строится из данных поля, зафиксированных в form_field при добавлении.
Версии — в settings.versioning (approved_major.0.draft_patch): согласование поднимает major; редактирование одобренного шаблона возвращает его в draft и поднимает patch; ведётся version_history[].
4.4 · Фронт (сборка формы)
3-панельный конструктор: слева палитра DG-объектов (поиск + фильтр по классу), в центре канвас секций/полей с HTML5 drag-and-drop, внизу — живая JSON Schema.
addFsdAsSection(): при перетаскивании FSD создаётся секция и по одному полю на каждый термин из properties.blocks[].terms (или легаси properties.terms). Отдельного backend-эндпоинта «сгенерировать из FSD» нет — это клиентская оркестрация.Есть UI привязки DQLA к шаблону (сохраняется как settings.dqla_ids) — см. DQ Checks.