当前位置:   article > 正文

Python案例分析|基于模块的库存管理系统_python 仓库管理系统

python 仓库管理系统

 本案例是通过一个多模块的库存管理系统案例,帮助大家深入了解基于模块的Python应用程序的开发流程。

01、库存管理系统API设计

本文实现一个简单的基于模块的库存管理系统。系统采用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负责数据的管理,其API设计如表1所示。

表1

 库存管理系统ui.py负责用户界面交互,其API设计如表2所示。

表2

02、库存管理系统的功能设计

库存信息管理系统主要包括如下功能。

(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(),显示库存信息列表。

03、主模块main.py的实现

主模块导入data和ui模块。

在main.py中,定义main()函数,首先调用data.init(),从磁盘JSON格式文件中读取数据。然后在无限循环中,调用ui.prompt_for_action()显示功能菜单,接受用户输入,并根据用户的功能选择,实现各模块相应功能。

【例1】库存管理系统主模块main.py。

  1. """库存管理系统:基于JSON"""
  2. import data
  3. import ui
  4. def main():
  5. data.init()
  6. while True:
  7. action = ui.prompt_for_action()
  8. if action == 'QUIT':
  9. break
  10. elif action == 'ADD_PRODUCT':
  11. sku_id = ui.prompt_for_new_sku_id()
  12. if sku_id != None:
  13. sku_name = ui.prompt_for_sku_name()
  14. if sku_name != None:
  15. data.add_product(sku_id, sku_name)
  16. elif action == 'REPORT_PRODUCTS':
  17. ui.report_products()
  18. elif action == 'ADD_LOCATION':
  19. loc_id = ui.prompt_for_new_loc_id()
  20. if loc_id != None:
  21. loc_name = ui.prompt_for_loc_name()
  22. if loc_name != None:
  23. data.add_location(loc_id, loc_name)
  24. elif action == 'REPORT_LOCATIONS':
  25. ui.report_locations()
  26. elif action == 'ADD_ITEM':
  27. sku_id = ui.prompt_for_old_sku_id()
  28. if sku_id != None:
  29. loc_id = ui.prompt_for_old_loc_id()
  30. if loc_id != None:
  31. data.add_item(sku_id, loc_id)
  32. elif action == 'REMOVE_ITEM':
  33. sku_id = ui.prompt_for_old_sku_id()
  34. if sku_id != None:
  35. loc_id = ui.prompt_for_old_loc_id()
  36. if loc_id != None:
  37. if not data.remove_item(sku_id, loc_id):
  38. print('该库存不存在')
  39. elif action == 'REPORT_ITEMS':
  40. ui.report_items()
  41. #######################################################################
  42. if __name__ == "__main__":
  43. main()

 

04、用户界面交互模块ui.py的实现

用户界面交互模块导入data模块。实现表2所示的API。

【例2】库存管理系统用户界面交互模块ui.py。

  1. import data
  2. def prompt_for_action():
  3. """ 提示功能菜单。返回用户输入选择 """
  4. while True:
  5. print('---------------库存信息管理系统-------------')
  6. print('| 1: 增加产品信息 |')
  7. print('| 2: 产品信息报表 |')
  8. print('| 3: 增加货架位置 |')
  9. print('| 4: 货架位置报表 |')
  10. print('| 5: 商品入库管理 |')
  11. print('| 6: 商品出库管理 |')
  12. print('| 7: 商品库存信息报表 |')
  13. print('| 0: 退出 |')
  14. print('-------------------------------------------')
  15. choice = input('请选择功能菜单(0-7):')
  16. if choice == '0': return 'QUIT'
  17. elif choice == '1': return 'ADD_PRODUCT'
  18. elif choice == '2': return 'REPORT_PRODUCTS'
  19. elif choice == '3': return 'ADD_LOCATION'
  20. elif choice == '4': return 'REPORT_LOCATIONS'
  21. elif choice == '5': return 'ADD_ITEM'
  22. elif choice == '6': return 'REMOVE_ITEM'
  23. elif choice == '7': return 'REPORT_ITEMS'
  24. def prompt_for_old_sku_id():
  25. """ 提示用户输入有效的产品sku_id并返回有效产品ID,或者返回None """
  26. while True:
  27. sku_id = input("请输入产品ID:")
  28. if sku_id == "":
  29. return None
  30. elif sku_id not in data.get_products():
  31. print("该产品不存在, 请重新输入")
  32. else:
  33. return sku_id
  34. def prompt_for_new_sku_id():
  35. """ 提示用户输入新的产品sku_id并返回新产品ID,或者返回None """
  36. while True:
  37. sku_id = input("请输入新的产品ID:")
  38. if sku_id == "": return None
  39. elif sku_id in data.get_products():
  40. print("该产品已经存在,请重新输入")
  41. else:
  42. return sku_id
  43. def prompt_for_old_loc_id():
  44. """ 提示用户输入有效的货架位置loc_id并返回有效货架位置ID,或者返回None """
  45. while True:
  46. loc_id = input("请输入货架位置ID:")
  47. if loc_id == "":
  48. return None
  49. elif loc_id not in data.get_locations():
  50. print("该货架位置不存在,请重新输入")
  51. else:
  52. return loc_id
  53. def prompt_for_new_loc_id():
  54. """ 提示用户输入新的货架位置loc_id并返回,或者返回None """
  55. while True:
  56. loc_id = input("请输新的货架位置ID:")
  57. if loc_id == "": return None
  58. elif loc_id in data.get_locations():
  59. print('该货架位置已经存在,请重新输入')
  60. else:
  61. return loc_id
  62. def prompt_for_sku_name():
  63. """ 提示用户输入产品名称sku_name并返回产品名称,或者返回None """
  64. while True:
  65. sku_name = input("请输入产品名称:")
  66. if sku_name == "": return None
  67. else: return sku_name
  68. def prompt_for_loc_name():
  69. """ 提示用户输入货架位置名称loc_name并返回货架位置名称,或者返回None """
  70. while True:
  71. loc_name = input("请输入货架位置名称:")
  72. if loc_name == "": return None
  73. else: return loc_name
  74. def report_products():
  75. """ 产品信息报表 """
  76. for (k, v) in data.get_products().items():
  77. print('{0:8} {1}'.format(k, v))
  78. def report_locations():
  79. """ 货架位置报表 """
  80. for (k, v) in data.get_locations().items():
  81. print('{0:8} {1}'.format(k, v))
  82. def report_items():
  83. """ 库存信息报表 """
  84. for (k, v) in data.get_items():
  85. sku_name = data.get_products()[k]
  86. loc_name = data.get_locations()[v]
  87. print('{0:8} {1}: {2:8}{3}'.format(k,sku_name,v,loc_name))

 

05、数据处理模块data.py的实现

数据处理模块实现表1所示的API。通过Python标准库模块json中的loads()函数和dumps()函数,可以实现从JSON文件读取数据和转储数据到JSON文件的功能。

【例3】库存管理系统数据处理模块data.py。

  1. import os
  2. import json
  3. #全局变量
  4. _products = {} #保存产品信息的字典:sku_id:sku_name
  5. _locations = {} #保存货架位置的字典:loc_id:loc_name
  6. _items = [] #保存商品库存的列表,元素为元组(sku_id,loc_id)
  7. def init():
  8. """从磁盘JSON格式文件中读取数据"""
  9. global _products, _locations, _items
  10. if os.path.exists("products.json"):
  11. f = open("products.json", "r", encoding='utf-8')
  12. _products = json.loads(f.read())
  13. f.close()
  14. if os.path.exists("locations.json"):
  15. f = open("locations.json", "r", encoding='utf-8')
  16. _locations = json.loads(f.read())
  17. f.close()
  18. if os.path.exists("items.json"):
  19. f = open("items.json", "r", encoding='utf-8')
  20. _items = json.loads(f.read())
  21. f.close()
  22. def _save_products():
  23. """ 把产品信息数据_products以JSON格式保存到磁盘文件"""
  24. global _products
  25. f = open("products.json", "w", encoding='utf-8')
  26. f.write(json.dumps(_products, ensure_ascii=False))
  27. f.close()
  28. def _save_locations():
  29. """ 把货架位置数据_locations以JSON格式保存到磁盘文件"""
  30. global _locations
  31. f = open("locations.json", "w", encoding='utf-8')
  32. f.write(json.dumps(_locations))
  33. f.close()
  34. def _save_items():
  35. """ 把商品库存数据_items以JSON格式保存到磁盘文件"""
  36. global _items
  37. f = open("items.json", "w", encoding='utf-8')
  38. f.write(json.dumps(_items))
  39. f.close()
  40. def get_products():
  41. """ 返回产品信息 """
  42. global _products
  43. return _products
  44. def get_locations():
  45. """ 返回货架位置信息 """
  46. global _locations
  47. return _locations
  48. def get_items():
  49. """ 返回商品库存信息 """
  50. global _items
  51. return _items
  52. def add_product(sku_id, sku_name):
  53. """ 增加一个产品sku_id、sku_name """
  54. global _products
  55. _products[sku_id] = sku_name
  56. _save_products()
  57. def add_location(loc_id, loc_name):
  58. """ 增加一个货架位置loc_id、loc_name """
  59. global _locations
  60. _locations[loc_id] = loc_name
  61. _save_locations()
  62. def add_item(sku_id, loc_id):
  63. """ 入库一件商品:商品sku_id、货架sku_id """
  64. global _items
  65. _items.append((sku_id, loc_id))
  66. _save_items()
  67. def remove_item(sku_id, loc_id):
  68. """出库一件商品:商品sku_id、货架sku_id,返回True;如果不存在,返回False"""
  69. global _items
  70. for i in range(len(_items)):
  71. if sku_id == _items[i][0] and loc_id == _items[i][1]:
  72. del _items[i]
  73. _save_items()
  74. return True
  75. return False

 

06、系统测试运行

在命令行窗口中输入如下命令:

python main.py

运行结果如下:

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/369689?site
推荐阅读
相关标签
  

闽ICP备14008679号