# ClassModules Knowledge Base **Scope:** `VBA/ClassModules/` - Domain logic classes ## OVERVIEW 4 classes: `ProductModelParser` (parse model strings), `BomItem` (data model), `ConditionEvaluator` (evaluate conditions), `BomExtractor` (core matching logic). ## STRUCTURE ``` ClassModules/ ├── ProductModelParser.cls # Parse model strings → extract 6 conditions ├── BomItem.cls # BOM data model (11 fields) ├── ConditionEvaluator.cls # Evaluate condition expressions └── BomExtractor.cls # Core matching + assembly logic ``` ## WHERE TO LOOK | Task | Location | Notes | |------|----------|-------| | Parse model string | `ProductModelParser.cls` | `Parse()` method | | Extract conditions | `ProductModelParser.cls` | Returns `azxs`, `bkxs`, `gclj`, `jycz`, `lcfw`, `fjgn` | | Load BOM row | `BomItem.cls` | `LoadFromRow()` with type conversion | | Evaluate condition | `ConditionEvaluator.cls` | `Evaluate(condition, conditions)` | | Match BOM items | `BomExtractor.cls` | `ExtractBom()` with 4-step process | | Assembly logic | `BomExtractor.cls` | `ApplyAssemblyLogic()` parent/child override | ## CODE MAP ### ProductModelParser | Method | Role | |--------|------| | `Parse(modelString)` | Entry point, validates format | | `ParseHeader()` | Splits model string by `-` and `.` | | `ExtractConnectionAndMaterial()` | Separates `gclj` and `jycz` from code | | `ExtractAdditionalFeatures()` | Removes oil-fill type (Y+digit) from `fjgn` | ### BomItem | Property | Type | Column | |----------|------|--------| | `RowNumber` | Long | A | | `Module` | String | B | | `code` | String | C | | `Name` | String | D | | `quantity` | Double | E | | `SelectCondition` | String | F | | `Remark` | String | G | | `category` | String | H | | `ParentCategory` | String | I | | `CategoryCondition` | String | J | | `Code66` | String | K | ### BomExtractor | Method | Role | |--------|------| | `LoadBomData()` | Loads from row 4 (header row 3) | | `ExtractBom(conditions)` | 4-step: determine categories → match → apply assembly → validate | | `ApplyAssemblyLogic()` | Parent overrides children if all match | | `ValidateResult()` |双向覆盖检查 (parent/child coverage) | ## CONVENTIONS ### Class Structure ```vba Option Explicit ' Private state Private pPropertyName As Type ' Initialize Private Sub Class_Initialize() Set pProperty = New Collection End Sub ' Public methods Public Function MethodName() As ReturnType On Error GoTo ErrorHandler ' Logic Exit Function ErrorHandler: ' Handle End Function ``` ### Condition Dictionary All condition methods accept `Scripting.Dictionary` with keys: `azxs`, `bkxs`, `gclj`, `jycz`, `lcfw`, `fjgn`. ### Error Collection Pattern ```vba Private pErrorMessages As Collection Public Function GetErrorSummary() As String ' Join all errors with "; " End Function ``` ## ANTI-PATTERNS (THIS PROJECT) - **NEVER** change `BomItem.LoadFromRow()` column indices — hardcoded to match platform configuration sheet - **NEVER** remove `On Error Resume Next` in `LoadFromRow()` — type conversions fail gracefully - **NEVER** skip validation in `ValidateResult()` —双向覆盖检查 prevents false negatives - **DO NOT** modify `BomExtractor.LoadBomData()` row start — must be row 4 (row 3 is header) ## UNIQUE STYLES ### Assembly Logic Algorithm ```vba ' 1. Build parent→child map from CategoryHierarchy ' 2. Count matches per category ' 3. If parent=1 AND all children≥1 → parent covers children ' 4. Output parent only, hide children ``` ### Model String Format ``` [Header]-[Spec1].[Spec2].[Spec3].[Spec4].[Spec5]|[Detail1]|[Detail2] Example: Y-100-M203.316SS.L100.N2 Parsed conditions: - azxs (安装形式): M (vertical) - bkxs (表壳形式): 3 - gclj (过程连接): M20 - jycz (接液材质): 3 (316SS) - lcfw (量程范围): 0.L100 - fjgn (附加功能): N2 (from .316SS.L100.N2) ``` ### Condition Expression Syntax ```vba ' Single: "field=value" ' OR: "field1=value1|field2=value2" ' Example: "azxs=M|azxs=L" → vertical OR horizontal ``` ## NOTES ### Category Hierarchy Built from `ParentCategory` field (column I). Example: - "接头" → "部件" - "弹性元件" → "部件" - Result: if "部件" matches AND both children match → output "部件" only ### Type Conversion `BomItem.LoadFromRow()` uses `CLng()`, `CStr()`, `CDbl()` with `On Error Resume Next` — invalid conversions become 0 or empty string. ### Scripting.Dictionary Windows-only. All dictionary usage via `CreateObject("Scripting.Dictionary")`.