pcp-tgu: пауза цепочки после REJECTED + режим «Черновики» + UI цепочек/ЗРВ

Бэкенд (pcp-tgu-service):
- REJECTED трактуется как «план неправильный»: авто-перевыдача больше НЕ
  взводится, цепочка встаёт на паузу (новый флаг
  SpacecraftPlanningStateEntity.pausedAfterReject, миграция V13). Технические
  негативы («не заложен»/«не принят») по-прежнему дают срочную перевыдачу.
- Пауза централизована в PlanProjectionService.project(): для отклонённой
  цепочки проекция пустая, воркер выдачи ничего не материализует. Флаг
  снимается при ручной выдаче/промоуте черновика/приёмке (оператор вмешался).
- Режим «Черновики»: GET /plans/drafts (опц. ?spacecraftId) -> только DRAFT.
- Гард дублей черновиков: (КА + начало + конец) уникальны среди DRAFT,
  повторное создание окна -> 409.
- ZrvWindowMatcher: сравнение по истинной abs-длительности Duration (<=1с),
  устойчиво к усечению ISO на фронте до целых секунд.

Фронт (pcp-tgu-ops-ui): вкладка «Планы» — таймлайн цепочек, детали плана,
панель ЗРВ (TguZrvPanel), диалог создания цепочки, режим черновиков.

Удалён устаревший docs/tasks/TASK_tgu-plan-versioning-manual-reissue.md.
This commit is contained in:
Дмитрий Соловьев
2026-06-04 00:04:47 +03:00
parent 3638afdb85
commit 5049395911
34 changed files with 1062 additions and 458 deletions
@@ -33,12 +33,27 @@ export type TimelineRow = {
export type TimelinePlanSegment = {
plan: TguPlanUi;
rowIndex: number;
laneOffset: number;
/** Индекс дорожки внутри строки КА (0 — верхняя); пересекающиеся планы получают разные дорожки. */
lane: number;
/** Абсолютная вертикальная координата центра линии плана. */
centerY: number;
x: number;
x2: number;
width: number;
};
export type TimelineRowLayout = {
row: TimelineRow;
rowIndex: number;
/** Верх строки (абсолютный y). */
y: number;
height: number;
/** Сколько дорожек занято планами (>=1). */
laneCount: number;
/** Абсолютный y верхней границы страйпа ЗРВ. */
zrvBandY: number;
};
export type TimelineLink = {
spacecraftId: string;
fromPlanId: string;