64 lines
1.7 KiB
Markdown
64 lines
1.7 KiB
Markdown
# CSV 流水导入模块
|
|
|
|
## 模块归属
|
|
|
|
- 业务模块:`transactions`
|
|
- 应用入口:收支流水页面
|
|
- 基础设施:Tauri 命令、SQLite、Windows 用户应用数据目录
|
|
|
|
## 当前公开接口
|
|
|
|
### `import_transactions_csv`
|
|
|
|
输入文件名与 UTF-8 CSV 文本,在单个 SQLite 事务中完成校验、文件登记和交易写入。
|
|
|
|
返回:
|
|
|
|
- 文件总行数
|
|
- 新增交易数
|
|
- 重复交易数
|
|
- 文件 SHA-256 指纹
|
|
|
|
### `list_local_transactions`
|
|
|
|
读取本机已经保存的交易,按交易时间倒序返回界面层需要的只读结构。
|
|
|
|
## CSV 约定
|
|
|
|
必填列:
|
|
|
|
- `交易时间`
|
|
- `对方`
|
|
- `收支类型`,值为“收入”或“支出”
|
|
- `金额`,最多两位小数
|
|
|
|
可选列:
|
|
|
|
- `来源`
|
|
- `分类`
|
|
- `交易单号`
|
|
|
|
同时接受文档中定义的英文列名。首版只支持 UTF-8 编码,不自动猜测 GBK。
|
|
|
|
## 去重规则
|
|
|
|
1. 文件内容 SHA-256 相同,整份文件视为已导入。
|
|
2. 有交易单号时,以“来源 + 交易单号”生成交易指纹。
|
|
3. 没有交易单号时,以“时间 + 对方 + 收支方向 + 整数分金额 + 来源”生成交易指纹。
|
|
4. 不覆盖已有交易,重复记录使用数据库唯一约束跳过。
|
|
|
|
## 一致性与故障处理
|
|
|
|
- 所有金额在 Rust 中转换为整数分,不经过浮点数。
|
|
- 任何一行不合法时,整份 CSV 不写入数据库。
|
|
- SQLite 使用 WAL 日志模式。
|
|
- 数据库位于 Windows 用户应用数据目录,安装和升级不覆盖。
|
|
- 当前迁移版本为 1,并记录在 `schema_migrations` 表。
|
|
|
|
## 已知限制
|
|
|
|
- 还没有字段映射向导。
|
|
- 还没有 GBK 文件转码。
|
|
- 还没有导入预览和逐行忽略。
|
|
- 待确认结果尚未持久化,本轮只保存原始流水与初始分类。
|