苍穹外卖--开发记录day09-10

devtools/2024/10/24 8:21:52/

目录

  • 苍穹外卖day09-10
    • 一:springtask
    • 二:订单状态定时处理
    • 三:websocket
    • 四:来单提醒
    • 五:客户催单
  • 总结

苍穹外卖day09-10

首先第九天是实战日,要完成以下内容的开发:

用户端历史订单模块:

  • 查询历史订单
  • 查询订单详情
  • 取消订单
  • 再来一单

商家端订单管理模块:

  • 订单搜索
  • 各个状态的订单数量统计
  • 查询订单详情
  • 接单
  • 拒单
  • 取消订单
  • 派送订单
  • 完成订单

这里面基本上是增删改查,而且资料里有答案;我就不过多赘述了

直接进入第十天:

一:springtask

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可以去网站生成cron表达式Cron - 在线Cron表达式生成器

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

自定义任务类:在项目中再建一个软件包,然后定义一个类,类上要加上compont注解将类交给容器管理,然后定义一个方法。里面完成定时任务的逻辑,方法上要加上@Scheduled注解,里面指定cron表达式;

@Component
@Slf4j
public class Mytask {@Scheduled(cron = "0/5 * * * * ?")public void task(){log.info("定时任务已触发:{}",new Date());}
}

二:订单状态定时处理

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1:超时未支付:

@Scheduled(cron = "0 0/1 * * * ?")
public void PENDING_PAYMENTtask(){log.info("定时任务已触发:{}",new Date());LocalDateTime localDateTime = LocalDateTime.now().plusMinutes(-15);List<Orders>orders= orderMapper.select(Long.valueOf(Orders.PENDING_PAYMENT),localDateTime);for (Orders order : orders) {order.setStatus(Orders.CANCELLED);order.setCancelReason("超时未支付");order.setCancelTime(LocalDateTime.now());orderMapper.update(order);}
}

我们每分钟去检查有没有超时的,具体的超时时间就是:下单时间超过15分钟,也就是当前时间-下单时间》15分钟:

我们sql是这么写的:

@Select("select * from orders where status=#{status} and order_time<#{orderTime}")
List<Orders> select(Long status, LocalDateTime orderTime);

所以我们要传入的是当前时间减去谁5分钟,而localDateTime有方法可以直接减去,那么我们获取到了超时订单,就要遍历然后修改状态让超时订单取消,取消的话另外还要给取消原因和取消时间赋值;最后调用update修改就行了

2:派送中处理:

@Scheduled(cron = "0 0 1 * * ?")
public void  DELIVERY_IN_PROGRESStask(){LocalDateTime localDateTime = LocalDateTime.now().plusHours(-1);List<Orders> orders = orderMapper.select(Long.valueOf(Orders.DELIVERY_IN_PROGRESS), localDateTime);for (Orders order : orders) {order.setStatus(Orders.COMPLETED);orderMapper.update(order);}

我们每天的凌晨一点去检查有没有派送中的订单,这里我们还是用我们定义的那个mapper方法:查询的状态是配送中,并且下单时间是昨天,也就是当前时间减一小时;然后遍历集合修改状态就行了;

三:websocket

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

不同于http,http只能由客户端主动发送消息,不能由服务器发送,被称为请求响应;而websocket是双向传输,只要建立链接只会,双方可以互发消息;

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

具体步骤:1:导入websocket依赖坐标:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

然后要导入服务端组件:

@Component
@ServerEndpoint("/ws/{sid}")
public class WebSocketServer {//存放会话对象private static Map<String, Session> sessionMap = new HashMap();/*** 连接建立成功调用的方法*/@OnOpenpublic void onOpen(Session session, @PathParam("sid") String sid) {System.out.println("客户端:" + sid + "建立连接");sessionMap.put(sid, session);}/*** 收到客户端消息后调用的方法** @param message 客户端发送过来的消息*/@OnMessagepublic void onMessage(String message, @PathParam("sid") String sid) {System.out.println("收到来自客户端:" + sid + "的信息:" + message);}/*** 连接关闭调用的方法** @param sid*/@OnClosepublic 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();}}}}

@Component
@ServerEndpoint(“/ws/{sid}”)要有这两个注解,ServerEndpoint里是指定了建立连接的地址

还要导入一个配置类,用于注册websocket的组件

/*** WebSocket配置类,用于注册WebSocket的Bean*/
@Configuration
public class WebSocketConfiguration {@Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}}

四:来单提醒

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这里我们直接再用户支付成功后想管理端的前端发送消息,我们约定的消息是json格式的包含上述内容:

Map map=new HashMap<>();
map.put("type",1);
map.put("orderId",orders.getId());
map.put("content","订单号"+outTradeNo);
String jsonString = JSON.toJSONString(map);
webSocketServer.sendToAllClient(jsonString);

这里就是将我们要传入给前端的值存放在map中,然后将map转换为json格式;

五:客户催单

这里我们单独设置一个接口,因为是用户在点击催单后发送的请求,所以我们要单独设置接口:

controller:

@GetMapping("/reminder/{id}")
public Result reminder(@PathVariable Long id){Orders orders= orderService.reminder(id);return Result.success();
}

因为我们需要订单号所有我们还要去调用service

service:

@Override
public Orders reminder(Long id) {Orders orders = orderMapper.selectById(id);Map map=new HashMap<>();map.put("type",2);map.put("orderId",id);map.put("content","订单号"+orders.getNumber());String jsonString = JSON.toJSONString(map);webSocketServer.sendToAllClient(jsonString);return orders;
}

这里就是先查询信息,然后放入map中,再将map转成一个json字符串,然后再通过ws发送给前端;

总结

“orderId”,id);
map.put(“content”,“订单号”+orders.getNumber());
String jsonString = JSON.toJSONString(map);
webSocketServer.sendToAllClient(jsonString);
return orders;
}


