chore: 首次簽入 Thinkyu ASP.NET 專案
- 加入 Visual Studio / ASP.NET .gitignore - 排除建置輸出、IDE 設定、NuGet packages、大型 MSI 安裝檔
This commit is contained in:
@@ -0,0 +1,309 @@
|
||||
# 多簡訊平台架構設計
|
||||
|
||||
> 建立日期: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` |
|
||||
Reference in New Issue
Block a user