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): class Eventdo(BaseModel):
cate = models.ForeignKey(EventCate, verbose_name='关联事件种类', cate = models.ForeignKey(EventCate, verbose_name='关联事件种类',
on_delete=models.CASCADE) on_delete=models.CASCADE, related_name='do_cate')
event = models.ForeignKey(Event, verbose_name='关联事件', event = models.ForeignKey(Event, verbose_name='关联事件',
on_delete=models.CASCADE) on_delete=models.CASCADE)
handle_time = models.DateTimeField('处理时间', null=True, blank=True) handle_time = models.DateTimeField('处理时间', null=True, blank=True)

View File

@ -128,3 +128,10 @@ class AlgoChannelSerializer(CustomModelSerializer):
class Meta: class Meta:
model = AlgoChannel model = AlgoChannel
fields = '__all__' 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: Args:
event (Event): _description_ 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 v_p, v_num = main_cate.voice_person, main_cate.voice_num
_, event.voice, _ = generate_voice(event.voice_msg, v_p) _, event.voice, _ = generate_voice(event.voice_msg, v_p)
event.save() event.save()
@ -224,7 +224,7 @@ def dispatch_dahua_event(data: dict):
if alarm_type in [1001003, 1001000] and vchannel: # 内部人员/或陌生人报警 if alarm_type in [1001003, 1001000] and vchannel: # 内部人员/或陌生人报警
# 查看加载的算法 # 查看加载的算法
algo_codes = list(AlgoChannel.objects.filter(vchannel=vchannel).exclude( 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 # 视频所在区域 area = vchannel.area # 视频所在区域
if algo_codes and area: # 如果加载了算法且视频通道绑定区域才继续 if algo_codes and area: # 如果加载了算法且视频通道绑定区域才继续
face_img_o = dhClient.get_full_pic(data['info']['alarmPicture']) face_img_o = dhClient.get_full_pic(data['info']['alarmPicture'])

View File

@ -1,8 +1,8 @@
from threading import Thread from threading import Thread
from apps.ecm.filters import EventFilterSet from apps.ecm.filters import EventFilterSet
from apps.ecm.models import AlgoChannel, Event, EventCate, Remind, NotifySetting from apps.ecm.models import AlgoChannel, Event, EventCate, Eventdo, Remind, NotifySetting
from apps.ecm.serializers import (AlgoChannelCreateSerializer, AlgoChannelCreatesSerializer, AlgoChannelSerializer, EventCateCreateUpdateSerializer, EventCateListSerializer, EventCateUpdateSerializer, EventHandleSerializer, from apps.ecm.serializers import (AlgoChannelCreateSerializer, AlgoChannelCreatesSerializer, AlgoChannelSerializer, EventAggSerializer, EventCateCreateUpdateSerializer, EventCateListSerializer, EventCateUpdateSerializer, EventHandleSerializer,
EventSerializer, RemindSerializer, NotifySettingsSerializer) EventSerializer, RemindSerializer, NotifySettingsSerializer)
from apps.ecm.service import update_remind_read from apps.ecm.service import update_remind_read
from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet 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.response import Response
from rest_framework.exceptions import PermissionDenied from rest_framework.exceptions import PermissionDenied
from apps.utils.snowflake import idWorker from apps.utils.snowflake import idWorker
from django.db.models import Count, F
# Create your views here. # Create your views here.
@ -25,6 +26,7 @@ class EventCateViewSet(CreateModelMixin, UpdateModelMixin, ListModelMixin, Custo
update_serializer_class = EventCateCreateUpdateSerializer update_serializer_class = EventCateCreateUpdateSerializer
serializer_class = EventCateListSerializer serializer_class = EventCateListSerializer
filterset_fields = ['self_algo'] filterset_fields = ['self_algo']
ordering = ['-priority', 'create_time']
class AlgoChannelViewSet(CreateModelMixin, DestroyModelMixin, ListModelMixin, CustomGenericViewSet): 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() Thread(target=update_remind_read, args=(obj, request.user), daemon=True).start()
return super().retrieve(request, *args, **kwargs) 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): class RemindViewSet(ListModelMixin, CustomGenericViewSet):
perms_map = {'get': '*'} perms_map = {'get': '*'}