1. 项目背景与核心价值
在制造业数字化转型浪潮中,中小型工厂普遍面临生产流程与库存管理脱节的问题。传统ERP系统往往存在移动端适配不足、操作复杂、实施成本高等痛点。我们团队基于实际工厂需求,采用Django+微信小程序技术栈,开发了一套轻量级一体化管理系统。
这个系统的独特之处在于:
- 移动优先:通过微信小程序实现随时随地的工单处理与库存查询,解决工厂人员流动性强的痛点
- 极简操作:针对车间工人设计直观的交互界面,扫码即可完成物料出入库
- 实时协同:生产进度与库存数据双向联动,避免传统纸质工单导致的信息滞后
实测数据显示,系统可使生产异常响应速度提升40%,库存盘点时间减少65%。特别适合50-200人规模、年产值3000万-1亿的离散制造企业。
2. 技术架构设计解析
2.1 整体架构设计
系统采用经典的三层架构,但针对工业场景做了特殊优化:
code复制微信小程序端
↑↓ HTTPS + JWT
Django REST API
↑↓ ORM
MySQL/Redis
↑↓ 定时任务
硬件设备(扫码枪/打印机)
2.2 关键技术选型
后端核心组件:
- Django 3.2 + Django REST Framework:选择LTS版本确保稳定性
- Django Channels:用于实时推送生产异常通知
- SimpleJWT:替代传统session,更适合移动端认证
- Django-Q:异步任务队列,处理报表生成等耗时操作
数据库设计要点:
python复制class Material(models.Model):
code = models.CharField(max_length=50, unique=True) # 物料编码
safety_stock = models.PositiveIntegerField() # 安全库存
current_stock = models.PositiveIntegerField(default=0)
class WorkOrder(models.Model):
STATUS_CHOICES = (
('pending', '待生产'),
('processing', '生产中'),
('completed', '已完成')
)
materials = models.ManyToManyField(Material, through='MaterialUsage')
2.3 微信小程序特殊处理
性能优化技巧:
- 分页加载:所有列表接口实现cursor分页
- 本地缓存:wx.setStorageSync存储常用物料数据
- 压缩传输:Django端启用gzip压缩,图片使用WebP格式
典型接口示例:
python复制@api_view(['GET'])
@permission_classes([IsAuthenticated])
def material_list(request):
queryset = Material.objects.filter(
current_stock__lt=F('safety_stock') # 只返回低于安全库存的物料
).annotate(
deficit=F('safety_stock')-F('current_stock')
)
paginator = CursorPagination()
result = paginator.paginate_queryset(queryset, request)
serializer = MaterialSerializer(result, many=True)
return paginator.get_paginated_response(serializer.data)
3. 核心功能实现细节
3.1 生产流程管理
工单状态机设计:
mermaid复制stateDiagram
[*] --> Pending
Pending --> Processing: 车间主任派工
Processing --> Completed: 质检确认
Processing --> Pending: 发现异常
关键业务逻辑:
- 自动排产算法考虑:
- 物料齐套检查
- 设备负载均衡
- 工序依赖关系
- 进度看板使用WebSocket实时推送:
- 每30秒采集一次设备数据
- 使用ECharts实现甘特图
3.2 智能库存管理
扫码出入库方案对比:
| 方案类型 | 识别速度 | 容错率 | 成本 |
|---|---|---|---|
| 普通二维码 | 快 | 低 | ¥0.1/个 |
| DM码 | 较快 | 高 | ¥0.3/个 |
| RFID | 最快 | 最高 | ¥5/个 |
库存预警策略:
python复制def check_stock_levels():
materials = Material.objects.filter(
current_stock__lt=F('safety_stock')
)
for mat in materials:
deficit = mat.safety_stock - mat.current_stock
if deficit > mat.safety_stock * 0.3: # 缺口超过30%触发紧急采购
send_urgent_alert(mat)
4. 系统部署与性能优化
4.1 生产环境部署
推荐服务器配置:
- 阿里云ECS 4核8G(突发性能实例t6)
- MySQL 5.7 + Redis 6.x
- 使用Supervisor管理进程:
ini复制[program:celery]
command=/opt/venv/bin/celery -A core worker -l info
autostart=true
4.2 性能调优实战
数据库优化记录:
- 为高频查询添加复合索引:
sql复制CREATE INDEX idx_material_stock ON material(code, current_stock); - 慢查询日志分析发现:N+1查询问题通过select_related解决
- 连接池配置:
python复制DATABASES = { 'CONN_MAX_AGE': 60, 'OPTIONS': {'pool_size': 20} }
缓存策略:
- 热点数据:物料基础信息缓存24小时
- 实时数据:生产进度缓存5分钟
- 使用cache_memoize装饰器简化缓存管理
5. 典型问题排查实录
5.1 微信小程序常见问题
问题1:iOS设备扫码成功率低
- 原因:微信iOS版对相机分辨率处理不同
- 解决:调整scanCode的scanType参数为['barCode', 'qrCode']
问题2:页面白屏
- 排查步骤:
- 检查基础库版本是否>2.15.0
- 确认域名已加入小程序后台request合法域名
- 使用vConsole查看具体报错
5.2 后端性能问题
案例:导出Excel时内存溢出
- 分析:一次性查询10万条记录
- 优化方案:
python复制def export_large_queryset(qs): output = BytesIO() workbook = Workbook(output) batch_size = 5000 for i in range(0, qs.count(), batch_size): batch = qs[i:i+batch_size] # 处理批次数据... return output
6. 扩展开发建议
6.1 与MES系统集成
通过OPC UA协议对接PLC设备:
- 使用python-opcua库建立连接
- 设计设备状态中间表:
sql复制CREATE TABLE device_status ( device_id VARCHAR(32) PRIMARY KEY, last_update TIMESTAMP, status ENUM('running','idle','fault') );
6.2 数据分析增强
使用Pandas实现高级分析:
python复制def analyze_production_cycle():
df = pd.DataFrame.from_records(
WorkOrder.objects.values('start_time','end_time')
)
df['duration'] = df['end_time'] - df['start_time']
return df.groupby(pd.Grouper(key='start_time', freq='W'))['duration'].mean()
实际部署时发现,车间网络环境复杂,建议:
- 准备离线模式方案
- 关键接口实现自动重试机制
- 使用HTTP缓存头减少流量消耗