diff --git a/backend/app/services/dashboard_service.py b/backend/app/services/dashboard_service.py index eb13dd0..de6586c 100644 --- a/backend/app/services/dashboard_service.py +++ b/backend/app/services/dashboard_service.py @@ -614,8 +614,10 @@ async def get_wip_matrix( 核心口径:**每台设备只统计一次**,按它「当前所处工序」归属—— 1. 取该设备最新的一条主分支任务(parent_task_id IS NULL 或 TRANSFER/RECOVERY) - 2. 若该任务是活跃的(WIP/PENDING)→ 归属对应工序(如「待确认」= 别人转给我但未接收) - 3. 若最新任务是完成态(COMPLETED/ARCHIVED)→ 归属「在库」(生产完成) + 2. 设备当前工序 = 该最新主任务的工序名(task_name),不区分状态 + - 「待确认」(PENDING) = 别人转给我但未接收 + - 「在库」(COMPLETED) = 真正入库/生产完成 + - 其他已完成工序(如「测试」完成)按原工序显示,不强制归「在库」 这样一台设备在「上一步已完成 + 下一步待确认」时只算一次(待确认),不会重复计数。 since/until 按设备最新主任务的创建时间过滤。 @@ -625,7 +627,7 @@ async def get_wip_matrix( - task_name: 按当前工序聚合(dimension_key 为工序名,附主负责人) """ from datetime import timezone as dt_timezone - from app.models.task import Task, TASK_STATUS_WIP, TASK_STATUS_PENDING + from app.models.task import Task from app.models.product import Product # 每台设备按主任务创建时间倒序,取第一条即「最新主任务」 @@ -634,7 +636,6 @@ async def get_wip_matrix( Product.id, Product.spec_model, Task.task_name, - Task.status, Task.assignee_id, Task.created_at, ) @@ -652,7 +653,7 @@ async def get_wip_matrix( # 每台设备 → (spec, 当前工序/负责人, 当前负责人ID) device_cur: dict[str, tuple] = {} seen: set[str] = set() - for pid, spec, task_name, status, assignee, created in rows: + for pid, spec, task_name, assignee, created in rows: if pid in seen: continue seen.add(pid) @@ -666,8 +667,8 @@ async def get_wip_matrix( continue if dimension == "task_name": - # 活跃 → 当前工序;完成态 → 在库(生产完成) - key = task_name if status in (TASK_STATUS_WIP, TASK_STATUS_PENDING) else "在库" + # 设备当前工序 = 最新主任务的工序名(不区分状态,不强制完成态归在库) + key = task_name or "—" else: key = assignee or "未分配" device_cur[pid] = (spec or "未知型号", key, assignee or "")