---
name: audit-refund-statement
description: 430 课后服务「清分对账单 / 应退未退退费表」的核对与制作方法 —— 12 项检查口径、P1–P15 缺陷库、判定标准（必改 / 疑问 / 不检）、不依赖工具的人工核对步骤，以及这套审核工具的复现与发布流程。用于：审核一份对账单能不能交付、判断某处差异算不算错、或按同一套口径重做/维护审核工具。
version: v1.11
license: 内部使用（BossBear 工作室 / 中山小榄 430 教务）
---

# 对账单审核 · 核对与制作方法

> 适用对象：430 课后服务的**清分对账单**与**应退未退退费表**（xlsx）。
> 目标只有三句话：**表上的数能对回系统、表内部横竖对得上、数据内容一条不少。**
> 本文件是方法本体，可脱离任何工具单独执行；文末附「用工具自动跑」与「复现这套工具」。

---

## 1. 什么时候用这份方法

- 对账单做好、要发给学校 / 平台 / 财务之前（交付前自检）
- 收到别人做的对账单，要判断「能不能签字」
- 平台改了口径（清分模式、银行信息表更新、导出模板换版）之后，回归检查
- 需要重做一套同样口径的审核工具（见 §9）

**不适用**：订单本身是否该退（业务判断）、金额该不该这样算（业务口径）—— 本方法只核「表是否忠实地反映系统数据」。

---

## 2. 第一步：先认表（新老两版导出）

| 特征 | 新版 | 旧版 |
|---|---|---|
| 汇总表名 | `清分对账单（汇总表）` + `总计` | `课后服务清分对账单` + `合计` |
| 内嵌 430 订单列表 | 有，且**带对账单金额列** | 有，但**没有**对账单金额列 |
| 三列自洽（现金/钱包/审核中…） | 可核 | **跳过，不算错**，提示改用新导出 |

- 表头**全角/半角括号等价**（`（` = `(`），不要因为括号形态判成「表名不符」。
- 旧版只跑其余项；「跳过三列自洽」不是缺陷，不要写进错误数。

---

## 3. 三项硬指标（对外承诺）

1. **能对回系统**：明细表的订单编号、金额、合计 = 430 系统导出（或至少 = 表内原始数据表）。
2. **表内自洽**：横向 `E−H=G`、`G−手续费=清分`；纵向合计逐项加总与合计行**完全相等**（误差 0）。
3. **内容不缺**：明细行数、总计行、大写、盖章区块、标签年份都必须在且在。

---

## 4. 12 项检查（逐项口径）

