去年 12 月发的 300 分早过了有效期,账户余额仍显示 1200,下单时这 300 分照样能抵扣。乍看像缓存或者权限的锅,追下去往往不是。

SELECT user_id, SUM(points) FROM wp_points_log
WHERE expire_at < CURDATE() AND expired = 0
GROUP BY user_id;

追下去是这么回事:流水表里有过期时间字段,余额却是单独维护的汇总值。清理任务只给明细打了过期标记,没有回写余额,两套数据越走越远。

「积分过期清理」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。

偶发问题先统计频率,一小时几次和一天一次,查法完全不同。改完顺手把文档补一句,省得下次自己重新推一遍。

具体做法是,清理前先按用户汇总当天到期的分数;在一个事务里写一条负数流水,同时更新余额;每天跑完输出过期总分数和人数,和余额表对一次;拿一个跨年账号走一遍下单,确认过期分不参与抵扣。

验收就看一点,过期账号余额同步减少,结算页可用积分不再包含过期部分。

作者 9823189