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 != '在职': if user.state == '待登记': return Response({'message': '您的账号尚未完成财务登记,请联系财务部门完成入职财务登记审批。', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) else: return Response({'message': '你的账号已经封存。', '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().order_by('id') 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, "name": user.username, # 修改为 name,与前端期望的字段名一致 "username": user.username, # 同时保留 username 字段以兼容 }) 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) class DeleteUser(APIView): def post(self, request, *args, **kwargs): """ 删除用户 :param request: :param args: :param kwargs: :return: """ id = request.data.get('id') if not id: return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) try: user = User.objects.get(id=id) except User.DoesNotExist: return Response({'status': 'error', 'message': '用户不存在', 'code': 1}, status=status.HTTP_404_NOT_FOUND) user.delete() return Response({'message': '删除成功', 'code': 0}, status=status.HTTP_200_OK)