# 表单数据保护方案 - 进度跟踪

> 最后更新: 2026-04-20

## 当前状态: 试点改造完成，等待用户确认效果

## 已完成
- [x] 项目代码扫描
- [x] 技术栈分析 (React 18 + Ant Design 5 + Zustand + react-router-dom 6)
- [x] 表单组件清单整理 (13个Modal表单 + 1个页面级表单)
- [x] 输出详细改造方案
- [x] 用户确认方案（所有决策点已确认）
- [x] 创建 useFormDraft Hook (src/hooks/useFormDraft.ts)
- [x] 创建 useFormGuard Hook (src/hooks/useFormGuard.ts)
- [x] 试点改造: ReimbursementsPage (Modal表单，含detailItems外部状态)
- [x] 试点改造: BudgetProjectCreate (页面级表单，含路由离开拦截)

## 待完成
- [ ] 用户确认试点效果
- [ ] 推广至全项目 (11个剩余组件)

## 已确认的决策
| 决策项 | 决定 | 理由 |
|--------|------|------|
| 第三方库 vs 自定义Hook | 自定义Hook | 项目表单模式统一(Ant Design Form)，第三方库兼容性不确定 |
| sessionStorage vs localStorage | sessionStorage | 关闭标签自动清理，避免脏数据残留 |
| 草稿恢复时机 | 弹确认框让用户选择 | 给用户选择权 |
| 草稿过期策略 | savedAt超过24小时自动忽略 | 避免过期脏数据 |
| Modal关闭拦截 | 是，但只拦截有改动的情况 | 防止误关，但不干扰正常操作 |
| 试点组件 | ReimbursementsPage + BudgetProjectCreate | 最复杂Modal表单 + 唯一页面级表单 |

## 新增文件
- `src/hooks/useFormDraft.ts` - 表单草稿自动保存/恢复/清理
- `src/hooks/useFormGuard.ts` - 离开拦截(浏览器刷新/关闭 + 路由跳转 + 移动端切后台)

## 改造要点
### ReimbursementsPage (Modal表单)
- Modal关闭时保存草稿而非丢弃
- 重新打开时检测草稿，弹确认框让用户选择恢复或重新填写
- detailItems外部状态通过extraData同步保存
- 表单提交成功后清理草稿
- maskClosable=false 防止误点遮罩关闭
- onValuesChanged 监听表单变化自动保存

### BudgetProjectCreate (页面级表单)
- 页面加载时检测草稿，弹确认框让用户选择恢复
- useBlocker 拦截路由跳转，弹确认框
- beforeunload 拦截浏览器刷新/关闭
- visibilitychange + pagehide 处理移动端切后台
- 附件变化时同步保存草稿
- 取消按钮有改动时弹确认

## 剩余待改造组件 (11个)
1. AdvancesPage.tsx - 预支申请(Modal, 附件)
2. PaymentRequestsPage.tsx - 付款申请(Modal, 收款单位联动, 附件)
3. SuppliersPage.tsx - 供应商(Modal, 联系人/收款信息)
4. SubcontractorsPage.tsx - 分包商(Modal, 联系人/收款信息)
5. CustomersPage.tsx - 客户(Modal, 联系人/收款信息)
6. LogisticsCompaniesPage.tsx - 物流公司(Modal)
7. ProcurementPage.tsx - 采购(Modal)
8. PurchaseRequestsPage.tsx - 采购申请(Modal)
9. PurchaseOrdersPage.tsx - 采购订单(Modal, 商品明细)
10. ContractCreateModal.tsx - 快速签约(Modal)
11. QuotationCreateModal.tsx - 新增报价版本(Modal)
12. ProfilePage.tsx - 个人资料(页面表单+密码修改Modal)
