Доделал статистику. Поправил разрешение 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

@@ -313,37 +313,39 @@ class StatisticsView(PermissionRequiredMixin, TemplateView):
Получает статистику по Кубсатам из SourceRequest.
Возвращает:
- planned_count: количество запланированных сеансов
- conducted_count: количество проведённых
- canceled_gso_count: количество отменённых ГСО
- canceled_kub_count: количество отменённых МКА
1. Запланировано (по истории статуса 'planned'):
- planned_count: всего запланировано
- conducted_count: проведено
- canceled_gso_count: отменено ГСО
- canceled_kub_count: отменено МКА
- wait_exec_count: ожидают проведения
- gso_fault_count: не проведены по вине ГСО
2. Проведено (по истории статуса 'conducted'):
- total_conducted_count: всего проведено
- result_received_count: результат получен
- processing_count: обработка
- no_correlation_count: нет корреляции
- error_gso_count: ошибка ГСО
- error_kub_count: ошибка МКА
3. Предложено:
- suggested_count: количество предложенных
"""
# Базовый queryset для заявок
requests_qs = SourceRequest.objects.all()
# Фильтруем по дате создания или planned_at
if date_from:
requests_qs = requests_qs.filter(
Q(created_at__date__gte=date_from) | Q(planned_at__date__gte=date_from)
)
if date_to:
requests_qs = requests_qs.filter(
Q(created_at__date__lte=date_to) | Q(planned_at__date__lte=date_to)
)
# Получаем ID заявок, у которых в истории был статус 'planned'
# Это заявки, которые были запланированы в выбранном периоде
history_qs = SourceRequestStatusHistory.objects.filter(
# === 1. ЗАПЛАНИРОВАНО ===
# Получаем ID заявок, у которых в истории был статус 'planned' в периоде
history_planned_qs = SourceRequestStatusHistory.objects.filter(
new_status='planned'
)
if date_from:
history_qs = history_qs.filter(changed_at__date__gte=date_from)
history_planned_qs = history_planned_qs.filter(changed_at__date__gte=date_from)
if date_to:
history_qs = history_qs.filter(changed_at__date__lte=date_to)
history_planned_qs = history_planned_qs.filter(changed_at__date__lte=date_to)
planned_request_ids = set(history_qs.values_list('source_request_id', flat=True))
planned_request_ids = set(history_planned_qs.values_list('source_request_id', flat=True))
# Также добавляем заявки, которые были созданы со статусом 'planned' в периоде
# (для случаев, когда заявка создана сразу с этим статусом без истории)
created_planned_qs = SourceRequest.objects.filter(status='planned')
if date_from:
created_planned_qs = created_planned_qs.filter(created_at__date__gte=date_from)
@@ -354,35 +356,88 @@ class StatisticsView(PermissionRequiredMixin, TemplateView):
planned_count = len(planned_request_ids)
# Считаем статусы из истории для запланированных заявок
# Считаем текущие статусы для запланированных заявок
conducted_count = 0
canceled_gso_count = 0
canceled_kub_count = 0
wait_exec_count = 0
gso_fault_count = 0
if planned_request_ids:
# Получаем историю статусов для запланированных заявок
status_history = SourceRequestStatusHistory.objects.filter(
source_request_id__in=planned_request_ids
)
if date_from:
status_history = status_history.filter(changed_at__date__gte=date_from)
if date_to:
status_history = status_history.filter(changed_at__date__lte=date_to)
# Получаем текущие статусы запланированных заявок
planned_requests = SourceRequest.objects.filter(id__in=planned_request_ids)
# Считаем уникальные заявки по каждому статусу
conducted_ids = set(status_history.filter(new_status='conducted').values_list('source_request_id', flat=True))
canceled_gso_ids = set(status_history.filter(new_status='canceled_gso').values_list('source_request_id', flat=True))
canceled_kub_ids = set(status_history.filter(new_status='canceled_kub').values_list('source_request_id', flat=True))
conducted_count = planned_requests.filter(status='conducted').count()
canceled_gso_count = planned_requests.filter(status='canceled_gso').count()
canceled_kub_count = planned_requests.filter(status='canceled_kub').count()
wait_exec_count = planned_requests.filter(status='wait_exec').count()
gso_fault_count = planned_requests.filter(status='gso_fault').count()
# === 2. ПРОВЕДЕНО ===
# Получаем ID заявок, у которых в истории был статус 'conducted' в периоде
history_conducted_qs = SourceRequestStatusHistory.objects.filter(
new_status='conducted'
)
if date_from:
history_conducted_qs = history_conducted_qs.filter(changed_at__date__gte=date_from)
if date_to:
history_conducted_qs = history_conducted_qs.filter(changed_at__date__lte=date_to)
conducted_request_ids = set(history_conducted_qs.values_list('source_request_id', flat=True))
# Также добавляем заявки с текущим статусом 'conducted', созданные в периоде
created_conducted_qs = SourceRequest.objects.filter(status='conducted')
if date_from:
created_conducted_qs = created_conducted_qs.filter(created_at__date__gte=date_from)
if date_to:
created_conducted_qs = created_conducted_qs.filter(created_at__date__lte=date_to)
conducted_request_ids.update(created_conducted_qs.values_list('id', flat=True))
total_conducted_count = len(conducted_request_ids)
# Считаем текущие статусы для проведённых заявок
result_received_count = 0
processing_count = 0
no_correlation_count = 0
error_gso_count = 0
error_kub_count = 0
if conducted_request_ids:
conducted_requests = SourceRequest.objects.filter(id__in=conducted_request_ids)
conducted_count = len(conducted_ids)
canceled_gso_count = len(canceled_gso_ids)
canceled_kub_count = len(canceled_kub_ids)
result_received_count = conducted_requests.filter(status='result_received').count()
processing_count = conducted_requests.filter(status='processing').count()
no_correlation_count = conducted_requests.filter(status='no_correlation').count()
error_gso_count = conducted_requests.filter(status='error_gso').count()
error_kub_count = conducted_requests.filter(status='error_kub').count()
# === 3. ПРЕДЛОЖЕНО ===
suggested_qs = SourceRequest.objects.filter(status='suggested')
if date_from:
suggested_qs = suggested_qs.filter(created_at__date__gte=date_from)
if date_to:
suggested_qs = suggested_qs.filter(created_at__date__lte=date_to)
suggested_count = suggested_qs.count()
return {
# Запланировано
'planned_count': planned_count,
'conducted_count': conducted_count,
'canceled_gso_count': canceled_gso_count,
'canceled_kub_count': canceled_kub_count,
'wait_exec_count': wait_exec_count,
'gso_fault_count': gso_fault_count,
# Проведено
'total_conducted_count': total_conducted_count,
'result_received_count': result_received_count,
'processing_count': processing_count,
'no_correlation_count': no_correlation_count,
'error_gso_count': error_gso_count,
'error_kub_count': error_kub_count,
# Предложено
'suggested_count': suggested_count,
}
def get_extended_statistics(self, date_from, date_to):