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

4.8 KiB
Raw Permalink Blame History

發送簡訊

架構

  • 從 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 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 資料表(計畫特定)