GPU_GUARD_MONOREPO/docs/superpowers/specs/2026-04-12-project-management-design.md
2026-05-20 21:39:12 +08:00

293 lines
12 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.

# 项目管理模块设计文档
> 日期: 2026-04-12
> 位置: 系统管理 → 项目管理
> 使用者: 管理员/项目经理
## 1. 概述
在系统管理菜单下新增「项目管理」模块用于管理整个产品的研发与非研发任务进度。支持甘特图、日历、表格列表、Kanban 看板四种视图,覆盖项目 → 阶段 → 任务 → 子任务的四层结构。
核心场景:电商自动化运营 Agent 平台的全生命周期管理包含研发任务前端、后端、AI和运营任务官网、隐私条款、市场推广等
## 2. 技术选型
| 组件 | 方案 | 理由 |
|------|------|------|
| 甘特图 | dhtmlx-gantt ^8.x (GPL) | 最成熟的甘特图库,原生支持依赖箭头、拖拽、树形层级 |
| 日历 | @fullcalendar/vue3 ^6.x | 日历视图事实标准,月/周视图开箱即用 |
| 看板拖拽 | vuedraggable ^4.x | Vue 3 拖拽排序,轻量成熟 |
| 表格 | cl-crud (已有) | 复用现有 Cool Admin CRUD 组件 |
安装位置:均安装到 `@neta/frontend`
## 3. 数据模型
### 3.1 project_info项目表
| 字段 | 类型 | 说明 |
|------|------|------|
| id | int, PK, auto | 主键 |
| name | varchar(100) | 项目名称 |
| description | text, nullable | 项目描述 |
| status | tinyint | 状态0未开始 1进行中 2已完成 3已归档 |
| startDate | date, nullable | 计划开始日期 |
| endDate | date, nullable | 计划结束日期 |
| progress | int, default 0 | 进度百分比 0-100 |
| ownerId | int, nullable | 项目经理base_sys_user.id |
| ownerName | varchar(50), nullable | 项目经理姓名(冗余) |
| color | varchar(20), nullable | 主题色(如 #409EFF |
| createTime | datetime | 创建时间BaseEntity |
| updateTime | datetime | 更新时间BaseEntity |
| tenantId | int | 租户IDBaseEntity |
### 3.2 project_phase阶段表
| 字段 | 类型 | 说明 |
|------|------|------|
| id | int, PK, auto | 主键 |
| projectId | int | 所属项目 ID |
| name | varchar(100) | 阶段名称 |
| type | varchar(50), nullable | 分类(来自系统参数 project_task_category |
| status | tinyint, default 0 | 状态0未开始 1进行中 2已完成 |
| startDate | date, nullable | 开始日期 |
| endDate | date, nullable | 结束日期 |
| progress | int, default 0 | 进度 0-100 |
| sortOrder | int, default 0 | 排序序号 |
| createTime | datetime | BaseEntity |
| updateTime | datetime | BaseEntity |
| tenantId | int | BaseEntity |
### 3.3 project_task任务表
| 字段 | 类型 | 说明 |
|------|------|------|
| id | int, PK, auto | 主键 |
| projectId | int | 所属项目 ID |
| phaseId | int, nullable | 所属阶段 ID |
| parentId | int, nullable | 父任务 IDnull 为顶级任务) |
| name | varchar(200) | 任务名称 |
| description | text, nullable | 任务描述 |
| status | tinyint, default 0 | 0待办 1进行中 2已完成 3已关闭 |
| priority | tinyint, default 2 | P0(0)紧急 P1(1)高 P2(2)中 P3(3)低 |
| category | varchar(50), nullable | 分类(来自系统参数) |
| assigneeId | int, nullable | 负责人 ID |
| assigneeName | varchar(50), nullable | 负责人姓名(冗余) |
| startDate | date, nullable | 计划开始日期 |
| endDate | date, nullable | 计划结束日期 |
| estimatedHours | decimal(8,1), default 0 | 预估工时(小时) |
| actualHours | decimal(8,1), default 0 | 实际工时(由 time_log 汇总) |
| progress | int, default 0 | 进度 0-100 |
| sortOrder | int, default 0 | 排序序号 |
| color | varchar(20), nullable | 自定义颜色(覆盖项目色) |
| createTime | datetime | BaseEntity |
| updateTime | datetime | BaseEntity |
| tenantId | int | BaseEntity |
### 3.4 project_task_dependency任务依赖表
| 字段 | 类型 | 说明 |
|------|------|------|
| id | int, PK, auto | 主键 |
| taskId | int | 当前任务 ID |
| dependsOnTaskId | int | 前置任务 ID |
| type | tinyint, default 0 | 0:FS(完成后开始) 1:SS 2:FF 3:SF |
| createTime | datetime | BaseEntity |
| updateTime | datetime | BaseEntity |
| tenantId | int | BaseEntity |
### 3.5 project_time_log工时记录表
| 字段 | 类型 | 说明 |
|------|------|------|
| id | int, PK, auto | 主键 |
| taskId | int | 所属任务 ID |
| userId | int | 记录人 ID |
| userName | varchar(50) | 记录人姓名(冗余) |
| logDate | date | 工作日期 |
| hours | decimal(5,1) | 工时(小时) |
| description | varchar(500), nullable | 工作内容描述 |
| createTime | datetime | BaseEntity |
| updateTime | datetime | BaseEntity |
| tenantId | int | BaseEntity |
## 4. 后端模块结构
```
packages/backend/src/modules/project/
├── config.ts
├── entity/
│ ├── info.ts -- ProjectInfoEntity
│ ├── phase.ts -- ProjectPhaseEntity
│ ├── task.ts -- ProjectTaskEntity
│ ├── task_dependency.ts -- ProjectTaskDependencyEntity
│ └── time_log.ts -- ProjectTimeLogEntity
├── controller/admin/
│ ├── info.ts -- 项目 CRUD
│ ├── phase.ts -- 阶段 CRUD
│ ├── task.ts -- 任务 CRUD + 树形查询
│ ├── task_dependency.ts -- 依赖关系管理
│ └── time_log.ts -- 工时记录 CRUD
└── service/
├── info.ts -- 项目统计、进度汇总
├── task.ts -- 任务树构建、状态流转、进度计算
└── gantt.ts -- 甘特图聚合接口
```
### 4.1 核心 API
| 路径 | 方法 | 用途 |
|------|------|------|
| `/admin/project/info/page` | GET | 项目列表分页 |
| `/admin/project/info/add` | POST | 创建项目 |
| `/admin/project/info/update` | POST | 更新项目 |
| `/admin/project/info/delete` | POST | 删除项目 |
| `/admin/project/phase/list` | GET | 某项目的阶段列表 |
| `/admin/project/phase/add` | POST | 创建阶段 |
| `/admin/project/phase/update` | POST | 更新阶段 |
| `/admin/project/phase/delete` | POST | 删除阶段 |
| `/admin/project/task/tree` | GET | 任务树(含子任务层级) |
| `/admin/project/task/page` | GET | 任务分页列表(表格视图) |
| `/admin/project/task/add` | POST | 创建任务 |
| `/admin/project/task/update` | POST | 更新任务 |
| `/admin/project/task/delete` | POST | 删除任务 |
| `/admin/project/task/ganttData` | GET | 甘特图数据(任务+阶段+依赖) |
| `/admin/project/task/ganttUpdate` | POST | 甘特图拖拽批量更新 |
| `/admin/project/task/kanban` | GET | 看板数据(按状态分组) |
| `/admin/project/task/kanbanSort` | POST | 看板拖拽排序/状态变更 |
| `/admin/project/timeLog/page` | GET | 工时记录分页 |
| `/admin/project/timeLog/add` | POST | 添加工时 |
| `/admin/project/timeLog/delete` | POST | 删除工时 |
| `/admin/project/taskDependency/add` | POST | 添加依赖 |
| `/admin/project/taskDependency/delete` | POST | 删除依赖 |
### 4.2 甘特图聚合接口 ganttData
请求:`GET /admin/project/task/ganttData?projectId=1`
响应格式(适配 DHTMLX Gantt
```json
{
"data": [
{ "id": "p_1", "text": "阶段一", "start_date": "2026-04-01", "end_date": "2026-05-01", "progress": 0.5, "type": "project", "open": true },
{ "id": "t_1", "text": "官网设计", "start_date": "2026-04-01", "end_date": "2026-04-15", "progress": 0.3, "parent": "p_1", "priority": 1, "assignee": "张三" },
{ "id": "t_2", "text": "设计首页", "start_date": "2026-04-01", "end_date": "2026-04-07", "progress": 0, "parent": "t_1" }
],
"links": [
{ "id": 1, "source": "t_1", "target": "t_3", "type": "0" }
]
}
```
## 5. 前端模块结构
```
packages/frontend/src/modules/project/
├── views/
│ ├── list.vue -- 项目列表页(入口)
│ ├── detail.vue -- 项目详情页(四视图容器)
│ └── components/
│ ├── gantt.vue -- 甘特图视图
│ ├── calendar.vue -- 日历视图
│ ├── table.vue -- 表格列表视图
│ ├── kanban.vue -- 看板视图
│ ├── task-drawer.vue -- 任务详情抽屉
│ ├── time-log-dialog.vue -- 工时记录弹窗
│ └── phase-manager.vue -- 阶段管理弹窗
└── config.ts -- 模块菜单配置
```
### 5.1 页面流程
```
系统管理 → 项目管理list.vue
├── 项目卡片列表:名称、进度条、状态、负责人、日期范围
├── 新建项目按钮
└── 点击项目 → detail.vue
├── 顶部:项目信息栏(名称、进度条、日期范围、负责人、阶段管理按钮)
└── Tab 切换:甘特图 | 日历 | 列表 | 看板
```
### 5.2 四种视图
**甘特图gantt.vue**
- DHTMLX Gantt 渲染
- 左侧:树形任务列表(阶段 → 任务 → 子任务)
- 右侧:时间轴条形图
- 任务间依赖箭头连线
- 拖拽调整开始/结束日期,拖拽完自动调用 ganttUpdate
- 双击任务 → 打开 task-drawer
**日历calendar.vue**
- FullCalendar 月/周切换
- 任务按日期范围显示为色块
- 点击日期 → 快速创建任务
- 点击任务 → 打开 task-drawer
**表格列表table.vue**
- cl-crud 标准表格
- 筛选:状态、优先级、分类、负责人、阶段
- 排序:优先级、日期、进度
- 支持批量操作(删除、修改状态)
**看板kanban.vue**
- 四列:待办 | 进行中 | 已完成 | 已关闭
- 任务卡片:名称、优先级标签、负责人、截止日期
- vuedraggable 拖拽跨列 → 自动更新状态
- 卡片点击 → 打开 task-drawer
### 5.3 任务详情抽屉task-drawer.vue
右侧滑出抽屉,包含:
- 基本信息:名称、描述(纯文本 textarea、状态、优先级、分类
- 时间:开始/结束日期选择器、预估工时输入
- 负责人:下拉选择系统用户
- 子任务列表:展示+快速添加
- 依赖关系:前置任务选择器(下拉搜索)
- 工时记录 Tab工时列表 + 添加工时按钮
### 5.4 数据同步策略
- 项目详情页用 Pinia store 统一管理当前项目的任务/阶段/依赖数据
- 进入详情页时一次性加载ganttData 接口)
- 切换 Tab 不重新请求,共享同一份 store 数据
- 任何视图中的修改(拖拽、状态变更、新增/删除)同时更新 store + 调用 API
## 6. 进度自动计算规则
- **子任务** → 手动更新进度或按工时比例actualHours / estimatedHours * 100
- **任务进度** = 子任务进度加权平均(权重为 estimatedHours无预估则等权
- **阶段进度** = 下属任务进度加权平均
- **项目进度** = 各阶段进度加权平均
- 进度计算在后端 service 层实现,每次任务更新时触发向上汇总
## 7. 权限控制
- 复用现有 RBAC 体系
- 在菜单管理中添加「项目管理」菜单节点(目录 + 两个菜单页)
- 权限点:
- `project:info:add/update/delete` — 项目增删改
- `project:task:add/update/delete` — 任务增删改
- `project:timeLog:add/delete` — 工时记录增删
- 仅管理员/项目经理角色可见
## 8. 系统参数配置
需在「系统管理 → 参数配置」中预置:
| 参数键 | 说明 | 默认值示例 |
|--------|------|-----------|
| `project_task_category` | 任务分类选项 | 前端,后端,AI,设计,运营,法务,市场 |
| `project_task_priority` | 优先级选项(可选,也可硬编码) | P0紧急,P1高,P2中,P3低 |
## 9. 明确不做的事
- 通知/提醒系统
- 文件附件上传
- 评论/讨论功能
- 自动排期算法(关键路径法)
- 多项目资源冲突检测
- 移动端适配
- 成员自助端(仅管理员使用)