项目结算单 · 单项目利润核算
CRITICAL: you MUST use this skill whenever 用户在收尾一个项目——项目做完了要跟客户结算、
要出一版结算单、想知道这单到底赚没赚钱、要登记收了多少钱还差多少钱、
要算成本比预算超了多少,或客户追加了需求/砍掉了范围需要对账。
「这个活超没超预算」「尾款还有多少没收」「这单毛利多少」这类局部问题也应先加载本技能。
身份定位:接单业务线的后半程——project-quote-desk 是往前推(报多少),
本技能是往回算(实际赚了多少)。两边费率口径刻意做成一致,这样差异才可比、可追责。
两者配套使用能闭环:报价时的三档 → 结算时的实际。
do NOT use for:投标场景的结算(走 tender-* 系列)、财务会计记账与报税
(本工具不算账,只按给定税率做算术)、发票开具、法律与合同条款争议。
执行原则
- 预算与实际同口径。 两边用同一套预留+管理费率,差异才 100% 来自直接成本,才谈得上追责。
- 宁少勿错。 数据缺失、日期不明、增减方向不清时只报告,绝不猜一个方向填上。
- 不覆盖原文。 所有产物另存新文件;目标文件已存在则报错,除非显式加
--force。 - 差异必须闭合。 收入差异 − 成本差异 = 利润差异,对不上就是算错了,不许交付。
- 算完必自检。 应收 = 结算总额 − 已收款,且逾期天数要说清是「已逾期」还是「还没到期」。
意图识别
| 用户说 | 实际意图 | 路由 |
|---|---|---|
| 「跟客户结算一下」 | 出结算单 | 结算单表 |
| 「这单赚了多少」 | 单项目利润核算 | 利润核算表 |
| 「成本比预算超了多少」 | 成本对比 | 成本预算与实际表 |
| 「为什么没赚到预期的钱」 | 差异归因 | 差异归因表 |
| 「尾款还有多少」 | 应收与账龄 | 收款台账 |
| 「客户加了需求要加钱」 | 增项登记 | 变更单输入 |
工作流
- 备三份数据:清单(同一行同时有预算与实际)、收款记录、变更单。
没有就先--emit-template导出三份 CSV 模板让用户填;想先看效果就跑--sample。 - 定合同额:有合同就给
--contract;没有则不传,工具会按目标毛利率从预算推算,
并在结论里标注「(推算)」,不许把推算值当成合同价给客户。 - 算账:结算总额 → 成本对比 → 实际利润 → 差异归因 → 收款与应收。
- 交付:
--out出五表 Excel,--emit-md出 Markdown,--emit-csv出成本对比明细。 - 讲结论:赚了多少、比预算差多少、差在哪(收入还是成本)、还有多少钱没收、该不该催。
命令
| 命令 | 说明 |
|---|---|
--emit-template PATH |
导出三份 CSV 模板(清单/收款记录/变更单)后退出 |
--sample |
内置品牌官网项目样例,含已知合同额,用于演示与自检 |
--items PATH |
工作项清单(含预算与实际列,--sheet 指定工作表) |
--payments PATH |
收款记录(日期/金额/备注) |
--changes PATH |
变更单(变更项/类型/金额),类型写「增项/减项」 |
--contract N |
合同含税总额;不传则按目标毛利率从预算推算 |
--overhead 0.10 |
管理费率(与报价口径保持一致) |
--buffer 0.08 |
范围预留(与报价口径保持一致) |
--profit 0.25 |
只在推算合同额时用:目标毛利率 |
--tax 0.06 |
税率(价内税:不含税 = 含税 ÷(1+税率)) |
--due-date YYYY-MM-DD |
约定付款日,用于算逾期天数 |
--today YYYY-MM-DD |
基准日(默认系统当天) |
--out PATH |
输出五表 Excel(已存在则不覆盖) |
--emit-md PATH / --emit-csv PATH |
额外输出 Markdown 报告 / 成本对比明细 |
--json / --quiet / --force |
机读输出 / 只输出结论 / 允许覆盖 |
关键口径(解释给用户时必须说清)
- 预算与实际同费率:总成本 = 直接成本 ×(1+预留) ×(1+管理)。
预算与实际都这么算,所以差异全部来自直接成本,不含费率口径变化。 - 结算总额 = 合同额 + 增项 − 减项(均为含税);应收 = 结算总额 − 已收款。
- 利润基于不含税口径:实际利润 = 结算总额÷(1+税率) − 实际总成本。
- 差异三元组闭合:收入变更净额(不含税)− 成本差异 = 利润差异,工具会校验,对不上就是 bug。
- 账龄:
--due-date给的是约定付款日,正数是已逾期天数,负数是还没到期,别把两者说反。
输出前自检
- [ ] 差异归因闭合:收入差异 − 成本差异 == 利润差异(JSON 里
gap_balanced为 true); - [ ] 用了推算合同额时,结论里标了「(推算)」,且提醒不能拿给客户当合同价;
- [ ] 逾期天数说清了是「已逾期 X 天」还是「距到期还有 X 天」;
- [ ] 所有数据缺失项都进了「需要你确认」,没有悄悄按 0 或按增项处理;
- [ ] 输出文件是新文件,没有覆盖用户原有的任何文件。
常见错误
- 把增项减项方向填反 → 金额符号反了,结算总额会差两倍;
- 只对客户说「变更净额」却不列明细 → 客户必然要逐条对,结算单必须逐项列出;
- 用当前日期算账龄却没给
--due-date→ 算出来的是「距今」不是「逾期」,两回事; - 拿推算的合同额去对账 → 客户合同价是写死的,必须先问到手;
- 只看总利润不看归因 → 不知道是报价低了还是做超了,下次还是犯同样的错。
免责声明
本工具按用户提供的清单、收款与变更记录做算术推演,输出的是内部结算测算,
不构成会计记账凭证、税务申报依据或法律意见;税率与费率以实际合同为准。