Files
thinkyu/Doc/領據匯入修正計畫.md
sryang 577060bc78 chore: 首次簽入 Thinkyu ASP.NET 專案
- 加入 Visual Studio / ASP.NET .gitignore
- 排除建置輸出、IDE 設定、NuGet packages、大型 MSI 安裝檔
2026-09-10 09:42:37 +08:00

41 lines
1.8 KiB
Markdown
Raw Permalink 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.
# 領據匯入功能修正計畫
## 問題一:匯入顯示失敗但資料已入 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`