From 94d48d122addfb8238b27ae117f90336b9a1c129 Mon Sep 17 00:00:00 2001 From: cfdaily Date: Wed, 20 May 2026 23:08:11 +0800 Subject: [PATCH] auto-sync: 2026-05-20 23:08:11 --- src/api/project_routes.py | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/src/api/project_routes.py b/src/api/project_routes.py index cb092f3..0b53d51 100644 --- a/src/api/project_routes.py +++ b/src/api/project_routes.py @@ -84,7 +84,7 @@ async def update_project(project_id: str, body: Dict[str, Any]): @router.post("/{project_id}/tasks/{task_id}/move") async def move_task(project_id: str, task_id: str, body: Dict[str, Any]): - """移动任务到另一个项目""" + """移动任务到另一个项目(含子任务一起移动)""" target_project = body.get("target_project_id") if not target_project: raise HTTPException(422, "Missing target_project_id") @@ -96,17 +96,35 @@ async def move_task(project_id: str, task_id: str, body: Dict[str, Any]): raise HTTPException(404, f"Target project not found: {target_project}") # 从源项目读任务 - from src.blackboard.db import Blackboard - from src.blackboard.models import Task + from src.blackboard.operations import Blackboard + from src.blackboard.models import Task as TaskModel src_bb = Blackboard(Path(reg.root) / project_id / "blackboard.db") task = src_bb.get_task(task_id) if not task: raise HTTPException(404, f"Task not found: {task_id}") - # 写入目标项目 + # 查找子任务 + children = src_bb.list_tasks(parent_task=task_id) + tgt_bb = Blackboard(Path(reg.root) / target_project / "blackboard.db") - # 重置状态和时间为初始值 - moved_task = Task( + moved_ids = [] + + # 先移动子任务 + for child in children: + moved_child = TaskModel( + id=child.id, title=child.title, description=child.description, + status="pending", assignee=child.assignee, assigned_by=child.assigned_by, + priority=child.priority, task_type=child.task_type, + risk_level=child.risk_level, parent_task=child.parent_task, + stage=child.stage, stages_json=child.stages_json, + depends_on=child.depends_on, must_haves=child.must_haves, + ) + tgt_bb.create_task(moved_child) + src_bb.update_task_status(child.id, "cancelled", detail=f"Moved to {target_project}") + moved_ids.append(child.id) + + # 移动主任务 + moved_task = TaskModel( id=task.id, title=task.title, description=task.description, status="pending", assignee=task.assignee, assigned_by=task.assigned_by, priority=task.priority, task_type=task.task_type, @@ -115,8 +133,7 @@ async def move_task(project_id: str, task_id: str, body: Dict[str, Any]): depends_on=task.depends_on, must_haves=task.must_haves, ) tgt_bb.create_task(moved_task) - - # 从源项目标记 cancelled src_bb.update_task_status(task_id, "cancelled", detail=f"Moved to {target_project}") + moved_ids.insert(0, task_id) - return {"ok": True, "moved_to": target_project} + return {"ok": True, "moved_to": target_project, "moved_ids": moved_ids}