成本与存货技能包(免费版)
完全本地运行:批量壳与 14 项成本与存货检查规则都打包在本技能里(
scripts/engine/)。 不对外发材料、不写任何材料文件(结果只打到 stdout)、没有次数上限。
什么时候用
谁会在什么时候用:制造业 / 商贸 / 生鲜 / 工程的成本会计,在每月成本结账之前。要核的不是一个数, 而是十几张互相关联的底稿:库存账实、出入库与加权平均成本、跌价准备、报废审批、BOM 用量与损耗、 材料领用与定额、材料成本差异分摊、投入产出与报废率、委外加工费、甲供材料、工程材料调拨、 工时与人工分摊、固定资产盘点、生鲜损耗 —— 一张张手核既慢,又说不清哪一项这次到底核没核。
这个工具做什么:--input 客户目录 时,目录里每个子目录就是一个客户(一套成本存货底稿);
本工具逐客户跑 14 项成本与存货检查(每一项内部还有若干子检查),最后每个客户输出一行结论:
客户名 / 14 项各自「通过 / 有问题(几条) / 未执行」/ 问题条数与 P0、P1 计数。
每条问题都带客户名 + 原文文件与行号(例如 成本存货底稿.txt:4),可被第三方用同一份材料复算;
某个客户没交材料时,那个客户单独标「未执行」,不会拖累其他客户,也不会被算成"没问题";
只交了一部分材料时(只覆盖了部分检查项),会额外报一条 P2 检查项未执行(材料只覆盖了一部分),
把"没核的那几项"点名列出 —— 绝不能因为跑了几项就当成 14 项都跑过了。
本包包含以下 14 项检查(每项都是一个独立引擎,逐字节复用,规则一行没改)
- 库存账实核对(
inventory-check) - 存货出入库与加权平均成本(
inventory-cost-flow-check) - 存货跌价准备(
inventory-provision-check) - 存货报废与审批(
inventory-scrap-approval-check) - BOM用量与损耗差异(
bom-consumption-variance-check) - 材料领用与定额损耗(
material-usage-loss-check) - 材料成本差异分摊(
material-cost-variance-check) - 生产投入产出与报废率(
production-yield-scrap-check) - 委外加工费与损耗(
outsourced-processing-fee-check) - 甲供材料与分包领用(
owner-supplied-material-check) - 工程材料调拨与领用(
project-material-transfer-check) - 工时与人工成本分摊(
labor-cost-allocation-check) - 固定资产盘点账实(
fixed-asset-count-check) - 生鲜损耗与盘点差异(
fresh-loss-check)
这个免费版查什么(分层如实说明)
免费版是完整可用的核心产出——"一次跑完所有客户"这件事本身就在免费版里做完了:
- 免费版执行:上面 14 项成本与存货检查(逐客户全跑),外加批量壳自己的覆盖缺口检查 (材料只覆盖一部分时明确报一条,见上)。
- 免费版不包含(完整档追加的那些项由引擎的
CHECKS_WITHHELD如实列出,跑--sample会打印): 跨客户汇总台账、跨客户风险排序处理清单、跨客户共性问题归类、台账导出(Markdown / CSV)。 - ⚠️ 两个档位都不包含:上面 14 项里每一项自己声明未实现的检查项(例如「库存账实核对」的
"差异率超阈值提示")。它们在那 14 个上游免费包里就没实现,本包只是复用它们的规则,绝不会因为
"另有完整档"就假装跑过。这些项在结果里叫
scope.sub_checks_not_run,每一项各自列出,一条都不藏。
怎么用
node scripts/run.mjs --sample # 单客户样例(内置,14 项全跑)
node scripts/run.mjs --sample-batch # 3 个客户样例(干净 / 有一处硬伤 / 没交材料)
node scripts/run.mjs --input 客户目录 # 批量:每个子目录 = 一个客户
node scripts/run.mjs --input 客户目录 --json # 机器可读
客户目录这样放(每个客户的一套底稿里,每张表用 === 检查名 === 分段,Tab 分隔最稳):
客户目录/
豫州精工制造有限公司(2026-02 成本结账)/成本存货底稿.txt
中岳食品加工有限公司(2026-02 成本结账)/成本存货底稿.txt
一个文件里放全部 14 张表、或者拆成 14 个文件放进同一个子目录,都可以——引擎按表头认表。
目录里没有子目录时,直接把每个文件当一个客户;.json 文件里若写 {"text":"…"} 就按 JSON 取正文。
规则是哪来的(复用,不是重写)
那 14 项成本与存货检查(含各自的子检查逻辑)是逐字节拷贝进本技能包 scripts/engine/parts/ 的,
本包只做"客户目录 → 逐客户跑 14 项 → 每个客户一行结论"的编排与汇总,没有改写任何一条核对规则。
常见错法(这个产品专属,逐条都真实踩过)
--input指到了"某个客户的文件",却以为在跑批量:--input指向的应当是客户目录 (里面每个子目录才是一个客户)。直接指一个客户的文件,就只会出 1 个客户的结果。- 把
=== 检查名 ===分段行删掉了:引擎按表头找表,分段行不是必需的,但分段名是派发的第一依据, 删了之后某些表可能被"先跑通的那一段"抢走;分段名本身也是"这个客户到底核了哪几项"的证据。 - 一个客户的底稿放进了另一个客户的目录:结论会挂在错的客户名下,而且跨客户共性问题会被算错。
交付前扫一眼每行结论里的客户名与问题明细里的
文件:行号。 - 把「未执行」读成「没问题」:材料没交、表头认不出时,本工具不给结论,只标「未执行」。 把「未执行」当通过,是这类批量工具最常见的翻车方式。
- 用空格而不是 Tab 分隔列:解析优先按 Tab,其次按"2 个及以上空格"。金额里带空格(如
1 000.00) 会被拆成两列,凭空多出"关键字段缺失"。从 Excel 复制时用 Tab。 - 合计行没写在第一列:合计行要写在身份列(品类 / 编码 / 项目 …)那一格为「合计 / 总计 / 小计」。 写到别的列上不会被当成合计行,而是当成一条明细,于是"合计与明细之和不符"这种误报就出来了。
- 把两个客户的表拼成一个文件当一个客户跑:14 项会全部命中同一个客户的行号,结论对不上人。 一个客户一个子目录,是本工具的基本假设。
需要完整档时(可选)
本免费版是完整可用的核心产出,本版本不包含下面这些项:
- 跨客户汇总台账(全部客户 × 全部 14 项检查合并成一张总表)
- 跨客户风险排序处理清单(按 P0/P1/P2 排序,带客户名与原文文件行号)
- 跨客户共性问题归类(同一问题命中 2 个及以上客户时合并成一条共性项)
- 台账导出(Markdown 与 CSV 文本,直接用于成本与存货复核说明)
同名工具的完整档是另一个独立商品(条款与条件以它自己的商品页为准);两档的差别就是上面这些,没有别的。
边界(请务必知道)
本工具不做引擎 CHECKS_OUT_OF_SCOPE 里列的那些判断(判断存货该按哪种方法计价、该不该计提跌价准备、
定额与损耗率是否合理、代替成本结账、出审计或鉴证意见、核对实物是否真的存在、读 ERP/MES/WMS 导出文件);
材料不足时不给结论(认不出表头就不出结论,绝不套用默认值)。它只核表内与表间的算术和勾稽关系,
不替代你的专业判断。
