fix(透视表): 不再把任意已完成工序强制归在库
- 设备当前工序 = 最新主任务的工序名(task_name),不区分状态 - 「在库」只在该设备最新主任务真为在库工序时出现 - 完成的测试/生产等工序按原工序显示,不再误归在库
This commit is contained in:
@ -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 "")
|
||||||
|
|||||||
Reference in New Issue
Block a user