diff --git a/PROGRESS.md b/PROGRESS.md index 5472246..87c8e88 100644 --- a/PROGRESS.md +++ b/PROGRESS.md @@ -4,17 +4,17 @@ ## 当前状态 -- **当前Issue:** P0-1 项目创建向导页(准备开始) -- **状态:** 📋 规划完成,待启动开发 -- **上次更新:** 2026-04-11 17:50 +- **当前Issue:** P0-2 章程模板填充(准备开始) +- **状态:** 🔨 进行中 +- **上次更新:** 2026-04-11 18:35 - **PRD版本:** v0.2 -- **Gitea仓库:** http://192.168.120.110:4000/xiaohei/pmp-tool (已创建Issues 1-3) +- **Gitea仓库:** http://192.168.120.110:4000/xiaohei/pmp-tool (Issues 1已关闭, 2-3进行中) ## Issue流水线 | # | Issue | 描述 | 状态 | 断点备注 | |---|-------|------|------|------| -| 1 | P0-1: 项目创建向导页 | 用React+Arco Design实现向导页框架,包含步骤条和基本表单(项目名称、目标) | 🔨 进行中 - Claude Code 工作中 +| 1 | P0-1: 项目创建向导页 | 用React+Arco Design实现向导页框架,包含步骤条和基本表单(项目名称、目标) | ✅ 已完成 | WizardPage.tsx | 2 | P0-2: 章程模板填充 | 基于用户输入生成项目章节Markdown(目标、范围、里程碑、干系人) | ⬜ 待开发 | | | 3 | P0-3: 飞书消息发送 | Node.js+Hono调用飞书Open API发送文本消息 | ⬜ 待开发 | | | 4 | P0-4: 看板基础组件 | 三列看板+拖拽(dnd-kit) | ⬜ 待开发 | | diff --git a/src/lib/charter.ts b/src/lib/charter.ts new file mode 100644 index 0000000..4b282d9 --- /dev/null +++ b/src/lib/charter.ts @@ -0,0 +1,143 @@ +/** + * 章程模板填充模块 + * 根据向导页收集的项目数据,生成符合PMBOK标准的项目章程Markdown + */ + +export interface ProjectData { + name: string; + goal: string; + scopeIn: string; + scopeOut: string; + constraints: string; + assumptions: string; + stakeholders: Array<{ + name: string; + role: string; + power: string; + interest: string; + strategy: string; + }>; + milestones: Array<{ + name: string; + targetDate: string; + deliverable: string; + }>; +} + +/** + * 生成项目章程 Markdown + */ +export function generateCharter(data: ProjectData): string { + const now = new Date().toISOString().split('T')[0]; + + return `# 项目章程 + +### 基本信息 +- **项目名称:** ${data.name || '(待填写)'} +- **项目经理:** (待指定) +- **发起人/产品负责人:** (待指定) +- **开始日期:** ${now} +- **目标结束日期:** (待确定) + +### 项目目标 + +${data.goal || '(待填写)'} + +### 范围边界 + +**包含:** +${data.scopeIn ? data.scopeIn.split('\n').map((l) => `- ${l}`).join('\n') : '- (待填写)'} + +**不包含:** +${data.scopeOut ? data.scopeOut.split('\n').map((l) => `- ${l}`).join('\n') : '- (待填写)'} + +### 关键里程碑 + +| 里程碑 | 目标日期 | 交付物 | +|--------|---------|--------| +${data.milestones.length > 0 + ? data.milestones.map((m) => `| ${m.name} | ${m.targetDate} | ${m.deliverable} |`).join('\n') + : '| (待添加) | | |'} + +### 主要干系人 + +| 角色 | 姓名 | 权力 | 利益/关注度 | 参与策略 | +|------|------|------|-----------|---------| +${data.stakeholders.length > 0 + ? data.stakeholders.map((s) => `| ${s.role} | ${s.name} | ${s.power} | ${s.interest} | ${s.strategy} |`).join('\n') + : '| (待添加) | | | | |'} + +### 初步资源 +- 开发:(待确认)人 +- 设计:(待确认)人 +- 测试:(待确认)人 +- 基础设施预算:(待确认) + +### 约束和假设 + +**约束:** +${data.constraints ? `- ${data.constraints}` : '- (待填写)'} + +**假设:** +${data.assumptions ? `- ${data.assumptions}` : '- (待填写)'} + +--- +*本文档由 FlowPilot 自动生成于 ${now}* +`; +} + +/** + * 生成干系人登记册 Markdown + */ +export function generateStakeholderRegister(data: ProjectData): string { + const now = new Date().toISOString().split('T')[0]; + + return `# 干系人登记册 + +> 项目:${data.name || '(待填写)'} +> 日期:${now} + +## 干系人列表 + +| 干系人 | 角色 | 权力 | 利益/关注度 | 态度 | 参与策略 | +|--------|------|------|-----------|------|---------| +${data.stakeholders.length > 0 + ? data.stakeholders.map((s) => `| ${s.name} | ${s.role} | ${s.power} | ${s.interest} | 待评估 | ${s.strategy} |`).join('\n') + : '| (待添加) | | | | | |'} + +## 权力-利益矩阵 + +\`\`\` + 高利益 + | + 重点管理 | 保持满意 + (高权力高利益) | (低权力高利益) + ————————————+———————————— + 随时告知 | 监督 + (高权力低利益) | (低权力低利益) + | + 低利益 + 低权力 高权力 +\`\`\` + +${data.stakeholders + .filter((s) => s.power === '高' && s.interest === '高') + .map((s) => `- **重点管理**:${s.name}(${s.role})→ ${s.strategy}`) + .join('\n')} +${data.stakeholders + .filter((s) => s.power === '低' && s.interest === '高') + .map((s) => `- **保持满意**:${s.name}(${s.role})→ ${s.strategy}`) + .join('\n')} +${data.stakeholders + .filter((s) => s.power === '高' && s.interest === '低') + .map((s) => `- **随时告知**:${s.name}(${s.role})→ ${s.strategy}`) + .join('\n')} +${data.stakeholders + .filter((s) => s.power === '低' && s.interest === '低') + .map((s) => `- **监督**:${s.name}(${s.role})→ ${s.strategy}`) + .join('\n')} + +--- +*本文档由 FlowPilot 自动生成于 ${now}* +`; +}