Skip to content

Commit

Permalink
来单提醒功能代码实现
Browse files Browse the repository at this point in the history
  • Loading branch information
HaokaiLau committed Feb 10, 2024
1 parent 23be5d8 commit 36369b5
Show file tree
Hide file tree
Showing 5 changed files with 149 additions and 19 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
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();
}

}
55 changes: 37 additions & 18 deletions sky-server/src/main/java/com/sky/service/impl/OrderServiceImpl.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.sky.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.JSON;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.sky.constant.MessageConstant;
Expand All @@ -18,17 +18,19 @@
import com.sky.vo.OrderStatisticsVO;
import com.sky.vo.OrderSubmitVO;
import com.sky.vo.OrderVO;
import com.sky.websocket.WebSocketServer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
Expand Down Expand Up @@ -57,6 +59,9 @@ public class OrderServiceImpl implements OrderService {
@Autowired
private WeChatPayUtil weChatPayUtil;

@Autowired
private WebSocketServer webSocketServer;

/**
* 用户下单
*
Expand Down Expand Up @@ -139,21 +144,22 @@ public OrderPaymentVO payment(OrdersPaymentDTO ordersPaymentDTO) throws Exceptio
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("该订单已支付");
}

OrderPaymentVO vo = jsonObject.toJavaObject(OrderPaymentVO.class);
vo.setPackageStr(jsonObject.getString("package"));

return vo;
// 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("该订单已支付");
// }
//
// OrderPaymentVO vo = jsonObject.toJavaObject(OrderPaymentVO.class);
// vo.setPackageStr(jsonObject.getString("package"));

// return vo;
return new OrderPaymentVO();
}

/**
Expand All @@ -165,18 +171,31 @@ public void paySuccess(String outTradeNo) {

// 根据订单号查询订单
Orders ordersDB = orderMapper.getByNumber(outTradeNo);
Long orderId = ordersDB.getId();

// TODO 由于未接入微信支付,所以对订单状态和订单的支付状态进行判断,只有待付款和未支付的状态才能更新订单的相关状态
if (ordersDB.getStatus().equals(Orders.PENDING_PAYMENT) && ordersDB.getPayStatus().equals(Orders.UN_PAID)) {
// 根据订单id更新订单的状态、支付方式、支付状态、结账时间
Orders orders = Orders.builder()
.id(ordersDB.getId())
.id(orderId)
.status(Orders.TO_BE_CONFIRMED)
.payStatus(Orders.PAID)
.checkoutTime(LocalDateTime.now())
.build();

orderMapper.update(orders);

//当用户支付成功后就为管理端页面推送来单提醒
//通过websocket向客户端浏览器推送消息 消息封装在一个Map集合中 里面的key有 type orderId content
Map map = new HashMap<>();
map.put("type",1);//1表示来单提醒 2表示用户催单
map.put("orderId",orderId);
map.put("content","订单号:" + outTradeNo);

//把map转成json字符串
String json = JSON.toJSONString(map);
//把json字符串推送给所有与websocket连接的客户端浏览器
webSocketServer.sendToAllClient(json);
}

}
Expand Down
2 changes: 1 addition & 1 deletion sky-server/src/main/java/com/sky/task/OrderTask.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ public class OrderTask {
@Scheduled(cron = "0 * * * * ?")//每分钟触发一次
public void processTimeoutOrder() {
log.info("定时处理超时订单:{}", LocalDateTime.now());
//select * from orders where status = ? and order_time &lt; (当前时间 - 15分钟)
//select * from orders where status = ? and order_time < (当前时间 - 15分钟)
//当前时间减去15分钟
LocalDateTime time = LocalDateTime.now().plusMinutes(-15);
//查出所有超时未付款订单
Expand Down
22 changes: 22 additions & 0 deletions sky-server/src/main/java/com/sky/task/WebSocketTask.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.sky.task;

import com.sky.websocket.WebSocketServer;
import org.springframework.beans.factory.annotation.Autowired;
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()));
}
}
71 changes: 71 additions & 0 deletions sky-server/src/main/java/com/sky/websocket/WebSocketServer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
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();
}
}
}

}

0 comments on commit 36369b5

Please sign in to comment.