面向:线束过程工程(PE/IE)、仓储物流、来料检验(IQC)、质量(QE)与制造信息化(MES)人员
写在前面
上一篇讲的是供应商变更这条链:PCN 登记与评估、来料批次带 pcn_rev 版本属性、新版首批加严 IQC、与 ECO 生效时刻对齐、投料扫码做新旧料互锁。走完那五道闸门,一批物料的状态变成了 RELEASED——版本对、检验过、授权齐。
但 RELEASED 只说明这批料「到货那一刻」是合格的,没说明它「用的那一刻」还合格。线束里有不少物料是会随时间和环境变化的:
- 压敏胶带的初粘力、持粘力会随存放时间与温湿度变化;
- 带胶热缩管里的热熔胶层有储存条件要求;
- 双组份密封胶、灌封胶混合后有适用期(pot life),超时就不能再用;
- 硅橡胶防水栓、密封圈一类弹性体件,供应商通常会给出储存条件和期限;
- 部分尼龙(PA)类注塑件的韧性与含水率相关,有的供应商以防潮包装出货,并给出开封后的使用建议。
而且上一篇的版本切换本身会制造「老料」:新版料一放行,旧版剩余料要么在旧版工单里消耗完、要么退库隔离——消耗不完、退库没人管的那部分,最容易一放就过期。常见断点有这些:
- 收货只记物料号和批次,不记生产日期 / 到期日,到期只能靠仓管翻标签;
- 发料按「离门口最近」而不是按到期先后,同一物料新批次先用、老批次压到过期;
- 整箱放行了,拆包上线后没有开封计时,开封时效、混胶适用期全靠人记;
- 过期料「复验延期」没有次数和期限上限,延着延着就成了默认可用;
- 投料扫码只校验
RELEASED,不校验「此刻是否仍在有效期内」。
本文把「放行之后 → 投料之前」这段时间拆成五道 MES/WMS 闸门:有效期主数据与收货赋值 → FEFO 发料(与版本互锁共存)→ 开封 / 混胶计时 → 临期预警与复验延期 → 投料实时有效性校验与追溯。
文中字段名、状态码、天数与小时数均为作者示例。具体储存条件、有效期和开封时效以物料供应商的技术数据表(TDS)/ 规格书和客户要求为准;涉及 IATF 16949 等体系要求时只做方法层归纳,不摘抄条款、不编造限值。
一、要求从哪里来(方法层归纳)
| 来源 | 公开资料中的要点 | 对软件的含义 |
|---|---|---|
| 供应商 TDS / 规格书 | 给出储存温湿度、保质期、开封后或混合后的使用时限 | 有效期规则要按「物料号 × 供应商」维护,而不是全厂一刀切 |
| IATF 风格的库存管理(二次解读) | 库存周转、先进先出等方式管理,防止物料劣化,识别呆滞料 | 发料策略、库龄统计、劣化料隔离要系统化 |
| 可追溯性要求(线束行业常见实践) | 成品追到原材料批次 | 投料记录除批次外,还要能证明「投料时在有效期内」 |
| 线束 MES 常见实践 | 扫码投料、批次状态门禁 | 状态校验从「静态状态位」升级为「状态 + 时间」双重判断 |
取用边界:只归纳方法层;正文中的天数、小时数、复验次数均为作者示例,需按 TDS 和企业程序替换。

