Python實現基於模塊的庫存管理系統


一:系統測試運行

------ 庫存信息管理系統-------
| 1: 增加產品信息
| 2: 產品信息報表
| 3: 增加貨架位置
| 4: 貨架位置報表
| 5: 商品入庫管理
| 6: 商品出庫管理
| 7: 商品庫存信息報表
| 0: 退出
------------------------------
請選擇功能菜單(0-7):

二:庫存管理系統概述

sku:Stock Keeping Unit,最小存貨單位

  • 本節實現一個簡單的基於模塊的庫存管理系統。
  • 系統採用JSON文件來保存數據。
  • 產品信息設計爲字典,鍵爲sku_id (產品ID),值爲sku_name (產品名稱),使用products.json實現其持續化。
  • 貨架位置信息也設計爲字典,鍵爲loc_id (貨架ID),值爲loc_name (貨架名稱),使用location.json實現其持續化。
  • 商品庫存信息設計爲列表[sku_id, loc_id] 的列表,使用items.json實現其持續化。

庫存管理系統設計爲三個模塊文件: data.py、ui.py 和 main.py

庫存管理系統data.py負責數據的管理
庫存管理系統ui.py負責用戶界面交互

三:數據處理模塊data.py的實現

  • 庫存管理系統data.py負責數據的管理
  • 通過Python標準庫模塊json中的loads()函數和dumps()函數,可以實現從JSON文件讀取數據和轉儲數據到JSON文件的功能。

庫存管理系統數據處理模塊data.py。

import os
import json

#全局變量
_products = {} #保存產品信息的字典: sku_id:sku_name
_locations = {} #保存貨架位置的字典: loc_id:loc_name
_items = [] #保存商品庫存的列表,元素爲元組(sku_id,loc_id)

def init():
  """從磁盤JSON格式文件中讀取數據"""
  global _products, _locations, _items
  if os.path.exists("products.json"):
    f = open("products.json", "r", encoding = 'utf-8')
    _products = json.loads(f.read())
    f.close()
  if os.path.exists("locations.json"):
    f = open("locations.json", "r", encoding = 'utf-8')
    _locations = json.loads(f.read())
    f.close()
  if os.path.exists("items.json"):
    f = open("items.json", "r", encoding ='utf-8')
    _items = json.loads(f.read())
    f.close()

def _save_products():
  """把產品信息數據_products以JSON格式保存到磁盤文件"""
  global _products
  f = open("products.json", "w", encoding ='utf-8')
  f.write(json.dumps(_products, ensure_ascii = False))
  f.close()
  
def _save_locations():
  """把貨架位置數據_ locations以JSON格式保存到磁盤文"""
  global _locations
  f = open("locations.json", "w", encoding ='utf-8')
  f.write(json.dumps(_locations))
  f.close()

def _save_items():
  """把商品庫存數據_ items以JSON格 式保存到磁盤文件"""
  global _items
  f = open("items.json", "w", encoding ='utf-8')
  f.write(json.dumps(_items))
  f.close()

def get_products(): 
  """返回產品信息"""
  global _products
  return _products

def get_locations():
  """返回貨架位置信息"""
  global _locations
  return _locations

def get_items():
  """返回商品庫存信息"""
  global _items
  return _items

def add_product(sku_id, sku_name):
  """增加一個產品sku_ id、sku_name"""
  global _products
  _products[sku_id] = sku_name
  _save_products()

def add_location(loc_id, loc_name):
  """增加一個貨架位置loc_ id、 loc_ name"""
  global _locations
  _locations[loc_id] = loc_name
  _save_locations()

def add_item(sku_id, loc_id):
  """入庫一件商品:商品sku_ id、 貨架sku_ id"""
  global _items
  _items.append((sku_id, loc_id))
  _save_items()

def remove_item(sku_id, loc_id):
  """出庫一件商品:商品sku_ id、貨架sku_ id, 返回True; 如果不存在, 返回False"""
  global _items
  for i in range(len(_items)):
    if sku_id == _items[i][0] and loc_id == _items[i][1]:
      del _items[i]
      _save_items()
      return True
  return False

四:用戶界面交互模塊ui.py的實現

  • 庫存管理系統ui.py負責用戶界面交互
  • 用戶界面交互模塊導入data模塊
  • 字典.items() 返回字典的(key, value)對的列表

庫存管理系統用戶界面交互模塊ui.py

import data

def prompt_for_action():
  """提示功能菜單。返回用戶輸入選擇"""
  while True:
    print('------ 庫存信息管理系統-------')
    print('| 1: 增加產品信息')
    print('| 2: 產品信息報表')
    print('| 3: 增加貨架位置')
    print('| 4: 貨架位置報表')
    print('| 5: 商品入庫管理')
    print('| 6: 商品出庫管理')
    print('| 7: 商品庫存信息報表')
    print('| 0: 退出')
    print('------------------------------')
    
    choice = input('請選擇功能菜單(0-7):')
    if choice == '0': return 'QUIT'
    elif choice == '1': return 'ADD_PRODUCT'
    elif choice == '2': return 'REPORT_PRODUCTS'
    elif choice == '3': return 'ADD_LOCATION'
    elif choice == '4': return 'REPORT_LOCATIONS'
    elif choice == '5': return 'ADD_ITEM'
    elif choice == '6': return 'REMOVE_ITEM'
    elif choice == '7': return 'REPORT_ITEMS'

def prompt_for_old_sku_id():
  """提示用戶輸入有效的產品sku_id並返回有效產品ID, 或者返回None"""
  while True:
    sku_id = input("請輸入產品ID:")
    if sku_id == "":
      return None
    elif sku_id not in data.get_products():
      print("該產品不存在,請重新輸入")
    else:
      return sku_id

