feat(sf-legacy): expose EGRN + utilities в Обзор tab
Бэкенд /api/v1/parcels/{cad}/analyze возвращает много новых B5 fields
(egrn, utilities, gate_verdict, nspd_zouit_overlaps, ...), но старая Обзор
вкладка показывает только subset (district, score, POI). User просит чтобы
legacy показывал не только старые данные, ближе к Maxim-style макету.
Добавил 2 conditional блока в OverviewTab после District:
- EGRN compact: address / ВРИ / категория / статус / право (если есть)
- Сети рядом: substation/pipeline/water/... с distances + охранная зона
ЛЭП warning
Type-only: ParcelAnalysis в types/site-finder.ts расширен полями
egrn (8 optional fields) + utilities (summary array + охранная зона flag).
Поля nullable optional — graceful empty state per cad.
Не трогает новый SF (/site-finder/*) и не меняет существующие блоки
Обзора (district / score / POI / isochrones).
This commit is contained in:
parent
f6ea27c4f5
commit
6350e3f59a
2 changed files with 115 additions and 0 deletions
|
|
@ -103,6 +103,100 @@ export function OverviewTab({ data, onIsochronesResult }: Props) {
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
{/* B5 EGRN compact (added 2026-05-18 — expose new field в legacy Обзор) */}
|
||||||
|
{data.egrn && (
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
background: "#fff",
|
||||||
|
border: "1px solid #e5e7eb",
|
||||||
|
borderRadius: 10,
|
||||||
|
padding: "14px 18px",
|
||||||
|
display: "flex",
|
||||||
|
flexDirection: "column",
|
||||||
|
gap: 6,
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<SectionLabel>ЕГРН</SectionLabel>
|
||||||
|
<div style={{ fontSize: 13, color: "#374151" }}>
|
||||||
|
{data.egrn.address && (
|
||||||
|
<div>
|
||||||
|
Адрес: <strong>{data.egrn.address}</strong>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
{data.egrn.permitted_use_text && (
|
||||||
|
<div>
|
||||||
|
ВРИ: <strong>{data.egrn.permitted_use_text}</strong>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
{data.egrn.land_category && (
|
||||||
|
<div>
|
||||||
|
Категория: <strong>{data.egrn.land_category}</strong>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
{data.egrn.parcel_status && (
|
||||||
|
<div>
|
||||||
|
Статус: <strong>{data.egrn.parcel_status}</strong>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
{data.egrn.right_type && (
|
||||||
|
<div>
|
||||||
|
Право: <strong>{data.egrn.right_type}</strong>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{/* B5 Utilities summary (added 2026-05-18 — expose new field в legacy Обзор) */}
|
||||||
|
{data.utilities &&
|
||||||
|
Array.isArray(data.utilities.summary) &&
|
||||||
|
data.utilities.summary.length > 0 && (
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
background: "#fff",
|
||||||
|
border: "1px solid #e5e7eb",
|
||||||
|
borderRadius: 10,
|
||||||
|
padding: "14px 18px",
|
||||||
|
display: "flex",
|
||||||
|
flexDirection: "column",
|
||||||
|
gap: 6,
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<SectionLabel>Сети рядом</SectionLabel>
|
||||||
|
<div style={{ fontSize: 13, color: "#374151" }}>
|
||||||
|
{data.utilities.summary
|
||||||
|
.map((u) => {
|
||||||
|
const label =
|
||||||
|
u.subtype === "substation"
|
||||||
|
? "электричество"
|
||||||
|
: u.subtype === "power_line"
|
||||||
|
? "ЛЭП"
|
||||||
|
: u.subtype === "pipeline"
|
||||||
|
? "газ"
|
||||||
|
: u.subtype === "water_intake"
|
||||||
|
? "вода"
|
||||||
|
: u.subtype === "pumping_station"
|
||||||
|
? "канализация"
|
||||||
|
: u.subtype;
|
||||||
|
return `${label} ${u.nearest_m} м`;
|
||||||
|
})
|
||||||
|
.join(" · ")}
|
||||||
|
</div>
|
||||||
|
{data.utilities.power_line_охранная_зона_flag && (
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
fontSize: 12,
|
||||||
|
color: "#b3261e",
|
||||||
|
fontWeight: 600,
|
||||||
|
marginTop: 4,
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
⚠ Охранная зона ЛЭП — капитальное строительство запрещено
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
{/* Tram warning */}
|
{/* Tram warning */}
|
||||||
{nearestTram !== null && (
|
{nearestTram !== null && (
|
||||||
<div
|
<div
|
||||||
|
|
|
||||||
|
|
@ -401,6 +401,27 @@ export interface ParcelAnalysis {
|
||||||
nspd_opportunity_parcels?: import("./nspd").OpportunityParcel[];
|
nspd_opportunity_parcels?: import("./nspd").OpportunityParcel[];
|
||||||
nspd_red_lines?: import("./nspd").RedLine[];
|
nspd_red_lines?: import("./nspd").RedLine[];
|
||||||
nspd_dump?: import("./nspd").NspdDumpMeta | null;
|
nspd_dump?: import("./nspd").NspdDumpMeta | null;
|
||||||
|
// B5 extended (added 2026-05-18 — expose в legacy Обзор)
|
||||||
|
egrn?: {
|
||||||
|
address?: string | null;
|
||||||
|
permitted_use_text?: string | null;
|
||||||
|
land_category?: string | null;
|
||||||
|
parcel_status?: string | null;
|
||||||
|
right_type?: string | null;
|
||||||
|
cadastral_value_rub?: number | null;
|
||||||
|
cost_per_m2_rub?: number | null;
|
||||||
|
last_egrn_update_date?: string | null;
|
||||||
|
} | null;
|
||||||
|
utilities?: {
|
||||||
|
summary?: Array<{
|
||||||
|
subtype: string;
|
||||||
|
nearest_m: number;
|
||||||
|
name?: string | null;
|
||||||
|
count_within_2km?: number;
|
||||||
|
}>;
|
||||||
|
power_line_охранная_зона_flag?: boolean;
|
||||||
|
note?: string | null;
|
||||||
|
} | null;
|
||||||
}
|
}
|
||||||
|
|
||||||
export type PoiCategory =
|
export type PoiCategory =
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue