前言
本章實(shí)現(xiàn)的業(yè)務(wù)功能
超時(shí)未支付訂單自動(dòng)取消,配送中訂單商家忘點(diǎn)完成自動(dòng)再固定時(shí)間檢查且修改成完成狀態(tài)
來單提醒功能
催單提醒功能
SpringTask
介紹
SpringTask_corn表達(dá)式
一般的話周幾和第幾日是不能同時(shí)出現(xiàn)的
因?yàn)楸热?4月15日 周四 可能4月15日不是周四 可能沖突的 所以周和日一般只能有一個(gè)
現(xiàn)在有這種生成表達(dá)式的網(wǎng)站
!其實(shí)還挺復(fù)雜的,建議看個(gè)視頻稍微學(xué)一下怎么用這個(gè)網(wǎng)站
Spring_Task入門案例
使用springtask主要關(guān)注 1.cron表達(dá)式 2.內(nèi)部處理邏輯
spring_Task挺小的一個(gè)框架,是沒有自己的jar包的,集成在了spring_context這個(gè)包里面
自定義的定時(shí)任務(wù)類
訂單狀態(tài)定時(shí)處理
需求分析
合理一點(diǎn),你派送中訂單不能12點(diǎn)弄的,一般這個(gè)時(shí)候有很多是真的在派送中的
代碼開發(fā)
com.sky.Task.OrderTask
//自定義定時(shí)任務(wù)類,定時(shí)處理訂單狀態(tài)
@Component
@Slf4j
public class OrderTask {
@Autowired
private OrderMapper orderMapper;
/**
* 處理超時(shí)訂單的方法,每分鐘觸發(fā)一次
*/
@Scheduled(cron = "0 * * * * ?")//每分鐘觸發(fā)一次
public void processTimeoutOrder(){
log.info("定時(shí)處理超時(shí)訂單:{}", LocalDateTime.now());
//select * from orders where status = ? and order_time < (當(dāng)前時(shí)間-15分鐘)
List<Orders> ordersList = orderMapper.
getByStatusAndOrderTimeLT(Orders.PENDING_PAYMENT, LocalDateTime.now().plusMinutes(-15));
if(ordersList != null && ordersList.size() > 0){
for (Orders orders : ordersList) {
orders.setStatus(Orders.CANCELLED);
orders.setCancelReason("訂單超時(shí),自動(dòng)取消");
orders.setCancelTime(LocalDateTime.now());
orderMapper.update(orders);
}
}
}
/**
* 處理一直處于派送中的訂單
*/
@Scheduled(cron = "0 0 1 * * ?")//每天凌晨一點(diǎn)觸發(fā)一次
public void processDeliveryOrder(){
log.info("定時(shí)處理處于派送中的訂單:{}",LocalDateTime.now());
List<Orders> ordersList = orderMapper.
getByStatusAndOrderTimeLT(Orders.DELIVERY_IN_PROGRESS, LocalDateTime.now().plusMinutes(-60));
if(ordersList != null && ordersList.size() > 0){
for (Orders orders : ordersList) {
orders.setStatus(Orders.COMPLETED);
orderMapper.update(orders);
}
}
}
}
ordermapper
/**
*根據(jù)訂單狀態(tài)和訂單時(shí)間查詢訂單
* @return
*/
@Select("select * from orders where status=#{status} and order_time < #{orderTime} ")
List<Orders> getByStatusAndOrderTimeLT(Integer status, LocalDateTime orderTime);
功能測(cè)試
略
這個(gè)運(yùn)行然后看數(shù)據(jù)庫
弄幾個(gè)status為1(待支付)的訂單然后等到它自動(dòng)處理看看能不能取消
然后那個(gè)配送的可以改一下那個(gè)cron表達(dá)式不用真的等到1點(diǎn)
WebScoket
介紹
入門案例
com.sky.webscoket.WebSocketServer
前三個(gè)方法 1. 建立連接 2.進(jìn)行通話 3.結(jié)束連接
最后一個(gè)是 服務(wù)端向客戶端發(fā)送信息的方法需要自己調(diào)用 所以沒有注解標(biāo)識(shí)
package com.sky.webscoket;
/**
* WebSocket服務(wù)
*/
@Component
@ServerEndpoint("/ws/{sid}")
public class WebSocketServer {
//存放會(huì)話對(duì)象
private static Map<String, Session> sessionMap = new HashMap();
/**
* 連接建立成功調(diào)用的方法
*/
@OnOpen
public void onOpen(Session session, @PathParam("sid") String sid) {
System.out.println("客戶端:" + sid + "建立連接");
sessionMap.put(sid, session);
}
/**
* 收到客戶端消息后調(diào)用的方法
*
* @param message 客戶端發(fā)送過來的消息
*/
@OnMessage
public void onMessage(String message, @PathParam("sid") String sid) {
System.out.println("收到來自客戶端:" + sid + "的信息:" + message);
}
/**
* 連接關(guān)閉調(diào)用的方法
*
* @param sid
*/
@OnClose
public void onClose(@PathParam("sid") String sid) {
System.out.println("連接斷開:" + sid);
sessionMap.remove(sid);
}
/**
* 群發(fā)
*
* @param message
*/
public void sendToAllClient(String message) {
Collection<Session> sessions = sessionMap.values();
for (Session session : sessions) {
try {
//服務(wù)器向客戶端發(fā)送消息
session.getBasicRemote().sendText(message);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
給這個(gè)bean注冊(cè)一下
弄個(gè)Task來模擬服務(wù)端發(fā)消息
然后自己運(yùn)行一下看效果
來單提醒
需求分析
代碼開發(fā)
修改OrderServiceImpl的代碼
在PaySuccess下新增推送消息即可
新增的
//通過websocket向客戶端瀏覽器推送消息!!!!!!!!!
Map map = new HashMap();
map.put("type",1);//type1表示來單提醒 2表示客戶催單
map.put("orderId",ordersDB.getId());
map.put("content","訂單號(hào)"+ outTradeNo);
String json = JSON.toJSONString(map);
webSocketServer.sendToAllClient(json);
完整的
/**
* 支付成功,修改訂單狀態(tài)
*
* @param outTradeNo
*/
public void paySuccess(String outTradeNo) {
// 根據(jù)訂單號(hào)查詢訂單
Orders ordersDB = orderMapper.getByNumber(outTradeNo);
// 根據(jù)訂單id更新訂單的狀態(tài)、支付方式、支付狀態(tài)、結(jié)賬時(shí)間
Orders orders = Orders.builder()
.id(ordersDB.getId())
.status(Orders.TO_BE_CONFIRMED)
.payStatus(Orders.PAID)
.checkoutTime(LocalDateTime.now())
.build();
orderMapper.update(orders);
//通過websocket向客戶端瀏覽器推送消息!!!!!!!!!
Map map = new HashMap();
map.put("type",1);//type1表示來單提醒 2表示客戶催單
map.put("orderId",ordersDB.getId());
map.put("content","訂單號(hào)"+ outTradeNo);
String json = JSON.toJSONString(map);
webSocketServer.sendToAllClient(json);
}
功能測(cè)試
這個(gè)略顯難受
因?yàn)槲覀儗?shí)際上沒有實(shí)現(xiàn)微信支付接口
所以我們要更改一下邏輯的
小程序前端
if (res.code === 1) {
wx.showModel({
title: '提示',
content: '支付成功',
success:function(){
uni.redirectTo({url: '/pages/success/index?orderId=' + _this.orderId });
}
})
// wx.requestPayment({
// nonceStr: res.data.nonceStr,
// package: res.data.packageStr,
// paySign: res.data.paySign,
// timeStamp: res.data.timeStamp,
// signType: res.data.signType,
// success:function(res){
// wx.showModal({
// title: '提示',
// content: '支付成功',
// success:function(){
// uni.redirectTo({url: '/pages/success/index?orderId=' + _this.orderId });
// }
// })
// console.log('支付成功!')
// }
// })
// 直接重新定向不用微信支付
//這里的代碼移到前面
OrderController
OrderServiceImpl
效果就會(huì)是你點(diǎn)擊確定支付就會(huì)直接支付成功
且不會(huì)跳出那個(gè)支付成功的頁面
客戶催單
代碼開發(fā)
controller
/**
* 客戶催單
* @param id
* @return
*/
@ApiOperation("客戶催單")
@GetMapping("/reminder/{id}")
public Result reminder(@PathVariable Long id){
orderService.reminder(id);
return Result.success();
}
serviceimpl文章來源:http://www.zghlxwxcb.cn/news/detail-702430.html
/**
* 用戶催單
* @param id
*/
public void reminder(Long id) {
// 根據(jù)id查詢訂單
Orders ordersDB = orderMapper.getById(id);
// 校驗(yàn)訂單是否存在
if (ordersDB == null) {
throw new OrderBusinessException(MessageConstant.ORDER_STATUS_ERROR);
}
Map map = new HashMap();
map.put("type",2);//1表示來單提醒 2表示客戶催單
map.put("orderId",id);
map.put("content","訂單號(hào):"+ordersDB.getNumber());
String json = JSON.toJSONString(map);
webSocketServer.sendToAllClient(json);
}
功能測(cè)試
催單去個(gè)人中心的訂單找
然后我這個(gè)沒報(bào)語音(后來我換了edge瀏覽器就可以了)文章來源地址http://www.zghlxwxcb.cn/news/detail-702430.html
到了這里,關(guān)于Java項(xiàng)目-蒼穹外賣-Day10-SpirngTask及WebSocket的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!