From d4f95c56e2127881692cc630f46e0aaa99c9b98b Mon Sep 17 00:00:00 2001 From: zhi Date: Tue, 17 Mar 2026 03:02:29 +0000 Subject: [PATCH] docs: update dev status log for round 5 - propose CRUD router --- docs/milestone-propose-requirements.md | 34 ++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/docs/milestone-propose-requirements.md b/docs/milestone-propose-requirements.md index cb5fc6a..373f61d 100644 --- a/docs/milestone-propose-requirements.md +++ b/docs/milestone-propose-requirements.md @@ -134,6 +134,40 @@ - P6.1 Propose 基础 CRUD router(create/list/get/update),含 propose_code 自动生成 - 这是让 Propose 功能可用的最小后端闭环 +### 2026-03-17 03:00 UTC(第 5 轮:Propose CRUD Router + Accept/Reject/Reopen 动作) + +本轮做了什么: +- 新建 `app/api/routers/proposes.py`,完整实现 Propose 后端 CRUD + 状态动作(P6.1-P6.4) +- **CRUD**:list / create / get / update,遵循 project-scoped 路由 `/projects/{project_id}/proposes` +- **propose_code 自动生成**(P1.4):`{proj_code}:P{i:05x}` 格式,按 project 独立递增 +- **accept 动作**(P6.2): + - 接收 `milestone_id` 参数,校验 milestone 属同 project 且 status=open + - 自动创建 `story/feature` task(继承 title/description/created_by,默认 pending) + - 自动回填 `feat_task_id` +- **reject 动作**(P6.3):校验 propose 为 open,支持 reason 参数,记录 activity log +- **reopen 动作**(P6.4):仅 rejected 可 reopen 回 open,复用原 propose 不新建 +- **feat_task_id 只读保护**(P6.5):update 接口中 pop 掉客户端传入的 feat_task_id +- 在 `main.py` 注册 proposes_router +- 所有动作均写 activity log + +改了哪些关键文件: +- `HarborForge.Backend/app/api/routers/proposes.py` — 新增(280 行) +- `HarborForge.Backend/app/main.py` — 注册 proposes_router + +验证结果: +- Python AST 语法检查 proposes.py / main.py 均通过 +- 已 commit:backend `75ccbcb`,parent `5602b1b` + +当前阻塞/风险: +- 权限检查暂用 `check_project_role(min_role="mgr")` 占位,待 P2 权限骨架落地后替换为细粒度 permission +- propose_code 生成使用 `max(id)+1`,并发场景理论上有微小重复风险(但有 unique 约束保底) +- 无本地 MySQL 环境做运行时验证 +- 前端 Propose 页面尚未开始(P10) + +下一轮最建议继续做什么: +- P10.1-P10.3 前端 Propose 类型定义 + 列表页 + 详情页骨架(让 propose 功能在 UI 上可见) +- 或 P3.1 Milestone 动作接口(freeze/start/close),使 milestone 状态机真正可用 + --- ## 1. 背景