订单超时取消:指用户没有在指定的时间内完成支付将自己将订单状态修改为已取消和将库存进行还原
解决方案:
- 通过定时任务框架(quartz)
- 延时队列(MQ)
1.流程图
2.整合到springBoot
导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
3.在启动类上面加上@EnablSchduling注解
3.1 创建一个类交给spring托管,使用@Schdule()cron表达式进行定时任务的时间限定
package com.qfedu.fmmall.service.job;/*
**
*@author SmallMonkey
*@Date 2022/12/15 21:59
*
*
**/
import com.qfedu.fmmall.dao.OrdersMapper;
import com.qfedu.fmmall.entity.Orders;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import tk.mybatis.mapper.entity.Example;
import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
@Component
public class OrderTimeCheckJob {
@Autowired
private OrdersMapper ordersMapper;
@Scheduled(cron = "0/5 * * * * ?")
public void checkOrderTime(){
//查询超过30min的订单状态为待支付状态的订单
Example example = new Example(Orders.class);
Example.Criteria criteria = example.createCriteria();
criteria.andEqualTo("status","1");
//当前时间的前30分钟
Date date = new Date(System.currentTimeMillis() - 30 * 60 * 1000);
criteria.andLessThan("createTime",date);
//查询所有的符合要求的订单
List<Orders> orders = ordersMapper.selectByExample(example);
// 一.由于可以出现网络不好的原因导致微信支付成功后的 订单数据没有改变,所以这里需要请求微信支付的接口,确认已经订单是否支付成功
// 1.1 访问微信接口如果订单已经支付,则修改为 “待发货/已支付” status2
// 二. 向微信支付平台 请求关闭订单:
// 1.修改订单状态为 status = 6 已关闭 close_type = 1 超时未支付
// 2. 还原库存:先根据当前订单编号 查询商品快照(skuid buy_count)--->修改product_sku
}
}