仓储域完整设计(算法版)

一、仓储域的核心职责与业务边界

1. 业务定位

仓储域作为库存管理中心,负责管理商品入库、出库、调拨、盘点等核心仓储流程,确保库存数据的准确性和实时性,同时为销售域提供库存保障。

2. 核心职责

  • 库存管理:实时库存查询、库存调整、库存预留

  • 入库管理:采购入库、退货入库、调拨入库

  • 出库管理:销售出库、退货出库、调拨出库

  • 库存调拨:仓库之间的商品调拨

  • 库存盘点:定期盘点、差异调整

  • 库位管理:仓库内库位管理

  • 库存成本核算:移动加权平均成本计算

二、仓储域表结构ER设计

sql
-- 创建仓储域数据库
CREATE DATABASE inventory_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

USE inventory_db;

-- 1. 仓库表
CREATE TABLE warehouses (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    warehouse_code VARCHAR(50) NOT NULL UNIQUE COMMENT '仓库编码',
    warehouse_name VARCHAR(100) NOT NULL COMMENT '仓库名称',
    warehouse_type ENUM('中心仓', '区域仓', '门店仓', '虚拟仓') DEFAULT '中心仓',
    
    -- 位置信息
    address VARCHAR(500) COMMENT '仓库地址',
    contact_person VARCHAR(100) COMMENT '联系人',
    contact_phone VARCHAR(20) COMMENT '联系电话',
    
    -- 容量信息
    total_capacity DECIMAL(15,2) COMMENT '总容量',
    used_capacity DECIMAL(15,2) DEFAULT 0 COMMENT '已用容量',
    
    -- 状态控制
    status ENUM('启用', '停用', '维护中') DEFAULT '启用',
    is_active BOOLEAN DEFAULT TRUE,
    
    created_by VARCHAR(50) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    
    INDEX idx_warehouse_code (warehouse_code),
    INDEX idx_status (status)
) COMMENT '仓库表';

-- 2. 库位表
CREATE TABLE storage_locations (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    warehouse_id BIGINT NOT NULL,
    location_code VARCHAR(50) NOT NULL COMMENT '库位编码',
    location_name VARCHAR(100) NOT NULL COMMENT '库位名称',
    location_type ENUM('货架', '平面', '冷藏', '冷冻') DEFAULT '货架',
    
    -- 容量信息
    total_capacity DECIMAL(15,2) COMMENT '总容量',
    used_capacity DECIMAL(15,2) DEFAULT 0 COMMENT '已用容量',
    
    -- 位置信息
    area VARCHAR(50) COMMENT '区域',
    shelf VARCHAR(50) COMMENT '货架',
    level INT COMMENT '层数',
    position INT COMMENT '位置',
    
    -- 状态控制
    status ENUM('空置', '部分占用', '已满', '停用') DEFAULT '空置',
    
    created_by VARCHAR(50) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    
    FOREIGN KEY (warehouse_id) REFERENCES warehouses(id),
    UNIQUE KEY uk_warehouse_location (warehouse_id, location_code),
    INDEX idx_warehouse (warehouse_id),
    INDEX idx_status (status)
) COMMENT '库位表';

-- 3. 库存台账表(核心表)
CREATE TABLE inventory_ledger (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    product_id BIGINT NOT NULL,
    warehouse_id BIGINT NOT NULL,
    location_id BIGINT COMMENT '库位ID',
    
    -- 数量信息
    total_quantity DECIMAL(12,2) NOT NULL DEFAULT 0 COMMENT '总数量',
    available_quantity DECIMAL(12,2) NOT NULL DEFAULT 0 COMMENT '可用数量',
    reserved_quantity DECIMAL(12,2) NOT NULL DEFAULT 0 COMMENT '预留数量',
    in_transit_quantity DECIMAL(12,2) NOT NULL DEFAULT 0 COMMENT '在途数量',
    
    -- 成本信息
    cost_price DECIMAL(10,4) NOT NULL COMMENT '成本单价',
    total_cost DECIMAL(15,2) NOT NULL COMMENT '总成本',
    
    -- 批次信息
    batch_no VARCHAR(100) COMMENT '批次号',
    production_date DATE COMMENT '生产日期',
    expiry_date DATE COMMENT '有效期至',
    
    -- 状态控制
    inventory_status ENUM('正常', '临期', '过期', '冻结') DEFAULT '正常',
    
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    
    UNIQUE KEY uk_product_warehouse (product_id, warehouse_id, batch_no),
    INDEX idx_product (product_id),
    INDEX idx_warehouse (warehouse_id),
    INDEX idx_expiry (expiry_date),
    INDEX idx_status (inventory_status)
) COMMENT '库存台账表';

