fix(tradein/ui): показывать цену по сделкам Росреестра вместо «недостаточно данных» #2630
No reviewers
Labels
No labels
Fable 5 ревью
GG-форсайт
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
feedback/max
generative
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
ИРД
вторичка
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#2630
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/tradein-v2-deals-fallback-visible"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Проблема
tradein-mvp/frontend/src/app/v2/page.tsx:567считалоinsufficient = estimate.insufficient_data || estimate.n_analogs === 0. Второе условие ложное: backend может (и, после расширения deals-фолбэка в PR #2629, регулярно это делает) вернуть честную ценуmedian_price_rub > 0, посчитанную по сделкам Росреестра (ДКП), даже когда листинговых аналогов-объявлений ноль. v2 всё равно рисовал «НЕДОСТАТОЧНО ДАННЫХ» — 23 существующие оценки по Серову уже застряли в этом состоянии. v1 и PDF-экспорт показывают этот же случай правильно (gate только наinsufficient_data).Изменения
page.tsx—insufficientсужен до единственного честного признака бэкенда:estimate.insufficient_data(@computed_field=median_price_rub <= 0). Условиеn_analogs === 0убрано.mappers.ts(mapResultPanel) — новый флагdealsOnlyPrice = n_analogs === 0 && !insufficient_data. Когда он true, заголовочная карточка «РЕКОМЕНДОВАННАЯ ЦЕНА» меняет вторую строку заголовка и подпись₽/м²с «В ОБЪЯВЛЕНИИ / по объявлениям» на «ПО СДЕЛКАМ РОСРЕЕСТРА / по сделкам Росреестра» + добавлена явная note-строка под карточкой (не выдаёт цену за оценку по объявлениям — честность в обе стороны).SourcesView.tsx— таблицы «объявления» и «фактические сделки» больше не рисуют пустой заголовок без строк при нулевой выборке: приrows.length === 0вместоDataTableрендеритсяEmptyTableNoteс честным текстом (для таблицы объявлений — с подсказкой, что цена посчитана по сделкам Росреестра, когда это так). Соответствующие footer-подписи («Показано 0 из 0 …») скрыты как избыточные при пустой таблице.confidence_explanationбэкенда нигде не читался в v2. Добавлен вResultMeta/SummaryQuality(types.ts) +mapResultPanel/mapSummary(mappers.ts) + вывод: hover-tooltip на «ДОСТОВЕРНОСТЬ» вResultPanel.tsx(тот же паттернtitle=, что уже используется в HeroBar для location-index disclaimer) и видимая строка в блоке «КАЧЕСТВО ДАННЫХ» вObjectSummary.tsx(там больше места, эта строка — более вероятное место, где пользователь реально прочитает «почему такая достоверность»).Радиус на карте (M1, второй пункт) — расследовано, НЕ исправлено в этом PR
Проверил схему
AggregatedEstimateOut(tradein-mvp/backend/app/schemas/trade_in.py) — бэкенд не отдаёт фактический радиус, использованный при поиске аналогов/сделок (base_radius_m/fallback_radius_mвestimator.py— внутренние переменные, не поле ответа). Круг на карте вParamsPanel.tsxуправляется исключительно клиентским селектором РАДИУС (RADIUS_OPTIONS, дефолт «Авто» → превью 1000 м), а не реальным радиусом расширения на бэкенде. Чтобы честно нарисовать фактический радиус (например, «расширили до 2 км» для Первоуральска), backend должен сначала добавить это поле в ответ — выношу отдельной задачей, не стал её выдумывать/чинить в обход контракта.Out of scope (по границам задачи):
analog_tier/address_precision/manual_review_recommendedиз той же M1-находки не выведены в этом PR — явно не запрошены текстом задачи (толькоconfidence_explanation+ расследование радиуса), оставляю как последующий заход.Три состояния (как теперь выглядит каждое)
!insufficient_data,n_analogs > 0!insufficient_data,n_analogs === 0insufficient_data(median_price_rub<=0)InsufficientPanel)Границы
Test plan
npx tsc --noEmit -p tsconfig.json— чистоnext lint— чисто (только 2 pre-existing warning в нетронутых файлах:CianAuthBanner,pct)Refs #2583