Files
AutoBOM/docs/执行计划-部件数量核对.md
Misaka_Company 8545177bd5 docs: add ComponentInventoryCheckModule flowchart documentation
Add comprehensive flowchart documentation for the component inventory check module:
- Business flowchart (for non-technical users)
- Technical flowchart (for developers)
- Detailed inventory allocation process
- BOM parsing process
- Data processing sequence diagram
- Data structure documentation and execution examples

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-03 09:32:07 +08:00

9.5 KiB
Raw Blame History

执行计划:部件数量核对功能

一、需求概述

1.1 功能描述

自动核对产品订单中"部件"类物料的库存情况,当库存不足时,按订单顺序将超出部分的订单的"部件优先"字段标记为"否"。

1.2 数据源

[产品订单]工作表

  • 表头位置第1行
  • 数据起始行第2行
  • 关键列
    • B列产品型号
    • C列产品数量
    • E列部件优先输出字段

[现存量]工作表

  • 表头位置第3行
  • 数据起始行第4行
  • 关键列
    • B列物料编码对应BOM中的66代码
    • J列结存主数量库存数量

二、业务逻辑

2.1 核心流程

1. 读取所有订单 → 2. 解析型号提取BOM → 3. 识别部件物料
↓
4. 统计部件总需求 → 5. 查询库存 → 6. 库存充足性检查
↓
7. 按订单顺序分配库存 → 8. 修改部件优先字段

2.2 计算规则

部件总需求量

部件总需求 = Σ(订单i的BOM中部件数量 × 订单i的产品数量)

示例

订单1产品数量=2部件A的BOM数量=1 → 需求 = 1 × 2 = 2
订单2产品数量=2部件A的BOM数量=1 → 需求 = 1 × 2 = 2
订单3产品数量=2部件A的BOM数量=1 → 需求 = 1 × 2 = 2
--------------------------------------------------------
部件A总需求 = 2 + 2 + 2 = 6
部件A库存 = 5
库存不足 = 6 - 5 = 1

2.3 分配策略

原则:按订单自上而下的顺序分配库存

订单 需求量 分配前库存 分配后库存 部件优先
订单1 2 5 3 保持不变
订单2 2 3 1 保持不变
订单3 2 1 -1不足 改为"否"

三、处理规则

3.1 正常情况

  • 订单包含"部件"物料,库存充足 → 保持原值
  • 订单包含"部件"物料,库存不足 → 改为"否"
  • 订单不包含"部件"物料 → 保持原值不变

3.2 异常情况

  • 部件在[现存量]中找不到 → 报错提示,终止处理
  • 型号解析失败 → 跳过该订单,记录错误
  • 未匹配到任何物料 → 跳过该订单(无部件)

3.3 字段修改规则

  • 基于现有值进行修改(不清空原有值)
  • 只修改E列"部件优先"字段
  • 修改格式:10TRUEFALSE 均可识别

四、数据结构设计

4.1 订单数据结构

Type OrderInfo
    RowNumber As Long          ' 行号
    ProductModel As String     ' 产品型号
    Quantity As Long           ' 产品数量
    ComponentCode As String    ' 部件66编码
    ComponentQty As Double     ' 部件BOM数量
    HasComponent As Boolean    ' 是否包含部件
    ParseError As String       ' 解析错误信息
End Type

4.2 部件库存结构

Type ComponentInventory
    ComponentCode As String    ' 部件66编码
    TotalDemand As Double      ' 总需求量
    AvailableStock As Double   ' 可用库存
    IsShortage As Boolean      ' 是否短缺
End Type

五、实现方案

5.1 新建模块

文件名ComponentInventoryCheckModule.bas

主要过程

Public Sub CheckComponentInventory()
    ' 主入口程序
End Sub

5.2 核心函数

5.2.1 读取订单数据

Private Function LoadOrderData(ws As Worksheet) As Collection
    ' 返回 Collection(Of OrderInfo)
    ' 读取[产品订单]的B、C列数据
End Function

5.2.2 读取库存数据

Private Function LoadInventoryData(ws As Worksheet) As Object
    ' 返回 Dictionary(物料编码 -> 库存数量)
    ' 读取[现存量]的B、J列数据
End Function

5.2.3 解析订单BOM

Private Sub ParseOrderBOM(orderInfo As OrderInfo, _
                          bomExtractor As BomExtractor, _
                          parser As ProductModelParser)
    ' 解析型号提取BOM
    ' 识别"部件"类别物料
    ' 填充 orderInfo.ComponentCode 和 orderInfo.ComponentQty
End Sub

5.2.4 统计部件需求

Private Function CalculateComponentDemand( _
    orders As Collection) As Object
    ' 返回 Dictionary(部件编码 -> ComponentInventory)
    ' 累加所有订单的部件需求量
End Function

5.2.5 检查库存充足性

