质量管理与生产追溯
High Contrast
Dark Mode
Light Mode
Sepia
Forest
2 min read494 words

质量管理与生产追溯

质量不是检验出来的,而是设计和生产出来的——追溯系统让问题有据可查,而 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 年

行动清单

下一章仓储与库存管理 → — 从库存模型到仓库运营的实战体系。