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

310 lines
11 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.
# 多簡訊平台架構設計
> 建立日期: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 端點以靜態變數定義:
```csharp
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 端點以靜態常數定義(已存在或補充確認):
```csharp
private const string ApiBaseUrl = "https://new.e8d.tw/API21/HTTP";
```
### `Models/ProjectMMSAccountItem.cs`(或所在類別檔)
新增屬性:
```csharp
public string PlatformCode { get; set; }
```
### `Models/MessageQueueItem.cs`(或所在類別檔)
新增屬性:
```csharp
public string PlatformCode { get; set; }
```
### `DAC/DAC_ProjectMMSAccount.cs`
- `SelectPage`、`Select`、`InsertOne`、`UpdateOne` 均加入 `PlatformCode` 欄位處理
### `Common/PublicVariable.cs`
新增靜態變數:
```csharp
/// <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()` 方法:
```csharp
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. **列表欄位**
- 新增「平台」欄(顯示 `PlatformCode`NULL 時顯示「系統預設」)
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` |