pcp-tgu-ops-ui: fork-forward в редакторе — выбор будущей ЗРВ для перевыдачи невозвратного плана

Селектор «Целевая ЗРВ» в EditorToolbar: текущий слот (replace, по умолчанию)
либо будущая ЗРВ из проекции pcp-tgu-service (fetchSpacecraftPlans →
GET /api/plans/{spacecraftId}, фильтр futureZrvWindows: PLANNED строго в
будущем, кроме базы — та же проекция, что валидирует бэк). Выбор окна
переводит обзор редактора и заставляет ensureDraft слать mode=fork-forward
(naive-UTC окно + kpp); селектор блокируется после создания DRAFT.
This commit is contained in:
Дмитрий Соловьев
2026-06-03 14:12:21 +03:00
parent 2a841fc7b3
commit 057452f19d
7 changed files with 277 additions and 6 deletions
@@ -33,6 +33,36 @@ export type PromoteDraftResponse = {
attemptId: string;
};
/** План КА из проекции pcp-tgu-service (persisted будущая проекция). Времена — ISO с `Z`. */
export type TguPlanResponse = {
planId: string;
spacecraftId: string;
startTime: string;
endTime: string;
kppId: string;
status: string;
};
/**
* Цепочка планов одного КА из pcp-tgu-service (GET /api/plans/{spacecraftId}): persisted планы плюс
* будущая проекция (PLANNED). Используется fork-forward-пикером для выбора целевой ЗРВ — бэк сверяет
* выбранное окно ровно с этой же проекцией (assertWindowMatchesProjection).
*/
export async function fetchSpacecraftPlans(spacecraftId: string): Promise<TguPlanResponse[]> {
const url = `${BASE}/api/plans/${encodeURIComponent(spacecraftId)}`;
let response: Response;
try {
response = await fetch(url, { method: "GET", headers: { Accept: "application/json" } });
} catch {
throw new TguApiError("Не удалось подключиться к сервису планирования ТГУ.", "network");
}
const text = await response.text();
if (!response.ok) {
throw new TguApiError(extractErrorText(text) || "Не удалось получить планы КА.", "http", response.status);
}
return text.trim() ? (JSON.parse(text) as TguPlanResponse[]) : [];
}
/**
* Создаёт черновик плана (DRAFT) на основе базового плана
* (pcp-tgu-service, POST /api/plans/{basePlanId}/draft). Триггерит клон миссии; возвращает