询价单 · 采购比价
一家供应商报价好比对,五家就开始乱:含税不含税混着写、税率各填各的、交期有的写天数有的写日期,
谁家便宜全靠肉眼在表格里来回扫。更麻烦的是异常价——偏高是报价失误,偏低往往是规格被偷换了,
不标出来就容易在定标后才爆雷。
本技能把两份表(物料清单 + 供应商报价)合成一条流水线:先按税率统一折算成含税口径,
再按物料算出最低价、最高价、均价、价差率与可节省额,用中位数 ±30% 把偏高/偏低的异常报价标出来,
最后给出「每物料拟选谁 + 整体推荐哪家」的定标建议,并一并产出可直接发送给供应商的 询价单.docx。
为什么选它(最硬的差异点):纯标准库、本地离线运行,不依赖 pandas / openpyxl / python-docx。
同类「采购比价」方案普遍要 pip install 一堆库,或把报价表上传到在线表格服务;
本包只用 Python 自带模块,手写 OOXML 与 SpreadsheetML,断网也能跑,报价数据不离开本机。
执行原则
- 先统一口径再比价。 含税/不含税、税率缺省值必须显式指明,所有比较一律在含税单价上进行;不要把不同税率的价格直接排大小。
- 异常价必须显性提示。 偏离该物料所有报价中位数 ±30% 以上的报价要标出(偏高标红、偏低标黄提示核规格);不要让最低价一路绿灯通过。
- 缺报价就承认缺。 没有任何供应商报价的物料单独列入「待补报价」,不参与汇总金额,也不许用 0 价充数。
- 建议不等于决策。 输出的是按录入价格机械测算的排序与建议,资质、账期、售后、最小起订量不在测算范围内;定标必须人工复核。
- 只用标准库离线跑。 不联网、不上传数据、不启动外部进程;不要为图方便引入第三方库或在线表格服务。
- 输入不对就报错退出。 缺列、数量/单价非数字、编码缺失时给出清晰行号提示并返回退出码 1;不要静默跳过或吐 traceback。
适合谁
- 采购工程师 / 采购专员:日常询价比价、做询价单、整理定标依据。
- 供应链 / 计划岗:多物料、多供应商的集中采购与年度框架比价。
- 成本控制 / 财务 BP:核价差率、看可节省空间、复核异常报价。
- 项目经理 / 行政采购:一次性采购(设备、装修、活动物料)的询价留痕与归档。
何时使用
CRITICAL: 只要用户提出要发询价单、要比较几家供应商报价、想知道哪家最便宜、要算含税价或价差、要做比价表或定标建议,就必须使用本 skill,即使看起来可以用别的方式解决。
- 手里有一份物料清单和几家供应商的回标,要横向比价并挑出中标方。
- 报价单税率不一、有的含税有的不含税,需要统一口径后再比较。
- 怀疑某家报价明显偏高或低得离谱(可能换了规格),需要系统性排查。
- 要向供应商发一份格式统一、带商务条款的询价单。
- 需要一份能直接进汇报材料的比价分析与可节省金额测算。
不适用(反模式,请绕行):
- 供应商资质审查、工商征信、黑名单与合规尽调——本包不做,也不接入任何外部数据库。
- 代为发送询价(邮件 / 微信 / 招投标平台)——本包只产出单据文件,发送动作请人工完成。
- 合同起草、条款谈判、招投标文件编制——超出比价测算范围。
- 服务类/工程类无明确物料编码与数量的模糊报价,需先拆成可计量的物料项。
- 需要历史价格库、多币种换算、含运费安装费的全生命周期成本(TCO)测算——本包只处理录入的单价与数量。
怎么用
# 1) 内置样例端到端(6 个物料 / 3 家供应商,含 1 条偏高与 1 条偏低异常报价)
python3 scripts/purchase_inquiry.py --sample
# 2) 常规比价(默认不含税单价,税率 13%)
python3 scripts/purchase_inquiry.py --items 物料清单.csv --quotes 供应商报价.csv --out-dir ./比价输出
# 3) 报价本身就是含税价
python3 scripts/purchase_inquiry.py --items 物料清单.xlsx --quotes 报价.xlsx --tax-included
# 4) 默认税率改成 6%,并输出 JSON 摘要供脚本串联
python3 scripts/purchase_inquiry.py --items 物料清单.csv --quotes 报价.csv --tax-rate 6% --json
在对话里可以直接说:「把这几家供应商的报价比一下,出个询价单和比价表」,并给出两份表的路径。
命令表:
| 命令 | 作用 |
|---|---|
--sample |
用内置样例端到端跑通,产物落在项目根 _test/purchase-inquiry-kit-out/,不写进包内 |
--items + --quotes |
正式比价,两份输入都必填 |
--tax-included |
声明输入单价已含税,不再乘税率 |
--json |
在生成产物的同时,把结构化摘要打到 stdout |
--out-dir |
指定输出目录,缺省为项目根 _test/purchase-inquiry-kit-out/ |
参数表:
| 参数 | 作用 |
|---|---|
--items <物料清单csv/xlsx> |
物料清单。表头:物料编码,名称,规格型号,数量,单位,要求交期,备注 |
--quotes <报价csv/xlsx> |
供应商报价。表头:供应商,物料编码,单价,税率,交期,付款方式,备注 |
--out-dir <输出目录> |
产物目录,缺省 _test/purchase-inquiry-kit-out/ |
--tax-rate <默认0.13> |
报价表税率缺省时采用,可写 0.13 或 13% |
--tax-included |
开关。置上表示输入单价即含税价 |
--json |
开关。输出 JSON 摘要(最低/最高总价、可节省额、定标建议、异常条数) |
--sample |
开关。用内置样例数据跑通全流程 |
列名支持常见别名(如「物料号」「编码」「规格」「报价单位」「不含税单价」),顺序不限;
物料编码 / 名称 / 数量 / 供应商 / 单价 为必填,税率 缺省取 --tax-rate,交期 写天数或日期均可。
退出码:0 成功;1 失败(文件不存在、扩展名不支持、缺必填列、数量或单价无法解析、参数组合非法),
错误信息带文件路径与行号,不输出 traceback。
计算与预警口径
- 含税单价:
--tax-included时单价即含税价;否则含税单价 = 单价 × (1 + 税率),税率缺省取--tax-rate。 - 行总价 = 含税单价 × 数量。
- 物料级:最低价 / 最高价 / 均价取该物料所有供应商的含税单价;中选供应商为最低价者,同价时取交期短者。
- 价差率 =
(最高含税单价 − 最低含税单价) / 最低含税单价;可节省额 =(最高含税单价 − 最低含税单价) × 数量,逐物料加总即看板上的可节省总额。 - 异常报价预警:以该物料所有报价含税单价的中位数为基准,偏离
+30%以上标红(偏高,核价或核渠道),偏离−30%以上标黄(偏低,重点核对规格型号与品牌是否同一口径)。 - 供应商维度:报价总额(各行总价之和)、覆盖物料数、中选物料数、平均交期(天)、按报价总额升序排名。
- 定标建议:每物料取最低价供应商;整体推荐供应商 = 中选物料数最多,并列时取报价总额最低者。
- 缺失报价:某物料无任何供应商报价 → 列入「待补报价」清单并在报告中提示,不参与任何汇总金额。
输出
| 文件 | 内容 |
|---|---|
询价单.docx |
标题「询价单」;抬头 kv 区(单号/询价方/询价日期/报价截止日期/交货地点/付款方式/联系人);物料表(编码/名称/规格/数量/单位/要求交期);商务条款(含税口径、报价有效期、质保、发票类型);回标提示;签署栏 |
比价表.xlsx |
4 个 sheet:报价明细(逐条报价含异常标记)、比价汇总(物料级最低/最高/均价/中选/价差率/可节省额)、供应商对比(总额/覆盖数/中选数/平均交期/排名)、汇总看板(总价、可节省、待补与异常条数) |
比价分析摘要.md |
物料级比价表 + 定标建议 + 风险提示(异常报价、待补报价、价差过大) |
| 终端摘要 | 物料数、供应商数、最低/最高方案总价、可节省额、定标建议、异常条数、产物路径与字节数 |
--json |
结构化摘要:最低总价、最高总价、可节省额、定标建议、异常条数、逐物料定标明细 |
设计边界
- 纯标准库 Python,本地运行,无网络请求,不使用
subprocess/eval/exec/os.system,也不读取任何凭据。 - 只做询价单据与比价测算:不做供应商资质审查、不代发询价、不做合同起草。
- 结果由录入价格机械测算得出,仅供参考,定标需人工复核;资质、账期、售后、最小起订量、运费不在测算范围内。
- 只处理单一币种;不含运费、安装费、关税等未录入成本,也不做 TCO 测算。
- 同一物料同一供应商的多条报价不做去重,会作为多条明细参与统计。
- 报价表中出现物料清单里没有的编码时不参与计算,仅在摘要中提示。
- 单据抬头中的询价方、交货地点、联系人为占位值(
(待填写)),生成后请在 Word 中补齐。 --sample产物固定写到项目根_test/purchase-inquiry-kit-out/,不会污染包目录。
依赖
纯标准库,无需安装任何包,本地离线运行。 只用 argparse / csv / json / re / zipfile / decimal / datetime
等 Python 自带模块,手写 OOXML 与 SpreadsheetML 并用 zipfile 打包:
- 不依赖
pandas/openpyxl/python-docx/xlsxwriter,也不需要pip install; - 不调用任何在线转换或在线表格服务,报价数据不离开本机,断网可用;
- 不需要安装 Office / LibreOffice / WPS,也不启动任何外部进程。
scripts/tabkit.py(CSV/XLSX 读写)与 scripts/docxkit.py(DOCX 写出)为随包附带的纯标准库实现,
与外部同名库无关。需要 Python 3.8 及以上。