<!-- 实现功能-->
加班车费报销自动化技能
功能概述
接收一个文件夹路径,自动处理该文件夹下的加班车费报销:
1. 读取报销申请表.xlsx(含「加班打车」类型的记录)
2. 从人员花名册.xlsx(文件名含"花名册")中通过工号匹配身份证号
3. 扫描每条记录对应的报销凭证文件夹(文件夹名=D列第一个/前的路径段)
4. 解析PDF电子发票/行程单(pdfplumber)或图片发票(OCR)
5. 按7条规则校验,填写/追加到结算表模板.xlsx(文件名含"结算")
<!--输入约定-->
输入文件约定
文件夹内需包含(文件名匹配规则):
| 文件 | 匹配规则 |
|---|---|
| 报销申请表 | 含"报销申请"的 .xlsx |
| 花名册 | 含"花名册"的 .xlsx |
| 结算表模板 | 含"结算"的 .xlsx(作为输出模板,不覆盖) |
| 凭证文件夹 | 名称 = 报销申请表 D 列第一个 / 前的路径段 |
报销申请表列位置(1-indexed)
| 列 | 内容 |
|---|---|
| A | 实例标题(含"XXX发起的报销申请") |
| B | 报销月份 |
| C | 报销总金额 |
| E | 报销类型(含"加班"才处理) |
| D | 报销凭证路径(第一个/前为文件夹名) |
| J | 申请人(含工号,格式"姓名(工号)") |
> 注意:部分记录J列为空,姓名会从A列标题"XXX发起的报销申请"中提取
花名册列位置(1-indexed)
| 列 | 内容 |
|---|---|
| A | 工号 |
| B | 姓名 |
| F | 身份证 |
数据从第4行起(第3行为表头)。
<!--遵循规则-->
报销校验规则
| # | 规则 |
|---|---|
| 1 | 发票抬头须为「北京外企德科人力资源服务上海有限公司」,税号 913100007776072078 |
| 2 | 网约车(滴滴等):需同时有发票和行程单,且金额一致 |
| 3 | 出租车等:仅需发票 |
| 4 | 打车时间须在 21:00 及之后 |
| 5 | 行程单车型不得含:优享型、专车、商务车、豪华、六座 |
| 6 | 行程单上下车须同城市(不可跨城) |
| 7 | 发票合计金额 ≥ 系统申请金额 |
结算表填写规范
脚本自动读取结算表模板的表头行,根据列名匹配写入位置。支持的列名:
| 列名关键字 | 填写内容 |
|---|---|
| 工号 | 员工工号 |
| 姓名 | 员工姓名 |
| 身份证 | 身份证号 |
| 报销类型 | 加班打车 |
| 申请金额 | 系统申请金额 |
| 报销金额 | 凭证合计金额 |
| 月份 | 如 202603 |
| 电子流金额 | 同申请金额 |
| 发票金额 | 同报销金额 |
| 备注 | 异常原因(有则填,无则空) |
> 注意:列位置自动匹配,不依赖固定列号,保持模板原有格式不变
> 注意:填写内容报销金额列数值需要严格按照报销凭证文件解析内容填写,不能自己发挥
<!-- 输出约定-->
输出
- 读取结算表模板的表头行,自动匹配列位置
- 在结算表末尾追加行(不修改模板已有数据和格式)
- 控制台打印处理结果摘要
- 异常记录在备注列标注原因,正常记录备注列为空
<!-- 其他-->依赖安装
# PDF 解析
python3 -m pip install pdfplumber --break-system-packages
# 图片 OCR(PaddleOCR,首次运行自动下载模型 ~80MB)
python3 -m pip install paddlepaddle paddleocr --break-system-packages
# 若 OCR 效果差(纸质发票),可额外装 tesseract(需安装中文语言包)
brew install tesseract
python3 -m pip install pytesseract --break-system-packages
运行方式
python3 ~/.openclaw/workspace/skills/overtime-expense/overtime_expense.py \
"/path/to/input/folder" \
"/path/to/output/settlement.xlsx"
参数1:包含所有输入文件的文件夹路径
参数2:输出结算表文件路径(建议与模板文件同名或新建)
已知局限
- 纸质出租车发票照片 OCR 识别率有限,可能无法提取金额/抬头(建议拍照时保证光线充足、文字清晰)
- 纸质发票建议尽量使用 PDF 电子发票