blt employee 带照片

This commit is contained in:
曹前明 2022-07-06 10:59:44 +08:00
parent f4b467dced
commit 026d860900
11 changed files with 295 additions and 26 deletions

View File

@ -0,0 +1,38 @@
//python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. ./BeiHangGrpc.proto
syntax = "proto3";
option java_generic_services = true;
option java_multiple_files = true;
option java_package = "com.lyzh.aiservice.grpc";
option java_outer_classname = "BeiHangProto";
service Helmet_Reg {
rpc sendHelmet_Info(JinYu_Request) returns (BHhelmet_Response){}
}
message JinYu_Request {
int64 zzid = 1; //ID
string imgsbase64 = 2 ; //Base64字符串
string imgUrl = 3 ; //oss链接Url
}
message BHhelmet_Response {
int64 zzid = 1; //ID
repeated HelmetInfo helmetinfoList = 2; //0: 1
}
message Point {
double x = 1; //x坐标
double y = 2; //y坐标
}
message Rectangle {
Point uleft = 1; //
Point lright = 2; //
}
message HelmetInfo {
int64 head_helmet = 1; //
double conf = 2; //
Rectangle coord = 3; //
}

View File

@ -0,0 +1,75 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: BeiHangGrpc.proto
"""Generated protocol buffer code."""
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports)
_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')
_JINYU_REQUEST = DESCRIPTOR.message_types_by_name['JinYu_Request']
_BHHELMET_RESPONSE = DESCRIPTOR.message_types_by_name['BHhelmet_Response']
_POINT = DESCRIPTOR.message_types_by_name['Point']
_RECTANGLE = DESCRIPTOR.message_types_by_name['Rectangle']
_HELMETINFO = DESCRIPTOR.message_types_by_name['HelmetInfo']
JinYu_Request = _reflection.GeneratedProtocolMessageType('JinYu_Request', (_message.Message,), {
'DESCRIPTOR': _JINYU_REQUEST,
'__module__': 'BeiHangGrpc_pb2'
# @@protoc_insertion_point(class_scope:JinYu_Request)
})
_sym_db.RegisterMessage(JinYu_Request)
BHhelmet_Response = _reflection.GeneratedProtocolMessageType('BHhelmet_Response', (_message.Message,), {
'DESCRIPTOR': _BHHELMET_RESPONSE,
'__module__': 'BeiHangGrpc_pb2'
# @@protoc_insertion_point(class_scope:BHhelmet_Response)
})
_sym_db.RegisterMessage(BHhelmet_Response)
Point = _reflection.GeneratedProtocolMessageType('Point', (_message.Message,), {
'DESCRIPTOR': _POINT,
'__module__': 'BeiHangGrpc_pb2'
# @@protoc_insertion_point(class_scope:Point)
})
_sym_db.RegisterMessage(Point)
Rectangle = _reflection.GeneratedProtocolMessageType('Rectangle', (_message.Message,), {
'DESCRIPTOR': _RECTANGLE,
'__module__': 'BeiHangGrpc_pb2'
# @@protoc_insertion_point(class_scope:Rectangle)
})
_sym_db.RegisterMessage(Rectangle)
HelmetInfo = _reflection.GeneratedProtocolMessageType('HelmetInfo', (_message.Message,), {
'DESCRIPTOR': _HELMETINFO,
'__module__': 'BeiHangGrpc_pb2'
# @@protoc_insertion_point(class_scope:HelmetInfo)
})
_sym_db.RegisterMessage(HelmetInfo)
_HELMET_REG = DESCRIPTOR.services_by_name['Helmet_Reg']
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\027com.lyzh.aiservice.grpcB\014BeiHangProtoP\001\210\001\001'
_JINYU_REQUEST._serialized_start = 21
_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
# @@protoc_insertion_point(module_scope)

View File