-- 4. 入库单表
CREATE TABLE inbound_orders (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    inbound_no VARCHAR(50) NOT NULL UNIQUE COMMENT '入库单号',
    inbound_type ENUM('采购入库', '退货入库', '调拨入库', '盘盈入库') DEFAULT '采购入库',
    warehouse_id BIGINT NOT NULL,
    
    -- 关联信息
    source_order_id BIGINT COMMENT '来源单号',
    source_order_type ENUM('采购验收', '销售退货', '调拨单') COMMENT '来源单类型',
    
    -- 状态控制
    inbound_status ENUM('待入库', '入库中', '部分入库', '已完成', '已取消') DEFAULT '待入库',
    
    -- 数量统计
    total_quantity DECIMAL(12,2) NOT NULL COMMENT '计划数量',
    actual_quantity DECIMAL(12,2) DEFAULT 0 COMMENT '实际数量',
    
    -- 时间信息
    expected_date DATE COMMENT '预计到货日期',
    inbound_date DATETIME COMMENT '实际入库时间',
    
    -- 审核信息
    created_by VARCHAR(50) NOT NULL,
    reviewed_by VARCHAR(50),
    reviewed_at DATETIME,
    
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    
    FOREIGN KEY (warehouse_id) REFERENCES warehouses(id),
    INDEX idx_inbound_no (inbound_no),
    INDEX idx_warehouse_status (warehouse_id, inbound_status),
    INDEX idx_expected_date (expected_date)
) COMMENT '入库单表';

-- 5. 入库单明细表
CREATE TABLE inbound_order_items (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    inbound_order_id BIGINT NOT NULL,
    product_id BIGINT NOT NULL,
    location_id BIGINT COMMENT '目标库位',
    
    -- 数量信息
    planned_quantity DECIMAL(10,2) NOT NULL COMMENT '计划数量',
    actual_quantity DECIMAL(10,2) NOT NULL COMMENT '实际数量',
    difference_quantity DECIMAL(10,2) DEFAULT 0 COMMENT '差异数量',
    
    -- 成本信息
    cost_price DECIMAL(10,4) NOT NULL COMMENT '成本单价',
    total_cost DECIMAL(15,2) NOT NULL COMMENT '总成本',
    
    -- 批次信息
    batch_no VARCHAR(100) COMMENT '批次号',
    production_date DATE COMMENT '生产日期',
    expiry_date DATE COMMENT '有效期至',
    
    -- 状态控制
    item_status ENUM('待入库', '已入库', '部分入库', '差异') DEFAULT '待入库',
    
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    
    FOREIGN KEY (inbound_order_id) REFERENCES inbound_orders(id) ON DELETE CASCADE,
    INDEX idx_inbound_product (inbound_order_id, product_id),
    INDEX idx_product (product_id)
) COMMENT '入库单明细表';

