# [P0] 持久化层与不可变银行导入基础

## 背景

当前 `/api/parse` 只在临时文件中解析并返回摘要，随后删除文件。公司、账户、交易、导入批次和异常均无数据库记录，页面“原始文件已保留”的文案与实际行为不一致。

## 范围

- 选择并记录数据库、迁移工具和文件存储方案。
- 建立公司、账户、源文件、导入批次、工作表批次、规范化源行、解析异常和审计字段的最小模型。
- 源文件在解析前计算内容哈希并不可变保存。
- 每条规范化交易保存源文件、工作表、原始行号和模板版本。
- 实现文件级与源行级幂等，重复上传不重复影响后续计算。
- 定义失败状态、重试状态和事务边界。

## 约束

- 原始文件和源行不能被静默修改或覆盖。
- 金额继续使用十进制定点类型，不能转为二进制浮点。

## 验收标准

- [ ] 空数据库可通过迁移命令完整创建，重复执行无副作用。
- [ ] 上传成功后重启服务，原文件、批次、工作表和源行仍可查询。
- [ ] 同一文件重复上传返回已存在批次或明确重复状态，不创建第二份有效事实。
- [ ] 每条源行可反查文件哈希、工作表、行号和解析模板版本。
- [ ] 解析失败也保留异常批次和诊断，但不产生已确认交易。
- [ ] 有数据库约束和自动化测试证明幂等与不可变性。

## 测试

- 迁移向前/回滚测试。
- 重复文件、重复行、解析失败、服务重启后的集成测试。

## 依赖

Issue 001。
