技巧:把订单时间,超时的时间,当前时间,看成一个时间线,就想明白了
1 核心sql,检索出已经过期的订单,如下:
create_time(订单创建时间) < date_sub(now(), interval 5 minute)
date_sub:从某个日期减去指定的时间间隔
SELECT * FROM t_order
WHERE create_time < date_sub(now(), interval #{delay} minute)
and status = '待支付'
order by create_time desc
limit 3
2 修改过期订单的状态
update t_order set status = '已取消' where id = #{id}
3 伪代码如下
//主启动类或配置类上
@EnableScheduling
@Scheduled(cron = "*/10 * * * * ?") // 每隔十秒执行一次
public void DelayOrdersAction() {
//这里用的延时5分钟
Integer delay = 5;
// 查询出超时未支付的订单
List<TOrder> tOrders = tOrderMapper.searchDelayOrders(delay);
if (!tOrders.isEmpty()) {
tOrders.stream().forEach(tt -> {
// 将订单取消(修改订单的状态)
updateOrderZt(tt.getId());
});
}
}