Доделал статистику. Поправил разрешение lyngsat
This commit is contained in:
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user