From 38c1449e97fe9952ed6e0c6500d730bbdbff7bd0 Mon Sep 17 00:00:00 2001 From: emelianov Date: Tue, 26 May 2026 12:32:33 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=BE=D1=82=D0=BE=D0=B1=D1=80=D0=B0=D0=B6=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D1=82=D0=B5=D0=BA=D1=83=D1=89=D0=B5=D0=B3?= =?UTF-8?q?=D0=BE=20=D0=BF=D0=BB=D0=B0=D0=BD=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pcp/slots_service/service/SlotService.kt | 3 ++ .../resources/static/current_plans_scripts.js | 48 +++++++++++++++++-- 2 files changed, 47 insertions(+), 4 deletions(-) diff --git a/services/pcp-ui-service/src/main/kotlin/space/nstart/pcp/slots_service/service/SlotService.kt b/services/pcp-ui-service/src/main/kotlin/space/nstart/pcp/slots_service/service/SlotService.kt index 8e2360b..18a6ce6 100644 --- a/services/pcp-ui-service/src/main/kotlin/space/nstart/pcp/slots_service/service/SlotService.kt +++ b/services/pcp-ui-service/src/main/kotlin/space/nstart/pcp/slots_service/service/SlotService.kt @@ -165,6 +165,9 @@ class SlotService(webClientBuilderProvider: ObjectProvider) { .block() ?: emptyList() + fun bookedByIds(bookedSlotIds: List): List = + bookedDetailsByIds(bookedSlotIds) + fun bookedDetailsByIds(bookedSlotIds: List): List { val ids = bookedSlotIds.filter { it > 0 }.distinct().toSet() if (ids.isEmpty()) { diff --git a/services/pcp-ui-service/src/main/resources/static/current_plans_scripts.js b/services/pcp-ui-service/src/main/resources/static/current_plans_scripts.js index 7ee0e33..962ed3b 100644 --- a/services/pcp-ui-service/src/main/resources/static/current_plans_scripts.js +++ b/services/pcp-ui-service/src/main/resources/static/current_plans_scripts.js @@ -329,16 +329,41 @@ function bookedSlotDetails(mode) { const slotIds = Array.isArray(mode.bookedSlotIds) ? mode.bookedSlotIds : []; - const slots = slotIds.map((slotId) => { + const rows = slotIds.map((slotId) => { const slot = state.bookedSlotsById[slotId]; if (!slot) { - return `#${escapeHtml(slotId)}`; + return `#${escapeHtml(slotId)}Детали слота не найдены`; } - return `#${escapeHtml(slot.bookedSlotId)} · slot ${escapeHtml(slot.slotNum)} · cycle ${escapeHtml(slot.cycle)} · sat ${escapeHtml(slot.satelliteId)}`; + return ` + + #${escapeHtml(slot.bookedSlotId)} + ${formatDateTime(slot.timeStart)} + ${formatDuration(slot.durationSeconds)} + ${escapeHtml(slot.slotNum ?? '—')} + ${escapeHtml(slot.cycle ?? '—')} + ${escapeHtml(slot.satelliteId ?? '—')} + ${escapeHtml(slot.status || '—')} + `; }).join(''); + return `
Забронированные слоты (${slotIds.length})
-
${slots}
`; +
+ + + + + + + + + + + + + ${rows} +
IDНачалоДлительностьСлотЦиклСпутникСтатус
+
`; } function dropDetails(mode) { @@ -741,6 +766,21 @@ return number.toLocaleString('ru-RU', {maximumFractionDigits: 2}); } + function formatDuration(seconds) { + const totalSeconds = Number(seconds); + if (!Number.isFinite(totalSeconds)) return '—'; + + const rounded = Math.max(0, Math.round(totalSeconds)); + const hours = Math.floor(rounded / 3600); + const minutes = Math.floor((rounded % 3600) / 60); + const remainingSeconds = rounded % 60; + const pad = (number) => String(number).padStart(2, '0'); + + return hours > 0 + ? `${hours}:${pad(minutes)}:${pad(remainingSeconds)}` + : `${minutes}:${pad(remainingSeconds)}`; + } + function toDateTimeLocalValue(date) { const pad = (number) => String(number).padStart(2, '0'); return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}T${pad(date.getHours())}:${pad(date.getMinutes())}`;