1
0
forked from erp-dev/erp

feat: added some filed to shipment serializers

This commit is contained in:
2026-04-23 17:51:48 +08:00
parent 35a03218d8
commit d4fbb2c7fe
11 changed files with 287 additions and 1 deletions

View File

@@ -62,6 +62,48 @@ def _build_nested_sales_item_context(items):
}
def _resolve_shipment_fabric(shipment: Shipment) -> str | None:
rel = getattr(shipment, "items", None)
if rel is None:
return None
first_item = rel.filter(delete_at__isnull=True).order_by("id").first()
if first_item is None or not first_item.printing_job_id:
return None
from printing.models import PrintingJob
printing_job = (
PrintingJob.objects.filter(id=first_item.printing_job_id)
.select_related("printing_order")
.first()
)
if printing_job is None or printing_job.printing_order is None:
return None
return printing_job.printing_order.fabric
def _resolve_shipment_order_description(shipment: Shipment) -> str | None:
rel = getattr(shipment, "items", None)
if rel is None:
return None
first_item = rel.filter(delete_at__isnull=True).order_by("id").first()
if first_item is None or not first_item.printing_job_id:
return None
from printing.models import PrintingJob
printing_job = (
PrintingJob.objects.filter(id=first_item.printing_job_id)
.select_related("printing_order")
.first()
)
if printing_job is None or printing_job.printing_order is None:
return None
return printing_job.printing_order.description
class ShipmentSerializer(serializers.ModelSerializer):
"""
出货单序列化器(只读,用于返回数据)
@@ -85,6 +127,8 @@ class ShipmentSerializer(serializers.ModelSerializer):
external_finished_products_count = serializers.SerializerMethodField()
merchant_id = serializers.IntegerField(source="merchant.id", read_only=True)
merchant_name = serializers.CharField(source="merchant.name", read_only=True)
fabric = serializers.SerializerMethodField()
order_description = serializers.SerializerMethodField()
delivery_id = serializers.IntegerField(read_only=True, allow_null=True)
sales_items = serializers.SerializerMethodField()
external_finished_products = serializers.SerializerMethodField()
@@ -97,6 +141,8 @@ class ShipmentSerializer(serializers.ModelSerializer):
"merchant_name",
"customer",
"customer_name",
"fabric",
"order_description",
"shipment_date",
"address",
"contact_name",
@@ -132,9 +178,15 @@ class ShipmentSerializer(serializers.ModelSerializer):
return obj.created_by.username
return None
def get_fabric(self, obj):
return _resolve_shipment_fabric(obj)
def get_items_count(self, obj):
return obj.items.filter(delete_at__isnull=True).count()
def get_order_description(self, obj):
return _resolve_shipment_order_description(obj)
def get_cancelled_by_name(self, obj):
if obj.cancelled_by:
employee = getattr(obj.cancelled_by, "employee", None)
@@ -494,6 +546,8 @@ class ShipmentSalesItemCustomerSerializer(serializers.Serializer):
class ShipmentDeliveryShipmentSummarySerializer(serializers.ModelSerializer):
customer_name = serializers.CharField(source="customer.name", read_only=True)
status_display = serializers.CharField(source="get_status_display", read_only=True)
fabric = serializers.SerializerMethodField()
order_description = serializers.SerializerMethodField()
delivery_id = serializers.IntegerField(read_only=True, allow_null=True)
class Meta:
@@ -502,6 +556,8 @@ class ShipmentDeliveryShipmentSummarySerializer(serializers.ModelSerializer):
"id",
"customer",
"customer_name",
"fabric",
"order_description",
"shipment_date",
"status",
"status_display",
@@ -510,6 +566,12 @@ class ShipmentDeliveryShipmentSummarySerializer(serializers.ModelSerializer):
]
read_only_fields = fields
def get_fabric(self, obj):
return _resolve_shipment_fabric(obj)
def get_order_description(self, obj):
return _resolve_shipment_order_description(obj)
class ShipmentDeliverySerializer(serializers.ModelSerializer):
status_display = serializers.CharField(source="get_status_display", read_only=True)
@@ -542,6 +604,7 @@ class ShipmentDeliverySerializer(serializers.ModelSerializer):
"vehicle_capacity",
"remark",
"internal_remark",
"shipment_order_ids",
"status",
"status_display",
"started_at",
@@ -617,6 +680,12 @@ class ShipmentDeliveryCreateSerializer(serializers.Serializer):
allow_blank=True,
help_text="内部备注(可选)",
)
shipment_order_ids = serializers.JSONField(
required=False,
allow_null=True,
default=list,
help_text="前端自管的出货单顺序 ID 数组(可选,可为 null",
)
shipments = serializers.ListField(
child=serializers.IntegerField(),
required=False,
@@ -627,6 +696,11 @@ class ShipmentDeliveryCreateSerializer(serializers.Serializer):
def validate_shipments(self, value):
return list(dict.fromkeys(value)) if value else []
def validate_shipment_order_ids(self, value):
if value is not None and not isinstance(value, list):
raise serializers.ValidationError("shipment_order_ids 必须是数组或 null")
return value
class ShipmentDeliveryUpdateSerializer(serializers.Serializer):
driver_name = serializers.CharField(
@@ -647,6 +721,11 @@ class ShipmentDeliveryUpdateSerializer(serializers.Serializer):
internal_remark = serializers.CharField(
max_length=200, required=False, allow_blank=True, help_text="内部备注(可选)"
)
shipment_order_ids = serializers.JSONField(
required=False,
allow_null=True,
help_text="前端自管的出货单顺序 ID 数组(可选,可为 null",
)
shipments = serializers.ListField(
child=serializers.IntegerField(),
required=False,
@@ -656,6 +735,11 @@ class ShipmentDeliveryUpdateSerializer(serializers.Serializer):
def validate_shipments(self, value):
return list(dict.fromkeys(value)) if value else []
def validate_shipment_order_ids(self, value):
if value is not None and not isinstance(value, list):
raise serializers.ValidationError("shipment_order_ids 必须是数组或 null")
return value
class ShipmentDeliveryStatusUpdateSerializer(serializers.Serializer):
status = serializers.ChoiceField(