系统落地:校园后勤服务平台
系统实现
这个场景已经作为独立的"校园后勤服务平台"落地实施。
在完整系统中的位置
校园后勤服务平台
├── 宿舍报修管理
│ ├── 学生报修
│ ├── 智能派单
│ └── 进度跟踪
├── 教室/会议室预约
│ ├── 资源管理
│ ├── 预约管理
│ └── 使用统计
└── 物资领用管理
├── 在线申请
├── 审批流程
└── 库存管理功能模块
1. 学生端(微信小程序)
一键报修界面:
┌───────────────────────────┐
│ 宿舍报修 │
├───────────────────────────┤
│ │
│ 我的宿舍: │
│ 1号宿舍楼-201室 │
│ │
│ 报修类型: │
│ [ ] 水电维修 │
│ [ ] 空调维修 │
│ [ ] 门窗维修 │
│ [ ] 其他 │
│ │
│ 问题描述: │
│ [________________] │
│ │
│ 上传照片: │
│ [📷] [📷] [📷] │
│ │
│ [提交报修] │
└───────────────────────────┘教室预约界面:
┌───────────────────────────┐
│ 教室预约 │
├───────────────────────────┤
│ 选择日期:[2025-01-16] │
│ │
│ 教室列表: │
│ ┌─────────────────────┐ │
│ │ 101教室 │ │
│ │ 容量:50人 │ │
│ │ 状态:空闲 │ │
│ │ 可用时段: │ │
│ │ 08:00-12:00 ✓ │ │
│ │ 14:00-18:00 ✓ │ │
│ │ │ │
│ │ [立即预约] │ │
│ └─────────────────────┘ │
│ │
│ ┌─────────────────────┐ │
│ │ 102教室 │ │
│ │ 容量:80人 │ │
│ │ 状态:已预约 │ │
│ │ 已预约时段: │ │
│ │ 09:00-11:00 │ │
│ │ 可用时段: │ │
│ │ 14:00-18:00 ✓ │ │
│ │ │ │
│ │ [立即预约] │ │
│ └─────────────────────┘ │
└───────────────────────────┘物资申请界面:
┌───────────────────────────┐
│ 物资申请 │
├───────────────────────────┤
│ 选择物资: │
│ [搜索物资名称...] │
│ │
│ 物资列表: │
│ ┌─────────────────────┐ │
│ │ 投影仪 │ │
│ │ 库存:5台 │ │
│ │ 单价:500元/台 │ │
│ │ 数量:[1] 台 │ │
│ │ [加入申请] │ │
│ └─────────────────────┘ │
│ │
│ 申请目的: │
│ [________________] │
│ │
│ 总金额:500元 │
│ (需要系主任审批) │
│ │
│ [提交申请] │
└───────────────────────────┘核心功能:
- ✓ 一键报修,自动获取宿舍位置
- ✓ 可视化教室预约,实时查看可用时段
- ✓ 在线物资申请,自动流转审批
2. 教师端(微信小程序)
教室预约管理:
┌───────────────────────────┐
│ 我的预约 │
├───────────────────────────┤
│ ┌─────────────────────┐ │
│ │ 101教室 │ │
│ │ 2025-01-16 09:00-11:00│ │
│ │ 状态:已预约 │ │
│ │ │ │
│ │ [签到] [取消] │ │
│ └─────────────────────┘ │
│ │
│ ┌─────────────────────┐ │
│ │ 102教室 │ │
│ │ 2025-01-17 14:00-16:00│ │
│ │ 状态:待审批 │ │
│ │ │ │
│ │ [查看详情] [取消] │ │
│ └─────────────────────┘ │
└───────────────────────────┘审批管理:
┌───────────────────────────┐
│ 待审批申请 │
├───────────────────────────┤
│ ┌─────────────────────┐ │
│ │ 申请人:张三 │ │
│ │ 物资:投影仪 x1 │ │
│ │ 金额:500元 │ │
│ │ 申请时间:1小时前 │ │
│ │ │ │
│ │ [通过] [拒绝] │ │
│ └─────────────────────┘ │
└───────────────────────────┘3. 管理端(Web 后台)
数据看板:
┌─────────────────────────────────────┐
│ 校园后勤服务平台 - 数据看板 │
├─────────────────────────────────────┤
│ │
│ 今日数据 │
│ ┌──────┐ ┌──────┐ ┌──────┐ │
│ │ 报修 │ │ 预约 │ │ 申请 │ │
│ │ 28 │ │ 45 │ │ 12 │ │
│ └──────┘ └──────┘ └──────┘ │
│ │
│ 报修响应时间:15分钟 ⬇️ 50% │
│ 教室利用率:78% ⬆️ 25% │
│ 物资申请审批率:95% ⬆️ 20% │
│ │
│ 教室使用统计 │
│ ┌─────────────────────────────┐ │
│ │ 101教室:使用率 85% │ │
│ │ 102教室:使用率 72% │ │
│ │ 103教室:使用率 68% │ │
│ └─────────────────────────────┘ │
│ │
│ [查看详细报表] │
└─────────────────────────────────────┘教室预约管理:
┌─────────────────────────────────────┐
│ 教室预约管理 │
├─────────────────────────────────────┤
│ 筛选:[全部] [已预约] [空闲] [维护中] │
│ │
│ 教室名称 │ 容量 │ 状态 │ 今日预约 │ 操作 │
│ ───────────────────────────────── │
│ 101教室 │ 50人 │ 空闲 │ 3次 │ [管理]│
│ 102教室 │ 80人 │ 已预约│ 5次 │ [管理]│
│ 103教室 │ 100人│ 维护中│ 0次 │ [管理]│
│ │
│ [添加教室] [批量操作] │
└─────────────────────────────────────┘物资库存管理:
┌─────────────────────────────────────┐
│ 物资库存管理 │
├─────────────────────────────────────┤
│ 筛选:[全部] [库存不足] [库存充足] │
│ │
│ 物资名称 │ 类别 │ 库存 │ 安全库存 │ 操作 │
│ ───────────────────────────────── │
│ 投影仪 │ 设备 │ 5台 │ 3台 │ [管理]│
│ 笔记本电脑│设备 │ 2台 │ 5台 │⚠️[补货]│
│ 白板 │ 设备 │ 10块 │ 5块 │ [管理]│
│ │
│ [添加物资] [批量入库] [导出报表] │
└─────────────────────────────────────┘实施效果
定量效果
| 指标 | 上线前 | 上线后 | 提升 |
|---|---|---|---|
| 报修平均响应时间 | 2 小时 | 15 分钟 | ⬇️ 87.5% |
| 教室利用率 | 62% | 78% | ⬆️ 25.8% |
| 预约冲突率 | ~15% | <2% | ⬇️ 86.7% |
| 物资申请审批时间 | 3-5 天 | 1-2 天 | ⬇️ 60% |
| 学生满意度 | 3.5/5.0 | 4.5/5.0 | ⬆️ 28.6% |
定性效果
学生反馈:
"以前报修要打电话,经常占线,现在微信小程序就能报修,还能看到维修工什么时候来,太方便了。" —— 张同学
教师反馈:
"教室预约以前用 Excel,经常冲突,现在系统自动检测冲突,还能看到实时可用时段,太省心了。" —— 李老师
后勤处反馈:
"最大的变化是数据透明了,报修响应时间、教室使用率、物资库存都有准确的数据,管理更有依据了。" —— 王主任(后勤处)
技术实现
技术栈
后端:
- Node.js + Express
- MySQL 数据库
- Redis 缓存
- WebSocket 实时通信
前端:
- 微信小程序(学生/教师端)
- Vue 3 + Element Plus(PC 管理后台)
集成:
- 微信公众号推送
- 企业微信通知
- 教务系统对接(可选)
核心代码片段
typescript
// 教室预约冲突检测服务
class ReservationService {
async createReservation(data: CreateReservationDto): Promise<Reservation> {
// 1. 检查冲突
const conflictResult = await this.checkConflict(
data.resourceId,
data.startTime,
data.endTime
);
if (!conflictResult.canReserve) {
throw new ConflictException('预约时间冲突', conflictResult);
}
// 2. 检查预约限制
const canReserve = await this.checkDailyLimit(
data.userId,
data.startTime
);
if (!canReserve) {
throw new BadRequestException('已达到每日预约上限');
}
// 3. 创建预约
const reservation = await this.reservationRepository.create({
...data,
status: 'reserved',
needApproval: await this.checkNeedApproval(data.resourceId)
});
// 4. 如果需要审批,发起审批流程
if (reservation.needApproval) {
await this.startApprovalFlow(reservation.id);
}
// 5. 通知用户
await this.notifyUser(data.userId, {
type: 'RESERVATION_CREATED',
reservationId: reservation.id
});
return reservation;
}
private async checkConflict(
resourceId: string,
startTime: Date,
endTime: Date
): Promise<ConflictResult> {
// 获取该资源的所有有效预约
const reservations = await this.reservationRepository.find({
resourceId,
status: ['reserved', 'in-use'],
$or: [
{
startTime: { $lte: endTime },
endTime: { $gte: startTime }
}
]
});
// 检查时间重叠
const timeConflicts = reservations.filter(r =>
this.isTimeOverlap(startTime, endTime, r.startTime, r.endTime)
);
// 检查时间间隔
const intervalConflicts = [];
// 检查与前一个预约的间隔
const previous = reservations
.filter(r => r.endTime <= startTime)
.sort((a, b) => b.endTime.getTime() - a.endTime.getTime())[0];
if (previous && !this.hasEnoughInterval(previous.endTime, startTime)) {
intervalConflicts.push({
type: 'BEFORE',
reservation: previous
});
}
return {
hasConflict: timeConflicts.length > 0 || intervalConflicts.length > 0,
timeConflicts,
intervalConflicts,
canReserve: timeConflicts.length === 0 && intervalConflicts.length === 0
};
}
}扩展应用
这个场景的逻辑已经被复用到以下场景:
- 企业会议室预约 - 办公会议室预约管理
- 设备预约系统 - 实验室设备、教学设备预约
- 场地预约系统 - 运动场地、活动场地预约
查看完整系统
本场景是独立的"校园后勤服务平台"。
系统演示
如需查看系统演示或了解部署方案,请 联系我们 →

