利用WebSocket实现来单提醒和用户催单

news2024/11/15 14:00:26

文章目录

    • 概要
    • 整体架构流程
    • 技术细节
    • 小结

概要

来单提醒:
业务场景:在电商平台、外卖平台等应用场景中,当有新的订单产生时,系统需要及时通知相关人员处理新订单。
目的:确保订单能够得到快速响应,提高客户满意度和服务效率。
用户催单:
业务场景:在订单处理过程中,如果用户长时间未收到订单状态更新,可能会发起催单请求。
目的:提升用户体验,确保订单处理流程透明化,及时反馈订单进度。
这两种机制通常结合使用,共同保障订单处理的高效性和用户的满意度。

需求分析以及接口设计


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

技术细节

1.Controller层

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

2.Service层:

 @Override
    public void reminder(Long id) {
        Orders ordersDB = orderMapper.getById(id);
        if(ordersDB == null){
            throw new OrderBusinessException(MessageConstant.ORDER_STATUS_ERROR);
        }

        HashMap<String, Object> map = new HashMap<>();
        map.put("type",2);
        map.put("orderId",id);
        map.put("content","订单id:" + ordersDB.getNumber());
        String json = JSON.toJSONString(map);
        webSocketServer.sendToAllClient(json);

    }
public OrderSubmitVO orderSubmit(OrdersSubmitDTO ordersSubmitDTO) {
        //1.排除异常(购物车为空,地址为空)
        //向购物车表查询该用户的购物车,并判空
        Long userId = BaseContext.getCurrentId();
        ShoppingCart shoppingCart = new ShoppingCart();
        shoppingCart.setUserId(userId);
        List<ShoppingCart> shoppingCarts = shoppingCartMapper.selectByUserId(shoppingCart);
        if (shoppingCarts == null || shoppingCarts.size() == 0) {
            throw new ShoppingCartBusinessException(MessageConstant.SHOPPING_CART_IS_NULL);
        }
        //向地址表中查询该用户的地址信息,并判空
        Long addressBookId = ordersSubmitDTO.getAddressBookId();
        AddressBook addressBook = addressBookMapper.getById(addressBookId);
        if (addressBook == null) {
            throw new AddressBookBusinessException(MessageConstant.ADDRESS_BOOK_IS_NULL);
        }

        //2.向订单表插入1条数据
        Orders orders = new Orders();
        BeanUtils.copyProperties(ordersSubmitDTO, orders);
        String address = addressBook.getProvinceName() + addressBook.getCityName() + addressBook.getDistrictName() + addressBook.getDetail();
        orders.setAddress(address);
        orders.setOrderTime(LocalDateTime.now());
        orders.setConsignee(addressBook.getConsignee());
        orders.setUserId(userId);
        orders.setPayStatus(Orders.UN_PAID);
        orders.setStatus(Orders.PENDING_PAYMENT);
        orders.setNumber(String.valueOf(System.currentTimeMillis()));
        orderMapper.insert(orders);
        //3.向订单明细表插入n条数据
        List<OrderDetail> orderDetails = new ArrayList<>();
        shoppingCarts.forEach(cart -> {
            OrderDetail orderDetail = new OrderDetail();
            BeanUtils.copyProperties(cart, orderDetail);
            orderDetail.setOrderId(orders.getId());
            orderDetails.add(orderDetail);
        });
        orderDetailMapper.insertBatch(orderDetails);
        //4.清空购物车
        shoppingCartMapper.deleteByUserId(userId);
        //由于微信支付没有商家证件,为了接下来的接口能顺利测试,则把订单统一改成已支付
        orders.setStatus(Orders.PAID);
        orderMapper.update(orders);
        //利用websocket实现商家来单提醒
        Map<String,Object> map = new HashMap<>();
        map.put("type",1);
        map.put("orderId",orders.getId());
        map.put("content","订单号:" + orders.getNumber());
        String json = JSON.toJSONString(map);
        webSocketServer.sendToAllClient(json);
        //5.返回VO对象
        OrderSubmitVO orderSubmitVO = new OrderSubmitVO();
        orderSubmitVO.setOrderNumber(orders.getNumber());
        orderSubmitVO.setOrderAmount(orders.getAmount());
        orderSubmitVO.setOrderTime(orders.getOrderTime());
        orderSubmitVO.setId(orders.getId());
        return orderSubmitVO;
    }

 

