chore: 首次簽入 Thinkyu ASP.NET 專案
- 加入 Visual Studio / ASP.NET .gitignore - 排除建置輸出、IDE 設定、NuGet packages、大型 MSI 安裝檔
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
# 發送簡訊
|
||||
|
||||
## 架構
|
||||
* 從 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 支援替換字串:{課程日期}/{活動日期}、{課程名稱}/{活動名稱}、{課程地點}/{活動地點}、{學員姓名}、{開始時間}、{結束時間}、{講師}
|
||||
* 回傳:BaseResponse(Success, 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 資料表(計畫特定)
|
||||
Reference in New Issue
Block a user