event cate agg

This commit is contained in:
曹前明 2022-07-13 09:27:03 +08:00
parent 32b541bda4
commit afe0c171cf
4 changed files with 46 additions and 5 deletions

View File

@ -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)

View File

@ -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)

View File

@ -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'])

View File

@ -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': '*'}