1. 项目背景与核心需求
这个基于Flask+Vue的滤清器材料仓库管理系统,源于我在汽配行业信息化改造中遇到的实际痛点。传统滤清器生产企业普遍面临以下问题:
- 原材料种类繁杂(滤纸、橡胶密封圈、金属端盖等)
- 库存状态难以实时掌握(特别是不同规格的替代料)
- 出入库记录依赖手工台账,错漏率高
系统需要实现的核心功能模块包括:
- 多级分类的材料基础数据管理
- 带有批次号的入库/出库流程
- 库存预警与效期管理
- 供应商资质文件关联
2. 技术栈选型解析
2.1 后端框架选择
采用Flask+Django的组合架构主要基于:
- Flask轻量灵活,适合快速构建RESTful API
- Django ORM提供完善的数据模型支持
- 两者均可通过SQLAlchemy共享数据库连接池
关键配置示例(config.py):
python复制class DevelopmentConfig:
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://user:pass@localhost/warehouse'
SQLALCHEMY_TRACK_MODIFICATIONS = False
FLASK_DEBUG = True
2.2 前端框架决策
选择Vue.js 3.x的原因:
- 组件化开发适合构建复杂的表单交互
- Composition API更利于状态管理
- 与Element Plus组件库完美集成
典型组件结构:
code复制src/
├── components/
│ ├── MaterialSelector.vue # 带分类筛选的材料选择器
│ └── BatchInput.vue # 批次号录入组件
└── views/
├── Warehouse.vue # 仓库可视化视图
└── InventoryAlert.vue # 库存预警看板
3. 核心业务逻辑实现
3.1 材料分类体系设计
采用三级分类编码规则:
code复制F01 - 滤纸类
F0101 - 纤维素滤纸
F0102 - 合成纤维滤纸
M02 - 金属件类
M0201 - 镀锌端盖
M0202 - 不锈钢骨架
数据库模型关键字段:
python复制class Material(db.Model):
__tablename__ = 'materials'
id = db.Column(db.String(8), primary_key=True) # 如F010101
name = db.Column(db.String(50))
spec = db.Column(db.String(20)) # 规格如200mm*300mm
unit = db.Column(db.String(5)) # 计量单位
safety_stock = db.Column(db.Integer)
3.2 批次管理实现
入库时自动生成批次号规则:
code复制20230815-001(日期+当日序号)
对应的库存变动API:
python复制@app.route('/api/inbound', methods=['POST'])
def create_inbound():
data = request.get_json()
batch_no = generate_batch_number(data['material_id'])
new_stock = Inventory.create(
material_id=data['material_id'],
batch_no=batch_no,
quantity=data['qty'],
warehouse=data['location']
)
return jsonify(new_stock.to_dict())
4. 系统特色功能详解
4.1 智能替代料提示
当库存不足时,系统会:
- 检查同分类下的替代料
- 比对关键参数(如过滤精度、耐温范围)
- 显示可替代材料清单
实现逻辑:
python复制def get_substitutes(material_id):
base = Material.query.get(material_id)
substitutes = Material.query.filter(
Material.category == base.category,
Material.spec >= base.spec # 规格不低于原物料
).all()
return [s.to_dict() for s in substitutes]
4.2 可视化库存看板
使用ECharts实现的三种视图:
- 库龄分析图(识别呆滞料)
- 分类库存占比饼图
- 安全库存水位预警
前端数据获取示例:
javascript复制async fetchStockData() {
const res = await axios.get('/api/stock/dashboard')
this.ageAnalysis = res.data.age_analysis
this.categoryDistribution = res.data.category_dist
}
5. 部署与性能优化
5.1 生产环境部署
采用Docker-compose编排:
yaml复制version: '3'
services:
web:
build: ./backend
ports:
- "5000:5000"
depends_on:
- redis
- db
frontend:
build: ./frontend
ports:
- "8080:8080"
5.2 缓存策略
高频访问数据缓存方案:
- 使用Redis缓存材料基础信息
- 库存数据采用Write-Through模式
- 分类树结构使用HASH类型存储
配置示例:
python复制from flask_caching import Cache
cache = Cache(config={
'CACHE_TYPE': 'RedisCache',
'CACHE_REDIS_URL': 'redis://localhost:6379/0'
})
6. 实际应用中的经验总结
6.1 物料编码的坑
初期设计时犯过的错误:
- 将规格参数编入物料代码(导致后期规格变更时编码失效)
- 未预留足够的分类扩展位(三级分类后来不够用)
改进后的编码原则:
- 分类码与特征码分离
- 至少预留2位扩展位
- 建立编码规则文档
6.2 库存扣减的并发控制
遇到的典型问题:
- 超卖现象(并发出库时库存扣减异常)
- 解决方案比较:
- 悲观锁:影响性能
- 乐观锁:需要重试机制
- 最终采用:Redis分布式锁+库存预留机制
关键实现代码:
python复制def deduct_stock(material_id, qty):
with redis.lock(f"stock_{material_id}", timeout=5):
stock = Inventory.get(material_id)
if stock.quantity >= qty:
stock.quantity -= qty
db.session.commit()
return True
return False
7. 扩展方向建议
基于现有系统的可扩展功能:
- 与ERP系统对接(通过Webhook或中间数据库)
- 增加质检模块(关联批次号与质检报告)
- 移动端盘点功能(PDA扫码入库)
- 供应商门户(自助查询库存情况)
技术演进路线:
- 逐步将核心服务迁移到gRPC微服务
- 使用Kafka处理库存变更事件
- 引入Prometheus进行性能监控