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