278 lines
7.2 KiB
Markdown
278 lines
7.2 KiB
Markdown
# SignUpService 後端服務規格完整性檢查
|
||
|
||
## 檢查日期
|
||
2024年
|
||
|
||
## 概述
|
||
根據文檔 `DOC\活動人員簽到簽退與同步.md` 規格,發現 **SignUpService.asmx** 服務的實現 **不完整**,缺失關鍵的簽到簽退功能。
|
||
|
||
---
|
||
|
||
## 檢查結果
|
||
|
||
### ✅ 已實現的方法
|
||
|
||
| 方法名 | 規格狀態 | 實現狀態 |
|
||
|------|--------|--------|
|
||
| SearchSignUps | 已定義 | ✅ 完整實現 |
|
||
| SaveSignUp | 已定義 | ✅ 完整實現 |
|
||
| DeleteSignUp | 已定義 | ✅ 完整實現 |
|
||
| ProcessImportFile | 已定義 | ✅ 完整實現 |
|
||
| ConfirmImport | 已定義 | ✅ 完整實現 |
|
||
| ImportSignUps | 已定義 | ✅ 完整實現 (已棄用) |
|
||
| ExportSignUps | 已定義 | ✅ 完整實現 |
|
||
|
||
### ❌ 缺失的方法
|
||
|
||
| 方法名 | 規格描述 | 優先級 | 狀態 |
|
||
|------|--------|------|-----|
|
||
| UploadSignUps | 同步簽到簽退資料 | 高 | ❌ **缺失** |
|
||
| CheckIn | QRCode 簽到 | 高 | ❌ **缺失** |
|
||
| CheckOut | QRCode 簽退 | 高 | ❌ **缺失** |
|
||
| OnSiteCheckIn | 現場臨時簽到 | 中 | ❌ **缺失** |
|
||
| OnSiteCheckOut | 現場臨時簽退 | 中 | ❌ **缺失** |
|
||
|
||
---
|
||
|
||
## 缺失方法詳細規格
|
||
|
||
### 1️⃣ UploadSignUps (優先級:高)
|
||
|
||
**用途**:同步 WinForm 客戶端的簽到簽退資料到資料庫
|
||
|
||
**規格**:
|
||
```
|
||
輸入參數:
|
||
- courseID (int):活動編號
|
||
- SignUpList:包含 CheckInTime 和 CheckOutTime 的參加人員清單
|
||
|
||
邏輯流程:
|
||
1. 用 courseID、Name、Mobile 查詢 SignUp 資料表
|
||
2. 如果找到相應記錄:
|
||
- 若 CheckInTime 非空,不更新 CheckInTime
|
||
- 若 CheckOutTime 非空,不更新 CheckOutTime
|
||
- 其他情況按新值更新
|
||
3. 如果未找到記錄:
|
||
- 若 SignUpType == "現場",則新增記錄並設定 CheckInTime、CheckOutTime
|
||
- 其他 SignUpType 則跳過
|
||
|
||
返回值:BaseResponse
|
||
- Success:操作是否成功
|
||
- Message:結果訊息
|
||
- Data:更新統計(新增、更新、跳過筆數)
|
||
```
|
||
|
||
### 2️⃣ CheckIn (優先級:高)
|
||
|
||
**用途**:通過 QRCode 條碼簽到
|
||
|
||
**規格**:
|
||
```
|
||
輸入參數:
|
||
- CheckType:"checkin"(固定值)
|
||
- QRCode:條碼內容
|
||
- CheckInTime:簽到時間
|
||
|
||
邏輯流程:
|
||
1. 用 QRCode 查詢 SignUp 資料表
|
||
2. 如果找到:
|
||
- 更新 CheckInTime 欄位為傳入值
|
||
- 返回成功訊息
|
||
3. 如果未找到:
|
||
- 返回「找不到資料」訊息
|
||
|
||
返回值:BaseResponse
|
||
- Success:操作是否成功
|
||
- Message:結果訊息 (成功或找不到)
|
||
- Data:更新的記錄內容
|
||
```
|
||
|
||
### 3️⃣ CheckOut (優先級:高)
|
||
|
||
**用途**:通過 QRCode 條碼簽退
|
||
|
||
**規格**:
|
||
```
|
||
輸入參數:
|
||
- CheckType:"checkout"(固定值)
|
||
- QRCode:條碼內容
|
||
- CheckOutTime:簽退時間
|
||
|
||
邏輯流程:
|
||
1. 用 QRCode 查詢 SignUp 資料表
|
||
2. 如果找到:
|
||
- 更新 CheckOutTime 欄位為傳入值
|
||
- 返回成功訊息
|
||
3. 如果未找到:
|
||
- 返回「找不到資料」訊息
|
||
|
||
返回值:BaseResponse
|
||
- Success:操作是否成功
|
||
- Message:結果訊息 (成功或找不到)
|
||
- Data:更新的記錄內容
|
||
```
|
||
|
||
### 4️⃣ OnSiteCheckIn (優先級:中)
|
||
|
||
**用途**:現場臨時簽到(無預約)
|
||
|
||
**規格**:
|
||
```
|
||
輸入參數:
|
||
- CheckType:"checkin"(固定值)
|
||
- Name:學員姓名
|
||
- Mobile:手機號
|
||
- CheckInTime:簽到時間
|
||
|
||
邏輯流程:
|
||
1. 用 Name、Mobile 查詢 SignUp 資料表
|
||
2. 如果找到:
|
||
- 更新 CheckInTime 欄位
|
||
3. 如果未找到:
|
||
- 新增一筆記錄,SignUpType 設為 "現場"
|
||
- 設定 CheckInTime、CheckOutTime 欄位
|
||
|
||
返回值:BaseResponse
|
||
- Success:操作是否成功
|
||
- Message:結果訊息
|
||
- Data:新增/更新的記錄內容
|
||
```
|
||
|
||
### 5️⃣ OnSiteCheckOut (優先級:中)
|
||
|
||
**用途**:現場臨時簽退(無預約)
|
||
|
||
**規格**:
|
||
```
|
||
輸入參數:
|
||
- CheckType:"checkout"(固定值)
|
||
- Name:學員姓名
|
||
- Mobile:手機號
|
||
- CheckOutTime:簽退時間
|
||
|
||
邏輯流程:
|
||
1. 用 Name、Mobile 查詢 SignUp 資料表
|
||
2. 如果找到:
|
||
- 更新 CheckOutTime 欄位
|
||
3. 如果未找到:
|
||
- 新增一筆記錄,SignUpType 設為 "現場"
|
||
- 設定 CheckInTime、CheckOutTime 欄位
|
||
|
||
返回值:BaseResponse
|
||
- Success:操作是否成功
|
||
- Message:結果訊息
|
||
- Data:新增/更新的記錄內容
|
||
```
|
||
|
||
---
|
||
|
||
## 影響範圍
|
||
|
||
### 受影響的客戶端功能
|
||
- ❌ WinForm 客戶端無法同步簽到簽退資料
|
||
- ❌ 掃描條碼簽到/簽退功能無法使用
|
||
- ❌ 現場臨時簽到/簽退功能無法使用
|
||
|
||
### 依賴這些方法的系統
|
||
- 報到系統客戶端 (WinForm)
|
||
- 活動簽到簽退模組
|
||
|
||
---
|
||
|
||
## 實現建議
|
||
|
||
### DAC 層支援度檢查
|
||
✅ DAC_SignUp 已支援的操作:
|
||
- SelectOne(int ID):按 ID 查詢
|
||
- Select(bool, int?, string, string, string):按 CourseID、Name、Mobile、QRCode 查詢
|
||
- SelectPage():分頁查詢
|
||
- InsertOne():新增記錄
|
||
- UpdateOne():更新記錄
|
||
|
||
✅ 建議的 DAC 擴充方法(在 DAC_SignUp2.cs 中):
|
||
```csharp
|
||
// 按 QRCode 查詢
|
||
public SignUpList SelectByQRCode(string qrCode)
|
||
{
|
||
// 使用 QRCode 精確查詢
|
||
}
|
||
|
||
// 按 Name 和 Mobile 查詢
|
||
public SignUpList SelectByNameAndMobile(int courseID, string name, string mobile)
|
||
{
|
||
// 用 courseID、Name、Mobile 精確查詢
|
||
}
|
||
|
||
// 更新 CheckInTime 和 CheckOutTime(選擇性)
|
||
public int UpdateCheckTimes(int id, DateTime? checkInTime, DateTime? checkOutTime)
|
||
{
|
||
// 智能更新:非空才更新
|
||
}
|
||
```
|
||
|
||
### 實現步驟
|
||
1. **在 DAC_SignUp2.cs 中新增必要的查詢方法**
|
||
- SelectByQRCode()
|
||
- SelectByNameAndMobile()
|
||
|
||
2. **在 SignUpService.asmx.cs 中實現 5 個缺失方法**
|
||
- UploadSignUps()
|
||
- CheckIn()
|
||
- CheckOut()
|
||
- OnSiteCheckIn()
|
||
- OnSiteCheckOut()
|
||
|
||
3. **測試驗證**
|
||
- 單元測試:確保邏輯正確
|
||
- 集成測試:與 WinForm 客戶端測試
|
||
- 邊界測試:空值、重複等情況
|
||
|
||
---
|
||
|
||
## 數據表結構確認
|
||
|
||
SignUp 表欄位(來自 DAC_SignUp1.cs):
|
||
- ✅ ID:流水號(主鍵)
|
||
- ✅ CourseID:課程 ID
|
||
- ✅ Name:學員姓名
|
||
- ✅ Mobile:手機號
|
||
- ✅ QRCode:條碼內容
|
||
- ✅ SignUpType:報名方式(預約/現場)
|
||
- ✅ CheckInTime:簽到時間(允許 NULL)
|
||
- ✅ CheckOutTime:簽退時間(允許 NULL)
|
||
- ✅ DB_APPNO、DB_CRDAT、DB_CRUSR、DB_TRDAT、DB_TRUSR:系統欄位
|
||
|
||
**結論**:數據表結構完全支援規格需求 ✅
|
||
|
||
---
|
||
|
||
## 建議的實現優先級
|
||
|
||
| 優先級 | 方法 | 理由 |
|
||
|------|------|------|
|
||
| 1️⃣ **高** | CheckIn / CheckOut | WinForm 掃描條碼最常用功能 |
|
||
| 2️⃣ **高** | UploadSignUps | 批量同步 WinForm 資料 |
|
||
| 3️⃣ **中** | OnSiteCheckIn / OnSiteCheckOut | 補充現場臨時簽到 |
|
||
|
||
---
|
||
|
||
## 參考文檔
|
||
- `DOC\活動人員簽到簽退與同步.md`:規格文檔
|
||
- `Models\DAC_SignUp1.cs`:數據訪問層實現
|
||
- `Services\SignUpService.asmx.cs`:Web Service 實現
|
||
|
||
---
|
||
|
||
## 檢查結論
|
||
|
||
❌ **規格完整性評分:58% (7/12 方法已實現)**
|
||
|
||
### 缺陷總結
|
||
1. 簽到簽退核心功能缺失(CheckIn/CheckOut)
|
||
2. 批量同步功能缺失(UploadSignUps)
|
||
3. 現場臨時簽到功能缺失(OnSiteCheckIn/Out)
|
||
|
||
### 建議
|
||
⚠️ **建議立即補充實現缺失的 5 個方法**,以完整支持 WinForm 客戶端的簽到簽退功能。
|
||
|