591 lines
24 KiB
Python
591 lines
24 KiB
Python
from django.contrib.auth.models import Permission
|
||
from rest_framework.views import APIView
|
||
from rest_framework.response import Response
|
||
from rest_framework import status
|
||
import json
|
||
import ast
|
||
from .models import User,Approval,Department
|
||
from business.models import permission
|
||
from finance.models import Income,Accounts,Payment,Reimbursement,BonusChange
|
||
from finance.models import Invoice
|
||
from business.models import ProjectRegistration,Case,SealApplication
|
||
import datetime
|
||
from utility.utility import flies
|
||
from django.contrib.sessions.backends.db import SessionStore
|
||
from django.db.models import Count, Q
|
||
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
|
||
from collections import defaultdict
|
||
|
||
|
||
|
||
class CreateUserView(APIView):
|
||
def post(self, request, *args, **kwargs):
|
||
"""人事管理-人员添加"""
|
||
role = request.data.get('role')
|
||
username = request.data.get('username') # 姓名
|
||
account = request.data.get('account') # 账号
|
||
password = request.data.get('password') # 密码
|
||
nation = request.data.get('nation') # 民族
|
||
IdCard = request.data.get('IdCard') #身份证
|
||
department = request.data.get('department') # 归属部门
|
||
mobilePhone = request.data.get('mobilePhone') # 手机号
|
||
position = request.data.get('position') # 岗位
|
||
team = request.data.get('team') # 所属团队
|
||
Dateofjoining = request.data.get('Dateofjoining') # 入职时间
|
||
Confirmationtime = request.data.get('Confirmationtime') # 转正时间
|
||
Practicingcertificatetime = request.data.get('Practicingcertificatetime') # 执业证时间
|
||
AcademicResume = request.FILES.getlist('AcademicResume') # 学业简历
|
||
academic = request.data.get('academic') # 学历
|
||
contract = request.FILES.getlist('contract') # 合同
|
||
ApplicationForm =request.FILES.getlist('ApplicationForm') # 入职申请表
|
||
salary = request.data.get('salary') # 工资标准
|
||
if not all([username, account, password, IdCard, department, position,nation,mobilePhone,team,Dateofjoining,academic,contract]):
|
||
return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
|
||
|
||
AcademicResume_url = flies(AcademicResume)
|
||
ApplicationForm_url = flies(ApplicationForm )
|
||
contract_url = flies(contract)
|
||
|
||
Dateofjoining = datetime.datetime.strptime(Dateofjoining, "%Y-%m-%d")
|
||
if Confirmationtime:
|
||
Confirmationtime = datetime.datetime.strptime(Confirmationtime, "%Y-%m-%d")
|
||
else:
|
||
Confirmationtime = None
|
||
if Practicingcertificatetime:
|
||
Practicingcertificatetime = datetime.datetime.strptime(Practicingcertificatetime, "%Y-%m-%d")
|
||
else:
|
||
Practicingcertificatetime = None
|
||
role_list = ast.literal_eval(role)
|
||
department_id = ast.literal_eval(department)
|
||
user = User.objects.create(
|
||
username=username,
|
||
account=account,
|
||
password=password,
|
||
ethnicity=nation,
|
||
card=IdCard,
|
||
mobilePhone=mobilePhone,
|
||
position=position,
|
||
team=team,
|
||
Dateofjoining=Dateofjoining,
|
||
Confirmationtime=Confirmationtime,
|
||
Practicingcertificatetime=Practicingcertificatetime,
|
||
AcademicResume=json.dumps(AcademicResume_url),
|
||
academic=academic,
|
||
contract=json.dumps(contract_url),
|
||
ApplicationForm=json.dumps(ApplicationForm_url),
|
||
state="待登记",
|
||
salary=salary
|
||
)
|
||
user.role.add(*role_list)
|
||
user.department.add(*department_id)
|
||
return Response({'message': '添加人员成功', 'code': 0}, status=status.HTTP_200_OK)
|
||
|
||
class EditorialStaffView(APIView):
|
||
def post(self, request, *args, **kwargs):
|
||
"""修改人员信息"""
|
||
id = request.data.get('id')
|
||
username = request.data.get('username') # 姓名
|
||
account = request.data.get('account') # 账号
|
||
password = request.data.get('password') # 密码
|
||
nation = request.data.get('nation') # 民族
|
||
IdCard = request.data.get('IdCard') # 身份证
|
||
department = request.data.get('department') # 归属部门
|
||
mobilePhone = request.data.get('mobilePhone') # 手机号
|
||
position = request.data.get('position') # 岗位
|
||
team = request.data.get('team') # 所属团队
|
||
Dateofjoining = request.data.get('Dateofjoining') # 入职时间
|
||
Confirmationtime = request.data.get('Confirmationtime') # 转正时间
|
||
Practicingcertificatetime = request.data.get('Practicingcertificatetime') # 执业证时间
|
||
AcademicResume = request.FILES.getlist('AcademicResume') # 学业简历
|
||
academic = request.data.get('academic') # 学历
|
||
contract = request.FILES.getlist('contract') # 合同
|
||
ApplicationForm = request.FILES.getlist('ApplicationForm') # 入职申请表
|
||
salary = request.data.get('salary') # 工资标准
|
||
print([username, account, password, IdCard, department, position, nation, mobilePhone, team, Dateofjoining,
|
||
academic])
|
||
if not all([username, account, password, IdCard, department, position, nation, mobilePhone, team, Dateofjoining,
|
||
academic]):
|
||
|
||
return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
|
||
user = User.objects.get(id=id)
|
||
|
||
|
||
|
||
if AcademicResume:
|
||
AcademicResume_url = flies(AcademicResume)
|
||
user.AcademicResume = json.dumps(AcademicResume_url)
|
||
if ApplicationForm:
|
||
ApplicationForm_url = flies(ApplicationForm)
|
||
user.ApplicationForm = json.dumps(ApplicationForm_url)
|
||
if contract:
|
||
contract_url = flies(contract)
|
||
user.contract = json.dumps(contract_url)
|
||
def parse_date_str(date_str):
|
||
if date_str and date_str != "0000-00-00":
|
||
return datetime.datetime.strptime(date_str, "%Y-%m-%d").strftime('%Y-%m-%d')
|
||
return "" # 设置默认日期
|
||
|
||
Dateofjoining = parse_date_str(Dateofjoining)
|
||
Confirmationtime = parse_date_str(Confirmationtime)
|
||
Practicingcertificatetime = parse_date_str(Practicingcertificatetime)
|
||
|
||
user.Confirmationtime = Confirmationtime
|
||
user.Practicingcertificatetime = Practicingcertificatetime
|
||
user.Dateofjoining = Dateofjoining
|
||
|
||
user.username = username
|
||
user.account = account
|
||
user.password = password
|
||
user.ethnicity = nation
|
||
user.card = IdCard
|
||
user.mobilePhone = mobilePhone
|
||
user.position = position
|
||
user.team = team
|
||
user.academic = academic
|
||
user.salary = salary
|
||
|
||
# 处理 ManyToMany 字段 department
|
||
if department:
|
||
try:
|
||
# 尝试解析 JSON 格式的字符串,如 "[1,2]" 或 "1,2"
|
||
if isinstance(department, str):
|
||
# 如果是 "1,2" 格式,先转换为列表格式
|
||
if ',' in department and not department.startswith('['):
|
||
department_id = [int(x.strip()) for x in department.split(',')]
|
||
else:
|
||
department_id = ast.literal_eval(department)
|
||
else:
|
||
department_id = department
|
||
user.department.set(department_id)
|
||
except (ValueError, SyntaxError):
|
||
# 如果解析失败,尝试作为单个ID处理
|
||
try:
|
||
user.department.set([int(department)])
|
||
except (ValueError, TypeError):
|
||
pass
|
||
|
||
# 处理 ManyToMany 字段 role(如果有传入)
|
||
role = request.data.get('role')
|
||
if role:
|
||
role_id = ast.literal_eval(role) if isinstance(role, str) else role
|
||
user.role.set(role_id)
|
||
|
||
user.save()
|
||
return Response({'message': '修改成功', 'code': 0}, status=status.HTTP_200_OK)
|
||
|
||
class LoginView(APIView):
|
||
"""
|
||
登录页面
|
||
"""
|
||
|
||
def post(self, request):
|
||
token = request.META.get('token')
|
||
username = request.data.get('username')
|
||
password = request.data.get('password')
|
||
if not all([username, password]):
|
||
return Response({'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
|
||
try:
|
||
user = User.objects.get(account=username)
|
||
|
||
if user.state != '在职':
|
||
return Response({'me' 'ssage': '你的账号已经封存。', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
|
||
|
||
# 比较密码
|
||
if user.password == password or user.token == token:
|
||
# if '123456' == password or user.token == token:
|
||
# 更新 encryption 字段到数据库
|
||
user.token = token
|
||
user.save()
|
||
|
||
# 创建会话
|
||
session = SessionStore()
|
||
session.create()
|
||
session['user_id'] = user.id
|
||
session.save()
|
||
# 置 sessionid 到响应的 cookie 中
|
||
response = Response({
|
||
'id': user.id,
|
||
'message': '登录成功',
|
||
'code': 0
|
||
}, status=status.HTTP_200_OK)
|
||
response.set_cookie(key='sessionid', value=session.session_key, httponly=True)
|
||
|
||
return response
|
||
else:
|
||
return Response({'message': '密码错误', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
|
||
except User.DoesNotExist:
|
||
return Response({'status': 'error', 'message': '用户不存在', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
|
||
|
||
class PersonnelDetailsView(APIView):
|
||
"""展示人员信息"""
|
||
def post(self, request, *args, **kwargs):
|
||
token = request.META.get('token')
|
||
user = User.objects.prefetch_related('role', 'department').get(token=token)
|
||
permissionId = list(user.role.values("permissionId"))
|
||
permission_ids = [item['permissionId'] for item in permissionId]
|
||
permission_ids = [i for s in permission_ids for i in ast.literal_eval(s)]
|
||
permissions = permission.objects.filter(id__in=permission_ids)
|
||
permission_data = []
|
||
for per in permissions:
|
||
permission_data.append( per.permission_logo)
|
||
data = {
|
||
'id': user.id,
|
||
'username': user.username,
|
||
'account': user.account,
|
||
"ethnicity": user.ethnicity,
|
||
"card": user.card,
|
||
"mobilePhone": user.mobilePhone,
|
||
"position": user.position,
|
||
"team": user.team,
|
||
"Dateofjoining": user.Dateofjoining,
|
||
"Confirmationtime": user.Confirmationtime,
|
||
'Practicingcertificatetime': user.Practicingcertificatetime,
|
||
"Dateofdeparture": user.Dateofdeparture,
|
||
"AcademicResume": user.AcademicResume,
|
||
"academic": user.academic,
|
||
"contract": user.contract,
|
||
"ApplicationForm": user.ApplicationForm,
|
||
"state": user.state,
|
||
# 角色数据
|
||
"role": list(user.role.values('id', 'RoleName',"permissionId")), # 假设Role模型有name字段
|
||
# 如果需要部门数据
|
||
"department": list(user.department.values('id', 'username')),
|
||
"permission_data": permission_data,
|
||
}
|
||
return Response({'message': '详细人员信息展示成功', "data":data, 'code': 0}, status=status.HTTP_200_OK)
|
||
|
||
class DepartmentView(APIView):
|
||
def post(self, request, *args, **kwargs):
|
||
"""部门列表"""
|
||
name = request.data.get('name')
|
||
Q_obj = Q()
|
||
if name:
|
||
Q_obj &=Q(username__icontains=name)
|
||
deps = Department.objects.filter(Q_obj)
|
||
data = []
|
||
for dep in deps:
|
||
data.append({
|
||
'id': dep.id,
|
||
'name': dep.username,
|
||
})
|
||
|
||
return Response({'message': '展示成功', "data":data, 'code': 0}, status=status.HTTP_200_OK)
|
||
|
||
|
||
class PersonnelListView(APIView):
|
||
def post(self, request, *args, **kwargs):
|
||
"""
|
||
人员列表
|
||
:param request:
|
||
:param args:
|
||
:param kwargs:
|
||
:return:
|
||
"""
|
||
page = request.data.get('page')
|
||
per_page = request.data.get('per_page')
|
||
username = request.data.get('username')
|
||
department = request.data.get('department')
|
||
|
||
if not all([page, per_page]):
|
||
return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
|
||
|
||
Q_obj = Q()
|
||
if username:
|
||
Q_obj &= Q(username__icontains=username)
|
||
if department:
|
||
Q_obj &= Q(department__username__icontains=department)
|
||
users = User.objects.prefetch_related('department', 'role').filter(Q_obj).order_by('-id')
|
||
total = len(users)
|
||
|
||
paginator = Paginator(users, per_page)
|
||
try:
|
||
user_agents_page = paginator.page(page)
|
||
|
||
except PageNotAnInteger:
|
||
user_agents_page = paginator.page(1)
|
||
except EmptyPage:
|
||
user_agents_page = paginator.page(paginator.num_pages)
|
||
data = []
|
||
for info in user_agents_page.object_list:
|
||
data.append({
|
||
'id': info.id,
|
||
"username": info.username, # 姓名
|
||
"account": info.account, # 账号
|
||
"nation": info.ethnicity, # 名族
|
||
"IdCard": info.card, # 身份证
|
||
"mobilePhone": info.mobilePhone, # 手机号
|
||
"department": list(info.department.values('id', 'username')),
|
||
"role": list(info.role.values('id', 'RoleName', 'permissionId')), # 角色信息
|
||
"position": info.position, # 岗位
|
||
"team": info.team, # 所属团队
|
||
"Dateofjoining": info.Dateofjoining, # 入职时间
|
||
"Confirmationtime": info.Confirmationtime, # # 转正时间
|
||
'Practicingcertificatetime': info.Practicingcertificatetime,# 执业证时间
|
||
"Dateofdeparture": info.Dateofdeparture, # 离职时间
|
||
"AcademicResume": info.AcademicResume, # 学业简历
|
||
"academic": info.academic, # 学历信息
|
||
"contract": info.contract, # 合同
|
||
"ApplicationForm": info.ApplicationForm,# 入职申请表
|
||
"salary": info.salary, # 工资
|
||
"state": info.state, # 状态
|
||
})
|
||
return Response({'message': '查看成功', "total":total,'data': data, 'code': 0}, status=status.HTTP_200_OK)
|
||
|
||
class AddDepartment(APIView):
|
||
def post(self, request, *args, **kwargs):
|
||
name = request.data.get('name')
|
||
if not all([name]):
|
||
return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
|
||
dep = Department.objects.filter(username=name).first()
|
||
if dep:
|
||
return Response({'message': '添加失败,部门存在', 'code': 0}, status=status.HTTP_400_BAD_REQUEST)
|
||
|
||
|
||
Department.objects.create(username=name)
|
||
return Response({'message': '添加部门成功', 'code': 0}, status=status.HTTP_200_OK)
|
||
|
||
class DeleteDepartment(APIView):
|
||
def post(self, request, *args, **kwargs):
|
||
id = request.data.get('id')
|
||
if not all([id]):
|
||
return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
|
||
|
||
try:
|
||
dep = Department.objects.get(id=id)
|
||
except Department.DoesNotExist:
|
||
return Response({'status': 'error', 'message': '部门不存在', 'code': 1}, status=status.HTTP_404_NOT_FOUND)
|
||
|
||
department = User.objects.filter(department=dep)
|
||
if department.exists():
|
||
return Response({'status': 'error', 'message': '删除失败,该部门还存在人员,请及时转移', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
|
||
|
||
dep.delete()
|
||
return Response({'message': '删除成功', 'code': 0}, status=status.HTTP_200_OK)
|
||
|
||
class Personlist(APIView):
|
||
def post(self, request, *args, **kwargs):
|
||
users = Department.objects.all()
|
||
page = request.data.get('page')
|
||
per_page = request.data.get('per_page')
|
||
total = len(users)
|
||
|
||
paginator = Paginator(users, per_page)
|
||
try:
|
||
user_agents_page = paginator.page(page)
|
||
|
||
except PageNotAnInteger:
|
||
user_agents_page = paginator.page(1)
|
||
except EmptyPage:
|
||
user_agents_page = paginator.page(paginator.num_pages)
|
||
department_dict = []
|
||
for user in user_agents_page.object_list:
|
||
department_dict.append({
|
||
'id': user.id,
|
||
"username": user.username,
|
||
# "position": user.position,
|
||
# "state": user.state,
|
||
})
|
||
return Response({'message': '展示成功',"total":total,'data':department_dict, 'code': 0}, status=status.HTTP_200_OK)
|
||
|
||
|
||
class roxyExhibition(APIView):
|
||
def post(self, request, *args, **kwargs):
|
||
"""
|
||
代办展示
|
||
:param request:
|
||
:param args:
|
||
:param kwargs:
|
||
:return:
|
||
"""
|
||
page = request.data.get('page')
|
||
per_page = request.data.get('per_page')
|
||
token = request.META.get('token')
|
||
|
||
if not all([page, per_page]):
|
||
return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
|
||
user = User.objects.get(token=token)
|
||
approvals = Approval.objects.filter(
|
||
state="审核中",
|
||
personincharge__in=[user.username, user.department]
|
||
).order_by('-id')
|
||
total = len(approvals)
|
||
|
||
paginator = Paginator(approvals, per_page)
|
||
try:
|
||
user_agents_page = paginator.page(page)
|
||
|
||
except PageNotAnInteger:
|
||
user_agents_page = paginator.page(1)
|
||
except EmptyPage:
|
||
user_agents_page = paginator.page(paginator.num_pages)
|
||
data = []
|
||
for info in user_agents_page.object_list:
|
||
itme = {
|
||
'id': info.id,
|
||
"title": info.title,
|
||
"content": info.content,
|
||
"times": info.times,
|
||
"completeTiem": info.completeTiem,
|
||
"personincharge": info.personincharge,
|
||
"state": info.state,
|
||
"type": info.type,
|
||
}
|
||
data.append(itme)
|
||
return Response({'message': '展示成功',"total":total,'data':data, 'code': 0}, status=status.HTTP_200_OK)
|
||
|
||
class approvalProcessing(APIView):
|
||
def post(self, request, *args, **kwargs):
|
||
"""
|
||
消除代办
|
||
:param request:
|
||
:param args:
|
||
:param kwargs:
|
||
:return:
|
||
"""
|
||
state = request.data.get('state')
|
||
type = request.data.get('type')
|
||
id = request.data.get('id')
|
||
|
||
if not all([state, type,id]):
|
||
return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST)
|
||
approval = Approval.objects.get(id=id)
|
||
if type == "入职财务登记":
|
||
user = User.objects.get(id=approval.user_id)
|
||
if state == "已通过":
|
||
approval.state="已通过"
|
||
user.state = "在职"
|
||
else:
|
||
approval.state="未通过"
|
||
user.state = "异常"
|
||
approval.save(update_fields=['state'])
|
||
user.save(update_fields=['state'])
|
||
|
||
if type == "开票":
|
||
user = Invoice.objects.get(id=approval.user_id)
|
||
if state == "已通过":
|
||
approval.state = "已通过"
|
||
user.state = "已通过"
|
||
else:
|
||
approval.state = "未通过"
|
||
user.state = "异常"
|
||
approval.save(update_fields=['state'])
|
||
user.save(update_fields=['state'])
|
||
|
||
if type == "收入确认":
|
||
approval = Approval.objects.get(id=id)
|
||
user = Income.objects.get(id=approval.user_id)
|
||
if state == "已通过":
|
||
approval.state = "已通过"
|
||
user.state = "已通过"
|
||
else:
|
||
approval.state = "未通过"
|
||
user.state = "未通过"
|
||
approval.save(update_fields=['state'])
|
||
user.save(update_fields=['state'])
|
||
if type == "调账申请":
|
||
approval = Approval.objects.get(id=id)
|
||
user = Accounts.objects.get(id=approval.user_id)
|
||
if state == "已通过":
|
||
approval.state = "已通过"
|
||
user.state = "已通过"
|
||
else:
|
||
approval.state = "未通过"
|
||
user.state = "未通过"
|
||
approval.save(update_fields=['state'])
|
||
user.save(update_fields=['state'])
|
||
|
||
if type == "付款申请":
|
||
approval = Approval.objects.get(id=id)
|
||
user = Payment.objects.get(id=approval.user_id)
|
||
if state == "已通过":
|
||
approval.state = "已通过"
|
||
user.state = "已通过"
|
||
else:
|
||
approval.state = "未通过"
|
||
user.state = "未通过"
|
||
approval.save(update_fields=['state'])
|
||
user.save(update_fields=['state'])
|
||
|
||
if type == "报销申请":
|
||
approval = Approval.objects.get(id=id)
|
||
user = Reimbursement.objects.get(id=approval.user_id)
|
||
if state == "已通过":
|
||
approval.state = "已通过"
|
||
user.state = "已通过"
|
||
else:
|
||
approval.state = "未通过"
|
||
user.state = "未通过"
|
||
approval.save(update_fields=['state'])
|
||
user.save(update_fields=['state'])
|
||
|
||
if type == "工资/奖金变更":
|
||
approval = Approval.objects.get(id=id)
|
||
user = BonusChange.objects.get(id=approval.user_id)
|
||
if state == "已通过":
|
||
approval.state = "已通过"
|
||
user.state = "已通过"
|
||
else:
|
||
approval.state = "未通过"
|
||
user.state = "未通过"
|
||
approval.save(update_fields=['state'])
|
||
user.save(update_fields=['state'])
|
||
|
||
if type == "立项登记":
|
||
approval = Approval.objects.get(id=id)
|
||
user = ProjectRegistration.objects.get(id=approval.user_id)
|
||
if state == "已通过":
|
||
approval.state = "已通过"
|
||
user.state = "已通过"
|
||
else:
|
||
approval.state = "未通过"
|
||
user.state = "未通过"
|
||
approval.save(update_fields=['state'])
|
||
user.save(update_fields=['state'])
|
||
|
||
if type == "案件管理":
|
||
approval = Approval.objects.get(id=id)
|
||
user = Case.objects.get(id=approval.user_id)
|
||
if state == "已通过":
|
||
approval.state = "已通过"
|
||
user.state = "已通过"
|
||
else:
|
||
approval.state = "未通过"
|
||
user.state = "未通过"
|
||
approval.save(update_fields=['state'])
|
||
user.save(update_fields=['state'])
|
||
|
||
if type == "申请用印":
|
||
approval = Approval.objects.get(id=id)
|
||
user = SealApplication.objects.get(id=approval.user_id)
|
||
if state == "已通过":
|
||
approval.state = "已通过"
|
||
user.state = "已通过"
|
||
else:
|
||
approval.state = "未通过"
|
||
user.state = "未通过"
|
||
approval.save(update_fields=['state'])
|
||
user.save(update_fields=['state'])
|
||
return Response({'message': '处理成功','code': 0}, status=status.HTTP_200_OK)
|
||
|
||
class personneldisplay(APIView):
|
||
def get(self, request, *args, **kwargs):
|
||
"""
|
||
人员列表
|
||
:param request:
|
||
:param args:
|
||
:param kwargs:
|
||
:return:
|
||
"""
|
||
users = User.objects.all()
|
||
data = []
|
||
for user in users:
|
||
itme = {
|
||
'id': user.id,
|
||
"username": user.username,
|
||
'position': user.position,
|
||
}
|
||
data.append(itme)
|
||
return Response({'message': '展示成功',"data":data,'code': 0}, status=status.HTTP_200_OK)
|
||
|
||
|