From c3e03bb1772705bfcb9eefb4e1ed81a18ea248db Mon Sep 17 00:00:00 2001 From: duxingchen Date: Fri, 28 Aug 2026 16:57:02 +0800 Subject: [PATCH] =?UTF-8?q?fix(=E9=80=8F=E8=A7=86=E8=A1=A8):=20=E4=B8=8D?= =?UTF-8?q?=E5=86=8D=E6=8A=8A=E4=BB=BB=E6=84=8F=E5=B7=B2=E5=AE=8C=E6=88=90?= =?UTF-8?q?=E5=B7=A5=E5=BA=8F=E5=BC=BA=E5=88=B6=E5=BD=92=E5=9C=A8=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 设备当前工序 = 最新主任务的工序名(task_name),不区分状态 - 「在库」只在该设备最新主任务真为在库工序时出现 - 完成的测试/生产等工序按原工序显示,不再误归在库 --- backend/app/services/dashboard_service.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) 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 "")