diff --git a/docs/milestone-propose-requirements.md b/docs/milestone-propose-requirements.md index 230ab0b..8ca8b81 100644 --- a/docs/milestone-propose-requirements.md +++ b/docs/milestone-propose-requirements.md @@ -382,6 +382,78 @@ - 或 P5.3 后端 task transition 补全 current_user 依赖注入 + assignee 身份校验 - 或 P5.4 后端 undergoing→completed 强制要求 comment +### 2026-03-17 10:00 UTC(第 12 轮:P8.3 Milestone freeze/start 按钮前置条件检查与禁用提示) + +本轮做了什么: +- 新增后端 `GET /projects/{pid}/milestones/{mid}/actions/preflight` 端点(milestone_actions.py) + - 当 milestone 为 `open` 时,返回 freeze 是否允许 + 原因(检查 maintenance/release task 数量) + - 当 milestone 为 `freeze` 时,返回 start 是否允许 + 原因(检查依赖 milestone/task 是否已 completed) + - 只读接口,不做任何数据变更 +- 前端 MilestoneDetailPage 集成 preflight: + - milestone 加载后自动调用 preflight API + - freeze 按钮:条件不满足时禁用 + 显示 ⚠ 原因提示(如"No maintenance/release task found") + - start 按钮:依赖未完成时禁用 + 显示 ⚠ 原因提示 + - 动作执行成功后自动刷新 preflight 状态 + - 鼠标 hover 按钮时 title 也显示原因 + +改了哪些关键文件: +- `HarborForge.Backend/app/api/routers/milestone_actions.py` — 新增 preflight endpoint(+84 行) +- `HarborForge.Frontend/src/pages/MilestoneDetailPage.tsx` — preflight 状态 + 按钮禁用逻辑 + +验证结果: +- Python AST 语法检查通过 +- `npx tsc --noEmit` 零错误通过 +- 已 commit:backend `7a16639`,frontend `faf7842` + +当前阻塞/风险: +- P2 权限骨架仍未落地,preflight 不检查用户是否有 freeze/start 权限(只检查业务前置条件) +- 无本地 MySQL/运行环境做集成验证 +- P5.3 task transition 的 assignee 身份校验仍缺失 +- P5.4 后端 undergoing→completed 强制要求 comment 仍缺失 + +下一轮最建议继续做什么: +- P5.3 后端 task transition 补全 assignee 身份校验(open→undergoing 时校验操作者 == assignee) +- 或 P5.4 后端 undergoing→completed 强制要求 completion comment +- 或 P10.7 前端 propose 编辑限制(open 时允许编辑 title/description) + +### 2026-03-17 11:00 UTC(第 13 轮:P5.3 Assignee 身份校验 + P5.4 完成 Comment 强制要求) + +本轮做了什么: +- 在后端 transition 接口补全 P5.3 和 P5.4 两项关键校验 +- **P5.3 Assignee 身份校验**: + - transition 接口新增 `current_user` 依赖注入 + - `open → undergoing`:除校验 assignee 非空外,新增校验 `current_user.id == task.assignee_id`,非 assignee 返回 403 + - `undergoing → completed`:同样校验操作者必须为 assignee +- **P5.4 完成 Comment 强制要求**: + - transition 接口新增 `TransitionBody` 请求体(含可选 `comment` 字段) + - `undergoing → completed` 时强制要求 `comment` 非空,否则返回 400 + - 后端自动创建 Comment 记录(复用 `models.Comment`),不再依赖前端单独调用 comment API +- transition 所有状态变更现在自动写 `log_activity`,记录 old/new status +- auto-complete milestone 时传入 `current_user.id` 替代原先的 `None` +- **前端 TaskDetailPage 同步更新**: + - `doAction` 改为接收 `body` 参数,直接在 transition POST 请求体中传递 `{ comment }` + - Finish 流程不再单独调用 `POST /comments`,改为后端统一处理 + - Close 流程的 reason comment 同样通过请求体传递 + +改了哪些关键文件: +- `HarborForge.Backend/app/api/routers/tasks.py` — transition 接口重构(+40 行) +- `HarborForge.Frontend/src/pages/TaskDetailPage.tsx` — doAction/finish/close 逻辑简化 + +验证结果: +- Python AST 语法检查通过 +- `npx tsc --noEmit` 零错误通过 +- 已 commit:backend `ffb0fa6`,frontend `d6a45c3` + +当前阻塞/风险: +- P2 权限骨架仍未落地(close task / reopen 权限未注册和调用) +- batch transition 接口尚未同步 P5.3/P5.4 校验(无 current_user,无 comment body) +- 无本地 MySQL/运行环境做集成验证 + +下一轮最建议继续做什么: +- P10.7 前端 propose 编辑限制(open 时允许编辑 title/description,其他状态禁止) +- 或 P9.3 前端 task 编辑权限守卫(按 assignee/status 显示/隐藏编辑入口) +- 或 P5.7 后端 task PATCH 接口编辑权限服务端防守 + --- ## 1. 背景