diff --git a/apps/develop/views.py b/apps/develop/views.py index 4eac057d..ddbcc9c2 100755 --- a/apps/develop/views.py +++ b/apps/develop/views.py @@ -193,6 +193,7 @@ class TestViewSet(CustomGenericViewSet): 测试算法2 """ + mode = request.data.get('mode', 1) from apps.ecm.service import dispatch_dahua_event data = {'id': None, 'category': 'alarm', 'method': 'alarm.msg', 'info': {'orgName': '河北省', 'alarmPictureSize': '885977', 'nodeCode': '1002182$1$0$0', 'deviceCode': '1002182', 'alarmCode': '{B55A1489-0064-8D42-B6F4-EFF2DE1DA9B1}', 'alarmPicture': '6ad010cf-ce45-11ec-9715-e4246c7d1635/20220831/1/dsf_3c4ef3fe-290f-11ed-884a-e4246c7d1635_55425449_56311426.jpg', 'nodeType': 2, 'deviceName': '192.168.10.155', 'alarmDate': '1661942981', 'alarmGrade': 2, 'isSave': True, 'unitType': 1, 'unitSeq': 0, 'extend': {'params': {'ObjectType': 'Human', 'GroupId': 30.0, 'ObjectSubType': ''}, 'objectSubType': ''}, 'alarmType': 964, 'channelSeq': 0, 'orgCode': '001', 'channelName': '192.168.10.155_视频通道_1', 'alarmStat': 1, 'isEvent': True}, 'subsystem': 'admin', 'userIds': None, 'sid': None, 'domainId': None, 'infoArray': None, 'protocol': None} @@ -201,9 +202,12 @@ class TestViewSet(CustomGenericViewSet): # data = {'id': 1662032288888, 'category': 'alarm', 'method': 'alarm.msg', 'info': {'orgName': '曲阳县金隅水泥厂', 'nodeCode': '1000038$1$0$25', 'deviceCode': '1000038', 'alarmCode': 'c3df59cd-59d0-4f46-a32c-d2bf7778b37d', 'alarmPicture': '6ad010cf-ce45-11ec-9715-e4246c7d1635/20220901/1/dsf_80fed821-29c9-11ed-884a-e4246c7d1635_44280859_44288676.jpg', 'nodeType': 2, 'alarmDate': '1662032288', 'alarmGrade': 2, 'isSave': True, 'extend': {'faceImageUrl': ['6ad010cf-ce45-11ec-9715-e4246c7d1635/20220901/1/dsf_80fed821-29c9-11ed-884a-e4246c7d1635_44280859_44288676.jpg'], 'glass': 0, 'beard': 0, 'candidateInfo': [], 'sex': 0, 'occurrenceCount': 0, 'deviceCode': '1000038', 'globalScenePicUrl': '6ad010cf-ce45-11ec-9715-e4246c7d1635/20220901/1/dsf_80fed821-29c9-11ed-884a-e4246c7d1635_44127174_44280859.jpg', 'eye': 0, 'alarmType': 1001000, 'perFlag': -1, 'mouth': 0, 'feature': [], 'isHit': True, 'channelSeq': 25, 'szSerialUUID': '', 'channelName': '公司大门口', 'beginTime': 1662032284, 'endTime': 1662032284, 'age': -1, 'mask': 0}, 'unitType': 1, 'alarmType': 1001000, 'channelSeq': 25, 'orgCode': '001001001', 'channelName': '公司大门口', 'alarmStat': 1, 'isEvent': True}, 'subsystem': 'evo-face', 'userIds': None, 'sid': None, 'domainId': None, 'infoArray': None, 'protocol': None} data = {'id': 1662099853937, 'category': 'alarm', 'method': 'alarm.msg', 'info': {'orgName': '曲阳县金隅水泥厂', 'nodeCode': '1000038$1$0$24', 'deviceCode': '1000038', 'alarmCode': 'c520e09f-4b5d-4d04-be7b-005386a9b835', 'alarmPicture': '6ad010cf-ce45-11ec-9715-e4246c7d1635/20220902/1/dsf_a880f743-2a7e-11ed-884a-e4246c7d1635_57321861_57329128.jpg', 'nodeType': 2, 'alarmDate': '1662099849', 'alarmGrade': 2, 'isSave': True, 'extend': {'faceImageUrl': ['6ad010cf-ce45-11ec-9715-e4246c7d1635/20220902/1/dsf_a880f743-2a7e-11ed-884a-e4246c7d1635_57321861_57329128.jpg'], 'glass': 0, 'beard': 0, 'candidateInfo': [{'birthday': '2022-8-24', 'faceImageUrl': [ '6ad010cf-ce45-11ec-9715-e4246c7d1635/20220902/1/dsf_a880f743-2a7e-11ed-884a-e4246c7d1635_57329128_57402530.jpg'], 'groupName': '全体人员', 'similarity': 99, 'sex': 1, 'cardType': 1, 'name': '曹前明', 'devPersonId': '48', 'id': '342422199004040175', 'type': 0}], 'sex': 0, 'occurrenceCount': 0, 'deviceCode': '1000038', 'globalScenePicUrl': '6ad010cf-ce45-11ec-9715-e4246c7d1635/20220902/1/dsf_a880f743-2a7e-11ed-884a-e4246c7d1635_56995669_57321861.jpg', 'eye': 0, 'alarmType': 1001003, 'perFlag': -1, 'mouth': 0, 'feature': [], 'isHit': True, 'channelSeq': 24, 'szSerialUUID': '', 'channelName': '窑头平台值班室', 'beginTime': 1662099849, 'endTime': 1662099849, 'age': -1, 'mask': 0}, 'unitType': 1, 'alarmType': 1001003, 'channelSeq': 24, 'orgCode': '001001001', 'channelName': '窑头平台值班室', 'alarmStat': 1, 'isEvent': True}, 'subsystem': 'evo-face', 'userIds': None, 'sid': None, 'domainId': None, 'infoArray': None, 'protocol': None} - data = {'id': 1662786479984, 'category': 'alarm', 'method': 'alarm.msg', 'info': {'orgName': '曲阳县金隅水泥厂', 'nodeCode': '1000038$1$0$24', 'deviceCode': '1000038', 'alarmCode': 'b672731c-4807-47e6-a468-c5f85a68e87d', 'alarmPicture': '6ad010cf-ce45-11ec-9715-e4246c7d1635/20220910/1/dsf_2c1150b4-309b-11ed-884a-e4246c7d1635_45588364_45596445.jpg', 'nodeType': 2, 'alarmDate': '1662786477', 'alarmGrade': 2, 'isSave': True, 'extend': {'faceImageUrl': ['6ad010cf-ce45-11ec-9715-e4246c7d1635/20220910/1/dsf_2c1150b4-309b-11ed-884a-e4246c7d1635_45588364_45596445.jpg'], 'glass': 0, 'beard': 0, 'candidateInfo': [{'birthday': '2022-8-24', 'faceImageUrl': [ - '6ad010cf-ce45-11ec-9715-e4246c7d1635/20220910/1/dsf_2c1150b4-309b-11ed-884a-e4246c7d1635_45596445_45673444.jpg'], 'groupName': '全体人员', 'similarity': 81, 'sex': 2, 'cardType': 1, 'name': '石静', 'devPersonId': '47', 'id': '371324199502156548', 'type': 0}], 'sex': 0, 'occurrenceCount': 0, 'deviceCode': '1000038', 'globalScenePicUrl': '6ad010cf-ce45-11ec-9715-e4246c7d1635/20220910/1/dsf_2c1150b4-309b-11ed-884a-e4246c7d1635_45288246_45588364.jpg', 'eye': 0, 'alarmType': 1001003, 'perFlag': -1, 'mouth': 0, 'feature': [], 'isHit': True, 'channelSeq': 24, 'szSerialUUID': '', 'channelName': '窑头平台值班室', 'beginTime': 1662786477, 'endTime': 1662786477, 'age': -1, 'mask': 0}, 'unitType': 1, 'alarmType': 1001003, 'channelSeq': 24, 'orgCode': '001001001', 'channelName': '窑头平台值班室', 'alarmStat': 1, 'isEvent': True}, 'subsystem': 'evo-face', 'userIds': None, 'sid': None, 'domainId': None, 'infoArray': None, 'protocol': None} - data = {'id': None, 'category': 'alarm', 'method': 'alarm.msg', 'info': {'orgName': '曲阳县金隅水泥厂', 'alarmPictureSize': '592887', 'nodeCode': '1002191$1$0$0', 'deviceCode': '1002191', 'alarmCode': '{DBF64A47-DA5B-F147-B474-E74F54E4B6E9}', 'alarmPicture': '6ad010cf-ce45-11ec-9715-e4246c7d1635/20220923/1/dsf_b834ecae-3ad7-11ed-85c0-e4246c7d1635_43351055_43943942.jpg', 'nodeType': 2, 'deviceName': '192.168.10.177', 'alarmDate': '1663897556', 'alarmGrade': 2, 'isSave': True, 'unitType': 1, 'unitSeq': 0, 'extend': {'params': {'ObjectType': 'Unknown', 'nResetID': 0.0, 'HFOV': 0.0, 'stuPTZPosition': {'nPositionX': 0.0, 'nPositionY': 0.0, 'nZoom': 0.0}, 'Objects': [{'stuBoundingBox': {'nTop': 2616.0, 'nBottom': 3288.0, 'nLeft': 4352.0, 'nRight': 4768.0}}], 'nRuleID': 2.0, 'GroupId': 380.0, 'ObjectSubType': '', 'VFOV': 0.0}, 'objectSubType': ''}, 'alarmType': 303, 'channelSeq': 0, 'orgCode': '001001001', 'channelName': '二道门地中衡', 'alarmStat': 1, 'isEvent': True}, 'subsystem': 'admin', 'userIds': None, 'sid': None, 'domainId': None, 'infoArray': None, 'protocol': None} + if mode == 1: + data = {'id': 1662786479984, 'category': 'alarm', 'method': 'alarm.msg', 'info': {'orgName': '曲阳县金隅水泥厂', 'nodeCode': '1000038$1$0$24', 'deviceCode': '1000038', 'alarmCode': 'b672731c-4807-47e6-a468-c5f85a68e87d', 'alarmPicture': '6ad010cf-ce45-11ec-9715-e4246c7d1635/20220910/1/dsf_2c1150b4-309b-11ed-884a-e4246c7d1635_45588364_45596445.jpg', 'nodeType': 2, 'alarmDate': '1662786477', 'alarmGrade': 2, 'isSave': True, 'extend': {'faceImageUrl': ['6ad010cf-ce45-11ec-9715-e4246c7d1635/20220910/1/dsf_2c1150b4-309b-11ed-884a-e4246c7d1635_45588364_45596445.jpg'], 'glass': 0, 'beard': 0, 'candidateInfo': [{'birthday': '2022-8-24', 'faceImageUrl': [ + '6ad010cf-ce45-11ec-9715-e4246c7d1635/20220910/1/dsf_2c1150b4-309b-11ed-884a-e4246c7d1635_45596445_45673444.jpg'], 'groupName': '全体人员', 'similarity': 81, 'sex': 2, 'cardType': 1, 'name': '石静', 'devPersonId': '47', 'id': '371324199502156548', 'type': 0}], 'sex': 0, 'occurrenceCount': 0, 'deviceCode': '1000038', 'globalScenePicUrl': '6ad010cf-ce45-11ec-9715-e4246c7d1635/20220910/1/dsf_2c1150b4-309b-11ed-884a-e4246c7d1635_45288246_45588364.jpg', 'eye': 0, 'alarmType': 1001003, 'perFlag': -1, 'mouth': 0, 'feature': [], 'isHit': True, 'channelSeq': 24, 'szSerialUUID': '', 'channelName': '窑头平台值班室', 'beginTime': 1662786477, 'endTime': 1662786477, 'age': -1, 'mask': 0}, 'unitType': 1, 'alarmType': 1001003, 'channelSeq': 24, 'orgCode': '001001001', 'channelName': '窑头平台值班室', 'alarmStat': 1, 'isEvent': True}, 'subsystem': 'evo-face', 'userIds': None, 'sid': None, 'domainId': None, 'infoArray': None, 'protocol': None} + elif mode == 2: + data = {'id': None, 'category': 'alarm', 'method': 'alarm.msg', 'info': {'orgName': '曲阳县金隅水泥厂', 'alarmPictureSize': '592887', 'nodeCode': '1002191$1$0$0', 'deviceCode': '1002191', 'alarmCode': '{DBF64A47-DA5B-F147-B474-E74F54E4B6E9}', 'alarmPicture': '6ad010cf-ce45-11ec-9715-e4246c7d1635/20220923/1/dsf_b834ecae-3ad7-11ed-85c0-e4246c7d1635_43351055_43943942.jpg', 'nodeType': 2, 'deviceName': '192.168.10.177', 'alarmDate': '1663897556', 'alarmGrade': 2, 'isSave': True, 'unitType': 1, 'unitSeq': 0, 'extend': {'params': {'ObjectType': 'Unknown', + 'nResetID': 0.0, 'HFOV': 0.0, 'stuPTZPosition': {'nPositionX': 0.0, 'nPositionY': 0.0, 'nZoom': 0.0}, 'Objects': [{'stuBoundingBox': {'nTop': 2616.0, 'nBottom': 3288.0, 'nLeft': 4352.0, 'nRight': 4768.0}}], 'nRuleID': 2.0, 'GroupId': 380.0, 'ObjectSubType': '', 'VFOV': 0.0}, 'objectSubType': ''}, 'alarmType': 303, 'channelSeq': 0, 'orgCode': '001001001', 'channelName': '二道门地中衡', 'alarmStat': 1, 'isEvent': True}, 'subsystem': 'admin', 'userIds': None, 'sid': None, 'domainId': None, 'infoArray': None, 'protocol': None} dispatch_dahua_event(data=data) return Response() diff --git a/apps/ecm/service.py b/apps/ecm/service.py index 461ee913..d86ede9c 100644 --- a/apps/ecm/service.py +++ b/apps/ecm/service.py @@ -298,75 +298,56 @@ def dispatch_dahua_event(data: dict): alarm_type = data['info']['alarmType'] vchannel = TDevice.objects.filter(code=vchannel_code).first() event = None - if alarm_type in [1001003, 1001000] and vchannel: # 内部人员/或陌生人报警 - # 查看加载的算法 - algo_codes = list(AlgoChannel.objects.filter(vchannel=vchannel, algo__self_algo=True).exclude( - algo__code=None).order_by('algo__priority', 'algo__create_time').values_list('algo__code', flat=True)) - area = vchannel.area # 视频所在区域 - if algo_codes: # 如果加载了算法才继续 - face_img_o = dhClient.get_full_pic(data['info']['alarmPicture']) - global_img_o = dhClient.get_full_pic(data['info']['extend']['globalScenePicUrl']) - obj_cate = 'people' - ep = None # 对应人员 - ec_codes_origin = {} - if alarm_type == 1001003: # 内部人员 - ep = Employee.objects.filter(id_number=data['info']['extend']['candidateInfo'][0]['id']).first() - # 检查是否携带定位卡只针对内部员工和相关方 - if 'miss_lcard' in algo_codes and ep: - is_happend = check_miss_lcard(ep=ep, area=area) - if is_happend: - ec_codes_origin.update({'miss_lcard': None}) - ec_codes = ai_analyse(codes=algo_codes, global_img=global_img_o, face_img=face_img_o) # 算法处理 - ec_codes.update(ec_codes_origin) - if ec_codes: # 如果触发事件 - # 获取本次所有发生事件种类 - ecs = EventCate.objects.filter(code__in=ec_codes.keys()) - # 创建事件 - event = Event() - event.face_img = save_dahua_pic(face_img_o) - event.global_img = save_dahua_pic(global_img_o) - event.area = area - event.obj_cate = obj_cate - event.vchannel = vchannel - event.employee = ep - event.happen_time = timestamp_to_time(int(data['info']['alarmDate'])) - event.save() - for i in ecs: - Eventdo.objects.get_or_create(cate=i, event=event, defaults={ - 'cate': i, - 'event': event - }) - elif 300 < alarm_type < 1000 and vchannel: # 其他智能通道报警 + if vchannel is None: + return + face_img_o = None + global_img_o = None + area = vchannel.area + obj_cate = 'other' + ep = None + if alarm_type in [1001003, 1001000]: + obj_cate = 'people' + face_img_o = dhClient.get_full_pic(data['info']['alarmPicture']) + global_img_o = dhClient.get_full_pic(data['info']['extend']['globalScenePicUrl']) + else: global_img_o = dhClient.get_full_pic(data['info']['alarmPicture']) - happen_time = timestamp_to_time(int(data['info']['alarmDate'])) - algo_channels = AlgoChannel.objects.filter(vchannel=vchannel, algo__self_algo=True).exclude( + happen_time = timestamp_to_time(int(data['info']['alarmDate'])) + algo_channels = AlgoChannel.objects.filter(vchannel=vchannel, algo__self_algo=True).exclude( algo__code=None).order_by('algo__priority', 'algo__create_time').values('id', 'algo', 'algo__code') - cates = [] # 触发的事件种类 - algo_codes = [] # 需要执行的ai算法 - for i in algo_channels: - if i['algo__code'] == str(alarm_type): - cates.append(i['algo']) - else: - algo_codes.append(i['algo__code']) - if algo_codes: - ec_codes = ai_analyse(algo_codes, global_img=global_img_o) # 算法处理 - for m in ec_codes.keys(): - for n in algo_channels: - if m == n['algo__code']: - cates.append(n['algo']) - event = Event() - event.global_img = save_dahua_pic(global_img_o) - event.area = vchannel.area - event.obj_cate = 'other' - event.vchannel = vchannel - event.happen_time = happen_time - event.save() - for i in cates: - cate = EventCate.objects.get(id=i) - Eventdo.objects.get_or_create(cate=cate, event=event, defaults={ - 'cate': cate, - 'event': event - }) + cates = [] # 触发的事件种类 + algo_codes = [] # 需要执行的ai算法 + for i in algo_channels: + if i['algo__code'] == str(alarm_type): + cates.append(i['algo']) + else: + algo_codes.append(i['algo__code']) + if algo_codes: + ec_codes = ai_analyse(algo_codes, global_img=global_img_o, face_img=face_img_o) # 算法处理 + for m in ec_codes.keys(): + for n in algo_channels: + if m == n['algo__code']: + cates.append(n['algo']) + if alarm_type == 1001003 and area: # 内部人员需要执行未带定位卡算法 + ep = Employee.objects.filter(id_number=data['info']['extend']['candidateInfo'][0]['id']).first() + # 检查是否携带定位卡只针对内部员工和相关方 + if 'miss_lcard' in algo_codes and ep: + is_happend = check_miss_lcard(ep=ep, area=area) + if is_happend: + cates.append(EventCate.objects.get(code='miss_lcard').first().id) + event = Event() + event.global_img = save_dahua_pic(global_img_o) + event.area = area + event.obj_cate = obj_cate + event.vchannel = vchannel + event.employee = ep + event.happen_time = happen_time + event.save() + for i in cates: + cate = EventCate.objects.get(id=i) + Eventdo.objects.get_or_create(cate=cate, event=event, defaults={ + 'cate': cate, + 'event': event + }) if event: notify_event(event)