> 这里就是先查询信息,然后放入map中,再将map转成一个json字符串,然后再通过ws发送给前端;# 总结今天学习了springtask的简单使用,用springtask来定义定时任务,然后学习了websocket的双向传输,了解了通过ws由服务器端向前端发送数据;完成了来单提醒,催单的功能;

http://www.ppmy.cn/devtools/128399.html

相关文章

Pr 视频效果:自动重构

视频效果/变换/自动重构 Transform/Auto Reframe 自动重构 Auto Reframe效果是用于快速调整视频素材以适应不同长宽比的一项强大工具。 随着各种平台和设备的多样化&#xff0c;视频内容需要适应不同的屏幕尺寸和比例&#xff0c;如 16:9&#xff08;横屏&#xff09;、9:16&am…

滑动窗口子串

文章目录 滑动窗口一、无重复字符的最长子串二、找到字符串中所有字母异位词 子串三、和为 K 的子数组四、滑动窗口最大值五、最小覆盖子串 滑动窗口 一、无重复字符的最长子串 题目链接 &#xff08;方法一&#xff1a;暴力枚举&#xff09; &#xff08;方法二&#xff…

qt QPushButton详解

QPushButton是Qt Widgets模块中的一个基本控件&#xff0c;用于提供可点击的按钮。它是用户界面中最为常见和常用的控件之一&#xff0c;通过点击按钮&#xff0c;用户可以触发特定的应用程序操作。 重要方法 QPushButton(const QIcon &icon, const QString &text, QWi…

如何使用python seaborn进行复杂的数据可视化操作?

数据可视化是数据分析中至关重要的一部分,它能够帮助我们更直观地理解数据,发现潜在的模式和趋势。 Python作为一种强大的编程语言,拥有众多数据可视化库,其中Seaborn是一个基于Matplotlib的高级可视化库,特别适合用于统计数据的可视化。 本文将深入探讨如何使用Seaborn…

linux中wall-clock time 与CPU时间的关系

‌Wall-clock time与CPU时间的关系‌ ‌定义‌&#xff1a; ‌Wall-clock time‌&#xff1a;从进程开始运行到结束&#xff0c;系统时钟走过的总时间&#xff0c;包含进程阻塞和等待的时间。 ‌CPU时间‌&#xff1a;分为用户CPU时间和系统CPU时间&#xff0c;分别表示进程在…

php后端学习,Java转php

遇到前后端跨域 php解决跨域问题可以加上下面的代码&#xff1a; header(“Access-Control-Allow-Origin:*”); 并且查看自己的数据库信息是否连接成功。 从Java转php 个人感受php跟偏向前端&#xff0c; 写后端逻辑时没有像java又springboot工具方便。 但是和前端联调很方便…

列表、元组、集合、字典和 pandas 数据框(DataFrame)之间的数据转换

二、列表、元组、集合、字典和 pandas 数据框&#xff08;DataFrame&#xff09;之间的数据转换 在 Python 中&#xff0c;列表、元组、集合、字典和 pandas 数据框&#xff08;DataFrame&#xff09;是常见的数据结构&#xff0c;它们可以通过多种方式相互转换。每种数据结构…

PHP PDO:安全、灵活的数据持久层解决方案

PHP PDO:安全、灵活的数据持久层解决方案 PHP PDO(PHP Data Objects)是一个轻量级的、具有兼容接口的数据持久层抽象层。它提供了一个统一的API来访问多种数据库系统,如MySQL、PostgreSQL、SQLite、Oracle等。PDO扩展在PHP 5.1.0及以上版本中可用,并已成为PHP社区中处理数…