| # | 查什么 | 判据（关键点） | 见到这些算错 |
|---|---|---|---|
| 1 | 横竖求和 / 纵向合计 | 横向 `E−H=G`、`G−手续费=清分`；纵向 **逐行合计 → 取 3 位 → 四舍五入 2 位** 与 **合计行取 2 位** 必须相等；行数 ≤20 的短表走更严口径：**逐行各取 2 位相加 == 合计行**。全程 `Decimal`，**无任何模糊容差** | 差 1 分也报（P8）；短表加不平也报 |
| 2 | 面单大小写一致 | **全表每一处**「人民币（大写）：」都与**同列上方最近的小写**对得上（不止面单：课程汇总表、应退未退等所有分表都查） | 大写用字错（P2：`五分`→应 `伍分`）、大写为空（P12） |
| 3 | 小写已净化 | 金额必须**已去公式**（选择性粘贴为值）、**仅 2 位小数** | 长小数尾巴（`999044.84700008`，P3）、仍是公式（P4） |
| 4 | 数据内容不缺 | 明细表 / 原数据块行数与订单集合要完整；总计行、大写、盖章区块要在表里 | 行数少、区块被删（P11） |
| 5 | 原数据三列自洽 | 支付 = 现金 + 钱包 − 换班调出；退费 = 审核中 + 已退；退费后 = 原始「退款后金额」；并探测**重复订单编号** | 三列不等、同块两段数据（P9） |
| 6 | 与 430 导出逐单比对 | 条数、逐单金额、合计一致；订单编号必须在系统里真实存在 | 陈旧编号（P7）、金额不符 |
| 7 | 标签与模板残留 | 学期/期次/年份标签要对（`20XX 秋季学期…`、`第 N 次`）；下半页不得有旧模板落款/旧金额块 | 年份错（P6）、旧块残留（P5） |
| 8 | 明细表编号 ⇄ 原始数据表 | 把**明细表**的订单编号逐个拿**原始数据表**里找（全集 + 抽检）；并按「学生 + 商品」反查**应改成的真实编号** | 明细编号在原始数据里查无此号（P13） |
| 9 | 面单收款账户 ⇄ 银行信息表 | 面单三件套（收款单位 / 银行账号 / 开户行）逐个比**最新银行信息表**；开户行比较先剥公司后缀；退费专用账户属例外 | 抄了别校账号、开户行被手改（P14） |
| 10 | 改动不得破坏表格 | 只有显式要求才写修正版；写后校验透视表/图表/打印区/其它工作表原样保留，只允许目标单元格被改 | 默认就该「只判断、一个字节都不动」 |
| 11 | 新老两版导出都接 | 见 §2；旧版缺列时跳过对应项，**不算错** | 把「跳过」误报成错误 |
| 12 | 学校名称五处一致 | 标题首行 / 面单`收款单位：`与`学校名称：` / 数据区**「学校名称」列**（2~几千格）/ 落款盖章栏 / 文件名，逐处比。基准 = 「学校名称」列**众数**（几千格比面单单点可靠）；**只报不改**（选错基准会把错名字刷满全表） | 写错、少字、串了别校（P15）；空单元格也提示。全表一致但名字本身是错别字的，由第 9 项拿银行信息表点名兜住 |

> 🔴 **错误数不能灌水**：一个检查项只发**一条**错误（把前几条摘要写进去），逐行明细放正文、不计入错误数。
> 首发版本就犯过这个错：坦背实际 4 项错误，显示成「错误 8 项」。

---

## 5. 缺陷库 P1–P15（判定分三档）

| 编号 | 模式 | 症状 | 处置 | 判定 |
|---|---|---|---|---|
| P1 | 打印区域残留 | 打印件缺总计/大写/落款 | 按实际末行重设打印区 | 🚫 **不检** |
| P2 | 大写用字错 | 「五分」应为「伍分」 | 按平台口径逐字重算（全表所有大写区块） | ✗ 必改 |
| P3 | 小写带长小数 | `999044.84700008` | 选择性粘贴为值 → 设 2 位 | ✗ 必改 |
| P4 | 面单金额仍是公式 | `=F6*0.3%` / 引用透视表 | 同上 | ✗ 必改 |
| P5 | 模板残留区块 | 下半页出现旧学期落款 | 删块（是否打印不影响判定） | ✗ 必改 |
| P6 | 标签年份错 | `2025 春季学期…` 出现在 2026 秋表 | 改标签 | ✗ 必改 |
| P7 | 订单编号陈旧 | `F12325…` 在系统 0 命中 | 改为真实编号 | ✗ 必改 |
| P8 | 逐行 3 位 + 总计 2 位 | 两种口径对不上；短表逐行 2 位之和 ≠ 合计行 | 统一精度 | ✗ 必改 |
| P9 | 原数据残留旧快照 | 同块两段数据 / 重复编号 | 删旧段（靠"空白筛选"避开属侥幸） | ✗ 必改 |
| P10 | 落款日期空 | `2026 年　月　日` | 按本次所属月填 | 🚫 **不检** |
| P11 | 数据内容缺失 | 明细条数 < 订单数；总计行/大写被删 | 补齐并重算 | ✗ 必改 |
| P12 | 大写漏填/为空 | 「人民币（大写）：」在，右边空 | 补写；若是 `TEXT(…,"[DBNum2]")` 公式先重算/粘值 | ✗ 必改 |
| P13 | 明细编号 ≠ 原始数据表 | 学生课程都对、编号在原始表查无此号 | 逐条换成真号（按学生+商品反查） | ✗ 必改 |
| P14 | 收款账户/开户行 ≠ 银行信息表 | 抄别校账号、开户行被手改；或「表已更新、本表是旧值」 | 按表改回；提示已更新的先重出对账单 | ✗ 必改 / ⚠ 疑问（见下） |
| P15 | 学校名称写错 / 前后不一致 | 标题、面单、明细表「学校名称」列、落款里的校名对不上（典型：拿上一所学校的表「另存为」再改数，面单改了、明细表几千行忘了改）；或全表一致但名字本身是错别字 | 按工具点名的单元格逐个改回正确校名；错别字那类工具会给出**最接近的正确校名**。**只报不改**，改完重出对账单复核 | ✗ 必改 |

