1
0
forked from erp-dev/erp

feat: added new api for query batch_advance_records

This commit is contained in:
2026-01-07 15:06:55 +08:00
parent 4566c2a2c8
commit 5b07332015
5 changed files with 400 additions and 0 deletions

View File

@@ -13,6 +13,7 @@ from .printing import (
PlateOrderByProcessView,
PlateOrderByStateStatusView,
PlateOrderBatchUpdateView,
PrintingOrderBatchAdvanceRecordsView,
)
from .stateflow import BusinessObjectCloneView
@@ -28,6 +29,7 @@ __all__ = [
'PlateOrderByProcessView',
'PlateOrderByStateStatusView',
'PlateOrderBatchUpdateView',
'PrintingOrderBatchAdvanceRecordsView',
'BusinessObjectCloneView',
]

View File

@@ -1345,3 +1345,116 @@ class PlateOrderBatchUpdateView(APIView):
"plate_order_ids": found_ids,
}
)
class BatchAdvanceRecordSerializer(serializers.ModelSerializer):
"""批量推进记录序列化器"""
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, allow_null=True)
created_by_name = serializers.SerializerMethodField()
printing_job_ids = serializers.SerializerMethodField()
printing_job_count = serializers.SerializerMethodField()
class Meta:
model = printing_models.PrintingJobBatchAdvanceRecord
fields = [
'id',
'printing_order',
'state',
'state_id',
'state_name',
'created_by',
'created_by_username',
'created_by_name',
'parameters',
'printing_job_ids',
'printing_job_count',
'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)
def get_printing_job_ids(self, obj):
"""获取涉及的印染明细 ID 列表"""
# 使用预取的数据避免 N+1
if hasattr(obj, '_prefetched_objects_cache') and 'printing_jobs' in obj._prefetched_objects_cache:
return [job.id for job in obj.printing_jobs.all()]
return list(obj.printing_jobs.values_list('id', flat=True))
def get_printing_job_count(self, obj):
"""获取涉及的印染明细数量"""
if hasattr(obj, '_prefetched_objects_cache') and 'printing_jobs' in obj._prefetched_objects_cache:
return len(obj.printing_jobs.all())
return obj.printing_jobs.count()
class PrintingOrderBatchAdvanceRecordsView(APIView):
"""
获取印染订单的批量推进记录
根据 printing_order_id 查询该订单下所有的批量推进审计记录。
GET /api/v2/printing-orders/{printing_order_id}/batch-advance-records/
响应示例:
{
"printing_order_id": 55,
"records": [
{
"id": 9,
"printing_order": 55,
"state": 7,
"state_id": 7,
"state_name": "染色",
"created_by": 1001,
"created_by_username": "factory_user",
"created_by_name": "张三",
"parameters": {"temperature": "25.5"},
"printing_job_ids": [101, 102, 103],
"printing_job_count": 3,
"created_at": "2025-12-14T10:00:00+08:00"
}
],
"total_count": 1
}
"""
permission_classes = [permissions.IsAuthenticated]
def get(self, request, printing_order_id):
# 验证订单是否存在
try:
printing_order = printing_models.PrintingOrder.objects.get(id=printing_order_id)
except printing_models.PrintingOrder.DoesNotExist:
return Response(
{'error': f'未找到 ID 为 {printing_order_id} 的印染订单'},
status=status.HTTP_404_NOT_FOUND
)
# 查询批量推进记录,按创建时间倒序
records = printing_models.PrintingJobBatchAdvanceRecord.objects.filter(
printing_order_id=printing_order_id
).select_related(
'state',
'created_by',
'created_by__employee',
).prefetch_related(
'printing_jobs',
).order_by('-created_at')
serializer = BatchAdvanceRecordSerializer(records, many=True)
return Response({
'printing_order_id': printing_order_id,
'records': serializer.data,
'total_count': records.count(),
})