-- 6. 出库单表
CREATE TABLE outbound_orders (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    outbound_no VARCHAR(50) NOT NULL UNIQUE COMMENT '出库单号',
    outbound_type ENUM('销售出库', '退货出库', '调拨出库', '盘亏出库') DEFAULT '销售出库',
    warehouse_id BIGINT NOT NULL,
    
    -- 关联信息
    source_order_id BIGINT NOT NULL COMMENT '来源单号',
    source_order_type ENUM('销售订单', '采购退货', '调拨单') NOT NULL COMMENT '来源单类型',
    
    -- 状态控制
    outbound_status ENUM('待出库', '出库中', '部分出库', '已完成', '已取消') DEFAULT '待出库',
    
    -- 数量统计
    total_quantity DECIMAL(12,2) NOT NULL COMMENT '计划数量',
    actual_quantity DECIMAL(12,2) DEFAULT 0 COMMENT '实际数量',
    
    -- 时间信息
    expected_date DATE COMMENT '预计出库日期',
    outbound_date DATETIME COMMENT '实际出库时间',
    
    -- 审核信息
    created_by VARCHAR(50) NOT NULL,
    reviewed_by VARCHAR(50),
    reviewed_at DATETIME,
    
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    
    FOREIGN KEY (warehouse_id) REFERENCES warehouses(id),
    INDEX idx_outbound_no (outbound_no),
    INDEX idx_warehouse_status (warehouse_id, outbound_status),
    INDEX idx_source_order (source_order_type, source_order_id)
) COMMENT '出库单表';

-- 7. 出库单明细表
CREATE TABLE outbound_order_items (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    outbound_order_id BIGINT NOT NULL,
    product_id BIGINT NOT NULL,
    location_id BIGINT COMMENT '源库位',
    
    -- 数量信息
    planned_quantity DECIMAL(10,2) NOT NULL COMMENT '计划数量',
    actual_quantity DECIMAL(10,2) NOT NULL COMMENT '实际数量',
    difference_quantity DECIMAL(10,2) DEFAULT 0 COMMENT '差异数量',
    
    -- 成本信息
    cost_price DECIMAL(10,4) NOT NULL COMMENT '成本单价',
    total_cost DECIMAL(15,2) NOT NULL COMMENT '总成本',
    
    -- 批次信息
    batch_no VARCHAR(100) COMMENT '批次号',
    
    -- 状态控制
    item_status ENUM('待出库', '已出库', '部分出库', '差异') DEFAULT '待出库',
    
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    
    FOREIGN KEY (outbound_order_id) REFERENCES outbound_orders(id) ON DELETE CASCADE,
    INDEX idx_outbound_product (outbound_order_id, product_id),
    INDEX idx_product (product_id)
) COMMENT '出库单明细表';

-- 8. 库存调拨表
CREATE TABLE transfer_orders (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    transfer_no VARCHAR(50) NOT NULL UNIQUE COMMENT '调拨单号',
    from_warehouse_id BIGINT NOT NULL COMMENT '调出仓库',
    to_warehouse_id BIGINT NOT NULL COMMENT '调入仓库',
    
    -- 状态控制
    transfer_status ENUM('待调拨', '调拨中', '部分完成', '已完成', '已取消') DEFAULT '待调拨',
    
    -- 数量统计
    total_quantity DECIMAL(12,2) NOT NULL COMMENT '总数量',
    transferred_quantity DECIMAL(12,2) DEFAULT 0 COMMENT '已调拨数量',
    
    -- 时间信息
    expected_date DATE COMMENT '预计完成日期',
    transfer_date DATETIME COMMENT '实际调拨时间',
    
    -- 审核信息
    created_by VARCHAR(50) NOT NULL,
    reviewed_by VARCHAR(50),
    reviewed_at DATETIME,
    
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    
    FOREIGN KEY (from_warehouse_id) REFERENCES warehouses(id),
    FOREIGN KEY (to_warehouse_id) REFERENCES warehouses(id),
    INDEX idx_transfer_no (transfer_no),
    INDEX idx_from_warehouse (from_warehouse_id),
    INDEX idx_to_warehouse (to_warehouse_id)
) COMMENT '库存调拨表';

