From dfd6ccef18c164182fcc23ecc3809604a3216ac3 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 19 Apr 2022 10:23:27 +0800 Subject: [PATCH] =?UTF-8?q?=E7=94=A8=E6=88=B7=E5=90=8D=E5=B7=B2=E5=AD=98?= =?UTF-8?q?=E5=9C=A8=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/hrm/errors.py | 5 ++- apps/hrm/models.py | 2 +- apps/hrm/serializers.py | 2 +- apps/hrm/services.py | 0 apps/hrm/views.py | 19 ++++++----- apps/mq/__init__.py | 0 apps/mq/admin.py | 3 ++ apps/mq/apps.py | 5 +++ apps/mq/migrations/__init__.py | 0 apps/mq/models.py | 3 ++ apps/mq/tests.py | 3 ++ apps/mq/views.py | 3 ++ apps/system/serializers.py | 7 +++- apps/third/tapis.py | 8 +++++ apps/third/views.py | 58 +++++++++++++++++++++++++++++++--- apps/utils/dahua.py | 4 +-- 16 files changed, 103 insertions(+), 19 deletions(-) create mode 100644 apps/hrm/services.py create mode 100644 apps/mq/__init__.py create mode 100644 apps/mq/admin.py create mode 100644 apps/mq/apps.py create mode 100644 apps/mq/migrations/__init__.py create mode 100644 apps/mq/models.py create mode 100644 apps/mq/tests.py create mode 100644 apps/mq/views.py diff --git a/apps/hrm/errors.py b/apps/hrm/errors.py index 22669f1b..81df79ab 100644 --- a/apps/hrm/errors.py +++ b/apps/hrm/errors.py @@ -1,4 +1,7 @@ +from enum import Enum + + NO_NEED_LEVEL_REMARK = {"code":"no_need_level_remark", "detail":"无需填写离岗说明"} PHONE_F_WRONG = {"code":"phone_f_wrong", "detail":"手机号格式错误"} PHONE_EXIST = {"code":"phone_exist", "detail":"手机号已存在"} -DH_PHOTO_FALI = {"code":"dh_photo_fail", "detail":"大华照片人脸提取失败"} \ No newline at end of file +DH_PHOTO_FALI = {"code":"dh_photo_fail", "detail":"大华照片人脸提取失败"} diff --git a/apps/hrm/models.py b/apps/hrm/models.py index be204654..c739156b 100644 --- a/apps/hrm/models.py +++ b/apps/hrm/models.py @@ -36,7 +36,7 @@ class Employee(CommonBModel): show_atwork = models.BooleanField('是否展示在岗状态', default=True) last_check_time = models.DateTimeField('打卡时间', null=True, blank=True) not_work_remark = models.CharField('当前未打卡说明', null=True, blank=True, max_length=200) - third_info = models.JSONField('三方信息', default=dict, null=True, blank=True) + third_info = models.JSONField('三方信息', default=dict, null=False, blank=True) class Meta: verbose_name = '员工补充信息' verbose_name_plural = verbose_name diff --git a/apps/hrm/serializers.py b/apps/hrm/serializers.py index 73a14b0c..add17e79 100644 --- a/apps/hrm/serializers.py +++ b/apps/hrm/serializers.py @@ -161,7 +161,7 @@ class EmployeeCreateUpdateSerializer(EmployeeBaseSerializer): if not third_info.get('dh_face_card', None): _, res = dhClient.request(**dhapis['gen_card_id']) cardId = res['id'] - cardNumber = instance.id[:8] + rannum(2) + cardNumber = instance.id[3:8] + rannum(5) now = datetime.now() startDate = now.strftime("%Y-%m-%d %H:%M:%S") endDate = (datetime(year=now.year+50, diff --git a/apps/hrm/services.py b/apps/hrm/services.py new file mode 100644 index 00000000..e69de29b diff --git a/apps/hrm/views.py b/apps/hrm/views.py index 646e70d2..ce1ca66c 100644 --- a/apps/hrm/views.py +++ b/apps/hrm/views.py @@ -83,7 +83,7 @@ class EmployeeViewSet(CustomModelViewSet): serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) vdata = serializer.validated_data - objs = Employee.objects.filter(pk__in=vdata['pks']) + objs = Employee.objects.filter(pk__in=vdata['pks'], third_info__dh_face_card__isnull=False) infos = objs.values('third_info') cards = [] for i in infos: @@ -95,13 +95,16 @@ class EmployeeViewSet(CustomModelViewSet): "privilegeType": 1, "resouceCode": i }) - json_data = { - "cardNumbers": cards, - "timeQuantumId": 1, - "cardPrivilegeDetails": details - } - dhClient.request(**dhapis['card_door_authority'], json=json_data) - objs.update(third_info__dh_channels = vdata['channels']) + if cards and details: + json_data = { + "cardNumbers": cards, + "timeQuantumId": 1, + "cardPrivilegeDetails": details + } + dhClient.request(**dhapis['card_door_authority'], json=json_data) + for i in objs: + i.third_info['dh_channels'] = vdata['channels'] + Employee.objects.bulk_update(objs, fields = ['third_info']) return Response() class ClockRecordViewSet(ListModelMixin, CustomGenericViewSet): diff --git a/apps/mq/__init__.py b/apps/mq/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apps/mq/admin.py b/apps/mq/admin.py new file mode 100644 index 00000000..8c38f3f3 --- /dev/null +++ b/apps/mq/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/apps/mq/apps.py b/apps/mq/apps.py new file mode 100644 index 00000000..b0b33c73 --- /dev/null +++ b/apps/mq/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class MqConfig(AppConfig): + name = 'mq' diff --git a/apps/mq/migrations/__init__.py b/apps/mq/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apps/mq/models.py b/apps/mq/models.py new file mode 100644 index 00000000..71a83623 --- /dev/null +++ b/apps/mq/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/apps/mq/tests.py b/apps/mq/tests.py new file mode 100644 index 00000000..7ce503c2 --- /dev/null +++ b/apps/mq/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/apps/mq/views.py b/apps/mq/views.py new file mode 100644 index 00000000..91ea44a2 --- /dev/null +++ b/apps/mq/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/apps/system/serializers.py b/apps/system/serializers.py index 59437a3f..cc20f6d1 100644 --- a/apps/system/serializers.py +++ b/apps/system/serializers.py @@ -269,10 +269,15 @@ class UserUpdateSerializer(CustomModelSerializer): """ 用户编辑序列化 """ - username = serializers.CharField(required=True, validators=[user_exist]) class Meta: model = User fields = ['username', 'name', 'avatar', 'is_active'] + + def update(self, instance, validated_data): + if User.objects.filter(username=validated_data['username'] + ).exclude(id=instance.id).exists(): + raise ParseError(**USERNAME_EXIST) + return super().update(instance, validated_data) diff --git a/apps/third/tapis.py b/apps/third/tapis.py index e09ddc1b..55ebb4f0 100644 --- a/apps/third/tapis.py +++ b/apps/third/tapis.py @@ -56,6 +56,14 @@ dhapis = { "url":"/evo-apigw/evo-accesscontrol/1.0.0/card/accessControl/doorAuthority", "method":"post" }, + "mq_subscribe": { + "url":"/evo-apigw/evo-event/1.0.0/subscribe/mqinfo", + "method":"post" + }, + "mq_unsubscribe": { + "url":"/evo-apigw/evo-event/1.0.0/subscribe/mqinfo", + "method":"delete" + } } # 寻息API接口 diff --git a/apps/third/views.py b/apps/third/views.py index 2178ee09..731ad56a 100644 --- a/apps/third/views.py +++ b/apps/third/views.py @@ -7,12 +7,13 @@ from apps.utils.mixins import MyLoggingMixin from apps.utils.xunxi import xxClient from rest_framework.response import Response from rest_framework.views import APIView -from rest_framework.permissions import IsAuthenticated +from rest_framework.permissions import IsAuthenticated, IsAdminUser from apps.utils.viewsets import CustomGenericViewSet from rest_framework.mixins import CreateModelMixin from rest_framework.decorators import action from apps.third.serializers import RequestCommonSerializer +from rest_framework import serializers # Create your views here. @@ -25,9 +26,9 @@ class DahuaTestView(MyLoggingMixin, APIView): def get(self, request, *args, **kwargs): # file_path_rela = '/media/default/avatar.png' # _, res = dhClient.request(**dhapis['person_img_upload'], file_path_rela=file_path_rela) - _,res = dhClient.request( - url='/evo-apigw/evo-brm/1.0.0/person/subsystem/{}'.format(2059335), - method='get') + _, res = dhClient.request( + url='/evo-apigw/evo-brm/1.0.0/person/subsystem/{}'.format(2059335), + method='get') return Response(res) @@ -81,6 +82,7 @@ class XxCommonViewSet(CreateModelMixin, CustomGenericViewSet): """ return Response(xxapis) + class DhCommonViewSet(CreateModelMixin, CustomGenericViewSet): """ 大华通用调用接口 @@ -105,7 +107,7 @@ class DhCommonViewSet(CreateModelMixin, CustomGenericViewSet): params=vdata.get('params', {}), json=vdata.get('json', {})) return Response(res) - + @action(methods=['get'], detail=False, permission_classes=[IsAuthenticated]) def codes(self, request, pk=None): """获取请求短标识 @@ -113,3 +115,49 @@ class DhCommonViewSet(CreateModelMixin, CustomGenericViewSet): 获取请求短标识 """ return Response(dhapis) + + @action(methods=['post'], detail=False, permission_classes=[IsAdminUser], + serializer_class=serializers.Serializer) + def subscribe(self, request, pk=None): + """事件订阅 + + 事件订阅 + """ + json_data = { + "param": { + "monitors": [ + { + "monitor": "http://127.0.0.1:8000/test", + "monitorType": "url", + "events": [ + { + "category": "business", + }, + { + "category": "alarm", + }, + { + "category": "state", + } + ] + } + ], + "subsystem": { + "subsystemType": 0, + "name": "127.0.0.1_8000", + "magic": "127.0.0.1_8000" + } + } + } + dhClient.request(**dhapis['mq_subscribe'], json=json_data) + return Response() + + @action(methods=['delete'], detail=False, permission_classes=[IsAdminUser], + serializer_class=serializers.Serializer) + def unsubscribe(self, request, pk=None): + """取消事件订阅 + + 取消事件订阅 + """ + dhClient.request(**dhapis['mq_unsubscribe'], params={'name':'127.0.0.1_8000'}) + return Response() diff --git a/apps/utils/dahua.py b/apps/utils/dahua.py index 02f11ca9..fed53893 100644 --- a/apps/utils/dahua.py +++ b/apps/utils/dahua.py @@ -66,7 +66,7 @@ class DhClient: self.isRuning = False # self.t.join() - def request(self, url:str, method:str, params=dict(), json=dict(), timeout=4, file_path_rela=None, raise_exception=True): + def request(self, url:str, method:str, params=dict(), json=dict(), timeout=10, file_path_rela=None, raise_exception=True): if self.isGetingToken: req_num = 0 while True: @@ -106,7 +106,7 @@ class DhClient: if raise_exception: raise ParseError(**err_detail) return 'fail', dict(detail=detail, code='dh_'+str(ret['code'])) - return 'success', ret['data'] + return 'success', ret['data'] if 'data' in ret else None if raise_exception: raise APIException(**DH_REQUEST_ERROR) return 'error', DH_REQUEST_ERROR