diff --git a/docs/BIPUploadModule流程图.md b/docs/BIPUploadModule流程图.md new file mode 100644 index 0000000..eb80938 --- /dev/null +++ b/docs/BIPUploadModule流程图.md @@ -0,0 +1,226 @@ +# BIPUploadModule 流程图文档 + +## 模块概述 + +**模块名**: BIPUploadModule +**功能**: 处理产品订单数据,提取BOM后生成[BIP上传模板]格式数据 +**主入口**: ProcessOrdersToBIP + +## ProcessOrdersToBIP 流程图(简化版) + +```mermaid +flowchart TD + Start([开始处理]) --> Init["初始化
1. 获取工作表
2. 加载BOM库"] + + Init --> Loop["循环处理每个订单"] + + Loop --> Read["读取订单信息
- 生产订单号
- 产品型号
- 数量
- 产品编码
- 部件优先标志"] + + Read --> Parse["解析产品型号
提取规格参数"] + + Parse --> Extract["提取BOM物料
根据规格参数匹配物料库"] + + Extract --> CheckPriority{"部件优先=否?"} + CheckPriority -->|是| SkipComponent["排除'部件'类别
只提取子类别物料"] + CheckPriority -->|否| KeepAll["保留所有物料"] + SkipComponent --> Generate + KeepAll --> Generate["生成BIP上传数据
- 订单信息
- 物料清单
- 行号编码"] + + 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["清空排除类别
ClearExcludeCategories"] + + ClearExclude --> CheckPriority{"部件优先?"} + CheckPriority -->|否/0/FALSE| AddExclude["创建排除类别集合
添加: 部件"] + AddExclude --> SetExclude["设置排除类别"] + SetExclude --> ParseModel + CheckPriority -->|是| ParseModel["解析产品型号
ProductModelParser.Parse"] + + ParseModel --> CheckParse{"解析成功?"} + CheckParse -->|否| CreateError1["创建错误行数据
备注: 解析失败信息"] + CreateError1 --> AddError1["添加到outputData"] --> End1([返回]) + + CheckParse -->|是| ExtractBOM["提取BOM
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行数据
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["创建二维数组
resultData1 to rowCount, 1 to 10"] + + CreateArray --> StartLoop["开始循环: i = 1 to rowCount"] + StartLoop --> GetRowArray["获取行数组 rowArray = outputDatai"] + + GetRowArray --> FillArray["填充二维数组
resultDatai, 1 to 10 = rowArray1 to 10"] + FillArray --> NextLoop{"i++ 还有数据?"} + NextLoop -->|是| StartLoop + NextLoop -->|否| WriteSheet["一次性写入工作表
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流程图方括号转义问题 |