tauri-android-tax/doc/设计.md
2026-07-08 18:01:27 +08:00

90 lines
4.0 KiB
Markdown
Raw 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.

# 设计
## 1. 概述
本 App 是一个"发票助手":扫描小票二维码 -> 打开对应 h5 页面 -> 用 AI 识别页面表单 -> 自动填入预置的开票信息 -> 用户确认提交获取发票。
> 说明:需求中的"trauri"按 **Tauri** 框架理解AI 采用**硅基流动云端大模型 API**cloud.siliconflow.cn需联网
## 2. 技术选型
- 框架Tauri 2.x编译 Android APK
- 前端Vue 3 + Vite轻量、易写表单页
- 二维码扫描:`tauri-plugin-barcode-scanner`(调用相机)。
- h5 展示Tauri WebviewWindow / 内嵌 iframe 加载扫描得到的 URL。
- 本地存储Rust 侧 `rusqlite`bundled内置 SQLite保存预置开票信息。
- AI 调用Rust 侧 `command` 转发到硅基流动 HTTP 接口OpenAI 兼容协议),密钥不暴露在前端;`reqwest` 使用 `rustls-tls`,免系统 OpenSSL 依赖。
eqwest 使用
ustls-tls 免系统 OpenSSL 依赖。
- 权限:桌面权限在 capabilities/default.json扫码权限单独放 capabilities/mobile.json限定 android/iOS 平台)。
- 工具链:在 WSL 中执行 Rust + Android NDK/SDK 构建。
## 3. 功能模块
### 3.1 开票信息管理
- 字段抬头、税号、Email、可选地址、电话、开户行、账号。
- 支持多条,标记 1 条为默认(`is_default=1`)。
- 界面:列表 + 增/删/改 + 设为默认。
### 3.2 二维码扫描
- 点击"扫一扫"调用相机识别二维码,得到 URL。
- 得到 URL 后打开内置 WebView 展示 h5 页面。
### 3.3 AI 识别与自动填充
1. 页面加载完成后,前端注入脚本抓取表单 DOM各 input/select 的 label、name、placeholder
2. 将 DOM 摘要 + 默认开票信息通过 Rust command 发送给大模型。
3. 大模型返回"字段选择器 -> 应填值"的映射JSON
4. 前端按映射用注入脚本回填表单。
5. 用户核对后手动点提交。
## 4. 数据模型
```
invoice_info(
id INTEGER PK,
title TEXT, -- 抬头
tax_no TEXT, -- 税号
email TEXT,
address TEXT,
phone TEXT,
bank_name TEXT,
bank_account TEXT,
is_default INTEGER -- 1=默认,仅一条
)
```
## 5. 核心流程
```mermaid
flowchart TD
A[打开 App] --> B[扫描二维码]
B --> C[获取 URL]
C --> D[WebView 加载 h5 页面]
D --> E[抓取表单 DOM]
E --> F[DOM + 默认开票信息 发送大模型]
F --> G[返回字段映射 JSON]
G --> H[注入脚本回填表单]
H --> I[用户核对并提交]
I --> J[获取发票]
```
## 6. 关键接口Tauri command
- `list_invoice_info()` / `save_invoice_info()` / `delete_invoice_info()` / `set_default(id)`:信息 CRUD。
- `ai_map_fields(dom_summary, info)`:调用大模型,返回字段映射 JSON。
## 7. AI 接口配置
- 服务商硅基流动OpenAI 兼容 `chat/completions` 接口。
- Base URL`https://api.siliconflow.cn/v1`
- 密钥:`sk-drqdzsdvsnqxalvwjggsexyowbertkxrgpqyeqilhkkiqemn`(当前硬编码在 Rust 层)。
- 为便于未来更换服务商Rust 侧用一组常量集中管理:
```rust
// AI 服务配置:更换服务商时只改此处
const AI_BASE_URL: &str = "https://api.siliconflow.cn/v1";
const AI_API_KEY: &str = "sk-drqdzsdvsnqxalvwjggsexyowbertkxrgpqyeqilhkkiqemn";
const AI_MODEL: &str = "Qwen/Qwen2.5-7B-Instruct"; // 具体模型待定
```
- 调用统一走 `ai_map_fields` command内部封装请求切换服务商仅需改常量及必要的请求格式适配
> 安全提示:密钥硬编码会被打包进 APK存在泄露风险仅作当前阶段方案后续建议改为服务端代理或运行时配置。
## 8. 待确认
- 使用的具体模型名称(影响识别效果与费用)。
- 是否需要邮箱自动接收发票(仅填 Email 还是集成收件)。
- h5 页面跨域抓取 DOM 的限制处理方式。