def prompt_for_new_sku_id():
  """提示用戶輸入新的產品sku_id並返回新產品ID, 或者返回None"""
  while True:
    sku_id = input("請輸入新的產品ID:")
    if sku_id == "": 
      return None
    elif sku_id in data.get_products():
      print("該產品已經存在,請重新輸入")
    else:
      return sku_id

def prompt_for_old_loc_id():
  """提示用戶輸入有效的貨架位置loc_id並返回有效貨架位置ID,或者返回None"""
  while True:
    loc_id = input("請輸入貨架位置ID:")
    if loc_id == "":
      return None
    elif loc_id not in data.get_locations():
      print("該貨架位置不存在,請重新輸入")
    else:
      return loc_id

def prompt_for_new_loc_id():
  """提示用戶輸入新的貨架位置loc_ id並返回,或者返回None"""
  while True:
    loc_id = input ("請輸新的貨架位置ID:")
    if loc_id == "": 
      return None
    elif loc_id in data.get_locations():
      print('該貨架位置已經存在,請重新輸入')
    else:
      return loc_id

def prompt_for_sku_name():
  """提示用戶輸入產品名稱sku_name並返回產品名稱,或者返回None"""
  while True:
    sku_name = input("請輸入產品名稱:")
    if sku_name =="": 
      return None
    else: 
      return sku_name

def prompt_for_loc_name():
  """提示用戶輸入貨架位置名稱loc_ name並返回貨架位置名稱,或者返回None"""
  while True:
    loc_name = input("請輸入貨架位置名稱:")
    if loc_name == "": return None
    else: return loc_name

def report_products():
  """產品信息報表"""
  for (k, v) in data.get_products().items():
    print('{0:8} {1}'.format(k, v))

def report_locations():
  """貨架位置報表"""
  for (k, v) in data.get_locations().items():
    print(' {0:8} {1}'. format(k, v))

def report_items():
  """庫存信息報表"""
  for (k, v) in data.get_items():
    sku_name = data.get_products()[k]
    loc_name = data.get_locations()[v]
    print('{0:8} {1}: {2:8} {3}'.format(k, sku_name, v, loc_name))

五:庫存管理系統的功能設計

終究逃不過增、刪、改、查四個字

prompt,提示

  1. 增加產品信息
    調用ui.prompt_for_new__sku_id(),提示用戶輸入新的產品ID,
    調用ui.prompt_for_sku_name(),提示用戶輸入產品名稱。
    調用data.add_product(sku_id, sku_name) 增加新的產品。
    如果用戶輸入爲空,則返回None,即什麼也不做。

  2. 產品信息報表
    調用ui.report_products(),顯示產品信息列表。

  3. 增加貨架位置
    調用ui.prompt_for_new_loc_id(), 提示用戶輸入新的貨架位置ID,
    調用ui.prompt_for_loc_name(),提示用戶輸入貨架名稱。
    調用data.add_location(sku_id, sku_name) 增加新的貨架。
    如果用戶輸入爲空,則返回None,即什麼也不做。

  4. 貨架位置報表
    調用ui.report_location(),顯示貨架位置信息列表。

  5. 商品入庫管理
    調用ui.prompt_for_old_sku_id(),提示用戶輸入產品ID,
    調用ui.prompt_for_old_loc_id(),提示用戶輸入貨架ID。
    調用data.add_item(sku_id, loc_id),實現商品入庫。
    如果用戶輸入爲空,則返回None,即什麼也不做。

  6. 商品出庫管理
    調用ui.prompt_for_old_sku_id(),提示用戶輸入產品ID,
    調用ui.prompt_for_old_loc_id(),提示用戶輸入貨架ID。
    調用data.remove_item(sku_id, loc_id),實現商品出庫。
    如果庫存不存在,則報錯。如果用戶輸入爲空,則返回None,即什麼也不做。

  7. 商品庫存信息報表
    調用ui.report_items(), 顯示庫存信息列表。

六:主模塊main.py的實現

  • 主模塊導入data和ui模塊。
  • 在main.py中,定義main()函數,首先調用data.init(),從磁盤JSON格式文件中讀取數據。然後在無限循環中,調用ui.prompt_for_action()顯示功能菜單,接受用戶輸入,並根據用戶的功能選擇,實現各模塊相應功能。

庫存管理系統主模塊main. py

"""庫存管理系統:基於JS0N"""
import data
import ui

def main():
  data.init()
  while True:
    action = ui.prompt_for_action()
    if action == 'QUIT':
      break
    elif action == 'ADD_PRODUCT':
      sku_id = ui.prompt_for_new_sku_id()
      if sku_id != None: 
        sku_name = ui.prompt_for_sku_name() 
        if sku_name != None: 
          data.add_product(sku_id, sku_name)
    elif action == 'REPORT_PRODUCTS':
      ui.report_products()
    elif action == 'ADD_LOCATION':
      loc_id = ui.prompt_for_new_loc_id()
      if loc_id != None:
        loc_name = ui.prompt_for_loc_name()
        if loc_name != None:
          data.add_location(loc_id, loc_name)
    elif action == 'REPORT_LOCATIONS':
      ui.report_locations()
    elif action == 'ADD_ITEM':
      sku_id = ui.prompt_for_old_sku_id()
      if sku_id != None:
        loc_id = ui.prompt_for_old_loc_id()
        if loc_id != None:
          data.add_item(sku_id, loc_id)
    elif action == 'REMOVE_ITEM':
      sku_id = ui.prompt_for_old_sku_id()
      if sku_id != None:
        loc_id = ui.prompt_for_old_loc_id()
        if loc_id != None:
          if not data.remove_item(sku_id, loc_id):
            print('該庫存不存在!')
    elif action == 'REPORT_ITEMS':
      ui.report_items()

if __name__ == "__main__": main()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章