factory/apps/hrm/views.py

234 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', 'id_number']
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=False, 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()
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 = ['employee']
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.all()
create_serializer_class = CertificateCreateUpdateSerializer
update_serializer_class = CertificateCreateUpdateSerializer
serializer_class = CertificateSerializer
filterset_fields = ['employee__user', 'employee', 'employee__type']