效果展示

1.建立长连接

2.用户下单 

3.收到来单提醒 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2038913.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

XSS盲打与cookie劫持

目录 【学习目标、重难点知识】 【学习目标】 【重难点知识】 XSS盲打&#xff08;加载远程攻击payload&#xff09; XSS偷cookie cookie收集 在线XSS收集平台的使用 1. BeeF框架的使用 BeeF简介 安装和使用 XSS 一些实战应用 1. XSS PDF 2. 公网投毒 3. 网站挂马…

WUP-CH34X ch34x系列芯片USB转串口通信uniapp插件使用说明

插件地址&#xff1a;WUP-CH34X 系列芯片USB转串口通信安卓库 简介 本文档是针对 CH340/CH341/CH342/CH343/CH344/CH347/CH9101/CH9102/CH9103/CH9104/CH9143的 USB 转串口安卓库的开发说明文档。 主要介绍如何使用芯片的 USB 转异步串口功能&#xff08;以下简称 CH34XUART…

python 使用正则表达式判断图片路径是否是超链接

在Python中&#xff0c;判断一个给定的字符串&#xff08;假设为图片路径&#xff09;是否是网页链接&#xff08;URL&#xff09;&#xff0c;你可以通过检查该字符串是否符合URL的基本格式来实现。虽然这个方法不能保证链接一定指向图片&#xff0c;但它能判断该字符串是否是…

La-Z-Boy EDI项目测试流程详解

在此前的文章《家居EDI&#xff1a;La-Z-Boy EDI 项目案例》中&#xff0c;为大家介绍了La-Z-Boy的EDI 需求以及在知行之桥EDI系统中的具体实现&#xff0c;本文主要为大家介绍La-Z-Boy EDI项目测试流程。 梳理需求文档 La-Z-Boy 提供的EDI资料主要包括&#xff1a;EDI 850订…

在IntelliJ IDEA中利用Git拉取项目

1 访问gitee或github&#xff0c;找到项目对应的仓库&#xff0c;并复制仓库地址。 2 打开IDEA&#xff0c;依次选择菜单:File->New->Project from Version Control 3 在弹出框中输入仓库路径(从第一步中gitee或github复制的路径)并点击Clone 4 在弹出框中输入gite…

Mybatis框架——使用案例详细教程

文章目录 一、项目创建1.1 创建 Idea 项目1.2 导入必要依赖 二、数据库配置2.1 创建数据库2.2 配置数据库连接信息 三、MyBatis 配置3.1 创建配置文件 mybatis-config.xml3.2 创建 SqlSessionFactory 实例 四、项目测试和运行4.1 创建实体类4.2 创建 mapper.xml 文件4.3 创建 m…

CentOS7安装Docker教程(含最新镜像地址)

文章目录 1 安装前必读2 安装Docker的详细步骤3 配置镜像加速 1 安装前必读 在安装 Docker 之前&#xff0c;先说一下配置&#xff0c;我这里是Centos7 Linux 内核&#xff1a;官方建议 3.10 以上&#xff0c;3.8以上貌似也可。 注意&#xff1a;本文的命令使用的是 root 用户…

UE基础 —— 工具和编辑器

目录 Level Editor Static Mesh Editor Material Editor Blueprint Editor Physics Asset Editor Behavior Tree Editor Niagara Editor UMG UI Editor Font Editor Sequencer Editor Animation Editor Control Rig Editor Sound Cue Editor Media Editor nDisp…

JUC-变量的线程安全

成员变量和静态变量是否线程安全&#xff1f; 如果它们没有共享&#xff0c;则线程安全&#xff0c;即没有被外部访问。 如果它们被共享了&#xff0c;根据它们的状态是否能够改变&#xff0c;又分两种情况 如果只有读操作&#xff0c;则线程安全 如果有读写操作&#xff0c;…

【图形学】TA之路-矩阵应用平移-旋转-大小

矩阵应用&#xff1a;在 Unity 中&#xff0c;Transform 和矩阵之间的关系非常密切。Transform 组件主要用于描述和控制一个物体在三维空间中的位置、旋转和缩放&#xff0c;而这些操作背后实际上都是通过矩阵来实现的 1. Transform 组件与矩阵的关系 Transform 组件包含以下…

