装修报价单审核
这个技能解决什么
业主拿着一份报价单,坐在装修公司对面,看不懂 800 行数字,也不知道哪一行在坑他。他要的不是一篇「装修十大陷阱」,而是一个能当场用的判断:
- 这张单子比市场贵多少?
- 哪几行贵了,贵在哪,能砍多少?
- 哪些项目没写但一定会做,签完要加多少钱?
- 明天坐下来第一句话说什么?
所以输出必须落到四件事:逐项问题(带行号)、依据(带区间)、金额(能省多少)、话术(照着念)。任何「建议多对比几家」「注意隐藏增项」这类正确但没用的结论,都不要写。
与「避坑知识类」装修技能的分界
| 用户意图 | 走哪里 |
|---|---|
| 「装修有什么坑」「半包和全包的区别」「瓷砖怎么选」 | 知识科普类技能,不用本技能 |
| 「帮我看看这份报价」「这个价格合理吗」「能砍多少」 | 本技能 |
| 「帮我做一份报价单」「我要报个价」 | 不属于本技能(本技能只审核,不代做) |
| 「帮我设计一下户型」 | 不属于本技能 |
判断标准只有一条:用户手上有没有一份具体的、要签的报价单。有,就审;没有,就是在问知识。
输入
必需
- 报价单:文件(PDF / 图片 / Excel / Word)或直接粘贴的文字。图片要能看清数字,模糊的先要求补拍。
- 城市:决定价格系数的关键。没给就按新一线算,并在报告里注明可能偏差 ±15%。
强烈建议(缺了会明显降低发现能力)
- 建筑面积(㎡):缺了就无法做工程量系数核对 —— 那是发现「工程量虚增」的唯一手段,也是这类单子最贵的坑。
- 承包方式:半包 / 全包 / 清包。决定哪些项目该在单子里、哪些属于用户自购,判错会大面积误报漏项。
- 户型(几室几卫):影响防水、墙砖、点位数量的经验值。
可选
- 装修标准(简装 / 中档 / 豪装)、已确定的品牌型号、对比报价(其他公司给的)、用户预算上限。
缺信息时的处理:先开工,用合理假设补上,并在报告「依据与假设」里逐条写明假设。唯一必须追问的是建筑面积 —— 没有它,最值钱的那类问题(工程量虚增)根本查不出来,宁可停下来问一句。城市可以缺,面积不行。
工作流
第 0 步:计费门禁(付费约束,先于一切)
完整报告是付费内容。在生成付费层之前,先过计费门禁,不允许先出报告再补支付:
python "$SKILL_DIR/scripts/payment_gate.py" probe --sku report_single --biz-no "<业务单号>" --area <面积> --city "<城市>"
按返回分流,三种情况只有三种走法:
probe 返回 |
含义 | 下一步 |
|---|---|---|
local_mode: true |
未配置 AIPAY_ENDPOINT,本地/开发环境 |
直接产出完整报告,末尾标注「本地模式,未计费」 |
needs_payment: true + bill |
服务端返回 HTTP 402,Payment-Needed 账单已解码 |
向用户展示金额与商品,等其确认支付;拿到 Payment-Proof 后 verify,通过才继续 |
needs_payment: false |
已有权益或已支付 | 直接履约 |
验付与回执(付费链路三个不可跳过环节的后两个):
python "$SKILL_DIR/scripts/payment_gate.py" verify --order <order_id> --proof "<Payment-Proof>"
python "$SKILL_DIR/scripts/payment_gate.py" complete --order <order_id>
python "$SKILL_DIR/scripts/payment_gate.py" ack --order <order_id> --result ok --report "<报告路径>"
铁律:
- 验付未通过,不产出付费层。不要因为「用户说付了」就继续。
- 不伪造支付结果,不在报告里写「已支付」除非
verify返回ok。 - 用户拒付、超时、关单 → 降级输出免费层,不报错、不扣款、不留半成品文件。
- 履约失败 →
ack --result fail,触发退款,不删除计量记录。 - 所有环节用同一个
biz_no,脚本按idem_key幂等,重复调用不会重复扣费或重复交付。
第 1 步:解析成结构化表
读 references/parsing-guide.md,按版式(分空间 / 分项 / 套餐 / 混合)解析。每行抽成:序号、项目名、工艺说明、单位、工程量、单价、合价、备注。
三个必须遵守的解析纪律:
- 序号原样保留。砍价时要指名道姓说「第 5 项」,重编的号用户对不上。
- 单位归一化,但保留原单位痕迹(延米 ≠ 米,项 ≠ ㎡)。
- 面积口径统一记为建筑面积,套内面积先折算再记。
同时给每行填 baseline_code(指向 references/price-baseline.json 的条目)。这是语义判断,模型做,脚本不做。拿不准就留空,让它进「未匹配」列表,不要硬套一个相近的。
第 2 步:跑计算
把解析结果存成 JSON(结构见 references/parsing-guide.md 第七节),然后:
python "$SKILL_DIR/scripts/quote_audit.py" --input quote.json --out audit_result.json --md audit_table.md
脚本做完四件确定性的事:算术复算(数量×单价 vs 合价、分项合计 vs 总价)、单价与基准区间比对(含城市系数)、工程量系数核对(面积 × 经验系数)、金额影响量化与风险定级。
--md 输出的表格可以直接贴进报告第三节,不要手工重抄数字 —— 手抄一遍就多一个错数的机会。
第 3 步:查漏项
读 references/missing-items-checklist.md,按承包方式过滤后逐条比对。只报「完成这套设计必需、且本单确实没有」的项目。
半包单子里没有主材不是漏项,用户自购的不是漏项,明确说不做的不算漏项。误报一条漏项,用户就会怀疑整份报告。
第 4 步:扫陷阱模式
读 references/trap-patterns.md,对照结构和备注栏找脚本查不出的问题:拆项重复计费、打包项不写明细、材料「同档次品牌」、付款节点前置、增项无上限、以决算为准……
每条判定都要能指回报价单原文。指不回去的,降级为「待确认」,不要写进问题清单。
第 5 步:给话术
读 references/negotiation-scripts.md,按问题编号给三档话术(温和 / 直接 / 强硬),每档一句,能直接念出来。同时给出这一条的可谈空间(元)。
话术必须带具体数字和具体行号。写「你可以跟对方争取一下单价」等于没写。
第 6 步:出报告
按 assets/report-template.md 的结构写,八节齐全。前面给结论,中间给问题,后面给行动。落盘为 markdown 文件,文件名形如 装修报价审核_<城市>_<面积>㎡.md。
报告之外,把 quote.json(解析结果)和 audit_result.json(计算结果)也留着,用户后续调整报价单时可以增量重审。
风险分级
| 等级 | 判定标准 | 用户该做什么 |
|---|---|---|
| 🔴 高风险 | 单价 > 基准上沿 30%;工程量 > 系数上限 25%;算术多算 > 2000 元;总价对不上;付款/增项条款存在无限加价风险 | 签约前必须解决,否则不签 |
| 🟠 中风险 | 单价 > 上沿 10%-30%;工程量超上限 10%-25%;材料型号缺失;保修缩水 | 值得谈,谈不下来要换等价条件 |
| 🟡 关注 | 单价略超上沿;占比结构异常;低于市场下沿(低价切入) | 留个心眼,签约时锁死条款 |
| ⚪ 提示 | 合价低于乘积(少算)、格式问题 | 顺手确认,防止后期补收 |
金额影响必须量化到元。「可能多花不少钱」不是结论。
输出格式
免费层(未付费时的输出):一段结论 + 三行数字(总额 / 可优化区间 / 问题数量与分布)+ 3 条最严重问题(只给「贵了多少」,不给改法和话术)+ 漏项条数 + 一句「完整报告含 N 条问题明细与砍价话术,需付费解锁」。
付费层:一份 markdown 报告,八节:
- 结论 —— 一段话说清贵不贵、贵在哪、能省多少、签不签
- 钱花在哪 —— 分项金额 + 占比 + 常见占比对比
- 问题清单 —— 表格(编号/等级/类型/行号/项目/原文/问题/依据/金额影响),重点展开前 3 条
- 漏项清单 —— 表格(漏项/为什么必须做/要花多少/谁承担)
- 依据与假设 —— 基准版本、城市系数、面积口径、承包方式、未覆盖部分
- 砍价话术 —— 按问题编号,三档
- 签约前必办清单 —— 勾选式,每条对应一个不签字的理由
- 说明 —— 行情区间非最低价、非法律意见、未识别部分需人工复核
免费层与付费层(支付宝 AI 按量付费)
本技能按「免费给判断,付费给方案」分层,走支付宝 AI 按量付费协议(HTTP 402)。
分层内容
| 层 | 输出什么 | 不给什么 |
|---|---|---|
| 免费 | 报价总额、问题数量与风险分布、最严重 3 条问题(只说「贵了多少」)、漏项条数、可优化金额区间、一句话结论 | 完整话术、完整问题清单、报告文件 |
| 付费 | 完整问题清单(行号/原文/依据/金额)、漏项明细与补价、三档砍价话术、签约前必办清单、可下载报告 | — |
免费层的使命是让用户确认「它真看懂了这张单子」。任何一条完整话术都不能出现在免费层 —— 话术是付费产品的主体,送出去付费动机就没了。
计费协议(四个不可跳过的环节)
| 环节 | 协议要素 | 谁做 |
|---|---|---|
| 1. 账单下发 | HTTP 402 Payment Required + Payment-Needed(Base64URL 账单) |
商户服务端 |
| 2. 携凭证重试 | 客户端带 Payment-Proof 重试同一 biz_no |
payment_gate.py verify |
| 3. 验付调用 | alipay.aipay.agent.payment.verify,核对凭证、金额、主体、单号 |
商户服务端 |
| 4. 履约确认 | alipay.aipay.agent.fulfillment.confirm 回执 |
payment_gate.py ack |
普通下单、异步通知、主动查单都不能替代这套流程。客户端页面或 Agent 口述的「支付成功」也不是履约依据。
订单持久化在 ~/.workbuddy/skill-data/renovation-quote-audit/orders.db(SQLite),biz_no 与 idem_key 双唯一,状态机 created → billed → paid → fulfilling → fulfilled / failed → refunded。
定价(按次计费)
平台按「单次调用价格」代收,一次调用 = 一份报价单的完整审核,不按 SKU 分档。当前单价由平台上架配置决定,默认 ¥1.9/次(首发期 ¥0.99)。
| 场景 | 计费 |
|---|---|
| 单份报价单完整审核 | 1 次 |
| 同一份单子修改后重审 | 1 次(复用 biz_no,不重复建单) |
| 三份报价单横向对比 | 1 次(同一次调用内完成) |
两张计费路径互斥,不能叠加收费:
- 默认(无后端):平台按次代收,
payment_gate.py走local_mode,不产生 402 账单。 - 可选(有后端):配置
AIPAY_ENDPOINT启用自建 402 计费,此时平台上架单价设为最低档,避免用户被收两次钱。
退款与对账
履约失败、文件无法解析、重复扣款 → 全额退;已成功交付完整报告 → 不退。按 biz_no 关联计量账、支付账、履约账,重点排查「已支付未履约」「已履约未确认」「重复计量」。
完整实现要求见 references/payment-integration.md,含账单字段、错误码、降级矩阵与上线前测试清单。
质量标准
- 每个数字都要能复算。金额、百分比、面积系数,写清算式。一个算错的数字会毁掉整份报告的可信度。
- 给区间不给点估计。「市场 50-80 元/㎡,建议按 73 谈」,不要写「合理价应是 75」。
- 优先级按金额排,不按情绪排。用户最该处理的是最贵的那条,不是最气人的那条。
- 只报能行动的问题。每条都要有「该怎么办」,否则就是制造焦虑。
- 区分「确定」和「推测」。单价虚高是算出来的,增项风险是推出来的,报告里要用不同措辞。
- 不重复计钱。可优化金额是上限估算,总价差额里已经含了单项虚高时,不要相加成两倍。
- 总量控制:问题清单通常 5-15 条。超过 20 条说明没做筛选,用户会直接放弃阅读。挑大额的和结构性的。
- 语气站在用户这边,但不煽动。不说「这家公司在骗你」,说「这一项比市场高 50%,依据是……」
边界与失败处理
- 只有总价没有明细(「整装 15 万全包」):明确说明无法逐项审核,改为审套餐外条款、升级加价表、付款节点,并标注「有限审核」。
- 图片模糊 / 手写单:只审能看清的行,逐行说明哪几行没识别,请用户补。绝不猜数字。
- 非住宅 / 工装(商铺、办公室):本基准库不适用,说明后用行业经验给方向性提示,不给具体单价结论。
- 别墅 / 豪装:基准只能判断「是否离奇」,不能判虚高,报告中如实说明。
- 用户拿别家的报价来比价:照审,但在结论里点出「这是比价用途,重点看差异项」。
- 用户要求「帮我砍到 10 万」:可以给砍价路径,但不承诺能砍到;对方明显亏本的价格意味着后面必然增项或降标,要提醒。
- 用户是装修公司/施工方:本技能立场是业主侧。若对方要用,说明报告逻辑会系统性地不利于施工方报价。
隐私
报价单可能含业主姓名、电话、地址、房号。默认本地处理,报告和中间文件里不要把个人信息抄进去,报告只保留城市、面积、承包方式这类必要信息。
参考文件
references/price-baseline.json—— 单价基准库(91 条,覆盖拆改/水电/泥瓦/木工/油漆/安装/主材/费率),含城市系数与工程量经验系数。唯一价格数据源。references/price-baseline.md—— 基准库口径、城市定级、判断阈值、覆盖不到的情况、更新方法。references/parsing-guide.md—— 四种版式的解析方法、字段抽取、单位归一化、面积口径、复合行拆分、JSON 结构。references/missing-items-checklist.md—— 漏项清单(通用/分空间/水电/合同侧),含假漏项识别规则。references/trap-patterns.md—— 24 条陷阱模式(结构/单价/材料工艺/合同付款),每条含识别信号、后果、处置。references/negotiation-scripts.md—— 话术四段结构、六个场景三档话术、谈判节奏、谈不下来怎么办。references/payment-integration.md—— 支付宝 AI 按量付费接入规范:402 账单、Payment-Proof 重试、验付、履约回执、幂等、退款对账、测试清单。assets/report-template.md—— 八节报告模板。scripts/quote_audit.py—— 算术校验、单价比对、工程量系数核对、风险定级、金额量化。scripts/payment_gate.py—— 计费门禁:probe/verify/complete/ack/status/ledger,含本地订单账本与幂等控制。