1
0
forked from erp-dev/erp

feat: added plate order clone

This commit is contained in:
2025-12-16 08:42:53 +08:00
parent 4c9b8e6a42
commit 0638dd1ad3
25 changed files with 46174 additions and 8 deletions

View File

@@ -186,6 +186,7 @@ class PrintingJobListSerializer(serializers.ModelSerializer):
work_state_display = serializers.SerializerMethodField()
is_completed = serializers.BooleanField(read_only=True)
business_object_id = serializers.SerializerMethodField()
batch_advance_records = serializers.SerializerMethodField()
class Meta:
model = models.PrintingJob
@@ -194,6 +195,7 @@ class PrintingJobListSerializer(serializers.ModelSerializer):
'quantity', 'unit', 'size', 'pieces', 'description',
'work_state', 'work_state_display',
'status', 'is_completed', 'business_object_id',
'batch_advance_records',
'created_at', 'updated_at'
]
read_only_fields = ['id', 'created_at', 'updated_at', 'status', 'is_completed', 'business_object_id']
@@ -205,6 +207,17 @@ class PrintingJobListSerializer(serializers.ModelSerializer):
def get_work_state_display(self, obj):
return obj.get_work_state_display()
def get_batch_advance_records(self, obj):
"""
批量推进记录(稳定输出 key
- 如果没有批量记录:返回 []
- 仅返回与该 job 相关的批量推进审计记录(按 created_at 倒序)
"""
# 注意:这里不要链式调用 select_related/order_by否则会绕开 viewset 的 prefetch 缓存,导致 N+1 查询。
records = list(obj.batch_advance_records.all())
return PrintingJobBatchAdvanceRecordSerializer(records, many=True).data
class PrintingJobDetailSerializer(serializers.ModelSerializer):
"""印染款式明细详情序列化器"""
@@ -217,6 +230,7 @@ class PrintingJobDetailSerializer(serializers.ModelSerializer):
is_completed = serializers.BooleanField(read_only=True)
has_started = serializers.BooleanField(read_only=True)
business_object_id = serializers.SerializerMethodField()
batch_advance_records = serializers.SerializerMethodField()
class Meta:
model = models.PrintingJob
@@ -225,6 +239,7 @@ class PrintingJobDetailSerializer(serializers.ModelSerializer):
'quantity', 'unit', 'size', 'pieces', 'description',
'work_state', 'work_state_display',
'status', 'status_id', 'is_completed', 'has_started', 'business_object_id',
'batch_advance_records',
'created_at', 'updated_at'
]
read_only_fields = [
@@ -239,15 +254,22 @@ class PrintingJobDetailSerializer(serializers.ModelSerializer):
def get_work_state_display(self, obj):
return obj.get_work_state_display()
def get_batch_advance_records(self, obj):
"""见 list serializer同样稳定输出 key"""
records = list(obj.batch_advance_records.all())
return PrintingJobBatchAdvanceRecordSerializer(records, many=True).data
class PrintingJobCreateUpdateSerializer(serializers.ModelSerializer):
"""印染款式明细创建/更新序列化器"""
batch_advance_records = serializers.SerializerMethodField(read_only=True)
class Meta:
model = models.PrintingJob
fields = [
'id', 'printing_order', 'product', 'quantity', 'unit', 'size', 'pieces', 'description',
'work_state',
'batch_advance_records',
]
read_only_fields = ['id']
extra_kwargs = {
@@ -290,6 +312,43 @@ class PrintingJobCreateUpdateSerializer(serializers.ModelSerializer):
raise serializers.ValidationError(message)
return updated_instance
def get_batch_advance_records(self, obj):
"""创建/更新接口也稳定输出该 key通常为空"""
records = list(obj.batch_advance_records.all())
return PrintingJobBatchAdvanceRecordSerializer(records, many=True).data
class PrintingJobBatchAdvanceRecordSerializer(serializers.ModelSerializer):
"""印染任务批量推进记录(用于嵌入 PrintingJob 的序列化结果)"""
state_id = serializers.IntegerField(source='state.id', read_only=True)
state_name = serializers.CharField(source='state.name', read_only=True)
created_by_username = serializers.CharField(source='created_by.username', read_only=True)
created_by_name = serializers.SerializerMethodField()
class Meta:
model = models.PrintingJobBatchAdvanceRecord
fields = [
'id',
'printing_order',
'state',
'state_id',
'state_name',
'created_by',
'created_by_username',
'created_by_name',
'parameters',
'created_at',
]
read_only_fields = fields
def get_created_by_name(self, obj):
user = getattr(obj, 'created_by', None)
if not user:
return None
emp = getattr(user, 'employee', None)
return getattr(emp, 'name', None)
class PlateOrderDesignCodeMixin:
"""确保 design_code 为空时使用主键"""
@@ -320,6 +379,7 @@ class PlateOrderListSerializer(PlateOrderDesignCodeMixin, serializers.ModelSeria
process_name = serializers.SerializerMethodField()
plate_image_url = serializers.SerializerMethodField()
last_completed_state = serializers.CharField(read_only=True)
content_type_id = serializers.SerializerMethodField()
class Meta:
model = models.PlateOrder
@@ -340,7 +400,7 @@ class PlateOrderListSerializer(PlateOrderDesignCodeMixin, serializers.ModelSeria
'approval_result', 'is_ordered', 'customer_feedback', 'print_count',
'process', 'process_name',
'status', 'status_id', 'is_completed', 'has_started', 'last_completed_state',
'progress_percentage', 'business_object_id',
'progress_percentage', 'business_object_id', 'content_type_id',
'created_at', 'updated_at'
]
read_only_fields = [
@@ -364,6 +424,17 @@ class PlateOrderListSerializer(PlateOrderDesignCodeMixin, serializers.ModelSeria
return None
return None
def get_content_type_id(self, obj):
"""
返回关联流程实例business_object的 content_type_id。
- 无 business_object返回 None
- business_object 存在但未绑定关联对象:返回 None
"""
if not getattr(obj, 'business_object_id', None):
return None
return obj.business_object.content_type_id
class PlateOrderDetailSerializer(PlateOrderDesignCodeMixin, serializers.ModelSerializer):
"""开版订单详情序列化器"""