From bbe40395177e319357bd0fb4f6f5cced8b9e35d5 Mon Sep 17 00:00:00 2001 From: colaftc Date: Mon, 12 Jan 2026 13:15:41 +0800 Subject: [PATCH] fix --- api_v1/views/printing/serializers.py | 28 +++++++++++++++++++++++++++- api_v1/views/printing/views.py | 4 +++- docs/2026-01-11_summary.md | 24 ++++++++++++++++++++++++ 3 files changed, 54 insertions(+), 2 deletions(-) diff --git a/api_v1/views/printing/serializers.py b/api_v1/views/printing/serializers.py index 59ff160..d07da7a 100644 --- a/api_v1/views/printing/serializers.py +++ b/api_v1/views/printing/serializers.py @@ -138,6 +138,7 @@ class PrintingOrderListSerializer(serializers.ModelSerializer): process_name = serializers.CharField(source='process.name', read_only=True) progress = serializers.IntegerField(read_only=True) jobs_status_summary = serializers.SerializerMethodField() + jobs_last_status_summary = serializers.SerializerMethodField() created_by = serializers.IntegerField(source='created_by_id', read_only=True) created_by_name = serializers.SerializerMethodField() @@ -148,7 +149,7 @@ class PrintingOrderListSerializer(serializers.ModelSerializer): 'fabric', 'width', 'is_urgent', 'area', 'address', 'curve', 'is_fabric_received', 'outgoing_date', 'is_invalid', 'new_curve', 'process', 'process_name', 'progress', 'position', 'print_count', - 'jobs_status_summary', + 'jobs_status_summary', 'jobs_last_status_summary', 'created_by', 'created_by_name', 'created_at', 'updated_at', ] @@ -181,6 +182,31 @@ class PrintingOrderListSerializer(serializers.ModelSerializer): for (name, sid), count in status_counter.items() ] + def get_jobs_last_status_summary(self, obj): + """ + 返回订单下所有 PrintingJob 按最后完成状态分组的数量汇总 + + 返回格式: [{"state_name": "进度一", "count": 3}, ...] + - state_name: 最后完成的状态名称(未开始时为空字符串) + - count: 该状态下的 job 数量 + """ + # 使用预取的 printing_jobs(避免 N+1) + jobs = getattr(obj, '_prefetched_objects_cache', {}).get('printing_jobs') or obj.printing_jobs.all() + + from collections import Counter + status_counter = Counter() + + for job in jobs: + # 获取 job 的最后完成状态名称 + last_completed = job.last_completed_state # 调用 @property,未开始时返回空字符串 + status_counter[last_completed] += 1 + + # 转换为列表格式 + return [ + {'state_name': name, 'count': count} + for name, count in status_counter.items() + ] + def get_created_by_name(self, obj): """获取创建人名称(员工姓名)""" user = getattr(obj, 'created_by', None) diff --git a/api_v1/views/printing/views.py b/api_v1/views/printing/views.py index e08f510..9a32a30 100644 --- a/api_v1/views/printing/views.py +++ b/api_v1/views/printing/views.py @@ -125,8 +125,10 @@ class PrintingOrderViewSet(LimitedModelViewSet): - ordering: 排序字段 返回字段说明: - - jobs_status_summary: 订单下所有印染任务按当前状态分组的数量汇总 + - jobs_status_summary: 订单下所有印染任务按下一待执行状态分组的数量汇总 格式: [{"state_name": "进度一", "state_id": 1, "count": 3}, ...] + - jobs_last_status_summary: 订单下所有印染任务按最后完成状态分组的数量汇总 + 格式: [{"state_name": "进度一", "count": 3}, ...] """ queryset = models.PrintingOrder.objects.all() permission_classes = [DjangoModelPermissions] diff --git a/docs/2026-01-11_summary.md b/docs/2026-01-11_summary.md index 29ffc09..e606e3f 100644 --- a/docs/2026-01-11_summary.md +++ b/docs/2026-01-11_summary.md @@ -64,6 +64,30 @@ MIDDLEWARE = [ - 支持按方法、响应状态码、时间过滤 - 所有字段只读,禁止添加和修改(只允许查看和删除) +### 7. 新增 `jobs_last_status_summary` 字段 + +在 `PrintingOrderListSerializer` 中新增字段,用于按最后完成状态分组统计。 + +- **修改文件**: `api_v1/views/printing/serializers.py` +- **修改文件**: `api_v1/views/printing/views.py`(更新文档注释) + +返回格式: +```json +{ + "jobs_status_summary": [ + {"state_name": "进度二", "state_id": 2, "count": 3} + ], + "jobs_last_status_summary": [ + {"state_name": "进度一", "count": 2}, + {"state_name": "", "count": 1} + ] +} +``` + +字段说明: +- `jobs_status_summary`: 按下一待执行状态分组 +- `jobs_last_status_summary`: 按最后完成状态分组(未开始时 `state_name` 为空字符串) + ## 待办事项 - [ ] 执行数据库迁移 (`uv run python manage.py migrate`)