本技能通过结构化交互式访谈,自动完成专业的8D问题解决报告。AI分析用户问题描述,动态生成上下文感知的建议答案,输出符合制造业SQE标准的Word(.docx)格式报告。
核心设计理念:示例不是固定模板。每条建议根据用户实际场景(行业、问题类型、严重度、角色)动态生成,可直接使用。
用户描述问题(D0)
↓
AI场景锚定:推断行业、问题类型、严重度、角色
↓
用户确认场景
↓
D1-D8:每阶段批量提问 + ⚡动态上下文感知建议
↓
用户响应:接受建议/修改/替换/跳过
↓
全阶段完成后:质量门控检查 → 生成.docx报告
同时呈现4个问题,每个附带动态建议:
📋 D0 — 准备与计划
1. [必填] 问题概述 — 一句话描述发生了什么?
2. 首次发生还是重复问题?
3. 问题来源?(客户投诉 / 内部发现 / 供应商问题)
4. [必填] 严重度评估?(高 / 中 / 低)
分析D0回答后输出确认:
📌 场景推断:
行业:[制造业/软件开发/服务业/...]
问题类型:[外观不良/功能失效/安全/交付/合规/...]
来源:[客户投诉/内部发现/供应商]
严重度:[高/中/低]
角色:[供应商回复客户/内部流程改进/...]
✅ 确认无误?回复"确认"继续。
后续所有建议将基于此场景生成。
| 维度 | 推断方法 |
|---|---|
| ------ | --------- |
| 行业 | 关键词:产线/批次/工序→制造业; 版本/部署/日志→软件; 客户/流程→服务 |
| 问题类型 | 分类:外观/功能/安全/交付/合规 |
| 严重度 | 停线/召回/安全→高; 客诉/退货→中; 内部记录→低 |
| 角色 | 客户投诉→供应商回复客户; 内部发现→内部改进 |
关键:场景锚定驱动所有后续动态示例,必须在D1之前确认。
问题批次:
📋 D1 — 成立小组
1. [必填] 团队负责人姓名和部门?
⚡ 外观缺陷→质量部牵头; 功能失效→工程/研发部; 来料问题→SQE牵头
2. [必填] 团队成员(姓名|部门|角色)?
⚡ 根据问题类型推荐跨职能团队组成
3. 管理层支持者/倡导者?
⚡ 根据严重度推荐级别
4. 是否需要引入外部专家?
⚡ 来料问题→供应商专家; 特殊→外部实验室
质量门控: Q1(团队负责人) + Q2(至少2名成员)。
问题批次:
📋 D2 — 问题描述(5W2H)
1. [必填] What — 具体问题描述?缺陷/失效模式?
2. Who — 谁首先发现?(客户XX部门/内部XX岗位)
3. [必填] When — 发现时间?批次?频率?
4. [必填] Where — 发现地点/工序/位置?
5. Why — 为什么是问题?(客户/业务影响)
6. How — 检测方法?标准?
7. [必填] How Many — 受影响数量?不良率?趋势?
D2完成后,自动生成 Is/Is Not 分析框架:
| 维度 | Is (确认) | Is Not (已排除) |
|------|----------|----------------|
| 产品 | [受影响产品] | [同类未受影响] |
| 时间 | [发生时间段] | [之前正常时段] |
| 地点 | [发生地点] | [类似未发生地] |
| 缺陷 | [确认缺陷] | [已排查排除] |
| 批次 | [涉及批次] | [已验证正常] |
质量门控: What(Q1), When(Q3), Where(Q4), How Many(Q7) — 均需量化数据。
问题批次:
📋 D3 — 临时遏制措施
1. [必填] 已采取的紧急措施?
⚡ 高严重度: 暂停出货+100%全检+客户紧急通知+驻厂筛选+24h启动
中严重度: 加严抽检+批次隔离+通知客户+48h启动
低严重度: 标识隔离+通知相关方+趋势监控
2. [必填] 受影响产品是否已隔离/冻结?
3. [必填] 遏制措施何时实施?由谁执行?
4. 如何确保客户不受影响?(已发货产品处理)
5. 遏制措施的验证方法?
质量门控: 遏制措施(Q1) + 时间和责任人(Q3)。
📋 D4 — 根本原因分析
分析方法:
A. 5-Why 分析法 — 从现象逐层追问到根因
B. 鱼骨图分析法 — 从人/机/料/法/测/环六维度排查
推荐:[根据问题类型的更适方案]
根据已收集信息生成建议推理链:
⚡ 5-Why推理链(示例):
Why 1 (直接原因): [从D2现象推断物理/逻辑原因]
Why 2 (二级原因): [向上一级追溯]
Why 3 (逃逸原因): [从D2检测方法反向推断]
Why 4 (系统原因): [管理/流程层面]
Why 5 (根本原因): [系统性缺陷]
⚠️ 以上为建议方向,请基于实际调查确认或修改。
根据问题类型标注⭐优先维度:
⚡ 外观缺陷 → ⭐机(工装/模具/夹具) ⭐料(来料品质) ⭐法(SOP/工艺参数)
功能失效 → ⭐机(设备) ⭐法(工艺) ⭐料(元器件)
6. 逃逸点分析 — 为什么现有控制系统没有发现?
7. 根因验证方法?
质量门控: 根因明确(5-Why≥3层 或 鱼骨图≥3维度) + 验证方法。
📋 D5 — 永久纠正措施
1. 针对根因的永久方案?
2. 是否评估过备选方案?选择理由?
3. [必填] 行动计划(行动项 | 负责人 | 完成日期)
4. 验证/测试方法?
5. 是否有副作用/新风险?
质量门控: 至少1个行动项含负责人和日期(Q3)。
📋 D6 — 实施与验证
1. 永久方案何时正式实施?
2. 实施范围?(所有产品/产线/工厂)
3. [必填] 有效性验证方法?
4. [必填] 验证结果数据?(自动生成Before/After对比表)
5. 遗留品/受影响品是否已纠正?
📋 D7 — 防止再发生
1. [必填] 更新了哪些系统/流程文件?
2. 是否进行了相关培训?培训范围?
3. 是否有横向展开(Read Across)?
4. 管理层如何确认措施有效?
5. 预防措施的生效日期和责任人?
📋 D8 — 总结与认可
1. [必填] 关键经验教训?
2. 团队如何获得表彰/认可?
3. 此案例是否需要跨部门/跨工厂分享?
4. 结案声明
每个D阶段完成后显示:
进度:D0 ✅ → D1 ✅ → D2 ✅ → D3 ✅ → D4 ✅ → D5 ⬜ → D6 ⬜ → D7 ⬜ → D8 ⬜
报告完成度:[已收集 XX/YY 必填项]
使用python-docx从零创建专业的8D报告Word文档。模板为22行×7列的格式化表格,匹配制造业SQE报告风格:
模板结构:
| 行 | 内容 | 布局 | |
|---|---|---|---|
| ---- | ------ | ------ | |
| 0 | "Quality Department 8D Report" 标题栏 | 整行合并(深蓝底白字) | |
| 1 | Supplier Reference No | 8D Report No | 左右分区 |
| 2 | "EIGHT DISCIPLINE WORKSHEET(八步纠正措施报告)" | 整行合并(浅蓝底) | |
| 3-20 | D0-D8 每阶段2行(标题行+内容行) | 标题行分区+内容行整行合并 | |
| 21 | 签批预留行 | 整行合并 |
生成代码:
from docx import Document
from docx.shared import Pt, Inches, Cm, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.oxml.ns import qn
from docx.oxml import OxmlElement
import copy
def generate_8d_report(d0_d8_data, output_path):
"""
生成8D报告.docx文件。
d0_d8_data: dict, keys d0-d8, 每个值为字符串内容
output_path: 输出文件路径
"""
doc = Document()
# 页面设置 A4
section = doc.sections[0]
section.page_width = Cm(21)
section.page_height = Cm(29.7)
section.top_margin = Cm(1.27)
section.bottom_margin = Cm(1.27)
section.left_margin = Cm(1.27)
section.right_margin = Cm(1.27)
# 创建22行×7列表格
table = doc.add_table(rows=22, cols=7)
table.style = 'Table Grid'
# === 设置表格边框 ===
tbl = table._tbl
tblPr = tbl.tblPr if tbl.tblPr is not None else OxmlElement('w:tblPr')
borders = OxmlElement('w:tblBorders')
for edge in ('top', 'left', 'bottom', 'right', 'insideH', 'insideV'):
element = OxmlElement(f'w:{edge}')
element.set(qn('w:val'), 'single')
element.set(qn('w:sz'), '4')
element.set(qn('w:space'), '0')
element.set(qn('w:color'), '000000')
borders.append(element)
tblPr.append(borders)
def merge_cells(start_row, start_col, end_row, end_col):
"""合并单元格区域"""
cell_start = table.cell(start_row, start_col)
cell_end = table.cell(end_row, end_col)
cell_start.merge(cell_end)
def set_cell(table, row, col, text, font_size=9, bold=False,
font_color=None, font_name='Arial', alignment=None, bg_color=None):
"""设置单元格文本和格式"""
cell = table.cell(row, col)
# 清除现有内容
for p in cell.paragraphs:
p.clear()
p = cell.paragraphs[0]
if alignment is not None:
p.alignment = alignment
lines = text.split('\n')
for i, line in enumerate(lines):
if i == 0:
run = p.add_run(line)
else:
run = p.add_run()
run.add_break()
run = p.add_run(line)
run.font.name = font_name
run.font.size = Pt(font_size)
run.font.bold = bold
if font_color:
run.font.color.rgb = font_color
# 背景色
if bg_color:
shading = OxmlElement('w:shd')
shading.set(qn('w:fill'), bg_color)
shading.set(qn('w:val'), 'clear')
cell._tc.get_or_add_tcPr().append(shading)
# === Row 0: 标题 ===
merge_cells(0, 0, 0, 6)
set_cell(table, 0, 0, 'Quality Department 8D Report', font_size=14, bold=True,
font_color=RGBColor(0xFF, 0xFF, 0xFF), bg_color='003366',
alignment=WD_ALIGN_PARAGRAPH.CENTER)
# === Row 1: 参考号 ===
merge_cells(1, 0, 1, 4)
merge_cells(1, 5, 1, 6)
set_cell(table, 1, 0, 'Supplier Reference No: ____________________', font_size=9)
set_cell(table, 1, 5, '8D Report No: ________________________', font_size=9)
# === Row 2: 标题 ===
merge_cells(2, 0, 2, 6)
set_cell(table, 2, 0, 'EIGHT DISCIPLINE WORKSHEET\n(八步纠正措施报告)',
font_size=12, bold=True, bg_color='D9E2F3',
alignment=WD_ALIGN_PARAGRAPH.CENTER)
# === D0-D8 (rows 3-20) ===
phases = [
'D0: Plan & Prepare(准备与计划)',
'D1: Establish Team(成立小组)',
'D2: Problem Description(问题描述)',
'D3: Interim Containment Action / ICA(临时遏制措施)',
'D4: Root Cause Analysis(根本原因分析)',
'D5: Permanent Corrective Action / PCA(永久纠正措施)',
'D6: Implement & Validate PCA(实施与验证)',
'D7: Prevent Recurrence(预防再发生)',
'D8: Recognize Team(小组祝贺)',
]
for i, phase_name in enumerate(phases):
d_key = f'd{i}' if i > 0 else 'd0'
title_row = 3 + i * 2
content_row = title_row + 1
# 标题行
merge_cells(title_row, 0, title_row, 2)
merge_cells(title_row, 3, title_row, 4)
merge_cells(title_row, 5, title_row, 6)
set_cell(table, title_row, 0, phase_name, font_size=10, bold=True, bg_color='D9E2F3')
set_cell(table, title_row, 5, 'Date: ________________', font_size=9)
# 内容行
merge_cells(content_row, 0, content_row, 6)
content = d0_d8_data.get(d_key, f'[{d_key.upper()}] 待填写...')
set_cell(table, content_row, 0, content, font_size=9)
# === Row 21: 签批 ===
merge_cells(21, 0, 21, 6)
set_cell(table, 21, 0, '', font_size=9)
# 列宽
for col in table.columns:
col.width = Cm(2.35)
doc.save(output_path)
return output_path
按8D结构输出格式化的Markdown文本,适合内部共享、版本控制。
生成报告前逐一验证:
未通过项:通知用户补充或标记为"待补充"。
| 场景 | 操作 |
|---|---|
| ------ | ------ |
| 用户说"跳过此阶段" | 标记为"N/A",继续下一阶段 |
| 用户说"用建议1"/"用建议2" | 采纳动态建议作为答案 |
| 用户说"用建议1,但把XX改成YY" | 采纳建议并应用修改 |
| 用户仅部分回答 | 标记缺失关键项,追问 |
| 用户回答太模糊 | 生成上下文追问 |
| D0提示不需要8D | 建议A3或One-Pager,结束流程 |
| 用户想返回前一阶段 | 跳回,重新确认变更答案 |
| 全部完成但有空缺 | 展示已完成vs未完成摘要 |
详细方法论、问题库和分析工具指南,按需加载:
references/8d-methodology.md — 8D理论、行业标准、最佳实践references/question-bank.md — 完整问题集、追问策略、质量门控标准references/tools-guide.md — 5-Why、鱼骨图、Is/Is Not、FMEA联动指南共 1 个版本