当前位置: 首页 > news >正文

项目-苍穹外卖(十五) WebSocket+语音播报功能实现(来订单+催单)

一、介绍

二、入门案例

配置类:

package com.sky.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;

/**
 * WebSocket配置类,用于注册WebSocket的Bean
 */
@Configuration
public class WebSocketConfiguration {

    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }

}

websocket:

package com.sky.websocket;

import org.springframework.stereotype.Component;
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

/**
 * 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();
            }
        }
    }

}

定时任务: 

package com.sky.task;

import com.sky.websocket.WebSocketServer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

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

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

三、语音播报

来订单:

    /**
     * 订单支付
     *
     * @param ordersPaymentDTO
     * @return
     */
    public OrderPaymentVO payment(OrdersPaymentDTO ordersPaymentDTO) throws Exception {
        // 当前登录用户id
        Long userId = BaseContext.getCurrentId();
        User user = userMapper.getById(userId);

/*        //调用微信支付接口,生成预支付交易单
        JSONObject jsonObject = weChatPayUtil.pay(
                ordersPaymentDTO.getOrderNumber(), //商户订单号
                new BigDecimal(0.01), //支付金额,单位 元
                "苍穹外卖订单", //商品描述
                user.getOpenid() //微信用户的openid
        );

        if (jsonObject.getString("code") != null && jsonObject.getString("code").equals("ORDERPAID")) {
            throw new OrderBusinessException("该订单已支付");
        }*/

        JSONObject jsonObject = new JSONObject();
        jsonObject.put("code", "ORDERPAID");
        OrderPaymentVO vo = jsonObject.toJavaObject(OrderPaymentVO.class);
        vo.setPackageStr(jsonObject.getString("package"));

        //为替代微信支付成功后的数据库订单状态更新,多定义一个方法进行修改
        Integer OrderPaidStatus = Orders.PAID; //支付状态,已支付
        Integer OrderStatus = Orders.TO_BE_CONFIRMED;  //订单状态,待接单
        //发现没有将支付时间 check_out属性赋值,所以在这里更新
        LocalDateTime check_out_time = LocalDateTime.now();

        orderMapper.updateStatus(OrderStatus, OrderPaidStatus, check_out_time, orderId);

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

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

        return vo;
    }

催单:

 

相关文章:

  • 使用 PyCharm 创建 Python 项目时,默认生成的 .venv 文件夹是属于什么类型的虚拟环境
  • leetcode每日一题——k-avoiding 数组的最小总和
  • 主流软件工程模型全景剖析
  • 零拷贝原理面试回答
  • 【字符设备驱动开发–IMX6ULL】(二)Linux 设备号
  • 多模态交互下的车载机械臂体感控制系统设计与实现研究
  • 计算机网络基础:软件定义网络(SDN)深度解析
  • 使用 fetch 实现流式传输:核心原理与实践
  • 启幕数据结构算法雅航新章,穿梭C++梦幻领域的探索之旅——堆的应用之堆排、Top-K问题
  • 3.26 代码随想录第二十七天打卡
  • 参考文献格式对齐1-100
  • idea 快捷键
  • Harbor自建证书实现Https访问
  • LLVM学习-DragonEgg工具
  • 强化学习和智能决策:Q-Learning和Deep Q-Learning算法
  • 漫画|基于SprinBoot+vue的漫画网站(源码+数据库+文档)
  • 【0基础跟AI学软考高项】质量管理
  • PVE 安装黑苹果 MacOS
  • mac m3 pro 部署 stable diffusion webui
  • cJSON- API 深度解析:设计理念与实现原理(二)
  • 武康大楼再开发:一栋楼火还不够,要带火街区“朋友圈”
  • 小雨伞保险经纪母公司手回集团通过港交所聆讯
  • 年在沪纳税350亿人民币,这些全球头部企业表示“对上海承诺不会变”
  • 一图看懂|印巴交火后,双方基地受损多少?
  • 2025年中国网络文明大会将于6月10日在安徽合肥举办
  • 气候多米诺:厄尔尼诺与东南亚跨境害虫或威胁中国粮食安全