From 21aa608db360a222c7cd0634061c2bbcf4367066 Mon Sep 17 00:00:00 2001 From: duxingchen Date: Wed, 5 Aug 2026 16:37:05 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B7=A5=E8=89=BA=E8=8A=82=E7=82=B9=E6=A0=91:?= =?UTF-8?q?=20=E6=96=B0=E5=A2=9E=E7=BB=93=E6=9D=9F=E5=88=86=E6=94=AF(?= =?UTF-8?q?=E7=BB=88=E6=AD=A2)=E6=8E=A5=E5=8F=A3=20+=20=E5=89=8D=E7=AB=AF?= =?UTF-8?q?=F0=9F=8F=81=E7=BB=93=E6=9D=9F=E5=88=86=E6=94=AF=E6=8C=89?= =?UTF-8?q?=E9=92=AE=20+=20WIP=E5=8F=AF=E6=97=A0=E4=B8=8B=E6=B8=B8?= =?UTF-8?q?=E5=AE=8C=E7=BB=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/app/api/v1/endpoints/tasks.py | 18 ++++++++++++++++ backend/app/services/task_service.py | 30 ++++++++++++++++++++++++++ track-uniapp/src/pages/scan/detail.vue | 23 ++++++++++++++++++++ 3 files changed, 71 insertions(+) diff --git a/backend/app/api/v1/endpoints/tasks.py b/backend/app/api/v1/endpoints/tasks.py index c98627d..88c3211 100644 --- a/backend/app/api/v1/endpoints/tasks.py +++ b/backend/app/api/v1/endpoints/tasks.py @@ -102,6 +102,24 @@ async def complete_task_endpoint( ) +# ============================================================ +# 核心业务 0:结束分支(终止当前节点,不创建下游) +# ============================================================ + +@router.post("/{task_id}/end", response_model=TaskResponse) +async def end_task_endpoint( + task_id: str, + operator_id: str | None = Query(None), + db: AsyncSession = Depends(get_db), +): + """ + **结束当前分支:标记任务为 COMPLETED,不创建下游任务。** + + 用于工人认为工序已完结、无需转交下一人的场景。 + """ + return await task_service.end_task(db, uuid.UUID(task_id), operator_id) + + # ============================================================ # 核心业务 1:确认接收 (PENDING → WIP) # ============================================================ diff --git a/backend/app/services/task_service.py b/backend/app/services/task_service.py index 55fdef8..32f1eba 100644 --- a/backend/app/services/task_service.py +++ b/backend/app/services/task_service.py @@ -223,6 +223,36 @@ async def get_all_tasks( return TaskListResponse(tasks=all_tasks, total=len(all_tasks)) +# ============================================================ +# 核心业务 0:结束分支(终止当前节点) +# ============================================================ + +async def end_task( + db: AsyncSession, task_id: uuid.UUID, operator_id: str | None = None +) -> TaskResponse: + """ + 结束当前分支:标记任务为 COMPLETED,不创建下游任务。 + 用于工序已完结、无需转交下一人的场景。 + """ + task = await _get_task_or_404(db, task_id) + + if task.status == TASK_STATUS_COMPLETED: + raise HTTPException(status_code=409, detail="此分支已经结束") + if task.status == TASK_STATUS_PENDING: + raise HTTPException(status_code=409, detail="请先接收任务再结束分支") + + now = get_beijing_time() + task.status = TASK_STATUS_COMPLETED + task.completed_at = now + + await _create_task_log(db, task_id, action_type="end", + operator_id=operator_id, remark=f"分支「{task.task_name}」已终止(无下游)") + + await db.commit() + await db.refresh(task) + return _to_response(task) + + # ============================================================ # 核心业务 1:确认接收 (PENDING → WIP) # ============================================================ diff --git a/track-uniapp/src/pages/scan/detail.vue b/track-uniapp/src/pages/scan/detail.vue index f0afb19..8101e10 100644 --- a/track-uniapp/src/pages/scan/detail.vue +++ b/track-uniapp/src/pages/scan/detail.vue @@ -140,6 +140,10 @@ @tap="handleTaskAction({ task: currentTask, type: 'record' })"> 📝 记录/拍照 +