From 6c4cdf9daabc4f5739cbbb1adc09d02ce7028af4 Mon Sep 17 00:00:00 2001 From: ddrwode <34234@3来 34> Date: Thu, 5 Feb 2026 15:37:51 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=A1=88=E4=BB=B6=E6=90=9C?= =?UTF-8?q?=E7=B4=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/views.py | 58 ++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 47 insertions(+), 11 deletions(-) diff --git a/business/views.py b/business/views.py index 5c542dc..02ab430 100644 --- a/business/views.py +++ b/business/views.py @@ -1774,9 +1774,8 @@ class caseManagementDetail(APIView): def post(self, request, *args, **kwargs): """ 案件管理版块展示 - :param request: - :param args: - :param kwargs: + 搜索支持按标签:传 tags(标签名称,模糊匹配)或 tag_ids(标签ID列表/逗号分隔,匹配拥有任一标签的案件),可同时使用。 + :param request: page, per_page 必填;可选 times, end_time, type, contract_no, party_name, client_name, tags, tag_ids :return: """ page = request.data.get('page') @@ -1787,7 +1786,8 @@ class caseManagementDetail(APIView): serialnumber = request.data.get('contract_no') party_name = request.data.get('party_name') client_name = request.data.get('client_name') - tags = request.data.get('tags') + tags = request.data.get('tags') # 标签名称模糊匹配 + tag_ids = request.data.get('tag_ids') # 标签ID列表,匹配拥有任一标签的案件 if not all([page, per_page]): return Response({'status': 'error', 'message': '缺少参数', 'code': 1}, status=status.HTTP_400_BAD_REQUEST) Q_obj = Q() @@ -1804,11 +1804,27 @@ class caseManagementDetail(APIView): Q_obj &= Q(party_name__icontains=party_name) if client_name: Q_obj &= Q(client_name__icontains=client_name) + # 按标签搜索:支持标签名称模糊匹配(tags) 和 标签ID列表(tag_ids),满足其一即可 + tag_id_list = [] if tags: - cas = CaseTag.objects.filter(name__icontains=tags).values_list('id', flat=True) - Q_obj &= Q(tags__in=cas) + tag_id_list.extend( + CaseTag.objects.filter(name__icontains=tags, is_deleted=False).values_list('id', flat=True) + ) + if tag_ids: + try: + if isinstance(tag_ids, str): + tag_id_list.extend([int(x.strip()) for x in tag_ids.split(',') if x.strip()]) + elif isinstance(tag_ids, list): + tag_id_list.extend([int(x) for x in tag_ids if x is not None and str(x).strip() != '']) + except (ValueError, TypeError): + pass + tag_id_list = list(set(tag_id_list)) + if tag_id_list: + Q_obj &= Q(tags__in=tag_id_list) pre = Case.objects.filter(Q_obj, is_deleted=False).order_by('-id') + if tag_id_list: + pre = pre.distinct() total = len(pre) paginator = Paginator(pre, per_page) @@ -2391,23 +2407,43 @@ class CaseDropdownList(APIView): def post(self, request, *args, **kwargs): """ 获取案件列表(用于下拉选择) - 返回案件数据,格式简洁,适合下拉列表使用 - :param request: - :param args: - :param kwargs: + 返回案件数据,格式简洁,适合下拉列表使用。 + 可选按标签筛选:传 tags(标签名称模糊)或 tag_ids(标签ID列表/逗号分隔),匹配拥有任一标签的案件。 + :param request: 可选 state, tags, tag_ids :return: """ # 可选参数:状态过滤 state_filter = request.data.get('state', None) # 可以按状态过滤,如"已通过" + tags = request.data.get('tags') # 标签名称模糊匹配 + tag_ids = request.data.get('tag_ids') # 标签ID列表 # 查询未删除的案件 Q_obj = Q(is_deleted=False) - # 如果指定了状态过滤 if state_filter: Q_obj &= Q(state=state_filter) + # 按标签筛选(可选) + tag_id_list = [] + if tags: + tag_id_list.extend( + CaseTag.objects.filter(name__icontains=tags, is_deleted=False).values_list('id', flat=True) + ) + if tag_ids: + try: + if isinstance(tag_ids, str): + tag_id_list.extend([int(x.strip()) for x in tag_ids.split(',') if x.strip()]) + elif isinstance(tag_ids, list): + tag_id_list.extend([int(x) for x in tag_ids if x is not None and str(x).strip() != '']) + except (ValueError, TypeError): + pass + tag_id_list = list(set(tag_id_list)) + if tag_id_list: + Q_obj &= Q(tags__in=tag_id_list) + cases = Case.objects.filter(Q_obj).order_by('-id') + if tag_id_list: + cases = cases.distinct() data = [] for case in cases: