苍穹外卖(订单状态定时处理、来单提醒和客户催单)

订单状态定时处理、来单提醒和客户催单

[Spring Task](#Spring Task)

cron表达式

入门案例

[①导入maven坐标 spring-context(已存在)](#①导入maven坐标 spring-context(已存在))

[②启动类添加注解 @EnableScheduling 开启任务调度](#②启动类添加注解 @EnableScheduling 开启任务调度)

③自定义定时任务类

订单状态定时处理

需求分析

代码开发

自定义定时任务类OrderTask

在OrderMapper接口中扩展方法

WebSocket

入门案例

导入WebSocket的maven坐标

导入WebSocket服务端组件WebSocketServer,用于和客户端通信

导入配置类WebSocketConfiguration,注册WebSocket的服务端组件

导入定时任务类WebSocketTask,定时向客户端推送数据

直接使用websocket.html页面作为WebSocket客户端

来单提醒

代码开发

客户催单

接口设计

代码开发

在user/OrderController中创建催单方法

在OrderService接口中声明reminder方法

在OrderServiceImpl中实现reminder方法

功能测试


Spring Task

cron表达式

cron表达式其实就是一个字符串,通过cron表达式可以定义任务触发的时间

构成规则:分为6或7个域,由空格分隔开,每个域代表一个含义

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

2022年10月12日上午9点整 对应的cron表达式为:0 0 9 12 10 ? 2022

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

入门案例

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

②启动类添加注解 @EnableScheduling 开启任务调度

③自定义定时任务类

订单状态定时处理

需求分析

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

下单后未支付,订单一直处于"待支付"状态

用户收货后管理端未点击完成按钮,订单一直处于"派送中"状态
对于上面两种情况需要通过定时任务来修改订单状态,具体逻辑为:

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

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

代码开发

自定义定时任务类OrderTask

在OrderMapper接口中扩展方法

java 复制代码
    /**
     * 根据状态和下单时间查询订单
     * @param status
     * @param orderTime
     * @return
     */
    @Select("select * from sky_take_out.orders where status = #{status} and order_time <#{orderTime}")
    List<Orders> getBystatusAndOrderTimeLT(Integer status, LocalDateTime orderTime);

可以临时修改cron语句,通过查看控制台和数据库中数据变化进行测试

WebSocket

入门案例

导入WebSocket的maven坐标

导入WebSocket服务端组件WebSocketServer,用于和客户端通信

导入配置类WebSocketConfiguration,注册WebSocket的服务端组件

导入定时任务类WebSocketTask,定时向客户端推送数据

直接使用websocket.html页面作为WebSocket客户端

来单提醒

约定服务端发送给客户端浏览器的数据格式为JSON,字段包括:type,orderId,content

  • type 为消息类型,1为来单提醒 2为客户催单

  • orderId 为订单id

  • content 为消息内容

代码开发

在OrderServiceImpl中注入WebSocketServer对象,然后在paySuccess方法加入如下代码

因为前面修改过支付的代码,设置支付的时候,默认都是直接支付成功,这里需要将这快代码从paySuccess方法移到payment方法

此外,nginx.conf配置的端口必须改回80,否则需更改前端页面中写的URL

由于设置了5秒钟重复发送的缘故,需要把注解注释掉,否则提示音会一直响

测试通过

客户催单

接口设计

代码开发

在user/OrderController中创建催单方法

java 复制代码
    /**
     * 客户催单
     * @param id
     * @return
     */
    @GetMapping("reminder/{id}")
    @ApiOperation("客户催单")
    public Result reminder(@PathVariable("id") Long id){
        orderService.reminder(id);
        return Result.success();
    }

在OrderService接口中声明reminder方法

java 复制代码
    /**
     * 客户催单
     * @param id
     */
    void reminder(Long id);

在OrderServiceImpl中实现reminder方法

java 复制代码
    /**
     * 客户催单
     * @param id
     */
    @Override
    public void reminder(Long id) {
        // 根据id查询订单
        Orders ordersDB = orderMapper.getById(id);

        // 校验订单是否存在
        if (ordersDB == null) {
            throw new OrderBusinessException(MessageConstant.ORDER_STATUS_ERROR);
        }

        Map map = new HashMap();
        map.put("type", 2);//1代表来单提醒,2代表客户催单
        map.put("orderId", id);
        map.put("content", "订单号:"+ordersDB.getNumber());

        //通过websocket向客户端浏览器发送消息
        webSocketServer.sendToAllClient(JSON.toJSONString(map));
    }

功能测试

相关推荐
qq_2069013910 分钟前
为什么宝塔面板网站无法正常连接外部远程数据库_检查服务器安全组放行端口并开启IP授权
jvm·数据库·python
亚空间仓鼠12 分钟前
关系型数据库MySQL(二):高级特性
数据库·sql·mysql
A-Jie-Y33 分钟前
JAVA框架-SpringBoot环境搭建指南
java·spring boot
亚空间仓鼠33 分钟前
关系型数据库MySQL(五):Galara高可用
数据库·mysql
深兰科技41 分钟前
深兰科技与淡水河谷合作推进:矿区示范加速落地
java·人工智能·python·c#·scala·symfony·深兰科技
weixin_586061461 小时前
JavaScript中Redux-Thunk处理异步Action的任务流
jvm·数据库·python
C^h1 小时前
rtthread控制达妙4310电机
数据库·单片机·嵌入式硬件
晴天¥1 小时前
达梦数据库共享存储集群搭建(DSC双节点+Openfiler-IP SAN存储)
linux·数据库·达梦数据库
码界奇点1 小时前
基于Spring Boot的前后端分离商城系统设计与实现
java·spring boot·后端·java-ee·毕业设计·源代码管理
一叶飘零_sweeeet1 小时前
深度剖析:Java 并发三大量难题 —— 死锁、活锁、饥饿全解
java·死锁·活锁·饥饿