1. 项目背景与核心需求
校园故障报修系统是高校信息化建设中的重要组成部分。在传统模式下,学生遇到宿舍设备损坏、教室设施故障等问题时,往往需要通过填写纸质表单或电话联系后勤部门,这种方式存在响应慢、流程不透明、维修状态难以追踪等痛点。
我去年为某职业技术学院开发的这套系统,核心解决了以下问题:
- 报修流程电子化:学生通过微信端提交报修单,自动流转到对应维修部门
- 状态实时追踪:从"待受理"到"已完成"全流程状态可视化
- 数据统计分析:自动生成设备故障热力图,辅助后勤决策
- 多角色协同:学生、宿管、维修工、后勤管理员各司其职
关键设计原则:采用SpringBoot的约定优于配置特性,确保即使非IT专业的后勤人员也能快速上手系统管理。
2. 技术架构设计
2.1 整体技术栈选型
系统采用经典的三层架构,具体技术组件如下:
| 层级 | 技术选型 | 选型理由 |
|---|---|---|
| 前端 | Thymeleaf + Bootstrap | 兼顾后台管理页面的快速开发与响应式适配 |
| 后端框架 | SpringBoot 2.7.3 | 内嵌Tomcat、自动配置等特性大幅降低部署复杂度 |
| 安全控制 | Spring Security | 提供完善的RBAC权限控制模型 |
| 持久层 | MyBatis-Plus | 简化CRUD操作,内置分页插件 |
| 数据库 | MySQL 8.0 | 高校信息化系统的标配数据库 |
| 消息队列 | RabbitMQ | 处理高峰期并发的报修单提交 |
| 缓存 | Redis | 存储会话信息及高频访问的字典数据 |
| 文件存储 | 本地存储+七牛云 | 报修图片等资源采用混合存储策略 |
2.2 核心业务流程设计
报修主流程的状态机设计尤为关键:
java复制// 报修单状态枚举定义
public enum RepairStatus {
PENDING(0, "待受理"),
ASSIGNED(1, "已派单"),
PROCESSING(2, "维修中"),
COMPLETED(3, "已完成"),
REJECTED(4, "已驳回");
// 省略getter/setter
}
状态转换规则通过状态模式实现,核心逻辑包含:
- 学生提交报修单(PENDING)
- 后勤管理员分配维修工(ASSIGNED)
- 维修工开始处理(PROCESSING)
- 维修完成后双方互评(COMPLETED)
- 不符合要求的报修单可被驳回(REJECTED)
3. 关键实现细节
3.1 多文件上传处理
报修时通常需要上传故障部位的图片,系统采用分段上传策略:
java复制@PostMapping("/upload")
public R upload(@RequestParam MultipartFile[] files) {
// 1. 校验单文件不超过5MB
// 2. 使用UUID重命名文件
// 3. 异步上传到七牛云
// 4. 返回访问URL集合
}
踩坑记录:最初直接使用transferTo()方法存储大文件时,曾出现内存溢出问题。后改用Files.copy()配合临时文件方案解决。
3.2 维修工智能派单算法
根据维修工的专业技能、当前位置、当前工作量实现智能派单:
sql复制SELECT worker_id
FROM repair_worker
WHERE skill_set LIKE '%电工%'
AND status = 1
ORDER BY (
ST_Distance(location, POINT(116.404, 39.915))
+ current_task_count * 10
) ASC
LIMIT 1
3.3 微信消息模板推送
通过微信公众号实时推送状态变更通知:
properties复制# application.yml配置
wechat:
template-id: T123456
url: https://yourdomain.com/repair/detail/${repairId}
4. 部署与性能优化
4.1 容器化部署方案
采用Docker Compose编排服务:
dockerfile复制version: '3'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
redis:
image: redis:alpine
app:
build: .
ports:
- "8080:8080"
depends_on:
- mysql
- redis
4.2 缓存策略设计
高频访问数据缓存方案:
| 数据类型 | 缓存策略 | TTL |
|---|---|---|
| 维修工信息 | Redis Hash | 30min |
| 报修单状态 | Caffeine本地缓存 | 5min |
| 字典数据 | Redis String + 主动刷新 | 1hour |
5. 源码解析与二次开发
项目采用模块化设计,核心包结构如下:
code复制src/main/java
├── config # 配置类
├── controller # 控制器层
├── entity # 实体类
├── enums # 枚举定义
├── mapper # MyBatis接口
├── service | # 服务层
│ ├── impl | # 服务实现
├── task # 定时任务
└── util # 工具类
重点推荐阅读的源码文件:
RepairOrderController.java- 报修单状态流转控制WechatMsgServiceImpl.java- 微信消息服务实现RepairStatsScheduler.java- 维修数据统计任务
二次开发建议:
- 如需对接企业微信,可扩展
MsgService接口 - 增加智能客服功能可集成NLP服务
- 物联网设备监控可新增
DeviceModule
6. 常见问题解决方案
6.1 微信授权失败排查
典型错误场景:
- 公众号IP白名单未配置
- 网页授权域名未正确设置
- 前端获取code时未进行URLEncode
检查清单:
bash复制curl -X GET "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=YOUR_APPID&secret=YOUR_SECRET"
6.2 MyBatis-Plus分页失效
正确配置方式:
java复制@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
7. 项目演进方向
在实际运行半年后,我们规划了以下优化方向:
- 移动端体验升级:开发微信小程序版本,支持扫码报修
- 知识库建设:常见故障自助解决方案库
- 预测性维护:基于历史数据的设备故障预测
- 工单看板:维修工端的任务可视化调度
这套系统目前已在3所高校稳定运行,日均处理报修单200+。最大的收获是认识到:校园信息化系统不仅要技术过关,更要深入理解行政业务流程。比如最初设计的自动派单算法,在实际运行中不得不加入"院系优先"等业务规则。