java简单实现双链表代码

package com.se.day03.aGenericity.eDataStructrue;/*** 自定义一个双链表的数据结构。**/public class MyDoubleList<E> {//新创建容器时&#xff0c;头部和尾部元素都是null,size0;private Node head; //头部元素private Node tail; //尾部元素private int size; // …

特殊数组Z(前缀和)

前言&#xff1a;想了好一会才想到是前缀和来写&#xff0c;并且我一开始的是从考虑这个数和这个数后面一个数&#xff0c;导致边界烦了我好久 看了一下&#xff0c;考虑这个数和这个数前一个数更好 class Solution { public:vector<bool> isArraySpecial(vector<int…

按键按下,LED 点亮,但是,理论和现象不符

通过 Debug &#xff0c;解决了一个 Bug&#xff0c;很开心&#x1f604;&#xff0c;记录下 想实现的效果&#xff1a;按下 PB12 上的按钮&#xff0c;PA7 上的 LED 点亮&#xff1b;松开&#xff0c;LED 熄灭 单片机型号&#xff1a;STM32F103C8T6 PB12 为上拉电阻&#xf…

高可用负载均衡集群

高可用负载均衡集群 相比单点的负载均衡集群&#xff0c;高可用负载均衡集群可以解决以下两个问题。 1. real server某个服务down会怎么样&#xff1f;如何解决&#xff1f; 解决 自动调用好的real server 2. scheduler server down会怎么样&#xff1f;如何解决&#xff1f…

Docker容器管理之FAQ

一、前言 某次&#xff0c;某容器服务发现无法使用了&#xff0c;查看状态为restaring状态&#xff0c;后看是云主机重启了&#xff0c;导致本地的nfs-server未自动启动&#xff0c;导致关联的集群主机&#xff0c;远程挂载点无法使用&#xff0c;影响容器服务运行。故此&#…

Qt编译错误: error: msvc-version.conf loaded but QMAKE_MSC_VER isn‘t set

方法一&#xff1a;清空构建目录 清空当前目录的多余文件即可&#xff0c;具体操作如下 一个正常的Qt项目刚被创建且没有编译时是这样的 一个main文件&#xff0c;一个pro文件&#xff0c;一个user文件&#xff0c;一个头文件(.h)&#xff0c;和一个源文件(.cpp)&#xff0c;一…

springsecurity的学习(四):实现授权

简介 springsecurity的授权&#xff0c;自定义授权失败的处理&#xff0c;跨域的处理和自定义权限校验方法的介绍 授权 权限系统作用 在后台进行用户权限的判断&#xff0c;判断当前用户是否有相应的权限&#xff0c;必须具有所需的权限才能进行相应的操作&#xff0c;以此…

高通分享:glTF 2.0扩展MPEG、3GPP在AR/VR 3D场景的沉浸式体验

日前&#xff0c;高通技术标准高级总监托马斯斯托克哈默尔&#xff08;Thomas Stockhammer&#xff09;和高通技术标准总监伊梅德布亚齐兹&#xff08;Imed Bouazizi&#xff09;撰文分享了ISO和Khronos之间是如何紧密合作&#xff0c;并最终开发出MPEG-I Scene Description IS…

基于LangChain的大模型学习手册(入门级)

前言 时间轴来到2024年的下半年&#xff0c;“大模型”这个术语&#xff0c;从几乎是ChatGPT的代名词&#xff0c;转变为AI领域一个划时代产品的广泛词汇。从单一到广泛&#xff0c;代表大模型这个世界级产品&#xff0c;正在走向枝繁叶茂的生命阶段。截止现在&#xff0c;目前…

【算法分析与设计】期末复习-小题100道

目录 0、基础知识点 一、单选题 二、多选题 三、判断题 0、基础知识点 &#xff08;1&#xff09;常见时间复杂度与公式&#xff1a; 汉诺塔&#xff1a;T(n)O(2^n) 全排列&#xff1a;T(n)O(n!) 整数划分&#xff1a; 正整数n的划分&#xff1a;p(n)q(n,n) 分治&#…