From c32e13e09c502b3dcc1607026c8c6d866c693b2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9=20=D0=A1=D0=BE?= =?UTF-8?q?=D0=BB=D0=BE=D0=B2=D1=8C=D0=B5=D0=B2?= Date: Wed, 3 Jun 2026 10:00:44 +0300 Subject: [PATCH] =?UTF-8?q?pcp-tgu-ops-ui:=20=D0=B3=D0=B0=D1=81=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=20=D0=BA=D0=BD=D0=BE=D0=BF=D0=BA=D0=B8=20=D1=80?= =?UTF-8?q?=D0=B5=D1=88=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BF=D0=BE=20=D0=B8?= =?UTF-8?q?=D1=81=D1=82=D0=B5=D1=87=D0=B5=D0=BD=D0=B8=D0=B8=20grace-=D0=BE?= =?UTF-8?q?=D0=BA=D0=BD=D0=B0=20WAITING=5FDECISION?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../features/tgu-planning/TguPlanDetails.tsx | 45 ++++++++++++------- 1 file changed, 30 insertions(+), 15 deletions(-) diff --git a/services/pcp-tgu-ops-ui/src/features/tgu-planning/TguPlanDetails.tsx b/services/pcp-tgu-ops-ui/src/features/tgu-planning/TguPlanDetails.tsx index 78f23e3..ab0b4ed 100644 --- a/services/pcp-tgu-ops-ui/src/features/tgu-planning/TguPlanDetails.tsx +++ b/services/pcp-tgu-ops-ui/src/features/tgu-planning/TguPlanDetails.tsx @@ -4,6 +4,13 @@ import { platformLabel } from "./tguTimelineMapper"; import { statusStyle } from "./tguStatus"; import { formatUtcDateTime, parseUtc } from "../../utils/utcTime"; +// Бэкенд (pcp-tgu-service) ждёт решения по плану только waiting-decision-grace-minutes +// минут после его startTime; затем IssueDuePlanWorker.tryAdvancePastUnconfirmedPlan +// «молчаливо» продолжает цепочку, оставляя план в WAITING_DECISION, но решение по нему +// больше не принимается (endpoint вернёт 409). Держим значение синхронным с +// config-repo/pcp-tgu-service.yaml → tgu.planning.waiting-decision-grace-minutes. +const DECISION_GRACE_MINUTES = 30; + type TguPlanDetailsProps = { plan?: TguPlanUi; decisionInFlight: boolean; @@ -27,6 +34,8 @@ export function TguPlanDetails({ plan, decisionInFlight, notice, error, onDecisi const style = statusStyle(plan.status); const duration = formatDuration(plan.endMs - plan.startMs); + // Окно решения закрылось, если с момента старта плана прошло больше grace-периода. + const decisionWindowClosed = Date.now() > plan.startMs + DECISION_GRACE_MINUTES * 60_000; const reject = () => { const reason = window.prompt("Reason для REJECTED", "UI_TEST_REJECTED"); @@ -62,21 +71,27 @@ export function TguPlanDetails({ plan, decisionInFlight, notice, error, onDecisi - {plan.status === "WAITING_DECISION" && ( -
- - -
- )} + {plan.status === "WAITING_DECISION" && + (decisionWindowClosed ? ( +
+ Окно решения истекло: прошло больше {DECISION_GRACE_MINUTES} мин после начала плана. Система продолжила + цепочку без подтверждения — решение по этому плану больше не принимается. +
+ ) : ( +
+ + +
+ ))} ); }