Доработка отображения текущего плана

This commit is contained in:
emelianov
2026-05-26 12:32:33 +03:00
parent 1229995f90
commit 38c1449e97
2 changed files with 47 additions and 4 deletions
@@ -165,6 +165,9 @@ class SlotService(webClientBuilderProvider: ObjectProvider<WebClient.Builder>) {
.block()
?: emptyList()
fun bookedByIds(bookedSlotIds: List<Long>): List<BookedSlotDetailsDTO> =
bookedDetailsByIds(bookedSlotIds)
fun bookedDetailsByIds(bookedSlotIds: List<Long>): List<BookedSlotDetailsDTO> {
val ids = bookedSlotIds.filter { it > 0 }.distinct().toSet()
if (ids.isEmpty()) {
@@ -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 `<span class="current-plans-detail-token">#${escapeHtml(slotId)}</span>`;
return `<tr><td class="current-plans-id">#${escapeHtml(slotId)}</td><td colspan="6">Детали слота не найдены</td></tr>`;
}
return `<span class="current-plans-detail-token">#${escapeHtml(slot.bookedSlotId)} · slot ${escapeHtml(slot.slotNum)} · cycle ${escapeHtml(slot.cycle)} · sat ${escapeHtml(slot.satelliteId)}</span>`;
return `
<tr>
<td class="current-plans-id">#${escapeHtml(slot.bookedSlotId)}</td>
<td>${formatDateTime(slot.timeStart)}</td>
<td>${formatDuration(slot.durationSeconds)}</td>
<td>${escapeHtml(slot.slotNum ?? '—')}</td>
<td>${escapeHtml(slot.cycle ?? '—')}</td>
<td>${escapeHtml(slot.satelliteId ?? '—')}</td>
<td>${escapeHtml(slot.status || '—')}</td>
</tr>`;
}).join('');
return `
<div class="current-plans-detail-title">Забронированные слоты (${slotIds.length})</div>
<div class="current-plans-detail-list">${slots}</div>`;
<div class="table-responsive">
<table class="table table-sm mb-0 current-plans-detail-table">
<thead>
<tr>
<th>ID</th>
<th>Начало</th>
<th>Длительность</th>
<th>Слот</th>
<th>Цикл</th>
<th>Спутник</th>
<th>Статус</th>
</tr>
</thead>
<tbody>${rows}</tbody>
</table>
</div>`;
}
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())}`;