diff --git a/apps/am/models.py b/apps/am/models.py index b953a9be..13642bc8 100755 --- a/apps/am/models.py +++ b/apps/am/models.py @@ -1,7 +1,6 @@ from django.db import models from apps.hrm.models import Employee from apps.system.models import Dept, Post, User -from apps.utils.constants import ObjCate from apps.utils.models import CommonADModel, CommonBModel # Create your models here. diff --git a/apps/ecm/migrations/0006_auto_20220701_0915.py b/apps/ecm/migrations/0006_auto_20220701_0915.py new file mode 100644 index 00000000..5a284a03 --- /dev/null +++ b/apps/ecm/migrations/0006_auto_20220701_0915.py @@ -0,0 +1,93 @@ +# Generated by Django 3.2.12 on 2022-07-01 01:15 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('system', '0005_auto_20220627_0836'), + ('ecm', '0005_auto_20220620_1517'), + ] + + operations = [ + migrations.RemoveField( + model_name='event', + name='cate', + ), + migrations.AddField( + model_name='event', + name='mark', + field=models.PositiveSmallIntegerField(default=10, verbose_name='事件标记'), + ), + migrations.AddField( + model_name='event', + name='msg', + field=models.TextField(blank=True, null=True, verbose_name='事件文本'), + ), + migrations.AddField( + model_name='event', + name='state', + field=models.PositiveSmallIntegerField(default=10, verbose_name='事件状态'), + ), + migrations.AddField( + model_name='eventcate', + name='hanle_minute', + field=models.PositiveSmallIntegerField(default=0, help_text='超过处理时间事件状态变为超时未处理,0代表未配置', verbose_name='处理时间'), + ), + migrations.AddField( + model_name='eventcate', + name='voice_person', + field=models.PositiveSmallIntegerField(default=0, help_text='0女声3男声', verbose_name='声音选择'), + ), + migrations.AddField( + model_name='notifysetting', + name='obj_cate', + field=models.CharField(default='post', help_text='post岗位/user用户/var变量', max_length=20, verbose_name='提醒对象'), + preserve_default=False, + ), + migrations.AddField( + model_name='notifysetting', + name='user', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='提醒用户'), + ), + migrations.AddField( + model_name='notifysetting', + name='var', + field=models.CharField(blank=True, max_length=20, null=True, verbose_name='提醒变量'), + ), + migrations.AlterField( + model_name='remind', + name='dept', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='system.dept', verbose_name='部门'), + ), + migrations.AlterField( + model_name='remind', + name='notify_setting', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='ecm.notifysetting', verbose_name='通过哪个配置'), + ), + migrations.AlterField( + model_name='remind', + name='post', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='system.post', verbose_name='岗位'), + ), + migrations.CreateModel( + name='Eventdo', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('handle_time', models.DateTimeField(blank=True, null=True, verbose_name='处理时间')), + ('handle_desc', models.TextField(blank=True, null=True, verbose_name='处理描述')), + ('cate', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='ecm.eventcate', verbose_name='关联事件种类')), + ('event', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='ecm.event', verbose_name='关联事件')), + ('handle_user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='处理人')), + ], + ), + migrations.AddField( + model_name='event', + name='cates', + field=models.ManyToManyField(through='ecm.Eventdo', to='ecm.EventCate', verbose_name='关联事件种类'), + ), + ] diff --git a/apps/ecm/migrations/0007_auto_20220701_1137.py b/apps/ecm/migrations/0007_auto_20220701_1137.py new file mode 100644 index 00000000..0bd646e0 --- /dev/null +++ b/apps/ecm/migrations/0007_auto_20220701_1137.py @@ -0,0 +1,52 @@ +# Generated by Django 3.2.12 on 2022-07-01 03:37 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ecm', '0006_auto_20220701_0915'), + ] + + operations = [ + migrations.RenameField( + model_name='event', + old_name='people', + new_name='employee', + ), + migrations.RemoveField( + model_name='event', + name='peope_type', + ), + migrations.RemoveField( + model_name='event', + name='state', + ), + migrations.AddField( + model_name='event', + name='obj_cate', + field=models.CharField(default='people', help_text='people(人员)/...', max_length=20, verbose_name='发生对象'), + preserve_default=False, + ), + migrations.AddField( + model_name='event', + name='voice', + field=models.TextField(blank=True, null=True, verbose_name='语音地址'), + ), + migrations.AddField( + model_name='eventcate', + name='self_algo', + field=models.BooleanField(default=False, verbose_name='识别算法'), + ), + migrations.AlterField( + model_name='event', + name='mark', + field=models.PositiveSmallIntegerField(default=10, help_text='10(正常)/20(误报)', verbose_name='事件标记'), + ), + migrations.AlterField( + model_name='notifysetting', + name='var', + field=models.CharField(blank=True, help_text='self(本人)/area_manager(区域负责人)/visit_receptionist(访客接待人)', max_length=20, null=True, verbose_name='提醒变量'), + ), + ] diff --git a/apps/ecm/models.py b/apps/ecm/models.py index 25388ced..d602c91f 100644 --- a/apps/ecm/models.py +++ b/apps/ecm/models.py @@ -1,6 +1,7 @@ from django.db import models from apps.am.models import Area from apps.hrm.models import Employee +from apps.utils.constants import Algo from apps.utils.models import BaseModel, CommonAModel, CommonBModel from apps.system.models import Dept, File, Post, User from apps.third.models import TDevice @@ -19,7 +20,9 @@ class EventCate(CommonAModel): code = models.CharField('标识', max_length=10, unique=True) name = models.CharField('名称', max_length=20, unique=True) trigger = models.PositiveSmallIntegerField('触发方式', default=10, choices=EVENT_TRIGGER_CHOICES) + self_algo = models.BooleanField('识别算法', default=False) speaker_on = models.BooleanField('开启音响报警', default=True) + voice_person = models.PositiveSmallIntegerField('声音选择', default=0, help_text='0女声3男声') speakers = models.ManyToManyField(TDevice, verbose_name='固定音响', blank=True) filter_area_level = models.PositiveSmallIntegerField('固定音响区域级别过滤', choices=Area.AREA_LEVEL_CHOICES, default=Area.AREA_1) @@ -45,7 +48,8 @@ class NotifySetting(CommonAModel): on_delete=models.CASCADE, null=True, blank=True) user = models.ForeignKey(User, verbose_name='提醒用户', on_delete=models.CASCADE, null=True, blank=True) - var = models.CharField('提醒变量', max_length=20, null=True, blank=True) + var = models.CharField('提醒变量', max_length=20, null=True, blank=True, + help_text='self(本人)/area_manager(区域负责人)/visit_receptionist(访客接待人)') filter_recipient = models.PositiveSmallIntegerField('提醒人员过滤', null=True, blank=True) filter_area_level = models.PositiveSmallIntegerField('区域级别过滤', null=True, blank=True) sms_enable = models.BooleanField('短信通知', default=False) @@ -66,13 +70,12 @@ class Event(CommonBModel): imgs = models.ManyToManyField(File, verbose_name='事件图片', blank=True) area = models.ForeignKey(Area, verbose_name='发生区域', on_delete=models.CASCADE) location = models.JSONField('事件点位坐标', default=dict, null=False, blank=True) - peope_type = models.CharField('当事人员类型', choices=Employee.PEOPLE_TYPE_CHOICES, - max_length=20, null=True, blank=True) - people = models.ForeignKey(Employee, verbose_name='当事人', - on_delete=models.CASCADE, null=True, blank=True) - state = models.PositiveSmallIntegerField('事件状态', default=10) + obj_cate = models.CharField('发生对象', max_length=20, help_text='people(人员)/...') + employee = models.ForeignKey(Employee, verbose_name='当事人', + on_delete=models.CASCADE, null=True, blank=True) msg = models.TextField('事件文本', null=True, blank=True) - mark = models.PositiveSmallIntegerField('事件标记', default=10) + voice = models.TextField('语音地址', null=True, blank=True) + mark = models.PositiveSmallIntegerField('事件标记', default=10, help_text='10(正常)/20(误报)') handle_time = models.DateTimeField('处理时间', null=True, blank=True) handle_user = models.ForeignKey(User, verbose_name='处理人', on_delete=models.CASCADE, null=True, blank=True) diff --git a/apps/ecm/serializers.py b/apps/ecm/serializers.py index 8e3d505c..abaada9c 100644 --- a/apps/ecm/serializers.py +++ b/apps/ecm/serializers.py @@ -27,12 +27,13 @@ class EventCateListSerializer(CustomModelSerializer): class EventCateUpdateSerializer(CustomModelSerializer): class Meta: model = EventCate - fields = ['speaker_on', 'speakers', 'filter_area_level'] + fields = ['speaker_on', 'speakers', 'filter_area_level', 'voice_person', 'handle_minute'] class NotifySettingsSerializer(CustomModelSerializer): post_name = serializers.CharField(source='post.name', read_only=True) - + user_name = serializers.CharField(source='user.name', read_only=True) + class Meta: model = NotifySetting fields = '__all__' @@ -40,7 +41,7 @@ class NotifySettingsSerializer(CustomModelSerializer): class EventSerializer(serializers.ModelSerializer): area_name = serializers.CharField(source='area.name', read_only=True) - cate_name = serializers.CharField(source='cate.name', read_only=True) + cate_ = EventCateSimpleSerializer(source='cate', read_only=True) people_name = serializers.CharField(source='people.name', read_only=True) handle_user_name = serializers.CharField(source='handle_user.name', read_only=True) diff --git a/apps/ecm/views.py b/apps/ecm/views.py index 2a6d9692..5ff2e9ad 100644 --- a/apps/ecm/views.py +++ b/apps/ecm/views.py @@ -19,6 +19,7 @@ class EventCateViewSet(CreateModelMixin, UpdateModelMixin, ListModelMixin, Custo create_serializer_class = EventCateCreateUpdateSerializer update_serializer_class = EventCateCreateUpdateSerializer serializer_class = EventCateListSerializer + filterset_fields = ['self_algo'] class NotifySettingViewSet(CustomModelViewSet): diff --git a/apps/third/migrations/0006_auto_20220701_1137.py b/apps/third/migrations/0006_auto_20220701_1137.py new file mode 100644 index 00000000..76f20441 --- /dev/null +++ b/apps/third/migrations/0006_auto_20220701_1137.py @@ -0,0 +1,35 @@ +# Generated by Django 3.2.12 on 2022-07-01 03:37 + +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('ecm', '0007_auto_20220701_1137'), + ('third', '0005_alter_tdevice_code'), + ] + + operations = [ + migrations.AddField( + model_name='tdevice', + name='algos', + field=models.ManyToManyField(blank=True, to='ecm.EventCate', verbose_name='启用算法'), + ), + migrations.AddField( + model_name='tlog', + name='create_time', + field=models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间'), + ), + migrations.AddField( + model_name='tlog', + name='is_deleted', + field=models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记'), + ), + migrations.AddField( + model_name='tlog', + name='update_time', + field=models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间'), + ), + ] diff --git a/apps/third/models.py b/apps/third/models.py index f909a7f7..43fef159 100755 --- a/apps/third/models.py +++ b/apps/third/models.py @@ -2,7 +2,7 @@ from django.db import models from apps.am.models import Area import uuid from apps.hrm.models import Employee -from apps.utils.constants import ObjCate +from apps.utils.constants import Algo from apps.utils.models import BaseModel # Create your models here. @@ -35,6 +35,7 @@ class TDevice(BaseModel): code = models.CharField('设备唯一标识', max_length=50, db_index=True) location = models.JSONField('位置信息', default=dict, null=False, blank=True) + algos = models.ManyToManyField('ecm.eventcate', verbose_name='启用算法', blank=True) area = models.ForeignKey(Area, on_delete=models.CASCADE, verbose_name='所在区', null=True, blank=True) areas = models.ManyToManyField(Area, verbose_name='覆盖区', @@ -46,7 +47,7 @@ class TDevice(BaseModel): null=False, blank=True) -class Tlog(models.Model): +class Tlog(BaseModel): """第三方请求与处理日志 """ id = models.UUIDField(primary_key=True, default=uuid.uuid4) diff --git a/apps/third/serializers.py b/apps/third/serializers.py index d04f7413..1d4b7367 100755 --- a/apps/third/serializers.py +++ b/apps/third/serializers.py @@ -1,7 +1,7 @@ from rest_framework import serializers from apps.am.models import Area -from apps.third.models import TDevice +from apps.third.models import TDevice, Tlog from apps.utils.serializers import CustomModelSerializer @@ -47,3 +47,9 @@ class BindAreasSerializer(serializers.Serializer): areas = serializers.PrimaryKeyRelatedField(queryset=Area.objects.all(), label="区域ID列表", required=False, many=True) + + +class TlogSerializer(CustomModelSerializer): + class Meta: + model = Tlog + fields = '__all__' diff --git a/apps/third/urls.py b/apps/third/urls.py index 62e7fc19..9ff8e873 100755 --- a/apps/third/urls.py +++ b/apps/third/urls.py @@ -1,7 +1,7 @@ from django.urls import path, include from rest_framework import routers from apps.third.views import DahuaTestView, DhCommonViewSet, SpTestView, XxCommonViewSet, XxTestView -from apps.third.views_d import TDeviceViewSet +from apps.third.views_d import TDeviceViewSet, TlogViewSet API_BASE_URL = 'api/third/' HTML_BASE_URL = 'third/' @@ -10,6 +10,7 @@ router = routers.DefaultRouter() router.register('xunxi', XxCommonViewSet, basename='api_xunxi') router.register('dahua', DhCommonViewSet, basename='api_dahua') router.register('tdevice', TDeviceViewSet, basename='tdevice') +router.register('tlog', TlogViewSet, basename='tlog') urlpatterns = [ path(API_BASE_URL, include(router.urls)), path(API_BASE_URL + 'dahua/test/', DahuaTestView.as_view()), diff --git a/apps/third/views_d.py b/apps/third/views_d.py index 1d96d09e..0a1bf8b8 100644 --- a/apps/third/views_d.py +++ b/apps/third/views_d.py @@ -1,5 +1,5 @@ -from apps.third.models import TDevice -from apps.third.serializers import BindAreaSerializer, LabelLocationSerializer, TDeviceSerializer +from apps.third.models import TDevice, Tlog +from apps.third.serializers import BindAreaSerializer, LabelLocationSerializer, TDeviceSerializer, TlogSerializer from apps.utils.viewsets import CustomGenericViewSet from rest_framework.mixins import ListModelMixin from apps.third.clients import xxClient, dhClient, spClient @@ -79,7 +79,7 @@ class TDeviceViewSet(CustomGenericViewSet): td.save() td.areas.clear() for i in vdata['areas']: - td.areas.add(i) + td.areas.add(i) else: td = TDevice() td.type = vdata['type'] @@ -122,4 +122,5 @@ class TDeviceViewSet(CustomGenericViewSet): class TlogViewSet(ListModelMixin, CustomGenericViewSet): - pass \ No newline at end of file + queryset = Tlog.objects.all() + serializer_class = TlogSerializer diff --git a/apps/utils/constants.py b/apps/utils/constants.py index 91ef4a88..2fb028df 100755 --- a/apps/utils/constants.py +++ b/apps/utils/constants.py @@ -7,3 +7,7 @@ EXCLUDE_FIELDS = ['create_time', 'update_time', 'is_deleted', 'create_by', 'upda class ObjCate(models.IntegerChoices): EMPLOYEE = 10, '个人' POST = 20, '岗位' + + +class Algo(models.TextChoices): + HELMET = 'helmet', '安全帽'