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

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): def __str__(self):
return self.name return self.name
# class Card(CommonAModel): # class Card(CommonAModel):
# """ # """
# 卡 # 卡

View File

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

View File

@ -23,8 +23,9 @@ from rest_framework.exceptions import ParseError
from django.db import transaction from django.db import transaction
from datetime import datetime from datetime import datetime
from rest_framework import serializers from rest_framework import serializers
from apps.utils.dahua import dhClient from apps.third.clients import dhClient
from apps.third.tapis import dhapis from apps.third.tapis import dhapis
from server import settings
# Create your views here. # Create your views here.
class EmployeeViewSet(CustomModelViewSet): class EmployeeViewSet(CustomModelViewSet):
@ -41,7 +42,7 @@ class EmployeeViewSet(CustomModelViewSet):
search_fields = ['name', 'number', 'user__username'] search_fields = ['name', 'number', 'user__username']
ordering = ['-pk'] 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) , serializer_class=EmployeeNotWorkRemarkSerializer)
def not_work_remark(self, request, pk=None): def not_work_remark(self, request, pk=None):
""" """
@ -73,7 +74,7 @@ class EmployeeViewSet(CustomModelViewSet):
raise ParseError(**NO_NEED_LEVEL_REMARK) raise ParseError(**NO_NEED_LEVEL_REMARK)
@transaction.atomic @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) , serializer_class=ChannelAuthoritySerializer)
def channel_authority(self, request, pk=None): def channel_authority(self, request, pk=None):
"""门通道授权 """门通道授权
@ -107,6 +108,59 @@ class EmployeeViewSet(CustomModelViewSet):
Employee.objects.bulk_update(objs, fields = ['third_info']) Employee.objects.bulk_update(objs, fields = ['third_info'])
return Response() 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): 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() queryset = DrfRequestLog.objects.all()
list_serializer_class = DrfRequestLogSerializer list_serializer_class = DrfRequestLogSerializer
ordering = ['-requested_at'] 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 django.contrib import admin
from simple_history.admin import SimpleHistoryAdmin 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. # Register your models here.
admin.site.register(User) admin.site.register(User)
admin.site.register(Dept) admin.site.register(Dept)
admin.site.register(Role) admin.site.register(Role)
admin.site.register(Permission) admin.site.register(Permission)
admin.site.register(DictType) admin.site.register(DictType)
admin.site.register(Dict, SimpleHistoryAdmin) admin.site.register(Dictionary, SimpleHistoryAdmin)
admin.site.register(File) 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 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.system.errors import ROLE_CODE_EXIST, ROLE_NAME_EXIST, USERNAME_EXIST
from apps.utils.serializers import CustomModelSerializer from apps.utils.serializers import CustomModelSerializer
from apps.utils.constants import EXCLUDE_FIELDS, EXCLUDE_FIELDS_BASE 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) Role, User, UserPost)
from rest_framework.exceptions import ParseError, APIException from rest_framework.exceptions import ParseError, APIException
from django.db import transaction from django.db import transaction
@ -84,7 +84,7 @@ class DictSerializer(CustomModelSerializer):
""" """
class Meta: class Meta:
model = Dict model = Dictionary
fields = '__all__' fields = '__all__'
class DictCreateUpdateSerializer(CustomModelSerializer): class DictCreateUpdateSerializer(CustomModelSerializer):
@ -93,7 +93,7 @@ class DictCreateUpdateSerializer(CustomModelSerializer):
""" """
class Meta: class Meta:
model = Dict model = Dictionary
exclude = EXCLUDE_FIELDS exclude = EXCLUDE_FIELDS
class PostSerializer(CustomModelSerializer): class PostSerializer(CustomModelSerializer):
@ -195,7 +195,7 @@ class DeptCreateUpdateSerializer(CustomModelSerializer):
@transaction.atomic @transaction.atomic
def create(self, validated_data): def create(self, validated_data):
from apps.utils.dahua import dhClient from apps.third.clients import dhClient
if dhClient: if dhClient:
data = { data = {
"parentId":1, "parentId":1,
@ -210,7 +210,7 @@ class DeptCreateUpdateSerializer(CustomModelSerializer):
@transaction.atomic @transaction.atomic
def update(self, instance, validated_data): def update(self, instance, validated_data):
from apps.utils.dahua import dhClient from apps.third.clients import dhClient
third_info = instance.third_info third_info = instance.third_info
if dhClient and not third_info.get('dh_id', False): if dhClient and not third_info.get('dh_id', False):
# 如果dh_id 不存在 # 如果dh_id 不存在

View File

@ -21,7 +21,7 @@ from apps.utils.queryset import get_child_queryset2
from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet
from server.celery import app as celery_app from server.celery import app as celery_app
from .filters import UserFilter 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) UserPost)
from .serializers import (DeptCreateUpdateSerializer, DeptSerializer, DictCreateUpdateSerializer, DictSerializer, DictTypeCreateUpdateSerializer, DictTypeSerializer, from .serializers import (DeptCreateUpdateSerializer, DeptSerializer, DictCreateUpdateSerializer, DictSerializer, DictTypeCreateUpdateSerializer, DictTypeSerializer,
FileSerializer, PasswordChangeSerializer, PermissionCreateUpdateSerializer, PermissionSerializer, PostCreateUpdateSerializer, PostSerializer, FileSerializer, PasswordChangeSerializer, PermissionCreateUpdateSerializer, PermissionSerializer, PostCreateUpdateSerializer, PostSerializer,
@ -69,7 +69,7 @@ class PTaskViewSet(CustomModelViewSet):
select_related_fields = ['interval', 'crontab'] select_related_fields = ['interval', 'crontab']
ordering = ['-create_time'] 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): def toggle(self, request, pk=None):
"""修改启用禁用状态 """修改启用禁用状态
@ -185,8 +185,8 @@ class DictViewSet(CustomModelViewSet):
数据字典-增删改查 数据字典-增删改查
""" """
# queryset = Dict.objects.get_queryset(all=True) # 获取全部的,包括软删除的 # queryset = Dictionary.objects.get_queryset(all=True) # 获取全部的,包括软删除的
queryset = Dict.objects.all() queryset = Dictionary.objects.all()
filterset_fields = ['type', 'is_used', 'type__code'] filterset_fields = ['type', 'is_used', 'type__code']
serializer_class = DictSerializer serializer_class = DictSerializer
create_serializer_class = DictCreateUpdateSerializer 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() queryset = UserPost.objects.select_related('user', 'post', 'dept').all()
serializer_class = UserPostSerializer serializer_class = UserPostSerializer
create_serializer_class = UserPostCreateSerializer 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", "url":"/evo-apigw/evo-brm/1.0.0/department/update",
"method":"put" "method":"put"
}, },
"gen_person_id":{ "person_gen_id":{
"url":"/evo-apigw/evo-brm/1.0.0/person/generate-id", "url":"/evo-apigw/evo-brm/1.0.0/person/generate-id",
"method":"get" "method":"get"
}, },
@ -48,7 +48,7 @@ dhapis = {
"url":"/evo-apigw/evo-brm/1.2.0/card/add", "url":"/evo-apigw/evo-brm/1.2.0/card/add",
"method":"post" "method":"post"
}, },
"gen_card_id": { "card_gen_id": {
"url":"/evo-apigw/evo-brm/1.0.0/card/generate-id", "url":"/evo-apigw/evo-brm/1.0.0/card/generate-id",
"method":"get" "method":"get"
}, },
@ -63,6 +63,26 @@ dhapis = {
"mq_unsubscribe": { "mq_unsubscribe": {
"url":"/evo-apigw/evo-event/1.0.0/subscribe/mqinfo", "url":"/evo-apigw/evo-event/1.0.0/subscribe/mqinfo",
"method":"delete" "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 rest_framework.exceptions import ParseError, APIException
from apps.third.tapis import dhapis, xxapis from apps.third.tapis import dhapis, xxapis
from apps.third.erros import TAPI_CODE_WRONG 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.errors import XX_REQUEST_ERROR
from apps.utils.mixins import MyLoggingMixin 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.response import Response
from rest_framework.views import APIView from rest_framework.views import APIView
from rest_framework.permissions import IsAuthenticated, IsAdminUser from rest_framework.permissions import IsAuthenticated, IsAdminUser
@ -14,6 +14,8 @@ from rest_framework.decorators import action
from apps.third.serializers import RequestCommonSerializer from apps.third.serializers import RequestCommonSerializer
from rest_framework import serializers from rest_framework import serializers
import stomp
from server import settings
# Create your views here. # Create your views here.
@ -48,6 +50,19 @@ class XxTestView(APIView):
else: else:
raise APIException(**res) 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): class XxCommonViewSet(CreateModelMixin, CustomGenericViewSet):
""" """
@ -161,3 +176,25 @@ class DhCommonViewSet(CreateModelMixin, CustomGenericViewSet):
""" """
dhClient.request(**dhapis['mq_unsubscribe'], params={'name':'127.0.0.1_8000'}) dhClient.request(**dhapis['mq_unsubscribe'], params={'name':'127.0.0.1_8000'})
return Response() 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) self.request(url, method, params, json, timeout, file_path_rela, raise_exception)
else: else:
if ret['code'] not in ['0', '100', '00000', '1000', 0, 100, 1000]: 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'])) err_detail = dict(detail=detail, code='dh_'+str(ret['code']))
if raise_exception: if raise_exception:
raise ParseError(**err_detail) raise ParseError(**err_detail)

View File

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

View File

@ -90,6 +90,4 @@ class XxClient:
return 'success', ret['data'] return 'success', ret['data']
if raise_exception: if raise_exception:
raise APIException(**XX_REQUEST_ERROR) raise APIException(**XX_REQUEST_ERROR)
return 'error', 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 import django.utils.timezone as timezone
from django.db.models.query import QuerySet from django.db.models.query import QuerySet
from apps.utils.models import CommonAModel 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 apps.utils.models import SoftModel, BaseModel
from simple_history.models import HistoricalRecords from simple_history.models import HistoricalRecords

View File

@ -17,3 +17,4 @@ daphne==3.0.2
channels==3.0.4 channels==3.0.4
channels-redis==3.4.0 channels-redis==3.4.0
django-restql==0.15.2 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_PASSWORD = conf.DAHUA_PASSWORD
DAHUA_CLIENTID = conf.DAHUA_CLIENTID DAHUA_CLIENTID = conf.DAHUA_CLIENTID
DAHUA_SECRET = conf.DAHUA_SECRET DAHUA_SECRET = conf.DAHUA_SECRET
DAHUA_FACEGROUPID_1 = conf.DAHUA_FACEGROUPID_1
# 寻息定位 # 寻息定位
XX_ENABLED = conf.XX_ENABLED XX_ENABLED = conf.XX_ENABLED
XX_BASE_URL = conf.XX_BASE_URL 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_LICENCE = conf.XX_LICENCE
XX_USERNAME = conf.XX_USERNAME XX_USERNAME = conf.XX_USERNAME
XX_BUILDID = conf.XX_BUILDID XX_BUILDID = conf.XX_BUILDID
XX_QUEUE = conf.XX_QUEUE
# 运维相关 # 运维相关
SD_PWD = conf.SD_PWD SD_PWD = conf.SD_PWD