二、闸门 ①:有效期主数据与收货赋值
有效期规则是物料主数据的一部分,建议最小字段如下:
| 字段(示例) | 含义 | 示例值 |
|---|---|---|
shelf_life_basis |
有效期起算依据 | MFG_DATE(生产日期)/ RECEIPT_DATE(收货日) |
shelf_life_days |
未开封有效期 | 按 TDS 填写 |
open_life_hours |
开封后可用时长(无此要求则为空) | 按 TDS 填写 |
pot_life_minutes |
混合后适用期(双组份) | 按 TDS 填写 |
storage_class |
储存条件类别 | AMBIENT / CONTROLLED / DRY_PACK |
retest_allowed |
是否允许到期复验延期 | true / false |
max_retest_count |
复验延期次数上限 | 示例:1 |
收货时,系统根据主数据为每个批次计算并写入 expiry_at:
{
"lot_id": "L-20261103-0457",
"part_number": "TAPE-PVC-19",
"supplier_lot": "S2610-118",
"pcn_rev": "B",
"mfg_date": "2026-10-12",
"expiry_at": "(按 shelf_life_basis + shelf_life_days 计算)",
"storage_class": "CONTROLLED",
"lot_status": "QUARANTINE"
}
(以上 JSON 为作者示例。)
闸门规则(示例):
| 规则 | 拒绝码(示例) |
|---|---|
| 物料主数据要求有效期,但收货时未录入生产日期 | SL_MFG_DATE_MISSING |
| 到货时剩余有效期低于收货门槛(门槛按企业规定) | SL_SHORT_ON_ARRIVAL |
储存类别为 CONTROLLED,但目标库位不是受控库位 |
SL_STORAGE_MISMATCH |
第一条最常见:供应商标签上有生产日期,但收货扫码只解析了料号和批次。解析不到生产日期的标签,应当在收货端补录或拒收,而不是默认用收货日起算——默认用收货日会让有效期凭空变长。
三、闸门 ②:FEFO 发料,并与版本互锁共存
对有有效期的物料,发料策略建议从 FIFO(先进先出)改为 FEFO(先到期先出):同一物料可能有不同供应商、不同生产日期的批次,入库先后不等于到期先后。
但这里有一个上一篇留下的约束:发料不能跨版本。FEFO 的候选集必须先按工单 BOM 要求的 pcn_rev 过滤,再在同一版本内按到期先后排序:
# 作者示例:FEFO 候选批次
def pick_lots(order, part, qty, now):
need_rev = order.bom.required_rev(part)
cands = [l for l in stock(part)
if l.lot_status in ("RELEASED", "DEVIATION")
and l.pcn_rev == need_rev # 先满足版本互锁
and l.expiry_at > now + margin(part)] # 预留在线消耗时间
cands.sort(key=lambda l: l.expiry_at) # 同版本内先到期先出
return allocate(cands, qty)
跳批(不按系统推荐批次发料)允许存在,但必须留原因,例如「推荐批次在高位库位,叉车不在班」:
| 情况 | 闸门动作(示例) |
|---|---|
| 实发批次 = 推荐批次 | 通过 |
| 实发批次晚于推荐批次到期,且填写原因 | 通过,记录 FEFO_SKIP 与原因 |
| 实发批次晚于推荐批次到期,未填原因 | 拒绝:FEFO_SKIP_NO_REASON |
| 候选集为空,但存在过期或版本不符批次 | 拒绝:FEFO_NO_VALID_LOT,提示仓储与计划 |
margin(part) 是一个容易被忽略的参数:一卷胶带从发料到用完可能要跨几个班次,发料时还剩 2 小时有效期的批次,到了工位上已经过期。这个余量按物料在线消耗速度设定,属于企业经验值。
四、闸门 ③:开封计时与混胶适用期
整箱放行、整箱有效期,并不代表拆包后还能用这么久。有开封时效要求的物料,需要在拆包那一刻生成一个子批次(或称「开封单元」),并开始计时:
| 事件(示例) | 系统动作 |
|---|---|
| 工位扫码拆包 | 生成 open_unit_id,记录 opened_at、工位、操作员 |
| 计时到期前一段时间(示例:剩余 10%) | 工位终端预警 |
| 计时到期 | open_unit 状态置 EXPIRED,投料扫码拒绝 |
| 未用完退回 | 按规则判定:重新密封可退回(需记录)或直接报废 |

