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

11 KiB
Raw Permalink Blame History

多簡訊平台架構設計

建立日期:2026-06-02 目的:支援 EVERY8D 與三竹(MITAKE)兩個簡訊發送平台


需求說明

  • 加入三竹(MITAKE)簡訊發送平台
  • 整個系統統一切換發送平台(由系統設定決定)
  • 存放帳號參數的 ProjectMMSAccount 資料表加入平台代碼欄位
  • 新增 MMSPlatform 資料表,存放平台代碼、主帳號密碼等資料(API 端點硬寫於各 Provider 靜態變數)
  • BWEX 資料表加入設定 CurrentMMSPlatform,記錄目前使用哪一個簡訊平台
  • 簡訊帳號設定畫面需支援:
    • 選擇平台
    • 顯示目前的預設平台
    • 設定各簡訊平台的主帳號密碼
    • 管理各計畫的分帳號密碼

架構概覽

SMSSendingService.SendMessage()
    └─ switch (message.PlatformCode)
            ├─ "EVERY8D" → EVERY8DSMSProvider.SendMMS(...)
            └─ "MITAKE"  → MITAKESMSProvider.SendMMS(...)

設計原則:兩個 Provider 均為純靜態類別,不使用介面或工廠,直接 switch 呼叫。

平台代碼優先順序:

  1. MessageQueueItem.PlatformCode(由計畫的 ProjectMMSAccount.PlatformCode 填入)
  2. 若計畫無設定,使用 PublicVariable.CurrentMMSPlatform(由 BWEX.CurrentMMSPlatform 載入)

資料庫異動

新增資料表 MMSPlatform(簡訊平台設定)

