zlwu hace 1 año
padre
commit
4e16396463

+ 2 - 2
backend/ruoyi-admin/pom.xml

@@ -119,10 +119,10 @@
             <version>${revision}</version>
         </dependency> -->
         <!--  招生就业管理模块  -->
-        <dependency>
+        <!-- <dependency>
             <groupId>org.dromara</groupId>
             <artifactId>ruoyi-zsjy</artifactId>
-        </dependency>
+        </dependency> -->
         <!--  安全保卫管理模块  -->
         <dependency>
             <groupId>org.dromara</groupId>

+ 2 - 2
backend/ruoyi-modules/pom.xml

@@ -16,13 +16,13 @@
         <module>ruoyi-workflow</module>
         <module>ruoyi-xg</module>
         <!-- <module>ruoyi-xg-xx</module> -->
-        <module>ruoyi-zsjy</module>
+        <!-- <module>ruoyi-zsjy</module> -->
         <module>ruoyi-hq</module>
         <module>ruoyi-aqbw</module>
         <module>ruoyi-cw</module>
         <module>ruoyi-rs</module>
         <module>ruoyi-xljk</module>
-         <module>ruoyi-jcbt</module>
+        <module>ruoyi-jcbt</module>
         <!-- <module>ruoyi-stgl</module> -->
     </modules>
 

+ 13 - 0
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<List<XgDormBedDetailVo>> getBedDetailsByRoomIdForCurrentUserCollege(
+            @NotNull(message = "房间ID不能为空") @PathVariable Long roomId) {
+        List<XgDormBedDetailVo> list = xgDormBedService.queryBedDetailsByRoomIdForCurrentUserCollege(roomId);
+        return R.ok(list);
+    }
+
     /**
      * 查询指定宿舍楼的床位详细信息列表(包含学生信息)
      *

+ 11 - 4
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<XgDormRoomVo> 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<XgDormRoomVo> getInfo(@NotNull(message = "主键不能为空")
-                                     @PathVariable Long id) {
+    public R<XgDormRoomVo> 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<Void> remove(@NotEmpty(message = "主键不能为空")
-                          @PathVariable Long[] ids) {
+    public R<Void> remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ids) {
         return toAjax(xgDormRoomService.deleteWithValidByIds(List.of(ids), true));
     }
 }

+ 3 - 1
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;
 
     /**

+ 59 - 0
backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgDormBedMapper.java

@@ -129,4 +129,63 @@ public interface XgDormBedMapper extends BaseMapperPlus<XgDormBed, XgDormBedVo>
             """)
     List<XgDormBedDetailVo> 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<XgDormBedDetailVo> selectBedDetailsByRoomIdAndCollegeId(@Param("roomId") Long roomId,
+            @Param("collegeId") Long collegeId);
+
 }

+ 8 - 0
backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgDormBedService.java

@@ -75,6 +75,14 @@ public interface IXgDormBedService {
      */
     List<XgDormBedDetailVo> queryBedDetailsByRoomId(Long roomId);
 
+    /**
+     * 查询当前用户所在学院的指定房间床位详细信息列表(包含学生信息)
+     *
+     * @param roomId 房间ID
+     * @return 床位详细信息列表
+     */
+    List<XgDormBedDetailVo> queryBedDetailsByRoomIdForCurrentUserCollege(Long roomId);
+
     /**
      * 查询指定宿舍楼的床位详细信息列表(包含学生信息)
      *

+ 9 - 0
backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgDormRoomService.java

@@ -33,6 +33,15 @@ public interface IXgDormRoomService {
      */
     TableDataInfo<XgDormRoomVo> queryPageList(XgDormRoomBo bo, PageQuery pageQuery);
 
