♪苍穹外卖♪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/7/6 3:29:14阅读更多 →
CPT Markets:从工具可用性切入的标准解读

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

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

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

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

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

2026/7/6 2:07:53阅读更多 →
ResNet-50 特征图可视化:从Grad-CAM到3D卷积核的5步调试法

ResNet-50 特征图可视化:从Grad-CAM到3D卷积核的5步调试法

ResNet-50特征图可视化:5步诊断模型性能瓶颈的工程实践当你的ResNet-50模型在测试集上表现不佳时,作为工程师的你首先会做什么?调整超参数?增加数据量?这些常规操作可能让你在黑暗中摸索数周却收效甚微。本文将揭示一种…

2026/7/6 21:42:27阅读更多 →
Tampermonkey v4.19 + U校园脚本:浏览器自动化答题与挂时长配置 3 步指南

Tampermonkey v4.19 + U校园脚本:浏览器自动化答题与挂时长配置 3 步指南

Tampermonkey进阶实战:浏览器自动化工具的安全配置与高效管理在数字化学习环境中,效率工具正逐渐成为学生群体的得力助手。Tampermonkey作为最受欢迎的浏览器脚本管理工具之一,其灵活性和强大功能使其在自动化任务处理领域占据重要地位。本文…

2026/7/6 21:42:27阅读更多 →
Chrome 超链接失效排查:3步定位金格插件(KGChromePlugin)并卸载修复

Chrome 超链接失效排查:3步定位金格插件(KGChromePlugin)并卸载修复

Chrome 超链接失效排查:3步定位金格插件(KGChromePlugin)并卸载修复当你在微信、VSCode等应用中点击链接却毫无反应时,这种"假死"状态往往让人抓狂。本文将带你深入问题核心,揭示一个鲜为人知的罪魁祸首——金格插件(KGChromePlugi…

2026/7/6 21:42:27阅读更多 →
OpenCV 4.8 仿射变换实战:5种数据增广组合对YOLOv5 mAP影响分析

OpenCV 4.8 仿射变换实战:5种数据增广组合对YOLOv5 mAP影响分析

OpenCV 4.8仿射变换实战:5种数据增广组合对YOLOv5 mAP的影响分析1. 数据增广在目标检测中的核心价值当我们在训练目标检测模型时,经常会遇到训练数据不足或样本多样性不够的问题。数据增广技术通过创建原始图像的修改版本,能够显著提升模型的…

2026/7/6 21:42:27阅读更多 →
PyTorch 2.3 自定义 ReLU 变体:实现 3 种梯度优化策略解决 Dying ReLU

PyTorch 2.3 自定义 ReLU 变体:实现 3 种梯度优化策略解决 Dying ReLU

PyTorch 2.3 自定义 ReLU 变体:实现 3 种梯度优化策略解决 Dying ReLU在深度神经网络中,激活函数的选择直接影响模型的训练效果和最终性能。作为最常用的激活函数之一,ReLU(Rectified Linear Unit)因其简单高效而广受欢…

2026/7/6 21:42:27阅读更多 →
Ligolo-ng Web界面部署与多用户协作内网穿透实战指南

Ligolo-ng Web界面部署与多用户协作内网穿透实战指南

1. 项目概述:为什么我们需要一个协作式内网穿透工具 在渗透测试或红队评估项目中,一个经典且棘手的场景是:当你通过一个初始立足点(比如一个Web Shell)进入目标内网后,如何将内网的流量稳定、隐蔽地转发出来…

2026/7/6 21:37:26阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/6 4:26:20阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/6 2:48:33阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/6 0:10:35阅读更多 →
Seraphine:基于LCU API的英雄联盟智能游戏助手技术解析与应用指南

Seraphine:基于LCU API的英雄联盟智能游戏助手技术解析与应用指南

Seraphine:基于LCU API的英雄联盟智能游戏助手技术解析与应用指南 【免费下载链接】Seraphine 英雄联盟战绩查询工具 项目地址: https://gitcode.com/gh_mirrors/se/Seraphine 技术架构先行:官方接口的合规应用 你是否曾在BP阶段手忙脚乱&#x…

2026/7/6 0:03:39阅读更多 →
多协议远程连接管理工具mRemoteNG:告别混乱,统一你的远程桌面管理

多协议远程连接管理工具mRemoteNG:告别混乱,统一你的远程桌面管理

多协议远程连接管理工具mRemoteNG:告别混乱,统一你的远程桌面管理 【免费下载链接】mRemoteNG mRemoteNG is the next generation of mRemote, open source, tabbed, multi-protocol, remote connections manager. 项目地址: https://gitcode.com/gh_m…

2026/7/6 0:03:39阅读更多 →
COUNT(DISTINCT) 与 GROUP BY 去重统计:5 亿数据量下的性能实测与选型指南

COUNT(DISTINCT) 与 GROUP BY 去重统计:5 亿数据量下的性能实测与选型指南

COUNT(DISTINCT) 与 GROUP BY 去重统计:5 亿数据量下的性能实测与选型指南在数据分析和处理领域,去重统计是最基础也是最频繁使用的操作之一。当数据量达到亿级规模时,不同的去重统计方法在性能上可能产生天壤之别。本文将基于 5 亿行数据的实…

2026/7/6 0:03:39阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/6 4:45:01阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/6 4:45:01阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/6 4:45:03阅读更多 →