@ -0,0 +1,67 @@
# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
"""Client and server classes corresponding to protobuf-defined services."""
import grpc
import BeiHangGrpc_pb2 as BeiHangGrpc__pb2
class Helmet_RegStub(object):
"""Missing associated documentation comment in .proto file."""
def __init__(self, channel):
"""Constructor.
Args:
channel: A grpc.Channel.
"""
self.sendHelmet_Info = channel.unary_unary(
'/Helmet_Reg/sendHelmet_Info',
request_serializer=BeiHangGrpc__pb2.JinYu_Request.SerializeToString,
response_deserializer=BeiHangGrpc__pb2.BHhelmet_Response.FromString,
)
class Helmet_RegServicer(object):
"""Missing associated documentation comment in .proto file."""
def sendHelmet_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_Helmet_RegServicer_to_server(servicer, server):
rpc_method_handlers = {
'sendHelmet_Info': grpc.unary_unary_rpc_method_handler(
servicer.sendHelmet_Info,
request_deserializer=BeiHangGrpc__pb2.JinYu_Request.FromString,
response_serializer=BeiHangGrpc__pb2.BHhelmet_Response.SerializeToString,
),
}
generic_handler = grpc.method_handlers_generic_handler(
'Helmet_Reg', rpc_method_handlers)
server.add_generic_rpc_handlers((generic_handler,))
# This class is part of an EXPERIMENTAL API.
class Helmet_Reg(object):
"""Missing associated documentation comment in .proto file."""
@staticmethod
def sendHelmet_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, '/Helmet_Reg/sendHelmet_Info',
BeiHangGrpc__pb2.JinYu_Request.SerializeToString,
BeiHangGrpc__pb2.BHhelmet_Response.FromString,
options, channel_credentials,
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)

31
apps/ecm/Jinyu_Client.py Normal file
View File

@ -0,0 +1,31 @@
import grpc
# import base64
from . import BeiHangGrpc_pb2_grpc
from . import BeiHangGrpc_pb2
if __name__ == "__main__":
IP = '127.0.0.1:9000'
channel = grpc.insecure_channel(IP) # 监听频道
stub = BeiHangGrpc_pb2_grpc.Helmet_RegStub(channel) # 客户端使用Stub类发送请求,参数为频道,为了绑定链接
image_id = 3
# 本地图像输入
# image_path = "./onnx/image/single3.jpg"
# with open(image_path, 'rb') as f:
# image_base64 = str(base64.b64encode(f.read()), encoding='utf-8')
# request = BeiHangGrpc_pb2.JinYu_Request(zzid=image_id,imgsbase64=image_base64)
# URL输入
imgUrl = "XXXXX.jpg"
request = BeiHangGrpc_pb2.JinYu_Request(zzid=image_id, imgUrl=imgUrl)
try:
response = stub.sendHelmet_Info(request)
print("network success! \n")
print(response)
except Exception:
print("network error! \n")

View File

@ -1,30 +1,38 @@
from __future__ import absolute_import, unicode_literals
from threading import Thread
from celery import shared_task
from apps.am.models import Area
from apps.third.clients import xxClient
from apps.third.models import TDevice
from apps.third.tapis import xxapis
def update_count_people(i: Area):
if i.third_info.get('xx_rail', None):
railId = i.third_info['xx_rail']['id']
json = {"railId": railId, "type": ""}
_, res = xxClient.request(**xxapis['rail_ibeacon_list'], json=json)
blt_list = res['recordList']
macs = []
for i in blt_list:
macs.append(i['mac'])
i.count_people = TDevice.objects.filter(
type=TDevice.DEVICE_BLT, obj_cate='people', code__in=macs).exclude(employee=None).count()
i.save()
if i.count_people >= i.count_people_max:
# 触发超员事件
pass
elif i.count_people < i.count_people_min:
# 触发缺员事件
pass
@shared_task
def cal_area_count():
"""
计算区域内人员数量
"""
for i in Area.objects.filter(type=Area.AREA_TYPE_FIX):
if i.third_info.get('xx_rail', None):
railId = i.third_info['xx_rail']['id']
json = {"railId": railId, "type": ""}
_, res = xxClient.request(**xxapis['rail_ibeacon_list'], json=json)
total_count = res['totalCount']
if total_count >= i.count_people_max:
# 触发超员事件
i.count_people = total_count
i.save()
pass
elif total_count < i.count_people_min:
# 触发缺员事件
i.count_people_min = total_count
i.save()
pass
Thread(target=update_count_people, args=(i,)).start()

