门通道授权 同步人脸库 人像下发状态

This commit is contained in:
caoqianming 2022-04-21 15:13:15 +08:00
parent dfd6ccef18
commit 750c7c5ead
26 changed files with 217 additions and 52 deletions

View File

@ -0,0 +1,18 @@
# Generated by Django 3.2.12 on 2022-04-21 07:11
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('hrm', '0001_initial'),
]
operations = [
migrations.AlterField(
model_name='employee',
name='third_info',
field=models.JSONField(blank=True, default=dict, verbose_name='三方信息'),
),
]

View File

@ -44,6 +44,7 @@ class Employee(CommonBModel):
def __str__(self):
return self.name
# class Card(CommonAModel):
# """
# 卡

View File

@ -9,7 +9,7 @@ from apps.utils.tools import rannum, ranstr
from .models import ClockRecord, Employee, NotWorkRemark
from apps.system.serializers import DeptSimpleSerializer,UserSimpleSerializer
from django.db import transaction
from apps.utils.dahua import dhClient
from apps.third.clients import dhClient
from apps.third.tapis import dhapis
import re
from server.settings import DEBUG
@ -50,7 +50,7 @@ class EmployeeCreateUpdateSerializer(EmployeeBaseSerializer):
instance = super().create(validated_data)
if dhClient:
# 创建人员
_, res = dhClient.request(**dhapis['gen_person_id'])
_, res = dhClient.request(**dhapis['person_gen_id'])
personId = res['id']
departmentId = 1
if instance.belong_dept:
@ -85,7 +85,7 @@ class EmployeeCreateUpdateSerializer(EmployeeBaseSerializer):
)
_, res = dhClient.request(**dhapis['person_add'], json=json_data)
# 开人脸卡
_, res = dhClient.request(**dhapis['gen_card_id'])
_, res = dhClient.request(**dhapis['card_gen_id'])
cardId = res['id']
cardNumber = instance.id[:8] + rannum(2)
now = datetime.now()
@ -159,7 +159,7 @@ class EmployeeCreateUpdateSerializer(EmployeeBaseSerializer):
# 开人脸卡
if instance.job_state in [Employee.JOB_ON]:
if not third_info.get('dh_face_card', None):
_, res = dhClient.request(**dhapis['gen_card_id'])
_, res = dhClient.request(**dhapis['card_gen_id'])
cardId = res['id']
cardNumber = instance.id[3:8] + rannum(5)
now = datetime.now()

View File

