面向读者 / 解决问题:做危废管理信息系统、仓储模块或厂内环保台账二次开发的技术人员;要实现的是把"危废不能长期放着"这条管理要求,变成可计算、可预警、可审计的规则,而不是靠人翻表格提醒。
越华环保集团是山东环保设备行业里长期做危废库的企业,在库房交付后常被问到同一个问题:库存台账能不能自己算出哪些批次快到期了。下面按"法条口径---数据模型---边界情形---调度实现---业务联动"五段展开,给出可直接落地的字段与规则设计思路。

一、先把法条口径搞清楚,别一上来就写死 365 天
《固体废物污染环境防治法》第八十一条的表述是:从事收集、贮存、利用、处置危险废物经营活动的单位,贮存危险废物不得超过一年;确需延长期限的,应当报经颁发许可证的生态环境主管部门批准;法律、行政法规另有规定的除外。
注意这里的约束对象------法条写的是从事收集、贮存、利用、处置危险废物经营活动的单位。产废单位在自己的库房里暂存自有危废,国家层面并没有给出同一条"一年"的直接规定,但不少地方在日常监管、管理计划备案和现场检查中参照这一口径执行。所以系统里不要简单地写死 expire = in_date + 365,而是把期限配置化:期限来源、基准天数、是否启用延长流程,都作为可配参数,具体取值以属地要求和项目环评口径为准。
二、数据模型:批次是计期的最小粒度
计期不能挂在"库位"上,也不能挂在"废物代码"上,只能挂在批次上。同一天进库的两桶同代码废物,可能来自不同车间、不同产生日期,混在一起就失去追溯能力。建议的字段设计:
waste_lot
lot_id -- 批次号,一批一码,不复用
waste_code -- 危废代码(8 位)
waste_name -- 废物名称,与代码保持对应关系
produce_date -- 产生日期
in_date -- 入库日期
qty / unit -- 数量与单位,单位枚举固定为 kg 或 t
location_code -- 库位编码
term_basis -- 计期基准:PRODUCE_DATE | IN_DATE
term_days -- 期限天数(配置项,默认 365)
status -- IN_STOCK / PART_OUT / OUT / EXTENDED / FROZEN
extension_no -- 延长批准文号
extension_until -- 批准延至日期
term_basis 这个字段值得单独强调。以产生日期计期更严格,也更贴近"产生后多久被处置"的管理意图;以入库日期计期则数据更容易获得,但会掩盖车间暂存的时间。字段留下来,取值交给项目定,比在代码里写死好。
三、几个容易算错的边界
- 部分出库不重置期限。一批 20 桶出库 15 桶,剩下 5 桶仍按原批次起算日计算,不是从出库日重新计时。实现上只要不重建 lot 记录就不会出错,注意别用"最后变动时间"当起算点。
- 合并堆放会毁掉计期。不同批次倒进同一个容器后,批次属性消失,此时应生成新的 batch 并标记为"混合批次",同时保留原批次引用,而不是直接相加。
- 跨年与闰年用日期函数处理,不要自己加减秒数;到期日落在非工作日时,预警应提前到上一个工作日,而不是顺延到之后。
- 延长流程是有状态的。提交申请、获批、批准到期,三个阶段都要有字段支撑;批准文号与延至日期必须有值才允许把状态改为 EXTENDED,否则预警不应静音。
- 废物代码变更(名录调整导致代码更新)时,保留历史代码字段,别直接覆盖,否则历史记录对不上。

四、预警分级与调度实现
预警建议分五级:提前 30 天(计划层,用于排转移计划)、提前 15 天(通知库管)、提前 7 天(通知责任人)、到期当日、超期。超期这一级要有升级策略------连续超期多少天仍未处置,向上推送到管理层。
调度上有三点要处理好:
幂等:每天凌晨跑批处理,同一批次同一级别当天只发一次,靠lot_id + level + 预警日期做去重键,重跑不重复打扰。
状态变更即重算:出库、部分出库、延长获批这些事件发生后应立即重算该批次的预警,而不是等第二天批处理。
"数据不足"单独成一类:产生日期缺失、数量单位为空时,不能当作正常批次放行,要报"数据不足以判定",这和设备离线、接口失败要区分开。
五、与转移计划、电子联单联动
期限预警的终点不是发一条消息,而是推动一次转移。预警触发后,应能直接带出该批次的废物代码、当前库存量、推荐转移去向(有资质的处置单位),生成转移计划草稿,再进入电子联单流程。跨省转移还要留出审批环节的时间,因此提前 30 天那一级不是摆设------它是给审批留的窗口。
反过来,联单上的数量回写后应与批次库存对账,差异超过阈值时报警。这一层打通之后,库房的"存量---期限---转移"才是闭环。
(包含AI创作内容)