manytomanyfield 可为空
This commit is contained in:
parent
409d3489ec
commit
54c6623bd1
|
@ -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
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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='关联许可证'),
|
||||
),
|
||||
]
|
|
@ -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):
|
||||
"""
|
||||
事件
|
||||
"""
|
||||
|
|
|
@ -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)
|
|
@ -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)
|
||||
|
|
|
@ -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='监控所用摄像头'),
|
||||
),
|
||||
]
|
|
@ -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):
|
||||
|
|
Loading…
Reference in New Issue