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

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

[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));
    }

功能测试

相关推荐
上海云盾-小余4 分钟前
应用层漏洞实战防护:SQL 注入、XSS、文件上传漏洞一站式加固方案
数据库·sql·xss
ulias2125 分钟前
C++ 异常处理机制
java·开发语言·c++
鸽芷咕5 分钟前
从语法兼容到语义一致:深度解析金仓如何“无感”承接MySQL复杂业务
数据库·mysql
新缸中之脑6 分钟前
AI智能体评估指南
数据库·人工智能·oracle
大阿明6 分钟前
Spring BOOT 启动参数
java·spring boot·后端
add45a10 分钟前
Python类型提示(Type Hints)详解
jvm·数据库·python
程序员小郭8310 分钟前
Spring Ai 05 ChatClient Advisor 实战(日志、提示词增强、内容安全)
java·开发语言·前端
hutengyi10 分钟前
Spring Boot 实战篇(四):实现用户登录与注册功能
java·spring boot·后端
u01339452716 分钟前
How to Run sample.war in a Tomcat Docker Container
java·docker·tomcat
splage19 分钟前
Spring Framework 中文官方文档
java·后端·spring