From 54c6623bd1dbbe98be9e04a2da02cd1727eed5c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E5=89=8D=E6=98=8E?= <909355014@qq.com> Date: Tue, 30 Aug 2022 15:18:08 +0800 Subject: [PATCH] =?UTF-8?q?manytomanyfield=20=E5=8F=AF=E4=B8=BA=E7=A9=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/am/tasks.py | 2 +- apps/develop/views.py | 11 ++++- .../0004_alter_eventcate_opl_cates.py | 19 ++++++++ apps/ecm/models.py | 6 +-- apps/ecm/service.py | 35 ++++++++++++++ apps/ecm/tasks.py | 46 ++----------------- .../0003_alter_operation_vchannels.py | 19 ++++++++ apps/opm/models.py | 2 +- 8 files changed, 92 insertions(+), 48 deletions(-) create mode 100644 apps/ecm/migrations/0004_alter_eventcate_opl_cates.py create mode 100644 apps/opm/migrations/0003_alter_operation_vchannels.py diff --git a/apps/am/tasks.py b/apps/am/tasks.py index 95d24cce..4cae456e 100644 --- a/apps/am/tasks.py +++ b/apps/am/tasks.py @@ -26,4 +26,4 @@ def cache_areas_info(): } area_list.append(area_dict) cache.set('area_list', area_list, timeout=None) - return area_list + # return area_list diff --git a/apps/develop/views.py b/apps/develop/views.py index 1b100820..80fd7984 100755 --- a/apps/develop/views.py +++ b/apps/develop/views.py @@ -1,4 +1,5 @@ + from rest_framework.views import APIView from rest_framework.permissions import IsAdminUser from rest_framework.response import Response @@ -172,7 +173,8 @@ class TestViewSet(CustomGenericViewSet): # global_img='https://10.99.5.24/evo-apigw/evo-oss/6ad010cf-ce45-11ec-9715-e4246c7d1635/20220826/1/dsf_caa9c522-24e2-11ed-884a-e4246c7d1635_62413404_62687586.jpg?token=0ff8bb53-c99e-4291-a587-272aa1f3f5eb') # return Response(ret.keys()) from apps.ecm.service import dispatch_dahua_event - data = {'id': 1661506561753, 'category': 'alarm', 'method': 'alarm.msg', 'info': {'orgName': '曲阳县金隅水泥厂', 'nodeCode': '1000038$1$0$23', 'deviceCode': '1000038', 'alarmCode': '30789599-b82b-45ba-9d3d-2de2bc1f1d00', 'alarmPicture': '6ad010cf-ce45-11ec-9715-e4246c7d1635/20220826/1/dsf_3de82501-2521-11ed-884a-e4246c7d1635_2088390_2096301.jpg', 'nodeType': 2, 'alarmDate': '1661506557', 'alarmGrade': 2, 'isSave': True, 'extend': {'faceImageUrl': ['6ad010cf-ce45-11ec-9715-e4246c7d1635/20220826/1/dsf_3de82501-2521-11ed-884a-e4246c7d1635_2088390_2096301.jpg'], 'glass': 0, 'beard': 0, 'candidateInfo': [{'birthday': '2022-8-24', 'faceImageUrl': ['6ad010cf-ce45-11ec-9715-e4246c7d1635/20220826/1/dsf_3de82501-2521-11ed-884a-e4246c7d1635_2096301_2173187.jpg'], 'groupName': '全体人员', 'similarity': 96, 'sex': 1, 'cardType': 1, 'name': '石非凡', 'devPersonId': '46', 'id': '371324199803243658', 'type': 0}], 'sex': 0, 'occurrenceCount': 0, 'deviceCode': '1000038', 'globalScenePicUrl': '6ad010cf-ce45-11ec-9715-e4246c7d1635/20220826/1/dsf_3de82501-2521-11ed-884a-e4246c7d1635_1825520_2088390.jpg', 'eye': 0, 'alarmType': 1001003, 'perFlag': -1, 'mouth': 0, 'feature': [], 'isHit': True, 'channelSeq': 23, 'szSerialUUID': '', 'channelName': '窑头平台进料口', 'beginTime': 1661506557, 'endTime': 1661506557, 'age': -1, 'mask': 0}, 'unitType': 1, 'alarmType': 1001003, 'channelSeq': 23, 'orgCode': '001001001', 'channelName': '窑头平台进料口', 'alarmStat': 1, 'isEvent': True}, 'subsystem': 'evo-face', 'userIds': None, 'sid': None, 'domainId': None, 'infoArray': None, 'protocol': None} + data = {'id': 1661506561753, 'category': 'alarm', 'method': 'alarm.msg', 'info': {'orgName': '曲阳县金隅水泥厂', 'nodeCode': '1000038$1$0$23', 'deviceCode': '1000038', 'alarmCode': '30789599-b82b-45ba-9d3d-2de2bc1f1d00', 'alarmPicture': '6ad010cf-ce45-11ec-9715-e4246c7d1635/20220826/1/dsf_3de82501-2521-11ed-884a-e4246c7d1635_2088390_2096301.jpg', 'nodeType': 2, 'alarmDate': '1661506557', 'alarmGrade': 2, 'isSave': True, 'extend': {'faceImageUrl': ['6ad010cf-ce45-11ec-9715-e4246c7d1635/20220826/1/dsf_3de82501-2521-11ed-884a-e4246c7d1635_2088390_2096301.jpg'], 'glass': 0, 'beard': 0, 'candidateInfo': [{'birthday': '2022-8-24', 'faceImageUrl': [ + '6ad010cf-ce45-11ec-9715-e4246c7d1635/20220826/1/dsf_3de82501-2521-11ed-884a-e4246c7d1635_2096301_2173187.jpg'], 'groupName': '全体人员', 'similarity': 96, 'sex': 1, 'cardType': 1, 'name': '石非凡', 'devPersonId': '46', 'id': '371324199803243658', 'type': 0}], 'sex': 0, 'occurrenceCount': 0, 'deviceCode': '1000038', 'globalScenePicUrl': '6ad010cf-ce45-11ec-9715-e4246c7d1635/20220826/1/dsf_3de82501-2521-11ed-884a-e4246c7d1635_1825520_2088390.jpg', 'eye': 0, 'alarmType': 1001003, 'perFlag': -1, 'mouth': 0, 'feature': [], 'isHit': True, 'channelSeq': 23, 'szSerialUUID': '', 'channelName': '窑头平台进料口', 'beginTime': 1661506557, 'endTime': 1661506557, 'age': -1, 'mask': 0}, 'unitType': 1, 'alarmType': 1001003, 'channelSeq': 23, 'orgCode': '001001001', 'channelName': '窑头平台进料口', 'alarmStat': 1, 'isEvent': True}, 'subsystem': 'evo-face', 'userIds': None, 'sid': None, 'domainId': None, 'infoArray': None, 'protocol': None} dispatch_dahua_event(data=data) return Response() @@ -234,8 +236,13 @@ class TestViewSet(CustomGenericViewSet): Dept.objects.get_queryset(all=True).filter(type='rparty').delete(soft=False) if 'event' in datas: from apps.ecm.models import Event - Event.objects.get_queryset(all=True).delete(soft=False) + Event.objects.get_queryset(all=True).delete() if 'opm' in datas: from apps.opm.models import Operation Operation.objects.all().delete() + Ticket.objects.get_queryset(all=True).filter(workflow__key__contains='opl_').delete(soft=False) + if 'ptask' in datas: + from django_celery_results.models import TaskResult + TaskResult.objects.filter(task_name__in=['apps.vm.tasks.close_visit_by_leave_time', + 'apps.rpm.tasks.close_rpj_by_leave_time']).delete() return Response() diff --git a/apps/ecm/migrations/0004_alter_eventcate_opl_cates.py b/apps/ecm/migrations/0004_alter_eventcate_opl_cates.py new file mode 100644 index 00000000..314a2792 --- /dev/null +++ b/apps/ecm/migrations/0004_alter_eventcate_opl_cates.py @@ -0,0 +1,19 @@ +# Generated by Django 3.2.12 on 2022-08-30 07:17 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('opm', '0002_initial'), + ('ecm', '0003_alter_notifysetting_filter_area_level'), + ] + + operations = [ + migrations.AlterField( + model_name='eventcate', + name='opl_cates', + field=models.ManyToManyField(blank=True, to='opm.OplCate', verbose_name='关联许可证'), + ), + ] diff --git a/apps/ecm/models.py b/apps/ecm/models.py index 82e9722a..1fdf6d1d 100644 --- a/apps/ecm/models.py +++ b/apps/ecm/models.py @@ -2,7 +2,7 @@ from django.db import models from apps.am.models import Area from apps.hrm.models import Employee from apps.opm.models import Opl, OplCate -from apps.utils.models import BaseModel, CommonADModel, CommonAModel, CommonBModel +from apps.utils.models import BaseModel, CommonADModel, CommonAModel, CommonBModel, CommonBDModel from apps.system.models import Post, User from apps.third.models import TDevice # Create your models here. @@ -29,7 +29,7 @@ class EventCate(CommonAModel): default=Area.AREA_1) hanle_minute = models.PositiveSmallIntegerField('处理时间', default=0, help_text='超过处理时间事件状态变为超时未处理,0代表未配置') same_allow_minute = models.PositiveSmallIntegerField('允许时间', default=0, help_text='同一对象同事件多长时间内不再触发, 0代表一直触发') - opl_cates = models.ManyToManyField(OplCate, verbose_name='关联许可证') + opl_cates = models.ManyToManyField(OplCate, verbose_name='关联许可证', blank=True) def __str__(self): return self.name @@ -71,7 +71,7 @@ class NotifySetting(CommonADModel): sort = models.PositiveIntegerField('排序', default=1) -class Event(CommonBModel): +class Event(CommonBDModel): """ 事件 """ diff --git a/apps/ecm/service.py b/apps/ecm/service.py index 98a916e3..761d1686 100644 --- a/apps/ecm/service.py +++ b/apps/ecm/service.py @@ -571,3 +571,38 @@ def get_area_from_point(x: int, y: int, floorNo: str): elif i['type'] == Area.AREA_TYPE_TEMP: area_temp = i return area_fix, area_temp + + +def snap_and_analyse(vchannel: TDevice, algo_codes: list, opl: Opl): + global_img_o = dhClient.snap(vchannel.code) + happen_time = timezone.now() + ec_codes = ai_analyse(algo_codes, global_img=global_img_o) # 算法处理返回的事件结果 + if ec_codes: + # 获取本次所有发生事件种类 + ecs = EventCate.objects.filter(code__in=ec_codes.keys()) + obj_cate = 'other' + ep = None + if 'helmet' in ec_codes: + # 如果存在安全帽事件 + # 尝试以图搜图找到当事人 + res = dhClient.face_search(path=global_img_o) + if res and res[0]: + ep = Employee.objects.filter(id_number=res[0]['identity']).first() + if ep: + obj_cate = 'people' + event = Event() + event.global_img = save_dahua_pic(global_img_o) + event.vchannel = vchannel + event.area = vchannel.area + event.obj_cate = obj_cate + event.employee = ep + event.happen_time = happen_time + event.opl = opl + event.save() + for i in ecs: + Eventdo.objects.get_or_create(cate=i, event=event, defaults={ + 'cate': i, + 'event': event + }) + if event: + notify_event(event) \ No newline at end of file diff --git a/apps/ecm/tasks.py b/apps/ecm/tasks.py index 3f0e5bbd..1e99efe3 100644 --- a/apps/ecm/tasks.py +++ b/apps/ecm/tasks.py @@ -7,7 +7,7 @@ from apps.ai.main import ai_analyse from apps.am.models import Area from apps.ecm.models import EventCate, Eventdo -from apps.ecm.service import notify_event, save_dahua_pic +from apps.ecm.service import notify_event, snap_and_analyse from apps.hrm.models import Employee from apps.opm.models import Opl from apps.third.clients import xxClient @@ -76,44 +76,6 @@ def check_event_timeout(): i.save() -@shared_task -def snap_and_analyse(code: str, algo_codes: list, opl_id: str): - global_img_o = dhClient.snap(code) - happen_time = timezone.now() - vchannel = TDevice.objects.filter(code=code).first() - ec_codes = ai_analyse(algo_codes, global_img=global_img_o) # 算法处理返回的事件结果 - if ec_codes: - # 获取本次所有发生事件种类 - ecs = EventCate.objects.filter(code__in=ec_codes.keys()) - obj_cate = 'other' - ep = None - if 'helmet' in ec_codes: - # 如果存在安全帽事件 - # 尝试以图搜图找到当事人 - res = dhClient.face_search(path=global_img_o) - if res and res[0]: - ep = Employee.objects.filter(id_number=res[0]['identity']).first() - if ep: - obj_cate = 'people' - event = Event() - event.global_img = save_dahua_pic(global_img_o) - if vchannel: - event.vchannel = vchannel - event.area = vchannel.area - event.obj_cate = obj_cate - event.employee = ep - event.happen_time = happen_time - event.opl = Opl.objects.get(id=opl_id) - event.save() - for i in ecs: - Eventdo.objects.get_or_create(cate=i, event=event, defaults={ - 'cate': i, - 'event': event - }) - if event: - notify_event(event) - - @shared_task def opl_task(vc_codes: list, opl_id: str): """作业监控任务 @@ -121,7 +83,9 @@ def opl_task(vc_codes: list, opl_id: str): opl_cate = Opl.objects.get(id=opl_id).cate # 找到作业需要加载的算法 algo_codes = list(EventCate.objects.filter(opl_cates=opl_cate).values_list('code', flat=True)) + vchannels = TDevice.objects.filter(code__in=vc_codes) + opl = Opl.objects.get(id=opl_id) while True: - for i in vc_codes: - snap_and_analyse.delay(i, algo_codes, opl_id) + for i in vchannels: + Thread(target=snap_and_analyse, args=(i, algo_codes, opl)).start() time.sleep(2) diff --git a/apps/opm/migrations/0003_alter_operation_vchannels.py b/apps/opm/migrations/0003_alter_operation_vchannels.py new file mode 100644 index 00000000..2591b2bc --- /dev/null +++ b/apps/opm/migrations/0003_alter_operation_vchannels.py @@ -0,0 +1,19 @@ +# Generated by Django 3.2.12 on 2022-08-30 07:17 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('third', '0002_alter_tdevice_areas'), + ('opm', '0002_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='operation', + name='vchannels', + field=models.ManyToManyField(blank=True, to='third.TDevice', verbose_name='监控所用摄像头'), + ), + ] diff --git a/apps/opm/models.py b/apps/opm/models.py index 4c3d7653..d85ad083 100644 --- a/apps/opm/models.py +++ b/apps/opm/models.py @@ -58,7 +58,7 @@ class Operation(CommonBDModel): on_delete=models.CASCADE) state_work = models.CharField('生产状态', max_length=20, help_text='运行/停机/检修') cates = models.ManyToManyField(OplCate, through='opm.opl') - vchannels = models.ManyToManyField(TDevice, verbose_name='监控所用摄像头') + vchannels = models.ManyToManyField(TDevice, verbose_name='监控所用摄像头', blank=True) class Opl(CommonBDModel):