投标分项报价表生成·不平衡报价与结算收益测算
一份清单上百项,每一项该报多少钱,通常靠经验拍板。本技能把它变成一步算术:
解析清单 → 生成基线报价 → 在总价不变下重分配单价 → 测算结算收益。
和同系列两个包配套:tender-redline-check 查会不会废标、tender-score-sim 算能得多少分,
本技能解决最后一问——每一项单价怎么报。
何时使用
- 拿到工程量清单 / 采购清单,要在总价约束下排出分项报价表。
- 想知道:在总价不变的前提下,把单价向哪些项目倾斜能提高结算收入。
- 报价前想评估风险:这样报价会不会因单价偏离过大被质疑为不平衡报价。
- 想量化「工程量若增减,结算收入会差多少」。
不适用:判断不平衡报价是否违规、能否被认定为无效投标;本工具只做清单解析与算术测算,
不构成法律、财务或投标决策意见,请勿用于招标文件明确禁止的报价行为。
怎么用
# 用内置样例看完整效果
python3 scripts/tender_price_sheet.py --sample
# 已知控制价与下浮率
python3 scripts/tender_price_sheet.py 清单.csv --control 19038200 --down-rate 6
# 已知目标总价
python3 scripts/tender_price_sheet.py 清单.csv --total 17895908
# 第一步:导出待填的情景模板
python3 scripts/tender_price_sheet.py 清单.csv --total 17895908 --emit-template > profile.json
# 第二步:填好 profile.json(结算阶段、预计工程量变动倍数)后复跑
python3 scripts/tender_price_sheet.py 清单.csv --total 17895908 --profile profile.json
# 导出建议报价表 CSV(Excel 可直接打开)
python3 scripts/tender_price_sheet.py 清单.csv --total 17895908 --emit-boq 报价表.csv
输入清单列名可用「序号 / 项目编码 / 项目名称 / 计量单位 / 工程量 / 综合单价」,顺序不限,
分隔符支持逗号、竖线、制表符;缺列名时按固定列序解析。清单不含单价时也能用
(基线按数量均分目标总价,结果只体现阶段差异)。
不平衡报价怎么算
核心是一个零和重分配:总价被约束为定值,单价此消彼长。
| 步骤 | 做法 |
|---|---|
| 1. 定阶段 | 按项目名关键词自动判定早结算 / 晚结算(土方、基础、主体 → 早;装饰、安装、绿化 → 晚),可用 profile 覆盖 |
| 2. 给意愿 | 早结算项想抬价、晚结算项想压价,中性的不动 |
| 3. 解约束 | 在 Σ(单价×数量) = 目标总价 且每项偏离 ≤ --cap(默认 ±15%)下,迭代求解最接近意愿的单价 |
| 4. 测收益 | 在三种情景下比较「建议方案 vs 基线方案」的结算收入 |
关键结论:若所有项目同比例量变,两种方案的结算收入完全相等(总价被约束为定值)——
收益只来自结构性量变。所以情景按阶段定向设定:
| 情景 | 设定 | 含义 |
|---|---|---|
| 按情景预期量变 | 各项按 profile 的 qty_factor |
你方主观判断的工程量变动 |
| 有利情景 | 早结算项 +10% / 晚结算项 −10% | 收益上界 |
| 不利情景 | 早结算项 −10% / 晚结算项 +10% | 收益下界(可能转负) |
情景设定(profile.json)
--emit-template 生成的模板结构如下:
{
"cap": 0.15,
"label": "预期:土方与钢筋增量、室外绿化减量",
"items": {
"土方开挖及回填": { "stage": "早", "qty_factor": 1.15 },
"室外绿化与景观": { "stage": "晚", "qty_factor": 0.85 }
}
}
stage:早 / 晚 / 中(也可写EARLY / LATE / MID)。不填则按项目名自动判定。qty_factor:预计工程量变动倍数,1.15= 预计增 15%,0.85= 预计减 15%。cap:单价相对基线的最大偏离比例,默认0.15;调大能获得更大调整空间,但被质疑风险上升。
输出示例(节选)
## 三、不平衡报价建议(总价不变,单价重分配;偏离上限 ±15%)
| 序号 | 项目名称 | 阶段 | 基线单价 | 建议单价 | 相对基线 | 建议合价 |
| 1 | 土方开挖及回填 | 早 | 26.79 | **29.46** | +10.0% | 353,549.00 |
| 8 | 楼地面装饰工程 | 晚 | 126.90 | **107.86** | -15.0% ⚠ | 2,006,289.00 |
| **合计** | — | — | — | — | — | **17,895,908.00** |
## 四、结算收益测算(建议方案 vs 基线方案)
| 情景 | 基线方案结算收入 | 建议方案结算收入 | 收益差 | 增幅 |
| 按情景预期量变 | 18,318,626.00 | 18,387,416.72 | **+68,790.72** | +0.38% |
| 有利情景(早结算项 +10% / 晚结算项 −10%) | 18,264,745.20 | 18,471,562.68 | **+206,817.48** | +1.13% |
| 不利情景(早结算项 −10% / 晚结算项 +10%) | 17,527,070.80 | 17,320,253.32 | **-206,817.48** | -1.18% |
结论分档:预期情景收益为正且无超限项 → 方案可执行;收益为正但有偏离过大项 → 先收敛再报;
收益基本为零 → 清单结构不足以形成调整空间,按基线报价;收益为负 → 阶段判定反了,需重估。
常用参数
| 参数 | 说明 |
|---|---|
--total |
目标总报价(元) |
--control + --down-rate |
招标控制价与下浮率(百分数),目标总价 = 控制价 ×(1−下浮率) |
--cap |
单价相对基线的最大偏离比例(默认 0.15) |
--risk-threshold |
触发风险提示的单价背离阈值(默认 0.20,相对清单单价) |
--emit-template / --profile |
导出 / 回读情景设定 |
--emit-boq [文件] |
导出建议报价表 CSV(省略文件名则输出到标准输出) |
--json |
结构化输出,便于接后续流程 |
设计边界
- 纯标准库 Python,只读,无网络请求,无
subprocess/eval。 - 阶段判定基于项目名关键词,会有误判(如「设备安装」既可能早也可能晚)——用 profile 的
stage覆盖即可;
报告统一用「早 / 晚」标注,便于逐条核对。 - 单价重分配是线性零和约束下的迭代求解,保证合价合计精确等于目标总价(偏差 0 元);
触界项会被钳制,报告中标 ⚠ 并统计条数。 - 结算收益测算基于假设的工程量变动,实际结算量以现场计量与合同约定为准;
工程量大幅反向变动会削弱甚至逆转收益,报告已固定提示。 - 输出固定附免责声明:本工具不构成法律、财务或投标决策意见,单价合规性以招标文件约定、
评标办法及适用法律法规为准。