Files
AutoBOM/docs/BIPUploadModule流程图.md
Misaka f3047bccb8 docs: add BIPUploadModule flowchart documentation
Add comprehensive flowchart documentation for BIPUploadModule:
- Simplified main flow diagram for management review
- Detailed ProcessOrdersToBIP flowchart
- ProcessSingleOrder sub-process flowchart
- WriteBatchData batch write flowchart
- Data structure specifications
- Key features and performance optimizations
- Execution examples (normal and error cases)
- Related modules and dependencies

Documentation uses Mermaid diagrams for visualization
with proper bracket escaping for compatibility.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-01 23:25:04 +08:00

8.2 KiB
Raw Permalink Blame History

BIPUploadModule 流程图文档

模块概述

模块名: BIPUploadModule 功能: 处理产品订单数据提取BOM后生成[BIP上传模板]格式数据 主入口: ProcessOrdersToBIP

ProcessOrdersToBIP 流程图(简化版)

flowchart TD
    Start([开始处理]) --> Init["初始化<br/>1. 获取工作表<br/>2. 加载BOM库"]

    Init --> Loop["循环处理每个订单"]

    Loop --> Read["读取订单信息<br/>- 生产订单号<br/>- 产品型号<br/>- 数量<br/>- 产品编码<br/>- 部件优先标志"]

    Read --> Parse["解析产品型号<br/>提取规格参数"]

    Parse --> Extract["提取BOM物料<br/>根据规格参数匹配物料库"]

    Extract --> CheckPriority{"部件优先=否?"}
    CheckPriority -->|是| SkipComponent["排除'部件'类别<br/>只提取子类别物料"]
    CheckPriority -->|否| KeepAll["保留所有物料"]
    SkipComponent --> Generate
    KeepAll --> Generate["生成BIP上传数据<br/>- 订单信息<br/>- 物料清单<br/>- 行号编码"]

    Generate --> Collect["收集到内存集合"]

    Collect --> NextOrder{"还有订单?"}
    NextOrder -->|是| Loop
    NextOrder -->|否| BatchWrite["批量写入[BIP上传模板]"]

    BatchWrite --> Format["格式化表格"]

    Format --> End([完成])

    style Init fill:#e1f5e1
    style Parse fill:#fff3cd
    style Extract fill:#d1ecf1
    style Generate fill:#d1ecf1
    style BatchWrite fill:#f8d7da
    style End fill:#e1f5e1

ProcessSingleOrder 子流程(详细版)

注:以下为技术人员提供详细流程图

flowchart TD
    Start([开始 ProcessSingleOrder]) --> ClearExclude["清空排除类别<br/>ClearExcludeCategories"]

    ClearExclude --> CheckPriority{"部件优先?"}
    CheckPriority -->|否/0/FALSE| AddExclude["创建排除类别集合<br/>添加: 部件"]
    AddExclude --> SetExclude["设置排除类别"]
    SetExclude --> ParseModel
    CheckPriority -->|是| ParseModel["解析产品型号<br/>ProductModelParser.Parse"]

    ParseModel --> CheckParse{"解析成功?"}
    CheckParse -->|否| CreateError1["创建错误行数据<br/>备注: 解析失败信息"]
    CreateError1 --> AddError1["添加到outputData"] --> End1([返回])

    CheckParse -->|是| ExtractBOM["提取BOM<br/>BomExtractor.ExtractBom"]
    ExtractBOM --> GetErrors["获取错误信息摘要"]

    GetErrors --> CheckMatch{"匹配到物料?"}
    CheckMatch -->|否| SetError1["设置备注: 未匹配到任何物料"]
    SetError1 --> CreateError2["创建空记录行数据"]
    CreateError2 --> AddError2["添加到outputData"] --> End2([返回])

    CheckMatch -->|是| InitLine["初始化行号索引 lineIndex = 1"]
    InitLine --> StartLoop["开始循环物料"]

    StartLoop --> GetItem["获取物料项"]
    GetItem --> InitNote["初始化备注 = 提取错误"]

    InitNote --> CheckItemError{"物料有错误?"}
    CheckItemError -->|是| AppendError["追加物料错误信息"]
    CheckItemError -->|否| CreateRow
    AppendError --> CreateRow["创建BIP行数据<br/>CreateBIPRowArray"]

    CreateRow --> AddRow["添加到outputData"]
    AddRow --> IncLine["lineIndex++"]
    IncLine --> NextLoop{"还有物料?"}
    NextLoop -->|是| StartLoop
    NextLoop -->|否| End3([返回])

WriteBatchData 批量写入流程