+    /**
+     * 分页查询当前用户所在学院的宿舍房间信息列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 宿舍房间信息分页列表
+     */
+    TableDataInfo<XgDormRoomVo> queryPageListByCurrentUserCollege(XgDormRoomBo bo, PageQuery pageQuery);
+
     /**
      * 查询符合条件的宿舍房间信息列表
      *

+ 139 - 5
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<Long> 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<XgDormBedDetailVo> 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<XgDormBedDetailVo> 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<XgSysDept> 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<XgSysDept> parentColleges = xgSysDeptMapper.selectList(parentQuery);
+            if (!parentColleges.isEmpty()) {
+                return parentColleges.get(0).getDeptId();
+            }
+
+            // 如果上面的查询没找到,尝试通过dept_category查找
+            LambdaQueryWrapper<XgSysDept> 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<XgSysDept> categoryColleges = xgSysDeptMapper.selectList(categoryQuery);
+            return categoryColleges.isEmpty() ? null : categoryColleges.get(0).getDeptId();
+
+        } catch (Exception e) {
+            log.error("获取当前用户二级学院ID失败", e);
+            return null;
+        }
+    }
+
+    /**
+     * 获取分配给指定学院的房间ID列表
+     */
+    private Set<Long> getCollegeAllocatedRoomIds(Long collegeId) {
+        try {
+            LambdaQueryWrapper<XgDormBedStudent> 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<XgDormBedStudent> 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<Long> getCollegeAllocatedBuildingIds(Long collegeId) {
+        try {
+            LambdaQueryWrapper<XgDormBedStudent> 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<XgDormBedStudent> buildingRecords = xgDormBedStudentMapper.selectList(queryWrapper);
+            return buildingRecords.stream()
+                    .map(XgDormBedStudent::getBuildingId)
+                    .collect(Collectors.toSet());
+
+        } catch (Exception e) {
+            log.error("获取学院 {} 分配的宿舍楼ID列表失败", collegeId, e);
+            return Set.of();
+        }
+    }
 }

+ 117 - 0
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<XgDormRoomVo> queryPageListByCurrentUserCollege(XgDormRoomBo bo, PageQuery pageQuery) {
+        // 1. 获取当前用户的学院ID
+        Long currentUserCollegeId = getCurrentUserCollegeId();
+        if (currentUserCollegeId == null) {
+            log.warn("无法获取当前用户的学院信息,返回空结果");
+            return TableDataInfo.build(new Page<>());
+        }
+
+        // 2. 获取分配给当前学院的房间ID列表
+        Set<Long> collegeAllocatedRoomIds = getCollegeAllocatedRoomIds(currentUserCollegeId);
+        if (collegeAllocatedRoomIds.isEmpty()) {
+            log.info("当前学院 {} 没有分配的房间,返回空结果", currentUserCollegeId);
+            return TableDataInfo.build(new Page<>());
+        }
+
+        // 3. 构建查询条件,只查询分配给当前学院的具体房间,并支持额外的过滤条件
+        LambdaQueryWrapper<XgDormRoom> lqw = buildQueryWrapper(bo);
+        lqw.in(XgDormRoom::getId, collegeAllocatedRoomIds);
+
+        Page<XgDormRoomVo> 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<XgSysDept> 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<XgSysDept> parentColleges = xgSysDeptMapper.selectList(parentQuery);
+            if (!parentColleges.isEmpty()) {
+                return parentColleges.get(0).getDeptId();
+            }
+
+            // 如果上面的查询没找到,尝试通过dept_category查找
+            LambdaQueryWrapper<XgSysDept> 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<XgSysDept> categoryColleges = xgSysDeptMapper.selectList(categoryQuery);
+            return categoryColleges.isEmpty() ? null : categoryColleges.get(0).getDeptId();
+
+        } catch (Exception e) {
+            log.error("获取当前用户二级学院ID失败", e);
+            return null;
+        }
+    }
+
+    /**
+     * 获取分配给指定学院的房间ID列表
+     */
+    private Set<Long> getCollegeAllocatedRoomIds(Long collegeId) {
+        try {
+            LambdaQueryWrapper<XgDormBedStudent> 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<XgDormBedStudent> roomRecords = xgDormBedStudentMapper.selectList(queryWrapper);
+            return roomRecords.stream()
+                    .map(XgDormBedStudent::getRoomId)
+                    .collect(Collectors.toSet());
+
+        } catch (Exception e) {
+            log.error("获取学院 {} 分配的房间ID列表失败", collegeId, e);
+            return Set.of();
+        }
+    }
 }

