237 lines
8.7 KiB
Python
Executable File
237 lines
8.7 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, EmployeeImproveSerializer,
|
|
EmployeeNotWorkRemarkSerializer,
|
|
EmployeeSerializer,
|
|
NotWorkRemarkListSerializer)
|
|
|
|
from apps.third.clients import dhClient
|
|
from apps.third.tapis import dhapis
|
|
from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet
|
|
from rest_framework.permissions import IsAuthenticated
|
|
|
|
|
|
# Create your views here.
|
|
class EmployeeViewSet(CustomModelViewSet):
|
|
"""
|
|
人员管理
|
|
"""
|
|
queryset = Employee.objects.exclude(user__is_superuser=True)
|
|
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']
|
|
|
|
def filter_queryset(self, queryset):
|
|
if not self.detail:
|
|
self.request.query_params._mutable = True
|
|
self.request.query_params.setdefault('type', 'employee')
|
|
return super().filter_queryset(queryset)
|
|
|
|
@action(methods=['get'], detail=False, perms_map={'get': '*'},
|
|
serializer_class=serializers.Serializer)
|
|
def info(self, request, pk=None):
|
|
"""个人信息
|
|
|
|
个人信息
|
|
"""
|
|
user = request.user
|
|
Employee.objects.get_or_create(user=user,
|
|
defaults={
|
|
"user": user,
|
|
"name": user.name,
|
|
"phone": user.phone,
|
|
"belong_dept": user.belong_dept,
|
|
"post": user.post,
|
|
"type": user.type
|
|
})
|
|
return Response(EmployeeSerializer(instance=user.employee).data)
|
|
|
|
@action(methods=['post'], detail=True, permission_classes=[IsAuthenticated],
|
|
serializer_class=EmployeeImproveSerializer)
|
|
@transaction.atomic
|
|
def improve_info(self, request, *args, **kwargs):
|
|
"""完善个人信息
|
|
|
|
完善个人信息
|
|
"""
|
|
user = request.user
|
|
ep = user.employee
|
|
serializer = EmployeeImproveSerializer(instance=ep, data=request.data)
|
|
serializer.is_valid(raise_exception=True)
|
|
serializer.save()
|
|
if ep.phone:
|
|
user.phone = ep.phone
|
|
user.save()
|
|
return Response()
|
|
|
|
@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']
|