Generative: Анализ лучших планировок конкурентов → ТЗ на проектирование (Phase 2 после #112) #113

Closed
opened 2026-05-12 15:37:26 +00:00 by lekss361 · 1 comment
lekss361 commented 2026-05-12 15:37:26 +00:00 (Migrated from github.com)

Эшелон: 🟣 Generative — «Что строить» / Phase 2 от Макса
Source feedback: Макс, 12.05.2026 14:01

Контекст

После закрытия #112 (Активные конкуренты) — Макс хочет Phase 2:

«Следующий этап: Анализ наиболее эффективных планировок у конкурентов для формирования технического задания на проектирование.»

То есть — узнать какие планировки у конкурентов продаются быстрее всего, и из этого сформировать ТЗ на собственное проектирование.

Это уникальный USP: «Build what already sells in this district».

Что сделать

1. Source data — где брать планировки конкурентов

Источник Что даёт Status
domrf_kn_flat_records per-flat planning data (size, rooms, layout signature) возможно есть
DOM.РФ kn-API per object детальная квартирография ЖК возможно надо доскачать
Объектив API quartirography с layout-метаданными через B2B (#52)
rosreestr_deals реальные продажи per-flat (cad_num квартиры → площадь, дата сделки, цена)
PRINZIP CRM если есть API через B2B (#52)
NSPD 38489 Помещения per-flat кадастр + площадь #94 search_by_quarter

2. Layout signature — как классифицировать "планировку"

Layout = композиция признаков:

  • room_count: 0 (studio) / 1 / 2 / 3 / 4+
  • size_m2_bin: 0-25 / 25-40 / 40-60 / 60-80 / 80-100 / 100+ (ARN-buckets от НСПД)
  • layout_type: "евро" / "классика" / "панорама" / "two-side" / etc — extract из PD-метаданных
  • balcony_count: 0 / 1 / 2+
  • layout_signature = hash из вышесказанного

3. Backend — POST /api/v1/site-finder/{cad}/best-layouts

Request:

{
  "radius_m": 1000,
  "time_window": "last_2_quarters",
  "filter_competitors": [...],   // from #112 selection
  "min_velocity_per_layout": 0.5  // экземпляров/мес минимум для inclusion в TOP
}

Response:

{
  "top_layouts": [
    {
      "rank": 1,
      "rooms": 1,
      "size_bin": "40-60",
      "layout_type": "евро",
      "balconies": 1,
      "competitor_obj_ids": ["domrf_111", "domrf_222"],  // у кого встречается
      "total_sold_in_window": 67,
      "velocity_per_month": 8.4,
      "avg_price_m2": 148000,
      "avg_size_m2": 48.2,
      "ttl_sold_pct_of_supply": 89,   // 89% этого layout раскупили
      "sample_layouts_pdf_links": ["url1", "url2"]
    },
    ...
  ],
  "recommendation_for_tz": {
    "min_studio_pct": 0,
    "1_room_pct": 35,           // ТЗ: рекомендуется 35% — 1Б "евро"
    "2_room_pct": 40,
    "3_room_pct": 20,
    "4plus_pct": 5,
    "rationale_text": "В радиусе 1км за последние 2 квартала..."
  }
}

4. ТЗ на проектирование — exportable

Кнопка «Сформировать ТЗ на проектирование»:

  • PDF с unit-mix recommendations
  • Per-room target distribution
  • Reference planировки (links на ПД конкурентов где возможно)
  • Avg price/m² benchmark
  • Ready для тендера на проектирование

Используется наш WeasyPrint (уже в стеке).

После #112 + этого issue — Generative Design берёт recommendation_for_tz как input для архитектурной генерации:

  • В сценарии «Жилой комплекс по нашему ТЗ» сразу подставляются Макс's data-driven targets
  • Архитектор сразу видит «Брусника продаёт 1Б-евро 67 шт/квартал → надо строить 250 единиц 1Б-евро»

Acceptance

  • Endpoint работает для test cad — возвращает топ-10 layouts с velocity > 0.5/мес
  • PDF ТЗ генерируется и читается
  • Reference layouts конкурентов (если есть PDF на kn.dom.rf) — ссылки
  • Backward-compat: recommend_mix.algorithm может использовать этот endpoint как source

Effort

~5-6 дней

  • Layout signature extractor (2 дня)
  • Endpoint + materialized view (1.5 дня)
  • PDF ТЗ template (1.5 дня)
  • UI integration (1 день)

Owner

backend-engineer (signature + endpoint) + database-expert (materialized view) + frontend-engineer (PDF + UI integration)

Dependencies

  • #112 (активные конкуренты) — этот issue depends on #112
  • DOM.РФ kn_flat_records должны иметь size + room_count (verify в схеме)
  • B2B Объектив (#52) — для better layout metadata (опционально)
  • Feedback source: Макс (12.05.2026 14:01)
  • Phase 1: #112 Активные конкуренты
  • Foundation для: B1-1 Generative Design (#54 family)
**Эшелон:** 🟣 Generative — «Что строить» / Phase 2 от Макса **Source feedback:** Макс, 12.05.2026 14:01 ## Контекст После закрытия #112 (Активные конкуренты) — Макс хочет **Phase 2**: > «Следующий этап: Анализ наиболее эффективных планировок у конкурентов для формирования технического задания на проектирование.» То есть — **узнать какие планировки у конкурентов продаются быстрее всего**, и из этого **сформировать ТЗ на собственное проектирование**. Это **уникальный USP**: «Build what already sells in this district». ## Что сделать ### 1. Source data — где брать планировки конкурентов | Источник | Что даёт | Status | |---|---|---| | **`domrf_kn_flat_records`** | per-flat planning data (size, rooms, layout signature) | ✅ возможно есть | | **DOM.РФ kn-API per object** | детальная квартирография ЖК | возможно надо доскачать | | **Объектив API** | quartirography с layout-метаданными | через B2B (#52) | | **rosreestr_deals** | реальные продажи per-flat (cad_num квартиры → площадь, дата сделки, цена) | ✅ | | **PRINZIP CRM** | если есть API | через B2B (#52) | | **NSPD 38489 Помещения** | per-flat кадастр + площадь | ✅ #94 search_by_quarter | ### 2. Layout signature — как классифицировать "планировку" Layout = композиция признаков: - **room_count**: 0 (studio) / 1 / 2 / 3 / 4+ - **size_m2_bin**: 0-25 / 25-40 / 40-60 / 60-80 / 80-100 / 100+ (ARN-buckets от НСПД) - **layout_type**: "евро" / "классика" / "панорама" / "two-side" / etc — extract из PD-метаданных - **balcony_count**: 0 / 1 / 2+ - **layout_signature** = hash из вышесказанного ### 3. Backend — `POST /api/v1/site-finder/{cad}/best-layouts` **Request:** ```json { "radius_m": 1000, "time_window": "last_2_quarters", "filter_competitors": [...], // from #112 selection "min_velocity_per_layout": 0.5 // экземпляров/мес минимум для inclusion в TOP } ``` **Response:** ```json { "top_layouts": [ { "rank": 1, "rooms": 1, "size_bin": "40-60", "layout_type": "евро", "balconies": 1, "competitor_obj_ids": ["domrf_111", "domrf_222"], // у кого встречается "total_sold_in_window": 67, "velocity_per_month": 8.4, "avg_price_m2": 148000, "avg_size_m2": 48.2, "ttl_sold_pct_of_supply": 89, // 89% этого layout раскупили "sample_layouts_pdf_links": ["url1", "url2"] }, ... ], "recommendation_for_tz": { "min_studio_pct": 0, "1_room_pct": 35, // ТЗ: рекомендуется 35% — 1Б "евро" "2_room_pct": 40, "3_room_pct": 20, "4plus_pct": 5, "rationale_text": "В радиусе 1км за последние 2 квартала..." } } ``` ### 4. ТЗ на проектирование — exportable **Кнопка «Сформировать ТЗ на проектирование»:** - PDF с unit-mix recommendations - Per-room target distribution - Reference planировки (links на ПД конкурентов где возможно) - Avg price/m² benchmark - **Ready для тендера** на проектирование Используется наш `WeasyPrint` (уже в стеке). ### 5. Cross-link с Generative Design (B1-1..B1-4) После #112 + этого issue — Generative Design берёт **`recommendation_for_tz` как input** для архитектурной генерации: - В сценарии «Жилой комплекс по нашему ТЗ» сразу подставляются Макс's data-driven targets - Архитектор сразу видит «Брусника продаёт 1Б-евро 67 шт/квартал → надо строить 250 единиц 1Б-евро» ## Acceptance - [ ] Endpoint работает для test cad — возвращает топ-10 layouts с velocity > 0.5/мес - [ ] PDF ТЗ генерируется и читается - [ ] Reference layouts конкурентов (если есть PDF на kn.dom.rf) — ссылки - [ ] Backward-compat: recommend_mix.algorithm может использовать этот endpoint как source ## Effort ~5-6 дней - Layout signature extractor (2 дня) - Endpoint + materialized view (1.5 дня) - PDF ТЗ template (1.5 дня) - UI integration (1 день) ## Owner `backend-engineer` (signature + endpoint) + `database-expert` (materialized view) + `frontend-engineer` (PDF + UI integration) ## Dependencies - **#112** (активные конкуренты) — этот issue **depends on** #112 - DOM.РФ kn_flat_records должны иметь size + room_count (verify в схеме) - B2B Объектив (#52) — для better layout metadata (опционально) ## Links - **Feedback source:** Макс (12.05.2026 14:01) - **Phase 1:** #112 Активные конкуренты - **Foundation для:** B1-1 Generative Design (#54 family)
Owner

Closed — Phase 2.1 shipped

Implemented in 4 sub-PRs:

Sub-PR Scope LOC Status
#193 (A) Pydantic schemas + layout_signature.py helpers 236 merged + deployed
#194 (B) data/sql/94_mv_layout_velocity.sql materialized view 114 merged + qa: 459 rows
#196 (C) POST /api/v1/parcels/{cad_num}/best-layouts endpoint + service 985 merged + qa: 5 layouts, pct=100, abs_units=300
#199 (D) POST /best-layouts/pdf (WeasyPrint) + BestLayoutsBlock.tsx UI 1190 merged + qa: PDF 18.8KB, UI rendered, button works

Phase 2.1 limitation: layout_type (евро/классика/панорама) + balcony_count отсутствуют в domrf_kn_flats. Signature = room_bucket × area_bin = 30 классов.

Phase 2.2 (future): B2B Объектив (#52) добавит layout_type → расширенная сигнатура.

Test cad для verify на проде: 66:41:0603016:194 (Верх-Исетский, MV coverage 33%).

Related follow-up: #197 — test-infra integration test gate для site_finder services (защита от schema-drift bugs).

## ✅ Closed — Phase 2.1 shipped **Implemented in 4 sub-PRs:** | Sub-PR | Scope | LOC | Status | |---|---|---|---| | #193 (A) | Pydantic schemas + `layout_signature.py` helpers | 236 | ✅ merged + deployed | | #194 (B) | `data/sql/94_mv_layout_velocity.sql` materialized view | 114 | ✅ merged + qa: 459 rows | | #196 (C) | `POST /api/v1/parcels/{cad_num}/best-layouts` endpoint + service | 985 | ✅ merged + qa: 5 layouts, pct=100, abs_units=300 | | #199 (D) | `POST /best-layouts/pdf` (WeasyPrint) + `BestLayoutsBlock.tsx` UI | 1190 | ✅ merged + qa: PDF 18.8KB, UI rendered, button works | **Phase 2.1 limitation:** `layout_type` (евро/классика/панорама) + `balcony_count` отсутствуют в `domrf_kn_flats`. Signature = `room_bucket × area_bin` = 30 классов. **Phase 2.2 (future):** B2B Объектив (#52) добавит layout_type → расширенная сигнатура. **Test cad для verify** на проде: `66:41:0603016:194` (Верх-Исетский, MV coverage 33%). **Related follow-up:** #197 — test-infra integration test gate для site_finder services (защита от schema-drift bugs).
Sign in to join this conversation.
No project
No assignees
2 participants
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#113
No description provided.