Python实现超市进销存管理系统攻略
1. 系统设计
超市进销存管理系统主要包含以下几个模块:
- 商品管理
- 进货管理
- 销售管理
- 库存管理
- 报表统计
其中,商品管理模块主要负责商品的添加、修改、删除和查询;进货管理模块主要负责进货单的添加、查询以及进货单与商品库存的更新;销售管理模块主要负责销售单的添加、查询以及销售单与商品库存的更新;库存管理模块主要负责商品库存的查询和更新;报表统计模块主要负责商品销售情况的统计和报表生成。
2. 数据库设计
为了方便管理和操作,我们需要使用数据库来保存商品、进货单、销售单和库存等数据。
在本系统中,我们采用SQLite作为数据库引擎,使用Python标准库中的sqlite3模块来操作数据库。
数据表设计如下:
商品表
字段名 | 数据类型 | 约束条件 | 说明 |
---|---|---|---|
id | INTEGER | PRIMARY KEY | 商品编号 |
name | TEXT | NOT NULL | 商品名称 |
price | REAL | NOT NULL | 商品单价 |
进货单表
字段名 | 数据类型 | 约束条件 | 说明 |
---|---|---|---|
id | INTEGER | PRIMARY KEY | 进货单编号 |
date | TEXT | NOT NULL | 进货日期(格式为YYYY-MM-DD) |
进货详情表
字段名 | 数据类型 | 约束条件 | 说明 |
---|---|---|---|
id | INTEGER | PRIMARY KEY | 进货单详情编号 |
purchase_id | INTEGER | NOT NULL | 进货单编号 |
sku_id | INTEGER | NOT NULL | 商品编号 |
quantity | INTEGER | NOT NULL | 进货数量 |
price | REAL | NOT NULL | 商品单价 |
销售单表
字段名 | 数据类型 | 约束条件 | 说明 |
---|---|---|---|
id | INTEGER | PRIMARY KEY | 销售单编号 |
date | TEXT | NOT NULL | 销售日期(格式为YYYY-MM-DD) |
销售详情表
字段名 | 数据类型 | 约束条件 | 说明 |
---|---|---|---|
id | INTEGER | PRIMARY KEY | 销售单详情编号 |
sales_id | INTEGER | NOT NULL | 销售单编号 |
sku_id | INTEGER | NOT NULL | 商品编号 |
quantity | INTEGER | NOT NULL | 销售数量 |
price | REAL | NOT NULL | 商品单价 |
库存表
字段名 | 数据类型 | 约束条件 | 说明 |
---|---|---|---|
id | INTEGER | PRIMARY KEY | 库存编号 |
sku_id | INTEGER | NOT NULL | 商品编号 |
quantity | INTEGER | NOT NULL | 库存数量 |
3. Python代码实现
3.1. 数据库连接
import sqlite3
conn = sqlite3.connect("inventory.db")
3.2. 商品管理
def add_item(name, price):
cursor = conn.cursor()
cursor.execute("INSERT INTO item(name, price) VALUES (?, ?)", (name, price))
conn.commit()
def edit_item(id, name, price):
cursor = conn.cursor()
cursor.execute("UPDATE item SET name=?, price=? WHERE id=?", (name, price, id))
conn.commit()
def delete_item(id):
cursor = conn.cursor()
cursor.execute("DELETE FROM item WHERE id=?", (id,))
conn.commit()
def search_item(id=None, name=None):
cursor = conn.cursor()
if id is not None:
cursor.execute("SELECT * FROM item WHERE id=?", (id,))
elif name is not None:
cursor.execute("SELECT * FROM item WHERE name LIKE ?", ("%"+name+"%",))
else:
cursor.execute("SELECT * FROM item")
return cursor.fetchall()
3.3. 进货管理
def add_purchase(date, details):
cursor = conn.cursor()
cursor.execute("INSERT INTO purchase(date) VALUES (?)", (date,))
purchase_id = cursor.lastrowid
for sku_id, quantity, price in details:
# Update inventory
cursor.execute("SELECT quantity FROM inventory WHERE sku_id=?", (sku_id,))
row = cursor.fetchone()
if row is not None:
quantity += row[0]
cursor.execute("UPDATE inventory SET quantity=? WHERE sku_id=?", (quantity, sku_id))
else:
cursor.execute("INSERT INTO inventory(sku_id, quantity) VALUES (?, ?)", (sku_id, quantity))
# Add purchase detail
cursor.execute("INSERT INTO purchase_detail(purchase_id, sku_id, quantity, price) VALUES (?, ?, ?, ?)", (purchase_id, sku_id, quantity, price))
conn.commit()
def search_purchase(id=None, date=None):
cursor = conn.cursor()
if id is not None:
cursor.execute("SELECT * FROM purchase WHERE id=?", (id,))
elif date is not None:
cursor.execute("SELECT * FROM purchase WHERE date=?", (date,))
else:
cursor.execute("SELECT * FROM purchase")
return cursor.fetchall()
def get_purchase_details(id):
cursor = conn.cursor()
cursor.execute("SELECT detail.id, item.name, detail.quantity, detail.price FROM purchase_detail detail JOIN item ON detail.sku_id=item.id WHERE detail.purchase_id=?", (id,))
return cursor.fetchall()
3.4. 销售管理
def add_sale(date, details):
cursor = conn.cursor()
cursor.execute("INSERT INTO sale(date) VALUES (?)", (date,))
sale_id = cursor.lastrowid
for sku_id, quantity, price in details:
# Update inventory
cursor.execute("SELECT quantity FROM inventory WHERE sku_id=?", (sku_id,))
row = cursor.fetchone()
if row is not None and quantity <= row[0]:
quantity = row[0] - quantity
cursor.execute("UPDATE inventory SET quantity=? WHERE sku_id=?", (quantity, sku_id))
else:
raise ValueError("Insufficient quantity for sale")
# Add sale detail
cursor.execute("INSERT INTO sale_detail(sale_id, sku_id, quantity, price) VALUES (?, ?, ?, ?)", (sale_id, sku_id, quantity, price))
conn.commit()
def search_sale(id=None, date=None):
cursor = conn.cursor()
if id is not None:
cursor.execute("SELECT * FROM sale WHERE id=?", (id,))
elif date is not None:
cursor.execute("SELECT * FROM sale WHERE date=?", (date,))
else:
cursor.execute("SELECT * FROM sale")
return cursor.fetchall()
def get_sale_details(id):
cursor = conn.cursor()
cursor.execute("SELECT detail.id, item.name, detail.quantity, detail.price FROM sale_detail detail JOIN item ON detail.sku_id=item.id WHERE detail.sale_id=?", (id,))
return cursor.fetchall()
3.5. 库存管理
def get_inventory():
cursor = conn.cursor()
cursor.execute("SELECT item.name, inventory.quantity FROM inventory JOIN item ON inventory.sku_id=item.id")
return cursor.fetchall()
def update_inventory(sku_id, quantity):
cursor = conn.cursor()
cursor.execute("UPDATE inventory SET quantity=? WHERE sku_id=?", (quantity, sku_id))
conn.commit()
3.6. 报表统计
def get_sale_report(start_date=None, end_date=None):
cursor = conn.cursor()
if start_date is None:
cursor.execute("SELECT item.name, SUM(detail.quantity), MAX(detail.price), MIN(detail.price), AVG(detail.price) FROM sale_detail detail JOIN item ON detail.sku_id=item.id GROUP BY detail.sku_id")
else:
cursor.execute("SELECT iten.name, SUM(detail.quantity), MAX(detail.price), MIN(detail.price), AVG(detail.price) FROM sale_detail detail JOIN item ON detail.sku_id=item.id WHERE sale.date BETWEEN ? AND ? GROUP BY detail.sku_id", (start_date, end_date))
return cursor.fetchall()
4. 示例说明
示例1:新增商品
add_item("可乐", 2.50)
示例2:进货
details = [(1, 100, 2.00), (2, 50, 3.00)]
add_purchase("2022-01-01", details)
5. 总结
通过上述攻略,我们可以实现一个基本的超市进销存管理系统,涵盖了商品管理、进货管理、销售管理、库存管理和报表统计等功能。同时,我们还可以根据实际需求扩展其他功能,从而满足更多的业务需求,提高管理效率和准确性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python实现超市进销存管理系统 - Python技术站