苍穹外卖(七) Spring Task 完成订单状态定时处理

Spring Task 完成订单状态定时处理, 如处理支付超时订单

Spring Task介绍

Spring Task 是Spring框架提供的任务调度工具,可以按照约定的时间自动执行某个代码逻辑。

应用场景:

信用卡每月还款提醒

火车票售票系统处理未支付订单

入职纪念日为用户发送通知

点外卖未按时支付取消订单 

只要是需要定时处理的场景都可以使用Spring Task

cron表达式

cron表达式其实就是一个字符串,通过cron表达式可以定义任务触发的时间
构成规则: 分为6或7个域, 由空格分隔开, 每个域代表一个含义

每个域的含义分别为: 秒, 分钟, 小时, 日, 月, 周, 年(可选)

周 是 周几 的意思

通配符:

* 表示所有值;

? 表示未说明的值,即不关心它为何值;

- 表示一个指定的范围;

, 表示附加一个可能值;

/ 符号前表示开始时间,符号后表示每次递增的值;

cron表达式案例:

*/5 * * * * ? 每隔5秒执行一次

0 */1 * * * ? 每隔1分钟执行一次

0 0 5-15 * * ? 每天5-15点整点触发

0 0/3 * * * ? 每三分钟触发一次

0 0-5 14 * * ? 在每天下午2点到下午2:05期间的每1分钟触发

0 0/5 14 * * ? 在每天下午2点到下午2:55期间的每5分钟触发

0 0/5 14,18 * * ? 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发

0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时

0 0 10,14,16 * * ? 每天上午10点,下午2点,4点

为了描述这些信息,提供一些特殊的字符。这些具体的细节,我们就不用自己去手写,因为这个cron表达式,它其实有在线生成器。 

cron表达式在线生成器:在线Cron表达式生成器

通过cron表达式 定义触发时间

入门案例

Spring Task使用步骤 

1). 导入maven坐标 spring-context(已存在)

 

2). 启动类添加注解 @EnableScheduling 开启任务调度

3). 自定义定时任务类 (主要工作,描述任务逻辑) 

        类也要交给容器管理, 所以也要加上@Component 注解

订单状态定时处理

需求分析

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

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

支付超时的订单如何处理? 派送中的订单一直不点击完成如何处理?

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

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

代码开发

1). 自定义定时任务类OrderTask(待完善):

 2). 在OrderMapper接口中扩展方法

 3). 完善定时任务类的processTimeoutOrder方法:

4). 完善定时任务类的processDeliveryOrder方法:

/**
     * 处理“派送中”状态的订单
     */
    @Scheduled(cron = "0 0 1 * * ?")
    public void processDeliveryOrder(){
        log.info("处理派送中订单:{}", new Date());
        // select * from orders where status = 4 and order_time < 当前时间-1小时
        LocalDateTime time = LocalDateTime.now().plusMinutes(-60);
        List<Orders> ordersList = orderMapper.getByStatusAndOrdertimeLT(Orders.DELIVERY_IN_PROGRESS, time);

        if(ordersList != null && ordersList.size() > 0){
            ordersList.forEach(order -> {
                order.setStatus(Orders.COMPLETED);
                orderMapper.update(order);
            });
        }
    }

 

### 苍穹外卖 Day10 学习资料与教程 #### 订单状态定时处理苍穹外卖项目的第10天学习中,重点涉及订单状态定时处理功能。此部分通过 `Spring Task` 实现定时任务的功能,能够定期扫描数据库中的订单表并更新其状态。例如,当某个订单超过指定时间未被接单时,可以将其标记为超时状态[^1]。 以下是实现订单状态定时处理的核心代码片段: ```java @Scheduled(cron = "0 0/1 * * * ?") // 每分钟执行一次 public void updateOrderStatus() { List<Order> pendingOrders = orderRepository.findByStatus("PENDING"); for (Order order : pendingOrders) { if (order.getCreateTime().plusMinutes(30).isBefore(LocalDateTime.now())) { // 超过30分钟未接单 order.setStatus("TIMEOUT"); // 更新为超时状态 orderRepository.save(order); } } } ``` #### 来电提醒功能 来电提醒功能旨在通知商家有新的订单到达。通常可以通过 WebSocket 技术实现实时通信,在客户下单后立即向商家端发送消息提示新订单的到来[^5]。 核心逻辑如下所示: ```java @Configuration @EnableScheduling public class WebSocketConfig implements SchedulingConfigurer { @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { taskRegistrar.addTriggerTask( () -> notifyNewOrder(), // 执行的任务方法 triggerContext -> { LocalDateTime nextExecutionTime = LocalDateTime.now().plusSeconds(1); // 下次触发时间为当前时间加一秒 return Date.from(nextExecutionTime.atZone(ZoneId.systemDefault()).toInstant()); }); } private void notifyNewOrder() { Order newOrder = orderService.findLatestOrderByStatus("NEW"); if (newOrder != null) { webSocketServer.sendMessage(newOrder.toString()); // 推送最新订单到前端 } } } ``` #### 客户催单机制 为了提升用户体验,项目还实现了客户催单功能。如果顾客认为自己的订单等待时间过长,则可通过应用发起催促请求。后台收到此类请求后会重新调整优先级或将信息反馈给配送员或厨房工作人员。 --- ### 总结 综上所述,苍穹外卖 Day10 的主要内容围绕着 **订单状态定时处理**、**来电提醒** 和 **客户催单** 展开。这些模块不仅增强了系统的自动化能力,也改善了用户的交互体验。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值