fix(流转树): 在库设备无在库任务时追加虚拟在库节点

- 设备在库(virtual_warehouse)但无在库任务时,流转树追加虚拟「在库」节点
- 转入人用最后一道主工序负责人兜底(近似),显示在库归属
- 递归检查任务树避免重复追加(在库任务可能是子任务)
This commit is contained in:
2026-08-31 17:38:38 +08:00
parent 39019f4312
commit 7f5bedf87c

View File

@ -154,6 +154,43 @@ async def get_product_by_serial(db: AsyncSession, serial_number: str) -> Product
t.created_by = prev[-1].assignee_id
assignee_ids.add(t.created_by)
# 🔧 在库设备若无「在库」任务,追加虚拟「在库」节点(展示谁转入在库)
def _has_warehouse_task(tasks):
for t in tasks:
if t.task_name and ("在库" in t.task_name or "入库" in t.task_name):
return True
if t.child_tasks and _has_warehouse_task(t.child_tasks):
return True
return False
has_warehouse_task = _has_warehouse_task(task_tree)
if product.current_location_id == "virtual_warehouse" and not has_warehouse_task and all_mains:
from app.schemas.task import TaskResponse
last_main = all_mains[-1]
virtual = TaskResponse(
id=uuid.uuid4(),
product_id=product.id,
product_sn=product.serial_number,
product_material=product.material_name or product.material_id or "",
parent_task_id=None,
task_name="在库",
assignee_id="virtual_warehouse",
status="COMPLETED",
notify_parent_on_complete=False,
is_rework=False,
task_type=None,
remark=None,
reject_reason=None,
received_at=last_main.received_at or last_main.created_at,
completed_at=last_main.completed_at,
created_at=last_main.created_at,
child_tasks=[],
records=[],
created_by=last_main.assignee_id, # 最后一道主工序负责人(近似转入人)
)
task_tree.append(virtual)
if virtual.created_by:
assignee_ids.add(virtual.created_by)
# 🔧 中文名映射(负责人 + 创建人,供前端显示"谁转入在库"等)
assignee_names = _lookup_display_names(list(assignee_ids))