工程量清单随机化投标报价生成器
概述
从一份源工程量清单 xlsx 生成 N 份随机化投标报价文件。每份含税总计严格落在
(原始含税, 限价) 区间内且互不相同;安全文明施工费行设为公式随主表联动;
同名同规格材料共用一个调整价;N 份 + 原始版每项单价互不相同;并自动审计
价格顺序约束(如 DN200 管应贵于 DN150)。
何时使用
- 用户要把一份工程量清单拆成多份随机报价用于投标
- 要求报价总额在限价区间内、低于限价
- 要求安全文明施工费按公式取费
- 要求同类材料价格一致、各版本单价互不相同
- 要求审计大规格/小规格价格合理性
使用流程
第 1 步:分析源文件结构
读取源 xlsx,确认:主明细表名(含 名称/项目特征/工程量F/不含税单价G/含税单价H/合价I/含税合价J/税率K)、汇总表名、安全文明施工费所在行、明细行区间。脚本可自动探测安全文明施工费行(C 列含「安全文明施工」)与明细行(F>0 且 G 为数值)。
第 2 步:确定限价区间
- 下限 = 原始含税总计(源文件实测,公式:
S_items × (1+费率) × (1+税率)) - 上限 = 招标限价
第 3 步:编写配置文件
复制 assets/config_example.py,按新工程修改:SRC、OUTDIR、MAIN、限价、
原始含税、约束行号、汇总表分类区间。关键参数说明见 references/workflow.md。
配置项要点:
- MAIN/SUM_SHEET:主表与汇总表名
- FEE_ROW:安全文明施工费行(不填自动探测)
- LIMIT/ORIG_INCL:限价上下限
- HIGH_PRICE_THRESHOLD/HIGH_RANGE/NORMAL_RANGE:随机幅度(高单价项加大)
- CONSTRAINTS:价格顺序约束,格式 (描述, [(行号, 排名)]),排名 1=最便宜
- MAIN_CAT_RANGES/SUM_CAT_ROWS:汇总表对齐(不配则跳过)
第 4 步:生成与校验
运行生成器(含自动校验):
python scripts/generate_bids.py --config <配置.py>
脚本输出:明细行数、材料类型数、各份含税总计、以及四项校验(含税区间/同价一致/
顺序约束/唯一性)。任一失败以非零码退出。
第 5 步:独立审计(可选)
对已生成文件单独跑价格顺序审计:
python scripts/audit_ordering.py --config <配置.py>
输出每份文件中违反约束的明细(行号、价格、差额),用于定位修复。
第 6 步:仅校验已有文件
python scripts/generate_bids.py --config <配置.py> --validate-only
价格顺序约束定义
审计核心。识别「同类不同规格」的清单项,按工程常识排序。详见
references/workflow.md 第 5 节。要点:
- 每组 =
(描述, [(行号, 应有排名)]),排名小=便宜 - 仅定义源文件本身已满足的约束(源文件不满足的会被跳过并提示)
- 行号为主表实际 Excel 行号,换工程须重新核对
资源说明
scripts/generate_bids.py:参数化生成器,读取配置生成 N 份文件并自动校验scripts/audit_ordering.py:独立价格顺序审计器references/workflow.md:业务模型、随机化原理、约束定义、校验清单、常见问题assets/config_example.py:基于园区九路的可运行配置示例
依赖与运行
- Python 3.8+,openpyxl,numpy
- 优先用含上述包的 Python(如系统 Python);managed Python 需先在隔离环境装包
- 配置文件为 Python 模块,支持注释,便于标注行号含义
注意事项
- 约束行号、分类区间、安全文明施工费行均与具体源文件结构绑定,换工程必须重新核对
- 唯一性冲突偶发时,增大
NORMAL_RANGE或更换SEEDS即可消除 - 生成后务必确认四项校验全部通过后再交付