350 lines
12 KiB
Markdown
350 lines
12 KiB
Markdown
# 库房管理方案数据流
|
||
|
||
## 1. 数据流总览
|
||
|
||
库房管理模块的数据流以 `库存现存量` 为当前结果表,以 `库存变动流水` 为全过程追溯表。所有入库、出库、移库、盘点确认都不能直接只改现存量,必须同步写入业务单据和库存流水。
|
||
|
||
```mermaid
|
||
flowchart LR
|
||
A["库房主数据"] --> C["库位主数据"]
|
||
B["物料主文件"] --> D["库存现存量"]
|
||
C --> D
|
||
E["入库单"] --> P1["库存增加过程"]
|
||
F["出库单"] --> P2["库存扣减过程"]
|
||
G["移库单"] --> P3["库存移库过程"]
|
||
H["盘点单"] --> P4["盘点确认过程"]
|
||
P1 --> D
|
||
P2 --> D
|
||
P3 --> D
|
||
P4 --> D
|
||
P1 --> L["库存变动流水"]
|
||
P2 --> L
|
||
P3 --> L
|
||
P4 --> L
|
||
D --> Q1["物料综合查询"]
|
||
D --> Q2["物料正向查询"]
|
||
D --> Q3["库位逆向查询"]
|
||
L --> Q4["库存追溯查询"]
|
||
```
|
||
|
||
## 2. 核心数据对象
|
||
|
||
| 数据对象 | 数据来源 | 写入时机 | 主要用途 |
|
||
| --- | --- | --- | --- |
|
||
| 库房主表 | 库房管理页面 | 新增、编辑库房时 | 定义仓储空间一级单位 |
|
||
| 库位主表 | 库位管理页面 | 新增、编辑库位时 | 定义物料实际存放位置 |
|
||
| 物料主文件 | 现有物料维护 | 物料建档时 | 提供物料编码、名称、图号、规格、单位 |
|
||
| 入库单主表/明细表 | 入库页面 | 入库提交成功时 | 记录入库业务来源 |
|
||
| 出库单主表/明细表 | 出库页面 | 出库提交成功时 | 记录出库业务来源 |
|
||
| 移库单主表/明细表 | 移库页面 | 移库提交成功时 | 记录库位之间库存移动 |
|
||
| 盘点单主表/明细表 | 盘点页面 | 创建盘点、录入实盘、确认盘点时 | 记录账面、实盘和差异 |
|
||
| 库存现存量 | 公共库存过程 | 入库、出库、移库、盘点确认时 | 查询当前库存结果 |
|
||
| 库存变动流水 | 公共库存过程 | 每次库存数量变化时 | 追溯库存变化原因 |
|
||
|
||
## 3. 主数据流
|
||
|
||
主数据先建立库房,再建立库位,物料主文件沿用现有数据。库存业务发生前,库位必须归属一个有效库房。
|
||
|
||
```mermaid
|
||
flowchart TD
|
||
A["维护库房"] --> B["写入 仓储管理_库房主表"]
|
||
B --> C["维护库位"]
|
||
C --> D["写入 仓储管理_库位主表"]
|
||
E["现有物料维护"] --> F["库存管理_物料主文件_基本"]
|
||
D --> G["入库/出库/移库/盘点可选择库位"]
|
||
F --> G
|
||
```
|
||
|
||
数据规则:
|
||
|
||
1. `库位主表.库房流水号` 必须关联 `库房主表.库房流水号`。
|
||
2. 同一库房下 `库位编号` 不允许重复。
|
||
3. 停用库位不允许在新业务中选择。
|
||
4. 已有库存的库位不允许直接删除。
|
||
|
||
## 4. 入库数据流
|
||
|
||
入库数据流从入库页面开始,先形成入库单据,再调用公共库存增加过程,最后更新库存现存量并写流水。
|
||
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant UI as 入库页面
|
||
participant API as MESCommonBase.ashx
|
||
participant SP as 入库存储过程
|
||
participant ADD as 仓储管理_库存_增加
|
||
participant STOCK as 库存现存量
|
||
participant LOG as 库存变动流水
|
||
|
||
UI->>API: 提交物料、批次、库房、库位、入库数量
|
||
API->>SP: name=仓储管理_入库_增加
|
||
SP->>SP: 写入入库单主表/明细表
|
||
SP->>ADD: 调用库存增加过程
|
||
ADD->>STOCK: 存在则累加,不存在则新增
|
||
ADD->>LOG: 写入变动类型=入库,数量为正数
|
||
ADD-->>SP: 返回变动后库存
|
||
SP-->>API: 返回成功
|
||
API-->>UI: 刷新入库记录和库存查询
|
||
```
|
||
|
||
入库关键字段:
|
||
|
||
| 字段 | 去向 |
|
||
| --- | --- |
|
||
| 物料流水号 | 入库明细表、库存现存量、库存变动流水 |
|
||
| 库房流水号 | 入库明细表、库存现存量、库存变动流水 |
|
||
| 库位流水号 | 入库明细表、库存现存量、库存变动流水 |
|
||
| 批次编号 | 入库明细表、库存现存量、库存变动流水 |
|
||
| 入库数量 | 入库明细表,库存流水正数 |
|
||
| 入库单号 | 入库主表,库存流水业务单号 |
|
||
|
||
## 5. 出库数据流
|
||
|
||
出库必须先查询可用库存,再指定具体库位扣减。后端以数据库当前库存为准重新校验,不能只相信前端显示数量。
|
||
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant UI as 出库页面
|
||
participant QUERY as 可用库存查询
|
||
participant API as MESCommonBase.ashx
|
||
participant SP as 出库存储过程
|
||
participant SUB as 仓储管理_库存_扣减
|
||
participant STOCK as 库存现存量
|
||
participant LOG as 库存变动流水
|
||
|
||
UI->>QUERY: 按物料查询可用库位库存
|
||
QUERY-->>UI: 返回库房、库位、批次、可用数量
|
||
UI->>API: 提交出库库位和出库数量
|
||
API->>SP: name=仓储管理_出库_增加
|
||
SP->>SP: 写入出库单主表/明细表
|
||
SP->>SUB: 调用库存扣减过程
|
||
SUB->>STOCK: 锁定库存并校验可用数量
|
||
SUB->>STOCK: 扣减库存数量
|
||
SUB->>LOG: 写入变动类型=出库,数量为负数
|
||
SP-->>API: 返回成功或库存不足
|
||
API-->>UI: 刷新出库记录和库存查询
|
||
```
|
||
|
||
出库控制点:
|
||
|
||
1. 出库数量必须大于 0。
|
||
2. 出库数量不能超过数据库当前可用库存。
|
||
3. 同一物料多库位时,必须传入 `库位流水号` 或 `库存流水号`。
|
||
4. 库存扣减后为 0 时,建议保留库存现存量记录,查询默认过滤 0 库存。
|
||
|
||
## 6. 移库数据流
|
||
|
||
移库是同一事务内完成“原库位扣减”和“目标库位增加”。前端不能拆成两个接口。
|
||
|
||
```mermaid
|
||
flowchart TD
|
||
A["选择原库存记录"] --> B["输入移库数量"]
|
||
B --> C["选择目标库房/目标库位"]
|
||
C --> D["提交移库单"]
|
||
D --> E["写移库单主表/明细表"]
|
||
E --> F{"原库位库存是否足够"}
|
||
F -->|否| X["回滚并提示库存不足"]
|
||
F -->|是| G["原库位库存减少"]
|
||
G --> H["目标库位库存增加"]
|
||
H --> I["写库存流水:移出"]
|
||
H --> J["写库存流水:移入"]
|
||
I --> K["提交事务"]
|
||
J --> K
|
||
```
|
||
|
||
移库流水规则:
|
||
|
||
| 流水 | 变动类型 | 库位 | 数量 |
|
||
| --- | --- | --- | --- |
|
||
| 第一条 | 移出 | 原库位 | 负数 |
|
||
| 第二条 | 移入 | 目标库位 | 正数 |
|
||
|
||
## 7. 盘点数据流
|
||
|
||
盘点分为生成账面、录入实盘、确认差异三段。只有确认差异时才改变库存。
|
||
|
||
```mermaid
|
||
flowchart TD
|
||
A["创建盘点单"] --> B["按库房/库位/物料范围读取库存现存量"]
|
||
B --> C["生成盘点明细:记录账面数量"]
|
||
C --> D["盘点人员录入实盘数量"]
|
||
D --> E["系统计算差异数量=实盘-账面"]
|
||
E --> F{"差异是否为0"}
|
||
F -->|是| G["明细标记无差异"]
|
||
F -->|否| H["填写差异原因和处理方式"]
|
||
H --> I["主管确认盘点"]
|
||
I --> J{"差异方向"}
|
||
J -->|盘盈| K["调用库存增加过程"]
|
||
J -->|盘亏| L["调用库存扣减过程"]
|
||
K --> M["写库存流水"]
|
||
L --> M
|
||
G --> N["盘点单已确认"]
|
||
M --> N
|
||
```
|
||
|
||
盘点数据状态:
|
||
|
||
| 阶段 | 写入表 | 是否影响库存 |
|
||
| --- | --- | --- |
|
||
| 创建盘点 | 盘点单主表、盘点单明细表 | 否 |
|
||
| 录入实盘 | 盘点单明细表 | 否 |
|
||
| 确认盘盈 | 库存现存量、库存变动流水 | 是,增加 |
|
||
| 确认盘亏 | 库存现存量、库存变动流水 | 是,减少 |
|
||
|
||
## 8. 综合查询数据流
|
||
|
||
综合查询不从单据实时汇总,而是读取 `库存现存量`,再关联物料、库房、库位,并可继续钻取库存流水。
|
||
|
||
```mermaid
|
||
flowchart LR
|
||
A["查询条件:物料/库房/库位/是否有库存"] --> B["库存现存量"]
|
||
B --> C["关联物料主文件"]
|
||
B --> D["关联库房主表"]
|
||
B --> E["关联库位主表"]
|
||
C --> F["按物料汇总总库存"]
|
||
D --> F
|
||
E --> F
|
||
F --> G["取库存最多库位作为主库位"]
|
||
G --> H["库存综合查询主表"]
|
||
H --> I["点击主库位:库位明细"]
|
||
H --> J["点击物料:库存流水"]
|
||
```
|
||
|
||
综合查询输出:
|
||
|
||
| 输出字段 | 来源 |
|
||
| --- | --- |
|
||
| 物料编码、物料名称、图号或型号、规格、单位 | 物料主文件/库存现存量冗余字段 |
|
||
| 总库存 | 库存现存量按物料汇总 |
|
||
| 主库房、主库位 | 库存数量最大的库位 |
|
||
| 库位明细 | 库存现存量按物料展开 |
|
||
| 最近变动 | 库存变动流水 |
|
||
|
||
## 9. 正向查询和逆向查询数据流
|
||
|
||
### 9.1 物料正向查询
|
||
|
||
正向查询回答:某个物料在哪些库位。
|
||
|
||
```mermaid
|
||
flowchart LR
|
||
A["输入物料编码/名称/图号"] --> B["定位物料流水号"]
|
||
B --> C["查询库存现存量"]
|
||
C --> D["关联库房/库位"]
|
||
D --> E["返回库房、库位、批次、库存数量"]
|
||
```
|
||
|
||
### 9.2 库位逆向查询
|
||
|
||
逆向查询回答:某个库位放了哪些物料。
|
||
|
||
```mermaid
|
||
flowchart LR
|
||
A["选择库房/库位"] --> B["定位库位流水号"]
|
||
B --> C["查询库存现存量"]
|
||
C --> D["关联物料主文件"]
|
||
D --> E["返回物料、图号、规格、批次、库存数量"]
|
||
```
|
||
|
||
## 10. 数据一致性控制
|
||
|
||
| 控制点 | 说明 |
|
||
| --- | --- |
|
||
| 单事务 | 入库、出库、移库、盘点确认必须在数据库事务内完成 |
|
||
| 防负库存 | 出库、移库、盘亏都必须重新读取数据库库存并校验 |
|
||
| 流水必写 | 只要库存数量变化,就必须写库存变动流水 |
|
||
| 单据关联 | 库存流水必须记录业务类型、业务单号、业务主表流水号、业务明细流水号 |
|
||
| 库位精确 | 库存扣减必须精确到库位,不能只按物料扣减 |
|
||
| 0 库存保留 | 库存为 0 的现存量记录可保留,查询默认过滤 |
|
||
| 历史追溯 | 查询当前库存看现存量,查变化原因看库存流水 |
|
||
|
||
## 11. 数据落表顺序
|
||
|
||
### 11.1 入库落表顺序
|
||
|
||
1. 校验物料、库房、库位、数量。
|
||
2. 写入入库单主表。
|
||
3. 写入入库单明细表。
|
||
4. 调用库存增加过程。
|
||
5. 更新或新增库存现存量。
|
||
6. 写入库存变动流水。
|
||
7. 提交事务。
|
||
|
||
### 11.2 出库落表顺序
|
||
|
||
1. 校验物料、库位、数量。
|
||
2. 写入出库单主表。
|
||
3. 写入出库单明细表。
|
||
4. 调用库存扣减过程。
|
||
5. 锁定库存现存量并校验可用数量。
|
||
6. 扣减库存现存量。
|
||
7. 写入库存变动流水。
|
||
8. 提交事务。
|
||
|
||
### 11.3 移库落表顺序
|
||
|
||
1. 校验原库位、目标库位、移库数量。
|
||
2. 写入移库单主表。
|
||
3. 写入移库单明细表。
|
||
4. 锁定原库位库存并扣减。
|
||
5. 更新或新增目标库位库存。
|
||
6. 写入移出流水。
|
||
7. 写入移入流水。
|
||
8. 提交事务。
|
||
|
||
### 11.4 盘点确认落表顺序
|
||
|
||
1. 读取盘点单明细。
|
||
2. 校验盘点单状态为待确认。
|
||
3. 按明细计算差异。
|
||
4. 无差异只确认明细。
|
||
5. 盘盈调用库存增加过程。
|
||
6. 盘亏调用库存扣减过程。
|
||
7. 写库存变动流水。
|
||
8. 更新盘点单状态为已确认。
|
||
9. 提交事务。
|
||
|
||
## 12. 前端页面数据流
|
||
|
||
```mermaid
|
||
flowchart TD
|
||
A["页面 created 初始化"] --> B["读取库房下拉"]
|
||
A --> C["读取启用库位"]
|
||
A --> D["读取库存汇总表"]
|
||
E["用户输入查询条件"] --> F["CreateData 构建 param 字符串"]
|
||
F --> G["ExecDatabase POST MESCommonBase.ashx"]
|
||
G --> H["后端按 name 路由存储过程"]
|
||
H --> I["返回中文字段结果集"]
|
||
I --> J["el-table 展示中文字段"]
|
||
J --> K["点击物料/库位"]
|
||
K --> L["再次查询明细或流水"]
|
||
```
|
||
|
||
前端传参要求:
|
||
|
||
| 参数 | 来源 |
|
||
| --- | --- |
|
||
| UserID | Cookie 当前用户 |
|
||
| ModularID | 当前路由路径 |
|
||
| name | 中文接口名称 |
|
||
| type | 查询为 1,增删改为 2,批量为 7 |
|
||
| param | `key=value&key2=value2` 字符串 |
|
||
|
||
## 13. 推荐接口数据流名称
|
||
|
||
| 页面动作 | name |
|
||
| --- | --- |
|
||
| 查询库房 | 仓储管理_库房_查询 |
|
||
| 查询库位 | 仓储管理_库位_查询 |
|
||
| 入库提交 | 仓储管理_入库_增加 |
|
||
| 出库提交 | 仓储管理_出库_增加 |
|
||
| 移库提交 | 仓储管理_库存_移库 |
|
||
| 创建盘点 | 仓储管理_库存盘点_创建 |
|
||
| 录入实盘 | 仓储管理_库存盘点_实盘_编辑 |
|
||
| 确认盘点 | 仓储管理_库存盘点_确认 |
|
||
| 综合查询 | 仓储管理_库存_综合查询 |
|
||
| 物料正向查询 | 仓储管理_库存_物料正向查询 |
|
||
| 库位逆向查询 | 仓储管理_库存_库位逆向查询 |
|
||
| 库存流水查询 | 仓储管理_库存_变动流水_查询 |
|
||
|
||
修改人:Ld 修改时间:2026-07-29 10:42:45
|