Add BLDI pressure gauge classification tool

Implement VBA-based Excel tool for automatic classification of
pressure gauge model codes into 9 product categories.

Features:
- GaugeClassifier class with parsing and classification logic
- MainModule for Excel I/O with bulk array operations
- TestModule with comprehensive test suite (12 test cases)
- Complete documentation (README, INSTALL, algorithm guide)

Categories: 喷涂产品, 卫生型隔膜表, 隔膜表, 差压表,
膜盒压力表, 精密压力表, 电接点压力表, 常规表, 其他

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
Misaka_Company
2026-02-11 16:51:22 +08:00
commit 31a12fc9f5
8 changed files with 2014 additions and 0 deletions

View File

@@ -0,0 +1,168 @@
'=============================================================================
' GaugeClassifier - Core business logic class for pressure gauge classification
' Handles string parsing and classification based on priority decision funnel
'=============================================================================
Option Explicit
' Main classification entry point
' Input: modelString - Full model code string (e.g., "PYTH-100.A0.531|BP-088.2312|FBP-251040")
' Output: Classification name in Chinese
Public Function Classify(modelString As String) As String
Dim head As String
Dim flange As String
Dim mainModel As String
' Handle empty or invalid input
If Trim(modelString) = "" Then
Classify = "其他"
Exit Function
End If
' Extract components
head = GetHead(modelString)
flange = GetFlange(modelString)
mainModel = GetMainModel(head)
' Classification priority funnel (highest priority first)
' 1. 喷涂产品 (Spray-coated) - Highest Priority
' Check: Flange section ends with 'P' OR head contains 'F6AP' or 'F6BP'
If IsSprayProduct(flange, head) Then
Classify = "喷涂产品"
Exit Function
End If
' 2. 卫生型隔膜表 (Sanitary diaphragm)
' Check: Head contains 'F6A' or 'F6B' (excluding spray variants already caught)
If IsSanitary(head) Then
Classify = "卫生型隔膜表"
Exit Function
End If
' 3-8: Main model prefix based classification
Select Case True
' 3. (Diaphragm)
Case mainModel Like "P*"
Classify = "隔膜表"
' 4. (Differential pressure)
Case mainModel Like "YC*"
Classify = "差压表"
' 5. (Capsule)
Case mainModel Like "YE*"
Classify = "膜盒压力表"
' 6. (Precision)
Case mainModel Like "YB*"
Classify = "精密压力表"
' 7. (Electric contact)
Case mainModel Like "YX*"
Classify = "电接点压力表"
' 8. (Regular)
Case mainModel Like "Y*"
Classify = "常规表"
' 9. (Other) - Default
Case Else
Classify = "其他"
End Select
End Function
'=============================================================================
' SPRAY PRODUCT DETECTION
'=============================================================================
Private Function IsSprayProduct(flange As String, head As String) As Boolean
' Check 1: Flange starts with F and 3rd character is P (e.g., FBP, FCP)
If flange <> "" And Len(flange) >= 3 Then
If Left(flange, 1) = "F" And Mid(flange, 3, 1) = "P" Then
IsSprayProduct = True
Exit Function
End If
End If
' Check 2: Head contains 'F6AP' or 'F6BP'
If InStr(head, "F6AP") > 0 Or InStr(head, "F6BP") > 0 Then
IsSprayProduct = True
Exit Function
End If
IsSprayProduct = False
End Function
'=============================================================================
' SANITARY DIAPHRAGM DETECTION
'=============================================================================
Private Function IsSanitary(head As String) As Boolean
' Contains 'F6A' or 'F6B' (but not spray variants)
' Note: Spray variants (F6AP, F6BP) are already caught by IsSprayProduct
If InStr(head, "F6A") > 0 Or InStr(head, "F6B") > 0 Then
IsSanitary = True
Else
IsSanitary = False
End If
End Function
'=============================================================================
' STRING PARSING METHODS
'=============================================================================
' Extract head section (everything before first '|')
' Example: "PYTH-100.A0.531|BP-088.2312|FBP-251040" -> "PYTH-100.A0.531"
Public Function GetHead(fullString As String) As String
Dim pipePos As Long
pipePos = InStr(fullString, "|")
If pipePos > 0 Then
GetHead = Left(fullString, pipePos - 1)
Else
' No pipe found, entire string is head
GetHead = fullString
End If
End Function
' Extract flange section (last section if starts with 'F')
' Example: "PYTH-100.A0.531|BP-088.2312|FBP-251040" -> "FBP-251040"
' Example: "PYTH-100.A0.531|BP-088.2312" -> ""
Public Function GetFlange(fullString As String) As String
Dim sections() As String
Dim lastSection As String
sections = Split(fullString, "|")
If UBound(sections) >= 0 Then
lastSection = Trim(sections(UBound(sections)))
' Check if last section starts with 'F' (flange indicator)
If Left(lastSection, 1) = "F" Then
GetFlange = lastSection
Else
GetFlange = ""
End If
Else
GetFlange = ""
End If
End Function
' Extract main model prefix from head (first word before '-')
' Example: "PYTH-100.A0.531.M201.M06" -> "PYTH"
' Example: "Y-040.Z0.200.M104.M07" -> "Y"
Public Function GetMainModel(headString As String) As String
Dim dashPos As Long
Dim model As String
' Find first dash
dashPos = InStr(headString, "-")
If dashPos > 0 Then
model = Left(headString, dashPos - 1)
Else
' No dash found, use entire head
model = headString
End If
GetMainModel = model
End Function