@ -23,8 +23,9 @@ from rest_framework.exceptions import ParseError
from django.db import transaction
from datetime import datetime
from rest_framework import serializers
from apps.utils.dahua import dhClient
from apps.third.clients import dhClient
from apps.third.tapis import dhapis
from server import settings
# Create your views here.
class EmployeeViewSet(CustomModelViewSet):
@ -41,7 +42,7 @@ class EmployeeViewSet(CustomModelViewSet):
search_fields = ['name', 'number', 'user__username']
ordering = ['-pk']
@action(methods=['post'], detail=True, perms_map={'post': 'employee_notworkremark'}
@action(methods=['post'], detail=True, perms_map={'post': 'employee.notworkremark'}
, serializer_class=EmployeeNotWorkRemarkSerializer)
def not_work_remark(self, request, pk=None):
"""
@ -73,7 +74,7 @@ class EmployeeViewSet(CustomModelViewSet):
raise ParseError(**NO_NEED_LEVEL_REMARK)
@transaction.atomic
@action(methods=['post'], detail=False, perms_map={'post': 'employee_channel_authority'}
@action(methods=['post'], detail=False, perms_map={'post': 'employee.channel_authority'}
, serializer_class=ChannelAuthoritySerializer)
def channel_authority(self, request, pk=None):
"""门通道授权
@ -107,6 +108,59 @@ class EmployeeViewSet(CustomModelViewSet):
Employee.objects.bulk_update(objs, fields = ['third_info'])
return Response()
@transaction.atomic
@action(methods=['post'], detail=False, perms_map={'post': 'employee.face_bind_1'}
, serializer_class=serializers.Serializer)
def face_bind_1(self, request, pk=None):
"""同步人脸库1
全部人脸库
"""
# 获取设备
json_data = {
"pageNum":1,
"pageSize":1000,
"ownerCodes":['001'],
"showChildNodeData":1,
# "isOnline":1
}
_, res = dhClient.request(**dhapis['dev_page'], json=json_data)
devs = []
if res['pageData']:
for i in res['pageData']:
devs.append(i['deviceCode'])
# 编辑人像库
json_data = {
"groupid":settings.DAHUA_FACEGROUPID_1,
"groupname":"全体人员",
"groupdetail":"全体人员",
"grouptype":3,
"deviceCodeList":devs,
"syncState":0
}
dhClient.request(**dhapis['face_group_update'], json=json_data)
# 人像绑定
json_data = {
"deptId":1,
"groupIdList":[settings.DAHUA_FACEGROUPID_1],
"cascade":True
}
dhClient.request(**dhapis['face_bind'], json=json_data)
return Response()
@action(methods=['get'], detail=False, perms_map={'get': 'employee.face_bind_1'}
, serializer_class=serializers.Serializer)
def face_status_1(self, request, pk=None):
"""人像下发状态
人像下发状态
"""
params = {'id':settings.DAHUA_FACEGROUPID_1}
_, res = dhClient.request(**dhapis['face_group_info'], params=params)
return Response(res)
class ClockRecordViewSet(ListModelMixin, CustomGenericViewSet):
"""
打卡记录

View File

@ -134,7 +134,7 @@ class DrfRequestLogViewSet(ListModelMixin, CustomGenericViewSet):
请求日志
"""
perms_map = {'get':'requestlog_view'}
perms_map = {'get':'requestlog.view'}
queryset = DrfRequestLog.objects.all()
list_serializer_class = DrfRequestLogSerializer
ordering = ['-requested_at']

View File

View File

@ -1,3 +0,0 @@
from django.contrib import admin
# Register your models here.

View File

@ -1,5 +0,0 @@
from django.apps import AppConfig
class MqConfig(AppConfig):
name = 'mq'

View File

@ -1,3 +0,0 @@
from django.db import models
# Create your models here.

View File

@ -1,3 +0,0 @@
from django.test import TestCase
# Create your tests here.

View File

@ -1,3 +0,0 @@
from django.shortcuts import render
# Create your views here.

View File

@ -1,11 +1,11 @@
from django.contrib import admin
from simple_history.admin import SimpleHistoryAdmin
from .models import User, Dept, Role, Permission, DictType, Dict, File
from .models import User, Dept, Role, Permission, DictType, Dictionary, File
# Register your models here.
admin.site.register(User)
admin.site.register(Dept)
admin.site.register(Role)
admin.site.register(Permission)
admin.site.register(DictType)
admin.site.register(Dict, SimpleHistoryAdmin)
admin.site.register(Dictionary, SimpleHistoryAdmin)
admin.site.register(File)

View File

@ -0,0 +1,44 @@
# Generated by Django 3.2.12 on 2022-04-21 07:11
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
('system', '0003_remove_user_phone'),
]
operations = [
migrations.CreateModel(
name='Dictionary',
fields=[
('id', models.CharField(editable=False, help_text='主键ID', max_length=20, primary_key=True, serialize=False, verbose_name='主键ID')),
('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')),
('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')),
('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')),
('name', models.CharField(max_length=60, verbose_name='名称')),
('value', models.CharField(max_length=10, verbose_name='')),
('code', models.CharField(blank=True, max_length=30, null=True, verbose_name='标识')),
('description', models.TextField(blank=True, null=True, verbose_name='描述')),
('sort', models.PositiveSmallIntegerField(default=1, verbose_name='排序')),
('is_used', models.BooleanField(default=True, verbose_name='是否有效')),
('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='dictionary_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='system.dictionary', verbose_name='')),
('type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='system.dicttype', verbose_name='类型')),
('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='dictionary_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
],
options={
'verbose_name': '字典',
'verbose_name_plural': '字典',
'ordering': ['sort'],
'unique_together': {('name', 'is_used', 'type')},
},
),
migrations.DeleteModel(
name='Dict',
),
]

