manytomanyfield 可为空

This commit is contained in:
曹前明 2022-08-30 15:18:08 +08:00
parent 409d3489ec
commit 54c6623bd1
8 changed files with 92 additions and 48 deletions

View File

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

View File

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

View File

@ -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='关联许可证'),
),
]

View File

@ -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):
"""
事件
"""

View File

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

View File

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

View File

@ -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='监控所用摄像头'),
),
]

View File

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