feat: add production order number column to BOM extraction output
All checks were successful
NTFY Notification / notify (push) Successful in 4s

- Add 生产订单号 as the first column in output (13 columns total)
- Read production order number from column A of input worksheet
- Only display production order number on first row for each product model
- Set material code column to text format to preserve leading zeros
- Update OutputColumns enum indices in M04_Config.bas
- Update ReadInputModels to return 2 columns (order number + model)
- Update ProcessSingleModel, GenerateMaterialRow, GenerateErrorRow signatures
- Update WriteExtractionResults to write 13 columns with text formatting

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
Misaka_Company
2026-02-24 14:28:24 +08:00
parent 0579a546d3
commit 24a54bd1ea
2 changed files with 104 additions and 72 deletions

View File

@@ -16,7 +16,7 @@
'
' 输出格式:
' - 纵向展开格式,每个物料一行
' - 列: 原始产品型号, azxs, bkxs, gclj, jycz, lcfw, fjgn,
' - 列: 生产订单号, 原始产品型号, azxs, bkxs, gclj, jycz, lcfw, fjgn,
' 物料类型, 物料名称, 物料编码, 物料数量, 提取备注
' ==============================================================================
Option Explicit
@@ -127,11 +127,14 @@ Public Function RunBOMExtraction() As String
End If
' 处理单个型号
Dim productionOrderNo As String
Dim modelString As String
modelString = CStr(inputModels(i, 1))
productionOrderNo = CStr(inputModels(i, 1)) ' Column A: 生产订单号
modelString = CStr(inputModels(i, 2)) ' Column B: 产品型号
Dim modelResults As Collection
Set modelResults = ProcessSingleModel(modelString, g_BOMWorkbook, g_Logger)
Set modelResults = ProcessSingleModel(modelString, g_BOMWorkbook, g_Logger, productionOrderNo)
' 合并结果
Dim result As Variant
@@ -164,7 +167,7 @@ Public Function RunBOMExtraction() As String
errorCount = 0
For Each result In allResults
If Len(CStr(result(12))) = 0 Then ' 第12列是备注
If Len(CStr(result(13))) = 0 Then ' 第13列是备注
successCount = successCount + 1
Else
errorCount = errorCount + 1
@@ -283,7 +286,7 @@ Private Function ReadInputModels(ByVal ws As Worksheet) As Variant
Dim colIdx As Long
colIdx = headerCell.Column
' 查找最后一行
' 查找最后一行(基于产品型号列)
Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.count, colIdx).End(xlUp).row
@@ -292,8 +295,9 @@ Private Function ReadInputModels(ByVal ws As Worksheet) As Variant
Exit Function
End If
' 读取数据到数组
ReadInputModels = ws.Range(ws.Cells(2, colIdx), ws.Cells(lastRow, colIdx)).Value
' 读取数据到数组返回2列生产订单号、产品型号
' 假设生产订单号在A列列1产品型号在colIdx列
ReadInputModels = ws.Range(ws.Cells(2, 1), ws.Cells(lastRow, colIdx)).Value
Exit Function
ErrorHandler:
@@ -321,7 +325,8 @@ End Function
Private Function ProcessSingleModel( _
ByVal modelString As String, _
ByVal bomWb As Workbook, _
ByVal logger As clsErrorLogger _
ByVal logger As clsErrorLogger, _
ByVal productionOrderNo As String _
) As Collection
On Error GoTo ErrorHandler
@@ -335,7 +340,7 @@ Private Function ProcessSingleModel( _
' 检查解析是否成功
If params.count = 0 Then
' 解析失败,添加错误行
results.Add GenerateErrorRow(modelString, "型号解析失败:型号格式不正确或缺少必要字段")
results.Add GenerateErrorRow(modelString, "型号解析失败:型号格式不正确或缺少必要字段", productionOrderNo, True)
Set ProcessSingleModel = results
Exit Function
End If
@@ -353,16 +358,21 @@ Private Function ProcessSingleModel( _
remarks = validation("message")
End If
' 生成物料行(第一条显示生产订单号,其余不显示)
Dim isFirstRow As Boolean
isFirstRow = True
Dim mat As Variant
For Each mat In allMaterials
Dim outputRow As Variant
outputRow = GenerateMaterialRow(modelString, params, mat, remarks)
outputRow = GenerateMaterialRow(modelString, params, mat, remarks, productionOrderNo, isFirstRow)
results.Add outputRow
isFirstRow = False
Next mat
' 如果没有匹配到任何物料,添加错误行
If allMaterials.count = 0 Then
results.Add GenerateErrorRow(modelString, "未匹配到任何物料")
results.Add GenerateErrorRow(modelString, "未匹配到任何物料", productionOrderNo, True)
End If
Set ProcessSingleModel = results
@@ -374,7 +384,7 @@ ErrorHandler:
"处理型号[" & modelString & "]失败: " & Err.Description, ""
End If
results.Add GenerateErrorRow(modelString, "系统错误: " & Err.Description)
results.Add GenerateErrorRow(modelString, "系统错误: " & Err.Description, productionOrderNo, True)
Set ProcessSingleModel = results
End Function
@@ -888,52 +898,64 @@ End Function
' params - 参数字典
' material - 物料信息字典
' remarks - 备注信息
' productionOrderNo - 生产订单号
' isFirstRow - 是否为第一条记录(用于控制生产订单号显示)
'
' 输出:
' Variant - 包含12列数据的数组
' Variant - 包含13列数据的数组
'
' 列定义:
' 1: 原始产品型号
' 2: azxs
' 3: bkxs
' 4: gclj
' 5: jycz
' 6: lcfw
' 7: fjgn
' 8: 物料类型
' 9: 物料名称
' 10: 物料编码
' 11: 物料数量
' 12: 提取备注
' 1: 生产订单号(仅第一条记录显示)
' 2: 原始产品型号
' 3: azxs
' 4: bkxs
' 5: gclj
' 6: jycz
' 7: lcfw
' 8: fjgn
' 9: 物料类型
' 10: 物料名称
' 11: 物料编码
' 12: 物料数量
' 13: 提取备注
' ------------------------------------------------------------------------------
Private Function GenerateMaterialRow( _
ByVal modelString As String, _
ByVal params As Object, _
ByVal material As Object, _
ByVal remarks As String _
ByVal remarks As String, _
ByVal productionOrderNo As String, _
ByVal isFirstRow As Boolean _
) As Variant
Dim result(1 To 12) As Variant
Dim result(1 To 13) As Variant
' 第1列: 原始产品型号
result(1) = modelString
' 第1列: 生产订单号(仅第一条记录显示)
If isFirstRow Then
result(1) = productionOrderNo
Else
result(1) = ""
End If
' 第2-7列: 参数值
result(2) = GetParamValue(params, "azxs")
result(3) = GetParamValue(params, "bkxs")
result(4) = GetParamValue(params, "gclj")
result(5) = GetParamValue(params, "jycz")
result(6) = GetParamValue(params, "lcfw")
result(7) = GetParamValue(params, "fjgn")
' 第2列: 原始产品型号
result(2) = modelString
' 第8-11列: 物料信息
result(8) = GetMaterialValue(material, "materialType")
result(9) = GetMaterialValue(material, "materialName")
result(10) = GetMaterialValue(material, "materialCode")
result(11) = GetMaterialValue(material, "materialQty")
' 第3-8列: 参数值
result(3) = GetParamValue(params, "azxs")
result(4) = GetParamValue(params, "bkxs")
result(5) = GetParamValue(params, "gclj")
result(6) = GetParamValue(params, "jycz")
result(7) = GetParamValue(params, "lcfw")
result(8) = GetParamValue(params, "fjgn")
' 第12列: 备注
result(12) = remarks & " " & GetMaterialValue(material, "remarks")
result(12) = Trim(result(12))
' 第9-12列: 物料信息
result(9) = GetMaterialValue(material, "materialType")
result(10) = GetMaterialValue(material, "materialName")
result(11) = GetMaterialValue(material, "materialCode")
result(12) = GetMaterialValue(material, "materialQty")
' 第13列: 备注
result(13) = remarks & " " & GetMaterialValue(material, "remarks")
result(13) = Trim(result(13))
GenerateMaterialRow = result
End Function
@@ -944,23 +966,28 @@ End Function
' 输入:
' modelString - 原始产品型号
' errorMessage - 错误消息
' productionOrderNo - 生产订单号
' isFirstRow - 是否为第一条记录(错误行总是显示生产订单号)
'
' 输出:
' Variant - 包含12列数据的数组(仅型号和备注有值)
' Variant - 包含13列数据的数组(仅生产订单号、型号和备注有值)
' ------------------------------------------------------------------------------
Private Function GenerateErrorRow( _
ByVal modelString As String, _
ByVal errorMessage As String _
ByVal errorMessage As String, _
ByVal productionOrderNo As String, _
ByVal isFirstRow As Boolean _
) As Variant
Dim result(1 To 12) As Variant
Dim result(1 To 13) As Variant
Dim i As Long
For i = 1 To 12
For i = 1 To 13
result(i) = ""
Next i
result(1) = modelString
result(12) = "错误: " & errorMessage
result(1) = productionOrderNo
result(2) = modelString
result(13) = "错误: " & errorMessage
GenerateErrorRow = result
End Function
@@ -1021,16 +1048,16 @@ Private Function WriteExtractionResults(ByVal results As Collection) As Workshee
' 写入表头
Dim headers As Variant
headers = Array("原始产品型号", "azxs", "bkxs", "gclj", "jycz", "lcfw", "fjgn", _
headers = Array("生产订单号", "原始产品型号", "azxs", "bkxs", "gclj", "jycz", "lcfw", "fjgn", _
"物料类型", "物料名称", "物料编码", "物料数量", "提取备注")
Dim c As Long
For c = 1 To 12
For c = 1 To 13
ws.Cells(1, c).Value = headers(c - 1)
Next c
' 格式化表头
With ws.Range("A1:L1")
With ws.Range("A1:M1")
.Font.Bold = True
.Interior.Color = RGB(217, 217, 217)
.HorizontalAlignment = xlCenter
@@ -1038,8 +1065,12 @@ Private Function WriteExtractionResults(ByVal results As Collection) As Workshee
' 写入数据
If results.count > 0 Then
' 先设置物料编码列第11列K列为文本格式
ws.Range("K2:K" & (results.count + 1)).NumberFormat = "@"
' 准备输出数组
Dim outputArr() As Variant
ReDim outputArr(1 To results.count, 1 To 12)
ReDim outputArr(1 To results.count, 1 To 13)
Dim i As Long
Dim result As Variant
@@ -1048,15 +1079,15 @@ Private Function WriteExtractionResults(ByVal results As Collection) As Workshee
result = results(i)
Dim j As Long
For j = 1 To 12
For j = 1 To 13
outputArr(i, j) = result(j)
Next j
Next i
ws.Range("A2").Resize(results.count, 12).Value = outputArr
ws.Range("A2").Resize(results.count, 13).Value = outputArr
' 格式化数据区域
With ws.Range("A2:L" & (results.count + 1))
With ws.Range("A2:M" & (results.count + 1))
.Borders.LineStyle = xlContinuous
.Borders.Weight = xlThin
End With
@@ -1064,13 +1095,13 @@ Private Function WriteExtractionResults(ByVal results As Collection) As Workshee
' 如果有错误备注,标红;如果有警告,标黄
For i = 1 To results.count
Dim remarkText As String
remarkText = CStr(outputArr(i, 12))
remarkText = CStr(outputArr(i, 13))
If Len(remarkText) > 0 Then
If InStr(remarkText, "错误") > 0 Then
ws.Cells(i + 1, 12).Interior.Color = RGB(255, 200, 200)
ws.Cells(i + 1, 13).Interior.Color = RGB(255, 200, 200)
ElseIf InStr(remarkText, "警告") > 0 Or InStr(remarkText, "已忽略") > 0 Then
ws.Cells(i + 1, 12).Interior.Color = RGB(255, 255, 200)
ws.Cells(i + 1, 13).Interior.Color = RGB(255, 255, 200)
End If
End If
Next i