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

227 lines
8.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# BIPUploadModule 流程图文档
## 模块概述
**模块名**: BIPUploadModule
**功能**: 处理产品订单数据提取BOM后生成[BIP上传模板]格式数据
**主入口**: ProcessOrdersToBIP
## ProcessOrdersToBIP 流程图(简化版)
```mermaid
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 子流程(详细版)
> 注:以下为技术人员提供详细流程图
```mermaid
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 批量写入流程
```mermaid
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流程图方括号转义问题 |