View File

@ -22,7 +22,7 @@ class EmployeeSimpleSerializer(CustomModelSerializer):
class Meta:
model = Employee
fields = ['id', 'type', 'name', 'belong_dept', 'belong_dept_name', 'post', 'post_name']
fields = ['id', 'type', 'name', 'belong_dept', 'belong_dept_name', 'post', 'post_name', 'photo']
class EmployeeBaseSerializer(CustomModelSerializer):
@ -58,6 +58,10 @@ class EmployeeCreateUpdateSerializer(EmployeeBaseSerializer):
@transaction.atomic
def create(self, validated_data):
instance = super().create(validated_data)
if instance.user: # 同步更新账户里的手机号
user = instance.user
user.phone = instance.phone
user.save()
if settings.DAHUA_ENABLED and dhClient:
dahua_data = HrmService.sync_dahua_employee(ep=instance)
third_info = instance.third_info
@ -69,6 +73,10 @@ class EmployeeCreateUpdateSerializer(EmployeeBaseSerializer):
def update(self, instance, validated_data):
old_photo = instance.photo
instance = super().update(instance, validated_data)
if instance.user: # 同步更新账户里的手机号
user = instance.user
user.phone = instance.phone
user.save()
if settings.DAHUA_ENABLED and dhClient:
dahua_data = HrmService.sync_dahua_employee(ep=instance, old_photo=old_photo)
third_info = instance.third_info

View File

