测试抓图识别

This commit is contained in:
曹前明 2022-09-11 16:54:35 +08:00
parent 568d6545d0
commit 2d3e91d7e4
11 changed files with 205 additions and 20 deletions

View File

@ -10,6 +10,11 @@ service Helmet_Reg {
rpc sendHelmet_Info(JinYu_Request) returns (BHhelmet_Response){} rpc sendHelmet_Info(JinYu_Request) returns (BHhelmet_Response){}
} }
service Fire_Reg {
rpc sendFire_Info(JinYu_Request) returns (BHFire_Response){}
}
message JinYu_Request { message JinYu_Request {
int64 zzid = 1; //ID int64 zzid = 1; //ID
string imgsbase64 = 2 ; //Base64字符串 string imgsbase64 = 2 ; //Base64字符串
@ -17,10 +22,17 @@ message JinYu_Request {
} }
message BHhelmet_Response { message BHhelmet_Response {
int64 zzid = 1; //ID int64 zzid = 1; //ID
repeated HelmetInfo helmetinfoList = 2; //0: 1 2: repeated HelmetInfo helmetinfoList = 2; //0: 1 2:
} }
message BHFire_Response {
int64 zzid = 1; //ID
repeated FireInfo FireinfoList = 2; //0: 1
}
message Point { message Point {
double x = 1; //x坐标 double x = 1; //x坐标
double y = 2; //y坐标 double y = 2; //y坐标
@ -35,4 +47,10 @@ message HelmetInfo {
int64 head_helmet = 1; // int64 head_helmet = 1; //
double conf = 2; // double conf = 2; //
Rectangle coord = 3; // Rectangle coord = 3; //
}
message FireInfo {
int64 fire = 1; //0 1
double conf = 2; //
Rectangle coord = 3; //
} }

View File

@ -14,15 +14,17 @@ _sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x11\x42\x65iHangGrpc.proto\"A\n\rJinYu_Request\x12\x0c\n\x04zzid\x18\x01 \x01(\x03\x12\x12\n\nimgsbase64\x18\x02 \x01(\t\x12\x0e\n\x06imgUrl\x18\x03 \x01(\t\"F\n\x11\x42Hhelmet_Response\x12\x0c\n\x04zzid\x18\x01 \x01(\x03\x12#\n\x0ehelmetinfoList\x18\x02 \x03(\x0b\x32\x0b.HelmetInfo\"\x1d\n\x05Point\x12\t\n\x01x\x18\x01 \x01(\x01\x12\t\n\x01y\x18\x02 \x01(\x01\":\n\tRectangle\x12\x15\n\x05uleft\x18\x01 \x01(\x0b\x32\x06.Point\x12\x16\n\x06lright\x18\x02 \x01(\x0b\x32\x06.Point\"J\n\nHelmetInfo\x12\x13\n\x0bhead_helmet\x18\x01 \x01(\x03\x12\x0c\n\x04\x63onf\x18\x02 \x01(\x01\x12\x19\n\x05\x63oord\x18\x03 \x01(\x0b\x32\n.Rectangle2E\n\nHelmet_Reg\x12\x37\n\x0fsendHelmet_Info\x12\x0e.JinYu_Request\x1a\x12.BHhelmet_Response\"\x00\x42,\n\x17\x63om.lyzh.aiservice.grpcB\x0c\x42\x65iHangProtoP\x01\x88\x01\x01\x62\x06proto3') DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x11\x42\x65iHangGrpc.proto\"A\n\rJinYu_Request\x12\x0c\n\x04zzid\x18\x01 \x01(\x03\x12\x12\n\nimgsbase64\x18\x02 \x01(\t\x12\x0e\n\x06imgUrl\x18\x03 \x01(\t\"F\n\x11\x42Hhelmet_Response\x12\x0c\n\x04zzid\x18\x01 \x01(\x03\x12#\n\x0ehelmetinfoList\x18\x02 \x03(\x0b\x32\x0b.HelmetInfo\"@\n\x0f\x42HFire_Response\x12\x0c\n\x04zzid\x18\x01 \x01(\x03\x12\x1f\n\x0c\x46ireinfoList\x18\x02 \x03(\x0b\x32\t.FireInfo\"\x1d\n\x05Point\x12\t\n\x01x\x18\x01 \x01(\x01\x12\t\n\x01y\x18\x02 \x01(\x01\":\n\tRectangle\x12\x15\n\x05uleft\x18\x01 \x01(\x0b\x32\x06.Point\x12\x16\n\x06lright\x18\x02 \x01(\x0b\x32\x06.Point\"J\n\nHelmetInfo\x12\x13\n\x0bhead_helmet\x18\x01 \x01(\x03\x12\x0c\n\x04\x63onf\x18\x02 \x01(\x01\x12\x19\n\x05\x63oord\x18\x03 \x01(\x0b\x32\n.Rectangle\"A\n\x08\x46ireInfo\x12\x0c\n\x04\x66ire\x18\x01 \x01(\x03\x12\x0c\n\x04\x63onf\x18\x02 \x01(\x01\x12\x19\n\x05\x63oord\x18\x03 \x01(\x0b\x32\n.Rectangle2E\n\nHelmet_Reg\x12\x37\n\x0fsendHelmet_Info\x12\x0e.JinYu_Request\x1a\x12.BHhelmet_Response\"\x00\x32?\n\x08\x46ire_Reg\x12\x33\n\rsendFire_Info\x12\x0e.JinYu_Request\x1a\x10.BHFire_Response\"\x00\x42,\n\x17\x63om.lyzh.aiservice.grpcB\x0c\x42\x65iHangProtoP\x01\x88\x01\x01\x62\x06proto3')
_JINYU_REQUEST = DESCRIPTOR.message_types_by_name['JinYu_Request'] _JINYU_REQUEST = DESCRIPTOR.message_types_by_name['JinYu_Request']
_BHHELMET_RESPONSE = DESCRIPTOR.message_types_by_name['BHhelmet_Response'] _BHHELMET_RESPONSE = DESCRIPTOR.message_types_by_name['BHhelmet_Response']
_BHFIRE_RESPONSE = DESCRIPTOR.message_types_by_name['BHFire_Response']
_POINT = DESCRIPTOR.message_types_by_name['Point'] _POINT = DESCRIPTOR.message_types_by_name['Point']
_RECTANGLE = DESCRIPTOR.message_types_by_name['Rectangle'] _RECTANGLE = DESCRIPTOR.message_types_by_name['Rectangle']
_HELMETINFO = DESCRIPTOR.message_types_by_name['HelmetInfo'] _HELMETINFO = DESCRIPTOR.message_types_by_name['HelmetInfo']
_FIREINFO = DESCRIPTOR.message_types_by_name['FireInfo']
JinYu_Request = _reflection.GeneratedProtocolMessageType('JinYu_Request', (_message.Message,), { JinYu_Request = _reflection.GeneratedProtocolMessageType('JinYu_Request', (_message.Message,), {
'DESCRIPTOR' : _JINYU_REQUEST, 'DESCRIPTOR' : _JINYU_REQUEST,
'__module__' : 'BeiHangGrpc_pb2' '__module__' : 'BeiHangGrpc_pb2'
@ -37,6 +39,13 @@ BHhelmet_Response = _reflection.GeneratedProtocolMessageType('BHhelmet_Response'
}) })
_sym_db.RegisterMessage(BHhelmet_Response) _sym_db.RegisterMessage(BHhelmet_Response)
BHFire_Response = _reflection.GeneratedProtocolMessageType('BHFire_Response', (_message.Message,), {
'DESCRIPTOR' : _BHFIRE_RESPONSE,
'__module__' : 'BeiHangGrpc_pb2'
# @@protoc_insertion_point(class_scope:BHFire_Response)
})
_sym_db.RegisterMessage(BHFire_Response)
Point = _reflection.GeneratedProtocolMessageType('Point', (_message.Message,), { Point = _reflection.GeneratedProtocolMessageType('Point', (_message.Message,), {
'DESCRIPTOR' : _POINT, 'DESCRIPTOR' : _POINT,
'__module__' : 'BeiHangGrpc_pb2' '__module__' : 'BeiHangGrpc_pb2'
@ -58,7 +67,15 @@ HelmetInfo = _reflection.GeneratedProtocolMessageType('HelmetInfo', (_message.Me
}) })
_sym_db.RegisterMessage(HelmetInfo) _sym_db.RegisterMessage(HelmetInfo)
FireInfo = _reflection.GeneratedProtocolMessageType('FireInfo', (_message.Message,), {
'DESCRIPTOR' : _FIREINFO,
'__module__' : 'BeiHangGrpc_pb2'
# @@protoc_insertion_point(class_scope:FireInfo)
})
_sym_db.RegisterMessage(FireInfo)
_HELMET_REG = DESCRIPTOR.services_by_name['Helmet_Reg'] _HELMET_REG = DESCRIPTOR.services_by_name['Helmet_Reg']
_FIRE_REG = DESCRIPTOR.services_by_name['Fire_Reg']
if _descriptor._USE_C_DESCRIPTORS == False: if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None DESCRIPTOR._options = None
@ -67,12 +84,18 @@ if _descriptor._USE_C_DESCRIPTORS == False:
_JINYU_REQUEST._serialized_end=86 _JINYU_REQUEST._serialized_end=86
_BHHELMET_RESPONSE._serialized_start=88 _BHHELMET_RESPONSE._serialized_start=88
_BHHELMET_RESPONSE._serialized_end=158 _BHHELMET_RESPONSE._serialized_end=158
_POINT._serialized_start=160 _BHFIRE_RESPONSE._serialized_start=160
_POINT._serialized_end=189 _BHFIRE_RESPONSE._serialized_end=224
_RECTANGLE._serialized_start=191 _POINT._serialized_start=226
_RECTANGLE._serialized_end=249 _POINT._serialized_end=255
_HELMETINFO._serialized_start=251 _RECTANGLE._serialized_start=257
_HELMETINFO._serialized_end=325 _RECTANGLE._serialized_end=315
_HELMET_REG._serialized_start=327 _HELMETINFO._serialized_start=317
_HELMET_REG._serialized_end=396 _HELMETINFO._serialized_end=391
_FIREINFO._serialized_start=393
_FIREINFO._serialized_end=458
_HELMET_REG._serialized_start=460
_HELMET_REG._serialized_end=529
_FIRE_REG._serialized_start=531
_FIRE_REG._serialized_end=594
# @@protoc_insertion_point(module_scope) # @@protoc_insertion_point(module_scope)

View File

@ -64,3 +64,64 @@ class Helmet_Reg(object):
BeiHangGrpc__pb2.BHhelmet_Response.FromString, BeiHangGrpc__pb2.BHhelmet_Response.FromString,
options, channel_credentials, options, channel_credentials,
insecure, call_credentials, compression, wait_for_ready, timeout, metadata) insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
class Fire_RegStub(object):
"""Missing associated documentation comment in .proto file."""
def __init__(self, channel):
"""Constructor.
Args:
channel: A grpc.Channel.
"""
self.sendFire_Info = channel.unary_unary(
'/Fire_Reg/sendFire_Info',
request_serializer=BeiHangGrpc__pb2.JinYu_Request.SerializeToString,
response_deserializer=BeiHangGrpc__pb2.BHFire_Response.FromString,
)
class Fire_RegServicer(object):
"""Missing associated documentation comment in .proto file."""
def sendFire_Info(self, request, context):
"""Missing associated documentation comment in .proto file."""
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def add_Fire_RegServicer_to_server(servicer, server):
rpc_method_handlers = {
'sendFire_Info': grpc.unary_unary_rpc_method_handler(
servicer.sendFire_Info,
request_deserializer=BeiHangGrpc__pb2.JinYu_Request.FromString,
response_serializer=BeiHangGrpc__pb2.BHFire_Response.SerializeToString,
),
}
generic_handler = grpc.method_handlers_generic_handler(
'Fire_Reg', rpc_method_handlers)
server.add_generic_rpc_handlers((generic_handler,))
# This class is part of an EXPERIMENTAL API.
class Fire_Reg(object):
"""Missing associated documentation comment in .proto file."""
@staticmethod
def sendFire_Info(request,
target,
options=(),
channel_credentials=None,
call_credentials=None,
insecure=False,
compression=None,
wait_for_ready=None,
timeout=None,
metadata=None):
return grpc.experimental.unary_unary(request, target, '/Fire_Reg/sendFire_Info',
BeiHangGrpc__pb2.JinYu_Request.SerializeToString,
BeiHangGrpc__pb2.BHFire_Response.FromString,
options, channel_credentials,
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)

View File

@ -4,15 +4,15 @@ import base64
from io import BytesIO from io import BytesIO
import requests import requests
import grpc import grpc
# import BeiHangGrpc_pb2_grpc
# import BeiHangGrpc_pb2
from . import BeiHangGrpc_pb2_grpc from . import BeiHangGrpc_pb2_grpc
from . import BeiHangGrpc_pb2 from . import BeiHangGrpc_pb2
import uuid
from django.conf import settings
import cv2
requests.packages.urllib3.disable_warnings() requests.packages.urllib3.disable_warnings()
# from apps.utils.tools import convert_to_base64
def analyse(ip: str, pic_url: str): def helmet(ip: str, pic_url: str):
"""安全帽事件 """安全帽事件
Args: Args:
@ -20,7 +20,7 @@ def analyse(ip: str, pic_url: str):
pic_url (_type_): _description_ pic_url (_type_): _description_
""" """
# print(pic_url) # print(pic_url)
channel = grpc.insecure_channel(ip) # 监听频道 channel = grpc.insecure_channel(ip+':2000') # 监听频道
stub = BeiHangGrpc_pb2_grpc.Helmet_RegStub(channel) # 客户端使用Stub类发送请求,参数为频道,为了绑定链接 stub = BeiHangGrpc_pb2_grpc.Helmet_RegStub(channel) # 客户端使用Stub类发送请求,参数为频道,为了绑定链接
image_id = 3 image_id = 3
@ -42,6 +42,33 @@ def analyse(ip: str, pic_url: str):
return False, response return False, response
def fire1(ip: str, pic_url: str):
# 未配置灭火器事件
channel = grpc.insecure_channel(ip+':2001')
stub = BeiHangGrpc_pb2_grpc.Fire_RegStub(channel)
image_id = 3
img_name = '{}.png'.format(uuid.uuid4())
img_path = settings.BASE_DIR + '/temp/' + img_name
with open(img_path, "wb") as f:
f.write(requests.get(url=pic_url, verify=False).content).read())
img = cv2.imread(img_path)
resized_img = cv2.resize(img, None, fx=0.25,fy=0.25)
resized_img = cv2.imencode('.png',resized_img)[1]
image_base64 = str(base64.b64encode(resized_img))[2:-1]
request = BeiHangGrpc_pb2.JinYu_Request(zzid=image_id, imgsbase64=image_base64)
response = stub.sendFire_Info(request)
if response.FireinfoList:
for i in response.FireinfoList:
if i.fire == 0: # 配置了灭火器
return False, response
return True, response
if __name__ == "__main__": if __name__ == "__main__":
path = 'http://10.99.5.24/evo-apigw/evo-oss/6ad010cf-ce45-11ec-9715-e4246c7d1635/20220826/1/dsf_3de82501-2521-11ed-884a-e4246c7d1635_7236037_7245601.jpg?token=399773e6-71f7-4202-b234-ff5aa8d2492c' path = 'http://10.99.5.24/evo-apigw/evo-oss/6ad010cf-ce45-11ec-9715-e4246c7d1635/20220826/1/dsf_3de82501-2521-11ed-884a-e4246c7d1635_7236037_7245601.jpg?token=399773e6-71f7-4202-b234-ff5aa8d2492c'
base64img = str(base64.b64encode(BytesIO(requests.get(url=path, verify=False).content).read()), 'utf-8') base64img = str(base64.b64encode(BytesIO(requests.get(url=path, verify=False).content).read()), 'utf-8')

View File

@ -6,7 +6,7 @@ myLogger = logging.getLogger('log')
algo_dict = { algo_dict = {
"helmet": "apps.ai.helmet.algo.analyse" "helmet": "apps.ai.client.helmet"
} }

View File

@ -9,9 +9,11 @@ from apps.develop.serializers import CleanDataSerializer, GenerateVoiceSerialize
TestTaskSerializer, TestAlgoSerializer TestTaskSerializer, TestAlgoSerializer
from apps.develop.tasks import backup_database, backup_media, reload_web_git, reload_server_git, reload_server_only from apps.develop.tasks import backup_database, backup_media, reload_web_git, reload_server_git, reload_server_only
from rest_framework.exceptions import APIException from rest_framework.exceptions import APIException
from apps.ecm.service import create_remind, notify_event from apps.ecm.service import create_remind, notify_event, snap_and_analyse
from apps.opm.models import Opl
from apps.system.tasks import show from apps.system.tasks import show
from apps.third.clients import dhClient from apps.third.clients import dhClient
from apps.third.models import TDevice
from apps.utils.sms import send_sms from apps.utils.sms import send_sms
from apps.utils.speech import generate_voice from apps.utils.speech import generate_voice
@ -193,8 +195,19 @@ 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': 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': [ 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} '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}
dispatch_dahua_event(data=data) dispatch_dahua_event(data=data)
return Response() return Response()
@action(methods=['post'], detail=False, serializer_class=Serializer)
def test_snap(self, request, pk=None):
"""测试抓图识别
测试抓图识别
"""
vc = TDevice.objects.get(code='1000164$1$0$0')
snap_and_analyse(vc, ['fire1'], Opl.objects.get(id='1568880208688320512'))
return Response()
@action(methods=['post'], detail=False, serializer_class=Serializer) @action(methods=['post'], detail=False, serializer_class=Serializer)
def send_wx_msg(self, request, pk=None): def send_wx_msg(self, request, pk=None):

View File

@ -82,7 +82,9 @@ def notify_event(event: Event, voice_msg=''):
obj_cate = event.obj_cate obj_cate = event.obj_cate
area_name = event.area.name if event.area else '' area_name = event.area.name if event.area else ''
params = {'area': area_name, 'employee': '', 'event': ''} params = {'area': area_name, 'employee': '', 'event': ''}
if ep: if event.opl: # 主要针对的是作业人员未就位事件
params['employee'] = event.opl.cate.name + '作业'
elif ep:
ep_name = ep.name ep_name = ep.name
ep_type = '员工' ep_type = '员工'
if ep.type == 'rempoyee': if ep.type == 'rempoyee':
@ -217,6 +219,43 @@ def create_remind(event: Event, params: dict):
event.save() event.save()
def check_not_in_place(opl: Opl):
# 检查作业人员未就位事件(直接创建事件)
area = opl.operation.area
try:
railId = area.third_info['xx_rail']['id']
json = {
"railId": railId,
"type": ""
}
is_ok, res = xxClient.request(**xxapis['rail_ibeacon_list'], json=json, raise_exception=False)
if is_ok:
blt_list = res['recordList']
macs = [] # 所有该区域在线标签
for i in blt_list:
macs.append(i['mac'])
tds = TDevice.objects.filter(type=TDevice.DEVICE_BLT, employee__user__opl_worker__opl=opl) # 所有工作人员的定位标签
for i in tds:
if i.code not in macs:
# 触发作业人员未就位事件
event = Event()
event.area = area
event.obj_cate = 'opl'
event.employee = i.employee
event.opl = opl
event.happen_time = timezone.now()
event.save()
cate = EventCate.objects.get(code='not_in_place')
Eventdo.objects.get_or_create(cate=cate, event=event, defaults={
'cate': event,
'event': event
})
notify_event(event)
break
except Exception:
myLogger.error('检查作业人员未就位失败', exc_info=True)
def check_miss_lcard(ep: Employee, area: Area): def check_miss_lcard(ep: Employee, area: Area):
# 获取当前区域下的定位卡列表 # 获取当前区域下的定位卡列表
try: try:
@ -620,7 +659,7 @@ def snap_and_analyse(vchannel: TDevice, algo_codes: list, opl: Opl):
if ec_codes: if ec_codes:
# 获取本次所有发生事件种类 # 获取本次所有发生事件种类
ecs = EventCate.objects.filter(code__in=ec_codes.keys()) ecs = EventCate.objects.filter(code__in=ec_codes.keys())
obj_cate = 'other' obj_cate = 'opl'
ep = None ep = None
if 'helmet' in ec_codes: if 'helmet' in ec_codes:
# 如果存在安全帽事件 # 如果存在安全帽事件

View File

@ -263,3 +263,5 @@ class HrmService:
state=Visit.V_WORKING) state=Visit.V_WORKING)
Rpj.objects.filter(state=Rpj.RPJ_ENTER, remployees__employee__id_number=id_number).update( Rpj.objects.filter(state=Rpj.RPJ_ENTER, remployees__employee__id_number=id_number).update(
state=Rpj.RPJ_WORKING) state=Rpj.RPJ_WORKING)
# 此处可触发安全帽事件逻辑

View File

@ -125,7 +125,7 @@ class OplWorker(BaseModel):
作业许可人员 作业许可人员
""" """
worker = models.ForeignKey('system.user', verbose_name='作业人员', worker = models.ForeignKey('system.user', verbose_name='作业人员',
on_delete=models.CASCADE) on_delete=models.CASCADE, related_name='opl_worker')
opl = models.ForeignKey(Opl, verbose_name='作业许可', opl = models.ForeignKey(Opl, verbose_name='作业许可',
on_delete=models.CASCADE) on_delete=models.CASCADE)
duty = models.CharField('工作职责', max_length=100, duty = models.CharField('工作职责', max_length=100,

View File

@ -1,3 +1,4 @@
from apps.ecm.tasks import opl_task from apps.ecm.tasks import opl_task
from apps.opm.models import Operation, Opl, OplWorker from apps.opm.models import Operation, Opl, OplWorker
from apps.third.models import TDevice from apps.third.models import TDevice

View File

@ -202,6 +202,7 @@ REST_FRAMEWORK = {
# simplejwt配置 # simplejwt配置
SIMPLE_JWT = { SIMPLE_JWT = {
'ACCESS_TOKEN_LIFETIME': timedelta(days=1), 'ACCESS_TOKEN_LIFETIME': timedelta(days=1),
'REFRESH_TOKEN_LIFETIME': timedelta(days=30),
} }
# 跨域配置/可用nginx处理,无需引入corsheaders # 跨域配置/可用nginx处理,无需引入corsheaders