docs: expand AutoBOM architecture and implementation details
Refine project overview to include specific business context (Blaidy Company) and the main workbook file. Restructure the architecture section into a layered object-oriented design (Data, Processing, Application layers) and define the responsibilities of core VBA classes. Add new technical documentation sections covering: - Model number format parsing structure - Condition expression language syntax - Category hierarchy logic and picking strategies - Material matching pipeline flow Include VBA code examples for key methods such as CollectAllMaterials and GetMaterialsByCategoryAndModel to illustrate recursive traversal and material retrieval logic. Clarify the structure of key Excel configuration sheets.
This commit is contained in:
309
VBA/Modules/modModelParserTest.bas
Normal file
309
VBA/Modules/modModelParserTest.bas
Normal file
@@ -0,0 +1,309 @@
|
||||
' ========================================
|
||||
' 模块: modModelParserTest
|
||||
' 用途: 测试型号解析和物料匹配功能
|
||||
' ========================================
|
||||
Option Explicit
|
||||
|
||||
' ========================================
|
||||
' 测试1: 型号解析器基础功能
|
||||
' ========================================
|
||||
Sub Test1_ModelParser()
|
||||
Debug.Print String(80, "=")
|
||||
Debug.Print "测试1: 型号解析器基础功能"
|
||||
Debug.Print String(80, "=")
|
||||
|
||||
Dim parser As New clsModelParser
|
||||
Dim modelStr As String
|
||||
|
||||
' 测试用例1: 完整型号
|
||||
modelStr = "YTHN-100.A0.532.M203.M16.Y3|BP-095.2312.M16.PA3"
|
||||
Debug.Print "【测试用例1】完整型号"
|
||||
Debug.Print "输入: " & modelStr
|
||||
|
||||
If parser.ParseModel(modelStr) Then
|
||||
Debug.Print parser.ToString()
|
||||
Debug.Print "? 解析成功"
|
||||
Else
|
||||
Debug.Print "? 解析失败: " & parser.ErrorMessage
|
||||
End If
|
||||
|
||||
Debug.Print ""
|
||||
|
||||
' 测试用例2: 仅表头
|
||||
modelStr = "YTHN-100.A0.532.M203.M16.Y3"
|
||||
Debug.Print "【测试用例2】仅表头"
|
||||
Debug.Print "输入: " & modelStr
|
||||
|
||||
If parser.ParseModel(modelStr) Then
|
||||
Debug.Print " 螺纹代码: " & parser.GetThreadCode()
|
||||
Debug.Print " 材质代码: " & parser.GetMaterialCode()
|
||||
Debug.Print " 量程代码: " & parser.GetRangeCode()
|
||||
Debug.Print "? 解析成功"
|
||||
Else
|
||||
Debug.Print "? 解析失败: " & parser.ErrorMessage
|
||||
End If
|
||||
|
||||
Debug.Print String(80, "=")
|
||||
Debug.Print ""
|
||||
End Sub
|
||||
|
||||
' ========================================
|
||||
' 测试2: 条件提取器
|
||||
' ========================================
|
||||
Sub Test2_ConditionExtractor()
|
||||
Debug.Print String(80, "=")
|
||||
Debug.Print "测试2: 条件提取器"
|
||||
Debug.Print String(80, "=")
|
||||
|
||||
Dim parser As New clsModelParser
|
||||
Dim extractor As New clsConditionExtractor
|
||||
Dim modelStr As String
|
||||
|
||||
modelStr = "YTHN-100.A0.532.M203.M16.Y3"
|
||||
Debug.Print "输入型号: " & modelStr
|
||||
|
||||
If parser.ParseModel(modelStr) Then
|
||||
Dim conditions As Object
|
||||
Set conditions = extractor.ExtractConditions(parser)
|
||||
|
||||
Debug.Print extractor.ToString()
|
||||
|
||||
' 验证提取结果
|
||||
Debug.Print "【验证】"
|
||||
Debug.Print " gclj = " & extractor.GetConditionValue("gclj") & _
|
||||
IIf(extractor.GetConditionValue("gclj") = "M20", " ?", " ?")
|
||||
Debug.Print " jycz = " & extractor.GetConditionValue("jycz") & _
|
||||
IIf(extractor.GetConditionValue("jycz") = "3", " ?", " ?")
|
||||
Debug.Print " lcfw = " & extractor.GetConditionValue("lcfw") & _
|
||||
IIf(extractor.GetConditionValue("lcfw") = "M16", " ?", " ?")
|
||||
Else
|
||||
Debug.Print "? 型号解析失败"
|
||||
End If
|
||||
|
||||
Debug.Print String(80, "=")
|
||||
Debug.Print ""
|
||||
End Sub
|
||||
|
||||
' ========================================
|
||||
' 测试3: 条件匹配器
|
||||
' ========================================
|
||||
Sub Test3_ConditionMatcher()
|
||||
Debug.Print String(80, "=")
|
||||
Debug.Print "测试3: 条件匹配器"
|
||||
Debug.Print String(80, "=")
|
||||
|
||||
Dim matcher As New clsConditionMatcher
|
||||
Dim conditions As Object
|
||||
Set conditions = CreateObject("Scripting.Dictionary")
|
||||
conditions("gclj") = "M20"
|
||||
conditions("jycz") = "3"
|
||||
conditions("lcfw") = "M16"
|
||||
|
||||
Debug.Print "【测试条件】"
|
||||
Debug.Print " gclj = M20"
|
||||
Debug.Print " jycz = 3"
|
||||
Debug.Print " lcfw = M16"
|
||||
Debug.Print ""
|
||||
|
||||
' 测试用例
|
||||
Dim testCases As Variant
|
||||
testCases = Array( _
|
||||
Array("", True, "空条件"), _
|
||||
Array("lcfw=M16", True, "简单等于"), _
|
||||
Array("lcfw=M17", False, "简单不匹配"), _
|
||||
Array("lcfw=M16 AND gclj=M20", True, "AND 全真"), _
|
||||
Array("lcfw=M16 AND gclj=M10", False, "AND 一假"), _
|
||||
Array("lcfw=M16 OR lcfw=M17", True, "OR 一真"), _
|
||||
Array("lcfw=M15 OR lcfw=M17", False, "OR 全假"), _
|
||||
Array("gclj!=M10", True, "不等于 真"), _
|
||||
Array("gclj!=M20", False, "不等于 假"), _
|
||||
Array("lcfw=M02 AND gclj!=M20", False, "复合条件1"), _
|
||||
Array("lcfw=M16 AND gclj!=M10", True, "复合条件2"), _
|
||||
Array("gclj=M20 AND (lcfw=M16 OR lcfw=M17)", True, "括号优先级1"), _
|
||||
Array("gclj=M20 AND (lcfw=M15 OR lcfw=M17)", False, "括号优先级2") _
|
||||
)
|
||||
|
||||
Dim i As Long
|
||||
Dim testCase As Variant
|
||||
Dim expr As String
|
||||
Dim expected As Boolean
|
||||
Dim actual As Boolean
|
||||
Dim description As String
|
||||
Dim passCount As Long
|
||||
Dim failCount As Long
|
||||
|
||||
passCount = 0
|
||||
failCount = 0
|
||||
|
||||
Debug.Print "【测试用例】"
|
||||
For i = LBound(testCases) To UBound(testCases)
|
||||
testCase = testCases(i)
|
||||
expr = testCase(0)
|
||||
expected = testCase(1)
|
||||
description = testCase(2)
|
||||
|
||||
actual = matcher.IsMatch(expr, conditions)
|
||||
|
||||
If actual = expected Then
|
||||
Debug.Print " ? " & description & ": " & IIf(expr = "", "(空)", expr)
|
||||
passCount = passCount + 1
|
||||
Else
|
||||
Debug.Print " ? " & description & ": " & expr
|
||||
Debug.Print " 预期: " & expected & ", 实际: " & actual
|
||||
failCount = failCount + 1
|
||||
End If
|
||||
Next i
|
||||
|
||||
Debug.Print ""
|
||||
Debug.Print "【统计】"
|
||||
Debug.Print " 通过: " & passCount
|
||||
Debug.Print " 失败: " & failCount
|
||||
|
||||
Debug.Print String(80, "=")
|
||||
Debug.Print ""
|
||||
End Sub
|
||||
|
||||
' ========================================
|
||||
' 测试4: 完整流程 - 根据型号获取物料
|
||||
' ========================================
|
||||
Sub Test4_GetMaterialsByModel()
|
||||
Debug.Print String(80, "=")
|
||||
Debug.Print "测试4: 根据型号获取物料(完整流程)"
|
||||
Debug.Print String(80, "=")
|
||||
|
||||
' 加载BOM数据
|
||||
Dim bomMgr As New clsBOMManager
|
||||
Dim wsConfig As Worksheet
|
||||
Dim wsPlatform As Worksheet
|
||||
|
||||
On Error Resume Next
|
||||
Set wsConfig = ThisWorkbook.Worksheets("领料配置")
|
||||
Set wsPlatform = ThisWorkbook.Worksheets("平台配置清单")
|
||||
On Error GoTo 0
|
||||
|
||||
If wsConfig Is Nothing Or wsPlatform Is Nothing Then
|
||||
Debug.Print "? 错误: 找不到必需的工作表"
|
||||
Exit Sub
|
||||
End If
|
||||
|
||||
bomMgr.LoadData wsConfig, wsPlatform
|
||||
Debug.Print "? BOM数据加载完成"
|
||||
Debug.Print ""
|
||||
|
||||
' 测试型号
|
||||
Dim modelStr As String
|
||||
modelStr = "YTHN-100.A0.532.M203.M16.Y3|BP-095.2312.M16.PA3"
|
||||
|
||||
' 获取"部件"类别的符合条件的物料
|
||||
Dim materials As collection
|
||||
Set materials = bomMgr.GetMaterialsByModel(modelStr, "部件")
|
||||
|
||||
Debug.Print ""
|
||||
Debug.Print "【结果验证】"
|
||||
If materials.Count = 1 Then
|
||||
Dim mat As clsMaterialItem
|
||||
Set mat = materials(1)
|
||||
If mat.code = "01011019018" And mat.Name = "高压接头部件" Then
|
||||
Debug.Print "? 测试通过!成功匹配到正确的物料"
|
||||
Debug.Print " 代号: " & mat.code
|
||||
Debug.Print " 名称: " & mat.Name
|
||||
Debug.Print " 条件: " & mat.Condition
|
||||
Else
|
||||
Debug.Print "? 匹配到的物料不正确"
|
||||
End If
|
||||
Else
|
||||
Debug.Print "? 匹配数量不正确,预期1个,实际" & materials.Count & "个"
|
||||
End If
|
||||
|
||||
Debug.Print String(80, "=")
|
||||
Debug.Print ""
|
||||
End Sub
|
||||
|
||||
' ========================================
|
||||
' 测试5: 获取所有类别的符合条件的物料
|
||||
' ========================================
|
||||
Sub Test5_GetAllMaterialsByModel()
|
||||
Debug.Print String(80, "=")
|
||||
Debug.Print "测试5: 获取所有类别的符合条件的物料"
|
||||
Debug.Print String(80, "=")
|
||||
|
||||
' 加载BOM数据
|
||||
Dim bomMgr As New clsBOMManager
|
||||
Dim wsConfig As Worksheet
|
||||
Dim wsPlatform As Worksheet
|
||||
|
||||
On Error Resume Next
|
||||
Set wsConfig = ThisWorkbook.Worksheets("领料配置")
|
||||
Set wsPlatform = ThisWorkbook.Worksheets("平台配置清单")
|
||||
On Error GoTo 0
|
||||
|
||||
If wsConfig Is Nothing Or wsPlatform Is Nothing Then
|
||||
Debug.Print "? 错误: 找不到必需的工作表"
|
||||
Exit Sub
|
||||
End If
|
||||
|
||||
bomMgr.LoadData wsConfig, wsPlatform
|
||||
|
||||
' 测试型号
|
||||
Dim modelStr As String
|
||||
modelStr = "YTHN-100.A0.532.M203.M16.Y3"
|
||||
|
||||
' 获取所有类别的符合条件的物料
|
||||
Dim materials As collection
|
||||
Set materials = bomMgr.GetMaterialsByModel(modelStr)
|
||||
|
||||
Debug.Print ""
|
||||
Debug.Print "【匹配结果汇总】"
|
||||
Debug.Print " 共匹配 " & materials.Count & " 个物料"
|
||||
|
||||
Debug.Print String(80, "=")
|
||||
Debug.Print ""
|
||||
End Sub
|
||||
|
||||
' ========================================
|
||||
' 运行所有测试
|
||||
' ========================================
|
||||
Sub RunAllTests()
|
||||
Debug.Print vbCrLf & vbCrLf
|
||||
Debug.Print "╔" & String(78, "═") & "╗"
|
||||
Debug.Print "║" & Space(20) & "型号解析与物料匹配 - 完整测试套件" & Space(20) & "║"
|
||||
Debug.Print "╚" & String(78, "═") & "╝"
|
||||
Debug.Print ""
|
||||
|
||||
Test1_ModelParser
|
||||
Test2_ConditionExtractor
|
||||
Test3_ConditionMatcher
|
||||
Test4_GetMaterialsByModel
|
||||
Test5_GetAllMaterialsByModel
|
||||
|
||||
Debug.Print "╔" & String(78, "═") & "╗"
|
||||
Debug.Print "║" & Space(30) & "所有测试完成" & Space(30) & "║"
|
||||
Debug.Print "╚" & String(78, "═") & "╝"
|
||||
End Sub
|
||||
|
||||
' ========================================
|
||||
' 测试6: 条件提取规则展示
|
||||
' ========================================
|
||||
Sub Test6_ShowExtractionRules()
|
||||
Debug.Print String(80, "=")
|
||||
Debug.Print "测试6: 当前配置的条件提取规则"
|
||||
Debug.Print String(80, "=")
|
||||
|
||||
Dim extractor As New clsConditionExtractor
|
||||
Dim rules As Object
|
||||
Set rules = extractor.GetExtractionRules()
|
||||
|
||||
Debug.Print "【提取规则配置】"
|
||||
Dim key As Variant
|
||||
For Each key In rules.Keys
|
||||
Dim ruleInfo As Variant
|
||||
ruleInfo = rules(key)
|
||||
Debug.Print " 变量名: " & key
|
||||
Debug.Print " 源字段: " & ruleInfo(0)
|
||||
Debug.Print " 提取方法: " & ruleInfo(1)
|
||||
Debug.Print ""
|
||||
Next key
|
||||
|
||||
Debug.Print String(80, "=")
|
||||
Debug.Print ""
|
||||
End Sub
|
||||
Reference in New Issue
Block a user