♪苍穹外卖♪Day9 | 项目日记
今日目标实现订单定时任务超时自动取消、自动完成集成 WebSocket 实现来单提醒和催单功能开始数据统计报表模块一、订单定时任务1.1 为什么需要定时任务有些业务不能等用户主动操作需要系统自动处理超时取消用户下单后15分钟未支付自动取消订单自动完成订单派送中超过一定时间自动标记为已完成这些场景用 Spring 的Scheduled注解实现。1.2 订单超时自动取消每分钟执行一次查找超过15分钟未支付的订单自动取消ComponentSlf4jpublicclassOrderTask{AutowiredprivateOrderMapperorderMapper;/** * 处理超时订单每分钟检查一次 */Scheduled(cron0 * * * * ?)publicvoidprocessTimeoutOrder(){log.info(处理超时订单{},LocalDateTime.now());// 查询超过15分钟未支付的订单LocalDateTimetimeLocalDateTime.now().plusMinutes(-15);ListOrdersordersListorderMapper.getByStatusAndOrderTimeLT(Orders.PENDING_PAYMENT,time);if(ordersList!nullordersList.size()0){for(Ordersorders:ordersList){orders.setStatus(Orders.CANCELLED);orders.setCancelReason(订单超时自动取消);orders.setCancelTime(LocalDateTime.now());orderMapper.update(orders);}}}}1.3 订单自动完成每天凌晨1点执行查找派送中超过60分钟的订单自动完成/** * 处理派送中的订单每天凌晨1点执行 */Scheduled(cron0 0 1 * * ?)publicvoidprocessDeliveryOrder(){log.info(处理派送中订单{},LocalDateTime.now());LocalDateTimetimeLocalDateTime.now().plusMinutes(-60);ListOrdersordersListorderMapper.getByStatusAndOrderTimeLT(Orders.DELIVERY_IN_PROGRESS,time);if(ordersList!nullordersList.size()0){for(Ordersorders:ordersList){orders.setStatus(Orders.COMPLETED);orders.setDeliveryTime(LocalDateTime.now());orderMapper.update(orders);}}}1.4 Cron 表达式速查表达式含义0 * * * * ?每分钟整点执行0 0 1 * * ?每天凌晨1点执行0/5 * * * * ?每5秒执行一次格式秒 分 时 日 月 周1.5 Mapper 新增Select(select * from orders where status #{status} and order_time #{orderTime})ListOrdersgetByStatusAndOrderTimeLT(Integerstatus,LocalDateTimeorderTime);二、WebSocket 实时消息推送2.1 为什么需要 WebSocket传统 HTTP 是请求-响应模式服务端不能主动通知客户端。但来单提醒需要服务端主动推送消息给管理端这时候就需要 WebSocket 长连接。2.2 配置注册ServerEndpointExporterBean让 Spring 支持 WebSocketConfigurationpublicclassWebSocketConfiguration{BeanpublicServerEndpointExporterserverEndpointExporter(){returnnewServerEndpointExporter();}}2.3 服务端实现ComponentServerEndpoint(/ws/{sid})Slf4jpublicclassWebSocketServer{// 存放连接的客户端privatestaticMapString,SessionsessionMapnewHashMap();OnOpenpublicvoidonOpen(Sessionsession,PathParam(sid)sid){log.info(客户端{} 建立连接,sid);sessionMap.put(sid,session);}OnClosepublicvoidonClose(PathParam(sid)sid){log.info(客户端{} 断开连接,sid);sessionMap.remove(sid);}OnMessagepublicvoidonMessage(Stringmessage,PathParam(sid)sid){log.info(收到来自客户端{} 的信息{},sid,message);}/** * 群发消息给所有客户端 */publicvoidsendToAllClient(Stringmessage){try{for(Sessionsession:sessionMap.values()){log.info(推送消息给客户端{},message);session.getBasicRemote().sendText(message);}}catch(IOExceptione){log.error(推送消息失败{},e.getMessage());}}}2.4 来单提醒用户支付成功后通过 WebSocket 向管理端推送新订单通知// PayNotifyController 中AutowiredprivateWebSocketServerwebSocketServer;RequestMapping(/paySuccess)publicvoidpaySuccessNotify(HttpServletRequestrequest,HttpServletResponseresponse)throwsException{// ... 解密、更新订单状态 ...// 推送来单提醒webSocketServer.sendToAllClient(来单提醒订单号 outTradeNo);responseToWeixin(response);}2.5 催单功能用户对已接单的订单进行催单GetMapping(/reminder/{id})publicResultreminder(PathVariable(id)Longid){orderService.reminder(id);returnResult.success();}publicvoidreminder(Longid){OrdersordersDBorderMapper.getById(id);if(ordersDBnull){thrownewOrderBusinessException(MessageConstant.ORDER_NOT_FOUND);}// 只有待接单和已确认状态才能催单if(!ordersDB.getStatus().equals(Orders.TO_BE_CONFIRMED)!ordersDB.getStatus().equals(Orders.CONFIRMED)){thrownewOrderBusinessException(MessageConstant.ORDER_STATUS_ERROR);}// 通过WebSocket推送催单消息webSocketServer.sendToAllClient(催单提醒订单号 ordersDB.getNumber());}三、数据统计报表进行中新增ReportController按日期范围查询营业额RestController(adminReportController)RequestMapping(/admin/report)publicclassReportController{AutowiredprivateReportServicereportService;GetMapping(/turnoverStatistics)publicResultTurnoverReportVOturnoverStatistics(LocalDatebegin,LocalDateend){TurnoverReportVOreportVOreportService.getTurnoverStatistics(begin,end);returnResult.success(reportVO);}}目前先实现了日期列表生成营业额数据查询还在完善中。四、项目整体进度模块状态员工管理✅ 完成分类管理✅ 完成菜品管理✅ 完成套餐管理✅ 完成文件上传✅ 完成店铺管理✅ 完成微信登录✅ 完成购物车✅ 完成地址簿✅ 完成订单管理✅ 完成微信支付✅ 完成定时任务✅ 完成WebSocket 来单提醒✅ 完成催单功能✅ 完成数据统计报表 进行中五、今日总结今天学了三个新技术Spring 定时任务Scheduled Cron 表达式实现订单超时自动取消和自动完成WebSocketServerEndpoint、OnOpen、OnClose、OnMessage实现服务端主动推送消息数据报表日期范围查询营业额统计接口进行中WebSocket 是之前没接触过的技术理解长连接和双向通信花了点时间。但实际写起来比想象中简单核心就是维护一个 Session Map需要推送时遍历所有 Session 发送消息。苍穹外卖 Day9 完成 ✅

相关新闻

Hermes Agent:构建下一代智能AI代理系统的技术架构与实践

Hermes Agent:构建下一代智能AI代理系统的技术架构与实践

Hermes Agent:构建下一代智能AI代理系统的技术架构与实践 【免费下载链接】hermes-agent The agent that grows with you 项目地址: https://gitcode.com/GitHub_Trending/he/hermes-agent 在人工智能代理技术快速演进的今天,开发者面临着多模态工…

2026/6/18 20:48:39阅读更多 →
CPT Markets:从工具可用性切入的标准解读

CPT Markets:从工具可用性切入的标准解读

对多数外汇相关用户来说,判断平台并不需要复杂术语,关键在于信息能否被快速理解、关键提示是否容易找到、服务体验是否稳定一致。以CPT Markets为例,这里聚焦这些更贴近实际使用的亮点与细节。在外汇相关服务中,读者最在意的通常是…

2026/6/18 20:48:39阅读更多 →
过期产品页面改造:替换衍生关键词,变废页为长效流量博客

过期产品页面改造:替换衍生关键词,变废页为长效流量博客

开篇前言 运营英文独立站过程中,几乎所有站点都会堆积大量永久停产、下架断货的过期产品页面。多数运营处理方式无非三种:直接删除页面生成 404、设置 301 批量重定向至分类页、添加 noindex 屏蔽索引。这三种操作都会直接损耗页面长期积累的外链权重、…

2026/6/18 20:48:39阅读更多 →
如何在浏览器中实现专业级3D建模?Chili3D完整指南

如何在浏览器中实现专业级3D建模?Chili3D完整指南

如何在浏览器中实现专业级3D建模?Chili3D完整指南 【免费下载链接】chili3d A browser-based 3D CAD application for online model design and editing 项目地址: https://gitcode.com/GitHub_Trending/ch/chili3d Chili3D是一款基于浏览器的开源3D CAD应用…

2026/6/18 21:58:48阅读更多 →
终极Windows Cleaner完整指南:如何快速解决C盘爆红问题

终极Windows Cleaner完整指南:如何快速解决C盘爆红问题

终极Windows Cleaner完整指南:如何快速解决C盘爆红问题 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服! 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner Windows Cleaner是一款专为Windows用户设计的免…

2026/6/18 21:58:48阅读更多 →
emWin下拉列表与编辑框控件深度解析:从创建到高级应用

emWin下拉列表与编辑框控件深度解析:从创建到高级应用

1. 项目概述:深入理解emWin的DROPDOWN与EDIT控件在嵌入式GUI开发这个行当里,控件(Widgets)就是咱们手里的砖瓦。你想想,一个设备,无论是工厂里的触摸屏、医院里的监护仪,还是家里的智能面板&…

2026/6/18 21:58:48阅读更多 →
质数取石子游戏【牛客tracker  每日一题】

质数取石子游戏【牛客tracker 每日一题】

质数取石子游戏 时间限制:1秒 空间限制:256M 网页链接 牛客tracker 牛客tracker & 每日一题,完成每日打卡,即可获得牛币。获得相应数量的牛币,能在【牛币兑换中心】,换取相应奖品!助力每…

2026/6/18 21:58:48阅读更多 →
OptiScaler完整教程:如何为你的游戏解锁终极超分辨率体验

OptiScaler完整教程:如何为你的游戏解锁终极超分辨率体验

OptiScaler完整教程:如何为你的游戏解锁终极超分辨率体验 【免费下载链接】OptiScaler OptiScaler bridges upscaling/frame gen across GPUs. Supports DLSS2/XeSS/FSR2 inputs, replaces native upscalers, enables FSR-FG/XeFG on non-FG titles. Supports Nukem…

2026/6/18 21:58:48阅读更多 →
WarcraftHelper:魔兽争霸3兼容性问题终极解决方案

WarcraftHelper:魔兽争霸3兼容性问题终极解决方案

WarcraftHelper:魔兽争霸3兼容性问题终极解决方案 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽争霸3在现代电脑上的各种兼容…

2026/6/18 21:53:48阅读更多 →
ZigBee HA智能家居开发实战:从集群模型到NXP JN516x代码实现

ZigBee HA智能家居开发实战:从集群模型到NXP JN516x代码实现

1. ZigBee HA:智能家居的“通用语言”与开发基石如果你正在或计划踏入智能家居设备开发领域,尤其是基于ZigBee协议,那么“ZigBee Home Automation”这个名词你一定不陌生。它不仅仅是ZigBee联盟定义的一套应用层规范,更是确保不同…

2026/6/18 0:00:24阅读更多 →
Java毕设选题推荐:基于 Spring Boot 的个人随笔博客运维管理系统的设计与实现 基于 Spring Boot 的用户原创博客分享社区【附源码、mysql、文档、调试+代码讲解+全bao等】

Java毕设选题推荐:基于 Spring Boot 的个人随笔博客运维管理系统的设计与实现 基于 Spring Boot 的用户原创博客分享社区【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/6/18 0:00:24阅读更多 →
JN517x嵌入式开发实战:看门狗、脉冲计数器与I2C接口的深度解析与避坑指南

JN517x嵌入式开发实战:看门狗、脉冲计数器与I2C接口的深度解析与避坑指南

1. 项目概述在嵌入式开发领域,尤其是基于NXP JN517x这类无线微控制器的项目中,系统稳定性和与外设的可靠交互是两大核心挑战。前者关乎产品能否在无人值守的复杂环境中长期运行,后者则决定了设备能否准确感知世界并与其他芯片“对话”。JN517…

2026/6/18 0:00:24阅读更多 →