Spring Task
同学们可以看我这篇文章
订单状态定时处理
新建OrderTask
/**
* 定时任务类,定时处理订单状态
*/
@Component
@Slf4j
public class OrderTask {
@Autowired
private OrderMapper orderMapper;
/**
* 处理超时订单的方法
*/
@Scheduled(cron = "0 * * * * ? ") //每分钟触发一次
public void processTimeoutOrder(){
log.info("定时处理超市订单:{}", LocalDateTime.now());
//select * from orders where status = ? and order_time < (当前时间-15分钟)
LocalDateTime time = LocalDateTime.now().plusMinutes(-15);
List<Orders> ordersList = orderMapper.getByStatusAndOrderTimeLT(Orders.PENDING_PAYMENT, time);
if(ordersList != null && ordersList.size() > 0){
for (Orders orders : ordersList) {
orders.setStatus(Orders.CANCELLED);
orders.setCancelReason("订单超时,自动取消");
orders.setCancelTime(LocalDateTime.now());
orderMapper.update(orders);
}
}
}
/**
* 处理一直处于派送中状态的订单
*/
@Scheduled(cron = "0 0 1 * * ?") //每天凌晨1点触发一次
public void processDeliveryOrder(){
log.info("定时处理处于派送中的订单:{}",LocalDateTime.now());
List<Orders> ordersList = orderMapper.getByStatusAndOrderTimeLT(Orders.DELIVERY_IN_PROGRESS, LocalDateTime.now().plusHours(-1));
if(ordersList != null && ordersList.size() > 0){
for (Orders orders : ordersList) {
orders.setStatus(Orders.COMPLETED);
orderMapper.update(orders);
}
}
}
}
WebSocket
这篇文章详细讲解了WebScoket:
来单提醒
只需要在paySuccess(OrderServiceIpl中)这个方法中稍微改动一下就行了,
主要是创建了一个HashMap对象map,用于存储要发送给客户端的消息内容。type字段设置为1,表示这是一个来单提醒。 orderId字段设置为订单的ID。 content字段包含订单号的文本信息。 使用JSON库(如阿里巴巴的fastjson)将map对象转换为JSON字符串json。 调用webSocketServer的sendToAllClient方法,将JSON字符串json发送给所有连接的客户端。这通常用于实时通知客户端订单状态的变更。
/**
* 支付成功,修改订单状态
*
* @param outTradeNo
*/
public void paySuccess(String outTradeNo) {
// 根据订单号查询订单
Orders ordersDB = orderMapper.getByNumber(outTradeNo);
// 根据订单id更新订单的状态、支付方式、支付状态、结账时间
Orders orders = Orders.builder()
.id(ordersDB.getId())
.status(Orders.TO_BE_CONFIRMED)
.payStatus(Orders.PAID)
.checkoutTime(LocalDateTime.now())
.build();
orderMapper.update(orders);
//通过websocket向客户端浏览器推送消息 type orderId content
Map map = new HashMap();
map.put("type",1);//1表示来单提醒,2表示用户催单
map.put("orderId",ordersDB.getId());
map.put("content","订单号:"+outTradeNo);
String json = JSON.toJSONString(map);
webSocketServer.sendToAllClient(json);
}
功能测试:
客户催单
逻辑跟来单提醒差不多
接口设计
user/OrdreController
/**
* 催单
* @param id
* @return
*/
@GetMapping("/reminder/{id}")
@ApiOperation("催单")
public Result reminder(@PathVariable Long id){
orderService.reminder(id);
return Result.success();
}
OrderService
/**
* 催单
* @param id
*/
void reminder(Long id);
OrderServiceImpl
/**
* 催单
* @param id
*/
public void reminder(Long id) {
//根据id查询订单
Orders ordersDB = orderMapper.getbyId(id);
// 校验订单是否存在,并且状态为4
if(ordersDB == null){
throw new OrderBusinessException(MessageConstant.ORDER_STATUS_ERROR);
}
Map map = new HashMap();
map.put("type",2);
map.put("orderId",ordersDB.getId());
map.put("content","订单号:"+ordersDB.getNumber());
//通过webSocketServer向客户端浏览器推送消息
webSocketServer.sendToAllClient(JSON.toJSONString(map));
}