All checks were successful
NTFY Notification / notify (push) Successful in 4s
Add a preprocessing step to the BOM Extraction System to enhance parameter extraction with mapping values from "对照表" worksheet. For azxs (安装形式) and lcfw (量程范围), the system now stores both the raw parsed value AND the mapped value from the lookup table, enabling flexible dual-value matching. Changes: - Create M06A_Mapper.bas: New module for value mapping - Load azxs/lcfw mappings from "对照表" worksheet - Return dual-value format "raw,mapped" (e.g., "A0,径向") - Support graceful degradation if "对照表" not found - Define constants locally to avoid VBA cross-module reference issues - Modify M06_ModelParser.bas: - Extract raw parameter values first - Apply mapping via M06A_Mapper if initialized - Store dual values for azxs and lcfw parameters - Modify M07_BOMMatcher.bas: - Update EvaluateCellCondition() to support dual-value matching - Split by comma and check if ANY value matches - Backward compatible with single-value parameters - Modify M09_BOMExtractor.bas: - Initialize M06A_Mapper during RunBOMExtraction() - Add WorksheetExists() helper function - Log warning if "对照表" worksheet not found - Define MAPPING_SHEET_NAME constant locally - Modify M04_Config.bas: - Add mapping table configuration constants - MAPPING_SHEET_NAME, MAPPING_COL_LCFW_KEY, etc. - Update CLAUDE.md: - Document new M06A_Mapper module - Update data flow diagram with mapping step - Document dual-value matching behavior - Update system architecture diagram - Update docs/RunBOMExtraction_运行机制详解.md: - Add M06A_Mapper to all diagrams and documentation - Add detailed value mapping section - Update sequence diagrams with mapping flow - Update parameter examples with dual-value format - Bump documentation version to 3.0 Example: Input: Product model "YTHN-100.A0.531.G123.M04.Y3" Parse: azxs="A0", lcfw="M04" Map: azxs="A0,径向", lcfw="M04,高压" Match: BOM库 with azxs="径向" OR "A0" → MATCH Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
128 lines
5.0 KiB
QBasic
128 lines
5.0 KiB
QBasic
' ==============================================================================
|
||
' 模块: M04_Config
|
||
' 职责: 系统配置、常量定义
|
||
' ==============================================================================
|
||
Option Explicit
|
||
|
||
' 源数据列号定义 (根据你的描述)
|
||
Public Const COL_IDX_CODE As Long = 3 ' 代号 (C列)
|
||
Public Const COL_IDX_NAME As Long = 4 ' 名称 (D列)
|
||
Public Const COL_IDX_QTY As Long = 5 ' 数量 (E列)
|
||
Public Const COL_IDX_COND As Long = 6 ' 选择条件 (F列)
|
||
Public Const COL_IDX_CAT As Long = 8 ' 类别 (H列)
|
||
Public Const SRC_START_ROW As Long = 4 ' 数据起始行
|
||
|
||
' ------------------------------------------------------------------------------
|
||
' BOM自动提取系统配置常量
|
||
' ------------------------------------------------------------------------------
|
||
|
||
' BOM库配置
|
||
Public Const BOMLIB_FILENAME As String = "BOM库.xlsx"
|
||
Public Const BOMLIB_START_ROW As Long = 2 ' BOM库数据起始行(第1行是表头)
|
||
Public Const OUTPUT_SHEET_NAME As String = "BOM提取结果"
|
||
|
||
' 输入列名称配置
|
||
Public Const INPUT_COL_MODEL As String = "型号"
|
||
Public Const INPUT_COL_PRODUCT_MODEL As String = "产品型号"
|
||
|
||
' 输出列枚举
|
||
Public Enum OutputColumns
|
||
oc_OriginalModel = 1 ' 原始产品型号
|
||
oc_Azxs = 2 ' 安装形式
|
||
oc_Bkxs = 3 ' 表壳形式
|
||
oc_Gclj = 4 ' 过程连接
|
||
oc_Jycz = 5 ' 接液材质
|
||
oc_Lcfw = 6 ' 量程范围
|
||
oc_Fjgn = 7 ' 附加功能
|
||
oc_MaterialType = 8 ' 物料类型
|
||
oc_MaterialName = 9 ' 物料名称
|
||
oc_MaterialCode = 10 ' 物料编码
|
||
oc_MaterialQty = 11 ' 物料数量
|
||
oc_Remarks = 12 ' 提取备注
|
||
End Enum
|
||
|
||
' 型号解析常量
|
||
Public Const MODEL_SEPARATOR_PIPELINE As String = "|" ' 管道符分隔符
|
||
Public Const MODEL_SEPARATOR_DOT As String = "." ' 点号分隔符
|
||
Public Const MODEL_SEPARATOR_CARET As String = "^" ' 插入符分隔符(法兰隔膜)
|
||
Public Const MODEL_HEADER_MIN_SEGMENTS As Long = 6 ' 表头最小段数
|
||
|
||
' BOM库工作表列表(需要遍历的工作表)
|
||
Public Const BOMLIB_SHEET_JOINT As String = "接头"
|
||
Public Const BOMLIB_SHEET_ELEMENT As String = "弹性元件"
|
||
Public Const BOMLIB_SHEET_MOVEMENT As String = "机芯"
|
||
Public Const BOMLIB_SHEET_COMPONENT As String = "部件"
|
||
Public Const BOMLIB_SHEET_EDGE As String = "边"
|
||
|
||
' BOM库物料列名常量
|
||
Public Const BOMLIB_COL_NAME As String = "名称"
|
||
Public Const BOMLIB_COL_CODE As String = "编码"
|
||
Public Const BOMLIB_COL_QTY As String = "数量"
|
||
Public Const BOMLIB_COL_JOINT_NAME As String = "接头名称"
|
||
Public Const BOMLIB_COL_JOINT_CODE As String = "接头编码"
|
||
Public Const BOMLIB_COL_JOINT_QTY As String = "接头数量"
|
||
Public Const BOMLIB_COL_ELEMENT_NAME As String = "弹性元件名称"
|
||
Public Const BOMLIB_COL_ELEMENT_CODE As String = "弹性元件编码"
|
||
Public Const BOMLIB_COL_ELEMENT_QTY As String = "弹性元件数量"
|
||
|
||
' BOM库条件字段列表(所有可能的条件字段)
|
||
Public Function GetBOMConditionFields() As Variant
|
||
GetBOMConditionFields = Array( _
|
||
"azxs", "bkxs", "gclj", "jycz", "lcdw", "lcfw", _
|
||
"fjgn", "btcy", "bp", "dskd", "nqlc", "bptx", _
|
||
"jddj", "cpdm", "tsjz", "tsyq", "bpts", "kdxh" _
|
||
)
|
||
End Function
|
||
|
||
' ------------------------------------------------------------------------------
|
||
' 映射表配置常量
|
||
' ------------------------------------------------------------------------------
|
||
Public Const MAPPING_SHEET_NAME As String = "对照表"
|
||
Public Const MAPPING_COL_LCFW_KEY As Long = 1 ' A列 - lcfw原始值
|
||
Public Const MAPPING_COL_LCFW_VAL As Long = 2 ' B列 - lcfw映射值
|
||
Public Const MAPPING_COL_AZXS_KEY As Long = 4 ' D列 - azxs原始值
|
||
Public Const MAPPING_COL_AZXS_VAL As Long = 5 ' E列 - azxs映射值
|
||
Public Const MAPPING_START_ROW As Long = 3 ' 数据起始行
|
||
|
||
' 检查列名是否为条件列
|
||
Public Function IsConditionField(ByVal colName As String) As Boolean
|
||
Dim fields As Variant
|
||
fields = GetBOMConditionFields()
|
||
|
||
Dim i As Long
|
||
Dim lowerColName As String
|
||
lowerColName = LCase(Trim(colName))
|
||
|
||
For i = LBound(fields) To UBound(fields)
|
||
If lowerColName = LCase(fields(i)) Then
|
||
IsConditionField = True
|
||
Exit Function
|
||
End If
|
||
Next i
|
||
|
||
IsConditionField = False
|
||
End Function
|
||
|
||
' 获取表头排序索引 (越小越靠前)
|
||
Public Function GetHeaderPriority(key As String) As Long
|
||
Dim vList As Variant
|
||
Dim i As Long
|
||
|
||
' 定义标准排序顺序
|
||
vList = Array("azxs", "bkxs", "gclj", "jycz", "lcdw", "lcfw", _
|
||
"fjgn", "btcy", "bp", "dskd", "nqlc", "bptx", _
|
||
"jddj", "cpdm", "tsjz", "tsyq", "bpts", "kdxh")
|
||
|
||
Dim sKey As String
|
||
sKey = LCase(Trim(key))
|
||
|
||
For i = LBound(vList) To UBound(vList)
|
||
If sKey = LCase(vList(i)) Then
|
||
GetHeaderPriority = i
|
||
Exit Function
|
||
End If
|
||
Next i
|
||
|
||
' 未知变量排在最后
|
||
GetHeaderPriority = 999
|
||
End Function |