feat(section7): unify «Концепция» into one engine driven by building_program (#1953) #2101

Merged
bot-backend merged 1 commit from feat/section7-unify-concept into main 2026-06-30 08:35:56 +00:00
Collaborator

Summary

Rebuild §7 «Концепция» of the site-finder report into one coherent block (round-3 feedback, parcel 66:41:0702017:131). Was two incoherent engines glued together:

  • System A «Интерактивная масса застройки» + «Экономика по 3D-модели» → /concepts/recompute (КСИТ 3.5 / 3136 кв)
  • System B «Параметры проекта» + «Рассчитать концепции» → /concepts, default «Авто (max-FAR)» усыпал ~50 корпусами (FAR 2.98 / 2677 кв)

Now a single engine: POST /concepts with building_program is the only source of numbers.

Closes the 3 complaints

  1. «полная неразбериха → единое целое» — System A (MassingEconomics/MassingViewer//concepts/recompute) removed from §7; one display:grid; gap:24 container, conditional result region, reserved-height pending (no skeleton jump), spacing strictly on 4/8/12/16/24/32. One ConceptVariant feeds headline + map + ТЭП + финмодель.
  2. «вписать этажность/высоту/пятно/прочие» — new ConceptProgramForm: free inputs этажность, высота этажа, класс, тип застройки, стоимость; read-only readouts высота корпуса, пятно секции, Σ пятно, ориентир КСИТ. (Editable пятно → follow-up PR-B, additive backend.)
  3. «сколько корпусов, а не усеивать» — primary control «Сколько корпусов строить» (степпер+слайдер 1–12, дефолт 3) → single-type building_program item {section_type, floors, count}. place_program кладёт ровно count корпусов; scatter возможен только при явно включённом тумблере «Уплотнить до максимума» (OFF по умолчанию).

Changes

  • NEW frontend/src/components/concept/ConceptProgramForm.tsx — unified §7 form.
  • REWRITE frontend/src/components/site-finder/analysis/Section7Concept.tsx — single engine, auto-run-on-first-expand (one-shot ref guard), один grid-контейнер.
  • ADDITIVE frontend/src/components/concept/ConceptVariantsResult.tsx — число корпусов в headline, ярлык «Ваша программа» для program-варианта, корпуса-формулировки, скрытие одинокой вкладки. Backward-compatible (используется и в standalone /concept).

Не тронуты: ConceptParamsForm/HouseProgramPicker (standalone /concept), весь backend, MassingViewer/MassingScene (ptica-кокпит).

Test plan

  • tsc --noEmit clean (TS strict), next lint clean, prettier applied
  • code-reviewer APPROVE (auto-run effect cannot loop; shared-component changes backward-compatible + null-safe; backend contract cross-checked)
  • post-deploy: открыть §7 реального отчёта → авто-расчёт срабатывает один раз → 3 корпуса (не усыпано) → тумблер «Уплотнить» → partial-fit «Размещено N из M корпусов»
  • screenshot-verify на проде (gendsgn.ru/site-finder/analysis/66:41:0702017:131)

Часть epic #1953.

## Summary Rebuild §7 «Концепция» of the site-finder report into **one coherent block** (round-3 feedback, parcel `66:41:0702017:131`). Was two incoherent engines glued together: - System A «Интерактивная масса застройки» + «Экономика по 3D-модели» → `/concepts/recompute` (КСИТ 3.5 / 3136 кв) - System B «Параметры проекта» + «Рассчитать концепции» → `/concepts`, default «Авто (max-FAR)» **усыпал ~50 корпусами** (FAR 2.98 / 2677 кв) Now a single engine: `POST /concepts` with `building_program` is the only source of numbers. ### Closes the 3 complaints 1. **«полная неразбериха → единое целое»** — System A (`MassingEconomics`/`MassingViewer`/`/concepts/recompute`) removed from §7; one `display:grid; gap:24` container, conditional result region, reserved-height pending (no skeleton jump), spacing strictly on 4/8/12/16/24/32. One `ConceptVariant` feeds headline + map + ТЭП + финмодель. 2. **«вписать этажность/высоту/пятно/прочие»** — new `ConceptProgramForm`: free inputs этажность, высота этажа, класс, тип застройки, стоимость; read-only readouts высота корпуса, пятно секции, Σ пятно, ориентир КСИТ. (Editable пятно → follow-up PR-B, additive backend.) 3. **«сколько корпусов, а не усеивать»** — primary control «Сколько корпусов строить» (степпер+слайдер 1–12, дефолт **3**) → single-type `building_program` item `{section_type, floors, count}`. `place_program` кладёт ровно `count` корпусов; **scatter возможен только при явно включённом тумблере «Уплотнить до максимума»** (OFF по умолчанию). ### Changes - **NEW** `frontend/src/components/concept/ConceptProgramForm.tsx` — unified §7 form. - **REWRITE** `frontend/src/components/site-finder/analysis/Section7Concept.tsx` — single engine, auto-run-on-first-expand (one-shot ref guard), один grid-контейнер. - **ADDITIVE** `frontend/src/components/concept/ConceptVariantsResult.tsx` — число корпусов в headline, ярлык «Ваша программа» для program-варианта, корпуса-формулировки, скрытие одинокой вкладки. Backward-compatible (используется и в standalone `/concept`). Не тронуты: `ConceptParamsForm`/`HouseProgramPicker` (standalone `/concept`), весь backend, `MassingViewer`/`MassingScene` (ptica-кокпит). ## Test plan - [x] `tsc --noEmit` clean (TS strict), `next lint` clean, prettier applied - [x] code-reviewer ✅ APPROVE (auto-run effect cannot loop; shared-component changes backward-compatible + null-safe; backend contract cross-checked) - [ ] post-deploy: открыть §7 реального отчёта → авто-расчёт срабатывает один раз → 3 корпуса (не усыпано) → тумблер «Уплотнить» → partial-fit «Размещено N из M корпусов» - [ ] screenshot-verify на проде (gendsgn.ru/site-finder/analysis/66:41:0702017:131) Часть epic #1953.
bot-backend added 1 commit 2026-06-30 08:33:04 +00:00
feat(section7): unify «Концепция» into one engine driven by building_program (#1953)
All checks were successful
CI / backend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Successful in 1m49s
CI / changes (pull_request) Successful in 7s
CI / frontend-tests (pull_request) Successful in 55s
b06409f04b
§7 «Концепция» собран из двух несогласованных движков (живой 3D-массинг +
MassingEconomics/recompute — КСИТ 3.5/3136кв; и отдельный greedy-прогон —
FAR 2.98/2677кв) в ОДИН program-поток. Новый ConceptProgramForm: первый и
крупнейший контрол — «сколько корпусов строить» (степпер 1–12, дефолт 3) →
single-type building_program item; усыпание участка возможно ТОЛЬКО при явно
включённом тумблере «Уплотнить до максимума». Один grid-контейнер (gap 24,
без marginTop-каши), условный result-регион, авто-расчёт один раз при первом
раскрытии. ConceptVariantsResult показывает число корпусов + ярлык «Ваша
программа» и прячет одинокую вкладку.

MassingEconomics/recompute больше не импортируются в §7 (остаются для ptica-
кокпита). ConceptParamsForm/HouseProgramPicker не тронуты (standalone /concept).
bot-backend merged commit e359fb4b95 into main 2026-06-30 08:35:56 +00:00
bot-backend deleted branch feat/section7-unify-concept 2026-06-30 08:35:57 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#2101
No description provided.