feat(#2): 章程模板填充 - 生成项目章程和干系人登记册Markdown
This commit is contained in:
10
PROGRESS.md
10
PROGRESS.md
@@ -4,17 +4,17 @@
|
|||||||
|
|
||||||
## 当前状态
|
## 当前状态
|
||||||
|
|
||||||
- **当前Issue:** P0-1 项目创建向导页(准备开始)
|
- **当前Issue:** P0-2 章程模板填充(准备开始)
|
||||||
- **状态:** 📋 规划完成,待启动开发
|
- **状态:** 🔨 进行中
|
||||||
- **上次更新:** 2026-04-11 17:50
|
- **上次更新:** 2026-04-11 18:35
|
||||||
- **PRD版本:** v0.2
|
- **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流水线
|
||||||
|
|
||||||
| # | Issue | 描述 | 状态 | 断点备注 |
|
| # | Issue | 描述 | 状态 | 断点备注 |
|
||||||
|---|-------|------|------|------|
|
|---|-------|------|------|------|
|
||||||
| 1 | P0-1: 项目创建向导页 | 用React+Arco Design实现向导页框架,包含步骤条和基本表单(项目名称、目标) | 🔨 进行中 - Claude Code 工作中
|
| 1 | P0-1: 项目创建向导页 | 用React+Arco Design实现向导页框架,包含步骤条和基本表单(项目名称、目标) | ✅ 已完成 | WizardPage.tsx
|
||||||
| 2 | P0-2: 章程模板填充 | 基于用户输入生成项目章节Markdown(目标、范围、里程碑、干系人) | ⬜ 待开发 | |
|
| 2 | P0-2: 章程模板填充 | 基于用户输入生成项目章节Markdown(目标、范围、里程碑、干系人) | ⬜ 待开发 | |
|
||||||
| 3 | P0-3: 飞书消息发送 | Node.js+Hono调用飞书Open API发送文本消息 | ⬜ 待开发 | |
|
| 3 | P0-3: 飞书消息发送 | Node.js+Hono调用飞书Open API发送文本消息 | ⬜ 待开发 | |
|
||||||
| 4 | P0-4: 看板基础组件 | 三列看板+拖拽(dnd-kit) | ⬜ 待开发 | |
|
| 4 | P0-4: 看板基础组件 | 三列看板+拖拽(dnd-kit) | ⬜ 待开发 | |
|
||||||
|
|||||||
143
src/lib/charter.ts
Normal file
143
src/lib/charter.ts
Normal file
@@ -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}*
|
||||||
|
`;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user