Estimate Builder
/install cn-estimate-builder
\r \r
📊 建设工程估算编制系统\r
\r
💼 业务背景\r
\r
问题痛点\r
- 造价构成复杂,人材机管利规税难以厘清\r
- 多层级费用类别统计困难\r
- 费率计算逻辑容易出错\r
- 清单格式要求各地不同\r \r
解决方案\r
结构化估算编制器,依据 GB/T 50500-2024《建设工程工程量清单计价标准》生成专业工程造价估算,支持 proper cost categorization, markups, and export capabilities.\r \r
📐 核心成本类别\r
\r | 类别 | 中文名称 | 说明 |\r |------|---------|------|\r | LABOR | 人工费 | 直接从事施工的生产工人开支的各项费用 |\r | MATERIAL | 材料费 | 建筑工程材料、构件、零件、半成品的费用 |\r | EQUIPMENT | 机械费 | 工程施工机械使用费 |\r | SUBCONTRACTOR | 专业工程暂估价/分包费 | 专业工程分包及暂估价 |\r | OTHER | 其他项目费 | 措施费、规费、税金等 |\r \r
💻 技术实现\r
\r
import pandas as pd\r
from typing import Dict, Any, List, Optional\r
from dataclasses import dataclass, field\r
from datetime import date\r
from enum import Enum\r
\r
\r
class CostCategory(Enum):\r
"""造价类别枚举(符合GB/T 50500-2024)"""\r
人工费 = "labor"\r
材料费 = "material"\r
机械费 = "equipment"\r
专业工程 = "subcontractor"\r
其他项目费 = "other"\r
\r
\r
@dataclass\r
class 估算清单项:\r
"""估算清单行项目"""\r
行号: int\r
工作分解编码: str # WBS编码\r
项目名称: str # 清单项目名称\r
工程量: float\r
单位: str\r
综合单价: float\r
费用类别: CostCategory\r
备注: str = ""\r
\r
@property\r
def 合价(self) -> float:\r
return round(self.工程量 * self.综合单价, 2)\r
\r
\r
@dataclass\r
class 费用汇总:\r
"""分部分项工程费用汇总"""\r
人工费: float = 0\r
材料费: float = 0\r
机械费: float = 0\r
专业工程费: float = 0\r
其他项目费: float = 0\r
\r
@property\r
def 分部分项费(self) -> float:\r
return self.人工费 + self.材料费 + self.机械费 + self.专业工程费 + self.其他项目费\r
\r
\r
@dataclass\r
class 费率调整:\r
"""费率调整项(规费、税金、利润等)"""\r
名称: str\r
费率: float # 小数表示 (0.10 = 10%)\r
基数: str = "直接费" # "直接费" 或 "小计"\r
\r
\r
class 估算编制器:\r
"""建设工程估算编制器"""\r
\r
def __init__(self, 项目名称: str, 项目编号: str = ""):\r
self.项目名称 = 项目名称\r
self.项目编号 = 项目编号\r
self.编制日期 = date.today()\r
self.清单项列表: List[估算清单项] = []\r
self.费率调整列表: List[费率调整] = []\r
self._下一行号 = 1\r
\r
def 添加清单项(self,\r
工作分解编码: str,\r
项目名称: str,\r
工程量: float,\r
单位: str,\r
综合单价: float,\r
费用类别: CostCategory = CostCategory.其他项目费,\r
备注: str = "") -> 估算清单项:\r
"""添加清单行项目"""\r
item = 估算清单项(\r
行号=self._下一行号,\r
工作分解编码=工作分解编码,\r
项目名称=项目名称,\r
工程量=工程量,\r
单位=单位,\r
综合单价=综合单价,\r
费用类别=费用类别,\r
备注=备注\r
)\r
self.清单项列表.append(item)\r
self._下一行号 += 1\r
return item\r
\r
def 添加费率调整(self, 名称: str, 费率: float, 基数: str = "直接费"):\r
"""添加费率调整项(规费、利润、税金等)"""\r
self.费率调整列表.append(费率调整(名称=名称, 费率=费率, 基数=基数))\r
\r
def 设置标准费率(self,\r
管理费: float = 0.10,\r
利润: float = 0.07,\r
规费: float = 0.05,\r
税金: float = 0.09):\r
"""设置标准建设工程费率(依据建标[2013]44号)"""\r
self.费率调整列表 = [\r
费率调整("管理费", 管理费, "直接费"),\r
费率调整("利润", 利润, "小计"),\r
费率调整("规费", 规费, "小计"),\r
费率调整("税金", 税金, "小计")\r
]\r
\r
def 获取费用汇总(self) -> 费用汇总:\r
"""按费用类别获取汇总"""\r
汇总 = 费用汇总()\r
for item in self.清单项列表:\r
费用 = item.合价\r
if item.费用类别 == CostCategory.人工费:\r
汇总.人工费 += 费用\r
elif item.费用类别 == CostCategory.材料费:\r
汇总.材料费 += 费用\r
elif item.费用类别 == CostCategory.机械费:\r
汇总.机械费 += 费用\r
elif item.费用类别 == CostCategory.专业工程费:\r
汇总.专业工程费 += 费用\r
else:\r
汇总.其他项目费 += 费用\r
return 汇总\r
\r
def 计算总造价(self) -> Dict[str, Any]:\r
"""计算含费率调整的估算总造价"""\r
汇总 = self.获取费用汇总()\r
直接费 = 汇总.分部分项费\r
\r
费率明细 = []\r
小计 = 直接费\r
\r
for 费率项 in self.费率调整列表:\r
if 费率项.基数 == "直接费":\r
金额 = 直接费 * 费率项.费率\r
else:\r
金额 = 小计 * 费率项.费率\r
\r
费率明细.append({\r
'名称': 费率项.名称,\r
'费率': f"{费率项.费率 * 100:.1f}%",\r
'金额': round(金额, 2)\r
})\r
小计 += 金额\r
\r
return {\r
'费用汇总': {\r
'人工费': round(汇总.人工费, 2),\r
'材料费': round(汇总.材料费, 2),\r
'机械费': round(汇总.机械费, 2),\r
'专业工程费': round(汇总.专业工程费, 2),\r
'其他项目费': round(汇总.其他项目费, 2),\r
'分部分项工程费': round(直接费, 2)\r
},\r
'费率调整': 费率明细,\r
'规费+利润+税金合计': round(小计 - 直接费, 2),\r
'建筑安装工程费': round(小计, 2)\r
}\r
\r
def 按WBS分组(self) -> Dict[str, List[估算清单项]]:\r
"""按WBS编码前缀分组清单项"""\r
分组结果 = {}\r
for item in self.清单项列表:\r
前缀 = item.工作分解编码.split('.')[0] if '.' in item.工作分解编码 else item.工作分解编码\r
if 前缀 not in 分组结果:\r
分组结果[前缀] = []\r
分组结果[前缀].append(item)\r
return 分组结果\r
\r
def 从DataFrame导入(self, df: pd.DataFrame):\r
"""从DataFrame导入清单项"""\r
for _, row in df.iterrows():\r
self.添加清单项(\r
工作分解编码=str(row.get('WBS编码', '')),\r
项目名称=row['项目名称'],\r
工程量=float(row['工程量']),\r
单位=row['单位'],\r
综合单价=float(row['综合单价']),\r
费用类别=CostCategory(row.get('费用类别', 'other').lower()),\r
备注=row.get('备注', '')\r
)\r
\r
def 导出到DataFrame(self) -> pd.DataFrame:\r
"""导出估算到DataFrame"""\r
data = []\r
for item in self.清单项列表:\r
data.append({\r
'行号': item.行号,\r
'WBS编码': item.工作分解编码,\r
'项目名称': item.项目名称,\r
'工程量': item.工程量,\r
'单位': item.单位,\r
'综合单价': item.综合单价,\r
'合价': item.合价,\r
'费用类别': item.费用类别.value,\r
'备注': item.备注\r
})\r
return pd.DataFrame(data)\r
\r
def 导出到Excel(self, 输出路径: str) -> str:\r
"""导出估算到Excel(符合清单计价格式)"""\r
总造价 = self.计算总造价()\r
\r
with pd.ExcelWriter(输出路径, engine='openpyxl') as writer:\r
# 封面汇总\r
封面数据 = pd.DataFrame([{\r
'项目名称': self.项目名称,\r
'项目编号': self.项目编号,\r
'编制日期': self.编制日期,\r
'清单项数量': len(self.清单项列表),\r
'分部分项工程费': 总造价['费用汇总']['分部分项工程费'],\r
'建筑安装工程费': 总造价['建筑安装工程费']\r
}])\r
封面数据.to_excel(writer, sheet_name='汇总封面', index=False)\r
\r
# 清单明细\r
清单df = self.导出到DataFrame()\r
清单df.to_excel(writer, sheet_name='清单明细', index=False)\r
\r
# 费用构成\r
费用df = pd.DataFrame([总造价['费用汇总']])\r
费用df.to_excel(writer, sheet_name='费用构成', index=False)\r
\r
# 费率调整\r
if 总造价['费率调整']:\r
费率df = pd.DataFrame(总造价['费率调整'])\r
费率df.to_excel(writer, sheet_name='费率调整', index=False)\r
\r
return 输出路径\r
\r
def 校核(self) -> List[str]:\r
"""校核估算常见问题"""\r
问题列表 = []\r
\r
if not self.清单项列表:\r
问题列表.append("估算无清单项")\r
\r
for item in self.清单项列表:\r
if item.工程量 \x3C= 0:\r
问题列表.append(f"行{item.行号}: 工程量无效")\r
if item.综合单价 \x3C 0:\r
问题列表.append(f"行{item.行号}: 综合单价为负")\r
if not item.项目名称:\r
问题列表.append(f"行{item.行号}: 缺少项目名称")\r
\r
if not self.费率调整列表:\r
问题列表.append("未定义费率调整(管理费、利润、规费、税金)")\r
\r
return 问题列表\r
```\r
\r
## 🚀 快速开始\r
\r
```python\r
# 创建估算\r
估算 = 估算编制器("某学校建设项目", "PRJ-2024-001")\r
\r
# 添加清单项(示例:教学楼土建工程)\r
估算.添加清单项("01.01", "平整场地", 5000, "m²", 8.50, CostCategory.其他项目费)\r
估算.添加清单项("02.01", "钢筋混凝土基础", 200, "m³", 680, CostCategory.材料费)\r
估算.添加清单项("02.02", "基础模板", 1500, "m²", 45, CostCategory.人工费)\r
估算.添加清单项("02.03", "土方开挖", 3000, "m³", 28, CostCategory.机械费)\r
估算.添加清单项("03.01", "钢结构工程", 50, "t", 8500, CostCategory.专业工程费)\r
\r
# 设置标准费率(依据建标[2013]44号)\r
估算.设置标准费率(管理费=0.10, 利润=0.07, 规费=0.05, 税金=0.09)\r
\r
# 计算总造价\r
结果 = 估算.计算总造价()\r
print(f"分部分项工程费: ¥{结果['费用汇总']['分部分项工程费']:,.2f}")\r
print(f"建筑安装工程费: ¥{结果['建筑安装工程费']:,.2f}")\r
```\r
\r
## 📋 常见用法\r
\r
### 1. 按费用类别统计\r
```python\r
汇总 = 估算.获取费用汇总()\r
print(f"人工费: ¥{汇总.人工费:,.2f}")\r
print(f"材料费: ¥{汇总.材料费:,.2f}")\r
print(f"机械费: ¥{汇总.机械费:,.2f}")\r
```\r
\r
### 2. 导出到Excel\r
```python\r
估算.导出到Excel("项目估算成果.xlsx")\r
```\r
\r
### 3. 估算校核\r
```python\r
问题 = 估算.校核()\r
for p in 问题:\r
print(f"⚠️ {p}")\r
```\r
\r
## 📚 规范参考\r
\r
| 标准号 | 标准名称 | 适用范围 |\r
|--------|---------|---------|\r
| GB/T 50500-2024 | 建设工程工程量清单计价标准 | 清单编制、计价 |\r
| 建标[2013]44号 | 建筑安装工程费用项目组成 | 费用构成 |\r
| GB/T 51262-2017 | 建筑工程施工质量验收统一标准 | 质量验收 |\r
\r
## 📖 触发场景\r
\r
- 建设工程估算编制\r
- 工程量清单编制\r
- 造价构成分析\r
- 费率计算与调整\r
- 估算成果导出\r
- Make sure OpenClaw is installed (local or Docker)
- Run the install command in chat:
/install cn-estimate-builder - After installation, invoke the skill by name or use
/cn-estimate-builder - Provide required inputs per the skill's parameter spec and get structured output
What is Estimate Builder?
建设工程项目估算编制系统。生成包含人工费、材料费、机械费、分包费、其他费的详细造价分解表,符合GB/T 50500-2024计价标准。 It is an AI Agent Skill for Claude Code / OpenClaw, with 90 downloads so far.
How do I install Estimate Builder?
Run "/install cn-estimate-builder" in the OpenClaw or Claude Code chat to install it in one step — no extra setup required.
Is Estimate Builder free?
Yes, Estimate Builder is completely free, licensed under MIT-0. You can download, install and use it at no cost.
Which platforms does Estimate Builder support?
Estimate Builder is cross-platform and runs anywhere OpenClaw / Claude Code is available (darwin, linux, win32).
Who created Estimate Builder?
It is built and maintained by ruiyongwang (@ruiyongwang); the current version is v1.0.0.