diff --git a/backend/ruoyi-admin/pom.xml b/backend/ruoyi-admin/pom.xml
index 3817f9f5..7b0be823 100644
--- a/backend/ruoyi-admin/pom.xml
+++ b/backend/ruoyi-admin/pom.xml
@@ -119,10 +119,10 @@
${revision}
-->
-
+
org.dromara
diff --git a/backend/ruoyi-modules/pom.xml b/backend/ruoyi-modules/pom.xml
index 16beafe2..212e63c6 100644
--- a/backend/ruoyi-modules/pom.xml
+++ b/backend/ruoyi-modules/pom.xml
@@ -16,13 +16,13 @@
ruoyi-workflow
ruoyi-xg
- ruoyi-zsjy
+
ruoyi-hq
ruoyi-aqbw
ruoyi-cw
ruoyi-rs
ruoyi-xljk
- ruoyi-jcbt
+ ruoyi-jcbt
diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgDormBedController.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgDormBedController.java
index 5f956dc1..9bb630a7 100644
--- a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgDormBedController.java
+++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgDormBedController.java
@@ -114,6 +114,19 @@ public class XgDormBedController extends BaseController {
return R.ok(list);
}
+ /**
+ * 查询当前用户所在学院的指定房间床位详细信息列表(包含学生信息)
+ *
+ * @param roomId 房间ID
+ */
+ @SaCheckPermission("dormbed:dormBed:query")
+ @GetMapping("/details/college/room/{roomId}")
+ public R> getBedDetailsByRoomIdForCurrentUserCollege(
+ @NotNull(message = "房间ID不能为空") @PathVariable Long roomId) {
+ List list = xgDormBedService.queryBedDetailsByRoomIdForCurrentUserCollege(roomId);
+ return R.ok(list);
+ }
+
/**
* 查询指定宿舍楼的床位详细信息列表(包含学生信息)
*
diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgDormRoomController.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgDormRoomController.java
index 65734779..57cf6edb 100644
--- a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgDormRoomController.java
+++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgDormRoomController.java
@@ -45,6 +45,15 @@ public class XgDormRoomController extends BaseController {
return xgDormRoomService.queryPageList(bo, pageQuery);
}
+ /**
+ * 查询当前用户所在学院的宿舍房间信息列表
+ */
+ @SaCheckPermission("xgss:dormRoom:list")
+ @GetMapping("/college/list")
+ public TableDataInfo collegeList(XgDormRoomBo bo, PageQuery pageQuery) {
+ return xgDormRoomService.queryPageListByCurrentUserCollege(bo, pageQuery);
+ }
+
/**
* 导出宿舍房间信息列表
*/
@@ -63,8 +72,7 @@ public class XgDormRoomController extends BaseController {
*/
@SaCheckPermission("xgss:dormRoom:query")
@GetMapping("/{id}")
- public R getInfo(@NotNull(message = "主键不能为空")
- @PathVariable Long id) {
+ public R getInfo(@NotNull(message = "主键不能为空") @PathVariable Long id) {
return R.ok(xgDormRoomService.queryById(id));
}
@@ -98,8 +106,7 @@ public class XgDormRoomController extends BaseController {
@SaCheckPermission("xgss:dormRoom:remove")
@Log(title = "宿舍房间信息", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
- public R remove(@NotEmpty(message = "主键不能为空")
- @PathVariable Long[] ids) {
+ public R remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ids) {
return toAjax(xgDormRoomService.deleteWithValidByIds(List.of(ids), true));
}
}
diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/XgSysDept.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/XgSysDept.java
index 7ccb9cc6..eba15ea6 100644
--- a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/XgSysDept.java
+++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/XgSysDept.java
@@ -1,5 +1,6 @@
package org.dromara.xg.domain;
+import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
@@ -70,8 +71,9 @@ public class XgSysDept extends BaseEntity {
private String delFlag;
/**
- * 父部门名称
+ * 父部门名称(冗余字段,用于显示,不持久化到数据库)
*/
+ @TableField(exist = false)
private String parentName;
/**
diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgDormBedMapper.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgDormBedMapper.java
index f26684ca..f1a4e2ed 100644
--- a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgDormBedMapper.java
+++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgDormBedMapper.java
@@ -129,4 +129,63 @@ public interface XgDormBedMapper extends BaseMapperPlus
""")
List selectBedDetailsByBuildingId(@Param("buildingId") Long buildingId);
+ /**
+ * 查询指定房间中属于指定学院的床位详细信息列表(包含学生信息)
+ *
+ * @param roomId 房间ID
+ * @param collegeId 学院ID
+ * @return 床位详细信息列表
+ */
+ @Select("""
+ SELECT
+ b.id,
+ b.bed_code,
+ b.bed_name,
+ b.room_id,
+ r.room_name,
+ b.bed_type,
+ b.bed_status,
+ b.remark as bed_remark,
+ b.create_by,
+ b.create_time,
+ b.update_by,
+ b.update_time,
+
+ bs.id as assignment_id,
+ bs.assign_time,
+ bs.status as assignment_status,
+
+ bs.college_id,
+ college_dept.dept_name as college_name,
+
+ bs.major_id,
+ major_dept.dept_name as major_name,
+
+ bs.class_id,
+ class_dept.dept_name as class_name,
+ c.class_code,
+ c.grade,
+
+ bs.student_id,
+ s.student_no,
+ s.name as student_name,
+ s.gender as student_gender,
+ s.phone as student_phone,
+ s.id_card as student_id_card
+ FROM xg_dorm_bed b
+ LEFT JOIN xg_dorm_room r ON b.room_id = r.id
+ INNER JOIN xg_dorm_bed_student bs ON b.id = bs.bed_id AND bs.status = '0' AND bs.deleted = '0'
+ LEFT JOIN sys_dept college_dept ON bs.college_id = college_dept.dept_id AND college_dept.del_flag = '0'
+ LEFT JOIN sys_dept major_dept ON bs.major_id = major_dept.dept_id AND major_dept.del_flag = '0'
+ LEFT JOIN sys_dept class_dept ON bs.class_id = class_dept.dept_id AND class_dept.del_flag = '0'
+ LEFT JOIN xg_class_msg c ON bs.class_id = c.id AND c.deleted = 0
+ LEFT JOIN xg_student_msg s ON bs.student_id = s.id AND s.deleted = 0
+ WHERE b.room_id = #{roomId}
+ AND bs.college_id = #{collegeId}
+ AND b.deleted = '0'
+ ORDER BY b.bed_code
+ """)
+ List selectBedDetailsByRoomIdAndCollegeId(@Param("roomId") Long roomId,
+ @Param("collegeId") Long collegeId);
+
}
diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgDormBedService.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgDormBedService.java
index 9794dc1f..3d04ae40 100644
--- a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgDormBedService.java
+++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgDormBedService.java
@@ -75,6 +75,14 @@ public interface IXgDormBedService {
*/
List queryBedDetailsByRoomId(Long roomId);
+ /**
+ * 查询当前用户所在学院的指定房间床位详细信息列表(包含学生信息)
+ *
+ * @param roomId 房间ID
+ * @return 床位详细信息列表
+ */
+ List queryBedDetailsByRoomIdForCurrentUserCollege(Long roomId);
+
/**
* 查询指定宿舍楼的床位详细信息列表(包含学生信息)
*
diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgDormRoomService.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgDormRoomService.java
index d4cf9f9c..c6a4ad3d 100644
--- a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgDormRoomService.java
+++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgDormRoomService.java
@@ -33,6 +33,15 @@ public interface IXgDormRoomService {
*/
TableDataInfo queryPageList(XgDormRoomBo bo, PageQuery pageQuery);
+ /**
+ * 分页查询当前用户所在学院的宿舍房间信息列表
+ *
+ * @param bo 查询条件
+ * @param pageQuery 分页参数
+ * @return 宿舍房间信息分页列表
+ */
+ TableDataInfo queryPageListByCurrentUserCollege(XgDormRoomBo bo, PageQuery pageQuery);
+
/**
* 查询符合条件的宿舍房间信息列表
*
diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormBedServiceImpl.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormBedServiceImpl.java
index 62a85373..aea0cec6 100644
--- a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormBedServiceImpl.java
+++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormBedServiceImpl.java
@@ -14,12 +14,22 @@ import org.dromara.xg.domain.bo.XgDormBedBo;
import org.dromara.xg.domain.vo.XgDormBedVo;
import org.dromara.xg.domain.vo.XgDormBedDetailVo;
import org.dromara.xg.domain.XgDormBed;
+import org.dromara.xg.domain.XgDormRoom;
+import org.dromara.xg.domain.XgDormBedStudent;
+import org.dromara.xg.domain.XgSysDept;
import org.dromara.xg.mapper.XgDormBedMapper;
+import org.dromara.xg.mapper.XgDormRoomMapper;
+import org.dromara.xg.mapper.XgDormBedStudentMapper;
+import org.dromara.xg.mapper.XgSysDeptMapper;
import org.dromara.xg.service.IXgDormBedService;
+import org.dromara.common.satoken.utils.LoginHelper;
import java.util.List;
import java.util.Map;
import java.util.Collection;
+import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.ArrayList;
/**
* 宿舍床位信息Service业务层处理
@@ -33,6 +43,9 @@ import java.util.Collection;
public class XgDormBedServiceImpl implements IXgDormBedService {
private final XgDormBedMapper baseMapper;
+ private final XgDormRoomMapper xgDormRoomMapper;
+ private final XgDormBedStudentMapper xgDormBedStudentMapper;
+ private final XgSysDeptMapper xgSysDeptMapper;
/**
* 查询宿舍床位信息
@@ -41,7 +54,7 @@ public class XgDormBedServiceImpl implements IXgDormBedService {
* @return 宿舍床位信息
*/
@Override
- public XgDormBedVo queryById(Long id){
+ public XgDormBedVo queryById(Long id) {
return baseMapper.selectVoById(id);
}
@@ -117,8 +130,8 @@ public class XgDormBedServiceImpl implements IXgDormBedService {
/**
* 保存前的数据校验
*/
- private void validEntityBeforeSave(XgDormBed entity){
- //TODO 做一些数据校验,如唯一约束
+ private void validEntityBeforeSave(XgDormBed entity) {
+ // TODO 做一些数据校验,如唯一约束
}
/**
@@ -130,8 +143,8 @@ public class XgDormBedServiceImpl implements IXgDormBedService {
*/
@Override
public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) {
- if(isValid){
- //TODO 做一些业务上的校验,判断是否需要校验
+ if (isValid) {
+ // TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteByIds(ids) > 0;
}
@@ -147,6 +160,26 @@ public class XgDormBedServiceImpl implements IXgDormBedService {
return baseMapper.selectBedDetailsByRoomId(roomId);
}
+ /**
+ * 查询当前用户所在学院的指定房间床位详细信息列表(包含学生信息)
+ *
+ * @param roomId 房间ID
+ * @return 床位详细信息列表
+ */
+ @Override
+ public List queryBedDetailsByRoomIdForCurrentUserCollege(Long roomId) {
+ // 1. 获取当前用户的学院ID
+ Long currentUserCollegeId = getCurrentUserCollegeId();
+ if (currentUserCollegeId == null) {
+ log.warn("无法获取当前用户的学院信息,返回空结果");
+ return new ArrayList<>();
+ }
+
+ // 2. 直接查询指定房间中属于当前学院的床位详细信息
+ // 通过SQL关联xg_dorm_bed_student表,只返回分配给当前学院的床位
+ return baseMapper.selectBedDetailsByRoomIdAndCollegeId(roomId, currentUserCollegeId);
+ }
+
/**
* 查询指定宿舍楼的床位详细信息列表(包含学生信息)
*
@@ -157,4 +190,105 @@ public class XgDormBedServiceImpl implements IXgDormBedService {
public List queryBedDetailsByBuildingId(Long buildingId) {
return baseMapper.selectBedDetailsByBuildingId(buildingId);
}
+
+ /**
+ * 获取当前用户的二级学院ID
+ * 通过当前用户的部门id,向上寻找包括他自己,找到dept_category前几位是xy-的就是二级学院
+ * 或者parent_id = 101的部门就是二级学院
+ */
+ private Long getCurrentUserCollegeId() {
+ try {
+ Long currentUserId = LoginHelper.getUserId();
+ Long currentDeptId = LoginHelper.getDeptId();
+
+ if (currentUserId == null || currentDeptId == null) {
+ log.warn("用户未登录或没有部门信息");
+ return null;
+ }
+
+ // 首先查找parent_id = 101的部门(使用LambdaQueryWrapper)
+ LambdaQueryWrapper parentQuery = Wrappers.lambdaQuery();
+ parentQuery.eq(XgSysDept::getParentId, 101L)
+ .eq(XgSysDept::getStatus, "0")
+ .eq(XgSysDept::getDelFlag, "0")
+ .and(wrapper -> wrapper.eq(XgSysDept::getDeptId, currentDeptId)
+ .or().like(XgSysDept::getAncestors, "," + currentDeptId + ",") // 中间位置
+ .or().likeRight(XgSysDept::getAncestors, currentDeptId + ",") // 开头位置
+ .or().likeLeft(XgSysDept::getAncestors, "," + currentDeptId) // 末尾位置
+ .or().eq(XgSysDept::getAncestors, currentDeptId.toString())) // 单独一个值
+ .last("LIMIT 1");
+
+ List parentColleges = xgSysDeptMapper.selectList(parentQuery);
+ if (!parentColleges.isEmpty()) {
+ return parentColleges.get(0).getDeptId();
+ }
+
+ // 如果上面的查询没找到,尝试通过dept_category查找
+ LambdaQueryWrapper categoryQuery = Wrappers.lambdaQuery();
+ categoryQuery.likeRight(XgSysDept::getDeptCategory, "xy-")
+ .eq(XgSysDept::getStatus, "0")
+ .eq(XgSysDept::getDelFlag, "0")
+ .and(wrapper -> wrapper.eq(XgSysDept::getDeptId, currentDeptId)
+ .or().like(XgSysDept::getAncestors, "," + currentDeptId + ",") // 中间位置
+ .or().likeRight(XgSysDept::getAncestors, currentDeptId + ",") // 开头位置
+ .or().likeLeft(XgSysDept::getAncestors, "," + currentDeptId) // 末尾位置
+ .or().eq(XgSysDept::getAncestors, currentDeptId.toString())) // 单独一个值
+ .last("LIMIT 1");
+
+ List categoryColleges = xgSysDeptMapper.selectList(categoryQuery);
+ return categoryColleges.isEmpty() ? null : categoryColleges.get(0).getDeptId();
+
+ } catch (Exception e) {
+ log.error("获取当前用户二级学院ID失败", e);
+ return null;
+ }
+ }
+
+ /**
+ * 获取分配给指定学院的房间ID列表
+ */
+ private Set getCollegeAllocatedRoomIds(Long collegeId) {
+ try {
+ LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery();
+ queryWrapper.select(XgDormBedStudent::getRoomId)
+ .eq(XgDormBedStudent::getCollegeId, collegeId)
+ .eq(XgDormBedStudent::getStatus, "0")
+ .eq(XgDormBedStudent::getDeleted, "0")
+ .isNotNull(XgDormBedStudent::getRoomId)
+ .groupBy(XgDormBedStudent::getRoomId);
+
+ List roomRecords = xgDormBedStudentMapper.selectList(queryWrapper);
+ return roomRecords.stream()
+ .map(XgDormBedStudent::getRoomId)
+ .collect(Collectors.toSet());
+
+ } catch (Exception e) {
+ log.error("获取学院 {} 分配的房间ID列表失败", collegeId, e);
+ return Set.of();
+ }
+ }
+
+ /**
+ * 获取分配给指定学院的宿舍楼ID列表
+ */
+ private Set getCollegeAllocatedBuildingIds(Long collegeId) {
+ try {
+ LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery();
+ queryWrapper.select(XgDormBedStudent::getBuildingId)
+ .eq(XgDormBedStudent::getCollegeId, collegeId)
+ .eq(XgDormBedStudent::getStatus, "0")
+ .eq(XgDormBedStudent::getDeleted, "0")
+ .isNotNull(XgDormBedStudent::getBuildingId)
+ .groupBy(XgDormBedStudent::getBuildingId);
+
+ List buildingRecords = xgDormBedStudentMapper.selectList(queryWrapper);
+ return buildingRecords.stream()
+ .map(XgDormBedStudent::getBuildingId)
+ .collect(Collectors.toSet());
+
+ } catch (Exception e) {
+ log.error("获取学院 {} 分配的宿舍楼ID列表失败", collegeId, e);
+ return Set.of();
+ }
+ }
}
diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormRoomServiceImpl.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormRoomServiceImpl.java
index ad751863..e6f10971 100644
--- a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormRoomServiceImpl.java
+++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormRoomServiceImpl.java
@@ -13,12 +13,19 @@ import org.springframework.stereotype.Service;
import org.dromara.xg.domain.bo.XgDormRoomBo;
import org.dromara.xg.domain.vo.XgDormRoomVo;
import org.dromara.xg.domain.XgDormRoom;
+import org.dromara.xg.domain.XgDormBedStudent;
+import org.dromara.xg.domain.XgSysDept;
import org.dromara.xg.mapper.XgDormRoomMapper;
+import org.dromara.xg.mapper.XgDormBedStudentMapper;
+import org.dromara.xg.mapper.XgSysDeptMapper;
import org.dromara.xg.service.IXgDormRoomService;
+import org.dromara.common.satoken.utils.LoginHelper;
import java.util.List;
import java.util.Map;
import java.util.Collection;
+import java.util.Set;
+import java.util.stream.Collectors;
/**
* 宿舍房间信息Service业务层处理
@@ -32,6 +39,8 @@ import java.util.Collection;
public class XgDormRoomServiceImpl implements IXgDormRoomService {
private final XgDormRoomMapper baseMapper;
+ private final XgDormBedStudentMapper xgDormBedStudentMapper;
+ private final XgSysDeptMapper xgSysDeptMapper;
/**
* 查询宿舍房间信息
@@ -58,6 +67,37 @@ public class XgDormRoomServiceImpl implements IXgDormRoomService {
return TableDataInfo.build(result);
}
+ /**
+ * 分页查询当前用户所在学院的宿舍房间信息列表
+ *
+ * @param bo 查询条件
+ * @param pageQuery 分页参数
+ * @return 宿舍房间信息分页列表
+ */
+ @Override
+ public TableDataInfo queryPageListByCurrentUserCollege(XgDormRoomBo bo, PageQuery pageQuery) {
+ // 1. 获取当前用户的学院ID
+ Long currentUserCollegeId = getCurrentUserCollegeId();
+ if (currentUserCollegeId == null) {
+ log.warn("无法获取当前用户的学院信息,返回空结果");
+ return TableDataInfo.build(new Page<>());
+ }
+
+ // 2. 获取分配给当前学院的房间ID列表
+ Set collegeAllocatedRoomIds = getCollegeAllocatedRoomIds(currentUserCollegeId);
+ if (collegeAllocatedRoomIds.isEmpty()) {
+ log.info("当前学院 {} 没有分配的房间,返回空结果", currentUserCollegeId);
+ return TableDataInfo.build(new Page<>());
+ }
+
+ // 3. 构建查询条件,只查询分配给当前学院的具体房间,并支持额外的过滤条件
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ lqw.in(XgDormRoom::getId, collegeAllocatedRoomIds);
+
+ Page result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+ return TableDataInfo.build(result);
+ }
+
/**
* 查询符合条件的宿舍房间信息列表
*
@@ -138,4 +178,81 @@ public class XgDormRoomServiceImpl implements IXgDormRoomService {
}
return baseMapper.deleteByIds(ids) > 0;
}
+
+ /**
+ * 获取当前用户的二级学院ID
+ * 通过当前用户的部门id,向上寻找包括他自己,找到dept_category前几位是xy-的就是二级学院
+ * 或者parent_id = 101的部门就是二级学院
+ */
+ private Long getCurrentUserCollegeId() {
+ try {
+ Long currentUserId = LoginHelper.getUserId();
+ Long currentDeptId = LoginHelper.getDeptId();
+
+ if (currentUserId == null || currentDeptId == null) {
+ log.warn("用户未登录或没有部门信息");
+ return null;
+ }
+
+ // 首先查找parent_id = 101的部门(使用LambdaQueryWrapper)
+ LambdaQueryWrapper parentQuery = Wrappers.lambdaQuery();
+ parentQuery.eq(XgSysDept::getParentId, 101L)
+ .eq(XgSysDept::getStatus, "0")
+ .eq(XgSysDept::getDelFlag, "0")
+ .and(wrapper -> wrapper.eq(XgSysDept::getDeptId, currentDeptId)
+ .or().like(XgSysDept::getAncestors, "," + currentDeptId + ",") // 中间位置
+ .or().likeRight(XgSysDept::getAncestors, currentDeptId + ",") // 开头位置
+ .or().likeLeft(XgSysDept::getAncestors, "," + currentDeptId) // 末尾位置
+ .or().eq(XgSysDept::getAncestors, currentDeptId.toString())) // 单独一个值
+ .last("LIMIT 1");
+
+ List parentColleges = xgSysDeptMapper.selectList(parentQuery);
+ if (!parentColleges.isEmpty()) {
+ return parentColleges.get(0).getDeptId();
+ }
+
+ // 如果上面的查询没找到,尝试通过dept_category查找
+ LambdaQueryWrapper categoryQuery = Wrappers.lambdaQuery();
+ categoryQuery.likeRight(XgSysDept::getDeptCategory, "xy-")
+ .eq(XgSysDept::getStatus, "0")
+ .eq(XgSysDept::getDelFlag, "0")
+ .and(wrapper -> wrapper.eq(XgSysDept::getDeptId, currentDeptId)
+ .or().like(XgSysDept::getAncestors, "," + currentDeptId + ",") // 中间位置
+ .or().likeRight(XgSysDept::getAncestors, currentDeptId + ",") // 开头位置
+ .or().likeLeft(XgSysDept::getAncestors, "," + currentDeptId) // 末尾位置
+ .or().eq(XgSysDept::getAncestors, currentDeptId.toString())) // 单独一个值
+ .last("LIMIT 1");
+
+ List categoryColleges = xgSysDeptMapper.selectList(categoryQuery);
+ return categoryColleges.isEmpty() ? null : categoryColleges.get(0).getDeptId();
+
+ } catch (Exception e) {
+ log.error("获取当前用户二级学院ID失败", e);
+ return null;
+ }
+ }
+
+ /**
+ * 获取分配给指定学院的房间ID列表
+ */
+ private Set getCollegeAllocatedRoomIds(Long collegeId) {
+ try {
+ LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery();
+ queryWrapper.select(XgDormBedStudent::getRoomId)
+ .eq(XgDormBedStudent::getCollegeId, collegeId)
+ .eq(XgDormBedStudent::getStatus, "0")
+ .eq(XgDormBedStudent::getDeleted, "0")
+ .isNotNull(XgDormBedStudent::getRoomId)
+ .groupBy(XgDormBedStudent::getRoomId);
+
+ List roomRecords = xgDormBedStudentMapper.selectList(queryWrapper);
+ return roomRecords.stream()
+ .map(XgDormBedStudent::getRoomId)
+ .collect(Collectors.toSet());
+
+ } catch (Exception e) {
+ log.error("获取学院 {} 分配的房间ID列表失败", collegeId, e);
+ return Set.of();
+ }
+ }
}
diff --git a/docs/开发文档/API开发最佳实践总结.md b/docs/开发文档/API开发最佳实践总结.md
index 06d9a053..63790751 100644
--- a/docs/开发文档/API开发最佳实践总结.md
+++ b/docs/开发文档/API开发最佳实践总结.md
@@ -391,6 +391,35 @@ def run_all_tests(self):
**问题**:代码变更后文档未更新
**解决**:建立强制性文档同步更新规则,代码完成后立即更新文档
+#### 5. MyBatis-Plus 实体字段映射问题 (2025-08-13 新增)
+
+**问题**:SQL 错误 "Unknown column 'parent_name' in 'field list'"
+**原因**:实体类中包含数据库表不存在的字段,MyBatis-Plus 自动生成 SQL 时包含了这些字段
+**典型场景**:实体类中有用于显示的冗余字段(如 parentName),但数据库表中没有对应字段
+
+**解决方案**:
+
+```java
+/**
+ * 父部门名称(冗余字段,用于显示,不持久化到数据库)
+ */
+@TableField(exist = false)
+private String parentName;
+```
+
+**关键要点**:
+- 添加 `@TableField(exist = false)` 注解告诉 MyBatis-Plus 该字段不存在于数据库表中
+- 导入正确的注解包:`import com.baomidou.mybatisplus.annotation.TableField;`
+- 适用于所有用于显示但不持久化的冗余字段
+- 避免在使用 `selectList()` 等 MyBatis-Plus 方法时出现字段不存在的错误
+
+**错误示例**:
+```
+org.springframework.jdbc.BadSqlGrammarException:
+### Error querying database. Cause: java.sql.SQLSyntaxErrorException: Unknown column 'parent_name' in 'field list'
+### SQL: SELECT dept_id, parent_id, ancestors, dept_name, order_num, leader, phone, email, status, del_flag, parent_name, dept_category, create_dept, create_by, create_time, update_by, update_time FROM sys_dept WHERE...
+```
+
### 性能优化建议
1. **数据库查询优化**:合理使用索引,避免全表扫描
diff --git a/web/src/api/xg/xgss/dormBed/index.ts b/web/src/api/xg/xgss/dormBed/index.ts
index f2a9b801..118ff0cb 100644
--- a/web/src/api/xg/xgss/dormBed/index.ts
+++ b/web/src/api/xg/xgss/dormBed/index.ts
@@ -1,13 +1,12 @@
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
-import { DormBedVO, DormBedDetailVO, DormBedForm, DormBedQuery } from '@/api/xg/xgss/dormBed/types';
+import { DormBedVO, DormBedForm, DormBedQuery, DormBedDetailVO } from '@/api/xg/xgss/dormBed/types';
/**
* 查询宿舍床位信息列表
* @param query
* @returns {*}
*/
-
export const listDormBed = (query?: DormBedQuery): AxiosPromise => {
return request({
url: '/dormbed/dormBed/list',
@@ -73,6 +72,17 @@ export const getBedDetailsByRoomId = (roomId: string | number): AxiosPromise => {
+ return request({
+ url: '/dormbed/dormBed/details/college/room/' + roomId,
+ method: 'get'
+ });
+};
+
/**
* 查询指定宿舍楼的床位详细信息列表(包含学生信息)
* @param buildingId 宿舍楼ID
diff --git a/web/src/api/xg/xgss/dormRoom/index.ts b/web/src/api/xg/xgss/dormRoom/index.ts
index 7fc93929..73e4d137 100644
--- a/web/src/api/xg/xgss/dormRoom/index.ts
+++ b/web/src/api/xg/xgss/dormRoom/index.ts
@@ -16,6 +16,19 @@ export const listDormRoom = (query?: DormRoomQuery): AxiosPromise
});
};
+/**
+ * 查询当前用户所在学院的宿舍房间信息列表
+ * @param query
+ * @returns {*}
+ */
+export const listDormRoomForCurrentUserCollege = (query?: DormRoomQuery): AxiosPromise => {
+ return request({
+ url: '/xgss/dormRoom/college/list',
+ method: 'get',
+ params: query
+ });
+};
+
/**
* 查询宿舍房间信息详细
* @param id
diff --git a/web/src/views/xg/xgss/ejxyfp/ejxyfp.vue b/web/src/views/xg/xgss/ejxyfp/ejxyfp.vue
index 731806e4..5ce21617 100644
--- a/web/src/views/xg/xgss/ejxyfp/ejxyfp.vue
+++ b/web/src/views/xg/xgss/ejxyfp/ejxyfp.vue
@@ -237,14 +237,16 @@
正常
维修中
停用
-
- ({{ getRoomBedStatusText(scope.row) }})
+
+
+ (已分配: {{ scope.row.children?.filter((bed) => bed.classId).length || 0 }}/{{ scope.row.children?.length || 0 }}床位)
+
- 空闲
- 已分配
- 维修中
+ 维修中
+ 已分配
+ 空闲
@@ -298,7 +300,7 @@
{{ scope.row.remark || scope.row.bedRemark }}
-
+
@@ -357,8 +359,8 @@ import type { DormRoomVO } from '@/api/xg/xgss/dormRoom/types';
import type { DormBedDetailVO } from '@/api/xg/xgss/dormBed/types';
import type { XgStudentTreeVO } from '@/api/xg/xsjcxx/studentMsg/types';
import { getCurrentUserCollegeDormTree } from '@/api/xg/xgss/dormBedStudent/dormBedStudent';
-import { getBedDetailsByRoomId, delDormBed, getDormBed } from '@/api/xg/xgss/dormBed';
-import { listDormRoom, delDormRoom } from '@/api/xg/xgss/dormRoom';
+import { getBedDetailsByRoomIdForCurrentUserCollege, delDormBed, getDormBed } from '@/api/xg/xgss/dormBed';
+import { listDormRoomForCurrentUserCollege, delDormRoom } from '@/api/xg/xgss/dormRoom';
import { getCurrentUserStudentTree } from '@/api/xg/xsjcxx/studentMsg';
import ElMessage from 'element-plus/es/components/message/index';
import ElMessageBox from 'element-plus/es/components/message-box/index';
@@ -567,7 +569,7 @@ const loadRoomData = async () => {
try {
// 获取房间列表
- const res = await listDormRoom({
+ const res = await listDormRoomForCurrentUserCollege({
...queryParams
});
const rooms = res.rows || [];
@@ -584,7 +586,7 @@ const loadRoomData = async () => {
};
try {
- const bedDetailRes = await getBedDetailsByRoomId(room.id);
+ const bedDetailRes = await getBedDetailsByRoomIdForCurrentUserCollege(room.id);
// 如果请求已被取消,不继续处理
if (controller?.signal?.aborted) return roomRecord;
@@ -874,9 +876,9 @@ const getRoomBedStatusText = (room: any) => {
}
const totalBeds = room.children.length;
- const availableBeds = room.children.filter((bed: any) => bed.bedStatus === '0').length;
- const allocatedBeds = room.children.filter((bed: any) => bed.bedStatus === '1').length;
const maintenanceBeds = room.children.filter((bed: any) => bed.bedStatus === '2').length;
+ const allocatedBeds = room.children.filter((bed: any) => bed.classId).length;
+ const availableBeds = room.children.filter((bed: any) => bed.bedStatus !== '2' && !bed.classId).length;
if (availableBeds === totalBeds) {
return '空闲';
@@ -1004,12 +1006,12 @@ const updateSelectionCount = (rows: any[]) => {
// 床位:记录床位ID并统计状态
uniqueBeds.add(row.id);
// 统计床位状态
- if (row.bedStatus === '0') {
- bedStats.available++;
- } else if (row.bedStatus === '1') {
- bedStats.allocated++;
- } else if (row.bedStatus === '2') {
+ if (row.bedStatus === '2') {
bedStats.maintenance++;
+ } else if (row.classId) {
+ bedStats.allocated++;
+ } else {
+ bedStats.available++;
}
} else {
// 房间:记录房间ID