flowchart TD
    Start([开始 WriteBatchData]) --> CheckData{"outputData为空?"}
    CheckData -->|是| End1([直接返回])
    CheckData -->|否| GetRowCount["获取行数 rowCount"]

    GetRowCount --> CreateArray["创建二维数组<br/>resultData1 to rowCount, 1 to 10"]

    CreateArray --> StartLoop["开始循环: i = 1 to rowCount"]
    StartLoop --> GetRowArray["获取行数组 rowArray = outputDatai"]

    GetRowArray --> FillArray["填充二维数组<br/>resultDatai, 1 to 10 = rowArray1 to 10"]
    FillArray --> NextLoop{"i++ 还有数据?"}
    NextLoop -->|是| StartLoop
    NextLoop -->|否| WriteSheet["一次性写入工作表<br/>A2单元格.Resize rowCount, 10"]

    WriteSheet --> End([完成])

数据结构说明

BIP上传模板字段 (10列)

列号 字段名 说明 数据来源
1 来源单据号(生产订单号) 订单唯一标识 [产品订单] A列
2 产品编码 产品代码 [产品订单] D列
3 生产数量 生产数量 [产品订单] C列
4 行号 BOM行号 = 7000 + 索引 自动生成7001, 7002...
5 材料编码 物料66编码 BOM提取结果
6 供应方式 固定值 "一般发料"
7 需用日期 日期 当天日期 Date
8 发料组织 固定值 "重庆布莱迪仪器仪表有限公司"
9 计划出库数量 数量 与生产数量一致
10 备注 异常信息 BOM提取错误/异常

[产品订单] 工作表结构 (5列)

列号 字段名 说明 必填
A 生产订单号 订单唯一标识
B 产品型号 产品完整型号
C 数量 生产数量
D 产品编码 产品代码
E 部件优先 是否优先提取部件类别

关键特性

1. 性能优化

  • 批量写入: 使用数组一次性写入所有数据,而非逐个单元格写入
  • 内存缓存: 所有数据先收集到Collection对象最后统一输出
  • 预期性能提升: 10-100倍取决于数据量

2. 部件优先功能

  • 部件优先 = "否"/"0"/"FALSE"时:
    • 排除"部件"类别的物料
    • 只提取"部件"的子类别物料(如"接头"、"弹性元件"等)
  • 部件优先 = "是"或其他值时:
    • 正常提取所有物料,包括"部件"类别及其子类别

3. 错误处理

  • 必填字段验证: 生产订单号、产品型号、数量
  • 解析失败处理: 记录错误信息到备注列
  • BOM提取异常: 记录匹配失败和异常信息
  • 空行处理: 自动跳过完全空白的行

4. 数据完整性

  • 每次运行前清空旧数据(保留表头)
  • 自动创建[BIP上传模板]工作表(如不存在)
  • 行号自动生成7001, 7002, 7003...
  • 日期自动填充为当天日期

执行示例

正常流程示例

输入: [产品订单] 3行数据
  - 订单001, 型号MD-100, 数量10, 编码P001, 部件优先=是
  - 订单002, 型号MD-200, 数量20, 编码P002, 部件优先=否
  - 订单003, 型号MD-300, 数量30, 编码P003, 部件优先=是

处理流程:
  1. 读取3行订单数据
  2. 逐个解析产品型号
  3. 根据部件优先设置提取BOM
  4. 订单001: 提取5种物料包括部件
  5. 订单002: 提取4种物料排除部件只提取子类别
  6. 订单003: 提取6种物料包括部件
  7. 批量写入15行数据到[BIP上传模板]
  8. 显示完成信息: 处理3个订单生成15行BOM数据

输出: [BIP上传模板] 15行数据

异常处理示例

输入: [产品订单] 包含异常数据
  - 订单A01, 型号INVALID, 数量5     ← 型号解析失败
  - 订单A02, 型号MD-100, 数量0      ← 未匹配到任何物料
  - 订单A03, 型号MD-200, 数量10     ← 正常提取3种物料

输出:
  第1行: 订单A01, ..., 备注: "解析失败: 无效的型号格式"
  第2行: 订单A02, ..., 备注: "未匹配到任何物料"
  第3-5行: 订单A03, 3种物料数据

相关模块

依赖的类模块

  • BomExtractor: BOM提取器负责从平台配置清单中提取匹配的物料
  • ProductModelParser: 产品型号解析器,解析型号字符串为结构化条件
  • BomItem: BOM物料项数据模型
  • ConditionEvaluator: 条件评估器,评估选择条件和类别条件

相关模块

  • MainModule: 主控模块处理产品型号提取和BOM匹配
    • 类似的处理逻辑
    • 输出到[BOM提取结果]工作表
    • 支持部件优先功能
    • 使用相同的批量写入优化

版本历史

版本 日期 说明
1.0 2026-02-01 初始版本实现基本的订单处理和BOM提取功能
1.1 2026-02-01 添加部件优先功能,支持排除特定类别
1.2 2026-02-01 性能优化,使用数组批量写入替代逐个单元格写入
1.3 2026-02-01 修复Mermaid流程图方括号转义问题