From bc5ea92c52f6629cb81556be289e68a6a85eb60d Mon Sep 17 00:00:00 2001 From: Misaka_Company Date: Tue, 20 Jan 2026 10:45:23 +0800 Subject: [PATCH] feat: add implementation plan for order material extraction functionality - Introduced a comprehensive document detailing the project overview, goals, core functionalities, and technical architecture for the order material extraction feature. - Defined the product model coding rules and extraction logic for selection conditions. - Designed class structures for model parsing, condition evaluation, and order material list management. - Outlined implementation steps, testing plans, and risk assessments for the development process. --- CLAUDE.md | 87 ++++ VBA/Modules/modBOMProcessor.bas | 78 +++- VBA/clsBOMManager使用说明.md | 545 ++++++++++++++++++++++++ VBA/vba_metadata.json | 12 +- 布莱迪公司压力表产品选型大表.md | 716 ++++++++++++++++++++++++++++++++ 订单物料提取实现计划.md | 635 ++++++++++++++++++++++++++++ 6 files changed, 2057 insertions(+), 16 deletions(-) create mode 100644 CLAUDE.md create mode 100644 VBA/clsBOMManager使用说明.md create mode 100644 布莱迪公司压力表产品选型大表.md create mode 100644 订单物料提取实现计划.md diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..c2c7d9a --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,87 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Project Overview + +AutoBOM is an Excel VBA-based Bill of Materials (BOM) Management System for manufacturing environments. It manages material hierarchies and procurement logic, supporting both assembled components and individual parts sourcing strategies. + +## Architecture + +### Core Classes (VBA/ClassModules/) + +- **clsBOMManager** - Central controller managing the entire BOM data structure + - Loads data from two Excel worksheets: "领料配置" (Configuration) and "平台配置清单" (Platform Configuration) + - Builds hierarchical category trees with parent-child relationships + - Provides material querying interfaces + - Key methods: `LoadData()`, `GetMaterialsForPicking()`, `GetCategory()` + +- **clsCategory** - Represents material categories with hierarchical relationships + - Contains collections of materials and sub-categories + - Tracks parent category for tree navigation + - Properties: `categoryName`, `ParentCategoryName`, `Materials`, `SubCategories`, `IsLeafCategory` + +- **clsMaterialItem** - Represents individual material items + - Properties: `code` (物料代号), `Name` (物料名称), `Quantity`, `Condition` (选择条件), `Category`, `ParentCategory` + +### Data Structure Design + +The system uses a dual-layer approach: +1. **dictAllMaterials** - Complete material database loaded from platform configuration sheet +2. **dictCategories** - Hierarchical category structure with materials filtered by configuration sheet + +Only materials appearing in the "领料配置" worksheet are marked for procurement. Materials in the platform database but not in configuration are ignored. + +### Business Logic + +**Dual-Sourcing Strategy** (via `GetMaterialsForPicking(categoryName, useParent)`): + +- **Parent Mode** (`useParent=True`): Retrieves parent category materials (assembled components) + - Default procurement method + - Example: "低压接头部件" (Low-pressure connector assembly) + +- **Child Mode** (`useParent=False`): Retrieves child category materials (individual parts) + - Used when parent materials are insufficient + - Recursively expands all sub-categories + - Example: "径向低压接头" + "弹簧管" + "螺旋管" (individual components) + +## Running the Code + +1. Open `YTHN-100.A0.532-BOM-1.2版 Claude.xlsm` in Microsoft Excel +2. Enable macros when prompted +3. Press Alt+F8 to open the Macro dialog +4. Run procedures from modBOMProcessor.bas: + - `TestBOMStructure` - Test data loading and verify structure + - `GeneratePickingList` - Generate procurement lists to new worksheet + - `GetCategoryMaterials` - Demo material retrieval logic + - `QueryMaterialInfo` - Query specific category information + +## Data Worksheet Format + +**领料配置** (Configuration): +- Column A: 物料代号 (Material Code) +- Column C: 类别 (Category) +- Column D: 上层类别 (Parent Category) +- Row 1: Header, data starts from row 2 + +**平台配置清单** (Platform Configuration): +- Column C: 代号 (Code) +- Column D: 名称 (Name) +- Column E: 数量 (Quantity) +- Column F: 选择条件 (Selection Condition) +- Rows 1-3: Headers, data starts from row 4 + +## VBA Metadata + +The VBA module structure is tracked in `VBA/vba_metadata.json`. This file is automatically maintained and should not be manually edited. + +## Code Style + +- All comments are in Chinese, explaining business logic and data structures +- Extensive inline documentation for complex logic +- Dictionary objects used for O(1) lookups by category name and material code +- Collection objects used for ordered iteration of materials and categories + +## Version Control + +The `.gitignore` excludes `.xlsm` files from version control. Only VBA source code and metadata files are tracked in Git. diff --git a/VBA/Modules/modBOMProcessor.bas b/VBA/Modules/modBOMProcessor.bas index 160ba20..7e07f6e 100644 --- a/VBA/Modules/modBOMProcessor.bas +++ b/VBA/Modules/modBOMProcessor.bas @@ -19,15 +19,15 @@ Sub TestBOMStructure() bomMgr.LoadData wsConfig, wsPlatform ' 打印类别树结构到新工作表 - Dim wsOutput As Worksheet - On Error Resume Next - Application.DisplayAlerts = False - ThisWorkbook.Worksheets("BOM结构").Delete - Application.DisplayAlerts = True - On Error GoTo 0 - - Set wsOutput = ThisWorkbook.Worksheets.Add - wsOutput.Name = "BOM结构" +' Dim wsOutput As Worksheet +' On Error Resume Next +' Application.DisplayAlerts = False +' ThisWorkbook.Worksheets("BOM结构").Delete +' Application.DisplayAlerts = True +' On Error GoTo 0 +' +' Set wsOutput = ThisWorkbook.Worksheets.Add +' wsOutput.Name = "BOM结构" 'bomMgr.PrintCategoryTree wsOutput @@ -40,7 +40,7 @@ Sub TestBOMStructure() - MsgBox "BOM数据结构加载完成!" & vbCrLf & _ + 'MsgBox "BOM数据结构加载完成!" & vbCrLf & _ "请查看 'BOM结构' 工作表", vbInformation End Sub @@ -139,6 +139,64 @@ Sub GeneratePickingList() MsgBox "领料清单生成完成!", vbInformation End Sub +' 示例: 在立即窗口打印领料清单 +Sub PrintPickingList() + Dim bomMgr As New clsBOMManager + Dim wsConfig As Worksheet, wsPlatform As Worksheet + + Set wsConfig = ThisWorkbook.Worksheets("领料配置") + Set wsPlatform = ThisWorkbook.Worksheets("平台配置清单") + + bomMgr.LoadData wsConfig, wsPlatform + + ' 打印表头 + Debug.Print String(80, "=") + Debug.Print "领料清单" + Debug.Print String(80, "=") + + ' 遍历所有根类别 + Dim rootCats As Collection + Set rootCats = bomMgr.GetRootCategories + + Dim cat As clsCategory + Dim Materials As Collection + Dim mat As clsMaterialItem + Dim i As Long, j As Long + Dim totalCount As Long + + totalCount = 0 + + For i = 1 To rootCats.Count + Set cat = rootCats(i) + + ' 打印类别分隔符 + Debug.Print "" + Debug.Print "【类别: " & cat.categoryName & "】" + Debug.Print String(40, "-") + + ' 默认使用父类别物料 + Set Materials = bomMgr.GetMaterialsForPicking(cat.categoryName, True) + + For j = 1 To Materials.Count + Set mat = Materials(j) + Debug.Print " " & mat.code & _ + String(20 - Len(mat.code), " ") & _ + mat.Name & _ + " | 数量:" & mat.Quantity & _ + " | 条件:" & IIf(mat.Condition = "", "(无)", mat.Condition) + totalCount = totalCount + 1 + Next j + + Debug.Print " 小计: " & Materials.Count & " 项" + Next i + + ' 打印汇总 + Debug.Print "" + Debug.Print String(80, "=") + Debug.Print "总计: " & totalCount & " 项物料" + Debug.Print String(80, "=") +End Sub + ' 示例: 查询特定物料信息 Sub QueryMaterialInfo() Dim bomMgr As New clsBOMManager diff --git a/VBA/clsBOMManager使用说明.md b/VBA/clsBOMManager使用说明.md new file mode 100644 index 0000000..6d7038f --- /dev/null +++ b/VBA/clsBOMManager使用说明.md @@ -0,0 +1,545 @@ +# clsBOMManager 类使用说明 + +## 概述 + +`clsBOMManager` 是 AutoBOM 系统的核心控制器类,负责管理整个 BOM(物料清单)数据结构。它从 Excel 工作表加载数据,构建层级化的类别树,并提供物料查询和领料逻辑处理功能。 + +--- + +## 类初始化 + +```vba +Dim bomMgr As New clsBOMManager +``` + +创建实例时,会自动初始化以下内部数据结构: +- `dictCategories` - 类别字典(类别名称 → clsCategory 对象) +- `dictAllMaterials` - 物料字典(物料代号 → clsMaterialItem 对象) +- `rootCategories` - 根类别集合(顶层类别) + +--- + +## 公开方法 + +### 1. LoadData 方法 + +**功能**:从 Excel 工作表加载 BOM 数据并构建数据结构 + +**语法**: +```vba +Public Sub LoadData(wsConfig As Worksheet, wsPlatform As Worksheet) +``` + +**参数**: +| 参数 | 类型 | 说明 | +|------|------|------| +| wsConfig | Worksheet | 领料配置工作表,定义类别层级和需要领料的物料 | +| wsPlatform | Worksheet | 平台配置清单工作表,包含完整的物料信息 | + +**数据要求**: + +**领料配置** 工作表格式: +- **第 1 行**:标题行 +- **第 2 行起**:数据行 + - A 列:物料代号 + - C 列:类别名称 + - D 列:上层类别名称 + +**平台配置清单** 工作表格式: +- **第 1-3 行**:标题行 +- **第 4 行起**:数据行 + - C 列:物料代号 + - D 列:物料名称 + - E 列:物料数量 + - F 列:选择条件 + +**处理逻辑**: +1. 从"平台配置清单"加载所有物料的基础信息到 `dictAllMaterials` +2. 从"领料配置"加载类别信息,筛选需要领料的物料 +3. 建立类别的父子关系,构建层级树 + +**重要说明**: +- 只有出现在"领料配置"中的物料才会被添加到类别中 +- 未在"领料配置"中的物料表示不需要领料,但仍存在于物料字典中 + +**使用示例**: +```vba +Dim bomMgr As New clsBOMManager +Dim wsConfig As Worksheet +Dim wsPlatform As Worksheet + +Set wsConfig = ThisWorkbook.Worksheets("领料配置") +Set wsPlatform = ThisWorkbook.Worksheets("平台配置清单") + +bomMgr.LoadData wsConfig, wsPlatform +``` + +--- + +### 2. GetRootCategories 方法 + +**功能**:获取所有顶层类别的集合 + +**语法**: +```vba +Public Function GetRootCategories() As Collection +``` + +**返回值**: +- `Collection` 对象,包含所有无父类别的 `clsCategory` 对象 + +**用途**: +- 遍历整个 BOM 结构时的入口点 +- 生成领料清单时遍历所有根类别 + +**使用示例**: +```vba +Dim rootCats As Collection +Dim cat As clsCategory +Dim i As Long + +Set rootCats = bomMgr.GetRootCategories() + +For i = 1 To rootCats.Count + Set cat = rootCats(i) + Debug.Print "根类别: " & cat.categoryName + Debug.Print " 物料数: " & cat.Materials.Count + Debug.Print " 子类别数: " & cat.SubCategories.Count +Next i +``` + +--- + +### 3. GetCategory 方法 + +**功能**:根据类别名称获取类别对象 + +**语法**: +```vba +Public Function GetCategory(categoryName As String) As clsCategory +``` + +**参数**: +| 参数 | 类型 | 说明 | +|------|------|------| +| categoryName | String | 要查询的类别名称 | + +**返回值**: +- 找到时:返回 `clsCategory` 对象 +- 未找到时:返回 `Nothing` + +**用途**:快速查找特定类别及其下的物料 + +**使用示例**: +```vba +Dim cat As clsCategory +Set cat = bomMgr.GetCategory("部件") + +If Not cat Is Nothing Then + Debug.Print "类别: " & cat.categoryName + Debug.Print "父类别: " & cat.ParentCategoryName + Debug.Print "物料数: " & cat.Materials.Count + Debug.Print "是否叶子类别: " & cat.IsLeafCategory +End If +``` + +--- + +### 4. GetMaterialsForPicking 方法 + +**功能**:获取某类别下需要领料的物料清单(支持层级逻辑) + +**语法**: +```vba +Public Function GetMaterialsForPicking(categoryName As String, _ + Optional useParent As Boolean = True) As Collection +``` + +**参数**: +| 参数 | 类型 | 默认值 | 说明 | +|------|------|--------|------| +| categoryName | String | - | 类别名称 | +| useParent | Boolean | True | 领料方式:True=父类别物料,False=子类别物料 | + +**返回值**: +- `Collection` 对象,包含 `clsMaterialItem` 对象 + +**业务逻辑说明**: + +#### 父类别模式 (useParent=True) +- 这是**默认的领料方式** +- 直接返回当前类别下的所有物料 +- 即使该类别有子类别,也仍然返回父类别物料 +- 用于领取组装好的部件 + +**示例**: +```vba +' 获取"部件"类别的父类别物料 +Set materials = bomMgr.GetMaterialsForPicking("部件", True) +' 返回:低压接头部件、高压接头部件等组装好的部件 +``` + +#### 子类别模式 (useParent=False) +- 这是**库存不足时的替代方案** +- 如果当前类别有子类别,递归获取所有子类别的物料 +- 如果当前类别是叶子类别(无子类别),返回本类别物料 +- 用于父类别库存不足,需要领取零件自行组装的情况 + +**示例**: +```vba +' 获取"部件"类别的子类别展开物料 +Set materials = bomMgr.GetMaterialsForPicking("部件", False) +' 返回:径向低压接头、弹簧管、螺旋管等零件 +``` + +**层级结构示例**: + +``` +部件 (父类别) +├── 低压接头部件 (物料) +├── 高压接头部件 (物料) +└── 接头 (子类别) + ├── 径向低压接头 (物料) + ├── 轴向高压接头 (物料) + └── 弹性元件 (孙类别) + └── 弹簧管 (物料) +``` + +**使用示例**: +```vba +Dim materials As Collection +Dim mat As clsMaterialItem +Dim i As Long + +' 默认使用父类别物料 +Set materials = bomMgr.GetMaterialsForPicking("部件", True) +Debug.Print "父类别物料数: " & materials.Count + +For i = 1 To materials.Count + Set mat = materials(i) + Debug.Print mat.code & " - " & mat.Name & _ + " | 数量:" & mat.Quantity & _ + " | 条件:" & mat.Condition +Next i + +' 库存不足时,使用子类别物料 +Set materials = bomMgr.GetMaterialsForPicking("部件", False) +Debug.Print "子类别展开物料数: " & materials.Count +``` + +--- + +### 5. PrintCategoryTree 方法 + +**功能**:将类别树结构打印到工作表(用于调试和查看) + +**语法**: +```vba +Public Sub PrintCategoryTree(ws As Worksheet) +``` + +**参数**: +| 参数 | 类型 | 说明 | +|------|------|------| +| ws | Worksheet | 输出的目标工作表对象 | + +**输出格式**: +- 第 1 列:类别名称(带缩进显示层级) +- 第 2 列:物料数量信息 +- 第 3 列:选择条件 + +**缩进规则**:每层级 2 个空格 + +**输出示例**: +``` +表壳 (物料数:1) + - 01091004312 表壳(本色) 数量:1 条件: +部件 (物料数:20) + - 01011019001 低压接头部件 数量:1 条件:lcfw=M02... + 接头 (物料数:18) + - 01081013833 径向低压接头 数量:1 条件:gclj=Z12... +``` + +**使用示例**: +```vba +Dim wsOutput As Worksheet + +' 创建新工作表 +On Error Resume Next +Application.DisplayAlerts = False +ThisWorkbook.Worksheets("BOM结构").Delete +Application.DisplayAlerts = True +On Error GoTo 0 + +Set wsOutput = ThisWorkbook.Worksheets.Add +wsOutput.Name = "BOM结构" + +' 打印类别树 +bomMgr.PrintCategoryTree wsOutput +``` + +--- + +## 典型使用场景 + +### 场景 1:生成领料清单 + +```vba +Sub GeneratePickingList() + Dim bomMgr As New clsBOMManager + Dim wsConfig As Worksheet, wsPlatform As Worksheet + Dim wsPickList As Worksheet + Dim rootCats As Collection + Dim cat As clsCategory + Dim materials As Collection + Dim mat As clsMaterialItem + Dim row As Long + Dim i As Long, j As Long + + ' 1. 加载数据 + Set wsConfig = ThisWorkbook.Worksheets("领料配置") + Set wsPlatform = ThisWorkbook.Worksheets("平台配置清单") + bomMgr.LoadData wsConfig, wsPlatform + + ' 2. 创建输出工作表 + Application.DisplayAlerts = False + On Error Resume Next + ThisWorkbook.Worksheets("领料清单").Delete + On Error GoTo 0 + Application.DisplayAlerts = True + + Set wsPickList = ThisWorkbook.Worksheets.Add + wsPickList.Name = "领料清单" + + ' 3. 写入表头 + row = 1 + wsPickList.Cells(row, 1).Value = "代号" + wsPickList.Cells(row, 2).Value = "名称" + wsPickList.Cells(row, 3).Value = "类别" + wsPickList.Cells(row, 4).Value = "数量" + wsPickList.Cells(row, 5).Value = "选择条件" + wsPickList.Cells(row, 6).Value = "领料方式" + row = row + 1 + + ' 4. 遍历所有根类别并生成清单 + Set rootCats = bomMgr.GetRootCategories + + For i = 1 To rootCats.Count + Set cat = rootCats(i) + ' 默认使用父类别物料 + Set materials = bomMgr.GetMaterialsForPicking(cat.categoryName, True) + + For j = 1 To materials.Count + Set mat = materials(j) + wsPickList.Cells(row, 1).Value = mat.code + wsPickList.Cells(row, 2).Value = mat.Name + wsPickList.Cells(row, 3).Value = mat.Category + wsPickList.Cells(row, 4).Value = mat.Quantity + wsPickList.Cells(row, 5).Value = mat.Condition + wsPickList.Cells(row, 6).Value = "父类别" + row = row + 1 + Next j + Next i + + ' 5. 格式化表格 + wsPickList.Range("A1:F1").Font.Bold = True + wsPickList.Columns("A:F").AutoFit + + MsgBox "领料清单生成完成!", vbInformation +End Sub +``` + +### 场景 2:查询特定类别信息 + +```vba +Sub QueryCategoryInfo() + Dim bomMgr As New clsBOMManager + Dim wsConfig As Worksheet, wsPlatform As Worksheet + Dim cat As clsCategory + Dim mat As clsMaterialItem + Dim subCat As clsCategory + Dim i As Long + + ' 加载数据 + Set wsConfig = ThisWorkbook.Worksheets("领料配置") + Set wsPlatform = ThisWorkbook.Worksheets("平台配置清单") + bomMgr.LoadData wsConfig, wsPlatform + + ' 查询特定类别 + Set cat = bomMgr.GetCategory("部件") + + If Not cat Is Nothing Then + Debug.Print "========== 类别信息 ==========" + Debug.Print "类别名称: " & cat.categoryName + Debug.Print "父类别: " & cat.ParentCategoryName + Debug.Print "物料数量: " & cat.Materials.Count + Debug.Print "子类别数量: " & cat.SubCategories.Count + Debug.Print "是否叶子类别: " & cat.IsLeafCategory + Debug.Print "" + + ' 列出所有物料 + Debug.Print "---------- 物料列表 ----------" + For i = 1 To cat.Materials.Count + Set mat = cat.Materials(i) + Debug.Print " " & mat.code & ": " & mat.Name & _ + " (数量:" & mat.Quantity & _ + ", 条件:" & mat.Condition & ")" + Next i + Debug.Print "" + + ' 列出所有子类别 + Debug.Print "---------- 子类别列表 ----------" + For i = 1 To cat.SubCategories.Count + Set subCat = cat.SubCategories(i) + Debug.Print " " & subCat.categoryName & _ + " (物料数:" & subCat.Materials.Count & ")" + Next i + Else + Debug.Print "类别不存在" + End If +End Sub +``` + +### 场景 3:根据库存情况选择领料方式 + +```vba +Sub SmartPicking() + Dim bomMgr As New clsBOMManager + Dim materials As Collection + Dim mat As clsMaterialItem + Dim categoryName As String + Dim i As Long + + ' 加载数据 + bomMgr.LoadData _ + ThisWorkbook.Worksheets("领料配置"), _ + ThisWorkbook.Worksheets("平台配置清单") + + categoryName = "部件" + + ' 尝试获取父类别物料 + Set materials = bomMgr.GetMaterialsForPicking(categoryName, True) + + ' 检查库存是否充足(这里需要连接实际的库存系统) + Dim isStockSufficient As Boolean + isStockSufficient = CheckStock(materials) ' 假设的库存检查函数 + + If isStockSufficient Then + Debug.Print "使用父类别领料方式" + Else + Debug.Print "父类别库存不足,改用子类别领料方式" + Set materials = bomMgr.GetMaterialsForPicking(categoryName, False) + End If + + ' 输出物料清单 + For i = 1 To materials.Count + Set mat = materials(i) + Debug.Print mat.code & " " & mat.Name + Next i +End Sub +``` + +--- + +## 辅助类说明 + +### clsCategory 类 + +表示物料类别及其层级关系。 + +**公共属性**: +| 属性 | 类型 | 说明 | +|------|------|------| +| categoryName | String | 类别名称 | +| ParentCategoryName | String | 父类别名称 | +| Materials | Collection | 该类别下的物料集合 | +| SubCategories | Collection | 子类别集合 | +| IsLeafCategory | Boolean | 是否为叶子类别(无子类别) | + +**公共方法**: +- `AddMaterial(mat As clsMaterialItem)` - 添加物料 +- `AddSubCategory(cat As clsCategory)` - 添加子类别 +- `GetMaterial(code As String) As clsMaterialItem` - 获取指定代号的物料 +- `HasSubCategories() As Boolean` - 检查是否有子类别 + +### clsMaterialItem 类 + +表示单个物料项。 + +**公共属性**: +| 属性 | 类型 | 说明 | +|------|------|------| +| code | String | 物料代号 | +| Name | String | 物料名称 | +| Quantity | Double | 物料数量 | +| Condition | String | 选择条件 | +| Category | String | 所属类别 | +| ParentCategory | String | 上层类别 | + +--- + +## 注意事项 + +1. **数据加载顺序**:必须先调用 `LoadData()` 方法,才能使用其他查询方法 + +2. **工作表名称**:确保工作表名称与代码中的名称一致: + - "领料配置" + - "平台配置清单" + +3. **空值处理**:使用 `GetCategory()` 方法时,务必检查返回值是否为 `Nothing` + +4. **领料方式选择**: + - 正常情况使用 `useParent=True`(领取组装好的部件) + - 仅在库存不足时使用 `useParent=False`(领取零件自行组装) + +5. **数据一致性**:修改 Excel 数据后,需要重新调用 `LoadData()` 重新加载数据 + +6. **内存管理**:使用完毕后,VBA 会自动清理对象,无需手动释放 + +--- + +## 常见问题 + +### Q1: 如何判断某个类别是否存在? +```vba +Dim cat As clsCategory +Set cat = bomMgr.GetCategory("类别名") + +If Not cat Is Nothing Then + ' 类别存在 +Else + ' 类别不存在 +End If +``` + +### Q2: 如何获取所有类别的名称? +```vba +Sub ListAllCategories() + ' 需要递归遍历所有类别 + ' 可以使用 PrintCategoryTree 方法输出到工作表查看 +End Sub +``` + +### Q3: 父类别和子类别物料有什么区别? +- **父类别物料**:组装好的成品部件,如"低压接头部件" +- **子类别物料**:组成部件的零件,如"径向低压接头"、"弹簧管"等 + +### Q4: 如何处理物料选择条件? +```vba +Dim mat As clsMaterialItem +' ... +If mat.Condition <> "" Then + ' 根据条件选择合适的物料 + ' 条件格式如:lcfw=M02;gclj=Z12 + ' 需要根据产品配置解析这些条件 +End If +``` + +--- + +## 版本信息 + +- **类名称**:clsBOMManager +- **版本**:1.0 +- **最后更新**:2025 +- **依赖类**:clsCategory, clsMaterialItem diff --git a/VBA/vba_metadata.json b/VBA/vba_metadata.json index 0ceabf7..69ab47e 100644 --- a/VBA/vba_metadata.json +++ b/VBA/vba_metadata.json @@ -31,6 +31,12 @@ "attributes": {}, "file": "DocumentModules\\Sheet4.cls" }, + "Sheet6.cls": { + "name": "Sheet6", + "type": "DocumentModules", + "attributes": {}, + "file": "DocumentModules\\Sheet6.cls" + }, "clsCategory.cls": { "name": "clsCategory", "type": "ClassModules", @@ -54,12 +60,6 @@ "type": "ClassModules", "attributes": {}, "file": "ClassModules\\clsBOMManager.cls" - }, - "Sheet6.cls": { - "name": "Sheet6", - "type": "DocumentModules", - "attributes": {}, - "file": "DocumentModules\\Sheet6.cls" } } } \ No newline at end of file diff --git a/布莱迪公司压力表产品选型大表.md b/布莱迪公司压力表产品选型大表.md new file mode 100644 index 0000000..68e9c5f --- /dev/null +++ b/布莱迪公司压力表产品选型大表.md @@ -0,0 +1,716 @@ +# 布莱迪公司压力表产品选型大表 + +**版本**: 20250806 版 +**说明**: 公司内部资料不得外传 + +--- + +## 目录 + +1. [型号](#型号) +2. [公称外径](#公称外径) +3. [安装形式](#安装形式) +4. [壳体形式](#壳体形式) +5. [过程连接&接液材质](#过程连接&接液材质) +6. [量程范围](#量程范围) +7. [仪表特性](#仪表特性) +8. [表盘](#表盘) +9. [附件](#附件) +10. [法兰隔膜](#法兰隔膜) + +--- + +## 型号 + +### 基础压力表系列 + +| 型号 | 说明 | +|------|------| +| Y | 压力表 | +| YY | (乙炔)压力表 | +| YA | (氨)压力表 | +| YR | (耐热)压力表 | +| YTF | (防溅)压力表 | +| YTN | (防溅)耐震压力表 | +| YTH | (不锈钢)压力表 | +| YTHN | (不锈钢)耐震压力表 | + +### 精密压力表系列 + +| 型号 | 说明 | +| ---- | ------------ | +| YB | 精密压力表 | +| YBH | (不锈钢)精密压力表 | +| YBHN | (不锈钢)耐震精密压力表 | + +### 膜盒压力表系列 + +| 型号 | 说明 | +|------|------| +| YE | 膜盒压力表 | +| YEF | (不锈钢)膜盒压力表 | +| YEFN | (不锈钢耐震)膜盒压力表 | +| YEY | (医用)膜盒压力表 | + +### 安全型压力表系列 + +| 型号 | 说明 | +|------|------| +| YQHB | (不锈钢安全)型压力表 | +| YQHBN | (不锈钢安全型)耐震压力表 | +| YQ | (铸铝外壳安全型)压力表 | +| YQF | (不锈钢铸铝外壳安全型)压力表 | + +### 酚醛系列 + +| 型号 | 说明 | +|------|------| +| YSH | (不锈钢酚醛)压力表 | +| YSHN | (不锈钢酚醛)耐震压力表 | +| YQS | (酚醛安全型)压力表 | +| YQSN | (酚醛安全型)耐震压力表 | +| YQSH | (不锈钢酚醛安全型)压力表 | +| YQSHN | (不锈钢酚醛安全型)耐震压力表 | + +### 差压表系列 + +| 型号 | 说明 | +|------|------| +| YCA | (不锈钢双膜片)差压表 | +| YCAN | (不锈钢双膜片)耐震差压表 | +| YCS | (双针双管)差压表 | +| YCSH | (不锈钢双针双管)差压表 | +| YCSHN | (不锈钢双针双管)耐震差压表 | +| YCC | (磁)差压表 | +| YCB | (泳池)差压表 | +| YCBF | (不锈钢单膜片)差压表 | +| YCBFN | (不锈钢单膜片)耐震差压表 | +| YCWF | (不锈钢波纹管)差压表 | +| YCWFN | (不锈钢波纹管)耐震差压表 | + +### 电接点压力表系列 + +| 型号 | 说明 | +|------|------| +| YX | 电接点压力表 | +| YXFB | (防爆)电接点压力表 | +| YXA | (氨用)电接点压力表 | +| YXH | (不锈钢)电接点压力表(注:坚固型) | +| YXHN | (不锈钢)耐震电接点压力表(注:坚固型) | +| YXGC | (感应式)电接点差压表 | +| YXK | 位式控制压力表 | +| YXGH | (不锈钢防爆感应式)电接点压力表 | +| YXGHN | (不锈钢防爆感应式)耐震电接点压力表 | +| YCAXF | (不锈钢双膜片)电接点差压表 | +| YCBXF | (不锈钢单膜片)电接点差压表 | + +### 其他特殊系列 + +| 型号 | 说明 | +|------|------| +| YSZ | (两线)压力变送器 | +| YTZ | (电阻)远传压力表 | +| YTJA | (A级洁净型)压力表 | +| YTJB | (BA级洁净型)压力表 | +| YTJE | (EP级洁净型)压力表 | +| BF | (不锈钢)膜片压力表 | +| BFN | (不锈钢耐震)膜片压力表 | +| JBH | (不锈纲膜片)绝压表 | +| YTU | (不锈钢耐硫)压力表 | +| YTC | (不锈钢船用)压力表 | + +### 特殊型号前缀 + +- **B前缀**: 膜片压力表 - 在基本型号前加"B",例如: BYX = 膜片电接点压力表 +- **P前缀**: 隔膜压力表 - 在基本型号前加"P",例如: PYTHN = (不锈钢)耐震隔膜压力表 + +--- + +## 公称外径 + +| 代码 | 外径尺寸 | +|------|----------| +| 036 | 36mm | +| 040 | 40mm | +| 043 | 43mm | +| 046 | 46mm | +| 050 | 50mm | +| 053 | 53mm | +| 060 | 60mm | +| 063 | 63mm | +| 070 | 70mm | +| 075 | 75mm | +| 080 | 80mm | +| 090 | 90mm | +| 098 | 98mm | +| 100 | 100mm | +| 107 | 107mm | +| 120 | 120mm | +| 150 | 150mm | +| 160 | 160mm | +| 200 | 200mm | +| 250 | 250mm | +| 330 | 330mm | + +**代码格式**: 3或4位数码 + +--- + +## 安装形式 + +### 径向安装 + +| 代码 | 说明 | +|------|------| +| A0 | 径向无边 | +| AT | 径向前边 | +| AH | 径向后边 | +| AM | 膜片式径向 | + +### 轴向安装 + +#### 中轴向 + +| 代码 | 说明 | +|------|------| +| Z0 | 中轴向无边 | +| ZT | 中轴向前边 | +| ZZ | 中轴向中边 | +| ZH | 中轴向后边 | +| ZK | 中轴向卡子 | + +#### 下轴向 + +| 代码 | 说明 | +|------|------| +| B0 | 下轴向无边 | +| BT | 下轴向前边 | +| BZ | 下轴向中边 | +| BH | 下轴向后边 | +| BK | 下轴向卡子 | + +### 其他安装形式 + +| 代码 | 说明 | +|------|------| +| C0 | 八字无边 | +| CT | 八字前边 | +| CH | 八字后边 | +| JG | 接杆安装 | +| GS | 挂式 | +| FG | 矩形挂式 | +| GK | 2〞安装支架安装 | +| 00 | 特定型 | + +--- + +## 壳体形式 + +### 表壳类型 + +| 代码 | 说明 | +|------|------| +| 00 | 特殊型 | +| 10 | 塑料表壳(非安全型) | +| 20 | 碳钢喷塑外壳 | +| 21 | 碳钢喷塑外壳、镀铬罩 | +| 22 | 碳钢喷塑外壳、安装式 | +| 23 | 碳钢喷塑外壳、焊接式 | +| 24 | 碳钢喷塑外壳,反装机芯,普通压力表 | +| 25 | 碳钢喷塑外壳、有机玻璃罩 | +| 30 | 坚固安全型压力表 | +| 40 | 压铸铝喷塑外壳压力表 | + +#### 304外壳系列 + +| 代码 | 说明 | +|------|------| +| 50 | 304外壳,不可充油 | +| 51 | 304外壳、2件式 | +| 52 | 304外壳、安装式、可充油 | +| 53 | 304外壳、焊接式 | +| 54 | 304外壳、焊接式、防爆孔 | +| 55 | 304外壳有机玻璃罩 | + +#### 316L外壳系列 + +| 代码 | 说明 | +|------|------| +| 60 | 316L外壳 | +| 61 | 316L外壳、2件式 | +| 62 | 316L外壳、安装式 | +| 63 | 316L外壳、焊接式 | +| 64 | 316L外壳、焊接式、防爆孔 | +| 65 | 316L外壳有机玻璃罩 | + +#### 其他材质 + +| 代码 | 说明 | +|------|------| +| 70 | 铜外壳 | + +### 罩壳类型 + +| 代码 | 说明 | +|------|------| +| 0 | 螺钉上紧式 | +| 1 | 内卡式 | +| 2 | 外卡式 | +| 3 | 滚边式 | +| 4 | 旋紧式 | +| 5 | 压紧式 | +| 6 | 卡圈式 | +| 7 | 合页边式 | +| 8 | 外卡锁式 | +| 9 | 特定型 | + +--- + +## 过程连接&接液材质 + +### 过程连接 + +| 代码 | 规格 | +|------|------| +| M08 | M 8×1 | +| M10 | M 10×1 | +| M12 | M 12×1 | +| M14 | M 14×1.5 | +| M16 | M 16×1.5 | +| M20 | M 20×1.5 | +| G18 | G 1/8″ | +| G14 | G 1/4″ | +| G38 | G 3/8″ | +| G12 | G 1/2″ | +| G34 | G 3/4″ | +| G10 | G 1″ | +| R18 | ZG 1/8″ | +| R14 | ZG 1/4″ | +| R38 | ZG 3/8″ | +| R12 | ZG 1/2″ | +| R34 | ZG 3/4″ | +| Z18 | NPT1/8″ | +| Z14 | NPT1/4″ | +| Z38 | NPT3/8″ | +| Z12 | NPT1/2″ | +| Z34 | NPT3/4″ | +| V20 | 1/4VCR(M) | +| V30 | 1/4VCR(F) | +| V40 | 1/2VCR(M) | +| V50 | 1/2VCR(F) | +| U38 | 3/8-24 UNF | +| U10 | 9/16-18 UNF | +| U78 | 7/8-14 UNF | +| K00 | 快装连接 | +| K05 | 0.5″快装 | +| K10 | 1″快装 | +| K15 | 1.5″快装 | +| K20 | 2″快装 | +| K25 | 2.5″快装 | +| KT06 | Φ6 卡套连接 | + +**注意**: 阴螺纹在螺纹符号后标记字母"F" + +### 接液材质 + +| 代码 | 材质 | +| --- | ------- | +| 1 | 316L | +| 2 | 316 | +| 3 | 304 | +| 4 | HPb59-1 | +| 5 | 蒙乃尔 | +| 6 | 碳钢 | +| 7 | HC276 | + +**注**: 其他材质代码参考选型软件 + +--- + +## 量程范围 + +### 常用计量单位 + +| 代码 | 单位 | +|------|------| +| M | MPa | +| K | kPa | +| A | Pa | +| B | bar | +| L | mbar | +| P | psi | +| G | kgf/cm² | +| g | inHg | +| e | mmHg | +| i | inH2O | +| C | cmH2O | +| 0 | mmH2O | +| t | atm | +| M0XA | MPa abs | + +### MPa量程代码 + +#### 正压量程 + +| 代码 | 量程范围 | +|------|----------| +| M01 | 0~0.06 MPa | +| M02 | 0~0.1 MPa | +| M03 | 0~0.16 MPa | +| M04 | 0~0.25 MPa | +| M05 | 0~0.4 MPa | +| M06 | 0~0.6 MPa | +| M07 | 0~1 MPa | +| M08 | 0~1.6 MPa | +| M09 | 0~2.5 MPa | +| M10 | 0~4 MPa | +| M11 | 0~6 MPa | +| M12 | 0~10 MPa | +| M13 | 0~16 MPa | +| M14 | 0~25 MPa | +| M15 | 0~40 MPa | +| M16 | 0~60 MPa | +| M17 | 0~100 MPa | +| M18 | 0~160 MPa | +| M19 | 0~250 MPa | + +#### 负压及复合量程 + +| 代码 | 量程范围 | +|------|----------| +| M30 | -0.1~0 MPa | +| M31 | -0.1~0.06 MPa | +| M32 | -0.1~0.15 MPa | +| M33 | -0.1~0.3 MPa | + +#### 绝对压力量程 + +| 代码 | 量程范围 | +|------|----------| +| M02A | 0~0.1 MPa abs | +| M03A | 0~0.16 MPa abs | +| M04A | 0~0.25 MPa abs | +| M05A | 0~0.4 MPa abs | +| M06A | 0~0.6 MPa abs | + +### kPa量程代码 + +#### 正压量程 + +| 代码 | 量程范围 | +|------|----------| +| K10 | 0~0.06 kPa | +| K11 | 0~0.1 kPa | +| K12 | 0~0.16 kPa | +| K13 | 0~0.25 kPa | +| K14 | 0~0.4 kPa | +| K15 | 0~0.6 kPa | +| K16 | 0~1 kPa | +| K17 | 0~1.6 kPa | +| K18 | 0~2.5 kPa | +| K19 | 0~4 kPa | +| K20 | 0~6 kPa | +| K21 | 0~10 kPa | +| K22 | 0~16 kPa | +| K23 | 0~25 kPa | +| K24 | 0~40 kPa | +| K25 | 0~60 kPa | +| K26 | 0~100 kPa | +| K27 | 0~160 kPa | +| K28 | 0~250 kPa | +| K29 | 0~400 kPa | +| K30 | 0~600 kPa | + +#### 负压量程 + +| 代码 | 量程范围 | +|------|----------| +| K50 | -0.06~0 kPa | +| K51 | -0.1~0 kPa | +| K52 | -0.16~0 kPa | +| K53 | -0.4~0 kPa | +| K54 | -0.6~0 kPa | +| K55 | -1~0 kPa | +| K56 | -1.6~0 kPa | + +**代码格式**: 8位以内数码 +**注**: 其它量程代码参见选型软件 + +--- + +## 仪表特性 + +### 表头充油 + +| 代码 | 充油类型及温度范围 | +|------|-------------------| +| Y1 | 硅油A,-60℃~70℃(低温专用) | +| Y2 | 硅油B,-40℃~70℃(膜盒表专用) | +| Y3 | 硅油C,-40℃~70℃(压力表常规) | +| Y4 | 甘油水,-40℃~70℃ | +| Y5 | 无油耐震(阻尼机芯) | +| Y6 | 防静电油(电接点专用) | +| Y7 | 甘油,0℃~70℃ | +| Y8 | 氟油R,-50℃~70℃ | +| Y0 | 表头其他 | + +### 附加功能 + +| 代码 | 功能说明 | +|------|----------| +| N1 | 内置指针装置 | +| N2 | 外置指针装置 | +| N3 | 调零指针 | +| N4 | 机芯限位 | +| N5 | 记忆装置 | +| N0 | 其他(备注内文字说明) | + +### 电接点类型 + +**格式**: 接点型式(1位) + 开关信号(1位) + +#### 接点型式 + +| 代码 | 说明 | +|------|------| +| C | 磁助电接点 | +| D | 普通电接点 | +| E | 镀金磁助电接点 | +| F | 镀金普通电接点 | +| G | 感应电接点 | +| H | 干簧管电接点 | + +#### 开关信号 + +| 代码 | 说明 | +|------|------| +| 1 | 单下限 | +| 2 | 单上限 | +| 3 | 双下限 | +| 4 | 常开上下限 | +| 5 | 常闭上下限 | +| 6 | 双上限 | +| 0 | 其他多接点信号(备注内文字说明) | + +**代码格式**: 2位数码 + +--- + +## 表盘 + +### 单双刻度 + +| 代码 | 说明 | +|------|------| +| 0 | 单刻度 | +| M | 双刻度,内圈MPa | +| K | 双刻度,内圈kPa | +| P | 双刻度,内圈psi | +| G | 双刻度,内圈kgf/cm² | +| X00 | 双刻度,内圈量程无要求,按标配 | + +**注**: 其他量程代码参见选型软件 + +### 表盘特性 + +| 代码 | 说明 | +|------|------| +| A | 标准盘 | +| B | 英文盘 | +| C | 中性无标 | +| D | Wonder标 | +| E | FW标 | + +**注**: 其他用户代码参见选型软件 + +### 仪表精度 + +| 代码 | 精度等级 | +|------|----------| +| 1 | 4.0级 | +| 2 | 2.5级 | +| 3 | 1.6(1.5)级 | +| 4 | 1.0级 | +| 5 | 0.4级 | +| 6 | 0.25级 | +| 0 | 无精度等级 | + +### 特殊介质和特殊要求 + +| 代码 | 介质/要求 | +|------|----------| +| TA | 氨 | +| TO | 氧气 | +| TH | 氢气 | +| TY | 乙炔 | +| TQ | 其他可燃气体 | +| TB | 禁油 | +| TI | 氮气 | + +### 表盘套色 + +**注**: 表盘套色(选型软件手动输入数值) + +表盘套色主要分三色:黄色(Y)、绿色(G)、红色(R) + +#### 套单色 + +格式: `RXXX` +示例: `R0.8~1` 代表0.8~1区域套红色 + +#### 套双色 + +格式: `GXXX.RXXX` +示例: `G0~0.7.R0.7~1` 代表0~0.7区域绿色,0.7~1区域红色 + +#### 套三色 + +格式: `YXXX.GXXX.RXXX` +示例: `Y0~0.2.G0.2~0.8.R0.8~1` 代表: +- 0~0.2区域套黄色 +- 0.2~0.8区域套绿色 +- 0.8~1区域套红色 + +### 双刻度盘刻度线颜色 + +| 代码 | 说明 | +|------|------| +| nr | 标配,内红外黑 | +| wr | 内黑外红 | + +### 刻度线红色标记 + +格式: `rxxx` +示例: `r0.35` 代表0.35刻度线为红色刻度线 + +--- + +### 附件 + +**示例格式**: +* `R3.M20F.M20.1` + +说明: +- **R3**: 散热器 +- **M20F**: 仪表接口(M20×1.5内螺纹) +- **M20**: 过程接口(M20×1.5外螺纹) +- **1**: 接液材质(316L) + +* `WHP.70X20X1.3` + +说明: +- **WHP**: 位号牌 +- **70X20X1.3**: 长度X高度X厚度 + +--- + +## 法兰隔膜 + +### 隔膜化学密封附件型号 + +| 代码 | 说明 | +|------|------| +| F0 | 螺纹隔膜 | +| F1 | 焊接式螺纹隔膜 | +| F5 | 探入式螺纹隔膜 | +| F6A | 卫生型隔膜 | +| F6B | 散热卫生型隔膜 | +| F7A | 内螺纹螺母式卫生型隔膜 | +| F7B | 外螺纹螺母式卫生型隔膜 | +| F9 | 管道型隔膜化学密封 | +| F10 | 在线式隔膜化学密封 | +| FA | 螺纹压紧式法兰隔膜 | +| FB | 膜片整体平铺式法兰隔膜 | +| FC | 缩颈式法兰隔膜 | +| FD | 膜片中心内嵌式法兰隔膜 | +| FG | 探入式法兰隔膜 | +| FK | 安装空法兰 | +| FM | 工字式法兰隔膜 | + +#### 特殊处理标记 + +- **P为喷涂式**: 例如 `FBP` = 膜片整体平铺式法兰隔膜喷涂PTFE +- **C为衬套式**: 例如 `FAC` = 螺纹压紧式法兰隔膜衬套PTFE + + +### 隔膜充油 + +| 代码 | 充油类型及温度范围 | +|------|-------------------| +| A | 硅油A,-55℃~220℃(低温专用) | +| B | 硅油B,-40℃~220℃(常规) | +| F | 硅油F,-30℃~200℃(食品级) | +| G | 硅油G,-10℃~300℃(高温) | +| J | 硅油J,-10℃~360℃(超高温) | +| N | 乙二醇,-50℃~100℃ | +| P | 甘油,0℃~95℃ | +| Q | 甘油水,-30℃~95℃ | +| R | 氟油R,-50℃~150℃ | +| 0 | 其他(其他油脂特殊说明) | + +**注**: 高温硅油价格高,报价时提前咨询。 + +--- + +## 选型代码格式说明 + +完整的产品选型代码由以下部分组成: + +``` +[型号] - [公称外径] . [安装形式] . [壳体形式] . [过程连接&接液材质] . [量程范围] . [仪表特性] | [表盘] | [附件] | [法兰隔膜] +``` + +例子: +* 表头 | 表盘 | 附件(多个) | 法兰隔膜 + +``` +PYTHN-100.A0.541.M201.M06.N2,N3.Y3|BP-088.2312.M06.0A3|WHP.70X20X1.3^GYBHQ-FW.M20F.M20.3.M06|FB-5020.RF3.049.1.M20F.B +``` + +* 表头 | 表盘 | 附件 | 法兰隔膜 + +``` +PYTHN-100.A0.541.M201.M06.N2,N3.Y3|BP-088.2312.M06.0A3|GYBHQ-FW.M20F.M20.3.M06|FB-5020.RF3.049.1.M20F.B +``` + +* 表头 | 表盘 | 附件 + +``` +PYTHN-100.A0.541.M201.M06.N2,N3.Y3|BP-088.2312.M06.0A3|GYBHQ-FW.M20F.M20.3.M06 +``` + +* 表头 | 表盘 | 法兰隔膜 + +``` +PYTHN-100.A0.541.M201.M06.N2,N3.Y3|BP-088.2312.M06.0A3|FB-5020.RF3.049.1.M20F.B +``` + +* 表头 | 表盘 + +``` +PYTHN-100.A0.541.M201.M06.N2,N3.Y3|BP-088.2312.M06.0A3 +``` + +### 代码位数说明 + +- **型号**: 字母组合 +- **公称外径**: 3或4位数码 +- **安装形式**: 2位字母/数字组合 +- **壳体形式**: 2位数码(表壳) + 1位数码(罩壳) +- **过程连接**: 3位数码 +- **量程范围**: 8位以内数码 +- **仪表特性**: 2位数码或3位数码 +- **表盘**: n位数码 +- **附件**: n位数码 + +--- + +## 版本信息 + +**文档版本**: 20250806 +**文档性质**: 公司内部资料,严禁外传 +**编制单位**: 布莱迪公司 + +--- + +*注: 本文档中未详细列出的代码和规格请参考选型软件获取完整信息。* \ No newline at end of file diff --git a/订单物料提取实现计划.md b/订单物料提取实现计划.md new file mode 100644 index 0000000..6d00efa --- /dev/null +++ b/订单物料提取实现计划.md @@ -0,0 +1,635 @@ +# 订单物料提取功能实现计划 + +## 一、项目概述 + +### 1.1 目标 +实现从产品型号中提取选择条件,并根据条件匹配 BOM 库中对应的物料,生成订单物料清单。 + +### 1.2 核心功能 +1. **型号解析**:从产品型号中提取选择条件变量 +2. **条件匹配引擎**:解析并匹配物料的选择条件表达式 +3. **物料清单生成**:整合上述功能,生成符合产品配置的物料清单 + +--- + +## 二、产品型号编码规则 + +### 2.1 型号结构 +``` +[型号] - [公称外径] . [安装形式] . [壳体形式] . [过程连接&接液材质] . [量程范围] . [仪表特性] | [表盘] | [附件] | [法兰隔膜] +``` + +### 2.2 示例分析 +**输入**: `YTHN-100.A0.532.M203.M16.Y3|BP-095.2312.M16.PA3` + +**表头部分**: `YTHN-100.A0.532.M203.M16.Y3` + +| 部位 | 代码 | 含义 | +|------|------|------| +| 型号 | YTHN | 不锈钢耐震压力表 | +| 公称外径 | 100 | 100mm | +| 安装形式 | A0 | 径向无边 | +| 壳体形式 | 532 | 532系列(304外壳、内卡式) | +| 过程连接&接液材质 | M203 | M20螺纹 + 3号材质(304) | +| 量程范围 | M16 | 0~60 MPa | +| 仪表特性 | Y3 | 硅油C充油 | + +--- + +## 三、需求分析 + +### 3.1 提取的选择条件 + +| 变量名 | 变量标签 | 提取位置 | 提取规则 | +|--------|----------|----------|----------| +| gclj | 过程连接 | 过程连接&接液材质 | 除最后一位外的字符 | +| jycz | 接液材质 | 过程连接&接液材质 | 最后一位数字 | +| lcfw | 量程范围 | 量程范围 | 完整代码 | + +### 3.2 提取示例 + +**输入**: `M203` +- 过程连接(gclj): `M20` +- 接液材质(jycz): `3` + +**输入**: `M16` +- 量程范围(lcfw): `M16` + +### 3.3 匹配逻辑 + +#### 物料选择条件类型 +1. **无条件**:条件为空,表示该物料适用于所有配置 +2. **简单条件**:单个条件判断 + - 例: `lcfw=M01` +3. **AND 条件**:多个条件同时满足 + - 例: `lcfw=M02 AND gclj=M20` +4. **OR 条件**:任一条件满足即可 + - 例: `lcfw=M01 OR lcfw=M02 OR lcfw=M03` +5. **NOT 条件**:排除特定条件 + - 例: `lcfw=M02 AND gclj!=M20` +6. **复杂条件**:AND、OR、NOT 混合 + - 例: `gclj=Z12 AND (lcfw=M01 OR lcfw=M02 OR lcfw=M03)` + +--- + +## 四、技术架构设计 + +### 4.1 模块结构 + +``` +VBA/ +├── ClassModules/ +│ ├── clsBOMManager.cls # (已有)BOM管理器 +│ ├── clsCategory.cls # (已有)类别类 +│ ├── clsMaterialItem.cls # (已有)物料项类 +│ ├── clsModelParser.cls # (新增)型号解析器 +│ ├── clsConditionEvaluator.cls # (新增)条件表达式求值器 +│ └── clsOrderMaterialList.cls # (新增)订单物料清单管理器 +└── Modules/ + └── modOrderProcessor.bas # (新增)订单处理模块 +``` + +### 4.2 类设计 + +#### 4.2.1 clsModelParser(型号解析器) + +**职责**: 解析产品型号,提取选择条件 + +**属性**: +```vba +Public ModelCode As String ' 完整型号代码 +Public HeaderPart As String ' 表头部分 +Public DialPart As String ' 表盘部分 +Public AccessoryPart As String ' 附件部分 +Public FlangePart As String ' 法兰隔膜部分 +``` + +**方法**: +```vba +' 解析型号 +Public Sub ParseModel(modelCode As String) + +' 提取表头部分 +Public Function ExtractHeader() As String + +' 提取过程连接代码 +Public Function GetProcessConnection() As String + +' 提取接液材质代码 +Public Function GetWettedMaterial() As String + +' 提取量程范围代码 +Public Function GetRangeCode() As String + +' 获取所有选择条件 +Public Function GetSelectionConditions() As Object +``` + +**示例数据结构**: +```vba +' 返回字典对象 +' Key: 变量名 (如 "gclj", "jycz", "lcfw") +' Value: 变量值 (如 "M20", "3", "M16") +``` + +--- + +#### 4.2.2 clsConditionEvaluator(条件表达式求值器) + +**职责**: 解析和求值物料选择条件表达式 + +**方法**: +```vba +' 求值条件表达式 +' 参数: +' conditionExpr - 条件表达式 (如 "lcfw=M02 AND gclj=M20") +' conditionsDict - 从型号提取的条件字典 +' 返回: Boolean - 是否匹配 +Public Function Evaluate(conditionExpr As String, _ + conditionsDict As Object) As Boolean + +' 解析条件表达式为抽象语法树(AST) +Private Function ParseExpression(expr As String) As Object + +' 求值单个条件 +' 例: "lcfw=M02" -> True/False +Private Function EvaluateSingleCondition(condition As String, _ + conditionsDict As Object) As Boolean + +' 求值 AND 表达式 +Private Function EvaluateAndExpression(conditions As Collection, _ + conditionsDict As Object) As Boolean + +' 求值 OR 表达式 +Private Function EvaluateOrExpression(conditions As Collection, _ + conditionsDict As Object) As Boolean + +' 求值 NOT 表达式 +Private Function EvaluateNotExpression(condition As String, _ + conditionsDict As Object) As Boolean +``` + +**支持的运算符**: +- `=` : 等于 +- `!=` 或 `<>` : 不等于 +- `AND` : 逻辑与 +- `OR` : 逻辑或 +- `()` : 分组优先级 + +--- + +#### 4.2.3 clsOrderMaterialList(订单物料清单管理器) + +**职责**: 管理单个订单的物料清单 + +**属性**: +```vba +Public OrderModel As String ' 订单型号 +Public OrderConditions As Object ' 订单选择条件字典 +Public SelectedMaterials As Collection ' 匹配的物料集合 +``` + +**方法**: +```vba +' 根据订单型号生成物料清单 +Public Sub GenerateMaterialList(modelCode As String, _ + bomMgr As clsBOMManager) + +' 筛选符合条件的物料 +' 参数: +' categoryName - 类别名称 +' bomMgr - BOM管理器 +Private Function FilterMaterialsByCategory(categoryName As String, _ + bomMgr As clsBOMManager) As Collection + +' 获取物料汇总信息 +Public Function GetMaterialSummary() As String + +' 导出物料清单到工作表 +Public Sub ExportToWorksheet(ws As Worksheet) + +' 打印物料清单到立即窗口 +Public Sub PrintToImmediateWindow() +``` + +--- + +#### 4.2.4 clsBOMManager 扩展 + +**新增方法**: +```vba +' 根据选择条件获取物料清单 +' 参数: +' categoryName - 类别名称 +' conditionsDict - 选择条件字典 +' 返回: 匹配的物料集合 +Public Function GetMaterialsByConditions(categoryName As String, _ + conditionsDict As Object) As Collection + +' 获取整个订单的物料清单 +' 参数: +' conditionsDict - 从型号提取的选择条件字典 +' useParent - 是否使用父类别领料方式 +' 返回: 所有类别的匹配物料汇总 +Public Function GetOrderMaterials(conditionsDict As Object, _ + Optional useParent As Boolean = True) As Collection +``` + +--- + +## 五、实现步骤 + +### 阶段一:型号解析器(clsModelParser) +**优先级**: 高 + +**任务清单**: +1. 创建 `clsModelParser.cls` 类模块 +2. 实现型号分段解析(表头、表盘、附件、法兰隔膜) +3. 实现表头部分的详细解析 +4. 实现选择条件提取方法 +5. 编写单元测试用例 + +**测试用例**: +```vba +Sub TestModelParser() + Dim parser As New clsModelParser + Dim conditions As Object + + ' 测试1: 标准型号 + parser.ParseModel "YTHN-100.A0.532.M203.M16.Y3|BP-095.2312.M16.PA3" + Set conditions = parser.GetSelectionConditions() + + Debug.Assert conditions("gclj") = "M20" + Debug.Assert conditions("jycz") = "3" + Debug.Assert conditions("lcfw") = "M16" + + ' 测试2: 不同过程连接 + parser.ParseModel "YTHN-100.A0.532.Z121.M06.Y3" + Set conditions = parser.GetSelectionConditions() + + Debug.Assert conditions("gclj") = "Z12" + Debug.Assert conditions("jycz") = "1" + Debug.Assert conditions("lcfw") = "M06" +End Sub +``` + +--- + +### 阶段二:条件表达式求值器(clsConditionEvaluator) +**优先级**: 高 + +**任务清单**: +1. 创建 `clsConditionEvaluator.cls` 类模块 +2. 实现条件表达式词法分析(分词) +3. 实现条件表达式语法分析(构建 AST) +4. 实现各种运算符的求值逻辑 +5. 处理括号优先级 +6. 编写单元测试用例 + +**测试用例**: +```vba +Sub TestConditionEvaluator() + Dim evaluator As New clsConditionEvaluator + Dim conditions As Object + Set conditions = CreateObject("Scripting.Dictionary") + + conditions("gclj") = "M20" + conditions("jycz") = "3" + conditions("lcfw") = "M16" + + ' 测试1: 简单条件 + Debug.Assert evaluator.Evaluate("lcfw=M16", conditions) = True + Debug.Assert evaluator.Evaluate("lcfw=M02", conditions) = False + + ' 测试2: AND 条件 + Debug.Assert evaluator.Evaluate("lcfw=M16 AND gclj=M20", conditions) = True + Debug.Assert evaluator.Evaluate("lcfw=M02 AND gclj=M20", conditions) = False + + ' 测试3: OR 条件 + Debug.Assert evaluator.Evaluate("lcfw=M16 OR lcfw=M02", conditions) = True + Debug.Assert evaluator.Evaluate("lcfw=M01 OR lcfw=M02", conditions) = False + + ' 测试4: NOT 条件 + Debug.Assert evaluator.Evaluate("lcfw=M16 AND gclj!=M20", conditions) = False + Debug.Assert evaluator.Evaluate("lcfw=M16 AND gclj!=Z12", conditions) = True + + ' 测试5: 复杂条件 + Debug.Assert evaluator.Evaluate("gclj=Z12 AND (lcfw=M01 OR lcfw=M02 OR lcfw=M16)", conditions) = False + + ' 测试6: 空条件 + Debug.Assert evaluator.Evaluate("", conditions) = True +End Sub +``` + +--- + +### 阶段三:BOM管理器扩展 +**优先级**: 中 + +**任务清单**: +1. 在 `clsBOMManager.cls` 中添加 `GetMaterialsByConditions()` 方法 +2. 在 `clsBOMManager.cls` 中添加 `GetOrderMaterials()` 方法 +3. 集成条件求值器 +4. 编写单元测试用例 + +**测试用例**: +```vba +Sub TestBOMManagerConditions() + Dim bomMgr As New clsBOMManager + Dim conditions As Object + Dim materials As Collection + + ' 加载数据 + bomMgr.LoadData _ + ThisWorkbook.Worksheets("领料配置"), _ + ThisWorkbook.Worksheets("平台配置清单") + + ' 准备条件 + Set conditions = CreateObject("Scripting.Dictionary") + conditions("gclj") = "M20" + conditions("lcfw") = "M16" + + ' 测试: 获取部件类别的匹配物料 + Set materials = bomMgr.GetMaterialsByConditions("部件", conditions) + + ' 验证结果 + Debug.Print "匹配物料数量: " & materials.Count + ' 应该只有 01011019018 (高压接头部件) 匹配 + + Dim mat As clsMaterialItem + For Each mat In materials + Debug.Print mat.code & " - " & mat.Name + Next mat +End Sub +``` + +--- + +### 阶段四:订单物料清单管理器(clsOrderMaterialList) +**优先级**: 中 + +**任务清单**: +1. 创建 `clsOrderMaterialList.cls` 类模块 +2. 实现物料清单生成逻辑 +3. 实现物料汇总统计 +4. 实现多种输出格式(工作表、立即窗口) +5. 编写单元测试用例 + +**测试用例**: +```vba +Sub TestOrderMaterialList() + Dim orderList As New clsOrderMaterialList + Dim bomMgr As New clsBOMManager + + ' 加载 BOM 数据 + bomMgr.LoadData _ + ThisWorkbook.Worksheets("领料配置"), _ + ThisWorkbook.Worksheets("平台配置清单") + + ' 生成物料清单 + orderList.GenerateMaterialList "YTHN-100.A0.532.M203.M16.Y3", bomMgr + + ' 打印到立即窗口 + orderList.PrintToImmediateWindow + + ' 导出到工作表 + Dim ws As Worksheet + Set ws = ThisWorkbook.Worksheets.Add + orderList.ExportToWorksheet ws +End Sub +``` + +--- + +### 阶段五:订单处理模块(modOrderProcessor) +**优先级**: 低 + +**任务清单**: +1. 创建 `modOrderProcessor.bas` 模块 +2. 实现批量订单处理过程 +3. 实现单订单物料清单生成 +4. 实现订单物料清单打印和导出 +5. 编写用户界面宏 + +**示例宏**: +```vba +' 主入口:生成订单物料清单 +Sub GenerateOrderMaterialList() + Dim modelCode As String + modelCode = InputBox("请输入产品型号:", "生成订单物料清单") + + If modelCode = "" Then Exit Sub + + Dim orderList As New clsOrderMaterialList + Dim bomMgr As New clsBOMManager + + bomMgr.LoadData _ + ThisWorkbook.Worksheets("领料配置"), _ + ThisWorkbook.Worksheets("平台配置清单") + + orderList.GenerateMaterialList modelCode, bomMgr + + ' 输出到工作表 + Dim ws As Worksheet + Application.DisplayAlerts = False + On Error Resume Next + ThisWorkbook.Worksheets("订单物料清单").Delete + On Error GoTo 0 + Application.DisplayAlerts = True + + Set ws = ThisWorkbook.Worksheets.Add + ws.Name = "订单物料清单" + orderList.ExportToWorksheet ws + + MsgBox "订单物料清单生成完成!", vbInformation +End Sub + +' 快速打印到立即窗口 +Sub QuickPrintOrderMaterials() + Dim modelCode As String + modelCode = InputBox("请输入产品型号:", "快速打印订单物料") + + If modelCode = "" Then Exit Sub + + ' ... 实现逻辑 +End Sub +``` + +--- + +## 六、数据流程图 + +``` +用户输入产品型号 + ↓ +[clsModelParser] 解析型号 + ↓ +提取选择条件字典 {gclj: M20, jycz: 3, lcfw: M16} + ↓ +[clsOrderMaterialList] 生成物料清单 + ↓ +遍历所有根类别 + ↓ +对每个类别调用 [clsBOMManager.GetMaterialsByConditions()] + ↓ +遍历类别下的所有物料 + ↓ +对每个物料使用 [clsConditionEvaluator.Evaluate()] + ↓ +匹配成功 → 添加到结果集合 +匹配失败 → 跳过 + ↓ +汇总所有匹配物料 + ↓ +输出到工作表 / 立即窗口 +``` + +--- + +## 七、关键技术难点 + +### 7.1 条件表达式解析 + +**难点**: +- 支持括号嵌套 +- 运算符优先级处理 +- 复杂逻辑组合 + +**解决方案**: +- 使用递归下降分析法 +- 构建抽象语法树(AST) +- 后序遍历求值 + +### 7.2 型号格式多样性 + +**难点**: +- 部分型号可能缺少某些部分 +- 附件和法兰隔膜数量不固定 +- 过程连接代码长度不固定 + +**解决方案**: +- 使用正则表达式(如果 VBA 支持) +- 分段解析,容错处理 +- 提供默认值 + +### 7.3 性能优化 + +**难点**: +- 大量物料匹配可能导致性能问题 +- 复杂条件表达式求值耗时 + +**解决方案**: +- 缓存求值结果 +- 优先筛选简单条件 +- 减少不必要的条件求值 + +--- + +## 八、测试计划 + +### 8.1 单元测试 + +每个类都需要独立的单元测试模块: + +1. **TestModelParser**: 测试型号解析功能 +2. **TestConditionEvaluator**: 测试条件求值功能 +3. **TestBOMManagerConditions**: 测试 BOM 管理器扩展功能 +4. **TestOrderMaterialList**: 测试订单物料清单生成功能 + +### 8.2 集成测试 + +测试完整的订单物料生成流程: + +1. 测试标准型号 +2. 测试特殊配置型号 +3. 测试边界条件 +4. 测试异常输入 + +### 8.3 测试数据集 + +基于真实订单数据准备测试用例: + +| 测试用例 | 型号 | 预期匹配物料数 | +|----------|------|----------------| +| 标准配置 | YTHN-100.A0.532.M203.M16.Y3 | 待定 | +| 不同螺纹 | YTHN-100.A0.532.Z121.M06.Y3 | 待定 | +| 小量程 | YTHN-100.A0.532.M201.M02.Y3 | 待定 | +| 大量程 | YTHN-100.A0.532.M201.M16.Y3 | 待定 | + +--- + +## 九、文档需求 + +### 9.1 代码注释 +- 所有类模块需要详细的中文注释 +- 关键算法需要解释说明 +- 复杂逻辑需要举例说明 + +### 9.2 使用说明 +创建 `订单物料清单使用说明.md`,包括: +- 功能概述 +- 使用方法 +- API 文档 +- 常见问题 + +### 9.3 开发文档 +- 类设计文档 +- 接口定义文档 +- 测试报告 + +--- + +## 十、实施时间表 + +| 阶段 | 任务 | 预计工作量 | +|------|------|------------| +| 1 | 型号解析器 | 2-3 天 | +| 2 | 条件表达式求值器 | 3-4 天 | +| 3 | BOM管理器扩展 | 1-2 天 | +| 4 | 订单物料清单管理器 | 2-3 天 | +| 5 | 订单处理模块 | 1-2 天 | +| 6 | 测试与调试 | 2-3 天 | +| 7 | 文档编写 | 1-2 天 | + +**总计**: 约 12-19 天 + +--- + +## 十一、风险评估 + +### 11.1 技术风险 +- **风险**: VBA 不支持复杂的字符串处理 +- **应对**: 使用 VBScript Regular Expression 对象 + +### 11.2 数据风险 +- **风险**: BOM 数据不完整或格式错误 +- **应对**: 增加数据验证和容错处理 + +### 11.3 性能风险 +- **风险**: 大量物料匹配导致响应缓慢 +- **应对**: 优化算法,增加缓存机制 + +--- + +## 十二、后续扩展方向 + +1. **批量订单处理**: 支持从 Excel 列表批量生成物料清单 +2. **条件配置化**: 将提取规则配置化,支持动态调整 +3. **物料替代方案**: 支持物料替代品推荐 +4. **库存集成**: 与库存系统集成,实时查询可用库存 +5. **成本计算**: 根据物料清单计算订单成本 + +--- + +## 附录:参考资料 + +- 布莱迪公司压力表产品选型大表.md +- clsBOMManager使用说明.md +- VBA 编程规范 + +--- + +**文档版本**: 1.0 +**创建日期**: 2025-01-20 +**编制人**: Claude Code +**审核状态**: 待审核