diff --git a/apps/ecm/migrations/0006_auto_20220702_1148.py b/apps/ecm/migrations/0006_auto_20220702_1148.py new file mode 100644 index 00000000..6a3c3c9a --- /dev/null +++ b/apps/ecm/migrations/0006_auto_20220702_1148.py @@ -0,0 +1,34 @@ +# Generated by Django 3.2.12 on 2022-07-02 03:48 + +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('ecm', '0005_event_voice_msg'), + ] + + operations = [ + migrations.AddField( + model_name='eventdo', + name='create_time', + field=models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间'), + ), + migrations.AddField( + model_name='eventdo', + name='is_deleted', + field=models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记'), + ), + migrations.AddField( + model_name='eventdo', + name='update_time', + field=models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间'), + ), + migrations.AlterField( + model_name='eventdo', + name='id', + field=models.CharField(editable=False, help_text='主键ID', max_length=20, primary_key=True, serialize=False, verbose_name='主键ID'), + ), + ] diff --git a/apps/ecm/migrations/0007_auto_20220702_1327.py b/apps/ecm/migrations/0007_auto_20220702_1327.py new file mode 100644 index 00000000..f1321a16 --- /dev/null +++ b/apps/ecm/migrations/0007_auto_20220702_1327.py @@ -0,0 +1,23 @@ +# Generated by Django 3.2.12 on 2022-07-02 05:27 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ecm', '0006_auto_20220702_1148'), + ] + + operations = [ + migrations.RenameField( + model_name='notifysetting', + old_name='var', + new_name='variable', + ), + migrations.AlterField( + model_name='notifysetting', + name='obj_cate', + field=models.CharField(help_text='post岗位/user用户/variable变量', max_length=20, verbose_name='提醒对象'), + ), + ] diff --git a/apps/ecm/models.py b/apps/ecm/models.py index 40c42091..83ba3054 100644 --- a/apps/ecm/models.py +++ b/apps/ecm/models.py @@ -53,13 +53,13 @@ class NotifySetting(CommonAModel): (40, '属地部门以上') ) event_cate = models.ForeignKey(EventCate, verbose_name='关联事件种类', on_delete=models.CASCADE) - obj_cate = models.CharField('提醒对象', max_length=20, help_text='post岗位/user用户/var变量') + obj_cate = models.CharField('提醒对象', max_length=20, help_text='post岗位/user用户/variable变量') post = models.ForeignKey(Post, verbose_name='提醒岗位', 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, - help_text='self(本人)/area_manager(区域负责人)/visit_receptionist(访客接待人)') + variable = 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) @@ -96,7 +96,7 @@ class Event(CommonBModel): is_pushed = models.BooleanField('是否已推送', default=False) -class Eventdo(models.Model): +class Eventdo(BaseModel): cate = models.ForeignKey(EventCate, verbose_name='关联事件种类', on_delete=models.CASCADE) event = models.ForeignKey(Event, verbose_name='关联事件', diff --git a/apps/ecm/service.py b/apps/ecm/service.py index ae4915c5..abf5005b 100644 --- a/apps/ecm/service.py +++ b/apps/ecm/service.py @@ -3,7 +3,7 @@ import requests from apps.am.models import Access, Area from apps.am.tasks import cache_areas_info -from apps.ecm.models import Event, EventCate +from apps.ecm.models import Event, EventCate, Eventdo from apps.hrm.models import Employee from apps.system.models import User from apps.third.clients import xxClient @@ -13,10 +13,11 @@ from apps.utils.queryset import get_child_queryset2 from django.core.cache import cache import time import shapely.geometry -from apps.third.clients import dhClient +from apps.third.clients import dhClient, spClient from django.utils import timezone from django.conf import settings import os +from apps.utils.speech import generate_voice requests.packages.urllib3.disable_warnings() @@ -70,10 +71,10 @@ class EcmService: alarm_type = data['info']['alarmType'] vchannel = TDevice.objects.filter(code=vchannel_code).first() print(data) - if alarm_type in [1001003, 1001000] and vchannel: # 内部人员报警 + if alarm_type in [1001003, 1001000] and vchannel: # 内部人员/或陌生人报警 # 加载算法逻辑 # 安全帽检测 - ec = EventCate.objects.filter(code='helmet').first() # 模拟发生安全帽事件 + ec = EventCate.objects.filter(code='helmet').first() # 模拟发生安全帽事件 # 视频区域 area = vchannel.area if ec and area: @@ -85,7 +86,35 @@ class EcmService: event.global_img = global_img event.area = area event.obj_cate = 'people' - event.employee = None + ep = None # 找到人员 + if alarm_type == 1001003: + ep = Employee.objects.filter(id_number=data['info']['extend']['candidateInfo'][0]['id']).first() + if ep: + voice_msg = '位于{}的{}{},您未佩戴安全帽,请及时处理' + ep_name = ep.name + ep_type = '员工' + if ep.type == 'rempoyee': + ep_type = '相关方人员' + elif ep.type == 'visitor': + ep_type = '访客' + event.voice_msg = voice_msg.format(area.name, ep_type, ep_name) + else: + event.voice_msg = '位于{}的未知人员,您未佩戴安全帽,请及时处理'.format(area.name) + event.employee = ep + _, event.voice, _ = generate_voice(event.voice_msg, ec.voice_person) + event.save() + Eventdo.objects.get_or_create(cate=ec, event=event, defaults={ + 'cate': ec, + 'event': event + }) + # 喇叭提醒 + if event.voice: + sps = list(TDevice.objects.filter(area=area, type=TDevice.DEVICE_SPEAKER).values_list('code', flat=True)) + if len(sps) == 0: # 找覆盖区的音响 + sps = list(TDevice.objects.filter(areas=area, type=TDevice.DEVICE_SPEAKER).values_list('code', flat=True)) + if sps: + spClient.speak(event.voice, sps) + return @classmethod def dispatch_xunxi_event(cls, data: dict): diff --git a/apps/third/speaker.py b/apps/third/speaker.py index 128664bb..985f1de2 100644 --- a/apps/third/speaker.py +++ b/apps/third/speaker.py @@ -7,6 +7,7 @@ from django.conf import settings from apps.third.errors import SP_REQUEST_ERROR from apps.utils.tools import print_roundtrip +from apps.third.tapis import spapis requests.packages.urllib3.disable_warnings() @@ -115,3 +116,33 @@ class SpClient: if raise_exception: raise APIException(**SP_REQUEST_ERROR) return 'error', SP_REQUEST_ERROR + + def speak(self, path: str, sns: list): + """播放报警声 + + Args: + path (str): 资源本地地址 + sns (list): 喇叭sn队列 + """ + json = { + "sns": sns, + "type": "req", + "name": "priority_task_play", + "source": "noreplay", + "params": { + "count": 1, + "length": 0, + "level": 99804, + "name": "实时播放", + "tid": "x", + "vol": 70, + "type": 5, + "uid": "y", + "urls": [{ + "name": "alarm.mp3", + "uri": settings.BASE_URL + path + }] + } + } + self.request(**spapis['send_to_device'], json=json) + return