宿舍床位分配管理API提供了床位分配的核心功能,包括:
该接口用于将已分配给学院的床位进一步分配给具体的班级。支持房间优先分配策略,尽量避免混住。
POST /dormBedStudent/dormBedStudent/batchAllocateToClass
xgss:dormBedStudent:allocateToClass
修复日期:2025-01-27
在床位分配过程中,当床位数量小于等于分配的数量时,存在部分床位未能成功分配的问题。具体现象:
roomUsage数组记录房间使用情况,但更新逻辑依赖roomClassMap判断床位归属roomClassMap只记录最后分配的班级,导致之前分配的床位在更新时被忽略bedClassMap(Map)精确记录每个床位分配给哪个班级
bedClassMap,确保床位分配记录准确bedClassMap替代原有的房间级别判断逻辑,确保所有分配的床位都能正确更新{
"bedIds": ["1947684655866236929", "1947684656965144578", ...],
"classIds": ["1947944181282590721", "1947943837236416514", ...],
"classStudentCounts": [0, 6, 7, 7, 3, 11],
"buildingId": "1947658161827794945",
"buildingType": "2"
}
| 参数名 | 类型 | 必须 | 描述 |
|---|---|---|---|
| bedIds | Long[] | 是 | 需要分配的床位ID列表 |
| classIds | Long[] | 是 | 目标班级ID列表 |
| classStudentCounts | Integer[] | 否 | 各班级分配床位数量,与classIds一一对应 |
| buildingId | Long | 是 | 楼栋ID |
| buildingType | String | 是 | 楼栋类型(1-男生楼,2-女生楼) |
{
"code": 200,
"msg": "操作成功",
"data": true
}
{
"code": 500,
"msg": "床位分配失败:具体错误信息",
"data": null
}
| 错误信息 | 原因 | 解决方案 |
|---|---|---|
| 以下床位已分配给班级,无法重复分配 | 床位已被其他班级占用 | 检查床位状态,选择未分配的床位 |
| 选择的床位尚未分配给学院 | 床位未完成学院分配 | 先执行学院分配再进行班级分配 |
| 班级人数总和超过了可用床位总数 | 分配数量超过可用床位 | 调整各班级分配数量 |
| 床位分配不完整,存在未分配的床位 | 分配算法异常 | 联系技术支持检查日志 |
四轮房间优先分配策略:
第一轮:完整房间分配
第二轮:同班级房间补充
第三轮:空闲房间分配
第四轮:混住分配
分配完成后,系统会更新以下信息:
xg_dorm_bed_student.class_id:床位分配的班级IDxg_dorm_bed_student.major_id:床位分配的专业IDxg_dorm_bed_student.update_time:更新时间xg_dorm_bed_student.update_by:更新人员该接口用于将空闲床位批量分配给二级学院,是床位分配的第一步。
POST /dormBedStudent/dormBedStudent/batchAllocateToCollege
xgss:dormBedStudent:allocateToCollege
{
"bedIds": ["床位ID列表"],
"collegeIds": ["学院ID列表"],
"collegeStudentCounts": [各学院分配数量],
"buildingId": "楼栋ID",
"buildingType": "楼栋类型"
}
// 房间使用状态跟踪
int[] roomUsage = new int[sortedRoomIds.size()];
// 房间主要归属班级映射
Map<Integer, Long> roomClassMap = new HashMap<>();
// 床位精确分配映射(修复关键)
Map<Long, Long> bedClassMap = new HashMap<>(); // bedId -> classId
修复前:
roomClassMap判断床位归属修复后:
bedClassMap精确跟踪严重问题: 用户反馈75个床位完全匹配75个需求时,仍有13个床位未分配。
新发现的根本原因:
.isNull(XgDormBedStudent::getClassId) 导致已分配班级的床位被排除在分配范围之外第二轮修复方案:
// 修复前:只查询未分配班级的床位
.isNull(XgDormBedStudent::getClassId) // 只分配了学院,还没分配班级
// 修复后:查询所有已分配给学院的床位,不论是否已分配班级
// 移除了.isNull(XgDormBedStudent::getClassId)条件
// 分两种情况处理:
// 情况1:更新未分配班级的记录(新分配)
// 情况2:强制更新所有指定床位的班级分配(重新分配)
int totalUpdateCount = updateCount1 + updateCount2;
// 当床位数量完全匹配需求时,必须全部分配完
if (totalExpectedBeds == totalAvailableBeds && totalAllocatedBeds < totalExpectedBeds) {
// 详细诊断未分配的床位和房间分布
throw new RuntimeException("床位分配不完整,存在" + (totalExpectedBeds - totalAllocatedBeds) + "个床位未分配");
}
问题描述: 在床位分配过程中,存在剩余床位未分配的问题。例如:
根本原因:
roomUsage数组 + roomClassMap映射roomClassMap中记录的房间roomClassMap被覆盖,之前分配的床位被忽略第一轮修复方案:
Map<Long, Long> bedClassMapbedClassMap替代房间级别判断文档版本:v1.2
最后更新:2025-01-27
修复版本:重要Bug修复 - 完全匹配场景下床位分配不完整问题(第二轮修复)