软件服务商账单与用量核对(免费版)
完全本地运行:引擎已经打包在本技能里(
engine/目录)。 核对过程不需要联网、不需要 API Key、没有次数上限。
什么时候用
谁会在什么时候用:采购、财务、IT 资产管理员,在每月服务商出账、季度用量复盘、续费谈判 这几个固定节点上,都得把这张「软件服务商账单与用量明细表」核一遍才能往下走。 席位费多算、用量口径对不上、账单金额算错,正是每次都要和服务商来回拉扯的几件事。
这张表会逐项核对什么:
- 账单金额 = 计费数量 × 单价 × 账期月数 − 折扣,逐行复算
- 计费数量与用量 / 席位数对照(按用量计费的对用量,按席位计费的对席位数)
- 账单单价高于合同单价时,按差额算出本期多收了多少
- 同一服务商同一服务编号同一账单月份重复计费
- 合计行各列 = 各明细行逐列相加
- 关键字段缺失或为占位符(留空表示「不知道」,与填 0 是两回事)
每条结论都带原文行号与服务编号,可被第三方用同一口径复算; 材料不齐时不给结论,会明确列出还缺什么。
这个免费版查什么
免费版执行 6 项:
- 账单金额逐行复算(账单金额 = 计费数量 × 单价 × 账期月数 − 折扣)
- 计费数量与用量 / 席位数核对(按用量计费的对用量,按席位计费的对席位数)
- 超出合同单价检测(账单单价 > 合同单价 ⇒ 按差额算出多收金额)
- 同一服务商同一服务编号同一账单月份重复计费检测
- 合计行与明细行勾稽(合计行各列 = 各明细行逐列相加)
- 关键字段缺失或为占位符检测
数字会做归一化:12,000、千分位、1,240、(120)(会计负数)都被认成同一个口径
(0.5% 折成 0.005)。表头是完全相等匹配的,所以「单价」不会把「合同单价」抢走、
「用量」不会把「计费数量」抢走、「账期月数」不会把「合同账期月数」抢走。
怎么用
node scripts/run.mjs --sample # 先看样例
node scripts/run.mjs --input 你的材料.json # 跑自己的材料
node scripts/run.mjs --input 你的材料.json --json
入参就是含表头的一张表({"text": "账单月份\t服务商\t服务项目\t…"}):
从 Excel 或服务商账单复制成文本(Tab 分隔最稳)贴进去即可。
表头缺列会明确告诉你缺了哪一列;缺一列就不给结论,不会拿 0 替你假设「这个月没用量」。
没有用量 / 没有席位请填 0:填 0 表示「确实没有」,留空表示「不知道」,这两者不能混。
退出码
| 码 | 含义 |
|---|---|
| 0 | 已执行检查 |
| 1 | 没给入参 |
| 3 | 材料不齐 —— 此时不给结论(既不说「对」,也不说「错」) |
| 4 | 入参文件读不到或无法解析 |
| 9 | 未预期错误 |
出参
{
"status": "success",
"service_type": "SAAS_VENDOR_INVOICE_CHECK",
"scope": { "checks": ["…6 项…"], "checks_not_run": ["…5 项…"], "rows": 7, "vendors": 3,
"periods": 3, "totals_row": true, "usage_total": 1770000, "seats_total": 295,
"bill_qty_total": 1770295, "discount_total": 1200, "bill_total": 209400,
"tolerance": 0.01, "executed_locally": true, "network_used": false },
"findings": [ { "level": "P0", "category": "账单金额复算不符", "line": 2, "amount": 100,
"message": "…", "advice": "…" } ],
"summary": { "rows": 7, "vendors": 3, "periods": 3, "total": 0, "p0": 0, "p1": 0, "p2": 0,
"verdict": "NO_ISSUE_FOUND" },
"checks_executed": ["…6 项…"],
"checks_withheld": ["…5 项…"],
"checks_out_of_scope": ["…"]
}
findings[].line是原文行号(含表头,从 1 起),amount是这条结论涉及的金额;findings[].level:P0算术错 /P1口径可疑 /P2提示;- 材料不齐时返回的是
{"status": "insufficient_input", "missing": [...], "advice": "…"}, 没有result,因此不会有任何「未发现问题」的结论。
常见错法(本产品专属)
- 拿服务商系统的口径当用量:计费数量用的是对计费系统的量,不是我们这边的 用量报表与席位台账 —— 离职账号没停用、测试 Key 算了钱、失败请求也算钱, 账单上的计费数量凭空多出一截。免费版把它和「用量 / 席位数」摆在一起逐行对照, 按单价折算,先让你看清差额有多大。
- 单价调价前后混用:服务商涨价后按新价计费,而合同期内应沿用旧价。
账单单价高于合同单价时,免费版按
计费数量 × 差额 × 账期月数算出本期多收了多少。 - 改了一格忘了改账单金额:明细里数量或折扣动过、账单金额忘了刷新, 整行就复算不平。逐行复算能一眼看出是哪一行。
- 明细改对了、合计行忘了重算:合计行是财务据以付款与入账的金额, 明细单改过之后合计没跟着刷新,或者明细里漏了整份服务。
- 留空与填 0 混用:没有用量填 0 是「确实没有」,留空是「不知道」。 本工具不会替你猜 —— 关键格留空就直接报缺,绝不按 0 算出一个「本期没问题」。
这个免费版不包含什么
免费版不做下面这些完整档才有的判断(它们会如实列进 checks_withheld,不会用默认值编造):
- 折扣列异常检测(折扣为负 ⇒ 实付超过应收;折扣超过无折扣计费额 ⇒ 折后金额为负)
- 账期边界检测(账期月数不是 1~12 的整数;同一服务编号的账期重叠 ⇒ 同一时段被计了两次)
- 同一服务商同一账单月份同一服务项目出现多个服务编号(疑似重复订购)
- 差异归因(把无折扣计费额差异拆成 数量差异 / 单价差异 / 账期差异 三类)
- 跨服务商 / 跨账单月份汇总台账与按多收金额排序的处理清单
需要完整档时(可选)
本免费版是完整可用的核心产出,本版本不包含下面这些项:
- 折扣列异常检测(折扣为负 ⇒ 实收大于应收;折扣超过无折扣计费额 ⇒ 折后金额为负)
- 账期边界检测(账期月数不是 1~12 的整数;同一服务编号的账期重叠 ⇒ 同一时段被计了两次)
- 同一服务商同一账单月份同一服务项目出现多个服务编号(疑似重复订购,席位与用量被收两遍)
- 差异归因(把无折扣计费额差异拆成 数量差异 / 单价差异 / 账期差异 三项,给出三项合计与逐行明细)
- 跨服务商 / 跨账单月份汇总台账与按多收金额排序的处理清单(按服务商 × 账单月份汇总账单金额与多收金额,逐条带原文行号)
同名工具的完整档是另一个独立商品(条款与条件以它自己的商品页为准);两档的差别就是上面这些,没有别的。
边界(请务必知道)
本工具不做引擎 CHECKS_OUT_OF_SCOPE 里列的那些判断:单价与折扣是否符合合同约定、
用量统计口径(去重规则 / 失败请求算不算 / 测试 Key 算不算 / 跨月切分点)对不对、
席位台账对不对、这些服务该不该续费、账单是否已开票或已付款
(那些以采购合同、服务商计费系统、我方用量报表与银行流水为准)。
- 只核表内勾稽与两组两列对照:合同单价、合同账期月数、用量、席位数一律以你填的为准;
- 「没报问题」不等于「没有问题」:超出上述 6 项的检查,本版本不执行,且会如实列出未执行项;
- 材料不齐时不给结论,也不会用默认值编一个「本期没问题」出来;
- 每条结论都带原文行号与服务编号,可由第三方用同一份输入复算。
