factory/apps/hrm/views.py

187 lines
6.8 KiB
Python

from django.shortcuts import render
from django.utils import timezone
from rest_framework.response import Response
from rest_framework.mixins import UpdateModelMixin, RetrieveModelMixin, CreateModelMixin, ListModelMixin
from apps.hrm.errors import NO_NEED_LEVEL_REMARK
from apps.hrm.filters import ClockRecordFilterSet, EmployeeFilterSet, NotWorkRemarkFilterSet
from apps.hrm.models import ClockRecord, Employee, NotWorkRemark
from apps.hrm.serializers import ClockRecordListSerializer, ChannelAuthoritySerializer, EmployeeCreateUpdateSerializer, EmployeeNotWorkRemarkSerializer, EmployeeSerializer, NotWorkRemarkListSerializer
from rest_framework.generics import CreateAPIView
from rest_framework import status
from rest_framework_simplejwt.tokens import RefreshToken
from rest_framework import exceptions
from apps.system.models import User
from apps.system.serializers import UserSimpleSerializer
from rest_framework.permissions import AllowAny
from rest_framework.decorators import action
from apps.utils.serializers import PkSerializer
from apps.utils.viewsets import CustomModelViewSet, CustomGenericViewSet
from rest_framework.exceptions import ParseError
from django.db import transaction
from datetime import datetime
from rest_framework import serializers
from apps.third.clients import dhClient
from apps.third.tapis import dhapis
from server import settings
# Create your views here.
class EmployeeViewSet(CustomModelViewSet):
"""
人员管理
"""
queryset = Employee.objects.all()
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=['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']