+ 29 - 0
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. **数据库查询优化**:合理使用索引,避免全表扫描

+ 12 - 2
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<DormBedVO[]> => {
   return request({
     url: '/dormbed/dormBed/list',
@@ -73,6 +72,17 @@ export const getBedDetailsByRoomId = (roomId: string | number): AxiosPromise<Dor
   });
 };
 
+/**
+ * 查询当前用户所在学院的指定房间床位详细信息列表(包含学生信息)
+ * @param roomId 房间ID
+ */
+export const getBedDetailsByRoomIdForCurrentUserCollege = (roomId: string | number): AxiosPromise<DormBedDetailVO[]> => {
+  return request({
+    url: '/dormbed/dormBed/details/college/room/' + roomId,
+    method: 'get'
+  });
+};
+
 /**
  * 查询指定宿舍楼的床位详细信息列表(包含学生信息)
  * @param buildingId 宿舍楼ID

+ 13 - 0
web/src/api/xg/xgss/dormRoom/index.ts

@@ -16,6 +16,19 @@ export const listDormRoom = (query?: DormRoomQuery): AxiosPromise<DormRoomVO[]>
   });
 };
 
+/**
+ * 查询当前用户所在学院的宿舍房间信息列表
+ * @param query
+ * @returns {*}
+ */
+export const listDormRoomForCurrentUserCollege = (query?: DormRoomQuery): AxiosPromise<DormRoomVO[]> => {
+  return request({
+    url: '/xgss/dormRoom/college/list',
+    method: 'get',
+    params: query
+  });
+};
+
 /**
  * 查询宿舍房间信息详细
  * @param id

+ 19 - 17
web/src/views/xg/xgss/ejxyfp/ejxyfp.vue

@@ -237,14 +237,16 @@
                       <el-tag v-if="scope.row.roomStatus === '0'" type="success">正常</el-tag>
                       <el-tag v-else-if="scope.row.roomStatus === '1'" type="warning">维修中</el-tag>
                       <el-tag v-else type="danger">停用</el-tag>
-                      <!-- 房间床位占用状态 -->
-                      <span v-if="scope.row.roomStatus === '0'" class="text-xs text-gray-500"> ({{ getRoomBedStatusText(scope.row) }}) </span>
+                      <!-- 房间床位分配数量 -->
+                      <span v-if="scope.row.roomStatus === '0'" class="text-xs text-gray-500">
+                        (已分配: {{ scope.row.children?.filter((bed) => bed.classId).length || 0 }}/{{ scope.row.children?.length || 0 }}床位)
+                      </span>
                     </div>
                   </template>
                   <template v-else>
-                    <el-tag v-if="scope.row.bedStatus === '0'" type="success">空闲</el-tag>
-                    <el-tag v-else-if="scope.row.bedStatus === '1'" type="warning">已分配</el-tag>
-                    <el-tag v-else type="danger">维修中</el-tag>
+                    <el-tag v-if="scope.row.bedStatus === '2'" type="danger">维修中</el-tag>
+                    <el-tag v-else-if="scope.row.classId" type="warning">已分配</el-tag>
+                    <el-tag v-else type="success">空闲</el-tag>
                   </template>
                 </template>
               </el-table-column>
@@ -298,7 +300,7 @@
                   {{ scope.row.remark || scope.row.bedRemark }}
                 </template>
               </el-table-column>
-              <el-table-column label="操作" width="180" align="center" fixed="right">
+              <el-table-column label="操作" width="180" align="center" fixed="right" v-if="false">
                 <template #default="scope">
                   <template v-if="!scope.row.isBed">
                     <!-- <el-button type="primary" link icon="Plus" @click="handleAddBed(scope.row)" /> -->
@@ -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