feat: add component priority exclusion feature

Add support for excluding "部件" category based on component priority flag:
- BomExtractor: Add exclude categories functionality
  - Add pExcludeCategories collection member
  - Add SetExcludeCategories() and ClearExcludeCategories() methods
  - Modify DetermineRequiredCategories() to skip excluded categories

- BIPUploadModule: Read and use component priority field
  - Read component priority from column E of [产品订单] worksheet
  - Pass component priority to ProcessSingleOrder()
  - When priority is "否"/"0"/"FALSE", exclude "部件" category
  - Only extract sub-category materials when component priority is disabled

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
Misaka
2026-02-01 22:25:10 +08:00
parent 8fae8f0389
commit c5f2d804fb
2 changed files with 59 additions and 14 deletions

View File

@@ -14,6 +14,7 @@ Private pMatchedItems As collection ' 匹配的BOM项
Private pRequiredCategories As collection ' 需要的类别
Private pCategoryHierarchy As Object ' 类别层次结构 Dictionary(子类别->父类别)
Private pErrorMessages As collection
Private pExcludeCategories As collection ' 需要排除的类别
'=====================================================================
' 方法: Class_Initialize
@@ -26,6 +27,7 @@ Private Sub Class_Initialize()
Set pRequiredCategories = New collection
Set pCategoryHierarchy = CreateObject("Scripting.Dictionary")
Set pErrorMessages = New collection
Set pExcludeCategories = New collection
End Sub
'=====================================================================
@@ -93,6 +95,23 @@ ErrorHandler:
LoadBomData = False
End Function
'=====================================================================
' 方法: SetExcludeCategories
' 功能: 设置需要排除的类别
' 参数: categories - 类别集合
'=====================================================================
Public Sub SetExcludeCategories(categories As collection)
Set pExcludeCategories = categories
End Sub
'=====================================================================
' 方法: ClearExcludeCategories
' 功能: 清空排除类别列表
'=====================================================================
Public Sub ClearExcludeCategories()
Set pExcludeCategories = New collection
End Sub
'=====================================================================
' 方法: ExtractBom
' 功能: 根据产品条件提取BOM
@@ -141,6 +160,19 @@ Private Sub DetermineRequiredCategories(productConditions As Object)
' 遍历所有有效物料,获取唯一类别
For Each item In pAllItems
If item.IsValidItem Then
' 检查是否在排除列表中
Dim isExcluded As Boolean
isExcluded = False
Dim excludeCat As Variant
For Each excludeCat In pExcludeCategories
If item.category = CStr(excludeCat) Then
isExcluded = True
Exit For
End If
Next excludeCat
' 如果不在排除列表中,继续处理
If Not isExcluded Then
'
Dim categoryRequired As Boolean
If Trim(item.CategoryCondition) = "" Then
@@ -158,6 +190,7 @@ Private Sub DetermineRequiredCategories(productConditions As Object)
End If
End If
End If
End If
Next item
End Sub

View File

@@ -91,11 +91,13 @@ Public Sub ProcessOrdersToBIP()
Dim productModel As String
Dim quantity As String
Dim productCode As String
Dim componentPriority As String
orderNumber = Trim(orderSheet.Cells(i, 1).value) ' A列生产订单号
productModel = Trim(orderSheet.Cells(i, 2).value) ' B列产品型号
quantity = Trim(orderSheet.Cells(i, 3).value) ' C列数量
productCode = Trim(orderSheet.Cells(i, 4).value) ' D列产品编码
componentPriority = Trim(orderSheet.Cells(i, 5).value) ' E列部件优先
' 跳过空行
If orderNumber = "" And productModel = "" Then
@@ -122,7 +124,7 @@ Public Sub ProcessOrdersToBIP()
' 处理单个订单
outputRow = ProcessSingleOrder(orderNumber, productModel, quantity, productCode, _
BomExtractor, bipSheet, outputRow)
componentPriority, BomExtractor, bipSheet, outputRow)
processedCount = processedCount + 1
ContinueLoop:
@@ -155,6 +157,7 @@ End Sub
' productModel - 产品型号
' quantity - 生产数量
' productCode - 产品编码
' componentPriority - 部件优先标志("是"或"否"
' BomExtractor - BOM提取器对象
' bipSheet - BIP上传模板工作表
' startRow - 起始行号
@@ -164,6 +167,7 @@ Private Function ProcessSingleOrder(orderNumber As String, _
productModel As String, _
quantity As String, _
productCode As String, _
componentPriority As String, _
BomExtractor As BomExtractor, _
bipSheet As Worksheet, _
startRow As Long) As Long
@@ -172,6 +176,14 @@ Private Function ProcessSingleOrder(orderNumber As String, _
Dim currentRow As Long
currentRow = startRow
' 根据部件优先设置排除类别
BomExtractor.ClearExcludeCategories
If UCase(componentPriority) = "否" Or componentPriority = "0" Or componentPriority = "FALSE" Then
Dim excludeCats As New collection
excludeCats.Add "部件"
BomExtractor.SetExcludeCategories excludeCats
End If
' 解析产品型号
Dim parser As ProductModelParser
Set parser = New ProductModelParser