Files
ftb-project-management/docs/architecture.md
Script Generator 6d2f6d8b9f docs+fix: 4份核心文档 + 项目模块版本记录数据全联动
文档:
- architecture.md - 整体架构、心智模型、关键设计原则
- decisions.md - 16条关键决策记录(含为什么)
- workflow.md - 工作流程和协作偏好
- roadmap.md - V1/V2/V3 路线图和已完成清单

修复项目详情版本记录:
1. 状态胶囊数据联动(开发中分支也补传 stageProgress)
2. 日期数据联动:
   - 实际开始 = 取所有阶段最早 actualStartAt/startDate/startedAt
   - 实际截止 = 取所有阶段最晚 completedAt/closedAt
   - 数据完全和版本详情一致

VersionCard 的 versionData useMemo 增加 actualStart/actualEnd 派生字段,
两种状态分支(developing/released)都使用派生值,不再用静态 version.startDate

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-16 12:40:10 +08:00

137 lines
5.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# FTB 智能项目管理系统 — 架构文档
## 项目定位
FTB 是一个面向中小型研发团队的项目管理平台,集成 AI 能力辅助决策。核心层级:
```
产品Product → 项目Project → 版本Version → 需求/任务/用例/Bug
```
不是给测试团队的工具,也不是 Jira 替代品。**核心目标是让产品/项目经理在一个页面看到:"开发完了吗 → 验收过了吗 → 还有多少 BUG → 能不能发布"**。
## 心智模型(重要)
系统设计遵循**三条维度线**的分离:
```
语义线Why 执行线How 质量线Quality
───────────────── ───────────────── ────────────────
Requirement Version TestCase
解释为什么做 驱动状态流转 └─ Bug
不参与流程 所有状态看版本 质量闭环
```
**Requirement需求= 语义层**,解释功能范围和业务原因,不驱动流程。
**Version版本= 执行主线**,所有任务归属版本,状态由版本派生。
**TestCase + Bug = 质量闭环**,挂在版本上验收。
## 技术栈
| 层 | 技术 | 说明 |
|---|------|------|
| 前端 | Next.js 14 (App Router) | TypeScript + 客户端组件为主 |
| UI | Tailwind CSS + Shadcn/ui | 紧凑信息密度、现代风格 |
| 状态 | Zustand | 每个领域一个 store |
| 持久化 | localStorageV1 | 后端 NestJS + Prisma 已搭好但未启用 |
| 后端 | NestJS + Prisma + PostgreSQLV2 | 暂未启用 |
| AI | Anthropic SDKV3 远景) | 健康度/风险预警/排期建议 |
## 模块结构
```
apps/web/
├── app/
│ ├── products/ # 产品列表 + 详情(点击项目可跳转)
│ ├── projects/[id]/ # 项目详情:版本卡片/状态胶囊
│ ├── versions/ # 版本列表 + 详情
│ ├── requirements/ # 需求池
│ ├── workspace/ # 与我相关(聚合工作台)
│ └── admin/ # 系统管理(任务类型字典等)
├── components/
│ ├── product/ # 产品组件
│ ├── version/ # 版本组件PlanTab, CapsuleStages, MemberChips...
│ ├── dev-task/ # 开发任务组件
│ ├── test-case/ # 测试用例组件
│ ├── bug/ # Bug 组件
│ └── requirement/ # 需求组件
├── lib/
│ ├── derive.ts # 派生数据flattenVersions/flattenProjects
│ ├── linkage-engine.ts # 跨模块联动引擎需求↔DevTask 派生状态)
│ ├── workspace-engine.ts # 工作台聚合引擎统一WorkItem
│ ├── version-status.ts # 版本执行态推导
│ ├── version-plan.ts # 计划任务(调研/产品/UI
│ ├── dev-task.ts # 开发任务
│ ├── test-case.ts # 测试用例
│ ├── bug.ts # Bug
│ └── requirement.ts # 需求
└── stores/ # Zustand stores每个领域独立
```
## 关键架构原则
### 1. 引擎模式(关键)
跨模块的数据派生通过**引擎层**处理,不是各 store 互相调用:
- **linkage-engine.ts**:从 DevTask 状态派生需求"实际进度",新建模块只需在此聚合
- **workspace-engine.ts**:聚合 WorkItem 给"与我相关"页面用
引擎是**纯函数**,输入多个 store 数据,输出统一视图。引擎使应用各模块松耦合,新增模块时不需要改其他模块的代码。
### 2. 派生胜过存储
时间字段、状态、进度都尽量从底层数据派生,而不是手填:
- 实际工时 = `startDate → completedAt` 时间差(精确到 0.5h
- 阶段耗时 = 所有阶段任务的最早开始 → 最晚完成
- 需求开发状态 = 从 DevTask 状态聚合
- 版本执行态 = 从所有 DevTask + TestCase + Bug 聚合
- 阶段进度 = 已完成子任务/总子任务
### 3. 时间戳精确到分钟
所有"实际开始/完成"时间都是 ISO 时间戳(含时分秒),不是日期。展示时统一 `slice(0, 16).replace('T', ' ')`
### 4. 数据联动
修改 A 影响 B 时,**B 通过 filter A 派生**,不要双向写。例:
- 需求关联到版本:需求设 `versionId`,版本详情 `requirements.filter(r => r.versionId === id)`
- 删除版本清理孤儿数据PlanTask/DevTask/TestCase/Bug + 释放 Requirement.versionId
## 状态机概览
| 实体 | 状态流转 |
|------|---------|
| Requirement | pending_review → adopted → planned → developing → testing → released → closedrejected 可回 pending_review|
| VersionPlan | pending → in_progress → completed |
| DevTask | todo → in_progress → testing → submitted终态提测=已完成)|
| TestCase | pending → running → passed/failed/blocked |
| Bug | open → fixing → fixed → verifying → closed/rejected |
DevTask 没有"已完成"状态,"已提测"就是终态——开发交付完成,后续 Bug 单独流转。
## 数据持久化
**V1当前** 全部 localStorage每个 store 独立 key
- `ftb_overview_v1` - 产品/项目/版本树
- `ftb_requirements_v3`
- `ftb_version_plans_v1`
- `ftb_dev_tasks_v1`
- `ftb_test_cases_v1`
- `ftb_bugs_v1`
- `ftb_overtime_v1`
- `ftb_task_categories_v1`
**V2计划** NestJS + Prisma + PostgreSQLSchema 已设计但尚未运行 migration。
## 权限模型(轻量)
V1 仅做前端校验,无后端鉴权:
- 版本 `members` 字段限定参与者
- 版本列表/详情按 `members.contains(currentUser)` 过滤
- 创建版本时自动加入创建者
- 版本 `members` 为空时所有人可见(兼容旧数据)
V2 接入后端后改为基于 `ProjectMember` 表的 RBACOwner/Admin/Member/Viewer