11 KiB
11 KiB
多簡訊平台架構設計
建立日期: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 呼叫。
平台代碼優先順序:
MessageQueueItem.PlatformCode(由計畫的ProjectMMSAccount.PlatformCode填入)- 若計畫無設定,使用
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 資料表的單筆資料,屬性包含:
ID、PlatformCode、PlatformName、Account、Password、Remark,以及標準 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
- 維持純靜態類別,不需異動介面或繼承關係
SendMMS、CheckBalance保持 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
SelectPage、Select、InsertOne、UpdateOne均加入PlatformCode欄位處理
Common/PublicVariable.cs
新增靜態變數:
/// <summary>
/// 目前使用的簡訊平台代碼(由 BWEX.CurrentMMSPlatform 載入)
/// </summary>
public static string CurrentMMSPlatform = "EVERY8D";
Global.asax.cs
Application_Start 新增從 DB 讀取 BWEX 的 CurrentMMSPlatform,設定至 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
畫面新增區塊:
-
目前預設平台區塊(搜尋面板上方):
- 顯示目前使用的平台名稱與代碼
- 提供「切換平台」按鈕開啟平台切換彈窗
-
平台設定區塊(可展開/收合):
- 列出所有平台(EVERY8D、三竹)
- 每平台顯示:主帳號、主密碼、操作按鈕(儲存)(API 端點固定於程式碼,不顯示於畫面)
-
列表欄位:
- 新增「平台」欄(顯示
PlatformCode,NULL 時顯示「系統預設」)
- 新增「平台」欄(顯示
-
新增/編輯彈窗:
- 新增「使用平台」下拉選單(選項:
使用系統預設、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 |