Доделал статистику. Поправил разрешение lyngsat

This commit is contained in:
2025-12-16 16:10:44 +03:00
parent df5719fb8f
commit e29509e7f2
8 changed files with 271 additions and 205 deletions

View File

@@ -81,23 +81,17 @@
<div class="col-md-3 mb-3">
<label for="requestStatus" class="form-label">Статус</label>
<select class="form-select" id="requestStatus" name="status">
<option value="planned">Запланировано</option>
<option value="conducted">Проведён</option>
<option value="successful">Успешно</option>
<option value="no_correlation">Нет корреляции</option>
<option value="no_signal">Нет сигнала в спектре</option>
<option value="unsuccessful">Неуспешно</option>
<option value="downloading">Скачивание</option>
<option value="processing">Обработка</option>
<option value="result_received">Результат получен</option>
{% for value, label in status_choices %}
<option value="{{ value }}">{{ label }}</option>
{% endfor %}
</select>
</div>
<div class="col-md-3 mb-3">
<label for="requestPriority" class="form-label">Приоритет</label>
<select class="form-select" id="requestPriority" name="priority">
<option value="low">Низкий</option>
<option value="medium" selected>Средний</option>
<option value="high">Высокий</option>
{% for value, label in priority_choices %}
<option value="{{ value }}" {% if value == 'medium' %}selected{% endif %}>{{ label }}</option>
{% endfor %}
</select>
</div>
</div>

View File

