Spring Task 实现超时未支付的订单自动取消

1、导入依赖

需要导入spring-context依赖,但这个依赖已经在spring-boot-starter起步依赖中包含了,如下:

2、在启动类上添加@EnableScheduling注解,开启任务调度

less 复制代码
 @SpringBootApplication
 @EnableScheduling // 开启任务调度
 public class SkyApplication {
     public static void main(String[] args) {
         SpringApplication.run(SkyApplication.class, args);
     }
 }

3、自定义定时任务类

以订单的超时未支付时间为15分钟来举例。

订单状态已定义在Orders实体类中,如下:

ruby 复制代码
 @Data
 @Builder
 @NoArgsConstructor
 @AllArgsConstructor
 public class Orders implements Serializable {
 ​
     /**
      * 订单状态 1待付款 2待接单 3已接单 4派送中 5已完成 6已取消
      */
     public static final Integer PENDING_PAYMENT = 1;
     public static final Integer TO_BE_CONFIRMED = 2;
     public static final Integer CONFIRMED = 3;
     public static final Integer DELIVERY_IN_PROGRESS = 4;
     public static final Integer COMPLETED = 5;
     public static final Integer CANCELLED = 6;
     
     /////////////////////////////////////////
     // 略
     /////////////////////////////////////////
 }

自定义定时任务类:

less 复制代码
 @Component
 @Slf4j
 public class OrderTask {
 ​
     @Autowired
     private OrderMapper orderMapper;
 ​
     // 超时未支付订单处理
     // cron表达式,用来定义任务触发的时间,此处表示每分钟触发一次。该表达式怎么写,此处不赘述
     @Scheduled(cron = "0 0/1 * * * ?") 
     public void processPayTimeOut(){
         // 从订单表中查询哪些订单超时了,条件:status = 1 and order_time < 当前时间 - 15mins
         LocalDateTime time = LocalDateTime.now().plusMinutes(-15);
         List<Orders> ordersList = orderMapper.getByStatusAndCreateTimeLT(Orders.PENDING_PAYMENT, time);
 ​
         if (ordersList != null && ordersList.size() > 0){
             for (Orders order : ordersList) {
                 // 设置支付超时订单的状态为 6已取消
                 order.setStatus(Orders.CANCELLED);
                 order.setCancelTime(LocalDateTime.now());
                 order.setCancelReason("订单支付超时");
 ​
                 // 更新数据库中的数据
                 orderMapper.update(order);
             }
         }
     }
 }

OrderMapper:

java 复制代码
 @Mapper
 public interface OrderMapper {
     @Select("select * from orders where status = #{status} and order_time < #{time}")
     List<Orders> getByStatusAndCreateTimeLT(Integer status, LocalDateTime time);
 ​
     void update(Orders orders);
 }

OrderMapper.xml:

xml 复制代码
 <?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE mapper
         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.sky.mapper.OrderMapper">
     
     <update id="update" parameterType="com.sky.entity.Orders">
         update orders
         <set>
             <if test="cancelReason != null and cancelReason!='' ">
                 cancel_reason=#{cancelReason},
             </if>
             <if test="rejectionReason != null and rejectionReason!='' ">
                 rejection_reason=#{rejectionReason},
             </if>
             <if test="cancelTime != null">
                 cancel_time=#{cancelTime},
             </if>
             <if test="payStatus != null">
                 pay_status=#{payStatus},
             </if>
             <if test="payMethod != null">
                 pay_method=#{payMethod},
             </if>
             <if test="checkoutTime != null">
                 checkout_time=#{checkoutTime},
             </if>
             <if test="status != null">
                 status = #{status},
             </if>
             <if test="deliveryTime != null">
                 delivery_time = #{deliveryTime}
             </if>
         </set>
         where id = #{id}
     </update>
 </mapper>
相关推荐
云和数据.ChenGuang2 小时前
Python 重写(Override)深度解析:从 MRO 到 super() 的完整机制
java·开发语言·人工智能·python·langchain·1024程序员节
摇滚侠2 小时前
《On Java 中文版 基础卷》阅读笔记 实现隐藏 12
java·数据库·笔记
Cosolar4 小时前
不收费、不加水印、数据归你:我做了个开源的在线简历工具
后端·面试·前端框架
silvamux_4 小时前
10款模型写种草笔记:可发布性、返工来源与成本数据缺口复盘
java·数据库·笔记
步行cgn5 小时前
StringHttpMessageConverter 详解:Spring MVC 中字符串读写的默认转换器
java·spring·mvc
摇滚侠5 小时前
《On Java 中文版 基础卷》阅读笔记 实现隐藏 11
java·笔记·python
小蒜学长5 小时前
基于Spring Boot+Vue3的在线医疗咨询系统的设计与实现(代码+数据库+LW)
java·spring boot·后端·在线问诊·在线医疗咨询系统
Deng桑5 小时前
SpringAI写第一个Agent-把工单循环跑起来
java·agent·工具调用·spring ai
陈随易6 小时前
下载神器!Motrix 停更三年后重写回归
前端·后端·程序员
每天一道题6 小时前
CAP、Raft 与多数派:分布式系统如何达成一致?
分布式·后端·微服务