Compare commits

..

10 Commits

Author SHA1 Message Date
ly 32136be5db 增加图QA问答 2025-07-14 15:36:15 +08:00
ly 46552a536f 更新 2025-07-07 15:29:55 +08:00
ly fcb09c04f2 更新 2025-07-07 12:47:34 +08:00
ly b352571e17 上传 2025-07-07 11:25:17 +08:00
ly cfb4f4ea6a 增加WEB入口 2025-07-07 09:32:05 +08:00
ly dc43b69164 增加streamlt界面入口 2025-07-07 08:51:19 +08:00
ly d1c129c691 实现完整功能 2025-07-07 08:23:02 +08:00
ly 35d50305c8 更新 2025-07-04 14:18:16 +08:00
ly 72e4e9ef6f 删除python缓存 2025-07-04 14:03:41 +08:00
ly 3ba0a4b55c 修改没有结果输出BUG 2025-07-04 14:03:08 +08:00
44 changed files with 2107 additions and 708 deletions
+2
View File
@@ -4,3 +4,5 @@ src/__pycache__/*
.vscode/*
.cursor/*
logs/*
cache/*
转化服务/*
+28 -2
View File
@@ -1,16 +1,18 @@
neo4j:
#uri: bolt://10.1.16.39:7687
uri: bolt://localhost:7487
#uri: bolt://localhost:7487
uri: bolt://172.20.0.145:7687
username: neo4j
password: password
index_name: name_vector_index # 向量索引名称,默认 "vector"
keyword_index_name: name_keyword_index # 关键词索引名称,默认 "keyword"
business_object_structure_path: ./data/business_object_structure.md
bowei_api_docs_path: ./data/bowei_api_docs.md
bowei_api_docs_path: ./src/project.py
max_retries: 0
openai:
temperature: 0
api_keys:
- sk-gycpzfjfxldpmqmqvrtgtvtpusnsrscowhscqfbppmjdlzoi
- sk-lhvfliriyohnaspzuoddgulmdiovpbjcdmfdfdvghapprfru
@@ -32,7 +34,31 @@ openai:
#model_name: Qwen/Qwen3-8B
#model_name: deepseek-ai/DeepSeek-V3
openai_qa:
temperature: 0
api_keys:
- sk-gycpzfjfxldpmqmqvrtgtvtpusnsrscowhscqfbppmjdlzoi
- sk-lhvfliriyohnaspzuoddgulmdiovpbjcdmfdfdvghapprfru
- sk-tzxcxzberpdpvszhjfyikepjlgslbtgssypxpmwllgithtwz
- sk-ybhbyjkzdydsllxredzntqdyrderxighdieiayudcubvhxsw
- sk-xtjzktvgrkzikkvetzygzozfyjxzgasednowyjqjeudfqiha
- sk-ufjdohciujtmpfwrrqhiocufexdzqpiotnjwzhbumcpvkpcw
- sk-nvnuzkdgxwzvibtuymwhatfajnerekgsbieqmqadjaqyhkob
- sk-erdnqkazveyiaojrpojawtwlxpnrikhedurlphmyviaixyrg
- sk-xhddshwxrhejbzitozgieightaecdeozqzdgypmedzdydthr
- sk-czilnjaxqwicwoyvfaxgzvqcjhmdzpwvzhbxvnqnvaeocojk
api_key: sk-xlrnesfcuwrpevdwbuhthivpygwyzwbxxsyvhzzwrkpzjduk
api_base: https://api.siliconflow.cn/v1
#api_version: "" # 可选,某些API版本需要指定
#organization: your_organization_id # 可选
api_type: openai # 可选,默认为 openai;如果用 Azure 则为 azure
#model_name: Qwen/Qwen2.5-72B-Instruct
#model_name: Qwen/Qwen3-8B
model_name: deepseek-ai/DeepSeek-V3
openai_coder:
temperature: 0
api_keys:
- sk-gycpzfjfxldpmqmqvrtgtvtpusnsrscowhscqfbppmjdlzoi
- sk-lhvfliriyohnaspzuoddgulmdiovpbjcdmfdfdvghapprfru
+13 -11
View File
@@ -19,7 +19,7 @@ class ProjectToolkit(ABC):
# 项目划分查询方法
@abstractmethod
def get_division_by_name(self, name):
def get_division_by_name(self, name_part):
"""
通过名称获取项目划分对象
@@ -89,7 +89,7 @@ class ProjectToolkit(ABC):
pass
@abstractmethod
def get_quantities_node_by_parent_and_code(self, parent_path, quantity_type=None, code=None):
def get_quantities_node_by_parent_and_code(self, parent_path, quantity_type, code):
"""
通过父节点路径和编码获取工程量对象(定额、主材或设备),包括子节点
@@ -108,14 +108,15 @@ class ProjectToolkit(ABC):
pass
@abstractmethod
def get_quantities_node_by_parent_and_name(self, parent_path, partial_name, quantity_type=None):
def get_quantities_node_by_parent_and_name(self, parent_path, quantity_type, partial_name):
"""
通过父节点路径、模糊节点名称和类型获取工程量对象(主材或者设备),包括子节点
通过父节点路径、类型和模糊节点名称获取工程量对象(主材或者设备),包括子节点
Args:
parent_path (str): 父节点的路径,以'/'分隔的多级节点路径
partial_name (str): 目标节点的模糊或不完整名称
quantity_type (str): 工程量类型('定额'、'主材'、'设备')
partial_name (str): 目标节点的模糊或不完整名称
Returns:
dict: 返回字典,字段包括:
@@ -202,7 +203,7 @@ class ProjectToolkit(ABC):
# 费用表查询方法
@abstractmethod
def get_fee_schedule_on_auxiliary_expense_table(self, table_name, fee_name, fee: str):
def get_fee_schedule_on_auxiliary_expense_table(self, table_name, fee_name, fee_attribute: str):
"""
在辅助费用表中查找费用
@@ -221,7 +222,7 @@ class ProjectToolkit(ABC):
pass
@abstractmethod
def get_fee_schedule_on_other_expense_table(self, table_name, fee_name, fee):
def get_fee_schedule_on_other_expense_table(self, table_name, fee_name, fee_attribute):
"""
在其它费用表中查找费用
@@ -240,7 +241,7 @@ class ProjectToolkit(ABC):
pass
@abstractmethod
def get_fee_schedule_on_land_acquisition_fee_table_table(self, table_name, fee_name, fee):
def get_fee_schedule_on_land_acquisition_fee_table_table(self, table_name, fee_name, fee_attribute):
"""
在其中:场地征用费用表中查找费用
@@ -259,7 +260,7 @@ class ProjectToolkit(ABC):
pass
@abstractmethod
def get_fee_schedule_on_installation_price_difference_table(self, table_name, fee_name, fee):
def get_fee_schedule_on_installation_price_difference_table(self, table_name, fee_name, fee_attribute):
"""
在安装价差费用表中查找费用
@@ -278,7 +279,7 @@ class ProjectToolkit(ABC):
pass
@abstractmethod
def get_fee_schedule_on_Engineering_Cost_table(self, table_name, fee_name, fee):
def get_fee_schedule_on_Engineering_Cost_table(self, table_name, fee_name, fee_attribute):
"""
在工程费用表中查找费用
@@ -687,6 +688,7 @@ class Fee:
self.施工费 = None # xsd:string (可选)
self.单位投资 = None # xsd:string (可选)
class ProjectBuilder:
# 存储注册的工具类
_registry = None
@@ -724,5 +726,5 @@ class ProjectBuilder:
if cls._registry is None:
raise KeyError(f"未注册的类,请先注册类")
return cls._registry(cls._config)
+46
View File
@@ -0,0 +1,46 @@
{"name": "杆塔总基数", "query": "返回项目划分【架空输电线路本体工程/基础工程】下编码包含【YX2-1~7】的所有【定额】的【数量】之和", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n \n def expand_code_range(code_range):\n if '~' not in code_range:\n return code_range\n prefix, range_part = code_range.split('-')\n start, end = map(int, range_part.split('~'))\n return '/'.join([f\"{prefix}-{i}\" for i in range(start, end + 1)])\n \n expanded_codes = expand_code_range('YX2-1~7')\n \n result_dict = project.get_quantities_node_by_parent_and_code(\n parent_path='架空输电线路本体工程/基础工程',\n quantity_type='定额',\n code=expanded_codes\n )\n \n status = result_dict.get('status', False)\n if not status:\n return result_dict\n \n data = result_dict.get('data', [])\n if not isinstance(data, list):\n data = [data]\n \n total_quantity = 0.0\n for item in data:\n if isinstance(item, dict) and '数量' in item:\n try:\n quantity = float(item['数量'])\n total_quantity += quantity\n except (ValueError, TypeError):\n continue\n \n return {\n 'code': 200,\n 'message': 'Ok',\n 'status': True,\n 'data': {'total_quantity': total_quantity}\n }"}
{"name": "角钢塔_塔材量", "query": "返回项目划分【架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立】及名称包含【角钢】的所有【主材】的【数量】之和", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n division_path = \"架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立\"\n result = project.get_quantities_node_by_parent_and_name(division_path, \"主材\", \"角钢\")\n if not result.get('status', False):\n return result\n \n total_quantity = 0.0\n for material in result.get('data', []):\n if isinstance(material, dict) and material.get('类型') == '主材' and '角钢' in material.get('name', ''):\n try:\n quantity = float(material.get('数量', 0))\n total_quantity += quantity\n except (ValueError, TypeError):\n continue\n \n return {\n 'code': 200,\n 'message': 'Ok',\n 'status': True,\n 'data': total_quantity\n }"}
{"name": "角钢塔_其中:高强钢塔材量", "query": "返回项目划分【架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立】及名称包含【角钢、高强】的所有【主材】的【数量】之和", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n division_path = \"架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立\"\n result = project.get_division_item_by_path(division_path)\n if not result.get('status', False):\n return result\n \n parent_path = division_path\n quantity_type = \"主材\"\n partial_name = \"角钢、高强\"\n result = project.get_quantities_node_by_parent_and_name(parent_path, quantity_type, partial_name)\n if not result.get('status', False):\n return result\n \n materials = result.get('data', [])\n total_quantity = 0.0\n for material in materials:\n if isinstance(material, Material):\n try:\n quantity = float(material.数量) if material.数量 else 0.0\n total_quantity += quantity\n except (ValueError, TypeError):\n continue\n \n return {\n 'code': 200,\n 'message': 'Ok',\n 'status': True,\n 'data': total_quantity\n }"}
{"name": "角钢塔_塔材装材费_元", "query": "返回项目划分【架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立】及名称包含【角钢】的所有【主材】的【单价】之和", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n division_path = \"架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立\"\n result = project.get_division_item_by_path(division_path)\n if not result.get('status', False):\n return result\n \n division_data = result.get('data', {})\n if not division_data:\n return {'code': 201, 'message': '项目划分节点不存在', 'status': False, 'data': []}\n \n parent_path = division_path\n quantity_type = \"主材\"\n partial_name = \"角钢\"\n result = project.get_quantities_node_by_parent_and_name(parent_path, quantity_type, partial_name)\n if not result.get('status', False):\n return result\n \n materials = result.get('data', [])\n if not materials:\n return {'code': 201, 'message': '未找到匹配的主材', 'status': False, 'data': []}\n \n total_price = 0.0\n for material in materials:\n if isinstance(material, dict):\n price_str = material.get('单价含税', '0')\n else:\n price_str = getattr(material, '单价含税', '0')\n try:\n price = float(price_str) if price_str else 0.0\n total_price += price\n except ValueError:\n continue\n \n return {'code': 200, 'message': 'Ok', 'status': True, 'data': total_price}"}
{"name": "角钢塔_其中:高强钢塔材费用_元", "query": "返回项目划分【架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立】及名称包含【角钢、高强】的所有【主材】的【单价】之和", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n division_path = \"架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立\"\n result = project.get_quantities_node_by_parent_and_name(division_path, \"主材\", \"角钢、高强\")\n if not result.get('status', False):\n return result\n \n total_price = 0.0\n for material in result.get('data', []):\n if isinstance(material, Material):\n try:\n price = float(material.单价含税) if material.单价含税 else 0.0\n total_price += price\n except (ValueError, TypeError):\n continue\n \n return {\n 'code': 200,\n 'message': 'Ok',\n 'status': True,\n 'data': total_price\n }"}
{"name": "钢管塔_塔材量", "query": "返回项目划分【架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立】及名称包含【钢管塔】的所有【主材】的【数量】之和", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n division_path = \"架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立\"\n result = project.get_division_item_by_path(division_path)\n if not result.get('status', False):\n return result\n \n parent_path = division_path\n quantity_type = \"主材\"\n partial_name = \"钢管塔\"\n result = project.get_quantities_node_by_parent_and_name(parent_path, quantity_type, partial_name)\n if not result.get('status', False):\n return result\n \n materials = result.get('data', [])\n total_quantity = 0.0\n for material in materials:\n if isinstance(material, dict) and material.get('类型') == '1' and '钢管塔' in material.get('name', ''):\n try:\n quantity = float(material.get('数量', 0))\n total_quantity += quantity\n except (ValueError, TypeError):\n continue\n \n return {\n 'code': 200,\n 'message': 'Ok',\n 'status': True,\n 'data': total_quantity\n }"}
{"name": "钢管塔_钢管价格_元", "query": "返回项目划分【架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立】及名称包含【钢管塔】的所有【主材】的【单价】之和", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n path = \"架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立\"\n result = project.get_quantities_node_by_parent_and_name(path, \"主材\", \"钢管塔\")\n if not result.get('status', False):\n return result\n \n total_price = 0.0\n for material in result.get('data', []):\n if isinstance(material, Material) and \"钢管塔\" in material.name:\n try:\n price = float(material.单价含税) if material.单价含税 else 0.0\n total_price += price\n except (ValueError, TypeError):\n continue\n \n return {\n 'code': 200,\n 'message': 'Ok',\n 'status': True,\n 'data': total_price\n }"}
{"name": "钢管杆_塔材量", "query": "返回项目划分【架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立】及名称包含【钢管杆】的所有【主材】的【数量】之和", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n division_path = \"架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立\"\n result = project.get_division_item_by_path(division_path)\n if not result.get('status', False):\n return result\n \n division_data = result.get('data', {})\n if not division_data:\n return {'code': 201, 'message': '未找到指定项目划分', 'status': False, 'data': []}\n \n parent_path = division_path\n quantity_type = \"主材\"\n partial_name = \"钢管杆\"\n result = project.get_quantities_node_by_parent_and_name(parent_path, quantity_type, partial_name)\n if not result.get('status', False):\n return result\n \n materials = result.get('data', [])\n if not materials:\n return {'code': 201, 'message': '未找到包含\"钢管杆\"的主材', 'status': False, 'data': []}\n \n total_quantity = 0.0\n for material in materials:\n if isinstance(material, dict):\n quantity_str = material.get('数量', '0')\n else:\n quantity_str = getattr(material, '数量', '0')\n try:\n quantity = float(quantity_str)\n total_quantity += quantity\n except ValueError:\n continue\n \n return {'code': 200, 'message': 'Ok', 'status': True, 'data': total_quantity}"}
{"name": "钢管杆_钢管价格_元", "query": "返回项目划分【架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立】及名称包含【钢管杆】的所有【主材】的【单价】之和", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n division_path = \"架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立\"\n result = project.get_quantities_node_by_parent_and_name(division_path, \"主材\", \"钢管杆\")\n if not result.get('status', False):\n return result\n \n total_price = 0.0\n materials = result.get('data', [])\n for material in materials:\n if isinstance(material, Material) and \"单价\" in material.__dict__:\n try:\n price = float(material.单价)\n total_price += price\n except (ValueError, TypeError):\n continue\n \n return {\n 'code': 200,\n 'message': 'Ok',\n 'status': True,\n 'data': total_price\n }"}
{"name": "导线及线材_分裂数", "query": "返回项目划分【架空输电线路本体工程/架线工程】下编码包含【['YX5-67', 'YX5-68', 'YX5-69', 'YX5-78', 'YX5-79', 'YX5-59', 'YX5-60', 'YX5-61', 'YX5-62', 'YX5-63', 'YX5-64', 'YX5-65', 'YX5-66', 'YX5-74', 'YX5-75', 'YX5-76', 'YX5-77', 'YX5-52', 'YX5-53', 'YX5-54', 'YX5-55', 'YX5-56', 'YX5-57', 'YX5-58', 'YX5-70', 'YX5-71', 'YX5-72', 'YX5-73', 'YX5-14', 'YX5-15', 'YX5-16', 'YX5-17', 'YX5-43', 'YX5-44', 'YX5-45', 'YX5-46', 'YX5-47', 'YX5-48', 'YX5-49', 'YX5-50', 'YX5-51', 'YX5-10', 'YX5-11', 'YX5-12', 'YX5-13', 'YX5-38', 'YX5-39', 'YX5-40', 'YX5-41', 'YX5-42', 'YX5-8', 'YX5-9']】的所有【定额】的【参数】之和", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n codes = ['YX5-67', 'YX5-68', 'YX5-69', 'YX5-78', 'YX5-79', 'YX5-59', 'YX5-60', 'YX5-61', 'YX5-62', 'YX5-63', 'YX5-64', 'YX5-65', 'YX5-66', 'YX5-74', 'YX5-75', 'YX5-76', 'YX5-77', 'YX5-52', 'YX5-53', 'YX5-54', 'YX5-55', 'YX5-56', 'YX5-57', 'YX5-58', 'YX5-70', 'YX5-71', 'YX5-72', 'YX5-73', 'YX5-14', 'YX5-15', 'YX5-16', 'YX5-17', 'YX5-43', 'YX5-44', 'YX5-45', 'YX5-46', 'YX5-47', 'YX5-48', 'YX5-49', 'YX5-50', 'YX5-51', 'YX5-10', 'YX5-11', 'YX5-12', 'YX5-13', 'YX5-38', 'YX5-39', 'YX5-40', 'YX5-41', 'YX5-42', 'YX5-8', 'YX5-9']\n total = 0.0\n path = '架空输电线路本体工程/架线工程'\n for code in codes:\n result_dict = project.get_quantities_node_by_parent_and_code(path, '定额', code)\n if not result_dict.get('status', False):\n return result_dict\n data = result_dict.get('data', [])\n if isinstance(data, list):\n for item in data:\n if hasattr(item, '参数'):\n total += float(getattr(item, '参数', 0))\n elif hasattr(data, '参数'):\n total += float(getattr(data, '参数', 0))\n return {'code': 200, 'message': 'Ok', 'status': True, 'data': total}"}
{"name": "导线及线材_其中:节能导线量", "query": "返回项目划分【架空输电线路本体工程/架线工程/导地线架设@@架空输电线路本体工程/架线工程/导地线跨越架设】及名称包含【高导电率】的所有【主材】的【数量】之和", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n total_quantity = 0.0\n \n division_paths = [\n \"架空输电线路本体工程/架线工程/导地线架设\",\n \"架空输电线路本体工程/架线工程/导地线跨越架设\"\n ]\n \n for path in division_paths:\n quantities_result = project.get_quantities_node_by_parent_and_name(\n parent_path=path,\n quantity_type=\"主材\",\n partial_name=\"高导电率\"\n )\n \n if not quantities_result.get('status', False):\n return quantities_result\n \n materials = quantities_result.get('data', [])\n for material in materials:\n if isinstance(material, Material) and \"高导电率\" in material.name:\n try:\n quantity = float(material.数量) if material.数量 else 0.0\n total_quantity += quantity\n except (ValueError, TypeError):\n continue\n \n return {\n 'code': 200,\n 'message': 'Ok',\n 'status': True,\n 'data': total_quantity\n }"}
{"name": "导线及线材_导线装材费_元", "query": "返回项目划分【架空输电线路本体工程/架线工程/导地线架设@@架空输电线路本体工程/架线工程/导地线跨越架设】及名称包含【线】的所有【主材】的【单价】之和", "code": "```python\ndef project_get_calculate_function():\n project = ProjectBuilder.build()\n total_price = 0.0\n \n division_paths = [\n \"架空输电线路本体工程/架线工程/导地线架设\",\n \"架空输电线路本体工程/架线工程/导地线跨越架设\"\n ]\n \n for path in division_paths:\n quantities_result = project.get_quantities_node_by_parent_and_name(\n parent_path=path,\n quantity_type=\"主材\",\n partial_name=\"线\"\n )\n \n if not quantities_result.get('status', False):\n return quantities_result\n \n materials = quantities_result.get('data', [])\n for material in materials:\n if isinstance(material, Material) and \"线\" in material.name:\n try:\n price = float(material.单价含税) if material.单价含税 else 0.0\n total_price += price\n except (ValueError, TypeError):\n continue\n \n return {\n 'code': 200,\n 'message': 'Ok',\n 'status': True,\n 'data': total_price\n }\n```"}
{"name": "导线及线材_其中:节能导线费用_元", "query": "返回项目划分【架空输电线路本体工程/架线工程/导地线架设@@架空输电线路本体工程/架线工程/导地线跨越架设】及名称包含【高导电率】的所有【主材】的【单价】之和", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n total_price = 0.0\n \n division_paths = [\n \"架空输电线路本体工程/架线工程/导地线架设\",\n \"架空输电线路本体工程/架线工程/导地线跨越架设\"\n ]\n \n for path in division_paths:\n quantities_result = project.get_quantities_node_by_parent_and_name(\n parent_path=path,\n quantity_type=\"主材\",\n partial_name=\"高导电率\"\n )\n \n if not quantities_result.get('status', False):\n continue\n \n materials = quantities_result.get('data', [])\n for material in materials:\n if isinstance(material, Material) and \"高导电率\" in material.name:\n try:\n price = float(material.单价含税) if material.单价含税 else 0.0\n total_price += price\n except (ValueError, AttributeError):\n continue\n \n return {\n 'code': 200,\n 'message': 'Ok',\n 'status': True,\n 'data': total_price\n }"}
{"name": "导线及线材_导线类型", "query": "返回项目划分【架空输电线路本体工程/架线工程/导地线架设@@架空输电线路本体工程/架线工程/导地线跨越架设@@架空输电线路本体工程/架线工程/其他架线工程】及名称包含【['钢芯铝绞线', '铝包钢芯铝绞线', '中强度铝合金绞线', '铝合金芯铝绞线', '铝合金芯高导电率铝绞线', '钢芯高导电率铝绞线', '特高强度钢芯铝合金绞线', '扩径导线', '耐热导线', '碳纤维导线']】的所有【主材】的【参数】之和", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n division_paths = [\n \"架空输电线路本体工程/架线工程/导地线架设\",\n \"架空输电线路本体工程/架线工程/导地线跨越架设\",\n \"架空输电线路本体工程/架线工程/其他架线工程\"\n ]\n material_names = [\n '钢芯铝绞线', '铝包钢芯铝绞线', '中强度铝合金绞线', '铝合金芯铝绞线',\n '铝合金芯高导电率铝绞线', '钢芯高导电率铝绞线', '特高强度钢芯铝合金绞线',\n '扩径导线', '耐热导线', '碳纤维导线'\n ]\n \n total_params = 0.0\n \n for path in division_paths:\n result = project.get_quantities_node_by_parent_and_name(path, \"主材\", \"\")\n if not result.get('status', False):\n continue\n \n materials = result.get('data', [])\n for material in materials:\n if isinstance(material, dict):\n name = material.get('name', '')\n if name in material_names:\n params = float(material.get('参数', 0.0))\n total_params += params\n \n return {\n 'code': 200,\n 'message': 'Ok',\n 'status': True,\n 'data': total_params\n }"}
{"name": "基础钢材量", "query": "返回项目划分【架空输电线路本体工程/基础工程/基础砌筑】及名称包含【圆钢】的所有【主材】的【数量】之和", "code": "根据用户问题和上下文信息,我将生成对应的Python代码:\n\n```python\ndef project_get_calculate_function():\n project = ProjectBuilder.build()\n \n division_path = \"架空输电线路本体工程/基础工程/基础砌筑\"\n quantity_type = \"主材\"\n partial_name = \"圆钢\"\n \n result = project.get_quantities_node_by_parent_and_name(division_path, quantity_type, partial_name)\n if not result.get('status', False):\n return result\n \n materials = result.get('data', [])\n if not isinstance(materials, list):\n materials = [materials]\n \n total_quantity = 0.0\n for material in materials:\n if not isinstance(material, dict):\n continue\n quantity_str = material.get('数量', '0')\n try:\n quantity = float(quantity_str)\n total_quantity += quantity\n except (ValueError, TypeError):\n continue\n \n return {\n 'code': 200,\n 'message': 'Ok',\n 'status': True,\n 'data': {\n 'total_quantity': total_quantity,\n 'unit': '个' if materials else '',\n 'material_count': len(materials)\n }\n }\n```"}
{"name": "基础钢材价格", "query": "返回项目划分【架空输电线路本体工程/基础工程/基础砌筑】及名称包含【圆钢】的所有【主材】的【单价】之和", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n division_path = \"架空输电线路本体工程/基础工程/基础砌筑\"\n result = project.get_quantities_node_by_parent_and_name(division_path, \"主材\", \"圆钢\")\n if not result.get('status', False):\n return result\n \n materials = result.get('data', [])\n total_price = 0.0\n \n for material in materials:\n if isinstance(material, Material) and \"圆钢\" in material.name:\n try:\n price = float(material.单价含税) if material.单价含税 else 0.0\n total_price += price\n except (ValueError, AttributeError):\n continue\n \n return {\n 'code': 200,\n 'message': 'Ok',\n 'status': True,\n 'data': total_price\n }"}
{"name": "本体费用合计_元", "query": "从【工程费用】中获取【架空输电线路本体工程】的【合计费】的值", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_schedule_on_Engineering_Cost_table(\"工程费用表\", \"架空输电线路本体工程\", \"合计费\")\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "本体工程人工费_本体_元", "query": "返回项目划分【架空输电线路本体工程】下取费名称等于【人工费】的费用", "code": "根据用户问题和上下文信息,我们需要获取项目划分\"架空输电线路本体工程\"下取费名称为\"人工费\"的费用。根据工程数据访问库,最匹配的方法是`get_fee_table_by_project_division`。\n\n```python\ndef project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_table_by_project_division(\n project_division_path=\"架空输电线路本体工程\",\n fee_name=\"人工费\"\n )\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return result_dict\n else:\n return result_dict\n```"}
{"name": "本体工程人工费_调试_元", "query": "返回项目划分【架空输电线路本体工程】下取费名称等于【人工费】的费用", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_table_by_project_division(\"架空输电线路本体工程\", \"人工费\")\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "本体工程机械费_本体_元", "query": "返回项目划分【架空输电线路本体工程】下取费名称等于【施工机械使用费】的费用", "code": "根据用户问题和上下文信息,我将生成对应的Python代码:\n\n```python\ndef project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_table_by_project_division(\n project_division_path=\"架空输电线路本体工程\",\n fee_name=\"施工机械使用费\"\n )\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return result_dict\n else:\n return result_dict\n```"}
{"name": "本体工程机械费_调试_元", "query": "返回项目划分【架空输电线路本体工程】下取费名称等于【施工机械使用费】的费用", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_table_by_project_division(\"架空输电线路本体工程\", \"施工机械使用费\")\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "基础工程费用_元", "query": "返回项目划分【架空输电线路本体工程/基础工程】下取费名称等于【合计】的费用", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_table_by_project_division(\"架空输电线路本体工程/基础工程\", \"合计\")\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "杆塔工程费用_元", "query": "返回项目划分【架空输电线路本体工程/杆塔工程】下取费名称等于【合计】的费用", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_table_by_project_division(\"架空输电线路本体工程/杆塔工程\", \"合计\")\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "接地工程费用_元", "query": "返回项目划分【架空输电线路本体工程/接地工程】下取费名称等于【合计】的费用", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_table_by_project_division(\"架空输电线路本体工程/接地工程\", \"合计\")\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "架线工程费用_元", "query": "返回项目划分【架空输电线路本体工程/架线工程】下取费名称等于【合计】的费用", "code": "根据用户问题和上下文信息,我们需要使用`get_fee_table_by_project_division`方法来获取项目划分路径下取费名称为\"合计\"的费用。以下是生成的Python代码:\n\n```python\ndef project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_table_by_project_division(\"架空输电线路本体工程/架线工程\", \"合计\")\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return result_dict\n else:\n return result_dict\n```"}
{"name": "附件工程费用_元", "query": "返回项目划分【架空输电线路本体工程/附件安装工程】下取费名称等于【合计】的费用", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_table_by_project_division(\"架空输电线路本体工程/附件安装工程\", \"合计\")\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "辅助工程费用_元", "query": "返回项目划分【架空输电线路本体工程/辅助工程】下取费名称等于【合计】的费用", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_table_by_project_division(\"架空输电线路本体工程/辅助工程\", \"合计\")\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "辅助工程费用_调试_元", "query": "返回项目划分【架空输电线路本体工程/辅助工程】下取费名称等于【合计】的费用", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_table_by_project_division(\"架空输电线路本体工程/辅助工程\", \"合计\")\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "辅助设施工程_元", "query": "从【工程费用】中获取【辅助设施工程】的【合计费】的值", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_schedule_on_Engineering_Cost_table(\"工程费用\", \"辅助设施工程\", \"合计费\")\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return {'status': True, 'code': code, 'message': message, 'data': data}\n else:\n return {'status': False, 'code': code, 'message': message, 'data': data}"}
{"name": "其他费用合计_元", "query": "从【工程费用】中获取【其他费用】的【合计费】的值", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_schedule_on_Engineering_Cost_table(\"工程费用表\", \"其他费用\", \"合计费\")\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "建场费合计_元", "query": "从【其他费用】中获取【建设场地征用及清理费】的值", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_schedule_on_other_expense_table(\n table_name=\"其他费用表\",\n fee_name=\"建设场地征用及清理费\",\n fee_attribute=\"amount\"\n )\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "项目建设管理费合计_元", "query": "从【其他费用】中获取【项目建设管理费】的值", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_schedule_on_other_expense_table('其他费用表', '项目建设管理费', 'amount')\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return {'status': True, 'data': data, 'message': message, 'code': code}\n else:\n return {'status': False, 'data': {}, 'message': message, 'code': code}"}
{"name": "其中:工程监理费_元", "query": "从【其他费用】中获取【工程监理费】的值", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_schedule_on_other_expense_table('其他费用表', '工程监理费', 'amount')\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return {'status': True, 'data': data}\n else:\n return {'status': False, 'message': message, 'code': code}"}
{"name": "项目建设技术服务费合计_元", "query": "从【其他费用】中获取【项目建设技术服务费】的值", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_schedule_on_other_expense_table('其他费用表', '项目建设技术服务费', 'amount')\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "其中:项目前期工作费_元", "query": "从【其他费用】中获取【项目前期工作费】的值", "code": "根据用户问题和上下文信息,我们需要从\"其他费用\"中获取\"项目前期工作费\"的值。根据上下文信息,这涉及到\"其他费用表\"和\"项目前期工作费\"两个节点,且\"项目前期工作费\"是\"其他费用表\"的子节点。\n\n最匹配的工程数据访问库函数是`get_fee_schedule_on_other_expense_table`,因为它专门用于在其他费用表中查找费用。\n\n```python\ndef project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_schedule_on_other_expense_table(\n table_name=\"其他费用表\",\n fee_name=\"项目前期工作费\",\n fee_attribute=\"amount\"\n )\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return result_dict\n else:\n return result_dict\n```"}
{"name": "其中:勘察费_元", "query": "从【其他费用】中获取【勘察费】的值", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_schedule_on_other_expense_table('其他费用表', '勘察费', 'amount')\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return {'status': True, 'data': data}\n else:\n return {'status': False, 'message': message, 'code': code}"}
{"name": "其中:设计费_元", "query": "从【其他费用】中获取【设计费】的值", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_schedule_on_other_expense_table('其他费用表', '设计费', 'amount')\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "其中:工程建设检测费_元", "query": "从【其他费用】中获取【工程建设检测费】的值", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_schedule_on_other_expense_table('其他费用表', '工程建设检测费', 'amount')\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return {'status': True, 'data': data}\n else:\n return {'status': False, 'message': message, 'code': code}"}
{"name": "生产准备费_元", "query": "从【其他费用】中获取【生产准备费】的值", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_schedule_on_other_expense_table('其他费用表', '生产准备费', 'amount')\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return {'status': True, 'code': code, 'message': message, 'data': data}\n else:\n return {'status': False, 'code': code, 'message': message, 'data': data}"}
{"name": "其中:安全文明施工费_线路_元", "query": "返回项目划分【架空输电线路本体工程】下取费名称等于【安全文明施工费】的费用", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_table_by_project_division(\"架空输电线路本体工程\", \"安全文明施工费\")\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "其中:安全文明施工费_调试_元", "query": "返回项目划分【架空输电线路本体工程】下取费名称等于【安全文明施工费】的费用", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_table_by_project_division(\"架空输电线路本体工程\", \"安全文明施工费\")\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "基本预备费_元", "query": "从【工程费用】中获取【基本预备费】的【合计费】的值", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_schedule_on_Engineering_Cost_table(\"工程费用表\", \"基本预备费\", \"合计费\")\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "静态投资_元", "query": "从【工程费用】中获取【工程静态投资(一~七项合计)】的【合计费】的值", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_schedule_on_Engineering_Cost_table('工程费用表', '工程静态投资(一~七项合计)', '合计费')\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return {'status': True, 'code': code, 'message': message, 'data': data}\n else:\n return {'status': False, 'code': code, 'message': message, 'data': data}"}
{"name": "建设期利息_元", "query": "从【工程费用】中获取【建设期贷款利息】的【合计费】的值", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_schedule_on_Engineering_Cost_table('工程费用表', '建设期贷款利息', '合计费')\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return {'status': True, 'code': code, 'message': message, 'data': data}\n else:\n return {'status': False, 'code': code, 'message': message, 'data': {}}"}
{"name": "动态投资_元", "query": "从【工程费用】中获取【工程动态投资(一~八项合计)】的【合计费】的值", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_schedule_on_Engineering_Cost_table(\"工程费用表\", \"工程动态投资(一~八项合计)\", \"合计费\")\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "增值税抵扣税额_元", "query": "从【工程费用】中获取【其中:可抵扣增值税额】的【合计费】的值", "code": "根据用户问题和上下文信息,我们需要从工程费用表中获取\"其中:可抵扣增值税额\"的\"合计费\"值。根据上下文信息,这是一个三级嵌套的费用结构:工程费用 → 其中:可抵扣增值税额 → 合计费。\n\ndef project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_schedule_on_Engineering_Cost_table(\n table_name=\"工程费用表\",\n fee_name=\"其中:可抵扣增值税额/合计费\",\n fee_attribute=\"合计费\"\n )\n status = result_dict.get('status', False)\n if not status:\n raise Exception(f\"获取费用失败: {result_dict.get('message', '未知错误')}\")\n return result_dict"}
+1 -1
View File
@@ -76,7 +76,7 @@ def main():
knowledge_retriever = Neo4jRawRetriever(neo4j_conf)
code_executor = CodeExecutor(prompt_manager.prompts, llm_client_coder)
code_executor = CodeExecutor(prompt_manager.prompts, llm_client_coder, config.max_retries)
dialog_manager = DialogManager(
llm_client,
+1032
View File
File diff suppressed because it is too large Load Diff
+245
View File
@@ -0,0 +1,245 @@
import streamlit as st
import asyncio
import time
from datetime import datetime
import logging
from typing import List, Tuple, Optional, Dict, Any
import sys
import os
# 将当前路径添加到系统路径,确保可以导入其他模块
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
# 配置日志
current_file = os.path.splitext(os.path.basename(__file__))[0]
now_str = datetime.now().strftime("%Y%m%d%H%M%S")
log_filename = f"{current_file}_{now_str}.log"
# 确保日志目录存在并设置在logs目录下
log_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), "logs")
os.makedirs(log_dir, exist_ok=True)
logging.basicConfig(
level=logging.DEBUG,
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
handlers=[
logging.FileHandler(os.path.join(log_dir, log_filename), encoding="utf-8"),
logging.StreamHandler()
],
)
logger = logging.getLogger(current_file)
def setup_logger(logger_name):
"""
设置指定名称的logger,将其级别设置为WARNING并禁用传播
:param logger_name: logger的名称
"""
logger = logging.getLogger(logger_name)
logger.setLevel(logging.WARNING) # 设置httpcore及其子模块的级别
logger.propagate = False # 可选:禁用传播(防止被根logger处理)
return logger
logger_names = ["httpx", "openai", "langsmith.client", "neo4j", "urllib3", "httpcore"]
for name in logger_names:
setup_logger(name)
#from langfuse import Langfuse
#from langfuse.langchain import CallbackHandler
from src.code_executor import CodeExecutor
from src.config import Config
#langfuse = Langfuse(
# public_key="pk-lf-4c2b8e97-dd44-41be-bd35-a643cdc8d778",
# secret_key="sk-lf-d00b0882-cd91-4df7-b3a7-658d9d394568",
# host="http://10.1.6.34:3000"
#)
#langfuse_handler = CallbackHandler()
langfuse_handler = None
import os
# Update this with your self-hosted endpoint
os.environ["PHOENIX_COLLECTOR_ENDPOINT"] = "http://10.1.6.34:6006/v1/traces"
import phoenix as px
from phoenix.otel import register
from openinference.instrumentation.langchain import LangChainInstrumentor
# configure the Phoenix tracer
tracer_provider = register(
endpoint="http://10.1.6.34:6006/v1/traces",
project_name="my-llm-app", # Default is 'default'
auto_instrument=True, # See 'Trace all calls made to a library' below
verbose=True
)
#tracer = tracer_provider.get_tracer(__name__)
LangChainInstrumentor(tracer_provider=tracer_provider).instrument(skip_dep_check=False)
# 页面配置
st.set_page_config(
page_title="博微造价工程数据问答系统",
page_icon="📊",
layout="wide",
)
# 初始化会话状态
if "messages" not in st.session_state:
st.session_state.messages = []
if "processing" not in st.session_state:
st.session_state.processing = False
# 加载配置和初始化组件
@st.cache_resource
def initialize_components():
"""加载配置并初始化必要组件"""
config = Config()
# 导入必要模块
from src.multi_llm_client import MultiAPIKeyChatOpenAI
from src.prompt_manager import PromptManager
from src.dialog_manager import DialogManager
from src.document_loader import load_file
from src.neo4j_raw_retriever import Neo4jRawRetriever
from src.embedding_client import EmbeddingClient
from langchain_neo4j import Neo4jGraph
from src.engineeringqaagent import EngineeringQAAgent
# 初始化LLM客户端
llm_client = MultiAPIKeyChatOpenAI(config.openai)
llm_client_coder = MultiAPIKeyChatOpenAI(config.openai_coder)
llm_client_qa = MultiAPIKeyChatOpenAI(config.openai_qa)
# 初始化提示词管理器
prompt_manager = PromptManager()
# 初始化代码执行器 - 设置最大重试次数为3
code_executor = CodeExecutor(prompt_manager.prompts, llm_client_coder, max_retries=3)
# 加载API文档
api_docs_path = config.bowei_api_docs_path
bowei_api_docs = load_file(api_docs_path)
# 加载业务对象结构
business_structure_path = config.business_object_structure_path
business_structure = load_file(business_structure_path)
# 初始化嵌入客户端
embedding_client = EmbeddingClient(config.openai)
# 初始化知识检索器
knowledge_retriever = Neo4jRawRetriever(config.neo4j_conf)
# 初始化Neo4jGraph
graph = Neo4jGraph(
url=config.neo4j_conf.get("uri"),
username=config.neo4j_conf.get("username"),
password=config.neo4j_conf.get("password")
)
# 初始化EngineeringQAAgent
qa_agent = EngineeringQAAgent(llm_client_qa, embedding_client, graph, None, callbacks=[langfuse_handler] if langfuse_handler else None)
# 初始化对话管理器
dialog_manager = DialogManager(
llm_client,
business_structure,
bowei_api_docs,
code_executor,
knowledge_retriever,
prompt_manager,
)
st.session_state.dialog_manager = dialog_manager
st.session_state.qa_agent = qa_agent
print('初始化组件完成')
return code_executor, config
# 初始化组件
try:
code_executor, config = initialize_components()
except Exception as e:
st.error(f"初始化组件失败: {str(e)}")
st.stop()
# 页面标题
st.title("博微造价工程数据问答系统")
st.markdown("---")
# 侧边栏
with st.sidebar:
st.header("系统信息")
st.info("博微造价工程数据问答系统是一个基于LLM的智能工具,可以帮助您生成并执行Python代码来回答问题。")
st.markdown("### 使用说明")
st.markdown("1. 在输入框中输入您的问题")
st.markdown("2. 系统将生成并执行相关代码")
st.markdown("3. 查看执行结果和生成的代码")
st.markdown("---")
if st.button("清空对话历史"):
st.session_state.messages = []
st.rerun()
# 显示聊天历史
for message in st.session_state.messages:
with st.chat_message(message["role"]):
st.write(message["content"])
# 处理用户问题
async def process_user_question(user_question):
"""处理用户输入的问题"""
st.session_state.processing = True
# 将用户问题添加到会话历史
st.session_state.messages.append({"role": "user", "content": user_question})
# 显示用户消息
with st.chat_message("user"):
st.write(user_question)
# 显示系统思考中消息
with st.chat_message("assistant"):
thinking_placeholder = st.empty()
thinking_placeholder.markdown("🤔 思考中...")
# 使用EngineeringQAAgent处理用户问题
try:
# 获取QA代理
qa_agent = st.session_state.get('qa_agent')
if not qa_agent:
raise Exception("问答代理未初始化")
# 使用EngineeringQAAgent处理问题
answer = qa_agent.ask(user_question)
import re
cleaned_answer = re.sub(r'`{3}', '', answer, flags=re.DOTALL) # 跨行匹配
# 显示回答
thinking_placeholder.markdown(cleaned_answer)
# 将回答添加到会话历史
st.session_state.messages.append({"role": "assistant", "content": answer})
except Exception as e:
thinking_placeholder.markdown(f"处理问题时出错: {str(e)}")
logger.error(f"处理问题时出错: {str(e)}")
st.session_state.messages.append({"role": "assistant", "content": f"处理问题时出错: {str(e)}"})
st.session_state.processing = False
# 用户输入框
if not st.session_state.processing:
user_question = st.chat_input("请输入您的问题...")
if user_question:
asyncio.run(process_user_question(user_question))
if __name__ == "__main__":
# Streamlit运行此文件时的入口点
pass
+2 -1
View File
@@ -5,4 +5,5 @@ pyyaml
neo4j
langchain-neo4j
langgraph
chardet
chardet
streamlit-textcomplete
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+70 -39
View File
@@ -12,23 +12,11 @@ from src.project import ProjectBuilder, ProjectToolkit
import sys
import io
import traceback
import importlib
current_file = os.path.splitext(os.path.basename(__file__))[0]
now_str = datetime.now().strftime("%Y%m%d%H%M%S")
log_filename = f"{current_file}_{now_str}.log"
logging.basicConfig(
level=logging.DEBUG,
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
handlers=[
logging.FileHandler(os.path.join("logs", log_filename), encoding="utf-8"),
logging.StreamHandler()
],
)
logger = logging.getLogger(current_file)
class CodeExecutor:
def __init__(self, prompts, llm_client, max_retries):
self.llm_client = llm_client
@@ -36,46 +24,89 @@ class CodeExecutor:
self.max_retries = max_retries if max_retries >= 1 else 1
self.output_parser = StrOutputParser()
def generate_code(self, user_request: str, context: str = "", bowei_api_docs: str = "") -> str:
def generate_code(self, user_request: str, context: str = "", bowei_api_docs: str = "") -> dict:
logger.info(f"开始生成代码,访问请求:{user_request}")
prompt = self.prompts.code_gen_prompt.format_prompt(
user_request=user_request, context=context, bowei_api_docs=bowei_api_docs
)
response = self.llm_client.invoke(prompt.to_messages())
code = self.output_parser.parse(response)
logger.debug(f"生成的代码内容:\n{code}")
try:
response = self.llm_client.invoke(prompt.to_messages())
parsed_response = self.output_parser.parse(response)
# 处理 AIMessage 类型的返回值
if hasattr(parsed_response, 'content'):
code = parsed_response.content
else:
code = str(parsed_response)
logger.debug(f"生成的代码内容:\n{code}")
return {
"code": 20000,
"message": 'ok',
"status": True,
"data": code
}
except Exception as e:
logger.error(f"大模型调用失败: {str(e)}", exc_info=True)
return {
"code": 50000,
"message": f'大模型调用失败: {str(e)}',
"status": False,
"data": None
}
return {
"code": 20000,
"message": 'ok',
"status": True,
"data": code.content
}
def fix_code(self, code: str, error: str) -> str:
def fix_code(self, code: str, error: str) -> dict:
logger.warning(f"代码执行出错,开始修复。错误信息:{error}")
prompt = self.prompts.code_fix_prompt.format_prompt(code=code, error=error)
response = self.llm_client.invoke(prompt.to_messages())
fixed_code = self.output_parser.parse(response)
logger.debug(f"修复后的代码内容:\n{fixed_code}")
return {
"code": 20000,
"message": 'ok',
"status": True,
"data": fixed_code.content
}
try:
response = self.llm_client.invoke(prompt.to_messages())
parsed_response = self.output_parser.parse(response)
# 处理 AIMessage 类型的返回值
if hasattr(parsed_response, 'content'):
fixed_code = parsed_response.content
else:
fixed_code = str(parsed_response)
logger.debug(f"修复后的代码内容:\n{fixed_code}")
return {
"code": 20000,
"message": 'ok',
"status": True,
"data": fixed_code
}
except Exception as e:
logger.error(f"代码修复时大模型调用失败: {str(e)}", exc_info=True)
return {
"code": 50001,
"message": f'代码修复失败: {str(e)}',
"status": False,
"data": None
}
def execute_code(self, code_str) -> dict:
"""封装代码执行逻辑"""
logger.debug(f"开始执行代码:\n {code_str}")
try:
import re
pattern = r'```python(.*?)```'
match = re.search(pattern, code_str, re.DOTALL)
if match:
code_str = match.group(1).strip()
except Exception as e:
logger.warning(f"解析生成代码格式时发生异常: {str(e)}")
old_stdout = None
try:
namespace = {
"project": __import__("src.project"),
"project": importlib.import_module("src.project"),
"Material": getattr(importlib.import_module("src.project"), "Material", None),
"Ration": getattr(importlib.import_module("src.project"), "Ration", None),
"Equipment": getattr(importlib.import_module("src.project"), "Equipment", None),
"MaterialOrEquipment": getattr(importlib.import_module("src.project"), "MaterialOrEquipment", None),
"ProjectBuilder": ProjectBuilder,
"logger": logger,
}
old_stdout = sys.stdout
@@ -93,8 +124,8 @@ class CodeExecutor:
sys.stdout = old_stdout
output = redirected_output.getvalue().strip()
if not isinstance(result_dict, dict) or len(result_dict) != 4:
raise ValueError("函数应返回包含4个元素的字典(status, data, error, helper_info)")
if not isinstance(result_dict, dict) or len(result_dict) < 3:
raise ValueError("函数应返回至少包含3个元素的字典(status, message, data)")
logger.debug(f"执行结果: {result_dict}")
+4 -15
View File
@@ -5,21 +5,6 @@ import os
import logging
from datetime import datetime
current_file = os.path.splitext(os.path.basename(__file__))[0]
now_str = datetime.now().strftime("%Y%m%d%H%M%S")
log_filename = f"{current_file}_{now_str}.log"
logging.basicConfig(
level=logging.DEBUG,
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
handlers=[
logging.FileHandler(os.path.join("logs", log_filename), encoding="utf-8"),
logging.StreamHandler()
],
)
logger = logging.getLogger(current_file)
class Config:
def __init__(self, path="config.yaml"):
with open(path, "r", encoding="utf-8") as f:
@@ -36,6 +21,10 @@ class Config:
def openai_coder(self):
return self._config.get("openai_coder", {})
@property
def openai_qa(self):
return self._config.get("openai_qa", {})
@property
def bowei_api_docs_path(self):
return self._config.get("bowei_api_docs_path", "./data/bowei_api_docs.md")
-12
View File
@@ -8,18 +8,6 @@ from langchain.schema import SystemMessage, HumanMessage
import asyncio
current_file = os.path.splitext(os.path.basename(__file__))[0]
now_str = datetime.now().strftime("%Y%m%d%H%M%S")
log_filename = f"{current_file}_{now_str}.log"
logging.basicConfig(
level=logging.DEBUG,
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
handlers=[
logging.FileHandler(os.path.join("logs", log_filename), encoding="utf-8"),
logging.StreamHandler()
],
)
logger = logging.getLogger(current_file)
class QuestionProcessor:
-16
View File
@@ -1,23 +1,7 @@
# src/document_loader.py
import os
import logging
from datetime import datetime
current_file = os.path.splitext(os.path.basename(__file__))[0]
now_str = datetime.now().strftime("%Y%m%d%H%M%S")
log_filename = f"{current_file}_{now_str}.log"
logging.basicConfig(
level=logging.DEBUG,
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
handlers=[
logging.FileHandler(os.path.join("logs", log_filename), encoding="utf-8"),
logging.StreamHandler()
],
)
logger = logging.getLogger(current_file)
def load_file(path: str) -> str:
try:
+1 -12
View File
@@ -6,20 +6,9 @@ from datetime import datetime
from langchain_openai import OpenAIEmbeddings
current_file = os.path.splitext(os.path.basename(__file__))[0]
now_str = datetime.now().strftime("%Y%m%d%H%M%S")
log_filename = f"{current_file}_{now_str}.log"
logging.basicConfig(
level=logging.DEBUG,
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
handlers=[
logging.FileHandler(os.path.join("logs", log_filename), encoding="utf-8"),
logging.StreamHandler()
],
)
logger = logging.getLogger(current_file)
class EmbeddingClient:
def __init__(self, embedding_config: dict):
api_key = embedding_config.get("api_key")
+169
View File
@@ -0,0 +1,169 @@
from langchain_neo4j import GraphCypherQAChain, Neo4jGraph
from langchain.chains import RetrievalQA, LLMChain
from langchain_core.runnables import RunnableSequence
from langchain.agents import initialize_agent, Tool
from langchain.agents import AgentType
from langchain.memory import ConversationBufferMemory
from langchain_community.chat_message_histories import ChatMessageHistory
from langchain_community.chat_models import ChatOpenAI
from langchain.prompts import PromptTemplate
from typing import Any
class EngineeringQAAgent:
def __init__(self, llm_client, embedding_client, graph: Neo4jGraph, business_retriever, callbacks=None):
"""
:param llm_client: 聊天大模型实例,如 ChatOpenAI
:param embedding_client: 嵌入模型实例,如 OpenAIEmbeddings(本类未直接使用,但保留)
:param graph: Neo4jGraph实例,连接工程知识图谱
:param business_retriever: 通用业务知识库的Retriever对象
"""
self.llm = llm_client.llm
self.embedding = embedding_client
self.business_retriever = business_retriever
self.callbacks = callbacks
self.kwargs = {}
if self.callbacks:
self.kwargs = {"callbacks": self.callbacks }
CYPHER_GENERATION_TEMPLATE = """Task:Generate Cypher statement to query a graph database.
Instructions:
Use only the provided relationship types and properties in the schema.
Do not use any other relationship types or properties that are not provided.
Schema:
{schema}
Note: Do not include any explanations or apologies in your responses.
Do not respond to any questions that might ask anything else than for you to construct a Cypher statement.
Do not include any text except the generated Cypher statement.
The question is:
{question}"""
CYPHER_GENERATION_PROMPT = PromptTemplate(
input_variables=["schema", "question"], template=CYPHER_GENERATION_TEMPLATE
)
# 工程知识图谱查询链
self.engineering_qa = GraphCypherQAChain.from_llm(
llm=self.llm,
graph=graph,
verbose=True,
allow_dangerous_requests=True,
cypher_prompt=CYPHER_GENERATION_PROMPT,
**self.kwargs
)
# Chain of Thought提示模板和链
cot_prompt = PromptTemplate(
input_variables=["question"],
template=(
"你是一个专业的电力造价工程助理。请先将用户的问题拆分成多个子问题,"
"分别检索相关的通用业务知识和工程数据知识库,最后综合回答用户。\n\n"
"用户问题:{question}\n\n"
"请给出拆分的子问题列表和每个子问题的检索计划,"
"然后给出最终综合回答。\n\n"
"思考过程:"
)
)
self.cot_chain = RunnableSequence(
cot_prompt | self.llm
).with_config(
verbose=True,
**self.kwargs
)
# 定义Agent工具
self.tools = [
Tool(
name="EngineeringData",
func=self.engineering_qa.invoke,
description="用于查询具体工程数据相关问题"
),
Tool(
name="BusinessKnowledge",
func=self._business_qa,
description="用于查询电力造价行业通用业务知识"
),
]
# 多轮对话记忆
message_history = ChatMessageHistory()
self.memory = ConversationBufferMemory(
chat_memory=message_history, memory_key="chat_history", return_messages=True)
# 初始化Agent,支持多轮对话和工具调用
self.agent = initialize_agent(
self.tools,
self.llm,
agent=AgentType.CONVERSATIONAL_REACT_DESCRIPTION,
memory=self.memory,
verbose=True,
**self.kwargs
)
def _business_qa(self, query: str) -> str:
if not self.business_retriever:
return "通用业务知识库未配置。"
business_qa = RetrievalQA(
llm=self.llm,
retriever=self.business_retriever,
return_source_documents=False,
**self.kwargs
)
return business_qa.invoke(query)
def ask(self, question: str) -> str:
# 1. 使用CoT链拆分问题和规划检索
cot_output = self.cot_chain.invoke(question)
# 2. 简单示例:先调用业务知识库,再调用工程数据知识库
business_answer = self._business_qa(question)
engineering_answer = self.engineering_qa.run(question)
# 3. 综合回答
final_answer = (
"根据通用业务知识库,得到的信息是:\n"
f"{business_answer}\n\n"
"根据工程数据知识库,得到的信息是:\n"
f"{engineering_answer}\n\n"
"综合以上信息,回答用户问题如下:\n"
f"{cot_output}"
)
return final_answer
# ------------------ 使用示例 ------------------
if __name__ == "__main__":
import os
import sys
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from src.config import Config
from src.multi_llm_client import MultiAPIKeyChatOpenAI
from src.embedding_client import EmbeddingClient
config = Config()
# 初始化图数据库连接
graph = Neo4jGraph(
url=config.neo4j_conf.get("uri"),
username=config.neo4j_conf.get("username"),
password=config.neo4j_conf.get("password")
)
# 初始化LLM和Embedding
llm = MultiAPIKeyChatOpenAI(config.openai_qa)
embedding = EmbeddingClient(config.embedding)
# 初始化通用业务知识向量库Retriever(示例中未配置)
business_vectorstore = None # 例如 Chroma(collection_name="business_knowledge")
business_retriever = None # business_vectorstore.as_retriever() if business_vectorstore else None
# 创建Agent实例
agent = EngineeringQAAgent(llm, embedding, graph, business_retriever)
# 交互示例
question = "工程里有几个项目划分,每个项目划分的名字分别是什么"
answer = agent.ask(question)
print("回答:", answer)
+14 -18
View File
@@ -8,21 +8,11 @@ import getpass
from langchain_openai import ChatOpenAI
from langchain_core.rate_limiters import InMemoryRateLimiter
current_file = os.path.splitext(os.path.basename(__file__))[0]
now_str = datetime.now().strftime("%Y%m%d%H%M%S")
log_filename = f"{current_file}_{now_str}.log"
logging.basicConfig(
level=logging.DEBUG,
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
handlers=[
logging.FileHandler(os.path.join("logs", log_filename), encoding="utf-8"),
logging.StreamHandler()
],
)
logger = logging.getLogger(current_file)
class LLMClient:
def __init__(self, openai_config: dict):
api_key = openai_config.get("api_key")
@@ -38,17 +28,23 @@ class LLMClient:
api_type = openai_config.get("api_type", "openai")
os.environ["OPENAI_API_TYPE"] = api_type
temperature = openai_config.get("temperature", 0)
model_name = openai_config.get("model_name", "gpt-4o-mini")
# 初始化限速器:每秒最多0.1次请求(即每10秒1次)
rate_limiter = InMemoryRateLimiter(
requests_per_second=13,
check_every_n_seconds=10,
max_bucket_size=10,
)
#rate_limiter = InMemoryRateLimiter(
# requests_per_second=13,
# check_every_n_seconds=10,
# max_bucket_size=10,
#)
# 开启流式
self.llm = ChatOpenAI(model_name=model_name, temperature=0, streaming=True, rate_limiter=rate_limiter)
self.llm = ChatOpenAI(
model_name=model_name,
temperature=temperature,
streaming=True,
#rate_limiter=rate_limiter
)
def invoke(self, messages):
# 同步调用,返回完整响应
+10 -19
View File
@@ -9,19 +9,8 @@ import itertools
from langchain_openai import ChatOpenAI
from langchain_core.rate_limiters import InMemoryRateLimiter
current_file = os.path.splitext(os.path.basename(__file__))[0]
now_str = datetime.now().strftime("%Y%m%d%H%M%S")
log_filename = f"{current_file}_{now_str}.log"
logging.basicConfig(
level=logging.DEBUG,
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
handlers=[
logging.FileHandler(os.path.join("logs", log_filename), encoding="utf-8"),
logging.StreamHandler()
],
)
logger = logging.getLogger(current_file)
class MultiAPIKeyChatOpenAI:
@@ -36,6 +25,7 @@ class MultiAPIKeyChatOpenAI:
api_base = openai_config.get("api_base")
api_type = openai_config.get("api_type", "openai")
model_name = openai_config.get("model_name", "gpt-4o-mini")
temperature = openai_config.get("temperature", 0)
# 设置环境变量(可选,根据需要)
if api_base:
@@ -43,26 +33,27 @@ class MultiAPIKeyChatOpenAI:
os.environ["OPENAI_API_TYPE"] = api_type
# 初始化限速器
rate_limiter = InMemoryRateLimiter(
requests_per_second=13,
check_every_n_seconds=10,
max_bucket_size=10,
)
#rate_limiter = InMemoryRateLimiter(
# requests_per_second=13,
# check_every_n_seconds=10,
# max_bucket_size=10,
#)
# 创建多个 ChatOpenAI 实例,每个使用不同的 API Key
self.llms = [
ChatOpenAI(
api_key=key,
model_name=model_name,
temperature=0,
temperature=temperature,
streaming=True,
rate_limiter=rate_limiter,
#rate_limiter=rate_limiter,
)
for key in api_keys
]
# 轮询器,用于循环调用不同的 llm 实例
self._llm_cycle = itertools.cycle(self.llms)
self.llm = next(self._llm_cycle)
def invoke(self, messages):
llm = next(self._llm_cycle)
+2 -12
View File
@@ -7,21 +7,11 @@ from typing import List
from langchain.schema import Document
from neo4j import GraphDatabase
current_file = os.path.splitext(os.path.basename(__file__))[0]
now_str = datetime.now().strftime("%Y%m%d%H%M%S")
log_filename = f"{current_file}_{now_str}.log"
logging.basicConfig(
level=logging.DEBUG,
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
handlers=[
logging.FileHandler(os.path.join("logs", log_filename), encoding="utf-8"),
logging.StreamHandler()
],
)
logger = logging.getLogger(current_file)
class Neo4jRawRetriever:
def __init__(self, neo4j_conf: dict):
self.uri = neo4j_conf.get("uri")
+2 -12
View File
@@ -6,21 +6,11 @@ from datetime import datetime
from langchain_neo4j import Neo4jVector
from langchain_openai import OpenAIEmbeddings
current_file = os.path.splitext(os.path.basename(__file__))[0]
now_str = datetime.now().strftime("%Y%m%d%H%M%S")
log_filename = f"{current_file}_{now_str}.log"
logging.basicConfig(
level=logging.DEBUG,
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
handlers=[
logging.FileHandler(os.path.join("logs", log_filename), encoding="utf-8"),
logging.StreamHandler()
],
)
logger = logging.getLogger(current_file)
class Neo4jKnowledgeRetriever:
def __init__(self, neo4j_conf: dict, embedding_client):
neo4j_uri = neo4j_conf.get("uri")
+22 -35
View File
@@ -5,6 +5,7 @@
from abc import ABC, abstractmethod
import json
from typing import Any, Type
class ProjectToolkit(ABC):
@@ -13,13 +14,11 @@ class ProjectToolkit(ABC):
描述: 代表整个项目结构的顶层容器
"""
def __init__(self):
self.project_division_set = ProjectDivisionItem() # 项目划分集对象
# 项目划分查询方法
def __init__(self, config: Any):
pass
@abstractmethod
def get_division_by_name(self, name):
def get_division_by_name(self, name_part):
"""
通过名称获取项目划分对象
@@ -70,7 +69,6 @@ class ProjectToolkit(ABC):
"""
pass
# 工程量查询方法
@abstractmethod
def get_quantities_by_paths(self, paths_str):
"""
@@ -89,7 +87,7 @@ class ProjectToolkit(ABC):
pass
@abstractmethod
def get_quantities_node_by_parent_and_code(self, parent_path, quantity_type=None, code=None):
def get_quantities_node_by_parent_and_code(self, parent_path, quantity_type, code):
"""
通过父节点路径和编码获取工程量对象(定额、主材或设备),包括子节点
@@ -108,14 +106,15 @@ class ProjectToolkit(ABC):
pass
@abstractmethod
def get_quantities_node_by_parent_and_name(self, parent_path, partial_name, quantity_type=None):
def get_quantities_node_by_parent_and_name(self, parent_path, quantity_type, partial_name):
"""
通过父节点路径、模糊节点名称和类型获取工程量对象(主材或者设备),包括子节点
通过父节点路径、类型和模糊节点名称获取工程量对象(主材或者设备),包括子节点
Args:
parent_path (str): 父节点的路径,以'/'分隔的多级节点路径
partial_name (str): 目标节点的模糊或不完整名称
quantity_type (str): 工程量类型('定额''主材''设备')
partial_name (str): 目标节点的模糊或不完整名称
Returns:
dict: 返回字典,字段包括:
@@ -126,7 +125,6 @@ class ProjectToolkit(ABC):
"""
pass
# 材机查询方法
@abstractmethod
def get_material_equipment_by_path(self, paths_str):
"""
@@ -162,7 +160,6 @@ class ProjectToolkit(ABC):
"""
pass
# 取费查询方法
@abstractmethod
def get_fee_template_by_path(self, paths_str):
"""
@@ -200,9 +197,8 @@ class ProjectToolkit(ABC):
"""
pass
# 费用表查询方法
@abstractmethod
def get_fee_schedule_on_auxiliary_expense_table(self, table_name, fee_name, fee: str):
def get_fee_schedule_on_auxiliary_expense_table(self, table_name, fee_name, fee_attribute: str):
"""
在辅助费用表中查找费用
@@ -221,7 +217,7 @@ class ProjectToolkit(ABC):
pass
@abstractmethod
def get_fee_schedule_on_other_expense_table(self, table_name, fee_name, fee):
def get_fee_schedule_on_other_expense_table(self, table_name, fee_name, fee_attribute):
"""
在其它费用表中查找费用
@@ -240,7 +236,7 @@ class ProjectToolkit(ABC):
pass
@abstractmethod
def get_fee_schedule_on_land_acquisition_fee_table_table(self, table_name, fee_name, fee):
def get_fee_schedule_on_land_acquisition_fee_table_table(self, table_name, fee_name, fee_attribute):
"""
在其中:场地征用费用表中查找费用
@@ -259,7 +255,7 @@ class ProjectToolkit(ABC):
pass
@abstractmethod
def get_fee_schedule_on_installation_price_difference_table(self, table_name, fee_name, fee):
def get_fee_schedule_on_installation_price_difference_table(self, table_name, fee_name, fee_attribute):
"""
在安装价差费用表中查找费用
@@ -278,7 +274,7 @@ class ProjectToolkit(ABC):
pass
@abstractmethod
def get_fee_schedule_on_Engineering_Cost_table(self, table_name, fee_name, fee):
def get_fee_schedule_on_Engineering_Cost_table(self, table_name, fee_name, fee_attribute):
"""
在工程费用表中查找费用
@@ -296,7 +292,6 @@ class ProjectToolkit(ABC):
"""
pass
# 工程属性查询方法
@abstractmethod
def get_project_property(self, property_name):
"""
@@ -314,7 +309,6 @@ class ProjectToolkit(ABC):
"""
pass
# 项目划分查找取费表
@abstractmethod
def get_fee_table_by_project_division(self, project_division_path, fee_name):
"""
@@ -333,7 +327,6 @@ class ProjectToolkit(ABC):
"""
pass
# 清单查找取费表
@abstractmethod
def get_fee_table_by_list(self, parent_path, list_code, list_unit, fee_name):
"""
@@ -354,7 +347,6 @@ class ProjectToolkit(ABC):
"""
pass
# 定额节点查找合价
@abstractmethod
def get_fee_table_by_quoto_code(self, parent_path, quantity_type, code, fee_name):
"""
@@ -375,7 +367,6 @@ class ProjectToolkit(ABC):
"""
pass
# 工程量节点查找合价
@abstractmethod
def get_fee_table_by_quantities_name(self, parent_path, quantity_type, quantity_name, fee_name):
"""
@@ -396,7 +387,6 @@ class ProjectToolkit(ABC):
"""
pass
# 材机节点查找市场价
@abstractmethod
def get_fee_by_material_equipment_code(self, parent_path, material_equipment_code, fee_name):
"""
@@ -416,7 +406,6 @@ class ProjectToolkit(ABC):
"""
pass
# 查找清单节点
@abstractmethod
def get_fee_table_by_list_name(self, parent_path, list_code, unit):
"""
@@ -687,18 +676,19 @@ class Fee:
self.施工费 = None # xsd:string (可选)
self.单位投资 = None # xsd:string (可选)
class ProjectBuilder:
# 存储注册的工具类
_registry = None
_config = {}
class ProjectBuilder:
"""项目工具工厂类"""
# 存储注册的工具类
_registry: Type[ProjectToolkit] | None = None
_config: Any = None
def __init__(self):
pass
@classmethod
def register(cls, toolkit_class: type, config: dict):
def register(cls, toolkit_class: Type[ProjectToolkit], config: Any):
"""
注册工具类到工厂
@@ -716,13 +706,10 @@ class ProjectBuilder:
"""
创建工具实例
参数:
返回:
实例化的工具对象
"""
if cls._registry is None:
raise KeyError(f"未注册的类,请先注册类")
raise KeyError("未注册的类,请先注册类")
return cls._registry(cls._config)
return cls._registry(cls._config)
+173 -83
View File
@@ -25,7 +25,7 @@ class ProjectToolkitNeo4j(ProjectToolkit):
if neo4j_driver is None:
raise ValueError("必须提供Neo4j驱动实例")
super().__init__()
super().__init__(neo4j_driver)
# 保存驱动实例
self.driver = neo4j_driver
@@ -164,7 +164,7 @@ class ProjectToolkitNeo4j(ProjectToolkit):
if not node_data:
code = 201
status_flag = False
error = f"找不到路径: {path} 上的ProjectDivisionItem节点"
error = f"错误信息:找不到路径: {path} 上的ProjectDivisionItem节点"
# 提取父路径
path_parts = path.split("/")
@@ -190,7 +190,7 @@ class ProjectToolkitNeo4j(ProjectToolkit):
if record["name"]:
helper_info.append(record["name"])
except Exception as e:
helper_info = [f"查询父节点下的子节点时出错: {str(e)}"]
helper_info = [f"错误信息:查询父节点下的子节点时出错: {str(e)}"]
# 拼接 message
message = f"错误信息:{error}; 辅助信息: {helper_info}"
@@ -246,7 +246,7 @@ class ProjectToolkitNeo4j(ProjectToolkit):
if not partial_name:
code = 201
status_flag = False
message = "节点名称不能为空"
message = "错误信息:partial_name参数错误,参数不能为空"
else:
try:
# 第一步:找到父节点
@@ -385,7 +385,7 @@ class ProjectToolkitNeo4j(ProjectToolkit):
if not name_part or name_part.strip() == "":
code = 201
status_flag = False
message = "输入的名称部分不能为空"
message = "错误信息:name_part参数错误,参数不能为空"
else:
try:
# 直接查询所有类型为ProjectDivisionItem且name包含输入名称的节点
@@ -482,7 +482,7 @@ class ProjectToolkitNeo4j(ProjectToolkit):
if not paths_str:
code = 201
status_flag = False
message = "路径不能为空"
message = "错误信息:paths_str参数错误,参数不能为空"
else:
try:
# 使用通用方法获取节点,考虑所有可能的工程量类型
@@ -547,7 +547,7 @@ class ProjectToolkitNeo4j(ProjectToolkit):
# 最终统一返回格式包装成列表
return {"code": code, "message": message, "status": status_flag, "data": data}
def get_quantities_node_by_parent_and_code(self, parent_path, quantity_type=None, code=None) -> dict:
def get_quantities_node_by_parent_and_code(self, parent_path, quantity_type, code) -> dict:
"""
通过父节点路径和编码获取工程量对象(定额、主材或设备),包括子节点
@@ -579,13 +579,13 @@ class ProjectToolkitNeo4j(ProjectToolkit):
if not code or code.strip() == "":
code_status = 201
status_flag = False
message = "编码不能为空"
message = "错误信息:code参数错误,参数不能为空"
valid_types = ["定额", "主材", "设备", None]
if quantity_type not in valid_types:
code_status = 201
status_flag = False
message = f"无效的工程量类型: '{quantity_type}';有效类型为 {valid_types}"
message = f"错误信息:quantity_type参数错误,有效类型 {valid_types},当前值是'{quantity_type}'"
elif code_status == 200:
try:
@@ -701,7 +701,7 @@ class ProjectToolkitNeo4j(ProjectToolkit):
def get_quantities_node_by_parent_and_name(self, parent_path, quantity_type, partial_name) -> dict:
"""
通过父节点路径、模糊节点名称和类型获取工程量对象(主材或者设备),包括子节点
通过父节点路径、类型和模糊节点名称获取工程量对象(主材或者设备),包括子节点
执行三步查询:
1. 找到对应路径的父节点
@@ -714,7 +714,7 @@ class ProjectToolkitNeo4j(ProjectToolkit):
quantity_type (str): 工程量类型('定额''主材''设备')
Returns:
dict: 返回字典,字段包括:
dict: 包含一个字典,字段包括:
- code (int): 状态码,固定为 200(成功)或 201(失败)
- message (str): 成功时为 "Ok",失败时包含错误信息和辅助信息
- status (bool): 成功为 True,失败为 False
@@ -825,30 +825,59 @@ class ProjectToolkitNeo4j(ProjectToolkit):
matching_nodes = []
available_names = []
# 统一处理 partial_name 为列表形式
if isinstance(partial_name, str):
if partial_name.strip() == "":
code_status = 201
status_flag = False
message = "partial_name 不能为空"
else:
# 支持中文逗号、英文逗号、空格分隔
import re
keywords = re.split(r"[,,、\s]+", partial_name.strip())
else:
keywords = partial_name or []
if not keywords:
code_status = 201
status_flag = False
message = "未提供有效的关键词"
if code_status != 200:
return {"code": code_status, "message": message, "status": status_flag, "data": data}
# 尝试用 Python 端过滤
for node in child_nodes:
node_name = node.get("name", "")
if node_name:
available_names.append(node_name)
available_names.append(node_name)
if partial_name in str(node_name):
matching_nodes.append(node)
for keyword in keywords:
if keyword in str(node_name):
matching_nodes.append(node)
break
# 如果 Python 端没找到,尝试数据库端模糊搜索
if not matching_nodes:
# 构建动态查询语句
where_clauses = " OR ".join([f"q.name CONTAINS '{keyword}'" for keyword in keywords])
direct_query = f"""
MATCH (q)
WHERE q.name CONTAINS $partial_name AND {type_condition}
WHERE ({where_clauses}) AND {type_condition}
RETURN q LIMIT 20
"""
direct_params = {"partial_name": partial_name}
direct_result = self.session.run(direct_query, **direct_params)
matching_nodes = [record["q"] for record in direct_result]
try:
direct_result = self.session.run(direct_query)
matching_nodes = [record["q"] for record in direct_result]
except Exception as e:
code_status = 201
status_flag = False
message = f"数据库模糊查询失败: {str(e)}"
if not matching_nodes:
code_status = 201
status_flag = False
message = f"错误信息:在父节点路径'{parent_path}' 下找不到名称包含 '{partial_name}' 的节点;辅助信息:{available_names}"
message = f"错误信息:在父节点路径'{parent_path}' 下找不到包含关键词 {keywords} 的节点;辅助信息:{available_names}"
else:
result_data = []
for node in matching_nodes:
@@ -1008,7 +1037,7 @@ class ProjectToolkitNeo4j(ProjectToolkit):
if not parent_path or not code:
code_status = 201
status_flag = False
message = "父节点路径或要查找的编码不能为空"
message = "错误信息:parent_path或code参数错误,参数不能为空"
else:
try:
@@ -1323,7 +1352,7 @@ class ProjectToolkitNeo4j(ProjectToolkit):
fee_attribute (str): 费用值属性名
Returns:
dict: 返回字典,字段包括:
dict: 包含一个字典,字段包括:
- code (int): 状态码,固定为 200(成功)或 201(失败)
- message (str): 成功时为 "Ok",失败时包含错误信息和辅助信息
- status (bool): 成功为 True,失败为 False
@@ -1344,6 +1373,7 @@ class ProjectToolkitNeo4j(ProjectToolkit):
else:
# 第一步:查找父节点(费用表节点)
table_name = table_name.replace("", "")
parent_path = f"工程/工程费用/{table_name}"
parent_node_data = self.get_node_by_path(parent_path)
@@ -1417,17 +1447,28 @@ class ProjectToolkitNeo4j(ProjectToolkit):
else:
# 第三步:获取费用节点的属性值
try:
if fee_node and hasattr(fee_node, "get"):
fee_value = fee_node.get(fee_attribute)
elif fee_node and isinstance(fee_node, dict):
fee_value = fee_node.get(fee_attribute)
if hasattr(fee_node, "keys"):
all_attrs = list(fee_node.keys())
elif isinstance(fee_node, dict):
all_attrs = list(fee_node.keys())
else:
# 如果fee_node是Neo4j Node对象,尝试直接访问属性
fee_value = (
getattr(fee_node, fee_attribute, None)
if hasattr(fee_node, fee_attribute)
else fee_node.get(fee_attribute) if hasattr(fee_node, "get") else None
)
all_attrs = list(fee_node.keys()) if hasattr(fee_node, "keys") else []
# 过滤掉私有属性
all_attrs = [attr for attr in all_attrs if not attr.startswith("_")]
# 使用“包含”逻辑模糊匹配属性名
matched_attrs = []
for attr in all_attrs:
if fee_attribute.lower() in attr.lower() or attr.lower() in fee_attribute.lower():
matched_attrs.append(attr)
if matched_attrs:
# 优先返回第一个匹配项的值
best_match = matched_attrs[0]
fee_value = fee_node.get(best_match)
else:
fee_value = None
if fee_value is None:
code_status = 201
@@ -1487,7 +1528,7 @@ class ProjectToolkitNeo4j(ProjectToolkit):
fee_attribute (str): 费用值属性名
Returns:
dict: 返回字典,字段包括:
dict: 包含一个字典,字段包括:
- code (int): 状态码,固定为 200(成功)或 201(失败)
- message (str): 成功时为 "Ok",失败时包含错误信息和辅助信息
- status (bool): 成功为 True,失败为 False
@@ -1508,6 +1549,7 @@ class ProjectToolkitNeo4j(ProjectToolkit):
else:
# 第一步:查找父节点(费用表节点)
table_name = table_name.replace("", "")
parent_path = f"工程/工程费用/{table_name}"
parent_node_data = self.get_node_by_path(parent_path)
@@ -1541,7 +1583,7 @@ class ProjectToolkitNeo4j(ProjectToolkit):
# 递归查找费用节点,最多查找3级深度
query = """
MATCH (p)-[*1..3]->(f)
MATCH (p)-[*1..]->(f)
WHERE p.name = $table_name AND f.name = $fee_name
RETURN f LIMIT 1
"""
@@ -1581,17 +1623,28 @@ class ProjectToolkitNeo4j(ProjectToolkit):
else:
# 第三步:获取费用节点的属性值
try:
if fee_node and hasattr(fee_node, "get"):
fee_value = fee_node.get(fee_attribute)
elif fee_node and isinstance(fee_node, dict):
fee_value = fee_node.get(fee_attribute)
if hasattr(fee_node, "keys"):
all_attrs = list(fee_node.keys())
elif isinstance(fee_node, dict):
all_attrs = list(fee_node.keys())
else:
# 如果fee_node是Neo4j Node对象,尝试直接访问属性
fee_value = (
getattr(fee_node, fee_attribute, None)
if hasattr(fee_node, fee_attribute)
else fee_node.get(fee_attribute) if hasattr(fee_node, "get") else None
)
all_attrs = list(fee_node.keys()) if hasattr(fee_node, "keys") else []
# 过滤掉私有属性
all_attrs = [attr for attr in all_attrs if not attr.startswith("_")]
# 使用“包含”逻辑模糊匹配属性名
matched_attrs = []
for attr in all_attrs:
if fee_attribute.lower() in attr.lower() or attr.lower() in fee_attribute.lower():
matched_attrs.append(attr)
if matched_attrs:
# 优先返回第一个匹配项的值
best_match = matched_attrs[0]
fee_value = fee_node.get(best_match)
else:
fee_value = None
if fee_value is None:
code_status = 201
@@ -1653,7 +1706,7 @@ class ProjectToolkitNeo4j(ProjectToolkit):
fee_attribute (str): 费用值属性名
Returns:
dict: 返回字典,字段包括:
dict: 包含一个字典,字段包括:
- code (int): 状态码,固定为 200(成功)或 201(失败)
- message (str): 成功时为 "Ok",失败时包含错误信息和辅助信息
- status (bool): 成功为 True,失败为 False
@@ -1674,6 +1727,7 @@ class ProjectToolkitNeo4j(ProjectToolkit):
else:
# 第一步:查找父节点(费用表节点)
table_name = table_name.replace("", "")
parent_path = f"工程/工程费用/{table_name}"
parent_node_data = self.get_node_by_path(parent_path)
@@ -1747,17 +1801,28 @@ class ProjectToolkitNeo4j(ProjectToolkit):
else:
# 第三步:获取费用节点的属性值
try:
if fee_node and hasattr(fee_node, "get"):
fee_value = fee_node.get(fee_attribute)
elif fee_node and isinstance(fee_node, dict):
fee_value = fee_node.get(fee_attribute)
if hasattr(fee_node, "keys"):
all_attrs = list(fee_node.keys())
elif isinstance(fee_node, dict):
all_attrs = list(fee_node.keys())
else:
# 如果fee_node是Neo4j Node对象,尝试直接访问属性
fee_value = (
getattr(fee_node, fee_attribute, None)
if hasattr(fee_node, fee_attribute)
else fee_node.get(fee_attribute) if hasattr(fee_node, "get") else None
)
all_attrs = list(fee_node.keys()) if hasattr(fee_node, "keys") else []
# 过滤掉私有属性
all_attrs = [attr for attr in all_attrs if not attr.startswith("_")]
# 使用“包含”逻辑模糊匹配属性名
matched_attrs = []
for attr in all_attrs:
if fee_attribute.lower() in attr.lower() or attr.lower() in fee_attribute.lower():
matched_attrs.append(attr)
if matched_attrs:
# 优先返回第一个匹配项的值
best_match = matched_attrs[0]
fee_value = fee_node.get(best_match)
else:
fee_value = None
if fee_value is None:
code_status = 201
@@ -1819,7 +1884,7 @@ class ProjectToolkitNeo4j(ProjectToolkit):
fee_attribute (str): 费用值属性名
Returns:
dict: 返回字典,字段包括:
dict: 包含一个字典,字段包括:
- code (int): 状态码,固定为 200(成功)或 201(失败)
- message (str): 成功时为 "Ok",失败时包含错误信息和辅助信息
- status (bool): 成功为 True,失败为 False
@@ -1840,6 +1905,7 @@ class ProjectToolkitNeo4j(ProjectToolkit):
else:
# 第一步:查找父节点(费用表节点)
table_name = table_name.replace("", "")
parent_path = f"工程/工程费用/{table_name}"
parent_node_data = self.get_node_by_path(parent_path)
@@ -1913,17 +1979,28 @@ class ProjectToolkitNeo4j(ProjectToolkit):
else:
# 第三步:获取费用节点的属性值
try:
if fee_node and hasattr(fee_node, "get"):
fee_value = fee_node.get(fee_attribute)
elif fee_node and isinstance(fee_node, dict):
fee_value = fee_node.get(fee_attribute)
if hasattr(fee_node, "keys"):
all_attrs = list(fee_node.keys())
elif isinstance(fee_node, dict):
all_attrs = list(fee_node.keys())
else:
# 如果fee_node是Neo4j Node对象,尝试直接访问属性
fee_value = (
getattr(fee_node, fee_attribute, None)
if hasattr(fee_node, fee_attribute)
else fee_node.get(fee_attribute) if hasattr(fee_node, "get") else None
)
all_attrs = list(fee_node.keys()) if hasattr(fee_node, "keys") else []
# 过滤掉私有属性
all_attrs = [attr for attr in all_attrs if not attr.startswith("_")]
# 使用“包含”逻辑模糊匹配属性名
matched_attrs = []
for attr in all_attrs:
if fee_attribute.lower() in attr.lower() or attr.lower() in fee_attribute.lower():
matched_attrs.append(attr)
if matched_attrs:
# 优先返回第一个匹配项的值
best_match = matched_attrs[0]
fee_value = fee_node.get(best_match)
else:
fee_value = None
if fee_value is None:
code_status = 201
@@ -1983,7 +2060,7 @@ class ProjectToolkitNeo4j(ProjectToolkit):
fee_attribute (str): 费用值属性名
Returns:
dict: 返回字典,字段包括:
dict: 包含一个字典,字段包括:
- code (int): 状态码,固定为 200(成功)或 201(失败)
- message (str): 成功时为 "Ok",失败时包含错误信息和辅助信息
- status (bool): 成功为 True,失败为 False
@@ -2004,6 +2081,7 @@ class ProjectToolkitNeo4j(ProjectToolkit):
else:
# 第一步:查找父节点(费用表节点)
table_name = table_name.replace("", "")
parent_path = f"工程/工程费用/{table_name}"
parent_node_data = self.get_node_by_path(parent_path)
@@ -2077,17 +2155,28 @@ class ProjectToolkitNeo4j(ProjectToolkit):
else:
# 第三步:获取费用节点的属性值
try:
if fee_node and hasattr(fee_node, "get"):
fee_value = fee_node.get(fee_attribute)
elif fee_node and isinstance(fee_node, dict):
fee_value = fee_node.get(fee_attribute)
if hasattr(fee_node, "keys"):
all_attrs = list(fee_node.keys())
elif isinstance(fee_node, dict):
all_attrs = list(fee_node.keys())
else:
# 如果fee_node是Neo4j Node对象,尝试直接访问属性
fee_value = (
getattr(fee_node, fee_attribute, None)
if hasattr(fee_node, fee_attribute)
else fee_node.get(fee_attribute) if hasattr(fee_node, "get") else None
)
all_attrs = list(fee_node.keys()) if hasattr(fee_node, "keys") else []
# 过滤掉私有属性
all_attrs = [attr for attr in all_attrs if not attr.startswith("_")]
# 使用“包含”逻辑模糊匹配属性名
matched_attrs = []
for attr in all_attrs:
if fee_attribute.lower() in attr.lower() or attr.lower() in fee_attribute.lower():
matched_attrs.append(attr)
if matched_attrs:
# 优先返回第一个匹配项的值
best_match = matched_attrs[0]
fee_value = fee_node.get(best_match)
else:
fee_value = None
if fee_value is None:
code_status = 201
@@ -2223,7 +2312,7 @@ class ProjectToolkitNeo4j(ProjectToolkit):
fee_name (str): 取费名称
Returns:
dict: 返回字典,字段包括:
dict: 包含一个字典,字段包括:
- code (int): 状态码,固定为 200(成功)或 201(失败)
- message (str): 成功时为 "Ok",失败时包含错误信息和辅助信息
- status (bool): 成功为 True,失败为 False
@@ -2308,10 +2397,10 @@ class ProjectToolkitNeo4j(ProjectToolkit):
else:
cost_set_node = record["c"]
# 第三步:在CostSet节点的子节点中查找名称为fee_name的CostItem节点
# 第三步:在CostSet节点的子节点中查找名称为fee_name的CostItem节点(模糊匹配)
query = """
MATCH (c:CostSet)-[*1..1]->(i:CostItem)
WHERE id(c) = $cost_set_id AND i.name = $fee_name
WHERE id(c) = $cost_set_id AND (i.name CONTAINS $fee_name OR $fee_name CONTAINS i.name)
RETURN i
LIMIT 1
"""
@@ -2324,7 +2413,7 @@ class ProjectToolkitNeo4j(ProjectToolkit):
if not record:
code_status = 201
status_flag = False
error = f"在CostSet节点下找不到名称为 {fee_name} 的CostItem节点"
error = f"在CostSet节点下找不到 {fee_name} 模糊匹配的CostItem节点"
# 查询该CostSet下所有CostItem节点名称作为辅助信息
helper_query = """
@@ -3033,3 +3122,4 @@ class ProjectToolkitNeo4j(ProjectToolkit):
# 统一返回格式包装成列表
return {"code": code_status, "message": message, "status": status_flag, "data": data}
+10 -186
View File
@@ -66,198 +66,22 @@ def project_get_calculate_function():
result_dict = project.[SELECTED_METHOD]([PARAMETERS])
status = result_dict.get('status', False)
message = result_dict.get('message', '')
code = result_dict.get('data', '')
data = result_dict.get('data', [])
quantity = 0.0
if isinstance(result_dict, dict) and '数量' in result_dict:
quantity = result_dict['数量']
if status:
return result_dict
else:
return result_dict
# 执行规则
- 参数必须从用户问题或上下文信息中提取
- 输出代码中必须以def project_get_calculate_function() -> dict函数作为入口函数
- 必须确保生成的代码可以直接执行,代码要注意进行各类错误检查,出错采用抛出异常方式,说明详细信息
- 禁止添加任何注释或解释
- ProjectToolkit 类中涉及项目划分的函数已考虑在其及其子孙项目划分下查找,所以无需生成递归子项目划分的代码
- 如果文本中包含范围编码格式则需要进行编码展开,如'YX2-1~7'展开为‘YX2-1/YX2-2/YX2-3/YX2-4/YX2-5/YX2-6/YX2-7
"""
)
code_fix_prompt = ChatPromptTemplate.from_template(
"""
你是一个专业的Python工程师。我会给你一段错误python代码和错误信息,你需要帮我修复这段出错的代码
已执行代码:
{code}
代码执行报错信息:
{error}
你的任务是:
1. 根据"已执行代码""代码执行报错信息"来对“已执行代码”和函数调用参数进行修改,修复执行错误
2. 如果错误信息中是代码的逻辑出现错误,那么就需要对代码本身整体结构进行修改
3. 如果是代码中参数出现问题了,那么就需要结合错误信息中的帮助信息(helper_info)来对代码总的参数进行修改
4. 修复后的代码应该完整,可以直接执行,并且能够返回查询结果
注意:
- 如果文本中包含范围编码格式则需要进行编码展开,如'YX2-1~7'展开为‘YX2-1/YX2-2/YX2-3/YX2-4/YX2-5/YX2-6/YX2-7
- 必须只输出最终的Python代码,不要添加任何解释、注释、推理过程或自然语言描述。
- 不要以“以下是修正后的代码”、“修改如下”等语句开头。
- 不要输出任何其他无关的内容。
- 输出格式必须完全符合指定的函数模板。
- 如果无法根据已有信息进行修改,请原样返回原始代码。
- 禁止在代码前加上```python字样
- 禁止在代码后加上```字样
请输出你修补后的代码:
""")
rewrite_prompt_template = ChatPromptTemplate.from_template(
"""
您是一个AI查询改写助手。基于给定的原始查询和上下文知识,生成一个精确的改写查询。步骤:
1. 从上下文知识的`labels`提取对象类型,翻译为中文。
2. 从`properties`选择对象标识:优先用`path`值,若无则用`name`值。
3. 智能映射原始查询的属性名称:
- 如果属性名称是上下文属性的缩写、省略或同义词,映射到实际属性名称(如“人工费”可能映射到“费率”或“合价含税”)。
- 如果无法映射,保留原始名称。
4. 保留原始查询的额外操作(如计算指令)。
5. 输出格式:“获取[对象标识][对象类型]的[属性]属性,[额外操作]”。
示例参考:
- 输入:原始问题="查找名称中包含“工程”的项目划分项,并返回其人工费乘以1000的值。", 上下文知识=...
- 输出="获取[安装/架空输电线路本体工程/基础工程/基础工程材料工地运输]项目划分项的人工费,并乘以1000的值"
现在,处理以下输入:
- 原始问题:{user_input}
- 上下文知识:{context}
""")
cypher_conversion_prompt = ChatPromptTemplate.from_template(
"""
你是一名电力造价业务专家,负责将用户自然语言问题中需要访问的对象识别出来,并生成针对该对象的NEO4J知识图谱的Cypher查询语句,获取该对象的全部信息。知识图谱基于从文件“获取[安装/架空输电线路本体工程]项目划分项的单位.”中读取的层级关联结构构建。该文件包含用反斜杠分割的多个字符串(如“安装/架空输电线路本体工程”),每个字符串表示一个完整的层级路径,路径部分用斜杠分隔,对应于知识图谱中ProjectDivisionItem节点的层级关系。路径映射规则:每个路径部分(如“安装”)是一个ProjectDivisionItem节点,父子关系通过关系类型`:CHILD_OF`连接,形成从根节点到叶节点的层级结构。
示例业务结构:
{business_structure}
用户问题:
{user_input}
改写规则:
识别目标层级: 从用户输入中解析层级路径,例如字符串“安装/架空输电线路本体工程”映射为:根节点(name: '安装') -[:CHILD_OF]-> 子节点(name: '架空输电线路本体工程')。
识别目标对象:仅从业务结构中识别如下类型:ProjectDivisionItem、ProjectAttributeSet、FeeSchedule、FeeItem的核心对象。对象类型必须精确映射到结构中的节点标签(例如,使用 ProjectDivisionItem 而非“项目划分项”)。
提取查询条件:从用户输入中解析关键条件(如名称、量、类型、值、层级等),条件应基于对象属性(如 name、quantity、type),注意区分查找子串和相等的区别。如果条件涉及层级路径(如路径中包含特定部分),需提取路径部分作为条件(例如,用户提到“架空输电线路”时,解析为路径匹配)。
如果用户指定层级(如“叶节点”),需在条件中体现(例如,添加 WHERE item.isLeaf = true)。
忽略任何计算、转换或后处理要求(如“乘以1000”),只关注获取原始数据对象或属性。
构建Cypher查询:生成一个Cypher查询语句,格式为:
MATCH 子句:匹配目标对象节点,并应用条件。如果涉及层级路径,使用路径匹配(如 MATCH path = (item1:ProjectDivisionItem)-[:CHILD_OF*]->(item2:ProjectDivisionItem) WHERE item1.name = '安装' AND item2.name = '架空输电线路本体工程')。变量仅用于目标节点和必要路径节点。
WHERE 子句:包含提取的条件(使用变量或具体值)。
RETURN 子句:必须返回对象(如 RETURN item),不能包含对象属性、函数(如乘法、SUM)。
LIMIT 子句: 最多返回5条。
使用业务术语在节点标签和属性中(例如,ProjectDivisionItem 而不是“项目”)。
查询应简洁,只获取数据,不执行计算。
输出格式:直接输出最终Cypher查询语句,不添加解释或额外文本。
**示例**:
用户问题:查找一下名称中包含工程的项目划分
Cypher查询语句:MATCH (item:ProjectDivisionItem)\nWHERE item.name CONTAINS '工程'\nRETURN item\nLIMIT 5
""")
return CodeExecutorPrompts(
understand_prompt=understand_prompt,
code_gen_prompt=code_gen_prompt,
code_fix_prompt=code_fix_prompt,
rewrite_prompt_template=rewrite_prompt_template,
cypher_conversion_prompt=cypher_conversion_prompt,
)
current_file = os.path.splitext(os.path.basename(__file__))[0]
now_str = datetime.now().strftime("%Y%m%d%H%M%S")
log_filename = f"{current_file}_{now_str}.log"
logging.basicConfig(
level=logging.DEBUG,
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
handlers=[
logging.FileHandler(os.path.join("logs", log_filename), encoding="utf-8"),
logging.StreamHandler()
],
)
logger = logging.getLogger(current_file)
@dataclass
class CodeExecutorPrompts:
understand_prompt: ChatPromptTemplate
code_gen_prompt: ChatPromptTemplate
code_fix_prompt: ChatPromptTemplate
rewrite_prompt_template: ChatPromptTemplate
cypher_conversion_prompt: ChatPromptTemplate # 新增Cypher转换提示模板
class PromptManager:
def __init__(self):
self.prompts = self._init_prompts()
def _init_prompts(self) -> CodeExecutorPrompts:
understand_prompt = ChatPromptTemplate.from_template(
"""
你是一名电力造价业务专家,请基于以下示意工程文件业务结构,将用户自然语言问题改写成专业查询语句:
**示意工程文件业务结构**
{business_structure}
**改写规则**
1. **定位目标对象**:仅从示意工程文件业务结构中识别核心对象(如 `ProjectDivisionTree`→项目划分树、`FeeScheduleItem`→费用表)。
2. **提取条件**:从用户输入中解析关键条件(如名称、量、类型),用【】标注变量。
3. **构建专业语句**:格式为:`在[目标对象]中查找【条件】的项。`
- 使用业务术语(如“项目划分项”而非“项目”)。
- 条件需明确属性(如【名称】、【量】、【类型】)。
4. **精确映射结构**:若用户查询层级(如“叶节点”),需在条件中体现。
**用户输入**{user_input}
**改写输出**:(仅输出改写后的语句)
"""
)
code_gen_prompt = ChatPromptTemplate.from_template(
"""
你是一个专业的Python工程师。我会给你一个用户问题,你需要将其转换为对应的Python代码
用户问题:
{user_request}
上下文信息:
{context}
工程数据访问库:
{bowei_api_docs}
# 工作流程
1. 从用户问题中提取关键信息(节点路径、节点类型、节点名称等)
2. 根据"用户问题""上下文信息"选择最匹配的"工程数据访问库"中的函数和对象属性
3. 生成可直接执行的完全满足用户输入问题要求功能效果的Python函数代码
# 输出格式(必须严格遵循)
def project_get_calculate_function():
project = ProjectBuilder.build()
result_dict = project.[SELECTED_METHOD]([PARAMETERS])
status = result_dict.get('status', False)
message = result_dict.get('message', '')
code = result_dict.get('data', '')
data = result_dict.get('data', [])
if status:
return result_dict
else:
return result_dict
# 执行规则
- 参数必须从用户问题或上下文信息中提取
- 输出代码中必须以def project_get_calculate_function() -> dict函数作为入口函数
- 必须确保生成的代码可以直接执行,代码要注意进行各类错误检查,出错采用抛出异常方式,说明详细信息
- 禁止添加任何注释或解释
- ProjectToolkit 类中涉及项目划分的函数已考虑在其及其子孙项目划分下查找,所以无需生成递归子项目划分的代码
- 参数必须从用户问题或上下文信息中提取
- 为函数内部代码生成流程注释,并使用logger进行日志输出,在函数外禁止生成任何注释或解释或非代码内容。
- 输出代码中必须以def project_get_calculate_function() -> dict函数作为入口函数,该函数返回字典包含:'code''status''message''data'四个字段。
- 必须确保生成的代码可以直接执行,代码要注意进行各类容错检查。
- 'data'字段通常要求是浮点或整型值,除非用户要求返回其他类型,同时函数执行过程中发生错误,'data'字段也必须为0,并在message说明错误原因。
- ProjectToolkit 类中涉及项目划分的函数已考虑在其及其子孙项目划分下查找,所以无需生成递归子项目划分的代码。
- 如果文本中包含范围编码格式则需要进行编码展开,如'YX2-1~7'展开为‘YX2-1/YX2-2/YX2-3/YX2-4/YX2-5/YX2-6/YX2-7
"""
)
-12
View File
@@ -12,18 +12,6 @@ from typing import List, Dict, Any
import asyncio
current_file = os.path.splitext(os.path.basename(__file__))[0]
now_str = datetime.now().strftime("%Y%m%d%H%M%S")
log_filename = f"{current_file}_{now_str}.log"
logging.basicConfig(
level=logging.DEBUG,
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
handlers=[
logging.FileHandler(os.path.join("logs", log_filename), encoding="utf-8"),
logging.StreamHandler()
],
)
logger = logging.getLogger(current_file)
class BusinessObject(BaseModel):
+43 -43
View File
@@ -1,46 +1,46 @@
{"name": "杆塔总基数", "query": "从【架空输电线路本体工程/基础工程】及其子孙项目划分中查找编码中包含【YX2-1~7】的所有【定额】的【数量】之和", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n path = '架空输电线路本体工程/基础工程'\n quantity_type = '定额'\n code = 'YX2-1/YX2-2/YX2-3/YX2-4/YX2-5/YX2-6/YX2-7'\n result_dict = project.get_quantities_node_by_parent_and_code(path, quantity_type, code)\n status = result_dict.get('status', False)\n if not status:\n return result_dict\n data = result_dict.get('data', [])\n total_quantity = 0.0\n for item in data:\n if isinstance(item, dict) and '数量' in item:\n try:\n total_quantity += float(item['数量'])\n except (ValueError, TypeError):\n continue\n return {'code': 200, 'message': 'Ok', 'status': True, 'data': total_quantity}"}
{"name": "角钢塔_塔材量", "query": "从【架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立】及其子孙项目划分中查找名称中包含【角钢】的所有【主材】的【数量】之和", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_quantities_node_by_parent_and_name(\n parent_path=\"架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立\",\n partial_name=\"角钢\",\n quantity_type=\"主材\"\n )\n status = result_dict.get('status', False)\n if not status:\n return result_dict\n \n data = result_dict.get('data', [])\n total_quantity = 0.0\n \n for item in data:\n if isinstance(item, dict) and item.get('类型') == '主材' and '角钢' in item.get('name', ''):\n try:\n quantity = float(item.get('数量', 0))\n total_quantity += quantity\n except (ValueError, TypeError):\n continue\n \n return {\n 'code': 200,\n 'message': 'Ok',\n 'status': True,\n 'data': total_quantity\n }"}
{"name": "角钢塔_其中:高强钢塔材量", "query": "从【架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立】及其子孙项目划分中查找名称中包含【角钢、高强】的所有【主材】的【数量】之和", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n path = \"架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立\"\n result = project.get_quantities_node_by_parent_and_name(path, \"角钢、高强\", \"主材\")\n if not result.get('status', False):\n return result\n \n total_quantity = 0.0\n for item in result.get('data', []):\n if isinstance(item, dict) and item.get('类型') == '主材' and '数量' in item:\n try:\n total_quantity += float(item['数量'])\n except (ValueError, TypeError):\n continue\n \n return {\n 'code': 200,\n 'message': 'Ok',\n 'status': True,\n 'data': total_quantity\n }"}
{"name": "角钢塔_塔材装材费_元", "query": "从【架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立】及其子孙项目划分中查找名称中包含【角钢】的所有【主材】的【单价】之和", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n \n parent_path = \"架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立\"\n quantity_type = \"主材\"\n partial_name = \"角钢\"\n \n result_dict = project.get_quantities_node_by_parent_and_name(parent_path, partial_name, quantity_type)\n status = result_dict.get('status', False)\n data = result_dict.get('data', [])\n \n if not status:\n return {'code': 201, 'message': '查询失败: ' + result_dict.get('message', ''), 'status': False, 'data': []}\n \n total_price = 0.0\n for item in data:\n if isinstance(item, Material) and '单价含税' in item.__dict__:\n try:\n price = float(item.单价含税)\n total_price += price\n except (ValueError, TypeError):\n continue\n \n return {'code': 200, 'message': 'Ok', 'status': True, 'data': total_price}"}
{"name": "角钢塔_其中:高强钢塔材费用_元", "query": "从【架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立】及其子孙项目划分中查找名称中包含【角钢、高强】的所有【主材】的【单价】之和", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n \n parent_path = \"架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立\"\n quantity_type = \"主材\"\n partial_name = \"角钢、高强\"\n \n result_dict = project.get_quantities_node_by_parent_and_name(parent_path, partial_name, quantity_type)\n status = result_dict.get('status', False)\n data = result_dict.get('data', [])\n \n if not status:\n return {'code': 201, 'message': '查询失败: ' + result_dict.get('message', ''), 'status': False, 'data': []}\n \n total_price = 0.0\n for item in data:\n if isinstance(item, dict) and '单价含税' in item:\n try:\n price = float(item['单价含税'])\n total_price += price\n except (ValueError, TypeError):\n continue\n \n return {'code': 200, 'message': 'Ok', 'status': True, 'data': total_price}"}
{"name": "钢管塔_塔材量", "query": "从【架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立】及其子孙项目划分中查找名称中包含【钢管塔】的所有【主材】的【数量】之和", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_quantities_node_by_parent_and_name(\n parent_path=\"架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立\",\n partial_name=\"钢管塔\",\n quantity_type=\"主材\"\n )\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n data = result_dict.get('data', [])\n \n if not status:\n return {'code': 201, 'message': message, 'status': False, 'data': 0}\n \n total_quantity = 0\n for item in data:\n if isinstance(item, dict) and item.get('类型') == '主材' and '钢管塔' in item.get('name', ''):\n try:\n quantity = float(item.get('数量', 0))\n total_quantity += quantity\n except (ValueError, TypeError):\n continue\n \n return {'code': 200, 'message': 'Ok', 'status': True, 'data': total_quantity}"}
{"name": "钢管塔_钢管价格_元", "query": "从【架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立】及其子孙项目划分中查找名称中包含【钢管塔】的所有【主材】的【单价】之和", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n parent_path = \"架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立\"\n result_dict = project.get_quantities_node_by_parent_and_name(parent_path, \"钢管塔\", \"主材\")\n status = result_dict.get('status', False)\n data = result_dict.get('data', [])\n if not status:\n return result_dict\n \n total_price = 0.0\n for item in data:\n if isinstance(item, Material) and \"钢管塔\" in item.name:\n try:\n price = float(item.单价含税) if item.单价含税 else 0.0\n total_price += price\n except (ValueError, AttributeError):\n continue\n \n return {\n 'code': 200,\n 'message': 'Ok',\n 'status': True,\n 'data': total_price\n }"}
{"name": "钢管杆_塔材量", "query": "从【架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立】及其子孙项目划分中查找名称中包含【钢管杆】的所有【主材】的【数量】之和", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n path = \"架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立\"\n result_dict = project.get_quantities_node_by_parent_and_name(path, \"钢管杆\", \"主材\")\n status = result_dict.get('status', False)\n data = result_dict.get('data', [])\n if not status:\n return result_dict\n \n total_quantity = 0.0\n for item in data:\n if isinstance(item, Material) and \"钢管杆\" in item.name:\n try:\n quantity = float(item.数量) if item.数量 else 0.0\n total_quantity += quantity\n except (ValueError, TypeError):\n continue\n \n return {\n 'code': 200,\n 'message': 'Ok',\n 'status': True,\n 'data': total_quantity\n }"}
{"name": "钢管杆_钢管价格_元", "query": "从【架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立】及其子孙项目划分中查找名称中包含【钢管杆】的所有【主材】的【单价】之和", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result = project.get_division_node_by_parent_and_name(\n parent_path=\"架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立\",\n partial_name=\"钢管杆\"\n )\n if not result.get('status', False):\n return result\n \n total_price = 0.0\n for division in result.get('data', []):\n materials_result = project.get_quantities_node_by_parent_and_name(\n parent_path=division['constraints']['path'],\n partial_name=\"主材\",\n quantity_type=\"主材\"\n )\n if not materials_result.get('status', False):\n continue\n \n for material in materials_result.get('data', []):\n if \"钢管杆\" in material.get('name', ''):\n price = float(material.get('单价含税', 0)) if material.get('单价含税') else 0.0\n total_price += price\n \n return {\n 'code': 200,\n 'message': 'Ok',\n 'status': True,\n 'data': total_price\n }"}
{"name": "导线及线材_分裂数", "query": "从【架空输电线路本体工程/架线工程】及其子孙项目划分中查找编码中包含【['YX5-67', 'YX5-68', 'YX5-69', 'YX5-78', 'YX5-79', 'YX5-59', 'YX5-60', 'YX5-61', 'YX5-62', 'YX5-63', 'YX5-64', 'YX5-65', 'YX5-66', 'YX5-74', 'YX5-75', 'YX5-76', 'YX5-77', 'YX5-52', 'YX5-53', 'YX5-54', 'YX5-55', 'YX5-56', 'YX5-57', 'YX5-58', 'YX5-70', 'YX5-71', 'YX5-72', 'YX5-73', 'YX5-14', 'YX5-15', 'YX5-16', 'YX5-17', 'YX5-43', 'YX5-44', 'YX5-45', 'YX5-46', 'YX5-47', 'YX5-48', 'YX5-49', 'YX5-50', 'YX5-51', 'YX5-10', 'YX5-11', 'YX5-12', 'YX5-13', 'YX5-38', 'YX5-39', 'YX5-40', 'YX5-41', 'YX5-42', 'YX5-8', 'YX5-9']】的所有【定额】的【参数】之和", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n target_codes = ['YX5-67', 'YX5-68', 'YX5-69', 'YX5-78', 'YX5-79', 'YX5-59', 'YX5-60', 'YX5-61', 'YX5-62', 'YX5-63', 'YX5-64', 'YX5-65', 'YX5-66', 'YX5-74', 'YX5-75', 'YX5-76', 'YX5-77', 'YX5-52', 'YX5-53', 'YX5-54', 'YX5-55', 'YX5-56', 'YX5-57', 'YX5-58', 'YX5-70', 'YX5-71', 'YX5-72', 'YX5-73', 'YX5-14', 'YX5-15', 'YX5-16', 'YX5-17', 'YX5-43', 'YX5-44', 'YX5-45', 'YX5-46', 'YX5-47', 'YX5-48', 'YX5-49', 'YX5-50', 'YX5-51', 'YX5-10', 'YX5-11', 'YX5-12', 'YX5-13', 'YX5-38', 'YX5-39', 'YX5-40', 'YX5-41', 'YX5-42', 'YX5-8', 'YX5-9']\n parent_path = '架空输电线路本体工程/架线工程'\n quantity_type = '定额'\n total_parameter = 0.0\n \n for code in target_codes:\n result_dict = project.get_quantities_node_by_parent_and_code(parent_path, quantity_type, code)\n status = result_dict.get('status', False)\n if not status:\n continue\n data = result_dict.get('data', [])\n if isinstance(data, list):\n for item in data:\n if isinstance(item, dict) and '参数' in item:\n try:\n total_parameter += float(item['参数'])\n except (ValueError, TypeError):\n pass\n elif isinstance(data, dict) and '参数' in data:\n try:\n total_parameter += float(data['参数'])\n except (ValueError, TypeError):\n pass\n \n return {\n 'code': 200,\n 'message': 'Ok',\n 'status': True,\n 'data': total_parameter\n }"}
{"name": "导线及线材_其中:节能导线量", "query": "从【架空输电线路本体工程/架线工程/导地线架设@@架空输电线路本体工程/架线工程/导地线跨越架设】及其子孙项目划分中查找名称中包含【高导电率】的所有【主材】的【数量】之和", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n total_quantity = 0.0\n \n paths = [\n \"架空输电线路本体工程/架线工程/导地线架设\",\n \"架空输电线路本体工程/架线工程/导地线跨越架设\"\n ]\n \n for path in paths:\n result = project.get_quantities_node_by_parent_and_name(\n parent_path=path,\n partial_name=\"高导电率\",\n quantity_type=\"主材\"\n )\n \n if not result.get('status', False):\n continue\n \n materials = result.get('data', [])\n if not isinstance(materials, list):\n materials = [materials]\n \n for material in materials:\n if not isinstance(material, dict):\n continue\n if '数量' in material:\n try:\n total_quantity += float(material['数量'])\n except (ValueError, TypeError):\n pass\n \n return {\n 'code': 200 if total_quantity > 0 else 201,\n 'message': 'Ok' if total_quantity > 0 else 'No matching materials found',\n 'status': total_quantity > 0,\n 'data': total_quantity\n }"}
{"name": "导线及线材_导线装材费_元", "query": "从【架空输电线路本体工程/架线工程/导地线架设@@架空输电线路本体工程/架线工程/导地线跨越架设】及其子孙项目划分中查找名称中包含【线】的所有【主材】的【单价】之和", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n total_price = 0.0\n \n paths = [\n \"架空输电线路本体工程/架线工程/导地线架设\",\n \"架空输电线路本体工程/架线工程/导地线跨越架设\"\n ]\n \n for path in paths:\n result = project.get_quantities_node_by_parent_and_name(\n parent_path=path,\n partial_name=\"线\",\n quantity_type=\"主材\"\n )\n \n if not result.get('status', False):\n continue\n \n materials = result.get('data', [])\n for material in materials:\n if isinstance(material, dict):\n price_str = material.get('单价含税', '0')\n try:\n price = float(price_str) if price_str else 0.0\n total_price += price\n except ValueError:\n continue\n \n return {\n 'code': 200,\n 'message': 'Ok',\n 'status': True,\n 'data': total_price\n }"}
{"name": "导线及线材_其中:节能导线费用_元", "query": "从【架空输电线路本体工程/架线工程/导地线架设@@架空输电线路本体工程/架线工程/导地线跨越架设】及其子孙项目划分中查找名称中包含【高导电率】的所有【主材】的【单价】之和", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n total_price = 0.0\n \n paths = [\n \"架空输电线路本体工程/架线工程/导地线架设\",\n \"架空输电线路本体工程/架线工程/导地线跨越架设\"\n ]\n \n for path in paths:\n result = project.get_quantities_node_by_parent_and_name(\n parent_path=path,\n partial_name=\"高导电率\",\n quantity_type=\"主材\"\n )\n \n if not result.get('status', False):\n continue\n \n materials = result.get('data', [])\n for material in materials:\n if not isinstance(material, dict):\n continue\n \n price_str = material.get('单价含税', '0')\n try:\n price = float(price_str)\n total_price += price\n except ValueError:\n continue\n \n return {\n 'code': 200,\n 'message': 'Ok',\n 'status': True,\n 'data': total_price\n }"}
{"name": "导线及线材_导线类型", "query": "从【架空输电线路本体工程/架线工程/导地线架设@@架空输电线路本体工程/架线工程/导地线跨越架设@@架空输电线路本体工程/架线工程/其他架线工程】及其子孙项目划分中查找名称中包含【['钢芯铝绞线', '铝包钢芯铝绞线', '中强度铝合金绞线', '铝合金芯铝绞线', '铝合金芯高导电率铝绞线', '钢芯高导电率铝绞线', '特高强度钢芯铝合金绞线', '扩径导线', '耐热导线', '碳纤维导线']】的所有【主材】的【参数】之和", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n parent_paths = [\n \"架空输电线路本体工程/架线工程/导地线架设\",\n \"架空输电线路本体工程/架线工程/导地线跨越架设\",\n \"架空输电线路本体工程/架线工程/其他架线工程\"\n ]\n material_names = [\n '钢芯铝绞线', '铝包钢芯铝绞线', '中强度铝合金绞线', '铝合金芯铝绞线', \n '铝合金芯高导电率铝绞线', '钢芯高导电率铝绞线', '特高强度钢芯铝合金绞线', \n '扩径导线', '耐热导线', '碳纤维导线'\n ]\n total_params = 0.0\n\n for parent_path in parent_paths:\n for material_name in material_names:\n result_dict = project.get_quantities_node_by_parent_and_name(\n parent_path=parent_path,\n partial_name=material_name,\n quantity_type='主材'\n )\n if not result_dict.get('status', False):\n continue\n materials = result_dict.get('data', [])\n for material in materials:\n if isinstance(material, dict) and '参数' in material:\n try:\n param_value = float(material['参数'])\n total_params += param_value\n except (ValueError, TypeError):\n continue\n\n return {\n 'code': 200,\n 'message': 'Ok',\n 'status': True,\n 'data': total_params\n }"}
{"name": "基础钢材量", "query": "从【架空输电线路本体工程/基础工程/基础砌筑】及其子孙项目划分中查找名称中包含【圆钢】的所有【主材】的【数量】之和", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_quantities_node_by_parent_and_name(\n parent_path=\"架空输电线路本体工程/基础工程/基础砌筑\",\n partial_name=\"圆钢\",\n quantity_type=\"主材\"\n )\n status = result_dict.get('status', False)\n if not status:\n return result_dict\n \n data = result_dict.get('data', [])\n total_quantity = 0.0\n \n for item in data:\n if isinstance(item, dict) and item.get(\"类型\") == \"主材\" and \"圆钢\" in item.get(\"name\", \"\"):\n try:\n quantity = float(item.get(\"数量\", 0))\n total_quantity += quantity\n except (ValueError, TypeError):\n continue\n \n return {\n 'code': 200,\n 'message': 'Ok',\n 'status': True,\n 'data': total_quantity\n }"}
{"name": "基础钢材价格", "query": "从【架空输电线路本体工程/基础工程/基础砌筑】及其子孙项目划分中查找名称中包含【圆钢】的所有【主材】的【单价】之和", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n base_path = \"架空输电线路本体工程/基础工程/基础砌筑\"\n total_price = 0.0\n \n def process_division(path):\n nonlocal total_price\n quantities_result = project.get_quantities_node_by_parent_and_name(path, \"圆钢\", \"主材\")\n if quantities_result.get('status'):\n for material_data in quantities_result.get('data', []):\n material = Material()\n material.__dict__.update(material_data)\n if \"单价含税\" in material.__dict__ and material.单价含税:\n try:\n total_price += float(material.单价含税)\n except (ValueError, TypeError):\n pass\n \n children_result = project.get_division_node_by_parent_and_name(path, \"\")\n if children_result.get('status'):\n for child_data in children_result.get('data', []):\n if 'path' in child_data:\n process_division(child_data['path'])\n \n process_division(base_path)\n \n return {\n 'code': 200,\n 'message': 'Ok',\n 'status': True,\n 'data': total_price\n }"}
{"name": "本体费用合计_元", "query": "从【工程费用】中获取【架空输电线路本体工程.合计费】的属性", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_schedule_on_Engineering_Cost_table(\"工程费用\", \"架空输电线路本体工程.合计费\", \"合计费\")\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "本体工程人工费_本体_元", "query": "从【架空输电线路本体工程】项目划分中获取名称属于【本体工程人工费_本体_元】的费用", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_division_node_by_parent_and_name('架空输电线路本体工程', '本体工程人工费_本体_元')\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', [])\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "本体工程人工费_调试_元", "query": "从【架空输电线路本体工程】项目划分中获取名称属于【本体工程人工费_调试_元】的费用", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_division_node_by_parent_and_name('架空输电线路本体工程', '本体工程人工费_调试_元')\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', [])\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "本体工程机械费_本体_元", "query": "从【架空输电线路本体工程】项目划分中获取名称属于【本体工程机械费_本体_元】的费用", "code": "根据用户问题和上下文信息,我将生成对应的Python代码:\n\n```python\ndef project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_table_by_project_division(\n project_division_path=\"架空输电线路本体工程\",\n fee_name=\"本体工程机械费_本体_元\"\n )\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('data', '')\n data = result_dict.get('data', [])\n if status:\n return result_dict\n else:\n return result_dict\n```"}
{"name": "本体工程机械费_调试_元", "query": "从【架空输电线路本体工程】项目划分中获取名称属于【本体工程机械费_调试_元】的费用", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_division_node_by_parent_and_name('架空输电线路本体工程', '本体工程机械费_调试_元')\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', [])\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "基础工程费用_元", "query": "从【架空输电线路本体工程/基础工程】项目划分中获取名称属于【基础工程费用_元】的费用", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_table_by_project_division(\"架空输电线路本体工程/基础工程\", \"基础工程费用_元\")\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "杆塔工程费用_元", "query": "从【架空输电线路本体工程/杆塔工程】项目划分中获取名称属于【杆塔工程费用_元】的费用", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_table_by_project_division(\"架空输电线路本体工程/杆塔工程\", \"杆塔工程费用_元\")\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "接地工程费用_元", "query": "从【架空输电线路本体工程/接地工程】项目划分中获取名称属于【接地工程费用_元】的费用", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_table_by_project_division(\"架空输电线路本体工程/接地工程\", \"接地工程费用_元\")\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "架线工程费用_元", "query": "从【架空输电线路本体工程/架线工程】项目划分中获取名称属于【架线工程费用_元】的费用", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_table_by_project_division(\"架空输电线路本体工程/架线工程\", \"架线工程费用_元\")\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "附件工程费用_元", "query": "从【架空输电线路本体工程/附件安装工程】项目划分中获取名称属于【附件工程费用_元】的费用", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_table_by_project_division(\"架空输电线路本体工程/附件安装工程\", \"附件工程费用_元\")\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "辅助工程费用_元", "query": "从【架空输电线路本体工程/辅助工程】项目划分中获取名称属于【辅助工程费用_元】的费用", "code": "根据用户问题和上下文信息,我们需要从\"架空输电线路本体工程/辅助工程\"项目划分中获取名称为\"辅助工程费用_元\"的费用。根据工程数据访问库,最匹配的方法是`get_fee_table_by_project_division`。\n\ndef project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_table_by_project_division(\n project_division_path=\"架空输电线路本体工程/辅助工程\",\n fee_name=\"辅助工程费用_元\"\n )\n status = result_dict.get('status', False)\n if not status:\n raise Exception(f\"获取费用失败: {result_dict.get('message', '未知错误')}\")\n return result_dict"}
{"name": "辅助工程费用_调试_元", "query": "从【架空输电线路本体工程/辅助工程】项目划分中获取名称属于【辅助工程费用_调试_元】的费用", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_table_by_project_division(\"架空输电线路本体工程/辅助工程\", \"辅助工程费用_调试_元\")\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "辅助设施工程_元", "query": "从【工程费用】中获取【辅助设施工程.合计费】的属性", "code": "根据用户问题和上下文信息,我们需要从工程费用表中获取\"辅助设施工程.合计费\"的属性。根据工程数据访问库,最匹配的方法是`get_fee_schedule_on_Engineering_Cost_table`。\n\n```python\ndef project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_schedule_on_Engineering_Cost_table(\"工程费用\", \"辅助设施工程.合计费\", \"合计费\")\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return result_dict\n else:\n return result_dict\n```"}
{"name": "其他费用合计_元", "query": "从【工程费用】中获取【其他费用.合计费】的属性", "code": "根据用户问题和上下文信息,我们需要从\"工程费用\"中获取\"其他费用.合计费\"的属性。根据上下文信息,\"工程费用\"的类型是\"FeeScheduleItem\",而\"其他费用.合计费\"的类型是\"Fee\"。\n\n最匹配的方法是`get_fee_schedule_on_Engineering_Cost_table`,因为它专门用于在工程费用表中查找费用。\n\n```python\ndef project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_schedule_on_Engineering_Cost_table(\n table_name=\"工程费用表\",\n fee_name=\"合计费\",\n fee=\"其他费用\"\n )\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('data', '')\n data = result_dict.get('data', [])\n if status:\n return result_dict\n else:\n return result_dict\n```"}
{"name": "杆塔总基数", "query": "从【架空输电线路本体工程/基础工程】及其子孙项目划分中查找编码中包含【YX2-1~7】的所有【定额】的【数量】之和", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n \n def expand_code_range(code_range):\n if '~' not in code_range:\n return code_range\n prefix, range_part = code_range.split('-')\n start, end = map(int, range_part.split('~'))\n return '/'.join([f\"{prefix}-{i}\" for i in range(start, end + 1)])\n \n expanded_codes = expand_code_range('YX2-1~7')\n \n result_dict = project.get_quantities_node_by_parent_and_code(\n parent_path='架空输电线路本体工程/基础工程',\n quantity_type='定额',\n code=expanded_codes\n )\n \n status = result_dict.get('status', False)\n if not status:\n return result_dict\n \n data = result_dict.get('data', [])\n if not isinstance(data, list):\n data = [data]\n \n total_quantity = 0.0\n for item in data:\n if isinstance(item, dict) and '数量' in item:\n try:\n quantity = float(item['数量'])\n total_quantity += quantity\n except (ValueError, TypeError):\n continue\n \n return {\n 'code': 200,\n 'message': 'Ok',\n 'status': True,\n 'data': {total_quantity}\n }"}
{"name": "角钢塔_塔材量", "query": "从【架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立】及其子孙项目划分中查找名称中包含【角钢】的所有【主材】的【数量】之和", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_quantities_node_by_parent_and_name(\n parent_path='架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立',\n quantity_type='主材',\n partial_name='角钢'\n )\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n data = result_dict.get('data', [])\n if not status:\n return {'code': 201, 'message': message, 'status': False, 'data': 0}\n total_quantity = 0.0\n for item in data:\n if isinstance(item, Material) and '数量' in item.__dict__:\n try:\n total_quantity += float(item.数量)\n except (ValueError, TypeError):\n continue\n return {'code': 200, 'message': 'Ok', 'status': True, 'data': total_quantity}"}
{"name": "角钢塔_其中:高强钢塔材量", "query": "从【架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立】及其子孙项目划分中查找名称中包含【角钢、高强】的所有【主材】的【数量】之和", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n path = \"架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立\"\n result_dict = project.get_quantities_node_by_parent_and_name(path, \"主材\", \"角钢、高强\")\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n data = result_dict.get('data', [])\n if not status:\n return {'code': 201, 'message': message, 'status': False, 'data': 0}\n total = 0.0\n for item in data:\n if isinstance(item, dict) and item.get('类型') == '主材' and '数量' in item:\n try:\n total += float(item['数量'])\n except (ValueError, TypeError):\n continue\n return {'code': 200, 'message': 'Ok', 'status': True, 'data': total}"}
{"name": "角钢塔_塔材装材费_元", "query": "从【架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立】及其子孙项目划分中查找名称中包含【角钢】的所有【主材】的【单价】之和", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n parent_path = \"架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立\"\n quantity_type = \"主材\"\n partial_name = \"角钢\"\n \n result_dict = project.get_quantities_node_by_parent_and_name(parent_path, quantity_type, partial_name)\n status = result_dict.get('status', False)\n data = result_dict.get('data', [])\n \n if not status:\n return {'code': 201, 'message': '查询失败: ' + result_dict.get('message', ''), 'status': False, 'data': []}\n \n total_price = 0.0\n for item in data:\n if isinstance(item, Material) and hasattr(item, '单价含税'):\n try:\n price = float(item.单价含税)\n total_price += price\n except (ValueError, TypeError):\n continue\n \n return {'code': 200, 'message': 'Ok', 'status': True, 'data': total_price}"}
{"name": "角钢塔_其中:高强钢塔材费用_元", "query": "从【架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立】及其子孙项目划分中查找名称中包含【角钢、高强】的所有【主材】的【单价】之和", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n path = '架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立'\n result_dict = project.get_quantities_node_by_parent_and_name(path, '主材', '角钢、高强')\n status = result_dict.get('status', False)\n data = result_dict.get('data', [])\n if not status:\n return {'code': 201, 'message': '查询失败: ' + result_dict.get('message', ''), 'status': False, 'data': []}\n \n total_price = 0.0\n for item in data:\n if isinstance(item, Material) and '单价含税' in item.__dict__:\n try:\n price = float(item.单价含税)\n total_price += price\n except (ValueError, TypeError):\n continue\n \n return {'code': 200, 'message': 'Ok', 'status': True, 'data': total_price}"}
{"name": "钢管塔_塔材量", "query": "从【架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立】及其子孙项目划分中查找名称中包含【钢管塔】的所有【主材】的【数量】之和", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_quantities_node_by_parent_and_name(\n parent_path=\"架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立\",\n quantity_type=\"主材\",\n partial_name=\"钢管塔\"\n )\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n data = result_dict.get('data', [])\n \n if not status:\n return {'code': 201, 'message': message, 'status': False, 'data': 0}\n \n total_quantity = 0\n for item in data:\n if isinstance(item, dict) and '数量' in item:\n try:\n total_quantity += float(item['数量'])\n except (ValueError, TypeError):\n continue\n \n return {'code': 200, 'message': 'Ok', 'status': True, 'data': total_quantity}"}
{"name": "钢管塔_钢管价格_元", "query": "从【架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立】及其子孙项目划分中查找名称中包含【钢管塔】的所有【主材】的【单价】之和", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_quantities_node_by_parent_and_name(\n parent_path='架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立',\n quantity_type='主材',\n partial_name='钢管塔'\n )\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', [])\n if not status:\n return {'status': False, 'message': message, 'code': code, 'data': []}\n \n total_price = 0.0\n for item in data:\n if isinstance(item, Material) and '单价含税' in item.__dict__:\n try:\n price = float(item.单价含税)\n total_price += price\n except (ValueError, TypeError):\n continue\n \n return {'status': True, 'message': 'Ok', 'code': 200, 'data': total_price}"}
{"name": "钢管杆_塔材量", "query": "从【架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立】及其子孙项目划分中查找名称中包含【钢管杆】的所有【主材】的【数量】之和", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_quantities_node_by_parent_and_name(\n parent_path='架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立',\n quantity_type='主材',\n partial_name='钢管杆'\n )\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n data = result_dict.get('data', [])\n if not status:\n return {'code': 201, 'message': message, 'status': False, 'data': []}\n \n total_quantity = 0.0\n for item in data:\n if isinstance(item, dict) and item.get('类型') == '主材' and '钢管杆' in item.get('name', ''):\n try:\n quantity = float(item.get('数量', 0))\n total_quantity += quantity\n except (ValueError, TypeError):\n continue\n \n return {'code': 200, 'message': 'Ok', 'status': True, 'data': total_quantity}"}
{"name": "钢管杆_钢管价格_元", "query": "从【架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立】及其子孙项目划分中查找名称中包含【钢管杆】的所有【主材】的【单价】之和", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_quantities_node_by_parent_and_name(\n parent_path='架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立',\n quantity_type='主材',\n partial_name='钢管杆'\n )\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n data = result_dict.get('data', [])\n if not status:\n return {'code': 201, 'message': message, 'status': False, 'data': []}\n \n total_price = 0.0\n for item in data:\n if isinstance(item, Material) and '钢管杆' in item.name:\n try:\n price = float(item.单价含税) if item.单价含税 else 0.0\n total_price += price\n except (ValueError, AttributeError):\n continue\n \n return {'code': 200, 'message': 'Ok', 'status': True, 'data': total_price}"}
{"name": "导线及线材_分裂数", "query": "从【架空输电线路本体工程/架线工程】及其子孙项目划分中查找编码中包含【['YX5-67', 'YX5-68', 'YX5-69', 'YX5-78', 'YX5-79', 'YX5-59', 'YX5-60', 'YX5-61', 'YX5-62', 'YX5-63', 'YX5-64', 'YX5-65', 'YX5-66', 'YX5-74', 'YX5-75', 'YX5-76', 'YX5-77', 'YX5-52', 'YX5-53', 'YX5-54', 'YX5-55', 'YX5-56', 'YX5-57', 'YX5-58', 'YX5-70', 'YX5-71', 'YX5-72', 'YX5-73', 'YX5-14', 'YX5-15', 'YX5-16', 'YX5-17', 'YX5-43', 'YX5-44', 'YX5-45', 'YX5-46', 'YX5-47', 'YX5-48', 'YX5-49', 'YX5-50', 'YX5-51', 'YX5-10', 'YX5-11', 'YX5-12', 'YX5-13', 'YX5-38', 'YX5-39', 'YX5-40', 'YX5-41', 'YX5-42', 'YX5-8', 'YX5-9']】的所有【定额】的【参数】之和", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n parent_path = \"架空输电线路本体工程/架线工程\"\n quantity_type = \"定额\"\n codes = ['YX5-67', 'YX5-68', 'YX5-69', 'YX5-78', 'YX5-79', 'YX5-59', 'YX5-60', 'YX5-61', 'YX5-62', 'YX5-63', 'YX5-64', 'YX5-65', 'YX5-66', 'YX5-74', 'YX5-75', 'YX5-76', 'YX5-77', 'YX5-52', 'YX5-53', 'YX5-54', 'YX5-55', 'YX5-56', 'YX5-57', 'YX5-58', 'YX5-70', 'YX5-71', 'YX5-72', 'YX5-73', 'YX5-14', 'YX5-15', 'YX5-16', 'YX5-17', 'YX5-43', 'YX5-44', 'YX5-45', 'YX5-46', 'YX5-47', 'YX5-48', 'YX5-49', 'YX5-50', 'YX5-51', 'YX5-10', 'YX5-11', 'YX5-12', 'YX5-13', 'YX5-38', 'YX5-39', 'YX5-40', 'YX5-41', 'YX5-42', 'YX5-8', 'YX5-9']\n code_str = '/'.join(codes)\n result_dict = project.get_quantities_node_by_parent_and_code(parent_path, quantity_type, code_str)\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n data = result_dict.get('data', [])\n if status:\n total = 0.0\n for item in data:\n if isinstance(item, dict) and '参数' in item:\n try:\n total += float(item['参数'])\n except (ValueError, TypeError):\n pass\n return {'code': 200, 'message': 'Ok', 'status': True, 'data': total}\n else:\n return {'code': 201, 'message': message, 'status': False, 'data': 0.0}"}
{"name": "导线及线材_其中:节能导线量", "query": "从【架空输电线路本体工程/架线工程/导地线架设@@架空输电线路本体工程/架线工程/导地线跨越架设】及其子孙项目划分中查找名称中包含【高导电率】的所有【主材】的【数量】之和", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n total_quantity = 0.0\n \n paths = [\n \"架空输电线路本体工程/架线工程/导地线架设\",\n \"架空输电线路本体工程/架线工程/导地线跨越架设\"\n ]\n \n for path in paths:\n result = project.get_quantities_node_by_parent_and_name(\n parent_path=path,\n quantity_type=\"主材\",\n partial_name=\"高导电率\"\n )\n \n if not result.get('status', False):\n continue\n \n materials = result.get('data', [])\n if not isinstance(materials, list):\n materials = [materials]\n \n for material in materials:\n if not isinstance(material, dict):\n continue\n if material.get('类型') != '主材':\n continue\n if '高导电率' not in material.get('name', ''):\n continue\n \n try:\n quantity = float(material.get('数量', 0))\n total_quantity += quantity\n except (ValueError, TypeError):\n continue\n \n return {\n 'code': 200,\n 'message': 'Ok',\n 'status': True,\n 'data': total_quantity\n }"}
{"name": "导线及线材_导线装材费_元", "query": "从【架空输电线路本体工程/架线工程/导地线架设@@架空输电线路本体工程/架线工程/导地线跨越架设】及其子孙项目划分中查找名称中包含【线】的所有【主材】的【单价】之和", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n total_price = 0.0\n \n paths = [\n \"架空输电线路本体工程/架线工程/导地线架设\",\n \"架空输电线路本体工程/架线工程/导地线跨越架设\"\n ]\n \n for path in paths:\n quantities_result = project.get_quantities_node_by_parent_and_name(path, \"主材\", \"线\")\n if not quantities_result.get('status', False):\n continue\n \n materials = quantities_result.get('data', [])\n for material in materials:\n if not isinstance(material, dict):\n continue\n \n price_str = material.get('单价含税', '0')\n try:\n price = float(price_str)\n total_price += price\n except ValueError:\n continue\n \n return {\n 'code': 200,\n 'message': 'Ok',\n 'status': True,\n 'data': total_price\n }"}
{"name": "导线及线材_其中:节能导线费用_元", "query": "从【架空输电线路本体工程/架线工程/导地线架设@@架空输电线路本体工程/架线工程/导地线跨越架设】及其子孙项目划分中查找名称中包含【高导电率】的所有【主材】的【单价】之和", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n total_price = 0.0\n \n paths = [\n \"架空输电线路本体工程/架线工程/导地线架设\",\n \"架空输电线路本体工程/架线工程/导地线跨越架设\"\n ]\n \n for path in paths:\n quantities_result = project.get_quantities_node_by_parent_and_name(\n parent_path=path,\n quantity_type=\"主材\",\n partial_name=\"高导电率\"\n )\n \n if not quantities_result.get('status', False):\n continue\n \n materials = quantities_result.get('data', [])\n if not isinstance(materials, list):\n materials = [materials]\n \n for material in materials:\n if not isinstance(material, dict):\n continue\n \n price_str = material.get('单价含税', '0')\n try:\n price = float(price_str)\n total_price += price\n except ValueError:\n continue\n \n return {\n 'code': 200 if total_price > 0 else 201,\n 'message': 'Ok' if total_price > 0 else 'No matching materials found',\n 'status': total_price > 0,\n 'data': total_price\n }"}
{"name": "导线及线材_导线类型", "query": "从【架空输电线路本体工程/架线工程/导地线架设@@架空输电线路本体工程/架线工程/导地线跨越架设@@架空输电线路本体工程/架线工程/其他架线工程】及其子孙项目划分中查找名称中包含【['钢芯铝绞线', '铝包钢芯铝绞线', '中强度铝合金绞线', '铝合金芯铝绞线', '铝合金芯高导电率铝绞线', '钢芯高导电率铝绞线', '特高强度钢芯铝合金绞线', '扩径导线', '耐热导线', '碳纤维导线']】的所有【主材】的【参数】之和", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n parent_paths = [\n \"架空输电线路本体工程/架线工程/导地线架设\",\n \"架空输电线路本体工程/架线工程/导地线跨越架设\",\n \"架空输电线路本体工程/架线工程/其他架线工程\"\n ]\n material_names = [\n '钢芯铝绞线', '铝包钢芯铝绞线', '中强度铝合金绞线', '铝合金芯铝绞线', \n '铝合金芯高导电率铝绞线', '钢芯高导电率铝绞线', '特高强度钢芯铝合金绞线', \n '扩径导线', '耐热导线', '碳纤维导线'\n ]\n total_params = 0.0\n \n for parent_path in parent_paths:\n for material_name in material_names:\n result_dict = project.get_quantities_node_by_parent_and_name(\n parent_path=parent_path,\n quantity_type='主材',\n partial_name=material_name\n )\n if not result_dict.get('status', False):\n continue\n \n materials = result_dict.get('data', [])\n if not isinstance(materials, list):\n materials = [materials]\n \n for material in materials:\n if not isinstance(material, dict):\n continue\n if '参数' in material:\n try:\n param_value = float(material['参数'])\n total_params += param_value\n except (ValueError, TypeError):\n pass\n \n return {\n 'code': 200,\n 'message': 'Ok',\n 'status': True,\n 'data': total_params\n }"}
{"name": "基础钢材量", "query": "从【架空输电线路本体工程/基础工程/基础砌筑】及其子孙项目划分中查找名称中包含【圆钢】的所有【主材】的【数量】之和", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n base_path = \"架空输电线路本体工程/基础工程/基础砌筑\"\n \n result = project.get_quantities_node_by_parent_and_name(\n parent_path=base_path,\n quantity_type=\"主材\",\n partial_name=\"圆钢\"\n )\n \n if not result.get('status', False):\n return {\n 'code': 201,\n 'message': f\"查询失败: {result.get('message', '未知错误')}\",\n 'status': False,\n 'data': []\n }\n \n materials = result.get('data', [])\n total_quantity = 0.0\n \n for material in materials:\n if isinstance(material, dict) and material.get('类型') == '主材' and '圆钢' in material.get('name', ''):\n try:\n quantity = float(material.get('数量', 0))\n total_quantity += quantity\n except (ValueError, TypeError):\n continue\n \n return {\n 'code': 200,\n 'message': 'Ok',\n 'status': True,\n 'data': {\n 'total_quantity': total_quantity,\n 'unit': '根据具体主材单位确定'\n }\n }"}
{"name": "基础钢材价格", "query": "从【架空输电线路本体工程/基础工程/基础砌筑】及其子孙项目划分中查找名称中包含【圆钢】的所有【主材】的【单价】之和", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n base_path = \"架空输电线路本体工程/基础工程/基础砌筑\"\n total_price = 0.0\n \n def process_division(path):\n nonlocal total_price\n quantities_result = project.get_quantities_node_by_parent_and_name(path, \"主材\", \"圆钢\")\n if quantities_result.get('status'):\n materials = quantities_result.get('data', [])\n for material in materials:\n if isinstance(material, dict):\n material_obj = Material()\n material_obj.__dict__.update(material)\n if \"单价含税\" in material and material[\"单价含税\"]:\n try:\n total_price += float(material[\"单价含税\"])\n except (ValueError, TypeError):\n pass\n \n children_result = project.get_division_node_by_parent_and_name(path, \"\")\n if children_result.get('status'):\n children = children_result.get('data', [])\n for child in children:\n if isinstance(child, dict) and \"path\" in child:\n process_division(child[\"path\"])\n \n process_division(base_path)\n \n return {\n 'code': 200,\n 'message': 'Ok',\n 'status': True,\n 'data': total_price\n }"}
{"name": "本体费用合计_元", "query": "从【工程费用】中获取【架空输电线路本体工程.合计费】的属性", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_schedule_on_Engineering_Cost_table(\"工程费用\", \"架空输电线路本体工程.合计费\", \"amount\")\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "本体工程人工费_本体_元", "query": "从【架空输电线路本体工程】项目划分中获取名称属于【人工费】的费用", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_division_node_by_parent_and_name('架空输电线路本体工程', '人工费')\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', [])\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "本体工程人工费_调试_元", "query": "从【架空输电线路本体工程】项目划分中获取名称属于【人工费】的费用", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_division_node_by_parent_and_name('架空输电线路本体工程', '人工费')\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', [])\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "本体工程机械费_本体_元", "query": "从【架空输电线路本体工程】项目划分中获取名称属于【施工机械使用费】的费用", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_division_node_by_parent_and_name('架空输电线路本体工程', '施工机械使用费')\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', [])\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "本体工程机械费_调试_元", "query": "从【架空输电线路本体工程】项目划分中获取名称属于【施工机械使用费】的费用", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_division_node_by_parent_and_name('架空输电线路本体工程', '施工机械使用费')\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', [])\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "基础工程费用_元", "query": "从【架空输电线路本体工程/基础工程】项目划分中获取名称属于【合计】的费用", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_division_node_by_parent_and_name('架空输电线路本体工程/基础工程', '合计')\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', [])\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "杆塔工程费用_元", "query": "从【架空输电线路本体工程/杆塔工程】项目划分中获取名称属于【合计】的费用", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_division_node_by_parent_and_name('架空输电线路本体工程/杆塔工程', '合计')\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', [])\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "接地工程费用_元", "query": "从【架空输电线路本体工程/接地工程】项目划分中获取名称属于【合计】的费用", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_division_node_by_parent_and_name('架空输电线路本体工程/接地工程', '合计')\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', [])\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "架线工程费用_元", "query": "从【架空输电线路本体工程/架线工程】项目划分中获取名称属于【合计】的费用", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_division_node_by_parent_and_name('架空输电线路本体工程/架线工程', '合计')\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', [])\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "附件工程费用_元", "query": "从【架空输电线路本体工程/附件安装工程】项目划分中获取名称属于【合计】的费用", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_division_node_by_parent_and_name('架空输电线路本体工程/附件安装工程', '合计')\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', [])\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "辅助工程费用_元", "query": "从【架空输电线路本体工程/辅助工程】项目划分中获取名称属于【合计】的费用", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_division_node_by_parent_and_name('架空输电线路本体工程/辅助工程', '合计')\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', [])\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "辅助工程费用_调试_元", "query": "从【架空输电线路本体工程/辅助工程】项目划分中获取名称属于【合计】的费用", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_division_node_by_parent_and_name(\"架空输电线路本体工程/辅助工程\", \"合计\")\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', [])\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "辅助设施工程_元", "query": "从【工程费用】中获取【辅助设施工程.合计费】的属性", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_schedule_on_Engineering_Cost_table(\"工程费用\", \"辅助设施工程.合计费\", \"合计费\")\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "其他费用合计_元", "query": "从【工程费用】中获取【其他费用.合计费】的属性", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_schedule_on_Engineering_Cost_table(\"工程费用表\", \"其他费用.合计费\", \"合计费\")\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "建场费合计_元", "query": "从【其他费用】中获取【建设场地征用及清理费】的属性", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_schedule_on_other_expense_table('其他费用表', '建设场地征用及清理费', 'amount')\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "项目建设管理费合计_元", "query": "从【其他费用】中获取【项目建设管理费】的属性", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_schedule_on_other_expense_table('其他费用表', '项目建设管理费', 'amount')\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "其中:工程监理费_元", "query": "从【其他费用】中获取【工程监理费】的属性", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_schedule_on_other_expense_table('其他费用表', '工程监理费', 'rate')\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "项目建设技术服务费合计_元", "query": "从【其他费用】中获取【项目建设技术服务费】的属性", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_schedule_on_other_expense_table('其他费用表', '项目建设技术服务费', 'amount')\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "项目建设管理费合计_元", "query": "从【其他费用】中获取【项目建设管理费】的属性", "code": "根据用户问题和上下文信息,我们需要从\"其他费用\"中获取\"项目建设管理费\"的属性。根据上下文信息,\"其他费用\"是一个FeeScheduleItem类型,而\"项目建设管理费\"是一个Fee类型,且其父节点是\"其他费用\"。\n\n最匹配的方法是使用`get_fee_schedule_on_other_expense_table`方法,因为:\n1. \"其他费用\"对应的是其他费用表\n2. 我们需要获取的是费用属性\n\n以下是生成的Python代码:\n\n```python\ndef project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_schedule_on_other_expense_table(\n table_name=\"其他费用表\",\n fee_name=\"项目建设管理费\",\n fee_attribute=\"*\" # 获取所有属性\n )\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('data', '')\n data = result_dict.get('data', {})\n if status:\n return result_dict\n else:\n return result_dict\n```"}
{"name": "其中:工程监理费_元", "query": "从【其他费用】中获取【工程监理费】的属性", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_schedule_on_other_expense_table('其他费用表', '工程监理费', 'amount')\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "项目建设技术服务费合计_元", "query": "从【其他费用】中获取【项目建设技术服务费】的属性", "code": "根据用户问题和上下文信息,我们需要从\"其他费用\"中获取\"项目建设技术服务费\"的属性。根据上下文信息,\"项目建设技术服务费\"是\"其他费用\"的子节点,类型为\"Fee\"。\n\n从工程数据访问库中,最匹配的方法是`get_fee_schedule_on_other_expense_table`,因为它专门用于在其他费用表中查找费用。\n\n```python\ndef project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_schedule_on_other_expense_table(\n table_name=\"其他费用表\",\n fee_name=\"项目建设技术服务费\",\n fee_attribute=\"amount\"\n )\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return result_dict\n else:\n return result_dict\n```"}
{"name": "其中:项目前期工作费_元", "query": "从【其他费用】中获取【项目前期工作费】的属性", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_schedule_on_other_expense_table('其他费用表', '项目前期工作费', 'amount')\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "其中:勘察费_元", "query": "从【其他费用】中获取【勘察费】的属性", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_schedule_on_other_expense_table('其他费用表', '勘察费', 'rate')\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "其中:设计费_元", "query": "从【其他费用】中获取【设计费】的属性", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_schedule_on_other_expense_table('其他费用表', '设计费', 'rate')\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "其中:工程建设检测费_元", "query": "从【其他费用】中获取【工程建设检测费】的属性", "code": "根据用户问题和上下文信息,我们需要从\"其他费用\"中获取\"工程建设检测费\"的属性。根据上下文信息,\"其他费用\"是一个FeeScheduleItem类型,而\"工程建设检测费\"是一个Fee类型。\n\n最匹配的方法是`get_fee_schedule_on_other_expense_table`,因为它专门用于在其他费用表中查找费用。\n\n```python\ndef project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_schedule_on_other_expense_table(\n table_name=\"其他费用\",\n fee_name=\"工程建设检测费\",\n fee=\"*\"\n )\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return result_dict\n else:\n return result_dict\n```"}
{"name": "生产准备费_元", "query": "从【其他费用】中获取【生产准备费】的属性", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_schedule_on_other_expense_table(table_name='其他费用表', fee_name='生产准备费', fee='amount')\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "其中:安全文明施工费_线路_元", "query": "从【架空输电线路本体工程】项目划分中获取名称属于【其中:安全文明施工费_线路_元】的费用", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_division_node_by_parent_and_name('架空输电线路本体工程', '其中:安全文明施工费_线路_元')\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', [])\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "其中:安全文明施工费_调试_元", "query": "从【架空输电线路本体工程】项目划分中获取名称属于【其中:安全文明施工费_调试_元】的费用", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_division_node_by_parent_and_name('架空输电线路本体工程', '其中:安全文明施工费_调试_元')\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', [])\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "基本预备费_元", "query": "从【工程费用】中获取【基本预备费.合计费】的属性", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_schedule_on_Engineering_Cost_table(\"工程费用\", \"基本预备费.合计费\", \"合计费\")\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "其中:勘察费_元", "query": "从【其他费用】中获取【勘察费】的属性", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_schedule_on_other_expense_table(\"其他费用表\", \"勘察费\", \"amount\")\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "其中:设计费_元", "query": "从【其他费用】中获取【设计费】的属性", "code": "根据用户问题和上下文信息,我们需要从\"其他费用\"表中获取\"设计费\"的属性。根据上下文信息,\"其他费用表\"是父节点,\"设计费\"是其子节点。工程数据访问库中提供了`get_fee_schedule_on_other_expense_table`方法专门用于在其他费用表中查找费用。\n\ndef project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_schedule_on_other_expense_table(table_name=\"其他费用表\", fee_name=\"设计费\", fee_attribute=None)\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', 201)\n data = result_dict.get('data', {})\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "其中:工程建设检测费_元", "query": "从【其他费用】中获取【工程建设检测费】的属性", "code": "根据用户问题和上下文信息,我们需要从\"其他费用\"中获取\"工程建设检测费\"的属性。根据上下文信息,\"工程建设检测费\"是一个Fee类型节点,其父节点是\"其他费用\"FeeScheduleItem类型)。因此,我们可以使用`get_fee_schedule_on_other_expense_table`方法来获取该费用的属性。\n\ndef project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_schedule_on_other_expense_table(\n table_name=\"其他费用\",\n fee_name=\"工程建设检测费\",\n fee_attribute=\"*\"\n )\n status = result_dict.get('status', False)\n if not status:\n return result_dict\n return result_dict"}
{"name": "生产准备费_元", "query": "从【其他费用】中获取【生产准备费】的属性", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_schedule_on_other_expense_table('其他费用表', '生产准备费', 'amount')\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "其中:安全文明施工费_线路_元", "query": "从【架空输电线路本体工程】项目划分中获取名称属于【安全文明施工费】的费用", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_division_node_by_parent_and_name('架空输电线路本体工程', '安全文明施工费')\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', [])\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "其中:安全文明施工费_调试_元", "query": "从【架空输电线路本体工程】项目划分中获取名称属于【安全文明施工费】的费用", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_division_node_by_parent_and_name(\"架空输电线路本体工程\", \"安全文明施工费\")\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', [])\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "基本预备费_元", "query": "从【工程费用】中获取【基本预备费.合计费】的属性", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_schedule_on_Engineering_Cost_table('工程费用表', '基本预备费.合计费', '合计费')\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "静态投资_元", "query": "从【工程费用】中获取【工程静态投资(一~七项合计).合计费】的属性", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_schedule_on_Engineering_Cost_table(\"工程费用表\", \"工程静态投资(一~七项合计).合计费\", \"合计费\")\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "建设期利息_元", "query": "从【工程费用】中获取【建设期贷款利息.合计费】的属性", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_schedule_on_Engineering_Cost_table(\"工程费用\", \"建设期贷款利息.合计费\", \"合计费\")\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "动态投资_元", "query": "从【工程费用】中获取【工程动态投资(一~八项合计).合计费】的属性", "code": "根据用户问题和上下文信息,我们需要从\"工程费用\"表中获取\"工程动态投资(一~八项合计).合计费\"的属性。根据工程数据访问库,最匹配的方法是`get_fee_schedule_on_Engineering_Cost_table`。\n\n```python\ndef project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_schedule_on_Engineering_Cost_table(\n table_name=\"工程费用\",\n fee_name=\"工程动态投资(一~八项合计)\",\n fee=\"合计费\"\n )\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return result_dict\n else:\n return result_dict\n```"}
{"name": "增值税抵扣税额_元", "query": "从【工程费用】中获取【其中:可抵扣增值税额.合计费】的属性", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_schedule_on_Engineering_Cost_table('工程费用表', '其中:可抵扣增值税额.合计费', '合计费')\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "建设期利息_元", "query": "从【工程费用】中获取【建设期贷款利息.合计费】的属性", "code": "根据用户问题和上下文信息,我们需要从工程费用表中获取\"建设期贷款利息.合计费\"的属性。根据上下文信息,这是一个三级结构:工程费用表 -> 建设期贷款利息 -> 合计费。\n\n最匹配的方法是`get_fee_schedule_on_Engineering_Cost_table`,因为它专门用于在工程费用表中查找费用。\n\n```python\ndef project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_schedule_on_Engineering_Cost_table(\n table_name=\"工程费用\",\n fee_name=\"建设期贷款利息.合计费\",\n fee_attribute=\"合计费\"\n )\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('data', '')\n data = result_dict.get('data', [])\n if status:\n return result_dict\n else:\n return result_dict\n```"}
{"name": "动态投资_元", "query": "从【工程费用】中获取【工程动态投资(一~八项合计).合计费】的属性", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_schedule_on_Engineering_Cost_table(\n table_name=\"工程费用\",\n fee_name=\"工程动态投资(一~八项合计).合计费\",\n fee_attribute=\"合计费\"\n )\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return result_dict\n else:\n return result_dict"}
{"name": "增值税抵扣税额_元", "query": "从【工程费用】中获取【其中:可抵扣增值税额.合计费】的属性", "code": "def project_get_calculate_function():\n project = ProjectBuilder.build()\n result_dict = project.get_fee_schedule_on_Engineering_Cost_table(\"工程费用表\", \"其中:可抵扣增值税额.合计费\", \"合计费\")\n status = result_dict.get('status', False)\n message = result_dict.get('message', '')\n code = result_dict.get('code', '')\n data = result_dict.get('data', {})\n if status:\n return result_dict\n else:\n return result_dict"}
+1 -1
View File
@@ -73,7 +73,7 @@ def project_get_calculate_function():
output = redirected_output.getvalue().strip()
if not isinstance(result_dict, dict) or len(result_dict) != 4:
raise ValueError("函数应返回包含4个元素的字典(status, data, error, helper_info)")
raise ValueError("函数应返回包含4个元素的字典(code, status, message, data)")
logger.debug(f"执行结果: {result_dict}")
+46 -46
View File
@@ -169,7 +169,7 @@
"指标类型": "工程量指标",
"数据来源": "定额数量",
"指标描述": {
"指标映射": "【架空输电线路本体工程/基础工程】及其子孙项目划分中查找编码包含【YX2-1~7】的所有【定额】的【数量】之和",
"指标映射": "获取项目划分【架空输电线路本体工程/基础工程】编码包含【YX2-1~7】的所有【定额】的【数量】之和",
"映射规则": "YX2-1~7"
}
},
@@ -199,7 +199,7 @@
"指标类型": "工程量指标",
"数据来源": "主材数量",
"指标描述": {
"指标映射": "【架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立】及其子孙项目划分中查找名称包含【角钢】的所有【主材】的【数量】之和",
"指标映射": "获取项目划分【架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立】及名称包含【角钢】的所有【主材】的【数量】之和",
"映射规则": "角钢"
}
},
@@ -213,7 +213,7 @@
"指标类型": "工程量指标",
"数据来源": "主材数量",
"指标描述": {
"指标映射": "【架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立】及其子孙项目划分中查找名称包含【角钢、高强】的所有【主材】的【数量】之和",
"指标映射": "获取项目划分【架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立】及名称包含【角钢、高强】的所有【主材】的【数量】之和",
"映射规则": "角钢、高强"
}
},
@@ -243,7 +243,7 @@
"指标类型": "单价指标",
"数据来源": "主材单价",
"指标描述": {
"指标映射": "【架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立】及其子孙项目划分中查找名称包含【角钢】的所有【主材】的【单价】之和",
"指标映射": "获取项目划分【架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立】及名称包含【角钢】的所有【主材】的【单价】之和",
"映射规则": "角钢"
}
},
@@ -273,7 +273,7 @@
"指标类型": "单价指标",
"数据来源": "主材单价",
"指标描述": {
"指标映射": "【架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立】及其子孙项目划分中查找名称包含【角钢、高强】的所有【主材】的【单价】之和",
"指标映射": "获取项目划分【架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立】及名称包含【角钢、高强】的所有【主材】的【单价】之和",
"映射规则": "角钢、高强"
}
},
@@ -303,7 +303,7 @@
"指标类型": "工程量指标",
"数据来源": "主材数量",
"指标描述": {
"指标映射": "【架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立】及其子孙项目划分中查找名称包含【钢管塔】的所有【主材】的【数量】之和",
"指标映射": "获取项目划分【架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立】及名称包含【钢管塔】的所有【主材】的【数量】之和",
"映射规则": "钢管塔"
}
},
@@ -333,7 +333,7 @@
"指标类型": "单价指标",
"数据来源": "主材单价",
"指标描述": {
"指标映射": "【架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立】及其子孙项目划分中查找名称包含【钢管塔】的所有【主材】的【单价】之和",
"指标映射": "获取项目划分【架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立】及名称包含【钢管塔】的所有【主材】的【单价】之和",
"映射规则": "钢管塔"
}
},
@@ -363,7 +363,7 @@
"指标类型": "工程量指标",
"数据来源": "主材数量",
"指标描述": {
"指标映射": "【架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立】及其子孙项目划分中查找名称包含【钢管杆】的所有【主材】的【数量】之和",
"指标映射": "获取项目划分【架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立】及名称包含【钢管杆】的所有【主材】的【数量】之和",
"映射规则": "钢管杆"
}
},
@@ -393,7 +393,7 @@
"指标类型": "单价指标",
"数据来源": "主材单价",
"指标描述": {
"指标映射": "【架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立】及其子孙项目划分中查找名称包含【钢管杆】的所有【主材】的【单价】之和",
"指标映射": "获取项目划分【架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立】及名称包含【钢管杆】的所有【主材】的【单价】之和",
"映射规则": "钢管杆"
}
},
@@ -473,7 +473,7 @@
"指标类型": "技术指标",
"数据来源": "定额参数",
"指标描述": {
"指标映射": "【架空输电线路本体工程/架线工程】及其子孙项目划分中查找编码包含【['YX5-67', 'YX5-68', 'YX5-69', 'YX5-78', 'YX5-79', 'YX5-59', 'YX5-60', 'YX5-61', 'YX5-62', 'YX5-63', 'YX5-64', 'YX5-65', 'YX5-66', 'YX5-74', 'YX5-75', 'YX5-76', 'YX5-77', 'YX5-52', 'YX5-53', 'YX5-54', 'YX5-55', 'YX5-56', 'YX5-57', 'YX5-58', 'YX5-70', 'YX5-71', 'YX5-72', 'YX5-73', 'YX5-14', 'YX5-15', 'YX5-16', 'YX5-17', 'YX5-43', 'YX5-44', 'YX5-45', 'YX5-46', 'YX5-47', 'YX5-48', 'YX5-49', 'YX5-50', 'YX5-51', 'YX5-10', 'YX5-11', 'YX5-12', 'YX5-13', 'YX5-38', 'YX5-39', 'YX5-40', 'YX5-41', 'YX5-42', 'YX5-8', 'YX5-9']】的所有【定额】的【参数】之和",
"指标映射": "获取项目划分【架空输电线路本体工程/架线工程】编码包含【['YX5-67', 'YX5-68', 'YX5-69', 'YX5-78', 'YX5-79', 'YX5-59', 'YX5-60', 'YX5-61', 'YX5-62', 'YX5-63', 'YX5-64', 'YX5-65', 'YX5-66', 'YX5-74', 'YX5-75', 'YX5-76', 'YX5-77', 'YX5-52', 'YX5-53', 'YX5-54', 'YX5-55', 'YX5-56', 'YX5-57', 'YX5-58', 'YX5-70', 'YX5-71', 'YX5-72', 'YX5-73', 'YX5-14', 'YX5-15', 'YX5-16', 'YX5-17', 'YX5-43', 'YX5-44', 'YX5-45', 'YX5-46', 'YX5-47', 'YX5-48', 'YX5-49', 'YX5-50', 'YX5-51', 'YX5-10', 'YX5-11', 'YX5-12', 'YX5-13', 'YX5-38', 'YX5-39', 'YX5-40', 'YX5-41', 'YX5-42', 'YX5-8', 'YX5-9']】的所有【定额】的【参数】之和",
"映射规则": "| 资源识别规则 | 指标值 |\n|-------|-------|\n| YX5-67~69、YX5-78~79 | 8 |\n| YX5-59~66、YX5-74~77 | 6 |\n| YX5-52~58、YX5-70~73 | 4 |\n| YX5-14~17、YX5-43~51 | 2 |\n| YX5-10~13、YX5-38~42、YX5-8~9 | 1 |"
}
},
@@ -519,7 +519,7 @@
"指标类型": "工程量指标",
"数据来源": "主材数量",
"指标描述": {
"指标映射": "【架空输电线路本体工程/架线工程/导地线架设@@架空输电线路本体工程/架线工程/导地线跨越架设】及其子孙项目划分中查找名称包含【高导电率】的所有【主材】的【数量】之和",
"指标映射": "获取项目划分【架空输电线路本体工程/架线工程/导地线架设@@架空输电线路本体工程/架线工程/导地线跨越架设】及名称包含【高导电率】的所有【主材】的【数量】之和",
"映射规则": "高导电率"
}
},
@@ -549,7 +549,7 @@
"指标类型": "单价指标",
"数据来源": "主材单价",
"指标描述": {
"指标映射": "【架空输电线路本体工程/架线工程/导地线架设@@架空输电线路本体工程/架线工程/导地线跨越架设】及其子孙项目划分中查找名称包含【线】的所有【主材】的【单价】之和",
"指标映射": "获取项目划分【架空输电线路本体工程/架线工程/导地线架设@@架空输电线路本体工程/架线工程/导地线跨越架设】及名称包含【线】的所有【主材】的【单价】之和",
"映射规则": "线"
}
},
@@ -579,7 +579,7 @@
"指标类型": "单价指标",
"数据来源": "主材单价",
"指标描述": {
"指标映射": "【架空输电线路本体工程/架线工程/导地线架设@@架空输电线路本体工程/架线工程/导地线跨越架设】及其子孙项目划分中查找名称包含【高导电率】的所有【主材】的【单价】之和",
"指标映射": "获取项目划分【架空输电线路本体工程/架线工程/导地线架设@@架空输电线路本体工程/架线工程/导地线跨越架设】及名称包含【高导电率】的所有【主材】的【单价】之和",
"映射规则": "高导电率"
}
},
@@ -593,7 +593,7 @@
"指标类型": "技术指标",
"数据来源": "主材参数",
"指标描述": {
"指标映射": "【架空输电线路本体工程/架线工程/导地线架设@@架空输电线路本体工程/架线工程/导地线跨越架设@@架空输电线路本体工程/架线工程/其他架线工程】及其子孙项目划分中查找名称包含【['钢芯铝绞线', '铝包钢芯铝绞线', '中强度铝合金绞线', '铝合金芯铝绞线', '铝合金芯高导电率铝绞线', '钢芯高导电率铝绞线', '特高强度钢芯铝合金绞线', '扩径导线', '耐热导线', '碳纤维导线']】的所有【主材】的【参数】之和",
"指标映射": "获取项目划分【架空输电线路本体工程/架线工程/导地线架设@@架空输电线路本体工程/架线工程/导地线跨越架设@@架空输电线路本体工程/架线工程/其他架线工程】及名称包含【['钢芯铝绞线', '铝包钢芯铝绞线', '中强度铝合金绞线', '铝合金芯铝绞线', '铝合金芯高导电率铝绞线', '钢芯高导电率铝绞线', '特高强度钢芯铝合金绞线', '扩径导线', '耐热导线', '碳纤维导线']】的所有【主材】的【参数】之和",
"映射规则": "| 资源识别规则 | 指标值 |\n|-------|-------|\n| 钢芯铝绞线 | 钢芯铝绞线 |\n| 铝包钢芯铝绞线 | 铝包钢芯铝绞线 |\n| 中强度铝合金绞线 | 中强度铝合金绞线 |\n| 铝合金芯铝绞线 | 铝合金芯铝绞线 |\n| 铝合金芯高导电率铝绞线 | 铝合金芯高导电率铝绞线 |\n| 钢芯高导电率铝绞线 | 钢芯高导电率铝绞线 |\n| 特高强度钢芯铝合金绞线 | 特高强度钢芯铝合金绞线 |\n| 扩径导线 | 扩径导线 |\n| 耐热导线 | 耐热导线 |\n| 碳纤维导线 | 碳纤维导线 |"
}
},
@@ -1431,7 +1431,7 @@
"指标类型": "工程量指标",
"数据来源": "主材数量",
"指标描述": {
"指标映射": "【架空输电线路本体工程/基础工程/基础砌筑】及其子孙项目划分中查找名称包含【圆钢】的所有【主材】的【数量】之和",
"指标映射": "获取项目划分【架空输电线路本体工程/基础工程/基础砌筑】及名称包含【圆钢】的所有【主材】的【数量】之和",
"映射规则": "圆钢"
}
},
@@ -1445,7 +1445,7 @@
"指标类型": "单价指标",
"数据来源": "主材单价",
"指标描述": {
"指标映射": "【架空输电线路本体工程/基础工程/基础砌筑】及其子孙项目划分中查找名称包含【圆钢】的所有【主材】的【单价】之和",
"指标映射": "获取项目划分【架空输电线路本体工程/基础工程/基础砌筑】及名称包含【圆钢】的所有【主材】的【单价】之和",
"映射规则": "圆钢"
}
},
@@ -1879,7 +1879,7 @@
"指标类型": "造价指标",
"数据来源": "工程费用",
"指标描述": {
"指标映射": "从【工程费用】中获取【架空输电线路本体工程.合计费】的属性",
"指标映射": "从【工程费用】中获取【架空输电线路本体工程】的【合计费】的",
"映射规则": "@工程费用.架空输电线路本体工程.合计费"
}
},
@@ -1893,7 +1893,7 @@
"指标类型": "造价指标",
"数据来源": "项目划分费用",
"指标描述": {
"指标映射": "【架空输电线路本体工程】项目划分中获取名称于【本体工程人工费_本体_元】的费用",
"指标映射": "获取项目划分【架空输电线路本体工程】下取费名称于【人工费】的费用",
"映射规则": "人工费"
}
},
@@ -1907,7 +1907,7 @@
"指标类型": "造价指标",
"数据来源": "项目划分费用",
"指标描述": {
"指标映射": "【架空输电线路本体工程】项目划分中获取名称于【本体工程人工费_调试_元】的费用",
"指标映射": "获取项目划分【架空输电线路本体工程】下取费名称于【人工费】的费用",
"映射规则": "人工费"
}
},
@@ -1921,7 +1921,7 @@
"指标类型": "造价指标",
"数据来源": "项目划分费用",
"指标描述": {
"指标映射": "【架空输电线路本体工程】项目划分中获取名称于【本体工程机械费_本体_元】的费用",
"指标映射": "获取项目划分【架空输电线路本体工程】下取费名称于【施工机械使用费】的费用",
"映射规则": "施工机械使用费"
}
},
@@ -1935,7 +1935,7 @@
"指标类型": "造价指标",
"数据来源": "项目划分费用",
"指标描述": {
"指标映射": "【架空输电线路本体工程】项目划分中获取名称于【本体工程机械费_调试_元】的费用",
"指标映射": "获取项目划分【架空输电线路本体工程】下取费名称于【施工机械使用费】的费用",
"映射规则": "施工机械使用费"
}
},
@@ -1949,7 +1949,7 @@
"指标类型": "造价指标",
"数据来源": "项目划分费用",
"指标描述": {
"指标映射": "【架空输电线路本体工程/基础工程】项目划分中获取名称于【基础工程费用_元】的费用",
"指标映射": "获取项目划分【架空输电线路本体工程/基础工程】下取费名称于【合计】的费用",
"映射规则": "合计"
}
},
@@ -1963,7 +1963,7 @@
"指标类型": "造价指标",
"数据来源": "项目划分费用",
"指标描述": {
"指标映射": "【架空输电线路本体工程/杆塔工程】项目划分中获取名称于【杆塔工程费用_元】的费用",
"指标映射": "获取项目划分【架空输电线路本体工程/杆塔工程】下取费名称于【合计】的费用",
"映射规则": "合计"
}
},
@@ -1977,7 +1977,7 @@
"指标类型": "造价指标",
"数据来源": "项目划分费用",
"指标描述": {
"指标映射": "【架空输电线路本体工程/接地工程】项目划分中获取名称于【接地工程费用_元】的费用",
"指标映射": "获取项目划分【架空输电线路本体工程/接地工程】下取费名称于【合计】的费用",
"映射规则": "合计"
}
},
@@ -1991,7 +1991,7 @@
"指标类型": "造价指标",
"数据来源": "项目划分费用",
"指标描述": {
"指标映射": "【架空输电线路本体工程/架线工程】项目划分中获取名称于【架线工程费用_元】的费用",
"指标映射": "获取项目划分【架空输电线路本体工程/架线工程】下取费名称于【合计】的费用",
"映射规则": "合计"
}
},
@@ -2005,7 +2005,7 @@
"指标类型": "造价指标",
"数据来源": "项目划分费用",
"指标描述": {
"指标映射": "【架空输电线路本体工程/附件安装工程】项目划分中获取名称于【附件工程费用_元】的费用",
"指标映射": "获取项目划分【架空输电线路本体工程/附件安装工程】下取费名称于【合计】的费用",
"映射规则": "合计"
}
},
@@ -2019,7 +2019,7 @@
"指标类型": "造价指标",
"数据来源": "项目划分费用",
"指标描述": {
"指标映射": "【架空输电线路本体工程/辅助工程】项目划分中获取名称于【辅助工程费用_元】的费用",
"指标映射": "获取项目划分【架空输电线路本体工程/辅助工程】下取费名称于【合计】的费用",
"映射规则": "合计"
}
},
@@ -2033,7 +2033,7 @@
"指标类型": "造价指标",
"数据来源": "项目划分费用",
"指标描述": {
"指标映射": "【架空输电线路本体工程/辅助工程】项目划分中获取名称于【辅助工程费用_调试_元】的费用",
"指标映射": "获取项目划分【架空输电线路本体工程/辅助工程】下取费名称于【合计】的费用",
"映射规则": "合计"
}
},
@@ -2047,7 +2047,7 @@
"指标类型": "造价指标",
"数据来源": "工程费用",
"指标描述": {
"指标映射": "从【工程费用】中获取【辅助设施工程.合计费】的属性",
"指标映射": "从【工程费用】中获取【辅助设施工程】的【合计费】的",
"映射规则": "@工程费用.辅助设施工程.合计费"
}
},
@@ -2061,7 +2061,7 @@
"指标类型": "造价指标",
"数据来源": "工程费用",
"指标描述": {
"指标映射": "从【工程费用】中获取【其他费用.合计费】的属性",
"指标映射": "从【工程费用】中获取【其他费用】的【合计费】的",
"映射规则": "@工程费用.其他费用.合计费"
}
},
@@ -2075,7 +2075,7 @@
"指标类型": "造价指标",
"数据来源": "工程费用",
"指标描述": {
"指标映射": "从【其他费用】中获取【建设场地征用及清理费】的属性",
"指标映射": "从【其他费用】中获取【建设场地征用及清理费】的",
"映射规则": "@其他费用.建设场地征用及清理费"
}
},
@@ -2089,7 +2089,7 @@
"指标类型": "造价指标",
"数据来源": "工程费用",
"指标描述": {
"指标映射": "从【其他费用】中获取【项目建设管理费】的属性",
"指标映射": "从【其他费用】中获取【项目建设管理费】的",
"映射规则": "@其他费用.项目建设管理费"
}
},
@@ -2103,7 +2103,7 @@
"指标类型": "造价指标",
"数据来源": "工程费用",
"指标描述": {
"指标映射": "从【其他费用】中获取【工程监理费】的属性",
"指标映射": "从【其他费用】中获取【工程监理费】的",
"映射规则": "@其他费用.工程监理费"
}
},
@@ -2117,7 +2117,7 @@
"指标类型": "造价指标",
"数据来源": "工程费用",
"指标描述": {
"指标映射": "从【其他费用】中获取【项目建设技术服务费】的属性",
"指标映射": "从【其他费用】中获取【项目建设技术服务费】的",
"映射规则": "@其他费用.项目建设技术服务费"
}
},
@@ -2131,7 +2131,7 @@
"指标类型": "造价指标",
"数据来源": "工程费用",
"指标描述": {
"指标映射": "从【其他费用】中获取【项目前期工作费】的属性",
"指标映射": "从【其他费用】中获取【项目前期工作费】的",
"映射规则": "@其他费用.项目前期工作费"
}
},
@@ -2145,7 +2145,7 @@
"指标类型": "造价指标",
"数据来源": "工程费用",
"指标描述": {
"指标映射": "从【其他费用】中获取【勘察费】的属性",
"指标映射": "从【其他费用】中获取【勘察费】的",
"映射规则": "@其他费用.勘察费"
}
},
@@ -2159,7 +2159,7 @@
"指标类型": "造价指标",
"数据来源": "工程费用",
"指标描述": {
"指标映射": "从【其他费用】中获取【设计费】的属性",
"指标映射": "从【其他费用】中获取【设计费】的",
"映射规则": "@其他费用.设计费"
}
},
@@ -2173,7 +2173,7 @@
"指标类型": "造价指标",
"数据来源": "工程费用",
"指标描述": {
"指标映射": "从【其他费用】中获取【工程建设检测费】的属性",
"指标映射": "从【其他费用】中获取【工程建设检测费】的",
"映射规则": "@其他费用.工程建设检测费"
}
},
@@ -2187,7 +2187,7 @@
"指标类型": "造价指标",
"数据来源": "工程费用",
"指标描述": {
"指标映射": "从【其他费用】中获取【生产准备费】的属性",
"指标映射": "从【其他费用】中获取【生产准备费】的",
"映射规则": "@其他费用.生产准备费"
}
},
@@ -2201,7 +2201,7 @@
"指标类型": "造价指标",
"数据来源": "项目划分费用",
"指标描述": {
"指标映射": "【架空输电线路本体工程】项目划分中获取名称于【其中:安全文明施工费_线路_元】的费用",
"指标映射": "获取项目划分【架空输电线路本体工程】下取费名称于【安全文明施工费】的费用",
"映射规则": "安全文明施工费"
}
},
@@ -2215,7 +2215,7 @@
"指标类型": "造价指标",
"数据来源": "项目划分费用",
"指标描述": {
"指标映射": "【架空输电线路本体工程】项目划分中获取名称于【其中:安全文明施工费_调试_元】的费用",
"指标映射": "获取项目划分【架空输电线路本体工程】下取费名称于【安全文明施工费】的费用",
"映射规则": "安全文明施工费"
}
},
@@ -2229,7 +2229,7 @@
"指标类型": "造价指标",
"数据来源": "工程费用",
"指标描述": {
"指标映射": "从【工程费用】中获取【基本预备费.合计费】的属性",
"指标映射": "从【工程费用】中获取【基本预备费】的【合计费】的",
"映射规则": "@工程费用.基本预备费.合计费"
}
},
@@ -2243,7 +2243,7 @@
"指标类型": "造价指标",
"数据来源": "工程费用",
"指标描述": {
"指标映射": "从【工程费用】中获取【工程静态投资(一~七项合计).合计费】的属性",
"指标映射": "从【工程费用】中获取【工程静态投资(一~七项合计)】的【合计费】的",
"映射规则": "@工程费用.工程静态投资(一~七项合计).合计费"
}
},
@@ -2257,7 +2257,7 @@
"指标类型": "造价指标",
"数据来源": "工程费用",
"指标描述": {
"指标映射": "从【工程费用】中获取【建设期贷款利息.合计费】的属性",
"指标映射": "从【工程费用】中获取【建设期贷款利息】的【合计费】的",
"映射规则": "@工程费用.建设期贷款利息.合计费"
}
},
@@ -2271,7 +2271,7 @@
"指标类型": "造价指标",
"数据来源": "工程费用",
"指标描述": {
"指标映射": "从【工程费用】中获取【工程动态投资(一~八项合计).合计费】的属性",
"指标映射": "从【工程费用】中获取【工程动态投资(一~八项合计)】的【合计费】的",
"映射规则": "@工程费用.工程动态投资(一~八项合计).合计费"
}
},
@@ -2285,7 +2285,7 @@
"指标类型": "造价指标",
"数据来源": "工程费用",
"指标描述": {
"指标映射": "从【工程费用】中获取【其中:可抵扣增值税额.合计费】的属性",
"指标映射": "从【工程费用】中获取【其中:可抵扣增值税额】的【合计费】的",
"映射规则": "@工程费用.其中:可抵扣增值税额.合计费"
}
}
+43 -43
View File
@@ -1,46 +1,46 @@
{"name": "杆塔总基数", "query": "从【架空输电线路本体工程/基础工程】及其子孙项目划分中查找编码中包含【YX2-1~7】的所有【定额】的【数量】之和", "result": [{"name": "基础工程", "constraints": {"type": "ProjectDivisionItem", "path": "架空输电线路本体工程/基础工程", "name": "基础工程"}}, {"name": "定额", "constraints": {"type": "ProjectQuantity", "类型": "定额", "编码": "YX2-1~7"}}]}
{"name": "角钢塔_塔材量", "query": "从【架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立】及其子孙项目划分中查找名称中包含【角钢】的所有【主材】的【数量】之和", "result": [{"name": "架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立", "constraints": {"type": "ProjectDivisionItem", "path": "架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立"}}, {"name": "主材", "constraints": {"type": "ProjectQuantity", "类型": "主材", "name": "包含角钢"}}]}
{"name": "角钢塔_其中:高强钢塔材量", "query": "从【架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立】及其子孙项目划分中查找名称中包含【角钢、高强】的所有【主材】的【数量】之和", "result": [{"name": "铁塔、钢管杆组立", "constraints": {"type": "ProjectDivisionItem", "path": "架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立", "name": "铁塔、钢管杆组立"}}, {"name": "主材", "constraints": {"type": "ProjectQuantity", "类型": "主材", "name": "包含角钢、高强"}}]}
{"name": "角钢塔_塔材装材费_元", "query": "从【架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立】及其子孙项目划分中查找名称中包含【角钢】的所有【主材】的【单价】之和", "result": [{"name": "架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立", "constraints": {"type": "ProjectDivisionItem", "path": "架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立"}}, {"name": "主材", "constraints": {"type": "ProjectQuantity", "类型": "主材", "name": "包含角钢"}}]}
{"name": "角钢塔_其中:高强钢塔材费用_元", "query": "从【架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立】及其子孙项目划分中查找名称中包含【角钢、高强】的所有【主材】的【单价】之和", "result": [{"name": "架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立", "constraints": {"type": "ProjectDivisionItem", "path": "架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立"}}, {"name": "主材", "constraints": {"type": "ProjectQuantity", "类型": "主材", "name": "包含角钢、高强"}}]}
{"name": "杆塔总基数", "query": "从【架空输电线路本体工程/基础工程】及其子孙项目划分中查找编码中包含【YX2-1~7】的所有【定额】的【数量】之和", "result": [{"name": "基础工程", "constraints": {"type": "ProjectDivisionItem", "path": "架空输电线路本体工程/基础工程", "name": "基础工程"}}, {"name": "定额", "constraints": {"parent": "基础工程", "type": "ProjectQuantity", "类型": "定额", "编码": "YX2-1~7"}}]}
{"name": "角钢塔_塔材量", "query": "从【架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立】及其子孙项目划分中查找名称中包含【角钢】的所有【主材】的【数量】之和", "result": [{"name": "铁塔、钢管杆组立", "constraints": {"type": "ProjectDivisionItem", "path": "架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立", "name": "铁塔、钢管杆组立"}}, {"name": "主材", "constraints": {"type": "ProjectQuantity", "parent": "铁塔、钢管杆组立", "类型": "主材", "name": "包含角钢"}}]}
{"name": "角钢塔_其中:高强钢塔材量", "query": "从【架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立】及其子孙项目划分中查找名称中包含【角钢、高强】的所有【主材】的【数量】之和", "result": [{"name": "架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立", "constraints": {"type": "ProjectDivisionItem", "path": "架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立", "name": "铁塔、钢管杆组立"}}, {"name": "主材", "constraints": {"type": "ProjectQuantity", "类型": "主材", "name": "包含角钢、高强"}}]}
{"name": "角钢塔_塔材装材费_元", "query": "从【架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立】及其子孙项目划分中查找名称中包含【角钢】的所有【主材】的【单价】之和", "result": [{"name": "铁塔、钢管杆组立", "constraints": {"type": "ProjectDivisionItem", "path": "架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立", "name": "铁塔、钢管杆组立"}}, {"name": "主材", "constraints": {"type": "ProjectQuantity", "path": "架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立", "类型": "主材", "name": "包含角钢"}}]}
{"name": "角钢塔_其中:高强钢塔材费用_元", "query": "从【架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立】及其子孙项目划分中查找名称中包含【角钢、高强】的所有【主材】的【单价】之和", "result": [{"name": "铁塔、钢管杆组立", "constraints": {"type": "ProjectDivisionItem", "path": "架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立", "name": "铁塔、钢管杆组立"}}, {"name": "主材", "constraints": {"type": "ProjectQuantity", "parent": "铁塔、钢管杆组立", "类型": "主材", "name": "包含角钢、高强"}}]}
{"name": "钢管塔_塔材量", "query": "从【架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立】及其子孙项目划分中查找名称中包含【钢管塔】的所有【主材】的【数量】之和", "result": [{"name": "铁塔、钢管杆组立", "constraints": {"type": "ProjectDivisionItem", "path": "架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立", "name": "铁塔、钢管杆组立"}}, {"name": "主材", "constraints": {"type": "ProjectQuantity", "类型": "主材", "name": "包含钢管塔"}}]}
{"name": "钢管塔_钢管价格_元", "query": "从【架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立】及其子孙项目划分中查找名称中包含【钢管塔】的所有【主材】的【单价】之和", "result": [{"name": "铁塔、钢管杆组立", "constraints": {"type": "ProjectDivisionItem", "path": "架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立", "name": "铁塔、钢管杆组立"}}, {"name": "主材", "constraints": {"type": "ProjectQuantity", "类型": "主材", "name": "包含钢管塔"}}]}
{"name": "钢管塔_钢管价格_元", "query": "从【架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立】及其子孙项目划分中查找名称中包含【钢管塔】的所有【主材】的【单价】之和", "result": [{"name": "铁塔、钢管杆组立", "constraints": {"type": "ProjectDivisionItem", "path": "架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立", "name": "铁塔、钢管杆组立"}}, {"name": "主材", "constraints": {"type": "ProjectQuantity", "name": "主材", "path": "架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立", "name_contains": "钢管塔"}}]}
{"name": "钢管杆_塔材量", "query": "从【架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立】及其子孙项目划分中查找名称中包含【钢管杆】的所有【主材】的【数量】之和", "result": [{"name": "铁塔、钢管杆组立", "constraints": {"type": "ProjectDivisionItem", "path": "架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立", "name": "铁塔、钢管杆组立"}}, {"name": "主材", "constraints": {"type": "ProjectQuantity", "类型": "主材", "name": "包含钢管杆"}}]}
{"name": "钢管杆_钢管价格_元", "query": "从【架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立】及其子孙项目划分中查找名称中包含【钢管杆】的所有【主材】的【单价】之和", "result": [{"name": "铁塔、钢管杆组立", "constraints": {"type": "ProjectDivisionItem", "path": "架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立", "name": "铁塔、钢管杆组立"}}, {"name": "主材", "constraints": {"type": "ProjectQuantity", "类型": "主材", "name": "包含钢管杆"}}]}
{"name": "导线及线材_分裂数", "query": "从【架空输电线路本体工程/架线工程】及其子孙项目划分中查找编码中包含【['YX5-67', 'YX5-68', 'YX5-69', 'YX5-78', 'YX5-79', 'YX5-59', 'YX5-60', 'YX5-61', 'YX5-62', 'YX5-63', 'YX5-64', 'YX5-65', 'YX5-66', 'YX5-74', 'YX5-75', 'YX5-76', 'YX5-77', 'YX5-52', 'YX5-53', 'YX5-54', 'YX5-55', 'YX5-56', 'YX5-57', 'YX5-58', 'YX5-70', 'YX5-71', 'YX5-72', 'YX5-73', 'YX5-14', 'YX5-15', 'YX5-16', 'YX5-17', 'YX5-43', 'YX5-44', 'YX5-45', 'YX5-46', 'YX5-47', 'YX5-48', 'YX5-49', 'YX5-50', 'YX5-51', 'YX5-10', 'YX5-11', 'YX5-12', 'YX5-13', 'YX5-38', 'YX5-39', 'YX5-40', 'YX5-41', 'YX5-42', 'YX5-8', 'YX5-9']】的所有【定额】的【参数】之和", "result": [{"name": "架空输电线路本体工程/架线工程", "constraints": {"type": "ProjectDivisionItem", "path": "架空输电线路本体工程/架线工程", "name": "架线工程"}}, {"name": "定额", "constraints": {"type": "ProjectQuantity", "类型": "定额", "编码": ["YX5-67", "YX5-68", "YX5-69", "YX5-78", "YX5-79", "YX5-59", "YX5-60", "YX5-61", "YX5-62", "YX5-63", "YX5-64", "YX5-65", "YX5-66", "YX5-74", "YX5-75", "YX5-76", "YX5-77", "YX5-52", "YX5-53", "YX5-54", "YX5-55", "YX5-56", "YX5-57", "YX5-58", "YX5-70", "YX5-71", "YX5-72", "YX5-73", "YX5-14", "YX5-15", "YX5-16", "YX5-17", "YX5-43", "YX5-44", "YX5-45", "YX5-46", "YX5-47", "YX5-48", "YX5-49", "YX5-50", "YX5-51", "YX5-10", "YX5-11", "YX5-12", "YX5-13", "YX5-38", "YX5-39", "YX5-40", "YX5-41", "YX5-42", "YX5-8", "YX5-9"]}}]}
{"name": "导线及线材_其中:节能导线量", "query": "从【架空输电线路本体工程/架线工程/导地线架设@@架空输电线路本体工程/架线工程/导地线跨越架设】及其子孙项目划分中查找名称中包含【高导电率】的所有【主材】的【数量】之和", "result": [{"name": "架空输电线路本体工程/架线工程/导地线架设", "constraints": {"type": "ProjectDivisionItem", "path": "架空输电线路本体工程/架线工程/导地线架设"}}, {"name": "架空输电线路本体工程/架线工程/导地线跨越架设", "constraints": {"type": "ProjectDivisionItem", "path": "架空输电线路本体工程/架线工程/导地线跨越架设"}}, {"name": "主材", "constraints": {"type": "ProjectQuantity", "类型": "主材", "name": "包含高导电率"}}]}
{"name": "导线及线材_导线装材费_元", "query": "从【架空输电线路本体工程/架线工程/导地线架设@@架空输电线路本体工程/架线工程/导地线跨越架设】及其子孙项目划分中查找名称中包含【线】的所有【主材】的【单价】之和", "result": [{"name": "架空输电线路本体工程/架线工程/导地线架设", "constraints": {"type": "ProjectDivisionItem", "path": "架空输电线路本体工程/架线工程/导地线架设"}}, {"name": "架空输电线路本体工程/架线工程/导地线跨越架设", "constraints": {"type": "ProjectDivisionItem", "path": "架空输电线路本体工程/架线工程/导地线跨越架设"}}, {"name": "主材", "constraints": {"type": "ProjectQuantity", "类型": "主材", "name": "线"}}]}
{"name": "导线及线材_其中:节能导线费用_元", "query": "从【架空输电线路本体工程/架线工程/导地线架设@@架空输电线路本体工程/架线工程/导地线跨越架设】及其子孙项目划分中查找名称中包含【高导电率】的所有【主材】的【单价】之和", "result": [{"name": "架空输电线路本体工程/架线工程/导地线架设", "constraints": {"type": "ProjectDivisionItem", "path": "架空输电线路本体工程/架线工程/导地线架设"}}, {"name": "架空输电线路本体工程/架线工程/导地线跨越架设", "constraints": {"type": "ProjectDivisionItem", "path": "架空输电线路本体工程/架线工程/导地线跨越架设"}}, {"name": "主材", "constraints": {"type": "ProjectQuantity", "类型": "主材", "name": "包含高导电率"}}]}
{"name": "钢管杆_钢管价格_元", "query": "从【架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立】及其子孙项目划分中查找名称中包含【钢管杆】的所有【主材】的【单价】之和", "result": [{"name": "铁塔、钢管杆组立", "constraints": {"type": "ProjectDivisionItem", "path": "架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立", "name": "铁塔、钢管杆组立"}}, {"name": "主材", "constraints": {"type": "ProjectQuantity", "name": "主材", "path": "架空输电线路本体工程/杆塔工程/杆塔组立/铁塔、钢管杆组立", "name_contains": "钢管杆"}}]}
{"name": "导线及线材_分裂数", "query": "从【架空输电线路本体工程/架线工程】及其子孙项目划分中查找编码中包含【['YX5-67', 'YX5-68', 'YX5-69', 'YX5-78', 'YX5-79', 'YX5-59', 'YX5-60', 'YX5-61', 'YX5-62', 'YX5-63', 'YX5-64', 'YX5-65', 'YX5-66', 'YX5-74', 'YX5-75', 'YX5-76', 'YX5-77', 'YX5-52', 'YX5-53', 'YX5-54', 'YX5-55', 'YX5-56', 'YX5-57', 'YX5-58', 'YX5-70', 'YX5-71', 'YX5-72', 'YX5-73', 'YX5-14', 'YX5-15', 'YX5-16', 'YX5-17', 'YX5-43', 'YX5-44', 'YX5-45', 'YX5-46', 'YX5-47', 'YX5-48', 'YX5-49', 'YX5-50', 'YX5-51', 'YX5-10', 'YX5-11', 'YX5-12', 'YX5-13', 'YX5-38', 'YX5-39', 'YX5-40', 'YX5-41', 'YX5-42', 'YX5-8', 'YX5-9']】的所有【定额】的【参数】之和", "result": [{"name": "架空输电线路本体工程/架线工程", "constraints": {"type": "ProjectDivisionItem", "path": "架空输电线路本体工程/架线工程", "name": "架线工程"}}, {"name": "定额", "constraints": {"parent": "架空输电线路本体工程/架线工程", "type": "ProjectQuantity", "类型": "定额", "编码": ["YX5-67", "YX5-68", "YX5-69", "YX5-78", "YX5-79", "YX5-59", "YX5-60", "YX5-61", "YX5-62", "YX5-63", "YX5-64", "YX5-65", "YX5-66", "YX5-74", "YX5-75", "YX5-76", "YX5-77", "YX5-52", "YX5-53", "YX5-54", "YX5-55", "YX5-56", "YX5-57", "YX5-58", "YX5-70", "YX5-71", "YX5-72", "YX5-73", "YX5-14", "YX5-15", "YX5-16", "YX5-17", "YX5-43", "YX5-44", "YX5-45", "YX5-46", "YX5-47", "YX5-48", "YX5-49", "YX5-50", "YX5-51", "YX5-10", "YX5-11", "YX5-12", "YX5-13", "YX5-38", "YX5-39", "YX5-40", "YX5-41", "YX5-42", "YX5-8", "YX5-9"]}}]}
{"name": "导线及线材_其中:节能导线量", "query": "从【架空输电线路本体工程/架线工程/导地线架设@@架空输电线路本体工程/架线工程/导地线跨越架设】及其子孙项目划分中查找名称中包含【高导电率】的所有【主材】的【数量】之和", "result": [{"name": "架空输电线路本体工程/架线工程/导地线架设", "constraints": {"type": "ProjectDivisionItem", "path": "架空输电线路本体工程/架线工程/导地线架设", "name": "导地线架设"}}, {"name": "架空输电线路本体工程/架线工程/导地线跨越架设", "constraints": {"type": "ProjectDivisionItem", "path": "架空输电线路本体工程/架线工程/导地线跨越架设", "name": "导地线跨越架设"}}, {"name": "主材", "constraints": {"type": "ProjectQuantity", "类型": "主材", "name": "包含高导电率"}}]}
{"name": "导线及线材_导线装材费_元", "query": "从【架空输电线路本体工程/架线工程/导地线架设@@架空输电线路本体工程/架线工程/导地线跨越架设】及其子孙项目划分中查找名称中包含【线】的所有【主材】的【单价】之和", "result": [{"name": "架空输电线路本体工程/架线工程/导地线架设", "constraints": {"type": "ProjectDivisionItem", "path": "架空输电线路本体工程/架线工程/导地线架设", "name": "导地线架设"}}, {"name": "架空输电线路本体工程/架线工程/导地线跨越架设", "constraints": {"type": "ProjectDivisionItem", "path": "架空输电线路本体工程/架线工程/导地线跨越架设", "name": "导地线跨越架设"}}, {"name": "主材", "constraints": {"type": "ProjectQuantity", "类型": "主材", "name": "包含线"}}]}
{"name": "导线及线材_其中:节能导线费用_元", "query": "从【架空输电线路本体工程/架线工程/导地线架设@@架空输电线路本体工程/架线工程/导地线跨越架设】及其子孙项目划分中查找名称中包含【高导电率】的所有【主材】的【单价】之和", "result": [{"name": "架空输电线路本体工程/架线工程/导地线架设", "constraints": {"type": "ProjectDivisionItem", "path": "架空输电线路本体工程/架线工程/导地线架设", "name": "导地线架设"}}, {"name": "架空输电线路本体工程/架线工程/导地线跨越架设", "constraints": {"type": "ProjectDivisionItem", "path": "架空输电线路本体工程/架线工程/导地线跨越架设", "name": "导地线跨越架设"}}, {"name": "主材", "constraints": {"type": "ProjectQuantity", "类型": "主材", "name": "包含高导电率"}}]}
{"name": "导线及线材_导线类型", "query": "从【架空输电线路本体工程/架线工程/导地线架设@@架空输电线路本体工程/架线工程/导地线跨越架设@@架空输电线路本体工程/架线工程/其他架线工程】及其子孙项目划分中查找名称中包含【['钢芯铝绞线', '铝包钢芯铝绞线', '中强度铝合金绞线', '铝合金芯铝绞线', '铝合金芯高导电率铝绞线', '钢芯高导电率铝绞线', '特高强度钢芯铝合金绞线', '扩径导线', '耐热导线', '碳纤维导线']】的所有【主材】的【参数】之和", "result": [{"name": "架空输电线路本体工程/架线工程/导地线架设", "constraints": {"type": "ProjectDivisionItem", "path": "架空输电线路本体工程/架线工程/导地线架设"}}, {"name": "架空输电线路本体工程/架线工程/导地线跨越架设", "constraints": {"type": "ProjectDivisionItem", "path": "架空输电线路本体工程/架线工程/导地线跨越架设"}}, {"name": "架空输电线路本体工程/架线工程/其他架线工程", "constraints": {"type": "ProjectDivisionItem", "path": "架空输电线路本体工程/架线工程/其他架线工程"}}, {"name": "主材", "constraints": {"type": "ProjectQuantity", "类型": "主材", "name": ["钢芯铝绞线", "铝包钢芯铝绞线", "中强度铝合金绞线", "铝合金芯铝绞线", "铝合金芯高导电率铝绞线", "钢芯高导电率铝绞线", "特高强度钢芯铝合金绞线", "扩径导线", "耐热导线", "碳纤维导线"]}}]}
{"name": "基础钢材量", "query": "从【架空输电线路本体工程/基础工程/基础砌筑】及其子孙项目划分中查找名称中包含【圆钢】的所有【主材】的【数量】之和", "result": [{"name": "基础砌筑", "constraints": {"type": "ProjectDivisionItem", "path": "架空输电线路本体工程/基础工程/基础砌筑", "name": "基础砌筑"}}, {"name": "圆钢", "constraints": {"type": "ProjectQuantity", "name": "圆钢", "类型": "主材"}}]}
{"name": "基础钢材价格", "query": "从【架空输电线路本体工程/基础工程/基础砌筑】及其子孙项目划分中查找名称中包含【圆钢】的所有【主材】的【单价】之和", "result": [{"name": "基础砌筑", "constraints": {"type": "ProjectDivisionItem", "path": "架空输电线路本体工程/基础工程/基础砌筑", "name": "基础砌筑"}}, {"name": "圆钢", "constraints": {"type": "ProjectQuantity", "name": "圆钢", "类型": "主材"}}]}
{"name": "本体费用合计_元", "query": "从【工程费用】中获取【架空输电线路本体工程.合计费】的属性", "result": [{"name": "架空输电线路本体工程", "constraints": {"type": "Fee", "name": "架空输电线路本体工程", "code": "BTGC"}}, {"name": "合计费", "constraints": {"type": "Fee", "name": "合计费"}}]}
{"name": "本体工程人工费_本体_元", "query": "从【架空输电线路本体工程】项目划分中获取名称属于【本体工程人工费_本体_元】的费用", "result": [{"name": "架空输电线路本体工程", "constraints": {"type": "ProjectDivisionItem", "name": "架空输电线路本体工程"}}, {"name": "本体工程人工费_本体_元", "constraints": {"type": "CostItem", "name": "本体工程人工费_本体_元"}}]}
{"name": "本体工程人工费_调试_元", "query": "从【架空输电线路本体工程】项目划分中获取名称属于【本体工程人工费_调试_元】的费用", "result": [{"name": "架空输电线路本体工程", "constraints": {"type": "ProjectDivisionItem", "name": "架空输电线路本体工程"}}, {"name": "本体工程人工费_调试_元", "constraints": {"type": "CostItem", "name": "本体工程人工费_调试_元"}}]}
{"name": "本体工程机械费_本体_元", "query": "从【架空输电线路本体工程】项目划分中获取名称属于【本体工程机械费_本体_元】的费用", "result": [{"name": "架空输电线路本体工程", "constraints": {"type": "ProjectDivisionItem", "name": "架空输电线路本体工程"}}, {"name": "本体工程机械费_本体_元", "constraints": {"type": "CostItem", "name": "本体工程机械费_本体_元"}}]}
{"name": "本体工程机械费_调试_元", "query": "从【架空输电线路本体工程】项目划分中获取名称属于【本体工程机械费_调试_元】的费用", "result": [{"name": "架空输电线路本体工程", "constraints": {"type": "ProjectDivisionItem", "name": "架空输电线路本体工程"}}, {"name": "本体工程机械费_调试_元", "constraints": {"type": "CostItem", "name": "本体工程机械费_调试_元"}}]}
{"name": "基础工程费用_元", "query": "从【架空输电线路本体工程/基础工程】项目划分中获取名称属于【基础工程费用_元】的费用", "result": [{"name": "基础工程", "constraints": {"type": "ProjectDivisionItem", "path": "架空输电线路本体工程/基础工程", "name": "基础工程"}}, {"name": "基础工程费用_元", "constraints": {"type": "CostItem", "name": "基础工程费用_元"}}]}
{"name": "杆塔工程费用_元", "query": "从【架空输电线路本体工程/杆塔工程】项目划分中获取名称属于【杆塔工程费用_元】的费用", "result": [{"name": "杆塔工程", "constraints": {"type": "ProjectDivisionItem", "path": "架空输电线路本体工程/杆塔工程", "name": "杆塔工程"}}, {"name": "杆塔工程费用_元", "constraints": {"type": "CostItem", "name": "杆塔工程费用_元"}}]}
{"name": "接地工程费用_元", "query": "从【架空输电线路本体工程/接地工程】项目划分中获取名称属于【接地工程费用_元】的费用", "result": [{"name": "接地工程", "constraints": {"type": "ProjectDivisionItem", "path": "架空输电线路本体工程/接地工程", "name": "接地工程"}}, {"name": "接地工程费用_元", "constraints": {"type": "CostItem", "name": "接地工程费用_元"}}]}
{"name": "架线工程费用_元", "query": "从【架空输电线路本体工程/架线工程】项目划分中获取名称属于【架线工程费用_元】的费用", "result": [{"name": "架线工程", "constraints": {"type": "ProjectDivisionItem", "path": "架空输电线路本体工程/架线工程", "name": "架线工程"}}, {"name": "架线工程费用_元", "constraints": {"type": "CostItem", "name": "架线工程费用_元"}}]}
{"name": "附件工程费用_元", "query": "从【架空输电线路本体工程/附件安装工程】项目划分中获取名称属于【附件工程费用_元】的费用", "result": [{"name": "附件安装工程", "constraints": {"type": "ProjectDivisionItem", "path": "架空输电线路本体工程/附件安装工程", "name": "附件安装工程"}}, {"name": "附件工程费用_元", "constraints": {"type": "CostItem", "name": "附件工程费用_元"}}]}
{"name": "辅助工程费用_元", "query": "从【架空输电线路本体工程/辅助工程】项目划分中获取名称属于【辅助工程费用_元】的费用", "result": [{"name": "辅助工程", "constraints": {"type": "ProjectDivisionItem", "path": "架空输电线路本体工程/辅助工程", "name": "辅助工程"}}, {"name": "辅助工程费用_元", "constraints": {"type": "CostItem", "name": "辅助工程费用_元"}}]}
{"name": "辅助工程费用_调试_元", "query": "从【架空输电线路本体工程/辅助工程】项目划分中获取名称属于【辅助工程费用_调试_元】的费用", "result": [{"name": "辅助工程", "constraints": {"type": "ProjectDivisionItem", "path": "架空输电线路本体工程/辅助工程", "name": "辅助工程"}}, {"name": "辅助工程费用_调试_元", "constraints": {"type": "CostItem", "name": "辅助工程费用_调试_元"}}]}
{"name": "辅助设施工程_元", "query": "从【工程费用】中获取【辅助设施工程.合计费】的属性", "result": [{"name": "辅助设施工程", "constraints": {"type": "ProjectDivisionItem", "name": "辅助设施工程"}}, {"name": "合计费", "constraints": {"type": "CostItem", "name": "合计费"}}]}
{"name": "其他费用合计_元", "query": "从【工程费用】中获取【其他费用.合计费】的属性", "result": [{"name": "工程费用", "constraints": {"type": "FeeScheduleItem", "name": "工程费用表"}}, {"name": "其他费用.合计费", "constraints": {"type": "Fee", "name": "合计费", "code": "其他费用"}}]}
{"name": "建场费合计_元", "query": "从【其他费用】中获取【建设场地征用及清理费】的属性", "result": [{"name": "其他费用", "constraints": {"type": "FeeScheduleItem", "name": "其他费用表"}}, {"name": "建设场地征用及清理费", "constraints": {"type": "Fee", "name": "建设场地征用及清理费"}}]}
{"name": "项目建设管理费合计_元", "query": "从【其他费用】中获取【项目建设管理费】的属性", "result": [{"name": "其他费用", "constraints": {"type": "FeeScheduleItem", "name": "其他费用表"}}, {"name": "项目建设管理费", "constraints": {"type": "Fee", "name": "项目建设管理费"}}]}
{"name": "其中:工程监理费_元", "query": "从【其他费用】中获取【工程监理费】的属性", "result": [{"name": "其他费用表", "constraints": {"type": "FeeScheduleItem", "name": "其他费用表"}}, {"name": "工程监理费", "constraints": {"type": "Fee", "name": "工程监理费"}}]}
{"name": "项目建设技术服务费合计_元", "query": "从【其他费用】中获取【项目建设技术服务费】的属性", "result": [{"name": "其他费用", "constraints": {"type": "FeeScheduleItem", "name": "其他费用表"}}, {"name": "项目建设技术服务费", "constraints": {"type": "Fee", "name": "项目建设技术服务费"}}]}
{"name": "其中:项目前期工作费_元", "query": "从【其他费用】中获取【项目前期工作费】的属性", "result": [{"name": "其他费用表", "constraints": {"type": "FeeScheduleItem", "name": "其他费用表"}}, {"name": "项目前期工作费", "constraints": {"type": "Fee", "name": "项目前期工作费"}}]}
{"name": "其中:勘察费_元", "query": "从【其他费用】中获取【勘察费】的属性", "result": [{"name": "其他费用表", "constraints": {"type": "FeeScheduleItem", "name": "其他费用表"}}, {"name": "勘察费", "constraints": {"type": "Fee", "name": "勘察费"}}]}
{"name": "其中:设计费_元", "query": "从【其他费用】中获取【设计费】的属性", "result": [{"name": "其他费用", "constraints": {"type": "FeeScheduleItem", "name": "其他费用表"}}, {"name": "设计费", "constraints": {"type": "Fee", "name": "设计费"}}]}
{"name": "其中:工程建设检测费_元", "query": "从【其他费用】中获取【工程建设检测费】的属性", "result": [{"name": "其他费用", "constraints": {"type": "FeeScheduleItem", "name": "其他费用表"}}, {"name": "工程建设检测费", "constraints": {"type": "Fee", "name": "工程建设检测费"}}]}
{"name": "生产准备费_元", "query": "从【其他费用】中获取【生产准备费】的属性", "result": [{"name": "其他费用表", "constraints": {"type": "FeeScheduleItem", "name": "其他费用表"}}, {"name": "生产准备费", "constraints": {"type": "Fee", "name": "生产准备费"}}]}
{"name": "其中:安全文明施工费_线路_元", "query": "从【架空输电线路本体工程】项目划分中获取名称属于【其中:安全文明施工费_线路_元】的费用", "result": [{"name": "架空输电线路本体工程", "constraints": {"type": "ProjectDivisionItem", "name": "架空输电线路本体工程"}}, {"name": "其中:安全文明施工费_线路_元", "constraints": {"type": "CostItem", "name": "其中:安全文明施工费_线路_元"}}]}
{"name": "其中:安全文明施工费_调试_元", "query": "从【架空输电线路本体工程】项目划分中获取名称属于【其中:安全文明施工费_调试_元】的费用", "result": [{"name": "架空输电线路本体工程", "constraints": {"type": "ProjectDivisionItem", "name": "架空输电线路本体工程"}}, {"name": "其中:安全文明施工费_调试_元", "constraints": {"type": "CostItem", "name": "其中:安全文明施工费_调试_元"}}]}
{"name": "基本预备费_元", "query": "从【工程费用】中获取【基本预备费.合计费】的属性", "result": [{"name": "基本预备费.合计费", "constraints": {"type": "Fee", "name": "基本预备费.合计费"}}]}
{"name": "静态投资_元", "query": "从【工程费用】中获取【工程静态投资(一~七项合计).合计费】的属性", "result": [{"name": "工程费用表", "constraints": {"type": "FeeScheduleItem", "name": "工程费用表"}}, {"name": "工程静态投资(一~七项合计).合计费", "constraints": {"type": "Fee", "name": "工程静态投资(一~七项合计).合计费"}}]}
{"name": "建设期利息_元", "query": "从【工程费用】中获取【建设期贷款利息.合计费】的属性", "result": [{"name": "建设期贷款利息", "constraints": {"type": "Fee", "name": "建设期贷款利息", "code": "DKLX"}}, {"name": "合计费", "constraints": {"type": "Fee", "name": "合计费"}}]}
{"name": "动态投资_元", "query": "从【工程费用】中获取【工程动态投资(一~八项合计).合计费】的属性", "result": [{"name": "工程费用", "constraints": {"type": "FeeScheduleItem", "name": "工程费用表"}}, {"name": "工程动态投资(一~八项合计).合计费", "constraints": {"type": "Fee", "name": "工程动态投资(一~八项合计).合计费"}}]}
{"name": "增值税抵扣税额_元", "query": "从【工程费用】中获取【其中:可抵扣增值税额.合计费】的属性", "result": [{"name": "工程费用", "constraints": {"type": "FeeScheduleItem", "name": "工程费用表"}}, {"name": "其中:可抵扣增值税额.合计费", "constraints": {"type": "Fee", "name": "其中:可抵扣增值税额.合计费"}}]}
{"name": "基础钢材量", "query": "从【架空输电线路本体工程/基础工程/基础砌筑】及其子孙项目划分中查找名称中包含【圆钢】的所有【主材】的【数量】之和", "result": [{"name": "基础砌筑", "constraints": {"type": "ProjectDivisionItem", "path": "架空输电线路本体工程/基础工程/基础砌筑", "name": "基础砌筑"}}, {"name": "主材", "constraints": {"type": "ProjectQuantity", "name": "圆钢", "类型": "主材"}}]}
{"name": "基础钢材价格", "query": "从【架空输电线路本体工程/基础工程/基础砌筑】及其子孙项目划分中查找名称中包含【圆钢】的所有【主材】的【单价】之和", "result": [{"name": "基础砌筑", "constraints": {"type": "ProjectDivisionItem", "path": "架空输电线路本体工程/基础工程/基础砌筑", "name": "基础砌筑"}}, {"name": "主材", "constraints": {"type": "ProjectQuantity", "path": "架空输电线路本体工程/基础工程/基础砌筑", "类型": "主材", "name": "包含圆钢"}}]}
{"name": "本体费用合计_元", "query": "从【工程费用】中获取【架空输电线路本体工程】的【合计费】的属性", "result": [{"name": "工程费用表", "constraints": {"type": "FeeScheduleItem", "name": "工程费用表"}}, {"name": "架空输电线路本体工程", "constraints": {"parent": "工程费用表", "type": "Fee", "name": "架空输电线路本体工程", "code": "BTGC"}}, {"name": "合计费", "constraints": {"parent": "架空输电线路本体工程", "type": "Fee", "name": "合计费"}}]}
{"name": "本体工程人工费_本体_元", "query": "从【架空输电线路本体工程】项目划分中获取取费费用名称属于【人工费】的费用", "result": [{"name": "架空输电线路本体工程", "constraints": {"type": "ProjectDivisionItem", "name": "架空输电线路本体工程"}}, {"name": "人工费", "constraints": {"parent": "架空输电线路本体工程", "type": "FeeCollection", "name": "人工费"}}]}
{"name": "本体工程人工费_调试_元", "query": "从【架空输电线路本体工程】项目划分中获取取费费用名称属于【人工费】的费用", "result": [{"name": "架空输电线路本体工程", "constraints": {"type": "ProjectDivisionItem", "name": "架空输电线路本体工程"}}, {"name": "人工费", "constraints": {"parent": "架空输电线路本体工程", "type": "FeeCollection", "name": "人工费"}}]}
{"name": "本体工程机械费_本体_元", "query": "从【架空输电线路本体工程】项目划分中获取取费费用名称属于【施工机械使用费】的费用", "result": [{"name": "架空输电线路本体工程", "constraints": {"type": "ProjectDivisionItem", "name": "架空输电线路本体工程"}}, {"name": "施工机械使用费", "constraints": {"parent": "架空输电线路本体工程", "type": "Fee", "name": "施工机械使用费"}}]}
{"name": "本体工程机械费_调试_元", "query": "从【架空输电线路本体工程】项目划分中获取取费费用名称属于【施工机械使用费】的费用", "result": [{"name": "架空输电线路本体工程", "constraints": {"type": "ProjectDivisionItem", "name": "架空输电线路本体工程"}}, {"name": "施工机械使用费", "constraints": {"parent": "架空输电线路本体工程", "type": "Fee", "name": "施工机械使用费"}}]}
{"name": "基础工程费用_元", "query": "从【架空输电线路本体工程/基础工程】项目划分中获取取费费用名称属于【合计】的费用", "result": [{"name": "基础工程", "constraints": {"type": "ProjectDivisionItem", "path": "架空输电线路本体工程/基础工程", "name": "基础工程"}}, {"name": "合计", "constraints": {"parent": "基础工程", "type": "CostItem", "name": "合计"}}]}
{"name": "杆塔工程费用_元", "query": "从【架空输电线路本体工程/杆塔工程】项目划分中获取取费费用名称属于【合计】的费用", "result": [{"name": "杆塔工程", "constraints": {"type": "ProjectDivisionItem", "path": "架空输电线路本体工程/杆塔工程", "name": "杆塔工程"}}, {"name": "合计", "constraints": {"parent": "杆塔工程", "type": "CostItem", "name": "合计"}}]}
{"name": "接地工程费用_元", "query": "从【架空输电线路本体工程/接地工程】项目划分中获取取费费用名称属于【合计】的费用", "result": [{"name": "接地工程", "constraints": {"type": "ProjectDivisionItem", "path": "架空输电线路本体工程/接地工程", "name": "接地工程"}}, {"name": "合计", "constraints": {"parent": "接地工程", "type": "CostItem", "name": "合计"}}]}
{"name": "架线工程费用_元", "query": "从【架空输电线路本体工程/架线工程】项目划分中获取取费费用名称属于【合计】的费用", "result": [{"name": "架线工程", "constraints": {"type": "ProjectDivisionItem", "path": "架空输电线路本体工程/架线工程", "name": "架线工程"}}, {"name": "合计", "constraints": {"parent": "架线工程", "type": "CostItem", "name": "合计"}}]}
{"name": "附件工程费用_元", "query": "从【架空输电线路本体工程/附件安装工程】项目划分中获取取费费用名称属于【合计】的费用", "result": [{"name": "附件安装工程", "constraints": {"type": "ProjectDivisionItem", "path": "架空输电线路本体工程/附件安装工程", "name": "附件安装工程"}}, {"name": "合计", "constraints": {"parent": "附件安装工程", "type": "CostItem", "name": "合计"}}]}
{"name": "辅助工程费用_元", "query": "从【架空输电线路本体工程/辅助工程】项目划分中获取取费费用名称属于【合计】的费用", "result": [{"name": "辅助工程", "constraints": {"type": "ProjectDivisionItem", "path": "架空输电线路本体工程/辅助工程", "name": "辅助工程"}}, {"name": "合计", "constraints": {"parent": "辅助工程", "type": "CostItem", "name": "合计"}}]}
{"name": "辅助工程费用_调试_元", "query": "从【架空输电线路本体工程/辅助工程】项目划分中获取取费费用名称属于【合计】的费用", "result": [{"name": "辅助工程", "constraints": {"type": "ProjectDivisionItem", "path": "架空输电线路本体工程/辅助工程", "name": "辅助工程"}}, {"name": "合计", "constraints": {"parent": "辅助工程", "type": "CostItem", "name": "合计"}}]}
{"name": "辅助设施工程_元", "query": "从【工程费用】中获取【辅助设施工程】的【合计费】的属性", "result": [{"name": "辅助设施工程", "constraints": {"type": "ProjectDivisionItem", "name": "辅助设施工程"}}, {"name": "合计费", "constraints": {"type": "CostItem", "name": "合计费", "parent": "辅助设施工程"}}]}
{"name": "其他费用合计_元", "query": "从【工程费用】中获取【其他费用】的【合计费】的属性", "result": [{"name": "工程费用", "constraints": {"type": "FeeScheduleItem", "name": "工程费用表"}}, {"name": "其他费用", "constraints": {"parent": "工程费用表", "type": "Fee", "name": "其他费用"}}, {"name": "合计费", "constraints": {"parent": "其他费用", "type": "Fee", "name": "合计费"}}]}
{"name": "建场费合计_元", "query": "从【其他费用】中获取【建设场地征用及清理费】的属性", "result": [{"name": "其他费用", "constraints": {"type": "FeeScheduleItem", "name": "其他费用表"}}, {"name": "建设场地征用及清理费", "constraints": {"parent": "其他费用", "type": "Fee", "name": "建设场地征用及清理费"}}]}
{"name": "项目建设管理费合计_元", "query": "从【其他费用】中获取【项目建设管理费】的属性", "result": [{"name": "其他费用", "constraints": {"type": "FeeScheduleItem", "name": "其他费用表"}}, {"name": "项目建设管理费", "constraints": {"parent": "其他费用", "type": "Fee", "name": "项目建设管理费"}}]}
{"name": "其中:工程监理费_元", "query": "从【其他费用】中获取【工程监理费】的属性", "result": [{"name": "其他费用表", "constraints": {"type": "FeeScheduleItem", "name": "其他费用表"}}, {"name": "工程监理费", "constraints": {"parent": "其他费用表", "type": "Fee", "name": "工程监理费"}}]}
{"name": "项目建设技术服务费合计_元", "query": "从【其他费用】中获取【项目建设技术服务费】的属性", "result": [{"name": "其他费用", "constraints": {"type": "FeeScheduleItem", "name": "其他费用表"}}, {"name": "项目建设技术服务费", "constraints": {"parent": "其他费用", "type": "Fee", "name": "项目建设技术服务费"}}]}
{"name": "其中:项目前期工作费_元", "query": "从【其他费用】中获取【项目前期工作费】的属性", "result": [{"name": "其他费用表", "constraints": {"type": "FeeScheduleItem", "name": "其他费用表"}}, {"name": "项目前期工作费", "constraints": {"parent": "其他费用表", "type": "Fee", "name": "项目前期工作费"}}]}
{"name": "其中:勘察费_元", "query": "从【其他费用】中获取【勘察费】的属性", "result": [{"name": "其他费用表", "constraints": {"type": "FeeScheduleItem", "name": "其他费用表"}}, {"name": "勘察费", "constraints": {"parent": "其他费用表", "type": "Fee", "name": "勘察费"}}]}
{"name": "其中:设计费_元", "query": "从【其他费用】中获取【设计费】的属性", "result": [{"name": "其他费用", "constraints": {"type": "FeeScheduleItem", "name": "其他费用表"}}, {"name": "设计费", "constraints": {"parent": "其他费用表", "type": "Fee", "name": "设计费"}}]}
{"name": "其中:工程建设检测费_元", "query": "从【其他费用】中获取【工程建设检测费】的属性", "result": [{"name": "其他费用", "constraints": {"type": "FeeScheduleItem", "name": "其他费用表"}}, {"name": "工程建设检测费", "constraints": {"parent": "其他费用表", "type": "Fee", "name": "工程建设检测费"}}]}
{"name": "生产准备费_元", "query": "从【其他费用】中获取【生产准备费】的属性", "result": [{"name": "其他费用表", "constraints": {"type": "FeeScheduleItem", "name": "其他费用表"}}, {"name": "生产准备费", "constraints": {"parent": "其他费用表", "type": "Fee", "name": "生产准备费"}}]}
{"name": "其中:安全文明施工费_线路_元", "query": "从【架空输电线路本体工程】项目划分中获取取费费用名称属于【安全文明施工费】的费用", "result": [{"name": "架空输电线路本体工程", "constraints": {"type": "ProjectDivisionItem", "name": "架空输电线路本体工程"}}, {"name": "安全文明施工费", "constraints": {"parent": "架空输电线路本体工程", "type": "Fee", "name": "安全文明施工费"}}]}
{"name": "其中:安全文明施工费_调试_元", "query": "从【架空输电线路本体工程】项目划分中获取取费费用名称属于【安全文明施工费】的费用", "result": [{"name": "架空输电线路本体工程", "constraints": {"type": "ProjectDivisionItem", "name": "架空输电线路本体工程"}}, {"name": "安全文明施工费", "constraints": {"parent": "架空输电线路本体工程", "type": "Fee", "name": "安全文明施工费"}}]}
{"name": "基本预备费_元", "query": "从【工程费用】中获取【基本预备费】的【合计费】的属性", "result": [{"name": "基本预备费", "constraints": {"type": "Fee", "name": "基本预备费"}}, {"name": "合计费", "constraints": {"parent": "基本预备费", "type": "Fee", "name": "合计费"}}]}
{"name": "静态投资_元", "query": "从【工程费用】中获取【工程静态投资(一~七项合计)】的【合计费】的属性", "result": [{"name": "工程费用表", "constraints": {"type": "FeeScheduleItem", "name": "工程费用表"}}, {"name": "工程静态投资(一~七项合计)", "constraints": {"parent": "工程费用表", "type": "Fee", "name": "工程静态投资(一~七项合计)"}}, {"name": "合计费", "constraints": {"parent": "工程静态投资(一~七项合计)", "type": "Fee", "name": "合计费"}}]}
{"name": "建设期利息_元", "query": "从【工程费用】中获取【建设期贷款利息】的【合计费】的属性", "result": [{"name": "工程费用", "constraints": {"type": "FeeScheduleItem", "name": "工程费用表"}}, {"name": "建设期贷款利息", "constraints": {"parent": "工程费用", "type": "Fee", "name": "建设期贷款利息", "code": "DKLX"}}, {"name": "合计费", "constraints": {"parent": "建设期贷款利息", "type": "Fee", "name": "合计费"}}]}
{"name": "动态投资_元", "query": "从【工程费用】中获取【工程动态投资(一~八项合计)】的【合计费】的属性", "result": [{"name": "工程费用", "constraints": {"type": "FeeScheduleItem", "name": "工程费用表"}}, {"name": "工程动态投资(一~八项合计)", "constraints": {"parent": "工程费用", "type": "Fee", "name": "工程动态投资(一~八项合计)"}}, {"name": "合计费", "constraints": {"parent": "工程动态投资(一~八项合计)", "type": "Fee", "name": "合计费"}}]}
{"name": "增值税抵扣税额_元", "query": "从【工程费用】中获取【其中:可抵扣增值税额】的【合计费】的属性", "result": [{"name": "工程费用", "constraints": {"type": "FeeScheduleItem", "name": "工程费用表"}}, {"name": "其中:可抵扣增值税额", "constraints": {"parent": "工程费用", "type": "Fee", "name": "其中:可抵扣增值税额"}}, {"name": "合计费", "constraints": {"parent": "其中:可抵扣增值税额", "type": "Fee", "name": "合计费"}}]}
@@ -2,13 +2,13 @@ import os
import sys
import logging
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
current_file = os.path.splitext(os.path.basename(__file__))[0]
from datetime import datetime
# 获取当前时间,格式化为字符串
now_str = datetime.now().strftime("%Y%m%d%H%M%S")
log_filename = f"test_code1{now_str}.log"
current_file = os.path.splitext(os.path.basename(__file__))[0]
log_filename = f"{current_file}{now_str}.log"
logging.basicConfig(
level=logging.DEBUG,
@@ -19,7 +19,7 @@ logging.basicConfig(
],
)
logger = logging.getLogger("test_code1")
logger = logging.getLogger(current_file)
import logging
def setup_logger(logger_name):
@@ -96,7 +96,7 @@ def main():
# 加载 zhibiao.jsonl
zhibiao_data = []
with open('./tests/zhibiao.jsonl', 'r', encoding='utf-8') as f:
with open('./data/zhibiao.jsonl', 'r', encoding='utf-8') as f:
for line in f:
zhibiao_data.append(json.loads(line))
@@ -148,13 +148,13 @@ if __name__ == "__main__":
print(error)
# 保存成功结果到 jsonl 文件
success_filename = f'./tests/code_{now_str}.jsonl'
success_filename = f'./data/code.jsonl'
with open(success_filename, 'w', encoding='utf-8') as f:
for item in success_results:
f.write(json.dumps(item, ensure_ascii=False) + '\n')
# 保存失败结果到 jsonl 文件
fail_filename = f'./tests/fail_{now_str}.jsonl'
fail_filename = f'./data/fail_{now_str}.jsonl'
with open(fail_filename, 'w', encoding='utf-8') as f:
for item in fail_results:
f.write(json.dumps(item, ensure_ascii=False) + '\n')
+93 -74
View File
@@ -5,25 +5,29 @@ import json
import logging
import os
from datetime import datetime
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
# 获取当前时间,格式化为字符串
now_str = datetime.now().strftime("%Y%m%d%H%M%S")
# 日志目录
log_dir = "logs"
# 如果目录不存在,则创建
os.makedirs(log_dir, exist_ok=True)
current_file = os.path.splitext(os.path.basename(__file__))[0]
log_filename = f"{current_file}_{now_str}.log"
logging.basicConfig(
level=logging.DEBUG,
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
handlers=[
logging.FileHandler(os.path.join("logs", log_filename), encoding="utf-8"),
logging.StreamHandler()
],
handlers=[logging.FileHandler(os.path.join("logs", log_filename), encoding="utf-8"), logging.StreamHandler()],
)
logger = logging.getLogger(current_file)
def setup_logger(logger_name):
"""
设置指定名称的logger,将其级别设置为WARNING并禁用传播
@@ -50,34 +54,45 @@ from src.project import ProjectBuilder, ProjectToolkit
from src.project_implementation import ProjectToolkitNeo4j
from src.code_executor import CodeExecutor
config = Config()
business_structure = load_file(config.business_object_structure_path)
bowei_api_docs = load_file(config.bowei_api_docs_path)
# 初始化资源和客户端的函数,使用缓存避免重复加载
@st.cache_resource
def initialize_resources():
config = Config()
business_structure = load_file(config.business_object_structure_path)
bowei_api_docs = load_file(config.bowei_api_docs_path)
llm_client_coder = MultiAPIKeyChatOpenAI(config.openai_coder)
prompt_manager = PromptManager()
#llm_client = MultiAPIKeyChatOpenAI(config.openai)
# 创建Neo4j检索器
neo4j_conf = config.neo4j_conf
embedding_conf = config.embedding
embedding_client = EmbeddingClient(embedding_conf)
knowledge_retriever = Neo4jRawRetriever(neo4j_conf)
llm_client_coder = MultiAPIKeyChatOpenAI(config.openai_coder)
ProjectBuilder.register(ProjectToolkitNeo4j, knowledge_retriever.driver)
prompt_manager = PromptManager()
code_executor = CodeExecutor(prompt_manager.prompts, llm_client_coder, config.max_retries)
neo4j_conf = config.neo4j_conf
embedding_conf = config.embedding
return {
"config": config,
"business_structure": business_structure,
"bowei_api_docs": bowei_api_docs,
"llm_client_coder": llm_client_coder,
"prompt_manager": prompt_manager,
"knowledge_retriever": knowledge_retriever,
"embedding_client": embedding_client,
"code_executor": code_executor,
}
embedding_client = EmbeddingClient(embedding_conf)
# 创建Neo4j检索器
knowledge_retriever = Neo4jRawRetriever(neo4j_conf)
ProjectBuilder.register(ProjectToolkitNeo4j, knowledge_retriever.driver)
code_executor = CodeExecutor(prompt_manager.prompts, llm_client_coder, config.max_retries)
# 使用缓存加载JSONL文件
@st.cache_data
def load_jsonl(file_path):
"""加载JSONL文件并返回JSON记录列表"""
"""加载JSONL文件并返回JSON指标列表"""
records = []
try:
with open(file_path, 'r', encoding='utf-8') as file:
with open(file_path, "r", encoding="utf-8") as file:
for line in file:
if line.strip():
records.append(json.loads(line))
@@ -86,82 +101,86 @@ def load_jsonl(file_path):
st.error(f"加载文件失败: {str(e)}")
return []
def run_code(data):
global code_executor
"""运行JSON记录中的代码并返回结果"""
if not data or 'code' not in data:
return {
"code": 40000,
"message": "没有可执行的代码",
"status": False,
"data": None
}
result = code_executor.execute_code(data['code'])
def run_code(data, code_executor):
"""运行JSON指标中的代码并返回结果"""
if not data or "code" not in data:
return {"code": 40000, "message": "没有可执行的代码", "status": False, "data": None}
return code_executor.execute_code(data["code"])
def main():
st.set_page_config(layout="wide", page_title="JSONL查看器")
st.title("JSONL文件查看器")
st.set_page_config(layout="wide", page_title="工程指标查看器")
st.title("工程指标查看器")
# 初始化资源
resources = initialize_resources()
code_executor = resources["code_executor"]
# 设置默认文件路径
default_file_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "../tests", "code.jsonl")
# 文件路径输入
file_path = st.text_input("JSONL文件路径", value=default_file_path)
if not os.path.exists(file_path):
st.warning(f"文件不存在: {file_path}")
return
# 加载JSONL文件
records = load_jsonl(file_path)
if not records:
st.warning("没有找到有效的记录")
st.warning("没有找到有效的指标")
return
# 初始化会话状态
if "selected_index" not in st.session_state:
st.session_state.selected_index = 0
if "execution_results" not in st.session_state:
st.session_state.execution_results = {}
# 创建两列布局
col1, col2 = st.columns([1, 3])
# 左侧列表
with col1:
st.subheader("记录列表")
selected_index = None
st.subheader("指标列表")
for i, record in enumerate(records):
if st.button(record.get('name', f"记录 {i+1}"), key=f"btn_{i}"):
selected_index = i
if st.button(record.get("name", f"指标 {i+1}"), key=f"btn_{i}"):
st.session_state.selected_index = i
# 右侧详细信息
with col2:
if 'selected_index' not in st.session_state:
st.session_state.selected_index = 0
if selected_index is not None:
st.session_state.selected_index = selected_index
if st.session_state.selected_index < len(records):
selected_record = records[st.session_state.selected_index]
st.subheader(f"查询问题: {selected_record.get('name', '无名称')}")
record_id = selected_record.get("id", str(st.session_state.selected_index))
st.subheader(f"指标名称: {selected_record.get('name', '无名称指标')}")
st.info(selected_record.get('query', '无查询信息'))
st.subheader("代码")
# 将指标代码标题、运行代码按钮、执行结果放在同一行
run_btn_col, title_col, result_col = st.columns([1, 1, 4])
with title_col:
st.subheader("执行结果:")
with result_col:
title_code_result = st.subheader("")
with run_btn_col:
if st.button("执行指标代码"):
with st.spinner('正在执行代码...'):
result = run_code(selected_record, code_executor)
if result.get('status'):
#st.success("执行成功")
title_code_result.info(result.get('data'))
else:
title_code_result.error(f"执行失败: {result.get('message', '未知错误')}")
st.code(selected_record.get('code', '无代码'), language='python')
# 运行代码按钮
if st.button("运行代码"):
with st.spinner('正在执行代码...'):
result = run_code(selected_record)
st.subheader("运行结果")
if result.get('status'):
st.success("执行成功")
st.json(result.get('data'))
else:
st.error(f"执行失败: {result.get('message', '未知错误')}")
if __name__ == "__main__":
main()
main()
+26 -6
View File
@@ -3,6 +3,26 @@ import xml.etree.ElementTree as ET
import json
import re
def transform_string(input_str: str) -> str:
# 提取所有【】中的内容
matches = re.findall(r'【(.*?)】', input_str)
if len(matches) < 2:
return input_str # 不符合格式,直接返回
first_block = matches[0] # 第一个块,如“工程费用”
second_block = matches[1] # 第二个块,可能是“基本预备费.合计费”或“基本预备费”
suffix = input_str.split('')[-1] # 获取末尾部分,如“的属性”
# 判断第二个块是否包含点号
if '.' in second_block:
nested_parts = second_block.split('.')
nested_str = ''.join(f'{part}】的' for part in nested_parts).rstrip('')
return f'从【{first_block}】中获取{nested_str}{suffix}'
else:
return input_str
def clean_bracketed_strings(input_str: str) -> str:
# 替换【'xxx'】为【xxx】
result = re.sub(r"'([^']+)'", r"\1】", input_str)
@@ -125,7 +145,7 @@ def xml_to_json(xml_content, output_path):
result.append(base_item)
elif data_sources in project_division:
mapping_desc = f"{index_extraction_scope}项目划分中获取名称于【{indicator_name}】的费用"
mapping_desc = f"返回项目划分{index_extraction_scope}下取费名称于【{keyword}】的费用"
base_item["指标描述"] = {
"指标映射": mapping_desc,
"映射规则": parsed["映射规则"]
@@ -142,11 +162,11 @@ def xml_to_json(xml_content, output_path):
# 取数据来源的开头两个字(如"定额"、"清单"等)
temp3 = data_sources[0:2]
if temp3 in ["清单", "定额", "人材机"]:
mapping_desc = f"{index_extraction_scope}及其子孙项目划分中查找编码包含【{temp0}】的所有【{temp3}】的【{temp2}】之和"
mapping_desc = f"返回项目划分{index_extraction_scope}编码包含【{temp0}】的所有【{temp3}】的【{temp2}】之和"
elif temp3 in ["主材", "设备"]:
mapping_desc = f"{index_extraction_scope}】及其子孙项目划分中查找名称包含【{temp0}】的所有【{temp3}】的【{temp2}】之和"
mapping_desc = f"返回项目划分{index_extraction_scope}】及名称包含【{temp0}】的所有【{temp3}】的【{temp2}】之和"
else:
mapping_desc = f"从【{data_sources}】中获取{temp0}属性"
mapping_desc = f"从【{data_sources}】中获取{temp0}"
base_item["指标描述"] = {
"指标映射": mapping_desc,
@@ -191,6 +211,7 @@ def xml_to_json(xml_content, output_path):
if isinstance(indicator_map, str):
new_mapping = clean_bracketed_strings(indicator_map)
new_mapping = transform_string(new_mapping)
item["指标描述"]["指标映射"] = new_mapping
# 保存为 JSON 文件
@@ -199,8 +220,7 @@ def xml_to_json(xml_content, output_path):
return "结果已保存"
xml_content = read_xml_as_string('dataset/主网架空线路造价分析指标.xml')
json_output = xml_to_json(xml_content, output_path= "./tests/zhibiao.json")
json_output = xml_to_json(xml_content, output_path= "./data/zhibiao.json")
print("转换完毕!")
@@ -99,7 +99,7 @@ def main():
)
# 读取 zhibiao.json
zhibiao_path = os.path.join(os.path.dirname(__file__), "zhibiao.json")
zhibiao_path = os.path.join(os.path.dirname(__file__), "../data/zhibiao.json")
with open(zhibiao_path, "r", encoding="utf-8") as f:
zhibiao_data = json.load(f)
@@ -175,7 +175,7 @@ def main():
print(error)
# 将成功内容保存为 jsonl 文件
success_jsonl_path = os.path.join(os.path.dirname(__file__), f"zhibiao_{now_str}.jsonl")
success_jsonl_path = os.path.join(os.path.dirname(__file__), f"../data/zhibiao.jsonl")
with open(success_jsonl_path, "w", encoding="utf-8") as f:
for item in success_list:
f.write(json.dumps(item, ensure_ascii=False) + "\n")