双组份密封胶 / 灌封胶的适用期更短,建议做成配胶单:
# 作者示例:配胶单
mix_id: MIX-20261103-031
resin_lot: L-RES-1027
hardener_lot: L-HRD-1019
ratio_check: PASS # 称重或计量设备回传
mixed_at: 2026-11-03T09:12
pot_life_minutes: "按 TDS" # 由主数据带出
status: ACTIVE # 超时自动置 EXPIRED
consumers: [] # 使用该批胶的工单 / SN 逐个追加
两个关键点:配胶单自带两个组份的批次(任何一个组份过期,配胶单不可生成);用胶工位扫的是配胶单号,不是桶号——这样每个成品都能追到「哪一次混合、几点混的、用的时候过没过适用期」。
五、闸门 ④:临期预警与复验延期
临期和过期是两件事:临期要提前消化,过期要隔离处置。
| 阶段(示例) | 触发 | 动作 |
|---|---|---|
| 临期 | 剩余有效期低于预警线(按物料设定) | 推送计划与仓储:优先排产消耗,或调拨到用量大的线 |
| 到期 | expiry_at 到达 |
批次状态自动置 EXPIRED_HOLD,库位锁定 |
| 复验 | 物料允许复验且未超次数 | 按复验项目检验,合格则延长一个复验周期 |
| 报废 / 退供 | 不允许复验、复验不合格或超次数 | 走报废或退货流程 |
复验延期是最容易被滥用的一环(和上一篇的临时偏差一个道理)。建议几条硬规则:
- 主数据不允许复验的物料,系统里没有「延期」按钮;
- 复验次数有上限,达到上限只能报废或退供;
- 延期后的有效期不能超过 TDS 允许的最长期限(如 TDS 有此规定);
- 复验记录要挂检验数据附件,不能只改一个日期字段。
# 作者示例:复验延期校验
def can_extend(lot, part):
if not part.retest_allowed:
return "SL_RETEST_NOT_ALLOWED"
if lot.retest_count >= part.max_retest_count:
return "SL_RETEST_LIMIT"
if not lot.retest_record or not lot.retest_record.attachments:
return "SL_RETEST_NO_EVIDENCE"
return "OK"
六、闸门 ⑤:投料实时有效性校验与追溯
最后一道还是落在投料扫码。上一篇的校验逻辑检查了「状态 + 版本 + 偏差额度」,这里再加上时间维度:

# 作者示例:投料时的有效性校验(在版本互锁之后执行)
def check_time(unit, now):
lot = unit.lot
if lot.lot_status == "EXPIRED_HOLD" or now >= lot.expiry_at:
return "SL_LOT_EXPIRED"
if unit.is_open_unit and now >= unit.opened_at + unit.open_life:
return "SL_OPEN_EXPIRED"
if unit.is_mix and now >= unit.mixed_at + unit.pot_life:
return "SL_POT_LIFE_EXCEEDED"
return "OK"
投料记录建议在原有字段(supplier_lot、pcn_rev)之外,补三类字段:
| 字段(示例) | 用途 |
|---|---|
expiry_at_feed |
投料时该批次的到期时间快照 |
open_unit_id / opened_at |
开封单元及开封时间 |
mix_id / mixed_at |
配胶单及混合时间 |
一定要存快照而不是事后关联:复验延期会改写批次的 expiry_at,如果投料记录只存批次号,事后再查就分不清「投料时这批料到底在不在有效期内」。
七、追溯回看:出了问题能不能答出这三个问题
- 某个成品 SN 用的胶带,投料时离到期还有多久? ——
expiry_at_feed与投料时间相减; - 某次配胶从混合到最后一次使用隔了多长时间? ——
mix_id的mixed_at与consumers里最后一条记录; - 复验延期过的批次流入了哪些成品? —— 反查
retest_count > 0的批次的全部投料记录。
三个都能在几分钟内答出来,物料的「时间」这条线才算接进了 MES。
八、落地顺序建议
- 先补 有效期主数据,并在收货端强制解析或补录生产日期(闸门 ①);
- 再把 投料扫码加上到期判断(闸门 ⑤ 的第一条)——这是见效最快、改动最小的一步;
- 然后上 开封单元与配胶单(闸门 ③),先从混胶工位开始;
- 接着把 发料改为 FEFO,并与版本互锁合并(闸门 ②);
- 最后把 临期预警与复验延期 流程化(闸门 ④),并配合库龄报表清理呆滞料。
上一篇解决的是「这批料是不是对的版本、有没有资格进厂」,这一篇解决的是「这批料在用的那一刻还能不能用」。放行是一个时刻,有效是一段时间——投料扫码那一下,两件事都要对上。
本文同步发布于 CSDN:https://blog.csdn.net/qq_29737119/article/details/169920696
- fig1-shelf-life-flow.png (124 KB)
- fig2-open-unit-timer.png (123 KB)
- fig3-feed-time-check.png (120 KB)