From 3dc7560434c5608c73e6fe9a94954fabcde237e5 Mon Sep 17 00:00:00 2001 From: colaftc Date: Wed, 31 Dec 2025 21:55:43 +0800 Subject: [PATCH] feat: added search support fields for plate order query api --- api_v1/views/printing/test_plate_order_api.py | 88 +++++++++++++++++++ api_v1/views/printing/views.py | 17 +++- 2 files changed, 103 insertions(+), 2 deletions(-) diff --git a/api_v1/views/printing/test_plate_order_api.py b/api_v1/views/printing/test_plate_order_api.py index d976b77..da58408 100644 --- a/api_v1/views/printing/test_plate_order_api.py +++ b/api_v1/views/printing/test_plate_order_api.py @@ -579,6 +579,94 @@ class PlateOrderAPITestCase(TestCase): else: self.assertEqual(len(response.data), 1) self.assertIn('花朵', response.data[0]['style_name']) + + def test_search_by_plate_notes(self): + """测试按打版注意事项搜索""" + printing_models.PlateOrder.objects.create( + customer=self.customer, + design_code='DESIGN001', + plate_notes='注意颜色偏差控制在5%以内', + ) + printing_models.PlateOrder.objects.create( + customer=self.customer, + design_code='DESIGN002', + plate_notes='普通要求', + ) + + response = self.client.get('/api/v1/plate-orders/?search=颜色偏差') + self.assertEqual(response.status_code, status.HTTP_200_OK) + if isinstance(response.data, dict): + self.assertEqual(response.data['count'], 1) + self.assertIn('颜色偏差', response.data['results'][0]['plate_notes']) + else: + self.assertEqual(len(response.data), 1) + self.assertIn('颜色偏差', response.data[0]['plate_notes']) + + def test_search_by_reprint_reason(self): + """测试按复版原因搜索""" + printing_models.PlateOrder.objects.create( + customer=self.customer, + design_code='DESIGN001', + reprint_reason='客户要求更换底色为深蓝', + ) + printing_models.PlateOrder.objects.create( + customer=self.customer, + design_code='DESIGN002', + reprint_reason='正常复版', + ) + + response = self.client.get('/api/v1/plate-orders/?search=深蓝') + self.assertEqual(response.status_code, status.HTTP_200_OK) + if isinstance(response.data, dict): + self.assertEqual(response.data['count'], 1) + self.assertIn('深蓝', response.data['results'][0]['reprint_reason']) + else: + self.assertEqual(len(response.data), 1) + self.assertIn('深蓝', response.data[0]['reprint_reason']) + + def test_search_by_image_name(self): + """测试按图片名称搜索""" + printing_models.PlateOrder.objects.create( + customer=self.customer, + design_code='DESIGN001', + image_name='夏季新款碎花图案', + ) + printing_models.PlateOrder.objects.create( + customer=self.customer, + design_code='DESIGN002', + image_name='冬季格纹', + ) + + response = self.client.get('/api/v1/plate-orders/?search=碎花') + self.assertEqual(response.status_code, status.HTTP_200_OK) + if isinstance(response.data, dict): + self.assertEqual(response.data['count'], 1) + self.assertIn('碎花', response.data['results'][0]['image_name']) + else: + self.assertEqual(len(response.data), 1) + self.assertIn('碎花', response.data[0]['image_name']) + + def test_search_by_default_address(self): + """测试按默认地址搜索""" + printing_models.PlateOrder.objects.create( + customer=self.customer, + design_code='DESIGN001', + default_address='广东省深圳市南山区科技园', + ) + printing_models.PlateOrder.objects.create( + customer=self.customer, + design_code='DESIGN002', + default_address='浙江省杭州市西湖区', + ) + + response = self.client.get('/api/v1/plate-orders/?search=南山区') + self.assertEqual(response.status_code, status.HTTP_200_OK) + if isinstance(response.data, dict): + self.assertEqual(response.data['count'], 1) + self.assertIn('南山区', response.data['results'][0]['default_address']) + else: + self.assertEqual(len(response.data), 1) + self.assertIn('南山区', response.data[0]['default_address']) def test_ordering_by_created_at(self): """测试按创建时间排序""" diff --git a/api_v1/views/printing/views.py b/api_v1/views/printing/views.py index 7f8ba3b..706b5ef 100644 --- a/api_v1/views/printing/views.py +++ b/api_v1/views/printing/views.py @@ -657,8 +657,21 @@ class PlateOrderViewSet(LimitedModelViewSet): parser_classes = [MultiPartParser, FormParser, JSONParser] # 支持文件上传 filter_backends = [DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter] filterset_class = PlateOrderFilterSet - # design_code_normalized: 当 design_code 为空时用 id 兜底,便于搜索数字编号 - search_fields = ['design_code', 'design_code_normalized', 'style_name', 'customer__name', 'fabric'] + # search_fields 说明(模糊搜索支持的字段): + # - design_code: 设计编号 + # - design_code_normalized: 设计编号兜底(为空时使用主键 ID,通过 get_queryset 注解) + # - style_name: 款号名称 + # - customer__name: 客户名称(跨表) + # - fabric: 布料 + # - plate_notes: 打版注意事项 + # - reprint_reason: 复版原因 + # - image_name: 图片名称 + # - default_address: 默认地址 + # 待添加:area, customer_feedback, fabric_source, width 等 + search_fields = [ + 'design_code', 'design_code_normalized', 'style_name', 'customer__name', 'fabric', + 'plate_notes', 'reprint_reason', 'image_name', 'default_address', + ] ordering_fields = [ 'id', 'created_at', 'updated_at', 'plate_date', 'required_completion_date', 'completion_date',