进销存系统采购入库功能实现
进销存系统采购入库功能实现(C# + 数据库)
如果说库存是“结果”,
那采购就是第一个真正改变库存的业务源头。
一、什么是采购?
在进销存系统中:
采购 = 从供应商买东西,放进仓库
它一定包含三个核心要素:
- 买了什么
- 买了多少
- 什么时候买的
二、为什么必须有“采购单”?
不能只做:
IncreaseStock(productId, 100);
原因:
- 无法追溯来源
- 无法审计
- 无法统计
所有库存变化,都必须有“单据”支撑
三、采购单数据结构设计
采购单主表(purchase)
CREATE TABLE purchase (
id INT PRIMARY KEY IDENTITY(1,1),
purchase_no VARCHAR(50) NOT NULL UNIQUE,
create_time DATETIME DEFAULT GETDATE(),
remark VARCHAR(200)
);
采购明细表(purchase_item)
CREATE TABLE purchase_item (
id INT PRIMARY KEY IDENTITY(1,1),
purchase_id INT NOT NULL,
product_id INT NOT NULL,
quantity INT NOT NULL
);
四、采购入库的完整流程
用户填写采购单
↓
保存采购单
↓
保存采购明细
↓
更新库存
这是一个完整的业务闭环
五、保存采购单
private int CreatePurchase(string remark)
{
string sql = @"
INSERT INTO purchase(purchase_no, remark)
VALUES(@no, @remark);
SELECT SCOPE_IDENTITY();";
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.Parameters.AddWithValue("@no", "CG" + DateTime.Now.Ticks);
cmd.Parameters.AddWithValue("@remark", remark);
return Convert.ToInt32(cmd.ExecuteScalar());
}
}
六、保存采购明细并更新库存
private void AddPurchaseItem(int purchaseId, int productId, int quantity)
{
string sql = @"
INSERT INTO purchase_item(purchase_id, product_id, quantity)
VALUES(@pid, @productId, @qty)";
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.Parameters.AddWithValue("@pid", purchaseId);
cmd.Parameters.AddWithValue("@productId", productId);
cmd.Parameters.AddWithValue("@qty", quantity);
cmd.ExecuteNonQuery();
}
// 采购入库 → 增加库存
IncreaseStock(productId, quantity);
}
七、采购如何“联动库存”?
关键点只有一句话:
库存永远不直接操作,只响应业务
采购单存在 → 库存增加
采购单不存在 → 库存不变
八、本篇小结(系统第一次真正联动)
到这里,你已经完成了:
- 第一个业务单据
- 库存的合法来源
- 数据之间的因果关系
你的系统已经具备:
- 可追溯性
- 业务闭环
- 扩展基础

浙公网安备 33010602011771号