蒼穹外賣day04

Spring Task實現定時處理訂單狀態

作用:不需要輸入提示信號,便可定時自動執行程序

使用步驟

1、啟動類上加上注解(@EnableScheduling)開啟定時任務調度

2、專門創建一個包來管理執行定時任務的類,該類需要交給IOC容器管理

3、通過注解@Scheduled() + Cron表達式來指定執行時間(通過6|7個域 (秒 分 時 [日] 月 [周] 年),周和日只存在其一)

場景

訂單下單后一直沒有支付;派送完成后用戶沒有點擊已收貨;

示例

@Scheduled(cron = "0 * * * * ? ") //每分鐘觸發一次public void processTimeoutOrder(){log.info("定時處理超時訂單:{}", LocalDateTime.now());
?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);}}}
?

WebSocket 實現來單提醒

作用:基于TCP的網絡協議,僅需一次握手,便可實現瀏覽器和服務器雙向通信

場景:實時通信類、有交換類的游戲或功能

使用流程:

1、導入maven

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

2、創建配置類來配置 WebSocket

/*** WebSocket配置類,用于注冊WebSocket的Bean*/
@Configuration
public class WebSocketConfiguration {
?@Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}
?
}

3、封裝一個Socket服務來處理客戶端發送的消息

@Component
@ServerEndpoint("/ws/{sid}")
public class WebSocketServer {
?//存放會話對象private static Map<String, Session> sessionMap = new HashMap();/*** 連接建立成功調用的方法*/@OnOpenpublic void onOpen(Session session, @PathParam("sid") String sid) {System.out.println("客戶端:" + sid + "建立連接");sessionMap.put(sid, session);}/*** 收到客戶端消息后調用的方法* @param message 客戶端發送過來的消息*/@OnMessagepublic void onMessage(String message, @PathParam("sid") String sid) {System.out.println("收到來自客戶端:" + sid + "的信息:" + message);}/*** 連接關閉調用的方法* @param sid*/@OnClosepublic 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();}}}
}
?

4、使用

?
@Component
public class WebSocketTask {@Autowiredprivate WebSocketServer webSocketServer;/*** 通過WebSocket每隔5秒向客戶端發送消息*/@Scheduled(cron = "0/5 * * * * ?")public void sendMessageToClient() {webSocketServer.sendToAllClient("這是來自服務端的消息:" + DateTimeFormatter.ofPattern("HH:mm:ss").format(LocalDateTime.now()));}
}

營業額統計

ServiceImpl

