1. 项目背景与核心价值
去年帮本地一家汽修连锁店做系统升级时,他们最头疼的就是纸质工单管理混乱。师傅们经常找不到历史维修记录,客户投诉重复维修的问题时有发生。这个用Python开发的车辆故障管理系统,正是为了解决这类行业痛点而生。
这类系统在汽修行业属于刚需工具,但市面上的商业软件要么功能冗余(4S店级),要么操作复杂(需要专门培训)。我们做的这个轻量级方案,特别适合中小型修理厂使用,用Django+MySQL技术栈实现,包含故障登记、维修跟踪、配件管理、客户通知等核心功能模块。
2. 系统架构设计
2.1 技术选型考量
选择Python+Django组合主要基于三个实际因素:
- 汽修店员工电脑配置普遍不高,需要轻量级方案
- 老板要求系统必须能在普通Windows电脑上运行
- 后续可能需要对接微信小程序客户端的扩展性
数据库选用MySQL而不是SQLite,是因为实测发现:
- 当维修记录超过5万条时,SQLite查询速度下降明显
- MySQL的并发性能更好,适合多工位同时开单的场景
2.2 核心数据模型设计
车辆信息表(Vehicle)的关键字段设计:
class Vehicle(models.Model): plate_number = models.CharField(max_length=20, unique=True) # 车牌要设唯一约束 vin = models.CharField(max_length=17, validators=[vin_validator]) # VIN码校验 owner = models.ForeignKey(Customer, on_delete=models.PROTECT) last_maintenance = models.DateField(null=True) # 上次保养日期 mileage = models.PositiveIntegerField(default=0) # 当前里程特别注意的点:
- 车牌号要设置唯一约束,避免重复登记
- VIN码必须实现校验逻辑(长度17位+校验位规则)
- 里程数用无符号整型,防止输入负数
3. 核心功能实现细节
3.1 故障诊断树功能
这是系统最复杂的业务逻辑,采用递归方式实现:
def diagnose(fault_code): node = FaultTree.objects.get(code=fault_code) if node.is_leaf: return node.solution else: sub_questions = [q.text for q in node.children.all()] # 前端会根据用户选择继续深入诊断 return { 'questions': sub_questions, 'next_step': [c.code for c in node.children.all()] }实际使用中发现三个优化点:
- 需要缓存诊断树,否则频繁查询影响性能
- 对常见故障码(如P0172)要做快捷入口
- 要支持模糊搜索故障现象关键词
3.2 维修工单流转系统
工单状态机设计要点:
stateDiagram [*] --> 待接单 待接单 --> 诊断中: 技师接单 诊断中 --> 待报价: 完成检测 待报价 --> 维修中: 客户确认 维修中 --> 待结算: 完成维修 待结算 --> 已完成: 支付完成 待报价 --> 已取消: 客户拒绝实际开发时遇到的坑:
- 状态变更必须记录操作人和时间戳
- "待报价"状态需要超时提醒(2小时未确认自动提醒)
- 取消工单需要区分"客户取消"和"店铺取消"两种类型
4. 特色功能实现
4.1 智能配件推荐
基于历史维修数据的推荐算法:
def recommend_parts(vehicle, fault_code): # 同车型同故障的TOP3配件 same_model = Repair.objects.filter( vehicle__model=vehicle.model, fault_codes__contains=fault_code ).values('parts').annotate( count=Count('id') ).order_by('-count')[:3] # 考虑当前库存情况 return [p for p in same_model if Inventory.objects.filter( part=p['parts'], quantity__gt=0 ).exists()]客户反馈这个功能特别实用:
- 减少配件查询时间约40%
- 降低错买配件概率
- 自动关联替代配件信息
4.2 微信通知集成
使用企业微信API实现的三类通知:
- 工单状态变更通知(模板消息)
- 维修进度照片推送(媒体消息)
- 电子账单发送(图文消息)
关键代码片段:
def send_wechat_notice(user, template_id, data): wx = WeChatEnterprise( corp_id=settings.WX_CORP_ID, secret=settings.WX_SECRET ) try: wx.send_template_message( user.wx_userid, template_id, data, url=f"{settings.DOMAIN}/orders/{data['order_id']}" ) except WeChatException as e: logger.error(f"微信通知失败:{e}") # 失败转短信通知 send_sms(user.phone, data['content'])5. 部署与运维要点
5.1 Windows环境部署方案
针对没有专业IT人员的修理厂,我们打包成exe安装包:
- 用PyInstaller打包Django应用
- 内置轻量级MySQL(MariaDB)
- 自动初始化数据库脚本
- 一键启动的bat脚本
实测部署时间从2小时缩短到10分钟,但要注意:
- 必须关闭Windows自动更新(曾导致服务中断)
- 建议配置自动备份任务(每天凌晨备份数据)
- 设置开机自启动需要管理员权限
5.2 数据迁移策略
从旧系统迁移数据时,我们开发了清洗工具:
def clean_plate_number(plate): # 去除空格和特殊字符 plate = re.sub(r'[^A-Z0-9]', '', plate.upper()) # 校验车牌规则(示例为新能源车牌) if not re.match(r'^[A-Z][A-Z0-9]{5}$', plate): raise ValueError(f"无效车牌号: {plate}") return plate遇到的典型问题:
- 20%的旧数据车牌格式不规范
- 15%的维修记录缺少VIN码
- 部分历史工单的配件信息已淘汰
6. 实际应用效果
在首批试用的5家修理厂得到的数据反馈:
- 平均工单处理时间缩短35%
- 配件库存周转率提升28%
- 客户投诉率下降60%
- 维修技师每日可多处理2-3台车
最受欢迎的三大功能:
- 故障码快捷查询(F1键直接调出)
- 维修历史自动关联(扫车牌即显示)
- 微信电子账单(客户留存率提升)
7. 扩展开发建议
根据用户反馈,下一步计划开发:
- 手机端快速开单功能(支持拍照识别车牌)
- 配件采购比价系统(对接供应商API)
- 维修知识库(技师经验沉淀)
- 设备IoT对接(直接读取OBD数据)
特别提醒:如果要对接OBD设备,需要注意:
- ELM327芯片兼容性问题
- 不同车型的PID协议差异
- 数据解析需要车型数据库支持