# 型号解析与物料匹配系统 - 使用说明 ## 📋 目录 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