diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgClassMsgController.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgClassMsgController.java index 1cae46cb..306996e0 100644 --- a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgClassMsgController.java +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgClassMsgController.java @@ -19,6 +19,8 @@ import org.dromara.common.log.enums.BusinessType; import org.dromara.common.excel.utils.ExcelUtil; import org.dromara.xg.domain.vo.XgClassMsgVo; import org.dromara.xg.domain.bo.XgClassMsgBo; +import org.dromara.xg.domain.bo.XgClassStatusBo; +import org.dromara.xg.domain.bo.XgClassStatusBatchBo; import org.dromara.xg.service.IXgClassMsgService; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.satoken.utils.LoginHelper; @@ -90,6 +92,28 @@ public class XgClassMsgController extends BaseController { return toAjax(xgClassMsgService.updateByBo(bo)); } + /** + * 更新班级状态(仅更新 classStatus) + */ + @SaCheckPermission("classMsg:classMsg:edit") + @Log(title = "班级信息-新版", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping("/status") + public R updateStatus(@Validated @RequestBody XgClassStatusBo bo) { + return toAjax(xgClassMsgService.updateClassStatus(bo.getId(), bo.getClassStatus())); + } + + /** + * 批量更新班级状态(仅更新 classStatus) + */ + @SaCheckPermission("classMsg:classMsg:edit") + @Log(title = "班级信息-新版", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping("/status/batch") + public R updateStatusBatch(@Validated @RequestBody XgClassStatusBatchBo bo) { + return toAjax(xgClassMsgService.updateClassStatusBatch(bo.getIds(), bo.getClassStatus())); + } + /** * 删除班级信息-新版 * diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgStudentManagerController.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgStudentManagerController.java index 24958c48..9a44f490 100644 --- a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgStudentManagerController.java +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgStudentManagerController.java @@ -57,6 +57,50 @@ public class XgStudentManagerController extends BaseController { ExcelUtil.exportExcel(list, "宿舍管理员信息", XgStudentManagerVo.class, response); } + /** + * 获取可用的教职工信息列表 + * + * @param managerType 管理员类型(1 全校管理员 2 自定义管理员 3 班主任) + */ + @SaCheckPermission("xgStudentManager:studentManager:list") + @GetMapping("/listAvailableTeachers") + public R> listAvailableTeachers(@RequestParam("managerType") String managerType) { + List teachers = xgStudentManagerService.queryAvailableTeachers(managerType); + return R.ok(teachers); + } + + /** + * 获取当前正在教学的班主任信息 + * + * @param phone 手机号码(可选,模糊查询) + * @param name 姓名(可选,模糊查询) + * @return 班主任信息列表 + */ + @SaCheckPermission("xgStudentManager:studentManager:list") + @GetMapping("/listActiveClassTeachers") + public R> listActiveClassTeachers( + @RequestParam(value = "phone", required = false) String phone, + @RequestParam(value = "name", required = false) String name) { + List teachers = xgStudentManagerService.queryActiveClassTeachers(phone, name); + return R.ok(teachers); + } + + /** + * 获取全部班主任信息(按班级状态排序) + * + * @param phone 手机号码(可选,模糊查询) + * @param name 姓名(可选,模糊查询) + * @return 班主任信息列表 + */ + @SaCheckPermission("xgStudentManager:studentManager:list") + @GetMapping("/listAllClassTeachers") + public R> listAllClassTeachers( + @RequestParam(value = "phone", required = false) String phone, + @RequestParam(value = "name", required = false) String name) { + List teachers = xgStudentManagerService.queryAllClassTeachers(phone, name); + return R.ok(teachers); + } + /** * 获取宿舍管理员信息详细信息 * @@ -101,32 +145,4 @@ public class XgStudentManagerController extends BaseController { public R remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ids) { return toAjax(xgStudentManagerService.deleteWithValidByIds(List.of(ids), true)); } - - /** - * 获取可用的教职工信息列表 - * - * @param managerType 管理员类型(1 全校管理员 2 自定义管理员 3 班主任) - */ - @SaCheckPermission("xgStudentManager:studentManager:list") - @GetMapping("/listAvailableTeachers") - public R> listAvailableTeachers(@RequestParam("managerType") String managerType) { - List teachers = xgStudentManagerService.queryAvailableTeachers(managerType); - return R.ok(teachers); - } - - /** - * 获取当前正在教学的班主任信息 - * - * @param phone 手机号码(可选,模糊查询) - * @param name 姓名(可选,模糊查询) - * @return 班主任信息列表 - */ - @SaCheckPermission("xgStudentManager:studentManager:list") - @GetMapping("/listActiveClassTeachers") - public R> listActiveClassTeachers( - @RequestParam(value = "phone", required = false) String phone, - @RequestParam(value = "name", required = false) String name) { - List teachers = xgStudentManagerService.queryActiveClassTeachers(phone, name); - return R.ok(teachers); - } } diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/bo/XgClassStatusBatchBo.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/bo/XgClassStatusBatchBo.java new file mode 100644 index 00000000..3685abda --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/bo/XgClassStatusBatchBo.java @@ -0,0 +1,23 @@ +package org.dromara.xg.domain.bo; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; +import lombok.Data; + +import java.util.List; + +/** + * 班级状态批量更新业务对象(仅用于状态变更) + */ +@Data +public class XgClassStatusBatchBo { + /** 主键ID集合(雪花ID) */ + @NotEmpty(message = "主键ID集合不能为空") + private List ids; + + /** 班级状态:1-正常 2-暂停 3-毕业 4-解散 */ + @NotBlank(message = "班级状态不能为空") + private String classStatus; +} + + diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/bo/XgClassStatusBo.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/bo/XgClassStatusBo.java new file mode 100644 index 00000000..4cda0373 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/bo/XgClassStatusBo.java @@ -0,0 +1,21 @@ +package org.dromara.xg.domain.bo; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +/** + * 班级状态更新业务对象(仅用于状态变更) + */ +@Data +public class XgClassStatusBo { + /** 主键ID(雪花ID) */ + @NotNull(message = "主键ID不能为空") + private Long id; + + /** 班级状态:1-正常 2-暂停 3-毕业 4-解散 */ + @NotBlank(message = "班级状态不能为空") + private String classStatus; +} + + diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/ClassTeacherInfoVo.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/ClassTeacherInfoVo.java index 6ec655aa..b7987dca 100644 --- a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/ClassTeacherInfoVo.java +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/ClassTeacherInfoVo.java @@ -12,4 +12,5 @@ public class ClassTeacherInfoVo implements Serializable { private String phone; private String sex; private String className; + private String classStatus; } diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgStudentMsgMapper.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgStudentMsgMapper.java index 155ef255..27eda846 100644 --- a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgStudentMsgMapper.java +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgStudentMsgMapper.java @@ -19,95 +19,95 @@ import java.util.Map; */ public interface XgStudentMsgMapper extends BaseMapperPlus { - /** - * 根据组织ID列表分页查询学生信息 用于导出 - * - * @param page 分页参数 - * @param queryWrapper 查询条件 - * @param deptIds 组织ID列表 - * @return 学生信息分页结果 - */ - List queryPageListExportByDeptId( - @Param("ew") LambdaQueryWrapper queryWrapper, - @Param("deptIds") List deptIds); + /** + * 根据组织ID列表分页查询学生信息 用于导出 + * + * @param page 分页参数 + * @param queryWrapper 查询条件 + * @param deptIds 组织ID列表 + * @return 学生信息分页结果 + */ + List queryPageListExportByDeptId( + @Param("ew") LambdaQueryWrapper queryWrapper, + @Param("deptIds") List deptIds); - /** - * 根据组织ID列表分页查询学生信息 - * - * @param page 分页参数 - * @param queryWrapper 查询条件 - * @param deptIds 组织ID列表 - * @return 学生信息分页结果 - */ - Page selectPageByDeptIds(@Param("page") Page page, - @Param("ew") LambdaQueryWrapper queryWrapper, - @Param("deptIds") List deptIds); + /** + * 根据组织ID列表分页查询学生信息 + * + * @param page 分页参数 + * @param queryWrapper 查询条件 + * @param deptIds 组织ID列表 + * @return 学生信息分页结果 + */ + Page selectPageByDeptIds(@Param("page") Page page, + @Param("ew") LambdaQueryWrapper queryWrapper, + @Param("deptIds") List deptIds); - /** - * 根据班级ID和姓名查询学生信息列表 - * - * @param classId 班级ID - * @param name 学生姓名(模糊查询) - * @return 学生信息列表 - */ - List selectStudentsByClassId(@Param("classId") String classId, @Param("name") String name); + /** + * 根据班级ID和姓名查询学生信息列表 + * + * @param classId 班级ID + * @param name 学生姓名(模糊查询) + * @return 学生信息列表 + */ + List selectStudentsByClassId(@Param("classId") String classId, @Param("name") String name); - /** - * 根据学生ID查询班主任ID - * - * @param studentId 学生ID - * @return 班主任ID - */ - Long selectClassTeacherIdByStudentId(@Param("studentId") Long studentId); + /** + * 根据学生ID查询班主任ID + * + * @param studentId 学生ID + * @return 班主任ID + */ + Long selectClassTeacherIdByStudentId(@Param("studentId") Long studentId); - /** - * 根据学生ID查询学院ID - * - * @param studentId 学生ID - * @return 学院ID - */ - Long selectCollegeIdByStudentId(@Param("studentId") Long studentId); + /** + * 根据学生ID查询学院ID + * + * @param studentId 学生ID + * @return 学院ID + */ + Long selectCollegeIdByStudentId(@Param("studentId") Long studentId); - /** - * 根据学院ID和角色Key查询具备该角色的用户列表 - * - * @param collegeId 学院ID - * @param roleKey 角色Key - * @return 用户ID列表 - */ - List selectUserIdsByCollegeIdAndRoleKey(@Param("collegeId") Long collegeId, - @Param("roleKey") String roleKey); + /** + * 根据学院ID和角色Key查询具备该角色的用户列表 + * + * @param collegeId 学院ID + * @param roleKey 角色Key + * @return 用户ID列表 + */ + List selectUserIdsByCollegeIdAndRoleKey(@Param("collegeId") Long collegeId, + @Param("roleKey") String roleKey); - /** - * 根据学院ID查询二级学院分管领导ID列表 - * - * @param collegeId 学院ID - * @return 分管领导ID列表 - */ - List selectCollegeLeaderIdsByCollegeId(@Param("collegeId") Long collegeId); + /** + * 根据学院ID查询二级学院分管领导ID列表 + * + * @param collegeId 学院ID + * @return 分管领导ID列表 + */ + List selectCollegeLeaderIdsByCollegeId(@Param("collegeId") Long collegeId); - /** - * 查询二级学院下的学院、专业、班级学生统计信息 - * - * @param secondaryCollegeId 二级学院ID - * @return 学生统计信息列表 - */ - List> getCollegeStudentStats(@Param("secondaryCollegeId") Long secondaryCollegeId); + /** + * 查询二级学院下的学院、专业、班级学生统计信息 + * + * @param secondaryCollegeId 二级学院ID + * @return 学生统计信息列表 + */ + List> getCollegeStudentStats(@Param("secondaryCollegeId") Long secondaryCollegeId); - /** - * 查询二级学院下的学院、专业、班级学生统计信息(按床位分配统计) - * - * @param secondaryCollegeId 二级学院ID - * @return 学生统计信息列表 - */ - List> getCollegeStudentStatsByClass(@Param("secondaryCollegeId") Long secondaryCollegeId); + /** + * 查询二级学院下的学院、专业、班级学生统计信息(按床位分配统计) + * + * @param secondaryCollegeId 二级学院ID + * @return 学生统计信息列表 + */ + List> getCollegeStudentStatsByClass(@Param("secondaryCollegeId") Long secondaryCollegeId); - /** - * 查询二级学院下的学院床位分配统计信息(基于college_id统计) - * - * @param secondaryCollegeId 二级学院ID - * @return 学院床位分配统计信息列表 - */ - List> getCollegeBedAssignmentStats(@Param("secondaryCollegeId") Long secondaryCollegeId); + /** + * 查询二级学院下的学院床位分配统计信息(基于college_id统计) + * + * @param secondaryCollegeId 二级学院ID + * @return 学院床位分配统计信息列表 + */ + List> getCollegeBedAssignmentStats(@Param("secondaryCollegeId") Long secondaryCollegeId); } diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgClassMsgService.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgClassMsgService.java index 11fccad9..6559048c 100644 --- a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgClassMsgService.java +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgClassMsgService.java @@ -65,4 +65,22 @@ public interface IXgClassMsgService { * @return 是否删除成功 */ Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 更新班级状态(仅更新 classStatus 字段) + * + * @param id 班级ID + * @param classStatus 班级状态:1-正常 2-暂停 3-毕业 4-解散 + * @return 是否更新成功 + */ + Boolean updateClassStatus(Long id, String classStatus); + + /** + * 批量更新班级状态(仅更新 classStatus 字段) + * + * @param ids 班级ID集合 + * @param classStatus 班级状态:1-正常 2-暂停 3-毕业 4-解散 + * @return 是否更新成功 + */ + Boolean updateClassStatusBatch(Collection ids, String classStatus); } diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgStudentManagerService.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgStudentManagerService.java index 2cce1dbe..102f3bc4 100644 --- a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgStudentManagerService.java +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgStudentManagerService.java @@ -83,4 +83,13 @@ public interface IXgStudentManagerService { * @return 班主任信息列表 */ List queryActiveClassTeachers(String phone, String name); + + /** + * 获取所有班主任信息(按班级状态排序) + * + * @param phone 手机号 + * @param name 姓名 + * @return 班主任信息列表 + */ + List queryAllClassTeachers(String phone, String name); } diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgClassMsgServiceImpl.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgClassMsgServiceImpl.java index 6ad59c7a..e75c9233 100644 --- a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgClassMsgServiceImpl.java +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgClassMsgServiceImpl.java @@ -79,8 +79,10 @@ public class XgClassMsgServiceImpl implements IXgClassMsgService { private LambdaQueryWrapper buildQueryWrapper(XgClassMsgBo bo) { Map params = bo.getParams(); LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - // lqw.orderByAsc(XgClassMsg::getId); - lqw.orderByDesc(XgClassMsg::getCreateTime); + lqw.orderByDesc(XgClassMsg::getGrade) + .orderByAsc(XgClassMsg::getCollegeName) + .orderByAsc(XgClassMsg::getMajorName) + .orderByAsc(XgClassMsg::getClassStatus); lqw.eq(bo.getId() != null, XgClassMsg::getId, bo.getId()); lqw.eq(bo.getCollegeId() != null, XgClassMsg::getCollegeId, bo.getCollegeId()); lqw.eq(bo.getMajorId() != null, XgClassMsg::getMajorId, bo.getMajorId()); @@ -272,4 +274,27 @@ public class XgClassMsgServiceImpl implements IXgClassMsgService { return baseMapper.deleteByIds(ids) > 0; } + + /** + * 仅更新班级状态 + */ + @Override + public Boolean updateClassStatus(Long id, String classStatus) { + LambdaUpdateWrapper uw = Wrappers.lambdaUpdate(); + uw.eq(XgClassMsg::getId, id).set(XgClassMsg::getClassStatus, classStatus); + return baseMapper.update(null, uw) > 0; + } + + /** + * 批量仅更新班级状态 + */ + @Override + public Boolean updateClassStatusBatch(Collection ids, String classStatus) { + if (ids == null || ids.isEmpty()) { + return false; + } + LambdaUpdateWrapper uw = Wrappers.lambdaUpdate(); + uw.in(XgClassMsg::getId, ids).set(XgClassMsg::getClassStatus, classStatus); + return baseMapper.update(null, uw) > 0; + } } diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgStudentManagerServiceImpl.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgStudentManagerServiceImpl.java index 30e6dd6b..c9bbbce2 100644 --- a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgStudentManagerServiceImpl.java +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgStudentManagerServiceImpl.java @@ -157,7 +157,7 @@ public class XgStudentManagerServiceImpl implements IXgStudentManagerService { @Override public List queryActiveClassTeachers(String phone, String name) { StringBuilder sql = new StringBuilder( - "SELECT s.nick_name as name, s.phonenumber as phone, s.sex as sex, c.class_name as className " + + "SELECT s.nick_name as name, s.phonenumber as phone, s.sex as sex, c.class_name as className, c.class_status as classStatus " + "FROM xg_class_msg c, sys_user s " + "WHERE c.deleted = '0' " + "AND c.class_status = '1' " + @@ -180,6 +180,37 @@ public class XgStudentManagerServiceImpl implements IXgStudentManagerService { vo.setPhone(rs.getString("phone")); vo.setSex(rs.getString("sex")); vo.setClassName(rs.getString("className")); + vo.setClassStatus(rs.getString("classStatus")); + return vo; + }); + } + + @Override + public List queryAllClassTeachers(String phone, String name) { + StringBuilder sql = new StringBuilder( + "SELECT s.nick_name as name, s.phonenumber as phone, s.sex as sex, c.class_name as className, c.class_status as classStatus " + + "FROM xg_class_msg c, sys_user s " + + "WHERE c.deleted = '0' " + + "AND c.class_teacher_id IS NOT NULL " + + "AND c.class_teacher_id = s.user_id " + + "AND s.del_flag = '0'"); + List params = new java.util.ArrayList<>(); + if (StringUtils.isNotBlank(name)) { + sql.append(" AND s.nick_name LIKE ?"); + params.add("%" + name + "%"); + } + if (StringUtils.isNotBlank(phone)) { + sql.append(" AND s.phonenumber LIKE ?"); + params.add("%" + phone + "%"); + } + sql.append(" ORDER BY c.class_status ASC, c.class_name ASC"); + return jdbcTemplate.query(sql.toString(), params.toArray(), (rs, rowNum) -> { + ClassTeacherInfoVo vo = new ClassTeacherInfoVo(); + vo.setName(rs.getString("name")); + vo.setPhone(rs.getString("phone")); + vo.setSex(rs.getString("sex")); + vo.setClassName(rs.getString("className")); + vo.setClassStatus(rs.getString("classStatus")); return vo; }); } diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgStudentMsgServiceImpl.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgStudentMsgServiceImpl.java index af3095f1..03671ae7 100644 --- a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgStudentMsgServiceImpl.java +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgStudentMsgServiceImpl.java @@ -145,8 +145,12 @@ public class XgStudentMsgServiceImpl implements IXgStudentMsgService { LambdaQueryWrapper lqw = buildQueryWrapperForDeptQuery(bo); // 第三步:分页查询学生信息 + List classIdList = filteredDeptIds.stream() + .map(String::valueOf) + .collect(Collectors.toList()); + List result = baseMapper.queryPageListExportByDeptId(lqw, - filteredDeptIds); + classIdList); return result; } @@ -178,7 +182,11 @@ public class XgStudentMsgServiceImpl implements IXgStudentMsgService { LambdaQueryWrapper lqw = buildQueryWrapperForDeptQuery(bo); // 第三步:分页查询学生信息 - Page result = baseMapper.selectPageByDeptIds(pageQuery.build(), lqw, filteredDeptIds); + List classIdList = filteredDeptIds.stream() + .map(String::valueOf) + .collect(Collectors.toList()); + + Page result = baseMapper.selectPageByDeptIds(pageQuery.build(), lqw, classIdList); return TableDataInfo.build(result); } @@ -715,8 +723,12 @@ public class XgStudentMsgServiceImpl implements IXgStudentMsgService { LambdaQueryWrapper lqw = buildAdvancedSearchQueryWrapper(bo); // 第三步:分页查询学生信息 + List classIdList = filteredDeptIds.stream() + .map(String::valueOf) + .collect(Collectors.toList()); + Page result = baseMapper.selectPageByDeptIds( - new Page<>(bo.getPageNum(), bo.getPageSize()), lqw, filteredDeptIds); + new Page<>(bo.getPageNum(), bo.getPageSize()), lqw, classIdList); return TableDataInfo.build(result); } diff --git a/docs/开发文档/API/学生信息管理API.md b/docs/开发文档/API/学生信息管理API.md deleted file mode 100644 index dcb12818..00000000 --- a/docs/开发文档/API/学生信息管理API.md +++ /dev/null @@ -1,854 +0,0 @@ -# 学生信息管理API文档 - -## 1. 文档说明 - -### 1.1 API基础信息 -- **模块名称**: 学工管理 - 学生信息管理 -- **模块代码**: ruoyi-xg -- **基础路径**: `/studentMsg/studentMsg` -- **权限前缀**: `studentMsg:studentMsg` -- **版本**: 1.0.0 -- **更新时间**: 2025-01-27(新增班级学生查询接口) - -### 1.2 通用规范 -- **请求方式**: 支持GET、POST、PUT、DELETE -- **数据格式**: JSON -- **字符编码**: UTF-8 -- **认证方式**: Bearer Token -- **权限控制**: Sa-Token + 数据权限 - -### 1.3 响应格式 -```json -{ - "code": 200, - "msg": "操作成功", - "data": {}, - "timestamp": "2025-01-27T18:00:00" -} -``` - -## 2. 学生信息管理接口 - -### 2.1 查询学生信息列表 -- **接口路径**: GET `/studentMsg/studentMsg/list` -- **权限标识**: `studentMsg:studentMsg:list` -- **功能描述**: 分页查询学生信息列表,支持多条件筛选 - -#### 请求参数 -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| pageNum | integer | 否 | 页码,默认1 | -| pageSize | integer | 否 | 每页大小,默认10 | -| studentNo | string | 否 | 学号 | -| name | string | 否 | 姓名(模糊查询) | -| idCard | string | 否 | 身份证号 | -| gender | string | 否 | 性别:0-男,1-女 | -| studentStatus | string | 否 | 学籍状态 | -| phone | string | 否 | 联系电话(模糊查询) | -| email | string | 否 | 邮箱 | -| classId | string | 否 | 班级ID | -| className | string | 否 | 班级名称 | -| majorId | string | 否 | 专业ID | -| majorName | string | 否 | 专业名称 | -| collegeId | string | 否 | 学院ID | -| collegeName | string | 否 | 学院名称 | - -#### 响应数据 -```json -{ - "code": 200, - "msg": "查询成功", - "rows": [ - { - "id": 1, - "studentNo": "2023001001", - "name": "张三", - "gender": "0", - "birthDate": "2000-01-01", - "idCard": "110101199901010001", - "phone": "13800138000", - "email": "zhangsan@example.com", - "classId": "101", - "className": "计算机2023-1班", - "majorId": "CS001", - "majorName": "计算机科学与技术", - "collegeId": "CS", - "collegeName": "计算机学院", - "studentStatus": "1", - "createTime": "2025-01-27 10:00:00", - "updateTime": "2025-01-27 10:00:00" - } - ], - "total": 1 -} -``` - -### 2.2 根据组织ID查询学生信息列表 -- **接口路径**: POST `/studentMsg/studentMsg/listByDeptId` -- **权限标识**: `studentMsg:studentMsg:list` -- **功能描述**: 根据部门ID查询该组织下所有学生信息 - -#### 请求参数 -```json -{ - "dept_id": 101, - "name": "张", - "studentNo": "2023001", - "phone": "138", - "studentStatus": "1", - "beginTime": "2025-01-01", - "endTime": "2025-01-27" -} -``` - -#### 响应数据 -```json -{ - "code": 200, - "msg": "查询成功", - "rows": [...], - "total": 10 -} -``` - -### 2.3 查询班级中所有学生信息 ⭐ 新增 -- **接口路径**: GET `/studentMsg/studentMsg/listByClassId` -- **权限标识**: `studentMsg:studentMsg:query` -- **功能描述**: 查询指定班级中所有在籍学生信息 - -#### 请求参数 -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| classId | string | 是 | 班级ID | -| name | string | 否 | 学生姓名(模糊查询) | - -#### 响应数据 -```json -{ - "code": 200, - "msg": "查询成功", - "data": [ - { - "id": 1, - "studentNo": "2023001001", - "name": "张三", - "gender": "0", - "birthDate": "2000-01-01", - "idCard": "110101199901010001", - "phone": "13800138000", - "email": "zhangsan@example.com", - "classId": "101", - "className": "计算机2023-1班", - "majorId": "CS001", - "majorName": "计算机科学与技术", - "collegeId": "CS", - "collegeName": "计算机学院", - "studentStatus": "1", - "createTime": "2025-01-27 10:00:00", - "updateTime": "2025-01-27 10:00:00" - } - ] -} -``` - -#### 业务逻辑 -1. 在 `xg_student_msg` 表中查询: - - `deleted = 0` (未删除) - - `student_status = '1'` (在籍状态) - - `class_id = 入参的classId` (班级ID) - - `name LIKE '%入参的name%'` (姓名模糊查询,可选) - - 按创建时间倒序排列 - -### 2.4 获取学生信息详情 -- **接口路径**: GET `/studentMsg/studentMsg/{id}` -- **权限标识**: `studentMsg:studentMsg:query` -- **功能描述**: 根据ID获取学生详细信息 - -#### 请求参数 -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| id | long | 是 | 学生ID | - -#### 响应数据 -```json -{ - "code": 200, - "msg": "查询成功", - "data": { - "id": 1, - "studentNo": "2023001001", - "name": "张三", - "gender": "0", - "birthDate": "2000-01-01", - "idCard": "110101199901010001", - "phone": "13800138000", - "email": "zhangsan@example.com", - "classId": "101", - "className": "计算机2023-1班", - "majorId": "CS001", - "majorName": "计算机科学与技术", - "collegeId": "CS", - "collegeName": "计算机学院", - "studentStatus": "1", - "createTime": "2025-01-27 10:00:00", - "updateTime": "2025-01-27 10:00:00" - } -} -``` - -### 2.5 新增学生信息 -- **接口路径**: POST `/studentMsg/studentMsg` -- **权限标识**: `studentMsg:studentMsg:add` -- **功能描述**: 新增学生信息 - -#### 请求参数 -```json -{ - "studentNo": "2023001001", - "name": "张三", - "gender": "0", - "birthDate": "2000-01-01", - "idCard": "110101199901010001", - "phone": "13800138000", - "email": "zhangsan@example.com", - "classId": "101", - "className": "计算机2023-1班", - "majorId": "CS001", - "majorName": "计算机科学与技术", - "collegeId": "CS", - "collegeName": "计算机学院", - "studentStatus": "1" -} -``` - -#### 响应数据 -```json -{ - "code": 200, - "msg": "新增成功" -} -``` - -### 2.6 修改学生信息 -- **接口路径**: PUT `/studentMsg/studentMsg` -- **权限标识**: `studentMsg:studentMsg:edit` -- **功能描述**: 修改学生信息 - -#### 请求参数 -```json -{ - "id": 1, - "studentNo": "2023001001", - "name": "张三", - "gender": "0", - "birthDate": "2000-01-01", - "idCard": "110101199901010001", - "phone": "13800138000", - "email": "zhangsan@example.com", - "classId": "101", - "className": "计算机2023-1班", - "majorId": "CS001", - "majorName": "计算机科学与技术", - "collegeId": "CS", - "collegeName": "计算机学院", - "studentStatus": "1" -} -``` - -#### 响应数据 -```json -{ - "code": 200, - "msg": "修改成功" -} -``` - -### 2.7 删除学生信息 -- **接口路径**: DELETE `/studentMsg/studentMsg/{ids}` -- **权限标识**: `studentMsg:studentMsg:remove` -- **功能描述**: 批量删除学生信息 - -#### 请求参数 -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| ids | string | 是 | 学生ID列表,多个用逗号分隔 | - -#### 响应数据 -```json -{ - "code": 200, - "msg": "删除成功" -} -``` - -### 2.8 导出学生信息 -- **接口路径**: POST `/studentMsg/studentMsg/export` -- **权限标识**: `studentMsg:studentMsg:export` -- **功能描述**: 导出学生信息列表 - -#### 请求参数 -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| studentNo | string | 否 | 学号 | -| name | string | 否 | 姓名 | -| studentStatus | string | 否 | 学籍状态 | - -#### 响应数据 -返回Excel文件流 - -### 2.8.1 高级检索导出学生信息 -- **接口路径**: POST `/studentMsg/studentMsg/advancedSearchExport` -- **权限标识**: `studentMsg:studentMsg:export` -- **功能描述**: 根据高级检索条件导出学生信息列表,支持多维度复合查询条件 -- **版本**: 1.2.1 (2025-01-07修复MapStruct转换错误) -- **修复**: 解决 `XgStudentMsgVo` 到 `XgStudentMsgExportVo` 转换器缺失问题 - -#### 请求参数 -支持以下高级检索条件: - -**基础信息检索** -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| studentNo | string | 否 | 学号(模糊查询) | -| name | string | 否 | 姓名(模糊查询) | -| idCard | string | 否 | 身份证号(模糊查询) | -| phone | string | 否 | 手机号码(模糊查询) | -| email | string | 否 | 邮箱(模糊查询) | -| gender | array | 否 | 性别数组:0-男,1-女 | -| nationality | array | 否 | 民族数组 | -| politicalStatus | array | 否 | 政治面貌数组 | -| birthDateStart | string | 否 | 出生日期开始:yyyy-MM-dd | -| birthDateEnd | string | 否 | 出生日期结束:yyyy-MM-dd | - -**学籍信息检索** -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| studentStatus | array | 否 | 学籍状态数组:1-在籍,2-休学,3-复学,4-退学,5-毕业 | -| enrollmentYearStart | integer | 否 | 入学年份开始 | -| enrollmentYearEnd | integer | 否 | 入学年份结束 | -| admissionCategory | array | 否 | 录取类别数组 | - -**学院专业班级检索** -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| collegeName | string | 否 | 学院名称(模糊查询) | -| majorName | string | 否 | 专业名称(模糊查询) | -| className | string | 否 | 班级名称(模糊查询) | -| grade | array | 否 | 年级数组 | -| counselorName | string | 否 | 辅导员姓名(模糊查询) | -| classTeacherName | string | 否 | 班主任姓名(模糊查询) | - -**家庭信息检索** -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| fatherName | string | 否 | 父亲姓名(模糊查询) | -| motherName | string | 否 | 母亲姓名(模糊查询) | -| familyEconomicStatus | array | 否 | 家庭经济状况数组 | -| familyIncomeMin | number | 否 | 家庭收入最小值 | -| familyIncomeMax | number | 否 | 家庭收入最大值 | - -**特殊身份检索** -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| isPoorStudent | array | 否 | 是否贫困生:0-否,1-是 | -| isMinority | array | 否 | 是否少数民族:0-否,1-是 | -| isDisabled | array | 否 | 是否残疾:0-否,1-是 | -| isOrphan | array | 否 | 是否孤儿:0-否,1-是 | - -**权限范围** -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| deptIds | array | 否 | 部门ID数组,用于权限控制 | - -#### 响应数据 -返回Excel文件流,包含完整的学生信息数据 - -#### 修复记录 -- **2025-01-07 v1.2.1**: 修复MapStruct转换错误,解决 `XgStudentMsgVo` 到 `XgStudentMsgExportVo` 转换器缺失问题 - - **问题**: `MapstructUtils.convert()` 无法找到两个VO类之间的转换器,导致导出功能报错 - - **解决**: 在Controller中添加手动转换方法 `convertToExportVo()` 和 `convertToExportVoList()` - - **影响**: 导出功能正常工作,所有字段完整映射 -- **2025-01-07 v1.2.0**: 修复分页限制问题,导出时pageSize设置为50000,确保能导出所有符合条件的记录 - - **问题**: 之前由于BO类默认pageSize=10,导致只能导出10条记录 - - **解决**: 取消注释Controller中的分页参数设置代码 - -### 2.9 查询学生个人信息 -- **接口路径**: GET `/studentMsg/studentMsg/personalInfo` -- **权限标识**: `studentMsg:studentMsg:query` -- **功能描述**: 查询当前登录学生的个人信息 - -#### 请求参数 -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| userId | long | 否 | 用户ID,为空时使用当前登录用户ID | - -#### 响应数据 -```json -{ - "code": 200, - "msg": "查询成功", - "data": { - "id": 1, - "studentNo": "2023001001", - "name": "张三", - "gender": "0", - "birthDate": "2000-01-01", - "idCard": "110101199901010001", - "phone": "13800138000", - "email": "zhangsan@example.com", - "classId": "101", - "className": "计算机2023-1班", - "majorId": "CS001", - "majorName": "计算机科学与技术", - "collegeId": "CS", - "collegeName": "计算机学院", - "studentStatus": "1", - "createTime": "2025-01-27 10:00:00", - "updateTime": "2025-01-27 10:00:00" - } -} -``` - -### 2.10 根据班级ID查询学生信息列表 -- **接口路径**: GET `/studentMsg/studentMsg/listByClassId` -- **权限标识**: `studentMsg:studentMsg:query` -- **功能描述**: 查询指定班级中所有在籍学生信息 - -#### 请求参数 -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| classId | string | 是 | 班级ID | -| name | string | 否 | 学生姓名(模糊查询) | - -#### 响应数据 -```json -{ - "code": 200, - "msg": "查询成功", - "data": [ - { - "id": 1, - "studentNo": "2023001001", - "name": "张三", - "gender": "0", - "birthDate": "2000-01-01", - "idCard": "110101199901010001", - "phone": "13800138000", - "email": "zhangsan@example.com", - "classId": "101", - "className": "计算机2023-1班", - "majorId": "CS001", - "majorName": "计算机科学与技术", - "collegeId": "CS", - "collegeName": "计算机学院", - "studentStatus": "1", - "createTime": "2025-01-27 10:00:00", - "updateTime": "2025-01-27 10:00:00" - } - ] -} -``` - -### 2.11 导入学生信息数据 -- **接口路径**: POST `/studentMsg/studentMsg/importData` -- **权限标识**: `studentMsg:studentMsg:import` -- **功能描述**: 批量导入学生信息数据,支持Excel文件上传 - -#### 请求参数 -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| file | MultipartFile | 是 | Excel文件(.xlsx格式) | -| updateSupport | boolean | 否 | 是否支持更新已存在数据,默认false | - -#### 请求示例 -```http -POST /studentMsg/studentMsg/importData -Content-Type: multipart/form-data - -file: [Excel文件] -updateSupport: true -``` - -#### 响应数据 -```json -{ - "code": 200, - "msg": "恭喜您,数据已全部导入成功!共 10 条,数据如下:", - "data": null -} -``` - -#### 错误响应示例 -```json -{ - "code": 500, - "msg": "很抱歉,导入失败!共 2 条数据格式不正确,错误如下:
1、学号 2023001001 已存在
2、学号 2023001002 导入失败:手机号码格式不正确", - "data": null -} -``` - -### 2.12 获取导入模板 -- **接口路径**: POST `/studentMsg/studentMsg/importTemplate` -- **权限标识**: `studentMsg:studentMsg:import` -- **功能描述**: 下载学生信息导入模板文件 - -#### 请求参数 -无 - -#### 响应数据 -返回Excel模板文件(.xlsx格式) - -#### 模板字段说明 -| 字段名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| 学号 | string | 是 | 学生学号,必须唯一 | -| 姓名 | string | 是 | 学生姓名 | -| 性别 | string | 是 | 0-男,1-女 | -| 身份证号 | string | 否 | 身份证号码 | -| 手机号码 | string | 否 | 手机号码,必须唯一 | -| 电子邮箱 | string | 否 | 邮箱地址,必须唯一 | -| 出生日期 | date | 否 | 出生日期 | -| 民族 | string | 否 | 民族代码 | -| 政治面貌 | string | 否 | 政治面貌代码 | -| 家庭地址 | string | 否 | 家庭住址 | -| 现住址 | string | 否 | 现居住地址 | -| 班级ID | string | 否 | 班级编号 | -| 班级名称 | string | 否 | 班级名称 | -| 专业ID | string | 否 | 专业编号 | -| 专业名称 | string | 否 | 专业名称 | -| 学院ID | string | 否 | 学院编号 | -| 学院名称 | string | 否 | 学院名称 | -| 学籍状态 | string | 否 | 1-在籍,2-休学,3-复学,4-退学,5-毕业 | - -## 3. 数据字典 - -### 3.1 性别字典 -| 字典值 | 字典标签 | -|--------|----------| -| 0 | 男 | -| 1 | 女 | - -### 3.2 学籍状态字典 -| 字典值 | 字典标签 | -|--------|----------| -| 1 | 在籍 | -| 2 | 休学 | -| 3 | 复学 | -| 4 | 退学 | -| 5 | 毕业 | - -### 3.3 信息状态字典 -| 字典值 | 字典标签 | -|--------|----------| -| 1 | 正常 | -| 2 | 待审核 | -| 3 | 审核中 | -| 4 | 已驳回 | -| 5 | 已锁定 | - -## 4. 错误码说明 - -| 错误码 | 说明 | -|--------|------| -| 200 | 操作成功 | -| 400 | 请求参数错误 | -| 401 | 未授权 | -| 403 | 无权限 | -| 404 | 资源不存在 | -| 500 | 服务器内部错误 | - -## 5. 权限说明 - -### 5.1 数据权限控制 -- **超级管理员**: 可查看所有学生信息 -- **学工管理员**: 可查看所有学生信息 -- **二级学院管理员**: 只能查看本学院学生信息 -- **辅导员**: 只能查看负责班级的学生信息 -- **班主任**: 只能查看负责班级的学生信息 -- **学生**: 只能查看自己的信息 - -### 5.2 操作权限控制 -- **新增**: 学工管理员、二级学院管理员 -- **修改**: 学工管理员、二级学院管理员、辅导员、班主任(限制范围) -- **删除**: 学工管理员、二级学院管理员 -- **导入**: 学工管理员、二级学院管理员 -- **导出**: 学工管理员、二级学院管理员、辅导员、班主任 -- **查询**: 所有有权限的用户 - -## 6. 注意事项 - -1. 所有接口都需要Bearer Token认证 -2. 删除操作为逻辑删除,不会物理删除数据 -3. 学号和身份证号必须唯一 -4. 新增学生时会自动创建对应的系统用户账号 -5. 支持多租户数据隔离 -6. 所有时间字段使用yyyy-MM-dd HH:mm:ss格式 -7. 数据权限按照用户角色自动过滤 -8. 班级学生查询接口只返回在籍状态的学生 - -## 7. 更新日志 - -### 2025-01-27 - 新增学生信息导入功能 -- **新增功能**: 新增学生信息批量导入功能 -- **新增接口**: - - `POST /studentMsg/studentMsg/importData` - 学生信息导入接口 - - `POST /studentMsg/studentMsg/importTemplate` - 导入模板下载接口 -- **功能特性**: - - 支持Excel文件批量导入 - - 支持新增和更新两种模式 - - 自动验证学号、手机号、邮箱唯一性 - - 完整的错误处理和结果统计 - - 自动创建对应的系统用户账号 -- **技术实现**: - - 使用自定义Listener处理Excel解析 - - 事务保证数据一致性 - - 详细的导入结果反馈 - -### 2025-01-27 - 新增班级学生查询接口 -- **新增功能**: 新增 `GET /studentMsg/studentMsg/listByClassId` 接口 -- **功能描述**: 查询指定班级中所有在籍学生信息 -- **过滤条件**: - - `deleted = 0` (未删除) - - `student_status = '1'` (在籍状态) - - `class_id = 入参的classId` (班级ID) - - `name LIKE '%入参的name%'` (姓名模糊查询,可选) -- **排序方式**: 按创建时间倒序排列 - -## 17. 获取学生信息树 ⭐ 新增 - -### 接口描述 -获取按年级、学院、专业、班级层级组织的学生信息树结构,用于宿舍分配等场景的学生选择。 - -### 接口URL -``` -GET /studentMsg/studentMsg/getStudentTree -``` - -### 请求参数 -| 参数名 | 类型 | 是否必填 | 说明 | 示例值 | -|-------|------|---------|------|-------| -| secondaryCollegeId | Long | 否 | 二级学院ID,默认为101 | 101 | - -### 请求示例 -```javascript -// GET请求 -/studentMsg/studentMsg/getStudentTree?secondaryCollegeId=101 -``` - -### 响应参数 -| 参数名 | 类型 | 说明 | 示例值 | -|-------|------|------|-------| -| code | Integer | 响应码,200表示成功 | 200 | -| msg | String | 响应消息 | "操作成功" | -| data | Array | 学生信息树数据 | 见下方详细结构 | - -### 学生树节点结构 -| 参数名 | 类型 | 说明 | 示例值 | -|-------|------|------|-------| -| id | String | 节点唯一标识 | "college-101" | -| label | String | 节点显示名称 | "计算机学院" | -| type | String | 节点类型:college/major/class | "college" | -| maleAssigned | Integer | 已分配男生数量 | 45 | -| maleTotal | Integer | 男生总数 | 120 | -| femaleAssigned | Integer | 已分配女生数量 | 25 | -| femaleTotal | Integer | 女生总数 | 60 | -| grade | String | 年级信息(仅班级节点有值) | "2025" | -| collegeId | Long | 学院ID | 101 | -| collegeName | String | 学院名称 | "计算机学院" | -| majorId | Long | 专业ID(专业和班级节点有值) | 1001 | -| majorName | String | 专业名称(专业和班级节点有值) | "计算机科学与技术" | -| classId | Long | 班级ID(仅班级节点有值) | 10001 | -| className | String | 班级名称(仅班级节点有值) | "计算机科学与技术1班" | -| sortOrder | Integer | 排序序号 | 1 | -| children | Array | 子节点数组 | [] | - -### 后端实现 -```java -// Controller -@GetMapping("/getStudentTree") -@SaCheckPermission("studentMsg:studentMsg:query") -public R> getStudentTree(@RequestParam(defaultValue = "101") Long secondaryCollegeId) { - List tree = studentService.getStudentTree(secondaryCollegeId); - return R.ok(tree); -} - -// Service实现 -@Override -public List getStudentTree(Long secondaryCollegeId) { - return baseMapper.getStudentTree(secondaryCollegeId); -} -``` - -### 数据库查询 -```sql - -``` - -### 前端调用 -```typescript -// API定义 -export function getStudentTree(secondaryCollegeId: number = 101): AxiosPromise> { - return request({ - url: '/studentMsg/studentMsg/getStudentTree', - method: 'get', - params: { - secondaryCollegeId - } - }); -} - -// 组件中使用 -const getStudentTreeData = async () => { - try { - const res = await getStudentTree(101); - if (res.data.code === 200) { - studentTreeData.value = res.data.data || []; - } else { - ElMessage.error(res.data.msg || '获取学生信息树失败'); - } - } catch (error) { - console.error('获取学生信息树失败:', error); - ElMessage.error('获取学生信息树失败'); - } -}; -``` - -### 响应示例 -```json -{ - "code": 200, - "msg": "操作成功", - "data": [ - { - "id": "college-101", - "label": "计算机学院", - "type": "college", - "collegeId": 101, - "collegeName": "计算机学院", - "maleAssigned": 45, - "maleTotal": 120, - "femaleAssigned": 25, - "femaleTotal": 60, - "children": [ - { - "id": "major-1001", - "label": "计算机科学与技术", - "type": "major", - "collegeId": 101, - "collegeName": "计算机学院", - "majorId": 1001, - "majorName": "计算机科学与技术", - "maleAssigned": 45, - "maleTotal": 80, - "femaleAssigned": 15, - "femaleTotal": 40, - "children": [ - { - "id": "class-10001", - "label": "计算机科学与技术1班", - "type": "class", - "collegeId": 101, - "collegeName": "计算机学院", - "majorId": 1001, - "majorName": "计算机科学与技术", - "classId": 10001, - "className": "计算机科学与技术1班", - "grade": "2025", - "maleAssigned": 20, - "maleTotal": 40, - "femaleAssigned": 10, - "femaleTotal": 20 - }, - { - "id": "class-10002", - "label": "计算机科学与技术2班", - "type": "class", - "collegeId": 101, - "collegeName": "计算机学院", - "majorId": 1001, - "majorName": "计算机科学与技术", - "classId": 10002, - "className": "计算机科学与技术2班", - "grade": "2025", - "maleAssigned": 25, - "maleTotal": 40, - "femaleAssigned": 5, - "femaleTotal": 20 - } - ] - } - ] - } - ] -} -``` - -### 错误响应 -```json -{ - "code": 500, - "msg": "获取学生信息树失败", - "data": null -} -``` - -### 注意事项 -1. **权限控制**: 需要 `studentMsg:studentMsg:query` 权限 -2. **树结构**: 按学院->专业->班级的层级组织(移除年级分组) -3. **统计信息**: 每个节点包含已分配和总数的男女生统计信息 -4. **排序规则**: 按学院ID、专业ID、班级ID顺序排列 -5. **应用场景**: 主要用于宿舍分配时显示各班级的入住统计 -6. **数据过滤**: 支持按二级学院过滤数据范围,默认为101 -7. **逻辑删除**: 查询时排除已删除的学生记录 -8. **学籍状态**: 只统计在籍学生(student_status='1') -9. **住宿统计逻辑**: - - **total**: 需要住宿的学生总数(is_boarder=1) - - **assigned**: 实际已分配住宿的学生数(通过xg_dorm_bed_student表关联,status='0') - ---- - -## 📋 更新日志 - -### 2025-01-27 - 学生信息树接口优化 -- **功能优化**: 优化 `GET /studentMsg/studentMsg/getStudentTree` 接口 -- **结构调整**: 移除年级分组,调整为学院->专业->班级的三级层级结构 -- **性能优化**: 减少嵌套层级,提升前端渲染性能 -- **统计信息**: 保持各层级男女生人数和住宿分配统计 -- **逻辑修正**: 修正住宿统计逻辑,通过xg_dorm_bed_student表准确统计已分配住宿学生数 - -### 2025-01-27 - 新增班级学生查询接口 -- **新增功能**: 新增 `GET /studentMsg/studentMsg/listByClassId` 接口 -- **功能描述**: 查询指定班级中所有在籍学生信息 -- **过滤条件**: 支持按班级ID和学生姓名查询 -- **排序方式**: 按创建时间倒序排列 - ---- - -**文档更新时间**: 2025-01-27 -**文档版本**: 1.4.0 -**维护人员**: Cursor AI -**更新说明**: -- 优化学生信息树接口,移除年级分组,简化层级结构 -- 新增学生信息树查询接口,支持宿舍分配场景 -- 新增高级检索导出接口文档 -- 修复高级检索导出分页限制问题 -- 之前版本:新增学生信息导入功能,完善学生信息管理API文档 \ No newline at end of file diff --git a/docs/开发文档/API/宿舍管理员信息API.md b/docs/开发文档/API/宿舍管理员信息API.md index 58f1fc8e..c5f48029 100644 --- a/docs/开发文档/API/宿舍管理员信息API.md +++ b/docs/开发文档/API/宿舍管理员信息API.md @@ -210,6 +210,7 @@ - `phone`:手机号 - `sex`:性别 - `className`:班级名称 + - `classStatus`:班级状态(字典 `xg_class_status`,常用值:`0`-停用、`1`-在读) - **返回示例**: ```json { @@ -220,7 +221,8 @@ "name": "张三", "phone": "13800001111", "sex": "0", - "className": "2025级1班" + "className": "2025级1班", + "classStatus": "1" } ] } @@ -228,6 +230,49 @@ - **说明**: - 仅返回当前“正在教学”的班主任(班级状态为1,未删除,班主任ID有效,用户状态正常)。 - 支持姓名和手机号的模糊查询,均为可选参数。 + - `classStatus` 字段便于前端字典渲染班级状态标签。 + +## 获取全部班主任信息(按班级状态排序) + +- **接口路径**:`/xgStudentManager/studentManager/listAllClassTeachers` +- **请求方式**:GET +- **权限标识**:`xgStudentManager:studentManager:list` +- **入参**: + - `phone`(可选,string):手机号,模糊查询 + - `name`(可选,string):姓名,模糊查询 +- **出参**: + - `name`:姓名 + - `phone`:手机号 + - `sex`:性别 + - `className`:班级名称 + - `classStatus`:班级状态(字典 `xg_class_status`,常用值:`0`-停用、`1`-在读等) +- **返回示例**: +```json +{ + "code": 200, + "msg": "操作成功", + "data": [ + { + "name": "李老师", + "phone": "13800002222", + "sex": "1", + "className": "2025级2班", + "classStatus": "0" + }, + { + "name": "张老师", + "phone": "13800003333", + "sex": "0", + "className": "2025级1班", + "classStatus": "1" + } + ] +} +``` +- **说明**: + - 返回所有班主任关联的班级信息,不再限定班级状态。 + - 默认按照 `class_status` 升序、`class_name` 升序排序,便于前端分组展示。 + - 同样支持姓名和手机号的模糊查询。 ## 4. 数据结构说明 diff --git a/docs/开发文档/API/班级信息管理API.md b/docs/开发文档/API/班级信息管理API.md deleted file mode 100644 index e83aebc9..00000000 --- a/docs/开发文档/API/班级信息管理API.md +++ /dev/null @@ -1,338 +0,0 @@ -# 班级信息管理API文档 - -## 基本信息 - -- **模块名称**: 班级信息管理 -- **接口前缀**: /classMsg -- **权限前缀**: classMsg:classMsg: - -## API接口列表 - -### 1. 班级信息查询接口 - -#### 1.1 获取班级信息列表 - -- **接口URL**: `/classMsg/classMsg/list` -- **请求方式**: GET -- **权限标识**: `classMsg:classMsg:list` -- **请求参数**: - -| 参数名 | 类型 | 是否必须 | 描述 | -| -------- | ------ | -------- | ---------- | -| pageNum | int | 是 | 页码 | -| pageSize | int | 是 | 每页条数 | -| collegeId| int | 否 | 学院ID | -| majorId | int | 否 | 专业ID | -| className| string | 否 | 班级名称 | -| classType| int | 否 | 班级类型 | -| grade | string | 否 | 年级 | -| classStatus| int | 否 | 班级状态 | - -- **返回参数**: - -```json -{ - "code": 200, - "msg": "操作成功", - "rows": [ - { - "id": 1, - "collegeId": 1001, - "collegeName": "信息学院", - "majorId": 2001, - "majorName": "计算机科学与技术", - "classCode": "CS2025-01", - "className": "计科2025-01班", - "classType": 1, - "grade": "2025", - "enrollmentYear": 2025, - "graduationYear": 2029, - "counselorId": 102, - "counselorName": "李老师", - "classTeacherId": 103, - "classTeacherName": "张老师", - "classStatus": 1, - "remark": "示例班级" - } - ], - "total": 1 -} -``` - -#### 1.2 获取班级信息详情 - -- **接口URL**: `/classMsg/classMsg/{id}` -- **请求方式**: GET -- **权限标识**: `classMsg:classMsg:query` -- **请求参数**: - -| 参数名 | 类型 | 是否必须 | 描述 | -| ------ | ---- | -------- | ------- | -| id | int | 是 | 班级ID | - -- **返回参数**: - -```json -{ - "code": 200, - "msg": "操作成功", - "data": { - "id": 1, - "collegeId": 1001, - "collegeName": "信息学院", - "majorId": 2001, - "majorName": "计算机科学与技术", - "classCode": "CS2025-01", - "className": "计科2025-01班", - "classType": 1, - "grade": "2025", - "enrollmentYear": 2025, - "graduationYear": 2029, - "counselorId": 102, - "counselorName": "李老师", - "classTeacherId": 103, - "classTeacherName": "张老师", - "classStatus": 1, - "remark": "示例班级" - } -} -``` - -### 1.3 获取当前登录人作为班主任的班级列表 - -- 接口URL: `/classMsg/classMsg/myClassListAsTeacher` -- 请求方式: GET -- 权限标识: `classMsg:classMsg:list` -- 请求参数: 无 -- 返回参数: - -```json -{ - "code": 200, - "msg": "操作成功", - "data": [ - { - "id": 1, - "className": "计科2025-01班", - "majorId": 2001, - "majorName": "计算机科学与技术", - "grade": "2025", - "classStatus": 1 - } - ] -} -``` - -### 2. 班级信息维护接口 - -#### 2.1 新增班级信息 - -- **接口URL**: `/classMsg/classMsg` -- **请求方式**: POST -- **权限标识**: `classMsg:classMsg:add` -- **请求参数**: - -```json -{ - "collegeId": 1001, - "collegeName": "信息学院", - "majorId": 2001, - "majorName": "计算机科学与技术", - "classCode": "CS2025-01", - "className": "计科2025-01班", - "classType": 1, - "grade": "2025", - "enrollmentYear": 2025, - "graduationYear": 2029, - "classStatus": 1, - "remark": "示例班级" -} -``` - -- **返回参数**: - -```json -{ - "code": 200, - "msg": "操作成功" -} -``` - -#### 2.2 修改班级信息 - -- **接口URL**: `/classMsg/classMsg` -- **请求方式**: PUT -- **权限标识**: `classMsg:classMsg:edit` -- **请求参数**: - -```json -{ - "id": 1, - "collegeId": 1001, - "collegeName": "信息学院", - "majorId": 2001, - "majorName": "计算机科学与技术", - "classCode": "CS2025-01", - "className": "计科2025-01班", - "classType": 1, - "grade": "2025", - "enrollmentYear": 2025, - "graduationYear": 2029, - "classStatus": 1, - "remark": "修改后的班级" -} -``` - -- **返回参数**: - -```json -{ - "code": 200, - "msg": "操作成功" -} -``` - -#### 2.3 设置班主任 - -- **接口URL**: `/classMsg/classMsg` -- **请求方式**: PUT -- **权限标识**: `classMsg:classMsg:edit` -- **请求参数**: - -```json -{ - "id": 1, - "classTeacherId": 103, - "classTeacherName": "张老师" -} -``` - -- **返回参数**: - -```json -{ - "code": 200, - "msg": "操作成功" -} -``` - -#### 2.4 设置辅导员 - -- **接口URL**: `/classMsg/classMsg` -- **请求方式**: PUT -- **权限标识**: `classMsg:classMsg:edit` -- **请求参数**: - -```json -{ - "id": 1, - "counselorId": 102, - "counselorName": "李老师" -} -``` - -- **返回参数**: - -```json -{ - "code": 200, - "msg": "操作成功" -} -``` - -#### 2.5 删除班级信息 - -- **接口URL**: `/classMsg/classMsg/{ids}` -- **请求方式**: DELETE -- **权限标识**: `classMsg:classMsg:remove` -- **请求参数**: - -| 参数名 | 类型 | 是否必须 | 描述 | -| ------ | ------ | -------- | ------------------ | -| ids | string | 是 | 班级ID,多个用逗号分隔 | - -- **返回参数**: - -```json -{ - "code": 200, - "msg": "操作成功" -} -``` - -#### 2.6 导出班级信息 - -- **接口URL**: `/classMsg/classMsg/export` -- **请求方式**: GET -- **权限标识**: `classMsg:classMsg:export` -- **请求参数**: 与查询参数相同 -- **返回参数**: 文件流 - -### 3. 班级教师关联接口 - -#### 3.1 查询有效用户列表(用于班主任/辅导员选择) - -- **接口URL**: `/xg/sysUser/activeList` -- **请求方式**: GET -- **权限标识**: `xg:sysUser:list` -- **请求参数**: 无 -- **返回参数**: - -```json -{ - "code": 200, - "msg": "操作成功", - "data": [ - { - "userId": 100, - "userName": "teacher1", - "nickName": "张老师", - "email": "zhang@example.com", - "phonenumber": "13800138000", - "sex": "0", - "status": "0", - "deptId": 101, - "deptName": "计算机系" - }, - { - "userId": 101, - "userName": "teacher2", - "nickName": "李老师", - "email": "li@example.com", - "phonenumber": "13800138001", - "sex": "1", - "status": "0", - "deptId": 102, - "deptName": "机械系" - } - ] -} -``` - -## 数据字典 - -### 班级类型(classType) - -| 编码 | 名称 | -| ---- | ---------- | -| 1 | 中级工 | -| 2 | 高级工 | -| 3 | 预备技师 | -| 4 | 技师 | -| 5 | 中高职一体 | - -### 班级状态(classStatus) - -| 编码 | 名称 | -| ---- | ---- | -| 1 | 正常 | -| 2 | 暂停 | -| 3 | 毕业 | -| 4 | 解散 | - -### 是否已毕业(isGraduation) - -| 编码 | 名称 | -| ---- | ------ | -| 0 | 未毕业 | -| 1 | 已毕业 | \ No newline at end of file diff --git a/docs/开发文档/API/班级干部信息管理API.md b/docs/开发文档/API/班级干部信息管理API.md deleted file mode 100644 index 62bb016a..00000000 --- a/docs/开发文档/API/班级干部信息管理API.md +++ /dev/null @@ -1,415 +0,0 @@ -# 班级干部信息管理API文档 - -## 📋 文档信息 - -| 项目 | 信息 | -|------|------| -| **模块名称** | 班级干部信息管理 | -| **模块代码** | ruoyi-xg | -| **基础路径** | `/xgClassPosMsg/xgClassPosMsg` | -| **权限前缀** | `xgClassPosMsg:xgClassPosMsg` | -| **版本** | V1.0.0 | -| **创建时间** | 2025-01-27 | -| **更新时间** | 2025-01-27 | - -## 🎯 API概述 - -### 模块说明 -班级干部信息管理模块提供完整的班级干部信息管理功能,包括班级干部的任命、任期管理、状态跟踪等全生命周期管理,以及用户角色关联功能。 - -### 技术规范 -- **认证方式**: Bearer Token (Sa-Token) -- **数据格式**: JSON -- **响应格式**: 统一使用R类型或TableDataInfo分页格式 -- **权限控制**: 基于角色的权限管理(RBAC) - -### 核心特性 -- **基础管理**: 班级干部信息的增删改查、导入导出 -- **任期管理**: 任职日期、任期时长、到期提醒 -- **状态跟踪**: 在任、到期、辞职、免职、调任、休学等状态 -- **用户角色关联**: 自动建立学生与角色的关联关系 -- **数据权限**: 支持按部门查询班级干部信息 - -## 📊 数据模型 - -### 班级干部信息VO (XgClassPosMsgVo) - -```java -{ - "id": 1, // 主键ID(雪花ID) - "deleted": 0, // 删除标志(0代表存在 1代表删除) - "classId": 101, // 班级ID,关联xg_class_msg.id - "className": "计算机2023-1班", // 班级名称(联表查询获取) - "studentId": 1001, // 学生ID,关联xg_student_msg.id - "studentNo": "2023001", // 学号 - "studentName": "张三", // 学生姓名(冗余字段) - "positionCode": "monitor", // 职务编码,关联xg_class_pos_dict.position_code - "positionName": "班长", // 职务名称(联表查询获取) - "appointmentDate": "2024-09-01", // 任职日期 - "termStartDate": "2024-09-01", // 任期开始日期 - "termEndDate": "2025-07-01", // 任期结束日期 - "termDuration": 10, // 任期时长(月) - "isCurrent": 1, // 是否现任:0-否,1-是 - "cadreStatus": "1", // 学生职务任职状态:1-在任,2-到期,3-辞职,4-免职,5-调任,6-休学 - "appointmentReason": "综合表现优秀", // 任命原因 - "appointmentMethod": "appointment", // 学生职务任命方式:appointment-任命,election-选举,recommendation-推荐 - "dismissalDate": null, // 离任日期 - "dismissalReason": null, // 离任原因 - "remark": "备注信息", // 备注信息 - "createBy": 1, // 创建者 - "createTime": "2024-09-01 10:00:00", // 创建时间 - "updateBy": 1, // 更新者 - "updateTime": "2024-09-01 10:00:00" // 更新时间 -} -``` - -## 🔧 API接口列表 - -### 1. 基础管理接口 - -#### 1.1 查询班级干部信息列表 -- **接口路径**: GET `/xgClassPosMsg/xgClassPosMsg/list` -- **权限标识**: `xgClassPosMsg:xgClassPosMsg:list` -- **功能描述**: 分页查询班级干部信息列表,支持按部门查询 - -**请求参数**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| pageNum | integer | 否 | 页码,默认1 | -| pageSize | integer | 否 | 每页大小,默认10 | -| deptId | long | 否 | 部门ID,用于按部门查询班级干部信息 | -| classId | long | 否 | 班级ID | -| studentId | long | 否 | 学生ID | -| studentNo | string | 否 | 学号(模糊查询) | -| studentName | string | 否 | 学生姓名(模糊查询) | -| positionCode | string | 否 | 职务编码 | -| appointmentDate | string | 否 | 任职日期 | -| termStartDate | string | 否 | 任期开始日期 | -| termEndDate | string | 否 | 任期结束日期 | -| termDuration | integer | 否 | 任期时长(月) | -| isCurrent | integer | 否 | 是否现任:0-否,1-是 | -| cadreStatus | string | 否 | 学生职务任职状态 | -| appointmentReason | string | 否 | 任命原因 | -| appointmentMethod | string | 否 | 学生职务任命方式 | -| dismissalDate | string | 否 | 离任日期 | -| dismissalReason | string | 否 | 离任原因 | - -**响应数据**: -```json -{ - "code": 200, - "msg": "查询成功", - "rows": [ - { - "id": 1, - "classId": 101, - "className": "计算机2023-1班", - "studentId": 1001, - "studentNo": "2023001", - "studentName": "张三", - "positionCode": "monitor", - "positionName": "班长", - "appointmentDate": "2024-09-01", - "termStartDate": "2024-09-01", - "termEndDate": "2025-07-01", - "termDuration": 10, - "isCurrent": 1, - "cadreStatus": "1", - "appointmentReason": "综合表现优秀", - "appointmentMethod": "appointment", - "createTime": "2024-09-01 10:00:00" - } - ], - "total": 1 -} -``` - -#### 1.2 获取班级干部信息详情 -- **接口路径**: GET `/xgClassPosMsg/xgClassPosMsg/{id}` -- **权限标识**: `xgClassPosMsg:xgClassPosMsg:query` -- **功能描述**: 根据主键获取班级干部信息详细信息 - -**请求参数**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| id | long | 是 | 主键ID | - -**响应数据**: -```json -{ - "code": 200, - "msg": "查询成功", - "data": { - "id": 1, - "classId": 101, - "className": "计算机2023-1班", - "studentId": 1001, - "studentNo": "2023001", - "studentName": "张三", - "positionCode": "monitor", - "positionName": "班长", - "appointmentDate": "2024-09-01", - "termStartDate": "2024-09-01", - "termEndDate": "2025-07-01", - "termDuration": 10, - "isCurrent": 1, - "cadreStatus": "1", - "appointmentReason": "综合表现优秀", - "appointmentMethod": "appointment", - "dismissalDate": null, - "dismissalReason": null, - "remark": "备注信息", - "createTime": "2024-09-01 10:00:00", - "updateTime": "2024-09-01 10:00:00" - } -} -``` - -#### 1.3 新增班级干部信息 -- **接口路径**: POST `/xgClassPosMsg/xgClassPosMsg` -- **权限标识**: `xgClassPosMsg:xgClassPosMsg:add` -- **功能描述**: 新增班级干部信息,同时自动建立用户角色关联 - -**请求参数**: -```json -{ - "classId": 101, - "studentId": 1001, - "studentNo": "2023001", - "studentName": "张三", - "positionCode": "monitor", - "appointmentDate": "2024-09-01", - "termStartDate": "2024-09-01", - "termEndDate": "2025-07-01", - "termDuration": 10, - "isCurrent": 1, - "cadreStatus": "1", - "appointmentReason": "综合表现优秀", - "appointmentMethod": "appointment", - "remark": "备注信息" -} -``` - -**响应数据**: -```json -{ - "code": 200, - "msg": "新增成功" -} -``` - -**重要说明**: -- 新增班级干部信息时,系统会自动向 `sys_user_role` 表插入一条数据 -- `user_id` = 当前记录的 `studentId` -- `role_id` = 当前记录的 `id`(班级干部信息ID) -- 此操作在事务中进行,确保数据一致性 - -#### 1.4 修改班级干部信息 -- **接口路径**: PUT `/xgClassPosMsg/xgClassPosMsg` -- **权限标识**: `xgClassPosMsg:xgClassPosMsg:edit` -- **功能描述**: 修改班级干部信息 - -**请求参数**: -```json -{ - "id": 1, - "classId": 101, - "studentId": 1001, - "studentNo": "2023001", - "studentName": "张三", - "positionCode": "monitor", - "appointmentDate": "2024-09-01", - "termStartDate": "2024-09-01", - "termEndDate": "2025-07-01", - "termDuration": 10, - "isCurrent": 1, - "cadreStatus": "1", - "appointmentReason": "综合表现优秀", - "appointmentMethod": "appointment", - "remark": "修改后的备注信息" -} -``` - -**响应数据**: -```json -{ - "code": 200, - "msg": "修改成功" -} -``` - -#### 1.5 删除班级干部信息 -- **接口路径**: DELETE `/xgClassPosMsg/xgClassPosMsg/{ids}` -- **权限标识**: `xgClassPosMsg:xgClassPosMsg:remove` -- **功能描述**: 删除班级干部信息(支持批量删除),同时删除对应的用户角色关联 - -**请求参数**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| ids | string | 是 | 主键ID,多个用逗号分隔 | - -**响应数据**: -```json -{ - "code": 200, - "msg": "删除成功" -} -``` - -**重要说明**: -- 删除班级干部信息时,系统会自动删除 `sys_user_role` 表中对应的角色关联 -- 删除操作会先清理关联数据,再删除主数据 -- 此操作在事务中进行,确保数据一致性 - -#### 1.6 导出班级干部信息 -- **接口路径**: POST `/xgClassPosMsg/xgClassPosMsg/export` -- **权限标识**: `xgClassPosMsg:xgClassPosMsg:export` -- **功能描述**: 导出班级干部信息列表 - -**请求参数**: 同列表查询参数 - -**响应数据**: Excel文件下载 - -## 🔐 用户角色关联功能 - -### 功能说明 -班级干部信息管理模块集成了用户角色关联功能,确保班级干部信息与系统权限管理的一致性。 - -### 关联规则 -1. **新增关联**: 新增班级干部信息时,自动建立用户角色关联 - - `sys_user_role.user_id` = `xg_class_pos_msg.student_id` - - `sys_user_role.role_id` = `xg_class_pos_msg.id` - -2. **删除关联**: 删除班级干部信息时,自动删除对应的用户角色关联 - - 根据 `role_id` 删除 `sys_user_role` 表中的记录 - -### 事务处理 -- 所有用户角色关联操作都在事务中进行 -- 关联操作失败不会影响主业务流程,但会记录警告日志 -- 使用 `@Transactional(rollbackFor = Exception.class)` 确保数据一致性 - -### 异常处理 -- 用户角色关联操作异常会被捕获并记录日志 -- 不会抛出异常影响主业务流程 -- 通过日志记录操作结果和异常信息 - -## 📝 数据字典 - -### 学生职务任职状态 (cadre_status) -| 编码 | 名称 | 说明 | -|------|------|------| -| 1 | 在任 | 正常任职状态 | -| 2 | 到期 | 任期已结束 | -| 3 | 辞职 | 主动辞职 | -| 4 | 免职 | 被免职 | -| 5 | 调任 | 调任其他职务 | -| 6 | 休学 | 因休学暂停职务 | - -### 学生职务任命方式 (appointment_method) -| 编码 | 名称 | 说明 | -|------|------|------| -| appointment | 任命 | 直接任命 | -| election | 选举 | 通过选举产生 | -| recommendation | 推荐 | 通过推荐产生 | - -### 是否现任 (is_current) -| 编码 | 名称 | 说明 | -|------|------|------| -| 0 | 否 | 非现任职务 | -| 1 | 是 | 现任职务 | - -## 🔒 权限说明 - -### 权限标识列表 - -| 权限标识 | 权限名称 | 说明 | -|----------|----------|------| -| xgClassPosMsg:xgClassPosMsg:list | 班级干部信息列表 | 查看班级干部信息列表 | -| xgClassPosMsg:xgClassPosMsg:query | 班级干部信息查询 | 查询班级干部信息详情 | -| xgClassPosMsg:xgClassPosMsg:add | 班级干部信息新增 | 新增班级干部信息 | -| xgClassPosMsg:xgClassPosMsg:edit | 班级干部信息修改 | 修改班级干部信息 | -| xgClassPosMsg:xgClassPosMsg:remove | 班级干部信息删除 | 删除班级干部信息 | -| xgClassPosMsg:xgClassPosMsg:export | 班级干部信息导出 | 导出班级干部信息 | - -### 数据权限 -- 支持按部门查询班级干部信息 -- 通过 `deptId` 参数控制数据权限范围 -- 自动包含子部门的数据 - -## 🚨 错误码说明 - -| 错误码 | 错误信息 | 说明 | -|--------|----------|------| -| 40001 | 学生不存在 | 指定的学生ID不存在 | -| 40002 | 班级不存在 | 指定的班级ID不存在 | -| 40003 | 职务不存在 | 指定的职务编码不存在 | -| 40004 | 学生已担任该职务 | 学生已经担任该职务 | -| 40005 | 班级干部记录不存在 | 指定的班级干部记录不存在 | -| 40006 | 操作权限不足 | 当前用户没有操作权限 | -| 40007 | 数据校验失败 | 提交的数据不符合规则 | -| 40008 | 用户角色关联失败 | 用户角色关联操作失败 | - -## 📋 使用示例 - -### 1. 查询班级干部信息 -```javascript -// 查询指定部门的班级干部信息 -const response = await api.get('/xgClassPosMsg/xgClassPosMsg/list', { - params: { - deptId: 101, - pageNum: 1, - pageSize: 10 - } -}); -console.log(response.data); -``` - -### 2. 新增班级干部 -```javascript -// 新增班级干部信息 -const addData = { - classId: 101, - studentId: 1001, - studentNo: "2023001", - studentName: "张三", - positionCode: "monitor", - appointmentDate: "2024-09-01", - termStartDate: "2024-09-01", - termEndDate: "2025-07-01", - termDuration: 10, - isCurrent: 1, - cadreStatus: "1", - appointmentReason: "综合表现优秀", - appointmentMethod: "appointment" -}; -const response = await api.post('/xgClassPosMsg/xgClassPosMsg', addData); -``` - -### 3. 删除班级干部 -```javascript -// 删除班级干部信息 -const response = await api.delete('/xgClassPosMsg/xgClassPosMsg/1,2,3'); -``` - -## ⚠️ 注意事项 - -1. **数据一致性**: 班级干部信息与用户角色关联保持一致 -2. **权限控制**: 严格按照角色权限进行操作控制 -3. **事务管理**: 所有关联操作都在事务中进行 -4. **任期管理**: 注意任期时间的合理性和连续性 -5. **状态管理**: 正确维护班级干部的任职状态 -6. **并发控制**: 防止同时操作导致的数据冲突 -7. **日志记录**: 重要操作都会记录详细日志 - -## 📈 更新日志 - -| 版本 | 日期 | 更新内容 | -|------|------|----------| -| V1.0.0 | 2025-01-27 | 初始版本,完整的班级干部信息管理API | -| V1.0.1 | 2025-01-27 | 新增用户角色关联功能 | - ---- - -**文档维护**: Cursor AI 辅助 -**最后更新**: 2025-01-27 -**文档状态**: 已完成 \ No newline at end of file diff --git a/web/src/api/xg/xsjcxx/classMsg/classMsg/index.ts b/web/src/api/xg/xsjcxx/classMsg/classMsg/index.ts index c0c7fdcb..68f727cb 100644 --- a/web/src/api/xg/xsjcxx/classMsg/classMsg/index.ts +++ b/web/src/api/xg/xsjcxx/classMsg/classMsg/index.ts @@ -37,6 +37,24 @@ export function updateClassMsg(data: ClassMsgForm) { }); } +// 仅更新班级状态 +export function updateClassStatus(data: { id: string | number; classStatus: string | number }) { + return request({ + url: '/classMsg/classMsg/status', + method: 'put', + data + }); +} + +// 批量仅更新班级状态 +export function updateClassStatusBatch(data: { ids: Array; classStatus: string | number }) { + return request({ + url: '/classMsg/classMsg/status/batch', + method: 'put', + data + }); +} + // 删除班级信息-新版 export function delClassMsg(id: string | number) { return request({ diff --git a/web/src/api/xg/xsjcxx/studentMsg/types.ts b/web/src/api/xg/xsjcxx/studentMsg/types.ts index 55c7fc32..6ea65d44 100644 --- a/web/src/api/xg/xsjcxx/studentMsg/types.ts +++ b/web/src/api/xg/xsjcxx/studentMsg/types.ts @@ -8,6 +8,7 @@ export interface XgDeptTreeVO extends BaseEntity { weight: number; children: XgDeptTreeVO[]; disabled: boolean; + deptCategory?: string; // 部门类别编码(如 'bj-xxx' 表示班级) } // 学生查询参数 diff --git a/web/src/api/xg/xsjcxx/xgStudentManager/studentManager/index.ts b/web/src/api/xg/xsjcxx/xgStudentManager/studentManager/index.ts index 6fd865d1..9820e44a 100644 --- a/web/src/api/xg/xsjcxx/xgStudentManager/studentManager/index.ts +++ b/web/src/api/xg/xsjcxx/xgStudentManager/studentManager/index.ts @@ -93,3 +93,15 @@ export const listActiveClassTeachers = (params: { phone?: string; name?: string params }); }; + +/** + * 获取全部班主任信息(按班级状态排序) + * @param params 包含 phone 和 name 字段 + */ +export const listAllClassTeachers = (params: { phone?: string; name?: string }) => { + return request({ + url: '/xgStudentManager/studentManager/listAllClassTeachers', + method: 'get', + params + }); +}; diff --git a/web/src/views/xg/xsjcxx/classmsg/classMsg/index.vue b/web/src/views/xg/xsjcxx/classmsg/classMsg/index.vue index f5ca4e85..5bdab9bc 100644 --- a/web/src/views/xg/xsjcxx/classmsg/classMsg/index.vue +++ b/web/src/views/xg/xsjcxx/classmsg/classMsg/index.vue @@ -59,6 +59,27 @@ >删除 + + 毕业 + + + 暂停 + + + 解散 + @@ -286,7 +307,7 @@ - + +
+ + 全部 + 正常 + +
+ > + +
- {{ item.label }} + + {{ item.label }} + +
@@ -46,11 +77,12 @@ diff --git a/web/src/views/xg/xsjcxx/studentMsg/authmsg/index.vue b/web/src/views/xg/xsjcxx/studentMsg/authmsg/index.vue index 9a31ea1e..e49620a1 100644 --- a/web/src/views/xg/xsjcxx/studentMsg/authmsg/index.vue +++ b/web/src/views/xg/xsjcxx/studentMsg/authmsg/index.vue @@ -154,6 +154,11 @@ + + +