本技能自动化处理日常报销工作流:
| 限制项 | 说明 |
|---|---|
| -------- | ------ |
| 根目录由用户指定 | 首次运行时提示用户输入发票所在的根目录路径 |
| 禁止父目录访问 | 绝对禁止使用 .. 回退到用户指定根目录的上级 |
| 仅操作目标子文件夹 | 所有文件操作仅在已确认的子文件夹内 |
| 仅处理有效文件夹 | 仅处理包含PDF发票的子文件夹 |
| 路径合法性校验 | 所有文件操作前验证路径以用户指定的根目录开头 |
违反路径限制的操作将被自动拒绝。
根目录: "{由用户首次运行时输入}"
姓名: "(留空或填写报销人姓名)"
压缩包格式: "{姓名}{YYYYMMDD}.zip"
统计表名称: "发票统计表.xlsx"
> 重要:
> - 首次触发技能时,AI 必须先询问用户"请输入发票所在的文件夹路径",并将用户提供的路径作为根目录
> - 用户可选择性提供姓名,用于压缩包命名;留空时不带姓名前缀
> - 姓名仅用于压缩包命名,不会出现在发票统计表或 PDF 文件中
发票归档/
└── SKILL.md # 主技能定义
{根目录}\ # 用户指定的根目录
├── 示例文件夹1\ # 子文件夹1(有PDF,处理)
│ ├── 发票统计表.xlsx ← 自动生成
│ ├── 发票1.pdf
│ └── 发票2.pdf
├── 示例文件夹2\ # 子文件夹2(无PDF,跳过)
├── 其他文件夹\ # 子文件夹3(有PDF,处理)
└── ...
> 根目录由用户首次运行时输入,例如 F:\出差\未报、D:\报销发票\2026 等。
有效子文件夹条件:
{根目录}os.path.abspath() 规范化路径,拒绝包含 .. 的路径{根目录} 下的所有子文件夹> 可选:用户可同时提供姓名(用于压缩包命名),如未提供则压缩包名不含姓名前缀。
对每个子文件夹检查:
处理结果分类:
| 状态 | 说明 |
|---|---|
| ------ | ------ |
| 有效文件夹 | 包含PDF发票,将被处理 |
| 无效文件夹 | 无PDF发票,将被跳过并提示 |
检测到以下文件夹:
【有效】需要处理:
1. 2024年3月差旅费(包含 5 个PDF)
2. 4月交通费报销(包含 3 个PDF)
【无效】跳过处理:
1. 项目验收材料(无PDF发票)
请确认是否继续处理有效文件夹?(是/否)
必须用户确认后才继续执行。
对每个有效文件夹中的PDF文件提取:
在每个有效子文件夹内创建 发票统计表.xlsx,包含以下列:
| 列 | 字段名 | 说明 |
|---|---|---|
| ---- | -------- | ------ |
| A列 | 序号 | 自动编号 |
| B列 | 发票号码 | 发票上的号码 |
| C列 | 费用名称 | 自动识别的费用类型 |
| D列 | 价税合计 | 发票金额(元) |
统计表格式示例:
| 序号 | 发票号码 | 费用名称 | 价税合计 |
|---|---|---|---|
| ------ | ---------- | ---------- | ---------- |
| 1 | 26112000001368449041 | 交通费 | 42.00 |
| 2 | 26412000001004749381 | 餐费 | 374.00 |
| 3 | 26412000001168879381 | 餐费 | 259.00 |
底部加一行汇总:
| 合计 | - | - | 2301.48 |
|---|
将PDF文件按发票号码重命名,格式:{发票号码}.pdf
> 例如:滴滴电子发票.pdf → 16412000000012345678.pdf
压缩包只包含PDF文件,不包含统计表。
根据有效文件夹数量采用不同策略:
直接打包为 {姓名}{YYYYMMDD}.zip
步骤1:为每个子文件夹创建临时压缩包(带序号)
{姓名}20260410_001.zip → 2024年3月差旅费
{姓名}20260410_002.zip → 4月交通费报销
步骤2:合并所有临时压缩包为一个
最终输出:{姓名}20260410.zip
步骤3:清理临时压缩包
压缩包内容结构:
{姓名}20260410.zip
├── 2024年3月差旅费\
│ ├── 发票统计表.xlsx
│ ├── 发票1.pdf
│ └── 发票2.pdf
├── 4月交通费报销\
│ └── 发票A.pdf
└── ...
========== 发票归档处理结果 ==========
【处理完成】
✓ 2024年3月差旅费
- 处理发票:5张
- 发票总金额:¥1,234.56
- 统计表:发票统计表.xlsx
- 压缩包:{姓名}20260410.zip
【跳过处理】
✗ 项目验收材料 - 缺少PDF发票文件
=====================================
共计处理:1个文件夹,5张发票
压缩包:{姓名}20260410.zip
=====================================
========== 发票归档处理结果 ==========
【处理完成】
✓ 2024年3月差旅费
- 处理发票:5张
- 发票总金额:¥1,234.56
✓ 4月交通费报销
- 处理发票:3张
- 发票总金额:¥567.89
【跳过处理】
✗ 项目验收材料 - 缺少PDF发票文件
【合并打包】
✓ 已合并为:{姓名}20260410.zip
=====================================
共计处理:3个文件夹,10张发票
压缩包:{姓名}20260410.zip
=====================================
费用分类按以下优先级顺序匹配(先匹配到的优先):
交通费(包含以下关键词):
餐费(包含以下关键词):
招待费(包含以下关键词):
住宿费(包含以下关键词):
办公费(包含以下关键词):
文印费(包含以下关键词):
邮费(包含以下关键词):
培训费(包含以下关键词):
效果图设计费(包含以下关键词):
文本制作费(包含以下关键词):
设计费(包含以下关键词):
咨询费(包含以下关键词):
技术服务费(包含以下关键词):
工程费(包含以下关键词):
设备费(包含以下关键词):
材料费(包含以下关键词):
安装费(包含以下关键词):
软件费(包含以下关键词):
办公家具(包含以下关键词):
图书(包含以下关键词):
福利费(包含以下关键词):
保险费(包含以下关键词):
会费(包含以下关键词):
租车费(包含以下关键词):
维修费(包含以下关键词):
租赁费(包含以下关键词):
通讯费(包含以下关键词):
物业费(包含以下关键词):
> 注意:若以上关键词均未匹配,则归类为"其他"。产生统计表前,若发票数量较多,可按摘要内容人工复核分类结果。
价税合计(大写) 肆拾贰圆整 (小写)¥42.00r'价税合计[^¥¥][¥¥]\s(\d+\.?\d{0,2})'r'(?:发票号码[::]\s*)?(\d{20,})' 或 r'(1\d{19})'6581863086042892592382026)不等于发票号码,应匹配 发票号码: 后面的才是真实发票号发票号码:为标记)→ 用于重命名E或26位数字)→ 忽略pdfplumber 读取PDF内容sys.stdout.reconfigure(encoding='utf-8')openpyxl 创建统计表os.path.abspath() 确保路径正确{根目录} 开头.. 的路径操作编辑"发票费用分类规则"部分:
编辑本文件的 默认配置 部分:
将整个 发票归档 文件夹打包分享(只需 SKILL.md),同事解压到 ~/.workbuddy/skills/ 目录即可使用。
同事可自行修改 SKILL.md 中的默认配置以适应自己的工作环境。
共 1 个版本