forked from erp-dev/erp
feat: app verion && some field modify (printing & shipment)
This commit is contained in:
@@ -33,6 +33,30 @@ def _build_absolute_media_url(url: str | None, request):
|
||||
return build_public_media_url(url, request=request)
|
||||
|
||||
|
||||
def _resolve_printing_order_external_first_record_field(obj, field_name):
|
||||
if not getattr(obj, 'external_order_id', None):
|
||||
return None
|
||||
try:
|
||||
raw = obj.external_raw or {}
|
||||
first_record = raw.get('first_record') or {}
|
||||
value = first_record.get(field_name)
|
||||
except AttributeError:
|
||||
return None
|
||||
value = str(value or '').strip()
|
||||
return value or None
|
||||
|
||||
|
||||
def resolve_printing_order_bianhao_kd(obj):
|
||||
return _resolve_printing_order_external_first_record_field(obj, 'BianHaoKD')
|
||||
|
||||
|
||||
def resolve_printing_order_kd_riqi(obj):
|
||||
value = getattr(obj, 'kd_riqi', None)
|
||||
if value is not None:
|
||||
return serializers.DateTimeField().to_representation(value)
|
||||
return _resolve_printing_order_external_first_record_field(obj, 'KdRiQi')
|
||||
|
||||
|
||||
def _serialize_plate_images(raw_value, request):
|
||||
if not raw_value:
|
||||
return []
|
||||
@@ -163,6 +187,8 @@ class PrintingOrderListSerializer(serializers.ModelSerializer):
|
||||
external_customer_id = serializers.CharField(read_only=True)
|
||||
external_customer_name = serializers.CharField(read_only=True)
|
||||
external_employee_name = serializers.CharField(read_only=True)
|
||||
bianhao_kd = serializers.SerializerMethodField()
|
||||
kd_riqi = serializers.SerializerMethodField()
|
||||
|
||||
class Meta:
|
||||
model = models.PrintingOrder
|
||||
@@ -172,7 +198,7 @@ class PrintingOrderListSerializer(serializers.ModelSerializer):
|
||||
'is_fabric_received', 'outgoing_date', 'is_invalid', 'new_curve',
|
||||
'process', 'process_name', 'progress', 'position', 'print_count',
|
||||
'jobs_status_summary', 'jobs_last_status_summary',
|
||||
'external_order_id', 'external_customer_id', 'external_customer_name', 'external_employee_name',
|
||||
'external_order_id', 'bianhao_kd', 'kd_riqi', 'external_customer_id', 'external_customer_name', 'external_employee_name',
|
||||
'created_by', 'created_by_name',
|
||||
'created_at', 'updated_at',
|
||||
]
|
||||
@@ -260,6 +286,12 @@ class PrintingOrderListSerializer(serializers.ModelSerializer):
|
||||
emp = getattr(user, 'employee', None)
|
||||
return getattr(emp, 'name', None)
|
||||
|
||||
def get_bianhao_kd(self, obj):
|
||||
return resolve_printing_order_bianhao_kd(obj)
|
||||
|
||||
def get_kd_riqi(self, obj):
|
||||
return resolve_printing_order_kd_riqi(obj)
|
||||
|
||||
|
||||
class PrintingOrderDetailSerializer(serializers.ModelSerializer):
|
||||
"""印染订单详情序列化器"""
|
||||
@@ -274,6 +306,8 @@ class PrintingOrderDetailSerializer(serializers.ModelSerializer):
|
||||
external_customer_id = serializers.CharField(read_only=True)
|
||||
external_customer_name = serializers.CharField(read_only=True)
|
||||
external_employee_name = serializers.CharField(read_only=True)
|
||||
bianhao_kd = serializers.SerializerMethodField()
|
||||
kd_riqi = serializers.SerializerMethodField()
|
||||
|
||||
class Meta:
|
||||
model = models.PrintingOrder
|
||||
@@ -283,7 +317,7 @@ class PrintingOrderDetailSerializer(serializers.ModelSerializer):
|
||||
'is_fabric_received', 'craft', 'description', 'outgoing_date',
|
||||
'curve', 'new_curve', 'position', 'created_by_name',
|
||||
'printing_warn', 'rolling_warn', 'production_warn',
|
||||
'external_order_id', 'external_customer_id', 'external_customer_name', 'external_employee_name',
|
||||
'external_order_id', 'bianhao_kd', 'kd_riqi', 'external_customer_id', 'external_customer_name', 'external_employee_name',
|
||||
'is_invalid', 'process', 'process_name', 'progress', 'print_count',
|
||||
'created_at', 'updated_at'
|
||||
]
|
||||
@@ -297,6 +331,12 @@ class PrintingOrderDetailSerializer(serializers.ModelSerializer):
|
||||
emp = getattr(user, 'employee', None)
|
||||
return getattr(emp, 'name', None)
|
||||
|
||||
def get_bianhao_kd(self, obj):
|
||||
return resolve_printing_order_bianhao_kd(obj)
|
||||
|
||||
def get_kd_riqi(self, obj):
|
||||
return resolve_printing_order_kd_riqi(obj)
|
||||
|
||||
|
||||
class PrintingOrderCreateUpdateSerializer(serializers.ModelSerializer):
|
||||
"""印染订单创建/更新序列化器"""
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
"""
|
||||
PrintingOrder API 测试
|
||||
"""
|
||||
from datetime import datetime
|
||||
from datetime import datetime, timezone as dt_timezone
|
||||
from django.test import TestCase
|
||||
from django.db import connection
|
||||
from django.conf import settings
|
||||
@@ -260,6 +260,12 @@ class PrintingOrderAPITestCase(TestCase):
|
||||
external_customer_id='KH00991',
|
||||
external_customer_name='李泽柔',
|
||||
external_employee_name='丽容',
|
||||
external_raw={
|
||||
'first_record': {
|
||||
'BianHaoKD': '7.07',
|
||||
'KdRiQi': '2026-07-06T21:48:58Z',
|
||||
}
|
||||
},
|
||||
)
|
||||
printing_models.PrintingOrder.objects.create(
|
||||
merchant=self.merchant,
|
||||
@@ -277,11 +283,65 @@ class PrintingOrderAPITestCase(TestCase):
|
||||
self.assertEqual(item['external_customer_id'], 'KH00991')
|
||||
self.assertEqual(item['external_customer_name'], '李泽柔')
|
||||
self.assertEqual(item['external_employee_name'], '丽容')
|
||||
self.assertEqual(item['bianhao_kd'], '7.07')
|
||||
self.assertEqual(item['kd_riqi'], '2026-07-06T21:48:58Z')
|
||||
|
||||
detail = self.client.get(f'/api/v1/printing-orders/{order1.id}/')
|
||||
self.assertEqual(detail.status_code, status.HTTP_200_OK)
|
||||
self.assertEqual(detail.data['external_order_id'], 'KD20410611')
|
||||
self.assertEqual(detail.data['external_customer_id'], 'KH00991')
|
||||
self.assertEqual(detail.data['bianhao_kd'], '7.07')
|
||||
self.assertEqual(detail.data['kd_riqi'], '2026-07-06T21:48:58Z')
|
||||
|
||||
def test_bianhao_kd_returns_null_without_external_order_id(self):
|
||||
order = printing_models.PrintingOrder.objects.create(
|
||||
merchant=self.merchant,
|
||||
customer=self.customer,
|
||||
fabric='普通订单',
|
||||
width='150cm',
|
||||
external_raw={'first_record': {'BianHaoKD': '7.07'}},
|
||||
)
|
||||
|
||||
response = self.client.get(f'/api/v1/printing-orders/{order.id}/')
|
||||
|
||||
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
||||
self.assertIsNone(response.data['bianhao_kd'])
|
||||
self.assertIsNone(response.data['kd_riqi'])
|
||||
|
||||
def test_filter_and_order_by_kd_riqi(self):
|
||||
older = printing_models.PrintingOrder.objects.create(
|
||||
merchant=self.merchant,
|
||||
customer=self.customer,
|
||||
fabric='旧开单时间',
|
||||
width='150cm',
|
||||
external_order_id='KD-OLDER',
|
||||
kd_riqi=datetime(2026, 7, 1, 10, 0, tzinfo=dt_timezone.utc),
|
||||
)
|
||||
newer = printing_models.PrintingOrder.objects.create(
|
||||
merchant=self.merchant,
|
||||
customer=self.customer,
|
||||
fabric='新开单时间',
|
||||
width='150cm',
|
||||
external_order_id='KD-NEWER',
|
||||
kd_riqi=datetime(2026, 7, 2, 10, 0, tzinfo=dt_timezone.utc),
|
||||
)
|
||||
printing_models.PrintingOrder.objects.create(
|
||||
merchant=self.merchant,
|
||||
customer=self.customer,
|
||||
fabric='范围外开单时间',
|
||||
width='150cm',
|
||||
external_order_id='KD-OUTSIDE',
|
||||
kd_riqi=datetime(2026, 7, 3, 10, 0, tzinfo=dt_timezone.utc),
|
||||
)
|
||||
|
||||
response = self.client.get(
|
||||
'/api/v1/printing-orders/?kd_riqi_from=2026-07-01&kd_riqi_to=2026-07-02&ordering=kd_riqi'
|
||||
)
|
||||
|
||||
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
||||
result_ids = [item['id'] for item in response.data['results']]
|
||||
self.assertEqual(result_ids, [older.id, newer.id])
|
||||
self.assertEqual(response.data['results'][0]['kd_riqi'], '2026-07-01T18:00:00+08:00')
|
||||
|
||||
def test_retrieve_printing_order(self):
|
||||
"""测试获取订单详情"""
|
||||
|
||||
@@ -90,6 +90,8 @@ class PrintingOrderFilterSet(django_filters.FilterSet):
|
||||
area = django_filters.CharFilter(lookup_expr="icontains")
|
||||
outgoing_date_from = django_filters.CharFilter(method="filter_outgoing_date_from")
|
||||
outgoing_date_to = django_filters.CharFilter(method="filter_outgoing_date_to")
|
||||
kd_riqi_from = django_filters.CharFilter(method="filter_kd_riqi_from")
|
||||
kd_riqi_to = django_filters.CharFilter(method="filter_kd_riqi_to")
|
||||
created_date_from = django_filters.DateFilter(
|
||||
field_name="created_at", lookup_expr="gte"
|
||||
)
|
||||
@@ -196,6 +198,21 @@ class PrintingOrderFilterSet(django_filters.FilterSet):
|
||||
# 日期时间:按“<=”包含到秒
|
||||
return queryset.filter(outgoing_date__lte=dt)
|
||||
|
||||
def filter_kd_riqi_from(self, queryset, name, value):
|
||||
dt, _has_time = self._parse_date_or_datetime(value)
|
||||
if dt is None:
|
||||
raise ValidationError("kd_riqi_from 必须是日期或日期时间")
|
||||
return queryset.filter(kd_riqi__gte=dt)
|
||||
|
||||
def filter_kd_riqi_to(self, queryset, name, value):
|
||||
dt, has_time = self._parse_date_or_datetime(value)
|
||||
if dt is None:
|
||||
raise ValidationError("kd_riqi_to 必须是日期或日期时间")
|
||||
|
||||
if not has_time:
|
||||
return queryset.filter(kd_riqi__lt=dt + timedelta(days=1))
|
||||
return queryset.filter(kd_riqi__lte=dt)
|
||||
|
||||
def filter_created_date_to(self, queryset, name, value):
|
||||
"""
|
||||
过滤 created_at <= 指定日期的 23:59:59.999999
|
||||
@@ -234,6 +251,8 @@ class PrintingOrderViewSet(CustomerVisibilityFilterMixin, LimitedModelViewSet):
|
||||
- area: 地区(模糊查询)
|
||||
- outgoing_date_from: 出货日期起始
|
||||
- outgoing_date_to: 出货日期结束
|
||||
- kd_riqi_from: 外部开单日期时间起始
|
||||
- kd_riqi_to: 外部开单日期时间结束
|
||||
- created_date_from: 创建日期起始
|
||||
- created_date_to: 创建日期结束
|
||||
- search: 全文搜索(客户名称、面料、地区、工艺)
|
||||
@@ -266,6 +285,7 @@ class PrintingOrderViewSet(CustomerVisibilityFilterMixin, LimitedModelViewSet):
|
||||
"created_at",
|
||||
"updated_at",
|
||||
"outgoing_date",
|
||||
"kd_riqi",
|
||||
"is_urgent",
|
||||
"is_fabric_received",
|
||||
"is_invalid",
|
||||
|
||||
Reference in New Issue
Block a user