itheima苍穹外卖项目学习笔记--Day10: 订单状态定时处理/来单提醒和客户催单

这篇具有很好参考价值的文章主要介绍了itheima苍穹外卖项目学习笔记--Day10: 订单状态定时处理/来单提醒和客户催单。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Day10: 订单状态定时处理/来单提醒和客户催单

a. 订单状态定时处理

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

  • 定位:定时任务框架
  • 作用:定时自动执行某段Java代码

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

  • 分为6或7个域,由空格分隔开,
  • 每个域代表一个含义每个域的含义分别为:秒、分钟、小时、日、月、周、年(可选)

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

cron表达式在线生成器:https://cron.qqe2.com/

Spring Task使用步骤:

  • 1.导入maven坐标spring-context

  • 2.启动类上添加@EnableScheduling开启任务调度

  • 3.自定义定时任务类

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

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

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

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

创建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分钟)
        LocalDateTime time = LocalDateTime.now().plusMinutes(-15);
        List<Orders> ordersList = orderMapper.getByStatusAndOrderTimeLT(Orders.PENDING_PAYMENT, time);

        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 * * ?") // 每天凌晨1点触发一次
    public void processDeliveryOrder(){
        log.info("定时处理处于派送中的订单:{}", LocalDateTime.now());

        // select * from orders where status = ? 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){
            for (Orders orders : ordersList) {
                orders.setStatus(Orders.COMPLETED);
                orderMapper.update(orders);
            }
        }
    }
}

在OrderMapper中,编写 根据订单状态和下单时间查询订单 方法

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

b. 来单提醒

WebSocket 是基于 TCP 的一种新的网络协议。它实现了浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接, 并进行双向数据传输。

HTTP协议和WebSocket协议对比:

  • HTTP是短连接
  • WebSocket是长连接
  • HTTP通信是单向的,基于请求响应模式
  • WebSocket支持双向通信
  • HTTP和WebSocket底层都是TCP连接

设计:

  • 通过WebSocket实现管理端页面和服务端保持长连接状态
  • 当客户支付后,调用WebSocket的相关API实现服务端向客户端推送消息
  • 客户端浏览器解析服务端推送的消息,判断是来单提醒还是客户催单,进行相应的消息提示和语音播报
  • 约定服务端发送给客户端浏览器的数据格式为JSON,字段包括:type,orderId,content
    • type 为消息类型,1为来单提醒 2为客户催单
    • orderId 为订单id
    • content 为消息内容

创建websocket/WebSocketServer,实现WebSocket服务

@Component
@ServerEndpoint("/ws/{sid}")
public class WebSocketServer {

    //存放会话对象
    private static Map<String, Session> sessionMap = new HashMap();

    /**
     * 连接建立成功调用的方法
     */
    @OnOpen
    public void onOpen(Session session, @PathParam("sid") String sid) {
        System.out.println("客户端:" + sid + "建立连接");
        sessionMap.put(sid, session);
    }

    /**
     * 收到客户端消息后调用的方法
     *
     * @param message 客户端发送过来的消息
     */
    @OnMessage
    public void onMessage(String message, @PathParam("sid") String sid) {
        System.out.println("收到来自客户端:" + sid + "的信息:" + message);
    }

    /**
     * 连接关闭调用的方法
     *
     * @param sid
     */
    @OnClose
    public void onClose(@PathParam("sid") String sid) {
        System.out.println("连接断开:" + sid);
        sessionMap.remove(sid);
    }

