Java项目-苍穹外卖-Day10-SpirngTask及WebSocket

文章目录

  • 前言
  • SpringTask
    • 介绍
    • SpringTask_corn表达式
    • Spring_Task入门案例
  • 订单状态定时处理
    • 需求分析
    • 代码开发
    • 功能测试

前言

本章实现的业务功能

超时未支付订单自动取消,配送中订单商家忘点完成自动再固定时间检查且修改成完成状态
Java项目-苍穹外卖-Day10-SpirngTask及WebSocket_第1张图片
来单提醒功能
Java项目-苍穹外卖-Day10-SpirngTask及WebSocket_第2张图片
催单提醒功能
Java项目-苍穹外卖-Day10-SpirngTask及WebSocket_第3张图片

SpringTask

介绍

Java项目-苍穹外卖-Day10-SpirngTask及WebSocket_第4张图片
Java项目-苍穹外卖-Day10-SpirngTask及WebSocket_第5张图片

SpringTask_corn表达式

一般的话周几和第几日是不能同时出现的
因为比如 4月15日 周四 可能4月15日不是周四 可能冲突的 所以周和日一般只能有一个
Java项目-苍穹外卖-Day10-SpirngTask及WebSocket_第6张图片
现在有这种生成表达式的网站
Java项目-苍穹外卖-Day10-SpirngTask及WebSocket_第7张图片
!其实还挺复杂的,建议看个视频稍微学一下怎么用这个网站

Spring_Task入门案例

使用springtask主要关注 1.cron表达式 2.内部处理逻辑
spring_Task挺小的一个框架,是没有自己的jar包的,集成在了spring_context这个包里面
Java项目-苍穹外卖-Day10-SpirngTask及WebSocket_第8张图片
Java项目-苍穹外卖-Day10-SpirngTask及WebSocket_第9张图片
自定义的定时任务类
Java项目-苍穹外卖-Day10-SpirngTask及WebSocket_第10张图片

订单状态定时处理

需求分析

Java项目-苍穹外卖-Day10-SpirngTask及WebSocket_第11张图片
Java项目-苍穹外卖-Day10-SpirngTask及WebSocket_第12张图片
合理一点,你派送中订单不能12点弄的,一般这个时候有很多是真的在派送中的

代码开发

com.sky.Task.OrderTask

//自定义定时任务类,定时处理订单状态
@Component
@Slf4j
public class OrderTask {
    @Autowired
    private OrderMapper orderMapper;

    /**
     * 处理超时订单的方法,每分钟触发一次
     */
    @Scheduled(cron = "0 * * * * ?")//每分钟触发一次
    public void processTimeoutOrder(){
        log.info("定时处理超时订单:{}", LocalDateTime.now());
        //select * from orders where status = ? and order_time < (当前时间-15分钟)
        List<Orders> ordersList = orderMapper.
                getByStatusAndOrderTimeLT(Orders.PENDING_PAYMENT, LocalDateTime.now().plusMinutes(-15));

        if(ordersList != null && ordersList.size() > 0){
            for (Orders orders : ordersList) {
                orders.setStatus(Orders.CANCELLED);
                orders.setCancelReason("订单超时,自动取消");
                orders.setCancelTime(LocalDateTime.now());
                orderMapper.update(orders);
            }

        }
    }

    /**
     * 处理一直处于派送中的订单
     */
    @Scheduled(cron = "0 0 1 * * ?")//每天凌晨一点触发一次
    public void processDeliveryOrder(){
        log.info("定时处理处于派送中的订单:{}",LocalDateTime.now());

        List<Orders> ordersList = orderMapper.
                getByStatusAndOrderTimeLT(Orders.DELIVERY_IN_PROGRESS, LocalDateTime.now().plusMinutes(-60));
        if(ordersList != null && ordersList.size() > 0){
            for (Orders orders : ordersList) {
                orders.setStatus(Orders.COMPLETED);
                orderMapper.update(orders);
            }
        }
    }
}

ordermapper

    /**
     *根据订单状态和订单时间查询订单
     * @return
     */
    @Select("select * from orders where status=#{status} and order_time < #{orderTime} ")
    List<Orders> getByStatusAndOrderTimeLT(Integer status, LocalDateTime orderTime);

功能测试


这个运行然后看数据库
弄几个status为1(待支付)的订单然后等到它自动处理看看能不能取消
然后那个配送的可以改一下那个cron表达式不用真的等到1点

你可能感兴趣的:(项目记录,java,websocket,python)