@ -1,3 +1,4 @@
from django.contrib.auth.models import UserManager
import enum
from django.db import models
from django.contrib.auth.models import AbstractUser
@ -111,11 +112,10 @@ class PostRole(BaseModel):
on_delete=models.CASCADE, null=True, blank=True)
from django.contrib.auth.models import UserManager
class SoftDeletableUserManager(SoftDeletableManagerMixin, UserManager):
pass
class User(AbstractUser, CommonBModel):
"""
用户

View File

@ -305,7 +305,7 @@ class DeptViewSet(CustomModelViewSet):
部门-增删改查
"""
queryset = Dept.objects.filter(type__in=['dept', 'company'])
queryset = Dept.objects.all()
serializer_class = DeptSerializer
create_serializer_class = DeptCreateUpdateSerializer
update_serializer_class = DeptCreateUpdateSerializer
@ -313,6 +313,14 @@ class DeptViewSet(CustomModelViewSet):
filterset_fields = ['type']
search_fields = ['name']
def get_queryset(self):
type = self.request.query_params.get('type', None)
if type:
queryset = Dept.objects.filter(type='rparty')
else:
queryset = Dept.objects.filter(type__in=['dept', 'company'])
return queryset
class RoleViewSet(CustomModelViewSet):
"""角色-增删改查

View File

@ -11,6 +11,8 @@ class PicSerializer(serializers.Serializer):
class TDeviceSerializer(CustomModelSerializer):
area_name = serializers.CharField(source='area.name', read_only=True)
class Meta:
model = TDevice
fields = '__all__'

View File

@ -52,7 +52,7 @@ class BltViewSet(CustomGenericViewSet):
macs = []
for i in blt_list:
macs.append(i['mac'])
qs = self.queryset.filter().exclude(employee=None, code__in=macs)
qs = self.queryset.filter(code__in=macs).exclude(employee=None)
ret['total'] = qs.count()
ret['count_employee'] = qs.filter(employee__type='employee').count()
ret['count_remployee'] = qs.filter(employee__type='remployee').count()
@ -86,12 +86,13 @@ class BltViewSet(CustomGenericViewSet):
"online": "online"
}
_, res = xxClient.request(**xxapis['blt_list'], json=json)
count_people = 0
blt_list = res['recordList']
macs = []
for i in blt_list:
macs.append(i['mac'])
qs = self.queryset.filter(code__in=macs).exclude(employee=None)
qs_data = list(BltSerializer(instance=qs, many=True).data)
qs_data = BltSerializer(instance=qs, many=True).data
qs_dict = {}
for i in qs_data:
qs_dict[i['code']] = i
@ -99,6 +100,11 @@ class BltViewSet(CustomGenericViewSet):
i['my_info'] = {}
if i['mac'] in qs_dict:
i['my_info'] = qs_dict[i['mac']]
if area:
# 更新区域下的总人数
count_people = qs.filter(obj_cate='people').count()
area.count_people = count_people
area.save()
return Response(blt_list)
@ -123,7 +129,7 @@ class TDeviceViewSet(ListModelMixin, CustomGenericViewSet):
for i in res['recordList']:
macs.append(i['mac'])
qs = self.queryset.filter(code__in=macs).exclude(employee=None)
qs_data = list(BltSerializer(instance=qs, many=True).data)
qs_data = BltSerializer(instance=qs, many=True).data
qs_dict = {}
for i in qs_data:
qs_dict[i['code']] = i
@ -148,10 +154,12 @@ class TDeviceViewSet(ListModelMixin, CustomGenericViewSet):
for i in res['pageData']:
codes.append(i['channelCode'])
tds_info = TDeviceSerializer(instance=TDevice.objects.filter(code__in=codes), many=True).data
for x in res['pageData']:
for y in tds_info:
if x['channelCode'] == y['code']:
x['my_info'] = y
tds_dict = {}
for i in tds_info:
tds_dict[i['code']] = i
for i in res['pageData']:
if i['channelCode'] in tds_dict:
i['my_info'] = tds_dict[i['channelCode']]
return Response(res)
@action(methods=['post'], detail=False, perms_map={'post': '*'},
@ -163,6 +171,16 @@ class TDeviceViewSet(ListModelMixin, CustomGenericViewSet):
喇叭列表
"""
_, res = spClient.request(**spapis['device_list'], params=request.data)
codes = []
for i in res['rows']:
codes.append(i['sn'])
tds_info = TDeviceSerializer(instance=TDevice.objects.filter(code__in=codes), many=True).data
tds_dict = {}
for i in tds_info:
tds_dict[i['code']] = i
for i in res['rows']:
if i['sn'] in tds_dict:
i['my_info'] = tds_dict[i['sn']]
return Response(res)
@action(methods=['post'], detail=False, perms_map={'post': '*'},
@ -175,6 +193,17 @@ class TDeviceViewSet(ListModelMixin, CustomGenericViewSet):
"""
request.data.update({'channelTypeList': ["7"]})
_, res = dhClient.request(**dhapis['channel_list'], json=request.data)
codes = []
if res.get('pageData', None):
for i in res['pageData']:
codes.append(i['channelCode'])
tds_info = TDeviceSerializer(instance=TDevice.objects.filter(code__in=codes), many=True).data
tds_dict = {}
for i in tds_info:
tds_dict[i['code']] = i
for i in res['pageData']:
if i['channelCode'] in tds_dict:
i['my_info'] = tds_dict[i['channelCode']]
return Response(res)
@action(methods=['post'], detail=False, perms_map={'post': 'tdevice:label_location'},

View File

@ -24,3 +24,6 @@ aliyun-python-sdk-core==2.13.36
baidu-aip==4.16.6
chardet==5.0.0
requests==2.28.1
grpcio==1.47.0
grpcio-tools==1.47.0
protobuf==3.20.1