Files
thinkyu/報到系統/DOC/簡訊發送.md
T
sryang 577060bc78 chore: 首次簽入 Thinkyu ASP.NET 專案
- 加入 Visual Studio / ASP.NET .gitignore
- 排除建置輸出、IDE 設定、NuGet packages、大型 MSI 安裝檔
2026-09-10 09:42:37 +08:00

73 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 發送簡訊
## 架構
* 從 Global.asax 的 Application_Start 事件啟動一個 Timer(預設每 1 分鐘觸發),定時啟動 SMSSendingService
* 發送服務(Services/SMSSendingService.cs
* 是單例類(Singleton),有 IsBusy 狀態可以顯示是否正在忙碌
* 每次啟動就把待發送簡訊全部發完
* 啟動時(Start 方法)
* 若 _busy == true 則直接返回,避免重複執行
* 設定 _busy = true
* 查詢 MessageQueue 表 Status 是 PENDING 或 SENDING 的
* 依課程 ProjectID 查詢對應的簡訊帳號密碼(DAC_ProjectMMSAccount),若無設定則使用系統預設帳號密碼
* 逐一發送(SendMessage 方法)
* 每一個發送開始時改狀態為 SENDING
* 呼叫 EVERY8DSMSProvider.SendMMS 發送
* 成功或失敗結果寫入 MessageLog 表
* 刪除 MessageQueue 紀錄
* 每一個發送做一個 DB transaction
* 最後重置 _busy = false(在 finally 確保執行)
* 錯誤寫入 ~/Log/SMSError_yyyyMMdd.txt
## 預約發送(加入佇列)
* Services/SignUpService.asmx
* METHOD SendSmsBatch(int courseID, List<int> signupIds)
* 驗證課程的 NotificationTitle 和 NotificationTemplate 已設定
* 對每位參加人員
* 若無 QRCode 則自動產生(DAC_SignUp.GenQRCodeText)並更新回資料表
* 以 ZXing 產生 QRCode 圖片,轉成 Base64
* 將訊息寫入 MessageQueue 表,Status = "PENDING"
* NotificationTemplate 支援替換字串:{課程日期}/{活動日期}、{課程名稱}/{活動名稱}、{課程地點}/{活動地點}、{學員姓名}、{開始時間}、{結束時間}、{講師}
* 回傳:BaseResponseSuccess, Message, Data: { SuccessCount, FailedCount, SuccessRecords, Errors, TotalRequested }
## 資料表
### 待發送簡訊 MessageQueue
* 資料存取類別 DAC_MessageQueue
* 資料表結構
| No | Field Name | Data Type | Length | Not Null | PK | Identity | Description |
|----|-------------|-----------|--------|----------|----|----------|-----------------------------|
| 1 | ID | INT | | V | V | V | 流水號 |
| 2 | CourseID | INT | | V | | | 課程ID |
| 3 | Status | NVARCHAR | 10 | | | | 發送狀態 PENDING = 等候發送 |
| | | | | | | | SENDING = 發送中 |
| | | | | | | | SENT = 已發送 |
| | | | | | | | FAILED = 發送失敗 |
| 4 | Mobile | NVARCHAR | 20 | | | | 手機號 |
| 5 | Subject | NVARCHAR | 100 | | | | 簡訊標題 |
| 6 | Content | NVARCHAR | 500 | | | | 發送內容 |
| 7 | QRCode | TEXT | | | | | QRCode 圖片的 BASE64 |
| 8 | Name | NVARCHAR | 100 | | | | 學員姓名 |
| 9 | FailMessage | NVARCHAR | 200 | | | | 發送失敗訊息 |
### 發送紀錄 MessageLog
* 資料存取類別 DAC_MessageLog
* 資料表結構
| No | Field Name | Data Type | Length | Not Null | PK | Identity | Description |
|----|-------------|-----------|--------|----------|----|----------|------------------------|
| 1 | ID | INT | | V | V | V | 流水號 |
| 2 | CourseID | INT | | V | | | 課程ID |
| 3 | Status | NVARCHAR | 10 | | | | 發送狀態 SENT = 已發送 |
| | | | | | | | FAILED = 發送失敗 |
| 4 | Mobile | NVARCHAR | 20 | | | | 手機號 |
| 5 | Subject | NVARCHAR | 100 | | | | 簡訊標題 |
| 6 | Content | NVARCHAR | 500 | | | | 發送內容 |
| 7 | Name | NVARCHAR | 100 | | | | 學員姓名 |
| 8 | FailMessage | NVARCHAR | 200 | | | | 發送失敗訊息 |
## 簡訊服務商
服務商:EVERY8D
具體的簡訊發送實作在 Services/EVERY8DSMSProvider.cs
帳號密碼設定在 PublicVariable(系統預設)或各計畫的 ProjectMMSAccount 資料表(計畫特定)