From 7ba05dd96fcac2e2aa01c2a1a8f5a240613f5bf3 Mon Sep 17 00:00:00 2001 From: 27942 Date: Tue, 13 Jan 2026 17:28:56 +0800 Subject: [PATCH] haha --- finance/views.py | 539 +++++++++++++++++++++++++---------------------- 1 file changed, 285 insertions(+), 254 deletions(-) diff --git a/finance/views.py b/finance/views.py index 34017d8..63133a5 100644 --- a/finance/views.py +++ b/finance/views.py @@ -3,16 +3,17 @@ from rest_framework.response import Response from rest_framework import status import json import ast -from User.models import User,Approval,Department +from User.models import User, Approval, Department from User.utils import format_personincharge, log_operation import datetime -from .models import Invoice,Income,Accounts,Payment,Reimbursement,BonusChange +from .models import Invoice, Income, Accounts, Payment, Reimbursement, BonusChange 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 business.models import PreFiling + class UserRegister(APIView): def post(self, request, *args, **kwargs): """ @@ -36,7 +37,10 @@ class UserRegister(APIView): if personincharge and not approvers: # 兼容旧接口:将单个 personincharge 转换为 approvers 数组 approvers = [personincharge] if personincharge else None - + + print(approvers) + print(len(approvers)) + # 只验证必填字段:姓名、入职时间、工资 if not all([username, Dateofjoining, salary]): missing_params = [] @@ -47,59 +51,59 @@ class UserRegister(APIView): if not salary: missing_params.append('salary(工资)') return Response({ - 'status': 'error', - 'message': f'缺少必填参数: {", ".join(missing_params)}', + 'status': 'error', + 'message': f'缺少必填参数: {", ".join(missing_params)}', 'code': 1 }, status=status.HTTP_400_BAD_REQUEST) - + # 验证日期格式 try: Dateofjoinings = datetime.datetime.strptime(Dateofjoining, "%Y-%m-%d") except ValueError: return Response({ - 'status': 'error', - 'message': '入职时间格式错误,请使用YYYY-MM-DD格式', + 'status': 'error', + 'message': '入职时间格式错误,请使用YYYY-MM-DD格式', 'code': 1 }, status=status.HTTP_400_BAD_REQUEST) - + # 查找用户(必须已存在于人事管理中) try: user = User.objects.get(username=username, is_deleted=False) except User.DoesNotExist: return Response({ - 'status': 'error', - 'message': '用户不存在,请先在人事管理中创建该用户', + 'status': 'error', + 'message': '用户不存在,请先在人事管理中创建该用户', 'code': 1 }, status=status.HTTP_404_NOT_FOUND) - + # 从人事管理同步其他数据(如果入职登记未提供) # 如果提供了card或position,则使用提供的值;否则使用人事管理中的值 # 团队信息始终从人事管理中获取,不在财务登记中修改 update_fields = [] - + # 更新必填字段 user.Dateofjoining = Dateofjoinings user.salary = salary update_fields.extend(['Dateofjoining', 'salary']) - + # 处理可选字段:如果提供了则更新,否则保持人事管理中的值 if card: user.card = card update_fields.append('card') # 如果未提供card,使用人事管理中的card(已存在,无需更新) - + if position: user.position = position update_fields.append('position') # 如果未提供position,使用人事管理中的position(已存在,无需更新) - + # 更新状态 user.state = "待确认" update_fields.append('state') - + # 保存用户信息 user.save(update_fields=update_fields) - + # 从人事管理中获取团队信息(团队信息不在财务登记中修改) team_name = user.team # 用户的团队名称(从人事管理中获取) team = None @@ -112,18 +116,18 @@ class UserRegister(APIView): except Team.DoesNotExist: # 如果团队不存在,默认按团队类型处理(需要审批) pass - + # 构建审批内容(使用实际的值,包括从人事管理同步的) actual_card = card if card else (user.card if user.card else '未填写') actual_position = position if position else (user.position if user.position else '未填写') actual_team = team_name if team_name else '未分配团队' - + today = datetime.datetime.now() formatted_date = today.strftime("%Y-%m-%d") - + # 根据团队类型判断是否需要审批,使用统一的审核流程函数 from User.utils import create_approval_with_team_logic, parse_approvers - + # 构建审批内容 content_parts = [ f"{username}在{Dateofjoining}办理入职", @@ -135,7 +139,7 @@ class UserRegister(APIView): content_parts.append(f"团队类型:{team_type_display}") content_parts.append(f"薪资:{salary}") content = ",".join(content_parts) - + # 使用统一的审核流程函数 try: approval, approvers_order_json, needs_approval = create_approval_with_team_logic( @@ -158,7 +162,7 @@ class UserRegister(APIView): 'message': f'创建审批流程失败: {str(e)},请检查团队配置和审核人信息', 'code': 1 }, status=status.HTTP_400_BAD_REQUEST) - + # 如果返回None且需要审核,说明缺少审核人 if approval is None and needs_approval: # 检查团队是否配置了审核人 @@ -174,7 +178,7 @@ class UserRegister(APIView): for approver_name in team_approvers_list: if User.objects.filter(username=approver_name, is_deleted=False).exists(): team_approvers_valid.append(approver_name) - + # 检查传入的审核人是否存在 approvers_list = [] if approvers: @@ -185,14 +189,14 @@ class UserRegister(APIView): for approver_name in approvers_list: if not User.objects.filter(username=approver_name, is_deleted=False).exists(): invalid_approvers.append(approver_name) - + if invalid_approvers: return Response({ 'status': 'error', 'message': f'审核人不存在或已被删除: {", ".join(invalid_approvers)},请检查审核人是否有效', 'code': 1 }, status=status.HTTP_400_BAD_REQUEST) - + # 构建错误信息 if team_has_approvers: if approvers_list: @@ -210,13 +214,13 @@ class UserRegister(APIView): else: # 团队未配置审核人 error_message = f'团队类型需要指定审核人。团队"{team_name}"未配置审核人,请在前端传递approvers参数(推荐格式:[用户ID数组],如[1,2,3])或为团队配置审核人' - + return Response({ 'status': 'error', 'message': error_message, 'code': 1 }, status=status.HTTP_400_BAD_REQUEST) - + # 记录操作日志(包含从人事管理获取的团队信息) new_data = { 'user_id': user.id, @@ -240,9 +244,9 @@ class UserRegister(APIView): new_data=new_data, remark=f'新增入职财务登记:{user.username},入职时间 {Dateofjoining},薪资 {salary},团队 {team_name if team_name else "未分配"}' ) - + return Response({ - 'message': '登记成功', + 'message': '登记成功', 'code': 0, 'data': { 'username': user.username, @@ -258,7 +262,7 @@ class UserRegister(APIView): class RegisteredUserList(APIView): """查询已入职登记的用户列表""" - + def post(self, request, *args, **kwargs): """ 查询已完成入职财务登记的用户 @@ -271,21 +275,21 @@ class RegisteredUserList(APIView): per_page = request.data.get('per_page', 10) username = request.data.get('username', '') # 用户名搜索 department = request.data.get('department', '') # 部门搜索 - + if not all([page, per_page]): return Response({ - 'status': 'error', - 'message': '缺少参数:页码和每页数量不能为空', + 'status': 'error', + 'message': '缺少参数:页码和每页数量不能为空', 'code': 1 }, status=status.HTTP_400_BAD_REQUEST) - + # 获取所有已完成入职登记的用户ID(状态为"已通过"的入职财务登记) completed_registration_user_ids = Approval.objects.filter( type="入职财务登记", state="已通过", is_deleted=False ).values_list('user_id', flat=True) - + # 将user_id转换为整数列表(因为user_id是CharField存储的字符串) # 同时验证用户是否被软删除,只保留未删除的用户ID completed_user_ids = [] @@ -297,11 +301,11 @@ class RegisteredUserList(APIView): completed_user_ids.append(user_id) except (ValueError, TypeError): continue - + # 查询条件:已完成入职登记的用户 # 只查询未软删除的用户 Q_obj = Q(is_deleted=False) - + # 只查询已完成入职登记的用户 if completed_user_ids: Q_obj &= Q(id__in=completed_user_ids) @@ -313,23 +317,23 @@ class RegisteredUserList(APIView): 'data': [], 'code': 0 }, status=status.HTTP_200_OK) - + # 排除admin用户(超级管理员) Q_obj &= ~Q(username='admin') Q_obj &= ~Q(account='admin') - + # 用户名搜索 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 = users.count() - + # 分页 paginator = Paginator(users, per_page) try: @@ -338,7 +342,7 @@ class RegisteredUserList(APIView): users_page = paginator.page(1) except EmptyPage: users_page = paginator.page(paginator.num_pages) - + data = [] for user in users_page.object_list: # 获取入职登记的审批记录信息 @@ -348,7 +352,7 @@ class RegisteredUserList(APIView): state="已通过", is_deleted=False ).order_by('-id').first() - + data.append({ 'id': user.id, 'username': user.username, @@ -362,10 +366,11 @@ class RegisteredUserList(APIView): 'Dateofjoining': user.Dateofjoining.strftime("%Y-%m-%d") if user.Dateofjoining else None, 'salary': user.salary, 'state': user.state, - 'registration_date': approval.times.strftime("%Y-%m-%d") if approval and approval.times else None, # 入职登记日期 + 'registration_date': approval.times.strftime("%Y-%m-%d") if approval and approval.times else None, + # 入职登记日期 'approval_id': approval.id if approval else None }) - + return Response({ 'message': '查询成功', 'total': total, @@ -376,7 +381,7 @@ class RegisteredUserList(APIView): class UnregisteredUserList(APIView): """查询未入职登记的用户列表""" - + def post(self, request, *args, **kwargs): """ 查询在人事管理中已创建,但还没有完成入职财务登记的用户 @@ -389,21 +394,21 @@ class UnregisteredUserList(APIView): per_page = request.data.get('per_page', 10) username = request.data.get('username', '') # 用户名搜索 department = request.data.get('department', '') # 部门搜索 - + if not all([page, per_page]): return Response({ - 'status': 'error', - 'message': '缺少参数:页码和每页数量不能为空', + 'status': 'error', + 'message': '缺少参数:页码和每页数量不能为空', 'code': 1 }, status=status.HTTP_400_BAD_REQUEST) - + # 获取所有已完成入职登记的用户ID(状态为"已通过"的入职财务登记) completed_registration_user_ids = Approval.objects.filter( type="入职财务登记", state="已通过", is_deleted=False ).values_list('user_id', flat=True) - + # 将user_id转换为整数列表(因为user_id是CharField存储的字符串) # 同时验证用户是否被软删除,只保留未删除的用户ID completed_user_ids = [] @@ -415,31 +420,31 @@ class UnregisteredUserList(APIView): completed_user_ids.append(user_id) except (ValueError, TypeError): continue - + # 查询条件:在人事管理中,但不在已完成入职登记的用户列表中 # 只查询未软删除的用户 Q_obj = Q(is_deleted=False) - + # 排除已完成入职登记的用户 if completed_user_ids: Q_obj &= ~Q(id__in=completed_user_ids) - + # 排除admin用户(超级管理员) Q_obj &= ~Q(username='admin') Q_obj &= ~Q(account='admin') - + # 用户名搜索 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 = users.count() - + # 分页 paginator = Paginator(users, per_page) try: @@ -448,19 +453,19 @@ class UnregisteredUserList(APIView): users_page = paginator.page(1) except EmptyPage: users_page = paginator.page(paginator.num_pages) - + # 批量获取所有用户的团队信息,优化查询性能 from User.models import Team team_names = [user.team for user in users_page.object_list if user.team] teams_dict = {} if team_names: teams = Team.objects.prefetch_related('approvers').filter( - name__in=team_names, + name__in=team_names, is_deleted=False ) for team in teams: teams_dict[team.name] = team - + # 批量获取所有用户的待审核入职登记,优化查询性能 user_ids = [user.id for user in users_page.object_list] pending_approvals_dict = {} @@ -478,12 +483,12 @@ class UnregisteredUserList(APIView): pending_approvals_dict[user_id] = approval except (ValueError, TypeError): continue - + data = [] for user in users_page.object_list: # 检查是否有待审核的入职登记(状态为"审核中") pending_approval = pending_approvals_dict.get(user.id) - + # 获取完整的团队信息 team_info = None if user.team: @@ -506,7 +511,7 @@ class UnregisteredUserList(APIView): 'description': None, 'approvers': [] } - + data.append({ 'id': user.id, 'username': user.username, @@ -522,7 +527,7 @@ class UnregisteredUserList(APIView): 'has_pending_approval': pending_approval is not None, # 是否有待审核的入职登记 'pending_approval_id': pending_approval.id if pending_approval else None }) - + return Response({ 'message': '查询成功', 'total': total, @@ -533,17 +538,17 @@ class UnregisteredUserList(APIView): class GetCaseListForInvoice(APIView): """获取案件列表(用于开票申请选择)""" - + def post(self, request, *args, **kwargs): """ 获取案件列表,用于开票申请时选择合同号 返回案件ID、合同号、负责人等信息 """ from business.models import ProjectRegistration - + # 获取所有未删除的案件 cases = ProjectRegistration.objects.filter(is_deleted=False).order_by('-id') - + data = [] for case in cases: data.append({ @@ -553,7 +558,7 @@ class GetCaseListForInvoice(APIView): 'type': case.type, # 项目类型 'times': case.times, # 立项时间 }) - + return Response({ 'message': '获取成功', 'data': data, @@ -608,10 +613,10 @@ class issueAnInvoice(APIView): 'message': f'缺少必填参数: {", ".join(missing_params)}', 'code': 1 }, status=status.HTTP_400_BAD_REQUEST) - + # 处理合同号和负责人:优先从案件表同步 from business.models import ProjectRegistration - + if case_id: # 如果提供了案件ID,从案件表获取合同号和负责人 try: @@ -638,10 +643,10 @@ class issueAnInvoice(APIView): 'message': '请选择案件或手动填写负责人', 'code': 1 }, status=status.HTTP_400_BAD_REQUEST) - + today = datetime.datetime.now() formatted_date = today.strftime("%Y-%m-%d") - + invoice = Invoice.objects.create( ContractNo=ContractNo, personincharge=personincharge, @@ -656,7 +661,7 @@ class issueAnInvoice(APIView): times=formatted_date, ) # 已删除:不再创建开票待办事项 - + # 记录操作日志 new_data = { 'id': invoice.id, @@ -678,7 +683,7 @@ class issueAnInvoice(APIView): new_data=new_data, remark=f'新增开票申请:合同号 {invoice.ContractNo},负责人 {invoice.personincharge},金额 {invoice.amount}' ) - + return Response({ 'message': '提交成功', 'code': 0, @@ -736,7 +741,7 @@ class issueAnInvoiceDetail(APIView): "times": info.times, } data.append(itme) - return Response({'message': '展示成功',"total":total,'data':data, 'code': 0}, status=status.HTTP_200_OK) + return Response({'message': '展示成功', "total": total, 'data': data, 'code': 0}, status=status.HTTP_200_OK) class EditInvoice(APIView): @@ -757,17 +762,18 @@ class EditInvoice(APIView): number = request.data.get('number') address_telephone = request.data.get('address_telephone') bank = request.data.get('bank') - + if not id: return Response({'status': 'error', 'message': '缺少参数id', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) - + try: invoice = Invoice.objects.get(id=id, is_deleted=False) except Invoice.DoesNotExist: - return Response({'status': 'error', 'message': '开票申请不存在', 'code': 1}, status=status.HTTP_404_NOT_FOUND) - + return Response({'status': 'error', 'message': '开票申请不存在', 'code': 1}, + status=status.HTTP_404_NOT_FOUND) + update_fields_list = [] - + if ContractNo: invoice.ContractNo = ContractNo update_fields_list.append('ContractNo') @@ -792,7 +798,7 @@ class EditInvoice(APIView): if bank: invoice.bank = bank update_fields_list.append('bank') - + # 记录操作前的数据 old_data = { 'id': invoice.id, @@ -801,10 +807,10 @@ class EditInvoice(APIView): 'type': invoice.type, 'unit': invoice.unit } - + if update_fields_list: invoice.save(update_fields=update_fields_list) - + # 记录操作后的数据 invoice.refresh_from_db() new_data = { @@ -814,7 +820,7 @@ class EditInvoice(APIView): 'type': invoice.type, 'unit': invoice.unit } - + # 记录操作日志 log_operation( request=request, @@ -828,7 +834,7 @@ class EditInvoice(APIView): new_data=new_data, remark=f'编辑开票申请:合同号 {invoice.ContractNo}' ) - + return Response({'message': '编辑成功', 'code': 0}, status=status.HTTP_200_OK) @@ -844,12 +850,13 @@ class DeleteInvoice(APIView): id = request.data.get('id') if not id: return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) - + try: invoice = Invoice.objects.get(id=id, is_deleted=False) except Invoice.DoesNotExist: - return Response({'status': 'error', 'message': '开票申请不存在', 'code': 1}, status=status.HTTP_404_NOT_FOUND) - + return Response({'status': 'error', 'message': '开票申请不存在', 'code': 1}, + status=status.HTTP_404_NOT_FOUND) + # 记录操作前的数据 old_data = { 'id': invoice.id, @@ -857,11 +864,11 @@ class DeleteInvoice(APIView): 'amount': invoice.amount, 'unit': invoice.unit } - + # 软删除:更新 is_deleted 字段 invoice.is_deleted = True invoice.save() - + # 记录操作日志 log_operation( request=request, @@ -874,7 +881,7 @@ class DeleteInvoice(APIView): old_data=old_data, remark=f'删除开票申请:合同号 {invoice.ContractNo},金额 {invoice.amount}' ) - + return Response({'message': '删除成功', 'code': 0}, status=status.HTTP_200_OK) @@ -901,12 +908,13 @@ class confirm(APIView): if personincharge and not approvers: approvers = [personincharge] if personincharge else None case_id = request.data.get('case_id') # 案件ID(可选,用于关联案件) - + try: user = User.objects.get(token=token, is_deleted=False) except User.DoesNotExist: - return Response({'status': 'error', 'message': '用户不存在或已被删除', 'code': 1}, status=status.HTTP_401_UNAUTHORIZED) - + return Response({'status': 'error', 'message': '用户不存在或已被删除', 'code': 1}, + status=status.HTTP_401_UNAUTHORIZED) + # 必填字段验证(allocate改为可选) if not all([times, ContractNo, CustomerID, amount]): missing_params = [] @@ -923,7 +931,7 @@ class confirm(APIView): 'message': f'缺少必填参数: {", ".join(missing_params)}', 'code': 1 }, status=status.HTTP_400_BAD_REQUEST) - + # 如果提供了案件ID,从案件表获取相关信息(可选) from business.models import ProjectRegistration case_info = None @@ -945,11 +953,11 @@ class confirm(APIView): 'message': '案件不存在或已被删除', 'code': 1 }, status=status.HTTP_404_NOT_FOUND) - + from datetime import datetime now = datetime.now() date_string = now.strftime("%Y-%m-%d") - + # 创建收入确认记录,allocate为空或"待审批人指定" income = Income.objects.create( times=times, @@ -965,7 +973,7 @@ class confirm(APIView): # 获取用户的团队信息 team_name = user.team from User.utils import create_approval_with_team_logic - + # 构建审批内容,包含案件信息(如果提供了) content_parts = [ f"{user.username}在{times}提交了收入确认", @@ -990,7 +998,7 @@ class confirm(APIView): business_record=income, today=date_string ) - + # 如果返回None且需要审核,说明缺少审核人 if approval is None and needs_approval: return Response({ @@ -998,7 +1006,7 @@ class confirm(APIView): 'message': '团队类型需要指定审核人,请提供approvers参数', 'code': 1 }, status=status.HTTP_400_BAD_REQUEST) - + # 记录操作日志 new_data = { 'id': income.id, @@ -1019,7 +1027,7 @@ class confirm(APIView): new_data=new_data, remark=f'新增收入确认:合同号 {income.ContractNo},金额 {income.amount},分配待审批人指定' ) - + return Response({ 'message': '提交成功', 'code': 0, @@ -1030,6 +1038,7 @@ class confirm(APIView): } }, status=status.HTTP_200_OK) + class confirmdisplay(APIView): def post(self, request, *args, **kwargs): """ @@ -1042,43 +1051,44 @@ class confirmdisplay(APIView): end_time = request.data.get('end_time') CustomerID = request.data.get('CustomerID') token = request.META.get('token') - + if not all([page, per_page]): return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) - + # 获取当前用户信息 try: user = User.objects.get(token=token, is_deleted=False) except User.DoesNotExist: - return Response({'status': 'error', 'message': '用户不存在或已被删除', 'code': 1}, status=status.HTTP_401_UNAUTHORIZED) - + return Response({'status': 'error', 'message': '用户不存在或已被删除', 'code': 1}, + status=status.HTTP_401_UNAUTHORIZED) + # 检查用户是否有权限查看所有数据 # 获取用户的角色名称列表 user_roles = user.role.values_list('RoleName', flat=True) user_role_names = list(user_roles) - + # 获取用户的部门名称列表 user_departments = user.department.values_list('username', flat=True) user_department_names = list(user_departments) - + # 判断是否有权限查看所有数据:管委会角色或财务部角色或财务部部门 has_all_permission = ( - '管委会' in user_role_names or - '财务部' in user_role_names or - '财务部' in user_department_names + '管委会' in user_role_names or + '财务部' in user_role_names or + '财务部' in user_department_names ) - + # 构建查询条件 Q_obj = Q() if times and end_time: Q_obj &= Q(times__gte=times) & Q(times__lte=end_time) if CustomerID: Q_obj &= Q(CustomerID__icontains=CustomerID) - + # 如果没有查看所有数据的权限,只显示自己提交的数据 if not has_all_permission: Q_obj &= Q(submit=user.username) - + income = Income.objects.filter(Q_obj, is_deleted=False).order_by('-id') total = len(income) @@ -1122,17 +1132,18 @@ class EditIncome(APIView): CustomerID = request.data.get('CustomerID') amount = request.data.get('amount') allocate = request.data.get('allocate') - + if not id: return Response({'status': 'error', 'message': '缺少参数id', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) - + try: income = Income.objects.get(id=id, is_deleted=False) except Income.DoesNotExist: - return Response({'status': 'error', 'message': '收入确认不存在', 'code': 1}, status=status.HTTP_404_NOT_FOUND) - + return Response({'status': 'error', 'message': '收入确认不存在', 'code': 1}, + status=status.HTTP_404_NOT_FOUND) + update_fields_list = [] - + if times: income.times = times update_fields_list.append('times') @@ -1148,10 +1159,10 @@ class EditIncome(APIView): if allocate: income.allocate = allocate update_fields_list.append('allocate') - + if update_fields_list: income.save(update_fields=update_fields_list) - + return Response({'message': '编辑成功', 'code': 0}, status=status.HTTP_200_OK) @@ -1167,12 +1178,13 @@ class DeleteIncome(APIView): id = request.data.get('id') if not id: return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) - + try: income = Income.objects.get(id=id, is_deleted=False) except Income.DoesNotExist: - return Response({'status': 'error', 'message': '收入确认不存在', 'code': 1}, status=status.HTTP_404_NOT_FOUND) - + return Response({'status': 'error', 'message': '收入确认不存在', 'code': 1}, + status=status.HTTP_404_NOT_FOUND) + # 软删除:更新 is_deleted 字段 income.is_deleted = True income.save() @@ -1196,7 +1208,7 @@ class loan(APIView): situation = request.data.get('situation') case_id = request.data.get('case_id') # 案件ID(可选,用于关联案件) token = request.META.get('token') - + # 移除personincharge必填验证 if not all([times, ContractNo, amount, situation, CustomerID]): missing_params = [] @@ -1215,15 +1227,16 @@ class loan(APIView): 'message': f'缺少必填参数: {", ".join(missing_params)}', 'code': 1 }, status=status.HTTP_400_BAD_REQUEST) - + from datetime import datetime now = datetime.now() date_string = now.strftime("%Y-%m-%d") - + try: user = User.objects.get(token=token, is_deleted=False) except User.DoesNotExist: - return Response({'status': 'error', 'message': '用户不存在或已被删除', 'code': 1}, status=status.HTTP_401_UNAUTHORIZED) + return Response({'status': 'error', 'message': '用户不存在或已被删除', 'code': 1}, + status=status.HTTP_401_UNAUTHORIZED) # 如果提供了案件ID,从案件表获取相关信息(可选) from business.models import ProjectRegistration @@ -1257,7 +1270,7 @@ class loan(APIView): submit_tiem=date_string, state="待财务处理" # 直接设为待财务处理 ) - + # 构建审批内容,包含案件信息(如果提供了) content_parts = [ f"{user.username}在{times}提交了调账申请", @@ -1270,7 +1283,7 @@ class loan(APIView): content_parts.append(f"案件类型:{case_info['type']}") content_parts.append(f"案件负责人:{case_info['responsiblefor']}") content = ",".join(content_parts) - + # 直接抄送财务,不需要审批人 Approval.objects.create( title=user.username + "提交调账申请", @@ -1281,7 +1294,7 @@ class loan(APIView): type="调账申请", user_id=acc.id ) - + # 记录操作日志 new_data = { 'id': acc.id, @@ -1301,7 +1314,7 @@ class loan(APIView): new_data=new_data, remark=f'新增调账申请:合同号 {acc.ContractNo},金额 {acc.amount},已直接抄送财务' ) - + return Response({ 'message': '提交成功', 'code': 0, @@ -1312,6 +1325,7 @@ class loan(APIView): } }, status=status.HTTP_200_OK) + class loandisplay(APIView): def post(self, request, *args, **kwargs): page = request.data.get('page') @@ -1367,17 +1381,18 @@ class EditAccounts(APIView): CustomerID = request.data.get('CustomerID') amount = request.data.get('amount') situation = request.data.get('situation') - + if not id: return Response({'status': 'error', 'message': '缺少参数id', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) - + try: account = Accounts.objects.get(id=id, is_deleted=False) except Accounts.DoesNotExist: - return Response({'status': 'error', 'message': '调账申请不存在', 'code': 1}, status=status.HTTP_404_NOT_FOUND) - + return Response({'status': 'error', 'message': '调账申请不存在', 'code': 1}, + status=status.HTTP_404_NOT_FOUND) + update_fields_list = [] - + if times: account.times = times update_fields_list.append('times') @@ -1393,10 +1408,10 @@ class EditAccounts(APIView): if situation: account.situation = situation update_fields_list.append('situation') - + if update_fields_list: account.save(update_fields=update_fields_list) - + return Response({'message': '编辑成功', 'code': 0}, status=status.HTTP_200_OK) @@ -1412,12 +1427,13 @@ class DeleteAccounts(APIView): id = request.data.get('id') if not id: return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) - + try: account = Accounts.objects.get(id=id, is_deleted=False) except Accounts.DoesNotExist: - return Response({'status': 'error', 'message': '调账申请不存在', 'code': 1}, status=status.HTTP_404_NOT_FOUND) - + return Response({'status': 'error', 'message': '调账申请不存在', 'code': 1}, + status=status.HTTP_404_NOT_FOUND) + # 软删除:更新 is_deleted 字段 account.is_deleted = True account.save() @@ -1439,7 +1455,7 @@ class PaymentRequest(APIView): payee = request.data.get('payee') bankcard = request.data.get('bankcard') BankName = request.data.get('BankName') - applicant= request.data.get('applicant') + applicant = request.data.get('applicant') approvers = request.data.get('approvers') # 审核人列表(可选,多人团队时需要,推荐:用户ID数组如[1,2,3],兼容:用户名数组) # 兼容旧接口:如果传了 personincharge,转换为 approvers personincharge = request.data.get('personincharge') @@ -1448,7 +1464,7 @@ class PaymentRequest(APIView): if not all([times, payee, bankcard, BankName, reason, amount]): return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) - + # 获取申请人的团队信息 team_name = None try: @@ -1472,12 +1488,12 @@ class PaymentRequest(APIView): submit_tiem=date_string, state="审核中" ) - + # 使用统一的审核流程函数 from User.utils import create_approval_with_team_logic - + content = f"{applicant}在{times}提交了付款申请,付款理由:{reason},付款金额:{amount},付款日期:{times},收款人:{payee},银行卡:{bankcard},开户行:{BankName}" - + approval, approvers_order_json, needs_approval = create_approval_with_team_logic( team_name=team_name, approvers=approvers, @@ -1488,7 +1504,7 @@ class PaymentRequest(APIView): business_record=pay, today=date_string ) - + # 如果返回None且需要审核,说明缺少审核人 if approval is None and needs_approval: return Response({ @@ -1496,8 +1512,9 @@ class PaymentRequest(APIView): 'message': '团队类型需要指定审核人,请提供approvers参数', 'code': 1 }, status=status.HTTP_400_BAD_REQUEST) - - return Response({'message': '插入成功' ,'code': 0}, status=status.HTTP_200_OK) + + return Response({'message': '插入成功', 'code': 0}, status=status.HTTP_200_OK) + class PaymentDisplay(APIView): def post(self, request, *args, **kwargs): @@ -1558,17 +1575,18 @@ class EditPayment(APIView): bankcard = request.data.get('bankcard') BankName = request.data.get('BankName') applicant = request.data.get('applicant') - + if not id: return Response({'status': 'error', 'message': '缺少参数id', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) - + try: payment = Payment.objects.get(id=id, is_deleted=False) except Payment.DoesNotExist: - return Response({'status': 'error', 'message': '付款申请不存在', 'code': 1}, status=status.HTTP_404_NOT_FOUND) - + return Response({'status': 'error', 'message': '付款申请不存在', 'code': 1}, + status=status.HTTP_404_NOT_FOUND) + update_fields_list = [] - + if reason: payment.reason = reason update_fields_list.append('reason') @@ -1590,10 +1608,10 @@ class EditPayment(APIView): if applicant: payment.applicant = applicant update_fields_list.append('applicant') - + if update_fields_list: payment.save(update_fields=update_fields_list) - + return Response({'message': '编辑成功', 'code': 0}, status=status.HTTP_200_OK) @@ -1609,12 +1627,13 @@ class DeletePayment(APIView): id = request.data.get('id') if not id: return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) - + try: payment = Payment.objects.get(id=id, is_deleted=False) except Payment.DoesNotExist: - return Response({'status': 'error', 'message': '付款申请不存在', 'code': 1}, status=status.HTTP_404_NOT_FOUND) - + return Response({'status': 'error', 'message': '付款申请不存在', 'code': 1}, + status=status.HTTP_404_NOT_FOUND) + # 软删除:更新 is_deleted 字段 payment.is_deleted = True payment.save() @@ -1640,7 +1659,7 @@ class reimbursement(APIView): FeeDescription = request.data.get('FeeDescription') approvers = request.data.get('approvers') # 审批人列表(数组,仅团队类型需要,推荐:用户ID数组如[1,2,3],兼容:用户名数组) token = request.META.get('token') - + if not all([person, times, reason, amount, FeeDescription]): missing_params = [] if not person: @@ -1658,7 +1677,7 @@ class reimbursement(APIView): 'message': f'缺少必填参数: {", ".join(missing_params)}', 'code': 1 }, status=status.HTTP_400_BAD_REQUEST) - + # 获取报销人的团队信息 try: submitter_user = User.objects.get(username=person, is_deleted=False) @@ -1668,7 +1687,7 @@ class reimbursement(APIView): 'message': f'报销人"{person}"不存在或已被删除', 'code': 1 }, status=status.HTTP_404_NOT_FOUND) - + from User.models import Team team_name = submitter_user.team team = None @@ -1677,11 +1696,11 @@ class reimbursement(APIView): team = Team.objects.get(name=team_name, is_deleted=False) except Team.DoesNotExist: pass - + from datetime import datetime now = datetime.now() date_string = now.strftime("%Y-%m-%d") - + reim = Reimbursement.objects.create( person=person, times=times, @@ -1691,12 +1710,12 @@ class reimbursement(APIView): submit_tiem=date_string, state="审核中" if (team and team.team_type == 'team') else "待财务处理" ) - + # 使用统一的审核流程函数 from User.utils import create_approval_with_team_logic - + content = f"{person}在{times}提交了报销申请,报销理由:{reason},付款金额:{amount},付款日期:{times},费用说明:{FeeDescription}" - + approval, approvers_order_json, needs_approval = create_approval_with_team_logic( team_name=team_name, approvers=approvers, @@ -1707,7 +1726,7 @@ class reimbursement(APIView): business_record=reim, today=date_string ) - + # 如果返回None且需要审核,说明缺少审核人 if approval is None and needs_approval: return Response({ @@ -1715,7 +1734,7 @@ class reimbursement(APIView): 'message': '团队类型需要指定审核人,请提供approvers参数', 'code': 1 }, status=status.HTTP_400_BAD_REQUEST) - + # 记录操作日志 new_data = { 'id': reim.id, @@ -1735,7 +1754,7 @@ class reimbursement(APIView): new_data=new_data, remark=f'新增报销申请:{reim.person},金额 {reim.amount},团队类型 {team.team_type if team else "未知"}' ) - + return Response({ 'message': '提交成功', 'code': 0, @@ -1746,6 +1765,7 @@ class reimbursement(APIView): } }, status=status.HTTP_200_OK) + class reimbursementdetail(APIView): def post(self, request, *args, **kwargs): page = request.data.get('page') @@ -1801,17 +1821,18 @@ class EditReimbursement(APIView): reason = request.data.get('reason') amount = request.data.get('amount') FeeDescription = request.data.get('FeeDescription') - + if not id: return Response({'status': 'error', 'message': '缺少参数id', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) - + try: reimbursement = Reimbursement.objects.get(id=id, is_deleted=False) except Reimbursement.DoesNotExist: - return Response({'status': 'error', 'message': '报销申请不存在', 'code': 1}, status=status.HTTP_404_NOT_FOUND) - + return Response({'status': 'error', 'message': '报销申请不存在', 'code': 1}, + status=status.HTTP_404_NOT_FOUND) + update_fields_list = [] - + if person: reimbursement.person = person update_fields_list.append('person') @@ -1827,10 +1848,10 @@ class EditReimbursement(APIView): if FeeDescription: reimbursement.FeeDescription = FeeDescription update_fields_list.append('FeeDescription') - + if update_fields_list: reimbursement.save(update_fields=update_fields_list) - + return Response({'message': '编辑成功', 'code': 0}, status=status.HTTP_200_OK) @@ -1846,12 +1867,13 @@ class DeleteReimbursement(APIView): id = request.data.get('id') if not id: return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) - + try: reimbursement = Reimbursement.objects.get(id=id, is_deleted=False) except Reimbursement.DoesNotExist: - return Response({'status': 'error', 'message': '报销申请不存在', 'code': 1}, status=status.HTTP_404_NOT_FOUND) - + return Response({'status': 'error', 'message': '报销申请不存在', 'code': 1}, + status=status.HTTP_404_NOT_FOUND) + # 软删除:更新 is_deleted 字段 reimbursement.is_deleted = True reimbursement.save() @@ -1880,7 +1902,7 @@ class Change(APIView): if not all([username, type, Instructions]): return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) - + # 获取提交人信息 submitter = '未知用户' try: @@ -1889,7 +1911,7 @@ class Change(APIView): except User.DoesNotExist: # 如果token无效,使用username作为提交人(兼容旧逻辑) submitter = username - + from datetime import datetime now = datetime.now() bonus = BonusChange.objects.create( @@ -1900,13 +1922,13 @@ class Change(APIView): state="审核中", submitter=submitter # 记录提交人 ) - + # 获取用户的团队信息 team_name = user.team if user else None from User.utils import create_approval_with_team_logic - + content = f"{submitter}在{now.strftime('%Y-%m-%d')}提交了工资/奖金变更,类型:{type},调整说明:{Instructions}" - + # 使用统一的审核流程函数 approval, approvers_order_json, needs_approval = create_approval_with_team_logic( team_name=team_name, @@ -1918,7 +1940,7 @@ class Change(APIView): business_record=bonus, today=now.strftime("%Y-%m-%d") ) - + # 如果返回None且需要审核,说明缺少审核人 if approval is None and needs_approval: return Response({ @@ -1926,7 +1948,7 @@ class Change(APIView): 'message': '团队类型需要指定审核人,请提供approvers参数', 'code': 1 }, status=status.HTTP_400_BAD_REQUEST) - + # 记录操作日志 new_data = { 'id': bonus.id, @@ -1945,7 +1967,7 @@ class Change(APIView): new_data=new_data, remark=f'新增工资/奖金变更:{bonus.username},类型 {bonus.type},提交人 {bonus.submitter}' ) - + return Response({ 'message': '插入成功', 'code': 0, @@ -1955,6 +1977,7 @@ class Change(APIView): } }, status=status.HTTP_200_OK) + class ChangeDetail(APIView): def post(self, request, *args, **kwargs): page = request.data.get('page') @@ -2007,17 +2030,18 @@ class EditBonusChange(APIView): username = request.data.get('username') type = request.data.get('type') Instructions = request.data.get('Instructions') - + if not id: return Response({'status': 'error', 'message': '缺少参数id', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) - + try: bonus = BonusChange.objects.get(id=id, is_deleted=False) except BonusChange.DoesNotExist: - return Response({'status': 'error', 'message': '工资/奖金变更不存在', 'code': 1}, status=status.HTTP_404_NOT_FOUND) - + return Response({'status': 'error', 'message': '工资/奖金变更不存在', 'code': 1}, + status=status.HTTP_404_NOT_FOUND) + update_fields_list = [] - + if username: bonus.username = username update_fields_list.append('username') @@ -2027,10 +2051,10 @@ class EditBonusChange(APIView): if Instructions: bonus.Instructions = Instructions update_fields_list.append('Instructions') - + if update_fields_list: bonus.save(update_fields=update_fields_list) - + return Response({'message': '编辑成功', 'code': 0}, status=status.HTTP_200_OK) @@ -2046,12 +2070,13 @@ class DeleteBonusChange(APIView): id = request.data.get('id') if not id: return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) - + try: bonus = BonusChange.objects.get(id=id, is_deleted=False) except BonusChange.DoesNotExist: - return Response({'status': 'error', 'message': '工资/奖金变更不存在', 'code': 1}, status=status.HTTP_404_NOT_FOUND) - + return Response({'status': 'error', 'message': '工资/奖金变更不存在', 'code': 1}, + status=status.HTTP_404_NOT_FOUND) + # 软删除:更新 is_deleted 字段 bonus.is_deleted = True bonus.save() @@ -2075,19 +2100,21 @@ class UserDeparture(APIView): personincharge = request.data.get('personincharge') if personincharge and not approvers: approvers = [personincharge] if personincharge else None - + if not all([username, Dateofdeparture]): - return Response({'status': 'error', 'message': '缺少参数:用户名和离职时间不能为空', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) - + return Response({'status': 'error', 'message': '缺少参数:用户名和离职时间不能为空', 'code': 1}, + status=status.HTTP_400_BAD_REQUEST) + try: user = User.objects.get(username=username, is_deleted=False) except User.DoesNotExist: - return Response({'status': 'error', 'message': '用户不存在或已被删除', 'code': 1}, status=status.HTTP_404_NOT_FOUND) - + return Response({'status': 'error', 'message': '用户不存在或已被删除', 'code': 1}, + status=status.HTTP_404_NOT_FOUND) + # 检查用户是否有案件(作为承办人员) cases = PreFiling.objects.filter(Undertaker=username) case_count = cases.count() - + if case_count > 0: # 用户有案件,需要先转移案件才能离职 case_list = [] @@ -2099,7 +2126,7 @@ class UserDeparture(APIView): 'party_username': case.party_username, 'description': case.description }) - + return Response({ 'status': 'error', 'message': f'该用户还有{case_count}个案件未转移,请先转移案件后再进行离职登记', @@ -2110,24 +2137,25 @@ class UserDeparture(APIView): 'cases': case_list } }, status=status.HTTP_400_BAD_REQUEST) - + # 用户没有案件,可以正常离职登记 try: Dateofdepartures = datetime.datetime.strptime(Dateofdeparture, "%Y-%m-%d") except ValueError: - return Response({'status': 'error', 'message': '离职时间格式错误,请使用YYYY-MM-DD格式', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) - + return Response({'status': 'error', 'message': '离职时间格式错误,请使用YYYY-MM-DD格式', 'code': 1}, + status=status.HTTP_400_BAD_REQUEST) + # 更新用户离职时间和状态 user.Dateofdeparture = Dateofdepartures user.state = "已离职" user.save(update_fields=['Dateofdeparture', 'state']) - + # 根据团队类型判断是否需要审批 # 规则: # - 个人团队(personal/独立律师):不触发审批 # - 团队(team/团队律师):需要审批,直接选择某个人,审批人需要指定结算工资 from User.models import Team - + # 获取用户的团队信息 team_name = user.team # 用户的团队名称(CharField) team = None @@ -2137,19 +2165,19 @@ class UserDeparture(APIView): except Team.DoesNotExist: # 如果团队不存在,默认按团队类型处理(需要审批) pass - + # 使用统一的审核流程函数 from User.utils import create_approval_with_team_logic - + today = datetime.datetime.now() formatted_date = today.strftime("%Y-%m-%d") - + settlement_salary = request.data.get('settlement_salary') # 结算工资(可选,审批人可以后续填写) - + content = f"{username}在{Dateofdeparture}办理离职" if settlement_salary: content += f",结算工资:{settlement_salary}" - + approval, approvers_order_json, needs_approval = create_approval_with_team_logic( team_name=team_name, approvers=approvers, @@ -2160,7 +2188,7 @@ class UserDeparture(APIView): business_record=user, # User对象没有approvers_order字段,但可以更新state today=formatted_date ) - + # 如果返回None且需要审核,说明缺少审核人 if approval is None and needs_approval: return Response({ @@ -2168,7 +2196,7 @@ class UserDeparture(APIView): 'message': '团队类型需要指定审核人,请提供approvers参数', 'code': 1 }, status=status.HTTP_400_BAD_REQUEST) - + # 如果是个人团队,不创建审批记录,但记录日志 if team and team.team_type == 'personal' and approval is None: new_data = { @@ -2191,7 +2219,7 @@ class UserDeparture(APIView): remark=f'新增离职财务登记:{user.username},离职时间 {Dateofdeparture}(个人团队,无需审批)' ) else: - + # 构建审批内容,包含结算工资信息(如果已提供) content_parts = [f"{username}在{Dateofdeparture}办理离职登记"] if settlement_salary: @@ -2199,7 +2227,7 @@ class UserDeparture(APIView): else: content_parts.append("结算工资:待审批人指定") content = ",".join(content_parts) - + approval = Approval.objects.create( title=username + "离职财务登记", content=content, @@ -2209,7 +2237,7 @@ class UserDeparture(APIView): type="离职财务登记", user_id=str(user.id) ) - + # 记录操作日志 new_data = { 'user_id': user.id, @@ -2230,7 +2258,7 @@ class UserDeparture(APIView): new_data=new_data, remark=f'新增离职财务登记:{user.username},离职时间 {Dateofdeparture}' ) - + return Response({ 'message': '离职登记成功', 'code': 0, @@ -2257,23 +2285,24 @@ class UserDepartureDetail(APIView): times = request.data.get('times') # 开始时间 end_time = request.data.get('end_time') # 结束时间 state = request.data.get('state') # 审批状态 - + if not all([page, per_page]): - return Response({'status': 'error', 'message': '缺少参数:页码和每页数量不能为空', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) - + return Response({'status': 'error', 'message': '缺少参数:页码和每页数量不能为空', 'code': 1}, + status=status.HTTP_400_BAD_REQUEST) + # 查询离职财务登记的审批记录 Q_obj = Q(type="离职财务登记", is_deleted=False) - + if username: Q_obj &= Q(title__icontains=username) | Q(content__icontains=username) if times and end_time: Q_obj &= Q(times__gte=times) & Q(times__lte=end_time) if state: Q_obj &= Q(state=state) - + approvals = Approval.objects.filter(Q_obj).order_by('-id') total = len(approvals) - + paginator = Paginator(approvals, per_page) try: user_agents_page = paginator.page(page) @@ -2281,7 +2310,7 @@ class UserDepartureDetail(APIView): user_agents_page = paginator.page(1) except EmptyPage: user_agents_page = paginator.page(paginator.num_pages) - + data = [] for approval in user_agents_page.object_list: # 获取用户信息 @@ -2304,7 +2333,7 @@ class UserDepartureDetail(APIView): 'Dateofdeparture': None, 'state': '' } - + item = { 'id': approval.id, 'title': approval.title, @@ -2318,7 +2347,7 @@ class UserDepartureDetail(APIView): 'user_info': user_info } data.append(item) - + return Response({ 'message': '查询成功', 'total': total, @@ -2339,24 +2368,25 @@ class EditUserDeparture(APIView): id = request.data.get('id') # 审批记录ID Dateofdeparture = request.data.get('Dateofdeparture') # 离职时间 personincharge = request.data.get('personincharge') # 负责人 - + if not id: return Response({'status': 'error', 'message': '缺少参数id', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) - + try: approval = Approval.objects.get(id=id, type="离职财务登记", is_deleted=False) except Approval.DoesNotExist: - return Response({'status': 'error', 'message': '离职登记记录不存在', 'code': 1}, status=status.HTTP_404_NOT_FOUND) - + return Response({'status': 'error', 'message': '离职登记记录不存在', 'code': 1}, + status=status.HTTP_404_NOT_FOUND) + # 获取用户信息 try: user = User.objects.get(id=int(approval.user_id), is_deleted=False) except (User.DoesNotExist, ValueError): return Response({'status': 'error', 'message': '用户不存在', 'code': 1}, status=status.HTTP_404_NOT_FOUND) - + update_fields_list = [] approval_update_fields = [] - + # 更新离职时间 if Dateofdeparture: try: @@ -2367,19 +2397,20 @@ class EditUserDeparture(APIView): approval.content = user.username + "在" + Dateofdeparture + "办理离职登记" approval_update_fields.append('content') except ValueError: - return Response({'status': 'error', 'message': '离职时间格式错误,请使用YYYY-MM-DD格式', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) - + return Response({'status': 'error', 'message': '离职时间格式错误,请使用YYYY-MM-DD格式', 'code': 1}, + status=status.HTTP_400_BAD_REQUEST) + # 更新负责人 if personincharge: approval.personincharge = personincharge approval_update_fields.append('personincharge') - + # 保存更新 if update_fields_list: user.save(update_fields=update_fields_list) if approval_update_fields: approval.save(update_fields=approval_update_fields) - + return Response({'message': '编辑成功', 'code': 0}, status=status.HTTP_200_OK) @@ -2394,21 +2425,22 @@ class DeleteUserDeparture(APIView): :return: """ id = request.data.get('id') # 审批记录ID - + if not id: return Response({'status': 'error', 'message': '缺少参数id', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) - + try: approval = Approval.objects.get(id=id, type="离职财务登记", is_deleted=False) except Approval.DoesNotExist: - return Response({'status': 'error', 'message': '离职登记记录不存在', 'code': 1}, status=status.HTTP_404_NOT_FOUND) - + return Response({'status': 'error', 'message': '离职登记记录不存在', 'code': 1}, + status=status.HTTP_404_NOT_FOUND) + # 获取用户信息 try: user = User.objects.get(id=int(approval.user_id), is_deleted=False) except (User.DoesNotExist, ValueError): return Response({'status': 'error', 'message': '用户不存在', 'code': 1}, status=status.HTTP_404_NOT_FOUND) - + # 记录操作前的数据 old_data = { 'user_id': user.id, @@ -2417,16 +2449,16 @@ class DeleteUserDeparture(APIView): 'dateofdeparture': str(user.Dateofdeparture) if user.Dateofdeparture else None, 'approval_id': approval.id } - + # 恢复用户状态 user.state = "在职" user.Dateofdeparture = None user.save(update_fields=['state', 'Dateofdeparture']) - + # 软删除:更新 is_deleted 字段 approval.is_deleted = True approval.save() - + # 记录操作日志 log_operation( request=request, @@ -2440,6 +2472,5 @@ class DeleteUserDeparture(APIView): new_data={'user_id': user.id, 'username': user.username, 'state': '在职'}, remark=f'删除离职登记,恢复用户 {user.username} 状态为"在职"' ) - - return Response({'message': '删除成功,用户状态已恢复为"在职"', 'code': 0}, status=status.HTTP_200_OK) + return Response({'message': '删除成功,用户状态已恢复为"在职"', 'code': 0}, status=status.HTTP_200_OK)