From 4e1639646342fccceed4c6048762615fa1b750a9 Mon Sep 17 00:00:00 2001 From: zlwu <704541015@qq.com> Date: Wed, 13 Aug 2025 22:16:44 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/ruoyi-admin/pom.xml | 4 +- backend/ruoyi-modules/pom.xml | 4 +- .../xg/controller/XgDormBedController.java | 13 ++ .../xg/controller/XgDormRoomController.java | 15 +- .../java/org/dromara/xg/domain/XgSysDept.java | 4 +- .../dromara/xg/mapper/XgDormBedMapper.java | 59 +++++++ .../dromara/xg/service/IXgDormBedService.java | 8 + .../xg/service/IXgDormRoomService.java | 9 ++ .../xg/service/impl/XgDormBedServiceImpl.java | 144 +++++++++++++++++- .../service/impl/XgDormRoomServiceImpl.java | 117 ++++++++++++++ docs/开发文档/API开发最佳实践总结.md | 29 ++++ web/src/api/xg/xgss/dormBed/index.ts | 14 +- web/src/api/xg/xgss/dormRoom/index.ts | 13 ++ web/src/views/xg/xgss/ejxyfp/ejxyfp.vue | 36 ++--- 14 files changed, 436 insertions(+), 33 deletions(-) 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 }} - +