-- 9. 调拨单明细表
CREATE TABLE transfer_order_items (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    transfer_order_id BIGINT NOT NULL,
    product_id BIGINT NOT NULL,
    from_location_id BIGINT COMMENT '调出库位',
    to_location_id BIGINT COMMENT '调入库位',
    
    -- 数量信息
    transfer_quantity DECIMAL(10,2) NOT NULL COMMENT '调拨数量',
    actual_quantity DECIMAL(10,2) NOT NULL COMMENT '实际数量',
    
    -- 成本信息
    cost_price DECIMAL(10,4) NOT NULL COMMENT '成本单价',
    total_cost DECIMAL(15,2) NOT NULL COMMENT '总成本',
    
    -- 批次信息
    batch_no VARCHAR(100) COMMENT '批次号',
    
    -- 状态控制
    item_status ENUM('待调拨', '已调拨', '部分调拨') DEFAULT '待调拨',
    
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    
    FOREIGN KEY (transfer_order_id) REFERENCES transfer_orders(id) ON DELETE CASCADE,
    INDEX idx_transfer_product (transfer_order_id, product_id),
    INDEX idx_product (product_id)
) COMMENT '调拨单明细表';

-- 10. 盘点单表
CREATE TABLE inventory_counts (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    count_no VARCHAR(50) NOT NULL UNIQUE COMMENT '盘点单号',
    warehouse_id BIGINT NOT NULL,
    count_type ENUM('全盘', '循环盘点', '抽盘') DEFAULT '全盘',
    
    -- 状态控制
    count_status ENUM('待盘点', '盘点中', '待审核', '已完成', '已取消') DEFAULT '待盘点',
    
    -- 统计信息
    total_items INT DEFAULT 0 COMMENT '总商品数',
    counted_items INT DEFAULT 0 COMMENT '已盘点商品数',
    difference_items INT DEFAULT 0 COMMENT '差异商品数',
    
    -- 时间信息
    count_date DATE NOT NULL COMMENT '盘点日期',
    start_time DATETIME COMMENT '开始时间',
    end_time DATETIME COMMENT '结束时间',
    
    -- 审核信息
    created_by VARCHAR(50) NOT NULL,
    counted_by VARCHAR(50) COMMENT '盘点人',
    reviewed_by VARCHAR(50) COMMENT '审核人',
    reviewed_at DATETIME COMMENT '审核时间',
    
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    
    FOREIGN KEY (warehouse_id) REFERENCES warehouses(id),
    INDEX idx_count_no (count_no),
    INDEX idx_warehouse_date (warehouse_id, count_date)
) COMMENT '盘点单表';

-- 11. 盘点单明细表
CREATE TABLE inventory_count_items (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    inventory_count_id BIGINT NOT NULL,
    product_id BIGINT NOT NULL,
    location_id BIGINT COMMENT '库位ID',
    
    -- 数量信息
    system_quantity DECIMAL(10,2) NOT NULL COMMENT '系统数量',
    actual_quantity DECIMAL(10,2) NOT NULL COMMENT '实际数量',
    difference_quantity DECIMAL(10,2) NOT NULL COMMENT '差异数量',
    
    -- 成本信息
    cost_price DECIMAL(10,4) NOT NULL COMMENT '成本单价',
    difference_amount DECIMAL(15,2) NOT NULL COMMENT '差异金额',
    
    -- 批次信息
    batch_no VARCHAR(100) COMMENT '批次号',
    
    -- 差异处理
    difference_reason ENUM('盘盈', '盘亏', '计量误差', '记录错误') COMMENT '差异原因',
    handling_method ENUM('调整库存', '待核实', '无需处理') DEFAULT '调整库存',
    
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    
    FOREIGN KEY (inventory_count_id) REFERENCES inventory_counts(id) ON DELETE CASCADE,
    INDEX idx_count_product (inventory_count_id, product_id),
    INDEX idx_product (product_id)
) COMMENT '盘点单明细表';

