Flask企业物资采购销售管理系统设计与实现
发布时间:2026/8/13 5:00:06 作者:尧图编辑部 阅读量:1,286

1. 项目概述这个基于Flask的企业物资采购销售管理系统是我去年为一家中型制造企业开发的内部管理平台。系统最核心的特点就是多角色协同——从采购员、销售经理到仓库管理员和财务人员每个岗位都有专属的操作界面和功能权限。这种设计不是拍脑袋想出来的而是源于实际业务中各部门数据孤岛的痛点采购部门不知道库存情况盲目下单销售团队对在途物资毫无概念随意承诺交期仓库和财务之间对不上账更是家常便饭。系统采用PythonFlaskMySQL技术栈前端用Bootstrap5实现响应式布局。开发周期3个月上线后企业采购效率提升40%库存周转率提高25%最让我意外的是财务对账时间从原来的每周8小时缩短到2小时。下面我就拆解这个系统的设计思路和关键技术实现。2. 系统架构设计2.1 角色权限模型设计系统包含6类核心角色采购专员采购订单创建、供应商管理销售经理客户管理、销售订单审批仓库管理员入库/出库操作、库存盘点财务人员付款/收款登记、对账部门主管数据看板、报表导出系统管理员用户管理、基础配置权限控制采用RBAC基于角色的访问控制模型数据库设计包含三张关键表class Role(db.Model): __tablename__ roles id db.Column(db.Integer, primary_keyTrue) name db.Column(db.String(64), uniqueTrue) permissions db.Column(db.Integer) users db.relationship(User, backrefrole, lazydynamic) class Permission: VIEW 1 CREATE 2 EDIT 4 DELETE 8 ADMIN 162.2 数据库ER图设计核心实体包括物资表material含分类、规格、单位、安全库存等字段供应商表supplier评估等级、账期等业务字段采购订单表purchase_order关联供应商与物资明细销售订单表sales_order含客户信息、交货日期等库存流水表inventory_transaction记录所有出入库操作特别注意建立了库存快照表inventory_snapshot每天凌晨自动备份库存数据这对后期排查库存差异非常关键。3. 核心功能实现3.1 采购-库存联动机制采购订单审批通过后系统会自动生成在途库存记录。这个设计解决了传统系统中已采购未入库物资的盲区问题。关键代码如下app.route(/api/purchase/approve/int:order_id, methods[POST]) permission_required(Permission.APPROVE) def approve_purchase(order_id): order PurchaseOrder.query.get_or_404(order_id) for item in order.items: # 创建在途库存记录 transit InventoryTransit( material_iditem.material_id, quantityitem.quantity, expected_dateorder.expected_delivery ) db.session.add(transit) order.status approved db.session.commit() return jsonify({status: success})3.2 销售订单可用量检查销售创建订单时系统会实时计算 可用库存 当前库存 在途库存 - 已预留库存 前端用AJAX实现实时校验$(#material_select).change(function(){ let materialId $(this).val(); $.get(/api/inventory/available/materialId, function(data){ $(#available_qty).text(data.available); }); });3.3 智能预警模块系统自动监控以下情况库存低于安全库存触发采购建议临近保质期物资优先销售超期未到货的采购订单应收账款逾期提醒使用Celery定时任务每天9:00执行检查app.celery.task def daily_check(): # 低库存检查 materials Material.query.filter( Material.current_stock Material.safety_stock ).all() for m in materials: create_alert(low_stock, m.id) # 保质期检查食品医药类物资 near_expiry Inventory.query.filter( Inventory.expiry_date datetime.now() timedelta(days30) ).all() ...4. 关键技术实现4.1 Flask工厂模式应用采用应用工厂模式使系统更易维护def create_app(config_name): app Flask(__name__) app.config.from_object(config[config_name]) # 扩展初始化 db.init_app(app) login_manager.init_app(app) # 蓝图注册 from .purchase import purchase as purchase_blueprint app.register_blueprint(purchase_blueprint, url_prefix/purchase) return app4.2 报表导出性能优化当处理万级数据的Excel导出时常规方法会导致内存溢出。解决方案是使用生成器流式导出def generate_large_excel(query): output BytesIO() writer pd.ExcelWriter(output, enginexlsxwriter) # 分批查询 for chunk in pd.read_sql(query.statement, query.session.bind, chunksize5000): chunk.to_excel(writer, sheet_nameData, indexFalse) writer.save() output.seek(0) return output4.3 操作日志审计所有关键操作记录日志到数据库和Elasticsearch双写def log_operation(user_id, action, details): # 数据库记录 db_log OperationLog( user_iduser_id, actionaction, detailsdetails ) db.session.add(db_log) # Elasticsearch记录 es_log { timestamp: datetime.utcnow(), user: user_id, operation: action, ip: request.remote_addr } es.index(indexoperation_logs, bodyes_log) db.session.commit()5. 部署与性能调优5.1 NginxGunicorn配置生产环境采用Nginx作为反向代理Gunicorn多worker进程Supervisor进程管理典型Gunicorn配置gunicorn -w 4 -k gevent --bind 0.0.0.0:5000 --max-requests 1000 --timeout 120 app:create_app(production)5.2 数据库连接池优化SQLAlchemy连接池关键参数SQLALCHEMY_ENGINE_OPTIONS { pool_size: 10, max_overflow: 5, pool_recycle: 3600, pool_pre_ping: True }6. 踩坑经验库存并发问题 初期直接使用SQL更新库存导致数据不一致后改用SELECT FOR UPDATE行锁with db.session.begin_nested(): item Inventory.query.with_for_update().get(material_id) item.quantity - amount db.session.add(item)CSV导入内存溢出 大文件导入改用流式处理def stream_csv(file): while True: line file.readline() if not line: break yield line.decode(utf-8).strip().split(,)跨部门业务流程 采购-入库-财务的三方对账最初设计不合理后来增加采购收货单作为中间凭证流程变为 采购下单 → 供应商送货 → 仓库验收生成收货单 → 财务根据收货单付款这个项目给我的最大启示是业务系统开发中对业务流程的理解深度比技术实现更重要。有次为了优化库存查询速度我花了三天重写SQL语句最后发现只要在物资分类表加个缓存性能立即提升10倍。所以建议大家在开发前至少花两周时间完整跟岗学习各岗位的实际工作流程。