1. 项目背景与核心价值
汽车4S店作为集销售(Sale)、零配件(Sparepart)、售后服务(Service)、信息反馈(Survey)于一体的综合服务体,传统管理模式面临三大痛点:纸质工单易丢失、各部门数据孤岛、客户体验不连贯。我们团队开发的这套基于SpringBoot+Android的双端系统,正是为了解决这些行业顽疾。
这个毕设项目的独特之处在于实现了"三个一体化":
- 业务闭环:从售前咨询到售后保养的全生命周期管理
- 数据贯通:销售部门与维修车间的实时数据共享
- 终端协同:PC端后台与移动APP的无缝衔接
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构设计
2.1 技术栈选型分析
后端采用SpringBoot 2.7 + MyBatis Plus组合,主要基于以下考量:
- 快速开发:SpringBoot的自动配置特性适合毕设周期
- 数据安全:配合Shiro实现细粒度权限控制
- 接口规范:Swagger UI自动生成API文档
- 性能保障:Redis缓存高频访问的配件库存数据
前端采用Android原生开发而非跨平台方案,关键原因:
- 硬件交互:需要直接调用蓝牙连接OBD诊断设备
- 体验优化:原生动画效果更流畅
- 功能扩展:便于后期集成AR看车等创新功能
2.2 模块化设计
系统划分为6个核心模块:
-
客户关系管理(CRM)
- 客户画像分析
- 试驾预约系统
- 生日自动提醒
-
销售管理
- 整车库存三维展示
- 金融方案计算器
- 电子合同签署
-
维修服务
- 智能派工算法
- 维修进度直播
- 旧件展示系统
-
配件管理
- 智能预警补货
- 供应商比价
- 条码扫描入库
-
财务系统
- 多维报表分析
- 微信自动对账
- 成本核算
-
移动端APP
- 技师接单抢单
- 客户服务评价
- 远程诊断支持
3. 核心功能实现细节
3.1 智能派工算法实现
维修车间的效率瓶颈往往在于人工派工,我们设计的加权评分算法包含以下维度:
java复制// 技师能力模型
public class TechScore {
private int skillLevel; // 技能等级(1-5)
private double avgRating; // 历史评分(0-5)
private int currentWorkload; // 当前任务数
private boolean isCertified; // 厂家认证
public double calculateScore() {
double base = skillLevel * 2 + avgRating * 1.5;
if(currentWorkload > 3) base *= 0.7;
return isCertified ? base * 1.2 : base;
}
}
3.2 移动端关键技术
APP开发中攻克了三个技术难点:
- 离线模式处理:采用Room数据库实现工单本地缓存,网络恢复后自动同步
- 文件上传优化:使用OkHttp的断点续传功能处理维修照片上传
- 实时通信:通过WebSocket实现服务提醒推送
重要提示:AndroidManifest中必须配置
才能保证消息推送的可靠性
4. 数据库设计精要
4.1 关键表结构
sql复制CREATE TABLE repair_order (
id BIGINT PRIMARY KEY,
vin VARCHAR(17) NOT NULL,
customer_id BIGINT,
tech_id BIGINT,
status ENUM('pending','processing','quality_check','completed'),
estimated_time DECIMAL(10,2),
actual_time DECIMAL(10,2),
CONSTRAINT fk_tech FOREIGN KEY (tech_id) REFERENCES technician(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 建立复合索引提升查询效率
CREATE INDEX idx_status_tech ON repair_order(status, tech_id);
4.2 查询优化实践
销售报表查询的优化方案:
- 使用列式存储:对分析型查询采用ClickHouse
- 预聚合策略:定时任务提前计算月度指标
- 读写分离:报表查询走从库
5. 典型问题解决方案
5.1 并发冲突处理
销售与仓库的库存更新冲突通过乐观锁解决:
java复制@Update("UPDATE car_inventory SET stock=stock-1, version=version+1
WHERE id=#{id} AND version=#{version}")
int deductStockWithVersion(@Param("id") Long id, @Param("version") int version);
// 调用示例
int retry = 3;
while(retry-- > 0){
CarInventory car = inventoryMapper.selectById(order.getCarId());
if(car.getStock() < 1) throw new BusinessException("库存不足");
int affected = inventoryMapper.deductStockWithVersion(car.getId(), car.getVersion());
if(affected > 0) break;
}
5.2 移动端兼容性问题
针对Android碎片化问题,我们采取的措施:
- 版本检测:在APP启动时检查系统API Level
- 功能降级:对低版本设备禁用相机扫码功能
- 统一DPI:所有尺寸使用dp单位,图标提供多套分辨率
6. 扩展功能展望
系统预留了三个重要扩展接口:
- 车联网数据接入:通过OBD-II读取车辆实时数据
- 智能预测:基于历史数据预测保养需求
- VR展厅:集成Unity实现3D看车
实际开发中发现,使用RecyclerView实现配件列表时,如果不正确使用DiffUtil会导致内存溢出。我们的解决方案是:
kotlin复制class PartDiffCallback(
private val oldList: List<Part>,
private val newList: List<Part>
) : DiffUtil.Callback() {
// 实现必要的比对方法
override fun areItemsTheSame(oldPos: Int, newPos: Int) =
oldList[oldPos].id == newList[newPos].id
}
这个项目让我深刻体会到,企业级应用开发不仅要考虑功能实现,更要关注:
- 业务流程的合规性(如三包凭证管理)
- 异常场景的容错处理(如网络中断时的数据保全)
- 人机交互的防错设计(如重要操作的二次确认)
建议后续开发者可以重点优化维修工单的语音输入功能,这在车间嘈杂环境中会大幅提升操作效率。另外,引入区块链技术存储维修记录,将有效提升数据公信力。
