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 __future__ import absolute_import, unicode_literals
from threading import Thread
from celery import shared_task from celery import shared_task
from apps.am.models import Area from apps.am.models import Area
from apps.third.clients import xxClient from apps.third.clients import xxClient
from apps.third.models import TDevice
from apps.third.tapis import xxapis 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 @shared_task
def cal_area_count(): def cal_area_count():
""" """
计算区域内人员数量 计算区域内人员数量
""" """
for i in Area.objects.filter(type=Area.AREA_TYPE_FIX): for i in Area.objects.filter(type=Area.AREA_TYPE_FIX):
if i.third_info.get('xx_rail', None): Thread(target=update_count_people, args=(i,)).start()
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

View File

@ -22,7 +22,7 @@ class EmployeeSimpleSerializer(CustomModelSerializer):
class Meta: class Meta:
model = Employee 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): class EmployeeBaseSerializer(CustomModelSerializer):
@ -58,6 +58,10 @@ class EmployeeCreateUpdateSerializer(EmployeeBaseSerializer):
@transaction.atomic @transaction.atomic
def create(self, validated_data): def create(self, validated_data):
instance = super().create(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: if settings.DAHUA_ENABLED and dhClient:
dahua_data = HrmService.sync_dahua_employee(ep=instance) dahua_data = HrmService.sync_dahua_employee(ep=instance)
third_info = instance.third_info third_info = instance.third_info
@ -69,6 +73,10 @@ class EmployeeCreateUpdateSerializer(EmployeeBaseSerializer):
def update(self, instance, validated_data): def update(self, instance, validated_data):
old_photo = instance.photo old_photo = instance.photo
instance = super().update(instance, validated_data) instance = super().update(instance, validated_data)
if instance.user: # 同步更新账户里的手机号
user = instance.user
user.phone = instance.phone
user.save()
if settings.DAHUA_ENABLED and dhClient: if settings.DAHUA_ENABLED and dhClient:
dahua_data = HrmService.sync_dahua_employee(ep=instance, old_photo=old_photo) dahua_data = HrmService.sync_dahua_employee(ep=instance, old_photo=old_photo)
third_info = instance.third_info third_info = instance.third_info

View File

@ -1,3 +1,4 @@
from django.contrib.auth.models import UserManager
import enum import enum
from django.db import models from django.db import models
from django.contrib.auth.models import AbstractUser from django.contrib.auth.models import AbstractUser
@ -111,11 +112,10 @@ class PostRole(BaseModel):
on_delete=models.CASCADE, null=True, blank=True) on_delete=models.CASCADE, null=True, blank=True)
from django.contrib.auth.models import UserManager
class SoftDeletableUserManager(SoftDeletableManagerMixin, UserManager): class SoftDeletableUserManager(SoftDeletableManagerMixin, UserManager):
pass pass
class User(AbstractUser, CommonBModel): 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 serializer_class = DeptSerializer
create_serializer_class = DeptCreateUpdateSerializer create_serializer_class = DeptCreateUpdateSerializer
update_serializer_class = DeptCreateUpdateSerializer update_serializer_class = DeptCreateUpdateSerializer
@ -313,6 +313,14 @@ class DeptViewSet(CustomModelViewSet):
filterset_fields = ['type'] filterset_fields = ['type']
search_fields = ['name'] 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): class RoleViewSet(CustomModelViewSet):
"""角色-增删改查 """角色-增删改查

View File

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

View File

@ -52,7 +52,7 @@ class BltViewSet(CustomGenericViewSet):
macs = [] macs = []
for i in blt_list: for i in blt_list:
macs.append(i['mac']) 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['total'] = qs.count()
ret['count_employee'] = qs.filter(employee__type='employee').count() ret['count_employee'] = qs.filter(employee__type='employee').count()
ret['count_remployee'] = qs.filter(employee__type='remployee').count() ret['count_remployee'] = qs.filter(employee__type='remployee').count()
@ -86,12 +86,13 @@ class BltViewSet(CustomGenericViewSet):
"online": "online" "online": "online"
} }
_, res = xxClient.request(**xxapis['blt_list'], json=json) _, res = xxClient.request(**xxapis['blt_list'], json=json)
count_people = 0
blt_list = res['recordList'] blt_list = res['recordList']
macs = [] macs = []
for i in blt_list: for i in blt_list:
macs.append(i['mac']) macs.append(i['mac'])
qs = self.queryset.filter(code__in=macs).exclude(employee=None) 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 = {} qs_dict = {}
for i in qs_data: for i in qs_data:
qs_dict[i['code']] = i qs_dict[i['code']] = i
@ -99,6 +100,11 @@ class BltViewSet(CustomGenericViewSet):
i['my_info'] = {} i['my_info'] = {}
if i['mac'] in qs_dict: if i['mac'] in qs_dict:
i['my_info'] = qs_dict[i['mac']] 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) return Response(blt_list)
@ -123,7 +129,7 @@ class TDeviceViewSet(ListModelMixin, CustomGenericViewSet):
for i in res['recordList']: for i in res['recordList']:
macs.append(i['mac']) macs.append(i['mac'])
qs = self.queryset.filter(code__in=macs).exclude(employee=None) 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 = {} qs_dict = {}
for i in qs_data: for i in qs_data:
qs_dict[i['code']] = i qs_dict[i['code']] = i
@ -148,10 +154,12 @@ class TDeviceViewSet(ListModelMixin, CustomGenericViewSet):
for i in res['pageData']: for i in res['pageData']:
codes.append(i['channelCode']) codes.append(i['channelCode'])
tds_info = TDeviceSerializer(instance=TDevice.objects.filter(code__in=codes), many=True).data tds_info = TDeviceSerializer(instance=TDevice.objects.filter(code__in=codes), many=True).data
for x in res['pageData']: tds_dict = {}
for y in tds_info: for i in tds_info:
if x['channelCode'] == y['code']: tds_dict[i['code']] = i
x['my_info'] = y for i in res['pageData']:
if i['channelCode'] in tds_dict:
i['my_info'] = tds_dict[i['channelCode']]
return Response(res) return Response(res)
@action(methods=['post'], detail=False, perms_map={'post': '*'}, @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) _, 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) return Response(res)
@action(methods=['post'], detail=False, perms_map={'post': '*'}, @action(methods=['post'], detail=False, perms_map={'post': '*'},
@ -175,6 +193,17 @@ class TDeviceViewSet(ListModelMixin, CustomGenericViewSet):
""" """
request.data.update({'channelTypeList': ["7"]}) request.data.update({'channelTypeList': ["7"]})
_, res = dhClient.request(**dhapis['channel_list'], json=request.data) _, 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) return Response(res)
@action(methods=['post'], detail=False, perms_map={'post': 'tdevice:label_location'}, @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 baidu-aip==4.16.6
chardet==5.0.0 chardet==5.0.0
requests==2.28.1 requests==2.28.1
grpcio==1.47.0
grpcio-tools==1.47.0
protobuf==3.20.1