1. 项目背景与核心需求
宿舍管理一直是企事业单位后勤工作中的重要环节。传统的手工登记、Excel表格管理方式存在信息更新滞后、统计效率低下、权限管理混乱等问题。随着企业规模扩大,员工流动性增强,一套高效的宿舍管理系统成为刚需。
SpringBoot作为当前Java领域最流行的微服务框架,其开箱即用的特性非常适合快速开发此类中小型管理系统。我们设计的系统需要解决以下核心痛点:
- 分配效率:新员工入职时快速匹配可用宿舍,避免人工查找的空置浪费
- 费用透明:水电费、物业费自动计算生成账单,减少人工核算错误
- 维修响应:在线报修流程化,维修进度可视化追踪
- 安全管控:访客登记电子化,异常出入实时预警
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构设计
2.1 整体技术栈选型
采用经典的三层架构设计:
code复制前端:Thymeleaf + Bootstrap + ECharts
后端:SpringBoot 2.7 + Spring Security + MyBatis-Plus
数据库:MySQL 8.0 + Redis缓存
中间件:RabbitMQ消息队列
选择MyBatis-Plus而非JPA的考虑:
- 宿舍管理涉及多表复杂关联查询(如员工-宿舍-费用关联)
- 需要灵活编写自定义SQL处理分页统计需求
- 动态条件构造器更适合多条件筛选场景
2.2 核心模块划分
mermaid复制graph TD
A[系统门户] --> B[员工端]
A --> C[管理员端]
B --> D[我的宿舍]
B --> E[费用查询]
B --> F[维修申请]
C --> G[房源管理]
C --> H[分配审批]
C --> I[报表统计]
3. 关键功能实现细节
3.1 智能宿舍分配算法
核心逻辑采用贪心算法实现:
java复制public List<Dormitory> autoAllocate(Employee employee) {
// 规则1:优先分配同部门集中楼层
List<Dormitory> sameDept = dormMapper.selectByDept(
employee.getDeptId(),
employee.getGender()
);
// 规则2:按职级匹配房间标准
sameDept.removeIf(d -> !d.getLevel().equals(employee.getLevel()));
// 规则3:选择当前空置率最高的楼栋
return sameDept.stream()
.sorted(Comparator.comparingDouble(Dormitory::getVacancyRate).reversed())
.limit(3)
.collect(Collectors.toList());
}
3.2 水电费分摊计算
采用三级分摊策略:
- 基础用量:按人数平均分摊公共区域能耗
- 阶梯计价:根据当地水电公司收费标准动态计算
- 房间系数:向阳房间增加10%空调能耗系数
sql复制-- 月度水电费计算视图
CREATE VIEW utility_cost_view AS
SELECT
d.dorm_id,
SUM(e.base_amount * d.people_count) AS base_cost,
CASE
WHEN SUM(e.total_usage) > 500 THEN 1.2
WHEN SUM(e.total_usage) > 300 THEN 1.0
ELSE 0.8
END AS rate
FROM
electricity_records e
JOIN
dormitory d ON e.building_id = d.building_id
GROUP BY
d.dorm_id;
4. 安全与性能优化
4.1 权限控制方案
采用RBAC模型扩展实现"部门-楼栋"双维度权限:
yaml复制security:
role-hierarchy:
ROLE_ADMIN > ROLE_MANAGER
ROLE_MANAGER > ROLE_USER
dynamic-permission: true
自定义权限注解:
java复制@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@PreAuthorize("hasPermission(#buildingId, 'DORM_MANAGE')")
public @interface BuildingPermission {}
4.2 高并发场景应对
针对开学季集中入住场景:
- 使用Redis缓存房源状态信息
- 采用乐观锁防止超分配:
java复制@Transactional
public boolean applyDormitory(Long dormId, Long empId) {
Dormitory dorm = dormMapper.selectById(dormId);
if (dorm.getAvailableBeds() > 0) {
int updated = dormMapper.updateVacancy(
dormId,
dorm.getVersion()
);
if (updated > 0) {
// 分配成功逻辑
}
}
return false;
}
5. 典型业务场景示例
5.1 维修工单流转
状态机设计:
java复制public enum RepairStatus {
PENDING(1, "待接单"),
ACCEPTED(2, "已派工"),
PROCESSING(3, "维修中"),
COMPLETED(4, "已完成"),
REJECTED(5, "已驳回");
@JsonValue
public int getCode() {
return code;
}
}
工单超时处理:
java复制@Scheduled(cron = "0 0/30 * * * ?")
public void checkTimeoutRepairs() {
List<RepairOrder> timeoutOrders = repairMapper.selectTimeoutOrders();
timeoutOrders.forEach(order -> {
order.setStatus(RepairStatus.REJECTED);
notifyService.sendTimeoutAlert(order);
});
}
6. 报表统计实现
6.1 入住率热力图
使用ECharts实现楼栋维度可视化:
javascript复制function initHeatmap() {
$.get('/api/dorm/occupancy-rate', function(data) {
const chart = echarts.init(document.getElementById('heatmap'));
const option = {
tooltip: {
formatter: params => {
return `${params.data.building}<br/>
入住率: ${params.value[2]}%<br/>
空床数: ${params.data.vacant}`;
}
},
visualMap: {
min: 0,
max: 100,
calculable: true
},
series: [{
type: 'heatmap',
data: data.map(item => [
item.xAxis,
item.yAxis,
item.rate,
item.vacant
])
}]
};
chart.setOption(option);
});
}
6.2 费用趋势分析
采用MyBatis动态SQL构建多维度查询:
xml复制<select id="selectCostTrend" resultType="CostTrendDTO">
SELECT
DATE_FORMAT(record_date,'%Y-%m') AS month,
SUM(water_cost) AS water,
SUM(electric_cost) AS electric,
AVG(per_capita_cost) AS avg_cost
FROM
dorm_cost_record
<where>
<if test="buildingId != null">
AND building_id = #{buildingId}
</if>
<if test="year != null">
AND YEAR(record_date) = #{year}
</if>
</where>
GROUP BY
DATE_FORMAT(record_date,'%Y-%m')
ORDER BY
month ASC
</select>
7. 部署与运维方案
7.1 容器化部署
Docker Compose配置示例:
yaml复制version: '3'
services:
app:
image: dorm-system:1.0
ports:
- "8080:8080"
environment:
- SPRING_PROFILES_ACTIVE=prod
depends_on:
- redis
- mysql
mysql:
image: mysql:8.0
volumes:
- db_data:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=yourpassword
redis:
image: redis:6.2
ports:
- "6379:6379"
7.2 健康检查端点
Spring Boot Actuator配置:
properties复制management.endpoints.web.exposure.include=health,info,metrics
management.endpoint.health.show-details=always
management.health.redis.enabled=true
management.health.db.enabled=true
自定义健康指标:
java复制@Component
public class DormHealthIndicator implements HealthIndicator {
@Override
public Health health() {
int errorCount = checkDormStatus();
if (errorCount > 0) {
return Health.down()
.withDetail("error_buildings", errorCount)
.build();
}
return Health.up().build();
}
}
8. 项目演进方向
- 物联网集成:对接智能电表、门禁系统实现数据自动采集
- 移动端扩展:开发微信小程序端方便员工随时查询
- 预测分析:基于历史数据预测下一季度房源需求
- 工作流引擎:集成Camunda实现复杂审批流程配置化
实际开发中我们发现,宿舍管理系统虽然业务逻辑相对简单,但在以下方面需要特别注意:
- 数据变更的审计追踪需求强烈,建议采用Hibernate Envers实现
- 批量导入员工数据时需要考虑事务边界问题
- 节假日期间的临时住宿安排需要特殊流程处理
