|
|
@@ -0,0 +1,329 @@
|
|
|
+package org.dromara.xg.service.impl;
|
|
|
+
|
|
|
+import lombok.RequiredArgsConstructor;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
+import org.dromara.common.mybatis.core.page.PageQuery;
|
|
|
+import org.dromara.common.mybatis.core.page.TableDataInfo;
|
|
|
+import org.dromara.common.satoken.utils.LoginHelper;
|
|
|
+import org.dromara.xg.domain.vo.XgDormApplicationVo;
|
|
|
+import org.dromara.xg.domain.vo.XgHolidayStayVo;
|
|
|
+import org.dromara.xg.domain.vo.XgStudentLeaveVo;
|
|
|
+import org.dromara.xg.domain.bo.XgDormApplicationBo;
|
|
|
+import org.dromara.xg.domain.bo.XgHolidayStayBo;
|
|
|
+import org.dromara.xg.domain.bo.XgStudentLeaveBo;
|
|
|
+import org.dromara.xg.domain.XgDormApplication;
|
|
|
+import org.dromara.xg.domain.XgHolidayStay;
|
|
|
+import org.dromara.xg.domain.XgStudentLeave;
|
|
|
+import org.dromara.xg.mapper.XgDormApplicationMapper;
|
|
|
+import org.dromara.xg.mapper.XgHolidayStayMapper;
|
|
|
+import org.dromara.xg.mapper.XgStudentLeaveMapper;
|
|
|
+import org.dromara.xg.mapper.XgStudentDynamicsMapper;
|
|
|
+import org.dromara.xg.service.IXgStudentDynamicsService;
|
|
|
+
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.HashSet;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Set;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 学生动向信息管理(宿管员)Service实现
|
|
|
+ *
|
|
|
+ * @author zlwu
|
|
|
+ * @date 2025-01-15
|
|
|
+ */
|
|
|
+@RequiredArgsConstructor
|
|
|
+@Service
|
|
|
+public class XgStudentDynamicsServiceImpl implements IXgStudentDynamicsService {
|
|
|
+
|
|
|
+ private final XgDormApplicationMapper dormApplicationMapper;
|
|
|
+ private final XgHolidayStayMapper holidayStayMapper;
|
|
|
+ private final XgStudentLeaveMapper studentLeaveMapper;
|
|
|
+ private final XgStudentDynamicsMapper studentDynamicsMapper;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询宿管员权限内的学生调宿退宿申请列表
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public TableDataInfo<XgDormApplicationVo> queryDormApplicationPageList(XgDormApplicationBo bo,
|
|
|
+ PageQuery pageQuery) {
|
|
|
+ // 获取当前登录用户ID
|
|
|
+ Long currentUserId = LoginHelper.getUserId();
|
|
|
+
|
|
|
+ // 构建查询条件
|
|
|
+ LambdaQueryWrapper<XgDormApplication> lqw = buildDormApplicationQueryWrapper(bo, currentUserId);
|
|
|
+
|
|
|
+ // 分页查询
|
|
|
+ Page<XgDormApplicationVo> result = dormApplicationMapper.selectVoPage(pageQuery.build(), lqw);
|
|
|
+ return TableDataInfo.build(result);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询宿管员权限内的学生假期留宿信息列表
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public TableDataInfo<XgHolidayStayVo> queryHolidayStayPageList(XgHolidayStayBo bo, PageQuery pageQuery) {
|
|
|
+ // 获取当前登录用户ID
|
|
|
+ Long currentUserId = LoginHelper.getUserId();
|
|
|
+
|
|
|
+ // 构建查询条件
|
|
|
+ LambdaQueryWrapper<XgHolidayStay> lqw = buildHolidayStayQueryWrapper(bo, currentUserId);
|
|
|
+
|
|
|
+ // 分页查询
|
|
|
+ Page<XgHolidayStayVo> result = holidayStayMapper.selectVoPage(pageQuery.build(), lqw);
|
|
|
+ return TableDataInfo.build(result);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询宿管员权限内的学生请假信息列表
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public TableDataInfo<XgStudentLeaveVo> queryStudentLeavePageList(XgStudentLeaveBo bo, PageQuery pageQuery) {
|
|
|
+ // 获取当前登录用户ID
|
|
|
+ Long currentUserId = LoginHelper.getUserId();
|
|
|
+
|
|
|
+ // 构建查询条件
|
|
|
+ LambdaQueryWrapper<XgStudentLeave> lqw = buildStudentLeaveQueryWrapper(bo, currentUserId);
|
|
|
+
|
|
|
+ // 分页查询
|
|
|
+ Page<XgStudentLeaveVo> result = studentLeaveMapper.selectVoPage(pageQuery.build(), lqw);
|
|
|
+ return TableDataInfo.build(result);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据主键查询调宿退宿申请详情
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public XgDormApplicationVo queryDormApplicationById(Long id) {
|
|
|
+ return dormApplicationMapper.selectVoById(id);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据主键查询假期留宿详情
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public XgHolidayStayVo queryHolidayStayById(Long id) {
|
|
|
+ return holidayStayMapper.selectVoById(id);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据主键查询学生请假详情
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public XgStudentLeaveVo queryStudentLeaveById(Long id) {
|
|
|
+ return studentLeaveMapper.selectVoById(id);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 构建调宿退宿申请查询条件(带宿管员权限)
|
|
|
+ */
|
|
|
+ private LambdaQueryWrapper<XgDormApplication> buildDormApplicationQueryWrapper(XgDormApplicationBo bo,
|
|
|
+ Long currentUserId) {
|
|
|
+ LambdaQueryWrapper<XgDormApplication> lqw = new LambdaQueryWrapper<>();
|
|
|
+
|
|
|
+ // 获取宿管员管理的楼栋ID列表
|
|
|
+ List<Long> managedBuildingIds = getManagedBuildingIds(currentUserId);
|
|
|
+
|
|
|
+ if (managedBuildingIds.isEmpty()) {
|
|
|
+ // 如果没有管理权限,返回空结果
|
|
|
+ lqw.eq(XgDormApplication::getId, -1);
|
|
|
+ return lqw;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 只查询宿管员权限内楼栋的学生申请
|
|
|
+ lqw.in(XgDormApplication::getCurrentBuildingId, managedBuildingIds);
|
|
|
+
|
|
|
+ // 添加其他查询条件
|
|
|
+ lqw.like(bo.getStudentName() != null, XgDormApplication::getStudentName, bo.getStudentName());
|
|
|
+ lqw.like(bo.getStudentNo() != null, XgDormApplication::getStudentNo, bo.getStudentNo());
|
|
|
+ lqw.like(bo.getCollegeName() != null, XgDormApplication::getCollegeName, bo.getCollegeName());
|
|
|
+ lqw.like(bo.getMajorName() != null, XgDormApplication::getMajorName, bo.getMajorName());
|
|
|
+ lqw.like(bo.getClassName() != null, XgDormApplication::getClassName, bo.getClassName());
|
|
|
+ lqw.eq(bo.getApplicationType() != null, XgDormApplication::getApplicationType, bo.getApplicationType());
|
|
|
+ lqw.eq(bo.getApplicationStatus() != null, XgDormApplication::getApplicationStatus, bo.getApplicationStatus());
|
|
|
+ lqw.ge(bo.getApplyTime() != null, XgDormApplication::getApplyTime, bo.getApplyTime());
|
|
|
+
|
|
|
+ // 默认按创建时间倒序
|
|
|
+ lqw.orderByDesc(XgDormApplication::getCreateTime);
|
|
|
+
|
|
|
+ return lqw;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 构建假期留宿查询条件(带宿管员权限)
|
|
|
+ */
|
|
|
+ private LambdaQueryWrapper<XgHolidayStay> buildHolidayStayQueryWrapper(XgHolidayStayBo bo, Long currentUserId) {
|
|
|
+ LambdaQueryWrapper<XgHolidayStay> lqw = new LambdaQueryWrapper<>();
|
|
|
+
|
|
|
+ // 获取宿管员管理的楼栋ID列表
|
|
|
+ List<Long> managedBuildingIds = getManagedBuildingIds(currentUserId);
|
|
|
+
|
|
|
+ if (managedBuildingIds.isEmpty()) {
|
|
|
+ // 如果没有管理权限,返回空结果
|
|
|
+ lqw.eq(XgHolidayStay::getId, -1);
|
|
|
+ return lqw;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 只查询宿管员权限内楼栋的学生留宿
|
|
|
+ lqw.in(XgHolidayStay::getBuildingId, managedBuildingIds);
|
|
|
+
|
|
|
+ // 添加其他查询条件
|
|
|
+ lqw.like(bo.getStudentName() != null, XgHolidayStay::getStudentName, bo.getStudentName());
|
|
|
+ lqw.like(bo.getStudentNo() != null, XgHolidayStay::getStudentNo, bo.getStudentNo());
|
|
|
+ lqw.like(bo.getCollegeName() != null, XgHolidayStay::getCollegeName, bo.getCollegeName());
|
|
|
+ lqw.like(bo.getMajorName() != null, XgHolidayStay::getMajorName, bo.getMajorName());
|
|
|
+ lqw.like(bo.getClassName() != null, XgHolidayStay::getClassName, bo.getClassName());
|
|
|
+ lqw.eq(bo.getHolidayType() != null, XgHolidayStay::getHolidayType, bo.getHolidayType());
|
|
|
+ lqw.ge(bo.getApplyStartDate() != null, XgHolidayStay::getApplyStartDate, bo.getApplyStartDate());
|
|
|
+ lqw.le(bo.getApplyEndDate() != null, XgHolidayStay::getApplyEndDate, bo.getApplyEndDate());
|
|
|
+
|
|
|
+ // 默认按创建时间倒序
|
|
|
+ lqw.orderByDesc(XgHolidayStay::getCreateTime);
|
|
|
+
|
|
|
+ return lqw;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 构建学生请假查询条件(带宿管员权限)
|
|
|
+ */
|
|
|
+ private LambdaQueryWrapper<XgStudentLeave> buildStudentLeaveQueryWrapper(XgStudentLeaveBo bo, Long currentUserId) {
|
|
|
+ LambdaQueryWrapper<XgStudentLeave> lqw = new LambdaQueryWrapper<>();
|
|
|
+
|
|
|
+ // 获取宿管员权限内的学生ID列表
|
|
|
+ List<Long> managedStudentIds = getManagedStudentIds(currentUserId);
|
|
|
+
|
|
|
+ if (managedStudentIds.isEmpty()) {
|
|
|
+ // 如果没有管理权限,返回空结果
|
|
|
+ lqw.eq(XgStudentLeave::getId, -1);
|
|
|
+ return lqw;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 只查询宿管员权限内的学生请假
|
|
|
+ lqw.in(XgStudentLeave::getStudentId, managedStudentIds);
|
|
|
+
|
|
|
+ // 添加其他查询条件
|
|
|
+ lqw.like(bo.getStudentName() != null, XgStudentLeave::getStudentName, bo.getStudentName());
|
|
|
+ lqw.like(bo.getStudentNo() != null, XgStudentLeave::getStudentNo, bo.getStudentNo());
|
|
|
+ lqw.like(bo.getCollegeName() != null, XgStudentLeave::getCollegeName, bo.getCollegeName());
|
|
|
+ lqw.like(bo.getMajorName() != null, XgStudentLeave::getMajorName, bo.getMajorName());
|
|
|
+ lqw.like(bo.getClassName() != null, XgStudentLeave::getClassName, bo.getClassName());
|
|
|
+ lqw.like(bo.getLeaveTypeName() != null, XgStudentLeave::getLeaveTypeName, bo.getLeaveTypeName());
|
|
|
+ lqw.eq(bo.getApprovalStatus() != null, XgStudentLeave::getApprovalStatus, bo.getApprovalStatus());
|
|
|
+ lqw.ge(bo.getStartTime() != null, XgStudentLeave::getStartTime, bo.getStartTime());
|
|
|
+ lqw.le(bo.getEndTime() != null, XgStudentLeave::getEndTime, bo.getEndTime());
|
|
|
+
|
|
|
+ // 默认按创建时间倒序
|
|
|
+ lqw.orderByDesc(XgStudentLeave::getCreateTime);
|
|
|
+
|
|
|
+ return lqw;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取宿管员管理的楼栋ID列表(支持多级权限合并)
|
|
|
+ */
|
|
|
+ private List<Long> getManagedBuildingIds(Long userId) {
|
|
|
+ // 查询用户管理权限类型
|
|
|
+ List<String> managerTypes = studentDynamicsMapper.checkUserDormManagerType(userId);
|
|
|
+
|
|
|
+ if (managerTypes == null || managerTypes.isEmpty()) {
|
|
|
+ // 没有宿舍管理权限,返回空列表
|
|
|
+ return new ArrayList<>();
|
|
|
+ }
|
|
|
+
|
|
|
+ // 存储所有权限的楼栋ID,使用Set去重
|
|
|
+ Set<Long> buildingIdSet = new HashSet<>();
|
|
|
+
|
|
|
+ // 按照权限分别查询并合并结果(支持用户拥有多种角色的情况)
|
|
|
+ if (managerTypes.contains("1")) {
|
|
|
+ // 全校管理员,获取所有楼栋
|
|
|
+ List<Long> allBuildings = studentDynamicsMapper.getBuildingIdsBySchoolAdmin(userId);
|
|
|
+ if (allBuildings != null) {
|
|
|
+ buildingIdSet.addAll(allBuildings);
|
|
|
+ }
|
|
|
+ // 全校管理员可以查看所有楼栋,直接返回
|
|
|
+ return new ArrayList<>(buildingIdSet);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 对于非全校管理员,合并多种权限的结果
|
|
|
+ if (managerTypes.contains("2")) {
|
|
|
+ // 校区管理员,获取管理的校区下的楼栋
|
|
|
+ List<Long> campusBuildings = studentDynamicsMapper.getBuildingIdsByCampusAdmin(userId);
|
|
|
+ if (campusBuildings != null) {
|
|
|
+ buildingIdSet.addAll(campusBuildings);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (managerTypes.contains("3")) {
|
|
|
+ // 宿舍区管理员,获取管理的宿舍区下的楼栋
|
|
|
+ List<Long> areaBuildings = studentDynamicsMapper.getBuildingIdsByAreaAdmin(userId);
|
|
|
+ if (areaBuildings != null) {
|
|
|
+ buildingIdSet.addAll(areaBuildings);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (managerTypes.contains("4")) {
|
|
|
+ // 宿舍楼管理员,获取管理的楼栋
|
|
|
+ List<Long> directBuildings = studentDynamicsMapper.getBuildingIdsByBuildingAdmin(userId);
|
|
|
+ if (directBuildings != null) {
|
|
|
+ buildingIdSet.addAll(directBuildings);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return new ArrayList<>(buildingIdSet);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取宿管员权限内的学生ID列表(支持多级权限合并)
|
|
|
+ */
|
|
|
+ private List<Long> getManagedStudentIds(Long userId) {
|
|
|
+ // 查询用户管理权限类型
|
|
|
+ List<String> managerTypes = studentDynamicsMapper.checkUserDormManagerType(userId);
|
|
|
+
|
|
|
+ if (managerTypes == null || managerTypes.isEmpty()) {
|
|
|
+ // 没有宿舍管理权限,返回空列表
|
|
|
+ return new ArrayList<>();
|
|
|
+ }
|
|
|
+
|
|
|
+ // 存储所有权限的学生ID,使用Set去重
|
|
|
+ Set<Long> studentIdSet = new HashSet<>();
|
|
|
+
|
|
|
+ // 按照权限分别查询并合并结果(支持用户拥有多种角色的情况)
|
|
|
+ if (managerTypes.contains("1")) {
|
|
|
+ // 全校管理员,获取所有学生
|
|
|
+ List<Long> allStudents = studentDynamicsMapper.getStudentIdsBySchoolAdmin(userId);
|
|
|
+ if (allStudents != null) {
|
|
|
+ studentIdSet.addAll(allStudents);
|
|
|
+ }
|
|
|
+ // 全校管理员可以查看所有学生,直接返回
|
|
|
+ return new ArrayList<>(studentIdSet);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 对于非全校管理员,合并多种权限的结果
|
|
|
+ if (managerTypes.contains("2")) {
|
|
|
+ // 校区管理员,获取管理的校区下的学生
|
|
|
+ List<Long> campusStudents = studentDynamicsMapper.getStudentIdsByCampusAdmin(userId);
|
|
|
+ if (campusStudents != null) {
|
|
|
+ studentIdSet.addAll(campusStudents);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (managerTypes.contains("3")) {
|
|
|
+ // 宿舍区管理员,获取管理的宿舍区下的学生
|
|
|
+ List<Long> areaStudents = studentDynamicsMapper.getStudentIdsByAreaAdmin(userId);
|
|
|
+ if (areaStudents != null) {
|
|
|
+ studentIdSet.addAll(areaStudents);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (managerTypes.contains("4")) {
|
|
|
+ // 宿舍楼管理员,获取管理的楼栋下的学生
|
|
|
+ List<Long> buildingStudents = studentDynamicsMapper.getStudentIdsByBuildingAdmin(userId);
|
|
|
+ if (buildingStudents != null) {
|
|
|
+ studentIdSet.addAll(buildingStudents);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return new ArrayList<>(studentIdSet);
|
|
|
+ }
|
|
|
+}
|