Private Sub ValidateInventory( _
    componentDemands As Object, _
    inventoryData As Object)
    ' 检查每个部件的库存是否充足
    ' 如果找不到或不足,报错提示
End Sub

5.2.6 分配库存并标记

Private Sub AllocateInventory( _
    orders As Collection, _
    componentDemands As Object, _
    orderSheet As Worksheet)
    ' 按订单顺序分配库存
    ' 库存不足时修改E列"部件优先"为"否"
End Sub

六、详细实现步骤

6.1 主流程CheckComponentInventory

1. 获取工作表对象
   ├─ [产品订单]工作表
   ├─ [现存量]工作表
   └─ [平台配置清单]工作表

2. 初始化BOM提取器
   └─ 加载BOM数据

3. 读取库存数据到字典
   └─ Dictionary(66编码 -> 库存数量)

4. 读取订单数据
   └─ Collection(Of OrderInfo)

5. 解析所有订单的BOM
   └─ 识别部件填充ComponentCode和ComponentQty

6. 统计部件总需求
   └─ Dictionary(部件编码 -> ComponentInventory)

7. 验证库存
   └─ 检查部件是否存在于[现存量]中

8. 按订单顺序分配库存
   └─ 修改E列"部件优先"字段

9. 输出结果统计
   └─ MsgBox显示处理结果

6.2 分配算法(伪代码)

For Each order In orders
    If order.HasComponent Then
        Dim demand As ComponentInventory
        demand = componentDemands(order.ComponentCode)

        Dim requiredQty As Double
        requiredQty = order.ComponentQty * order.Quantity

        If demand.AvailableStock >= requiredQty Then
            ' 库存充足,保持原值
            demand.AvailableStock = demand.AvailableStock - requiredQty
        Else
            ' 库存不足,标记为"否"
            orderSheet.Cells(order.RowNumber, 5).Value = "否"
            demand.AvailableStock = demand.AvailableStock - requiredQty
        End If
    End If
Next order

七、边界情况处理

7.1 无部件的订单

条件订单的BOM中没有"类别=部件"的物料
处理跳过该订单E列保持原值

7.2 多个订单使用不同部件

订单1部件A
订单2部件B
处理分别统计A和B的需求独立核算库存

7.3 库存为0的情况

条件:[现存量]中某部件的结存主数量 = 0
处理:所有需要该部件的订单都标记为"否"

7.4 产品数量为0的情况

条件订单的C列产品数量 = 0
处理:该订单的部件需求 = 0不影响库存

7.5 部件优先字段原有值

可能的值:"是"、"否"、1、0、TRUE、FALSE、空
处理:基于现有值修改,不清空

八、测试用例

8.1 基本功能测试

测试场景 订单数 部件 总需求 库存 预期结果
库存充足 3 A(1) 6 10 全部保持原值
库存不足 3 A(1) 6 5 第3个订单改为"否"
库存刚好 3 A(1) 6 6 全部保持原值
无部件订单 2 - - - 保持原值
库存为0 2 A(1) 4 0 全部改为"否"

8.2 异常情况测试

测试场景 预期行为
部件在[现存量]中不存在 报错提示,终止处理
型号解析失败 跳过该订单,记录错误
[产品订单]为空 提示无数据,退出
[现存量]为空 报错提示,退出

8.3 边界值测试

测试场景 输入值 预期结果
产品数量为1 所有订单数量=1 正常计算
产品数量为大数 订单数量=1000 正常计算
部件BOM数量为小数 0.5 正确计算总需求
库存数量为小数 2.5 正确判断库存

九、用户界面设计

9.1 执行入口

建议在主界面添加按钮:

[部件库存核对]

9.2 结果提示

执行完成后显示:

✓ 部件库存核对完成!

处理订单数10
包含部件订单8
库存充足订单6
库存不足订单2

耗时0.50秒

9.3 错误提示

格式:

✗ 部件库存核对失败!

错误信息:
- 订单第5行部件 '661234' 在[现存量]中未找到

请检查数据后重试。

十、实施步骤

  1. 创建新模块

    • 文件名:ComponentInventoryCheckModule.bas
    • 位置:VBA/Modules/
  2. 实现核心函数

    • LoadOrderData
    • LoadInventoryData
    • ParseOrderBOM
    • CalculateComponentDemand
    • ValidateInventory
    • AllocateInventory
  3. 实现主流程

    • CheckComponentInventory
  4. 测试验证

    • 基本功能测试
    • 异常情况测试
    • 边界值测试
  5. 集成到主界面

    • 添加按钮或菜单项

十一、风险评估

风险 影响 缓解措施
库存数据不准确 导致错误的分配结果 执行前提示用户确认库存数据
订单量大导致性能问题 处理时间长 优化算法,使用批量操作
BOM解析失败 无法识别部件 记录错误日志,跳过该订单
部件编码不一致 无法匹配库存 严格验证,报错提示

是否批准此执行计划?确认后我将开始代码实现。