▶ 在线 Demo(GitHub Pages,免安装、点击即开):https://axiryyyy.github.io/L2C-Auto-Console/demo/console.html
把财务规则前置到审批前端(事前预算卡控),把商机与回款数据打通(实时 ROI), 让「业务审批 → 财务核算 → 数据归档 → 审计溯源」全程自动化——月结从 3 天压缩到 4 小时。
📌 公开范围:本仓库公开 ① 演示层(零依赖单文件控制台:功能地图 + 真实执行回放 + 审计追溯 + KPI) 与 ② 4 个代码样本(完整可运行、带集成测试,见「四、代码样本」)。 其余业务脚本实现未公开;所有回放均来自真实执行采集的产物快照,基于生成的脱敏假数据。
| 步骤 | 说明 |
|---|---|
| 1 | 打开 在线 Demo(GitHub Pages,点击即开);也可双击本地 docs/demo/console.html:零依赖、无外链、断网可用 |
| 2 | 「总览」看五个阶段的模块全景,点卡片查看功能档案与运行回放 |
| 3 | 「功能地图」看 59 个脚本的数据流关联与 14 组版本谱系 |
| 4 | 「审计追溯」看一笔凭证从整本 PDF 到审计提取的完整证据链 |
| 5 | 「KPI」看效能指标(页面已标注口径与推算过程) |
| 6 | 想看代码?直接跳「四、代码样本」:4 个脚本 + 测试可直接运行 |
这张图回答的问题:堆了 59 个脚本的自动化体系,内部到底是怎么协作的?
- 脚本之间没有代码级 import,关联全部通过中间产物建立(Excel 命名约定、文件名前缀、凭证号格式)
- 因此地图不是调用树,而是「脚本 ↔ 中间产物 ↔ 业务阶段」的数据流二部图
- 覆盖五个阶段:日常(实时)/ 月底(批量)/ 归档(核算)/ 辅助(支撑)/ 实验(探索)
- 14 组版本谱系展示每个工具从早期版本到当前版的演进,含半成品/被替代/废弃的真实状态,不做美化
以凭证「记-001」为例:
整本记账凭证 PDF(3 页)→ 按 年月+凭证号 拆分(2 页 + 1 页)→ 清单匹配 → 提取结果报告(成功提取 ×2)
每一步都留下可追溯的中间产物。审计场景下,任意一笔支出可在 5 分钟内完整还原 「谁审批 → 有没有预算 → 凭证编号是多少 → PDF 在哪里」。
公开层不止是「观看器」——以下 4 个脚本完整公开、可直接运行、带集成测试,覆盖算法、流水线、解析与防御式设计:
| 脚本 | 展示的能力 |
|---|---|
compare_vouchers_advanced.py |
内容签名(frozenset 集合)+ Jaccard 相似度,四分类差异与「附单据数」审计高亮 |
namelistget_feishu_v9.py |
多阶段流水线:扫描 → 归集 → 关联 → 合并 → 对账;缺件降级与错误报告 |
split_vouchers_凭证PDF拆分.py |
全角/半角正则解析 + 按(年月, 凭证号)分组、带页数命名输出 |
bankStatementSplitterBasedOnJournal.py |
防御式设计:唯一文件约束 + 行/页数一致性校验,拒绝文件错配 |
每个脚本头部写明用途 / 输入 / 输出 / 用法 / 依赖,并标注对应的回放文件——代码与回放可互相印证。 带弹窗的脚本支持命令行参数:不带参数仍然弹窗,向后兼容。
这些脚本的原始用法是把脚本复制到数据文件夹里再运行——脚本把**「自己所在目录」**当作数据目录:
<数据文件夹>/
├── 脚本.py ← 脚本放在这里
├── namelist.xlsx ← 脚本要读的数据也放在这里
└── ...
- 例外:
compare_vouchers_advanced.py/split_vouchers_凭证PDF拆分.py的数据路径由命令行参数或弹窗指定,输出落在输入文件同级。- 本仓库的
accounting/、integration/只是存放脚本的「货架」;要运行请把脚本复制到你的数据文件夹里(下面 §4.2 的一键运行器会自动替你摆放)。
python sample_data/generate_sample_data.py # 生成样例假数据(只需一次)
python docs/demo/run_sample.py --list # 查看可运行样例
python docs/demo/run_sample.py voucher_compare # 运行(自动按正确布局摆放脚本与数据)run_sample.py 做的就是把「复制脚本到数据文件夹」这一步自动化:脚本与样例数据都放在工作区同一层;运行完打印日志与产物清单。工作区默认保留在 docs/demo/.sample_run/(加 --clean 则运行后删除)。
先运行一次数据生成器(只需一次),样例数据会生成在 sample_data/ 下:
python sample_data/generate_sample_data.pypython accounting/compare_vouchers_advanced.py sample_data/归档/凭证清单_修改前.xlsx sample_data/归档/凭证清单_修改后.xlsx输出:与「修改后」文件同级的比对报告 .xlsx。
python accounting/split_vouchers_凭证PDF拆分.py sample_data/归档/记账凭证-202601.pdf输出:sample_data/归档/分割完成/ 下按凭证号命名的 .pdf。
-
把脚本复制到数据文件夹
sample_data\月底\(与namelist.xlsx同一层;用「移动」也行):Copy-Item integration\namelistget_feishu_v9.py sample_data\月底\ -
运行:
python sample_data\月底\namelistget_feishu_v9.py
-
按提示操作(
namelist.xlsx就在脚本旁边):- 弹窗 1【差旅申请单】搜索文件夹 → 选
sample_data\月底\申请单 - 弹窗 2 关键词源文件夹(模式 2)→ 选
sample_data\月底 - 之后按回车继续、按回车退出
- 弹窗 1【差旅申请单】搜索文件夹 → 选
-
结果在
sample_data\月底\搜索结果\:报销单-张三-住宿费\、张三-住宿费.pdf、关键词与PDF文件对应表.xlsx
想免弹窗:两个目录都能用参数传 ——
python sample_data\月底\namelistget_feishu_v9.py sample_data\月底\申请单 sample_data\月底(用完记得把sample_data\月底\namelistget_feishu_v9.py删掉,它只是为了让脚本能和数据同层。)
⚠️ 脚本要求脚本同目录下恰好 1 个.xlsx。而sample_data\归档\里有 4 个 PDF,所以要先建一个干净目录sample_data\流水演示\。
-
准备数据文件夹,并把脚本复制进去(与 pdf、日记账同一层;用「移动」也行):
New-Item -ItemType Directory -Force sample_data\流水演示 | Out-Null Copy-Item sample_data\归档\银行流水-202601.pdf sample_data\流水演示\ Copy-Item sample_data\归档\日记账202601.xlsx sample_data\流水演示\ Copy-Item accounting\bankStatementSplitterBasedOnJournal.py sample_data\流水演示\
-
运行:
python sample_data\流水演示\bankStatementSplitterBasedOnJournal.py
-
结果:
sample_data\流水演示\分割完成\记-001.pdf、记-002.pdf、记-003.pdf
摆错时(例如数据目录里出现了第二个 PDF),脚本会打印「未找到唯一的 PDF 文件」并停止 —— 这正是它防错配的设计。
运行测试(4 个脚本的无头集成断言 + 敏感扫描器规则 + 清单一致性):
pip install -r requirements-dev.txt
python -m pytest docs/demo/tests -q| 标记 | 含义 |
|---|---|
| 实测回放(16 条) | 在隔离工作区用 sample_data/ 假数据真实执行脚本,采集日志与产物快照 |
| 示意回放(4 条) | 依赖剪贴板 / 浏览器等无法无头执行的环境,按代码逻辑生成,已在页面明确标注 |
| 数据 | 全部为生成假数据(见 sample_data/),零真实业务信息 |
设计原则:宁可如实标注「示意」,也不把演示包装成「全都能跑」。
为了让评审者清楚「哪些是谁做的」,把边界写在这里:
| 范围 | 归属 |
|---|---|
| 业务背景、流程设计、字段与口径约定、数据来源 | 本人(受雇期间的真实业务系统;对外展示数据全部脱敏或重新生成) |
| 全部业务脚本(含本页公开的 4 个代码样本) | 本人于任职期间编写;公开前仅补充 docstring、命令行入口与依赖修正,核心逻辑未改动 |
| 演示层(控制台页面、回放采集管线、功能地图、敏感扫描器、CI 配置、本 README) | 由 AI 辅助构建与重构;需求、取舍、验收与脱敏审查由本人负责 |
回放数据(docs/demo/replay/*.json) |
真实执行采集的产物快照;本机绝对路径已在采集时替换为 <工作区> |
没有做的事:没有为了让演示好看而伪造运行结果——无法无头执行的脚本一律如实标注「示意回放」(共 4 条)。
这套工具诞生于「业务优先、快速交付」的现实约束,工程上并不完美。主动列出主要债务与演进计划:
| 工程债 | 现状 | 演进方向 |
|---|---|---|
| 脚本间「暗契约」 | 靠文件名前缀 / Excel 列位约定串联,换人接手容易断 | 抽出中间产物 manifest(字段与命名注册表),入口处加 schema 校验 |
| 缺少自动化测试 | 关键路径原先无测试(本仓库已为公开样本补上集成测试作为第一步) | 以样例数据为夹具补齐各脚本契约测试,纳入 CI |
| 交互式入口 | 历史脚本依赖弹窗,不适合批处理与 CI | 新增命令行入口(公开的 4 个样本已完成),逐步统一为 --input/--output |
| 隐式目录约定 | 脚本把「自己所在目录」当数据目录(早期沿用至今的约定):好处是「复制脚本到数据文件夹即可运行」,代价是脚本必须与数据同层 | 改为显式 --input/--output 参数,去掉隐式目录假设;当前已在文档 §4 给出正确摆法,并提供 run_sample.py 一键隔离运行器 |
| 数据接入方式 | 剪贴板抓取 + 本地文件解析,依赖页面结构稳定 | 已规划飞书/钉钉开放 API 直连,彻底解耦 |
| 版本并存 | 存在 v1/v2 历史版本(见功能地图的版本谱系) | 收敛为单一实现 + 兼容层,清理已被替代版本 |
这些不是包装话术:功能地图把每个脚本的真实状态(半成品 / 已被替代 / 废弃)都标注出来了。
业务数据产生在飞书审批,财务核算依赖畅捷通,两套系统之间没有自动化的数据通道。 财务人员每天手动下载审批单、逐条录入凭证、人工核对发票——月结期每家公司至少 3 天,且平均每期出现 3-5 笔因预算超支导致的返工。
| 痛点 | 传统方式 | 平台方案 |
|---|---|---|
| 资金流失 | 预算缺乏前置卡控,超支事后才发现 | 预算事前卡控:审批发起时自动查询项目剩余预算,不足则拒绝或转财务特批 |
| 商机漏单 | 签了多少、回了多少,月底才知道 | O2C 链路打通:商机 → 合同 → 回款三端比对,逾期自动预警 |
| 成本黑箱 | 只有月底利润表,无法拆到单项目/客户 | 变动成本穿透到项目/客户/合同维度,实时 ROI 可查 |
| 审计风险 | 凭证 PDF 散落、编号混乱,追溯困难 | 凭证拆分归档 + 新旧编号对照,任意凭证 5 分钟完整溯源 |
| 指标 | 优化前 | 优化后 | 变化 | 依据 |
|---|---|---|---|---|
| 单张凭证处理 | 约 8 分钟 | 约 30 秒 | -94% | 推算 ① |
| 发票核对与分类 | 约 3 小时/批次 | 约 10 分钟/批次 | -94% | 推算 ② |
| 月结周期 | 3 个工作日 | 4 小时 | -94% | 汇总项 |
| 审计凭证提取 | 约 2 天 | 约 5 分钟 | -99% | 口径说明 |
| PDF 拆分重命名 | 约 1 天 | 约 2 分钟 | -99% | 口径说明 |
推算过程
- ① 单张凭证 8 分钟 → 30 秒:人工链路 = 打开审批单 → 抄摘要 → 查科目/成本中心 → 录入借贷分录 → 核对金额 → 提交,约 6~8 个动作合计约 8 分钟;自动化后人工只剩「核对自动生成的草稿」,约 30 秒。
- ② 发票核对 3 小时/批次 → 10 分钟:以 120 张/批次估算,人工逐张打开、抄号码、与台账比对约 90 秒/张;自动化后批量提交 + 程序匹配,人工只处理未匹配项(样例中 5 张有 1 张未匹配)。
「汇总项」指月结周期由上述单项改善叠加而来;「口径说明」未做逐项拆解,仅记录计时方式(程序化提取 vs 人工翻找 / 批量脚本 vs 手工另存)。
⚠️ 以上均为业务口径的估算与推算,未经独立复核,不构成实测基准;控制台 KPI 页同步标注与展示推算过程。
L2C-Auto-Console/
├── .github/workflows/quality.yml # 质量门:敏感扫描 / 清单一致性 / 构建可复现 / 测试
├── accounting/ # 代码样本
│ ├── compare_vouchers_advanced.py
│ ├── split_vouchers_凭证PDF拆分.py
│ └── bankStatementSplitterBasedOnJournal.py
├── integration/
│ └── namelistget_feishu_v9.py # 代码样本:月底资料包整合
├── docs/
│ ├── FUNCTION_MAP.md # 功能地图文档(59 脚本档案 + 14 组版本谱系)
│ ├── function_map.json # 机器可读档案(控制台的数据源)
│ ├── SENSITIVE_SCAN_REPORT.md # 公开前敏感信息审查报告
│ └── demo/
│ ├── console.html # ★ 单文件控制台(主要交付物)
│ ├── console.template.html # 控制台模板(含构建注入点)
│ ├── build_console.py # 构建:数据注入 → console.html + FUNCTION_MAP.md
│ ├── run_replay.py # 回放采集:隔离工作区真实执行脚本
│ ├── run_sample.py # 一键运行样例(自动摆好布局,隔离工作区)
│ ├── sensitive_check.py # 公开文件敏感扫描器(可复跑)
│ ├── public_files.txt # 公开文件清单(唯一事实源)
│ ├── _harness/ # GUI 拦截执行器(tkinter / input / startfile)
│ ├── tests/ # 公开层测试(扫描器规则 + 清单一致性 + 脚本集成)
│ ├── replay/ # 回放采集结果(20 条,已脱敏)
│ └── assets/ # README 截图
├── requirements-dev.txt # 公开层开发/测试依赖(CI 使用)
└── sample_data/ # 生成假数据(生成器 + 数据契约说明)
python sample_data/generate_sample_data.py # 1. 生成假数据
python docs/demo/run_replay.py # 2. 真实执行脚本并采集(约 2 分钟)
python docs/demo/build_console.py # 3. 重建 console.html 与 FUNCTION_MAP.md
- 第 2 步需要全部业务脚本(仅 4 个样本公开)与
requirements.txt依赖(Python 3.10+)- 仅重建页面可直接执行第 3 步:回放数据已随仓库提供,
build_console.py只用标准库- 只想验证公开的 4 个脚本:见「四、代码样本」,用
requirements-dev.txt即可
- 发布前对全部公开文件执行「自动扫描 + 人工复核 + 真实信息反向交叉排查」,结论见
SENSITIVE_SCAN_REPORT.md - 可随时复跑审查:
python docs/demo/sensitive_check.py - CI 已把该扫描设为硬门(任何硬违规直接失败),见
.github/workflows/quality.yml
| 层级 | 技术选型 | 说明 |
|---|---|---|
| 语言 | Python 3.10+ | 核心数据处理与自动化 |
| 表格处理 | openpyxl, pandas, xlsxwriter | Excel 读写、报表生成、多月合并 |
| PDF 处理 | PyMuPDF (fitz), pdfplumber, pypdf | 文本提取、页面拆分、命名重排 |
| 电子发票 | PyMuPDF(OFD→PDF),pdfplumber(核验) | 格式转换与发票信息核对 |
| 集成 | 剪贴板抓取 + 本地文件处理 | 审批数据接入(规划 API 直连解耦) |
| 自动化 | Selenium(实验性,未接入生产链路) | 网页端自动化探索 |
| 演示 | 原生 HTML/CSS/JS 单文件(零依赖) | 控制台页面与回放展示 |
| 质量 | pytest + GitHub Actions(windows-latest) | 敏感扫描 / 清单一致性 / 构建可复现 / 集成测试 |
- 演示页面零依赖:单文件、无外链、断网可用(仅需浏览器)
- 回放与样例数据均为纯本地文件处理,不依赖任何外部 API 或内网服务
- 所有展示数据为生成假数据;4 个代码样本完整公开可运行,其余业务脚本实现未公开
- 公开文件清单、敏感审查记录与质量门配置随仓库提供,审查与构建过程均可复现


