# 領據匯入功能修正計畫 ## 問題一:匯入顯示失敗但資料已入 DB ### 根因 `領據匯入.cs:InsertOne()` 中,`dac領據.InsertOne`、`dac勞務費.InsertOne`、`dac差旅費.InsertOne` 各自有獨立的 `TransactionScope`,但沒有外層 `TransactionScope` 包裹。當領據寫入成功後勞務費或差旅費寫入失敗時,領據主檔已 commit 到資料庫,但例外往上拋,前端顯示失敗。 ### 修正 在三個 InsertOne 呼叫外層加上 `using (var ts = DAC.NewTransactionScope())`,使三者屬於同一個交易,全部成功才 commit。 --- ## 問題二:匯入時顯示無效檔案但資料已入 DB ### 根因(多重因素) 1. **上傳處理器一律存成 `.xlsx`**(`ReceiptUploadHandler.ashx.cs:41`),若使用者上傳 `.xls` 格式,`LoadWorkbook` 會誤用 `XSSFWorkbook` 解析 OLE2 格式而拋錯 2. **前端匯入完成後 `validationSuccess` 未重置**,加上 `importData()` 的 guard 僅檢查 `this.validationSuccess`,若因 session 過期或重複點擊導致匯入失敗,使用者看到錯誤但前一次資料已入 DB 3. **按鈕 disabled 條件不足**,未鎖定已完成的匯入 ### 修正 1. `ReceiptUploadHandler.ashx.cs`:存檔時保留原始副檔名 2. `領據匯入.js`:新增 `importDone` 旗標,匯入完成後鎖住按鈕與 guard 3. `領據匯出匯入.ascx`:按鈕 `:disabled` 加入 `importDone` 條件 --- ## 受影響檔案 | 檔案 | 修改內容 | |------|----------| | `Web\Import\領據匯入.cs` | `InsertOne()` 加入外層 `TransactionScope` | | `Web\Services\ReceiptUploadHandler.ashx.cs` | 存檔時保留原始副檔名 | | `Web\Scripts\領據匯入.js` | 新增 `importDone` 旗標,加入 guard | | `Web\Forms\領據系統\領據匯出匯入.ascx` | 按鈕 `:disabled` 加入 `importDone` | --- ## SVN Branch `branches/fix-import-transaction`