### 5.1 P14 判定三段式（最容易误报的一条）

| 表上印的值 | 判定 |
|---|---|
| = 最新银行信息表 | ✅ 通过 |
| = 工作簿内嵌旧值（且 ≠ 最新） | ⚠ **疑问，不是错误**：提示「银行信息表已更新，本表 N 处仍是旧值 → 让平台按最新表重出」 |
| 两个都不等 | ✗ 错误，并**点名**「该账号在银行信息表里属于『某学校』」 |
| 收款单位不在表里 | ✗ 错误「疑抄了别校模板」+ 反查该账号属于谁 |

- 只核**面单三件套**（行首 `收款单位:` / `银行账号:` / `开户行:`）。表右半边另一套 `学校名称/学校银行账号/学校开户行` 标签不同，**故意不匹配**。
- 开户行比较**先剥** `股份有限公司 / 有限责任公司 / 有限公司`（参考表做过归一化，严格比会对**正确**的表假报错）。
- **退费专用账户是硬编码例外**：应退未退面单的收款方是中启退费户（与中启常规账户不同）⇒ 命中户名直接放行。
- 账号比较键：去所有半/全角空白、**保留 `-`**（建行虚账号）、转大写。

---

### 5.2 P15 为什么「只报不改」

校名不是算术，没有唯一正确答案可推。工具能做的是**找出一致的那个**（「学校名称」列几千格的众数）
再钉住其余各处；一旦某处不同，**必须人来判断谁对**：

- 若明细表几千格都是 A、只有面单/标题是 B ⇒ 大概率「B 是上一份表没改干净」→ 改回 A；
- 若只有零星几格是 B ⇒ 大概率「从别校那行复制过来」→ 改回 A；
- 若**全表都是 A 但 A 本身是错别字**（少一笔、少「镇」字）⇒ 内部完全一致，工具内部比对抓不出来，
  由第 9 项拿**银行信息表**点名（`学校名「…」不在银行信息表里；最接近：…`）—— 这条就是专门兜它的。

⚠ 所以**不要让工具自动改校名**：基准选错时会把错名字刷满全表，比不改更糟。

---

## 6. 判定口径细则（踩过的坑）

### 6.1 大写金额
- 权威实现：平台退款申请导出里的 `_capital_of(amount)`；审核工具里的实现是它的**逐字移植**（已用 0.00–9999.99 逐分 100 万值 + 5000 个随机大额差分测试，0 处不一致）。
- 🔴 **分位换算一律 `Decimal` + `ROUND_HALF_UP`**：`int(round(576284.935,2)*100)` 会得到 `57628493`（少 1 分）。真实事故：广源学校 C14 被误报「应为…玖角叁分」，若点自动纠错会**把对的改错**。
- 两处「非平台写法」要接受（旧模板 Excel 公式口径）：
  | 情形 | 平台写法 | 旧公式写法 |
  |---|---|---|
  | 角=0 且 分>0（100.05） | `壹佰元零伍分` | `壹佰元伍分` |
  | 分=0 且 角>0（1.50） | `壹元伍角` | `壹元伍角整` |
