Skill: ericshao2025/integrated-manufacturing-consulting (version 7.3.2)

--- name: integrated-manufacturing-consulting description: > 制造咨询全栈技能——以附件为素材，按5Part标准结构生成面向客户企业高层汇报的 正式咨询项目总结报告（非简单摘要）。整合四大模块：（1）7大部门调研方法论+ODP-I²诊断框架+改善项目定义（原manufacturing-consulting-toolkit）； （2）原PPT图片提取复用+python-pptx流程图/架构图绘制+麦肯锡风格设计引擎（原manufacturing-consulting-ppt）； （3）PPT/DOCX/PDF多格式输出+素材智能搜集+风格双因子选择+脑图PDF+S13自修复+S14微信交付（原consulting-report-generator）； （4）艾瑞咨询(iResearch)+QuestMobile行业报告搜索与问答（原consulting-report-search）。 覆盖精益生产、智能制造、计划物控（PC&MC）、数字化转型、AI与工业智能五大领域。 内置自进化系统，支持本地/离线模式，采用微软雅黑字体（Mac兼容），无BLOCK_ARC。 触发词：生成PPT、做报告、项目总结、阶段性总结、咨询报告、调研诊断、 生成总结报告、把这份资料做成PPT、根据这个内容生成报告。用户上传任何内容时， 自动触发此技能进行专业报告生成。 compatibility: Requires Python 3.9+, pip, python-pptx, lxml, python-docx, reportlab. ---> # 制造咨询全栈技能 v7.3（项目总结报告·客户高层汇报·5Part结构） > **版本演进**：v3 Pro → v4 → v5 → v5.1 → v6 → v6.1 → **v7.0（全栈整合）→ v7.1（方法论升级）→ v7.2（结构修复）→ v7.3（咨询项目总结报告重构：明确以附件为素材生成面向客户高层的正式汇报材料，5Part标准结构35-60页，非简单摘要）** > > **核心升级**： > - 🧬 **技能自进化系统** — 每日发现新技能、追踪使用模式、自动优化 > - 🔍 **技能发现引擎** — 扫描126+本地技能，智能推荐可集成的新能力 > - 📊 **使用分析引擎** — 追踪布局模式使用频率，优化模板选择 > - 🐛 **错误学习机制** — 记录每次错误与修复，避免重复问题 > - 🔄 **持续优化循环** — 自动更新技能生态矩阵，保持与时俱进 > - 🎯 **内容类型自识别** — 上传任意PPT/文字，自动判断内容类型 > - 🔬 **深度研究引擎** — 多源交叉验证、证据层次、三轮调研循环 > - 🖼️ **OCR/文档识别** — PDF、图片、Word、Excel文字提取 > - 🧠 **内容智能扩增** — 联网搜索补充，扩展报告深度 > - ✨ **去AI味润色** — 集成 humanizer-zh 去除AI痕迹 > - 🎨 **素材智能搜集引擎**（v6新增）— 自动搜图、搜图标、搜参考PPT、搜配色方案 > - 👔 **模板风格智能选择**（v6新增）— 内容驱动+用户偏好双因子风格推荐 > - 📄 **多格式输出**（v6.1新增）— PPT/DOCX/PDF 三格式支持，无明确指令时默认生成PPT > - 🧠 **脑图PDF输出**（v6.1新增）— 根据PPT结构自动生成思维导图PDF，可视化报告大纲 > - 🏢 **7大部门调研方法论**（v7.0新增）— 销售/计划/生产/采购/仓储/质量/工艺调研指南+访谈问题库+检查清单 > - 🔬 **ODP-I²诊断框架**（v7.0新增）— 端到端问题诊断模型+改善方向库+优先级四象限+改善项目卡片 > - 🖼️ **原PPT图片提取复用**（v7.0新增）— 从参考PPTX中提取图片直接嵌入新报告 > - 🏗️ **流程图/架构图绘制引擎**（v7.0新增）— 路线图/组织结构图/业务流程图/鱼骨图/甘特图等9种图表 > - 📊 **行业报告搜索与问答**（v7.0新增）— 艾瑞咨询(iResearch)+QuestMobile报告搜索，行业数据一键获取 > - 🎯 **复杂度自适应分级**（v7.1新增）— L1/L2/L3三级自适应，简单问题快速输出；复杂问题多框架组合 > - 🧩 **框架组合策略**（v7.1新增）— 预设5种制造咨询组合（生产效率/质量改善/供应链/工厂规划/战略评估） > - ✅ **跨框架交叉验证**（v7.1新增）— 多框架结论模式连接+矛盾化解+深层洞察 > - 💰 **IE经济分析模板**（v7.1新增）— ROI/NPV/回收期分析，改善建议可量化可计算 > - 🏛️ **咨询项目总结报告模式**（v7.3重构）— 以附件为素材生成面向客户高层的正式汇报材料，5Part结构35-60页，非精简摘要 > - 🖼️ **原PPT图片复用**（v7.3新增）— 自动提取附件中的组织架构图/流程图/数据截图等关键图片，嵌入咨询报告的对应页面 --- ## 一、定位 ### 技能名称 `consulting-report-generator`（通用报告生成器） ### 核心能力 > **输入附件内容 → 解析项目资料 → 生成面向客户高层的正式咨询项目总结报告** 本技能不是对输入附件做"精简摘要"，而是以附件为原始素材，按照咨询行业专业标准，生成供被服务企业高层及相关部门审阅的**项目总结汇报材料**。 附件的作用是提供项目背景、调研数据、分析过程、改善措施等原始素材。技能在此基础上进行： - 结构化整理 → 按咨询报告框架重组 - 专业升维 → 从原始数据到洞察结论 - 场景适配 → 面向高层汇报的叙事逻辑 - 格式规范 → 符合麦肯锡风格的视觉呈现 ### 双模式工作 | 模式 | 触发条件 | 说明 | |:----|:---------|:-----| | **🎯 通用模式** | 任何非制造领域的内容 | 自适应模板，自动检测内容结构，生成通用总结报告 | | **🔧 制造专家模式** | 检测到制造/精益/数字化关键词 | 调用ie-expert等专业分析技能，不限页数深度展开 | ### 内容类型自动检测 当用户上传资料时，自动执行内容分析： ``` 输入内容分析 │ ├── 关键词检测: 精益/OEE/MES/TPM/SMED → 制造专家模式 ├── 关键词检测: 项目/里程碑/成果/阶段 → 项目管理模式 ├── 关键词检测: 市场/竞争/客户/份额 → 市场分析模式 ├── 关键词检测: 技术/架构/系统/方案 → 技术总结模式 └── 未匹配 → 通用模式（自适应模板） ``` ### 用户角色 精益生产、智能制造、计划物控（PC&MC）、数字化转型、AI与工业智能资深咨询专家； 以及任何需要将内容转化为专业报告的职场人士。 ### 覆盖领域 | 领域 | 说明 | 模式 | |:----|:------|:----:| | **精益生产** | VSM、5S、TPM、SMED、Kaizen、OEE、JIT | 制造专家 | | **计划物控** | MPS、MRP、RCCP、排产调度、库存控制、齐套管理 | 制造专家 | | **智能制造** | MES/WMS、数字化车间、数据采集、工业互联网 | 制造专家 | | **数字化转型** | 数字化战略、IT架构、数据治理、系统集成 | 制造专家 | | **AI与工业智能** | AI质检、预测维护、智能排产、数字孪生 | 制造专家 | | **项目管理** | 项目总结、阶段汇报、结项报告 | 通用 | | **市场分析** | 竞品分析、市场调研、行业报告 | 通用 | | **技术总结** | 技术方案、架构设计、研发总结 | 通用 | | **运营分析** | 经营分析、绩效报告、数据复盘 | 通用 | ### 报告类型 — 不限页数，内容深度驱动 | 类型 | 默认深度 | 适用场景 | 说明 | |:----|:--------:|:---------|:-----| | **🎯 项目总结报告** | 不限深度 | **终期交付/客户高层汇报（核心场景）** | **见下方咨询项目总结报告标准结构** | | **阶段总结** | 章节完整展开 | 项目中期/里程碑汇报 | 按项目模块逐项深入展开，每模块3-5页 | | **分析报告** | 不限深度 | 调研/诊断/市场分析 | 每个诊断维度独立成节，数据+根因+改善建议 | | **汇报提案** | 详实论证 | 方案汇报/投资审批 | 方案论证、数据支撑、对比分析完整呈现 | | **专题分析** | 全深度展开 | 特定课题深度研究 | 完整的研究方法+数据分析+结论+建议 | #### 咨询项目总结报告标准结构（核心产出） 面向客户企业高层（CEO/VP/部门负责人）汇报时使用的正式咨询交付物： ``` PART 01 项目概况 (背景·范围·团队·方法) ├─ 企业背景与项目动因 ├─ 项目目标与范围 ├─ 项目团队与分工 └─ 咨询方法论与实施路径 PART 02 现状诊断 (调研·数据·发现) ├─ 调研方法与过程 ├─ 关键发现与问题归类 ├─ 数据采集与分析（基线数据） └─ 根因分析总结 PART 03 改善方案 (规划·设计·实施) ├─ 改善方案设计思路 ├─ 模块一：组织/流程/系统（逐项展开） ├─ 模块二：按实际项目模块展开 ├─ 模块三：... └─ 实施路径与时间线 PART 04 成果验证 (数据·指标·对比) ├─ 关键指标改善对比（Before/After） ├─ 各模块验证结果 ├─ 异常处理与问题闭环 └─ 经济效益分析 PART 05 总结展望 (价值·沉淀·规划) ├─ 项目核心成果总结 ├─ 客户能力沉淀 ├─ 持续改善建议 └─ 下一步合作展望 附录 (数据·图表·资料) ``` > **关键原则**：附件内容中的每一页、每一个数据点都有其汇报价值。不要"删减"内容，而是将原始素材**重新编排**为面向客户高层的汇报叙事。项目模块越多、数据越丰富，生成的报告页数就越多（推荐25-50页），而不是压缩到8-10页。 > **核心原则**：除非用户指定页数，否则**不设上限**。每个模块充分展开，数据表格完整呈现，对比分析逐项展开，确保信息密度和专业深度。生成建议页数为各项之和，但不受限于任何固定页数。 --- ## 二、架构 — 十二层设计（v7.2 全栈整合） ``` ┌─ 咨询方法论层 ──【v7.0新增】─────────────────────────────┐ │ 制造咨询四阶段方法论 + 7大部门调研指南 │ │ ▸ Phase1 调研诊断：部门流程穿行、数据采集、痛点挖掘 │ │ ▸ Phase2 问题分析：ODP-I²诊断模型、根因分析、优先级排序 │ │ ▸ Phase3 改善规划：改善项目定义、ROI评估、项目卡片 │ │ ▸ Phase4 合作交付：调研报告、改善建议书、合作方案 │ ├─ 自进化层 ──【v5新增】──────────────────────────────────────┐ │ 技能发现引擎 + 使用分析 + 错误学习 + 模板优化 │ │ ▸ 每日扫描 ~/.workbuddy/skills/ 发现新技能 │ │ ▸ 追踪布局模式使用频率，自动推荐最佳模板 │ │ ▸ 记录每次执行错误与修复，持续改进 │ │ ▸ 自动更新技能生态矩阵，保持与系统同步 │ │ ▸ 每次执行后写入进化日志，供后续参考 │ ├─ 识别层 ──────────────────────────────────────────────────┤ │ 内容类型自动检测 + 自适应模板选择 │ │ ▸ 关键词扫描 → 判断内容领域（制造/项目/市场/技术/通用） │ │ ▸ 结构分析 → 识别章节/数据/图表/KPI │ │ ▸ 模板匹配 → 根据内容类型选择最佳模板 │ │ ▸ 制造领域 → 启用专家技能生态 │ ├─ 设计层 ──────────────────────────────────────────────┤ │ mck-ppt-design 引擎（70种麦肯锡布局模式） │ │ ▸ 所有标准布局模式保持不变 │ │ ▸ 【v7.0】9种咨询流程图/架构图绘制引擎： │ │ 路线图/组织结构图/业务流程图/鱼骨图/甘特图/KPI仪表盘 │ ├─ 图片提取复用层 ──【v7.0新增】─────────────────────────┤ │ python-pptx图片提取引擎 │ │ ▸ 从参考PPTX逐页提取所有图片 → 按幻灯片编号+形状名称保存 │ │ ▸ 支持提取组织结构图、流程图、现场照片等关键视觉素材 │ │ ▸ 提取的图片直接嵌入新PPTX的对应页面 │ ├─ 行业报告搜索层 ──【v7.0新增】─────────────────────────┤ │ 艾瑞咨询(iResearch) + QuestMobile 行业报告搜索 │ │ ▸ 市场报告搜索 → AI营销/数字化/智能制造等行业报告 │ │ ▸ 报告详情提取 → 摘要+目录+图表目录+在线阅读链接 │ │ ▸ 报告问答 → 基于报告内容的Q&A │ │ ▸ 联网搜索降级（iResearch/QuestMobile均无结果时回到web）│ ├─ 素材层 ──【v6新增】───────────────────────────────────┤ │ PPT素材智能搜集 + 模板风格选择引擎 │ │ ▸ 行业图片搜索 → 按内容关键词收集高质量配图 │ │ ▸ 图标/装饰元素 → 创建装饰图标资源池 │ │ ▸ 参考PPT分析 → 提取优秀设计元素（配色/字体/布局比例） │ │ ▸ 风格双因子推荐 → 内容主题 × 受众期望 → 最优风格 │ │ ▸ 素材本地化 → 下载并保存到素材缓存目录 │ │ ▸ 用户确认 → 展示素材预览，让用户调整风格选择 │ ├─ 研究层 ──【v5.1新增】──────────────────────────────────┤ │ 深度研究引擎 + 多源交叉验证 + 证据层次 │ │ ▸ 关键数据点识别 → 自动判断是否需要深度研究 │ │ ▸ 三级调研（广度/深度/交叉验证） │ │ ▸ 四级证据体系（L1-L4） │ │ ▸ 对接academic-deep-research等研究技能生态 │ ├─ 内容层 ──────────────────────────────────────────────┤ │ 联网搜索（免API） + 内容扩增引擎 │ │ ▸ multi-search-engine（16引擎中英双语） │ │ ▸ WebSearch（WorkBuddy内置搜索） │ │ ▸ WebFetch（搜索结果详情提取） │ │ ▸ 智能扩增：搜索补充资料 → 扩展报告深度 │ ├─ 提取层 ──────────────────────────────────────────────┤ │ OCR识别 + 文档解析 + 图片文字提取 │ │ ▸ markitdown（PDF/Word/Excel/图片OCR/HTML/URL） │ │ ▸ Read工具（直接读取PDF/图片/文本） │ │ ▸ python-pptx提取（PPT图片/文字） │ │ ▸ 原PPT图片提取复用（extract_images_from_pptx()） │ ├─ 分析层 ──────────────────────────────────────────────┤ │ 通用分析（所有模式） │ 制造专家（仅制造领域） │ │ ▸ 数据趋势分析 │ ▸ ie-expert（工业工程） │ │ ▸ 竞品对比分析 │ ▸ rohoon-6sigma（六西格玛） │ │ ▸ SWOT/波特五力 │ ▸ inventory-*（库存分析） │ │ ▸ 数据可视化 │ ▸ planning-mc（计划物控） │ │ ▸ 图表生成 │ ▸ lean-toolkit（精益工具） │ │ ▸ 统计建模 │ ▸ mfg-toolkit（制造咨询） │ │ │ ▸ CIO（数字化战略） │ ├─ 输出层 ──────────────────────────────────────────────┤ │ 三格式输出引擎（v6.1新增）： │ │ ▸ PPT（默认）：python-pptx + mck-ppt-design 布局 │ │ ▸ DOCX：python-docx 原生生成，完整格式化+表格+图表 │ │ ▸ PDF：Markdown→reportlab 管道，CJK字符完美支持 │ │ ▸ 🧠 脑图PDF：从Slide Config自动生成结构脑图（v6.1） │ │ 全格式统一规范：微软雅黑（Mac兼容） │ │ humanizer-zh 去AI味润色 │ │ full_cleanup() 深度XML净化 + AUDIT() 自审函数 │ └────────────────────────────────────────────────────────┘ ``` --- ## 三、内容分析引擎（v4 通用 ⭐） ### 3.1 功能定位 **核心创新**：不再依赖固定的内容预设，而是智能分析用户提供的实际内容，自动决定报告的结构、模板和重点。 ### 3.2 内容类型检测 接收到用户内容后，执行以下分析流程： ```python # 内容类型自动检测 def detect_content_type(text): """根据提取的文字内容判断内容类型""" indicators = { "manufacturing": ["精益", "OEE", "TPM", "SMED", "MES", "WIP", "Kaizen", "5S", "VSM", "Takt", "换型", "在制", "节拍", "数字化车间"], "project": ["项目背景", "里程碑", "交付物", "甘特图", "阶段", "进度", "风险", "项目总结", "结项", "收益"], "market": ["市场", "竞品", "客户", "份额", "SWOT", "波特", "增长率", "市场规模", "竞争对手"], "technical": ["架构", "系统", "方案设计", "技术路线", "模块", "接口", "部署", "测试", "上线", "版本"], "business": ["营收", "利润", "KPI", "增长率", "ROI", "成本", "预算", "达成率", "同比", "环比", "运营"], } scores = {k: sum(1 for kw in v if kw in text) for k, v in indicators.items()} best = max(scores, key=scores.get) return best if scores[best] >= 3 else "general" ``` 检测结果决定： - **制造领域**（manufacturing）→ 启用制造专家模式 + 内容驱动不限页模板 - **项目管理**（project）→ 项目管理模板（含甘特/里程碑/风险矩阵） - **市场分析**（market）→ 市场分析模板（含竞品矩阵/SWOT/趋势图） - **技术总结**（technical）→ 技术总结模板（含架构图/路线图/对比表） - **运营分析**（business）→ 运营分析模板（含KPI仪表盘/趋势/行动项） - **通用**（general）→ 通用模板（摘要/数据/对比/时间线/行动） ### 3.3 自适应模板引擎 基于内容类型，自动选择模块化结构（页数由内容量自动决定）： ``` 制造领域: [封面→目录→背景→KPI→BA→支柱→流程→时间线→仪表盘→结束] 项目管理: [封面→目录→概述→里程碑→成果→风险→资源→时间线→行动→结束] 市场分析: [封面→目录→环境→竞品→SWOT→趋势→策略→对比→建议→结束] 技术总结: [封面→目录→背景→架构→方案→对比→路线→验证→展望→结束] 通用模板: [封面→目录→摘要→数据→分析→对比→时间线→行动→总结→结束] ``` ### 3.4 内容驱动的内容层 对于**通用模式**，报告章节内容直接从用户提供的资料中提取和重组： | 模板章节 | 内容来源 | 生成方式 | |:---------|:---------|:---------| | 封面标题 | 自动从内容中提取主题 | 提取最高频关键词或首句 | | 摘要 | 用户资料中的概要/总结部分 | 浓缩提炼，去AI味 | | 关键数据 | 提取的数字/指标/KPI | 做成#8 Big Number卡片 | | 分析对比 | 内容中的对比/优劣势 | 做成#20 Before/After | | 时间线 | 内容中的时间/阶段节点 | 做成#29 Timeline | | 行动项 | 内容中的建议/下一步 | 做成#35 Action Items | | 来源 | 用户资料本身 | 标注"数据来源：用户资料" | --- ## 四、资料提取子系统 ### 4.1 功能定位 从用户提供的各类材料中智能提取文字内容，作为 PPT 生成的内容根基： | 输入类型 | 提取方法 | 输出 | |:---------|:---------|:-----| | PDF 文件 | `markitdown` / `Read`（内置PDF阅读） | 纯文本/Markdown | | Word (.docx) | `markitdown` / python-pptx 读取 | 结构化文本 | | Excel (.xlsx) | `markitdown` / openpyxl 读取 | 表格数据 | | 图片 (PNG/JPG) | `markitdown` (OCR) / `Read`（内置图片阅读） | 识别的文字 | | HTML/URL | `markitdown` / `WebFetch` | 格式化文本 | | PPTX (参考) | `extract_images_from_pptx()` + python-pptx 文本读取 | 图片+文字 | | 纯文本 (.txt/.md) | `Read` 直接读取 | 原文 | ### 4.2 提取流程 ``` 用户提供资料 │ ▼ ┌── 判断文件类型 ──────────────────────────────────────┐ │ │ │ PDF/Word/Excel/Image ──→ 方法A: markitdown CLI │ │ 方法B: Read工具（内置支持） │ │ │ │ PPTX ──→ extract_images_from_pptx() + python-pptx读取 │ │ │ │ HTML/URL ──→ WebFetch / markitdown │ │ │ │ 图片含表格 ──→ 手动提取表格结构 + 文字描述 │ │ │ └────────────────────────────────────────────────────────┘ │ ▼ ┌── 提取结果处理 ───────────────────────────────────────┐ │ ▸ 按文件来源分类整理 │ │ ▸ 识别关键数据点（数字、指标、日期、KPI） │ │ ▸ 提取行业术语和技术要点 │ │ ▸ 整理为结构化内容摘要 │ │ ▸ 输出 `extracted_content.md` 供后续使用 │ └────────────────────────────────────────────────────────┘ ``` ### 4.3 markitdown 使用规范 ```bash # 安装 pip install 'markitdown[all]' # 基本用法 markitdown 输入文件路径 -o 输出文件.md # 示例 markitdown report.pdf -o report.md # PDF markitdown data.xlsx -o data.md # Excel markitdown photo.png -o photo.md # 图片OCR markitdown https://example.com -o page.md # 网页 markitdown doc.docx -o doc.md # Word ``` ### 4.4 资料提取规则（R6-R9） | 规则 | 要求 | |:----|:------| | **R6** | 用户提供资料时，必须优先执行资料提取，不得跳过 | | **R7** | 提取的文字必须按文件来源分类整理，不得混杂 | | **R8** | 提取结果中识别关键数据点（数字/指标/年份）单独标注 | | **R9** | 提取失败时告知用户，使用降级方法（Read工具→WebFetch）重新尝试 | --- ## 五、内容扩增子系统 ### 5.1 功能定位 基于用户提供的资料内容，通过联网搜索 + 专业技能分析，智能扩展补充，提升报告的信息密度和专业深度。 ### 5.2 三级扩增模型 ``` L1: 直引 → 直接引用用户资料中的事实和数据 └── 来源标记为 "数据来源：用户资料" L2: 搜索补充 → 对每个关键数据点搜索行业基准/对标值 └── 来源标记为 "来源：XXX（搜索日期）" L3: 专业深化 → 调用技能生态进行专业分析 └── 调用 ie-expert / rohoon-6sigma 等分析 ``` ### 5.3 扩增策略矩阵 | 用户资料内容 | 搜索补充方向 | 扩增目标 | 研究深度 | |:-------------|:-------------|:---------|:--------:| | 项目周期/范围 | 搜索同行业同类项目周期基准 | 对比分析，评估项目效率 | standard | | 效率指标（OEE/良率/周期） | 搜索行业基准值、TEEPTRAK报告 | 行业对标，凸显差距 | standard | | 库存周转数据 | 搜索同行业库存周转基准 | 定位行业水平 | standard | | 改善措施清单 | 搜索最佳实践案例、成功对标 | 丰富方案论证 | quick | | 投资/成本数据 | 搜索行业ROI基准、政策补贴 | 论证投资的必要性 | quick | | 项目名称/关键词 | 搜索行业趋势、最新政策 | 提升报告时效性 | standard | | 竞争对手提及 | 搜索竞争对手动态、行业排名 | 竞争格局分析 | **deep** | | 市场规模/政策引用 | 搜索权威报告+政策原文 | 数据权威性验证 | **deep** | | 技术趋势/前沿课题 | 搜索学术论文+行业白皮书 | 前瞻性分析 | **deep** | ### 5.4 扩增执行流程 ``` 提取的原始内容 │ ▼ ┌── 关键数据点识别 ────→ 数字指标、KPI、日期、行业术语 │ ▼ ┌── 搜索规划 ──────────→ 每个数据点对应2个搜索关键词 │ ├── [深度检测] 是否需要三轮调研？ │ ├─ 数字指标 → standard/deep │ ├─ 竞品/政策 → deep │ └─ 纯描述 → quick（跳过研究） │ ▼ ┌── 联网执行 ──────────→ multi-search-engine / WebSearch │ (根据深度级别执行1-3轮) ▼ ┌── 交叉验证 ──────────→ 多来源对比（仅deep模式） │ ▼ ┌── 数据融合 ──────────→ 用户数据 + 搜索数据 = 综合结论 │ ▼ ┌── 专业深化 ──────────→ 调用技能生态验证分析 │ ▼ ┌── 内容撰写 ──────────→ 撰写扩增后的报告内容 │ ▼ ┌── 去AI味润色 ────────→ humanizer-zh 去除AI痕迹 ``` ### 5.5 去AI味润色（集成 humanizer-zh） 生成的内容在写入 PPT 前，必须执行去AI味处理： ```python # 检查点：每条文案输出前自检以下特征 CHECK_LIST = [ "❌ 夸大的象征用语（"革命性""颠覆性""前所未有的"）", "❌ 宣传性/空洞表述（"赋能""抓手""闭环""打通"）", "❌ 模糊归因（"一般来说""某种程度""通常"）", "❌ 过度三段式（"第一...第二...第三..."）", "❌ AI常用词汇（"值得关注的是""值得注意的是"）", "❌ 过多连接短语（"此外""同时""另外""而且"）", ] ``` **规则**：每条 Action Title 和正文段落必须经过自检，去除上述特征后再写入 PPT。 --- ## 六、设计要求 ### 6.1 布局模式（基于 mck-ppt-design） 废弃全部自定义图表函数（VSM/GANTT/BAR/PIE等），全面使用 mck-ppt-design 的布局模式： | 类别 | 布局模式 | 用途说明 | |:----|:---------|:---------| | **结构导航** | #1 Cover / #5 Section Divider / #6 TOC / #36 Closing | 封面/章节/目录/结束 | | **数据统计** | #8 Big Number / #11 Data Table / #12 Metric Cards / #52 KPI Tracker | 关键数字/表格/指标/KPI追踪 | | **框架矩阵** | #14 Three-Pillar / #16 Process Flow / #24 Exec Summary | 三支柱/流程箭头/执行摘要 | | **对比评估** | #20 Before/After / #39 Horizontal Bar / #37 Grouped Bar | 改善前后对比/水平柱状图排名/分组柱状图 | | **时间流程** | #24 Exec Summary / #29 Timeline / #35 Action Items | 执行摘要/时间线/行动项卡片 | | **综合仪表盘** | #57 Dashboard | KPI行+柱状图+关键洞见 | | **深蓝递进** | #60 HeaderBar | 深蓝顶栏标题+副标题 | | **深蓝递进** | #61 PYRAMID | 居中多层金字塔布局 | | **深蓝递进** | #62 BLOCK_3COL | 父块内三列子块 | | **深蓝递进** | #63 TAG_CHIP | 层级标签chip | | **深蓝递进** | #64 LEFT_LABEL_BAR | 左标签+右内容色条 | | **战略分析** | #70 SWOT | SWOT四象限战略分析矩阵 | | **数据可视化** | #71 PIE_BAR | 占比柱状图（避免BLOCK_ARC） | | **卡片装饰** | #72 ICON / DECORATED_CARD | 图标装饰+带图标卡片 | | **对比分析** | #73 MATRIX | 比较矩阵（多维度对比） | ### 6.2 配色规范 — Theme Contract 主题合约模式 采用标准化的 **5 色主题合约** 机制，所有布局函数统一遵守。每个主题定义 5 个颜色密钥： ``` Theme Contract = {primary, secondary, accent, light, bg} ``` **当前系统默认合约（咨询专业风）：** | 密钥 | 变量名 | RGB | 用途 | |:----|:------|:----:|:-----| | **primary** | NV | (05, 1C, 2C) | 主色/标题/表格头/关键强调 | | **secondary** | D3 | (33, 33, 33) | 正文内容/次级文字 | | **accent** | AB | (00, 6B, A6) | 第一项强调/连接/引导 | | **light** | BG | (F2, F2, F2) | 背景面板/卡片底/浅灰行 | | **bg** | WH | (FF, FF, FF) | 白色背景 | **扩展辅助色（所有合约通用）：** | 颜色 | 简写 | RGB | 用途 | |:----|:----|:----:|:-----| | 强调绿 | AG | (00, 7A, 53) | 正向/改善后/完成 | | 强调橙 | AO | (D4, 6A, 00) | 警示/连接箭头/风险 | | 强调红 | AR | (C6, 28, 28) | 负向/改善前/未达标 | | 浅蓝 | LB | (E3, F2, FD) | 蓝色卡片背景 | | 浅绿 | LG2 | (E8, F5, E9) | 绿色卡片背景 | | 浅橙 | LO | (FF, F3, E0) | 橙色卡片背景 | | 浅红 | LR | (FF, EB, EE) | 红色卡片背景 | | 中灰 | M6 | (66, 66, 66) | 次级文字/来源 | | 浅灰 | LG | (CC, CC, CC) | 分隔线 | | 深蓝L1 | LV1 | (05, 1C, 2C) | 递进色最深层 | | 深蓝L2 | LV2 | (0A, 30, 4A) | 递进色第2层 | | 深蓝L3 | LV3 | (10, 44, 62) | 递进色第3层 | | 深蓝L4 | LV4 | (16, 58, 7A) | 递进色第4层 | | 深蓝L5 | LV5 | (1C, 6C, 92) | 递进色第5层(最浅) | | 子色1 | SV1 | (10, 60, 78) | 交付加速 | | 子色2 | SV2 | (10, 68, 82) | 成本精控 | | 子色3 | SV3 | (10, 70, 8C) | 质量跃升 | ### 6.6 多配色主题 — Theme Contract 引擎（v5新增·v6增强） 每个主题遵循标准的 **5 色合约**：`{primary, secondary, accent, light, bg}`。 | 主题名 | primary | secondary | accent | light | bg | 风格 | 推荐内容类型 | |:------|:--------|:----------|:-------|:------|:---|:-----|:------------| | **deepblue** | #051C2C 深蓝 | #333333 深灰 | #006BA6 蓝 | #F2F2F2 浅灰 | #FFFFFF 白 | 咨询专业风 | manufacturing, supply_chain, lean, project | | **tech** | #005A96 亮蓝 | #333333 深灰 | #007A53 绿 | #F0F7FF 浅蓝 | #FFFFFF 白 | 科技现代风 | AI, digital, smart_mfg, IT_architecture | | **business** | #2C3E50 商务灰 | #333333 深灰 | #006BA6 蓝 | #F5F5F5 浅灰 | #FFFFFF 白 | 沉稳专业风 | management, finance, operation, general | | **vibrant** | #D46A00 活力橙 | #333333 深灰 | #C62828 红 | #FFF5EB 浅橙 | #FFFFFF 白 | 热情鲜明风 | innovation, kickoff, change, startup | **Python 主题合约实现：** ```python # Theme Contract 字典（供生成脚本引用） THEME_CONTRACT = { "deepblue": { "primary": (0x05, 0x1C, 0x2C), "secondary": (0x33, 0x33, 0x33), "accent": (0x00, 0x6B, 0xA6), "light": (0xF2, 0xF2, 0xF2), "bg": (0xFF, 0xFF, 0xFF), "style_name": "咨询专业风", "section_deco": "深蓝左侧竖条", }, "tech": { "primary": (0x00, 0x5A, 0x96), "secondary": (0x33, 0x33, 0x33), "accent": (0x00, 0x7A, 0x53), "light": (0xF0, 0xF7, 0xFF), "bg": (0xFF, 0xFF, 0xFF), "style_name": "科技现代风", "section_deco": "渐变色横条", }, "business": { "primary": (0x2C, 0x3E, 0x50), "secondary": (0x33, 0x33, 0x33), "accent": (0x00, 0x6B, 0xA6), "light": (0xF5, 0xF5, 0xF5), "bg": (0xFF, 0xFF, 0xFF), "style_name": "沉稳专业风", "section_deco": "灰色细线分隔", }, "vibrant": { "primary": (0xD4, 0x6A, 0x00), "secondary": (0x33, 0x33, 0x33), "accent": (0xC6, 0x28, 0x28), "light": (0xFF, 0xF5, 0xEB), "bg": (0xFF, 0xFF, 0xFF), "style_name": "热情鲜明风", "section_deco": "橙色全宽色块", }, } def apply_theme(theme_name): """一键应用主题合约——设置全局色值""" t = THEME_CONTRACT[theme_name] NV = RGBColor(*t["primary"]); D3 = RGBColor(*t["secondary"]) AB = RGBColor(*t["accent"]); BG = RGBColor(*t["light"]) WH = RGBColor(*t["bg"]) return t["style_name"] ``` **风格自动选择逻辑（双因子推荐）：** ```python def auto_select_theme(content_type, user_preference=""): """ 根据内容类型和用户偏好自动选择最佳主题 内容类型权重60%，用户偏好权重40% """ type_theme_map = { "manufacturing": "deepblue", "project": "deepblue", "digital": "tech", "AI": "tech", "finance": "business", "management": "business", "innovation": "vibrant", "startup": "vibrant", } user_vibe_map = { "高端": "deepblue", "权威": "deepblue", "严肃": "deepblue", "科技": "tech", "前沿": "tech", "未来": "tech", "沉稳": "business", "稳重": "business", "保守": "business", "活力": "vibrant", "创新": "vibrant", "热情": "vibrant", } # 内容类型匹配 recommended = type_theme_map.get(content_type, "business") # 校正：如果用户表达了偏好 for word, theme in user_vibe_map.items(): if word in user_preference: return theme # 用户偏好优先级更高 return recommended ``` 使用方式：生成脚本开头调用 `theme = auto_select_theme(content_type, user_preference)`，然后 `apply_theme(theme)` 一键切换全局色系。 ### 6.3 字体规范 **全微软雅黑 + Arial英文：** | 层级 | 用途 | 字号 | 样式 | |:----|:----|:----:|:----:| | H0 | 封面标题 | 40pt | Bold, Microsoft YaHei | | H1 | Section标题 | 28pt | Bold, Microsoft YaHei | | H2 | Action Title（每页标题） | 22pt | Bold, Microsoft YaHei | | H3 | 卡片/子标题 | 14-16pt | Bold, Microsoft YaHei | | H4 | 正文/列表 | 12-14pt | Regular, Microsoft YaHei | | H5 | 注释/来源 | 9pt | Regular, Microsoft YaHei | **规则：** - 中文统一用 `Microsoft YaHei`（微软雅黑） - 英文/数字统一用 `Arial` - 通过 `a:ea` 节点设置东亚字体：`ea.set('typeface', 'Microsoft YaHei')` - 设置拉丁字体：`latin.set('typeface', 'Arial')` ### 6.4 Mac兼容规则（R1-R5） | 规则 | 要求 | 违反后果 | |:----|:-----|:---------| | **R1** | 字体：中文=微软雅黑 + 英文=Arial（不用Georgia） | Mac缺失Georgia显示方块 | | **R2** | ❌ 禁止 `MSO_SHAPE.BLOCK_ARC`（Mac PowerPoint不渲染） | 饼图/环形图用表格或柱状图替代 | | **R3** | ❌ 禁止 `MSO_SHAPE.DIAMOND`（菱形） | 改用圆角矩形+文字标注 | | **R4** | 文本框 `top+height` 不重叠，间距显式计算 | 多行文本动态计算高度 | | **R5** | 生成后必须执行 `full_cleanup()` | Mac打开时报错 | ### 6.5 资料提取兼容规则（R6-R9） R6-R9 规则的完整定义请参考 **第四章第4.4节「资料提取规则（R6-R9）」**，此处不再重复。 **快速索引：** - R6 → 资料必须优先提取 - R7 → 提取内容按来源分类 - R8 → 关键数据点单独标注 - R9 → 提取失败降级重试 --- ## 七、内容标准 — 深度优先自适应引擎（v6 升级 ⭐） > **核心原则**：不再设定固定页数上限。报告结构由内容量自动决定，每个模块充分展开到细节。除非用户明确指定页数，否则页数不受限制，以信息完整和专业深度为唯一衡量标准。 ### 模块化内容装配器 报告由以下模块组成，根据内容量自动装配。每个模块的页数由内容深度决定，不设上限： | 模块 | 用途 | 最小内容 | 典型展开 | 不设上限说明 | |:----|:-----|:--------|:--------|:------------| | **封面** | 项目标识 | 1页 | 1页 | 保持不变 | | **目录** | 导航 | 1页 | 1-2页 | 随章节数自动扩展 | | **章节分隔** | 视觉过渡 | 每章节1页 | 每章节1页 | 按实际章节数生成 | | **背景/概述** | 项目背景与目标 | 1页 | 2-4页 | 背景+痛点+目标可各占1页 | | **KPI/大数字** | 关键指标速览 | 1页 | 2-4页 | 每个维度可独立成页 | | **诊断/分析** | 问题发现与根因 | 2页 | 4-10页 | 每个诊断维度1-2页完整展开 | | **改善方案** | 解决方案详述 | 2页 | 6-12页 | 每个改善模块2-3页（方案+措施+预期） | | **对比分析** | 前后对比/对标 | 1页 | 2-6页 | 每个对比点可独立成页 | | **数据表格** | 详细数据支撑 | 1页 | 2-8页 | 每个数据集独立表格 | | **时间线** | 实施路径 | 1页 | 2-4页 | 详细到每月的里程碑 | | **仪表盘** | 综合洞见 | 1页 | 2-4页 | 多维度多图表 | | **行动项** | 下一步计划 | 1页 | 2-4页 | 每个行动项带详细描述 | | **结束页** | 总结致谢 | 1页 | 1-2页 | 保持不变 | > 每个模块的「典型展开」为参考建议，实际页数由内容量自行决定，**不受任何上限约束**。 ### 内容深度分级 生成的每一页报告内容按以下三级深度展开： | 深度级别 | 说明 | 示例 | |:--------|:-----|:------| | **L1: 结论先行** | 一页给出核心结论 + 关键支撑数据 | 适合高层面向决策者的总览页 | | **L2: 分析展开** | 问题描述 + 根因分析 + 数据证据 + 影响评估 | 适合核心分析页 | | **L3: 细节完整** | 全部数据表格 + 分项对比 + 详细注释 + 来源标注 | 适合数据支撑页 | **展开规则**：页面内容自动判断是否需要更多页来充分表达。如果一页排不下，自动拆分到下一页继续展开，不受任何页数限制。 ### 自动页数生成算法 ``` 内容总量(Total Content Units) │ ▼ ┌── 评估内容密度 ─────────────────────────────────────┐ │ │ │ 每个模块的 TCU = Σ(段落数 × 1.0 + 数据点 × 0.5 │ │ + 图表数 × 1.5 + 列表项 × 0.3) │ │ │ │ 每个Action Title(一页)容量 ≈ 4-6 TCU │ │ │ │ 该模块页数 = ceil(模块TCU / 每页TCU容量) │ │ │ │ 总页数 = Σ(各模块页数) + 导航页(封面+目录+章节分隔) │ │ │ └──────────────────────────────────────────────────────┘ │ ▼ 如用户指定页数（如"20页"）： → 按比例压缩每个模块的TCU分配 → 优先保留L1深度，压缩L3细节 → 保证完整性和连贯性 如未指定页数（默认）： → 所有模块按L2-L3深度完整展开 → 页数不受限制，以内容完整为准 → 总页数 = 自然生成的页数 ``` ### 建议页数参考（非约束） 以下为参考范围，实际生成**不受此范围限制**： | 报告类型 | 最小建议 | 完整深度建议 | 说明 | |:--------|:--------:|:-----------:|:-----| | 阶段总结 | 8页 | 20-35页 | 按模块展开，每个模块3-5页 | | 项目总结 | 12页 | 35-60+页 | 全链条展开，不限页数 | | 分析报告 | 10页 | 25-40+页 | 每个诊断维度独立成节 | | 汇报提案 | 8页 | 20-35页 | 方案论证+数据支撑完整 | | 专题分析 | 6页 | 15-30+页 | 研究方法+数据+结论完整展开 | ### Action Title 要求 每页标题必须是**完整句子**（陈述结论），而非标题式短语： ``` ❌ "组织优化" ✅ "深入调研发现问题 — 组织架构不匹配、职责交叉" ❌ "项目背景" ✅ "民和电器携手连恩，启动精益+数字化双轮驱动战略转型" ❌ "库存分析" ✅ "库存管理行业对标 — 中国制造业与国际差距1.4-2.3倍" ``` ### 来源标注规范 - 每个数据/图表下方必须标注来源 - **三级来源标注体系**： | 来源级别 | 内容来源 | 标注格式 | 示例 | |:---------|:---------|:---------|:-----| | L1：用户资料 | 直接引用用户提供的资料 | `"数据来源：用户资料"` | 用户资料 | | L2：搜索补充 | 联网搜索到的行业数据 | `"来源：XXX·年份"` | 简道云·2026 | | L3：技能分析 | 调用专业技能分析结论 | `"来源：ie-expert分析"` | ie-expert分析 | - 位置：页面底部 7.05 英寸位置（9pt, M6色） --- ## 八、助手函数规范 所有生成的 PPT 脚本必须包含以下助手函数（参考 `generate_pro.py` 实现）： | 函数 | 用途 | |:----|:------| | `cs(s)` | 清理 shape 的 p:style XML，防文件损坏 | | `sf(run, is_en)` | 设置字体：中文 YaHei，英文 Arial，通过 a:ea 节点 | | `TX(s, l, t, w, h, tx, ...)` | 统一文本框，支持 Microsoft YaHei | | `R(s, l, t, w, h, c)` | 矩形（无边框） | | `RR(s, l, t, w, h, c)` | 圆角矩形 | | `HL(s, x, y, ln, c, t)` | 水平线（薄矩形替代connector） | | `OV(s, x, y, lb, sz, bg, fg)` | 圆形标签 | | `AT(s, tx, sz)` | Action Title（白色背景+下划线，22pt Bold） | | `SR(s, tx, y)` | 来源标注（9pt M6色，7.05寸位置） | | `PN(s, n)` | 页码（仅显示当前页号） | | `full_cleanup(path)` | 深度XML净化（正则移除p:style+空ln+themeShadow，补齐typeface） | | `AUDIT(prs)` | 自审函数（图形量≥200，密度≥8，无BLOCK_ARC，去AI味通过） | | `HDR(s, title, subtitle)` | 深蓝顶栏标题（新增v4） | | `PYRAMID(s, layers, header)` | 居中多层金字塔（新增v4） | | `BLOCK_3COL(s, cx, cy, cw, ch, items)` | 三列子块布局（新增v4） | | `TAG_CHIP(s, text, x, y)` | 层级标签芯片（新增v4） | | `LEFT_LABEL_BAR(s, x, y, w, h, label, lw, content, lb, cb)` | 左标签右内容条（新增v4） | | `apply_theme(name)` | 配色主题切换（v5新增：deepblue/tech/business/vibrant） | | `auto_select_theme(ct, pref)` | **模板风格选择（v6新增）** 根据内容类型+用户偏好推荐主题 | | `SWOT(s, s,w,o,t, y)` | SWOT四象限分析矩阵（v5新增） | | `PIE_BAR(s, items, y, title)` | 占比柱状图替代饼图（v5新增） | | `ICON(s, x, y, char, sz, bg, fg)` | 装饰图标（v5新增） | | `DECORATED_CARD(s, x, y, w, h, icon, title, desc, clr)` | 带图标装饰卡片（v5新增） | | `MATRIX(s, headers, rows, y)` | 比较矩阵（v5新增） | | `collect_ppt_materials(type, kws)` | **素材搜集（v6新增）** 搜集行业图片/图标/参考PPT等 | | `generate_search_terms(type, kws)` | **搜索词生成（v6新增）** 根据内容类型生成素材搜索关键词 | | `save_material_inventory(collected)` | **素材清单保存（v6新增）** 输出素材清单到 material_inventory.md | --- ## 九、布局模式实现规范 ### 布局：#1 Cover — 封面 ```python def cover(s, title, subtitle="", date="", company=""): # 顶部细线：NV色 # 标题：40pt Bold, NV色，多行动态计算高度 # 副标题：24pt, D3色 # 日期+公司：14pt, M6色 # 底部装饰线：NV色 2pt ``` - 封面标题高度根据行数动态计算：`th = 0.8 + 0.65 * (lines-1)` 英寸 ### 布局：#6 TOC — 目录 ```python def toc(s, items): # items = [(编号, 标题, 描述), ...] # 每行：圆形编号(NV) + 章节名(16pt,Bold) + 描述(14pt,M6) # 底部：灰色分隔线 ``` - 全部8个章节必须完整列出 ### 布局：#5 Section — 章节分隔页 ```python def SEC(s, n, title, subtitle=""): # 左侧NV色竖条 # "PART N" 16pt M6色 # 标题 28pt Bold NV色 # 副标题 14pt D3色 ``` ### 布局：#8 Big Number — 大数字 ```python def BN(s, items, y=TZ): # items = [(大数字, 标签, 颜色), ...] # 第一项：NV底色+白字 或 BG底+NV字 # 大数字44pt Bold，标签14pt ``` ### 布局：#11 Data Table — 数据表 ```python def TB(s, l, t, rows, cols, data, col_ws=None): # 使用 add_table() 原生表格（不自绘） # 表头：NV深蓝底 + 白字 Bold 9pt # 数据行：浅灰交替行（#F5F7FA） # 字体：9pt Microsoft YaHei # 居中对齐 ``` ### 布局：#12 Metric Cards — 指标卡片 ```python def MCARDS(s, items, y=TZ): # items = [(数值, 标签, 示例值, 颜色), ...] # 白底卡片 + 顶部色彩条 # 数值24pt Bold 色彩色，标签11pt M6，详情10pt D3 ``` ### 布局：#14 Three-Pillar — 三支柱 ```python def PILLAR(s, items, y=TZ): # items = [(标题, [要点列表...], 颜色), ...] # 顶部色条 + 标题14pt WH色 # 下方BG色卡片 + 要点列表12pt D3色 ``` ### 布局：#16 Process Flow — 流程箭头 ```python def FLOW(s, steps, y=Inches(2.5)): # steps = [(标题, 描述), ...] # 第一项NV色，后续BG色 # 箭头用文本"→" AO色 ``` ### 布局：#24 Exec Summary — 执行摘要 ```python def EXEC(s, title, points): # title: 摘要标题 # points: [(编号, 标题, 描述), ...] # 首项：NV底白字 关键结论 # 后续：编号OV + 标题(14pt NV Bold) + 描述(14pt D3) ``` - 用于 P4 项目背景、P8 方案概览等需要结论先行的页面 - 顶部深蓝结论条 + 下方3-4个支撑论点 ### 布局：#20 Before/After — 对比 ```python def BA(s, before, after, y=TZ): # 左栏 BG色 "现状(Before)" D3色文字 # 右栏 NV色 "目标(After)" WH色文字 # 中间 "→" 箭头 NV色 ``` ### 布局：#29 Timeline — 时间线 ```python def TIMELINE(s, items, y=Inches(3.0)): # items = [(标题, 描述), ...] # 水平LG色连接线 2pt # 圆形编号节点 NV色 # 上方标题 16pt Bold NV色 # 下方描述 11pt D3色 ``` ### 布局：#35 Action Items — 行动项 ```python def ACTIONS(s, items, y=TZ): # items = [(行动, 时间, 负责人), ...] # 多列BG色卡片 # 编号 + 标题(14pt NV色) + 时间(11pt M6) + 负责人(11pt D3) ``` ### 布局：#36 Closing — 结束页 ```python def CLOSE(s, main_text, sub_text="", tagline=""): # 顶部NV色细线 # 主标题 28pt NV色 Bold 居中 # 装饰线 NV色 1.5pt # 副标题 18pt D3色 # 底部NV色粗线 2pt # 标语：20pt AO色 Bold ``` ### 布局：#39 Horizontal Bar — 水平柱状图 ```python def HBAR(s, items, y=TZ, title=""): # items = [(标签, 值), ...] 已排序 # 第一名NV色，后续BG色 # 背景浅灰条 + NV色填充条 ``` ### 布局：#37 Grouped Bar — 分组柱状图 ```python def GBAR(s, data, labels, colors, y=TZ, title=""): # data = [[系列1的值], [系列2的值], ...] 每行=一个系列 # labels = [组标签, ...] 如 ["M1","M2","M3"] # colors = [颜色1, 颜色2, ...] 每个系列的颜色 ``` - 通常嵌入 #57 Dashboard 中使用 - 含Y轴刻度（0%-100%）、数值标签、图例 - 用于月度趋势对比、多系列数据展示 ### 布局：#52 KPI Tracker — KPI追踪 ```python def KTRACK(s, items, y=TZ): # items = [(名称, 进度0-1, 详情, 状态on/risk/off), ...] # 表头(11pt M6 Bold) + 黑色分割线 # 进度条 on=AG / risk=AO / off=AR # 达成率 14pt Bold 状态色 ``` ### 布局：#57 Dashboard — 仪表盘 ```python def DASH(s, kpis, data, labels, colors, insights): # kpis = [(数值, 标签, 颜色), ...] 顶行KPI卡片 # data/labels/colors → 分组柱状图 # insights → BG色底+NV色字 关键洞见 ``` --- ## 十、完整工作流（S0-S15 + S0.5·S0.75 · v7.2 全栈版） ### S0: 需求识别与内容分析（双轨并行 ⭐） **需求识别轨道** — 首先判断用户的真实意图： ```python def detect_intent(user_request): """识别用户需求类型""" consulting_keywords = ["项目总结", "总结报告", "汇报", "咨询项目", "改善汇报", "结项", "阶段汇报", "终期", "客户汇报", "高层汇报"] summary_keywords = ["概括", "精简", "摘要", "简短", "核心内容"] if any(k in user_request for k in consulting_keywords): return "CONSULTING_REPORT" # 生成面向客户高层的咨询项目总结报告 elif any(k in user_request for k in summary_keywords): return "QUICK_SUMMARY" # 快速精简总结 return "CONSULTING_REPORT" # 默认：咨询项目总结报告模式 ``` | 用户意图 | 处理方式 | 页数 | 输出格式 | |:---------|:---------|:----:|:---------| | **咨询项目总结报告**（默认） | 以附件为素材，按5Part标准结构生成面向客户高层的汇报材料 | 25-50页 | PPT（默认）| | **快速精简总结** | 仅提取附件核心要点 | 3-5页 | PPT/DOCX | **内容分析轨道** — 在确认意图后，分析附件内容类型： 1. 提取内容样本（前1000字符或文件标题） 2. 运行 `detect_content_type()` 检测内容类型 3. 根据检测结果选择模式：制造专家 / 项目管理 / 市场分析 / 技术总结 / 通用 4. 根据模式选择对应的内容驱动模板（页数不限） 5. 通知用户检测结果，确认或手动调整 **自进化轨道** — 与内容分析同时执行： 1. 加载进化数据（`self_evolution/` 目录下的 known_skills / usage_log） 2. 调用 `self_evolution.py scan` 扫描新技能 3. 检查上次错误是否已修复 4. 加载高频使用的布局模式偏好 5. 如有新发现技能，通知用户集成建议 ``` 检测结果示例： "检测到内容类型：项目管理（置信度85%） 将使用项目管理模板，包含：里程碑/风险矩阵/资源分配等章节 如需切换模板请告知" 💡 系统提示： "自进化检查完成 | 已发现 0 个新技能 | 上次错误已修复 ✅" ``` ### S0.5: 制造咨询方法论加载（v7.0 新增） 检测到制造咨询领域时，自动加载四大咨询方法论资源： ``` 检测到关键词 → 加载方法论 ├─ "调研"/"诊断" → 加载 Phase1: references/methodology.md + 7部门调研指南 ├─ "问题分析"/"根因" → 加载 Phase2: references/diagnosis_framework.md ├─ "改善"/"项目" → 加载 Phase3: references/project_definition.md └─ 通用制造咨询 → 加载完整四阶段 + assets/interview_questions.md ``` **可引用的7大部门调研指南（按需加载）：** | 部门 | 参考文件 | 核心内容 | |:----|:---------|:---------| | 📞 销售接单 | `references/sales_order.md` | 订单流程、预测、OTD | | 📋 生产计划 | `references/planning.md` | MPS/MRP、排产、齐套 | | 🏭 生产现场 | `references/production.md` | 5S/标准化/OEE/WIP | | 📦 采购供应 | `references/procurement.md` | 供应商、采购周期 | | 🏢 仓储物流 | `references/warehouse_logistics.md` | 库位、配送、FIFO | | ✅ 质量管理 | `references/quality.md` | IQC/IPQC/OQC、追溯 | | 🔧 工艺技术 | `references/engineering.md` | BOM、ECN、SOP | **ODP-I²诊断框架**（`references/diagnosis_framework.md`）： - 问题诊断 → 改善方向映射 → 优先级四象限（严重度×0.6+紧迫度×0.4） - 跨部门交叉验证 → 改善项目卡片 → ROI评估 **交互式工具：** ```bash # 启动诊断分析工具（交互式） python3 scripts/diagnosis_analyzer.py # 启动报告生成工具（交互式） python3 scripts/consulting_report_generator.py ``` ### S0.75: 复杂度分级与方法选型（v7.1 新增） #### 第一步：问题复杂度分级（L1/L2/L3） 根据用户需求的广度和深度，判断问题层级： ```python def classify_complexity(query, materials_count): """自适应复杂度分级""" keywords_l1 = ["简单介绍", "基本概念", "快速", "模板"] keywords_l3 = ["跨部门", "全流程", "战略", "转型", "体系搭建", "对标"] l3_score = sum(1 for k in keywords_l3 if k in query) l1_score = sum(1 for k in keywords_l1 if k in query) if l3_score >= 2 or materials_count > 5: return "L3" # 复杂：多框架组合+完整调研 elif l1_score >= 2 or "是什么" in query: return "L1" # 简单：单框架快速输出 return "L2" # 中等：标准报告流程 ``` | 级别 | 适用场景 | 框架数量 | 搜索深度 | 报告长度 | |:----|:---------|:--------:|:--------:|:--------:| | **L1 简单** | 概念解释、模板输出 | 1个框架 | 2-3次搜索 | 5-10页 | | **L2 中等** | 问题诊断、改善建议 | 2-3个框架 | 5-8次搜索 | 15-25页 | | **L3 复杂** | 战略转型、体系搭建 | 3-5个框架 | 10-20次搜索 | 30+页不限 | #### 第二步：快速方法选型 — 症状→方案映射 根据用户描述的症状，快速匹配诊断方法： | 症状关键词 | 推荐诊断路径 | 映射说明 | |:----------|:------------|:---------| | "效率低/产能不足/线平衡" | VSM → 鱼骨图 → ABC分析 → PDCA | 从全景到聚焦到改善 | | "质量波动/不良率高/客诉" | SPC → 鱼骨图 → 5WHY → FMEA | 从数据到根因到预防 | | "交期不准/库存高/缺料" | 价值流 → ABC → EOQ → VMI | 从流程到优化 | | "设备故障/OEE低/停机" | TPM → SMED → OEE → 鱼骨图 | 从维护到快速换型 | | "5S差/现场混乱/安全" | 5S → 标准化 → 可视化 → Audit | 从基础到持续 | | "数字化转型/智能工厂" | 成熟度评估 → 路线图 → 架构 → ROI | 从评估到规划 | **3分钟选型表**（管理咨询方法工具箱 v7.1）： | 场景 | 首选方法 | 补充方法 | 避免误用 | |:----|:---------|:---------|:---------| | 定义问题边界 | 5W2H+结构图分析法 | 供需镜像校准 | ❌ 别跳过症状直接给方案 | | 分析根因 | 鱼骨图+5WHY | 系统展开图 | ❌ 鱼骨图后必须ABC筛选 | | 战略诊断 | PESTEL→波特五力→SWOT | 波士顿矩阵 | ❌ SWOT不能无交叉策略 | | 流程优化 | VSM→系统展开图→BPR | CPM关键路径 | ❌ VSM必须画未来状态 | | 决策评估 | 成本收益分析 | Pareto(80/20) | ❌ 成本收益必须有数据支撑 | #### 第三步：制造咨询框架组合策略 预设5种制造咨询框架组合，L3问题时自动启用： ```python COMBO_STRATEGIES = { "生产效率": ["DMAIC", "VSM", "Pareto", "PDCA"], "质量改善": ["SPC", "鱼骨图", "5WHY", "FMEA"], "供应链优化": ["ABC分析", "EOQ", "VMI", "安全库存"], "工厂规划": ["SLP布局", "物料流分析", "仿真", "设施规划"], "战略评估": ["PESTEL", "波特五力", "SWOT+交叉", "商业模式画布"], } ``` **组合规则（R32-R33）：** | 规则 | 说明 | |:----|:------| | **R32** | L1问题使用1个框架直接输出；L3问题必须使用≥1个组合，跨框架交叉验证 | | **R33** | 每个框架输出后必须执行"常见误用"检查——检查是否犯了该方法最常见的错误 | ### S1: 资料收集与识别 确认用户提供了哪些资料： - `[ ]` PDF 文件 → 计划使用 markitdown / Read 提取文字 - `[ ]` Word 文档 → 计划使用 markitdown 提取文字 - `[ ]` Excel 表格 → 计划使用 markitdown 提取数据 - `[ ]` 图片/截图 → 计划使用 markitdown OCR / Read 识别 - `[ ]` 参考 PPTX → 计划使用 extract_images_from_pptx() 提取 - `[ ]` 参考 URL → 计划使用 WebFetch 获取内容 - `[ ]` 纯文本/笔记 → 计划使用 Read 读取 - `[ ]` 未提供任何资料 → 跳过S1，从S2开始 ### S2: 资料提取 执行资料提取流程： 1. 对每个文件执行对应的提取方法 2. 按来源分类整理提取结果 3. 标注关键数据点（数字、指标、年份、KPI） 4. 输出 `extracted_content.md` 内容摘要文件 5. 如提取失败，尝试降级方法（Read → WebFetch） ### S3: 内容解析与素材结构化 > **核心原则**：附件不是"要被精简的源文件"，而是**咨询报告的核心素材**。解析的目的是提取原始数据、发现、方案，然后按咨询报告框架重新组织。 1. **逐页解析附件内容** → 标记每页在咨询报告中的定位： - 📋 **项目背景素材** → Part 01 项目概况 - 🔍 **调研数据/发现** → Part 02 现状诊断 - 🛠️ **改善方案/设计** → Part 03 改善方案 - 📊 **验证数据/成果** → Part 04 成果验证 - 💡 **总结/展望/建议** → Part 05 总结展望 2. **识别关键数据点** → 每个数据点标注其在报告中的作用（基线/改善前/改善后/行业对标） 3. **【v7.0】行业报告搜索**：对关键数据点，调用艾瑞咨询/QuestMobile搜索行业基准数据增强对比 - `python scripts_industry_search/iresearch_report_search.py search "关键词" --pages 4 --limit 10 --format json` 4. **素材完整性检查**：检查附件是否涵盖5Part的每个维度，如缺失则标记"待补充" 5. 调用专业技能验证分析（仅制造领域） 6. 输出解析后的素材大纲（按5Part归类） ### S3.5: 原PPT图片提取与复用（v7.3 新增） > **核心原则**：咨询项目总结报告必须包含原始素材中的关键图片（组织架构图、流程图、数据截图、现场照片等），而非仅输出文字。 从附件PPTX中提取所有图片，按幻灯片编号+内容类型分类保存，在新报告中按需嵌入： ```python def extract_images_from_source(pptx_path, output_dir="extracted_images"): """从源PPTX提取所有图片""" from pptx import Presentation from pptx.enum.shapes import MSO_SHAPE_TYPE import os prs = Presentation(pptx_path) os.makedirs(output_dir, exist_ok=True) for i, slide in enumerate(prs.slides): for j, shape in enumerate(slide.shapes): if shape.shape_type == MSO_SHAPE_TYPE.PICTURE: ext = shape.image.content_type.split("/")[-1] fname = f"slide_{i+1:02d}_{j+1:02d}.{ext}" with open(f"{output_dir}/{fname}", "wb") as f: f.write(shape.image.blob) ``` **图片分类与复用映射：** | 原图类型 | 对应咨询报告Part | 推荐嵌入位置 | |:---------|:----------------|:------------| | 组织架构图 | Part 02 现状诊断 | 组织问题诊断页 | | 流程图/工艺图 | Part 03 改善方案 | 方案说明页 | | 数据表格截图 | Part 04 成果验证 | 验证数据旁边 | | 现场照片 | Part 01/05 | 背景/成果页 | **图片嵌入布局规范：** 每张图片在报告中的布局方式取决于图片类型和所在页面： ```python def layout_image(slide, img_path, slide_idx, page_type): \"\"\"智能图片布局：确保不遮挡文字\"\"\" from pptx.util import Inches # 布局方案A: 文字左 + 图片右 (默认) if page_type == "text_left": img = slide.shapes.add_picture(img_path, Inches(5.2), Inches(1.5), Inches(4.8), Inches(3.5)) # 布局方案B: 全图页 (独立展示) elif page_type == "full_image": img = slide.shapes.add_picture(img_path, Inches(0.5), Inches(0.8), Inches(9.5), Inches(4.8)) # 布局方案C: 顶部图片 + 底部文字说明 elif page_type == "image_top": img = slide.shapes.add_picture(img_path, Inches(1.0), Inches(0.3), Inches(8.5), Inches(3.0)) # 保持原始宽高比 img.lock_aspect_ratio = True # 如果超过最大尺寸则缩小 max_w, max_h = Inches(9.5), Inches(4.8) if img.width > max_w: img.width = max_w if img.height > max_h: img.height = max_h ``` ### S4: 需求确认 **输出格式选择（v6.1 新增）：** ``` 请选择输出格式： ○ 📊 PPT（默认）— 适用于会议汇报/客户演示 ○ 📝 DOCX — 适用于报告存档/详细文字论述 ○ 📄 PDF — 适用于正式交付/打印输出 提示：默认为PPT，无需特别声明。如需DOCX/PDF请明确说明。 ``` ### S5: 联网调研（免API） 使用 `multi-search-engine` + `WebSearch` + `WebFetch` 搜索行业基准数据。 - 每个搜索点至少搜索2个关键词交叉验证 - 所有来源必须标注"来源：XXX（搜索日期）" ### S6: 原PPT图片提取（如有） 调用 `extract_images_from_pptx()` 提取参考PPT图片，按页归类。 提取的图片嵌入新PPT的对应页面。 --- ### S6.5: PPT素材搜集与模板风格选择 【v6 新增 ⭐】 > **核心变更**：在生成PPT前，先执行素材搜集操作，然后基于内容+用户偏好双因子驱动选择最佳模板风格，之后再进入设计和生成阶段。 #### 第一步：PPT素材智能搜集 基于已确认的报告大纲和内容主题，执行素材搜集操作： ```python # 素材搜集操作规范 MATERIAL_TYPES = { "industry_image": { "description": "行业相关高清图片", "search_terms": ["行业关键词 + 制造现场/数字化/精益", "industry + factory/digital/lean"], "source": "WebSearch / WebFetch 图片搜索", "usage": "封面背景、章节分隔页、案例展示页", }, "icon_element": { "description": "装饰图标（简单线条图标）", "search_terms": ["SVG icon + sector_name", "图标 + 行业"], "source": "WebSearch 图标资源", "usage": "指标卡片、流程步骤、列表装饰", }, "reference_slide": { "description": "同类行业PPT参考设计", "search_terms": ["行业 + PPT模板/报告设计", "consulting deck + industry"], "source": "WebSearch + WebFetch 提取设计元素", "usage": "参考配色方案、布局比例、信息图表风格", }, "color_palette": { "description": "行业相关配色方案", "search_terms": ["行业 + 品牌色/VI色彩", "color palette + industry"], "source": "WebSearch 品牌/VI资料", "usage": "辅助确定报告主色和强调色", }, "data_chart": { "description": "行业数据可视化参考", "search_terms": ["行业 + 数据可视化/图表", "industry chart/data viz"], "source": "WebSearch 公开报告图表", "usage": "参考图表类型选择和视觉呈现方式", }, } def collect_ppt_materials(content_type, keywords): """基于内容类型和关键词搜集PPT素材""" collected = {} # 1. 根据内容类型确定搜索关键词 search_terms = generate_search_terms(content_type, keywords) # 2. 对每种素材类型执行搜索 for mat_type in MATERIAL_TYPES: results = web_search(f"{search_terms} {mat_type.search_terms[0]}") if results: # 提取前3个最有价值的素材链接 top_results = filter_best_results(results, mat_type) collected[mat_type] = top_results # 3. 对参考素材进行详情提取 for mat_type, results in collected.items(): for result in results[:2]: # 提取前2个 detail = web_fetch(result.url) enrich_material(mat_type, result, detail) # 4. 输出素材清单供用户确认 save_material_inventory(collected) return collected ``` **素材搜集规则（R15-R18）：** | 规则 | 要求 | |:----|:------| | **R15** | 必须基于已确认的内容大纲生成搜索关键词，拒绝通用关键词 | | **R16** | 每种素材类型至少搜集2-3个高质量来源，优先行业官网/权威报告 | | **R17** | 搜集到的素材需标注来源URL和用途说明，供后续生成脚本引用 | | **R18** | 若用户未提供参考PPT，素材搜集不可跳过——至少要搜集配色方案+行业图片 | #### 第二步：模板风格智能选择 基于内容分析结果和素材搜集情况，使用**双因子推荐算法**选择最佳模板风格： ```python THEMES = { "deepblue": { "name": "咨询专业风", "palette": "NV(#051C2C)深蓝 + WH白 + AB(#006BA6)蓝", "best_for": ["manufacturing", "supply_chain", "lean", "project"], "vibe": "高端、权威、严肃", "deco_style": "简约线条、几何装饰、数据驱动", "font_emphasis": "Bold标题+清晰层级", "section_deco": "深蓝左侧竖条", }, "tech": { "name": "科技现代风", "palette": "AB(#005A96)亮蓝 + WH白 + AG(#007A53)绿", "best_for": ["AI", "digital", "smart_mfg", "IT_architecture"], "vibe": "前沿、创新、高效", "deco_style": "渐变色块、轻薄阴影、科技图标", "font_emphasis": "Light标题+清晰层级", "section_deco": "渐变色横条", }, "business": { "name": "沉稳专业风", "palette": "D3(#333333)商务灰 + NV深蓝点缀 + AB蓝", "best_for": ["management", "finance", "operation", "general"], "vibe": "稳重、理性、信任", "deco_style": "灰底卡片、精细边框、保守排版", "font_emphasis": "规则的标题+正文", "section_deco": "灰色细线分隔", }, "vibrant": { "name": "热情鲜明风", "palette": "AO(#D46A00)活力橙 + WH白 + AR(#C62828)红", "best_for": ["innovation", "kickoff", "change", "startup"], "vibe": "活力、推动、紧迫", "deco_style": "大色彩块、粗轮廓、大数字强调", "font_emphasis": "大号标题+高对比", "section_deco": "橙色全宽色块", }, } def select_theme(content_type, user_mood, material_results): """双因子模板风格推荐算法""" content_score = {} # 内容因子：基于内容类型 for theme_name, theme in THEMES.items(): # 内容类型匹配度 best_for = theme["best_for"] match_count = sum(1 for t in best_for if t in content_type or content_type in t) content_score[theme_name] = match_count # 如果用户表达了偏好，增强偏好分 if user_mood: mood_map = { "高端": "deepblue", "权威": "deepblue", "严肃": "deepblue", "科技": "tech", "创新": "tech", "前沿": "tech", "稳重": "business", "保守": "business", "专业": "business", "活力": "vibrant", "创新2": "vibrant", "推动": "vibrant", } for word, theme in mood_map.items(): if word in user_mood: content_score[theme] += 2 # 用户偏好权重 # 选择分值最高的主题 best_theme = max(content_score, key=content_score.get) return best_theme ``` **算法逻辑：** 1. **内容因子**（权重60%）：由内容类型检测结果决定 - 制造/精益/供应链 → deepblue - AI/数字化/智能制造 → tech - 管理/财务/运营 → business - 创新/变革/启动会 → vibrant 2. **用户偏好因子**（权重40%）：来自用户表述/历史记录 - 用户明确说"高端/权威" → deepblue - 用户说"科技感/前沿" → tech - 用户说"稳重/保守" → business - 用户说"活力/创新" → vibrant 3. **校正因子**：素材搜集结果反馈 - 如果搜集到的素材中有明确的品牌色/VI倾向，反向校准推荐 #### 第三步：风格确认与素材预览 将推荐的模板风格 + 搜集到的素材列表呈现给用户确认： ``` ┌─ 模板风格推荐 ──────────────────────────────────────────┐ │ │ │ 推荐风格：🔵 咨询专业风 (deepblue) │ │ ○ 深蓝主色 #051C2C × 白色背景 × 蓝色强调 │ │ 匹配理由：内容类型"精益制造" × 用户偏好"高端" │ │ │ │ ┌──────────────────────────────────────────────────────┐│ │ │ 素材搜集清单： ││ │ │ ✅ 行业图片：3张（制造现场图×2, 数字化看板×1） ││ │ │ ✅ 装饰图标：5个（生产/质量/物流/计划/设备） ││ │ │ ✅ 参考PPT：2个（同行业咨询报告设计） ││ │ │ ✅ 配色方案：已从参考PPT提取2组备选 ││ │ │ └─ 来源详见 material_inventory.md ││ │ └──────────────────────────────────────────────────────┘│ │ │ │ 可选风格： │ │ ○ ⚪ 咨询专业风（推荐） ○ 🔵 科技现代风 │ │ ○ ⚫ 沉稳专业风 ○ 🟠 热情鲜明风 │ │ │ │ 请确认风格，或选择其他风格： │ └──────────────────────────────────────────────────────────┘ ``` - 如果用户调整风格，更新 `theme = apply_theme(selected_theme)` - 将素材引用信息写入生成脚本注释 - 将素材图片/图标路径嵌入生成脚本中 --- ### S7: 设计大纲 + Slide Config 模块化架构 按照选定的内容类型和模板模块，逐页确定内容和布局模式。**页数由内容量自动决定，不设上限**。 **咨询项目总结报告模式（核心场景）：** 严格按照标准5Part结构进行编排： ``` PART 01 项目概况 → Cover + Section + 5~8页内容 PART 02 现状诊断 → Section + 8~15页内容 PART 03 改善方案 → Section + 10~20页内容 PART 04 成果验证 → Section + 5~10页内容 PART 05 总结展望 → Section + 3~5页内容 附录 → 2~5页 ──────────────────── 总计 → 35~60页（按素材丰富度自然决定） ``` - 附件中的每一页都有汇报价值：不要"精简"内容，而是**重新编排**为面向高层的汇报叙事 - 每个模块按内容深度分级（L1-L3）展开 - 数据丰富时自动拆分到多页，不急于一页塞完 - **默认不限制页数**；如用户指定页数，按比例压缩模块深度 **Slide Config 模块化架构**（借鉴 PPT 演示文稿技能）： 每页幻灯片定义为独立的 `slide_config` 数据块，统一元数据结构： ```python # 每页的标准化 Slide Config slide_config = { "type": "cover|toc|section|content|summary|closing", "index": 1, # 页码 "layout": "#1 Cover", # mck-ppt-design 布局模式编号 "title": "页面Action Title（完整句子）", "depth": "L1|L2|L3", # 内容深度级别 "theme": "deepblue", # 主题合约名称 "data_sources": [], # 数据来源列表 } # 生成时统一从 Slide Config 渲染 def render_slide(prs, config, theme): """根据Slide Config渲染单页""" if config["type"] == "cover": return cover(prs, config["title"], ...) elif config["layout"] == "#14 Three-Pillar": return PILLAR(prs, config["data"], theme) # ... ``` 优势： - ✅ 每页数据独立，便于并行生成 - ✅ 后期修改某页不影响其他页 - ✅ 支持导出为 JSON 作为大纲确认 ### S8: 专业技能分析（仅制造领域） | 专业领域 | 调用技能 | 应用于报告章节 | |:---------|:---------|:--------------| | 精益生产诊断 | ie-expert | P7调研发现 | | 六西格玛分析 | rohoon-6sigma | P16验证成果 | | 库存分析 | inventory-eye / inventory-demand-planning | P14库存分析 | | 计划物控 | planning-mc-assistant | P10计划流程 | | 精益工具 | lean-production-toolkit | P8改善方案 | | 制造咨询方法论 | **本技能S0.5内置方法论** | 全流程（调研→诊断→改善→交付） | | **行业报告搜索** | **scripts_industry_search/iresearch_report_search.py** | **S3行业数据融合（基准/趋势/对标）** | | 数字化转型 | Chief Information Officer | P18数字化规划 | | 诊断分析工具 | `scripts/diagnosis_analyzer.py` | Phase2问题分析 | | 报告生成工具 | `scripts/consulting_report_generator.py` | Phase4合作交付 | **v7.1 新增框架组合策略：** | 组合名称 | 包含框架 | 适用场景 | |:---------|:---------|:---------| | 🔧 **生产效率** | DMAIC + VSM + Pareto + PDCA | 产能提升/效率优化 | | ✅ **质量改善** | SPC + 鱼骨图 + 5WHY + FMEA | 质量波动/不良率改善 | | 📦 **供应链优化** | ABC + EOQ + VMI + 安全库存 | 库存高/缺料/交期不准 | | 🏭 **工厂规划** | SLP布局 + 物料流分析 + 仿真 | 新厂布局/物流优化 | | 📊 **战略评估** | PESTEL + 波特五力 + SWOT + 商业模式画布 | 市场进入/战略转型 | **v7.0 新增：** 7大部门调研指南 + ODP-I²诊断框架 + 改善项目定义已整合为内置模块。流程图绘制（路线图/鱼骨图/甘特图等）在S9脚本中直接添加对应函数。 --- ### S8.5: 渐进交付策略选择 — Draft→Iterate→Final 【v6 新增】 借鉴 AI绘图技能的渐进式工作流，支持三阶段交付模式： ```python class DeliveryMode: """渐进交付模式定义""" DRAFT = { "name": "草稿模式", "desc": "快速生成报告骨架：封面+目录+每页Action Title+关键数据标记", "sections": "全部章节的L1深度（结论先行）", "turnaround": "1-2分钟，快速确认方向", "best_for": "需求不确定/需要先确认框架", } ITERATE = { "name": "迭代模式", "desc": "在草稿基础上填充：L2分析展开+数据图表+对比分析", "sections": "L2深度展开 + 部分L3数据表格", "turnaround": "5-10分钟", "best_for": "草稿方向确认后逐步完善", } FINAL = { "name": "完整模式", "desc": "全质量输出：L3完整细节 + 全数据表格 + 精美排版", "sections": "全深度L3展开", "turnaround": "10-30分钟（页数不限）", "best_for": "终稿交付", } ``` **用户交互流程：** ``` 您希望以哪种模式生成？ ○ 草稿模式（快速骨架，确认方向） ○ 迭代模式（逐步完善） ○ 完整模式（一步到位，推荐 ⭐） 选择 DRAFT → 执行 S9-S12 生成草稿 → 确认 → 升级为 ITERATE 选择 ITERATE → 执行 S9-S12 生成迭代版 → 确认 → 升级为 FINAL 选择 FINAL → 一步执行全部流程 ``` **渐进交付规则（R26-R27）：** | 规则 | 要求 | |:----|:------| | **R26** | 默认使用完整模式（Final），除非用户明确要求草稿或迭代 | | **R27** | 草稿/迭代模式下，AUDIT() 门槛适当降低（密度≥5即可），终版必须全量通过 | ### S9: 编写生成脚本 参考 `references/generate_pro.py` 模板（制造领域）或按通用模板模块规则编写： 1. 导入 python-pptx / lxml 2. 设置常量和配色 3. 按内容驱动模块逐页生成（使用 mck-ppt-design 布局模式），页数由内容量决定 - 数据丰富时每个模块可拆分为2-4页，不设上限 - 每个数据点独立制作图表，不合并在一页 - 每个对比项独立成页，不压缩空间 4. 全微软雅黑，无 BLOCK_ARC 5. 每条文案执行去AI味自检 6. 包含 `full_cleanup()` + `AUDIT()` --- ### S9.5: 格式适配生成 【v6.1 新增 ⭐】 根据 S4 确认的格式选择，将报告内容转换为对应格式： **格式路由：** ``` ┌─ PPT ──→ python-pptx + mck-ppt-design 布局（默认） 报告内容大纲 │ (Slide Config JSON) ──┼─ DOCX ─→ python-docx 原生生成 │ └─ PDF ──→ Markdown → reportlab ``` #### PPT 格式（默认） 使用现有的 python-pptx + mck-ppt-design 引擎，遵循全部 S9 规则： - 安装依赖：`pip install python-pptx lxml` - 脚本模板：`references/generate_pro.py` - 输出扩展名：`.pptx` #### DOCX 格式 使用 python-docx 生成专业 Word 文档： ```python # DOCX 生成示例 from docx import Document from docx.shared import Pt, Inches, RGBColor from docx.enum.text import WD_ALIGN_PARAGRAPH doc = Document() # 封面（无页眉页脚） title = doc.add_heading('', level=0) run = title.add_run('报告标题') run.font.name = 'Microsoft YaHei' run.font.size = Pt(26) run.font.color.rgb = RGBColor(0x05, 0x1C, 0x2C) # 章节（Heading 1） doc.add_heading('章节标题', level=1) # 正文 p = doc.add_paragraph() run = p.add_run('正文内容...') run.font.name = 'Microsoft YaHei' run.font.size = Pt(11) # 表格 table = doc.add_table(rows=5, cols=4) table.style = 'Light Grid Accent 1' # 保存 doc.save('report.docx') ``` **生成规范：** | 元素 | DOCX 映射方式 | 说明 | |:----|:-------------|:-----| | 封面 | 独立Section+大号标题 | 无页码，与正文分节 | | 目录 | 自动生成 TOC 字段 | Word中按F9更新 | | 章节 | Heading 1/2/3 层级 | 对应 PPT 的 Section 和 Action Title | | 数据表格 | Word 原生表格 | 保留表头深蓝底色 | | 关键数字 | 加粗+着色段落 | 对应 PPT 的 Big Number | | 图表 | 简化版柱状图/表格 | DOCX不支持复杂图表，用表格+文字替代 | - 安装依赖：`pip install python-docx` - 脚本模板：`references/generate_docx.py` - 输出扩展名：`.docx` #### PDF 格式 使用 Markdown→PDF 管道，两条路径可选： **路径A：reportlab（推荐，零依赖）** ```bash # 简易PDF生成（md-to-pdf-cjk 方案） python3 -c " from md_to_pdf import convert convert('report.md', '报告标题', 'report.pdf') " ``` **路径B：Markdown直接转换** ```bash pip install 'markitdown[all]' markitdown report.docx -o report.md # DOCX转MD # 然后使用 md-to-pdf-cjk 技能转换 ``` **生成规范：** | 元素 | PDF 映射方式 | 说明 | |:----|:------------|:-----| | 封面 | 独立首页+大标题 | reportlab Canvas绘制 | | 章节 | 大号加粗标题 | 对应 PPT 的 Section | | 正文 | 11pt常规字体 | 微软雅黑嵌入 | | 表格 | reportlab Table | 保留表头样式 | | 关键数字 | 大号+着色 | 对应 PPT 的 Big Number | - 安装依赖：`pip install reportlab markdown` - 脚本模板：`references/generate_pdf.py` - 输出扩展名：`.pdf` **格式规则（R28-R29）：** | 规则 | 要求 | |:----|:------| | **R28** | 无明确格式指令时，默认生成 PPT | | **R29** | 无论何种格式，内容深度标准一致（L1-L3），不得因格式不同降低质量 | ### S10: 执行生成 根据选择的格式安装对应依赖并执行。**PPT模式必须包含图片提取与嵌入步骤**： ```python # 1. 从源文件提取图片 extract_images_from_source("用户附件.pptx", "extracted_images/") # 2. 生成PPT（文字+图片） python generate_report.py # 3. 图片嵌入逻辑：在对应页使用 add_picture() slide.shapes.add_picture("extracted_images/slide_11_01.png", left, top, width, height) ``` ```bash # PPT格式（默认） pip install python-pptx lxml python generate_report.py # DOCX格式 pip install python-docx python generate_report_docx.py # PDF格式 pip install reportlab markdown python generate_report_pdf.py ``` **图片嵌入规范（R34-R35）：** | 规则 | 要求 | |:----|:------| | **R34** | 源PPTX中的**所有图片**（不限类型）必须在生成的咨询报告中保留——每张图片都要有其展示位置 | | **R35** | 图片必须放在**专用图片区**，不得与文字重叠。文本+图片混合页：文字占左半(0-4.5英寸)，图片占右半(5.5-10英寸)；全图页：图片居中 | | **R36** | 每页最多1张图片（宽≤4.5英寸）或2张小图（各宽≤3英寸），全图页1张（宽≤9英寸）。图片与最近文字间距≥0.3英寸 | ### S11: 质量审查 + 5-Pass Editor 审校 + 跨框架交叉验证 执行 `AUDIT()` + `full_cleanup()`，按交付检查清单逐项确认。 **跨框架交叉验证（v7.1 新增）** — 当使用多框架组合（≥2个）时，强制执行交叉验证： ```python def cross_validate_results(framework_results): """ 跨框架结论交叉验证 输入：各框架的分析结果 输出：交叉验证报告 """ report = {"mode_connections": [], "contradictions": [], "deep_insights": []} # 1. 模式连接：不同框架结论是否互相印证 # ▸ VSM结论"搬运浪费严重" + 鱼骨图根因"布局不合理" → 互证 ✅ # ▸ SPC数据显示"过程不稳定" + FMEA风险数高 → 互证 ✅ # 2. 矛盾化解：冲突点分析 # ▸ 例：VSM建议"集中库存" vs 精益建议"零库存" — 分析矛盾根因 # ▸ 判断：哪个框架在当前情境下权重更高/更适用 # ▸ 输出：化解后的综合建议 # 3. 深层洞察：跨框架发现的隐藏规律 # ▸ 例：VSM+5WHY+SPC三者都指向"供应商管理" — 发现隐藏重点 # ▸ 这是单一框架无法发现的系统性问题 return report ``` **交叉验证执行时机：** - L1问题：无需交叉验证 - L2问题：如有≥2个框架参与，执行模式连接检查 - L3问题：强制执行完整交叉验证（模式连接+矛盾化解+深层洞察） **5-Pass Editor 自动审校机制**（借鉴内容工厂技能）： 报告生成后，自动执行 5 轮审校： ```python def editorial_review(draft_content): """ 5轮审校流程，每轮聚焦一个维度 输出：审校后的内容 + 编辑报告 """ report = {"passes": [], "changes": []} # Pass 1: 清晰度手术 — 删除30%冗余，去除填充词和被动语态 # ▸ "值得注意的是/一般来说/某种程度" → 删除 # ▸ 长句拆短，每句≤25字 # ▸ 将被动变主动（"被建议"→"建议"） # Pass 2: 故事流 — 检查每个章节的因果逻辑 # ▸ 开头是否有结论句 # ▸ 段落间是否有逻辑递进 # ▸ 数据→分析→结论是否完整 # Pass 3: 语气一致性 — 统一为管理咨询权威自信语气 # ▸ "可能/也许/大概" → "数据显示/分析表明" # ▸ "我们希望" → "我们建议" # ▸ 禁止使用削弱权威性的措辞 # Pass 4: 质量检查 — 数据完整性核查 # ▸ 每个数据点是否有来源标注 # ▸ 对比数据是否完整（before/after成对出现） # ▸ Action Title是否完整句子 # Pass 5: 格式化 — 格式/拼写/标点统一 # ▸ 中英文空格统一 # ▸ 数字格式统一（"10%" vs "10 %"） # ▸ 标点符号全角/半角统一 return edited_content, report ``` **编辑报告示例：** ``` 📋 5-Pass Editor 编辑报告 ├─ Pass 1 清晰度: 删减28%字数 (2,340→1,685字), 移除填充词12处 ├─ Pass 2 故事流: 修复3处因果关系断裂, 补充2个数据支撑 ├─ Pass 3 语气一致: 替换5处削弱表述, 统一为"我们建议"语气 ├─ Pass 4 质量检查: 发现2个缺失来源标注, 均已补充 ✅ └─ Pass 5 格式化: 统一中英文间距12处, 标点修正5处 ``` ### S12: 自进化日志（v5 新增） 报告生成完成后，自动写入进化日志： 1. 记录本次使用的内容类型和模板 → `usage_log.json` 2. 记录使用的布局模式及其频率 → `template_stats.json` 3. 如有错误发生 → 写入 `error_log.json`（含修复方案） 4. 更新 `evolution_summary.md` 进化摘要 5. 输出本次进化日志摘要：`💡 自进化：记录本次使用 | 累计X次 | 成功率Y%` --- ### S13: 技能自修复（S13）— 【v6 新增 ⭐】 > **核心思想**：每次PPT生成都是技能自我进化的机会。运行时遇到的任何问题，都要被分析、记录，并自动反馈到 SKILL.md 中，让下一次生成时技能已经\"学会了\"。 #### 第一步：问题收集 在 S0-S12 全过程中捕获所有异常和用户反馈： ```python def collect_issues(): """收集本次执行中遇到的所有问题""" issues = { "errors": [], # 运行时错误（崩溃/异常） "warnings": [], # 非致命问题（AUDIT未达标/素材缺失） "user_feedback": [], # 用户主动反馈（"文件打不开"/"风格不对"） "improvements": [], # 执行过程中发现的可优化点 } # 1. 从 error_log.json 提取新增错误 # 2. 从 S11 质量审查结果提取未达标项 # 3. 从用户交互中提取反馈关键词 # 4. 审计生成脚本，发现可优化的编码模式 return issues ``` #### 第二步：问题分级 | 级别 | 定义 | 处理方式 | 示例 | |:----|:-----|:---------|:-----| | **P0 - 致命** | PPT文件无法打开/崩溃 | 必须修复，追加到「常见错误」+更新 `full_cleanup()` 规范 | 文件损坏需修复 | | **P1 - 严重** | 内容或排版严重异常 | 追加到「常见错误」+更新相关函数规范 | 中文显示方块 | | **P2 - 一般** | 单次可修复，不影响整体 | 更新进化日志，暂不修改SKILL.md | 数据源未搜索到 | | **P3 - 优化** | 可做得更好但非错误 | 记录到 improvements.json，积累多次再批量更新 | 布局模式可更美观 | #### 第三步：自动修复规则 ```python def auto_repair(issues, skill_base_path): """根据收集到的问题自动修复技能文件""" for issue in issues["errors"]: if issue["level"] != "P0" and issue["level"] != "P1": continue error_text = issue["description"] cause_text = issue["root_cause"] fix_text = issue["fix"] # 检查是否已在 SKILL.md 的「常见错误与修复」中 if not is_already_documented(error_text): # 追加新的错误条目 append_error_to_skill_md(error_text, cause_text, fix_text) print(f"🛠️ 自修复：追加错误「{error_text}」到SKILL.md") # 检查是否涉及函数实现规范 if issue.get("function_to_update"): fn_name = issue["function_to_update"] update_function_spec(fn_name, issue["new_spec"]) print(f"🛠️ 自修复：更新函数 `{fn_name}()` 实现规范") # 更新交付清单（如发现新的检查项） if issue.get("new_checklist_item"): append_checklist_item(issue["new_checklist_item"]) print(f"🛠️ 自修复：追加交付检查项「{issue['new_checklist_item']}」") # 更新 reference 文件 if issue.get("new_reference_file"): save_reference_file(issue["new_reference_file"]) # 写入进化摘要 update_evolution_summary(issues) ``` **自修复规则（R19-R22）：** | 规则 | 要求 | |:----|:------| | **R19** | 每次执行后必须执行 S13 自修复分析，不得跳过 | | **R20** | P0/P1 级问题必须在 SKILL.md 的「常见错误与修复」中有对应条目；如没有，自动追加 | | **R21** | 函数实现规范变更时，同步更新「助手函数规范」和对应布局函数的文档 | | **R22** | 新发现的检查项自动追加到「交付检查清单」，并更新版本号 | #### 第四步：进化日志输出 ``` 💡 S13 技能自修复报告： ├─ 🔍 本次共发现 2 个问题 ├─ ✅ 已修复：full_cleanup() 实现规范更新（原因：p:style替换不够彻底→改为正则删除完整节点） ├─ ✅ 已修复：追加错误「PPTX文件损坏」到常见错误（原因：空a:ln节点残留） └─ 📊 累计自修复次数：3 | 累计修复条目：7 ``` --- ### S14: 文件交付与微信推送 — 【v6 新增 ⭐】 > **核心变更**：报告生成完成后，根据输出格式交付对应文件，自动推送到微信小程序。 #### 第一步：交付准备 ```python def prepare_delivery(output_path, output_format): """准备交付文件""" import os file_size = os.path.getsize(output_path) file_name = os.path.basename(output_path) ext_map = {"PPT": ".pptx", "DOCX": ".docx", "PDF": ".pdf"} delivery_info = { "file": output_path, "name": file_name, "format": output_format, "size_kb": round(file_size / 1024, 1), "pages": TOTAL_PAGES, "generated_at": datetime.now().strftime("%Y-%m-%d %H:%M"), } save_delivery_log(delivery_info) return delivery_info ``` #### 第二步：交付执行 使用 `deliver_attachments` 工具将文件发送到 WorkBuddy 微信小程序： ``` 步骤: 1. 调用 deliver_attachments(file_path) 发送文件 2. 提示用户: "文件已送达！请确保微信WorkBuddy小程序中已开启「产物回传到小程序」开关" 3. 如用户需要自动推送，创建自动化定时任务 ``` **交付方式：** | 方式 | 说明 | 条件 | |:----|:-----|:-----| | ✅ `deliver_attachments` | 发送到WorkBuddy微信小程序（推荐） | 用户已绑定微信 | | 📧 QQ邮件 | 通过qq-email发送邮件附件 | 需配置QQ邮箱授权码 | | ☁️ 腾讯文档 | 上传到腾讯文档并分享链接 | 需配置tencent-docs | #### 第三步：自动化交付（可选） 如果用户希望"生成后自动发微信"，创建自动化任务： ```yaml # 自动化配置 schedule: "每次PPT生成后" 动作: 自动执行 deliver_attachments + 发送通知消息 提示: "用户需开启「产物回传到小程序」开关" ``` **交付规则（R23-R25）：** | 规则 | 要求 | |:----|:------| | **R23** | 每次PPT生成后必须执行 S14 文件交付，不可跳过 | | **R24** | 交付时必须提示用户检查微信小程序「产物回传到小程序」开关状态 | | **R25** | 交付成功后写入 `delivery_log.json`，记录文件名称、大小、生成时间 | --- ### S15: PPT结构脑图生成（PDF） — 【v6.1 新增 ⭐】 > **核心功能**：PPT生成完成后，根据 Slide Config 数据自动生成思维导图 PDF，以可视化的方式展现报告的整体结构。 #### 第一步：提取PPT结构数据 ```python def extract_slide_structure(slide_configs): """从Slide Config提取脑图层级""" mindmap_data = [] for cfg in slide_configs: stype = cfg.get("type", "content") if stype == "section": mindmap_data.append({ "type": "section", "title": cfg.get("label", "") + " " + cfg.get("title", ""), "pages": [] }) elif stype in ("content", "cover", "toc"): if mindmap_data: mindmap_data[-1]["pages"].append(cfg.get("title", "")[:25]) else: mindmap_data.append({ "type": "section", "title": cfg.get("title", "")[:25], "pages": [] }) elif stype == "closing": mindmap_data.append({ "type": "section", "title": "总结与致谢", "pages": [] }) return mindmap_data ``` #### 第二步：生成脑图PDF 使用 reportlab 绘制层级化的脑图树： ``` ├── 🏠 PPT结构大纲 │ ├── 📂 PART 01 精益生产概述 │ │ ├── 📄 精益生产的起源与发展演进 │ │ ├── 📄 核心理念：一个目标两大支柱 │ │ └── 📄 精益屋是TPS经典结构 │ ├── 📂 PART 02 七大浪费 │ │ ├── 📄 TIMWOOD七种浪费总览 │ │ ├── 📄 生产过剩与等待浪费 │ │ └── 📄 加工·库存·动作·不良浪费 │ └── 📂 ... ``` - 安装依赖：`pip install reportlab` - 脚本模板：`references/generate_mindmap.py` - 输出扩展名：`.pdf` - 默认输出路径：`ppt_structure_mindmap.pdf` #### 第三步：脑图交付 脑图 PDF 随主报告一起交付： ```python def deliver_mindmap(mindmap_path): """随主文件一起交付脑图""" deliver_attachments(mindmap_path) print(f"🧠 脑图已随报告交付: {mindmap_path}") ``` **脑图规则（R30-R31）：** | 规则 | 要求 | |:----|:------| | **R30** | 脑图为可选项，用户可要求生成或不生成，默认不生成 | | **R31** | 如用户要求脑图，必须在PPT生成后自动提取结构并生成PDF脑图 | ### 11.1 API依赖安装及离线检查 在执行本技能前，自动检测运行环境和依赖： ```bash # 安装依赖（需网络，仅首次） pip install python-pptx lxml python-docx reportlab # 检测离线组件状态 python3 -c "from references.generate_offline_content import ContentGenerator; g=ContentGenerator(); print(g.get_mode_label())" ``` **离线模式检查清单：** - [ ] 📦 python-pptx, python-docx, reportlab 已安装（离线环境需提前装好） - [ ] 🧠 Ollama 已安装并运行（可选，仅本地模型模式需要） - [ ] 📋 离线模板库已就绪（随skill自带，免安装） ### 11.2 自审（AUDIT）— 质量优先，页数不限 | **多格式适配** | 检查项 | 合格线 | 说明 | |:-------|:------:|:-----| | 图形密度（PPT） | ≥ 10 图/页 | 仅PPT格式检查（DOCX/PDF不适用） | | 微软雅黑覆盖 | ≥ 80% | 中文全部使用微软雅黑 | | 无 BLOCK_ARC / DIAMOND | 零容忍 | Mac兼容性检查（仅PPT） | | 格式完整性 | 100% | 文件可正常打开、无损坏、内容完整 | | 字体嵌入（PDF） | 必含 CJK | PDF需确保中文字符正确渲染 | ### 11.3 交付检查清单（23项） **基础质量（必过项）：** - [ ] ✅ 微软雅黑 + 英文Arial（通过 a:ea 节点设置东亚字体） - [ ] ✅ 无 BLOCK_ARC / 无 DIAMOND（仅PPT格式） - [ ] ✅ 使用 mck-ppt-design 布局模式（非自定义图表函数，仅PPT格式） - [ ] ✅ 执行 full_cleanup()（正则完整移除p:style+空ln+themeShadow，仅PPT格式） - [ ] ✅ AUDIT() 通过（PPT：图形密度≥10；DOCX/PDF：完整性校验） - [ ] ✅ 去AI味自检通过（无空洞/浮夸表述） **内容质量：** - [ ] ✅ 内容充分展开：每个模块按内容深度自然分页，无因"页数限制"而压缩内容 - [ ] ✅ 用户指定页数时：已按比例压缩但保证完整性和连贯性 - [ ] ✅ 数据呈现：每个数据点获得充分展示空间，不挤在一页 - [ ] ✅ 来源标注完整（三级：用户资料/搜索来源/技能分析） - [ ] ✅ 用户资料内容已扩增（≥1轮搜索补充） **素材与设计（v6新增）：** - [ ] ✅ 素材搜集已执行（素材清单 ≥ 3种类型，≥ 5个条目） - [ ] ✅ 模板风格已确认（用户确认结果已记录在案） - [ ] ✅ 素材引用已嵌入生成脚本（图片/图标路径正确） - [ ] ✅ 配色主题应用正确（theme = apply_theme("xxx") 已调用） **自进化闭环：** - [ ] ✅ 自进化日志已写入（usage_log / template_stats 已更新） - [ ] ✅ 技能发现扫描已执行（known_skills 已更新） - [ ] ✅ S13 技能自修复已执行（收集问题→分级→写入SKILL.md→更新进化日志） **文件交付（S14新增）：** - [ ] ✅ **【v6.1】** 输出格式正确（PPT/DOCX/PDF 按用户选择，默认PPT） - [ ] ✅ **【v6.1】** 文件扩展名正确（.pptx/.docx/.pdf 对应格式） - [ ] ✅ **【v6.1】** 格式完整性校验通过（文件可正常打开） - [ ] ✅ **【v7.0】** 如为制造咨询项目，是否已加载S0.5方法论（7部门+诊断框架） - [ ] ✅ **【v7.0】** 是否需要调用诊断分析工具（scripts/diagnosis_analyzer.py） - [ ] ✅ **【v7.1】** 复杂度分级是否正确（L1简单/L2标准/L3多框架组合） - [ ] ✅ **【v7.1】** L3问题是否使用了框架组合策略并执行交叉验证 - [ ] ✅ **【v7.1】** 每个改善提案是否包含ROI经济分析（投资vs节约vs回收期） - [ ] ✅ **【v7.1】** 使用的方法是否执行了"常见误用"检查 - [ ] ✅ 交付 .pptx 文件（可正常打开，无 Mac 兼容问题） - [ ] ✅ 文件已推送到微信小程序（deliver_attachments 调用成功） - [ ] ✅ 用户已收到交付提示（含微信小程序开关引导） --- ## 十一、质量门禁 ### 11.1 API依赖安装及离线检查 在执行本技能前，自动检测运行环境和依赖： ```bash # 安装依赖（需网络，仅首次） pip install python-pptx lxml python-docx reportlab # 检测离线组件状态 python3 -c "from references.generate_offline_content import ContentGenerator; g=ContentGenerator(); print(g.get_mode_label())" ``` ### 11.2 自审（AUDIT） | 检查项 | 合格线 | 说明 | |:-------|:------:|:-----| | 图形密度（PPT） | ≥ 10 图/页 | 仅PPT格式检查 | | 微软雅黑覆盖 | ≥ 80% | 中文全部使用微软雅黑 | | 无 BLOCK_ARC / DIAMOND | 零容忍 | Mac兼容性检查（仅PPT） | | 格式完整性 | 100% | 文件可正常打开、无损坏 | | L3交叉验证 | 完成 | 多框架结论模式连接+矛盾化解 | ### 11.3 交付检查清单（30项） **基础质量（必过项）：** - [ ] ✅ 微软雅黑 + 英文Arial - [ ] ✅ 无 BLOCK_ARC / 无 DIAMOND（仅PPT格式） - [ ] ✅ 使用 mck-ppt-design 布局模式（仅PPT格式） - [ ] ✅ 执行 full_cleanup()（仅PPT格式） - [ ] ✅ AUDIT() 通过（PPT：图形密度≥10；DOCX/PDF：完整性校验） - [ ] ✅ 去AI味自检通过（无空洞/浮夸表述） **内容质量：** - [ ] ✅ 内容充分展开：每个模块按内容深度自然分页 - [ ] ✅ 数据呈现：每个数据点获得充分展示空间 - [ ] ✅ 来源标注完整（三级：用户资料/搜索来源/技能分析） - [ ] ✅ 用户资料内容已扩增（≥1轮搜索补充） **方法论（v7.1新增）：** - [ ] ✅ **【v7.1】** 复杂度分级是否正确（L1简单/L2标准/L3多框架组合） - [ ] ✅ **【v7.1】** L3问题是否使用了框架组合策略并执行交叉验证 - [ ] ✅ **【v7.1】** 每个改善提案是否包含ROI经济分析 - [ ] ✅ **【v7.1】** 使用的方法是否执行了"常见误用"检查 **自进化闭环：** - [ ] ✅ 自进化日志已写入 - [ ] ✅ 技能发现扫描已执行 - [ ] ✅ S13 技能自修复已执行 **文件交付：** - [ ] ✅ 输出格式正确（PPT/DOCX/PDF 按用户选择） - [ ] ✅ 文件完整性校验通过 - [ ] ✅ 文件已交付 ## 十二、常见错误与修复 ### 错误1：文件损坏打不开（Mac/Win提示"需要修复"） **原因**：`p:style` 调用主题阴影引用 + 空 `a:ln` 节点 + `typeface` 属性缺失 → XML结构不完整导致PowerPoint修复提示 **修复**： - `full_cleanup()` 必须使用 **正则表达式彻底移除**（而非字符串替换），删除所有 `<p:style>...</p:style>` 完整节点 - 清理空 `<a:ln/>` 节点（没有子元素的线条定义） - 移除 `<a:themeShadow>` 主题阴影引用 - 确保每个 `<a:latin>` 有 `typeface="Arial"`，每个 `<a:ea>` 有 `typeface="Microsoft YaHei"` - 每个 shape 调用 `cs(s)` 清理残留 XML ### 错误2：中文显示方块 **原因**：未设置东亚字体 **修复**： ```python def sf(run, is_en=False): rPr = run._r.get_or_add_rPr() latin = rPr.find(qn('a:latin')) if latin is None: latin = rPr.makeelement(qn('a:latin'), {}) rPr.append(latin) latin.set('typeface', EN if is_en else FN) ea = rPr.find(qn('a:ea')) if ea is None: ea = rPr.makeelement(qn('a:ea'), {}) rPr.append(ea) ea.set('typeface', FN) ``` ### 错误3：Mac上图形显示异常 **原因**：BLOCK_ARC 或复杂形状不被Mac PowerPoint支持 **修复**：确保没有使用 `MSO_SHAPE.BLOCK_ARC`，所有圆环/饼图改用表格或柱状图替代。 ### 错误4：文字重叠 **原因**：行间距未设置或使用固定Y坐标 **修复**： - 设置 `p.line_spacing = Pt(font_size * 1.35)` 防止中文重叠 - 多行文本动态计算高度 - 验证每个文本块的 `top + height` 不超出下一块的 `top` ### 错误5：connector 导致崩溃 **原因**：`add_connector()` 生成的 connector 在 Mac 上可能异常 **修复**：用 `add_hline()`（薄矩形）替代所有 connector 和连线 ### 错误6：markitdown 未安装导致资料提取失败 **原因**：环境未安装 markitdown **修复**： - 方法A：尝试 `pip install 'markitdown[all]'` - 方法B：使用 `Read` 工具直接读取（PDF/图片/文本） - 方法C：使用 `WebFetch` 读取网页内容 - 方法D：使用 `python-pptx` 读取 PPTX 文字 ### 错误7：OCR识别结果不准确 **原因**：图片质量差或文字不清晰 **修复**： - 手动校对关键数据点 - 有疑问的数据标注"待确认" - 建议用户提供清晰版本或核对 ### 错误8：素材搜集无有效结果 【v6 新增】 **原因**：搜索关键词过于宽泛或行业特殊 **修复**： - 方法A：缩小搜索范围，添加限定词（"报告"、"案例"、"最佳实践"） - 方法B：使用中英双语各搜一次，互补结果 - 方法C：降级使用内置占位图标（ICON函数生成），跳过搜集 - 方法D：告知用户未找到高质量素材，建议提供参考 ### 错误9：模板风格用户不满意 【v6 新增】 **原因**：自动推荐风格与用户预期不符 **修复**： - 提供4种风格预览描述，让用户重新选择 - 记录用户选择到 usage_log 改善下次推荐 - 如果用户反复调整，最终保存用户手动选定的风格 --- ## 十三、技能自进化系统 ### 13.1 系统定位 这是技能持续进步的核心引擎。每次使用本技能时，自进化系统自动运行，实现三个目标： 1. **发现新能力** — 扫描系统中有无新增的相关技能，自动集成 2. **学习与改进** — 记录每次执行的结果、错误和改进建议 3. **持续优化** — 根据使用频率自动优化模板选择和布局推荐 ### 13.2 技能发现引擎 每次技能被调用时，自动执行技能发现扫描： ```python # 技能发现流程 def scan_new_skills(): """扫描 ~/.workbuddy/skills/ 发现新技能""" known = load_known_skills() # 加载已知技能列表 all_skills = listdir_skills() # 扫描当前所有技能 new_skills = [] for skill in all_skills: if skill not in known: relevance = assess_relevance(skill) # 评估相关性 if relevance >= threshold: new_skills.append(skill) auto_integrate(skill) # 自动集成 if new_skills: notify_user(new_skills) # 通知用户 update_known_skills(new_skills) # 更新已知列表 ``` **技能发现规则：** | 规则 | 说明 | |:----|:------| | **R10** | 每次技能加载时执行一次发现扫描 | | **R11** | 相关性评估基于 SKILL.md 中的 description 关键词匹配 | | **R12** | 发现的技能自动加入技能生态矩阵 | | **R13** | 新技能信息存储在 `self_evolution/` 目录 | | **R14** | 与现有技能同名的忽略（已有则跳过） | **已发现的技能生态（当前 25 个已集成 / 其中3个v7.0已内置）：** | 领域 | 技能 | 用途 | 集成状态 | |:----|:-----|:-----|:--------| | 分析诊断 | ie-expert, rohoon-6sigma, kaizen, sixsigma | 工业工程/六西格玛分析 | 外部依赖 | | 调研方法论 | **本技能S0.5内置**（7部门+诊断框架+改善定义） | 调研→诊断→改善→交付 | ✅ **v7.0已内置** | | 流程图绘制 | **本技能S9+内置函数**（9种图表引擎） | 路线图/鱼骨图/甘特图/架构图 | ✅ **v7.0已内置** | | PPT生成 | **本技能完整内置**（mck-ppt-design） | 报告生成全流程 | ✅ **v7.0已内置** | ### 13.3 进化数据存储 系统在 `self_evolution/` 目录中维护以下文件： ``` self_evolution/ ├── known_skills.json # 已知技能列表（含版本、发现日期） ├── usage_log.json # 使用记录（模式频率、执行结果） ├── error_log.json # 错误日志（错误类型、修复方案） ├── improvements.json # 改进建议（用户反馈、自动发现） ├── template_stats.json # 模板使用统计（频率、评分） └── evolution_summary.md # 进化摘要（供每次加载时参考） ``` ### 13.4 自进化执行流程 每次技能被调用时，自进化系统按以下流程执行： ``` 技能被调用 │ ▼ ┌── S0: 自进化检查（与内容分析同时执行） │ 1. 加载进化数据（known_skills, usage_log） │ 2. 扫描新技能（scan_new_skills） │ 3. 检查上次错误是否已修复 │ 4. 加载高频使用的布局模式偏好 │ ▼ ┌── S1-S12: 正常报告生成流程 │ （期间自动记录使用情况） │ ▼ ┌── 执行后：写入进化日志 │ ├── 记录本次使用的内容类型和模板 ├── 记录使用的布局模式及其频率 ├── 如有错误 → 写入 error_log（含修复方案） ├── 更新 template_stats（优化下次推荐） └── 更新 evolution_summary.md ``` ### 13.5 自我提升机制 ```python # 每次执行后的自我评估 def self_improve(execution_result): """根据执行结果进行自我改进""" improvements = [] # 1. 布局模式使用分析 mode_usage = analyze_mode_usage(execution_result) for mode, count in mode_usage.items(): if count > 5: # 高频使用的模式 improvements.append(f"优化模式 {mode} 的默认参数") # 2. 错误模式分析 errors = execution_result.get('errors', []) for err in errors: if err['type'] == 'font': improvements.append("字体配置需要优化") elif err['type'] == 'shape': improvements.append(f"形状 {err.get('shape')} 需要加清理守卫") # 3. 用户反馈分析 if execution_result.get('user_satisfied') == False: improvements.append("用户不满意，需审查输出质量") # 4. 技能生态更新建议 if execution_result.get('new_skills_found'): improvements.append("发现新技能，建议集成") return improvements ``` ### 13.6 每日技能巡检自动化 配合 WorkBuddy 的自动化功能，可设置每日技能巡检： ```yaml # 自动化配置建议 schedule: 每天 09:00 动作: 执行技能发现扫描 输出: 报告新发现的技能及集成建议 ``` **执行方式**： - 在 WorkBuddy 中创建自动化任务，定期运行巡检 - 或每次使用本技能时自动附带检查 - 发现新技能时，在报告中输出「💡 提示：发现新技能 XXX，可集成使用」 ### 13.7 进化数据分析示例 | 指标 | 说明 | 使用方法 | |:----|:-----|:---------| | 模式使用频率 | 每种布局模式被调用的次数 | 推荐高频模式作为优先选项 | | 模板选择准确性 | 内容类型诊断与用户反馈的一致率 | 优化 detect_content_type() 权重 | | 错误率 | 每次执行出现错误的概率 | 优先修复高频错误 | | 技能集成率 | 已集成技能占可用技能的比例 | 发现遗漏的技能进行集成 | | 用户满意度 | 用户对生成结果的反馈评分 | 优化模板和内容质量 | ### 13.8 与自进化系统对接 本技能与以下自进化框架技能协同工作： | 技能 | 用途 | 对接方式 | |:----|:-----|:---------| | self-improving-agent | 对话质量分析，识别改进机会 | 共享 evolution_summary.md | | self-reflection | 结构化反思与记忆 | 共享错误日志和学习记录 | | proactive-agent | 将 AI 从任务执行者变为主动伙伴 | 自动建议模板优化 | ### 13.9 技能自修复机制（S13）— 【v6 新增 ⭐】 #### 机制定位 **S13 是最新的一层闭环**：每次执行 PPT 生成时，如果遇到问题并找到了修复方案，该方案会被自动"写回"到 SKILL.md 中。这意味着下一次生成时，技能已经升级了——不再是"记住上次错了"，而是"技能文件本身就更新了"。 #### 闭环架构 ``` 生成 → 发现问题 → 分析根因 → 修复 → 写入SKILL.md → 下次直接受益 ↑ │ └────────────────── 每次执行都在这个循环中升级 ────────────────┘ ``` 与传统的「错误日志」不同，S13 的修复是**持久化到技能文件本身**的： | 对比项 | 传统错误日志 | S13 自修复 | |:-------|:-----------|:-----------| | 存储位置 | `self_evolution/error_log.json` | **SKILL.md + references/\*** | | 下次生效 | 需手动翻阅日志 | **自动生效**（SKILL.md已更新） | | 影响范围 | 仅查看 | 所有使用该技能的人 | | 更新方式 | 追加一条记录 | **修改技能代码/文档** | | 错误类型 | P0-P3全部记录 | 仅P0/P1级触发自动修复 | #### 触发时机 S13 在以下场景自动触发： 1. **S11 质量审查未通过** — AUDIT() 发现图形密度不足/存在 BLOCK_ARC 2. **用户报告文件错误** — 如"打不开"、"需要修复"、"字体显示异常" 3. **用户反馈内容问题** — 如"数据不对"、"排版混乱"、"来源不清晰" 4. **生成脚本执行异常** — python-pptx 报错、脚本运行中断 5. **素材搜集失败** — 联网搜索无结果或结果质量差 #### 修复类型与对应操作 | 发现问题 | 自修复操作 | 修改SKILL.md的位置 | |:---------|:----------|:------------------| | PPT文件提示"需要修复" | 更新 `full_cleanup()` 实现规范 | 「常见错误1」+「助手函数：full_cleanup」| | 中文显示方块 | 更新字体设置规范 | 「常见错误2」+「6.3字体规范」| | 文字重叠 | 更新行间距和动态高度规则 | 「常见错误4」+「布局函数TX()规范」| | 图片无法嵌入 | 更新图片嵌入方式 | 新增到「常见错误」| | 用户重复选择同一风格 | 将该风格设为默认推荐 | 「6.6配色主题·自动选择逻辑」| | 某个布局模式频繁使用 | 将该模式列为默认首选项 | 「6.1布局模式·推荐列表」| | 搜索不到合适素材 | 更新搜索关键词方案 | 「S6.5·素材搜集·搜索词表」| #### 配套参考文件 | 文件 | 说明 | |:----|:------| | `references/self_repair.py` | S13 自修复引擎脚本（问题收集→分级→自动修复→进化日志） | | `references/repair_pptx.py` | 深度PPTX修复工具（专用于"文件损坏需修复"问题的解决方案） | #### 自修复示例：以本次 full_cleanup() 修复为证 本次执行中，用户反馈 PPTX 在 PowerPoint 中提示"需要修复"： 1. **问题收集**：用户反馈「文件打不开」 2. **根因分析**：`full_cleanup()` 使用 `replace('<p:style', '<!-- ... -->')` 字符串替换，未完整移除 XML 节点，导致 PowerPoint 解析异常 3. **修复方案**：改为 `re.sub(r'<p:style[^>]*>.*?</p:style>', '', content, flags=re.DOTALL)` 正则彻底删除 + 清理空 `<a:ln/>` + 移除 `a:themeShadow` 4. **自修复写入**： - ✅ 更新「常见错误1：文件损坏打不开」的修复方案 - ✅ 更新「助手函数：full_cleanup()」的实现描述 - ✅ 新增 `references/repair_pptx.py` 独立修复脚本作为参考 5. **效果确认**：重新生成的文件PowerPoint可正常打开 这就是 S13 的实际运作——一次"边用边修，修完即升级"的闭环修复。 --- ## 十四、参考文件 | 文件 | 说明 | 来源 | |:----|:------|:-----| | `references/generate_pro.py` | PPT生成脚本模板 | consulting-report-generator | | `references/generate_docx.py` | DOCX生成脚本模板 | consulting-report-generator | | `references/generate_pdf.py` | PDF生成脚本模板 | consulting-report-generator | | `references/generate_mindmap.py` | 脑图PDF生成脚本 | consulting-report-generator | | `references/generate_offline_content.py` | 离线内容生成引擎 | consulting-report-generator | | `references/extract_content.py` | 资料提取脚本模板 | consulting-report-generator | | `references/repair_pptx.py` | PPTX深度修复脚本 | consulting-report-generator | | `references/deep_research.py` | 深度研究脚本 | consulting-report-generator | | `references/self_evolution.py` | 自进化系统脚本 | consulting-report-generator | | `references/self_repair.py` | 技能自修复引擎 | consulting-report-generator | | `references/consulting-phrases.md` | 咨询报告专业用语模板 | manufacturing-consulting-ppt | | `references/report-templates.md` | 报告页面结构模板 | manufacturing-consulting-ppt | | `references/requirements-summary.md` | 完整需求规格文档 | consulting-report-generator | | `references/methodology.md` | 调研方法论（四阶段） | manufacturing-consulting-toolkit | | `references/diagnosis_framework.md` | ODP-I²诊断框架+改善方向库 | manufacturing-consulting-toolkit | | `references/project_definition.md` | 改善项目定义与规划 | manufacturing-consulting-toolkit | | `references/sales_order.md` ~ `references/equipment_mold.md` | 7部门调研指南+设备模具 | manufacturing-consulting-toolkit | ### 资产文件（v7.0新增） | 文件 | 用途 | 来源 | |:----|:------|:-----| | `assets/survey_checklist.md` | 调研检查清单（顾问版） | manufacturing-consulting-toolkit | | `assets/interview_questions.md` | 标准化访谈问题库（8个层级） | manufacturing-consulting-toolkit | | `assets/report_template.md` | 调研报告框架模板 | manufacturing-consulting-toolkit | | `assets/ppt_outline.md` | 标准汇报PPT大纲（34页） | manufacturing-consulting-toolkit | ### 脚本工具（v7.0新增） | 文件 | 用途 | 来源 | |:----|:------|:-----| | `scripts/consulting_report_generator.py` | 交互式报告生成+ROI计算 | manufacturing-consulting-toolkit | | `scripts/diagnosis_analyzer.py` | 交互式诊断分析+优先级评估 | manufacturing-consulting-toolkit | | `scripts_industry_search/iresearch_report_search.py` | 艾瑞咨询/QuestMobile行业报告搜索脚本 | consulting-report-search | | `references_industry_search/iresearch-api.md` | iResearch/QuestMobile API参数与解析说明 | consulting-report-search | ## 十五、深度研究引擎（v5.1 新增） ### 15.1 功能定位 在内容扩增子系统基础上，增加**深度研究能力**。当用户材料中的关键数据点需要行业佐证、或者报告需要更深层次的市场分析时，启用本引擎进行多源交叉验证研究。 ### 15.2 研究框架（三阶段） ``` ┌─ 第一阶段：需求澄清 ─────────────────────────────────┐ │ 识别材料中的关键数据点 → 需要佐证的断言 → 行业空白 │ │ 输出：研究需求清单（3-5个研究主题） │ └─────────────────────────────────────────────────────────┘ │ 用户确认 ▼ ┌─ 第二阶段：多源调研 ─────────────────────────────────┐ │ 每个主题执行： │ │ ├─ 第1轮：广度搜索（5-10个来源） │ │ ├─ 第2轮：深度提取（关键来源详细分析） │ │ └─ 第3轮：交叉验证（不同来源对比验证） │ └─────────────────────────────────────────────────────────┘ │ 自动执行 ▼ ┌─ 第三阶段：数据融合 ─────────────────────────────────┐ │ 将研究结果与用户原始材料融合 │ │ ├─ 用户数据 ✓ │ │ ├─ 搜索佐证 ✓ │ │ └─ 综合分析 ✓ │ └─────────────────────────────────────────────────────────┘ ``` ### 15.3 三级证据体系 | 等级 | 来源类型 | 可信度 | 标注格式 | |:----|:---------|:------:|:---------| | L1 | 用户提供的原始材料 | ★★★ | "数据来源：用户资料" | | L2 | 权威行业报告/政府数据 | ★★★ | "来源：XXX（年份）" | | L3 | 专业媒体报道/企业公开信息 | ★★☆ | "来源：XXX·YYYY-MM-DD" | | L4 | 通用网络搜索结果 | ★☆☆ | "来源：网络搜索" | ### 15.4 研究触发条件 | 条件 | 自动触发 | 说明 | |:----|:--------:|:-----| | 材料中包含具体数字指标 | ✅ | 自动搜索行业基准对标 | | 材料提及竞争对手或行业趋势 | ✅ | 搜索最新动态补充 | | 材料中有政策/法规引用 | ✅ | 验证政策时效性 | | 用户明确要求"深度研究" | ✅ | 完整三阶段执行 | | 仅做PPT排版 | ❌ | 跳过研究 | ### 15.5 与现有工作流的集成 深度研究引擎嵌入 S3（内容扩增）阶段，在关键数据点识别后自动判断是否需要执行研究。 ### 15.6 研究执行规范 ``` 第1轮 - 广度搜索: web_search(query, count=10) → 初始发现摘要 第2轮 - 深度提取: web_fetch(top_3_results) → 详细内容+关键数据 第3轮 - 交叉验证: web_search(alternative_terms) + web_fetch → 多源对比 ``` ### 15.7 研究技能生态对接 | 技能 | 用途 | 触发场景 | |:----|:-----|:---------| | academic-deep-research | 严谨学术级研究 | 需要APA引用、文献综述 | | deep-research-pro | 多阶段迭代调研 | 市场调研、竞品分析 | | research-cog | AI深度研究 | 投资研究、行业分析 | | arxiv-watcher | ArXiv论文摘要 | 最新技术研究成果 | | news-summary | 新闻资讯抓取 | 行业最新动态和热点 | --- ## 十六、本地与离线模式（v6.1 新增 ⭐） > 本技能可自动适配三种运行环境：**在线模式**（标准）、**本地模型模式**（Ollama）、**完全离线模式**（无网络+无模型）。 > 无需用户手动配置，自动检测并切换。 ### 16.1 三种运行模式 | 模式 | 网络 | 本地模型 | 内容来源 | 适用场景 | |:----|:----:|:--------:|:---------|:---------| | ☁️ **在线模式** | ✅ 有网 | — | WebSearch + API | 标准使用（默认） | | 💻 **本地模型模式** | ❌ 无网 | ✅ Ollama | 本地模型生成 | 内网/离线但有GPU | | 📦 **完全离线** | ❌ 无网 | ❌ 不可用 | 内置离线模板库 | 隔离网络/纯本地 | ### 16.2 自动检测逻辑 ```python def detect_mode(): """自动检测并切换运行模式""" if check_network(): return "online" # 有网络 → 标准在线模式 if check_ollama(): return "local_model" # 无网络但有Ollama → 本地模型 return "offline" # 完全离线 → 使用内置模板 ``` ### 16.3 离线内容模板库 内置 **10个行业标准章节模板** + **3个离线案例库**，确保完全离线时也能生成专业内容： | 模板ID | 内容 | 字数 | |:------|:-----|:----:| | lean_intro | 精益生产概述 | ~200字 | | seven_wastes | 七大浪费详解 | ~200字 | | jit | 准时化JIT | ~150字 | | jidoka | 自働化Jidoka | ~150字 | | kaizen | 持续改善Kaizen | ~150字 | | tpm | TPM全面生产维护 | ~150字 | | smed | SMED快速换模 | ~150字 | | 5s | 5S现场管理 | ~150字 | | oee | OEE与性能衡量 | ~150字 | | case_studies | 3个离线行业案例 | ~300字 | ### 16.4 Ollama 本地模型配置 如需使用本地模型模式，确保： ```bash # 1. 安装Ollama curl -fsSL https://ollama.com/install.sh | sh # 2. 下载模型（需要一次联网） ollama pull gemma4:e2b-it-q4_K_M # 3. 启动服务 ollama serve ``` 技能自动通过 `http://localhost:11434` 调用 Ollama API。 ### 16.5 离线模式工作流变更 在离线模式下，以下步骤自动降级： | 步骤 | 在线模式 | 本地模型模式 | 完全离线模式 | |:----|:---------|:------------|:------------| | **S3 内容扩增** | WebSearch行业数据 | Ollama生成内容 | **离线模板库** | | **S5 联网调研** | 多引擎搜索 | 跳过调研 | **跳过调研** | | **S6.5 素材搜集** | WebFetch搜图 | 使用本地ICON | 使用本地ICON | | **S9 脚本生成** | Python全量脚本 | Python全量脚本 | **Python全量脚本** | | **S10 执行** | pip安装+执行 | pip安装+执行 | pip安装+执行 | > **核心保障**：PPT/DOCX/PDF/Mindmap 的生成和格式输出**完全不依赖网络**，离线不影响。 > 离线仅影响内容扩增和素材搜集——降级使用内置模板和ICON占位符。 ### 16.6 离线模式标记 生成的PPT在离线模式下，页面底部来源标注自动切换： ```python # 在线模式 SR(s, "来源：Evocon全球OEE基准报告·2024") # 离线模式 SR(s, "来源：离线内容模板库（consulting-report-generator v6.1）") ``` ### 16.7 参考脚本 | 文件 | 说明 | |:----|:------| | `references/generate_offline_content.py` | 离线内容生成引擎（自动检测→切换模式→Ollama/模板回退） | --- ## 十七、IE经济分析与ROI计算模板（v7.1 新增） 每个改善提案应包含可量化的经济分析，使建议从"经验型"升级为"可计算型"。 ### ROI计算模板 ```python def calculate_roi(investment, annual_savings, years=3): """投资回报分析（简化版）""" payback_period = investment / annual_savings # 回收期（年） total_return = annual_savings * years roi = (total_return - investment) / investment * 100 npv = sum([annual_savings / (1 + 0.08)**(y+1) for y in range(years)]) - investment return { "payback_years": round(payback_period, 1), "payback_months": round(payback_period * 12, 0), "roi_pct": round(roi, 0), "npv": round(npv, 0), "verdict": "建议投资" if payback_period < 2 else "审慎评估" } ``` ### 常见误用与纠偏（管理咨询方法工具箱 v7.1） | 方法 | 常见误用 | 纠偏指引 | |:----|:---------|:---------| | VSM价值流图 | ❌ 只画现状图不做未来图设计 | ✅ VSM核心价值在识别未来状态改善点 | | DMAIC | ❌ 跳过Measure直接分析 | ✅ 无数据不分析，先收集再诊断 | | 鱼骨图 | ❌ 把所有原因画上就结束 | ✅ 必须用ABC或Pareto筛出关键少数 | | SWOT | ❌ 只列条目不做交叉策略 | ✅ 必须生成SO/WO/ST/WT四项交叉 | | 5WHY | ❌ 问三次就停或跳转到结论 | ✅ 必须追问到系统层根因而非表层 | | 波特五力 | ❌ 只做行业分析不做企业定位 | ✅ 五力后必须连接企业战略选择 |

path: assets/interview_questions.md
content: # 调研访谈问题库（按层级/部门）

## 高层访谈（总经理/副总/厂长）

### 战略与目标
1. 贵公司未来3-5年的战略目标是什么？
2. 目前最关注的业务痛点是什么（TOP3）？
3. 同行业中，您觉得哪些竞争对手做得好？好在哪里？
4. 数字化/智能制造的愿景和目标是什么？
5. 信息化投入的大致预算范围？

### 经营与绩效
6. 公司目前的核心KPI有哪些？哪些达标了？哪些不理想？
7. 客户最常投诉的问题是什么？
8. 您觉得内部最大的浪费是什么？
9. 目前的竞争压力主要来自哪些方面（成本/交期/质量/服务）？
10. 如果只能改善一件事，您选什么？

## 销售部

### 订单流程
1. 从接到客户订单到录入系统，整个流程是怎样的？
2. 交期承诺谁来做？依据是什么？
3. 急单/插单怎么处理？有没有规则？
4. 订单变更（数量/交期/规格）多吗？变更流程是什么？

### 预测管理
5. 做不做销售预测？怎么做？准确率大概多少？
6. 预测有没有反馈闭环？（实际vs预测的差异分析？）

### 协同
7. 和计划部的协同方式是什么？信息传递靠什么？
8. 客户档案/历史订单数据在哪里？

## 计划部

### MPS/MRP
1. 主生产计划（MPS）怎么编？用什么工具？频率？
2. MRP怎么跑？系统自动还是手工？
3. BOM准确率大概多少？多久盘点核对一次？
4. MRP跑出来的采购建议准不准？平时用吗？

### 排产
5. 怎么排产？考虑什么约束条件？
6. 排产结果变更的频率高吗？原因是什么？
7. 有没有排产看板/生产计划看板？
8. 计产数据怎么回来？（报工方式、及时性）

### 库存
9. 库存周转天数大概多少？你认为合理吗？
10. 呆滞料怎么处理？占库存比例多少？
11. 安全库存怎么设定的？定期更新吗？

### 协同
12. 计划变动信息如何传递给采购和生产？
13. 有没有产销协同会议（S&OP）？

## 生产部

### 现场管理
1. 5S有没有在做？效果怎么样？谁在检查？
2. 作业指导书（SOP）有没有？员工按标准做吗？
3. 现场异常（质量/设备/缺料）怎么处理？响应时间多久？

### 效率
4. OEE是多少？怎么算的？数据来自哪里？
5. 当前最大的效率瓶颈在哪道工序？
6. 换线/换模一般多久？有没有做过快速换模（SMED）？
7. 产线节拍（Takt Time）有没有定义？

### 质量与异常
8. 合格率大概多少？主要不良类型是什么？
9. 停线次数多吗？主要原因是什么？
10. 产线有没有安灯（Andon）系统？

### 人员
11. 多能工比例多少？怎么培养的？
12. 员工培训体系怎么样？新员工上岗前培训几天？

## 采购部

1. 采购是怎么分类管理的？有没有品类策略？
2. 供应商怎么评估？有没有分级？
3. 主要瓶颈物料是什么？供应情况如何？
4. 采购计划是根据MRP生成的还是人工估算？
5. 供应商准时交付率大概多少？
6. 急单/加急采购多吗？什么原因造成的？
7. 采购审批流程？从需求到下单一般多久？

## 仓储物流

1. 目前库存准确率多少？怎么盘点的？
2. 仓库有没有WMS？库位管理怎么做的？
3. FIFO怎么保证？
4. 物料怎么送到产线？（领料/配送？）
5. 发货有没有拣货校验？发货出错率多少？
6. 收发货流程是什么？有没有扫码？

## 质量部

1. 目前的质量体系认证情况？
2. 来料检验IQC怎么做的？抽检比例？免检怎么定的？
3. 过程质量IPQC怎么控制？有没有SPC？
4. 质量能不能追溯（从成品追溯到原材料批次）？
5. 客诉怎么处理（8D流程？）平均处理周期多久？
6. 质量数据有没有分析？怎么用的？
7. 质量成本有统计吗？

## 工艺技术部

1. BOM是谁维护的？更新频率？
2. BOM准确率怎么样？有没有管理办法？
3. 工艺路线和标准工时怎么来的？多久更新一次？
4. 工程变更（ECN）流程是怎样的？执行到位吗？
5. PLM/PDM有没有用？和ERP/MES通不通？
6. 新产品导入（NPI）流程？
7. 有没有数字化方面的工艺数据准备计划？

## 设备/模具管理

1. 设备种类、数量和关键程度分类？
2. OEE有没有统计？怎么统计的？数据大概多少？
3. 设备点检制度执行情况？操作员做自主保全吗？
4. 设备故障率多少？TOP3故障原因是什么？
5. MTBF/MTTR有统计吗？
6. 设备保养（PM）计划执行率多少？
7. 设备管理看板有吗？实时状态怎么看的？
8. 设备有没有数据输出功能？有没有联网（IoT）？
9. 备品备件怎么管理？关键备件清单有没有？
10. 模具种类和数量？有没有模具台账？
11. 模具寿命管理怎么做？模具保养有计划吗？
12. 模具库怎么管理的（存放/领用/归还）？
13. 换模人员怎么配置的？换模频次多少？
14. 换模平均时间多少？有没有做过SMED改善？
15. 换模内外部作业有区分吗？换模准备提前做吗？
16. 设备/模具调试时间平均多少？调试人员技能水平？
17. 目前设备管理上最大的困难是什么？


path: assets/ppt_outline.md
content: # 调研汇报PPT大纲

> 适用于向客户高层进行调研成果汇报，建议PPT页数：30-40页

---

## Part 1：项目概述（3-4页）

### P1 封面
- 项目名称：[客户名]数字化制造诊断与规划
- 副标题：调研诊断报告
- 日期、咨询团队名称
- 保密声明

### P2 目录
- 项目背景与目标
- 企业现状概览
- 核心诊断发现
- 改善方向与项目规划
- 合作建议与价值展望

### P3 项目背景
- 项目启动背景（1-2句话）
- 调研范围（7大部门）
- 调研方法（访谈/现场/数据）
- 调研概览数据（访谈X场/Gemba X次/采集X项数据）

### P4 企业概况（简明）
- 基本信息（员工/营收/产品）
- 生产模式与特点
- 信息化系统矩阵（ERP/MES/WMS/PLM...）

---

## Part 2：企业现状与绩效（3-5页）

### P5 企业运营总览
- 订单→交付端到端流程全景图
- 当前流程地图（简洁版）

### P6 核心绩效现状
| 指标 | 当前值 | 行业基准 | 结论 |
| OTD | | | ✅/⚠️/❌ |
| 库存周转 | | | ✅/⚠️/❌ |
| OEE | | | ✅/⚠️/❌ |
| ... | | | |

> 用绿灯/黄灯/红灯直观展示

### P7 信息化成熟度雷达图
- 六维雷达图：ERP使用、MES、WMS、PLM、数据决策、系统集成
- 每个维度打分1-5

### P8 各部门痛点云图
- 从调研中提取的高频关键词云

---

## Part 3：核心诊断发现（12-16页）← **重点部分**

### P9 核心问题概览
- "TOP 10问题"清单表格
- 问题严重性矩阵图（四象限）

### 以下是每个模块的诊断页（每部门2页）

#### 销售与订单管理（2页）
- **P10** 当前流程图+关键发现（3-5个要点，每个要点配数据）
- **P11** 问题根因分析+改善方向建议

#### 生产计划与排程（2页）
- **P12** 计划流程+关键发现
- **P13** 根因+改善方向

#### 生产现场管理（2页）
- **P14** 现场发现（配现场照片）：5S问题、WIP堆积、SOP缺失
- **P15** 数据+根因+改善方向

#### 采购与供应链（2页）
- **P16** 采购流程+关键发现
- **P17** 根因+改善方向

#### 仓储物流（2页）
- **P18** 仓储现状(配照片)+关键发现
- **P19** 根因+改善方向

#### 质量管理（2页）
- **P20** 质量流程+关键发现
- **P21** 数据+根因+改善方向

#### 工艺技术（2页）
- **P22** 工艺管理现状+关键发现
- **P23** 根因+改善方向

---

## Part 4：改善方向与项目规划（6-8页）

### P24 改善方向总览
- 精益方向、数字化方向、组织流程方向
- 三大方向联动关系图

### P25 改善路线图
- 时间轴路线图（速赢→重点→数字化/战略）
- 每个阶段的里程碑

### P26-28 重点项目介绍（每个项目1页）
每个项目一页，包含：
| 项目名称 | 类型 |
| 问题痛点 | 数据 |
| 改善方向 | 方法论 |
| 预期效益 | 投入估算 |
| 实施周期 | 关键里程碑 |

### P29 投入产出总览
- 总投资vs预期年收益
- ROI分析表
- 各项目效益占比饼图

### P30 项目依赖关系图
- 项目间的关联和依赖关系
- 关键路径标注

---

## Part 5：合作建议与展望（3-4页）

### P31 合作模式建议
- 推荐合作模式（诊断+方案/顾问辅导/总包实施）
- 合作范围说明

### P32 我方优势
- 团队经验、方法论、案例
- [咨询公司]的核心能力

### P33 下一步行动
- 项目启动建议时间
- 团队配置建议
- 预期投入产出

### P34 结束页
- 感谢语
- 联系方式

---

## PPT制作要点

### 设计原则
- **一页一个观点**，不要在一页塞太多信息
- **用图表说话**，减少大段文字
- **关键数据突出**，用红/绿色标注好坏
- **照片胜过千言**，现场照片是最有力的证据

### 配色建议
- 主色：深蓝（专业感）
- 强调色：红色（问题/痛点）、绿色（改善/效益）
- 背景：白色/浅灰色

### 每页结构
```
标题（一句话概括本页核心观点）
  ┌──────────────────────────────────────┐
  │  正文内容                            │
  │  · 关键发现                          │
  │  · 数据支撑                          │
  │  · 图表/照片                         │
  │                                      │
  └──────────────────────────────────────┘
  底部：页脚（公司名/项目名/页码）
```

### 汇报节奏建议
| 部分 | 时间分配 | 重点 |
|------|:--------:|------|
| 开场+背景 | 5分钟 | 建立信任 |
| 现状+诊断 | 25分钟 | 核心内容，用数据说服 |
| 改善规划 | 15分钟 | 展示专业能力和价值 |
| 合作建议 | 10分钟 | 推动下一步行动 |
| QA | 5分钟 | 答疑解惑 |
| **总计** | **60分钟** | |


path: assets/report_template.md
content: # 离散制造企业数字化咨询调研报告

> **报告编号：** ______  **|**  **密级：** 机密
> **客户名称：** ______ **|**  **项目编号：** ______
> **报告日期：** ______ **|**  **版本：** V1.0

---

## 目录

1. 项目概述
2. 企业现状
3. 端到端流程诊断
4. 各模块诊断详情
   - 4.1 销售与订单管理
   - 4.2 生产计划与排程
   - 4.3 生产现场管理
   - 4.4 采购与供应链
   - 4.5 仓储物流
   - 4.6 质量管理
   - 4.7 工艺技术
5. 核心问题总结
6. 改善方向与建议
7. 改善项目规划
8. 合作建议
9. 附录

---

## 1. 项目概述

### 1.1 项目背景
[描述项目启动的背景和目的]

### 1.2 调研范围
| 维度 | 范围 |
|------|------|
| 时间 | YYYY-MM-DD 至 YYYY-MM-DD |
| 部门 | 销售/计划/生产/采购/仓储/质量/工艺 |
| 产品/产线 | |
| 系统范围 | ERP/MES/WMS/PLM等 |

### 1.3 调研方法
| 方法 | 场次/数量 | 参与方 |
|------|:---------:|--------|
| 高层访谈 | 场 | |
| 部门访谈 | 场 | |
| 现场观察(Gemba) | 次 | |
| 问卷调研 | 份 | |
| 数据采集 | 项 | |

---

## 2. 企业现状概述

### 2.1 企业基本情况
| 项目 | 内容 |
|------|------|
| 成立时间 | |
| 员工人数 | |
| 年营业额 | |
| 主要产品 | |
| 生产模式 | □ MTS □ MTO □ ETO □ 混合 |
| 主要客户 | |

### 2.2 信息化现状
| 系统 | 有/无 | 品牌 | 使用深度 | 评价 |
|:----:|:-----:|:----:|:--------:|:----:|
| ERP | | | | |
| MES | | | | |
| WMS | | | | |
| PLM/PDM | | | | |
| CRM | | | | |
| SRM | | | | |
| OA/HR | | | | |
| BI/报表 | | | | |

### 2.3 核心绩效指标现状
| 指标 | 当前值 | 行业基准 | 差距 |
|:----:|:------:|:--------:|:----:|
| 交期达成率(OTD) | | | |
| 计划达成率 | | | |
| 库存周转天数 | | | |
| OEE | | | |
| 一次合格率 | | | |
| 客户投诉率 | | | |

---

## 3. 端到端流程诊断

### 3.1 订单至交付全景图
[绘制当前状态流程图]

**核心发现：**
- 流程断点：__________
- 信息孤岛：__________
- 重复工作：__________

### 3.2 关键流程痛点汇总

| 流程环节 | 问题描述 | 影响程度 | 涉及部门 |
|---------|---------|:--------:|---------|
| 接单 | | ★★★ | |
| 计划 | | ★★★ | |
| 采购 | | ★★★ | |
| 仓储 | | ★★★ | |
| 生产 | | ★★★ | |
| 质检 | | ★★★ | |
| 发货 | | ★★★ | |

---

## 4. 各模块诊断详情

### 4.1 销售与订单管理

**现状描述：**

**流程图（当前）：**

**主要发现：**
1. [问题1] — [具体现象] — [数据支撑]
2. [问题2] — [具体现象] — [数据支撑]
3. [问题3] — [具体现象] — [数据支撑]

**改善方向：**
- [改善方向1]
- [改善方向2]

### 4.2 生产计划与排程
[同上结构]

### 4.3 生产现场管理
[同上结构]

### 4.4 采购与供应链
[同上结构]

### 4.5 仓储物流
[同上结构]

### 4.6 质量管理
[同上结构]

### 4.7 工艺技术
[同上结构]

---

## 5. 核心问题总结

### TOP 10 问题清单

| 序号 | 问题 | 严重程度 | 紧迫程度 | 涉及部门 | 改善方向 |
|:----:|------|:--------:|:--------:|---------|---------|
| 1 | | ★★★ | ★★★ | | |
| 2 | | ★★★ | ★★★ | | |
| 3 | | ★★★ | ★★★ | | |
| 4 | | ★★★ | ★★★ | | |
| 5 | | ★★★ | ★★★ | | |
| 6 | | ★★★ | ★★★ | | |
| 7 | | ★★★ | ★★★ | | |
| 8 | | ★★★ | ★★★ | | |
| 9 | | ★★★ | ★★★ | | |
| 10 | | ★★★ | ★★★ | | |

### 根因分析
[从流程/系统/组织/能力四个维度进行根因归类]

---

## 6. 改善方向与建议

### 6.1 精益方向
| 改善方向 | 目标 | 预期效果 | 优先级 |
|---------|------|---------|:----:|
| | | | P1 |
| | | | P2 |

### 6.2 数字化方向
| 改善方向 | 目标 | 预期效果 | 优先级 |
|---------|------|---------|:----:|
| | | | P1 |
| | | | P2 |

### 6.3 组织流程方向
| 改善方向 | 目标 | 预期效果 | 优先级 |
|---------|------|---------|:----:|
| | | | P1 |
| | | | P2 |

---

## 7. 改善项目规划

### 7.1 改善路线图

```
[时间轴]
  近 期（速赢）      中 期（重点改善）     远 期（数字化/战略）
  ┌──────────┐      ┌──────────┐        ┌──────────┐
  │          │      │          │        │          │
  │ 项目A    │  →  │ 项目C    │   →   │ 项目E    │
  │ 项目B    │      │ 项目D    │        │ 项目F    │
  └──────────┘      └──────────┘        └──────────┘
  1-3个月            3-6个月              6-12个月
```

### 7.2 重点项目卡片
[参考项目卡片模板，每个项目一页]

### 7.3 投入产出分析
| 项目 | 投入(万元) | 预期年效益(万元) | ROI周期 | 优先级 |
|:----:|:---------:|:---------------:|:-------:|:------:|
| 项目A | | | | P1 |
| 项目B | | | | P1 |
| 项目C | | | | P2 |

---

## 8. 合作建议

### 8.1 合作模式建议
[建议的合作模式+理由]

### 8.2 实施路径
[分阶段实施路径]

### 8.3 价值展望
[合作后的预期价值]

---

## 9. 附录

### 附件清单
- 附件1：调研日程与参与人员
- 附件2：数据采集汇总表
- 附件3：现场照片记录
- 附件4：访谈纪要汇总
- 附件5：问卷分析报告


path: assets/survey_checklist.md
content: # 离散制造企业调研检查清单（顾问版）

> 检查清单用于调研准备和现场逐项确认，确保不遗漏关键环节。

## 调研准备
- [ ] 企业背景资料研读（官网/年报/行业信息）
- [ ] 调研计划与日程确认（各部门时间安排）
- [ ] 调研资料准备（记录表/相机/录音设备）
- [ ] 高层访谈提纲准备
- [ ] 数据采集表预制（按部门）

## 调研过程（按部门）

### 销售部
- [ ] 组织架构与岗位职责
- [ ] 订单管理流程穿行（从接单到转计划的完整路径）
- [ ] CRM系统演示
- [ ] 销售预测方法与实践
- [ ] 订单交期承诺机制
- [ ] 订单变更/急单处理实例（近3个月TOP3）
- [ ] 客户投诉/退货数据
- [ ] 销售KPI与考核方式
- [ ] 数据采集：月订单数、急单占比、OTD、订单变更率

### 计划部
- [ ] 组织架构与岗位职责
- [ ] MPS编制流程与工具
- [ ] MRP运算方式（系统/手工？准确率？）
- [ ] 排产工具与方法演示
- [ ] 产能规划方法
- [ ] BOM准确性验证（现场抽样3-5个产品）
- [ ] 库存管理SOP
- [ ] 齐套检查流程
- [ ] 缺料处理流程
- [ ] 数据采集：计划达成率、库存周转天数、齐套率、呆滞料占比

### 生产部
- [ ] 现场5S评估（拍照记录，按检查表评分）
- [ ] SOP覆盖与执行情况
- [ ] 标准工时实测（选3-5个关键工序）
- [ ] OEE数据（如自测无法计算则采集基础数据）
- [ ] 换型时间实测
- [ ] 异常响应机制（演示Andon/呼叫系统）
- [ ] 产线布局查看（拍照+草图）
- [ ] WIP管理（选关键工位间拍照记录）
- [ ] MES系统演示（如有）
- [ ] 多能工矩阵查看
- [ ] 数据采集：OEE、C/T、换型时间、停线数据、WIP、SOP覆盖率

### 采购部
- [ ] 组织架构与采购品类划分
- [ ] 采购策略制定方法
- [ ] 供应商分级管理制度
- [ ] 供应商绩效评估（QCD数据）
- [ ] 采购订单流程穿行（需求→PO→到货）
- [ ] 来料不良处理流程
- [ ] 加急采购数据（频次/原因）
- [ ] 供应商门户/EDI使用（如有）
- [ ] 数据采集：采购周期、供应商OTD、来料不良率、加急采购占比

### 仓储物流
- [ ] 仓库布局查看（拍照+草图）
- [ ] 库位标识与物卡一致性
- [ ] 收货流程现场穿行
- [ ] 拣货流程现场穿行
- [ ] FIFO执行验证
- [ ] 盘点制度与准确率数据
- [ ] WMS系统演示（如有）
- [ ] 物配送方式（现场观察配送路线）
- [ ] 线边仓管理状态
- [ ] 数据采集：库存准确率、盘点差异、仓库面积、收发单据数

### 质量部
- [ ] 质量体系认证及范围
- [ ] IQC流程穿行（抽样标准→检验→放行/拒收）
- [ ] IPQC现场查看（首检记录/SPC控制图）
- [ ] OQC流程演示
- [ ] 不合格品区/隔离区查看
- [ ] 质量追溯演示（指定一个成品追溯到原材料批次）
- [ ] 客诉处理实例（近半年TOP5）
- [ ] 质量数据报表查看
- [ ] 数据采集：来料/过程/出货不良率、客诉数、质量成本

### 工艺技术部
- [ ] 组织架构与BOM管理职责
- [ ] BOM结构深度与准确率验证（现场抽查）
- [ ] 工艺路线与SOP管理
- [ ] ECN/ECO流程穿行
- [ ] ECN执行率数据
- [ ] PLM/PDM系统演示
- [ ] NPI流程查看
- [ ] 数据采集：BOM准确率、ECN平均周期、ECN执行率

## 调研收尾
- [ ] 调研总结会议（向客户反馈初步发现）
- [ ] 补充数据需求清单
- [ ] 感谢函/备忘录起草
- [ ] 内部团队复盘会议
- [ ] 问题清单初稿整理
- [ ] 照片/资料归档

## 调研注意事项
1. **先看后问** — Gemba Walk先走一圈，再访谈
2. **用数据说话** — 每个发现都要有数据支撑
3. **5Why追问** — 对每个痛点至少追问3个Why
4. **拍照留存** — 现场问题点拍照记录，注意合规
5. **避免主观判断** — 记录事实而非观点，保留原始数据
6. **交叉验证** — 同一问题问多个部门获得不同视角


path: references/consulting-phrases.md
content: # 咨询报告专业用语模板

> 本文件提供制造咨询领域专业、有说服力的语言模板。
> 用于提升报告的专业感和说服力。
> 使用时根据实际内容灵活调整，不要生搬硬套。

---

## 一、项目背景与目标章节

### 开场定调（有冲击力的开篇）

| 场景 | 模板 |
|------|------|
| 宏观背景 | "在制造业竞争日趋激烈的今天，企业面临成本攀升、交期缩短、品质要求提升的多重挑战……" |
| 行业趋势 | "工业4.0、中国制造2025等战略推动下，制造企业正从'规模驱动'向'精益+智能'双轮驱动转型……" |
| 客户痛点 | "尽管企业在过去几年取得了长足发展，但在生产效率、计划协同、数据驱动决策等方面，仍存在显著改善空间。" |

### 项目目标表述

| 场景 | 模板 |
|------|------|
| 总目标 | "本项目旨在通过精益生产体系导入与数字化工具落地，实现运营效率显著提升、成本结构优化和管理体系固化三大战略目标。" |
| 分项目标 | "围绕XX（如：计划物控体系），重点解决计划不准、物料不齐、信息不畅三大痛点。" |
| 量化目标 | "项目目标设定为：OEE提升至85%以上、换型时间缩短50%、交付准时率提升至98%。" |

---

## 二、现状描述与问题发现

### 问题描述（客观、有证据）

| 类型 | 模板 |
|------|------|
| 委婉指出 | "通过实地调研与数据分析，我们发现当前运营体系中存在若干优化空间……" |
| 直接指出 | "数据表明，当前该环节的效率显著低于行业基准水平，主要表现为：……" |
| 问题量化 | "据统计，近6个月平均计划达成率仅为72%，远低于行业标杆95%的水平。" |
| 严重问题 | "尤为值得关注的是，该问题已对交付和成本产生实质性影响——每月因此导致的加急费用约XX万元。" |

### 根因分析

| 类型 | 模板 |
|------|------|
| 因果表述 | "经深入分析，造成交货准时率偏低的根因可归结为三点：一、……二、……三、……" |
| 系统归因 | "这一问题并非单一环节所致，而是系统性的流程断点和协同缺失共同作用的结果。" |
| 归因递进 | "表面上看是……的不足，深层次原因则在于管理机制和流程体系的缺失。" |

---

## 三、改善方案与实施路径

### 方案引入

| 类型 | 模板 |
|------|------|
| 方案定位 | "针对以上问题，我们提出以下系统性改善方案……" |
| 价值主张 | "本方案的核心思路是'流程优化先行、工具赋能跟进、机制固化保障'的三步走策略。" |
| 创新性 | "借鉴行业最佳实践，结合企业实际情况，我们创新性地提出了……的解决方案。" |

### 方案描述

| 类型 | 模板 |
|------|------|
| 坚定推荐 | "我们建议立即启动以下重点工作……" |
| 有说服力 | "该方案已经在多家同行业企业成功验证，预计可在X个月内产生可量化的改善效果。" |
| 稳妥建议 | "考虑到实施风险，建议采取'试点先行、逐步推广'的实施策略。" |

---

## 四、成果展示

### 成果定性

| 类型 | 模板 |
|------|------|
| 显著成果 | "经过X个月的系统推进，项目在X个关键领域取得了突破性成果……" |
| 有说服力 | "以下数据充分证明改善方案的有效性和可复制性……" |
| 超越预期 | "实际成果不仅达到预期目标，多项指标更是超越了初始设定值。" |

### 数据呈现

| 类型 | 模板 |
|------|------|
| 对比强调 | "改善前后对比：换型时间从120分钟降至45分钟，降幅达62.5%。" |
| 趋势呈现 | "自改善实施以来，直通率呈持续上升趋势，从3月的82.3%提升至6月的95.7%。" |
| 行业对标 | "当前OEE水平已从改善前的62%提升至82%，接近行业标杆水平。" |
| 财务量化 | "通过库存优化，释放流动资金约XX万元，年化资金成本节约约XX万元。" |
| 积少成多 | "虽然单次换型缩短仅75分钟，但按日均2次、年工作300天计算，年累计可释放产能约XX小时。" |

### 标志性成就

| 类型 | 模板 |
|------|------|
| 里程碑 | "MES系统成功上线并稳定运行，标志着企业数字化转型迈出了关键一步。" |
| 能力转移 | "通过系统的培训和辅导，已培养内部精益讲师XX名，建立了可持续改善的内生动力。" |

---

## 五、总结与展望

### 价值总结

| 类型 | 模板 |
|------|------|
| 精炼总结 | "本项目的核心价值在于'一套体系、一支队伍、一个平台'——建立了精益管理体系、培养了内部改善团队、搭建了数字化管理平台。" |
| 战略高度 | "项目的意义不仅在于短期运营指标的改善，更重要的是为企业的长期精益转型和智能制造升级奠定了坚实基础。" |
| 合作导向 | "项目的成功是双方团队紧密协作、深度配合的成果。感谢贵公司各级领导的大力支持和项目团队的共同努力。" |

### 持续建议

| 类型 | 模板 |
|------|------|
| 温馨提示 | "改善永无止境。我们建议将精益改善作为一项常态化的管理机制持续推行……" |
| 明确路径 | "为确保改善成果可持续，我们建议重点关注三个方面：一、……二、……三、……" |
| 前瞻建议 | "展望未来，建议企业在现有精益体系基础上，逐步向数字化、智能化方向深化……" |

---

## 六、增强说服力的句式技巧

### 1. 数据锚定法
```
在改善前，平均停工等待时间为▁▁分钟/天；
改善实施后，这一数字降至▁▁分钟/天，降幅达▁▁%。
按年计算，相当于新增有效产能▁▁小时，产▁▁万元。
```

### 2. 对比冲击法
```
改善前：▁▁
改善后：▁▁
差距：▁▁
```

### 3. 对标定位法
```
该指标改善前处于行业▁▁（落后/平均）水平，
改善后已达到行业▁▁（先进/标杆）水平。
```

### 4. 因果链法
```
因为解决了▁▁问题，
所以▁▁流程得到优化，
进而实现了▁▁的改善，
最终带来了▁▁的经济效益。
```

### 5. 情景假设法
```
如果不进行该改善，
预计未来▁▁个月将面临▁▁的风险（成本增加/订单流失/质量事故），
造成的损失可能高达▁▁万元。
```

### 6. 专家权威法
```
参照《▁▁行业最佳实践指南》及我们在▁▁家同行业企业的实施经验，
我们判断该方案的成功率超过▁▁%。
```

---

## 七、过渡与连接用语

| 功能 | 模板 |
|------|------|
| 自然过渡 | "以上我们回顾了项目的实施过程。接下来，让我们聚焦于项目所取得的量化成果。" |
| 引出重点 | "在诸多改善成果中，尤为值得关注的是……" |
| 引发思考 | "数据背后值得我们深思的是：为什么同样的资源投入，改善前后的产出会有如此大的差异？" |
| 承上启下 | "了解问题现状后，下一个关键问题是：如何系统性地解决这些问题？" |
| 提出问题 | "面对上述挑战，企业需要回答三个核心问题：……" |
| 给出结论 | "综合以上分析，我们的判断是明确的：……" |

---

## 八、禁忌用语对照表

| ❌ 避免使用 | ✅ 推荐使用 |
|------------|------------|
| "可能"、"也许"、"大概" | "数据显示"、"分析表明"、"我们判断" |
| "我们希望"、"我们觉得" | "我们建议"、"方案提出"、"策略是" |
| "做得不好"、"很差" | "存在优化空间"、"有提升潜力" |
| "客户不配合" | "在协同配合方面存在进一步深化的空间" |
| "这是行业通病" | "这是行业中普遍存在的共性问题，但通过系统方案可以有效解决" |
| "我们做了很多工作" | "项目按计划推进了X大模块、Y项具体工作" |
| "效果不错"、"有很大提升" | "量化数据表明，关键指标改善幅度达XX%" |
| "我们会继续努力" | "下一阶段将聚焦于……以确保改善成果的可持续性" |

---

## 九、AI与工业智能专题用语

### AI项目价值表述

| 类型 | 模板 |
|------|------|
| AI定位 | "AI不是替代人的工具，而是赋能人的利器——将经验决策升级为数据+算法驱动的智能决策。" |
| 技术价值 | "通过机器视觉与深度学习技术，质检效率提升XX倍，漏检率降低至XX%以下。" |
| 预测价值 | "基于历史数据的预测性维护模型，将非计划停机减少XX%，年化节约XX万元。" |
| 阶段划分 | "AI建设遵循'三步走'策略：先数据基础（打通数据孤岛）、再场景落地（关键场景AI化）、后全面智能（构建工业大脑）。" |

### AI成熟度表述

| 级别 | 描述 |
|------|------|
| L0 未启动 | "企业AI应用尚处于起步阶段，主要依赖人工经验决策。" |
| L1 试点 | "已在XX场景开展AI试点，初步验证了技术可行性。" |
| L2 局部应用 | "AI在XX个场景实现常态化运行，但尚未形成体系化。" |
| L3 系统集成 | "AI能力已嵌入核心业务流程，与现有系统(ERP/MES)实现集成。" |
| L4 全面智能 | "数据驱动的智能决策已在企业运营中全面落地，形成可复用的AI能力平台。" |

---

## 十、六西格玛与质量管理专题用语

### DMAIC项目表述

| 阶段 | 模板 |
|------|------|
| 定义D | "项目聚焦于XX流程，当前DPPM为XX，目标降至XX，预期年化收益XX万元。" |
| 测量M | "通过MSA分析确认测量系统能力达标（GR&R<10%），基线数据采集周期XX天。" |
| 分析A | "通过假设检验和回归分析，确定关键影响因子为XX，其P值<0.05，具有统计学显著性。" |
| 改进I | "基于DOE全因子实验设计，优化参数组合为XX，改进后过程能力指数Cpk从XX提升至XX。" |
| 控制C | "建立控制计划和控制图监控机制，确保改善成果可持续，XMR控制图运行稳定。" |

### 质量能力表述

| 类型 | 模板 |
|------|------|
| 当前水平 | "当前过程能力指数Cpk为XX，处于行业XX水平，存在较大提升空间。" |
| 目标设定 | "通过六西格玛项目推进，目标将Cpk提升至1.33以上（相当于4σ水平）。" |
| 持续改进 | "建立基于SPC的过程监控体系，实现从'事后检验'向'事中控制'的转变。" |
| 体系融合 | "将六西格玛方法论与精益生产体系深度融合，形成'精益六西格玛'的持续改善文化。" |


path: references/deep_research.py
content: #!/usr/bin/env python3
"""
深度研究引擎 v5.1 — 多源交叉验证+证据层次+三轮调研
集成到咨询总结报告生成器的 S3 内容扩增阶段
"""
import json

# ═══════════════════════════════════════════════
# 第一阶段：需求澄清
# ═══════════════════════════════════════════════

def identify_research_needs(extracted_text):
    """从提取的文本中识别需要深度研究的关键数据点
    
    返回: [(主题, 查询关键词, 优先级), ...]
    """
    needs = []
    
    # 识别数字指标（OEE、库存周转、生产周期等）
    metric_patterns = [
        ("OEE", ["OEE行业基准", "设备综合效率 制造业 基准"]),
        ("库存周转", ["库存周转率 行业平均", "制造业 库存周转 对标"]),
        ("生产周期", ["生产周期 行业标准", "制造周期 缩短 案例"]),
        ("良品率", ["良品率 行业标准", "直通率 制造业 基准"]),
        ("准时交付率", ["准时交付率 制造业 行业水平", "OTD 行业基准"]),
    ]
    
    for metric, keywords in metric_patterns:
        if metric in extracted_text:
            needs.append((f"{metric}行业对标", keywords[0], "high"))
    
    # 识别竞争对手/行业趋势
    trend_markers = ["行业趋势", "竞争对手", "市场规模", "增长", "政策"]
    if any(m in extracted_text for m in trend_markers):
        needs.append(("行业趋势与政策", "行业最新趋势 政策 2025 2026", "medium"))
    
    return needs

# ═══════════════════════════════════════════════
# 第二阶段：多源调研执行计划
# ═══════════════════════════════════════════════

def build_research_plan(topics):
    """根据研究方向生成调研执行计划
    
    每个主题执行三轮调研:
    第1轮: 广度搜索 → 5-10个来源
    第2轮: 深度提取 → 关键来源详细分析
    第3轮: 交叉验证 → 不同来源对比
    """
    plan = []
    for topic, query, priority in topics:
        plan.append({
            "topic": topic,
            "queries": [
                query,                                     # 第1轮: 主查询
                f"{query} 数据 报告 统计",                # 第2轮: 精确查询
                f"{query} 对比 分析 趋势",                 # 第3轮: 对比验证
            ],
            "priority": priority,
            "status": "pending"
        })
    return plan

# ═══════════════════════════════════════════════
# 第三阶段：数据融合
# ═══════════════════════════════════════════════

def merge_research_results(user_data, research_findings):
    """将用户数据与研究发现融合
    
    三级证据融合:
    L1: 用户原始数据 (最高优先级)
    L2: 权威来源数据 (中等优先级)  
    L3: 网络来源数据 (补充参考)
    """
    merged = {
        "user_data": user_data,
        "research_data": research_findings,
        "conclusions": []
    }
    
    # 对每个发现点生成综合结论
    for finding in research_findings:
        conclusion = {
            "topic": finding["topic"],
            "user_claim": finding.get("user_claim", ""),
            "research_support": finding.get("evidence", []),
            "consistency": "supported" if len(finding.get("evidence", [])) >= 2 else "insufficient",
            "source_level": "L2" if len(finding.get("evidence", [])) >= 3 else "L3"
        }
        merged["conclusions"].append(conclusion)
    
    return merged

# ═══════════════════════════════════════════════
# 数据点检查清单
# ═══════════════════════════════════════════════

def check_data_point(value, metric, industry_benchmark):
    """检查数据点是否需要标注或修正"""
    if not value or not industry_benchmark:
        return {"status": "unknown", "note": "数据不足，无法对标"}
    
    ratio = value / industry_benchmark
    if ratio > 2.0:
        return {"status": "warning", "note": f"显著偏离行业基准（{industry_benchmark}），建议核实"}
    elif ratio > 1.5:
        return {"status": "note", "note": f"高于行业基准（{industry_benchmark}），有改善空间"}
    else:
        return {"status": "good", "note": "数据合理"}

if __name__ == "__main__":
    print("深度研究引擎 v5.1 已加载")
    print("集成方式: 在 S3 内容扩增阶段调用")
    print("依赖: WebSearch + WebFetch 工具链")


path: references/diagnosis_framework.md
content: # 问题诊断框架与改善方向库

## 端到端诊断模型：ODP-I²（订单-交付-问题-改善）

采用"从接单到交付"全流程扫描法，按照4大维度对企业进行诊断。

### 诊断4大维度

| 维度 | 权重 | 描述 |
|:----:|:----:|------|
| **流程(Process)** | 30% | 业务流程完整性、标准化、执行落地 |
| **系统(System)** | 25% | 信息化覆盖率、系统集成度、数据质量 |
| **组织(Organization)** | 20% | 职责清晰、KPI合理、协同效率 |
| **能力(Capability)** | 25% | 人员技能、管理方法、改善文化 |

## 端到端流程诊断速查

接单→计划→采购→仓储→生产→质检→发货

| 流程节点 | 检查要点 | 常见问题 | 改善方向 |
|---------|---------|---------|---------|
| **接单** | 交期承诺依据、订单录入方式、变更处理 | 销售乱承诺、手工录入出错、变更无流程 | 建立ATP承诺、订单系统化、ECN流程 |
| **计划** | MPS/MRP、排产方式、计划频率 | 无滚动计划、排产靠经验、计划孤岛 | 建立S&OP、导入APS、滚动排产 |
| **采购** | 采购模式、供应商管理、到货准时率 | 多头采购、供应商无评估、到货波动大 | 品类管理、供应商分级、VMI |
| **仓储** | 库位管理、盘点、配送方式 | 物无定位、账实不符、领料制 | WMS、条码化、配送至工位 |
| **生产** | 5S/标准化/OEE/异常管理 | 现场混乱、SOP形同虚设、异常响应慢 | 精益现场导入、TPM、Andon |
| **质检** | 检验流程、追溯、质量数据 | 质量孤岛、追溯困难、不良重复 | SPC、批次追溯、质量数据平台 |
| **发货** | 发货流程、准确率 | 发货出错、物流跟踪缺失 | 扫码出库、物流跟踪 |

## 改善方向速查库（按专业领域）

### 精益生产方向
| 改善方向 | 适用场景 | 潜在价值 |
|---------|---------|:--------:|
| 5S+目视化管理 | 现场混乱、SOP执行差 | 效率提升5-10% |
| VSM价值流优化 | 交付周期长、WIP高 | 交付周期缩短30-50% |
| TPM自主维护 | 设备故障多、OEE低 | OEE提升15-25% |
| SMED快速换模 | 换线时间长、批量大 | 换型时间缩短50-80% |
| 看板拉动系统 | 库存高、计划波动大 | WIP降低30-50% |
| 标准化作业 | 质量波动大、新人上手慢 | 效率稳定+质量提升 |
| 线平衡改善 | 瓶颈工序突出 | 产线效率提升10-20% |
| Poka-Yoke防错 | 人为错误多、不良率波动 | 不良率降低50-90% |

### 数字化方向
| 改善方向 | 适用场景 | 潜在价值 |
|---------|---------|:--------:|
| MES实施 | 生产过程不透明、追溯困难 | 实时透明+可追溯 |
| WMS/条码系统 | 库存不准、找货难、收发错 | 库存准确率>99% |
| APS高级排程 | 排产靠经验、订单延误多 | 排产效率+交期改善 |
| QMS质量系统 | 质量数据孤岛、追溯难 | 质量数据闭环 |
| 数据采集(IoT) | 设备数据不透明、OEE靠估算 | 数据驱动决策 |
| 数字孪生 | 工艺复杂、需模拟仿真 | 优化产线+预防问题 |

### 组织流程方向
| 改善方向 | 适用场景 | 潜在价值 |
|---------|---------|:--------:|
| S&OP产销协同 | 产销脱节、库存波动大 | 供需平衡+库存优化 |
| 计划集控中心 | 计划分散、执行监控缺失 | 计划一盘棋 |
| KPI体系设计 | 考核与战略脱节、数据不透明 | 管理抓手+持续改善 |
| 流程再造(BPR) | 流程冗长、审批多、决策慢 | 效率提升30-50% |
| 组织架构优化 | 职责重叠、部门墙 | 协同效率提升 |
| 供应链协同 | 供应商管理弱、供应链响应慢 | 供应链韧性+成本优化 |

## 改善方向评价矩阵

| 维度 | 评价标准 | 权重 |
|:----:|---------|:----:|
| **紧迫度** | 问题对业务的冲击程度 | 30% |
| **可行性** | 技术/资源/时间可行性 | 25% |
| **价值量** | 预期效益（效率/质量/成本） | 30% |
| **扩展性** | 能否横向复制推广 | 15% |

### 优先级四象限

```
                高可行性
                 ↑
      ┌─────────────────────┐
      │    Quadrant II       │  Quadrant I
      │    长期规划          │  立即行动
      │    (高价值·低可行)    │  (高价值·高可行)
      │                     │
      │    • 数字孪生        │  • 5S+目视化
      │    • 全流程自动化    │  • SOP标准化
      │                     │  • Andon系统
      └─────────────────────┘
    低价值 ←───────────→ 高价值
      ┌─────────────────────┐
      │    Quadrant III      │  Quadrant IV
      │    观察区            │  有机会做
      │    (低价值·低可行)    │  (低价值·高可行)
      │                     │
      │    • 全自动立库      │  • 办公自动化
      │    • AI质检全替代    │  • 报表电子化
      │                     │
      └─────────────────────┘
                 ↓
                低可行性
```

## 改善项目卡片输出格式

每个改善项目包含：
1. **项目名称** — 简明扼要
2. **问题描述** — 业务痛点+数据支撑
3. **改善方向** — 精益/数字化/组织流程
4. **实施方案** — 关键步骤+里程碑
5. **预期效益** — 量化指标（效率/质量/成本/交期）
6. **投入估算** — 时间/资金/资源
7. **优先级** — P1(高优)/P2(中优)/P3(长期)
8. **关联系统** — ERP/MES/WMS/PLM等


path: references/engineering.md
content: # 工艺技术调研指南

## 调研目标
- 评估工艺技术管理规范化水平
- 识别BOM、工艺路线等基础数据的完整性与准确性
- 评估工程变更管理(ECN)流程有效性

## 调研重点

### 1. BOM管理
- BOM结构（单层/多层/模块化BOM）
- BOM层级深度
- BOM准确率（抽样验证）
- BOM维护流程与责任人
- 替代料/选项件管理

### 2. 工艺路线管理
- 工艺路线定义（工序/工时/设备/工装）
- 标准工时制定方法（实测/MOD/经验？）
- 工艺路线版本管理
- 工艺文件管理（SOP标准化）

### 3. 工程变更管理(ECN/ECO)
- 变更触发机制
- ECN审核流程
- 变更执行追踪（BOM/SOP/库存/采购切换）
- ECN执行率（是否按时完成？）

### 4. 设计-制造协同
- 研发与工艺部门协作机制
- DFM（面向制造的设计）应用
- 新产品导入(NPI)流程
- 试产管理

### 5. 信息系统
- PLM/PDM系统使用
- 工艺数据与ERP/MES集成
- 数字化转型中的工艺数据准备

## 常见问题诊断库

| 问题现象 | 可能根因 | 典型影响 |
|---------|---------|---------|
| BOM准确率低 | 维护滞后/ECN未同步/一人维护 | MRP跑不准/错买/漏买 |
| 标准工时不准 | 长期未更新/测定方法不科学 | 排产不准/效率评估失真 |
| ECN执行不到位 | 流程松散/责任不明/无追踪 | 切换混乱/呆滞料/返工 |
| 工艺路线与实际脱节 | 工艺优化后未更新系统 | 排产与实际不符 |
| 研发到量产周期长 | 缺乏NPI流程/DFM缺失 | 产品上市慢/试产问题多 |
| 工艺数据散乱 | 无PLM/无标准化模板 | 查询困难/一致性差 |


path: references/equipment_mold.md
content: # 设备与模具管理调研指南

## 调研目标
- 评估设备管理与TPM体系成熟度
- 识别设备故障与OEE损失的主要根因
- 评估模具管理与换模效率

## 调研重点

### 1. 设备基础管理
- 设备台账（种类/数量/关键程度分类）
- 设备点检制度与执行频率
- 设备故障报修流程及响应时效
- 点检维修记录管理方式

### 2. 设备保全体系(TPM)
- 操作员自主保全(AM)执行情况（日常清洁/点检/润滑/紧固）
- 专业保全(PM)计划与实施率
- OEE数据采集（自动/手工/未统计）
- MTBF/MTTR追踪
- 设备故障信息汇总与根因分析
- 防止再发对策体系

### 3. 备品备件管理
- 关键备件清单
- 备件采购流程与周期
- 备件安全库存管理

### 4. 设备数字化
- 设备是否具备数据输出功能
- 设备联网与数据采集(IoT)现状
- 设备管理看板（实时状态）

### 5. 模具管理
- 模具台账与寿命管理
- 模具库管理（存放/领用/归还流程）
- 模具完好性保障
- 模具保养计划与执行
- 模具备件采购

### 6. 换模管理
- 换模人员配置与技能
- 换模频次与计划性
- 换模准备（内部作业/外部作业区分）
- 换模/调试平均时间（实测数据）

## 常见问题诊断库

| 问题现象 | 可能根因 | 典型影响 |
|---------|---------|---------|
| OEE低 | 故障多/换型长/质量损失 | 产能不足/成本高 |
| 设备频繁故障 | 自主保全缺失/PM计划执行差 | 停线损失/交期延误 |
| 模具状态不可控 | 模具库管理缺失/寿命无追踪 | 生产异常/质量波动 |
| 换模时间长 | 内外部作业未区分/改善不足 | 柔性差/被迫大批量 |
| 备件响应慢 | 备件清单缺失/采购流程长 | MTTR长/停线延长 |
| 设备数据不透明 | 无数据采集/无OEE看板 | 改善无依据/管理凭感觉 |
| 点检流于形式 | 检查表不实用/监督缺失 | 突发故障/安全风险 |

## 数据采集项
- OEE（可用率/性能率/质量率）
- 设备故障率
- MTBF/MTTR
- PM计划执行率
- 换模频次与时间
- 备件库存金额与周转
- 模具寿命与状态


path: references/extract_content.py
content: #!/usr/bin/env python3
"""
咨询报告资料提取脚本 v1
基于 markitdown + python-pptx 的多格式文档文字提取
支持：PDF / Word / Excel / 图片(OCR) / HTML / PPTX

用法：
    python extract_content.py <文件路径>
    
输出：
    extracted_content.md — 按来源分类的结构化文本摘要
    extracted_data.json — 识别的关键数据点（数字/指标/KPI）
"""

import os, sys, json


# ═══════════════════════════════════════════════════════════
# 提取方法矩阵
# ═══════════════════════════════════════════════════════════

# 方法A: markitdown（推荐，支持PDF/Word/Excel/图片OCR/HTML）
# 安装：pip install 'markitdown[all]'
# 用法：markitdown 文件路径 -o 输出.md

# 方法B: Read工具（WorkBuddy内置，支持PDF/图片/文本读取）
# 用法：直接调用 Read 工具

# 方法C: python-pptx（PPTX文字+图片提取）
def extract_pptx_text(pptx_path, output_dir="extracted"):
    """从PPTX提取文字和图片"""
    from pptx import Presentation
    os.makedirs(output_dir, exist_ok=True)
    
    prs = Presentation(pptx_path)
    slides_text = []
    
    for si, slide in enumerate(prs.slides):
        slide_text = []
        img_idx = 0
        for shape in slide.shapes:
            # 提取文字
            if hasattr(shape, 'text') and shape.text.strip():
                slide_text.append(shape.text)
            
            # 提取图片
            if hasattr(shape, 'shape_type') and shape.shape_type == 13:  # 图片类型
                image = shape.image
                img_bytes = image.blob
                ext = image.content_type.split('/')[-1]
                if ext == 'jpeg': ext = 'jpg'
                img_idx += 1
                img_name = f"slide{si+1:02d}_img{img_idx:02d}.{ext}"
                img_path = os.path.join(output_dir, img_name)
                with open(img_path, 'wb') as f:
                    f.write(img_bytes)
                print(f"  📷 提取图片: {img_name}")
        
        if slide_text:
            slides_text.append(f"--- 第{si+1}页 ---\n" + "\n".join(slide_text))
    
    return "\n\n".join(slides_text)


def extract_images_from_pptx(source_path, output_dir="extracted_images"):
    """从原PPTX提取所有图片，按幻灯片编号保存"""
    from pptx import Presentation
    os.makedirs(output_dir, exist_ok=True)
    
    prs = Presentation(source_path)
    img_count = 0
    
    for slide_idx, slide in enumerate(prs.slides):
        for shape_idx, shape in enumerate(slide.shapes):
            if hasattr(shape, 'shape_type') and shape.shape_type == 13:  # 图片类型
                image = shape.image
                image_bytes = image.blob
                ext = image.content_type.split('/')[-1]
                if ext == 'jpeg': ext = 'jpg'
                filename = f"slide{slide_idx+1:02d}_img{shape_idx+1:02d}.{ext}"
                filepath = os.path.join(output_dir, filename)
                with open(filepath, 'wb') as f:
                    f.write(image_bytes)
                img_count += 1
                print(f"  提取: {filename} ({len(image_bytes)} bytes)")
    
    return img_count


# 方法D: 关键数据点识别
def extract_key_data_points(text):
    """从文本中识别关键数据点"""
    import re
    
    data_points = {
        "percentages": [],      # 百分比：85%、30% 等
        "numbers_with_units": [], # 带单位的数字：1.9天、500件等
        "years": [],             # 年份：2021、2022等
        "currencies": [],        # 金额：¥8.5亿、500万等
        "kpis": [],              # KPI关键指标
    }
    
    # 百分比
    for m in re.finditer(r'(\d+\.?\d*)\s*%', text):
        data_points["percentages"].append(m.group(0))
    
    # 带单位的数字
    for m in re.finditer(r'(\d+\.?\d*)\s*(天|月|年|件|个|家|次|人|台|套|条|亿|万)', text):
        data_points["numbers_with_units"].append(m.group(0))
    
    # 年份
    for m in re.finditer(r'(19|20)\d{2}\s*年', text):
        data_points["years"].append(m.group(0))
    
    # 金额
    for m in re.finditer(r'[¥￥]?\d+\.?\d*\s*(亿|万|元)', text):
        data_points["currencies"].append(m.group(0))
    
    # KPI常见指标
    kpi_keywords = ['OEE', '交付率', '良率', '周转率', '周期', '产能', '效率',
                    '成本', '库存', 'WIP', '在制', '节拍', 'Takt', '换型', 'SMED']
    for kw in kpi_keywords:
        if kw.lower() in text.lower():
            # 找到包含该关键词的句子
            for line in text.split('\n'):
                if kw.lower() in line.lower():
                    data_points["kpis"].append(line.strip()[:80])
                    break
    
    return data_points


# ═══════════════════════════════════════════════════════════
# 主流程：判断文件类型→执行提取→输出结果
# ═══════════════════════════════════════════════════════════

def main(file_paths):
    """对多个文件执行资料提取"""
    output_dir = "extracted_content"
    os.makedirs(output_dir, exist_ok=True)
    
    all_text = []
    all_data_points = {}
    
    for file_path in file_paths:
        if not os.path.exists(file_path):
            print(f"⚠️ 文件不存在: {file_path}")
            continue
        
        ext = os.path.splitext(file_path)[1].lower()
        filename = os.path.basename(file_path)
        print(f"\n{'='*50}")
        print(f"📄 处理文件: {filename}")
        print(f"{'='*50}")
        
        text = ""
        
        # 方法1: markitdown (推荐)
        try:
            import subprocess
            result = subprocess.run(
                ["markitdown", file_path],
                capture_output=True, text=True, timeout=120  # 大文件可能需要较长时间
            )
            if result.returncode == 0 and result.stdout.strip():
                text = result.stdout
                print(f"  ✅ markitdown 提取成功")
        except (FileNotFoundError, subprocess.TimeoutExpired, Exception) as e:
            print(f"  ⚠️ markitdown 提取失败: {e}")
        
        # 方法2: 根据文件类型降级
        if not text:
            if ext in ['.pptx']:
                text = extract_pptx_text(file_path, output_dir)
                img_count = extract_images_from_pptx(file_path, output_dir)
                print(f"  ✅ python-pptx 提取成功（含 {img_count} 张图片）")
            elif ext in ['.txt', '.md']:
                with open(file_path, 'r', encoding='utf-8') as f:
                    text = f.read()
                print(f"  ✅ 直接读取成功")
            elif ext in ['.xlsx', '.xls']:
                try:
                    import openpyxl
                    wb = openpyxl.load_workbook(file_path, data_only=True)
                    lines = []
                    for ws in wb.worksheets:
                        for row in ws.iter_rows(values_only=True):
                            vals = [str(v) for v in row if v is not None]
                            if vals:
                                lines.append(" | ".join(vals))
                    text = "\n".join(lines)
                    print(f"  ✅ openpyxl 读取成功")
                except Exception as e:
                    print(f"  ⚠️ openpyxl 读取失败: {e}")
            else:
                print(f"  ❌ 无法提取: {ext} 格式")
                continue
        
        # 保存提取的文本
        output_file = os.path.join(output_dir, f"{filename}.md")
        with open(output_file, 'w', encoding='utf-8') as f:
            f.write(f"# 提取来源: {filename}\n\n{text}")
        
        all_text.append(f"## 来源: {filename}\n\n{text}")
        
        # 识别关键数据点
        data_points = extract_key_data_points(text)
        all_data_points[filename] = data_points
        
        print(f"  📊 识别数据点: ", end="")
        for k, v in data_points.items():
            if v:
                print(f"{k}={len(v)} ", end="")
        print()
    
    # 输出汇总文件
    summary_path = os.path.join(output_dir, "extracted_summary.md")
    with open(summary_path, 'w', encoding='utf-8') as f:
        f.write("# 资料提取汇总\n\n")
        f.write("\n\n".join(all_text))
    
    # 输出关键数据点
    data_path = os.path.join(output_dir, "extracted_data.json")
    with open(data_path, 'w', encoding='utf-8') as f:
        json.dump(all_data_points, f, ensure_ascii=False, indent=2)
    
    print(f"\n{'='*50}")
    print(f"✅ 资料提取完成")
    print(f"  📝 提取文本: {summary_path}")
    print(f"  📊 数据点: {data_path}")
    print(f"{'='*50}")


if __name__ == '__main__':
    if len(sys.argv) < 2:
        print("用法: python extract_content.py <文件路径1> [文件路径2 ...]")
        print("示例: python extract_content.py report.pdf data.xlsx photo.png")
        sys.exit(1)
    main(sys.argv[1:])


path: references/generate_docx.py
content: """
generate_docx.py — DOCX报告生成参考模板（v6.1 consulting-report-generator）
基于 python-docx 生成专业Word文档，Theme Contract 风格
"""

from docx import Document
from docx.shared import Pt, Inches, RGBColor, Emu
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_TABLE_ALIGNMENT
from docx.oxml.ns import qn, nsdecls
from docx.oxml import parse_xml
import os

# Theme Contract (deepblue)
THEME = {
    "primary": RGBColor(0x05, 0x1C, 0x2C),
    "secondary": RGBColor(0x33, 0x33, 0x33),
    "accent": RGBColor(0x00, 0x6B, 0xA6),
    "light": RGBColor(0xF2, 0xF2, 0xF2),
    "bg": RGBColor(0xFF, 0xFF, 0xFF),
    "font_cn": "Microsoft YaHei",
    "font_en": "Arial",
}

def set_font(run, size=11, color=THEME["secondary"], bold=False, font_name=None):
    """统一设置字体"""
    run.font.size = Pt(size)
    run.font.color.rgb = color
    run.font.bold = bold
    run.font.name = font_name or THEME["font_en"]
    # 设置东亚字体
    rPr = run._r.get_or_add_rPr()
    rFonts = rPr.find(qn('w:rFonts'))
    if rFonts is None:
        rFonts = parse_xml(f'<w:rFonts {nsdecls("w")} w:eastAsia="{THEME["font_cn"]}"/>')
        rPr.append(rFonts)
    else:
        rFonts.set(qn('w:eastAsia'), THEME["font_cn"])


def add_title(doc, text, level=0):
    """添加标题（0=封面主标题, 1=章节, 2=子节）"""
    if level == 0:
        p = doc.add_paragraph()
        p.alignment = WD_ALIGN_PARAGRAPH.CENTER
        p.space_before = Pt(72)
        p.space_after = Pt(24)
        run = p.add_run(text)
        set_font(run, size=26, color=THEME["primary"], bold=True)
        return p
    else:
        heading = doc.add_heading(text, level=level)
        for run in heading.runs:
            set_font(run, size={1: 18, 2: 14}[level], color=THEME["primary"], bold=True)
        return heading


def add_body(doc, text, size=11, bold=False):
    """添加正文段落"""
    p = doc.add_paragraph()
    p.space_after = Pt(6)
    run = p.add_run(text)
    set_font(run, size=size, bold=bold)
    return p


def add_bullet(doc, items):
    """添加列表"""
    for item in items:
        p = doc.add_paragraph(item, style='List Bullet')
        for run in p.runs:
            set_font(run, size=11)
    return doc


def add_table_simple(doc, headers, rows):
    """添加表格"""
    table = doc.add_table(rows=1 + len(rows), cols=len(headers))
    table.alignment = WD_TABLE_ALIGNMENT.CENTER
    table.style = 'Light Grid Accent 1'
    
    # 表头
    for i, h in enumerate(headers):
        cell = table.rows[0].cells[i]
        cell.text = h
        for p in cell.paragraphs:
            p.alignment = WD_ALIGN_PARAGRAPH.CENTER
            for run in p.runs:
                set_font(run, size=9, color=THEME["bg"], bold=True)
        # 表头背景色
        shading = parse_xml(f'<w:shd {nsdecls("w")} w:fill="051C2C"/>')
        cell._tc.get_or_add_tcPr().append(shading)
    
    # 数据行
    for ri, row in enumerate(rows):
        for ci, val in enumerate(row):
            cell = table.rows[ri + 1].cells[ci]
            cell.text = str(val)
            for p in cell.paragraphs:
                p.alignment = WD_ALIGN_PARAGRAPH.CENTER
                for run in p.runs:
                    set_font(run, size=9)
            if ri % 2 == 1:
                shading = parse_xml(f'<w:shd {nsdecls("w")} w:fill="F2F2F2"/>')
                cell._tc.get_or_add_tcPr().append(shading)
    
    return table


def add_page_break(doc):
    """分页"""
    doc.add_page_break()


def generate_report(title, sections, output_path):
    """
    生成完整DOCX报告
    
    参数:
        title: 报告标题
        sections: [{"heading": str, "content": [text|table|list], ...}]
        output_path: 输出路径
    """
    doc = Document()
    
    # 封面
    add_title(doc, title, level=0)
    doc.add_paragraph()
    for section in sections:
        add_page_break(doc)
        add_title(doc, section["heading"], level=1)
        
        for item in section.get("content", []):
            if isinstance(item, str):
                add_body(doc, item)
            elif isinstance(item, list):
                add_bullet(doc, item)
    
    doc.save(output_path)
    print(f"✅ DOCX报告已生成: {output_path}")
    return output_path


if __name__ == "__main__":
    # 示例
    generate_report(
        title="精益生产体系深度解析",
        sections=[
            {"heading": "一、精益生产概述", "content": ["精益生产源于丰田..."]},
            {"heading": "二、七大浪费", "content": ["TIMWOOD...", ["生产过剩", "等待"]]},
        ],
        output_path="/tmp/report.docx"
    )


path: references/generate_mindmap.py
content: """
generate_mindmap.py — PPT结构脑图生成（v6.1 consulting-report-generator）
基于 reportlab 绘制层次化思维导图，从 Slide Config 数据生成 PDF 脑图
"""

from reportlab.lib.pagesizes import A4, landscape
from reportlab.lib.units import mm, cm
from reportlab.lib.colors import HexColor
from reportlab.pdfgen import canvas
from reportlab.lib.colors import black, white
import math, os

# Theme colors
NV = HexColor("#051C2C")
AB = HexColor("#006BA6")
AG = HexColor("#007A53")
AO = HexColor("#D46A00")
AR = HexColor("#C62828")
LG = HexColor("#CCCCCC")

def draw_rounded_rect(c, x, y, w, h, r=4, fill=NV, text="", text_color=white, font_size=10, bold=False):
    """绘制圆角矩形+文字"""
    c.setFillColor(fill)
    c.roundRect(x, y, w, h, r, fill=1, stroke=0)
    c.setFillColor(text_color)
    c.setFont("Helvetica-Bold" if bold else "Helvetica", font_size)
    c.drawCentredString(x + w/2, y + h/2 - font_size/3, text)


def generate_mindmap(slide_configs, output_path, title="报告结构脑图"):
    """
    从 Slide Config 数据生成脑图 PDF
    
    参数:
        slide_configs: [{"type":"section","label":"PART 01","title":"..."}, ...]
        output_path: 输出 .pdf 路径
        title: 脑图标题
    """
    w, h = landscape(A4)  # A4横向
    c = canvas.Canvas(output_path, pagesize=landscape(A4))
    
    # 标题
    c.setFillColor(NV)
    c.setFont("Helvetica-Bold", 18)
    c.drawString(30, h - 35, title)
    c.setStrokeColor(AB)
    c.setLineWidth(2)
    c.line(30, h - 42, w - 30, h - 42)
    
    # 脑图布局参数
    root_x = 60
    root_y = h / 2
    level_gap = 150  # 层级间的水平间距
    vert_gap = 28     # 同级节点间的垂直间距
    
    # 绘制根节点
    draw_rounded_rect(c, root_x, root_y - 12, 100, 24, 5, NV, "PPT结构大纲", white, 10, True)
    
    # 从slide_configs中提取层级结构
    current_x = root_x + level_gap
    
    # 分组：章节与页面
    sections = []
    current_section = None
    
    for cfg in slide_configs:
        if cfg.get("type") == "section":
            current_section = {"title": cfg.get("title", ""), "pages": []}
            sections.append(current_section)
        elif cfg.get("type") in ("page", "content"):
            label = cfg.get("label", "")
            if current_section:
                current_section["pages"].append(label)
            else:
                # 封面/目录等特殊页
                sections.append({"title": label, "pages": []})
    
    if not sections:
        # 如果无分组，直接展平
        for cfg in slide_configs:
            if cfg.get("type") in ("page", "content"):
                sections.append({"title": cfg.get("label", ""), "pages": []})
    
    # 计算总高度（固定每节60px）
    max_pages = max((len(s.get("pages", [])) for s in sections), default=0)
    sec_height = 40 + max_pages * 22
    total_h = len(sections) * 60 + max_pages * 10
    start_y = min(h/2 + total_h/2, h - 80)
    
    # 绘制连接线和子节点
    for si, sec in enumerate(sections):
        sec_y = start_y - si * 45
        
        # 根节点到章节的连接线
        c.setStrokeColor(NV)
        c.setLineWidth(1.5)
        c.line(root_x + 100, root_y, current_x, sec_y)
        
        # 章节节点（Level 1）
        draw_rounded_rect(c, current_x, sec_y - 10, 130, 20, 4, AB, 
                          sec["title"][:20], white, 9, True)
        
        # 子页面（Level 2）
        pages = sec.get("pages", [])
        for pi, page_title in enumerate(pages[:5]):  # 最多5个子页
            page_y = sec_y - 14 - (pi + 1) * 22
            
            # 章节到页面的连接线
            c.setStrokeColor(LG)
            c.setLineWidth(0.8)
            c.line(current_x + 130, sec_y, current_x + level_gap, page_y)
            
            # 页面节点
            draw_rounded_rect(c, current_x + level_gap, page_y - 8, 120, 16, 3, 
                              AG if pi == 0 else HexColor("#88C0D0"),
                              page_title[:18], white, 7)
            
            # 如果还有更多页面用虚线...
            if pi == 4 and len(pages) > 5:
                c.setStrokeColor(LG)
                c.setDash(3, 3)
                c.line(current_x + level_gap, page_y - 12, 
                       current_x + level_gap + 60, page_y - 12)
                c.setDash()
                c.setFillColor(HexColor("#999999"))
                c.setFont("Helvetica", 7)
                c.drawString(current_x + level_gap + 5, page_y - 18, 
                            f"... 还有 {len(pages)-5} 页"[:15])
    
    # 底部信息
    c.setFillColor(HexColor("#999999"))
    c.setFont("Helvetica", 8)
    from datetime import datetime
    c.drawString(30, 20, f"共 {len(slide_configs)} 页幻灯片 | 生成时间: {datetime.now().strftime('%Y-%m-%d %H:%M')}")
    c.drawRightString(w - 30, 20, "consulting-report-generator v6.1")
    
    c.save()
    print(f"✅ 脑图已生成: {output_path}")
    return output_path


# ============================================================
# 从 PPT Slide Config 数据生成脑图
# ============================================================

def build_slide_configs_from_ppt_structure(slides_data):
    """
    从PPT页面结构自动构建脑图配置
    
    参数:
        slides_data: [{"type":"cover|section|content|closing", "title":"...", "page":1}, ...]
    """
    configs = []
    for slide in slides_data:
        stype = slide.get("type", "content")
        if stype == "section":
            configs.append({
                "type": "section",
                "title": slide.get("title", ""),
                "label": slide.get("label", "")
            })
        elif stype in ("content", "cover", "toc"):
            configs.append({
                "type": "page",
                "label": slide.get("title", "")[:25]
            })
        elif stype == "closing":
            configs.append({
                "type": "page",
                "label": "总结与致谢"
            })
    return configs


def mindmap_from_ppt(pptx_path_or_slides, output_dir="/tmp"):
    """
    从PPT（或slides数据）生成脑图PDF
    
    用法:
        mindmap_from_ppt(slides_data, "/tmp/mindmap.pdf")
    """
    if isinstance(pptx_path_or_slides, list):
        configs = build_slide_configs_from_ppt_structure(pptx_path_or_slides)
        output_name = "ppt_structure_mindmap.pdf"
    else:
        # 未来可支持从pptx文件直接解析
        raise ValueError("请传入幻灯片数据列表")
    
    output_path = os.path.join(output_dir, output_name)
    generate_mindmap(configs, output_path)
    return output_path


if __name__ == "__main__":
    # 示例：精益生产PPT的Slide Config
    example_slides = [
        {"type": "cover", "title": "精益生产体系深度解析", "page": 1},
        {"type": "toc", "title": "内容目录", "page": 2},
        {"type": "section", "title": "精益生产概述", "label": "PART 01", "page": 3},
        {"type": "content", "title": "精益生产的起源与发展演进", "page": 4},
        {"type": "content", "title": "核心理念：一个目标、两大支柱", "page": 5},
        {"type": "content", "title": "精益屋是TPS经典结构", "page": 6},
        {"type": "section", "title": "七大浪费", "label": "PART 02", "page": 7},
        {"type": "content", "title": "TIMWOOD - 七种浪费总览", "page": 8},
        {"type": "content", "title": "生产过剩与等待浪费", "page": 9},
        {"type": "content", "title": "加工·库存·动作·不良浪费", "page": 10},
        {"type": "section", "title": "准时化JIT", "label": "PART 03", "page": 11},
        {"type": "content", "title": "JIT - 从推到拉", "page": 12},
        {"type": "content", "title": "看板管理实现JIT", "page": 13},
        {"type": "section", "title": "自働化Jidoka", "label": "PART 04", "page": 14},
        {"type": "content", "title": "人机最佳结合", "page": 15},
        {"type": "content", "title": "Poka-Yoke与Andon", "page": 16},
        {"type": "section", "title": "精益工具", "label": "PART 05", "page": 17},
        {"type": "content", "title": "5S现场管理", "page": 18},
        {"type": "content", "title": "标准化作业", "page": 19},
        {"type": "content", "title": "TPM全面生产维护", "page": 20},
        {"type": "content", "title": "SMED快速换模", "page": 21},
        {"type": "content", "title": "VSM价值流图", "page": 22},
        {"type": "section", "title": "OEE与绩效", "label": "PART 06", "page": 23},
        {"type": "content", "title": "全球OEE基准数据", "page": 24},
        {"type": "content", "title": "三大损失与OEE计算", "page": 25},
        {"type": "content", "title": "目标设定与改善案例", "page": 26},
        {"type": "section", "title": "持续改善Kaizen", "label": "PART 07", "page": 27},
        {"type": "content", "title": "Kaizen文化", "page": 28},
        {"type": "content", "title": "PDCA循环", "page": 29},
        {"type": "section", "title": "转型路线图", "label": "PART 08", "page": 30},
        {"type": "content", "title": "精益实施四阶段", "page": 31},
        {"type": "content", "title": "关键成功因素", "page": 32},
        {"type": "content", "title": "行动建议", "page": 33},
        {"type": "closing", "title": "结语", "page": 34},
    ]
    
    output = "/tmp/ppt_mindmap.pdf"
    mindmap_from_ppt(example_slides, output_dir="/tmp")


path: references/generate_offline_content.py
content: """
generate_offline_content.py — 离线内容生成引擎（v6.1 consulting-report-generator）
在无网络/本地Ollama环境下自动切换为本地生成模式
"""

import json, os, subprocess
from datetime import datetime

OLLAMA_HOST = os.environ.get("OLLAMA_HOST", "http://localhost:11434")
DEFAULT_MODEL = "gemma4:e2b-it-q4_K_M"

# =====================================================
# 离线内容模板（完全无网络时的备用内容库）
# =====================================================

OFFLINE_TEMPLATES = {
    "lean_intro": {
        "zh": "精益生产（Lean Production）源于丰田生产方式（TPS），由大野耐一于20世纪50年代创立，核心是通过消除浪费、优化流程、持续改进来提升生产效率和产品质量。五大原则：价值、价值流、流动、拉动、尽善尽美。",
    },
    "seven_wastes": {
        "zh": "丰田定义的七种浪费（TIMWOOD）：①生产过剩——最大的浪费；②等待——人员和设备闲置；③运输——物料无效搬运；④不适当加工——过度工程；⑤库存——掩盖问题；⑥动作——低效操作；⑦不良品——返工和废品。",
    },
    "jit": {
        "zh": "准时化生产（JIT）是精益生产的两大支柱之一，核心思想是'只在需要的时候、按需要的量、生产需要的产品'，通过拉动式生产、看板管理、平准化等手段实现。",
    },
    "jidoka": {
        "zh": "自働化（Jidoka）是精益生产的另一大支柱，赋予设备人的智慧——异常时自动停止、不生产不良品。不同于自动化（Automation），自働化强调人机最佳结合。",
    },
    "kaizen": {
        "zh": "持续改善（Kaizen）是精益生产的灵魂，主张通过PDCA循环、全员参与的小步快跑式改进，实现'每天进步一点点'。三大实践路径：质量管理小组、合理化建议、改善活动。",
    },
    "tpm": {
        "zh": "TPM（全面生产维护）追求设备综合效率最大化，通过操作员自主维护、预防性维护和改善维护，将OEE从行业平均55-60%提升至80%以上。",
    },
    "smed": {
        "zh": "SMED（快速换模）由新乡重夫创立，通过区分内外部作业、转换内外部、优化内外作业、持续改善四步，将换型时间从小时级压缩到分钟级（个位数）。",
    },
    "5s": {
        "zh": "5S现场管理是精益的基石：整理（要/不要）、整顿（定位定量）、清扫（清洁点检）、清洁（制度化）、素养（习惯化）。没有5S，其他精益工具难以落地。",
    },
    "oee": {
        "zh": "OEE=可用率×性能×质量。全球OEE基准：行业平均55-60%，世界级标准85%+，仅约3%制造商达到世界级。持续追踪OEE可在6个月内提升20%。",
    },
}

OFFLINE_CASE_STUDIES = [
    "某汽车零部件企业导入精益生产后，OEE从52%提升至79%，换型时间从135分钟降至18分钟，在制品库存降低67%。",
    "某电子制造企业实施5S+标准化作业后，直通率从87%提升至96%，人均产出提升42%。",
    "某食品加工企业推行TPM后，设备故障率降低73%，MTBF从28天提升至156天。",
]


# =====================================================
# Ollama 本地模型调用
# =====================================================

def check_ollama():
    """检查Ollama是否可用"""
    try:
        import urllib.request
        req = urllib.request.Request(f"{OLLAMA_HOST}/api/tags")
        with urllib.request.urlopen(req, timeout=5) as resp:
            data = json.loads(resp.read())
            return len(data.get("models", [])) > 0
    except:
        return False


def call_ollama(prompt, model=DEFAULT_MODEL, max_tokens=500):
    """调用本地Ollama模型生成内容"""
    import urllib.request
    payload = json.dumps({
        "model": model,
        "prompt": prompt,
        "stream": False,
        "options": {"num_predict": max_tokens}
    }).encode()
    
    req = urllib.request.Request(
        f"{OLLAMA_HOST}/api/generate",
        data=payload,
        headers={"Content-Type": "application/json"}
    )
    
    try:
        with urllib.request.urlopen(req, timeout=120) as resp:
            data = json.loads(resp.read())
            return data.get("response", "")
    except Exception as e:
        return f"[离线模式] 无法调用本地模型: {e}"


# =====================================================
# 内容生成控制器（自动切换在线/离线）
# =====================================================

class ContentGenerator:
    """内容生成器——自动检测网络状态，切换在线/离线模式"""
    
    def __init__(self):
        self.online = self._check_online()
        self.ollama_ok = check_ollama()
        
    def _check_online(self):
        """检测是否有网络连接"""
        try:
            import urllib.request
            urllib.request.urlopen("http://8.8.8.8", timeout=3)
            return True
        except:
            return False
    
    def detect_offline_reason(self):
        """返回离线原因说明"""
        if not self.online:
            return "无网络连接"
        if not self.ollama_ok:
            return "Ollama未运行或本地模型不可用"
        return ""
    
    def generate_section(self, topic, keywords=""):
        """生成章节内容"""
        if self.online:
            # 在线模式：使用在线模板（联网获取行业数据）
            result = OFFLINE_TEMPLATES.get(topic, {}).get("zh", "")
            if result:
                return result
            # 尝试用Ollama生成
            if self.ollama_ok:
                result = call_ollama(f"用中文写一段关于{topic}的50字简介")
                if result:
                    return result
            return f"[离线内容] {topic}的相关内容"
        else:
            # 离线模式：使用离线模板
            result = OFFLINE_TEMPLATES.get(topic, {}).get("zh", "")
            if result:
                return result
            return f"[离线内容] {topic}的相关内容"
    
    def get_mode_label(self):
        """获取模式标签"""
        if not self.online:
            return "🔌 离线模式（无网络）"
        if not self.ollama_ok:
            return "☁️ 在线模式（标准）"
        return "💻 本地模型模式"


# =====================================================
# 使用示例
# =====================================================

if __name__ == "__main__":
    gen = ContentGenerator()
    print(f"当前模式: {gen.get_mode_label()}")
    print(f"离线原因: {gen.detect_offline_reason() or '正常在线'}")
    
    # 测试生成
    for topic in ["lean_intro", "seven_wastes", "kaizen"]:
        content = gen.generate_section(topic)
        print(f"\n--- {topic} ---")
        print(content[:80] + "...")


path: references/generate_pdf.py
content: """
generate_pdf.py — PDF报告生成参考模板（v6.1 consulting-report-generator）
基于 reportlab 生成专业PDF文档，CJK字体完美支持
"""

from reportlab.lib.pagesizes import A4
from reportlab.lib.units import mm, cm
from reportlab.lib.colors import HexColor
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, PageBreak
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
import os

# Theme Contract
NV = HexColor("#051C2C")
D3 = HexColor("#333333")
AB = HexColor("#006BA6")
BG = HexColor("#F2F2F2")

# 注册中文字体（macOS）
FONT_PATHS = [
    "/System/Library/Fonts/PingFang.ttc",
    "/System/Library/Fonts/STHeiti Light.ttc",
    "/usr/share/fonts/truetype/wqy/wqy-microhei.ttc",
]

CN_FONT = "Arial"
for fp in FONT_PATHS:
    if os.path.exists(fp):
        try:
            pdfmetrics.registerFont(TTFont("CNFont", fp))
            CN_FONT = "CNFont"
            break
        except:
            continue


def build_styles():
    """构建段落样式"""
    styles = getSampleStyleSheet()
    
    styles.add(ParagraphStyle(
        "CoverTitle", parent=styles["Title"],
        fontName=CN_FONT, fontSize=26,
        textColor=NV, alignment=1, spaceAfter=20
    ))
    styles.add(ParagraphStyle(
        "HeadingCN", parent=styles["Heading1"],
        fontName=CN_FONT, fontSize=18,
        textColor=NV, spaceBefore=16, spaceAfter=8
    ))
    styles.add(ParagraphStyle(
        "SubHeadingCN", parent=styles["Heading2"],
        fontName=CN_FONT, fontSize=14,
        textColor=NV, spaceBefore=12, spaceAfter=6
    ))
    styles.add(ParagraphStyle(
        "BodyCN", parent=styles["Normal"],
        fontName=CN_FONT, fontSize=11,
        textColor=D3, leading=18, spaceAfter=6
    ))
    return styles


def build_table(headers, rows):
    """构建表格"""
    table_data = [headers] + rows
    col_w = 460 / len(headers)
    
    t = Table(table_data, colWidths=[col_w] * len(headers))
    t.setStyle(TableStyle([
        ("BACKGROUND", (0, 0), (-1, 0), NV),
        ("TEXTCOLOR", (0, 0), (-1, 0), HexColor("#FFFFFF")),
        ("FONTNAME", (0, 0), (-1, -1), CN_FONT),
        ("FONTSIZE", (0, 0), (-1, -1), 9),
        ("ALIGN", (0, 0), (-1, -1), "CENTER"),
        ("VALIGN", (0, 0), (-1, -1), "MIDDLE"),
        ("GRID", (0, 0), (-1, -1), 0.5, HexColor("#CCCCCC")),
        ("ROWBACKGROUNDS", (0, 1), (-1, -1), [HexColor("#FFFFFF"), HexColor("#F2F2F2")]),
    ]))
    return t


def generate_report(title, sections, output_path):
    """
    生成完整PDF报告
    
    参数:
        title: 报告标题
        sections: [{"heading": str, "body": [str|list], ...}]
        output_path: 输出路径
    """
    styles = build_styles()
    doc = SimpleDocTemplate(output_path, pagesize=A4,
                            topMargin=2*cm, bottomMargin=2*cm)
    
    story = []
    
    # 封面
    story.append(Spacer(1, 40*mm))
    story.append(Paragraph(title, styles["CoverTitle"]))
    story.append(Spacer(1, 10*mm))
    
    # 章节
    for sec in sections:
        story.append(PageBreak())
        story.append(Paragraph(sec["heading"], styles["HeadingCN"]))
        
        for item in sec.get("body", []):
            if isinstance(item, str):
                story.append(Paragraph(item, styles["BodyCN"]))
            elif isinstance(item, list):
                for bullet in item:
                    story.append(Paragraph(f"• {bullet}", styles["BodyCN"]))
    
    doc.build(story)
    print(f"✅ PDF报告已生成: {output_path}")
    return output_path


if __name__ == "__main__":
    generate_report(
        title="精益生产体系深度解析",
        sections=[
            {"heading": "一、精益生产概述", "body": ["精益生产源于丰田生产方式..."]},
            {"heading": "二、总结", "body": ["以上为本报告核心内容"]},
        ],
        output_path="/tmp/report.pdf"
    )


path: references/generate_pro.py
content: #!/usr/bin/env python3
"""
咨询报告专业PPT生成器 v5（豆包对标系）
基于 mck-ppt-design 专业布局框架
麦肯锡设计风格 + 微软雅黑（Mac兼容）+ 无BLOCK_ARC
"""
from pptx import Presentation
from pptx.util import Inches, Pt, Emu
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN, MSO_ANCHOR
from pptx.enum.shapes import MSO_SHAPE
from pptx.oxml.ns import qn
import os, zipfile
from lxml import etree

# ═══════════════════════════════════════════
# Ⅰ. 配色方案
# ═══════════════════════════════════════════

# 主色
NV = RGBColor(0x05, 0x1C, 0x2C)  # 深蓝
WH = RGBColor(0xFF, 0xFF, 0xFF)  # 白色
BK = RGBColor(0x00, 0x00, 0x00)  # 黑色
D3 = RGBColor(0x33, 0x33, 0x33)  # 正文
M6 = RGBColor(0x66, 0x66, 0x66)  # 次级文字
LG = RGBColor(0xCC, 0xCC, 0xCC)  # 分隔线
BG = RGBColor(0xF2, 0xF2, 0xF2)  # 背景面板

# 强调色
AB = RGBColor(0x00, 0x6B, 0xA6)  # 蓝
AG = RGBColor(0x00, 0x7A, 0x53)  # 绿
AO = RGBColor(0xD4, 0x6A, 0x00)  # 橙
AR = RGBColor(0xC6, 0x28, 0x28)  # 红

# 浅背景
LB = RGBColor(0xE3, 0xF2, 0xFD)
LG2 = RGBColor(0xE8, 0xF5, 0xE9)
LO = RGBColor(0xFF, 0xF3, 0xE0)
LR = RGBColor(0xFF, 0xEB, 0xEE)

# ═══ 深蓝递进色（商品定义框架用） ═══
LV1 = RGBColor(0x05, 0x1C, 0x2C)  # 顶层 - 最深
LV2 = RGBColor(0x0A, 0x30, 0x4A)  # 第2层
LV3 = RGBColor(0x10, 0x44, 0x62)  # 第3层
LV4 = RGBColor(0x16, 0x58, 0x7A)  # 第4层
LV5 = RGBColor(0x1C, 0x6C, 0x92)  # 第5层（底）- 最浅

# 深蓝递进子色（内部分块用）
SV1 = RGBColor(0x10, 0x60, 0x78)
SV2 = RGBColor(0x10, 0x68, 0x82)
SV3 = RGBColor(0x10, 0x70, 0x8C)
SV4 = RGBColor(0x18, 0x68, 0x88)
SV5 = RGBColor(0x18, 0x70, 0x92)
SV6 = RGBColor(0x18, 0x78, 0x9C)
SV7 = RGBColor(0x20, 0x6C, 0x90)
SV8 = RGBColor(0x20, 0x7C, 0xA0)
SV9 = RGBColor(0x20, 0x8C, 0xB0)
TAG_BG = RGBColor(0x28, 0x80, 0xA8)  # 标签色

# ═══════════════════════════════════════════
# Ⅱ. 常量
# ═══════════════════════════════════════════

FN = "Microsoft YaHei"   # 中文
EN = "Arial"              # 英文/数字
LM = Inches(0.8)          # 左边距
CW = Inches(11.733)       # 内容宽度
SW = Inches(13.333)       # 幻灯片宽度
SH = Inches(7.5)          # 幻灯片高度
TZ = Inches(1.3)          # 内容顶部起始

# ═══════════════════════════════════════════
# Ⅲ. 助手函数
# ═══════════════════════════════════════════

def cs(s):
    """清理p:style"""
    e = s._element
    st = e.find(f'{{http://schemas.openxmlformats.org/presentationml/2006/main}}style')
    if st is not None: e.remove(st)

def sf(run, is_en=False):
    """设置字体"""
    rPr = run._r.get_or_add_rPr()
    latin = rPr.find(qn('a:latin'))
    if latin is None:
        latin = rPr.makeelement(qn('a:latin'), {})
        rPr.append(latin)
    latin.set('typeface', EN if is_en else FN)
    ea = rPr.find(qn('a:ea'))
    if ea is None:
        ea = rPr.makeelement(qn('a:ea'), {})
        rPr.append(ea)
    ea.set('typeface', FN)

def TX(s, l, t, w, h, tx, sz=14, c=D3, b=False, al=PP_ALIGN.LEFT, an='t'):
    """统一文本助手"""
    tb = s.shapes.add_textbox(l, t, w, h)
    tf = tb.text_frame
    tf.word_wrap = True
    bp = tf._txBody.find(qn('a:bodyPr'))
    if bp is not None:
        for attr in ['lIns','tIns','rIns','bIns']:
            bp.set(attr, '45720')
        bp.set('anchor', an)
    lines = tx if isinstance(tx, list) else [tx]
    for i, line in enumerate(lines):
        p = tf.paragraphs[0] if i == 0 else tf.add_paragraph()
        p.text = str(line)
        p.font.size = Pt(sz)
        p.font.color.rgb = c
        p.font.bold = b
        p.alignment = al
        p.space_before = Pt(0)
        p.space_after = Pt(0)
        p.line_spacing = 0.93 if sz >= 18 else Pt(sz * 1.35)
        for run in p.runs:
            sf(run, is_en=(sz >= 18 and all(ch.isascii() or ch.isdigit() for ch in line)))
    return tb

def R(s, l, t, w, h, c):
    """矩形"""
    r = s.shapes.add_shape(MSO_SHAPE.RECTANGLE, l, t, w, h)
    r.fill.solid()
    r.fill.fore_color.rgb = c
    r.line.fill.background()
    cs(r)
    return r

def RR(s, l, t, w, h, c):
    """圆角矩形"""
    r = s.shapes.add_shape(MSO_SHAPE.ROUNDED_RECTANGLE, l, t, w, h)
    r.fill.solid()
    r.fill.fore_color.rgb = c
    r.line.fill.background()
    cs(r)
    return r

def HL(s, x, y, ln, c=BK, t=Pt(0.5)):
    """水平线（薄矩形）"""
    h = max(int(t), Emu(6350))
    return R(s, x, y, ln, h, c)

def OV(s, x, y, lb, sz=Inches(0.45), bg=NV, fg=WH):
    """圆形标签"""
    c = s.shapes.add_shape(MSO_SHAPE.OVAL, x, y, sz, sz)
    c.fill.solid()
    c.fill.fore_color.rgb = bg
    c.line.fill.background()
    cs(c)
    tf = c.text_frame
    p = tf.paragraphs[0]
    p.text = str(lb)
    p.font.size = Pt(14)
    p.font.color.rgb = fg
    p.font.bold = True
    p.alignment = PP_ALIGN.CENTER
    for run in p.runs:
        sf(run)
    bp = tf._txBody.find(qn('a:bodyPr'))
    if bp is not None: bp.set('anchor', 'ctr')
    return c

def AT(s, tx, sz=22):
    """Action Title"""
    TX(s, LM, Inches(0.15), CW, Inches(0.9), tx, sz, BK, True, PP_ALIGN.LEFT, 'b')
    HL(s, LM, Inches(1.05), CW, BK, Pt(0.5))

def SR(s, tx, y=Inches(7.05)):
    """来源标注"""
    TX(s, LM, y, CW, Inches(0.3), tx, 9, M6)

def PN(s, n, t):
    """页码"""
    TX(s, Inches(12.2), Inches(7.1), Inches(1), Inches(0.3), f"{n}/{t}", 9, M6, False, PP_ALIGN.RIGHT)

# ═══════════════════════════════════════════
# Ⅳ. 布局模式
# ═══════════════════════════════════════════

# ---- 布局：#1 Cover ----
def cover(s, title, subtitle="", date="", company=""):
    """封面"""
    R(s, 0, 0, SW, Inches(0.05), NV)
    lines = title.count('\n') + 1
    th = Inches(0.8 + 0.65 * max(lines - 1, 0))
    TX(s, Inches(1), Inches(2.0), Inches(11), th, title, 40, NV, True)
    sy = Inches(2.0) + th + Inches(0.3)
    if subtitle:
        TX(s, Inches(1), sy, Inches(11), Inches(0.6), subtitle, 24, D3)
        sy += Inches(1.0)
    if date or company:
        TX(s, Inches(1), sy + Inches(0.3), Inches(11), Inches(0.5), f"{company}  |  {date}", 14, M6)
    HL(s, Inches(1), Inches(6.8), Inches(4), NV, Pt(2))

# ---- 布局：#6 TOC ----
def toc(s, items):
    """目录 items=[(编号, 标题, 描述)]"""
    AT(s, "目录")
    iy = Inches(1.6)
    for num, title, desc in items:
        OV(s, LM, iy, num, Inches(0.5), NV)
        TX(s, LM + Inches(0.7), iy, Inches(4.0), Inches(0.4), title, 16, NV, True)
        TX(s, Inches(5.5), iy + Inches(0.05), Inches(6.5), Inches(0.35), desc, 14, M6)
        iy += Inches(0.7)
        HL(s, LM, iy, CW, LG, Pt(0.25))
        iy += Inches(0.3)

# ---- 布局：#5 Section Divider ----
def SEC(s, n, title, subtitle=""):
    """章节分隔页"""
    R(s, 0, 0, Inches(0.6), SH, NV)
    TX(s, Inches(1.2), Inches(2.0), Inches(10), Inches(0.6), f"PART {n}", 16, M6)
    TX(s, Inches(1.2), Inches(2.8), Inches(10), Inches(1.2), title, 28, NV, True)
    if subtitle:
        TX(s, Inches(1.2), Inches(4.2), Inches(10), Inches(0.6), subtitle, 14, D3)

# ---- 布局：#11 Data Table ----
def TB(s, l, t, rows, cols, data, col_ws=None):
    """原生数据表格"""
    tw = sum(col_ws) if col_ws else CW
    ts = s.shapes.add_table(rows, cols, l, t, tw, Inches(0.35 * rows))
    for i, rd in enumerate(data):
        for j, ct in enumerate(rd):
            c = ts.table.cell(i, j)
            c.text = str(ct)
            if col_ws:
                c.width = col_ws[j]
            for p in c.text_frame.paragraphs:
                p.font.size = Pt(9)
                for run in p.runs:
                    sf(run)
                p.alignment = PP_ALIGN.CENTER
                p.font.color.rgb = WH if i == 0 else D3
                p.font.bold = (i == 0)
            if i == 0:
                c.fill.solid()
                c.fill.fore_color.rgb = NV
            elif i % 2 == 0:
                c.fill.solid()
                c.fill.fore_color.rgb = RGBColor(0xF5, 0xF7, 0xFA)

# ---- 布局：#12 Metric Cards Row ----
def MCARDS(s, items, y=TZ):
    """指标卡片 items=[(数值, 标签, 示例值, 颜色)]"""
    n = len(items)
    cw = (CW - Inches(0.15) * (n - 1)) / n
    for i, (val, label, detail, clr) in enumerate(items):
        cx = LM + i * (cw + Inches(0.15))
        R(s, cx, y, cw, Inches(1.5), WH)
        R(s, cx, y, cw, Inches(0.06), clr)
        TX(s, cx + Inches(0.2), y + Inches(0.15), cw - Inches(0.4), Inches(0.5), val, 24, clr, True, PP_ALIGN.CENTER)
        TX(s, cx + Inches(0.2), y + Inches(0.7), cw - Inches(0.4), Inches(0.3), label, 11, M6, False, PP_ALIGN.CENTER)
        TX(s, cx + Inches(0.2), y + Inches(1.05), cw - Inches(0.4), Inches(0.3), detail, 10, D3, False, PP_ALIGN.CENTER)

# ---- 布局：#8 Big Number ----
def BN(s, items, y=TZ):
    """大数字对比 items=[(大数字, 标签, 颜色), ...]"""
    n = len(items)
    cw = (CW - Inches(0.3) * (n - 1)) / n
    for i, (num, label, clr) in enumerate(items):
        cx = LM + i * (cw + Inches(0.3))
        R(s, cx, y, cw, Inches(1.8), NV if i == 0 else BG)
        tc = WH if i == 0 else NV
        sc = WH if i == 0 else D3
        TX(s, cx + Inches(0.2), y + Inches(0.15), cw - Inches(0.4), Inches(0.8), num, 44, tc, True, PP_ALIGN.CENTER)
        TX(s, cx + Inches(0.2), y + Inches(1.1), cw - Inches(0.4), Inches(0.5), label, 14, sc, False, PP_ALIGN.CENTER)

# ---- 布局：#24 Executive Summary ----
def EXEC(s, title, points):
    """执行摘要"""
    AT(s, title)
    R(s, LM, TZ, CW, Inches(1.0), NV)
    TX(s, LM + Inches(0.3), TZ, CW - Inches(0.6), Inches(1.0), points[0], 16, WH)
    iy = TZ + Inches(1.3)
    for i, (num, t, d) in enumerate(points[1:]):
        OV(s, LM, iy, num)
        TX(s, LM + Inches(0.6), iy, Inches(3.5), Inches(0.4), t, 14, NV, True)
        TX(s, Inches(5.0), iy, Inches(7.5), Inches(0.35), d, 14, D3)
        iy += Inches(0.55)
        HL(s, LM, iy, CW, LG, Pt(0.25))
        iy += Inches(0.15)

# ---- 布局：#14 Three-Pillar Framework ----
def PILLAR(s, items, y=TZ):
    """三支柱 items=[(标题, [要点...], 颜色)]"""
    n = len(items)
    pw = (CW - Inches(0.2) * (n - 1)) / n
    for i, (title, points, clr) in enumerate(items):
        px = LM + i * (pw + Inches(0.2))
        R(s, px, y, pw, Inches(0.5), clr)
        TX(s, px + Inches(0.15), y, pw - Inches(0.3), Inches(0.5), title, 14, WH, True, PP_ALIGN.CENTER, 'ctr')
        R(s, px, y + Inches(0.5), pw, Inches(3.5), BG)
        TX(s, px + Inches(0.2), y + Inches(0.6), pw - Inches(0.4), Inches(3.0), points, 12, D3)

# ---- 布局：#20 Before/After ----
def BA(s, before, after, y=TZ):
    """Before/After 对比"""
    hw = Inches(5.0)
    # Before
    R(s, LM, y, hw, Inches(4.0), BG)
    TX(s, LM + Inches(0.3), y + Inches(0.1), hw - Inches(0.6), Inches(0.5), "X  现状 (Before)", 16, D3)
    HL(s, LM + Inches(0.3), y + Inches(0.6), hw - Inches(0.6), LG, Pt(0.5))
    TX(s, LM + Inches(0.3), y + Inches(0.8), hw - Inches(0.6), Inches(3.0), before, 12, D3)
    # Arrow
    TX(s, LM + hw + Inches(0.1), y + Inches(1.5), Inches(1.5), Inches(0.5), "→", 36, NV, True, PP_ALIGN.CENTER)
    # After
    ax = LM + hw + Inches(1.733)
    R(s, ax, y, hw, Inches(4.0), NV)
    TX(s, ax + Inches(0.3), y + Inches(0.1), hw - Inches(0.6), Inches(0.5), "V  目标 (After)", 16, WH)
    HL(s, ax + Inches(0.3), y + Inches(0.6), hw - Inches(0.6), WH, Pt(0.5))
    TX(s, ax + Inches(0.3), y + Inches(0.8), hw - Inches(0.6), Inches(3.0), after, 12, WH)

# ---- 布局：#29 Timeline ----
def TIMELINE(s, items, y=Inches(3.0)):
    """时间线 items=[(标题, 描述), ...]"""
    n = len(items)
    sp = Inches(10.7) / max(n - 1, 1)
    HL(s, LM + Inches(0.5), y, Inches(10.7), LG, Pt(2))
    for i, (title, desc) in enumerate(items):
        mx = LM + Inches(0.5) + sp * i
        OV(s, mx - Inches(0.225), y - Inches(0.225), str(i + 1))
        TX(s, mx - Inches(1.0), y - Inches(0.8), Inches(2.0), Inches(0.5), title, 16, NV, True, PP_ALIGN.CENTER)
        TX(s, mx - Inches(1.0), y + Inches(0.5), Inches(2.0), Inches(1.0), desc, 11, D3, False, PP_ALIGN.CENTER)

# ---- 布局：#16 Process Chevron ----
def FLOW(s, steps, y=Inches(2.5)):
    """流程箭头 steps=[(标题, 描述), ...]"""
    n = len(steps)
    sw = CW / n
    for i, (title, desc) in enumerate(steps):
        sx = LM + i * sw
        fill = NV if i == 0 else BG
        R(s, sx, y, sw - Inches(0.06), Inches(1.0), fill)
        tc = WH if i == 0 else NV
        TX(s, sx + Inches(0.1), y + Inches(0.05), sw - Inches(0.3), Inches(0.4), title, 13, tc, True, PP_ALIGN.CENTER, 'ctr')
        TX(s, sx + Inches(0.1), y + Inches(0.5), sw - Inches(0.3), Inches(0.4), desc, 9, tc if i == 0 else D3, False, PP_ALIGN.CENTER, 'ctr')
        if i < n - 1:
            TX(s, sx + sw - Inches(0.12), y + Inches(0.25), Inches(0.15), Inches(0.4), "→", 18, AO, True, PP_ALIGN.CENTER)

# ---- 布局：#39 Horizontal Bar ----
def HBAR(s, items, y=TZ, title=""):
    """水平柱状图 items=[(标签, 值), ...] 已排序"""
    if title: TX(s, LM, y - Inches(0.25), CW, Inches(0.2), title, 10, NV, True)
    max_v = max(v for _, v in items)
    bar_max = Inches(7.0)
    n = len(items)
    rh = Inches(0.5)
    for i, (lb, v) in enumerate(items):
        ry = y + i * rh
        bw = bar_max * v / max_v
        clr = NV if i == 0 else BG
        TX(s, LM, ry, Inches(1.8), rh, lb, 11, D3, i == 0, PP_ALIGN.LEFT, 'ctr')
        R(s, LM + Inches(2.0), ry + Inches(0.08), bar_max, Inches(0.34), RGBColor(0xF0, 0xF0, 0xF0))
        R(s, LM + Inches(2.0), ry + Inches(0.08), bw, Inches(0.34), clr)
        TX(s, LM + Inches(2.0) + bw + Inches(0.1), ry, Inches(1.0), rh, str(v), 11, D3, i == 0, PP_ALIGN.LEFT, 'ctr')

# ---- 布局：#37 Grouped Bar (简化版) ----
def GBAR(s, data, labels, colors, y=TZ, title=""):
    """分组柱状图 data=[[v1,v2,...], ...] 每行=系列"""
    if title: TX(s, LM, y - Inches(0.25), CW, Inches(0.2), title, 10, NV, True)
    n_groups = len(labels)
    n_series = len(data)
    chart_l = LM + Inches(1.0)
    chart_b = y + Inches(2.8)
    chart_h = Inches(2.5)
    chart_w = Inches(8.0)
    group_w = chart_w / n_groups
    bar_w = Inches(0.35)
    max_v = max(max(row) for row in data) or 1
    # Y轴
    for tick in range(0, 101, 25):
        ty_pos = chart_b - chart_h * tick / 100
        TX(s, LM, ty_pos - Inches(0.1), Inches(0.8), Inches(0.2), f"{tick}%", 8, M6, False, PP_ALIGN.RIGHT)
        if tick > 0: HL(s, chart_l, ty_pos, chart_w, RGBColor(0xE8, 0xE8, 0xE8), Pt(0.25))
    HL(s, chart_l, chart_b, chart_w, BK, Pt(0.5))
    # 柱子
    for gi, lb in enumerate(labels):
        gx = chart_l + group_w * gi + (group_w - bar_w * n_series) / 2
        for si in range(n_series):
            val = data[si][gi]
            bh = chart_h * val / max_v
            bx = gx + si * (bar_w + Inches(0.05))
            R(s, bx, chart_b - bh, bar_w, bh, colors[si])
            if val > 0:
                TX(s, bx, chart_b - bh - Inches(0.2), bar_w, Inches(0.18), str(val), 7, D3, False, PP_ALIGN.CENTER)
        TX(s, chart_l + group_w * gi, chart_b + Inches(0.03), group_w, Inches(0.2), lb, 8, D3, False, PP_ALIGN.CENTER)

# ---- 布局：#52 KPI Tracker ----
def KTRACK(s, items, y=TZ):
    """KPI追踪 items=[(名称, 进度0-1, 详情, 状态on/risk/off)]"""
    # 表头
    hy = y - Inches(0.3)
    TX(s, LM, hy, Inches(3.0), Inches(0.3), "指标", 11, M6, True)
    TX(s, LM + Inches(3.0), hy, Inches(6.0), Inches(0.3), "进度", 11, M6, True)
    TX(s, LM + Inches(9.0), hy, Inches(1.5), Inches(0.3), "达成率", 11, M6, True, PP_ALIGN.CENTER)
    HL(s, LM, hy + Inches(0.35), CW, BK, Pt(0.75))
    sc_map = {'on': AG, 'risk': AO, 'off': AR}
    for i, (nm, pct, det, st) in enumerate(items):
        ry = hy + Inches(0.5) + i * Inches(0.6)
        TX(s, LM, ry, Inches(2.8), Inches(0.5), nm, 12, D3, True, PP_ALIGN.LEFT, 'ctr')
        R(s, LM + Inches(3.0), ry + Inches(0.12), Inches(5.8), Inches(0.25), BG)
        R(s, LM + Inches(3.0), ry + Inches(0.12), Inches(5.8) * min(pct, 1.0), Inches(0.25), sc_map[st])
        TX(s, LM + Inches(9.0), ry, Inches(1.2), Inches(0.5), f"{int(pct*100)}%", 14, sc_map[st], True, PP_ALIGN.CENTER, 'ctr')
        R(s, LM + Inches(10.3), ry + Inches(0.17), Inches(0.15), Inches(0.15), sc_map[st])
        if i < len(items) - 1: HL(s, LM, ry + Inches(0.55), CW, LG, Pt(0.25))

# ---- 布局：#57 Dashboard ----
def DASH(s, kpis, data, labels, colors, insights):
    """仪表盘: KPI行+柱状图+洞见"""
    AT(s, "业务健康度仪表盘")
    # KPI行
    cw = CW / len(kpis)
    for i, (v, lb, clr) in enumerate(kpis):
        cx = LM + i * cw
        R(s, cx, TZ, cw - Inches(0.08), Inches(1.0), WH)
        R(s, cx, TZ, cw - Inches(0.08), Inches(0.06), clr)
        TX(s, cx + Inches(0.1), TZ + Inches(0.08), cw - Inches(0.2), Inches(0.4), v, 22, clr, True, PP_ALIGN.CENTER)
        TX(s, cx + Inches(0.1), TZ + Inches(0.55), cw - Inches(0.2), Inches(0.3), lb, 10, M6, False, PP_ALIGN.CENTER)
    # 柱状图
    cy = TZ + Inches(1.3)
    GBAR(s, data, labels, colors, cy)
    # 图例
    ly = cy + Inches(3.3)
    for i, (lb, clr) in enumerate(zip(labels, colors)):
        tx = LM + Inches(3.0) + i * Inches(2.0)
        R(s, tx, ly, Inches(0.2), Inches(0.15), clr)
        TX(s, tx + Inches(0.3), ly - Inches(0.02), Inches(1.5), Inches(0.2), lb, 9, D3)
    # 洞见
    bay = Inches(6.0)
    R(s, LM, bay, CW, Inches(0.7), BG)
    TX(s, LM + Inches(0.3), bay, CW - Inches(0.6), Inches(0.7), insights, 12, NV, True, PP_ALIGN.LEFT, 'ctr')

# ---- 布局：#35 Action Items ----
def ACTIONS(s, items, y=TZ):
    """行动项 items=[(行动, 时间, 负责人), ...]"""
    n = len(items)
    cw = (CW - Inches(0.15) * (n - 1)) / n
    for i, (action, time, owner) in enumerate(items):
        cx = LM + i * (cw + Inches(0.15))
        R(s, cx, y, cw, Inches(3.0), BG)
        R(s, cx, y, cw, Inches(0.06), NV)
        OV(s, cx + Inches(0.15), y + Inches(0.15), str(i + 1), Inches(0.4), NV)
        TX(s, cx + Inches(0.6), y + Inches(0.15), cw - Inches(0.3), Inches(0.4), action, 14, NV, True, PP_ALIGN.CENTER)
        TX(s, cx + Inches(0.2), y + Inches(0.8), cw - Inches(0.4), Inches(0.3), f"时间：{time}", 11, M6, False, PP_ALIGN.CENTER)
        TX(s, cx + Inches(0.2), y + Inches(1.2), cw - Inches(0.4), Inches(0.3), f"负责人：{owner}", 11, D3, False, PP_ALIGN.CENTER)

# ---- 布局：#36 Closing ----
def CLOSE(s, main_text, sub_text="", tagline=""):
    """结束页"""
    R(s, 0, 0, SW, Inches(0.05), NV)
    TX(s, Inches(1.5), Inches(2.0), Inches(10.3), Inches(1.0), main_text, 28, NV, True, PP_ALIGN.CENTER)
    HL(s, Inches(5.5), Inches(3.3), Inches(2.3), NV, Pt(1.5))
    TX(s, Inches(1.5), Inches(3.8), Inches(10.3), Inches(1.5), sub_text, 18, D3, False, PP_ALIGN.CENTER)
    HL(s, LM, Inches(6.8), CW, NV, Pt(2))
    if tagline:
        TX(s, LM, Inches(6.0), CW, Inches(0.5), tagline, 20, AO, True, PP_ALIGN.CENTER)

# ═══════════════════════════════════════════
# Ⅴ. 新增布局（v4 深蓝递进系）
# ═══════════════════════════════════════════

# ---- 布局：#60 HeaderBar ----
def HDR(s, title, subtitle=""):
    """深蓝顶栏标题（参照星网智云样式）
    title: 主标题
    subtitle: 副标题（浅蓝英文/说明）
    """
    R(s, 0, 0, SW, Inches(0.85), NV)
    TX(s, LM, Inches(0.08), Inches(8), Inches(0.55), title, 24, WH, True)
    if subtitle:
        TX(s, LM, Inches(0.55), Inches(8), Inches(0.25), subtitle, 11, RGBColor(0x88, 0xBB, 0xDD))

# ---- 布局：#61 PYRAMID - 居中多层金字塔 ----
def PYRAMID(s, layers, header=""):
    """金字塔布局（参照星网智云商品定义框架）
    layers = [(层名, 层级序号如"第一层", 内容描述, 主色, 子块列表), ...]
      子块列表 = [(子标题, 子背景色), ...] 或 None
    header: 页脚说明文字
    """
    if header:
        TX(s, LM, Inches(7.1), Inches(8), Inches(0.3), header, 9, M6)
    
    n = len(layers)
    # 从下到上绘制，每层递增宽度
    base_w = Inches(10.0)
    base_h = Inches(0.9)
    gap = Inches(0.08)
    # 每层宽度递减
    step_w = (base_w - Inches(4.0)) / max(n - 1, 1)  # 顶层宽4寸
    
    for idx, (_, level_label, desc, bg_clr, sub_blocks) in enumerate(layers):
        # 从底层(0)到顶层(n-1)
        layer_w = base_w - step_w * (n - 1 - idx)
        layer_x = (SW - layer_w) / 2
        # Y坐标从底部开始
        layer_y = Inches(5.6) - idx * (base_h + gap)
        
        # 绘制整层背景
        R(s, layer_x, layer_y, layer_w, base_h, bg_clr)
        
        # 左侧标签
        TX(s, layer_x + Inches(0.3), layer_y + Inches(0.05), Inches(4.5), Inches(0.5),
           desc, 14, WH, True, PP_ALIGN.LEFT)
        
        # 如果有子块，绘制内部子块
        if sub_blocks and len(sub_blocks) > 0:
            total_sub = len(sub_blocks)
            sub_w = (layer_w - Inches(0.3) * 2 - Inches(0.08) * (total_sub - 1)) / total_sub
            sub_y = layer_y + Inches(0.08)
            sub_h = base_h - Inches(0.16)
            for si, (sub_title, sub_bg) in enumerate(sub_blocks):
                sub_x = layer_x + Inches(0.08) + si * (sub_w + Inches(0.08))
                R(s, sub_x, sub_y, sub_w, sub_h, sub_bg)
                TX(s, sub_x, sub_y, sub_w, sub_h, sub_title, 14, WH, True, PP_ALIGN.CENTER, 'ctr')
        
        # 右侧层级标签
        tag_x = layer_x + layer_w - Inches(3.8)
        tag_y = layer_y + base_h + Inches(0.02)
        TX(s, tag_x, tag_y, Inches(3.8), Inches(0.25), level_label, 11, RGBColor(0x44, 0xAA, 0xCC), True, PP_ALIGN.RIGHT)

# ---- 布局：#62 BLOCK_3COL - 三列内部分块 ----
def BLOCK_3COL(s, cx, cy, cw, ch, items, y_offset=0):
    """三列子块布局（在父块内部绘制三列子块）
    items = [(标题, 背景色), ...]  3个
    cx, cy, cw, ch: 父块位置尺寸
    y_offset: Y偏移
    """
    n = min(len(items), 3)
    sub_w = (cw - Inches(0.08) * (n - 1)) / n
    sub_h = ch - Inches(0.16)
    sub_y = cy + y_offset + Inches(0.08)
    for si, (sub_title, sub_bg) in enumerate(items):
        sub_x = cx + Inches(0.08) + si * (sub_w + Inches(0.08))
        R(s, sub_x, sub_y, sub_w, sub_h, sub_bg)
        TX(s, sub_x, sub_y, sub_w, sub_h, sub_title, 14, WH, True, PP_ALIGN.CENTER, 'ctr')

# ---- 布局：#63 TAG_CHIP - 层级标签 ----
def TAG_CHIP(s, text, x, y, bg=TAG_BG):
    """标签chip（层级说明标签）
    放置在层级右侧底部
    """
    w = Inches(3.3)
    h = Inches(0.28)
    R(s, x - w, y, w, h, bg)
    TX(s, x - w + Inches(0.08), y, w - Inches(0.16), h, text, 11, WH, True, PP_ALIGN.CENTER, 'ctr')

# ---- 布局：#64 LEFT_LABEL_BAR - 左标签右内容条 ----
def LEFT_LABEL_BAR(s, x, y, w, h, label, label_w, content, label_bg=NV, content_bg=NV):
    """左标签+右内容色条
    label: 左侧标签文字
    content: 右侧内容文字
    label_w: 标签宽度
    """
    gap = Inches(0.06)
    # 左侧标签
    R(s, x, y, label_w, h, label_bg)
    TX(s, x + Inches(0.08), y, label_w - Inches(0.16), h, label, 13, WH, True, PP_ALIGN.CENTER, 'ctr')
    # 右侧内容
    content_x = x + label_w + gap
    content_w = w - label_w - gap
    R(s, content_x, y, content_w, h, content_bg)
    TX(s, content_x + Inches(0.15), y, content_w - Inches(0.3), h, content, 12, WH, False, PP_ALIGN.LEFT, 'ctr')

# ═══════════════════════════════════════════
# Ⅵ. 配色主题系统（v5 新增 - 对标豆包多模板）
# ═══════════════════════════════════════════
# 支持一键切换整体配色风格

def apply_theme(theme="deepblue"):
    """应用配色主题，返回颜色字典
    可选主题: deepblue(深蓝经典), tech(科技蓝), business(商务灰), vibrant(活力橙)
    """
    themes = {
        "deepblue": {  # 默认深蓝 - 咨询专业风
            "primary": RGBColor(0x05,0x1C,0x2C),   # 主色
            "accent1": RGBColor(0x00,0x6B,0xA6),   # 强调1-蓝
            "accent2": RGBColor(0x00,0x7A,0x53),   # 强调2-绿
            "accent3": RGBColor(0xD4,0x6A,0x00),   # 强调3-橙
            "accent4": RGBColor(0xC6,0x28,0x28),   # 强调4-红
            "light1": RGBColor(0xE3,0xF2,0xFD),    # 浅色1-蓝
            "light2": RGBColor(0xE8,0xF5,0xE9),    # 浅色2-绿
            "light3": RGBColor(0xFF,0xF3,0xE0),    # 浅色3-橙
            "light4": RGBColor(0xFF,0xEB,0xEE),    # 浅色4-红
            "header_bg": RGBColor(0x05,0x1C,0x2C), # 顶栏
            "header_sub": RGBColor(0x88,0xBB,0xDD),# 顶栏副标题
        },
        "tech": {  # 科技蓝 - 偏亮蓝/白
            "primary": RGBColor(0x00,0x5A,0x96),
            "accent1": RGBColor(0x00,0x96,0xD6),
            "accent2": RGBColor(0x00,0xB0,0x6A),
            "accent3": RGBColor(0xFF,0x8C,0x00),
            "accent4": RGBColor(0xE0,0x3E,0x3E),
            "light1": RGBColor(0xE0,0xF2,0xFE),
            "light2": RGBColor(0xE6,0xF7,0xEE),
            "light3": RGBColor(0xFF,0xF4,0xE0),
            "light4": RGBColor(0xFF,0xEB,0xEE),
            "header_bg": RGBColor(0x00,0x5A,0x96),
            "header_sub": RGBColor(0x88,0xCC,0xEE),
        },
        "business": {  # 商务灰 - 沉稳专业
            "primary": RGBColor(0x2C,0x3E,0x50),
            "accent1": RGBColor(0x34,0x95,0xDB),
            "accent2": RGBColor(0x27,0xAE,0x60),
            "accent3": RGBColor(0xE6,0x7E,0x22),
            "accent4": RGBColor(0xE7,0x4C,0x3C),
            "light1": RGBColor(0xEB,0xF5,0xFB),
            "light2": RGBColor(0xE8,0xF8,0xF0),
            "light3": RGBColor(0xFE,0xF9,0xE7),
            "light4": RGBColor(0xFD,0xED,0xEC),
            "header_bg": RGBColor(0x2C,0x3E,0x50),
            "header_sub": RGBColor(0xAA,0xBB,0xCC),
        },
        "vibrant": {  # 活力橙 - 热情鲜明
            "primary": RGBColor(0xD4,0x6A,0x00),
            "accent1": RGBColor(0x00,0x96,0xD6),
            "accent2": RGBColor(0x00,0x7A,0x53),
            "accent3": RGBColor(0x6C,0x5C,0xE7),
            "accent4": RGBColor(0xE0,0x3E,0x3E),
            "light1": RGBColor(0xFF,0xF3,0xE0),
            "light2": RGBColor(0xE8,0xF5,0xE9),
            "light3": RGBColor(0xF3,0xE8,0xFF),
            "light4": RGBColor(0xFF,0xEB,0xEE),
            "header_bg": RGBColor(0xD4,0x6A,0x00),
            "header_sub": RGBColor(0xFF,0xDD,0xAA),
        }
    }
    return themes.get(theme, themes["deepblue"])

# ═══════════════════════════════════════════
# Ⅶ. 豆包对标布局（v5 新增）
# ═══════════════════════════════════════════

# ---- 布局：#70 SWOT - 战略分析矩阵 ----
def SWOT(s, strengths, weaknesses, opportunities, threats, y=TZ):
    """SWOT分析矩阵（对标豆包战略分析模板）
    strengths/weaknesses/opportunities/threats = [要点列表]
    """
    half_w = (CW - Inches(0.1)) / 2
    half_h = Inches(1.7)
    gap = Inches(0.1)
    # S - 左上（绿）
    R(s, LM, y, half_w, half_h, RGBColor(0xE8,0xF5,0xE9))
    TX(s, LM+Inches(0.15), y+Inches(0.05), half_w-Inches(0.3), Inches(0.35), "S 优势 (Strengths)", 14, RGBColor(0x00,0x7A,0x53), True)
    for si, pt in enumerate(strengths):
        TX(s, LM+Inches(0.15), y+Inches(0.4)+si*Inches(0.3), half_w-Inches(0.3), Inches(0.28), pt, 10, D3)
    # W - 右上（红）
    wx = LM + half_w + gap
    R(s, wx, y, half_w, half_h, RGBColor(0xFF,0xEB,0xEE))
    TX(s, wx+Inches(0.15), y+Inches(0.05), half_w-Inches(0.3), Inches(0.35), "W 劣势 (Weaknesses)", 14, RGBColor(0xC6,0x28,0x28), True)
    for wi, pt in enumerate(weaknesses):
        TX(s, wx+Inches(0.15), y+Inches(0.4)+wi*Inches(0.3), half_w-Inches(0.3), Inches(0.28), pt, 10, D3)
    # O - 左下（蓝）
    oy = y + half_h + gap
    R(s, LM, oy, half_w, half_h, RGBColor(0xE3,0xF2,0xFD))
    TX(s, LM+Inches(0.15), oy+Inches(0.05), half_w-Inches(0.3), Inches(0.35), "O 机会 (Opportunities)", 14, RGBColor(0x00,0x6B,0xA6), True)
    for oi, pt in enumerate(opportunities):
        TX(s, LM+Inches(0.15), oy+Inches(0.4)+oi*Inches(0.3), half_w-Inches(0.3), Inches(0.28), pt, 10, D3)
    # T - 右下（橙）
    tx2 = LM + half_w + gap
    R(s, tx2, oy, half_w, half_h, RGBColor(0xFF,0xF3,0xE0))
    TX(s, tx2+Inches(0.15), oy+Inches(0.05), half_w-Inches(0.3), Inches(0.35), "T 威胁 (Threats)", 14, RGBColor(0xD4,0x6A,0x00), True)
    for ti, pt in enumerate(threats):
        TX(s, tx2+Inches(0.15), oy+Inches(0.4)+ti*Inches(0.3), half_w-Inches(0.3), Inches(0.28), pt, 10, D3)

# ---- 布局：#71 PIE_BAR - 饼图替代柱状占比图 ----
def PIE_BAR(s, items, y=TZ, title=""):
    """饼图替代方案：用水平占比条模拟饼图效果（避免BLOCK_ARC）
    items = [(标签, 占比0-100, 颜色), ...]  总和应≈100
    """
    if title: TX(s, LM, y-Inches(0.3), CW, Inches(0.25), title, 10, NV, True)
    total = sum(v for _,v,_ in items) or 100
    bar_w = Inches(8.0)
    bar_y = y
    # 占比条（用多个矩形拼接模拟饼图）
    cx = LM + Inches(1.0)
    for i, (lb, val, clr) in enumerate(items):
        bw = bar_w * val / total
        R(s, cx, bar_y, max(bw, Inches(0.1)), Inches(0.5), clr)
        TX(s, cx + Inches(0.05), bar_y, bw - Inches(0.1), Inches(0.5), 
           f"{lb} {val}%" if bw > Inches(1.0) else "", 10, WH, True, PP_ALIGN.LEFT, 'ctr')
        cx += bw
    # 图例
    ly = bar_y + Inches(0.7)
    for i, (lb, val, clr) in enumerate(items):
        lx = LM + Inches(1.0) + i * Inches(2.5)
        R(s, lx, ly, Inches(0.25), Inches(0.2), clr)
        TX(s, lx + Inches(0.35), ly, Inches(2.0), Inches(0.2), f"{lb} {val}%", 10, D3)

# ---- 布局：#72 ICON_DECORATION - 装饰图标 ----
def ICON(s, x, y, icon_char, sz=Inches(0.4), bg=NV, fg=WH):
    """装饰图标（用带背景的圆形+字符模拟图标）
    icon_char: 单字符emoji或文字
    """
    c = s.shapes.add_shape(MSO_SHAPE.OVAL, x, y, sz, sz)
    c.fill.solid(); c.fill.fore_color.rgb = bg; c.line.fill.background(); cs(c)
    tf = c.text_frame; p = tf.paragraphs[0]; p.text = icon_char
    p.font.size = Pt(int(sz/Inches(1.0)*18)); p.font.color.rgb = fg; p.font.bold = True
    p.alignment = PP_ALIGN.CENTER
    for run in p.runs: sf(run)
    bp = tf._txBody.find(qn('a:bodyPr'))
    if bp is not None: bp.set('anchor', 'ctr')

def DECORATED_CARD(s, x, y, w, h, icon_char, title, desc, clr):
    """带图标的装饰卡片（对标豆包带图标卡片）
    icon_char: 图标字符(emoji)
    """
    R(s, x, y, w, h, BG)
    R(s, x, y, w, Inches(0.06), clr)
    ICON(s, x+Inches(0.15), y+Inches(0.2), icon_char, Inches(0.45), clr, WH)
    TX(s, x+Inches(0.7), y+Inches(0.15), w-Inches(0.9), Inches(0.35), title, 16, clr, True)
    TX(s, x+Inches(0.15), y+Inches(0.75), w-Inches(0.3), h-Inches(0.9), desc, 11, D3)

# ---- 布局：#73 MATRIX - 比较矩阵 ----
def MATRIX(s, headers, rows, y=TZ):
    """比较矩阵（对标豆包对比分析模板）
    headers = [列标题...]  第一列是行名
    rows = [(行名, 列值1, 列值2, ...), ...]
    第一行作为高亮行
    """
    n_cols = len(headers)
    n_rows = len(rows)
    col_w = (CW - Inches(0.1)*(n_cols-1)) / n_cols
    row_h = Inches(0.55)
    # 表头
    for ci, hdr in enumerate(headers):
        hx = LM + ci*(col_w + Inches(0.1))
        R(s, hx, y, col_w, row_h, NV)
        TX(s, hx, y, col_w, row_h, hdr, 11, WH, True, PP_ALIGN.CENTER, 'ctr')
    # 数据行
    for ri, row in enumerate(rows):
        ry = y + row_h + Inches(0.05) + ri*(row_h + Inches(0.05))
        bg_clr = NV if ri == 0 else (BG if ri % 2 == 1 else WH)
        tc = WH if ri == 0 else D3
        for ci, val in enumerate(row):
            hx = LM + ci*(col_w + Inches(0.1))
            R(s, hx, ry, col_w, row_h, bg_clr if ci == 0 else (RGBColor(0xF8,0xF8,0xF8) if ri%2==1 else WH))
            TX(s, hx, ry, col_w, row_h, str(val), 10, tc, ri==0 or ci==0, PP_ALIGN.CENTER, 'ctr')

# ═══════════════════════════════════════════
# Ⅷ. 质量审查（v5）
# ═══════════════════════════════════════════

def AUDIT(prs):
    """自审"""
    total = sum(1 for _ in prs.slides for _ in _.shapes)
    pages = len(prs.slides)
    passed, issues = [], []
    # 图形量
    if total >= 200: passed.append(f"✅ 图形量 {total}≥200")
    else: issues.append(f"❌ 图形量 {total}<200")
    # 页数
    if pages >= 18: passed.append(f"✅ 页数 {pages}≥18")
    else: issues.append(f"❌ 页数 {pages}<18")
    # 密度
    density = total // max(pages, 1)
    if density >= 10: passed.append(f"✅ 密度 {density}图/页≥10")
    else: issues.append(f"⚠️ 密度 {density}<10")
    # 字体（抽样）
    yahei = 0
    total_runs = 0
    for sl in prs.slides:
        for sh in sl.shapes:
            if hasattr(sh, 'text_frame'):
                for p in sh.text_frame.paragraphs:
                    for r in p.runs:
                        total_runs += 1
                        if r.font.name == FN: yahei += 1
    if total_runs > 0 and yahei >= total_runs * 0.8:
        passed.append(f"✅ 微软雅黑覆盖 {yahei}/{total_runs}")
    else:
        issues.append(f"⚠️ 字体覆盖 {yahei}/{total_runs}")
    for p in passed: print(f"  {p}")
    for i in issues: print(f"  {i}")
    print(f"总数:{pages}页 | 图形:{total} | 密度:{density}图/页")
    return passed, issues

# ═══════════════════════════════════════════
# Ⅶ. 文件清理
# ═══════════════════════════════════════════

def full_cleanup(p):
    """全XML清理（v4：支持PYRAMID布局等新增形状）"""
    tmp = p + '.tmp'
    with zipfile.ZipFile(p, 'r') as zin:
        with zipfile.ZipFile(tmp, 'w', zipfile.ZIP_DEFLATED) as zout:
            for item in zin.infolist():
                d = zin.read(item.filename)
                if item.filename.endswith('.xml'):
                    root = etree.fromstring(d)
                    np = 'http://schemas.openxmlformats.org/presentationml/2006/main'
                    na = 'http://schemas.openxmlformats.org/drawingml/2006/main'
                    for st in root.findall(f'.//{{{np}}}style'):
                        sp = st.getparent()
                        if sp is not None: sp.remove(st)
                    if 'theme' in item.filename.lower():
                        for tg in ['outerShdw','innerShdw','scene3d','sp3d']:
                            for el in root.findall(f'.//{{{na}}}{tg}'):
                                ep = el.getparent()
                                if ep is not None: ep.remove(el)
                    d = etree.tostring(root, xml_declaration=True, encoding='UTF-8', standalone=True)
                zout.writestr(item, d)
    os.replace(tmp, p)


# ═══════════════════════════════════════════
# Ⅷ. 使用示例
# ═══════════════════════════════════════════

def PYRAMID_demo():
    """演示：深蓝递进金字塔布局"""
    prs = Presentation()
    prs.slide_width = SW
    prs.slide_height = SH
    BL = prs.slide_layouts[6]
    s = prs.slides.add_slide(BL)
    HDR(s, "AI星工厂2.0 商品定义逻辑框架", "AI Star Factory 2.0 · 精益咨询+AI数字员工+数字化底座")
    PYRAMID(s, [
        ('L5', "第五层：技术·底座·对象", "技术&底座：ODDO·CLAW·精益工具集", LV5,
         [("ODDO部署", SV7), ("CLAW框架", SV8), ("精益工具", SV9)]),
        ('L4', "第四层：功能·模块·架构", "AI星工厂架构·实施方法论·运营体系", LV4,
         [("AI星工厂架构", SV7), ("实施方法论", SV8), ("运营体系", SV9)]),
        ('L3', "第三层：要素·策略·定义", "要素：精益AI+底座·策略：543/QCD·定义：三位一体", LV3,
         [("要素", SV4), ("策略", SV5), ("定义", SV6)]),
        ('L2', "第二层：QCD核心价值", "交付加速·成本精控·质量跃升", LV2,
         [("交付加速", SV1), ("成本精控", SV2), ("质量跃升", SV3)]),
        ('L1', "第一层：愿景使命", "让人们享受智能化带来的美好生活", LV1, None),
    ], "广西星网智云科技有限公司 | AI星工厂2.0")
    out = "/tmp/pyramid_demo.pptx"
    prs.save(out); full_cleanup(out)
    print(f"✅ 金字塔示例：{out}")

def main_demo():
    """民和电器示例（默认）"""
    prs = Presentation()
    prs.slide_width = SW
    prs.slide_height = SH
    BL = prs.slide_layouts[6]

    # === P1: 封面 ===
    s = prs.slides.add_slide(BL)
    cover(s, "民和电器精益咨询项目\n总结报告", "精益生产 · 计划物控 · 数字化转型", "2021—2023", "连恩信息科技（厦门）有限公司")
    PN(s, 1, 19)

    # === P2: 目录 ===
    s = prs.slides.add_slide(BL)
    toc(s, [
        ("1", "项目回顾与总体概览", "项目背景、三大旗舰项目"),
        ("2", "组织架构/职责/流程优化", "调研诊断、新架构设计"),
        ("3", "生产计划模式优化", "统一策划、联动排产"),
        ("4", "物流转运优化方案", "搬运改善、容器化"),
        ("5", "新计划模式验证成果", "500+机种验证数据"),
        ("6", "行业对标与价值分析", "库存周转、数字化率"),
        ("7", "数字化规划与MES系统", "四层架构、实施路线"),
        ("8", "项目核心价值与展望", "成效总结、三阶段路线"),
    ])
    PN(s, 2, 19)

    # === P3: SEC01 ===
    s = prs.slides.add_slide(BL); SEC(s, 1, "项目回顾与总体概览"); PN(s, 3, 19)

    # === P4: 项目背景 ===
    s = prs.slides.add_slide(BL)
    AT(s, "民和电器携手连恩，启动精益+数字化双轮驱动战略转型")
    TX(s, LM, Inches(1.3), CW, Inches(1.2), [
        "▎ ABB战略伙伴，2021年启动三大项目",
        "▎ 全球精益生产及物流体系数字化优化转型",
        "▎ 智造2025数字化车间+MES系统优化",
        "▎ 2024年电气机械业增加值同比+5.0%（国统局）",
    ], 12, D3)
    MCARDS(s, [
        ("2年+", "项目周期", "2021-2023", NV),
        ("3个", "旗舰项目", "ABB合作", AB),
        ("500+", "验证机种", "多品类覆盖", AG),
        ("1.9天", "装配周期", "优于行业3-5天", AO),
    ], Inches(3.5))
    SR(s, "来源：国家统计局·2024年"); PN(s, 4, 19)

    # === P5: 核心目标 ===
    s = prs.slides.add_slide(BL)
    AT(s, "核心目标与行业对标 — KPI总览")
    KTRACK(s, [
        ("制造周期", 0.85, "1.9天/目标2.0天", "on"),
        ("WIP降低", 0.70, "↓30-50%/目标", "risk"),
        ("OEE", 0.82, "85%/目标", "on"),
        ("交付率", 0.95, "99%/目标", "on"),
        ("排产效率", 0.75, "1-1.5h/目标", "on"),
    ])
    SR(s, "来源：TEEPTRAK·2024年OEE行业基准"); PN(s, 5, 19)

    # === P6: SEC02 ===
    s = prs.slides.add_slide(BL); SEC(s, 2, "组织架构/职责/流程优化"); PN(s, 6, 19)

    # === P7: 调研发现 ===
    s = prs.slides.add_slide(BL)
    AT(s, "深入调研发现问题 — 组织架构不匹配、职责交叉")
    BA(s,
        ["• 职能部门各自为政，缺乏流程导向",
         "• 岗位职责交叉，审批流程冗长",
         "• 信息传递效率低，跨部门协作困难"],
        ["• 新架构：从职能型转向流程型",
         "• 职责明确：每个岗位职责清晰",
         "• 流程优化：审批环节减少50%"],
    )
    SR(s, "连恩咨询诊断报告"); PN(s, 7, 19)

    # === P8: 改善方案 ===
    s = prs.slides.add_slide(BL)
    AT(s, "三大改善支柱 — 架构重组 · 流程优化 · 能力建设")
    PILLAR(s, [
        ("架构重组", ["• 新组织架构设计", "• 岗位职责明确", "• 管理层级精简"], NV),
        ("流程优化", ["• 端到端流程梳理", "• 审批环节精简", "• 信息化支撑"], AB),
        ("能力建设", ["• 精益培训体系", "• 排产方法掌握", "• 持续改善文化"], AG),
    ])
    SR(s, "连恩咨询改善方案"); PN(s, 8, 19)

    # === P9: SEC03 ===
    s = prs.slides.add_slide(BL); SEC(s, 3, "生产计划模式优化"); PN(s, 9, 19)

    # === P10: 计划流程 ===
    s = prs.slides.add_slide(BL)
    AT(s, "新计划模式 — 统一策划·联动排产·精细控制·异常快反")
    PILLAR(s, [
        ("统一策划", ["• 计划统一编制", "• 控制生产节奏"], NV),
        ("联动齐套", ["• 多车间协同", "• 减少在制停滞"], AB),
        ("精细控制", ["• 精细化排产", "• WIP显著↓"], AG),
    ], TZ)
    FLOW(s, [("需求接收", ""), ("主计划", ""), ("联动排产", ""), ("齐套检查", ""), ("工单下发", ""), ("进度跟踪", ""), ("异常闭环", "")], Inches(5.2))
    SR(s, "民和电器内部方案"); PN(s, 10, 19)

    # === P11: 实施时间线 ===
    s = prs.slides.add_slide(BL)
    AT(s, "项目实施路线图 — 分三阶段推进，30天关键里程碑")
    TIMELINE(s, [
        ("调研诊断", "5天\n需求+痛点识别"),
        ("方案设计", "5天\n方案确认"),
        ("审批确认", "3天\n管理层审批"),
        ("方案落地", "10天\n试运行"),
        ("流程优化", "12天\n持续改善"),
        ("培训推广", "8天\n全员赋能"),
        ("效果评估", "5天\n数据验证"),
    ], Inches(3.5))
    SR(s, "连恩咨询实施计划"); PN(s, 11, 19)

    # === P12: SEC04 ===
    s = prs.slides.add_slide(BL); SEC(s, 4, "物流转运优化方案"); PN(s, 12, 19)

    # === P13: 物流优化 ===
    s = prs.slides.add_slide(BL)
    AT(s, "物流转运优化 — 降低搬运活性系数，消除无效搬运与停滞")
    BA(s,
        ["• 物料散放，活性系数低",
         "• 人工搬运占比高",
         "• 转运路径长，迂回严重",
         "• 等待停滞时间占比>30%"],
        ["• 容器化/托盘化，活性系数↑",
         "• 搬运路径优化，距离↓40%",
         "• 工序间衔接顺畅",
         "• 流转效率提升50%+"],
    )
    SR(s, "搬运活性指数：物料存放状态对搬运的影响"); PN(s, 13, 19)

    # === P14: 库存分析 ===
    s = prs.slides.add_slide(BL)
    AT(s, "库存管理行业对标 — 中国制造业与国际差距1.4-2.3倍")
    TB(s, LM, TZ, 5, 6,
        [["行业", "中国", "国际", "差距", "改善方向", "数字率"],
         ["机械", "2.8次/年", "6.5次", "↓2.3倍", "精益+数字", "38%"],
         ["电子", "4.9次", "7.2次", "↓1.5倍", "计划联动", "42%"],
         ["汽车", "3.2次", "6.0次", "↓1.9倍", "供应链", "37%"],
         ["政策", "60%普及", "2026目标", "—", "国务院", "60%"]],
        [Inches(1.3), Inches(2.0), Inches(2.0), Inches(1.8), Inches(2.0), Inches(1.5)])
    TX(s, LM, Inches(4.5), CW, Inches(0.5), "▎ 广东某电子企业库存周转3.6→6.1次/年（+69%）| 来源：简道云·2026", 9, D3)
    SR(s, "简道云·2026库存周转率基准 + 国务院·数字中国规划"); PN(s, 14, 19)

    # === P15: SEC05 ===
    s = prs.slides.add_slide(BL); SEC(s, 5, "新计划模式验证成果", "L4: 量化成果"); PN(s, 15, 19)

    # === P16: 验证成果 ===
    s = prs.slides.add_slide(BL)
    AT(s, "新计划模式2个月实战验证 — 装配周期1.9天，优于行业基准3-5天")
    BN(s, [
        ("500+", "验证机种", NV),
        ("1.9天", "装配周期", AG),
        ("97.2%", "完工率", NV),
        ("1-1.5h", "排产时间", AO),
    ])
    TB(s, LM, Inches(3.5), 6, 6,
        [["车间", "批次", "有完工", "平均周期", "行业参考", "结论"],
         ["装配", "442", "432(97.7%)", "1.9天", "3-5天", "领先✅"],
         ["注塑", "98", "93(94.9%)", "2.4天", "3-6天", "优于✅"],
         ["五金", "35", "34(97.1%)", "2.8天", "4-7天", "改善✅"],
         ["跨车间", "6", "6(100%)", "9.0天", "10-15天", "优于✅"],
         ["合计", "581", "565(97.2%)", "—", "3-7天", "整体优于✅"]],
        [Inches(1.2), Inches(1.2), Inches(1.5), Inches(1.5), Inches(1.5), Inches(1.5)])
    SR(s, "数据：2022.2.22-3.26 | TEEPTRAK·2024"); PN(s, 16, 19)

    # === P17: 成果仪表盘 ===
    s = prs.slides.add_slide(BL)
    KPI_CARDS = [("¥8.5亿", "年营收", NV), ("97.2%", "完工率", AG), ("1.9天", "装配周期", AO), ("500+", "验证机种", AB)]
    BARS_data = [[45, 65, 82, 92, 97], [30, 50, 70, 80, 88]]
    BARS_labels = ["M1", "M2", "M3", "M4", "M5"]
    BARS_colors = [NV, AB]
    DASH(s, KPI_CARDS, BARS_data, BARS_labels, BARS_colors,
         "验证期间完工率持续提升，第5个月达到97.2%，验证通过率优于行业基准")
    PN(s, 17, 19)

    # === P18: SEC06 ===
    s = prs.slides.add_slide(BL); SEC(s, 6, "项目核心价值与展望"); PN(s, 18, 19)

    # === P19: 行动项 ===
    s = prs.slides.add_slide(BL)
    AT(s, "持续改善行动计划 — 三阶段推进精益数字化深度融合")
    ACTIONS(s, [
        ("维护BOM\n管控质量", "短期≤3月", "项目团队"),
        ("全产品线\n深化MES", "中期3-12月", "IT+运营"),
        ("智能排产\n预测计划", "长期1-3年", "全公司"),
    ])
    SR(s, "连恩咨询持续改善建议"); PN(s, 19, 19)

    # === P20: 结束页 ===
    s = prs.slides.add_slide(BL)
    CLOSE(s,
        "连恩智能 —— 帮助中国制造\"快\"起来！",
        "精益生产 · 计划物控 · 数字化转型\n一套体系 | 一支队伍 | 一个平台",
        "连恩信息科技（厦门）有限公司")

    # ── 保存 & 清理 ──
    out = "output_report.pptx"
    prs.save(out)
    full_cleanup(out)
    print(f"\n✅ 生成完成：{out}")
    print("=" * 50)
    print("📋 PPT自审报告")
    print("=" * 50)
    AUDIT(prs)

if __name__ == '__main__':
    main_demo()


path: references/methodology.md
content: # 数字化制造咨询调研方法论

## 项目总览

本方法论适用于离散制造企业数字化转型咨询项目，覆盖从企业调研到合作方案输出的完整链路。

### 项目四阶段

```
Phase 1                 Phase 2                 Phase 3                 Phase 4
  调研诊断               问题分析               改善规划               合作交付
┌──────────┐          ┌──────────┐           ┌──────────┐           ┌──────────┐
│ 部门调研  │  ──→   │ 问题梳理  │  ──→    │ 改善方案  │  ──→    │ 调研报告  │
│ 数据采集  │         │ 根因分析  │          │ 项目定义  │          │ 汇报PPT   │
│ 现场观察  │         │ 改善方向  │          │ 效益评估  │          │ 合作建议  │
└──────────┘          └──────────┘           └──────────┘           └──────────┘
```

### 调研对象（7大部门）

| 序号 | 部门 | 核心调研主题 | 关键关注点 |
|:----:|------|------------|-----------|
| 1 | 销售部 | 接单流程、预测机制、订单变更管理 | 订单全生命周期、急单插单 |
| 2 | 计划部 | MPS/MRP、排产逻辑、产能规划 | 计划颗粒度、响应速度、协同 |
| 3 | 生产部 | 现场管理、OEE、人员效率、生产节拍 | 浪费识别、瓶颈工序、异常响应 |
| 4 | 采购部 | 供应商管理、采购策略、来料异常 | 采购周期、质量控制、JIT |
| 5 | 仓储物流 | 仓库管理、物料流转、配送效率 | 库存准确率、库位管理、物流路径 |
| 6 | 质量部 | 质量体系、检验流程、质量数据 | 追溯管理、SPC、客诉处理 |
| 7 | 工艺技术部 | BOM管理、工艺路线、技术文件 | ECN流程、标准化、数据源维护 |

### 调研方法

| 方法 | 适用场景 | 输出物 |
|------|---------|--------|
| 高管访谈 | 战略、KPI、痛点、期望 | 高层访谈纪要 |
| 部门访谈 | 流程细节、痛点、系统使用 | 部门调研记录 |
| 现场观察(Gemba Walk) | 生产现场、物流路线、作业观察 | 现场观察记录 |
| 数据采集 | 产量、效率、质量、库存等 | 数据汇总表 |
| 问卷调研 | 覆盖面广、量化分析 | 调研问卷分析 |
| 流程穿行测试 | 端到端流程验证 | 流程穿行报告 |
| 系统演示 | 现有系统功能验证 | 系统功能评估 |

### 调研输出物清单

| 输出物 | 用途 | 受众 |
|--------|------|------|
| 调研检查清单 | 调研时逐项确认 | 顾问团队 |
| 部门调研记录 | 记录部门调研详情 | 项目组 |
| 问题清单 | 汇总所有发现的问题 | 项目组 |
| 改善方向矩阵 | 问题-改善-优先级映射 | 内部评审 |
| 调研报告(初稿) | 客户确认版本 | 客户方 |
| 调研汇报PPT | 正式汇报材料 | 客户高层 |
| 合作建议书 | 后续合作方案 | 客户决策层 |


path: references/planning.md
content: # 生产计划与物控调研指南

## 调研目标
- 评估企业生产计划体系的成熟度（MPS/MRP/排产）
- 识别计划-执行闭环中的断点与障碍
- 评估物料控制能力（库存/齐套/缺料管理）

## 调研重点

### 1. 生产计划体系
- 计划编制流程（从接单到排产）
- MPS（主生产计划）编制方法与频率
- 计划颗粒度（年/月/周/日）
- 产能规划是否纳入计划编制
- 计划变更/调整机制

### 2. 排产管理
- 排产工具（Excel/ERP/MES/APS？）
- 排产考虑的约束条件
- 排产频率（日排/周排/滚动排产？）
- 瓶颈工序识别与管理
- 排产方案评审与下发流程

### 3. 物料需求计划(MRP)
- MRP运算方式（系统自动/手工计算？）
- BOM准确性（BOM准确率？）
- 是否考虑安全库存/批量规则
- 采购计划生成流程

### 4. 库存管理
- 原材料/在制品/成品库存水平
- 库存周转天数
- ABC分类管理
- 呆滞料管理机制
- 盘点制度与准确率

### 5. 齐套管理
- 生产前是否做齐套检查？
- 缺料处理机制
- 替代料管理

## 常见问题诊断库

| 问题现象 | 可能根因 | 典型影响 |
|---------|---------|---------|
| 计划赶不上变化 | 计划编制周期长/缺乏滚动机制 | 现场频繁调整/救火式管理 |
| 库存高但还缺料 | 安全库存设置不合理/数据不准 | 资金占用/停线风险并存 |
| BOM不准导致计划错误 | BOM维护滞后/ECN执行不到位 | 物料错买/漏买/呆滞 |
| 排产凭经验 | 缺乏数字化排产工具 | 产能利用不均衡/交期延误 |
| 齐套率低 | 无齐套检查流程/信息不同步 | 产线待料/换线频繁 |
| 库存周转慢 | 批量过大/安全库存过高/呆滞未处理 | 资金占用/仓储成本高 |
| 计划与执行脱节 | 无报工反馈/数据滞后 | 计划失效/进度失控 |
| 呆滞料占比高 | BOM变更未同步/采购策略问题 | 资金沉淀/仓储压力 |

## 数据采集项
- MPS编制周期与颗粒度
- 排产工具与方式
- BOM准确率（抽样）
- 库存周转天数
- 齐套率
- 缺料停线次数/时长
- 呆滞料金额与占比
- 计划达成率


path: references/procurement.md
content: # 采购与供应链调研指南

## 调研目标
- 评估采购管理体系成熟度
- 识别供应商管理与来料控制中的问题
- 评估采购与计划协同效率

## 调研重点

### 1. 采购模式
- 采购品类划分（直接物料/间接物料）
- 采购策略（JIT/VMI/寄售/批量采购）
- 采购计划生成方式（MRP跑出来的/人工估算？）
- 采购订单处理流程

### 2. 供应商管理
- 供应商数量与结构
- 供应商评估体系（QCD评估？）
- 供应商分级分类管理
- 新供应商引入流程
- 供应商绩效管理

### 3. 采购执行
- 采购周期（从PO下达→到货）
- 供应商交期达成率
- 来料检验流程(IQC)
- 来料异常处理机制
- 加急采购频次与原因

### 4. 采购协同
- 预测信息是否共享给供应商
- 供应商门户/EDI连接
- 采购与计划/仓库的信息协同

## 常见问题诊断库

| 问题现象 | 可能根因 | 典型影响 |
|---------|---------|---------|
| 采购周期长 | 审批流程冗长/供应商响应慢 | 安全库存被迫提高 |
| 供应商交期不准 | 供应商管理弱/无约束机制 | 来料波动/计划被打乱 |
| 来料不良率高 | 供应商质量体系弱/免检不当 | 生产停线/质量风险 |
| 加急采购频繁 | 计划不准/BOM不准/需求临时变更 | 采购成本高/质量风险 |
| 采购成本高 | 批量小/供应商未整合/无议价策略 | 产品成本失去竞争力 |
| 供应商数量过多 | 缺乏品类管理和供应商整合 | 管理成本高/议价能力弱 |


path: references/production.md
content: # 生产现场调研指南

## 调研目标
- 评估生产现场管理水平（5S/标准化/目视化）
- 识别生产过程中的七大浪费
- 评估OEE与产能利用状况
- 评估异常响应能力（Andon/停线管理）

## 调研重点

### 1. 现场管理
- 5S执行现状（现场走一圈拍照记录）
- 目视化管理水平（标识/看板/颜色管理）
- 标准化作业覆盖率（SOP上墙率/执行率）
- 产线布局（U型线/直线/CELL化？）

### 2. 生产效率
- 各工序Cycle Time（实际vs标准）
- 瓶颈工序识别
- OEE数据（是否有采集？真实值是多少？）
- 换模/换线时间（SMED水平）
- 生产节拍(Takt Time)管理

### 3. 物料流转
- 线边仓管理（物料摆放/先进先出）
- 物料配送方式（推送到工位/领料？）
- WIP（在制品）管理现状
- 物料搬运距离与频次

### 4. 异常管理
- 异常响应机制（Andon/呼叫铃/对讲机？）
- 停线管理（谁有权停线？停线频次？）
- 异常数据记录与分析
- 问题升级流程

### 5. 人员管理
- 多能工比例
- 人员技能矩阵
- 员工培训体系
- 绩效考核（计件/计时？）

### 6. 信息系统
- MES系统使用深度
- 报工方式（扫码/手工/自动采集？）
- 生产数据实时性

## 常见问题诊断库

| 问题现象 | 可能根因 | 典型影响 |
|---------|---------|---------|
| 5S形同虚设 | 缺乏持续检查/管理层不重视 | 效率损失/安全隐患 |
| 现场WIP堆积严重 | 批量生产/前后工序不平衡 | 占用资金/掩盖问题 |
| OEE低 | 故障多/换型长/质量损失 | 产能不足/成本高 |
| SOP执行率低 | SOP不实用/培训不足/监督缺失 | 质量波动/效率不稳定 |
| 异常响应慢 | 无安灯系统/责任不明/升级路径不清 | 停线损失/问题扩大 |
| 换线时间长 | 内部/外部作业未区分/缺乏SMED | 柔性不足/批量被迫大 |
| 物料搬运浪费多 | 布局不合理/配送无标准 | 非增值时间多/效率低 |
| 多能工比例低 | 培训体系缺失/薪酬激励不足 | 人员调配困难/柔性差 |
| MES数据不准 | 手工录入/滞后/未与设备集成 | 决策依据不可靠 |

## 数据采集项
- 5S评分（现场拍照记录）
- 各工序C/T（实测3-5次取平均）
- 换模/换线时间
- OEE（或分段数据计算）
- 日/月产出数据
- WIP数量（关键工序间）
- 异常停线次数与时长
- 多能工比例
- SOP覆盖率与版本


path: references/project_definition.md
content: # 改善项目定义与规划

## 项目定义流程

从诊断发现到可执行的改善项目，需要经过严谨的定义和规划。

### 项目定义5步法

```
Step 1            Step 2            Step 3            Step 4            Step 5
问题排序        →  改善方向映射     →  项目边界定义     →  效益评估         →  项目卡片输出
│                 │                 │                 │                 │
│ 按紧迫度+       │ 匹配改善方向     │ 定义范围         │ 量化预期效益      │ 输出标准化
│ 价值量评估      │ 确定方法论      │ 含/不含         │ 估算投入         │ 项目卡片
│ 确定优先级      │ (精益/数字化)    │ 里程碑          │ 投资回报        │ 归档入库
```

## 项目分类

| 项目类型 | 周期 | 投入 | 特点 | 典型例子 |
|---------|:----:|:----:|------|---------|
| **速赢(Quick Win)** | 1-3月 | 低 | 投入小见效快、建立信心 | 5S整理、SOP标准化、看板 |
| **重点改善** | 3-6月 | 中 | 系统性的改善、ROI明确 | SMED、TPM、线平衡、Andon |
| **数字化项目** | 6-12月 | 高 | 系统实施、需变革管理 | MES/WMS/APS/BI |
| **战略变革** | 12月+ | 高 | 组织级变革、影响面广 | 流程再造、新工厂规划、供应链重构 |

## 项目卡片模板

```
┌────────────────────────────────────────────────────────┐
│  📋 改善项目卡片                                      │
├────────────────────────────────────────────────────────┤
│  项目编号：PRJ-2026-XXX                                │
│  项目名称：【】                                         │
│  项目类型：□ 速赢  □ 重点改善  □ 数字化  □ 战略变革    │
│  优先级：   □ P1(高优)  □ P2(中优)  □ P3(长期)       │
│  关联部门：                                             │
├────────────────────────────────────────────────────────┤
│  问题描述：                                             │
│  （现状痛点 + 数据支撑）                                │
│                                                         │
│  改善方向：□ 精益生产  □ 数字化  □ 组织流程            │
│                                                         │
│  目标指标：                                             │
│  • 当前值：   目标值：   改善幅度：                      │
│  • 当前值：   目标值：   改善幅度：                      │
├────────────────────────────────────────────────────────┤
│  实施方案（关键里程碑）：                                │
│  M1 (第1月)：                                           │
│  M2 (第2月)：                                           │
│  M3 (第3月)：                                           │
├────────────────────────────────────────────────────────┤
│  投入估算：                                             │
│  人力：       人月                                       │
│  资金：       万元                                       │
│  周期：       月                                         │
├────────────────────────────────────────────────────────┤
│  预期效益：                                             │
│  直接效益：   万元/年                                    │
│  间接效益：                                             │
│  投资回报期：   月                                       │
├────────────────────────────────────────────────────────┤
│  关联系统：                                             │
│  系统需求：                                             │
│  数据需求：                                             │
├────────────────────────────────────────────────────────┤
│  风险与依赖：                                           │
│  关键风险：                                             │
│  前置依赖：                                             │
│  准备条件：                                             │
└────────────────────────────────────────────────────────┘
```

## 合作建议书框架

基于改善项目清单，编制合作建议书，包含以下部分：

### 建议书结构
1. **项目背景** — 调研概况、企业现状
2. **核心发现** — TOP5关键发现（痛点+数据）
3. **改善路线图** — 分阶段规划（速赢→重点→数字化）
4. **项目清单** — 详细项目卡片列表
5. **实施计划** — 甘特图、里程碑
6. **团队配置** — 我方团队构成+客户配合要求
7. **投入与回报** — 总投资、预期收益、ROI分析
8. **合作模式** — 合作范围、交付物、周期、商务

### 合作模式参考

| 模式 | 适合场景 | 优势 |
|------|---------|------|
| 诊断+方案 | 前期的合作切入点 | 低风险、建立信任 |
| 顾问辅导 | 企业有实施团队但缺方法论 | 知识转移 |
| 项目管理 | 企业需要外部PMO | 保障落地 |
| 总包实施 | 企业从方案到落地全外包 | 责任清晰 |
| 联合实施 | 双方团队共同推进 | 深度绑定 |


path: references/quality.md
content: # 质量管理调研指南

## 调研目标
- 评估质量管理体系完整性与执行有效性
- 识别质量控制断点和可追溯性短板
- 评估质量数据利用水平

## 调研重点

### 1. 质量体系
- ISO/TS体系认证情况
- 质量方针与目标分解
- 质量组织架构与责任划分

### 2. 来料质量(IQC)
- 来料检验流程与抽样标准
- 免检物料管理
- 来料异常处理（MRB流程）
- 供应商质量绩效管理

### 3. 过程质量(IPQC)
- 首件检验制度
- 过程检验频次与方式
- SPC统计过程控制应用
- 自检/互检机制
- 不合格品管理（标识/隔离/处理）

### 4. 出货质量(OQC)
- 成品检验标准
- 出货检验流程
- 客户验货配合

### 5. 质量追溯
- 生产批次追溯能力
- 物料批次追溯（正向/逆向）
- 质量问题可追溯到的粒度

### 6. 质量改进
- 客诉处理流程（8D/CAR）
- 质量数据收集与分析
- 质量改善项目机制
- 质量成本分析

## 常见问题诊断库

| 问题现象 | 可能根因 | 典型影响 |
|---------|---------|---------|
| 质量数据"孤岛" | 各环节数据未打通/无系统集成 | 无法做趋势分析/预防 |
| 追溯困难 | 无批次管理/扫码缺失 | 召回成本高/客诉处理慢 |
| 不良品重复发生 | 根因分析不深入/纠正措施不落地 | 质量成本居高不下 |
| 检验依赖"人治" | SPC缺失/自动化检验不足 | 错检漏检/效率低下 |
| 客诉处理周期长 | 无8D流程/责任界定慢 | 客户关系受损 |
| 来料不良波动大 | 供应商管控弱/免检标准不合理 | 产线停线/返工 |
| 过程质量失控 | IPQC频次不够/控制计划未执行 | 不良品流到下游 |


path: references/repair_pptx.py
content: """PPTX文件修复脚本 — 彻底解决 XML 兼容性问题"""
import zipfile, shutil, tempfile, os, re

def repair_pptx(input_path, output_path):
    """深度修复PPTX文件：清理p:style、空ln标签、主题阴影引用等"""
    temp_dir = tempfile.mkdtemp()
    try:
        with zipfile.ZipFile(input_path, 'r') as z:
            z.extractall(temp_dir)
        
        for root, dirs, files in os.walk(temp_dir):
            for fname in files:
                if not fname.endswith('.xml'):
                    continue
                fpath = os.path.join(root, fname)
                with open(fpath, 'r', encoding='utf-8') as f:
                    content = f.read()
                
                original = content
                
                # 1. 彻底移除 p:style 节点（含子节点）
                content = re.sub(r'<p:style[^>]*>.*?</p:style>', '', content, flags=re.DOTALL)
                
                # 2. 移除 a:themeShadow 引用
                content = re.sub(r'<a:themeShadow[^>]*/>', '', content)
                content = re.sub(r'<a:themeShadow[^>]*>.*?</a:themeShadow>', '', content)
                
                # 3. 清理空的 a:ln 节点（没有子元素）
                content = re.sub(r'<a:ln[^>]*/>', '', content)
                content = re.sub(r'<a:ln[^>]*>\s*</a:ln>', '', content)
                
                # 4. 确保 a:latin 和 a:ea 有 typeface 属性
                content = re.sub(
                    r'<(a:latin)([^>]*)>',
                    lambda m: f'<a:latin typeface="Arial"{m.group(2)}>' if 'typeface' not in m.group(0) else m.group(0),
                    content
                )
                content = re.sub(
                    r'<(a:ea)([^>]*)>',
                    lambda m: f'<a:ea typeface="Microsoft YaHei"{m.group(2)}>' if 'typeface' not in m.group(0) else m.group(0),
                    content
                )
                
                # 5. 修复可能的 a:ln 中空 a:solidFill
                content = re.sub(r'<a:ln[^>]*><a:solidFill/>.*?</a:ln>', '', content)
                
                # 6. 清理空标签
                content = re.sub(r'<a:noFill/>', '<a:noFill/>', content)
                
                if content != original:
                    with open(fpath, 'w', encoding='utf-8') as f:
                        f.write(content)
        
        # 重新打包
        with zipfile.ZipFile(output_path, 'w', zipfile.ZIP_DEFLATED) as z:
            for root, dirs, files in os.walk(temp_dir):
                for fname in files:
                    fpath = os.path.join(root, fname)
                    arcname = os.path.relpath(fpath, temp_dir)
                    z.write(fpath, arcname)
        print(f"✅ 修复完成: {output_path}")
    finally:
        shutil.rmtree(temp_dir, ignore_errors=True)

if __name__ == "__main__":
    inp = "input.pptx"
    out = "input_repaired.pptx"
    repair_pptx(inp, out)


path: references/report-templates.md
content: # 咨询项目报告模板集

> 本文件提供各类型报告的详细页面结构模板。每个模板以"页序 - 标题 - 核心信息"格式呈现。
> 使用时根据实际项目情况增删调整。

---

## 一、阶段性总结报告（推荐15-25页）

**适用场景**：项目中期汇报、里程碑节点、季度回顾

### 1. 封面
- **标题**：XX项目阶段总结报告
- **副标题**：XXXX年X月-X月 | 第X阶段
- **必备元素**：客户Logo、咨询方Logo、日期、保密级别

### 2. 目录
- 项目概述
- 本阶段工作回顾
- 关键成果展示
- 问题与风险
- 下阶段计划

### 3. 项目概述 （1-2页）
- **核心信息**：项目目标、范围、方法论全景
- 呈现形式：项目全景图/路线图

### 4. 本阶段工作计划 vs 实际
- **核心信息**：计划完成率
- 呈现形式：对照表 + 完成率百分比
- 关键数据：计划项数、完成项数、完成率、延迟项及原因

### 5-7. 重点工作回顾（按模块2-3页）
- **每页一个主题**，如：
  - 精益体系搭建
  - 计划物控流程优化
  - MES系统实施推进
- **结构**：目标 → 行动 → 成果 → 下一步
- **呈现**：Before/After对比、现场照片、数据趋势图

### 8-10. 关键成果量化展示 （2-3页）
- **核心信息**：用数据说话，展示改善成效
- 建议指标：
  - 效率类：OEE提升、换型时间缩短、节拍时间
  - 质量类：直通率、不良率降低
  - 交付类：准时交付率、订单周期缩短
  - 库存类：库存周转率、在制品降低
- **呈现形式**：仪表盘/KPI卡片/趋势图

### 11-12. 培训与能力建设 （1-2页）
- 培训场次、参与人数、认证情况
- 培训效果评估（考试通过率、实操考核）
- 现场辅导人次数

### 13-14. 问题与风险 （1-2页）
- **核心信息**：诚实面对问题，展现控制力
- 结构：问题描述 → 根因分析 → 应对措施 → 责任人与时限
- 风险分类：技术风险、管理风险、人员风险、供应商风险

### 15. 项目健康度评估
- **呈现形式**：雷达图或仪表盘
- 评估维度：进度、质量、成本、人员、风险

### 16-17. 下阶段工作计划 （1-2页）
- 下阶段目标
- 重点工作拆解（甘特图）
- 关键里程碑
- 资源需求（如需）

### 18. 需要客户支持的事项
- **核心信息**：明确提出需要客户决策/配合的事项
- 格式：事项 | 原因 | 期望回复时间 | 责任人

### 19. 总结与致谢
- 一句话总结本阶段核心价值
- 感谢客户团队的配合

### 20. 附录（可选）
- 详细数据表
- 会议纪要
- 调研问卷

---

## 二、项目总结报告（推荐25-40页）

**适用场景**：咨询项目终期交付、结项汇报

### 1. 封面
- **标题**：XX项目总结报告
- **副标题**：精工智造 · 价值共创
- **必备元素**：客户Logo、咨询方Logo、项目周期、日期、保密级别

### 2. 目录
- 项目回顾
- 核心方法论
- 关键发现（系统诊断）
- 改善方案与实施
- 量化成果
- 能力建设与知识转移
- 总结与持续建议
- 附录

### 3-4. 项目回顾（1-2页）
- 项目背景与挑战
- 项目目标与范围
- 项目实施时间线（里程碑图）
- 项目团队

### 5-6. 核心方法论（1-2页）
- 采用的方法论框架（如精益屋、智能制造成熟度模型）
- 实施路径图（Roadmap）
- **目的**：展现专业性和体系化思考

### 7-10. 系统诊断（3-4页）
**从六大维度展开**：
- **人员**：技能水平、组织结构、人员效率
- **机器**：设备OEE、维护体系、自动化水平
- **物料**：库存结构、物料流转、供应商管理
- **方法**：生产计划、工艺流程、标准作业
- **测量**：数据采集、指标体系、报表系统
- **环境**：现场5S、安全、布局

**每页结构**：现状 → 问题 → 影响评估 → 改善机会

### 11-14. 改善方案总览（3-4页）
- 改善方案全景图
- 方案优先级矩阵（影响 × 难度）
- 投资回报分析（投入 vs 预期收益）
- 实施路线图（分阶段）

### 15-20. 各模块改善详情（5-8页，按模块分页）
**每个模块1-2页**，包含：
- 改善目标
- 改善措施
- 实施过程
- 关键节点
- 成果数据
- Before/After对比

可选模块：
- 精益生产体系搭建
- 计划物控PC&MC优化
- MES/WMS系统实施
- 数据采集与数字化看板
- 组织能力建设

### 21-26. 量化成果总览（4-6页）
**建议页面分布**：
- **第1页**：核心KPI仪表盘（选取6-8个关键指标，展示改善幅度%）
- **第2页**：运营效率类（OEE、节拍、换型时间等趋势图）
- **第3页**：质量与交付类（直通率、不良率、OTD等趋势图）
- **第4页**：库存与成本类（库存周转、WIP、呆滞料等趋势图）
- **第5页**：经济效益汇总（节约金额、投资回报率）
- **第6页**：对标分析（改善前后 vs 行业标杆）

### 27-28. 能力建设与知识转移（1-2页）
- 培训体系搭建
- 内部讲师培养
- 标准作业指导书（SOP）输出清单
- 制度文件输出清单

### 29. 关键成功因素
- 高层支持
- 团队执行力
- 数据驱动决策
- 持续改善文化

### 30-31. 持续改进建议（1-2页）
- 短期（3个月内）持续改善事项
- 中期（3-12个月）深化方向
- 长期（1-3年）战略建议

### 32. 项目价值总结（1页）
- **一句话核心价值**：整个项目的精髓
- 关键数字全景（可做成信息图）

### 33. 致谢与展望
- 感谢客户团队的合作伙伴关系
- 未来合作展望

### 34-35. 附录（2-3页）
- 项目交付物清单
- 术语表
- 参考文献/标准

---

## 三、诊断评估报告（推荐20-30页）

**适用场景**：项目启动阶段、问题调研、现状评估

### 核心结构
1. **封面** - 项目诊断评估报告
2. **目录**
3. **诊断背景与方法** - 诊断范围、方法、团队、日程
4. **企业概况** - 主营业务、组织架构、关键数据概览
5. **行业对标** - 行业最佳实践、成熟度模型
6. **分维度诊断**（按精益/PC&MC/数字化等模块展开）
   - 各维度现状描述
   - 问题发现（附证据：数据/现场照片/访谈记录）
   - 根因分析（鱼骨图/5Whys）
   - 影响评估（对成本/质量/交付的具体影响）
7. **诊断结论汇总** - 问题优先级矩阵、痛点热力图
8. **初步改善方向** - 方向性建议（非详细方案）
9. **后续工作建议** - 下一步深入调研/方案设计的建议
10. **附录** - 调研问卷、访谈纪要、数据明细

---

## 四、改善提案报告（推荐15-20页）

**适用场景**：方案汇报、投资审批、立项决策

### 核心结构
1. **封面** - XX改善方案提案
2. **现状问题回顾** - 突出问题 & 改善机会点
3. **改善目标** - 量化目标（SMART原则）
4. **改善方案详述**
   - 方案设计思路
   - 技术路线/系统架构
   - 实施步骤（分阶段）
5. **投资与收益分析**
   - 投入预算（明细）
   - 预期收益（量化）
   - 投资回收期
   - ROI计算
6. **风险评估** - 技术/实施/组织风险 & 应对策略
7. **实施计划** - 甘特图、关键里程碑
8. **资源需求** - 人员/资金/IT/外部支持
9. **建议决策事项** - 需要客户批准的关键决策点

---

## 五、专题分析报告（推荐10-15页）

**适用场景**：某特定课题的深入研究

### 核心结构
1. **封面** - XX专题分析报告
2. **问题定义** - 为什么研究这个课题
3. **现状分析** - 数据/案例/调研发现
4. **根因分析** - 深度剖析
5. **可行方案** - 2-3个备选方案对比分析
6. **推荐方案** - 建议方案 & 理由
7. **实施路径** - 关键步骤与时间节点
8. **预期效果** - 量化预期收益

---

## 附录：常见咨询报告配色建议

- **主色**：深蓝（#1B3A5C）体现专业与信任
- **辅色**：橙色（#E87722）或 红色（用于关键数据和重点）
- **强调色**：绿色（正向指标）、浅灰（背景/辅助元素）
- **字体**：中文=微软雅黑/思源黑体，英文=Segoe UI/Arial
- **统一规范**：全报告保持字体、字号、间距一致

---

## 附录二：AI与工业智能专题模板

**适用场景**：AI应用规划、智能制造+AI、数据智能分析

### 新增/替换页面

| 位置 | 页面 | 说明 |
|------|------|------|
| 诊断阶段 | AI应用成熟度评估 | 5级成熟度（L0未启动→L5全面智能） |
| 方案阶段 | AI赋能场景地图 | 按业务域分类（质量检测/预测维护/排产优化等） |
| 成果阶段 | 数据智能成果展示 | 模型准确率、预测效果对比 |
| 规划阶段 | AI实施路线图 | 分三期（基础建设→场景落地→全面智能） |

### AI赋能制造业典型场景

- 视觉检测（产品质量AOI+AI）
- 预测性维护（设备PHM）
- 智能排产（APS + 运筹优化）
- 供应链需求预测（ML时间序列）
- 工艺参数优化（DOE + ML）
- 智能问答 & 知识图谱（SOP数字化）
- 数字孪生（DT + 仿真）

### AI专题报告页面布局

1. **AI赋能概述** → 一页看清全貌
2. **AI应用场景矩阵** → 场景 × 价值 × 难度
3. **技术架构图** → 数据层→AI层→应用层
4. **实施路径** → 分阶段建设规划
5. **预期收益** → 效率提升/成本降低量化
6. **案例对标** → 同行业AI应用最佳实践



path: references/requirements-summary.md
content: ---
title: "通用报告生成技能 — 完整需求规格"
version: "v6.0-material-enhanced"
updated: "2026-05-01"
description: "v6 素材增强版：新增PPT素材智能搜集引擎+模板风格双因子选择+18项交付清单"
---

# 通用报告PPT生成技能 — 完整需求规格（v6 素材增强版）

> 核心升级：新增PPT素材智能搜集引擎 + 模板风格双因子选择器
> 生成PPT前先搜集素材、选好风格，再进入设计生成阶段

---

## 一、定位

### 核心能力
**输入任意内容 → 自动识别 → 自适应模板 → 生成专业报告 → 自进化学习**

### 自进化能力
- **技能发现**：每日扫描126+本地技能，智能推荐可集成的新能力
- **使用追踪**：记录每次执行的布局模式、内容类型和结果
- **错误学习**：记录每次错误与修复方案，避免重复问题
- **模板优化**：根据使用频率自动推荐最佳模板和布局

### 自修复能力（S13 新增）
- **问题自动收集**：每次生成后收集所有错误/警告/用户反馈
- **P0/P1自动修复**：致命/严重问题自动写入SKILL.md的「常见错误与修复」
- **函数规范更新**：函数实现缺陷自动更新助手函数表
- **交付清单扩展**：新发现的检查项自动追加
- **版本号管理**：P0级别修复自动升级小版本号
- **行业图片搜索**：基于内容关键词自动搜索高质量行业配图
- **装饰图标搜集**：搜索并组织装饰性图标资源
- **参考PPT分析**：搜索同行业PPT设计，提取配色/布局/字体参考
- **配色方案识别**：从参考源提取配色方案
- **素材本地缓存**：下载并保存素材至本地缓存目录

### 风格选择能力（v6 新增）
- **双因子推荐算法**：内容类型 × 用户偏好 → 最优风格
- **4种风格模板**：deepblue(咨询专业) / tech(科技现代) / business(沉稳专业) / vibrant(热情鲜明)
- **用户确认机制**：展示素材预览+风格推荐，用户可调整

### 架构 — 九层设计
```
┌─ 自进化层: 技能发现引擎 + 使用分析 + 错误学习 + 模板优化
├─ 识别层: 内容类型自动检测 + 自适应模板选择
├─ 设计层: mck-ppt-design（70种布局模式）
├─ 素材层: PPT素材搜集 + 模板风格选择引擎（v6新增）
├─ 研究层: 深度研究引擎 + 多源交叉验证（v5.1新增）
├─ 内容层: 联网搜索（免API）+ 内容扩增引擎
├─ 提取层: OCR识别 + 文档解析 + 图片文字提取
├─ 分析层: 通用分析（所有模式）| 制造专家（仅制造领域）
└─ 输出层: python-pptx + 微软雅黑 + humanizer-zh + full_cleanup + AUDIT
```

---

## 二、自进化系统（v5 新增）

### 技能发现引擎
- 每次技能加载时自动扫描 `~/.workbuddy/skills/`
- 评估新技能与报告生成的相关性（关键词匹配）
- 发现的技能自动加入技能生态矩阵
- 新技能信息存储在 `self_evolution/known_skills.json`

### 进化数据存储
```
self_evolution/
├── known_skills.json       # 已知技能列表
├── usage_log.json          # 使用记录
├── error_log.json          # 错误日志
├── improvements.json       # 改进建议
├── template_stats.json     # 模板使用统计
└── evolution_summary.md    # 进化摘要
```

### 自进化执行流程
```
技能调用 → 加载进化数据 → 扫描新技能 → 执行生成 → 记录使用 → 更新日志
```

### 工作流（S0-S15）
新增 S0.5: 自进化检查（与内容分析并行）
- 加载 known_skills / usage_log
- 扫描新技能
- 检查上次错误是否已修复
- 加载高频使用的布局模式偏好

新增 S6.5: PPT素材搜集与模板风格选择（v6 核心新增）
- 基于内容类型和关键词自动搜索行业图片/图标/参考PPT/配色方案
- 双因子推荐算法选择最佳模板风格（内容因子60%×用户偏好40%）
- 素材预览与风格确认（用户可选调整）
- 素材引用信息嵌入生成脚本

新增 S13: 技能自修复
- 每次生成后自动收集所有问题/错误/用户反馈
- P0/P1级问题自动写入SKILL.md的常见错误章节
- 函数实现缺陷自动更新助手函数表
- 新发现的检查项自动追加到交付清单

新增 S14: 文件交付与微信推送
- PPT生成后通过 deliver_attachments 推送到微信小程序
- 提示用户开启「产物回传到小程序」开关
- 写入交付日志 tracking

---

## 三、质量门禁

### 自审（AUDIT）— 质量优先，页数不限
| 检查项 | 合格线 |
|:-------|:------:|
| 图形密度 | ≥ 10 图/页 |
| 微软雅黑覆盖 | ≥ 80% |
| 无 BLOCK_ARC / DIAMOND | 零容忍 |

### 交付检查清单（18项）
- [ ] 微软雅黑 + 英文Arial
- [ ] 无 BLOCK_ARC / 无 DIAMOND
- [ ] 使用 mck-ppt-design 布局模式
- [ ] 内容充分展开：每个模块按内容深度自然分页，无页数压缩
- [ ] 用户指定页数时：已按比例压缩但保证完整性和连贯性
- [ ] 数据呈现：每个数据点获得充分展示空间
- [ ] 来源标注完整（三级标注）
- [ ] 执行 full_cleanup()
- [ ] AUDIT() 通过（图形密度≥10，无BLOCK_ARC）
- [ ] 去AI味自检通过
- [ ] 用户资料内容已扩增
- [ ] 交付 .pptx 文件
- [ ] 自进化日志已写入
- [ ] 技能发现扫描已执行
- [ ] 【v6新增】素材搜集已执行（≥3种类型，≥5个条目）
- [ ] 【v6新增】模板风格已确认
- [ ] 【v6新增】素材引用已嵌入生成脚本
- [ ] 【v6新增】配色主题应用正确

---

## 四、版本演进记录

| 版本 | 核心变更 |
|:----|:---------|
| v1 | 创建 manufacturing-consulting-ppt 技能 |
| v2-v3 | 布局优化、图表增强、Mac兼容 |
| **v3 Pro** | 全面重构，采用mck-ppt-design |
| **v4 增强版** | 新增OCR/文档识别 + 内容扩增 + humanizer-zh |
| **v4 通用版** | 内容类型自识别 + 自适应模板 + 全领域 |
| **v5 自进化版** | **技能自进化系统（发现+追踪+学习+优化）** |
| **v6 素材增强版** | **新增PPT素材智能搜集引擎+模板风格双因子选择器** |
| **v6.1 多格式版** | **新增PDF/DOCX多格式输出 + Slide Config + 5-Pass Editor + 渐进交付** |


path: references/sales_order.md
content: # 销售与接单流程调研指南

## 调研目标
- 了解从线索到回款(Lead-to-Cash)的完整销售与接单流程
- 识别订单全生命周期管理中的痛点
- 评估销售预测与需求管理能力

## 调研重点

### 1. 订单管理流程
- 订单从哪里来？（ERP/CRM/邮件/微信/电话？）
- 订单输入方式（人工录入/系统对接/EDI？）
- 订单确认流程（谁确认交期？确认依据是什么？）
- 订单变更管理（变更流程？变更频次？如何通知相关部门？）
- 急单/插单处理机制

### 2. 销售预测
- 是否做销售预测？预测周期多长？
- 预测准确率如何评估？
- 预测如何传递给计划和采购？
- 有没有滚动预测机制？

### 3. 客户与产品信息
- 客户ABC分类管理
- 产品品类与复杂度
- 非标/定制比例
- 客户价格体系

### 4. 订单交期管理
- 标准交期如何定义？
- 交期承诺流程（销售直接承诺/需计划确认？）
- 交期达成率(OTD)现状
- 订单延期的主要原因

### 5. 信息系统
- CRM系统使用情况
- ERP订单模块使用深度
- 订单进度是否可追溯（客户能否查？）

## 常见问题诊断库

| 问题现象 | 可能根因 | 典型影响 |
|---------|---------|---------|
| 交期承诺不准确 | 销售直接承诺/无产能数据支撑 | 交货违约/加急成本 |
| 订单变更频繁 | 客户管理不规范/设计变更流程缺失 | 计划失效/库存呆滞 |
| 预测准确率低 | 预测方法粗放/无反馈闭环 | 库存积压/缺料并存 |
| 急单插单多 | 接单规则缺失/无优先级评估 | 计划频繁调整/效率下降 |
| 订单进度不透明 | 无订单追踪系统/信息孤岛 | 客户满意度低 |
| 订单录入错误多 | 手工录入/无校验/重复录入 | 生产错误/返工 |

## 数据采集项
- 年度销售额、订单数量
- 月平均订单数
- 急单占比（数量/金额）
- 订单变更率
- 交期达成率(OTD)
- 产品分类（标品vs非标比例）


path: references/self_evolution.py
content: #!/usr/bin/env python3
"""
通用报告生成器 — 自进化系统 v1
====================================
功能：
1. 技能发现引擎 — 扫描 ~/.workbuddy/skills/ 发现新技能
2. 使用追踪引擎 — 记录布局模式使用频率与效果
3. 错误学习引擎 — 记录错误与修复方案
4. 模板优化引擎 — 基于使用数据优化模板推荐

用法：
    python self_evolution.py scan       # 技能发现扫描
    python self_evolution.py status     # 查看进化状态
    python self_evolution.py log        # 查看使用日志摘要
    
数据目录：
    self_evolution/
    ├── known_skills.json
    ├── usage_log.json
    ├── error_log.json
    ├── improvements.json
    ├── template_stats.json
    └── evolution_summary.md
"""

import os, sys, json, glob
from datetime import datetime

# ═══════════════════════════════════════════════════════════
# 配置
# ═══════════════════════════════════════════════════════════

SKILLS_DIR = os.path.expanduser("~/.workbuddy/skills")
EVO_DIR = "self_evolution"

# 已知的相关技能关键词（用于相关性评估）
RELEVANCE_KEYWORDS = [
    "ppt", "报告", "presentation", "slide", "pptx",
    "精益", "制造", "数字化", "咨询",
    "数据", "chart", "图表", "分析", "analysis",
    "expert", "专家", "库存", "计划", "物控",
    "design", "设计", "字体", "font", "排版",
    "humanizer", "润色", "writing",
    "六西格玛", "sixsigma", "kaizen",
    "search", "搜索", "research", "研究",
]

# 标准技能生态（已知集成的技能）
STANDARD_SKILLS = {
    "设计引擎": ["mck-ppt-design"],
    "分析诊断": ["ie-expert", "rohoon-6sigma", "kaizen", "sixsigma"],
    "库存分析": ["inventory-eye", "inventory-demand-planning"],
    "计划物控": ["planning-mc-assistant", "supply-chain-bom-analyzer"],
    "精益工具": ["lean-production-toolkit", "manufacturing-consulting-toolkit"],
    "通用分析": ["chart-visualization", "data-analysis-report", "academic-deep-research"],
    "战略规划": ["cio", "afrexai-change-management-plan"],
    "进化辅助": ["self-improving-agent", "self-reflection", "proactive-agent"],
    "润色输出": ["humanizer-zh", "humanizer", "manufacturing-expert"],
}


# ═══════════════════════════════════════════════════════════
# 数据管理
# ═══════════════════════════════════════════════════════════

def ensure_evo_dir():
    """确保进化数据目录存在"""
    try:
        os.makedirs(EVO_DIR, exist_ok=True)
        for fname, default in [
            ("known_skills.json", "[]"),
            ("usage_log.json", "[]"),
            ("error_log.json", "[]"),
            ("improvements.json", "[]"),
            ("template_stats.json", "{}"),
        ]:
            fpath = os.path.join(EVO_DIR, fname)
            if not os.path.exists(fpath):
                with open(fpath, 'w') as f:
                    f.write(default)
    except (OSError, PermissionError) as e:
        print(f"⚠️ 进化数据目录创建失败: {e}")
        print("  将使用内存模式运行，数据不会被持久化")


def load_json(fname):
    """加载 JSON 数据"""
    fpath = os.path.join(EVO_DIR, fname)
    if os.path.exists(fpath):
        with open(fpath, 'r') as f:
            return json.load(f)
    return []


def save_json(fname, data):
    """保存 JSON 数据"""
    with open(os.path.join(EVO_DIR, fname), 'w') as f:
        json.dump(data, f, ensure_ascii=False, indent=2)


# ═══════════════════════════════════════════════════════════
# 1. 技能发现引擎
# ═══════════════════════════════════════════════════════════

def assess_relevance(skill_name, description=""):
    """评估技能与报告生成的相关性"""
    text = f"{skill_name} {description}".lower()
    score = 0
    for kw in RELEVANCE_KEYWORDS:
        if kw.lower() in text:
            score += 1
    return score


def scan_new_skills():
    """扫描 ~/.workbuddy/skills/ 发现新技能"""
    ensure_evo_dir()
    known = load_json("known_skills.json")
    known_names = {s.get("name", "") for s in known}
    
    new_skills = []
    
    if not os.path.exists(SKILLS_DIR):
        print(f"⚠️ 技能目录不存在: {SKILLS_DIR}")
        return new_skills
    
    for skill_dir in sorted(os.listdir(SKILLS_DIR)):
        skill_path = os.path.join(SKILLS_DIR, skill_dir)
        if not os.path.isdir(skill_path):
            continue
        
        # 读取 SKILL.md 获取描述
        description = ""
        skill_md = os.path.join(skill_path, "SKILL.md")
        if os.path.exists(skill_md):
            with open(skill_md, 'r', errors='ignore') as f:
                for line in f:
                    if 'description:' in line:
                        description = line.split('description:')[-1].strip().strip('>| ')
                        break
        
        # 判断是否已知
        if skill_dir not in known_names:
            relevance = assess_relevance(skill_dir, description)
            if relevance >= 2:  # 相关性阈值
                new_skills.append({
                    "name": skill_dir,
                    "description": description[:100],
                    "relevance_score": relevance,
                    "discovered_at": datetime.now().isoformat(),
                    "status": "new",
                })
                print(f"  🔍 发现新技能: {skill_dir} (相关度:{relevance})")
        else:
            # 检查版本变更
            for known_skill in known:
                if known_skill.get("name") == skill_dir:
                    # 已有记录，检查新增的属性
                    pass
    
    # 更新已知列表
    for ns in new_skills:
        known.append(ns)
    save_json("known_skills.json", known)
    
    return new_skills


# ═══════════════════════════════════════════════════════════
# 2. 使用追踪引擎
# ═══════════════════════════════════════════════════════════

def log_usage(content_type, template_used, modes_used, success=True):
    """记录一次使用"""
    ensure_evo_dir()
    usage = load_json("usage_log.json")
    
    entry = {
        "timestamp": datetime.now().isoformat(),
        "content_type": content_type,
        "template": template_used,
        "modes_used": modes_used,
        "success": success,
        "graphics_count": 0,
    }
    usage.append(entry)
    
    # 只保留最近100条
    if len(usage) > 100:
        usage = usage[-100:]
    
    save_json("usage_log.json", usage)
    
    # 更新模板统计
    stats = load_json("template_stats.json")
    if template_used not in stats:
        stats[template_used] = {"count": 0, "success": 0}
    stats[template_used]["count"] += 1
    if success:
        stats[template_used]["success"] += 1
    save_json("template_stats.json", stats)


# ═══════════════════════════════════════════════════════════
# 3. 错误学习引擎
# ═══════════════════════════════════════════════════════════

def log_error(error_type, description, resolution=""):
    """记录一次错误"""
    ensure_evo_dir()
    errors = load_json("error_log.json")
    
    entry = {
        "timestamp": datetime.now().isoformat(),
        "type": error_type,
        "description": description,
        "resolution": resolution,
        "fixed": bool(resolution),
    }
    errors.append(entry)
    
    # 只保留最近50条
    if len(errors) > 50:
        errors = errors[-50:]
    
    save_json("error_log.json", errors)


# ═══════════════════════════════════════════════════════════
# 4. 模板优化引擎
# ═══════════════════════════════════════════════════════════

def get_template_recommendation(content_type):
    """根据使用统计推荐最佳模板"""
    stats = load_json("template_stats.json")
    
    # 找到该内容类型下成功率最高的模板
    best_template = None
    best_score = -1
    
    for tmpl, data in stats.items():
        if tmpl.startswith(content_type) or content_type in tmpl:
            score = data["success"] / max(data["count"], 1)
            if score > best_score:
                best_score = score
                best_template = tmpl
    
    return best_template


# ═══════════════════════════════════════════════════════════
# 5. 进化摘要生成
# ═══════════════════════════════════════════════════════════

def generate_summary():
    """生成进化摘要"""
    ensure_evo_dir()
    
    known = load_json("known_skills.json")
    usage = load_json("usage_log.json")
    errors = load_json("error_log.json")
    stats = load_json("template_stats.json")
    
    lines = []
    lines.append("# 技能进化摘要")
    lines.append(f"> 生成时间：{datetime.now().strftime('%Y-%m-%d %H:%M')}")
    lines.append("")
    
    # 技能统计
    lines.append("## 技能生态")
    lines.append(f"- 已知技能：{len(known)} 个")
    lines.append(f"- 待发现：扫描 ~/.workbuddy/skills/ 获取最新")
    lines.append("")
    
    # 使用统计
    lines.append("## 使用统计")
    lines.append(f"- 总使用次数：{len(usage)}")
    if usage:
        last = usage[-1]
        lines.append(f"- 最近使用：{last.get('content_type', '未知')} ({last['timestamp'][:10]})")
    lines.append("")
    
    # 模板统计
    lines.append("## 模板使用排名")
    sorted_stats = sorted(stats.items(), key=lambda x: x[1]["count"], reverse=True)
    for tmpl, data in sorted_stats[:5]:
        rate = data["success"] / max(data["count"], 1) * 100
        lines.append(f"- {tmpl}: {data['count']}次 (成功率{rate:.0f}%)")
    lines.append("")
    
    # 错误分析
    lines.append("## 错误分析")
    if errors:
        error_types = {}
        for e in errors:
            et = e.get("type", "unknown")
            error_types[et] = error_types.get(et, 0) + 1
        for et, count in sorted(error_types.items(), key=lambda x: x[1], reverse=True)[:5]:
            lines.append(f"- {et}: {count}次")
    else:
        lines.append("- 暂无错误记录")
    
    summary = "\n".join(lines)
    
    with open(os.path.join(EVO_DIR, "evolution_summary.md"), 'w') as f:
        f.write(summary)
    
    return summary


# ═══════════════════════════════════════════════════════════
# 主入口
# ═══════════════════════════════════════════════════════════

def main():
    if len(sys.argv) < 2:
        print("用法: python self_evolution.py <命令>")
        print("命令:")
        print("  scan    扫描 ~/.workbuddy/skills/ 发现新技能")
        print("  status  查看进化状态摘要")
        print("  log     查看使用日志摘要")
        print("  summary 生成进化摘要")
        return
    
    cmd = sys.argv[1]
    
    if cmd == "scan":
        print("🔍 正在扫描技能目录...")
        print(f"   目标: {SKILLS_DIR}")
        new_skills = scan_new_skills()
        if new_skills:
            print(f"\n✅ 发现 {len(new_skills)} 个新技能:")
            for s in new_skills:
                print(f"   - {s['name']} (相关度:{s['relevance_score']})")
        else:
            print("\n✅ 未发现新技能")
    
    elif cmd == "status":
        known = load_json("known_skills.json")
        usage = load_json("usage_log.json")
        errors = load_json("error_log.json")
        
        print("📊 技能自进化系统 — 状态")
        print(f"{'='*40}")
        print(f"  已知技能:     {len(known)}")
        print(f"  使用记录:     {len(usage)}")
        print(f"  错误记录:     {len(errors)}")
        print(f"  新技能待查:   {sum(1 for s in known if s.get('status') == 'new')}")
        print(f"{'='*40}")
        print("  技能领域分布:")
        for domain, skills in STANDARD_SKILLS.items():
            print(f"    {domain}: {', '.join(skills)}")
    
    elif cmd == "log":
        usage = load_json("usage_log.json")
        if not usage:
            print("📝 暂无使用记录")
            return
        print(f"📝 使用日志 (最近{len(usage)}条):")
        for i, entry in enumerate(usage[-10:]):
            status = "✅" if entry.get("success") else "❌"
            ct = entry.get("content_type", "未知")
            tmpl = entry.get("template", "未知")
            ts = entry["timestamp"][:19]
            print(f"  {status} [{ts}] {ct} → {tmpl}")
    
    elif cmd == "summary":
        summary = generate_summary()
        print("📋 进化摘要已生成:")
        print(summary)
    
    else:
        print(f"❌ 未知命令: {cmd}")


if __name__ == '__main__':
    main()


path: references/self_repair.py
content: #!/usr/bin/env python3
"""
S13 技能自修复引擎 — 每次PPT生成后自动分析问题、更新SKILL.md
版本: v6 consulting-report-generator
"""

import os
import re
import json
from datetime import datetime

SKILL_BASE = os.path.expanduser("~/.workbuddy/skills/consulting-report-generator")
SKILL_MD = os.path.join(SKILL_BASE, "SKILL.md")
EVOLUTION_DIR = os.path.join(SKILL_BASE, "self_evolution")
ERROR_LOG = os.path.join(EVOLUTION_DIR, "error_log.json")
IMPROVEMENTS_LOG = os.path.join(EVOLUTION_DIR, "improvements.json")
SUMMARY_FILE = os.path.join(EVOLUTION_DIR, "evolution_summary.md")


def load_json(path):
    """加载JSON文件"""
    if not os.path.exists(path):
        return []
    with open(path, 'r', encoding='utf-8') as f:
        return json.load(f)


def save_json(path, data):
    """保存JSON文件"""
    os.makedirs(os.path.dirname(path), exist_ok=True)
    with open(path, 'w', encoding='utf-8') as f:
        json.dump(data, f, ensure_ascii=False, indent=2)


def load_skill_md():
    """加载SKILL.md全文"""
    if not os.path.exists(SKILL_MD):
        return ""
    with open(SKILL_MD, 'r', encoding='utf-8') as f:
        return f.read()


def save_skill_md(content):
    """保存SKILL.md"""
    with open(SKILL_MD, 'w', encoding='utf-8') as f:
        f.write(content)


# =====================================================
# 问题收集
# =====================================================

def collect_issues_from_log():
    """从error_log.json收集未修复的问题"""
    errors = load_json(ERROR_LOG)
    pending = [e for e in errors if not e.get("fixed", False)]
    return pending


def collect_issues_from_run(run_errors, user_feedback=""):
    """从运行过程中收集问题"""
    issues = {
        "errors": [],
        "warnings": [],
        "user_feedback": [],
        "improvements": [],
    }
    
    # 运行时异常
    for err in run_errors:
        issues["errors"].append(err)
    
    # 用户反馈关键词提取
    if user_feedback:
        feedback_keywords = {
            "打不开": "文件损坏需修复",
            "修复": "文件兼容性问题",
            "方块": "中文显示异常",
            "乱码": "文字编码问题",
            "重叠": "文字重叠",
            "空白": "内容未显示",
            "风格": "模板风格问题",
            "颜色": "配色问题",
            "太短": "内容不够详细",
            "太简单": "内容深度不足",
            "数据不对": "数据准确性",
        }
        for kw, desc in feedback_keywords.items():
            if kw in user_feedback:
                issues["user_feedback"].append({"keyword": kw, "description": desc})
    
    return issues


# =====================================================
# 问题分级
# =====================================================

def classify_issue(issue):
    """对问题分级: P0致命/P1严重/P2一般/P3优化"""
    p0_keywords = ["打不开", "崩溃", "损坏", "无法打开", "空指针", "crash"]
    p1_keywords = ["方块", "乱码", "重叠", "空白", "缺失", "显示异常"]
    p2_keywords = ["搜索不到", "数据不准确", "风格不对", "内容不全"]
    p3_keywords = ["可以更好", "优化", "建议", "美观"]
    
    desc = str(issue.get("description", "")).lower()
    
    for kw in p0_keywords:
        if kw in desc:
            return "P0"
    for kw in p1_keywords:
        if kw in desc:
            return "P1"
    for kw in p2_keywords:
        if kw in desc:
            return "P2"
    for kw in p3_keywords:
        if kw in desc:
            return "P3"
    return "P2"


# =====================================================
# SKILL.md 更新操作
# =====================================================

def is_error_already_documented(error_text):
    """检查错误是否已在SKILL.md的常见错误中出现"""
    content = load_skill_md()
    if not content:
        return False
    # 检查错误描述是否已在「常见错误与修复」章节中
    error_section = content.split("## 十二、常见错误与修复")[-1] if "## 十二、常见错误与修复" in content else ""
    if not error_section:
        return False
    # 用关键片段匹配
    keywords = error_text[:20]  # 取前20字
    return keywords in error_section


def append_error_to_skill_md(error_text, cause_text, fix_text, error_number=None):
    """向SKILL.md追加新的错误条目"""
    content = load_skill_md()
    if not content:
        return
    
    # 自动计算错误编号
    if error_number is None:
        error_pattern = re.findall(r'### 错误(\d+)', content)
        if error_pattern:
            error_number = max(int(n) for n in error_pattern) + 1
        else:
            error_number = 10  # 当前已有9个
    
    # 标签
    tag = "【v6 新增】" if error_number >= 8 else ""
    new_entry = f"""
### 错误{error_number}：{error_text} {tag}
**原因**：{cause_text}
**修复**：{fix_text}
"""
    
    # 追加到「常见错误与修复」章节末尾
    marker = "---\n\n## 十三、技能自进化系统"
    if marker in content:
        content = content.replace(marker, f"{new_entry}\n{marker}")
    else:
        # fallback: 文件末尾追加
        content += f"\n{new_entry}\n"
    
    save_skill_md(content)
    print(f"🛠️ 自修复完成：已在SKILL.md追加「错误{error_number}：{error_text}」")


def update_function_spec(func_name, new_spec):
    """更新助手函数的实现规范"""
    content = load_skill_md()
    if not content:
        return
    
    # 在「助手函数规范」表中更新
    table_pattern = re.compile(r'\| `' + re.escape(func_name) + r'`[^|]*\|')
    if table_pattern.search(content):
        # 找到函数名称在当前行的行
        lines = content.split('\n')
        for i, line in enumerate(lines):
            if f"`{func_name}`" in line and line.strip().startswith("|"):
                # 更新用途描述
                parts = line.split('|')
                if len(parts) >= 3:
                    parts[2] = f" {new_spec} "
                    lines[i] = '|'.join(parts)
                    break
        save_skill_md('\n'.join(lines))
        print(f"🛠️ 自修复完成：已更新函数 `{func_name}()` 规范")


def append_checklist_item(item_text):
    """追加交付检查项"""
    content = load_skill_md()
    if not content:
        return
    
    marker = "- [ ] ✅ **【S13新增】** 技能自修复已执行"
    new_item = f"- [ ] ✅ **【S13新增】** {item_text}"
    
    if new_item in content:
        return  # 已存在
    
    if marker in content:
        content = content.replace(marker, f"{new_item}\n{marker}")
        save_skill_md(content)
        print(f"🛠️ 自修复完成：已追加检查项「{item_text}」")


# =====================================================
# 版本号管理
# =====================================================

def update_version_number():
    """更新小版本号"""
    content = load_skill_md()
    if not content:
        return
    
    # 匹配 v6.x 格式
    match = re.search(r'v(\d+)\.(\d+)', content)
    if match:
        major = match.group(1)
        minor = int(match.group(2)) + 1
        new_version = f"v{major}.{minor}"
        content = content.replace(f"v{major}.{match.group(2)}", new_version, 1)
        save_skill_md(content)
        print(f"🛠️ 版本号升级: {new_version}")
        return new_version
    return None


# =====================================================
# 进化日志输出
# =====================================================

def write_evolution_summary(issues, repair_count):
    """写入进化摘要"""
    os.makedirs(EVOLUTION_DIR, exist_ok=True)
    
    summary = f"""## S13 自修复报告 ({datetime.now().strftime('%Y-%m-%d %H:%M')})

### 问题概览
- 总问题数: {len(issues['errors'])}
- 已修复数: {repair_count}
- 用户反馈: {len(issues['user_feedback'])} 条

### 修复详情
"""
    
    for err in issues.get("errors", []):
        level = classify_issue(err)
        summary += f"- [{level}] {err.get('description','')}\n"
        if err.get("fix"):
            summary += f"  → 修复: {err['fix']}\n"
    
    with open(SUMMARY_FILE, 'w', encoding='utf-8') as f:
        f.write(summary)
    
    print(f"📝 进化摘要已更新: {SUMMARY_FILE}")


# =====================================================
# 主入口
# =====================================================

def self_repair(run_errors=None, user_feedback=""):
    """
    S13 技能自修复主函数
    
    参数:
        run_errors: 本次运行的错误列表 [{"description":"...", "root_cause":"...", "fix":"...", "level":"P0"}, ...]
        user_feedback: 用户反馈文本
    
    返回:
        repair_count: 本次修复的问题数量
    """
    print("=" * 50)
    print("🔄 S13 技能自修复引擎启动")
    print("=" * 50)
    
    if run_errors is None:
        run_errors = []
    
    # 1. 收集问题
    issues = collect_issues_from_run(run_errors, user_feedback)
    log_issues = collect_issues_from_log()
    issues["errors"].extend(log_issues)
    
    print(f"📋 收集到 {len(issues['errors'])} 个错误, {len(issues['user_feedback'])} 条反馈")
    
    # 2. 分级并修复
    repair_count = 0
    for issue in issues["errors"]:
        level = classify_issue(issue)
        issue["level"] = level
        
        if level in ("P0", "P1") and not is_error_already_documented(issue.get("description", "")):
            append_error_to_skill_md(
                error_text=issue.get("description", ""),
                cause_text=issue.get("root_cause", "待分析"),
                fix_text=issue.get("fix", "待确定")
            )
            
            # 如果有配套的函数更新
            if issue.get("function_to_update"):
                update_function_spec(issue["function_to_update"], issue.get("new_spec", ""))
            
            # 如果有配套的检查项
            if issue.get("new_checklist_item"):
                append_checklist_item(issue["new_checklist_item"])
            
            # 标记为已修复
            issue["fixed"] = True
            repair_count += 1
    
    # 3. 更新错误日志
    save_json(ERROR_LOG, issues["errors"])
    
    # 4. 写入进化摘要
    write_evolution_summary(issues, repair_count)
    
    # 5. 如果有P0修复，升级小版本
    if any(i.get("level") == "P0" for i in issues["errors"]):
        update_version_number()
    
    # 6. 输出报告
    print(f"\n{'=' * 50}")
    print(f"✅ S13 自修复完成 | 修复: {repair_count} 项 | 累计: 查看 evolution_summary.md")
    print(f"{'=' * 50}")
    
    return repair_count


# =====================================================
# 使用示例
# =====================================================
if __name__ == "__main__":
    # 模拟：本次运行遇到的错误
    example_errors = [
        {
            "description": "PPT生成后PowerPoint打开提示'需要修复'",
            "root_cause": "full_cleanup()使用replace字符串替换而非正则移除p:style完整节点",
            "fix": "改用re.sub彻底移除<p:style>...</p:style>完整节点，清理空<a:ln/>，移除a:themeShadow",
            "function_to_update": "full_cleanup",
            "new_spec": "深度XML净化（正则移除p:style+空ln+themeShadow，补齐typeface）",
            "new_checklist_item": "执行 full_cleanup()（正则完整移除p:style+空ln+themeShadow）",
        }
    ]
    
    # 用户反馈
    user_feedback = "文件打不开，PowerPoint提示需要修复"
    
    # 执行自修复
    self_repair(example_errors, user_feedback)


path: references/warehouse_logistics.md
content: # 仓储物流调研指南

## 调研目标
- 评估仓储管理规范化水平
- 识别物料流转效率瓶颈
- 评估仓库信息化程度

## 调研重点

### 1. 仓库管理
- 仓库布局（平面仓/立体仓/阁楼式）
- 库位管理（固定库位/随机库位/WMS管理）
- 收货流程与验收标准
- 上架策略
- 先进先出(FIFO)执行情况

### 2. 库存准确率
- 盘点制度（周期盘点/年度盘点？）
- 库存准确率（实物vs系统）
- 盘点差异处理机制
- 循环盘点执行情况

### 3. 物料配送
- 物料配送方式（领料/配送制？）
- 配送频次与时机
- 线边仓管理
- 退料/补料流程

### 4. 成品发货
- 成品入库流程
- 发货流程（拣货→打包→装车）
- 发货准确率
- 物流跟踪

### 5. 信息系统
- WMS系统使用
- 条码/RFID应用
- 与ERP数据同步

## 常见问题诊断库

| 问题现象 | 可能根因 | 典型影响 |
|---------|---------|---------|
| 库存准确率低 | 出入库扫码缺失/盘点不到位 | 计划不准/缺料/超采 |
| 找不到货 | 库位管理不规范/WMS缺失 | 效率低/盘点难 |
| 先进先出执行差 | 库位规划不合理/无系统管控 | 呆滞料/过期风险 |
| 领料时间长 | 领料制/物料不按工单配送 | 产线等待/效率损失 |
| 物料配送混乱 | 无配送标准/配送频次不合理 | 线边拥挤/缺料 |
| 仓库空间利用率低 | 布局不合理/无库位优化 | 仓储成本高/扩展难 |
| 发货出错 | 拣货无校验/打包无复核 | 客户投诉/退货成本 |


path: references_industry_search/iresearch-api.md
content: # Report Source Notes

## Primary Sources

- Report list API: https://www.iresearch.com.cn/api/products/GetReportList
- Report detail page: https://report.iresearch.cn/report/YYYYMM/NNNN.shtml
- Online reader page: https://report.iresearch.cn/report_pdf.aspx?id=NNNN
- QuestMobile report listing page: https://www.questmobile.com.cn/research/reports/
- QuestMobile report detail page: https://www.questmobile.com.cn/research/report/NNNN

## List API Parameters

| Parameter | Meaning | Example |
|-----------|---------|---------|
| `fee` | 是否只看免费报告。当前 skill 固定优先 `0` | `0` |
| `date` | 日期过滤，默认空字符串 | `` |
| `lastId` | 翻页游标，下一页用上一页最后一条的 `Id` | `freport.4695` |
| `pageSize` | 每页数量 | `12` |

## Verified Behavior

- The iResearch free-report API works with minimal browser headers and does not require hardcoded cookies
- iResearch pagination uses the last item `Id` from the previous page as the next `lastId`
- Key iResearch JSON fields:

| Field | Meaning |
|-------|---------|
| `Id` | Cursor report ID, for example `freport.4694` |
| `NewsId` | Numeric report ID, for example `4694` |
| `Title` | Report title |
| `Content` | List summary |
| `Keyword` | Keyword array |
| `industry` | Industry label |
| `Uptime` | Publish timestamp |
| `views` | View count |
| `VisitUrl` | Detail page URL |

## QuestMobile Listing Behavior

- QuestMobile exposes a public paginated JSON endpoint:

```text
https://www.questmobile.com.cn/api/v2/report/article-list?version=0&pageSize=6&pageNo=1&industryId=-1&labelId=-1
```

- The listing page embeds this endpoint and its SSR response state
- The endpoint returns paginated data including `currentPage`, `totalPage`, `limit`, and `data`
- Key QuestMobile list fields include:

| Field | HTML Hint |
|-------|-----------|
| `id` | Report ID |
| `title` | Report title |
| `introduction` | Short public summary |
| `publishTime` | Publish date |
| `industryList` | Industry labels |
| `labelList` | Keyword labels |
| `coverImgUrl` | Card cover image |

- The HTML card structure can still be used as a fallback, but the API is the preferred source for deeper pagination

## QuestMobile Detail Behavior

- QuestMobile detail pages are UTF-8 HTML pages
- Useful stable fields include:

| Field | HTML Hint |
|-------|-----------|
| Title | `<h1>` |
| Meta summary | `<meta name="description">` |
| Industry | `行业：<span>...` block |
| Keywords | `关键词：</strong><span>...` block |
| Published date | date span in `dataAndsource` |
| Source | `来源：QuestMobile研究院` |
| Intro summary | `.daoyu` block |
| Section headings | `<h3>` and `<h4>` in the article body |
| Images | `https://ws.questmobile.cn/report/article/images/...png` |

## Encoding

- The iResearch list API is standard UTF-8 JSON
- iResearch detail pages and online reader pages should be decoded as `gb18030`
- QuestMobile listing and detail pages can be decoded as UTF-8

## Detail Page Anchors

The current script relies on these iResearch anchors:

- `<h3>报告简介</h3>`
- `<h3>目录</h3>`
- `<h3>图表目录</h3>`
- `所属行业：`
- `报告类型：`
- `页数：`
- `图表：`
- `在线浏览`

## Online Reader Notes

- The iResearch online reader is an image stream
- Image URLs look like:

```text
https://pic.iresearch.cn/rimgs/4694/1.jpg
https://pic.iresearch.cn/rimgs/4694/2.jpg
```

- The exposed image count may be lower than the reported page count because public image availability can vary

## Recommended Workflow

1. Use the iResearch list API for primary recall and rough ranking
2. Use QuestMobile public report cards as the secondary source pool
2. Use QuestMobile `article-list` pagination for deeper secondary-source coverage
3. Enrich chosen iResearch hits with detail pages, catalog, chart catalog, and online reader images when needed
4. Enrich chosen QuestMobile hits with detail-page intro text, headings, and body images when needed
5. When mixed-source results are shown, group them by source with iResearch first and QuestMobile second
6. Only after those two groups should any other source appear

path: scripts/consulting_report_generator.py
content: #!/usr/bin/env python3
"""调研报告生成辅助工具 - 结构化输出报告框架"""

from datetime import datetime


def generate_report_outline():
    """生成调研报告框架"""
    client = input("客户名称: ")
    date = datetime.now().strftime("%Y-%m-%d")
    
    print("\n" + "=" * 60)
    print("  调研报告框架生成")
    print("=" * 60)
    
    print(f"\n客户: {client}")
    print(f"日期: {date}")
    
    sections = {
        "1. 项目概述": [
            "1.1 项目背景",
            "1.2 调研范围与对象",
            "1.3 调研日程与方法"
        ],
        "2. 企业现状": [
            "2.1 企业基本情况",
            "2.2 组织架构",
            "2.3 主要产品与工艺",
            "2.4 信息化现状"
        ],
        "3. 核心绩效现状": [
            "3.1 运营KPI总览",
            "3.2 各维度绩效分析"
        ],
        "4. 销售与订单管理诊断": [
            "4.1 流程现状",
            "4.2 关键发现",
            "4.3 根因分析",
            "4.4 改善方向"
        ],
        "5. 生产计划诊断": [
            "5.1 流程现状",
            "5.2 关键发现",
            "5.3 根因分析",
            "5.4 改善方向"
        ],
        "6. 生产现场诊断": [
            "6.1 现场现状",
            "6.2 关键发现",
            "6.3 根因分析",
            "6.4 改善方向"
        ],
        "7. 采购诊断": [
            "7.1 流程现状",
            "7.2 关键发现",
            "7.3 根因分析",
            "7.4 改善方向"
        ],
        "8. 仓储物流诊断": [
            "8.1 现状",
            "8.2 关键发现",
            "8.3 改善方向"
        ],
        "9. 质量管理诊断": [
            "9.1 现状",
            "9.2 关键发现",
            "9.3 改善方向"
        ],
        "10. 工艺技术诊断": [
            "10.1 现状",
            "10.2 关键发现",
            "10.3 改善方向"
        ],
        "11. 问题总结与优先级": [
            "11.1 TOP10问题清单",
            "11.2 根因归类分析"
        ],
        "12. 改善方向与项目规划": [
            "12.1 精益改善方向",
            "12.2 数字化方向",
            "12.3 组织流程方向",
            "12.4 改善路线图"
        ],
        "13. 合作建议": [
            "13.1 合作模式",
            "13.2 实施路径",
            "13.3 价值展望"
        ]
    }
    
    print(f"\n📋 报告结构 ({client} 调研报告)")
    print("=" * 40)
    for section, items in sections.items():
        print(f"\n{section}")
        for item in items:
            print(f"  ├─ {item}")
    
    # 生成具体的发现数据表
    print(f"\n\n🔍 请为每个部门录入关键发现:")
    all_findings = {}
    depts = {
        "销售": "参考: 接单流程/预测/变更/OTD",
        "计划": "参考: MPS/MRP/排产/库存/齐套",
        "生产": "参考: OEE/C/T/换型/5S/异常",
        "采购": "参考: 供应商/周期/来料不良",
        "仓储": "参考: 库位/盘点/准确率/配送",
        "质量": "参考: IQC/IPQC/OQC/追溯",
        "工艺": "参考: BOM/ECN/SOP/NPI"
    }
    
    for dept, hint in depts.items():
        findings = []
        print(f"\n--- {dept} ({hint}) ---")
        while True:
            finding = input(f"  发现(空行结束): ").strip()
            if not finding:
                break
            findings.append(finding)
        if findings:
            all_findings[dept] = findings
    
    # 按优先级排列输出
    print("\n\n" + "=" * 60)
    print("  📊 发现汇总 - 按部门")
    print("=" * 60)
    for dept, findings in all_findings.items():
        print(f"\n{dept}:")
        for i, f in enumerate(findings, 1):
            print(f"  {i}. {f}")
    
    return all_findings


def generate_improvement_list():
    """生成改善项目清单"""
    print("\n" + "=" * 60)
    print("  改善项目清单生成")
    print("=" * 60)
    
    projects = []
    while True:
        name = input("\n项目名称(空行结束): ").strip()
        if not name:
            break
        p_type = input("类型(1=速赢 2=重点改善 3=数字化 4=战略): ")
        p_priority = input("优先级(1/2/3): ")
        benefit = input("预期年效益(万元): ")
        investment = input("投入估算(万元): ")
        duration = input("预计周期(月): ")
        
        type_map = {"1": "速赢", "2": "重点改善", "3": "数字化", "4": "战略"}
        pri_map = {"1": "P1", "2": "P2", "3": "P3"}
        
        projects.append({
            "name": name,
            "type": type_map.get(p_type, "重点改善"),
            "priority": pri_map.get(p_priority, "P2"),
            "benefit": float(benefit) if benefit else 0,
            "investment": float(investment) if investment else 0,
            "duration": duration
        })
    
    if not projects:
        return
    
    print("\n" + "=" * 60)
    print("  📋 改善项目清单")
    print("=" * 60)
    print(f"{'序号':<4} {'项目名称':<16} {'类型':<10} {'优先级':<6} {'投入(万)':<10} {'年效益(万)':<12} {'ROI(月)':<8}")
    print("-" * 66)
    
    for i, p in enumerate(projects, 1):
        roi = (p["investment"] / p["benefit"] * 12) if p["benefit"] > 0 else 0
        name_short = p["name"][:14] + ".." if len(p["name"]) > 14 else p["name"]
        print(f"{i:<4} {name_short:<16} {p['type']:<10} {p['priority']:<6} {p['investment']:<10.1f} {p['benefit']:<12.1f} {roi:<8.1f}")
    
    total_inv = sum(p["investment"] for p in projects)
    total_ben = sum(p["benefit"] for p in projects)
    print("-" * 66)
    print(f"{'合计':<20} {'':<16} {total_inv:<10.1f} {total_ben:<12.1f} ROI:{total_inv/total_ben*12:.1f}月" if total_ben > 0 else "")


def main():
    print("📋 咨询报告生成辅助工具")
    print("=" * 60)
    print("1. 生成调研报告框架+发现录入")
    print("2. 生成改善项目清单")
    print("0. 退出")
    
    while True:
        choice = input("\n请选择 (0-2): ").strip()
        if choice == "1":
            generate_report_outline()
        elif choice == "2":
            generate_improvement_list()
        elif choice == "0":
            print("感谢使用！")
            break
        else:
            print("无效选择")


if __name__ == "__main__":
    main()


path: scripts/diagnosis_analyzer.py
content: #!/usr/bin/env python3
"""诊断分析辅助工具 - 问题整理与优先级评估"""


def collect_problems():
    """问题采集与整理"""
    print("\n" + "=" * 60)
    print("  调研问题采集与整理")
    print("=" * 60)
    
    problems = []
    departments = ["销售", "计划", "生产", "采购", "仓储物流", "质量", "工艺"]
    
    while True:
        print(f"\n--- 第{len(problems)+1}个问题 ---")
        dept = input(f"涉及部门({'/'.join(departments)}): ").strip()
        if not dept:
            break
        if dept not in departments:
            print(f"⚠️ 部门名称不正确，可选: {', '.join(departments)}")
            continue
        
        desc = input("问题描述: ")
        data = input("数据支撑（如无数据按Enter跳过）: ")
        
        print("严重程度(1-5, 5=最严重): ", end="")
        severity = int(input() or "3")
        print("紧迫程度(1-5, 5=最紧迫): ", end="")
        urgency = int(input() or "3")
        
        problems.append({
            "dept": dept, "desc": desc, "data": data,
            "severity": severity, "urgency": urgency
        })
        print(f"✅ 已记录")
    
    return problems


def calculate_priorities(problems):
    """计算优先级分数"""
    for p in problems:
        p["priority_score"] = p["severity"] * 0.6 + p["urgency"] * 0.4
        p["priority_level"] = "P1" if p["priority_score"] >= 4.0 else ("P2" if p["priority_score"] >= 2.5 else "P3")
    return sorted(problems, key=lambda x: x["priority_score"], reverse=True)


def generate_report(problems):
    """生成问题清单总结"""
    if not problems:
        print("无问题数据")
        return
    
    print("\n" + "=" * 60)
    print("  📋 问题清单总结")
    print("=" * 60)
    
    table_header = f"{'序号':<4} {'部门':<8} {'问题':<30} {'严重度':<6} {'紧迫度':<6} {'优先级':<6}"
    print(table_header)
    print("-" * 60)
    
    for i, p in enumerate(problems, 1):
        desc_short = p["desc"][:28] + ".." if len(p["desc"]) > 28 else p["desc"]
        print(f"{i:<4} {p['dept']:<8} {desc_short:<30} {p['severity']:<6} {p['urgency']:<6} {p['priority_level']:<6}")
    
    print("-" * 60)
    
    # 统计
    p1 = [p for p in problems if p["priority_level"] == "P1"]
    p2 = [p for p in problems if p["priority_level"] == "P2"]
    p3 = [p for p in problems if p["priority_level"] == "P3"]
    
    print(f"\n📊 统计:")
    print(f"  P1(高优先): {len(p1)} 个")
    print(f"  P2(中优先): {len(p2)} 个")
    print(f"  P3(低优先): {len(p3)} 个")
    print(f"  总计: {len(problems)} 个")
    
    print(f"\n📌 按部门分布:")
    dept_count = {}
    for p in problems:
        dept_count[p["dept"]] = dept_count.get(p["dept"], 0) + 1
    for dept in sorted(dept_count.keys()):
        bar = "█" * dept_count[dept]
        print(f"  {dept:<8} {dept_count[dept]:>2}个 {bar}")


def cross_check():
    """跨部门问题交叉验证"""
    print("\n" + "=" * 60)
    print("  跨部门问题交叉验证")
    print("=" * 60)
    
    print("输入不同部门对同一问题的描述，分析认知差异")
    
    issues = []
    while True:
        issue = input("\n问题名称(空行结束): ").strip()
        if not issue:
            break
        print(f"  A部门描述: ", end="")
        view_a = input()
        print(f"  B部门描述: ", end="")
        view_b = input()
        issues.append((issue, view_a, view_b))
    
    for issue, a, b in issues:
        print(f"\n  📍 {issue}")
        overlap = len(set(a.split()) & set(b.split()))
        if overlap > 3:
            print(f"     ✅ 两部门认知一致")
        else:
            print(f"     ⚠️ 两部门存在认知差异，需进一步核实")
            print(f"     A说: {a}")
            print(f"     B说: {b}")


def improvement_mapping():
    """问题-改善方向映射"""
    print("\n" + "=" * 60)
    print("  问题-改善方向映射")
    print("=" * 60)
    
    directions = {
        "1": ("精益生产", ["5S", "SMED", "TPM", "VSM", "看板", "标准化", "线平衡", "Poka-Yoke"]),
        "2": ("数字化", ["MES", "WMS", "APS", "QMS", "BI", "IoT", "PLM", "数字孪生"]),
        "3": ("组织流程", ["S&OP", "KPI", "流程再造", "组织优化", "供应链协同", "计划集控"])
    }
    
    print("\n可选改善方向:")
    for k, (name, _) in directions.items():
        print(f"  {k}. {name}")
    print(f"  q. 完成")
    
    mappings = []
    while True:
        problem = input("\n要映射的问题描述(空行结束): ").strip()
        if not problem:
            break
        print("选择改善方向编号: ", end="")
        dir_choice = input().strip()
        if dir_choice in directions:
            dir_name, tools = directions[dir_choice]
            print(f"  可选工具/方法: {', '.join(tools)}")
            method = input("  选择具体方法: ").strip()
            mappings.append((problem, dir_name, method))
            print(f"  ✅ {problem} → {dir_name}/{method}")
        else:
            print("  ❌ 无效选择")
    
    if mappings:
        print(f"\n📋 映射结果:")
        for p, d, m in mappings:
            print(f"  {p:<30} → {d:<8} / {m}")


def main():
    print("📋 诊断分析辅助工具")
    print("=" * 60)
    print("1. 问题采集与优先级评估")
    print("2. 跨部门问题交叉验证")
    print("3. 问题-改善方向映射")
    print("0. 退出")
    
    while True:
        choice = input("\n请选择 (0-3): ").strip()
        if choice == "1":
            probs = collect_problems()
            if probs:
                sorted_probs = calculate_priorities(probs)
                generate_report(sorted_probs)
        elif choice == "2":
            cross_check()
        elif choice == "3":
            improvement_mapping()
        elif choice == "0":
            print("感谢使用！")
            break
        else:
            print("无效选择")


if __name__ == "__main__":
    main()


Security scan verdicts — ClawScan: suspicious | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (CRITICAL)