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' })"> 📝 记录/拍照 +