质量管理与生产追溯
质量不是检验出来的,而是设计和生产出来的——追溯系统让问题有据可查,而 SPC 让问题在发生前就被发现。
质量管理体系架构
graph TD
DESIGN[设计质量\n DFMEA] --> PROCESS[过程质量\n PFMEA]
PROCESS --> CONTROL[生产控制\n SPC/控制图]
CONTROL --> INCOMING[来料检验\n IQC]
INCOMING --> INPROCESS[过程检验\n IPQC]
INPROCESS --> FINAL[出货检验\n FQC/OQC]
FINAL --> TRACE[批次追溯]
TRACE --> RECALL[问题召回]
TRACE --> IMPROVE[持续改善]
style CONTROL fill:#e3f2fd,stroke:#1565c0,stroke-width:2px
style TRACE fill:#c8e6c9,stroke:#388e3c,stroke-width:2px
SPC 统计过程控制
"""
SPC 控制图实现 — X-bar & R 图
"""
import math
from dataclasses import dataclass
@dataclass
class SampleGroup:
"""抽样组"""
group_id: int
values: list[float]
@property
def mean(self) -> float:
return sum(self.values) / len(self.values)
@property
def range(self) -> float:
return max(self.values) - min(self.values)
class XBarRChart:
"""X-bar & R 控制图"""
# 控制图常数(n=5)
CONSTANTS = {
2: {"A2": 1.880, "D3": 0, "D4": 3.267},
3: {"A2": 1.023, "D3": 0, "D4": 2.574},
4: {"A2": 0.729, "D3": 0, "D4": 2.282},
5: {"A2": 0.577, "D3": 0, "D4": 2.114},
6: {"A2": 0.483, "D3": 0, "D4": 2.004},
}
def __init__(self, groups: list[SampleGroup]):
self.groups = groups
n = len(groups[0].values)
self.constants = self.CONSTANTS.get(n, self.CONSTANTS[5])
def control_limits(self) -> dict:
"""计算控制限"""
x_bar = sum(g.mean for g in self.groups) / len(self.groups)
r_bar = sum(g.range for g in self.groups) / len(self.groups)
a2 = self.constants["A2"]
d3 = self.constants["D3"]
d4 = self.constants["D4"]
return {
"X_bar": {
"UCL": round(x_bar + a2 * r_bar, 3),
"CL": round(x_bar, 3),
"LCL": round(x_bar - a2 * r_bar, 3),
},
"R_bar": {
"UCL": round(d4 * r_bar, 3),
"CL": round(r_bar, 3),
"LCL": round(d3 * r_bar, 3),
},
}
def cpk(self, usl: float, lsl: float) -> dict:
"""过程能力指数 Cpk"""
all_values = [v for g in self.groups for v in g.values]
mean = sum(all_values) / len(all_values)
n = len(all_values)
std = math.sqrt(sum((v - mean) ** 2 for v in all_values) / n)
cpu = (usl - mean) / (3 * std)
cpl = (mean - lsl) / (3 * std)
cpk = min(cpu, cpl)
cp = (usl - lsl) / (6 * std)
return {
"Cp": round(cp, 3),
"Cpk": round(cpk, 3),
"均值": round(mean, 3),
"标准差": round(std, 3),
"解读": (
"优秀(6σ级)" if cpk >= 1.67
else "良好(能力充足)" if cpk >= 1.33
else "合格(需监控)" if cpk >= 1.0
else "不合格(需立即改善)"
),
}
def detect_signals(self) -> list[str]:
"""检测失控信号(Western Electric 规则)"""
limits = self.control_limits()
ucl = limits["X_bar"]["UCL"]
lcl = limits["X_bar"]["LCL"]
cl = limits["X_bar"]["CL"]
sigma = (ucl - cl) / 3
signals = []
means = [g.mean for g in self.groups]
for i, m in enumerate(means):
if m > ucl or m < lcl:
signals.append(f"规则1:第{i+1}组超出控制限 ({m:.2f})")
# 连续9点在中心线同侧
for i in range(8, len(means)):
window = means[i-8:i+1]
if all(m > cl for m in window) or all(m < cl for m in window):
signals.append(f"规则2:第{i-7}~{i+1}组连续9点在同侧")
return signals if signals else ["过程受控,无失控信号"]
# 演示 — 零件尺寸抽检(规格 50±0.5mm)
sample_data = [
[50.1, 49.9, 50.2, 50.0, 50.1],
[49.8, 50.1, 49.9, 50.3, 50.0],
[50.2, 50.0, 49.8, 50.1, 49.9],
[50.0, 50.2, 50.1, 49.9, 50.0],
[50.1, 50.3, 50.0, 50.2, 50.1],
[49.7, 49.8, 49.9, 49.8, 49.9], # 偏低趋势
[49.8, 49.7, 49.6, 49.8, 49.7], # 偏低趋势
]
groups = [SampleGroup(i+1, v) for i, v in enumerate(sample_data)]
chart = XBarRChart(groups)
print("=== X-bar & R 控制图 ===")
limits = chart.control_limits()
for chart_type, vals in limits.items():
print(f"\n{chart_type}:")
for k, v in vals.items():
print(f" {k}: {v}")
print("\n=== 过程能力 (规格 49.5–50.5mm) ===")
for k, v in chart.cpk(50.5, 49.5).items():
print(f" {k}: {v}")
print("\n=== 失控检测 ===")
for signal in chart.detect_signals():
print(f" {signal}")
检验标准体系
| 检验类型 | 时机 | 内容 | 标准 |
|---|---|---|---|
| IQC(来料) | 到货后 | 外观、尺寸、功能测试 | AQL 1.0–2.5 |
| IPQC(过程) | 生产中 | 关键工序首件、巡检 | 控制图 + SPC |
| FQC(出货前) | 包装前 | 成品全项测试 | 客户规格或内部标准 |
| OQC(出货) | 发货前 | 抽样外观与数量核对 | AQL 0.65–1.0 |
8D 问题解决法
当客户投诉或内部发现批次质量问题时,使用 8D 结构化解决:
"""
8D 报告模板
"""
from dataclasses import dataclass, field
from datetime import date
@dataclass
class EightD:
problem: str
customer: str
date: str = str(date.today())
D1: str = "" # 组建团队
D2: str = "" # 问题描述
D3: str = "" # 临时措施
D4: str = "" # 根本原因
D5: str = "" # 永久对策
D6: str = "" # 验证效果
D7: str = "" # 防止再发
D8: str = "" # 团队表彰
def report(self) -> str:
lines = [
f"8D 质量问题报告",
f"问题: {self.problem}",
f"客户: {self.customer}",
f"日期: {self.date}",
"---",
f"D1 团队: {self.D1 or '待填写'}",
f"D2 问题: {self.D2 or '待填写'}",
f"D3 临时: {self.D3 or '待填写'}",
f"D4 根因: {self.D4 or '待填写'}",
f"D5 对策: {self.D5 or '待填写'}",
f"D6 验证: {self.D6 or '待填写'}",
f"D7 防发: {self.D7 or '待填写'}",
f"D8 表彰: {self.D8 or '待填写'}",
]
return "\n".join(lines)
report = EightD(
problem="客户反馈 2024Q1 批次连接器插拔力不足",
customer="华为终端",
D1="品质工程师(组长)+ 工艺 + 生产 + 供应商",
D2="深圳仓 2024-03-01 到货 3000pcs,插拔力测试 72% 合格率(规格≥5N),涉及批次 B240215",
D3="问题批次全检,合格品发货,不合格品隔离返工",
D4="根因:供应商 A 换新型号弹片材料(硬度不足),变更未知会采购",
D5="恢复原型号弹片材料;增加材料变更通知协议;加入来料硬度检验项目",
D6="新批次 100pcs 样品插拔力测试:合格率 99%,月度 SPC 连续 3 个月受控",
D7="更新 SOP:供应商材料变更须提前 30 天书面通知;IQC 增加弹片硬度检测(洛氏 HRC)",
D8="品质部 8D 团队完成 72 小时快速响应,获本月质量改善奖",
)
print(report.report())
批次追溯系统设计
| 追溯层级 | 记录内容 | 保存时间 |
|---|---|---|
| 原料批次 | 供应商批号、到货日期、检验结果 | 7 年 |
| 生产批次 | 投料时间、产线编号、操作员、设备 | 7 年 |
| 成品批次 | 出货日期、客户、物流单号 | 10 年 |
| 维修记录 | 维修原因、更换部件、处理结果 | 5 年 |
行动清单
- [ ] 选定 3–5 个关键工序,建立 SPC 控制图(X-bar/R 图)并设置失控报警
- [ ] 计算当前关键尺寸的 Cpk,目标:关键尺寸 Cpk ≥ 1.33
- [ ] 为每个产品建立批次追溯记录(原料批号 → 生产批次 → 出货批次)
- [ ] 制定 IQC/IPQC/FQC 检验规范,明确 AQL 抽样标准
- [ ] 对近 6 个月的质量投诉使用 8D 方法进行根因分析和闭环
- [ ] 评估质量成本(预防+鉴定+内部失败+外部失败),设定改善目标
下一章:仓储与库存管理 → — 从库存模型到仓库运营的实战体系。