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.
This commit is contained in:
Misaka_Company
2026-01-20 10:45:23 +08:00
parent 05601ec1fc
commit bc5ea92c52
6 changed files with 2057 additions and 16 deletions

87
CLAUDE.md Normal file
View File

@@ -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.

View File

@@ -19,15 +19,15 @@ Sub TestBOMStructure()
bomMgr.LoadData wsConfig, wsPlatform bomMgr.LoadData wsConfig, wsPlatform
' 打印类别树结构到新工作表 ' 打印类别树结构到新工作表
Dim wsOutput As Worksheet ' Dim wsOutput As Worksheet
On Error Resume Next ' On Error Resume Next
Application.DisplayAlerts = False ' Application.DisplayAlerts = False
ThisWorkbook.Worksheets("BOM结构").Delete ' ThisWorkbook.Worksheets("BOM结构").Delete
Application.DisplayAlerts = True ' Application.DisplayAlerts = True
On Error GoTo 0 ' On Error GoTo 0
'
Set wsOutput = ThisWorkbook.Worksheets.Add ' Set wsOutput = ThisWorkbook.Worksheets.Add
wsOutput.Name = "BOM结构" ' wsOutput.Name = "BOM结构"
'bomMgr.PrintCategoryTree wsOutput 'bomMgr.PrintCategoryTree wsOutput
@@ -40,7 +40,7 @@ Sub TestBOMStructure()
MsgBox "BOM数据结构加载完成!" & vbCrLf & _ 'MsgBox "BOM数据结构加载完成!" & vbCrLf & _
"请查看 'BOM结构' 工作表", vbInformation "请查看 'BOM结构' 工作表", vbInformation
End Sub End Sub
@@ -139,6 +139,64 @@ Sub GeneratePickingList()
MsgBox "领料清单生成完成!", vbInformation MsgBox "领料清单生成完成!", vbInformation
End Sub 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() Sub QueryMaterialInfo()
Dim bomMgr As New clsBOMManager Dim bomMgr As New clsBOMManager

View File

@@ -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

View File

@@ -31,6 +31,12 @@
"attributes": {}, "attributes": {},
"file": "DocumentModules\\Sheet4.cls" "file": "DocumentModules\\Sheet4.cls"
}, },
"Sheet6.cls": {
"name": "Sheet6",
"type": "DocumentModules",
"attributes": {},
"file": "DocumentModules\\Sheet6.cls"
},
"clsCategory.cls": { "clsCategory.cls": {
"name": "clsCategory", "name": "clsCategory",
"type": "ClassModules", "type": "ClassModules",
@@ -54,12 +60,6 @@
"type": "ClassModules", "type": "ClassModules",
"attributes": {}, "attributes": {},
"file": "ClassModules\\clsBOMManager.cls" "file": "ClassModules\\clsBOMManager.cls"
},
"Sheet6.cls": {
"name": "Sheet6",
"type": "DocumentModules",
"attributes": {},
"file": "DocumentModules\\Sheet6.cls"
} }
} }
} }

View File

@@ -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 | 00.06 MPa |
| M02 | 00.1 MPa |
| M03 | 00.16 MPa |
| M04 | 00.25 MPa |
| M05 | 00.4 MPa |
| M06 | 00.6 MPa |
| M07 | 01 MPa |
| M08 | 01.6 MPa |
| M09 | 02.5 MPa |
| M10 | 04 MPa |
| M11 | 06 MPa |
| M12 | 010 MPa |
| M13 | 016 MPa |
| M14 | 025 MPa |
| M15 | 040 MPa |
| M16 | 060 MPa |
| M17 | 0100 MPa |
| M18 | 0160 MPa |
| M19 | 0250 MPa |
#### 负压及复合量程
| 代码 | 量程范围 |
|------|----------|
| M30 | -0.10 MPa |
| M31 | -0.10.06 MPa |
| M32 | -0.10.15 MPa |
| M33 | -0.10.3 MPa |
#### 绝对压力量程
| 代码 | 量程范围 |
|------|----------|
| M02A | 00.1 MPa abs |
| M03A | 00.16 MPa abs |
| M04A | 00.25 MPa abs |
| M05A | 00.4 MPa abs |
| M06A | 00.6 MPa abs |
### kPa量程代码
#### 正压量程
| 代码 | 量程范围 |
|------|----------|
| K10 | 00.06 kPa |
| K11 | 00.1 kPa |
| K12 | 00.16 kPa |
| K13 | 00.25 kPa |
| K14 | 00.4 kPa |
| K15 | 00.6 kPa |
| K16 | 01 kPa |
| K17 | 01.6 kPa |
| K18 | 02.5 kPa |
| K19 | 04 kPa |
| K20 | 06 kPa |
| K21 | 010 kPa |
| K22 | 016 kPa |
| K23 | 025 kPa |
| K24 | 040 kPa |
| K25 | 060 kPa |
| K26 | 0100 kPa |
| K27 | 0160 kPa |
| K28 | 0250 kPa |
| K29 | 0400 kPa |
| K30 | 0600 kPa |
#### 负压量程
| 代码 | 量程范围 |
|------|----------|
| K50 | -0.060 kPa |
| K51 | -0.10 kPa |
| K52 | -0.160 kPa |
| K53 | -0.40 kPa |
| K54 | -0.60 kPa |
| K55 | -10 kPa |
| K56 | -1.60 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.81` 代表0.81区域套红色
#### 套双色
格式: `GXXX.RXXX`
示例: `G00.7.R0.71` 代表00.7区域绿色0.71区域红色
#### 套三色
格式: `YXXX.GXXX.RXXX`
示例: `Y00.2.G0.20.8.R0.81` 代表:
- 00.2区域套黄色
- 0.20.8区域套绿色
- 0.81区域套红色
### 双刻度盘刻度线颜色
| 代码 | 说明 |
|------|------|
| 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
**文档性质**: 公司内部资料,严禁外传
**编制单位**: 布莱迪公司
---
*注: 本文档中未详细列出的代码和规格请参考选型软件获取完整信息。*

View File

@@ -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 | 060 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
**审核状态**: 待审核