图标
build / build-push (push) Successful in 55s

This commit is contained in:
wanghu
2026-10-20 16:20:34 +08:00
parent 109ea9e4d4
commit 253a8f4a4f
4 changed files with 9 additions and 3 deletions
+3
View File
@@ -98,6 +98,9 @@ ok("classroom Edit equipments 按数量替换", editQty.code === 0, editQty.msg)
const roomsAfterQty = await api("GET", "/api/classroom/List", { params: { buildingId, page: 1, count: 20 } }); const roomsAfterQty = await api("GET", "/api/classroom/List", { params: { buildingId, page: 1, count: 20 } });
const room1Qty = roomsAfterQty.data.list.find(r => r.serID === room1); const room1Qty = roomsAfterQty.data.list.find(r => r.serID === room1);
ok("Edit 后设备数量为 3(名称×3)", room1Qty && room1Qty.equipmentQtys && room1Qty.equipmentQtys[eqSeedId] === 3 && /冒烟设备.*×3$/.test(room1Qty.equipmentNames), JSON.stringify(room1Qty && room1Qty.equipmentQtys)); ok("Edit 后设备数量为 3(名称×3)", room1Qty && room1Qty.equipmentQtys && room1Qty.equipmentQtys[eqSeedId] === 3 && /冒烟设备.*×3$/.test(room1Qty.equipmentNames), JSON.stringify(room1Qty && room1Qty.equipmentQtys));
// 回归:编辑时保留原有设备关联(先删后插撞 (classroom_id, equipment_id) 唯一键)
const editKeep = await api("POST", "/api/classroom/Edit", { json: { serID: room1, status: "closed", equipments: [{ equipmentId: eqSeedId, quantity: 3 }] } });
ok("classroom Edit 保留原设备关联", editKeep.code === 0, editKeep.msg);
const editClear = await api("POST", "/api/classroom/Edit", { json: { serID: room1, equipmentIds: [] } }); const editClear = await api("POST", "/api/classroom/Edit", { json: { serID: room1, equipmentIds: [] } });
ok("classroom Edit 旧字段 equipmentIds 清空设备(兼容)", editClear.code === 0, editClear.msg); ok("classroom Edit 旧字段 equipmentIds 清空设备(兼容)", editClear.code === 0, editClear.msg);
const room2code = roomsAfterEdit.data.list[1].roomCode; const room2code = roomsAfterEdit.data.list[1].roomCode;
@@ -50,7 +50,7 @@ public class ClassroomController {
return classroomService.floors(buildingId); return classroomService.floors(buildingId);
} }
/** 全校教室扁平列表(教室管理页「空间筛选树」数据源,轻量字段)。 */ /** 全校教室扁平列表(教室管理页「楼层筛选树」数据源,轻量字段)。 */
@GetMapping("Tree") @GetMapping("Tree")
public List<Map<String, Object>> tree() { public List<Map<String, Object>> tree() {
return classroomService.tree(); return classroomService.tree();
@@ -36,7 +36,7 @@ public interface IClassroomService {
/** 楼栋下已有教室的楼层列表(升序,筛选项用)。 */ /** 楼栋下已有教室的楼层列表(升序,筛选项用)。 */
List<Integer> floors(Integer buildingId); List<Integer> floors(Integer buildingId);
/** 全校教室扁平列表(空间筛选树数据源,仅轻量字段)。 */ /** 全校教室扁平列表(楼层筛选树数据源,仅轻量字段)。 */
List<Map<String, Object>> tree(); List<Map<String, Object>> tree();
/** 批量添加教室,返回 {created, skipped, total}。 */ /** 批量添加教室,返回 {created, skipped, total}。 */
@@ -128,7 +128,7 @@ public class ClassroomService implements IClassroomService {
// 类型名映射 // 类型名映射
Map<Integer, String> typeNames = typeRepository.findBySchIdOrderBySortOrderAscIdAsc(schId).stream() Map<Integer, String> typeNames = typeRepository.findBySchIdOrderBySortOrderAscIdAsc(schId).stream()
.collect(Collectors.toMap(ClassroomType::getId, ClassroomType::getTypeName, (a, b) -> a)); .collect(Collectors.toMap(ClassroomType::getId, ClassroomType::getTypeName, (a, b) -> a));
// 校区/楼栋名映射(列表跨楼栋时行内直接展示,空间筛选树与详情面板用) // 校区/楼栋名映射(列表跨楼栋时行内直接展示,楼层筛选树与详情面板用)
Map<Integer, String> campusNames = campusRepository.findBySchIdOrderBySortOrderAscIdAsc(schId).stream() Map<Integer, String> campusNames = campusRepository.findBySchIdOrderBySortOrderAscIdAsc(schId).stream()
.collect(Collectors.toMap(com.yunhai.acaclassroom.entity.Campus::getId, .collect(Collectors.toMap(com.yunhai.acaclassroom.entity.Campus::getId,
com.yunhai.acaclassroom.entity.Campus::getCampusName, (a, b) -> a)); com.yunhai.acaclassroom.entity.Campus::getCampusName, (a, b) -> a));
@@ -357,6 +357,9 @@ public class ClassroomService implements IClassroomService {
Map<Integer, Integer> equipmentMap = Map<Integer, Integer> equipmentMap =
sanitizeEquipmentMap(req.getEquipments(), req.getEquipmentIds(), r.getSchId()); sanitizeEquipmentMap(req.getEquipments(), req.getEquipmentIds(), r.getSchId());
classroomEquipmentRepository.deleteBySchIdAndClassroomId(r.getSchId(), r.getId()); classroomEquipmentRepository.deleteBySchIdAndClassroomId(r.getSchId(), r.getId());
// 先落盘删除:Hibernate 同一事务内 INSERT 先于 DELETE 执行,
// 不 flush 会让“保留原设备”的重插撞 (classroom_id, equipment_id) 唯一键。
classroomEquipmentRepository.flush();
equipmentMap.forEach((eqId, qty) -> { equipmentMap.forEach((eqId, qty) -> {
com.yunhai.acaclassroom.entity.ClassroomEquipment ce = com.yunhai.acaclassroom.entity.ClassroomEquipment ce =
new com.yunhai.acaclassroom.entity.ClassroomEquipment(); new com.yunhai.acaclassroom.entity.ClassroomEquipment();