From 2af30a5e33371540c43f9d985b197a77b16eab2d Mon Sep 17 00:00:00 2001 From: 27942 Date: Wed, 31 Dec 2025 11:42:28 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=86=E8=BD=AF=E5=88=A0?= =?UTF-8?q?=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- User/migrations/0013_add_is_deleted_fields.py | 28 ++++ User/models.py | 3 + User/views.py | 32 +++-- .../migrations/0025_add_is_deleted_fields.py | 83 ++++++++++++ business/models.py | 14 ++ business/views.py | 124 ++++++++++++------ .../migrations/0010_add_is_deleted_fields.py | 43 ++++++ finance/models.py | 6 + finance/views.py | 45 ++++--- 9 files changed, 310 insertions(+), 68 deletions(-) create mode 100644 User/migrations/0013_add_is_deleted_fields.py create mode 100644 business/migrations/0025_add_is_deleted_fields.py create mode 100644 finance/migrations/0010_add_is_deleted_fields.py diff --git a/User/migrations/0013_add_is_deleted_fields.py b/User/migrations/0013_add_is_deleted_fields.py new file mode 100644 index 0000000..3113555 --- /dev/null +++ b/User/migrations/0013_add_is_deleted_fields.py @@ -0,0 +1,28 @@ +# Generated migration for soft delete support + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('User', '0012_remove_user_department_remove_user_role_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='department', + name='is_deleted', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='user', + name='is_deleted', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='approval', + name='is_deleted', + field=models.BooleanField(default=False), + ), + ] diff --git a/User/models.py b/User/models.py index 0e62823..96bcd67 100644 --- a/User/models.py +++ b/User/models.py @@ -4,6 +4,7 @@ from business.models import role # Create your models here. class Department(models.Model): username = models.CharField(max_length=100) # 部门名称 + is_deleted = models.BooleanField(default=False) # 软删除标记 class User(models.Model): role = models.ManyToManyField(role) department =models.ManyToManyField(Department) # 归属部门 @@ -26,6 +27,7 @@ class User(models.Model): salary = models.CharField(max_length=100,null=True, blank=True, default=None) # 工资 state = models.CharField(max_length=100) # 状态 token = models.TextField() + is_deleted = models.BooleanField(default=False) # 软删除标记 class Approval(models.Model): title = models.CharField(max_length=100) @@ -39,5 +41,6 @@ class Approval(models.Model): state = models.CharField(max_length=100) # 状态 type = models.CharField(max_length=100) # 类别 user_id = models.CharField(max_length=100) # 事件id + is_deleted = models.BooleanField(default=False) # 软删除标记 diff --git a/User/views.py b/User/views.py index ec5678f..af6b5d1 100644 --- a/User/views.py +++ b/User/views.py @@ -75,7 +75,7 @@ class CreateUserView(APIView): }, status=status.HTTP_400_BAD_REQUEST) # 检查用户名是否已存在(username字段有唯一性约束) - if User.objects.filter(username=username).exists(): + if User.objects.filter(username=username, is_deleted=False).exists(): return Response({'status': 'error', 'message': '用户名已存在,不能重复', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) @@ -201,10 +201,10 @@ class EditorialStaffView(APIView): 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) + user = User.objects.get(id=id, is_deleted=False) # 检查用户名是否已被其他用户使用(排除当前用户) - if username and User.objects.filter(username=username).exclude(id=id).exists(): + if username and User.objects.filter(username=username, is_deleted=False).exclude(id=id).exists(): return Response({'status': 'error', 'message': '用户名已存在,不能重复', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) @@ -292,7 +292,7 @@ class LoginView(APIView): if not all([username, password]): return Response({'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) try: - user = User.objects.get(account=username) + user = User.objects.get(account=username, is_deleted=False) # 只有"在职"状态的用户才能登录,新创建的用户需要完成财务登记审批流程 if user.state != '在职': @@ -405,7 +405,7 @@ class DepartmentView(APIView): Q_obj = Q() if name: Q_obj &= Q(username__icontains=name) - deps = Department.objects.filter(Q_obj) + deps = Department.objects.filter(Q_obj, is_deleted=False) data = [] for dep in deps: data.append({ @@ -481,7 +481,7 @@ class AddDepartment(APIView): 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() + dep = Department.objects.filter(username=name, is_deleted=False).first() if dep: return Response({'message': '添加失败,部门存在', 'code': 0}, status=status.HTTP_400_BAD_REQUEST) @@ -496,16 +496,18 @@ class DeleteDepartment(APIView): return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) try: - dep = Department.objects.get(id=id) + dep = Department.objects.get(id=id, is_deleted=False) except Department.DoesNotExist: return Response({'status': 'error', 'message': '部门不存在', 'code': 1}, status=status.HTTP_404_NOT_FOUND) - department = User.objects.filter(department=dep) + department = User.objects.filter(department=dep, is_deleted=False) if department.exists(): return Response({'status': 'error', 'message': '删除失败,该部门还存在人员,请及时转移', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) - dep.delete() + # 软删除:更新 is_deleted 字段 + dep.is_deleted = True + dep.save() return Response({'message': '删除成功', 'code': 0}, status=status.HTTP_200_OK) @@ -515,7 +517,7 @@ class Personlist(APIView): """ def post(self, request, *args, **kwargs): - users = Department.objects.all().order_by('id') + users = Department.objects.filter(is_deleted=False).order_by('id') page = request.data.get('page') per_page = request.data.get('per_page') total = len(users) @@ -583,7 +585,7 @@ class roxyExhibition(APIView): # 如果用户没有部门,只匹配审批员(兼容旧数据) query &= person_query - approvals = Approval.objects.filter(query).order_by('-id') + approvals = Approval.objects.filter(query, is_deleted=False).order_by('-id') # 调试信息(生产环境可以注释掉) # print(f"用户: {user.username}, 部门IDs: {user_department_ids_str}") @@ -773,7 +775,7 @@ class personneldisplay(APIView): :param kwargs: :return: """ - users = User.objects.all() + users = User.objects.filter(is_deleted=False) data = [] for user in users: itme = { @@ -799,9 +801,11 @@ class DeleteUser(APIView): return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) try: - user = User.objects.get(id=id) + user = User.objects.get(id=id, is_deleted=False) except User.DoesNotExist: return Response({'status': 'error', 'message': '用户不存在', 'code': 1}, status=status.HTTP_404_NOT_FOUND) - user.delete() + # 软删除:更新 is_deleted 字段 + user.is_deleted = True + user.save() return Response({'message': '删除成功', 'code': 0}, status=status.HTTP_200_OK) diff --git a/business/migrations/0025_add_is_deleted_fields.py b/business/migrations/0025_add_is_deleted_fields.py new file mode 100644 index 0000000..feaadb5 --- /dev/null +++ b/business/migrations/0025_add_is_deleted_fields.py @@ -0,0 +1,83 @@ +# Generated migration for soft delete support + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('business', '0024_role_remark'), + ] + + operations = [ + migrations.AddField( + model_name='prefiling', + name='is_deleted', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='projectregistration', + name='is_deleted', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='bid', + name='is_deleted', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='case', + name='is_deleted', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='invoice', + name='is_deleted', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='caselog', + name='is_deleted', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='sealapplication', + name='is_deleted', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='warehousing', + name='is_deleted', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='registerplatform', + name='is_deleted', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='announcement', + name='is_deleted', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='lawyerflie', + name='is_deleted', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='schedule', + name='is_deleted', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='role', + name='is_deleted', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='permission', + name='is_deleted', + field=models.BooleanField(default=False), + ), + ] diff --git a/business/models.py b/business/models.py index 960c947..0d6bd94 100644 --- a/business/models.py +++ b/business/models.py @@ -8,6 +8,7 @@ class PreFiling(models.Model): description = models.TextField() # 描述 Undertaker = models.CharField(max_length=100) # 承办人员 submit = models.CharField(max_length=100) # 谁提交的 + is_deleted = models.BooleanField(default=False) # 软删除标记 class ProjectRegistration(models.Model): @@ -19,6 +20,7 @@ class ProjectRegistration(models.Model): charge = models.CharField(max_length=100) # 收费情况 contract = models.TextField() # 合同 state = models.CharField(max_length=100) # 状态 + is_deleted = models.BooleanField(default=False) # 软删除标记 class Bid(models.Model): @@ -28,6 +30,7 @@ class Bid(models.Model): times = models.CharField(max_length=100) # 申请日期 BiddingAnnouncement = models.TextField() # 上传招标公告 state = models.CharField(max_length=100) # 状态 + is_deleted = models.BooleanField(default=False) # 软删除标记 class Case(models.Model): @@ -39,11 +42,13 @@ class Case(models.Model): ChangeRequest = models.CharField(max_length=100) # 变更申请 paymentcollection = models.CharField(max_length=100) # 已收款 state = models.CharField(max_length=100) # 状态 + is_deleted = models.BooleanField(default=False) # 软删除标记 class Invoice(models.Model): user = models.ForeignKey(PreFiling, on_delete=models.CASCADE) amount = models.CharField(max_length=100) # 金额 file = models.TextField() # 发票图片或PDF + is_deleted = models.BooleanField(default=False) # 软删除标记 class Caselog(models.Model): user = models.ForeignKey(PreFiling, on_delete=models.CASCADE) @@ -51,6 +56,7 @@ class Caselog(models.Model): times = models.CharField(max_length=100) # 时间 username = models.CharField(max_length=100) # 提交人 file = models.TextField() # 文件 + is_deleted = models.BooleanField(default=False) # 软删除标记 class SealApplication(models.Model): Printingpurpose = models.CharField(max_length=100) # 用印用途 @@ -62,6 +68,7 @@ class SealApplication(models.Model): times = models.CharField(max_length=100) # 日期 state = models.CharField(max_length=100) # 状态 username = models.CharField(max_length=100) # 提交人 + is_deleted = models.BooleanField(default=False) # 软删除标记 class Warehousing(models.Model): @@ -71,12 +78,14 @@ class Warehousing(models.Model): deadline = models.CharField(max_length=100) # 入库期限 contract = models.TextField() # 入库合同 times = models.CharField(max_length=100) # 日期 + is_deleted = models.BooleanField(default=False) # 软删除标记 class RegisterPlatform(models.Model): platform = models.CharField(max_length=100) # 注册平台 number = models.CharField(max_length=100) # 注册号码 password = models.CharField(max_length=100) # 密码 username = models.CharField(max_length=100) # 注册人员 + is_deleted = models.BooleanField(default=False) # 软删除标记 class Announcement(models.Model): title = models.CharField(max_length=100) # 标题 @@ -85,6 +94,7 @@ class Announcement(models.Model): file = models.TextField() # 文件 username = models.CharField(max_length=100) # 提交人 state = models.CharField(max_length=100) # 状态 + is_deleted = models.BooleanField(default=False) # 软删除标记 class LawyerFlie(models.Model): @@ -92,6 +102,7 @@ class LawyerFlie(models.Model): remark = models.CharField(max_length=200) file = models.TextField() # 文件 times = models.CharField(max_length=100) + is_deleted = models.BooleanField(default=False) # 软删除标记 class Schedule(models.Model): @@ -100,6 +111,7 @@ class Schedule(models.Model): end_time = models.CharField(max_length=100) remark = models.CharField(max_length=200) # 备注 state = models.CharField(max_length=100) + is_deleted = models.BooleanField(default=False) # 软删除标记 @@ -107,9 +119,11 @@ class role(models.Model): RoleName = models.CharField(max_length=100) # 角色名称 permissionId = models.CharField(max_length=1000) # 权限 remark = models.CharField(max_length=200) # 备注 + is_deleted = models.BooleanField(default=False) # 软删除标记 class permission(models.Model): permission_name = models.CharField(max_length=100) # 权限名称 permission_logo = models.CharField(max_length=100) # 权限标识 parent = models.CharField(max_length=100) # 父级 + is_deleted = models.BooleanField(default=False) # 软删除标记 \ No newline at end of file diff --git a/business/views.py b/business/views.py index 5dced75..1d43920 100644 --- a/business/views.py +++ b/business/views.py @@ -90,7 +90,7 @@ class registrationDetail(APIView): if Undertaker: Q_obj &= Q(Undertaker__icontains=Undertaker) - pre = PreFiling.objects.filter(Q_obj).order_by('-id') + pre = PreFiling.objects.filter(Q_obj, is_deleted=False).order_by('-id') total = len(pre) paginator = Paginator(pre, per_page) @@ -276,7 +276,7 @@ class ProjectDetail(APIView): pre_id = pre.values_list('id', flat=True) Q_obj &= Q(user_id__in=pre_id) - pre = ProjectRegistration.objects.filter(Q_obj).order_by('-id') + pre = ProjectRegistration.objects.filter(Q_obj, is_deleted=False).order_by('-id') total = len(pre) paginator = Paginator(pre, per_page) @@ -419,17 +419,19 @@ class DeleteProject(APIView): return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) try: - pro = ProjectRegistration.objects.get(id=id) + pro = ProjectRegistration.objects.get(id=id, is_deleted=False) except ProjectRegistration.DoesNotExist: return Response({'status': 'error', 'message': '立项登记不存在', 'code': 1}, status=status.HTTP_404_NOT_FOUND) # 检查是否已经被案件管理关联 - case_exists = Case.objects.filter(user_id=pro.user_id).exists() + case_exists = Case.objects.filter(user_id=pro.user_id, is_deleted=False).exists() if case_exists: return Response({'status': 'error', 'message': '该立项已被案件管理关联,无法删除', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) - pro.delete() + # 软删除:更新 is_deleted 字段 + pro.is_deleted = True + pro.save() return Response({'message': '删除成功', 'code': 0}, status=status.HTTP_200_OK) @@ -505,7 +507,7 @@ class BidDetail(APIView): pre_id = pre.values_list('id', flat=True) Q_obj &= Q(user_id__in=pre_id) - pre = Bid.objects.filter(Q_obj).order_by('-id') + pre = Bid.objects.filter(Q_obj, is_deleted=False).order_by('-id') total = len(pre) paginator = Paginator(pre, per_page) @@ -602,11 +604,13 @@ class DeleteBid(APIView): return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) try: - bid = Bid.objects.get(id=id) + bid = Bid.objects.get(id=id, is_deleted=False) except Bid.DoesNotExist: return Response({'status': 'error', 'message': '投标登记不存在', 'code': 1}, status=status.HTTP_404_NOT_FOUND) - bid.delete() + # 软删除:更新 is_deleted 字段 + bid.is_deleted = True + bid.save() return Response({'message': '删除成功', 'code': 0}, status=status.HTTP_200_OK) @@ -710,7 +714,7 @@ class caseManagementDetail(APIView): Q_obj &= Q(times__gte=times) & Q(times__lte=end_time) if type: - por_id = ProjectRegistration.objects.filter(type=type).values_list('user_id', flat=True) + por_id = ProjectRegistration.objects.filter(type=type, is_deleted=False).values_list('user_id', flat=True) Q_obj &= Q(user_id__in=por_id) # if client_username: @@ -722,7 +726,7 @@ class caseManagementDetail(APIView): # pre_id = pre.values_list('id', flat=True) # Q_obj &= Q(user_id__in=pre_id) - pre = Case.objects.filter(Q_obj).order_by('-id') + pre = Case.objects.filter(Q_obj, is_deleted=False).order_by('-id') total = len(pre) paginator = Paginator(pre, per_page) @@ -858,11 +862,13 @@ class DeleteCase(APIView): return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) try: - case = Case.objects.get(id=id) + case = Case.objects.get(id=id, is_deleted=False) except Case.DoesNotExist: return Response({'status': 'error', 'message': '案件管理不存在', 'code': 1}, status=status.HTTP_404_NOT_FOUND) - case.delete() + # 软删除:更新 is_deleted 字段 + case.is_deleted = True + case.save() return Response({'message': '删除成功', 'code': 0}, status=status.HTTP_200_OK) @@ -946,7 +952,7 @@ class LogDetail(APIView): if not all([page, per_page]): return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) - pre = Caselog.objects.all() + pre = Caselog.objects.filter(is_deleted=False) total = len(pre) paginator = Paginator(pre, per_page) @@ -1001,7 +1007,7 @@ class preFilingLinkedCases(APIView): :param kwargs: :return: """ - proa = ProjectRegistration.objects.all() + proa = ProjectRegistration.objects.filter(is_deleted=False) data = [] for prefiling in proa: pre = PreFiling.objects.get(id=prefiling.user_id) @@ -1187,11 +1193,13 @@ class DeleteApplication(APIView): return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) try: - app = SealApplication.objects.get(id=id) + app = SealApplication.objects.get(id=id, is_deleted=False) except SealApplication.DoesNotExist: return Response({'status': 'error', 'message': '申请用印不存在', 'code': 1}, status=status.HTTP_404_NOT_FOUND) - app.delete() + # 软删除:更新 is_deleted 字段 + app.is_deleted = True + app.save() return Response({'message': '删除成功', 'code': 0}, status=status.HTTP_200_OK) @@ -1331,11 +1339,13 @@ class DeleteWarehousing(APIView): return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) try: - ware = Warehousing.objects.get(id=id) + ware = Warehousing.objects.get(id=id, is_deleted=False) except Warehousing.DoesNotExist: return Response({'status': 'error', 'message': '入库登记不存在', 'code': 1}, status=status.HTTP_404_NOT_FOUND) - ware.delete() + # 软删除:更新 is_deleted 字段 + ware.is_deleted = True + ware.save() return Response({'message': '删除成功', 'code': 0}, status=status.HTTP_200_OK) @@ -1375,7 +1385,7 @@ class PlatformDetail(APIView): """ page = request.data.get('page') per_page = request.data.get('per_page') - seas = RegisterPlatform.objects.all().order_by('-id') + seas = RegisterPlatform.objects.filter(is_deleted=False).order_by('-id') total = len(seas) paginator = Paginator(seas, per_page) @@ -1435,8 +1445,14 @@ class DeletePlatformDetail(APIView): :return: """ ID = request.data.get('id') - RegisterPlatform.objects.get(id=ID).delete() - return Response({'message': '删除成功', 'code': 0}, status=status.HTTP_200_OK) + try: + platform = RegisterPlatform.objects.get(id=ID, is_deleted=False) + # 软删除:更新 is_deleted 字段 + platform.is_deleted = True + platform.save() + return Response({'message': '删除成功', 'code': 0}, status=status.HTTP_200_OK) + except RegisterPlatform.DoesNotExist: + return Response({'status': 'error', 'message': '注册平台登记不存在', 'code': 1}, status=status.HTTP_404_NOT_FOUND) class bulletin(APIView): @@ -1485,7 +1501,7 @@ class BulletinDetail(APIView): """ page = request.data.get('page') per_page = request.data.get('per_page') - seas = Announcement.objects.all().order_by('-state', '-times') + seas = Announcement.objects.filter(is_deleted=False).order_by('-state', '-times') total = len(seas) paginator = Paginator(seas, per_page) @@ -1576,8 +1592,14 @@ class EditBulletin(APIView): class deleteBulletin(APIView): def post(self, request, *args, **kwargs): ID = request.data.get('id') - Announcement.objects.get(id=ID).delete() - return Response({'message': '删除成功', 'code': 0}, status=status.HTTP_200_OK) + try: + announcement = Announcement.objects.get(id=ID, is_deleted=False) + # 软删除:更新 is_deleted 字段 + announcement.is_deleted = True + announcement.save() + return Response({'message': '删除成功', 'code': 0}, status=status.HTTP_200_OK) + except Announcement.DoesNotExist: + return Response({'status': 'error', 'message': '公告不存在', 'code': 1}, status=status.HTTP_404_NOT_FOUND) class Lawyersdocuments(APIView): @@ -1601,7 +1623,7 @@ class Lawyersdocuments(APIView): class LawyersdocumentsDetail(APIView): def post(self, request, *args, **kwargs): - law = LawyerFlie.objects.all().order_by('-times') + law = LawyerFlie.objects.filter(is_deleted=False).order_by('-times') total = law.count() data = [] for info in law: @@ -1619,8 +1641,14 @@ class LawyersdocumentsDetail(APIView): class LwaDetail(APIView): def post(self, request, *args, **kwargs): id = request.data.get('id') - LawyerFlie.objects.get(id=id).delete() - return Response({'message': '删除成功', 'code': 0}, status=status.HTTP_200_OK) + try: + lawyer_file = LawyerFlie.objects.get(id=id, is_deleted=False) + # 软删除:更新 is_deleted 字段 + lawyer_file.is_deleted = True + lawyer_file.save() + return Response({'message': '删除成功', 'code': 0}, status=status.HTTP_200_OK) + except LawyerFlie.DoesNotExist: + return Response({'status': 'error', 'message': '律师文件不存在', 'code': 1}, status=status.HTTP_404_NOT_FOUND) class EditLawyerFlie(APIView): @@ -1694,8 +1722,14 @@ class DeleteSchedule(APIView): :return: """ id = request.data.get('id') - Schedule.objects.get(id=id).delete() - return Response({'message': '删除成功', 'code': 0}, status=status.HTTP_200_OK) + try: + schedule = Schedule.objects.get(id=id, is_deleted=False) + # 软删除:更新 is_deleted 字段 + schedule.is_deleted = True + schedule.save() + return Response({'message': '删除成功', 'code': 0}, status=status.HTTP_200_OK) + except Schedule.DoesNotExist: + return Response({'status': 'error', 'message': '日程不存在', 'code': 1}, status=status.HTTP_404_NOT_FOUND) class ScheduleDetail(APIView): @@ -1808,7 +1842,7 @@ class DisplayRermission(APIView): """ 权限列表展示 """ - permissions = permission.objects.all() + permissions = permission.objects.filter(is_deleted=False) # 先将数据转换为字典格式 data = [] @@ -1852,8 +1886,14 @@ class DeleteRermission(APIView): 删除权限 """ ID = request.data.get('id') - permission.objects.get(id=ID).delete() - return Response({'message': '删除成功', 'code': 0}, status=status.HTTP_200_OK) + try: + perm = permission.objects.get(id=ID, is_deleted=False) + # 软删除:更新 is_deleted 字段 + perm.is_deleted = True + perm.save() + return Response({'message': '删除成功', 'code': 0}, status=status.HTTP_200_OK) + except permission.DoesNotExist: + return Response({'status': 'error', 'message': '权限不存在', 'code': 1}, status=status.HTTP_404_NOT_FOUND) class EditRermission(APIView): @@ -1896,8 +1936,14 @@ class addRole(APIView): class DeleteRole(APIView): def post(self, request, *args, **kwargs): id = request.data.get('id') - role.objects.get(id=id).delete() - return Response({'message': '删除成功', 'code': 0}, status=status.HTTP_200_OK) + try: + r = role.objects.get(id=id, is_deleted=False) + # 软删除:更新 is_deleted 字段 + r.is_deleted = True + r.save() + return Response({'message': '删除成功', 'code': 0}, status=status.HTTP_200_OK) + except role.DoesNotExist: + return Response({'status': 'error', 'message': '角色不存在', 'code': 1}, status=status.HTTP_404_NOT_FOUND) class EditRole(APIView): @@ -2014,12 +2060,12 @@ class DeleteRegistration(APIView): return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) try: - pre = PreFiling.objects.get(id=id) + pre = PreFiling.objects.get(id=id, is_deleted=False) # 检查是否已经被立项登记关联 - project_exists = ProjectRegistration.objects.filter(user_id=id).exists() + project_exists = ProjectRegistration.objects.filter(user_id=id, is_deleted=False).exists() # 检查是否已经被投标登记关联 - bid_exists = Bid.objects.filter(user_id=id).exists() + bid_exists = Bid.objects.filter(user_id=id, is_deleted=False).exists() if project_exists: return Response({'status': 'error', 'message': '该预立案已被立项登记,无法删除', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) @@ -2027,7 +2073,9 @@ class DeleteRegistration(APIView): if bid_exists: return Response({'status': 'error', 'message': '该预立案已被投标登记,无法删除', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) - pre.delete() + # 软删除:更新 is_deleted 字段 + pre.is_deleted = True + pre.save() return Response({'message': '删除成功', 'code': 0}, status=status.HTTP_200_OK) except PreFiling.DoesNotExist: return Response({'status': 'error', 'message': '预立案登记不存在', 'code': 1}, diff --git a/finance/migrations/0010_add_is_deleted_fields.py b/finance/migrations/0010_add_is_deleted_fields.py new file mode 100644 index 0000000..bb79574 --- /dev/null +++ b/finance/migrations/0010_add_is_deleted_fields.py @@ -0,0 +1,43 @@ +# Generated migration for soft delete support + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('finance', '0009_bonuschange_state'), + ] + + operations = [ + migrations.AddField( + model_name='invoice', + name='is_deleted', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='income', + name='is_deleted', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='accounts', + name='is_deleted', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='payment', + name='is_deleted', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='reimbursement', + name='is_deleted', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='bonuschange', + name='is_deleted', + field=models.BooleanField(default=False), + ), + ] diff --git a/finance/models.py b/finance/models.py index 60e0a4d..2373339 100644 --- a/finance/models.py +++ b/finance/models.py @@ -13,6 +13,7 @@ class Invoice(models.Model): state = models.CharField(max_length=100) # 状态 username = models.CharField(max_length=100) # 谁提交的 times = models.TextField() # 提交时间 + is_deleted = models.BooleanField(default=False) # 软删除标记 class Income(models.Model): @@ -24,6 +25,7 @@ class Income(models.Model): submit = models.CharField(max_length=100) # 谁提交的 submit_tiem = models.CharField(max_length=100) # 提交时间 state = models.CharField(max_length=100) # 状态 + is_deleted = models.BooleanField(default=False) # 软删除标记 class Accounts(models.Model): @@ -35,6 +37,7 @@ class Accounts(models.Model): submit = models.CharField(max_length=100) # 谁提交的 submit_tiem = models.CharField(max_length=100) # 提交时间 state = models.CharField(max_length=100) # 状态 + is_deleted = models.BooleanField(default=False) # 软删除标记 class Payment(models.Model): @@ -47,6 +50,7 @@ class Payment(models.Model): applicant = models.CharField(max_length=100) # 申请人 submit_tiem = models.CharField(max_length=100) # 提交时间 state = models.CharField(max_length=100) # 状态 + is_deleted = models.BooleanField(default=False) # 软删除标记 class Reimbursement(models.Model): person = models.CharField(max_length=100) # 报销人 @@ -56,6 +60,7 @@ class Reimbursement(models.Model): FeeDescription = models.TextField() # 费用说明 submit_tiem = models.CharField(max_length=100) # 提交时间 state = models.CharField(max_length=100) # 状态 + is_deleted = models.BooleanField(default=False) # 软删除标记 class BonusChange(models.Model): username = models.CharField(max_length=100) @@ -63,3 +68,4 @@ class BonusChange(models.Model): Instructions = models.TextField() # 调整说明 times = models.CharField(max_length=100) # 时间 state = models.CharField(max_length=100) # 状态 + is_deleted = models.BooleanField(default=False) # 软删除标记 \ No newline at end of file diff --git a/finance/views.py b/finance/views.py index a91fd38..c5d281a 100644 --- a/finance/views.py +++ b/finance/views.py @@ -243,11 +243,13 @@ class DeleteInvoice(APIView): return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) try: - invoice = Invoice.objects.get(id=id) + 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) - invoice.delete() + # 软删除:更新 is_deleted 字段 + invoice.is_deleted = True + invoice.save() return Response({'message': '删除成功', 'code': 0}, status=status.HTTP_200_OK) @@ -436,11 +438,13 @@ class DeleteIncome(APIView): return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) try: - income = Income.objects.get(id=id) + 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) - income.delete() + # 软删除:更新 is_deleted 字段 + income.is_deleted = True + income.save() return Response({'message': '删除成功', 'code': 0}, status=status.HTTP_200_OK) @@ -592,11 +596,13 @@ class DeleteAccounts(APIView): return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) try: - account = Accounts.objects.get(id=id) + 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) - account.delete() + # 软删除:更新 is_deleted 字段 + account.is_deleted = True + account.save() return Response({'message': '删除成功', 'code': 0}, status=status.HTTP_200_OK) @@ -759,11 +765,13 @@ class DeletePayment(APIView): return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) try: - payment = Payment.objects.get(id=id) + 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) - payment.delete() + # 软删除:更新 is_deleted 字段 + payment.is_deleted = True + payment.save() return Response({'message': '删除成功', 'code': 0}, status=status.HTTP_200_OK) @@ -908,11 +916,13 @@ class DeleteReimbursement(APIView): return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) try: - reimbursement = Reimbursement.objects.get(id=id) + 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) - reimbursement.delete() + # 软删除:更新 is_deleted 字段 + reimbursement.is_deleted = True + reimbursement.save() return Response({'message': '删除成功', 'code': 0}, status=status.HTTP_200_OK) @@ -1044,11 +1054,13 @@ class DeleteBonusChange(APIView): return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) try: - bonus = BonusChange.objects.get(id=id) + 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) - bonus.delete() + # 软删除:更新 is_deleted 字段 + bonus.is_deleted = True + bonus.save() return Response({'message': '删除成功', 'code': 0}, status=status.HTTP_200_OK) @@ -1307,13 +1319,13 @@ class DeleteUserDeparture(APIView): return Response({'status': 'error', 'message': '缺少参数id', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) try: - approval = Approval.objects.get(id=id, type="离职财务登记") + 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) # 获取用户信息 try: - user = User.objects.get(id=int(approval.user_id)) + 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) @@ -1322,8 +1334,9 @@ class DeleteUserDeparture(APIView): user.Dateofdeparture = None user.save(update_fields=['state', 'Dateofdeparture']) - # 删除审批记录 - approval.delete() + # 软删除:更新 is_deleted 字段 + approval.is_deleted = True + approval.save() return Response({'message': '删除成功,用户状态已恢复为"在职"', 'code': 0}, status=status.HTTP_200_OK)