网点运费与代收货款结算核对(免费版)
完全本地运行:引擎已经打包在本技能里(
engine/目录)。 核对过程不需要联网、不需要 API Key、没有调用次数上限。
什么时候用
谁会在什么时候用:快递 / 快运网络里网点的对账岗、财务,以及总部的结算岗, 在每月网点与总部结算(月结)时把这张网点运费结算单与代收货款明细表核一遍才能划款。 运费少收、代收货款少缴、重复导单,正是网点与总部每月都要吵的几件事。
这张表会逐项核对什么:
- 运费 = 计费重量 × 计费单价
- 代收手续费 = 代收货款 × 代收手续费率;代收货款应缴 = 代收货款 − 代收手续费
- 应结金额 = 运费 + 派费 + 附加费 − 中转费 − 代收货款应缴
- 计费重量不得小于实际重量(否则就是少计费、运费少收)
- 同一网点同一期间不得出现同一运单号两行;关键格不得留空或写占位符
每条结论都带原文行号与网点 / 运单号,可被第三方用同一口径复算; 材料不齐时不给结论,会明确列出还缺什么。
这个免费版查什么
- 运费复算(计费重量 × 计费单价 = 运费)
- 代收货款扣减复算(代收手续费 = 代收货款 × 代收手续费率;代收货款应缴 = 代收货款 − 代收手续费)
- 应结金额复算(运费 + 派费 + 附加费 − 中转费 − 代收货款应缴 = 应结金额)
- 计费重量低于实际重量检测(少计费、运费少收)
- 同一网点同一期间同一运单号重复行检测
- 关键字段缺失或为占位符检测
(检查项由引擎的 CHECKS_GIVEN 导出,跑 --sample 会打印实际执行了哪些;
本版本不包含的 5 项列在 CHECKS_WITHHELD 里,不做也不假装做。)
数字会做归一化:1,240.00、千分位、带货币符号的写法、(1240)(会计负数)、1% 都被认成同一个口径
(1% 折成 0.01;费率列写 0.01 或 1% 都行,写 1 表示 100%,本工具不会替你猜)。
表头里的空格与括号会被忽略,所以「计费重量(kg)」和「计费重量」都认。
怎么用
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 | 未预期错误 |
出参
run.mjs --json(以及引擎 run() 返回值里的 result)的形状:
{
"status": "success",
"service_type": "COURIER_SETTLEMENT_CHECK",
"scope": {
"checks": [...], // 本次实际执行的检查项
"checks_not_run": [...], // 本版本未执行的检查项(= CHECKS_WITHHELD)
"rows": 6, "periods": 2, "sites": 2,
"totals_row": true, "totals_rows": 1,
"charge_weight_total": 71.9, "freight_total": 282.28,
"cod_amount_total": 2800, "cod_remit_total": 2772, "payable_total": -2510.22,
"tolerance": 0.01, "executed_locally": true, "network_used": false
},
"findings": [
{ "level": "P0", "category": "运费复算不符", "line": 2, "amount": 4,
"message": "网点「SH-A 沪东网点」运单 YD2026050001 的运费是 50.00,按 计费重量 12.5 × 计费单价 4 = 50.00,相差 0.00。",
"advice": "…" }
],
"summary": { "rows": 6, "periods": 2, "sites": 2, "total": 0, "p0": 0, "p1": 0, "p2": 0,
"verdict": "NO_ISSUE_FOUND", "omitted": 0 },
"checks_executed": [...], "checks_withheld": [...],
"checks_given": [...], "checks_out_of_scope": [...],
"note": "…", "disclaimer": "…"
}
findings[].line是原文行号(含表头,从 1 起),level是P0(金额算错 / 缺关键格)或P1(口径可疑);amount是这条结论涉及的金额(元),0 表示这条不是金额差;- 材料不齐时返回的是
{"status": "insufficient_input", "missing": [...], "advice": "…"}, 没有result,因此不会有任何"未发现问题"的结论。
常见错法(这张表里真的会有人这么填)
- 计费重量比实际重量还小:计费重量是"实际重量与体积重取大、再按进位规则进位"的结果, 正常只可能 ≥ 实际重量。抄了实重、漏了体积重、续重进位没做,都会让运费整体少收; 本工具按 计费重量 × 单价 折算少收金额,并把这一行点出来。
- 代收货款应缴没扣手续费、或手续费扣了两遍:代收货款是替寄件人收的钱,
只有代收手续费能留下。常见错法是"手续费算对了却没从应缴里减",或者"减了一次又减第二次",
这一行内部就对不上(
代收货款 − 代收手续费 ≠ 代收货款应缴)。 - 费率写成 1 而不是 1%:费率列写
0.01或1%都认;写成1意思是 100%, 手续费会被算成"整笔代收货款",应结金额当场差出好几百。本工具不会替你猜你的意思。 - 同一张运单导了两次:重复粘贴 / 重复导单时,同一网点同一期间会出现两行同一运单号, 运费与代收货款应缴一起算了两遍。本工具报重复行;确属同一票货分两段计费的,请拆成两行并写清说明。
- 该填 0 的格子留空:非代收货款运单的代收货款 / 费率 / 手续费 / 应缴留空, 会让这一行整行复算不出来。留空就是"不知道",本工具宁可报缺格,也不用 0 替你假设。
这个免费版不包含
以下检查项不在本版本范围内,调用时也不会执行(列在引擎的 CHECKS_WITHHELD 里):
- 合计行勾稽(合计行各列 = 各明细行逐列相加,不符时报出差异金额并定位差异单)
- 代收货款上缴缺口判定(代收货款 − 代收手续费 大于 代收货款应缴 ⇒ 应追缴;应缴大于代收货款 ⇒ 多缴)
- 同一网点同一期间同一代收货款单号重复计扣判定
- 代收手续费率不一致判定(同一网点同一期间出现多个费率 ⇒ 按其中最低费率折算多计的手续费差额)
- 跨网点汇总台账与差异处理清单(按网点 × 期间汇总运费 / 代收货款 / 应缴 / 应结与争议金额,按金额排序,逐条带原文行号)
同名工具的完整档是另一个独立商品(条款与条件以它自己的商品页为准); 两档的差别就是上面这些,没有别的。
需要完整档时(可选)
本免费版是完整可用的核心产出,本版本不包含下面这些项:
- 合计行勾稽(合计行各列 = 各明细行逐列相加,不符时报出差异金额并定位差异单)
- 代收货款上缴缺口判定(代收货款 − 代收手续费 大于 代收货款应缴 ⇒ 应追缴;应缴大于代收货款 ⇒ 多缴)
- 同一网点同一期间同一代收货款单号重复计扣判定
- 代收手续费率不一致判定(同一网点同一期间出现多个费率 ⇒ 按其中最低费率折算多计的手续费差额)
- 跨网点汇总台账与差异处理清单(按网点 × 期间汇总运费 / 代收货款 / 应缴 / 应结与争议金额,按金额排序,逐条带原文行号)
同名工具的完整档是另一个独立商品(条款与条件以它自己的商品页为准);两档的差别就是上面这些,没有别的。
边界(请务必知道)
本工具不做引擎 CHECKS_OUT_OF_SCOPE 里列的那些判断:单价该按什么合同档位、抛比(体积重)怎么取、
代收手续费率是否符合代收协议、代收货款是否真的收到并转付、回单是否齐全、账务与税额怎么处理
(那些以运价合同、代收协议、银行流水与业务凭证为准)。
- 只核表内勾稽:表里的计费重量、计费单价、代收货款、费率、派费、中转费一律以你填的为准;
- 「没报问题」不等于「没有问题」:超出上述 6 项的检查,本版本不执行;
- 材料不齐时不给结论,也不会用默认值编一个「本期没问题」出来;
- 每条结论都带原文行号与运单号,可由第三方用同一份输入复算。
