forked from erp-dev/erp
feat: added plate order clone
This commit is contained in:
@@ -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):
|
||||
"""开版订单详情序列化器"""
|
||||
|
||||
Reference in New Issue
Block a user