Files
Auto-Finance/README.md

209 lines
7.7 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.
# 财务报销自动化
自动从 PDF 发票提取信息OCR 识别支付记录截图,生成发票汇总表与易耗品出库单,并可选在财务系统中自动填报报销单。
## 项目结构
```
├── run.py # CLI 入口(发票提取 → OCR → 浏览器填报)
├── config.json # 配置文件(登录凭据、默认值、存放地点等)
├── 易耗品、出库单.doc # 易耗品出库单 Word 模板Web/CLI 填写用)
├── app/
│ ├── config.py # 配置加载
│ ├── extractor.py # PDF 发票信息提取
│ ├── ocr.py # OCR 刷卡信息识别
│ ├── bot.py # 浏览器自动填报
│ ├── pipeline.py # CLI 流程编排
│ └── fill_consumable_doc.py # 将 CSV 填入易耗品出库单Word COM
├── web/
│ ├── app.py # Web 服务入口
│ ├── templates/
│ │ ├── index.html # PC 端主页
│ │ └── mobile_upload.html # 移动端扫码上传
│ ├── static/ # 前端 CSS / JS
│ └── uploads/ # 按会话隔离的上传与产物目录
├── *.pdf # 发票 PDFCLI 模式,放在项目根目录)
├── *.png / *.jpg # 与 PDF 配对的支付截图
├── invoice_summary.csv # 发票汇总表CLI 产物)
└── images/ # 浏览器调试截图
```
## 数据流
```mermaid
flowchart TB
PDF[PDF 发票] --> Extract[extractor 提取]
Extract --> List[发票列表]
Img[支付截图] --> OCR[OCR 识别]
List --> OCR
OCR --> CSV[(invoice_summary.csv)]
CSV --> Fill[fill_consumable_doc]
Fill --> Doc[易耗品、出库单.doc]
CSV --> Bot[bot 浏览器自动化]
Bot --> Submit[财务系统填报<br/>可选]
```
## 环境要求
- Python 3.10+
- Windows易耗品出库单填写依赖 Microsoft Word + COM仅 Windows 可用)
- 主要依赖见下方安装步骤
## 快速开始
### 1. 安装依赖
> OCR 相关依赖建议在已有 PaddleOCR 的环境中安装(如 MinerU 虚拟环境)。
```bash
pip install pdfplumber==0.11.9 paddleocr==2.8.1 playwright==1.60.0 flask==3.0.3 pywin32
playwright install chromium
```
| 依赖 | 用途 |
|------|------|
| pdfplumber | PDF 发票文本提取 |
| paddleocr | 支付截图 OCR |
| playwright | 财务系统浏览器自动化 |
| flask | Web 服务 |
| pywin32 | 填写 Word 出库单(`fill_consumable_doc` |
### 2. 准备数据CLI 模式)
将发票 PDF 和对应的支付截图放在项目根目录下。脚本会自动匹配 PDF 与截图:
1. **优先文件名匹配** — PDF 与截图同名(如 `发票.pdf``发票.png`
2. **金额近邻匹配** — 文件名不同时,按价税合计与刷卡金额就近配对
截图支持格式:`.png``.jpg``.jpeg``.bmp``.webp`
### 3. 配置
编辑 `config.json`
```json
{
"username": "你的工号",
"password": "你的密码",
"default_name": "默认报销人姓名",
"default_card_no": "默认公务卡号",
"default_person_id": "默认人员编号",
"consumable_storage": "躬行楼 C205"
}
```
| 字段 | 说明 |
|------|------|
| `username` / `password` | 信息门户登录凭据 |
| `default_name` | 默认报销人姓名 |
| `default_card_no` | 默认公务卡号 |
| `default_person_id` | 默认人员编号(工号) |
| `consumable_storage` | 出库单「存放地点」列默认值 |
| `sso_login_url` 等 | 系统 URL一般无需修改 |
### 4. 运行CLI
```bash
# 全流程(发票提取 → OCR 识别 → 浏览器填报)
python run.py
# 仅执行某一步
python run.py --step invoice # 仅发票提取
python run.py --step ocr # 仅 OCR 识别
python run.py --step submit # 仅浏览器填报
# 覆盖配置中的登录凭据
python run.py -u 工号 -p 密码
```
### 5. 填写易耗品出库单CLI
需已生成 `invoice_summary.csv`,且本机已安装 **Microsoft Word**
```bash
python -m app.fill_consumable_doc
python -m app.fill_consumable_doc --csv invoice_summary.csv --doc "易耗品、出库单.doc"
python -m app.fill_consumable_doc --no-backup # 不生成 .doc.bak 备份
```
填写规则概要:
- 表头「日期」使用**填写当天**的日期(非发票开票日期)
-`规格型号` 解析品名、规格、单位、数量、单价;`价税合计` 写入金额列
- 单价/金额保留两位小数;表格内统一为 **宋体五号10.5 磅)**
- 存放地点取自 `consumable_storage`;购货人/领用人签字、备注保持空白
## 执行步骤说明
| 步骤 | 命令 | 说明 |
|------|------|------|
| 发票提取 | `--step invoice` | 扫描根目录 PDF生成 `invoice_summary.csv` / `.md` |
| OCR 识别 | `--step ocr` | 识别支付截图,回填刷卡日期、金额、持卡人等到 CSV |
| 浏览器填报 | `--step submit` | 登录信息门户 → 报销系统 → 自动填单、上传附件 |
> 分步执行时,上一步的 CSV 会自动成为下一步的输入。
### CSV 字段说明
| 列名 | 说明 |
|------|------|
| 序号 | 行号 |
| 发票号码 | 电子发票号码 |
| 开票日期 | 开票日期 |
| 项目名称 / 规格型号 | 货物或应税劳务信息 |
| 价税合计 | 发票含税金额 |
| 销售方名称 | 销方名称 |
| 人员姓名 / 刷卡日期 / 公务卡号 / 刷卡金额 | OCR 自支付截图回填 |
| 备注 / 工号 | 可手工或 Web 端编辑补充 |
## Web 服务
提供浏览器界面:上传文件 → 自动处理 → 在线编辑 → 下载产物 → 可选提交财务系统。
```bash
python web/app.py
```
访问 `http://localhost:5000`
### 推荐使用流程
1. 上传 PDF + 支付截图(或上传已有 CSV
2. 填写配置(账号、密码、姓名、公务卡号、存放地点等),可上传 `config.json` 一键填充
3. 点击 **开始处理** — 完成发票提取、OCR、生成 CSV并自动填写 **易耗品、出库单.doc**
4.**下载文件** 区域下载 CSV / Markdown / 出库单 Word
5. 在表格中核对、修改发票数据(提交财务系统前会自动保存)
6. 确认无误后点击 **提交到财务系统**
### 处理模式
| 模式 | 入口 | 说明 |
|------|------|------|
| **PDF 模式** | 上传 PDF + 截图 | 提取发票 → OCR → 生成 CSV + 出库单 |
| **CSV 快捷模式** | 仅上传 CSV | 跳过提取与 OCR直接生成出库单并进入编辑/提交 |
### 功能一览
| 功能 | 说明 |
|------|------|
| 发票提取 + OCR | 上传 PDF 后自动完成 |
| 易耗品出库单 | 处理完成后自动生成 Word可下载 |
| 表格在线编辑 | 处理完成后可修改 CSV 各字段;保存后重新生成出库单 |
| 财务系统填报 | 单独按钮触发,处理阶段不会自动提交 |
| 实时日志 | SSE 推送处理进度 |
| 配置上传 | 支持上传 `config.json` 填充表单 |
| 手机扫码上传 | 二维码打开移动端页面拍照上传支付截图PC 端轮询同步 |
> Web 端浏览器填报以无头模式运行。未上传 PDF 时,填报阶段会跳过附件上传。
> 出库单生成需要 **Windows + Word + pywin32**若失败页面会显示具体原因CSV 等其它产物仍可正常使用。
接口说明见 [API.md](./API.md)。
## 注意事项
- 浏览器填报时会打开或使用 Chromium请勿手动干扰自动化流程
- 调试截图保存在 `images/` 目录
- OCR 不会覆盖 CSV 中已有非空字段
- 项目根目录需保留 `易耗品、出库单.doc` 模板Web 每次从模板复制到会话目录再填写,不修改原模板
- `config.json` 含敏感信息,请勿提交到公开仓库