- 🔴 **判「是不是大写金额」不能用「连续两个大写数字」**：`壹仟玖佰伍拾元壹角叁分` 里每个数字都被 `仟/佰/拾/角/分` 隔开 ⇒ 整条漏掉。正确判据：含 `元/角/分/整` 结尾词 + 至少一个大写数字 + 大写字符占比 ≥70% + 长度 ≤30。

### 6.2 纵向合计
- 长表：`Σ(逐行取 3 位) → 四舍五入 2 位` == `合计行取 2 位`。
- 短表（行数 ≤20）：`Σ(逐行取 2 位)` == `合计行取 2 位`（**更严**，因为是给人拿计算器核的）。两种口径按行数分流，不同时跑。
- 覆盖范围：面单汇总表 / 课程汇总表 / **订单明细表（几千行也要核）** / 应退未退三张表。

### 6.3 订单编号（E2 段）
- 只在工作簿内比两张表，**不需要 430 csv**：`明细表编号集合 − 原始数据表编号集合` ⇒ P13。
- 表种语义不同：**清分**的明细表是全量 ⇒ 双向比；**应退未退**的明细表是原数据的**真子集** ⇒ 反向差集必然大，**绝不报错**。
- 反查：`(学生姓名, 商品/课程名称) → 真号`，直接给出「应改为 F…」。

### 6.4 账户（E3 段）
- 出现位置：清分 `清分对账单（汇总表）` 与 `课程汇总表` 的 A2/A3/A4；应退未退 `应退未退对账单` A2/A3/A4。

---

## 7. 人工核对步骤（没有工具时照这个做）

1. **认表**（§2），记下表种与版本。
2. **抽 3 行对 430**：明细表取首/中/尾三行，拿订单编号去 430 订单导出里搜，核对金额与"退款后金额"。
3. **横竖自查**：任选 2 行手算 `E−H=G`、`G×0.3%=手续费`；把明细金额列求和（Excel `=ROUND(SUM(...),2)`）与合计行比。
4. **大写自查**：取最大的两个金额，按 §6.1 规则手算大写，与表上比（注意"零"与"整"）。
5. **编号回溯**：明细表任取 5 个编号，在**原始数据表**里搜索，缺一个就是 P13。
6. **账户自查**：面单三件套与**随包/最新银行信息表**逐字比（先剥公司后缀），退费表看是否命中退费专用账户。
7. **残留自查**：Ctrl+End 看最后一行之后有没有旧区块；搜「2025」看有没有旧年份（P5/P6）。
8. **打印区**（P1）与**落款日期**（P10）**不检**，不影响判定，最多写成建议。

---

## 8. 用工具自动跑（最快路径）

- 公开说明页：`https://430main.soulics.com/audit-check/`
- 单文件 exe（Windows 64，免装 Python）：页面「只想要一个 exe？」链接
- 完整包（exe + 最新 `银行信息表.xlsx` + 图标 + 建快捷方式脚本 + 说明 + 源码）：页面主按钮，**需登录**
- 用法：拖入 `对账单.xlsx`（可选再拖 430 `导出.csv`）→「开始核对」→ 弹窗给结论；**默认只判断，不改原文件**，产物是几 KB 的报告；要改好的表才勾「生成修正版」。
- 报告两个：`<原名>_审核报告.txt` / `.json`，内含通过 / 错误 / 疑问条数与逐条明细。

---

## 9. 复现 / 维护这套工具

### 9.1 源码结构（Python 3.12 + tkinter + openpyxl）

```
audit_workflow/
  __init__.py
  cli.py       # 命令行入口：--cli --bank-info --fix / --check-only
  engine.py    # 全部检查逻辑（A 表内自洽 / B 精度 / F 430 比对 / E2 编号 / E3 账户）
  fixer.py     # 修正版：只改目标单元格，其余部件字节不动
  exe_main.py  # tkinter GUI：拖拽导入、后台线程、结论弹窗
  xmlstr.py    # xlsx 部件级读写（保真校验）
```

