84 lines
2.4 KiB
Python
84 lines
2.4 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
财务报销全流程编排脚本
|
|
|
|
依次执行:
|
|
1. extract_invoice.py — 从 PDF 发票提取信息,生成 invoice_summary.csv
|
|
2. extract_image_ocr.py — 从支付截图 OCR 识别刷卡信息,更新 CSV
|
|
3. reimburse.py — 打开浏览器登录财务系统并自动填报
|
|
|
|
用法:
|
|
python run_all.py # 默认执行全部三步
|
|
python run_all.py --step invoice # 仅执行第 1 步
|
|
python run_all.py --step ocr # 仅执行第 2 步
|
|
python run_all.py --step submit # 仅执行第 3 步
|
|
"""
|
|
|
|
import subprocess
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
PROJECT_DIR = Path(__file__).parent.resolve()
|
|
PYTHON = sys.executable
|
|
|
|
|
|
def step(name: str, module: str, args: list[str]) -> bool:
|
|
"""运行单个步骤,返回是否成功"""
|
|
cmd = [PYTHON, str(PROJECT_DIR / module), *args]
|
|
print(f"\n{'=' * 60}")
|
|
print(f" [{name}] {module}")
|
|
print(f"{'=' * 60}")
|
|
|
|
result = subprocess.run(cmd, cwd=str(PROJECT_DIR))
|
|
ok = result.returncode == 0
|
|
|
|
if ok:
|
|
print(f"\n[{name}] 完成")
|
|
else:
|
|
print(f"\n[错误] {name} 失败 (exit code: {result.returncode})")
|
|
|
|
return ok
|
|
|
|
|
|
def run_all() -> int:
|
|
print("=" * 60)
|
|
print(" 财务报销自动化流程")
|
|
print(f" 工作目录: {PROJECT_DIR}")
|
|
print(f" Python: {PYTHON}")
|
|
print("=" * 60)
|
|
|
|
if not step("发票提取", "extract_invoice.py", []):
|
|
return 1
|
|
|
|
if not step("OCR 识别", "extract_image_ocr.py", []):
|
|
return 1
|
|
|
|
if not step("报销提交", "reimburse.py", ["--data", str(PROJECT_DIR / "invoice_summary.csv")]):
|
|
return 1
|
|
|
|
print("\n" + "=" * 60)
|
|
print(" 全流程执行完毕")
|
|
print("=" * 60)
|
|
return 0
|
|
|
|
|
|
def main() -> int:
|
|
if len(sys.argv) >= 3 and sys.argv[1] == "--step":
|
|
name = sys.argv[2]
|
|
steps = {
|
|
"invoice": ("发票提取", "extract_invoice.py", []),
|
|
"ocr": ("OCR 识别", "extract_image_ocr.py", []),
|
|
"submit": ("报销提交", "reimburse.py", ["--data", str(PROJECT_DIR / "invoice_summary.csv")]),
|
|
}
|
|
if name not in steps:
|
|
print(f"未知步骤: {name},可选: {', '.join(steps)}")
|
|
return 1
|
|
label, module, args = steps[name]
|
|
return 0 if step(label, module, args) else 1
|
|
|
|
return run_all()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(main()) |