7.2 KiB
7.2 KiB
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 中):
// 按 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)
{
// 智能更新:非空才更新
}
實現步驟
-
在 DAC_SignUp2.cs 中新增必要的查詢方法
- SelectByQRCode()
- SelectByNameAndMobile()
-
在 SignUpService.asmx.cs 中實現 5 個缺失方法
- UploadSignUps()
- CheckIn()
- CheckOut()
- OnSiteCheckIn()
- OnSiteCheckOut()
-
測試驗證
- 單元測試:確保邏輯正確
- 集成測試:與 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 方法已實現)
缺陷總結
- 簽到簽退核心功能缺失(CheckIn/CheckOut)
- 批量同步功能缺失(UploadSignUps)
- 現場臨時簽到功能缺失(OnSiteCheckIn/Out)
建議
⚠️ 建議立即補充實現缺失的 5 個方法,以完整支持 WinForm 客戶端的簽到簽退功能。