### 9.2 打包（PyInstaller，单文件）

- 解释器**必须带 tkinter**（托管版 Python 常常没有）。
- `pyinstaller --clean --noconfirm SSAuditTool.spec`
- spec：`datas=[('assets/xxx.ico','assets')]`、`icon=[...]`、`console=False`、`upx=False`、`excludes=[numpy,pandas,matplotlib,pytest,PIL,PyQt5,scipy]`。
- 🔴 改过 GUI 一定要 `--cli` 跑一遍并 `2>err.txt`，**stderr 必须是 0 字节**：GUI 里漏 import 会被兜底 except 静默吞掉、界面永远不出来。

### 9.3 发布包（make_kit.py）

zip 内含：exe + **最新银行信息表.xlsx** + 使用说明.txt + 建/删桌面快捷方式.cmd + 图标 + 源码。
打包时写一份 `bank_info.stamp`（银行表 md5 / 单位数 / exe md5 / kit md5），页面用它判断「表是否已更新」。

### 9.4 网页（Django）

- 视图只有三个：说明页 / 单独 exe / 完整包；**不要再往服务器加审核逻辑**（在线核对已于 2026-10-11 移除，文件不上传）。
- 下载响应头三件套：`Content-Disposition: attachment; filename*=UTF-8''…`（中文名的唯一正确写法）、`Content-Length`、`Cache-Control: no-store`。
  ⚠ 少了 no-store，浏览器按"文件名恒定"启发式缓存 ⇒ **换版后用户仍下到旧 exe**。
- 换 exe 必须同时重出 zip、同步多份字节，并改页面写死的 md5。

---

## 10. 红线清单

1. **默认不改用户的文件**；要改必须用户显式勾选，且只改目标单元格。
2. **不引入模糊容差**：差 1 分就是差 1 分；Decimal 全程，不用 float。
3. **不把「疑问」写成「错误」**：银行表更新、旧版导出缺列都只算疑问/跳过。
4. **错误数不灌水**：一项一条错误，逐行明细进正文。
5. **账户信息属于敏感数据**：审核表里有学校收款账号，不得外传、不进公开日志、不写进任何文档样本。
6. **大写金额别自动纠错前先核对**：判错方向错一次，就会把正确的表改坏。

---

## 11. 结论模板（交付前贴在消息里）

```
【对账单审核 · <学校> · <学期> <期次>】
表种：清分对账单（新版）｜行数：N｜合计：¥X
通过 P｜错误 E｜疑问 Q
✗ 必改：P8 第 12 行合计差 0.01（逐行3位=...，合计行=...）
⚠ 疑问：P14 面单开户行仍是旧值（银行信息表已于 X 更新，建议重出）
🚫 不检：P1 打印区 / P10 落款日期
结论：<可交付 / 改完再交>
```

---

## 12. 参考基线（回归用）

| 样本 | 结果（通过/?/错误/疑问） | 说明 |
|---|---|---|
| 东阳 清分 A_orig | 18 / 5 / 2 / 4 | v1.9 基线 |
| 东阳 清分 B_fixed | 19 / 5 / 1 / 4 | 改后 |
| 东阳 清分 C_crs_only | 16 / 5 / 4 / 4 | 只有课程汇总 |
| 东阳 清分 D_blank | 17 / 5 / 3 / 4 | 大写为空样例 |
| 坦背 应退未退 42MB | 14 / 5 / 4 / 1 | 走退费专用账户例外 |

---

_版本 v1.11 ｜ 维护：BossBear 工作室 ｜ 页面：https://430main.soulics.com/audit-check/_
_本文件可自由转载给同事与其他 AI 助手使用；其中的银行账户规则只描述判定方法，不含任何真实账号。_