-- 12. 库存预留表
CREATE TABLE inventory_reservations (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    reservation_no VARCHAR(50) NOT NULL UNIQUE COMMENT '预留单号',
    product_id BIGINT NOT NULL,
    warehouse_id BIGINT NOT NULL,
    
    -- 关联信息
    source_order_id BIGINT NOT NULL COMMENT '来源单号',
    source_order_type ENUM('销售订单', '调拨单') NOT NULL COMMENT '来源单类型',
    
    -- 数量信息
    reserved_quantity DECIMAL(10,2) NOT NULL COMMENT '预留数量',
    released_quantity DECIMAL(10,2) DEFAULT 0 COMMENT '已释放数量',
    used_quantity DECIMAL(10,2) DEFAULT 0 COMMENT '已使用数量',
    
    -- 时间信息
    reserved_time DATETIME NOT NULL COMMENT '预留时间',
    expiry_time DATETIME COMMENT '过期时间',
    
    -- 状态控制
    reservation_status ENUM('有效', '部分使用', '已使用', '已过期', '已取消') DEFAULT '有效',
    
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    
    FOREIGN KEY (warehouse_id) REFERENCES warehouses(id),
    INDEX idx_reservation_no (reservation_no),
    INDEX idx_product_warehouse (product_id, warehouse_id),
    INDEX idx_source_order (source_order_type, source_order_id),
    INDEX idx_expiry (expiry_time)
) COMMENT '库存预留表';

-- 13. 库存成本流水表
CREATE TABLE inventory_cost_flow (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    product_id BIGINT NOT NULL,
    warehouse_id BIGINT NOT NULL,
    
    -- 成本信息
    old_cost_price DECIMAL(10,4) COMMENT '原成本单价',
    new_cost_price DECIMAL(10,4) NOT NULL COMMENT '新成本单价',
    change_type ENUM('采购入库', '库存调整', '成本重算') NOT NULL,
    
    -- 影响信息
    affect_quantity DECIMAL(10,2) NOT NULL COMMENT '影响数量',
    total_cost_change DECIMAL(15,2) NOT NULL COMMENT '总成本变动',
    
    -- 关联信息
    source_id VARCHAR(100) COMMENT '来源单号',
    
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    
    INDEX idx_product_warehouse (product_id, warehouse_id),
    INDEX idx_created_at (created_at)
) COMMENT '库存成本流水表';

-- 14. 临期商品预警表
CREATE TABLE expiry_warnings (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    product_id BIGINT NOT NULL,
    warehouse_id BIGINT NOT NULL,
    batch_no VARCHAR(100) COMMENT '批次号',
    
    -- 时间信息
    production_date DATE COMMENT '生产日期',
    expiry_date DATE NOT NULL COMMENT '过期日期',
    days_to_expiry INT NOT NULL COMMENT '距离过期天数',
    
    -- 数量信息
    quantity DECIMAL(10,2) NOT NULL COMMENT '数量',
    
    -- 预警级别
    warning_level ENUM('正常', '关注', '警告', '紧急') DEFAULT '正常',
    
    -- 处理状态
    handling_status ENUM('待处理', '已处理', '无需处理') DEFAULT '待处理',
    
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    
    INDEX idx_product_warehouse (product_id, warehouse_id),
    INDEX idx_expiry_date (expiry_date),
    INDEX idx_warning_level (warning_level)
) COMMENT '临期商品预警表';

三、仓储域核心业务算法

1. 库存管理算法

库存查询算法:

text
输入:商品ID、仓库ID
处理流程:
1. 查询库存台账:
   - 按商品ID和仓库ID查询库存记录
   - 计算可用数量 = 总数量 - 预留数量
2. 考虑批次信息:
   - 按批次查询库存明细
   - 优先返回临期批次信息
3. 返回库存详情(总数量、可用数量、预留数量、成本信息)

库存预留算法:

text
输入:商品ID、仓库ID、预留数量、来源单号、来源类型
处理流程:
1. 验证库存可用性:
   - 可用数量 >= 预留数量
2. 创建库存预留记录:
   - 生成唯一预留单号
   - 记录预留时间和过期时间
3. 更新库存台账:
   - 预留数量 += 新增预留数量
   - 可用数量 -= 新增预留数量
4. 返回预留结果

库存释放算法:

text
输入:预留单号、释放数量
处理流程:
1. 查询预留记录验证有效性
2. 更新预留记录:
   - 已释放数量 += 释放数量
   - 如果全部释放,更新状态为已取消
