From 6a79e21302100ae045845d318a308bea85ddff1e Mon Sep 17 00:00:00 2001 From: duxingchen Date: Thu, 6 Aug 2026 13:14:26 +0800 Subject: [PATCH] =?UTF-8?q?=E9=97=AD=E7=8E=AF=E4=BF=AE=E5=A4=8D:=20transfe?= =?UTF-8?q?r/spawn/receive=E8=A1=A5TaskRecord=20+=20reject=E5=8A=A0task=5F?= =?UTF-8?q?type=20+=20branchLabel=E5=8F=AA=E5=AF=B9SPAWN=E7=BC=96=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/app/services/task_service.py | 4 ++++ .../src/pages/scan/components/TreeCanvas.vue | 17 ++++++++++++----- .../src/pages/scan/components/WorkspaceArea.vue | 17 ++++++++++++----- 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/backend/app/services/task_service.py b/backend/app/services/task_service.py index c7245f2..0cd6df1 100644 --- a/backend/app/services/task_service.py +++ b/backend/app/services/task_service.py @@ -389,6 +389,7 @@ async def spawn_subtask( await db.flush() # 协助分支不改变产品宏观状态(只有主分支影响 overall_status) + db.add(TaskRecord(task_id=task.id, remark=data.remark or f"[派发协助] 分配给 {data.assignee_id}", images="[]")) await _create_task_log(db, child.id, action_type="create", operator_id=operator_id, remark=f"协助分支(由「{task.task_name}」派发,分配给 {data.assignee_id})") @@ -462,6 +463,7 @@ async def receive_task( operator_id=operator_id, remark=remark or f"操作员确认接收任务「{task.task_name}」", ) + db.add(TaskRecord(task_id=task.id, remark=remark or f"[接收] 操作员已确认接收", images="[]")) # 接收时同步产品位置到接收人 + 宏观状态同步 product_result = await db.execute(select(Product).where(Product.id == task.product_id)) @@ -560,6 +562,7 @@ async def reject_task( task_name=task.task_name, assignee_id=rework_assignee_id, status=TASK_STATUS_PENDING, + task_type="TRANSFER", notify_parent_on_complete=task.notify_parent_on_complete, is_rework=True, ) @@ -638,6 +641,7 @@ async def transfer_task( operator_id=operator_id, remark=request.note or f"完成任务「{task.task_name}」,转交至下一道工序", ) + db.add(TaskRecord(task_id=task.id, remark=request.note or f"[完工转交] 移交下一工序", images="[]")) # --- 动作 2:解析下家 & 裂变 --- # 兼容新旧格式 diff --git a/track-uniapp/src/pages/scan/components/TreeCanvas.vue b/track-uniapp/src/pages/scan/components/TreeCanvas.vue index aac2713..79c5e91 100644 --- a/track-uniapp/src/pages/scan/components/TreeCanvas.vue +++ b/track-uniapp/src/pages/scan/components/TreeCanvas.vue @@ -118,13 +118,20 @@ export default { if (!this.product || !this.product.task_tree) return map; const traverse = (tasks, prefix) => { if (!tasks) return; - tasks.forEach((t, i) => { - const num = prefix ? `${prefix}.${i + 1}` : `${i + 1}`; - map[t.id] = `分支 ${num}`; - traverse(t.child_tasks, num); + let spawnIndex = 0; + tasks.forEach((t) => { + if (t.task_type !== 'SPAWN') { + map[t.id] = '主分支'; + traverse(t.child_tasks, prefix); + } else { + spawnIndex++; + const num = prefix ? `${prefix}.${spawnIndex}` : `${spawnIndex}`; + map[t.id] = `分支 ${num}`; + traverse(t.child_tasks, num); + } }); }; - this.product.task_tree.forEach((t, i) => { + this.product.task_tree.forEach((t) => { map[t.id] = '主分支'; traverse(t.child_tasks, ''); }); diff --git a/track-uniapp/src/pages/scan/components/WorkspaceArea.vue b/track-uniapp/src/pages/scan/components/WorkspaceArea.vue index 58c328e..43cad15 100644 --- a/track-uniapp/src/pages/scan/components/WorkspaceArea.vue +++ b/track-uniapp/src/pages/scan/components/WorkspaceArea.vue @@ -156,13 +156,20 @@ export default { if (!this.product || !this.product.task_tree) return map; const traverse = (tasks, prefix) => { if (!tasks) return; - tasks.forEach((t, i) => { - const num = prefix ? `${prefix}.${i + 1}` : `${i + 1}`; - map[t.id] = `分支 ${num}`; - traverse(t.child_tasks, num); + let spawnIndex = 0; + tasks.forEach((t) => { + if (t.task_type !== 'SPAWN') { + map[t.id] = '主分支'; + traverse(t.child_tasks, prefix); + } else { + spawnIndex++; + const num = prefix ? `${prefix}.${spawnIndex}` : `${spawnIndex}`; + map[t.id] = `分支 ${num}`; + traverse(t.child_tasks, num); + } }); }; - this.product.task_tree.forEach((t, i) => { + this.product.task_tree.forEach((t) => { map[t.id] = '主分支'; traverse(t.child_tasks, ''); });