fix(透视表): 不再把任意已完成工序强制归在库

- 设备当前工序 = 最新主任务的工序名(task_name),不区分状态
- 「在库」只在该设备最新主任务真为在库工序时出现
- 完成的测试/生产等工序按原工序显示,不再误归在库
This commit is contained in:
2026-08-28 16:57:02 +08:00
parent b57ae19b44
commit c3e03bb177

View File

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