3. 更新库存台账:
   - 预留数量 -= 释放数量
   - 可用数量 += 释放数量
4. 记录释放操作日志

2. 入库管理算法

采购入库算法:

text
输入:采购验收单信息(商品、数量、成本、批次)
处理流程:
1. 创建入库单:
   - 生成入库单号
   - 关联采购验收单
2. 验证入库商品:
   - 检查商品是否存在
   - 验证数量是否匹配
3. 分配库位:
   - 根据商品属性和库存策略分配合适库位
4. 执行入库操作:
   - 更新库存台账数量
   - 计算新的加权平均成本
   - 记录成本流水
5. 更新入库单状态
6. 发布库存变更事件

退货入库算法:

text
输入:销售退货单信息(商品、数量、批次)
处理流程:
1. 验证退货商品:
   - 检查商品是否可二次销售
   - 验证退货数量
2. 创建入库单(退货入库类型)
3. 分配库位(可能分配到特定区域)
4. 执行入库操作:
   - 更新库存台账
   - 按原成本价入库
5. 更新入库单状态
6. 发布库存变更事件

3. 出库管理算法

销售出库算法:

text
输入:销售订单信息(商品、数量、仓库)
处理流程:
1. 创建出库单:
   - 生成出库单号
   - 关联销售订单
2. 验证库存可用性:
   - 检查可用数量是否满足
   - 考虑批次先进先出
3. 分配出库批次:
   - 按先进先出原则选择批次
   - 记录出库批次信息
4. 执行出库操作:
   - 更新库存台账数量
   - 扣减预留数量
   - 记录出库成本
5. 更新出库单状态
6. 发布库存变更事件

调拨出库算法:

text
输入:调拨单信息(商品、数量、调出仓库)
处理流程:
1. 验证调出仓库库存
2. 创建出库单(调拨出库类型)
3. 执行出库操作:
   - 更新调出仓库库存
   - 记录在途数量
4. 更新调拨单状态
5. 发布库存变更事件

4. 库存调拨算法

调拨单创建算法:

text
输入:调拨请求(调出仓库、调入仓库、商品列表)
处理流程:
1. 验证调出仓库库存:
   - 检查各商品可用数量
2. 创建调拨单:
   - 生成调拨单号
   - 记录调拨明细
3. 预留调出库存:
   - 创建库存预留记录
4. 返回调拨单信息

调拨执行算法:

text
输入:调拨单ID
处理流程:
1. 执行调出操作:
   - 创建调拨出库单
   - 扣减调出仓库库存
2. 执行调入操作:
   - 创建调拨入库单
   - 增加调入仓库库存
3. 更新调拨单状态
4. 释放库存预留
5. 发布库存变更事件

5. 库存盘点算法

盘点单创建算法:

text
输入:盘点请求(仓库、盘点类型、盘点范围)
处理流程:
1. 生成盘点单:
   - 生成盘点单号
   - 记录盘点范围
2. 生成盘点任务:
   - 根据盘点范围生成盘点明细
   - 记录系统库存数量
3. 锁定盘点区域(可选)
4. 返回盘点单信息

盘点数据录入算法:

text
输入:盘点单ID、商品实际数量
处理流程:
1. 验证盘点单状态
2. 更新盘点明细:
   - 记录实际数量
   - 计算差异数量
3. 更新盘点单统计:
   - 已盘点商品数
   - 差异商品数
4. 如果全部盘点完成,更新盘点单状态为待审核

盘点差异处理算法:

text
输入:盘点单ID、审核结果
处理流程:
1. 验证盘点单状态为待审核
2. 审核通过时:
   - 生成库存调整单
   - 执行库存调整
   - 记录成本影响
3. 更新盘点单状态为已完成
4. 发布库存调整事件

6. 成本核算算法

移动加权平均成本算法:

text
输入:商品ID、仓库ID
处理流程:
1. 查询成本流水:
   - 获取该商品在该仓库的所有成本记录
2. 计算加权平均成本:
   - 总成本 = ∑(每次入库数量 × 入库单价)
   - 总数量 = ∑每次入库数量
   - 加权平均成本 = 总成本 ÷ 总数量
3. 更新库存台账成本信息
4. 记录成本流水
5. 返回当前成本单价

出库成本计算算法:

text
输入:出库商品、数量
处理流程:
1. 获取当前加权平均成本
2. 计算出库成本:
   - 出库成本 = 出库数量 × 当前成本单价
3. 记录出库成本信息
4. 返回出库成本金额

四、仓储域事件处理算法

1. 事件发布算法

库存变更事件发布算法:

text
输入:库存变更信息(商品、仓库、变更数量、变更类型)
处理流程:
1. 构建事件对象:
   - 生成唯一事件ID
   - 封装库存变更详情
2. 发送到Kafka库存变更主题
3. 记录事件发布日志

成本更新事件发布算法:

text
输入:成本变更信息(商品、仓库、新旧成本)
处理流程:
1. 构建事件对象:
   - 生成唯一事件ID
   - 封装成本变更详情
2. 发送到Kafka成本更新主题
3. 记录事件发布日志

临期预警事件发布算法:

text
输入:临期商品信息(商品、批次、过期天数)
处理流程:
1. 构建事件对象:
   - 生成唯一事件ID
   - 封装临期预警详情
2. 发送到Kafka临期预警主题
3. 记录事件发布日志

2. 事件订阅处理算法

采购验收事件处理算法:

text
输入:PurchaseAcceptanceCompletedEvent
处理流程:
1. 解析验收商品信息
2. 创建采购入库单
3. 执行入库操作
4. 更新库存成本
5. 发布库存变更事件

销售订单事件处理算法:

text
输入:SalesOrderCompletedEvent
处理流程:
1. 解析销售商品信息
2. 创建库存预留记录
3. 更新可用库存数量
4. 记录预留操作日志

销售退货事件处理算法:

text
输入:SalesReturnCompletedEvent
处理流程:
1. 解析退货商品信息
2. 创建退货入库单
3. 执行入库操作
4. 更新库存数量
5. 发布库存变更事件

五、仓储域与其他域的交互

1. 与采购域的交互

采购入库协同:

text
提供接口:
1. 采购验收完成通知接口
2. 入库状态查询接口

数据流:
采购验收完成 → 创建入库单 → 执行入库 → 更新库存 → 通知采购域

2. 与销售域的交互

库存查询服务:

text
提供接口:
1. 实时库存查询接口
2. 库存预留接口
3. 库存释放接口

数据流:
销售订单创建 → 库存预留 → 订单支付 → 库存扣减 → 订单取消 → 库存释放

库存校验算法:

text
输入:商品ID、仓库ID、需求数量
处理流程:
1. 查询实时库存:
   - 可用数量 = 总数量 - 预留数量
2. 返回库存校验结果:
   - 充足:可用数量 >= 需求数量
   - 不足:可用数量 < 需求数量
   - 具体可用数量

3. 与财务域的交互

成本数据提供:

text
通过事件提供:
- 库存成本更新事件:提供最新成本信息
- 库存变更事件:提供库存价值变动

数据内容:
- 商品成本单价和总成本
- 库存数量和价值变动
- 盘点差异的成本影响

4. 与商品域的交互

商品信息依赖:

text
依赖数据:
- 商品基础信息(名称、规格、单位)
- 商品仓储属性(重量、体积、存储要求)
- 保质期信息

服务接口:
1. 商品详情查询接口
2. 商品仓储属性查询接口

六、仓储域库存策略算法

1. 库位分配算法

智能库位分配算法:

text
输入:入库商品信息(商品属性、数量、批次)
处理流程:
1. 分析商品特性:
   - 存储要求(常温、冷藏、冷冻)
   - 商品分类和关联性
   - 出入库频率
2. 筛选合适库位:
   - 匹配存储要求
   - 考虑库位容量
   - 优先选择空置或部分占用库位
3. 分配库位:
   - 记录库位分配结果
   - 更新库位使用状态
