1. 项目背景与需求分析
机床厂作为典型的制造业企业,厂区内各类运输车辆(如叉车、平板拖车、物料转运车等)的日常管理一直是个痛点。传统的手工登记方式存在以下问题:
- 车辆使用状态无法实时掌握,经常出现"车等人"或"人等车"的情况
- 维保记录容易遗漏,存在安全隐患
- 调度效率低下,影响生产节拍
- 缺乏数据统计分析,难以优化车辆配置
这个毕业设计项目正是针对这些痛点,采用Java技术栈开发一套完整的车辆管理系统。系统需要实现:
- 基础信息管理(车辆档案、驾驶员信息)
- 使用调度管理(申请、审批、派车)
- 维保管理(定期保养、故障维修)
- 统计分析(使用率、故障率等KPI)
- 系统管理(角色权限、操作日志)
提示:这类工业场景的管理系统要特别注意业务流程与生产实际的契合度,比如机床厂的车辆调度往往需要与生产计划联动。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术选型与架构设计
2.1 技术栈选择依据
基于当前Java生态和项目需求,我们采用以下技术组合:
- 后端:Spring Boot 2.7 + MyBatis Plus
- 选择理由:Spring Boot的自动配置特性适合快速开发,MyBatis Plus的ActiveRecord模式能简化DAO层编码
- 前端:Vue 3 + Element Plus
- 选择理由:Vue的渐进式特性适合中小型管理系统,Element Plus提供丰富的工业级UI组件
- 数据库:MySQL 8.0
- 选择理由:事务支持完善,与Java生态集成成熟,社区资源丰富
- 辅助工具:
- Lombok:减少样板代码
- Hutool:工具类集合
- EasyExcel:报表导出
2.2 系统架构设计
采用经典的三层架构,但根据车辆管理特点做了调整:
code复制表示层(Vue)
↓
业务逻辑层(Spring Boot)
↓
数据访问层(MyBatis Plus)
↓
数据库(MySQL)
特别设计了以下几个核心模块:
- 调度引擎模块:处理车辆冲突检测、优先派车等业务逻辑
- 状态机模块:管理车辆生命周期状态(空闲、使用中、维修中、报废)
- 消息通知模块:集成WebSocket实现调度结果实时推送
3. 核心功能实现细节
3.1 车辆调度功能实现
调度是系统的核心功能,其业务流程如下:
- 生产部门提交用车申请(含预计使用时间、载重需求等)
- 系统自动匹配可用车辆(考虑载重、车型、当前位置)
- 调度员确认/调整分配方案
- 系统推送任务给驾驶员
- 驾驶员APP端确认接单
- 实际使用记录(含里程、油耗等数据)
关键技术点:
java复制// 车辆冲突检测算法示例
public List<Vehicle> findAvailableVehicles(LocalDateTime startTime,
LocalDateTime endTime,
BigDecimal requiredLoad) {
// 1. 排除时间段内已有任务的车辆
List<Long> busyVehicleIds = scheduleMapper.selectBusyVehicleIds(startTime, endTime);
// 2. 筛选载重达标的车辆
LambdaQueryWrapper<Vehicle> query = new LambdaQueryWrapper<>();
query.notIn(busyVehicleIds.size() > 0, Vehicle::getId, busyVehicleIds)
.ge(Vehicle::getMaxLoad, requiredLoad)
.eq(Vehicle::getStatus, VehicleStatus.AVAILABLE);
return vehicleMapper.selectList(query);
}
3.2 维保管理实现
采用状态模式设计维保流程:
code复制[正常] → [待保养](里程/时间触发)
↓
[保养中] → [保养完成]
↓
[正常]
数据库设计关键表:
sql复制CREATE TABLE `maintenance_record` (
`id` bigint NOT NULL AUTO_INCREMENT,
`vehicle_id` bigint NOT NULL COMMENT '车辆ID',
`type` tinyint NOT NULL COMMENT '类型(1:定期保养 2:故障维修)',
`start_time` datetime NOT NULL COMMENT '开始时间',
`end_time` datetime DEFAULT NULL COMMENT '完成时间',
`cost` decimal(10,2) DEFAULT NULL COMMENT '费用',
`description` varchar(500) DEFAULT NULL COMMENT '描述',
`attachments` json DEFAULT NULL COMMENT '附件(图片等)',
PRIMARY KEY (`id`),
KEY `idx_vehicle` (`vehicle_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
4. 开发中的典型问题与解决方案
4.1 并发调度冲突问题
当多个调度员同时操作同一车辆时可能出现资源竞争。我们采用乐观锁解决:
java复制@Transactional
public boolean assignVehicle(Long scheduleId, Long vehicleId, Long operatorId) {
// 1. 检查车辆版本号
Vehicle vehicle = vehicleMapper.selectById(vehicleId);
if (vehicle.getStatus() != VehicleStatus.AVAILABLE) {
throw new BusinessException("车辆状态已变更");
}
// 2. 更新车辆状态(带版本校验)
int updated = vehicleMapper.updateStatusWithVersion(
vehicleId,
VehicleStatus.ASSIGNED,
vehicle.getVersion());
if (updated == 0) {
throw new ConcurrentUpdateException("车辆已被其他操作员分配");
}
// 3. 创建调度记录
Schedule record = new Schedule();
record.setVehicleId(vehicleId);
record.setScheduleId(scheduleId);
record.setOperatorId(operatorId);
scheduleDetailMapper.insert(record);
return true;
}
4.2 大数据量导出性能优化
当导出半年以上的使用记录时(约10万行数据),直接查询会导致内存溢出。解决方案:
- 使用MyBatis的流式查询
- 配合EasyExcel的异步导出
- 增加分片参数,允许用户按月份分批导出
关键配置:
yaml复制# application.yml
mybatis:
executor-type: reuse
configuration:
default-fetch-size: 1000
default-statement-timeout: 30
5. 系统特色与创新点
-
可视化调度看板:
- 使用ECharts实现车辆位置热力图
- 甘特图展示车辆使用时间轴
- 支持拖拽调整调度计划
-
智能预警机制:
- 保养到期提前7天预警
- 车辆连续工作超时预警
- 异常油耗/里程波动检测
-
移动端适配:
- 驾驶员APP采用Uniapp跨平台方案
- 支持扫码快速登记车辆状态
- 离线模式应对厂区网络不稳定
6. 部署与实施建议
6.1 硬件配置建议
根据机床厂规模推荐配置:
| 厂区车辆数 | 服务器配置 | 推荐部署方式 |
|---|---|---|
| <50台 | 4核8G内存 100G存储 | 单机部署 |
| 50-200台 | 8核16G内存 200G存储 | Docker集群 |
| >200台 | 16核32G内存 500G存储 | 微服务架构 |
6.2 系统集成方案
建议与现有系统对接:
- ERP系统:同步物料运输需求
- 考勤系统:验证驾驶员资质
- 门禁系统:车辆进出厂自动登记
- IoT平台:接入车载OBD设备数据
7. 项目开发经验总结
在开发过程中有几个值得注意的实践经验:
-
领域模型设计:
- 将"车辆"作为聚合根,维护其状态一致性
- 使用值对象表示车辆位置、维保记录等
-
事务边界控制:
- 调度业务使用@Transactional
- 报表生成等耗时操作避免长事务
-
测试策略:
- 使用Testcontainers做集成测试
- 对调度算法进行压力测试
- 厂区弱网环境模拟测试
这个项目让我深刻体会到工业软件开发的特殊性——不仅要考虑技术实现,更要理解生产现场的实际工作流程。比如车辆调度不仅要看系统里的可用状态,还要考虑实际物理位置与物料搬运路径的匹配度。
