1. 项目背景与核心需求
校园维修报修管理系统是高校后勤管理数字化转型的重要一环。传统报修流程普遍存在响应慢、跟踪难、效率低等问题:学生需要到后勤处填写纸质表单,维修工单流转依赖人工传递,维修进度无法实时查询,数据统计更是困难重重。我们团队在某211高校的实际调研中发现,平均每单维修从报修到完成需要3-5天,其中仅沟通确认环节就消耗了40%的时间。
微信小程序作为轻量级应用平台,具有无需安装、即用即走的特点,特别适合高频低复杂度的报修场景。结合SpringBoot后端的高并发处理能力,可实现以下核心需求:
- 学生端:扫码即报修(支持文字/语音/图片描述)、实时进度追踪、历史记录查询、服务评价
- 维修端:智能工单分配(基于位置/工种)、移动端接单处理、配件申领、完工确认
- 管理端:数据可视化大屏(报修热力图、响应时效分析)、维修人员KPI考核、耗材库存预警
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构设计
2.1 整体技术栈选型
采用分层架构设计,前后端完全分离:
code复制[微信小程序] ←WebSocket→ [SpringBoot REST API] ←MyBatis→ [MySQL]
↑
[Redis缓存]
↑
[阿里云OSS]
选择SpringBoot而非传统SSM框架的三大理由:
- 自动配置特性简化了微信接口所需的HTTPS证书配置
- 内嵌Tomcat支持高并发请求(实测单机可承载500+TPS)
- Starter生态快速集成WebSocket(用于实时通知)和Redis(缓存维修人员位置)
2.2 微信小程序关键设计
首页采用"FAB+分类入口"的混合导航模式:
xml复制<!-- 悬浮报修按钮 -->
<view class="fab" bindtap="toReport">
<image src="/images/add.png"></image>
</view>
<!-- 分类入口宫格 -->
<scroll-view scroll-y>
<grid items="{{categories}}">
<block wx:for="{{items}}">
<navigator url="/pages/list?id={{item.id}}">
<image src="{{item.icon}}"></image>
<text>{{item.name}}</text>
</navigator>
</block>
</grid>
</scroll-view>
特别注意:
- 必须配置
request合法域名到微信后台 - 图片上传需使用
wx.chooseMessageFile而非chooseImage(支持原图) - 地理位置获取需要
wx.getLocation接口资质审核
3. 核心业务实现
3.1 报修工单状态机设计
定义六种状态及转换规则:
java复制public enum RepairStatus {
PENDING(0, "待接单"),
ACCEPTED(1, "已接单"),
PROCESSING(2, "维修中"),
MATERIAL_NEEDED(3, "待配件"),
COMPLETED(4, "已完成"),
CANCELLED(-1, "已取消");
// 状态转换校验
public static boolean isValidTransition(int from, int to) {
switch (from) {
case 0: return to == 1 || to == -1; // 待接单→已接单/取消
case 1: return to == 2; // 已接单→维修中
// ...其他规则省略
}
}
}
3.2 智能派单算法
基于维修工实时位置和技能标签的加权评分算法:
java复制public List<Worker> matchWorkers(RepairOrder order) {
return workerDao.listBySkill(order.getType())
.stream()
.filter(w -> DistanceUtil.calculate(
order.getLocation(),
w.getLocation()) < 5000) // 5公里范围内
.sorted(Comparator
.comparingInt(w -> w.getCurrentOrders().size()) // 当前任务数
.thenComparingDouble(w -> DistanceUtil.calculate(
order.getLocation(),
w.getLocation()))) // 距离
.limit(3)
.collect(Collectors.toList());
}
关键优化:使用Redis Geo存储维修工位置,ZSET维护工人负载情况,查询性能提升20倍
4. 性能优化实践
4.1 图片上传方案对比
| 方案 | 上传速度 | 费用 | 可靠性 | 适用场景 |
|---|---|---|---|---|
| 微信临时存储 | 快 | 免费 | 3天有效期 | 临时预览 |
| 自建FastDFS | 中 | 服务器成本 | 需维护 | 小规模部署 |
| 阿里云OSS | 快 | 按量付费 | 高 | 生产环境推荐 |
最终采用OSS直传方案:
- 后端生成临时STS凭证
- 小程序端调用
wx.uploadFile直传OSS - 回调通知后端记录文件信息
4.2 高并发处理方案
压测发现工单提交接口在200并发时RT达到3s,优化措施:
- 异步日志记录:使用
@Async注解分离业务逻辑与日志记录 - 库存预扣减:采用Redis原子操作避免超卖
java复制redisTemplate.opsForValue().increment("stock_" + itemId, -count); - 热点数据缓存:维修工信息使用
@Cacheable注解缓存
优化后500并发下RT稳定在800ms以内。
5. 典型问题排查
5.1 微信登录态维护
常见问题:登录态过期导致频繁跳转登录页
解决方案:
- 使用
wx.checkSession检测session有效性 - 实现无感刷新方案:
javascript复制function refreshToken() { return new Promise((resolve, reject) => { wx.login({ success: res => { api.refreshToken({code: res.code}).then(resolve) } }) }) }
5.2 工单状态同步延迟
现象:维修工接单后学生端仍显示"待接单"
排查步骤:
- 检查WebSocket连接状态(使用Chrome开发者工具WS面板)
- 验证Redis Pub/Sub消息是否投递成功
- 确认小程序端onMessage事件监听正常
最终方案:增加轮询补偿机制,当WS断开时自动切换至HTTP轮询。
6. 扩展性设计
6.1 多校区适配方案
通过campus_id字段实现数据隔离:
- 微信小程序根据GPS自动匹配校区
- 管理员可手动分配跨校区工单
- 统计报表支持按校区筛选
6.2 硬件对接能力
预留IoT接口用于智能设备对接:
- 水电表异常自动报修接口
- 门禁故障事件订阅
- 维修工蓝牙工牌打卡验证
java复制@RabbitListener(queues = "iot.event")
public void handleIoTEvent(IoTEvent event) {
if (event.getType() == EventType.WATER_LEAK) {
repairService.createAutoOrder(
event.getDeviceId(),
"水管漏水",
event.getLocation());
}
}
在实际部署中,这套系统使某高校的平均报修响应时间从26小时缩短至2.3小时,学生满意度提升40%。关键经验是:微信小程序要充分利用客户端能力(如拍照、定位),而复杂业务逻辑应尽量后移。对于状态流转类的业务,建议在数据库层面增加状态变更日志表,这对后续的工单溯源非常重要。
