From afe0c171cfaf1c210272cbb5088221e927231617 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E5=89=8D=E6=98=8E?= <909355014@qq.com> Date: Wed, 13 Jul 2022 09:27:03 +0800 Subject: [PATCH] event cate agg --- apps/ecm/models.py | 2 +- apps/ecm/serializers.py | 7 +++++++ apps/ecm/service.py | 4 ++-- apps/ecm/views.py | 38 ++++++++++++++++++++++++++++++++++++-- 4 files changed, 46 insertions(+), 5 deletions(-) diff --git a/apps/ecm/models.py b/apps/ecm/models.py index ac31ce64..733fdba5 100644 --- a/apps/ecm/models.py +++ b/apps/ecm/models.py @@ -103,7 +103,7 @@ class Event(CommonBModel): class Eventdo(BaseModel): cate = models.ForeignKey(EventCate, verbose_name='关联事件种类', - on_delete=models.CASCADE) + on_delete=models.CASCADE, related_name='do_cate') event = models.ForeignKey(Event, verbose_name='关联事件', on_delete=models.CASCADE) handle_time = models.DateTimeField('处理时间', null=True, blank=True) diff --git a/apps/ecm/serializers.py b/apps/ecm/serializers.py index 8567e270..764fb6ff 100644 --- a/apps/ecm/serializers.py +++ b/apps/ecm/serializers.py @@ -128,3 +128,10 @@ class AlgoChannelSerializer(CustomModelSerializer): class Meta: model = AlgoChannel fields = '__all__' + + +class EventAggSerializer(serializers.Serializer): + start_create = serializers.DateField(required=False, allow_null=True) + end_create = serializers.DateField(required=False, allow_null=True) + is_handled = serializers.BooleanField(required=False) + completed = serializers.BooleanField(default=False) diff --git a/apps/ecm/service.py b/apps/ecm/service.py index 1aa75c87..53a21aaf 100644 --- a/apps/ecm/service.py +++ b/apps/ecm/service.py @@ -118,7 +118,7 @@ def save_voice_and_speak(event: Event): Args: event (Event): _description_ """ - main_cate = event.cates.all().order_by('priority', 'create_time').first() + main_cate = event.cates.all().order_by('-priority', 'create_time').first() v_p, v_num = main_cate.voice_person, main_cate.voice_num _, event.voice, _ = generate_voice(event.voice_msg, v_p) event.save() @@ -224,7 +224,7 @@ def dispatch_dahua_event(data: dict): if alarm_type in [1001003, 1001000] and vchannel: # 内部人员/或陌生人报警 # 查看加载的算法 algo_codes = list(AlgoChannel.objects.filter(vchannel=vchannel).exclude( - algo__code=None).order_by('algo__priority', 'algo__create_time').values_list('algo__code', flat=True)) + algo__code=None).order_by('-algo__priority', 'algo__create_time').values_list('algo__code', flat=True)) area = vchannel.area # 视频所在区域 if algo_codes and area: # 如果加载了算法且视频通道绑定区域才继续 face_img_o = dhClient.get_full_pic(data['info']['alarmPicture']) diff --git a/apps/ecm/views.py b/apps/ecm/views.py index 66e1e947..50d5725e 100644 --- a/apps/ecm/views.py +++ b/apps/ecm/views.py @@ -1,8 +1,8 @@ from threading import Thread from apps.ecm.filters import EventFilterSet -from apps.ecm.models import AlgoChannel, Event, EventCate, Remind, NotifySetting -from apps.ecm.serializers import (AlgoChannelCreateSerializer, AlgoChannelCreatesSerializer, AlgoChannelSerializer, EventCateCreateUpdateSerializer, EventCateListSerializer, EventCateUpdateSerializer, EventHandleSerializer, +from apps.ecm.models import AlgoChannel, Event, EventCate, Eventdo, Remind, NotifySetting +from apps.ecm.serializers import (AlgoChannelCreateSerializer, AlgoChannelCreatesSerializer, AlgoChannelSerializer, EventAggSerializer, EventCateCreateUpdateSerializer, EventCateListSerializer, EventCateUpdateSerializer, EventHandleSerializer, EventSerializer, RemindSerializer, NotifySettingsSerializer) from apps.ecm.service import update_remind_read from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet @@ -14,6 +14,7 @@ from django.utils import timezone from rest_framework.response import Response from rest_framework.exceptions import PermissionDenied from apps.utils.snowflake import idWorker +from django.db.models import Count, F # Create your views here. @@ -25,6 +26,7 @@ class EventCateViewSet(CreateModelMixin, UpdateModelMixin, ListModelMixin, Custo update_serializer_class = EventCateCreateUpdateSerializer serializer_class = EventCateListSerializer filterset_fields = ['self_algo'] + ordering = ['-priority', 'create_time'] class AlgoChannelViewSet(CreateModelMixin, DestroyModelMixin, ListModelMixin, CustomGenericViewSet): @@ -94,6 +96,38 @@ class EventViewSet(ListModelMixin, RetrieveModelMixin, CustomGenericViewSet): Thread(target=update_remind_read, args=(obj, request.user), daemon=True).start() return super().retrieve(request, *args, **kwargs) + @transaction.atomic + @action(methods=['post'], detail=False, perms_map={'post': '*'}, + serializer_class=EventAggSerializer) + def cate_agg(self, request, pk=None): + """按事件分类聚合 + + 按事件分类聚合 + """ + slr = EventAggSerializer(data=request.data) + slr.is_valid(raise_exception=True) + vdata = slr.validated_data + ret = {} + queryset = Eventdo.objects.all() + if vdata.get('start_create', None): + queryset = queryset.filter(event__create_time__gte=vdata['start_create']) + if vdata.get('end_create', None): + queryset = queryset.filter(event__create_time__lte=vdata['end_create']) + if vdata.get('is_handled', None): + if vdata['is_handled']: + queryset = queryset.exclude(event__handle_user=None) + else: + queryset = queryset.filter(event__handle_user=None) + ret['total_count'] = queryset.count() + if vdata.get('completed', True): + ret['details'] = list(EventCate.objects.order_by('-priority', 'create_time').annotate(cate=F('id'), cate__name=F('name')).values('cate', 'cate__name')) + for i in ret['details']: + i['count'] = queryset.filter(cate__id=i['cate']).count() + else: + ret['details'] = list(queryset.order_by('-cate__priority', 'cate__create_time').values( + 'cate', 'cate__name').annotate(count=Count('cate'))) + return Response(ret) + class RemindViewSet(ListModelMixin, CustomGenericViewSet): perms_map = {'get': '*'}