From c02720bb5f35871de620bf9f108d6db3cdd72134 Mon Sep 17 00:00:00 2001 From: chentianrui Date: Tue, 3 Jun 2025 15:03:49 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=A0=E9=99=A4=20project=20copy.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- project copy.py | 613 ------------------------------------------------ 1 file changed, 613 deletions(-) delete mode 100644 project copy.py diff --git a/project copy.py b/project copy.py deleted file mode 100644 index 91a244b..0000000 --- a/project copy.py +++ /dev/null @@ -1,613 +0,0 @@ -""" -软件知识图谱类定义 -根据Ontology_Layer.txt文件中的知识图谱信息创建 -""" - - -class ProjectTookiIt: - """ - 项目类 - 描述: 代表整个项目结构的顶层容器,包含项目划分集 - """ - - def __init__(self): - self.project_division_set = ProjectDivisionSet() # 项目划分集对象 - - def get_division_item_by_path(self, path): - """ - 通过路径获取项目划分对象 - - Args: - path (str): 以'/'分隔的多级项目划分名称路径 - - Returns: - ProjectDivisionItem|None: 对应的项目划分对象,如果路径不存在返回None,成功找到返回项目划分对象 - - Note: - 当路径为空字符串时,会返回None - """ - names = path.split("/") - if not names: - raise ValueError("路径不能为空") - - try: - current = self.project_division_set.get_division_item(names[0]) - except KeyError: - return None - - for name in names[1:]: - found = False - for child in current.children: - if child.项目名称 == name: - current = child - found = True - break - if not found: - return None - return current - - def get_quantities_by_paths(self, paths_str, quantity_type=None, keyword=None): - """ - 获取多个项目路径下的工程量对象 - - Args: - paths_str (str): 以'@@'分隔的多个项目路径字符串,每个路径以'/'分隔层级 - quantity_type (str): 工程量类型('定额'、'主材'、'设备'或None表示所有类型) - keyword (str): 工程量代码或名称中的关键字(可选) - - Returns: - list: 包含所有匹配的工程量对象的列表 - """ - paths = paths_str.split("@@") if paths_str else [] - results = [] - - for path in paths: - item = self.get_division_item_by_path(path.strip()) - if item is None: - continue - - def collect_quantities(node): - for quantity in node.get_quantities(): - # 检查类型匹配 - type_matched = True - if quantity_type: - if quantity_type == "定额" and not isinstance(quantity, Ration): - type_matched = False - elif quantity_type == "主材" and not isinstance(quantity, Material): - type_matched = False - elif quantity_type == "设备" and not isinstance(quantity, Equipment): - type_matched = False - - # 检查关键字匹配 - keyword_matched = True - if keyword: - keyword_matched = (keyword in (quantity.编码 or "")) or (keyword in (quantity.name or "")) - - if type_matched and keyword_matched: - results.append(quantity) - - for child in node.children: - collect_quantities(child) - - collect_quantities(item) - - return results - - -class ProjectDivisionSet: - """ - 项目划分集 - 描述: 代表projectDivision下的第一层键和第二层建,例如"安装工程"、"安装" - JSON对应: projectDivision下的直接键名,如"安装工程": {...}、"安装": [...] - """ - - def __init__(self): - self.category_name = None # xsd:string - self.division_items = {} # 存储项目划分项的字典,键为项目名称 - - def get_division_item(self, item_name): - """ - Get project division item by name - - Args: - item_name (str): The name of item to find - - Returns: - ProjectDivisionItem: The corresponding division item object - - Raises: - KeyError: When item name does not exist - """ - if item_name not in self.division_items: - raise KeyError(f'Item name "{item_name}" does not exist') - return self.division_items[item_name] - - # 工程属性查询方法 - @abstractmethod - def get_project_property_by_name(self, name): - """ - 通过名称获取工程属性 - - Args: - name (str): 工程属性名称 - - Returns: - str|None: 对应的工程属性值,如果不存在返回None - """ - pass - - @abstractmethod - def get_project_property_by_parent_and_name(self, parent_path, partial_name): - """ - 通过父节点路径和模糊名称获取工程属性 - - Args: - parent_path (str): 父节点的路径,以'/'分隔的多级节点路径 - partial_name (str): 目标节点的模糊或不完整名称 - - Returns: - dict: 包含所有匹配的工程属性的字典,键为属性名,值为属性值 - """ - pass - - -class ProjectDivisionItem: - """ - 项目划分项 - 描述: 代表项目结构中的层级条目,具有自身的属性,并且可以包含子项目划分项或详细工作项 - JSON对应: ProjectDivisionSet数组中的对象,或ProjectDivisionItem的children数组中type为"项目划分"的对象 - """ - - def __init__(self): - self.GUID = None # xsd:string - self.id = None # xsd:string - self.name = None # xsd:string - self.代码 = None # xsd:string (可选) - self.费率 = None # xsd:string - self.单位 = None # xsd:string (可选) - self.取费表id = None # xsd:string - self.颜色标记 = None # xsd:string - self.取费表 = None # xsd:string - self.合价含税 = None # xsd:string (可选) - self.type = None # xsd:string - self.专业类型 = None # xsd:string - self.资源库列表 = None # xsd:list (可选) - self.notCheck = None # xsd:string (可选) - self.children = [] # 存储子项目划分项的数组 - self.quantities = [] # 存储工程量对象的数组 - self.cost_set = None # xsd:CostSet - - def get_cost_set(self): - """ - 获取费用集对象 - - Returns: - CostSet: 关联的费用集对象 - """ - return self.cost_set - - def add_child(self, child_item): - """ - 添加子项目划分项 - - Args: - child_item (ProjectDivisionItem): 子项目对象 - - Raises: - ValueError: 当child_item不是ProjectDivisionItem类型时 - """ - if not isinstance(child_item, ProjectDivisionItem): - raise ValueError("child_item必须是ProjectDivisionItem类型") - self.children.append(child_item) - - def get_child(self, index): - """ - 根据索引获取子项目划分项 - - Args: - index (int): 子项目索引 - - Returns: - ProjectDivisionItem: 对应的子项目对象 - - Raises: - IndexError: 当索引超出范围时 - """ - if index < 0 or index >= len(self.children): - raise IndexError(f'索引"{index}"超出范围') - return self.children[index] - - def traverse(self, callback, depth=0): - """ - 遍历树形结构 - - Args: - callback (function): 回调函数,接收当前节点和深度作为参数 - depth (int): 当前深度,默认为0 - """ - callback(self, depth) - for child in self.children: - child.traverse(callback, depth + 1) - - def get_quantities(self): - """ - 获取当前节点的ProjectQuantity及其子类(Ration, Material, Equipment)的实例 - - Returns: - list: 包含当前节点ProjectQuantity实例的列表 - """ - return self.quantities - - -class ProjectQuantity: - """ - 工程量 - 描述: 代表项目划分项(ProjectDivisionItem)下的具体工作单元或物料项,是定额、主材、设备的父类型 - """ - - def __init__(self): - self.id = None # xsd:string - self.类型 = None # xsd:string ("0"为定额,"1"为主材,"5"为设备) - self.name = None # xsd:string - self.编码 = None # xsd:string - self.单位 = None # xsd:string - self.数量 = None # xsd:string - self.资源库名称 = None # xsd:string - self.投标数量 = None # xsd:string (可选) - self.投标单价 = None # xsd:string (可选) - self.特征段 = None # xsd:string (可选) - self.关联父级量 = None # xsd:string (可选) - self.颜色标记 = None # xsd:string (可选) - self.单价不含税 = None - self.cost_set = None # xsd:CostSet - - def get_cost_set(self): - """ - 获取费用集对象 - - Returns: - CostSet: 关联的费用集对象 - """ - return self.cost_set # xsd:string (可选) - - -class Ration(ProjectQuantity): - """ - 定额 - 描述: 代表一种标准的工程量条目,通常包含详细的工、料、机消耗标准 - """ - - def __init__(self): - super().__init__() - self.计算式 = None # xsd:string - self.中标计算式 = None # xsd:string - self.人工费 = None # xsd:string - self.机械费 = None # xsd:string - self.甲供材料费不含税 = None # xsd:string - self.材料费 = None # xsd:string - self.定额系数 = None # xsd:string - self.人工系数 = None # xsd:string - self.材料系数 = None # xsd:string - self.机械系数 = None # xsd:string - self.定额范围 = None # xsd:string - self.定额章节名称 = None # xsd:string - self.费用类型 = None # xsd:string - self.甲供材料费含税 = None # xsd:string - self.投标合价 = None # xsd:string - self.其中甲供材料费 = None # xsd:string - self.合价不含税 = None # xsd:string - self.基价 = None # xsd:string - self.所属定额库 = None # xsd:string - - -class Material(ProjectQuantity): - """ - 主材 - 描述: 代表工程中使用的主要材料 - """ - - def __init__(self): - super().__init__() - self.规格型号 = None # xsd:string - self.损耗率 = None # xsd:string - self.供货方 = None # xsd:string - self.集中配送 = None # xsd:string (可选) - self.单重 = None # xsd:string (可选) - self.市场价不含税 = None # xsd:string - self.市场价含税 = None # xsd:string - self.单价含税 = None # xsd:string - self.结算市场价不含税 = None # xsd:string (可选) - self.结算市场价含税 = None # xsd:string (可选) - self.基准价不含税 = None # xsd:string (可选) - self.基准价含税 = None # xsd:string (可选) - self.费用类型 = None # xsd:string - self.增值税率 = None # xsd:string (可选) - self.合价含税 = None # xsd:string - self.合价不含税 = None # xsd:string - self.线重 = None # xsd:string (可选) - self.制造长度 = None # xsd:string (可选) - self.截面积 = None # xsd:string (可选) - - -class Equipment(ProjectQuantity): - """ - 设备 - 描述: 代表工程中安装或使用的设备 - """ - - def __init__(self): - super().__init__() - self.规格型号 = None # xsd:string - self.供货方 = None # xsd:string - self.运杂费率 = None # xsd:string (可选) - self.单价含税 = None # xsd:string - self.设备类型 = None # xsd:string (可选) - self.增值税率 = None # xsd:string (可选) - self.合价含税 = None # xsd:string - self.合价不含税 = None # xsd:string - - -class MaterialOrEquipment: - """ - 材机 - 描述: 代表DetailedWorkItem中所列出的具体材料、人工或机械设备及其详细信息 - """ - - def __init__(self): - self.id = None # xsd:string - self.编码 = None # xsd:string - self.名称 = None # xsd:string - self.单位 = None # xsd:string - self.类型 = None # xsd:string - self.供货方 = None # xsd:string - self.预算价不含税 = None # xsd:string - self.市场价不含税 = None # xsd:string - self.预算价含税 = None # xsd:string - self.市场价含税 = None # xsd:string - self.结算预算价不含税 = None # xsd:string - self.结算市场价不含税 = None # xsd:string - self.结算预算价含税 = None # xsd:string - self.结算市场价含税 = None # xsd:string - self.暂估价 = None # xsd:string - self.拆分 = None # xsd:string - self.全口径市场价不含税 = None # xsd:string - self.全口径市场价含税 = None # xsd:string - self.商品砼 = None # xsd:string - self.数量 = None # xsd:string - self.是否未计价 = None # xsd:string - - -class CostSet: - """ - 费用集 - 描述: 代表费用预览层级结构中的一个节点 - """ - - def __init__(self): - self.GUID = None # xsd:string - self.cost_items = {} # 存储费用项的字典,键为项目名称 - - def get_cost_item(self, item_name): - """ - 根据名称获取费用项 - - Args: - item_name (str): 要查找的费用项名称 - - Returns: - CostItem: 对应的费用项对象 - - Raises: - KeyError: 当费用项名称不存在时 - """ - if item_name not in self.cost_items: - raise KeyError(f'费用项名称"{item_name}"不存在') - return self.cost_items[item_name] - - -class CostItem: - """ - 费用项 - 描述: 代表预览层级结构中的叶子节点,显示具体的费用项及其金额 - """ - - def __init__(self): - self.id = None # xsd:string - self.cost = None # xsd:string - self.sub_items = {} # 存储子费用项的字典,键为项目名称 - - def get_sub_item(self, item_name): - """ - 根据名称获取子费用项 - - Args: - item_name (str): 要查找的子费用项名称 - - Returns: - CostItem: 对应的子费用项对象 - - Raises: - KeyError: 当子费用项名称不存在时 - """ - if item_name not in self.sub_items: - raise KeyError(f'子费用项名称"{item_name}"不存在') - return self.sub_items[item_name] - - -class FeeTableTemplateSet: - """ - 取费表模板集 - 描述: - """ - - def __init__(self): - self.name = None # xsd:string - self.feetable_template = {} # 存储费用项的字典,键为项目名称 - - def get_feetable_template_item(self, item_name): - """ - 根据名称获取取费表模板项 - - Args: - item_name (str): 要查找的取费表模板项名称 - - Returns: - FeeTableTemplateItem: 对应的取费表模板项对象 - - Raises: - KeyError: 当取费表模板项名称不存在时 - """ - if item_name not in self.feetable_template: - raise KeyError(f'取费表模板项名称"{item_name}"不存在') - return self.feetable_template[item_name] - - -class FeeTableTemplateItem: - """ - 取费表模板项 - 描述: - """ - - def __init__(self): - self.name = None # xsd:string - self.OutlayID = None # xsd:string - self.type = None # xsd:string - self.profession = None # xsd:string - self.sub_feecollections = {} # 存储子费用项的字典,键为项目名称 - - def get_sub_fee(self, item_name): - """ - 根据名称获取子取费 - - Args: - item_name (str): 要查找的子取费名称 - - Returns: - feecollections: 对应的子费用项对象 - - Raises: - KeyError: 当子费用项名称不存在时 - """ - if item_name not in self.sub_feecollections: - raise KeyError(f'取费名称"{item_name}"不存在') - return self.sub_feecollections[item_name] - - -class FeeCollection: - """ - 取费 - 描述: - """ - - def __init__(self): - self.name = None # xsd:string - self.serialNumber = None # xsd:string - self.code = None # xsd:string - self.base = None # xsd:string - self.rate = None # xsd:string - self.sub_feecollections = {} # 存储子费用项的字典,键为项目名称 - - def get_sub_feecollections(self, item_name): - """ - 根据名称获取子取费 - - Args: - item_name (str): 要查找的子费用名称 - - Returns: - feecollections: 对应的费用对象 - - Raises: - KeyError: 当子费用名称不存在时 - """ - if item_name not in self.sub_feecollections: - raise KeyError(f'取费名称"{item_name}"不存在') - return self.sub_feecollections[item_name] - - -class FeeScheduleSet: - """ - 费用表集 - 描述: - """ - - def __init__(self): - self.name = None # xsd:string - self.feeschedule_template = {} # 存储费用项的字典,键为项目名称 - - def get_feetable_template_item(self, item_name): - """ - 根据名称获取费用表项 - - Args: - item_name (str): 要查找的费用表项名称 - - Returns: - FeeScheduleItem: 对应的费用表项对象 - - Raises: - KeyError: 当费用表项名称不存在时 - """ - if item_name not in self.feeschedule_template: - raise KeyError(f'取费表模板项名称"{item_name}"不存在') - return self.feeschedule_template[item_name] - - -class FeeScheduleItem: - """ - 费用表项 - 描述: - """ - - def __init__(self): - self.name = None # xsd:string - self.sub_fees = {} # 存储子费用项的字典,键为项目名称 - - def get_sub_fee(self, item_name): - """ - 根据名称获取子费用 - - Args: - item_name (str): 要查找的子费用名称 - - Returns: - fees: 对应的子费用项对象 - - Raises: - KeyError: 当子费用项名称不存在时 - """ - if item_name not in self.sub_fees: - raise KeyError(f'费用名称"{item_name}"不存在') - return self.sub_fees[item_name] - - -class Fee: - """ - 取费 - 描述: - """ - - def __init__(self): - self.name = None # xsd:string - self.serialNumber = None # xsd:string - self.code = None # xsd:string - self.rate = None # xsd:string - self.amount = None # xsd:string - self.sub_feecollections = {} # 存储子费用项的字典,键为项目名称 - - def get_sub_feecollections(self, item_name): - """ - 根据名称获取子取费 - - Args: - item_name (str): 要查找的子费用名称 - - Returns: - feecollections: 对应的费用对象 - - Raises: - KeyError: 当子费用名称不存在时 - """ - if item_name not in self.sub_feecollections: - raise KeyError(f'费用名称"{item_name}"不存在') - return self.sub_feecollections[item_name]