当前位置: 首页 > news >正文

订单定时状态处理业务(SpringTask)

文章目录

    • 概要
    • 整体架构流程
    • 技术细节
    • 小结

概要

订单定时状态处理通常涉及到对订单状态进行定期检查,并根据订单的状态自动执行某些操作,比如关闭未支付的订单、自动确认收货等.

需求分析以及接口设计

需求分析

用户下单后可能存在的情况:

  • 下单后15min内未支付,订单一直处于“待支付”状态

  • 用户收货后管理端未点击完成按钮,订单一直处于“派送中”状态

技术细节

对于上面两种情况需要通过定时任务来修改订单状态,具体逻辑为:

  • 通过定时任务每分钟检查一次是否存在支付超时订单(下单后超过15分钟仍未支付则判定为支付超时订单),如果存在则修改订单状态为“已取消”

  • 通过定时任务每天凌晨1点检查一次是否存在“派送中”的订单,如果存在则修改订单状态为“已完成”

1.task:

由于Springtask定时状态处理不需要通过接口调用,是自动执行的,所以不需要controller层

package com.sky.task;import com.sky.entity.Orders;
import com.sky.mapper.OrderMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;import java.time.LocalDateTime;
import java.util.List;@Component//加入Spring容器
@Slf4j
public class OrderTask {@Autowiredprivate OrderMapper orderMapper;@Scheduled(cron = "0 * * * * ?")//每分钟执行一次public void processTimeOutOrder(){log.info("定时处理订单超时的订单");LocalDateTime orderTime = LocalDateTime.now().plusMinutes(-15);//查询到未支付且超时的订单List<Orders> ordersList = orderMapper.getByStatusAndOrderTimeLT(Orders.UN_PAID,orderTime);//遍历这些订单,更改他们的状态,取消时间和取消原因,再更新表if(ordersList != null && ordersList.size() > 0){for (Orders orders : ordersList) {orders.setStatus(Orders.CANCELLED);orders.setCancelTime(LocalDateTime.now());orders.setCancelReason("订单超时,已被自动取消");orderMapper.update(orders);}}}@Scheduled(cron = "0 0 1 * * ? ")//每天凌晨一点执行一次public void processDeliveryOrder(){log.info("定时处理派送中的订单");LocalDateTime orderTime = LocalDateTime.now().plusMinutes(60);//每天凌晨0点执行一次//查询到正在派送的订单List<Orders> ordersList = orderMapper.getByStatusAndOrderTimeLT(Orders.DELIVERY_IN_PROGRESS,orderTime);//遍历这些订单,更改他们的状态,取消时间和取消原因,再更新表if(ordersList != null && ordersList.size() > 0){for (Orders orders : ordersList) {orders.setStatus(Orders.COMPLETED);orderMapper.update(orders);}}}}

2.Mapper层:

@Select("select * from `sky-take-out`.orders where status = #{status} and order_time < #{orderTime}")List<Orders> getByStatusAndOrderTimeLT(Integer status, LocalDateTime orderTime);

效果展示

http://www.lryc.cn/news/415278.html

相关文章:

  • STM32 | ADC+RS485(第十天)
  • python打包成能够在mac里面运行的程序
  • 基于FPGA的数字信号处理(20)--半减器和全减器
  • Python:单引号,双引号,三引号的区别
  • 电子电气架构 ---SOMEIP/SD初入门
  • 一些数学基础概念
  • 责任有限公司的一般组织结构
  • Leetcode3227. 字符串元音游戏
  • 网络流量分析在运维管理中的重要性与实施策略
  • 通信原理实验——PCM编译码
  • matlab的strel()函数的使用方法(OK)
  • Linux:Linux权限解析
  • Spring面试篇章——IOC
  • 适合制造业的项目管理软件都有哪些?
  • 微应用(Micro-Applications)、微前端(Micro Frontend)、Qiankun 框架之间的区别和联系
  • String的底层构造
  • Binder机制的原理
  • JavaScript输出数据的方法?
  • Redis学习笔记——第19章 事务
  • 元太电磁膜SUDE-10S19MI-01X驱动适配
  • C#数据类型 全局变量 类型转换方法(汇总)
  • HCIP重修总笔记(中)
  • 图片搜索网站,有大量高清图片,避免版权纠纷
  • 设计学习笔记8:在设计模式中,状态模式和策略模式有什么区别,它们各自适用于什么场景?
  • Android 10.0 系统默认蓝牙打开状态栏显示蓝牙图标功能实现
  • 在git中如何忽略.vscode目录?
  • 分布式系统
  • 【Material-UI】Autocomplete 组件中的事件处理(Events)详解
  • 【51单片机仿真】基于51单片机设计的钟表定时闹钟系统仿真源码设计文档演示视频——完整资料下载
  • 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-7-元素基础定位方式-下篇 (详细教程)