feat(tgu-ops-ui): display request polygons on 2D map

Добавлен слой заявок (КНС) на 2D карту ТГУ:
- requestApi.ts — загрузка заявок постранично через GET /v1/requests/map
  с прогресс-коллбэком; автоматически собирает все страницы
- wktParser.ts — парсинг WKT POLYGON/MULTIPOLYGON в массив координат
- drawRequests.ts — Canvas-рендеринг полигонов заявок
- Tgu2DMapLayers.ts — buildTgu2DMapScene строит MapPolygon[] из RequestMapItem[]
- Tgu2DMapTab.tsx — состояние requestsState, кнопка «Загрузить», фильтры по дате
- Tgu2DMapSidebar.tsx — панель слоя заявок: счётчик, ошибки, truncated-предупреждение
- requestTypes.ts — RequestMapItem, RequestMapPage модели
- Поддержка выбора заявки на карте (mapSelectionTypes, mapTypes)
- nginx.conf, vite.config.ts — проксирование /v1 на pcp-request-service в dev

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Дмитрий Соловьев
2026-05-30 23:28:58 +03:00
parent bb84844674
commit 42708450bb
16 changed files with 647 additions and 22 deletions
@@ -0,0 +1,65 @@
export type RequestStatus = "ACCEPTED" | "ACTIVE" | "COMPLETED" | "EXPIRED" | "DELETED";
export type SurveyType = "OPTICS" | "RSA" | "COMBINED";
export type RequestSummary = {
id: string;
name: string;
status: RequestStatus;
surveyType: SurveyType;
importance: number;
beginDateTime: string;
endDateTime: string;
kpp?: number[];
highPriorityTransmit: boolean;
coveragePercent: number;
createdAt: string;
updatedAt: string;
};
export type RequestDetail = {
id: string;
name: string;
status: RequestStatus;
surveyType: SurveyType;
geometry: string;
importance: number;
beginDateTime: string;
endDateTime: string;
kpp?: number[];
highPriorityTransmit: boolean;
createdAt: string;
updatedAt: string;
};
export type RequestListResponse = {
items: RequestSummary[];
page: number;
size: number;
totalItems: number;
totalPages: number;
};
export type RequestFilter = {
beginFrom?: string;
beginTo?: string;
endFrom?: string;
endTo?: string;
status?: RequestStatus;
surveyType?: SurveyType;
};
export type RequestMapItem = {
id: string;
name: string;
status: RequestStatus;
surveyType: SurveyType;
geometry: string;
importance: number;
beginDateTime: string;
endDateTime: string;
kpp?: number[];
highPriorityTransmit: boolean;
coveragePercent: number;
createdAt: string;
updatedAt: string;
};