From f89d747952da871333b6f49e87862ff0330b3c2c Mon Sep 17 00:00:00 2001 From: zlwu <704541015@qq.com> Date: Sat, 25 Oct 2025 12:25:01 +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 --- .../XgStudentDynamicsController.java | 87 ++++ .../xg/mapper/XgStudentDynamicsMapper.java | 85 ++++ .../xg/service/IXgStudentDynamicsService.java | 49 ++ .../impl/XgStudentDynamicsServiceImpl.java | 329 ++++++++++++ .../mapper/xg/XgStudentDynamicsMapper.xml | 213 ++++++++ web/src/api/xg/studentDynamics.ts | 269 ++++++++++ .../components/DormApplicationDetail.vue | 256 ++++++++++ .../components/DormApplicationTab.vue | 258 ++++++++++ .../components/HolidayStayDetail.vue | 474 ++++++++++++++++++ .../components/HolidayStayTab.vue | 263 ++++++++++ .../components/StudentLeaveDetail.vue | 21 + .../components/StudentLeaveTab.vue | 271 ++++++++++ web/src/views/xg/studentDynamics/index.vue | 80 +++ 13 files changed, 2655 insertions(+) create mode 100644 backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgStudentDynamicsController.java create mode 100644 backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgStudentDynamicsMapper.java create mode 100644 backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgStudentDynamicsService.java create mode 100644 backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgStudentDynamicsServiceImpl.java create mode 100644 backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/xg/XgStudentDynamicsMapper.xml create mode 100644 web/src/api/xg/studentDynamics.ts create mode 100644 web/src/views/xg/studentDynamics/components/DormApplicationDetail.vue create mode 100644 web/src/views/xg/studentDynamics/components/DormApplicationTab.vue create mode 100644 web/src/views/xg/studentDynamics/components/HolidayStayDetail.vue create mode 100644 web/src/views/xg/studentDynamics/components/HolidayStayTab.vue create mode 100644 web/src/views/xg/studentDynamics/components/StudentLeaveDetail.vue create mode 100644 web/src/views/xg/studentDynamics/components/StudentLeaveTab.vue create mode 100644 web/src/views/xg/studentDynamics/index.vue diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgStudentDynamicsController.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgStudentDynamicsController.java new file mode 100644 index 00000000..15d88804 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgStudentDynamicsController.java @@ -0,0 +1,87 @@ +package org.dromara.xg.controller; + +import lombok.RequiredArgsConstructor; +import jakarta.validation.constraints.NotNull; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.mybatis.core.page.TableDataInfo; +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.service.IXgStudentDynamicsService; + +/** + * 学生动向信息管理(宿管员) + * + * @author zlwu + * @date 2025-01-15 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/studentDynamics") +public class XgStudentDynamicsController extends BaseController { + + private final IXgStudentDynamicsService xgStudentDynamicsService; + + /** + * 查询宿管员权限内的学生调宿退宿申请列表 + */ + @SaCheckPermission("studentDynamics:dormApplication:list") + @GetMapping("/dormApplicationList") + public TableDataInfo getDormApplicationList(XgDormApplicationBo bo, PageQuery pageQuery) { + return xgStudentDynamicsService.queryDormApplicationPageList(bo, pageQuery); + } + + /** + * 查询宿管员权限内的学生假期留宿信息列表 + */ + @SaCheckPermission("studentDynamics:holidayStay:list") + @GetMapping("/holidayStayList") + public TableDataInfo getHolidayStayList(XgHolidayStayBo bo, PageQuery pageQuery) { + return xgStudentDynamicsService.queryHolidayStayPageList(bo, pageQuery); + } + + /** + * 查询宿管员权限内的学生请假信息列表 + */ + @SaCheckPermission("studentDynamics:studentLeave:list") + @GetMapping("/studentLeaveList") + public TableDataInfo getStudentLeaveList(XgStudentLeaveBo bo, PageQuery pageQuery) { + return xgStudentDynamicsService.queryStudentLeavePageList(bo, pageQuery); + } + + /** + * 获取调宿退宿申请详细信息 + */ + @SaCheckPermission("studentDynamics:dormApplication:query") + @GetMapping("/dormApplication/{id}") + public R getDormApplicationInfo(@NotNull(message = "主键不能为空") @PathVariable Long id) { + return R.ok(xgStudentDynamicsService.queryDormApplicationById(id)); + } + + /** + * 获取假期留宿详细信息 + */ + @SaCheckPermission("studentDynamics:holidayStay:query") + @GetMapping("/holidayStay/{id}") + public R getHolidayStayInfo(@NotNull(message = "主键不能为空") @PathVariable Long id) { + return R.ok(xgStudentDynamicsService.queryHolidayStayById(id)); + } + + /** + * 获取学生请假详细信息 + */ + @SaCheckPermission("studentDynamics:studentLeave:query") + @GetMapping("/studentLeave/{id}") + public R getStudentLeaveInfo(@NotNull(message = "主键不能为空") @PathVariable Long id) { + return R.ok(xgStudentDynamicsService.queryStudentLeaveById(id)); + } +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgStudentDynamicsMapper.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgStudentDynamicsMapper.java new file mode 100644 index 00000000..a2601038 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgStudentDynamicsMapper.java @@ -0,0 +1,85 @@ +package org.dromara.xg.mapper; + +import org.apache.ibatis.annotations.Param; +import java.util.List; + +/** + * 学生动向信息管理(宿管员)Mapper接口 + * + * @author zlwu + * @date 2025-01-15 + */ +public interface XgStudentDynamicsMapper { + + /** + * 检查用户是否有宿舍管理权限 + * + * @param userId 用户ID + * @return 管理员类型列表 (1全校管理员 2校区管理员 3宿舍区管理员 4宿舍楼管理员) + */ + List checkUserDormManagerType(@Param("userId") Long userId); + + /** + * 获取全校管理员权限的所有楼栋ID列表 + * + * @param userId 用户ID + * @return 楼栋ID列表 + */ + List getBuildingIdsBySchoolAdmin(@Param("userId") Long userId); + + /** + * 获取校区管理员权限的楼栋ID列表 + * + * @param userId 用户ID + * @return 楼栋ID列表 + */ + List getBuildingIdsByCampusAdmin(@Param("userId") Long userId); + + /** + * 获取宿舍区管理员权限的楼栋ID列表 + * + * @param userId 用户ID + * @return 楼栋ID列表 + */ + List getBuildingIdsByAreaAdmin(@Param("userId") Long userId); + + /** + * 获取宿舍楼管理员权限的楼栋ID列表 + * + * @param userId 用户ID + * @return 楼栋ID列表 + */ + List getBuildingIdsByBuildingAdmin(@Param("userId") Long userId); + + /** + * 获取全校管理员权限的所有学生ID列表 + * + * @param userId 用户ID + * @return 学生ID列表 + */ + List getStudentIdsBySchoolAdmin(@Param("userId") Long userId); + + /** + * 获取校区管理员权限的学生ID列表 + * + * @param userId 用户ID + * @return 学生ID列表 + */ + List getStudentIdsByCampusAdmin(@Param("userId") Long userId); + + /** + * 获取宿舍区管理员权限的学生ID列表 + * + * @param userId 用户ID + * @return 学生ID列表 + */ + List getStudentIdsByAreaAdmin(@Param("userId") Long userId); + + /** + * 获取宿舍楼管理员权限的学生ID列表 + * + * @param userId 用户ID + * @return 学生ID列表 + */ + List getStudentIdsByBuildingAdmin(@Param("userId") Long userId); +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgStudentDynamicsService.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgStudentDynamicsService.java new file mode 100644 index 00000000..397dc1c5 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgStudentDynamicsService.java @@ -0,0 +1,49 @@ +package org.dromara.xg.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +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; + +/** + * 学生动向信息管理(宿管员)Service接口 + * + * @author zlwu + * @date 2025-01-15 + */ +public interface IXgStudentDynamicsService { + + /** + * 查询宿管员权限内的学生调宿退宿申请列表 + */ + TableDataInfo queryDormApplicationPageList(XgDormApplicationBo bo, PageQuery pageQuery); + + /** + * 查询宿管员权限内的学生假期留宿信息列表 + */ + TableDataInfo queryHolidayStayPageList(XgHolidayStayBo bo, PageQuery pageQuery); + + /** + * 查询宿管员权限内的学生请假信息列表 + */ + TableDataInfo queryStudentLeavePageList(XgStudentLeaveBo bo, PageQuery pageQuery); + + /** + * 根据主键查询调宿退宿申请详情 + */ + XgDormApplicationVo queryDormApplicationById(Long id); + + /** + * 根据主键查询假期留宿详情 + */ + XgHolidayStayVo queryHolidayStayById(Long id); + + /** + * 根据主键查询学生请假详情 + */ + XgStudentLeaveVo queryStudentLeaveById(Long id); +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgStudentDynamicsServiceImpl.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgStudentDynamicsServiceImpl.java new file mode 100644 index 00000000..77a364e3 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgStudentDynamicsServiceImpl.java @@ -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 queryDormApplicationPageList(XgDormApplicationBo bo, + PageQuery pageQuery) { + // 获取当前登录用户ID + Long currentUserId = LoginHelper.getUserId(); + + // 构建查询条件 + LambdaQueryWrapper lqw = buildDormApplicationQueryWrapper(bo, currentUserId); + + // 分页查询 + Page result = dormApplicationMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询宿管员权限内的学生假期留宿信息列表 + */ + @Override + public TableDataInfo queryHolidayStayPageList(XgHolidayStayBo bo, PageQuery pageQuery) { + // 获取当前登录用户ID + Long currentUserId = LoginHelper.getUserId(); + + // 构建查询条件 + LambdaQueryWrapper lqw = buildHolidayStayQueryWrapper(bo, currentUserId); + + // 分页查询 + Page result = holidayStayMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询宿管员权限内的学生请假信息列表 + */ + @Override + public TableDataInfo queryStudentLeavePageList(XgStudentLeaveBo bo, PageQuery pageQuery) { + // 获取当前登录用户ID + Long currentUserId = LoginHelper.getUserId(); + + // 构建查询条件 + LambdaQueryWrapper lqw = buildStudentLeaveQueryWrapper(bo, currentUserId); + + // 分页查询 + Page 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 buildDormApplicationQueryWrapper(XgDormApplicationBo bo, + Long currentUserId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + + // 获取宿管员管理的楼栋ID列表 + List 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 buildHolidayStayQueryWrapper(XgHolidayStayBo bo, Long currentUserId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + + // 获取宿管员管理的楼栋ID列表 + List 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 buildStudentLeaveQueryWrapper(XgStudentLeaveBo bo, Long currentUserId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + + // 获取宿管员权限内的学生ID列表 + List 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 getManagedBuildingIds(Long userId) { + // 查询用户管理权限类型 + List managerTypes = studentDynamicsMapper.checkUserDormManagerType(userId); + + if (managerTypes == null || managerTypes.isEmpty()) { + // 没有宿舍管理权限,返回空列表 + return new ArrayList<>(); + } + + // 存储所有权限的楼栋ID,使用Set去重 + Set buildingIdSet = new HashSet<>(); + + // 按照权限分别查询并合并结果(支持用户拥有多种角色的情况) + if (managerTypes.contains("1")) { + // 全校管理员,获取所有楼栋 + List allBuildings = studentDynamicsMapper.getBuildingIdsBySchoolAdmin(userId); + if (allBuildings != null) { + buildingIdSet.addAll(allBuildings); + } + // 全校管理员可以查看所有楼栋,直接返回 + return new ArrayList<>(buildingIdSet); + } + + // 对于非全校管理员,合并多种权限的结果 + if (managerTypes.contains("2")) { + // 校区管理员,获取管理的校区下的楼栋 + List campusBuildings = studentDynamicsMapper.getBuildingIdsByCampusAdmin(userId); + if (campusBuildings != null) { + buildingIdSet.addAll(campusBuildings); + } + } + + if (managerTypes.contains("3")) { + // 宿舍区管理员,获取管理的宿舍区下的楼栋 + List areaBuildings = studentDynamicsMapper.getBuildingIdsByAreaAdmin(userId); + if (areaBuildings != null) { + buildingIdSet.addAll(areaBuildings); + } + } + + if (managerTypes.contains("4")) { + // 宿舍楼管理员,获取管理的楼栋 + List directBuildings = studentDynamicsMapper.getBuildingIdsByBuildingAdmin(userId); + if (directBuildings != null) { + buildingIdSet.addAll(directBuildings); + } + } + + return new ArrayList<>(buildingIdSet); + } + + /** + * 获取宿管员权限内的学生ID列表(支持多级权限合并) + */ + private List getManagedStudentIds(Long userId) { + // 查询用户管理权限类型 + List managerTypes = studentDynamicsMapper.checkUserDormManagerType(userId); + + if (managerTypes == null || managerTypes.isEmpty()) { + // 没有宿舍管理权限,返回空列表 + return new ArrayList<>(); + } + + // 存储所有权限的学生ID,使用Set去重 + Set studentIdSet = new HashSet<>(); + + // 按照权限分别查询并合并结果(支持用户拥有多种角色的情况) + if (managerTypes.contains("1")) { + // 全校管理员,获取所有学生 + List allStudents = studentDynamicsMapper.getStudentIdsBySchoolAdmin(userId); + if (allStudents != null) { + studentIdSet.addAll(allStudents); + } + // 全校管理员可以查看所有学生,直接返回 + return new ArrayList<>(studentIdSet); + } + + // 对于非全校管理员,合并多种权限的结果 + if (managerTypes.contains("2")) { + // 校区管理员,获取管理的校区下的学生 + List campusStudents = studentDynamicsMapper.getStudentIdsByCampusAdmin(userId); + if (campusStudents != null) { + studentIdSet.addAll(campusStudents); + } + } + + if (managerTypes.contains("3")) { + // 宿舍区管理员,获取管理的宿舍区下的学生 + List areaStudents = studentDynamicsMapper.getStudentIdsByAreaAdmin(userId); + if (areaStudents != null) { + studentIdSet.addAll(areaStudents); + } + } + + if (managerTypes.contains("4")) { + // 宿舍楼管理员,获取管理的楼栋下的学生 + List buildingStudents = studentDynamicsMapper.getStudentIdsByBuildingAdmin(userId); + if (buildingStudents != null) { + studentIdSet.addAll(buildingStudents); + } + } + + return new ArrayList<>(studentIdSet); + } +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/xg/XgStudentDynamicsMapper.xml b/backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/xg/XgStudentDynamicsMapper.xml new file mode 100644 index 00000000..096e0f8a --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/xg/XgStudentDynamicsMapper.xml @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/src/api/xg/studentDynamics.ts b/web/src/api/xg/studentDynamics.ts new file mode 100644 index 00000000..a4b7c059 --- /dev/null +++ b/web/src/api/xg/studentDynamics.ts @@ -0,0 +1,269 @@ +import request from '@/utils/request'; +import { AxiosPromise } from 'axios'; + +/** + * 学生动向信息管理(宿管员)API + * 这些接口专门用于学生动向Tab页,会自动根据宿管员权限过滤数据 + */ + +// ==================== 调宿退宿申请相关接口 ==================== + +export interface DormApplicationQuery { + pageNum?: number; + pageSize?: number; + studentName?: string; + studentNo?: string; + collegeName?: string; + majorName?: string; + className?: string; + applicationType?: string; + applicationStatus?: string; + applyTime?: string; + params?: any; +} + +export interface DormApplicationVO { + id: string | number; + applicationName: string; + applicationType: string; + applicationStatus: string; + studentId: string | number; + studentNo: string; + studentName: string; + studentPhone: string; + collegeId: string | number; + collegeName: string; + majorId: string | number; + majorName: string; + classId: string | number; + className: string; + currentCampusId: string | number; + currentCampusName: string; + currentBuildingId: string | number; + currentBuildingName: string; + currentRoomId: string | number; + currentRoomNo: string; + currentBedId: string | number; + currentBedNo: string; + targetCampusId?: string | number; + targetCampusName?: string; + targetBuildingId?: string | number; + targetBuildingName?: string; + targetRoomId?: string | number; + targetRoomNo?: string; + targetBedId?: string | number; + targetBedNo?: string; + reasonDetail: string; + applyTime: string; + attachmentOssIds?: string; + remark?: string; + createTime: string; + updateTime: string; +} + +/** + * 查询宿管员权限内的学生调宿退宿申请列表 + */ +export function listDormApplication(query?: DormApplicationQuery): AxiosPromise { + return request({ + url: '/studentDynamics/dormApplicationList', + method: 'get', + params: query + }); +} + +/** + * 获取调宿退宿申请详细信息 + */ +export function getDormApplication(id: string | number): AxiosPromise { + return request({ + url: '/studentDynamics/dormApplication/' + id, + method: 'get' + }); +} + +/** + * 获取调宿退宿申请详细信息(别名) + */ +export const getDormApplicationInfo = getDormApplication; + +/** + * 修改调宿退宿申请信息 + */ +export function updateDormApplication(data: DormApplicationVO): AxiosPromise { + return request({ + url: '/studentDynamics/dormApplication', + method: 'put', + data: data + }); +} + +/** + * 删除调宿退宿申请 + */ +export function delDormApplication(id: string | number | Array): AxiosPromise { + return request({ + url: '/studentDynamics/dormApplication/' + id, + method: 'delete' + }); +} + +// ==================== 假期留宿相关接口 ==================== + +export interface HolidayStayQuery { + pageNum?: number; + pageSize?: number; + studentName?: string; + studentNo?: string; + collegeName?: string; + majorName?: string; + className?: string; + holidayType?: string; + applyStartDate?: string; + applyEndDate?: string; + status?: string; + params?: any; +} + +export interface HolidayStayVO { + id: string | number; + studentId: string | number; + studentName: string; + studentNo: string; + classId: string | number; + className: string; + majorId: string | number; + majorName: string; + collegeId: string | number; + collegeName: string; + campusId: string | number; + campusName: string; + areaId?: string | number; + areaName?: string; + buildingId: string | number; + buildingName: string; + roomId: string | number; + roomName: string; + bedId: string | number; + bedName: string; + holidayType: string; + applyStartDate: string; + applyEndDate: string; + stayReason: string; + stayReasonType: string; + studentPhone: string; + emergencyContact: string; + emergencyPhone: string; + parentConsent: string; + attachmentOssIds?: string; + remark?: string; + createTime: string; + updateTime: string; +} + +/** + * 查询宿管员权限内的学生假期留宿信息列表 + */ +export function listHolidayStay(query?: HolidayStayQuery): AxiosPromise { + return request({ + url: '/studentDynamics/holidayStayList', + method: 'get', + params: query + }); +} + +/** + * 获取假期留宿详细信息 + */ +export function getHolidayStay(id: string | number): AxiosPromise { + return request({ + url: '/studentDynamics/holidayStay/' + id, + method: 'get' + }); +} + +/** + * 获取假期留宿详细信息(别名) + */ +export const getHolidayStayInfo = getHolidayStay; + +// ==================== 学生请假相关接口 ==================== + +export interface StudentLeaveQuery { + pageNum?: number; + pageSize?: number; + studentName?: string; + studentNo?: string; + collegeName?: string; + majorName?: string; + className?: string; + leaveTypeName?: string; + approvalStatus?: string; + startTime?: string; + endTime?: string; + params?: any; +} + +export interface StudentLeaveVO { + id: string | number; + studentId: string | number; + studentName: string; + studentNo: string; + classId: string | number; + className: string; + majorId: string | number; + majorName: string; + collegeId: string | number; + collegeName: string; + leaveTypeCode: string; + leaveTypeName: string; + startTime: string; + endTime: string; + leaveDuration: number; + isLeaveSchool: string; + needCancel: string; + emergencyContact: string; + emergencyPhone: string; + leaveReason: string; + leaveLocation?: string; + attachmentOssIds?: string; + approvalStatus: string; + approvalOpinion?: string; + approvalTime?: string; + approvalBy?: string | number; + approvalByName?: string; + cancelStatus?: string; + cancelTime?: string; + cancelLocation?: string; + cancelPhotoOssIds?: string; + cancelRemark?: string; + createTime: string; + updateTime: string; +} + +/** + * 查询宿管员权限内的学生请假信息列表 + */ +export function listStudentLeave(query?: StudentLeaveQuery): AxiosPromise { + return request({ + url: '/studentDynamics/studentLeaveList', + method: 'get', + params: query + }); +} + +/** + * 获取学生请假详细信息 + */ +export function getStudentLeave(id: string | number): AxiosPromise { + return request({ + url: '/studentDynamics/studentLeave/' + id, + method: 'get' + }); +} + +/** + * 获取学生请假详细信息(别名) + */ +export const getStudentLeaveInfo = getStudentLeave; + diff --git a/web/src/views/xg/studentDynamics/components/DormApplicationDetail.vue b/web/src/views/xg/studentDynamics/components/DormApplicationDetail.vue new file mode 100644 index 00000000..a7078a54 --- /dev/null +++ b/web/src/views/xg/studentDynamics/components/DormApplicationDetail.vue @@ -0,0 +1,256 @@ + + + + + diff --git a/web/src/views/xg/studentDynamics/components/DormApplicationTab.vue b/web/src/views/xg/studentDynamics/components/DormApplicationTab.vue new file mode 100644 index 00000000..f5403dd5 --- /dev/null +++ b/web/src/views/xg/studentDynamics/components/DormApplicationTab.vue @@ -0,0 +1,258 @@ + + + + + diff --git a/web/src/views/xg/studentDynamics/components/HolidayStayDetail.vue b/web/src/views/xg/studentDynamics/components/HolidayStayDetail.vue new file mode 100644 index 00000000..e67443b2 --- /dev/null +++ b/web/src/views/xg/studentDynamics/components/HolidayStayDetail.vue @@ -0,0 +1,474 @@ + + + + + diff --git a/web/src/views/xg/studentDynamics/components/HolidayStayTab.vue b/web/src/views/xg/studentDynamics/components/HolidayStayTab.vue new file mode 100644 index 00000000..397aa21b --- /dev/null +++ b/web/src/views/xg/studentDynamics/components/HolidayStayTab.vue @@ -0,0 +1,263 @@ + + + + + diff --git a/web/src/views/xg/studentDynamics/components/StudentLeaveDetail.vue b/web/src/views/xg/studentDynamics/components/StudentLeaveDetail.vue new file mode 100644 index 00000000..91b87b19 --- /dev/null +++ b/web/src/views/xg/studentDynamics/components/StudentLeaveDetail.vue @@ -0,0 +1,21 @@ + + + diff --git a/web/src/views/xg/studentDynamics/components/StudentLeaveTab.vue b/web/src/views/xg/studentDynamics/components/StudentLeaveTab.vue new file mode 100644 index 00000000..06d85cf0 --- /dev/null +++ b/web/src/views/xg/studentDynamics/components/StudentLeaveTab.vue @@ -0,0 +1,271 @@ + + + + + diff --git a/web/src/views/xg/studentDynamics/index.vue b/web/src/views/xg/studentDynamics/index.vue new file mode 100644 index 00000000..0f078ed0 --- /dev/null +++ b/web/src/views/xg/studentDynamics/index.vue @@ -0,0 +1,80 @@ + + + + +