205 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			205 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
| 
 | |
| from django.conf import settings
 | |
| from django.db import transaction
 | |
| from django.utils import timezone
 | |
| from rest_framework import serializers
 | |
| from rest_framework.decorators import action
 | |
| from rest_framework.exceptions import ParseError
 | |
| from rest_framework.mixins import ListModelMixin
 | |
| from rest_framework.permissions import AllowAny
 | |
| from rest_framework.response import Response
 | |
| 
 | |
| from apps.hrm.errors import NO_NEED_LEVEL_REMARK
 | |
| from apps.hrm.filters import (ClockRecordFilterSet, EmployeeFilterSet,
 | |
|                               NotWorkRemarkFilterSet)
 | |
| from apps.hrm.models import Certificate, ClockRecord, Employee, NotWorkRemark
 | |
| from apps.hrm.serializers import (CertificateCreateUpdateSerializer, CertificateSerializer, ChannelAuthoritySerializer,
 | |
|                                   ClockRecordListSerializer,
 | |
|                                   EmployeeCreateUpdateSerializer,
 | |
|                                   EmployeeNotWorkRemarkSerializer,
 | |
|                                   EmployeeSerializer,
 | |
|                                   NotWorkRemarkListSerializer)
 | |
| 
 | |
| from apps.third.clients import dhClient
 | |
| from apps.third.tapis import dhapis
 | |
| from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet
 | |
| 
 | |
| 
 | |
| # Create your views here.
 | |
| class EmployeeViewSet(CustomModelViewSet):
 | |
|     """
 | |
|     人员管理
 | |
|     """
 | |
|     queryset = Employee.objects.filter(type='employee')
 | |
|     select_related_fields = ['user']
 | |
|     filterset_class = EmployeeFilterSet
 | |
|     serializer_class = EmployeeSerializer
 | |
|     create_serializer_class = EmployeeCreateUpdateSerializer
 | |
|     update_serializer_class = EmployeeCreateUpdateSerializer
 | |
|     partial_update_serializer_class = EmployeeCreateUpdateSerializer
 | |
|     search_fields = ['name', 'number', 'user__username']
 | |
|     ordering = ['-pk']
 | |
| 
 | |
|     @action(methods=['get'], detail=False, perms_map={'get': '*'},
 | |
|             serializer_class=serializers.Serializer)
 | |
|     def info(self, request, pk=None):
 | |
|         """个人信息
 | |
| 
 | |
|         个人信息
 | |
|         """
 | |
|         user = request.user
 | |
|         if user.employee:
 | |
|             return Response(EmployeeSerializer(instance=user.employee).data)
 | |
|         raise ParseError('请先完善个人信息')
 | |
| 
 | |
|     @action(methods=['post'], detail=True, perms_map={'post': 'employee:notworkremark'},
 | |
|             serializer_class=EmployeeNotWorkRemarkSerializer)
 | |
|     def not_work_remark(self, request, pk=None):
 | |
|         """
 | |
|         填写离岗说明
 | |
|         """
 | |
|         serializer = self.get_serializer(data=request.data)
 | |
|         serializer.is_valid(raise_exception=True)
 | |
|         obj = self.get_object()
 | |
|         if not obj.is_atwork:
 | |
|             remark = request.data.get('not_work_remark', '')
 | |
|             obj.not_work_remark = remark
 | |
|             obj.save()
 | |
|             now = timezone.now()
 | |
|             instance, created = NotWorkRemark.objects.get_or_create(
 | |
|                 not_work_date=now.date(),
 | |
|                 user=obj.user,
 | |
|                 defaults={
 | |
|                     "not_work_date": now.date(),
 | |
|                     "user": obj.user,
 | |
|                     "remark": remark,
 | |
|                     "create_by": request.user,
 | |
|                 }
 | |
|             )
 | |
|             if not created:
 | |
|                 instance.remark = remark
 | |
|                 instance.update_by = request.user
 | |
|                 instance.save()
 | |
|             return Response()
 | |
|         raise ParseError(**NO_NEED_LEVEL_REMARK)
 | |
| 
 | |
|     @transaction.atomic
 | |
|     @action(methods=['post'], detail=False, perms_map={'post': 'employee:channel_authority'},
 | |
|             serializer_class=ChannelAuthoritySerializer)
 | |
|     def channel_authority(self, request, pk=None):
 | |
|         """门通道授权
 | |
| 
 | |
|         门通道授权
 | |
|         """
 | |
|         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'], third_info__dh_face_card__isnull=False)
 | |
|         infos = objs.values('third_info')
 | |
|         cards = []
 | |
|         for i in infos:
 | |
|             if isinstance(i['third_info'], dict) and 'dh_face_card' in i['third_info']:
 | |
|                 cards.append(i['third_info']['dh_face_card'])
 | |
|         details = []
 | |
|         for i in vdata['channels']:
 | |
|             details.append({
 | |
|                 "privilegeType": 1,
 | |
|                 "resouceCode": i
 | |
|             })
 | |
|         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()
 | |
| 
 | |
|     @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):
 | |
|     """
 | |
|     打卡记录
 | |
|     """
 | |
|     perms_map = {'get': '*', 'post': '*'}
 | |
|     authentication_classes = []
 | |
|     permission_classes = [AllowAny]
 | |
|     queryset = ClockRecord.objects.all()
 | |
|     select_related_fields = ['create_by']
 | |
|     serializer_class = ClockRecordListSerializer
 | |
|     filterset_class = ClockRecordFilterSet
 | |
|     ordering = ['-pk']
 | |
| 
 | |
| 
 | |
| class NotWorkRemarkViewSet(ListModelMixin, CustomGenericViewSet):
 | |
|     """
 | |
|     离岗说明
 | |
|     """
 | |
|     perms_map = {'get': '*'}
 | |
|     queryset = NotWorkRemark.objects.all()
 | |
|     select_related_fields = ['user']
 | |
|     serializer_class = NotWorkRemarkListSerializer
 | |
|     filterset_class = NotWorkRemarkFilterSet
 | |
|     ordering = ['-pk']
 | |
| 
 | |
| 
 | |
| class CertificateViewSet(CustomModelViewSet):
 | |
|     queryset = Certificate.objects.filter(employee__type='employee')
 | |
|     create_serializer_class = CertificateCreateUpdateSerializer
 | |
|     update_serializer_class = CertificateCreateUpdateSerializer
 | |
|     serializer_class = CertificateSerializer
 | |
|     filterset_fields = ['employee__user', 'employee']
 |