View File

@ -163,7 +163,7 @@ class DictType(CommonAModel):
return self.name
class Dict(CommonAModel):
class Dictionary(CommonAModel):
"""
数据字典
"""

View File

@ -6,7 +6,7 @@ from django_celery_results.models import TaskResult
from apps.system.errors import ROLE_CODE_EXIST, ROLE_NAME_EXIST, USERNAME_EXIST
from apps.utils.serializers import CustomModelSerializer
from apps.utils.constants import EXCLUDE_FIELDS, EXCLUDE_FIELDS_BASE
from .models import (Dict, DictType, File, Dept, Permission, Post,
from .models import (Dictionary, DictType, File, Dept, Permission, Post,
Role, User, UserPost)
from rest_framework.exceptions import ParseError, APIException
from django.db import transaction
@ -84,7 +84,7 @@ class DictSerializer(CustomModelSerializer):
"""
class Meta:
model = Dict
model = Dictionary
fields = '__all__'
class DictCreateUpdateSerializer(CustomModelSerializer):
@ -93,7 +93,7 @@ class DictCreateUpdateSerializer(CustomModelSerializer):
"""
class Meta:
model = Dict
model = Dictionary
exclude = EXCLUDE_FIELDS
class PostSerializer(CustomModelSerializer):
@ -195,7 +195,7 @@ class DeptCreateUpdateSerializer(CustomModelSerializer):
@transaction.atomic
def create(self, validated_data):
from apps.utils.dahua import dhClient
from apps.third.clients import dhClient
if dhClient:
data = {
"parentId":1,
@ -210,7 +210,7 @@ class DeptCreateUpdateSerializer(CustomModelSerializer):
@transaction.atomic
def update(self, instance, validated_data):
from apps.utils.dahua import dhClient
from apps.third.clients import dhClient
third_info = instance.third_info
if dhClient and not third_info.get('dh_id', False):
# 如果dh_id 不存在

View File

@ -21,7 +21,7 @@ from apps.utils.queryset import get_child_queryset2
from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet
from server.celery import app as celery_app
from .filters import UserFilter
from .models import (Dept, Dict, DictType, File, Permission, Post, Role, User,
from .models import (Dept, Dictionary, DictType, File, Permission, Post, Role, User,
UserPost)
from .serializers import (DeptCreateUpdateSerializer, DeptSerializer, DictCreateUpdateSerializer, DictSerializer, DictTypeCreateUpdateSerializer, DictTypeSerializer,
FileSerializer, PasswordChangeSerializer, PermissionCreateUpdateSerializer, PermissionSerializer, PostCreateUpdateSerializer, PostSerializer,
@ -69,7 +69,7 @@ class PTaskViewSet(CustomModelViewSet):
select_related_fields = ['interval', 'crontab']
ordering = ['-create_time']
@action(methods=['put'], detail=True, perms_map={'put': 'ptask_update'})
@action(methods=['put'], detail=True, perms_map={'put': 'ptask.update'})
def toggle(self, request, pk=None):
"""修改启用禁用状态
@ -185,8 +185,8 @@ class DictViewSet(CustomModelViewSet):
数据字典-增删改查
"""
# queryset = Dict.objects.get_queryset(all=True) # 获取全部的,包括软删除的
queryset = Dict.objects.all()
# queryset = Dictionary.objects.get_queryset(all=True) # 获取全部的,包括软删除的
queryset = Dictionary.objects.all()
filterset_fields = ['type', 'is_used', 'type__code']
serializer_class = DictSerializer
create_serializer_class = DictCreateUpdateSerializer
@ -263,7 +263,7 @@ class UserPostViewSet(CreateModelMixin, DestroyModelMixin, ListModelMixin, Custo
用户/岗位关系
"""
perms_map = {'get': '*', 'post': 'user_update', 'delete': 'user_update'}
perms_map = {'get': '*', 'post': 'user.update', 'delete': 'user.update'}
queryset = UserPost.objects.select_related('user', 'post', 'dept').all()
serializer_class = UserPostSerializer
create_serializer_class = UserPostCreateSerializer

5
apps/third/clients.py Normal file
View File

@ -0,0 +1,5 @@
from apps.utils.xunxi import XxClient
from apps.utils.dahua import DhClient
dhClient = DhClient()
xxClient = XxClient()

View File

@ -12,7 +12,7 @@ dhapis = {
"url":"/evo-apigw/evo-brm/1.0.0/department/update",
"method":"put"
},
"gen_person_id":{
"person_gen_id":{
"url":"/evo-apigw/evo-brm/1.0.0/person/generate-id",
"method":"get"
},
@ -48,7 +48,7 @@ dhapis = {
"url":"/evo-apigw/evo-brm/1.2.0/card/add",
"method":"post"
},
"gen_card_id": {
"card_gen_id": {
"url":"/evo-apigw/evo-brm/1.0.0/card/generate-id",
"method":"get"
},
@ -63,6 +63,26 @@ dhapis = {
"mq_unsubscribe": {
"url":"/evo-apigw/evo-event/1.0.0/subscribe/mqinfo",
"method":"delete"
},
"face_bind":{
"url":"/evo-apigw/evo-face/deptGroup/sync/bindPerson",
"method":"post"
},
"dev_tree":{
"url":"/evo-apigw/evo-face/tree/getDevChnIdsAndName",
"method":"get"
},
"dev_page":{
"url":"/evo-apigw/evo-brm/1.2.0/device/subsystem/page",
"method":"post"
},
"face_group_update":{
"url":"/evo-apigw/evo-face/groupInfo/update",
"method":"post"
},
"face_group_info":{
"url":"/evo-apigw/evo-face/groupInfo/view/{id}",
"method":"get"
}
}

View File

@ -1,10 +1,10 @@
from rest_framework.exceptions import ParseError, APIException
from apps.third.tapis import dhapis, xxapis
from apps.third.erros import TAPI_CODE_WRONG
from apps.utils.dahua import dhClient
from apps.third.clients import dhClient
from apps.utils.errors import XX_REQUEST_ERROR
from apps.utils.mixins import MyLoggingMixin
from apps.utils.xunxi import xxClient
from apps.third.clients import xxClient
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework.permissions import IsAuthenticated, IsAdminUser
@ -14,6 +14,8 @@ from rest_framework.decorators import action
from apps.third.serializers import RequestCommonSerializer
from rest_framework import serializers
import stomp
from server import settings
# Create your views here.
@ -48,6 +50,19 @@ class XxTestView(APIView):
else:
raise APIException(**res)
class XxListener(stomp.ConnectionListener):
def on_error(self, frame):
print('received an error "%s"' % frame.body)
def on_message(self, frame):
print('received a message "%s"' % frame.body)
# if settings.XX_ENABLED:
# c = stomp.Connection([(settings.XX_MQ_HOST, settings.XX_MQ_PORT)])
# c.set_listener('', XxListener())
# c.connect(settings.XX_USERNAME, settings.XX_LICENCE)
# c.subscribe(settings.XX_QUEUE, id='')
class XxCommonViewSet(CreateModelMixin, CustomGenericViewSet):
"""
@ -161,3 +176,25 @@ class DhCommonViewSet(CreateModelMixin, CustomGenericViewSet):
"""
dhClient.request(**dhapis['mq_unsubscribe'], params={'name':'127.0.0.1_8000'})
return Response()
@action(methods=['post'], detail=False,
authentication_classes=[], permission_classes=[],
serializer_class=serializers.Serializer)
def mq(self, request, pk=None):
"""大华事件处理
大华事件处理
"""
data = request.data
method = data['method']
subsystem = data.get('subsystem', None)
info = data.get('info', {})
if method == 'department.update':
pass
elif method == 'person.update':
pass
elif method == 'alarm.msg' and subsystem == 'evo-accesscontrol':
"""
刷卡事件
"""
return Response()

View File

@ -101,7 +101,7 @@ class DhClient:
self.request(url, method, params, json, timeout, file_path_rela, raise_exception)
else:
if ret['code'] not in ['0', '100', '00000', '1000', 0, 100, 1000]:
detail = '大华错误:' + '{}|{}{}'.format(str(ret['code']), ret.get('errMsg',''), ret.get('desc', ''))
detail = '大华错误:' + '{}|{}{}{}'.format(str(ret['code']), ret.get('errMsg',''), ret.get('desc', ''), str(ret.get('data', '')))
err_detail = dict(detail=detail, code='dh_'+str(ret['code']))
if raise_exception:
raise ParseError(**err_detail)

View File

@ -106,11 +106,11 @@ class CustomModelViewSet(CreateModelMixin
# 增加默认权限标识
if not self.perms_map:
basename = self.basename
self.perms_map = {'get':'*', 'post':'{}_create'.format(basename)
,'put':'{}_update'.format(basename)
,'patch':'{}_update'.format(basename)
,'delete':'{}_delete'.format(basename)
,'deletes':'{}_delete'.format(basename)}
self.perms_map = {'get':'*', 'post':'{}.create'.format(basename)
,'put':'{}.update'.format(basename)
,'patch':'{}.update'.format(basename)
,'delete':'{}.delete'.format(basename)
,'deletes':'{}.delete'.format(basename)}
for k, v in self.perms_map.items():
if v not in ALL_PERMS and v!='*':
ALL_PERMS.append(v)

View File

@ -91,5 +91,3 @@ class XxClient:
if raise_exception:
raise APIException(**XX_REQUEST_ERROR)
return 'error', XX_REQUEST_ERROR
xxClient = XxClient()

View File

@ -4,7 +4,7 @@ from django.db.models.base import Model
import django.utils.timezone as timezone
from django.db.models.query import QuerySet
from apps.utils.models import CommonAModel
from apps.system.models import Dept, User, Dict, File
from apps.system.models import Dept, User, File
from apps.utils.models import SoftModel, BaseModel
from simple_history.models import HistoricalRecords

View File

@ -17,3 +17,4 @@ daphne==3.0.2
channels==3.0.4
channels-redis==3.4.0
django-restql==0.15.2
stomp.py==8.0.0

View File

@ -312,13 +312,17 @@ DAHUA_USERNAME = conf.DAHUA_USERNAME
DAHUA_PASSWORD = conf.DAHUA_PASSWORD
DAHUA_CLIENTID = conf.DAHUA_CLIENTID
DAHUA_SECRET = conf.DAHUA_SECRET
DAHUA_FACEGROUPID_1 = conf.DAHUA_FACEGROUPID_1
# 寻息定位
XX_ENABLED = conf.XX_ENABLED
XX_BASE_URL = conf.XX_BASE_URL
XX_MQ_HOST = conf.XX_MQ_HOST
XX_MQ_PORT = conf.XX_MQ_PORT
XX_LICENCE = conf.XX_LICENCE
XX_USERNAME = conf.XX_USERNAME
XX_BUILDID = conf.XX_BUILDID
XX_QUEUE = conf.XX_QUEUE
# 运维相关
SD_PWD = conf.SD_PWD