条码收货里的有效期问题,最常见的误解是:系统为什么不把日期只放在 lot 上?企业版 stock_barcode_product_expiry 的做法恰恰相反——它故意把效期语义分散到产品、批次和 move line 三层,因为这三层说的不是同一件事。
产品上的 use_expiration_date 代表规则:这个商品是否要进入效期链路。没有这层,条码端根本不知道扫描某个商品时要不要期待日期相关字段。它决定的是“有没有这个制度”,而不是“这次收货写了哪天”。
批次上的 expiration_date 则是主数据事实。它描述的是这个具体 lot/serial 的真实有效期,后续追溯、质检、报废或 FEFO 逻辑都更信它,而不是信某次扫描页面上的临时值。也正因为如此,lot 层字段要能跨出入库动作长期存在。
move line 上的 expiration_date 又是执行上下文。收货员在条码界面录这批货时,需要一个当次操作就能携带、回显和校验的字段;等真正建 lot 或回写 lot 信息之后,现场输入才会变成可追溯主数据。没有 move line 这一层,收货过程会变得非常别扭。
所以这里的跨模块链路是:产品规则先决定条码界面加载哪些字段,条码操作在 move line 里承接现场输入,最后 lot 层承接长期追溯事实。库存、条码和批次追踪并没有重复存数据,而是在分层传递上下文。
如果你遇到“界面录了日期,但后面 lot 没带过去”这类问题,不要只盯 lot 表本身。先看产品是否启用了效期规则,再看 move line 是否真的在条码初始载荷里取到了相关字段,最后再看 lot 回写环节有没有被自定义逻辑截断。
DISCUSSION
评论区