PMO Assistant Skill
本技能覆盖 PMO 需求追踪的完整工作流:从原始 Excel 数据清洗 → 合并 → 看板生成。
触发条件
- 用户说"PMO 看板"、"需求追踪看板"、"生成看板"
- 用户说"清洗 PMO 数据"、"清洗需求数据"
- 用户说"PMO 助手"、"需求燃尽图"
完整工作流
第一阶段:数据清洗与合并
输入文件:
需求收集表.xlsx(原始需求数据,含2行合并表头)Matrix项目数据.xlsx(Matrix 项目数据)
输出文件:
合并需求数据_清洗后.xlsx(含合并数据和按业务线拆分两个 Sheet)
执行步骤:
Step 1:运行合并清洗脚本
cd {工作目录}
python3 scripts/merge_data.py
脚本自动完成:
- 读取两个输入文件(自动处理2行表头)
- 清洗字符串列(
strip()、处理 nan) - 统一状态字段(归一化为9种标准状态)
- 生成一级状态字段(未开始/进行中/已完成)
- 外连接合并(以 Matrix ID 为键)
- 输出到
合并需求数据_清洗后.xlsx(Sheet:合并数据)
Step 2:按业务线拆分
python3 scripts/split_by_business_line.py
脚本自动完成:
- 读取
合并需求数据_清洗后.xlsx第一个 Sheet - 将
业务线(212982)字段中含逗号的记录拆分为多条 - 结果写入新 Sheet
按业务线拆分 - 供看板生成脚本使用
注意:merge_data.py 中的输入输出路径是硬编码的,如果用户提供了不同路径,需要先修改脚本中的 file1_path、file2_path、output_path 变量。
第二阶段:生成看板
读取 合并需求数据_清洗后.xlsx(sheet: 按业务线拆分),生成 PMO看板.html。
执行:
cd {工作目录}
python3 scripts/generate_dashboard_data.py
脚本自动完成:
- 过滤数据只保留 2026 年及以后(
创建时间 >= 2026-01-01) - 计算周度/月度趋势、吞吐量、燃尽图数据
- 计算各业务线完成率(含排序列表
biz_completion_list) - 生成完整 HTML 文件(含嵌入式 DATA 对象,本地 Chart.js 文件)
第三阶段:验证与交付
# JS 语法检查
cd {工作目录}
node -e "
const fs=require('fs');
const html=fs.readFileSync('PMO看板.html','utf8');
const m=html.match(/<script>[\s\S]*?<\/script>/g);
let js='';m.forEach(s=>{js+=s.replace(/<\/?script>/g,'');});
try{new Function(js);console.log('JS 语法正常');}catch(e){console.log('JS 错误:',e.message);}
"
验证通过后,用 deliver_attachments 交付 PMO看板.html。
用户可直接用浏览器打开(file:// 协议,离线可用)。
看板内容
| 图表 | 说明 | |------|------| | 汇总卡片 | 需求总量、已完成、进行中、完成率、业务线数 | | 周度/月度趋势 | 新增 vs 完成条形图 | | 周度/月度吞吐量 | 完成-新增,绿色为正、红色为负 | | 燃尽图(周度/月度) | 剩余未完成需求折线图 | | 需求优先级分布 | 饼图(高/中/低) | | 业务线完成度 | 横向条形图,按完成率降序,显示 完成率%(已完成/总数) | | 各业务线状态分布 | 堆叠条形图 | | 业务线甘特图 | 浮条时间线图,按需求着色(已完成=绿、进行中=蓝),动态高度 |
核心文件
| 文件 | 位置 | 说明 |
|------|------|------|
| merge_data.py | scripts/ | 数据清洗与合并(去空格、状态归一化、外连接合并) |
| split_by_business_line.py | scripts/ | 按业务线拆分(逗号分隔的业务线拆分为多条记录) |
| generate_dashboard_data.py | scripts/ | 看板生成脚本(读取清洗后Excel → 生成HTML) |
| chart.min.js | assets/ | Chart.js 本地副本(v4.4.1) |
| chartjs-plugin-datalabels.min.js | assets/ | datalabels 插件本地副本 |
关键实现细节
数据过滤
只保留 创建时间 >= 2026-01-01 的数据,避免历史数据干扰。
biz_completion_list
Python 生成已排序的列表(按完成率降序),含 name/rate/done/total 字段,
JS 直接使用数组渲染,避免字典查找导致 undefined。
动态高度
业务线完成度图表根据业务线数量动态设置高度:Math.max(300, 条数 × 44)px
图表 ID 命名规范
- 汇总看板:
ch-weekly-trend,ch-monthly-trend,ch-weekly-tp,ch-monthly-tp,ch-weekly-burndown,ch-monthly-burndown,ch-priority,ch-biz-completion,ch-biz-status - 业务线看板:
ch-b-前缀
JS 防御性编程
每个图表渲染用独立 try-catch,单个图表失败不影响其他图表。
常见问题
Q: 图表显示 undefined? A: 通常是浏览器缓存了旧版 HTML,按 Cmd+Shift+R 强制刷新。
Q: 业务线完成度显示 (undefined/undefined)?
A: datalabels formatter 第二个参数是 context 对象,需用 ctx.dataIndex 取索引,不能直接用 i。
Q: 想调整图表顺序?
A: 修改 scripts/generate_dashboard_data.py 中 HTML 模板部分的卡片顺序。
Q: 发给同事后打开报错 Chart is not defined? A: HTML 使用 CDN 加载 Chart.js(jsdelivr),需要联网。如果同事在内网无法访问外网,需要把 chart.min.js 和 chartjs-plugin-datalabels.min.js 和 HTML 放在同一目录。
Q: 合并后数据量与预期不符?
A: 检查 merge_data.py 中 Matrix ID 格式是否一致。如果 file1 的 ID 带 .0 后缀而 file2 不带,会导致外连接匹配失败。脚本已内置 .0 后缀清理逻辑。
Q: 企微导出的 Excel 报错 Fill() takes no arguments?
A: openpyxl 3.1.x 与部分 Excel 样式不兼容。merge_data.py 已内置猴子补丁解决。
Q: 看板文件覆盖了历史版本?
A: 每次生成看板文件名自动带日期(如 PMO看板_20260526.html),历史版本不会被覆盖。
变更记录
2026-05-26
- Matrix ID 标准化:
merge_data.py中 file1 和 file2 的 Matrix ID 统一去.0后缀,解决外连接匹配失败导致的数据偏差(349 → 363) - 处理优先级 NaN 填充:
merge_data.py中缺失的处理优先级字段默认填"中",解决优先级分布饼图为空的问题 - CDN 引用:
generate_dashboard_data.py中 Chart.js 和 datalabels 改用 jsdelivr CDN 加载,解决分享时外部 JS 文件找不到的问题 - 文件名加日期:
generate_dashboard_data.py输出文件名格式为PMO看板_YYYYMMDD.html,避免覆盖历史版本 - 业务线图表数据修复:
generate_dashboard_data.py中weekly_new_biz等 6 个字段改为{业务线: {周: 数量}}索引顺序,修复业务线看板图表为空的问题 - 企微 Excel 兼容:
merge_data.py新增 openpyxl Fill 猴子补丁和safe_read_excel函数,解决企微导出 Excel 样式解析崩溃的问题
2026-06-01
- 业务线甘特图:
generate_dashboard_data.py中新增gantt_biz数据计算和各业务线甘特图渲染。选中业务线后,在走势图下方显示该业务线的需求时间线(浮条图),按状态着色(已完成=绿、进行中=蓝、其他=灰),支持动态高度和日期格式化 tooltip。
微信扫一扫