diff --git a/apps/ai/helmet/BeiHangGrpc.proto b/apps/ai/BeiHangGrpc.proto similarity index 66% rename from apps/ai/helmet/BeiHangGrpc.proto rename to apps/ai/BeiHangGrpc.proto index efc32ed3..526a5037 100644 --- a/apps/ai/helmet/BeiHangGrpc.proto +++ b/apps/ai/BeiHangGrpc.proto @@ -10,6 +10,11 @@ service Helmet_Reg { rpc sendHelmet_Info(JinYu_Request) returns (BHhelmet_Response){} } +service Fire_Reg { + rpc sendFire_Info(JinYu_Request) returns (BHFire_Response){} +} + + message JinYu_Request { int64 zzid = 1; //业务唯一ID string imgsbase64 = 2 ; //图像Base64字符串 @@ -17,10 +22,17 @@ message JinYu_Request { } message BHhelmet_Response { - int64 zzid = 1; //业务唯一ID + int64 zzid = 1; //业务唯一ID repeated HelmetInfo helmetinfoList = 2; //0:带安全帽 1:未带安全帽 2:未知 } +message BHFire_Response { + int64 zzid = 1; //业务唯一ID + repeated FireInfo FireinfoList = 2; //0:灭火器 1:气瓶 +} + + + message Point { double x = 1; //x坐标 double y = 2; //y坐标 @@ -35,4 +47,10 @@ message HelmetInfo { int64 head_helmet = 1; //戴头盔 double conf = 2; //置信度 Rectangle coord = 3; //矩形坐标 +} + +message FireInfo { + int64 fire = 1; //类别:0:灭火器 1:气瓶 + double conf = 2; //置信度 + Rectangle coord = 3; //矩形坐标 } \ No newline at end of file diff --git a/apps/ai/helmet/BeiHangGrpc_pb2.py b/apps/ai/BeiHangGrpc_pb2.py similarity index 57% rename from apps/ai/helmet/BeiHangGrpc_pb2.py rename to apps/ai/BeiHangGrpc_pb2.py index ef592683..32ac5b7a 100644 --- a/apps/ai/helmet/BeiHangGrpc_pb2.py +++ b/apps/ai/BeiHangGrpc_pb2.py @@ -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'] _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'] _RECTANGLE = DESCRIPTOR.message_types_by_name['Rectangle'] _HELMETINFO = DESCRIPTOR.message_types_by_name['HelmetInfo'] +_FIREINFO = DESCRIPTOR.message_types_by_name['FireInfo'] JinYu_Request = _reflection.GeneratedProtocolMessageType('JinYu_Request', (_message.Message,), { 'DESCRIPTOR' : _JINYU_REQUEST, '__module__' : 'BeiHangGrpc_pb2' @@ -37,6 +39,13 @@ BHhelmet_Response = _reflection.GeneratedProtocolMessageType('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,), { 'DESCRIPTOR' : _POINT, '__module__' : 'BeiHangGrpc_pb2' @@ -58,7 +67,15 @@ HelmetInfo = _reflection.GeneratedProtocolMessageType('HelmetInfo', (_message.Me }) _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'] +_FIRE_REG = DESCRIPTOR.services_by_name['Fire_Reg'] if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None @@ -67,12 +84,18 @@ if _descriptor._USE_C_DESCRIPTORS == False: _JINYU_REQUEST._serialized_end=86 _BHHELMET_RESPONSE._serialized_start=88 _BHHELMET_RESPONSE._serialized_end=158 - _POINT._serialized_start=160 - _POINT._serialized_end=189 - _RECTANGLE._serialized_start=191 - _RECTANGLE._serialized_end=249 - _HELMETINFO._serialized_start=251 - _HELMETINFO._serialized_end=325 - _HELMET_REG._serialized_start=327 - _HELMET_REG._serialized_end=396 + _BHFIRE_RESPONSE._serialized_start=160 + _BHFIRE_RESPONSE._serialized_end=224 + _POINT._serialized_start=226 + _POINT._serialized_end=255 + _RECTANGLE._serialized_start=257 + _RECTANGLE._serialized_end=315 + _HELMETINFO._serialized_start=317 + _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) diff --git a/apps/ai/helmet/BeiHangGrpc_pb2_grpc.py b/apps/ai/BeiHangGrpc_pb2_grpc.py similarity index 52% rename from apps/ai/helmet/BeiHangGrpc_pb2_grpc.py rename to apps/ai/BeiHangGrpc_pb2_grpc.py index fa683ffe..338e7b84 100644 --- a/apps/ai/helmet/BeiHangGrpc_pb2_grpc.py +++ b/apps/ai/BeiHangGrpc_pb2_grpc.py @@ -64,3 +64,64 @@ class Helmet_Reg(object): BeiHangGrpc__pb2.BHhelmet_Response.FromString, options, channel_credentials, 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) diff --git a/apps/ai/helmet/algo.py b/apps/ai/client.py similarity index 63% rename from apps/ai/helmet/algo.py rename to apps/ai/client.py index 74ada56d..c30c70a4 100644 --- a/apps/ai/helmet/algo.py +++ b/apps/ai/client.py @@ -4,15 +4,15 @@ import base64 from io import BytesIO import requests import grpc -# import BeiHangGrpc_pb2_grpc -# import BeiHangGrpc_pb2 from . import BeiHangGrpc_pb2_grpc from . import BeiHangGrpc_pb2 +import uuid +from django.conf import settings +import cv2 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: @@ -20,7 +20,7 @@ def analyse(ip: str, pic_url: str): pic_url (_type_): _description_ """ # print(pic_url) - channel = grpc.insecure_channel(ip) # 监听频道 + channel = grpc.insecure_channel(ip+':2000') # 监听频道 stub = BeiHangGrpc_pb2_grpc.Helmet_RegStub(channel) # 客户端使用Stub类发送请求,参数为频道,为了绑定链接 image_id = 3 @@ -42,6 +42,33 @@ def analyse(ip: str, pic_url: str): 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__": 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') diff --git a/apps/ai/main.py b/apps/ai/main.py index 8b6cf0e2..d146ad76 100644 --- a/apps/ai/main.py +++ b/apps/ai/main.py @@ -6,7 +6,7 @@ myLogger = logging.getLogger('log') algo_dict = { - "helmet": "apps.ai.helmet.algo.analyse" + "helmet": "apps.ai.client.helmet" } diff --git a/apps/develop/views.py b/apps/develop/views.py index b2bdf2b6..43db6164 100755 --- a/apps/develop/views.py +++ b/apps/develop/views.py @@ -9,9 +9,11 @@ from apps.develop.serializers import CleanDataSerializer, GenerateVoiceSerialize TestTaskSerializer, TestAlgoSerializer 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 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.third.clients import dhClient +from apps.third.models import TDevice from apps.utils.sms import send_sms 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': 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} dispatch_dahua_event(data=data) 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) def send_wx_msg(self, request, pk=None): diff --git a/apps/ecm/service.py b/apps/ecm/service.py index f2c06802..87ef1759 100644 --- a/apps/ecm/service.py +++ b/apps/ecm/service.py @@ -82,7 +82,9 @@ def notify_event(event: Event, voice_msg=''): obj_cate = event.obj_cate area_name = event.area.name if event.area else '' params = {'area': area_name, 'employee': '', 'event': ''} - if ep: + if event.opl: # 主要针对的是作业人员未就位事件 + params['employee'] = event.opl.cate.name + '作业' + elif ep: ep_name = ep.name ep_type = '员工' if ep.type == 'rempoyee': @@ -217,6 +219,43 @@ def create_remind(event: Event, params: dict): 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): # 获取当前区域下的定位卡列表 try: @@ -620,7 +659,7 @@ def snap_and_analyse(vchannel: TDevice, algo_codes: list, opl: Opl): if ec_codes: # 获取本次所有发生事件种类 ecs = EventCate.objects.filter(code__in=ec_codes.keys()) - obj_cate = 'other' + obj_cate = 'opl' ep = None if 'helmet' in ec_codes: # 如果存在安全帽事件 diff --git a/apps/hrm/services.py b/apps/hrm/services.py index 1e620973..66803eaf 100755 --- a/apps/hrm/services.py +++ b/apps/hrm/services.py @@ -263,3 +263,5 @@ class HrmService: state=Visit.V_WORKING) Rpj.objects.filter(state=Rpj.RPJ_ENTER, remployees__employee__id_number=id_number).update( state=Rpj.RPJ_WORKING) + + # 此处可触发安全帽事件逻辑 diff --git a/apps/opm/models.py b/apps/opm/models.py index 56bdec04..7f86bf61 100644 --- a/apps/opm/models.py +++ b/apps/opm/models.py @@ -125,7 +125,7 @@ class OplWorker(BaseModel): 作业许可人员 """ 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='作业许可', on_delete=models.CASCADE) duty = models.CharField('工作职责', max_length=100, diff --git a/apps/opm/services.py b/apps/opm/services.py index 6b310323..a44d4023 100644 --- a/apps/opm/services.py +++ b/apps/opm/services.py @@ -1,3 +1,4 @@ + from apps.ecm.tasks import opl_task from apps.opm.models import Operation, Opl, OplWorker from apps.third.models import TDevice diff --git a/server/settings.py b/server/settings.py index b8ecbbfb..c41cedde 100755 --- a/server/settings.py +++ b/server/settings.py @@ -202,6 +202,7 @@ REST_FRAMEWORK = { # simplejwt配置 SIMPLE_JWT = { 'ACCESS_TOKEN_LIFETIME': timedelta(days=1), + 'REFRESH_TOKEN_LIFETIME': timedelta(days=30), } # 跨域配置/可用nginx处理,无需引入corsheaders