docs: reorganize documentation structure and add analysis guidelines

- Move existing documentation files to reference_docs/ directory
- Add documentation guidelines section to CLAUDE.md
- Add clsBOMManager LoadData flow analysis with Mermaid diagrams

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
Misaka_Company
2026-01-29 09:30:29 +08:00
parent 29fca561e8
commit fd414f7673
8 changed files with 451 additions and 0 deletions

View File

@@ -0,0 +1,428 @@
# 型号解析与物料匹配系统 - 使用说明
## 📋 目录
1. [系统概述](#系统概述)
2. [安装部署](#安装部署)
3. [快速开始](#快速开始)
4. [详细使用](#详细使用)
5. [API参考](#api参考)
6. [扩展指南](#扩展指南)
7. [常见问题](#常见问题)
---
## 系统概述
### 功能简介
本系统实现了从产品型号中自动提取物料选择条件并根据这些条件从BOM库中筛选出符合要求的物料清单。
### 核心功能
-**型号解析**: 自动解析产品型号的各个组成部分
-**条件提取**: 按规则提取物料选择条件(过程连接、接液材质、量程范围等)
-**条件匹配**: 支持复杂的逻辑表达式(AND/OR/NOT/括号)
-**物料筛选**: 自动筛选符合条件的物料
-**批量处理**: 支持批量处理多个型号
-**可扩展性**: 便于添加新的提取条件和匹配规则
### 示例
**输入型号**: `YTHN-100.A0.532.M203.M16.Y3|BP-095.2312.M16.PA3`
**提取条件**:
- `gclj` (过程连接) = `M20`
- `jycz` (接液材质) = `3`
- `lcfw` (量程范围) = `M16`
**匹配结果**: `01011019018 - 高压接头部件`
---
## 安装部署
### 1. 导入类模块
将以下4个类模块文件导入到VBA项目中:
1. **clsModelParser.cls** - 型号解析器
2. **clsConditionExtractor.cls** - 条件提取器
3. **clsConditionMatcher.cls** - 条件匹配器
4. **clsBOMManager.cls** - BOM管理器(扩展版本)
### 2. 导入标准模块
将以下2个标准模块导入到VBA项目中:
1. **modModelParserTest.bas** - 测试模块
2. **modModelParserExamples.bas** - 应用示例模块
### 3. 验证安装
运行测试过程验证安装是否成功:
```vba
' 在立即窗口或通过运行按钮执行
RunAllTests
```
如果所有测试通过,说明安装成功!
---
## 快速开始
### 最简单的使用方式
```vba
Sub QuickStart()
' 1. 创建BOM管理器并加载数据
Dim bomMgr As New clsBOMManager
bomMgr.LoadData ThisWorkbook.Worksheets("领料配置"), _
ThisWorkbook.Worksheets("平台配置清单")
' 2. 根据型号获取物料
Dim modelStr As String
modelStr = "YTHN-100.A0.532.M203.M16.Y3"
Dim materials As Collection
Set materials = bomMgr.GetMaterialsByModel(modelStr, "部件")
' 3. 查看结果
Dim mat As clsMaterialItem
For Each mat In materials
Debug.Print mat.Code & " - " & mat.Name
Next mat
End Sub
```
### 生成领料清单
运行以下示例生成完整的领料清单:
```vba
Example1_GeneratePickingListByModel
```
这将创建一个新工作表,包含完整的领料清单。
---
## 详细使用
### 1. 型号解析
#### 基础解析
```vba
Dim parser As New clsModelParser
Dim modelStr As String
modelStr = "YTHN-100.A0.532.M203.M16.Y3|BP-095.2312.M16.PA3"
If parser.ParseModel(modelStr) Then
' 解析成功
Debug.Print "型号: " & parser.ModelType ' YTHN
Debug.Print "外径: " & parser.Diameter ' 100
Debug.Print "过程连接: " & parser.ConnectionCode ' M203
Debug.Print "量程: " & parser.RangeCode ' M16
Else
' 解析失败
Debug.Print "错误: " & parser.ErrorMessage
End If
```
#### 获取提取的代码
```vba
Debug.Print "螺纹代码: " & parser.GetThreadCode() ' M20
Debug.Print "材质代码: " & parser.GetMaterialCode() ' 3
Debug.Print "量程代码: " & parser.GetRangeCode() ' M16
```
### 2. 条件提取
```vba
Dim parser As New clsModelParser
parser.ParseModel "YTHN-100.A0.532.M203.M16.Y3"
Dim extractor As New clsConditionExtractor
Dim conditions As Object
Set conditions = extractor.ExtractConditions(parser)
' 获取单个条件
Debug.Print "过程连接: " & extractor.GetConditionValue("gclj") ' M20
Debug.Print "接液材质: " & extractor.GetConditionValue("jycz") ' 3
Debug.Print "量程范围: " & extractor.GetConditionValue("lcfw") ' M16
' 遍历所有条件
Dim key As Variant
For Each key In conditions.Keys
Debug.Print key & " = " & conditions(key)
Next key
```
### 3. 条件匹配
#### 简单条件
```vba
Dim matcher As New clsConditionMatcher
Dim conditions As Object
Set conditions = CreateObject("Scripting.Dictionary")
conditions("gclj") = "M20"
conditions("lcfw") = "M16"
' 等于
Debug.Print matcher.IsMatch("lcfw=M16", conditions) ' True
' 不等于
Debug.Print matcher.IsMatch("gclj!=M10", conditions) ' True
```
#### 复合条件
```vba
' AND 运算
Debug.Print matcher.IsMatch("lcfw=M16 AND gclj=M20", conditions) ' True
' OR 运算
Debug.Print matcher.IsMatch("lcfw=M16 OR lcfw=M17", conditions) ' True
' 括号优先级
Debug.Print matcher.IsMatch("gclj=M20 AND (lcfw=M16 OR lcfw=M17)", conditions) ' True
```
### 4. 获取物料清单
#### 指定类别
```vba
Dim bomMgr As New clsBOMManager
bomMgr.LoadData wsConfig, wsPlatform
' 获取"部件"类别的符合条件的物料
Dim materials As Collection
Set materials = bomMgr.GetMaterialsByModel("YTHN-100.A0.532.M203.M16.Y3", "部件")
```
#### 所有类别
```vba
' 获取所有类别的符合条件的物料
Set materials = bomMgr.GetMaterialsByModel("YTHN-100.A0.532.M203.M16.Y3")
```
#### 使用父类别/子类别逻辑
```vba
' 使用父类别物料(默认)
Set materials = bomMgr.GetMaterialsByCategoryAndModel( _
"YTHN-100.A0.532.M203.M16.Y3", "部件", True)
' 使用子类别物料(库存不足时)
Set materials = bomMgr.GetMaterialsByCategoryAndModel( _
"YTHN-100.A0.532.M203.M16.Y3", "部件", False)
```
---
## API参考
### clsModelParser
| 方法/属性 | 说明 | 返回类型 |
|---------|------|---------|
| `ParseModel(modelStr)` | 解析型号字符串 | Boolean |
| `GetThreadCode()` | 获取螺纹代码 | String |
| `GetMaterialCode()` | 获取材质代码 | String |
| `GetRangeCode()` | 获取量程代码 | String |
| `IsValid` | 解析是否成功 | Boolean |
| `ErrorMessage` | 错误信息 | String |
| `ToString()` | 返回解析结果(调试用) | String |
### clsConditionExtractor
| 方法/属性 | 说明 | 返回类型 |
|---------|------|---------|
| `ExtractConditions(parser)` | 提取所有条件 | Dictionary |
| `GetConditionValue(varName)` | 获取单个条件值 | String |
| `AddCondition(varName, value)` | 手动添加条件 | - |
| `AddExtractionRule(...)` | 添加提取规则 | - |
| `ToString()` | 返回条件字符串(调试用) | String |
### clsConditionMatcher
| 方法 | 说明 | 返回类型 |
|-----|------|---------|
| `IsMatch(expr, conditions)` | 判断条件是否匹配 | Boolean |
| `TestExpression(expr)` | 测试表达式有效性 | String |
### clsBOMManager (新增方法)
| 方法 | 说明 | 返回类型 |
|-----|------|---------|
| `GetMaterialsByModel(modelStr, [categoryName])` | 根据型号获取物料 | Collection |
| `GetMaterialsByCategoryAndModel(...)` | 根据类别和型号获取物料 | Collection |
| `ParseModelAndExtractConditions(modelStr)` | 解析型号并返回条件 | Dictionary |
---
## 扩展指南
### 添加新的提取条件
假设需要添加"表盘类型"条件:
```vba
' 在 clsConditionExtractor.InitializeRules 方法中添加:
m_ExtractionRules("bplx") = Array("DialCode", "Direct")
```
### 添加新的提取方法
如果需要特殊的提取逻辑:
```vba
' 在 clsConditionExtractor.ExtractValue 方法中添加:
Case "GetMiddleChars"
' 提取中间几位字符
If Len(sourceValue) > 4 Then
ExtractValue = Mid(sourceValue, 2, 3)
Else
ExtractValue = sourceValue
End If
```
### 扩展条件匹配运算符
`clsConditionMatcher.EvaluateSimpleCondition` 中添加新运算符:
```vba
' 示例: 添加 > 运算符
ElseIf InStr(cond, ">") > 0 Then
' ... 实现大于比较
```
---
## 常见问题
### Q1: 型号解析失败怎么办?
**A**: 检查型号格式是否正确:
- 表头部分必须包含: `型号-外径.安装.壳体.连接.量程.[特性]`
- 各部分用 `.` 分隔
- 表头和表盘用 `|` 分隔
### Q2: 条件匹配不准确?
**A**:
1. 检查物料的选择条件表达式是否正确
2. 运行 `Test3_ConditionMatcher` 验证匹配器功能
3. 使用 `TestExpression` 方法测试具体表达式
### Q3: 如何调试条件提取?
**A**: 使用以下代码查看提取结果:
```vba
Dim conditions As Object
Set conditions = bomMgr.ParseModelAndExtractConditions(modelStr)
Dim key As Variant
For Each key In conditions.Keys
Debug.Print key & " = " & conditions(key)
Next key
```
### Q4: 批量处理速度慢?
**A**:
1. 避免在循环中重复加载BOM数据
2. 使用 `GetMaterialsByModel` 一次性获取所有类别
3. 考虑添加缓存机制
### Q5: 如何验证物料条件表达式?
**A**: 运行示例:
```vba
Example5_ValidateMaterialConditions
```
这将生成一个验证报告,显示所有物料条件的有效性。
---
## 测试用例
### 运行所有测试
```vba
RunAllTests
```
### 单独测试
```vba
' 测试型号解析
Test1_ModelParser
' 测试条件提取
Test2_ConditionExtractor
' 测试条件匹配
Test3_ConditionMatcher
' 测试完整流程
Test4_GetMaterialsByModel
```
---
## 应用示例
### 示例1: 生成领料清单
```vba
Example1_GeneratePickingListByModel
```
### 示例2: 批量处理型号
```vba
Example2_BatchProcessModels
```
### 示例3: 查询型号详情
```vba
Example3_ShowModelDetails
```
### 示例4: 对比两个型号
```vba
Example4_CompareModels
```
### 示例5: 验证条件表达式
```vba
Example5_ValidateMaterialConditions
```
---
## 技术支持
如有问题,请:
1. 查看测试结果和调试信息
2. 运行相关示例程序
3. 检查条件表达式语法
---
**文档版本**: v1.0
**最后更新**: 2026-01-19