    /**
     * 群发
     *
     * @param message
     */
    public void sendToAllClient(String message) {
        Collection<Session> sessions = sessionMap.values();
        for (Session session : sessions) {
            try {
                //服务器向客户端发送消息
                session.getBasicRemote().sendText(message);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

创建WebSocketTask中,通过WebSocket向客户端发送消息

@Component
public class WebSocketTask {
    @Autowired
    private WebSocketServer webSocketServer;

    /**
     * 通过WebSocket向客户端发送消息
     */
//    @Scheduled(cron = "0/5 * * * * ?")
    @Scheduled(fixedRate = Long.MAX_VALUE)
    public void sendMessageToClient() {
        webSocketServer.sendToAllClient("这是来自服务端的消息:" + DateTimeFormatter.ofPattern("HH:mm:ss").format(LocalDateTime.now()));
    }
}

在OrderServiceImpl的适当位置中写入代码,通过Websocket向客户端浏览器推送消息

// 通过Websocket向客户端浏览器推送消息
Map map = new HashMap();
map.put("type", 1); // 1表示来单提醒, 2表示客户吹催单
map.put("orderId", orders.getId());
map.put("content", "订单号:" + orders.getNumber());

String json = JSON.toJSONString(map);
webSocketServer.sendToAllClient(json);

c. 催单提醒

在OrderController中,创建客户催单的接口方法

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

在OrderServiceImpl中,实现客户催单的方法,及其父类接口文章来源地址https://www.toymoban.com/news/detail-582489.html

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

    // 校验订单是否存在,并且状态为4
    if (ordersDB == null) {
        throw new OrderBusinessException(MessageConstant.ORDER_NOT_FOUND);
    }

    // 通过Websocket向客户端浏览器推送消息
    Map map = new HashMap();
    map.put("type", 2); // 1表示来单提醒, 2表示客户吹催单
    map.put("orderId", id);
    map.put("content", "订单号:" + ordersDB.getNumber());

    String json = JSON.toJSONString(map);
    webSocketServer.sendToAllClient(json);
}

到了这里,关于itheima苍穹外卖项目学习笔记--Day10: 订单状态定时处理/来单提醒和客户催单的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 苍穹外卖day10——订单状态定时处理(Spring Task)、来单提醒和客户催单(WebSocket)

       对于超时没处理的需要定时程序处理。基于SpringTask实现。 来单提醒和客户催单。基于WebSocket实现。     周几通常不能和日一起指定。   cron表达式在线生成器 在线Cron表达式生成器  创建定时任务类     新建一个task包中一个类如下 在OrderMapper中 运行测试无误。     导

    2024年02月14日
    浏览(38)
  • 苍穹外卖-day10:Spring Task、订单状态定时处理、来单提醒(WebSocket的应用)、客户催单(WebSocket的应用)

    Spring Task 订单状态定时处理 WebSocket 来单提醒 客户催单 功能实现: 订单状态定时处理 、 来单提醒 和 客户催单 订单状态定时处理: 来单提醒: 客户催单: 1.1 介绍 Spring Task 是Spring框架提供的任务调度工具,可以按照约定的时间 自动执行 某个代码逻辑。 定位 :定时任务框

    2024年04月28日
    浏览(32)
  • Java项目-苍穹外卖-Day10-SpirngTask及WebSocket

    本章实现的业务功能 超时未支付订单自动取消,配送中订单商家忘点完成自动再固定时间检查且修改成完成状态 来单提醒功能 催单提醒功能 一般的话周几和第几日是不能同时出现的 因为比如 4月15日 周四 可能4月15日不是周四 可能冲突的 所以周和日一般只能有一个 现在有

    2024年02月09日
    浏览(29)
  • 苍穹外卖day09——历史订单模块(用户端)+订单管理模块(管理端)

    分页查询历史订单 可以根据订单状态查询 展示订单数据时,需要展示的数据包括:下单时间、订单状态、订单金额、订单明细(商品名称、图片) OrderMapper  对应的映射文件   OrderDetailMapper 测试无误 待支付和待接单状态下,用户可直接取消订单 商家已接单状态下,用户取

    2024年02月15日
    浏览(32)
  • 苍穹外卖day11笔记

    今日首先介绍前端技术Apache ECharts,说明后端需要准备的数据,然后讲解具体统计功能的实现,包括营业额统计、用户统计、订单统计、销量排名。 ECharts是一款基于 Javascript 的数据可视化图表库。我们用它来展示图表数据。 步骤 1). 引入echarts.js 文件 2). 为 ECharts 准备一个设

    2024年02月13日
    浏览(33)
  • 苍穹外卖day02项目日志

    参考产品原型,设计表和接口。 1.1.1设计表 看员工管理的产品原型: 有员工姓名、账号、手机号、账号状态、最后操作时间等。 注意,操作一栏不是字段,其中的启用禁用才是。 再看添加员工的原型:  可以发现还有性别和身份证号。 不要忘了旁边: 还有密码。 总结出了

    2024年02月14日
    浏览(57)
  • 项目实战————苍穹外卖(DAY11)

    Apache ECharts 营业额统计 用户统计 订单统计 销量排名Top10 功能实现: 数据统计 数据统计效果图: 1.1 介绍 Apache ECharts 是一款基于 Javascript 的数据可视化图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表。 官网地址:Apache ECharts 常见效果展示: 1). 柱形图

    2024年01月20日
    浏览(39)
  • 黑马苍穹外卖学习Day12

    结果 Controller层 Service实现类

    2024年01月25日
    浏览(42)
  • 苍穹外卖 Spring Task 来单提醒 催单Apache ECharts day10~11

    Spring Task 订单状态定时处理 WebSocket 来单提醒 客户催单 功能实现: 订单状态定时处理 、 来单提醒 和 客户催单 订单状态定时处理: 来单提醒: 客户催单: 1.1 介绍 Spring Task 是Spring框架提供的 任务调度工具 ,可以按照约定的时间自动执行某个代码逻辑。 定位: 定时任务框

    2024年02月14日
    浏览(29)
  • Java项目-苍穹外卖-Day11-Apache ECharts数据统计

    主要是以下四项的统计,以不同形式的图形进行展示 自己去网站上看一哈,我不太懂前端 com.sky.controller.admin.ReportController com.sky.service.impl.ReportServiceImpl.java orderMapper orderMapper.xml Reportcontroller ReportServiceImpl orderMapper.xml reportController ReportServiceImpl orderMapper.xml

    2024年02月09日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包