diff --git a/business/urls.py b/business/urls.py index 3fc4475..6f3ae49 100644 --- a/business/urls.py +++ b/business/urls.py @@ -1,7 +1,7 @@ from django.urls import path from .models import Schedule -from .views import registration,registrationDetail,Project,Projectquerytype,ProjectDetail,EditProject,BidRegistration,BidDetail,registrationList,caseManagement,caseManagementDetail,CaseAttachmentUpload,CaseAttachmentUpdate,Uploadinvoice,InvoiceDetail,Log,LogDetail,accumulate,preFilingLinkedCases,Application,ApplicationDetail,WarehousingRegistration,WarehousingDetail,PlatformRegistration,PlatformDetail,EditPlatformDetail,DeletePlatformDetail,bulletin,BulletinDetail,EditBulletin,deleteBulletin,Lawyersdocuments,LawyersdocumentsDetail,LwaDetail,CreateSchedule,DeleteSchedule,ScheduleDetail,handleSchedule,AddRermission,DisplayRermission,DeleteRermission,EditRermission,addRole,DeleteRole,EditRole,displayRole,modifypermissions,getRolePermissions,DeleteRegistration,EditRegistration,DeleteProject,EditBid,DeleteBid,EditCase,DeleteCase,EditApplication,DeleteApplication,EditWarehousing,DeleteWarehousing,EditLawyerFlie,EditSchedule,TransferCase,CaseChangeRequestCreate,CaseChangeRequestList,CaseChangeRequestDetail,ProjectDropdownList,CaseDropdownList,ConflictSearch,CreateCaseTag,CaseTagList,CaseTagDetail,EditCaseTag,DeleteCaseTag,CaseTagDropdownList,CaseListByTag +from .views import registration,registrationDetail,Project,Projectquerytype,ProjectDetail,EditProject,BidRegistration,BidDetail,registrationList,caseManagement,caseManagementDetail,CaseAttachmentUpload,CaseAttachmentUpdate,Uploadinvoice,InvoiceDetail,Log,LogDetail,accumulate,preFilingLinkedCases,Application,ApplicationDetail,WarehousingRegistration,WarehousingDetail,PlatformRegistration,PlatformDetail,EditPlatformDetail,DeletePlatformDetail,bulletin,BulletinDetail,EditBulletin,deleteBulletin,Lawyersdocuments,LawyersdocumentsDetail,LwaDetail,CreateSchedule,DeleteSchedule,ScheduleDetail,handleSchedule,AddRermission,DisplayRermission,DeleteRermission,EditRermission,addRole,DeleteRole,EditRole,displayRole,modifypermissions,getRolePermissions,DeleteRegistration,EditRegistration,DeleteProject,EditBid,DeleteBid,EditCase,DeleteCase,EditApplication,DeleteApplication,EditWarehousing,DeleteWarehousing,EditLawyerFlie,EditSchedule,TransferCase,CaseChangeRequestCreate,CaseChangeRequestList,CaseChangeRequestDetail,ProjectDropdownList,CaseDropdownList,ConflictSearch,CreateCaseTag,CaseTagList,CaseTagDetail,EditCaseTag,DeleteCaseTag,CaseTagDropdownList,CaseListByTag,SetCaseTags urlpatterns = [ path('register',registration.as_view(),name='register'), @@ -79,5 +79,6 @@ urlpatterns = [ path('case-tag-edit',EditCaseTag.as_view(),name='case-tag-edit'), path('case-tag-delete',DeleteCaseTag.as_view(),name='case-tag-delete'), path('case-tag-dropdown-list',CaseTagDropdownList.as_view(),name='case-tag-dropdown-list'), - path('case-list-by-tag',CaseListByTag.as_view(),name='case-list-by-tag') + path('case-list-by-tag',CaseListByTag.as_view(),name='case-list-by-tag'), + path('set-case-tags',SetCaseTags.as_view(),name='set-case-tags') ] \ No newline at end of file diff --git a/business/views.py b/business/views.py index 46dc0f0..a60625f 100644 --- a/business/views.py +++ b/business/views.py @@ -4254,6 +4254,109 @@ class CaseTagDropdownList(APIView): }, status=status.HTTP_200_OK) +class SetCaseTags(APIView): + """给案件设置标签""" + def post(self, request, *args, **kwargs): + """ + 给案件设置标签 + 支持设置多个标签,也可以清空所有标签 + """ + case_id = request.data.get('case_id') + tag_ids = request.data.get('tag_ids') # 标签ID列表(数组或逗号分隔的字符串) + + if not case_id: + return Response({ + 'status': 'error', + 'message': '缺少参数:case_id(案件ID)', + 'code': 1 + }, status=status.HTTP_400_BAD_REQUEST) + + # 验证案件是否存在 + try: + case = Case.objects.get(id=case_id, is_deleted=False) + except Case.DoesNotExist: + return Response({ + 'status': 'error', + 'message': '案件不存在或已被删除', + 'code': 1 + }, status=status.HTTP_404_NOT_FOUND) + + # 记录操作前的标签 + old_tags = list(case.tags.filter(is_deleted=False).values('id', 'name')) + old_tag_ids = [tag['id'] for tag in old_tags] + + # 处理标签ID列表 + tag_id_list = [] + if tag_ids is not None: + try: + # 支持数组或逗号分隔的字符串 + if isinstance(tag_ids, str): + if tag_ids.strip() == '': + tag_id_list = [] # 空字符串表示清空所有标签 + elif ',' in tag_ids: + tag_id_list = [int(x.strip()) for x in tag_ids.split(',') if x.strip()] + else: + tag_id_list = [int(tag_ids)] + elif isinstance(tag_ids, list): + tag_id_list = [int(x) for x in tag_ids if x] + else: + tag_id_list = [] + except (ValueError, TypeError) as e: + return Response({ + 'status': 'error', + 'message': f'标签ID格式错误:{str(e)}', + 'code': 1 + }, status=status.HTTP_400_BAD_REQUEST) + + # 验证标签是否存在 + if tag_id_list: + valid_tags = CaseTag.objects.filter(id__in=tag_id_list, is_deleted=False) + valid_tag_ids = list(valid_tags.values_list('id', flat=True)) + + # 检查是否有无效的标签ID + invalid_tag_ids = set(tag_id_list) - set(valid_tag_ids) + if invalid_tag_ids: + return Response({ + 'status': 'error', + 'message': f'以下标签ID不存在或已被删除:{", ".join(map(str, invalid_tag_ids))}', + 'code': 1 + }, status=status.HTTP_400_BAD_REQUEST) + + # 设置标签关联 + case.tags.set(valid_tags) + else: + # 清空所有标签 + case.tags.clear() + + # 获取更新后的标签信息 + new_tags = list(case.tags.filter(is_deleted=False).values('id', 'name', 'color')) + new_tag_ids = [tag['id'] for tag in new_tags] + + # 记录操作日志 + log_operation( + request=request, + operation_type='UPDATE', + module='Business', + action='设置案件标签', + target_type='Case', + target_id=case.id, + target_name=case.contract_no or f'案件ID-{case.id}', + old_data={'tag_ids': old_tag_ids, 'tags': old_tags}, + new_data={'tag_ids': new_tag_ids, 'tags': new_tags}, + remark=f'设置案件标签:案件ID {case_id},标签ID {new_tag_ids}' + ) + + return Response({ + 'message': '设置成功', + 'code': 0, + 'data': { + 'case_id': case.id, + 'tags': new_tags, + 'tag_ids': new_tag_ids + } + }, status=status.HTTP_200_OK) + + class CaseListByTag(APIView): """按标签筛选案件列表""" def post(self, request, *args, **kwargs):