public TurnoverReportVO getTurnoverStatistics(LocalDate begin, LocalDate end) {//當前集合用于存放從begin到end范圍內的每天的日期List<LocalDate> dateList = new ArrayList<>();
?dateList.add(begin);
?while (!begin.equals(end)) {//日期計算,計算指定日期的后一天對應的日期begin = begin.plusDays(1);dateList.add(begin);}
?//存放每天的營業額List<Double> turnoverList = new ArrayList<>();for (LocalDate date : dateList) {//查詢date日期對應的營業額數據,營業額是指:狀態為“已完成”的訂單金額合計LocalDateTime beginTime = LocalDateTime.of(date, LocalTime.MIN);LocalDateTime endTime = LocalDateTime.of(date, LocalTime.MAX);
?// select sum(amount) from orders where order_time > beginTime and order_time < endTime and status = 5Map map = new HashMap();map.put("begin", beginTime);map.put("end", endTime);map.put("status", Orders.COMPLETED);Double turnover = orderMapper.sumByMap(map);turnover = turnover == null ? 0.0 : turnover;turnoverList.add(turnover);}
?//封裝返回結果return TurnoverReportVO.builder().dateList(StringUtils.join(dateList, ",")).turnoverList(StringUtils.join(turnoverList, ",")).build();}

Mapper.xml

<select id="sumByMap" resultType="java.lang.Double">select sum(amount) from orders<where><if test="begin != null">and order_time &gt; #{begin}</if><if test="end != null">and order_time &lt; #{end}</if><if test="status != null">and status = #{status}</if></where>
</select>

訂單統計和用戶統計功能實現也一樣基本為增刪改查,不過返回數據的類型之前不同

Apache POI 導出Excel報表

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/901396.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/901396.shtml
英文地址,請注明出處:http://en.pswp.cn/news/901396.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

BFD:網絡鏈路檢測與聯動配置全攻略

目錄 BFD簡介 BFD會話建立方式和檢測機制 BFD會話建立過程 BFD工作流程 聯動功能 BFD與OSPF聯動配置需求 BFD與OSPF聯動配置實現 BFD與VRRP聯動配置需求 BFD與VRRP聯動配置實現 單臂回聲 BFD默認參數及調整方法 BFD簡介 一種全網統一、檢測迅速、監控網絡中鏈…

【LLM】A2A 與 MCP:剖析 AI Agent 互聯時代的兩種關鍵協議

隨著人工智能技術的飛速發展&#xff0c;AI Agent&#xff08;智能體&#xff09;正從理論走向實踐&#xff0c;有望成為提升生產力的關鍵。然而&#xff0c;正如歷史上任何新興技術領域一樣&#xff0c;標準的缺失導致了“筒倉效應”——不同來源、不同框架構建的 Agent 難以有…

免費下載 | 2025清華五道口:“十五五”金融規劃研究白皮書

《2025清華五道口&#xff1a;“十五五”金融規劃研究白皮書》的核心內容主要包括以下幾個方面&#xff1a; 一、五年金融規劃的重要功能與作用 凝聚共識&#xff1a;五年金融規劃是國家金融發展的前瞻性謀劃和戰略性安排&#xff0c;通過廣泛聽取社會各界意見&#xff0c;凝…

滾輪控制目標臂長度調整相機距離

通過鼠標滾輪來控制攝像機目標臂長度 , 調整相機距離 看圖就行,不多說,照著連就完事了

kernel32!GetQueuedCompletionStatus函數分析之返回值得有效性

第一部分&#xff1a;//#define STATUS_SUCCESS 0x0返回值為0 } else { // // Set the completion status, capture the completion // information, deallocate the associated IRP, and // attempt to write the…

UE5 Chaos :渲染網格體 (Render Mesh) 和模擬網格體 是如何關聯的?為什么模擬網格體 可以驅動渲染網格體?

官方文獻&#xff1a;https://dev.epicgames.com/community/learning/tutorials/pv7x/unreal-engine-panel-cloth-editor 這背后的核心是一種常見的計算機圖形學技術&#xff0c;通常稱為代理綁定 (Proxy Binding) 或 表面變形傳遞 (Surface Deformation Transfer)。 關聯機制…

老舊測試用例生成平臺異步任務與用戶通知優化

在現代 Web 開發中&#xff0c;異步任務處理和用戶通知是兩個重要的功能。由于老舊測試平臺【測試用例生成平臺&#xff0c;源碼分享】進行智能化升級后&#xff0c;未采用異步任務處理&#xff0c;大模型推理時間較長&#xff0c;導致任務阻塞&#xff0c;無法處理其他任務&am…

Java使用ANTLR4對Lua腳本語法校驗

文章目錄 什么是ANTLR&#xff1f;第一個例子ANTLR4 的工作流程Lua腳本語法校驗準備一個Lua Grammar文件maven配置新建實體類Lua語法遍歷器語法錯誤監聽器單元測試 參考 什么是ANTLR&#xff1f; https://www.antlr.org/ ANTLR (ANother Tool for Language Recognition) is a…

觀察者模式(行為模式)

觀察者模式 觀察者模式屬于行為模式&#xff0c;個人理解&#xff1a;和發布訂閱者魔模式是有區別的 細分有兩種&#xff1a;推模式和拉模式兩種&#xff0c;具體區別在于推模式會自帶推送參數&#xff0c;拉模式是在接收通知后要自己獲取更新參數 觀察者模式&#xff08;Obs…

內網滲透 --- 之殺軟工具探測

目錄 內網殺軟探測與應對實戰方案 一、總體思路 二、探測階段——殺軟工具與手法 2.1 進程與服務檢測 2.2 注冊表與文件系統檢測 2.3 Nmap 與 NSE 腳本掃描 三、處理階段——探測到殺軟后的應對措施 3.1 分析評估 3.2 應對策略 四、判斷與驗證——注入 webshell 后如…

(2025親測可用)Chatbox多端一鍵配置Claude/GPT/DeepSeek-網頁端配置

1. 資源準備 API Key&#xff1a;此項配置填寫在一步API官網創建API令牌&#xff0c;一鍵直達API令牌創建頁面創建API令牌步驟請參考API Key的獲取和使用API Host&#xff1a;此項配置填寫https://yibuapi.com/v1查看支持的模型請參考這篇教程模型在線查詢 2. ChatBox網頁版配…

【Pandas】pandas DataFrame keys

Pandas2.2 DataFrame Indexing, iteration 方法描述DataFrame.head([n])用于返回 DataFrame 的前幾行DataFrame.at快速訪問和修改 DataFrame 中單個值的方法DataFrame.iat快速訪問和修改 DataFrame 中單個值的方法DataFrame.loc用于基于標簽&#xff08;行標簽和列標簽&#…

Redis存儲“大數據對象”的常用策略及StackOverflowError錯誤解決方案

Hi&#xff0c;大家好&#xff0c;我是灰小猿&#xff01; 在一些功能的開發中&#xff0c;我們一般會有一些場景需要將得到的數據先暫時的存儲起來&#xff0c;以便后面的接口或業務使用&#xff0c;這種場景我們一般常用的場景就是將數據暫時存儲在緩存中&#xff0c;之后再…

【Python】讀取xyz坐標文件輸出csv文件

Python讀取xyz坐標文件輸出csv文件 import sys import numpy as np import pandas as pd from tqdm import tqdm import cv2 import argparsedef read_xyz(file_path):with open(file_path, "r") as f: # 打開文件data f.readlines() # 讀取文件datas []for …

leetcode 139. Word Break

這道題用動態規劃解決。 class Solution { public:bool wordBreak(string s, vector<string>& wordDict) {unordered_set<string> wordSet;for(string& word:wordDict){wordSet.insert(word);}int s_len s.size();//s的下標從1開始起算&#xff0c;dp[j]…

驅動開發硬核特訓 · Day 11(下篇):從 virtio_blk 看虛擬總線驅動模型的真實落地

&#x1f50d; B站相應的視屏教程&#xff1a; &#x1f4cc; 內核&#xff1a;博文視頻 - 總線驅動模型實戰全解析 敬請關注&#xff0c;記得標為原始粉絲。 &#x1f527; 在上篇中&#xff0c;我們已經從理論視角分析了“虛擬總線驅動模型”在 Linux 驅動體系中的獨特定位。…

音視頻轉換器 AV 接口靜電保護方案

方案簡介 音視頻轉換器是將音視頻&#xff08;AV&#xff09;信號轉換成其他格式或信號類型的設備或軟件。 它能夠實現大多數視頻、音頻以及圖像格式之間的轉換&#xff0c;包括但不限于 RMVB、AVI、 MP4、MOV 等常見格式&#xff0c;同時也支持將不同采樣率、位深度、聲道數…

AI agents系列之全從零開始構建

在我們上一篇博客文章中&#xff0c;我們全面介紹了智能代理&#xff0c;討論了它們的特性、組成部分、演變過程、面臨的挑戰以及未來的可能性。 這篇文章&#xff0c;咱們就來聊聊怎么用 Python 從零開始構建一個智能代理。這個智能代理能夠根據用戶輸入做出決策&#xff0c;…

【Python爬蟲】詳細工作流程以及組成部分

目錄 一、Python爬蟲的詳細工作流程 確定起始網頁 發送 HTTP 請求 解析 HTML 處理數據 跟蹤鏈接 遞歸抓取 存儲數據 二、Python爬蟲的組成部分 請求模塊 解析模塊 數據處理模塊 存儲模塊 調度模塊 反爬蟲處理模塊 一、Python爬蟲的詳細工作流程 在進行網絡爬蟲工…

Kotlin 集合過濾全指南:all、any、filter 及高級用法

在 Kotlin 中&#xff0c;集合過濾是數據處理的核心操作之一。無論是簡單的條件篩選&#xff0c;還是復雜的多條件組合&#xff0c;Kotlin 都提供了豐富的 API。本文將詳細介紹 filter、all、any、none 等操作符的用法&#xff0c;并展示如何在實際開發中靈活運用它們。 1. 基礎…