' ==============================================================================
' 模块名称: cBOMRow
' 模块类别: 类模块 (Class Module)
' 所属项目: BOMForge
' 模块职责: 封装单行 BOM 数据，提供属性访问，并内置状态跟踪 (脏标记) 机制
' ==============================================================================
Option Explicit

' 内部变量：映射 Excel 数据列
Private pExcelRowIndex As Long     ' 记录该对象对应 Excel 表中的物理行号，保存时定位用
Private pRowNo As Long             ' 行号 (如 10, 20)
Private pModuleType As String      ' 模块 (如 表壳, 罩壳, 接头)
Private pCode As String            ' 代号
Private pItemName As String        ' 名称 (使用 ItemName 避免与内部 Name 关键字冲突)
Private pQuantity As Double        ' 数量
Private pCondition As String       ' 选择条件 (核心修改字段)
Private pRemark As String          ' 备注
Private pCategory As String        ' 类别
Private pParentCategory As String  ' 上层类别
Private pCategoryCondition As String ' 类别选用条件
Private pCode66 As String          ' 66代码
Private pBIPBaseRowNo As String    ' BIP行号基数

' 内部变量：状态追踪
Private pIsDirty As Boolean        ' 脏标记：True 表示对象数据被修改过，需要写回 Excel

' 初始化对象时，默认状态为干净 (未修改)
Private Sub Class_Initialize()
    pIsDirty = False
End Sub

' ------------------------------------------------------------------------------
' 属性: ExcelRowIndex (物理行号)
' ------------------------------------------------------------------------------
Public Property Get ExcelRowIndex() As Long: ExcelRowIndex = pExcelRowIndex: End Property
Public Property Let ExcelRowIndex(ByVal vNewValue As Long): pExcelRowIndex = vNewValue: End Property

' ------------------------------------------------------------------------------
' 属性: RowNo (BOM行号)
' ------------------------------------------------------------------------------
Public Property Get RowNo() As Long: RowNo = pRowNo: End Property
Public Property Let RowNo(ByVal vNewValue As Long)
    If pRowNo <> vNewValue Then pRowNo = vNewValue: pIsDirty = True
End Property

' ------------------------------------------------------------------------------
' 属性: ModuleType (模块)
' ------------------------------------------------------------------------------
Public Property Get ModuleType() As String: ModuleType = pModuleType: End Property
Public Property Let ModuleType(ByVal vNewValue As String)
    If pModuleType <> vNewValue Then pModuleType = vNewValue: pIsDirty = True
End Property

' ------------------------------------------------------------------------------
' 属性: Code (代号)
' ------------------------------------------------------------------------------
Public Property Get Code() As String: Code = pCode: End Property
Public Property Let Code(ByVal vNewValue As String)
    If pCode <> vNewValue Then pCode = vNewValue: pIsDirty = True
End Property

' ------------------------------------------------------------------------------
' 属性: ItemName (名称)
' ------------------------------------------------------------------------------
Public Property Get ItemName() As String: ItemName = pItemName: End Property
Public Property Let ItemName(ByVal vNewValue As String)
    If pItemName <> vNewValue Then pItemName = vNewValue: pIsDirty = True
End Property

' ------------------------------------------------------------------------------
' 属性: Quantity (数量)
' ------------------------------------------------------------------------------
Public Property Get Quantity() As Double: Quantity = pQuantity: End Property
Public Property Let Quantity(ByVal vNewValue As Double)
    If pQuantity <> vNewValue Then pQuantity = vNewValue: pIsDirty = True
End Property

' ------------------------------------------------------------------------------
' 属性: Condition (选择条件) - 这是本工具最核心要修改的字段
' ------------------------------------------------------------------------------
Public Property Get Condition() As String: Condition = pCondition: End Property
Public Property Let Condition(ByVal vNewValue As String)
    ' 只有当新写入的值和原有的值不一样时，才判定为被修改，打上脏标记
    If pCondition <> vNewValue Then
        pCondition = vNewValue
        pIsDirty = True
    End If
End Property

' ------------------------------------------------------------------------------
' 其他次要属性的 Get/Let
' ------------------------------------------------------------------------------
Public Property Get Remark() As String
    Remark = pRemark
End Property
Public Property Let Remark(ByVal vNewValue As String)
    If pRemark <> vNewValue Then
        pRemark = vNewValue
        pIsDirty = True
    End If
End Property

Public Property Get Category() As String
    Category = pCategory
End Property
Public Property Let Category(ByVal vNewValue As String)
    If pCategory <> vNewValue Then
        pCategory = vNewValue
        pIsDirty = True
    End If
End Property

Public Property Get ParentCategory() As String
    ParentCategory = pParentCategory
End Property
Public Property Let ParentCategory(ByVal vNewValue As String)
    If pParentCategory <> vNewValue Then
        pParentCategory = vNewValue
        pIsDirty = True
    End If
End Property

Public Property Get CategoryCondition() As String
    CategoryCondition = pCategoryCondition
End Property
Public Property Let CategoryCondition(ByVal vNewValue As String)
    If pCategoryCondition <> vNewValue Then
        pCategoryCondition = vNewValue
        pIsDirty = True
    End If
End Property

Public Property Get Code66() As String
    Code66 = pCode66
End Property
Public Property Let Code66(ByVal vNewValue As String)
    If pCode66 <> vNewValue Then
        pCode66 = vNewValue
        pIsDirty = True
    End If
End Property

Public Property Get BIPBaseRowNo() As String
    BIPBaseRowNo = pBIPBaseRowNo
End Property
Public Property Let BIPBaseRowNo(ByVal vNewValue As String)
    If pBIPBaseRowNo <> vNewValue Then
        pBIPBaseRowNo = vNewValue
        pIsDirty = True
    End If
End Property

' ------------------------------------------------------------------------------
' 状态追踪：只读的 IsDirty 和重置方法
' ------------------------------------------------------------------------------
Public Property Get IsDirty() As Boolean
    IsDirty = pIsDirty
End Property

' 可以在写回 Excel 后，调用此方法将状态重置为干净
Public Sub ResetDirtyFlag()
    pIsDirty = False
End Sub