添加复核步骤,优化差旅报销流程

- 新增 Step 3(复核):生成 JSON 后必须重新读取 pdf_raw_text.txt 逐项核对
- 自动执行入口新增复核步骤(第7条)
- 给大模型的推荐提示词新增复核指令(第9条)
- 详细列出 6 项复核清单:金额、人员、日期、费用分类、行程单处理、单据张数
This commit is contained in:
copper-xw 2026-05-29 16:32:30 +08:00
parent 04e1592fe3
commit 20892346c5

165
README.md
View File

@ -21,8 +21,9 @@
4. 读取本次处理目录中的 `报销输出/pdf_raw_text.txt`,按本文的 JSON Schema 分析出差人、日期、事由、费用分类、金额和证据。 4. 读取本次处理目录中的 `报销输出/pdf_raw_text.txt`,按本文的 JSON Schema 分析出差人、日期、事由、费用分类、金额和证据。
5. 如果同一笔滴滴/打车费用同时有行程单和电子发票,金额只按电子发票计入一次;行程单只作为附件和行程明细使用,不要与发票重复计入金额。 5. 如果同一笔滴滴/打车费用同时有行程单和电子发票,金额只按电子发票计入一次;行程单只作为附件和行程明细使用,不要与发票重复计入金额。
6. 如果出差人、出差事由、出发地、目的地、日期、金额等关键信息无法从原文可靠判断,必须先问用户;不要编造。 6. 如果出差人、出差事由、出发地、目的地、日期、金额等关键信息无法从原文可靠判断,必须先问用户;不要编造。
7. 将最终 JSON 保存为本次处理目录中的 `报销输出/analyzed_result.json`。 7. **复核**:重新读取 `pdf_raw_text.txt`,逐项核对生成的 JSON 是否与 PDF 原文中金额、日期、人员等信息一致;如果发现错误,修正后重新生成 JSON。
8. 确认 `questions` 为空、金额合计一致、附件张数一致后,自动运行: 8. 将最终 JSON 保存为本次处理目录中的 `报销输出/analyzed_result.json`。
9. 确认 `questions` 为空、金额合计一致、附件张数一致后,自动运行:
```bash ```bash
python3 差旅报销.py fill 20260529/报销输出/analyzed_result.json python3 差旅报销.py fill 20260529/报销输出/analyzed_result.json
@ -89,32 +90,74 @@ openpyxl # 复制和填写 xlsx 模板
## 依赖安装 ## 依赖安装
### Windows ### 第一步:检测 Python 环境
在运行脚本前,应先确认 Python 和 pip 可用。以下是各平台的检测方法:
#### Windows
```powershell
# 检测 Python 是否可用
py --version
py -m pip --version
# 如果提示找不到 python,或版本异常,尝试:
where python
where pip
```
**注意**:Windows 应用商店的 Python(从 Microsoft Store 安装)可能有执行限制。如果 `py` 命令不可用或行为异常,请从 [python.org](https://www.python.org/downloads/) 或使用 conda 安装官方版本。
#### Linux / macOS
```bash
python3 --version
python3 -m pip --version
# 如果提示找不到 python3,尝试:
which python3
which pip3
```
---
### 第二步:安装依赖
确认 Python 可用后,安装所需的两个库:
#### Windows
```powershell ```powershell
py -m pip install pdfplumber openpyxl py -m pip install pdfplumber openpyxl
``` ```
运行时使用: #### Linux / macOS
```powershell
py 差旅报销.py extract
py 差旅报销.py fill 20260529/报销输出/analyzed_result.json
```
### Linux / macOS
```bash ```bash
python3 -m pip install pdfplumber openpyxl python3 -m pip install pdfplumber openpyxl
``` ```
运行时使用: ---
### 第三步:验证安装
```bash ```bash
python3 差旅报销.py extract python3 -c "import pdfplumber, openpyxl; print('依赖安装成功')"
python3 差旅报销.py fill 20260529/报销输出/analyzed_result.json
``` ```
如果提示 `ModuleNotFoundError`,说明安装失败,需要重新执行上一步。
---
### 常见问题
| 问题 | 解决方法 |
|------|----------|
| `py` 命令找不到 | 从 python.org 下载安装包,勾选 "Add Python to PATH" |
| `python3` 命令找不到 | `sudo apt install python3`(Linux)或从 python.org 安装(macOS)|
| 应用商店 Python 执行受限 | 卸载应用商店版本,安装官方 Python |
| pip 安装失败 | 尝试 `python3 -m pip install --upgrade pip` 先升级 pip |
--- ---
## 标准目录结构 ## 标准目录结构
@ -233,6 +276,57 @@ python3 差旅报销.py schema --output
报销输出/schema_example.json 报销输出/schema_example.json
``` ```
### Step 3(复核):核对 JSON 与 PDF 原文
**重要**:生成 JSON 后,必须重新读取 `pdf_raw_text.txt`,逐项核对:
1. **金额核对**:每个 evidence.金额 是否与 PDF 原文中该文件的实际金额一致(检查"价税合计"或"合计"字段)。
2. **人员核对**:出差人姓名是否与 PDF 原文中一致。
3. **日期核对**:出发/结束日期是否与行程单或机票日期一致。
4. **费用分类核对**:每笔费用是否归类正确(住宿/交通/饮食/其他)。
5. **行程单处理**:同一笔滴滴费用同时有行程单和电子发票时,确认金额只计入了电子发票,行程单不重复计入。
6. **单据张数核对**:附件总张数是否与 evidence 条目数一致。
如果发现错误,修正 JSON 后重新核对,直到完全一致后再进入 Step 4。
---
### Step 4:读取 JSON 并填表
脚本会读取 JSON 并填入 Excel:
```bash
python3 差旅报销.py fill 20260529/报销输出/analyzed_result.json
```
Windows 可用:
```powershell
py 差旅报销.py fill 20260529/报销输出/analyzed_result.json
```
脚本会:
1. 校验 JSON 字段是否完整
2. 校验金额合计是否一致
3. 校验附件张数是否一致
4. 复制 `差旅费明细表.xlsx`
5. 用 openpyxl 填入固定单元格
6. 输出最终 XLSX 到本次处理目录的 `报销输出/`
7. 将本次处理目录重命名为 `出发日期-结束日期_出发地-目的地_事由简写` 格式
输出文件命名规则:
```text
差旅费明细表_[出差人]_[出发日期YYYYMMDD]_[目的地]_[事由简写].xlsx
```
示例:
```text
20260520-20260522_北京-广州_售后维修/报销输出/差旅费明细表_xxxx_20260520_广州_售后维修.xlsx
```
#### 给大模型的推荐提示词 #### 给大模型的推荐提示词
```text ```text
@ -247,9 +341,10 @@ python3 差旅报销.py schema --output
6. 每个金额必须写入 evidence,说明来自哪个文件、依据是哪段文本。 6. 每个金额必须写入 evidence,说明来自哪个文件、依据是哪段文本。
7. 如果同一笔滴滴/打车费用同时有行程单和电子发票,金额只按电子发票计入一次;行程单只作为附件和行程明细使用,不要与发票重复计入金额。 7. 如果同一笔滴滴/打车费用同时有行程单和电子发票,金额只按电子发票计入一次;行程单只作为附件和行程明细使用,不要与发票重复计入金额。
8. 如果某个字段无法可靠判断,必须先问用户,不要编造;在未确认前不要填表。 8. 如果某个字段无法可靠判断,必须先问用户,不要编造;在未确认前不要填表。
9. 将最终 JSON 保存到本次处理目录中的 `报销输出/analyzed_result.json`,JSON 必须符合 README 中的 schema。 9. **复核**:重新读取 `pdf_raw_text.txt`,逐项核对生成的 JSON 是否与 PDF 原文中金额、日期、人员等信息一致;如果发现错误,修正后重新生成 JSON。
10. 确认 `questions` 为空、金额合计一致、附件张数一致后,运行 `python3 差旅报销.py fill 本次处理目录/报销输出/analyzed_result.json` 生成最终 Excel,并把本次目录重命名为 `出发日期-结束日期_出发地-目的地_事由简写` 格式。 10. 将最终 JSON 保存到本次处理目录中的 `报销输出/analyzed_result.json`,JSON 必须符合 README 中的 schema。
11. 最后告诉用户生成的 Excel 文件路径和本次归档目录,并列出需要人工复核的证据或假设;如果存在行程单和电子发票对应同一笔费用,必须明确提醒用户:行程单未重复计入金额,只作为附件和行程明细使用。 11. 确认 `questions` 为空、金额合计一致、附件张数一致后,运行 `python3 差旅报销.py fill 本次处理目录/报销输出/analyzed_result.json` 生成最终 Excel,并把本次目录重命名为 `出发日期-结束日期_出发地-目的地_事由简写` 格式。
12. 最后告诉用户生成的 Excel 文件路径和本次归档目录,并列出需要人工复核的证据或假设;如果存在行程单和电子发票对应同一笔费用,必须明确提醒用户:行程单未重复计入金额,只作为附件和行程明细使用。
``` ```
--- ---
@ -337,42 +432,6 @@ python3 差旅报销.py schema --output
--- ---
## Step 3:读取 JSON 并填表
```bash
python3 差旅报销.py fill 20260529/报销输出/analyzed_result.json
```
Windows 可用:
```powershell
py 差旅报销.py fill 20260529/报销输出/analyzed_result.json
```
脚本会:
1. 校验 JSON 字段是否完整
2. 校验金额合计是否一致
3. 校验附件张数是否一致
4. 复制 `差旅费明细表.xlsx`
5. 用 openpyxl 填入固定单元格
6. 输出最终 XLSX 到本次处理目录的 `报销输出/`
7. 将本次处理目录重命名为 `出发日期-结束日期_出发地-目的地_事由简写` 格式
输出文件命名规则:
```text
差旅费明细表_[出差人]_[出发日期YYYYMMDD]_[目的地]_[事由简写].xlsx
```
示例:
```text
20260520-20260522_北京-广州_售后维修/报销输出/差旅费明细表_xxxx_20260520_广州_售后维修.xlsx
```
---
## Excel 填写位置 ## Excel 填写位置
脚本只填写这些单元格: 脚本只填写这些单元格: