进销存系统库存管理入门:库存数量的计算与维护

进销存系统库存管理入门:库存数量的计算与维护

到这一篇为止,你会明显感觉到:
系统开始有“约束”和“规则”了。


一、为什么库存不能“随便改一个数字”?

很多初学者在系统里会这么设计库存:

quantity = 100

然后在界面上:

  • 入库 → quantity + 10
  • 出库 → quantity - 5

表面看没问题,但这是一个严重的系统设计错误。


二、库存的本质是什么?

库存不是一个“数”,而是一个结果

库存 = 所有入库 − 所有出库

也就是说:

  • 库存是“计算出来的”
  • 不是“随便填出来的”

这就是为什么真实系统中:
几乎没有“手动改库存”的功能


三、库存变化一定来源于“业务行为”

库存只允许被以下行为影响:

行为 影响
采购入库 库存增加
销售出库 库存减少
盘点调整 特殊处理

不允许:

直接在界面写:库存 = 999
直接 UPDATE stock SET quantity = ?


四、库存管理的最小逻辑模型

我们当前系统采用的是简化模型

  • 每个商品只有一条库存记录
  • 库存数量只通过业务操作变动

表结构回顾:

CREATE TABLE stock (
    id INT PRIMARY KEY IDENTITY(1,1),
    product_id INT NOT NULL,
    quantity INT NOT NULL DEFAULT 0,
    update_time DATETIME DEFAULT GETDATE()
);

五、入库 / 出库的核心思想

入库逻辑

当前库存 + 入库数量

出库逻辑(必须校验)

当前库存 - 出库数量 >= 0

如果不满足:

不允许出库


六、实现“库存增加”逻辑(入库)

private void IncreaseStock(int productId, int amount)
{
    string sql = @"
        UPDATE stock
        SET quantity = quantity + @amount,
            update_time = GETDATE()
        WHERE product_id = @productId";

    using (SqlConnection conn = new SqlConnection(connectionString))
    {
        conn.Open();

        SqlCommand cmd = new SqlCommand(sql, conn);
        cmd.Parameters.AddWithValue("@amount", amount);
        cmd.Parameters.AddWithValue("@productId", productId);

        cmd.ExecuteNonQuery();
    }
}

注意:
不是先查 → 再算 → 再更新
而是数据库内完成计算


七、实现“库存减少”并防止负数

先查询当前库存

private int GetCurrentStock(int productId)
{
    string sql = "SELECT quantity FROM stock WHERE product_id = @productId";

    using (SqlConnection conn = new SqlConnection(connectionString))
    {
        conn.Open();

        SqlCommand cmd = new SqlCommand(sql, conn);
        cmd.Parameters.AddWithValue("@productId", productId);

        return Convert.ToInt32(cmd.ExecuteScalar());
    }
}

出库前校验

private bool DecreaseStock(int productId, int amount)
{
    int currentStock = GetCurrentStock(productId);

    if (currentStock < amount)
    {
        MessageBox.Show("库存不足,无法出库!");
        return false;
    }

    string sql = @"
        UPDATE stock
        SET quantity = quantity - @amount,
            update_time = GETDATE()
        WHERE product_id = @productId";

    using (SqlConnection conn = new SqlConnection(connectionString))
    {
        conn.Open();

        SqlCommand cmd = new SqlCommand(sql, conn);
        cmd.Parameters.AddWithValue("@amount", amount);
        cmd.Parameters.AddWithValue("@productId", productId);

        cmd.ExecuteNonQuery();
    }

    return true;
}

库存为负,是系统级 Bug,不是数据问题


posted @ 2025-10-29 11:31  元始天尊123  阅读(5)  评论(0)    收藏  举报