提交代码
This commit is contained in:
1 parent
4d7bb19fd9
commit
4e16396463
14 files changed
+436
-33
No files matched your search
@@ -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>
|
||||
|
||||
@@ -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
@@ -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
@@ -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));
|
||||
}
|
||||
}
|
||||
@@ -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
@@ -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
@@ -75,6 +75,14 @@ public interface IXgDormBedService {
|
||||
*/
|
||||
List<XgDormBedDetailVo> queryBedDetailsByRoomId(Long roomId);
|
||||
|
||||
/**
|
||||
* 查询当前用户所在学院的指定房间床位详细信息列表(包含学生信息)
|
||||
*
|
||||
* @param roomId 房间ID
|
||||
* @return 床位详细信息列表
|
||||
*/
|
||||
List<XgDormBedDetailVo> queryBedDetailsByRoomIdForCurrentUserCollege(Long roomId);
|
||||
|
||||
/**
|
||||
* 查询指定宿舍楼的床位详细信息列表(包含学生信息)
|
||||
*
|
||||
|
||||
+9
@@ -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
@@ -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
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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. **数据库查询优化**:合理使用索引,避免全表扫描
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in new issue
Block a user