1
0
forked from erp-dev/erp

feat: added plate_at_from and plate_at_to in plate order query api

This commit is contained in:
2025-12-31 22:18:45 +08:00
parent 3dc7560434
commit e4b7543c09
2 changed files with 111 additions and 2 deletions

View File

@@ -532,6 +532,110 @@ class PlateOrderAPITestCase(TestCase):
self.assertEqual(len(response.data), 1) self.assertEqual(len(response.data), 1)
self.assertEqual(response.data[0]['is_invalid'], False) self.assertEqual(response.data[0]['is_invalid'], False)
def test_filter_by_plate_at_from(self):
"""测试按开版时间起始筛选(带时分秒)"""
from django.utils import timezone
from datetime import timedelta
from urllib.parse import quote
now = timezone.now()
# 创建两个订单,分别在不同时间点
order1 = printing_models.PlateOrder.objects.create(
customer=self.customer,
design_code='DESIGN001',
plate_type='圆网',
plate_date=now - timedelta(hours=2),
)
order2 = printing_models.PlateOrder.objects.create(
customer=self.customer,
design_code='DESIGN002',
plate_type='平网',
plate_date=now,
)
# 筛选 1 小时前之后的订单(应该只返回 order2
one_hour_ago = quote((now - timedelta(hours=1)).isoformat())
response = self.client.get(f'/api/v1/plate-orders/?plate_at_from={one_hour_ago}')
self.assertEqual(response.status_code, status.HTTP_200_OK)
if isinstance(response.data, dict):
ids = [r['id'] for r in response.data['results']]
else:
ids = [r['id'] for r in response.data]
self.assertIn(order2.id, ids)
self.assertNotIn(order1.id, ids)
def test_filter_by_plate_at_to(self):
"""测试按开版时间结束筛选(带时分秒)"""
from django.utils import timezone
from datetime import timedelta
from urllib.parse import quote
now = timezone.now()
# 创建两个订单,分别在不同时间点
order1 = printing_models.PlateOrder.objects.create(
customer=self.customer,
design_code='DESIGN001',
plate_type='圆网',
plate_date=now - timedelta(hours=2),
)
order2 = printing_models.PlateOrder.objects.create(
customer=self.customer,
design_code='DESIGN002',
plate_type='平网',
plate_date=now,
)
# 筛选 1 小时前之前的订单(应该只返回 order1
one_hour_ago = quote((now - timedelta(hours=1)).isoformat())
response = self.client.get(f'/api/v1/plate-orders/?plate_at_to={one_hour_ago}')
self.assertEqual(response.status_code, status.HTTP_200_OK)
if isinstance(response.data, dict):
ids = [r['id'] for r in response.data['results']]
else:
ids = [r['id'] for r in response.data]
self.assertIn(order1.id, ids)
self.assertNotIn(order2.id, ids)
def test_filter_by_plate_at_range(self):
"""测试按开版时间范围筛选(带时分秒)"""
from django.utils import timezone
from datetime import timedelta
from urllib.parse import quote
now = timezone.now()
# 创建三个订单,分别在不同时间点
order1 = printing_models.PlateOrder.objects.create(
customer=self.customer,
design_code='DESIGN001',
plate_type='圆网',
plate_date=now - timedelta(hours=3),
)
order2 = printing_models.PlateOrder.objects.create(
customer=self.customer,
design_code='DESIGN002',
plate_type='平网',
plate_date=now - timedelta(hours=1),
)
order3 = printing_models.PlateOrder.objects.create(
customer=self.customer,
design_code='DESIGN003',
plate_type='圆网',
plate_date=now + timedelta(hours=1),
)
# 筛选 2 小时前到现在之间的订单(应该只返回 order2
two_hours_ago = quote((now - timedelta(hours=2)).isoformat())
now_iso = quote(now.isoformat())
response = self.client.get(f'/api/v1/plate-orders/?plate_at_from={two_hours_ago}&plate_at_to={now_iso}')
self.assertEqual(response.status_code, status.HTTP_200_OK)
if isinstance(response.data, dict):
ids = [r['id'] for r in response.data['results']]
else:
ids = [r['id'] for r in response.data]
self.assertIn(order2.id, ids)
self.assertNotIn(order1.id, ids)
self.assertNotIn(order3.id, ids)
def test_search_by_design_code(self): def test_search_by_design_code(self):
"""测试按设计编号搜索""" """测试按设计编号搜索"""
printing_models.PlateOrder.objects.create( printing_models.PlateOrder.objects.create(

View File

@@ -564,6 +564,9 @@ class PlateOrderFilterSet(django_filters.FilterSet):
style_name = django_filters.CharFilter(lookup_expr='icontains') style_name = django_filters.CharFilter(lookup_expr='icontains')
plate_date_from = django_filters.DateFilter(field_name='plate_date', lookup_expr='gte') plate_date_from = django_filters.DateFilter(field_name='plate_date', lookup_expr='gte')
plate_date_to = django_filters.DateFilter(field_name='plate_date', method='filter_plate_date_to') plate_date_to = django_filters.DateFilter(field_name='plate_date', method='filter_plate_date_to')
# plate_at_from / plate_at_to: 支持带时分秒的精确时间筛选ISO 8601 格式)
plate_at_from = IsoDateTimeFilter(field_name='plate_date', lookup_expr='gte')
plate_at_to = IsoDateTimeFilter(field_name='plate_date', lookup_expr='lte')
required_completion_date_from = IsoDateTimeFilter(field_name='required_completion_date', lookup_expr='gte') required_completion_date_from = IsoDateTimeFilter(field_name='required_completion_date', lookup_expr='gte')
required_completion_date_to = IsoDateTimeFilter(field_name='required_completion_date', lookup_expr='lte') required_completion_date_to = IsoDateTimeFilter(field_name='required_completion_date', lookup_expr='lte')
created_date_from = django_filters.DateFilter(field_name='created_at', lookup_expr='gte') created_date_from = django_filters.DateFilter(field_name='created_at', lookup_expr='gte')
@@ -643,8 +646,10 @@ class PlateOrderViewSet(LimitedModelViewSet):
- is_mark_frame: 是否打样架true/false - is_mark_frame: 是否打样架true/false
- fabric: 面料(模糊查询) - fabric: 面料(模糊查询)
- style_name: 款式名称(模糊查询) - style_name: 款式名称(模糊查询)
- plate_date_from: 开版日期起始 - plate_date_from: 开版日期起始(仅日期)
- plate_date_to: 开版日期结束 - plate_date_to: 开版日期结束(仅日期,包含整天)
- plate_at_from: 开版时间起始ISO 8601 格式,含时分秒,如 2024-01-01T08:00:00
- plate_at_to: 开版时间结束ISO 8601 格式,含时分秒)
- required_completion_date_from: 要求完成时间起始(含时分秒) - required_completion_date_from: 要求完成时间起始(含时分秒)
- required_completion_date_to: 要求完成时间结束 - required_completion_date_to: 要求完成时间结束
- created_date_from: 创建日期起始 - created_date_from: 创建日期起始