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

392 lines
9.5 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.
# 执行计划:部件数量核对功能
## 一、需求概述
### 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列"部件优先"字段**
- 修改格式:`是``否``1``0``TRUE``FALSE` 均可识别
---
## 四、数据结构设计
### 4.1 订单数据结构
```vba
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 部件库存结构
```vba
Type ComponentInventory
ComponentCode As String ' 部件66编码
TotalDemand As Double ' 总需求量
AvailableStock As Double ' 可用库存
IsShortage As Boolean ' 是否短缺
End Type
```
---
## 五、实现方案
### 5.1 新建模块
**文件名**`ComponentInventoryCheckModule.bas`
**主要过程**
```vba
Public Sub CheckComponentInventory()
' 主入口程序
End Sub
```
### 5.2 核心函数
#### 5.2.1 读取订单数据
```vba
Private Function LoadOrderData(ws As Worksheet) As Collection
' 返回 Collection(Of OrderInfo)
' 读取[产品订单]的B、C列数据
End Function
```
#### 5.2.2 读取库存数据
```vba
Private Function LoadInventoryData(ws As Worksheet) As Object
' 返回 Dictionary(物料编码 -> 库存数量)
' 读取[现存量]的B、J列数据
End Function
```
#### 5.2.3 解析订单BOM
```vba
Private Sub ParseOrderBOM(orderInfo As OrderInfo, _
bomExtractor As BomExtractor, _
parser As ProductModelParser)
' 解析型号提取BOM
' 识别"部件"类别物料
' 填充 orderInfo.ComponentCode 和 orderInfo.ComponentQty
End Sub
```
#### 5.2.4 统计部件需求
```vba
Private Function CalculateComponentDemand( _
orders As Collection) As Object
' 返回 Dictionary(部件编码 -> ComponentInventory)
' 累加所有订单的部件需求量
End Function
```
#### 5.2.5 检查库存充足性
```vba
Private Sub ValidateInventory( _
componentDemands As Object, _
inventoryData As Object)
' 检查每个部件的库存是否充足
' 如果找不到或不足,报错提示
End Sub
```
#### 5.2.6 分配库存并标记
```vba
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 分配算法(伪代码)
```vba
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解析失败 | 无法识别部件 | 记录错误日志,跳过该订单 |
| 部件编码不一致 | 无法匹配库存 | 严格验证,报错提示 |
---
**是否批准此执行计划?确认后我将开始代码实现。**