No Field Name Data Type Length Not Null PK Identity Description
1 ID INT V V V 流水號
2 PlatformCode NVARCHAR 20 V 平台代碼(EVERY8D / MITAKE
3 PlatformName NVARCHAR 50 V 平台名稱(EVERY8D / 三竹)
4 Account NVARCHAR 100 主帳號
5 Password NVARCHAR 100 主密碼
6 Remark NVARCHAR 200 備註
7 DB_APPNO INT V 樂觀鎖定版本號
8 DB_CRDAT DATETIME V 建立日期
9 DB_CRUSR NVARCHAR 20 V 建立人員
10 DB_TRDAT DATETIME V 修改日期
11 DB_TRUSR NVARCHAR 20 V 修改人員

API 端點網址硬寫於各 Provider 靜態變數,不存入資料庫。

預設插入兩筆:

PlatformCode PlatformName
EVERY8D EVERY8D
MITAKE 三竹

修改資料表 ProjectMMSAccount

新增欄位:

No Field Name Data Type Length Not Null Description
5 PlatformCode NVARCHAR 20 V 平台代碼

修改資料表 BWEX(系統設定)

新增一筆設定資料:

KeyName KeyValue Description
CurrentMMSPlatform EVERY8D 目前使用的簡訊平台代碼

新增檔案

Services/MITAKESMSProvider.cs(三竹靜態類別)

  • 純靜態類別(public static class MITAKESMSProvider
  • API 端點以靜態變數定義:
    private const string ApiBaseUrl = "https://message.mitake.com.tw";
    
  • message.MMSAccount / message.MMSPassword 呼叫三竹 API
  • 三竹 API 端點格式: {ApiBaseUrl}/SmSendGet.asp?username={帳號}&password={密碼}&dstaddr={手機}&smbody={內容}
  • 回傳格式為純文字:[1] 開頭表示成功,statuscode= 欄位為狀態碼
  • 三竹狀態碼說明:
statuscode 說明
0 已送達手機
1 已送達三竹
2 已送達業者
1000 預約傳送中
1001 預約已取消
2000 內容有錯誤
2001 門號有錯誤
2002 訊息已停用
2003 逾時無法送達
2005 內容有關鍵字
2999 業者系統錯誤
9998 傳送錯誤
9999 三竹系統錯誤
  • CheckBalance:呼叫 {ApiBaseUrl}/SmQueryGet.asp?username={帳號}&password={密碼}&CharsetURL=UTF-8

Models/MMSPlatformItem.cs(資料紀錄類別)

對應 MMSPlatform 資料表的單筆資料,屬性包含: IDPlatformCodePlatformNameAccountPasswordRemark,以及標準 DB 欄位。

Models/MMSPlatformList.cs(資料集合類別)

List<MMSPlatformItem> 的集合類別。

DAC/DAC_MMSPlatform.cs(資料存取類別)

  • MMSPlatformList SelectAll() — 查詢所有平台
  • MMSPlatformItem SelectByCode(string platformCode) — 依代碼查一筆
  • MMSPlatformItem InsertOne(MMSPlatformItem item) — 新增
  • MMSPlatformItem UpdateOne(MMSPlatformItem item) — 修改(含 DB_APPNO 樂觀鎖定)

修改現有檔案

Services/EVERY8DSMSProvider.cs

  • 維持純靜態類別,不需異動介面或繼承關係
  • SendMMSCheckBalance 保持 static 方法不變
  • API 端點以靜態常數定義(已存在或補充確認):
    private const string ApiBaseUrl = "https://new.e8d.tw/API21/HTTP";
    

Models/ProjectMMSAccountItem.cs(或所在類別檔)

新增屬性:

public string PlatformCode { get; set; }

Models/MessageQueueItem.cs(或所在類別檔)

新增屬性:

public string PlatformCode { get; set; }

DAC/DAC_ProjectMMSAccount.cs

  • SelectPageSelectInsertOneUpdateOne 均加入 PlatformCode 欄位處理

Common/PublicVariable.cs

新增靜態變數:

/// <summary>
/// 目前使用的簡訊平台代碼(由 BWEX.CurrentMMSPlatform 載入)
/// </summary>
public static string CurrentMMSPlatform = "EVERY8D";

Global.asax.cs

Application_Start 新增從 DB 讀取 BWEXCurrentMMSPlatform,設定至 PublicVariable.CurrentMMSPlatform。 EVERY8D 相關的 AppSettings 讀取保留作為向後相容 fallback。

Services/SMSSendingService.cs

  • Start() 的帳號填入迴圈,同時填入 message.PlatformCode
    • 計畫有設定 PlatformCode → 使用計畫的 PlatformCode
    • 否則使用 PublicVariable.CurrentMMSPlatform
  • SendMessage() 改用 switch (message.PlatformCode) 直接呼叫對應靜態 Provider,移除 SendSMSToEVERY8D() 方法:
switch (message.PlatformCode)
{
    case "MITAKE":
        result = MITAKESMSProvider.SendMMS(message, out failMessage);
        break;
    default: // EVERY8D
        result = EVERY8DSMSProvider.SendMMS(message, out failMessage);
        break;
}

Services/MessageAccountManage.asmx.cs

新增 WebMethod

Method 說明
GetPlatforms() 回傳所有平台清單(BaseResponse, Data: MMSPlatformList
GetCurrentPlatform() 回傳目前系統預設平台代碼(BaseResponse, Data: MMSPlatformItem
SavePlatform(MMSPlatformItem item) 儲存平台設定(帳號 / 密碼)
SetCurrentPlatform(string platformCode) 更新 BWEX 的 CurrentMMSPlatform,同時更新 PublicVariable

修改 Save():加入 PlatformCode 欄位的驗證與儲存。

Forms/MessageAccountManage.aspx

畫面新增區塊:

  1. 目前預設平台區塊(搜尋面板上方):

    • 顯示目前使用的平台名稱與代碼
    • 提供「切換平台」按鈕開啟平台切換彈窗
  2. 平台設定區塊(可展開/收合):

    • 列出所有平台(EVERY8D、三竹)
    • 每平台顯示:主帳號、主密碼、操作按鈕(儲存)(API 端點固定於程式碼,不顯示於畫面)
  3. 列表欄位

    • 新增「平台」欄(顯示 PlatformCodeNULL 時顯示「系統預設」)
  4. 新增/編輯彈窗

    • 新增「使用平台」下拉選單(選項:使用系統預設EVERY8D三竹

Scripts/MessageAccountManage.js

新增 data

  • platforms: [] — 平台清單
  • currentPlatform: null — 目前預設平台物件
  • showPlatformSettings: false — 控制平台設定展開
  • showSwitchModal: false — 切換平台彈窗

新增 methods

  • loadPlatforms() — 呼叫 GetPlatforms()
  • loadCurrentPlatform() — 呼叫 GetCurrentPlatform()
  • savePlatformSetting(platform) — 呼叫 SavePlatform()
  • setCurrentPlatform(platformCode) — 呼叫 SetCurrentPlatform()

修改 editItem

  • 新增 PlatformCode: ''(空字串 = 使用系統預設)

三竹 API 說明

發送 API

ApiBaseUrl = https://message.mitake.com.tw  (硬寫於 MITAKESMSProvider)

GET/POST {ApiBaseUrl}/SmSendGet.asp
參數:
  username  = 帳號
  password  = 密碼
  dstaddr   = 手機號碼(多筆以 $ 分隔)
  smbody    = 簡訊內容(URL Encode, UTF-8
  CharsetURL = UTF-8

回傳格式(純文字,每筆一行):

[序號]
statuscode=1
destaddr=0912345678
msgid=訊息ID

查詢餘額 API

GET {ApiBaseUrl}/SmQueryGet.asp
參數:
  username   = 帳號
  password   = 密碼
  CharsetURL = UTF-8

回傳格式:

AccountPoint=100

檔案清單

異動類型 路徑
新增 DOC/多簡訊平台架構設計.md
新增 Services/MITAKESMSProvider.cs
新增 Models/MMSPlatformItem.cs
新增 Models/MMSPlatformList.cs
新增 DAC/DAC_MMSPlatform.cs
修改 Services/EVERY8DSMSProvider.cs
修改 Models/ProjectMMSAccountItem.cs
修改 Models/MessageQueueItem.cs
修改 DAC/DAC_ProjectMMSAccount.cs
修改 Common/PublicVariable.cs
修改 Global.asax.cs
修改 Services/SMSSendingService.cs
修改 Services/MessageAccountManage.asmx.cs
修改 Forms/MessageAccountManage.aspx
修改 Scripts/MessageAccountManage.js