4. 返回分配的库位信息

2. 批次管理算法

先进先出算法:

text
输入:出库商品、数量
处理流程:
1. 查询商品所有批次:
   - 按生产日期或入库时间排序
2. 选择出库批次:
   - 优先选择最早批次的库存
   - 考虑临期预警
3. 计算各批次出库数量
4. 返回出库批次分配方案

临期预警算法:

text
输入:无
处理流程:
1. 扫描库存台账:
   - 计算各批次距离过期天数
2. 判断预警级别:
   - 紧急:距离过期 < 7天
   - 警告:距离过期 7-15天
   - 关注:距离过期 15-30天
3. 生成预警记录
4. 发布临期预警事件

3. 库存优化算法

安全库存计算算法:

text
输入:商品ID、仓库ID
处理流程:
1. 获取历史销售数据
2. 计算需求特征:
   - 日均销售量
   - 销售波动性
3. 考虑补货周期:
   - 供应商交货时间
   - 内部处理时间
4. 计算安全库存:
   - 安全库存 = 日均销量 × (补货周期 + 安全天数)
5. 返回安全库存建议

库存周转分析算法:

text
输入:时间范围、商品/仓库维度
处理流程:
1. 计算库存周转率:
   - 销售成本 ÷ 平均库存
2. 分析库存结构:
   - 快消品、慢消品分类
   - 库存龄分析
3. 识别优化机会:
   - 高库存低周转商品
   - 缺货风险商品
4. 生成库存优化建议

七、仓储域业务规则

1. 库存操作规则

text
库存预留规则:
- 销售订单创建时预留库存
- 预留有效期通常为30分钟
- 超时未支付自动释放

库存扣减规则:
- 订单支付成功后扣减实际库存
- 按先进先出原则选择批次
- 同时扣减预留数量

2. 成本核算规则

text
成本计算规则:
- 采用移动加权平均法
- 每次入库重新计算成本
- 出库按当前成本计价

成本调整规则:
- 盘点差异调整成本
- 系统重算更新成本
- 成本流水完整记录

3. 盘点处理规则

text
盘点差异处理:
- 小差异自动调整
- 大差异需要审核
- 重大差异需要调查

盘点周期规则:
- 全盘:每月一次
- 循环盘点:每周部分商品
- 抽盘:随机抽查

八、仓储域配置参数

1. 业务参数配置

yaml
inventory:
  reservation:
    expiry-minutes: 30        # 预留过期时间
    auto-release: true        # 是否自动释放
  cost:
    method: moving-average    # 成本计算方法
    auto-update: true         # 是否自动更新成本
  warning:
    expiry-days: [7, 15, 30] # 临期预警天数
    auto-scan: true           # 是否自动扫描
  allocation:
    strategy: fifo            # 分配策略(先进先出)
    auto-location: true       # 是否自动分配库位

2. 事件配置

yaml
kafka:
  topics:
    inventory-updated: inventory.updated
    inventory-cost-updated: inventory.cost.updated
    expiry-warning: inventory.expiry.warning

总结

仓储域的核心价值

  1. 库存准确性:实时准确的库存数据管理

  2. 成本控制:精确的库存成本核算

  3. 运营效率:优化的库存操作流程

  4. 风险预警:及时的库存异常预警

  5. 协同支持:为各业务域提供库存支撑

与上下游域的协同

  • 对采购域:接收采购商品入库管理

  • 对销售域:提供库存保障和预留服务

  • 对财务域:提供成本核算数据

  • 对商品域:依赖商品基础信息

关键技术特性

  • 实时库存:高并发的库存查询和操作

  • 成本核算:准确的移动加权平均成本计算

  • 智能预警:自动的临期和异常预警

  • 批次管理:完善的批次追溯体系

通过这套设计,仓储域能够为整个进销存系统提供稳定、准确、高效的库存管理服务,支撑各业务域的顺畅运作。

 posted on 2025-10-22 17:48  xibuhaohao  阅读(1)  评论(0)    收藏  举报