@@ -377,15 +377,9 @@
onclick="selectAllOptions('request_status', false)">Снять</button>
</div>
<select name="request_status" class="form-select form-select-sm" multiple size="5">
<option value="planned" {% if 'planned' in selected_request_statuses %}selected{% endif %}>Запланировано</option>
<option value="conducted" {% if 'conducted' in selected_request_statuses %}selected{% endif %}>Проведён</option>
<option value="successful" {% if 'successful' in selected_request_statuses %}selected{% endif %}>Успешно</option>
<option value="no_correlation" {% if 'no_correlation' in selected_request_statuses %}selected{% endif %}>Нет корреляции</option>
<option value="no_signal" {% if 'no_signal' in selected_request_statuses %}selected{% endif %}>Нет сигнала в спектре</option>
<option value="unsuccessful" {% if 'unsuccessful' in selected_request_statuses %}selected{% endif %}>Неуспешно</option>
<option value="downloading" {% if 'downloading' in selected_request_statuses %}selected{% endif %}>Скачивание</option>
<option value="processing" {% if 'processing' in selected_request_statuses %}selected{% endif %}>Обработка</option>
<option value="result_received" {% if 'result_received' in selected_request_statuses %}selected{% endif %}>Результат получен</option>
{% for value, label in status_choices %}
<option value="{{ value }}" {% if value in selected_request_statuses %}selected{% endif %}>{{ label }}</option>
{% endfor %}
</select>
</div>
@@ -393,9 +387,9 @@
<div class="mb-2">
<label class="form-label small">Приоритет:</label>
<select name="request_priority" class="form-select form-select-sm" multiple size="3">
<option value="low" {% if 'low' in selected_request_priorities %}selected{% endif %}>Низкий</option>
<option value="medium" {% if 'medium' in selected_request_priorities %}selected{% endif %}>Средний</option>
<option value="high" {% if 'high' in selected_request_priorities %}selected{% endif %}>Высокий</option>
{% for value, label in priority_choices %}
<option value="{{ value }}" {% if value in selected_request_priorities %}selected{% endif %}>{{ label }}</option>
{% endfor %}
</select>
</div>
@@ -2480,23 +2474,17 @@ function showTransponderModal(transponderId) {
<div class="col-md-6 mb-3">
<label for="editRequestStatus" class="form-label">Статус</label>
<select class="form-select" id="editRequestStatus" name="status">
<option value="planned">Запланировано</option>
<option value="conducted">Проведён</option>
<option value="successful">Успешно</option>
<option value="no_correlation">Нет корреляции</option>
<option value="no_signal">Нет сигнала в спектре</option>
<option value="unsuccessful">Неуспешно</option>
<option value="downloading">Скачивание</option>
<option value="processing">Обработка</option>
<option value="result_received">Результат получен</option>
{% for value, label in status_choices %}
<option value="{{ value }}">{{ label }}</option>
{% endfor %}
</select>
</div>
<div class="col-md-6 mb-3">
<label for="editRequestPriority" class="form-label">Приоритет</label>
<select class="form-select" id="editRequestPriority" name="priority">
<option value="low">Низкий</option>
<option value="medium" selected>Средний</option>
<option value="high">Высокий</option>
{% for value, label in priority_choices %}
<option value="{{ value }}" {% if value == 'medium' %}selected{% endif %}>{{ label }}</option>
{% endfor %}
</select>
</div>
</div>

View File

@@ -558,86 +558,103 @@
<!-- Kubsat Statistics -->
<div class="row">
<div class="col-12">
<div class="card border-secondary">
<div class="card-header bg-secondary text-white">
<strong>Кубсаты</strong>
<!-- 1. Запланировано -->
<div class="col-md-6 mb-4">
<div class="card h-100 border-primary">
<div class="card-header bg-primary text-white">
<strong><i class="bi bi-calendar-check"></i> Запланировано</strong>
<span class="badge bg-light text-primary float-end fs-6" id="kubsat-planned">{{ extended_stats.kubsat.planned_count }}</span>
</div>
<div class="card-body">
<div class="row text-center">
<div class="col-md-3 mb-3 mb-md-0">
<div class="p-3 bg-light rounded">
<div class="fs-3 fw-bold text-primary" id="kubsat-planned">{{ extended_stats.kubsat.planned_count }}</div>
<div class="text-muted small">
<i class="bi bi-calendar-check"></i> Запланировано
</div>
</div>
</div>
<div class="col-md-3 mb-3 mb-md-0">
<div class="p-3 bg-light rounded">
<div class="fs-3 fw-bold text-success" id="kubsat-conducted">{{ extended_stats.kubsat.conducted_count }}</div>
<div class="text-muted small">
<i class="bi bi-check-circle"></i> Проведено
</div>
</div>
</div>
<div class="col-md-3 mb-3 mb-md-0">
<div class="p-3 bg-light rounded">
<div class="fs-3 fw-bold text-danger" id="kubsat-canceled-gso">{{ extended_stats.kubsat.canceled_gso_count }}</div>
<div class="text-muted small">
<i class="bi bi-x-circle"></i> Отменено ГСО
</div>
</div>
</div>
<div class="col-md-3">
<div class="p-3 bg-light rounded">
<div class="fs-3 fw-bold text-warning" id="kubsat-canceled-kub">{{ extended_stats.kubsat.canceled_kub_count }}</div>
<div class="text-muted small">
<i class="bi bi-x-circle"></i> Отменено МКА
</div>
</div>
</div>
<div class="d-flex justify-content-between align-items-center mb-2 pb-2 border-bottom">
<span class="text-muted">
<i class="bi bi-check-circle text-success"></i> Проведено:
</span>
<span class="badge bg-success" id="kubsat-conducted">{{ extended_stats.kubsat.conducted_count }}</span>
</div>
<!-- Progress bar for Kubsat -->
{% if extended_stats.kubsat.planned_count > 0 %}
<div class="mt-4">
<div class="d-flex justify-content-between mb-1">
<small class="text-muted">Распределение статусов</small>
<small class="text-muted">Всего: {{ extended_stats.kubsat.planned_count }}</small>
</div>
<div class="progress" style="height: 25px;">
{% with total=extended_stats.kubsat.planned_count conducted=extended_stats.kubsat.conducted_count canceled_gso=extended_stats.kubsat.canceled_gso_count canceled_kub=extended_stats.kubsat.canceled_kub_count %}
{% if conducted > 0 %}
<div class="progress-bar bg-success" role="progressbar"
style="width: {% widthratio conducted total 100 %}%"
title="Проведено: {{ conducted }}">
{{ conducted }}
</div>
{% endif %}
{% if canceled_gso > 0 %}
<div class="progress-bar bg-danger" role="progressbar"
style="width: {% widthratio canceled_gso total 100 %}%"
title="Отменено ГСО: {{ canceled_gso }}">
{{ canceled_gso }}
</div>
{% endif %}
{% if canceled_kub > 0 %}
<div class="progress-bar bg-warning text-dark" role="progressbar"
style="width: {% widthratio canceled_kub total 100 %}%"
title="Отменено МКА: {{ canceled_kub }}">
{{ canceled_kub }}
</div>
{% endif %}
{% endwith %}
</div>
<div class="d-flex justify-content-center mt-2">
<small class="me-3"><span class="badge bg-success"></span> Проведено</small>
<small class="me-3"><span class="badge bg-danger"></span> Отменено ГСО</small>
<small><span class="badge bg-warning text-dark"></span> Отменено МКА</small>
</div>
<div class="d-flex justify-content-between align-items-center mb-2 pb-2 border-bottom">
<span class="text-muted">
<i class="bi bi-x-circle text-danger"></i> Отменено (ГСО):
</span>
<span class="badge bg-danger" id="kubsat-canceled-gso">{{ extended_stats.kubsat.canceled_gso_count }}</span>
</div>
<div class="d-flex justify-content-between align-items-center mb-2 pb-2 border-bottom">
<span class="text-muted">
<i class="bi bi-x-circle text-warning"></i> Отменено (МКА):
</span>
<span class="badge bg-warning text-dark" id="kubsat-canceled-kub">{{ extended_stats.kubsat.canceled_kub_count }}</span>
</div>
<div class="d-flex justify-content-between align-items-center mb-2 pb-2 border-bottom">
<span class="text-muted">
<i class="bi bi-hourglass-split text-info"></i> Ожидают проведения:
</span>
<span class="badge bg-info" id="kubsat-wait-exec">{{ extended_stats.kubsat.wait_exec_count }}</span>
</div>
<div class="d-flex justify-content-between align-items-center">
<span class="text-muted">
<i class="bi bi-exclamation-triangle text-secondary"></i> Не проведены (вина ГСО):
</span>
<span class="badge bg-secondary" id="kubsat-gso-fault">{{ extended_stats.kubsat.gso_fault_count }}</span>
</div>
</div>
</div>
</div>
<!-- 2. Проведено -->
<div class="col-md-6 mb-4">
<div class="card h-100 border-success">
<div class="card-header bg-success text-white">
<strong><i class="bi bi-check2-circle"></i> Проведено</strong>
<span class="badge bg-light text-success float-end fs-6" id="kubsat-total-conducted">{{ extended_stats.kubsat.total_conducted_count }}</span>
</div>
<div class="card-body">
<div class="d-flex justify-content-between align-items-center mb-2 pb-2 border-bottom">
<span class="text-muted">
<i class="bi bi-check-lg text-success"></i> Результат получен:
</span>
<span class="badge bg-success" id="kubsat-result-received">{{ extended_stats.kubsat.result_received_count }}</span>
</div>
<div class="d-flex justify-content-between align-items-center mb-2 pb-2 border-bottom">
<span class="text-muted">
<i class="bi bi-gear text-primary"></i> Обработка:
</span>
<span class="badge bg-primary" id="kubsat-processing">{{ extended_stats.kubsat.processing_count }}</span>
</div>
<div class="d-flex justify-content-between align-items-center mb-2 pb-2 border-bottom">
<span class="text-muted">
<i class="bi bi-question-circle text-warning"></i> Нет корреляции:
</span>
<span class="badge bg-warning text-dark" id="kubsat-no-correlation">{{ extended_stats.kubsat.no_correlation_count }}</span>
</div>
<div class="d-flex justify-content-between align-items-center mb-2 pb-2 border-bottom">
<span class="text-muted">
<i class="bi bi-bug text-danger"></i> Ошибка ГСО:
</span>
<span class="badge bg-danger" id="kubsat-error-gso">{{ extended_stats.kubsat.error_gso_count }}</span>
</div>
<div class="d-flex justify-content-between align-items-center">
<span class="text-muted">
<i class="bi bi-bug text-secondary"></i> Ошибка МКА:
</span>
<span class="badge bg-secondary" id="kubsat-error-kub">{{ extended_stats.kubsat.error_kub_count }}</span>
</div>
</div>
</div>
</div>
</div>
<!-- 3. Предложено -->
<div class="row">
<div class="col-12">
<div class="card border-info">
<div class="card-body py-3">
<div class="d-flex justify-content-between align-items-center">
<span>
<i class="bi bi-lightbulb text-info fs-5"></i>
<strong class="ms-2">Предложено:</strong>
</span>
<span class="badge bg-info fs-5" id="kubsat-suggested">{{ extended_stats.kubsat.suggested_count }}</span>
</div>
{% endif %}
</div>
</div>
</div>
@@ -1631,21 +1648,31 @@ document.addEventListener('DOMContentLoaded', function() {
document.getElementById('dv-new-coords').textContent = data.extended_stats.dv.new_coords;
document.getElementById('dv-transfer-delta').textContent = data.extended_stats.dv.transfer_delta + ' МГц';
// Update Kubsat statistics
// Update Kubsat statistics - Запланировано
document.getElementById('kubsat-planned').textContent = data.extended_stats.kubsat.planned_count;
document.getElementById('kubsat-conducted').textContent = data.extended_stats.kubsat.conducted_count;
document.getElementById('kubsat-canceled-gso').textContent = data.extended_stats.kubsat.canceled_gso_count;
document.getElementById('kubsat-canceled-kub').textContent = data.extended_stats.kubsat.canceled_kub_count;
document.getElementById('kubsat-wait-exec').textContent = data.extended_stats.kubsat.wait_exec_count;
document.getElementById('kubsat-gso-fault').textContent = data.extended_stats.kubsat.gso_fault_count;
// Update progress bar if exists
updateKubsatProgressBar(data.extended_stats.kubsat);
// Update Kubsat statistics - Проведено
document.getElementById('kubsat-total-conducted').textContent = data.extended_stats.kubsat.total_conducted_count;
document.getElementById('kubsat-result-received').textContent = data.extended_stats.kubsat.result_received_count;
document.getElementById('kubsat-processing').textContent = data.extended_stats.kubsat.processing_count;
document.getElementById('kubsat-no-correlation').textContent = data.extended_stats.kubsat.no_correlation_count;
document.getElementById('kubsat-error-gso').textContent = data.extended_stats.kubsat.error_gso_count;
document.getElementById('kubsat-error-kub').textContent = data.extended_stats.kubsat.error_kub_count;
// Update Kubsat statistics - Предложено
document.getElementById('kubsat-suggested').textContent = data.extended_stats.kubsat.suggested_count;
// Update period info
updatePeriodInfo(data.date_from, data.date_to);
})
.catch(error => {
console.error('Error loading extended stats:', error);
alert('Ошибка загрузки статистики');
// alert('Ошибка загрузки статистики');
})
.finally(() => {
// Hide loading indicator
@@ -1654,43 +1681,6 @@ document.addEventListener('DOMContentLoaded', function() {
});
}
// Update Kubsat progress bar
function updateKubsatProgressBar(kubsat) {
const progressContainer = document.querySelector('.progress');
if (!progressContainer) return;
const total = kubsat.planned_count;
if (total === 0) {
progressContainer.innerHTML = '';
return;
}
let html = '';
if (kubsat.conducted_count > 0) {
const pct = Math.round((kubsat.conducted_count / total) * 100);
html += `<div class="progress-bar bg-success" role="progressbar" style="width: ${pct}%" title="Проведено: ${kubsat.conducted_count}">${kubsat.conducted_count}</div>`;
}
if (kubsat.canceled_gso_count > 0) {
const pct = Math.round((kubsat.canceled_gso_count / total) * 100);
html += `<div class="progress-bar bg-danger" role="progressbar" style="width: ${pct}%" title="Отменено ГСО: ${kubsat.canceled_gso_count}">${kubsat.canceled_gso_count}</div>`;
}
if (kubsat.canceled_kub_count > 0) {
const pct = Math.round((kubsat.canceled_kub_count / total) * 100);
html += `<div class="progress-bar bg-warning text-dark" role="progressbar" style="width: ${pct}%" title="Отменено МКА: ${kubsat.canceled_kub_count}">${kubsat.canceled_kub_count}</div>`;
}
progressContainer.innerHTML = html;
// Update total count
const totalLabel = progressContainer.parentElement.querySelector('.text-muted:last-of-type');
if (totalLabel) {
totalLabel.textContent = 'Всего: ' + total;
}
}
// Update period info display
function updatePeriodInfo(dateFrom, dateTo) {
const periodAlert = document.querySelector('#extendedStatsModal .alert-light');