This commit is contained in:
zlwu committed 2025-11-13 18:07:07 +08:00
1 parent 6ca85a1b15
commit 7d4bfaecb3
45 files changed
+7015 -1762

No files matched your search

@@ -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<Void> 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<Void> updateStatusBatch(@Validated @RequestBody XgClassStatusBatchBo bo) {
return toAjax(xgClassMsgService.updateClassStatusBatch(bo.getIds(), bo.getClassStatus()));
}
/**
* 删除班级信息-新版
*
@@ -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<List<XgStudentManagerVo>> listAvailableTeachers(@RequestParam("managerType") String managerType) {
List<XgStudentManagerVo> teachers = xgStudentManagerService.queryAvailableTeachers(managerType);
return R.ok(teachers);
}
/**
* 获取当前正在教学的班主任信息
*
* @param phone 手机号码(可选,模糊查询)
* @param name 姓名(可选,模糊查询)
* @return 班主任信息列表
*/
@SaCheckPermission("xgStudentManager:studentManager:list")
@GetMapping("/listActiveClassTeachers")
public R<List<ClassTeacherInfoVo>> listActiveClassTeachers(
@RequestParam(value = "phone", required = false) String phone,
@RequestParam(value = "name", required = false) String name) {
List<ClassTeacherInfoVo> teachers = xgStudentManagerService.queryActiveClassTeachers(phone, name);
return R.ok(teachers);
}
/**
* 获取全部班主任信息(按班级状态排序)
*
* @param phone 手机号码(可选,模糊查询)
* @param name 姓名(可选,模糊查询)
* @return 班主任信息列表
*/
@SaCheckPermission("xgStudentManager:studentManager:list")
@GetMapping("/listAllClassTeachers")
public R<List<ClassTeacherInfoVo>> listAllClassTeachers(
@RequestParam(value = "phone", required = false) String phone,
@RequestParam(value = "name", required = false) String name) {
List<ClassTeacherInfoVo> teachers = xgStudentManagerService.queryAllClassTeachers(phone, name);
return R.ok(teachers);
}
/**
* 获取宿舍管理员信息详细信息
*
@@ -101,32 +145,4 @@ public class XgStudentManagerController extends BaseController {
public R<Void> 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<List<XgStudentManagerVo>> listAvailableTeachers(@RequestParam("managerType") String managerType) {
List<XgStudentManagerVo> teachers = xgStudentManagerService.queryAvailableTeachers(managerType);
return R.ok(teachers);
}
/**
* 获取当前正在教学的班主任信息
*
* @param phone 手机号码(可选,模糊查询)
* @param name 姓名(可选,模糊查询)
* @return 班主任信息列表
*/
@SaCheckPermission("xgStudentManager:studentManager:list")
@GetMapping("/listActiveClassTeachers")
public R<List<ClassTeacherInfoVo>> listActiveClassTeachers(
@RequestParam(value = "phone", required = false) String phone,
@RequestParam(value = "name", required = false) String name) {
List<ClassTeacherInfoVo> teachers = xgStudentManagerService.queryActiveClassTeachers(phone, name);
return R.ok(teachers);
}
}
@@ -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<Long> ids;
/** 班级状态:1-正常 2-暂停 3-毕业 4-解散 */
@NotBlank(message = "班级状态不能为空")
private String classStatus;
}
@@ -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;
}
@@ -12,4 +12,5 @@ public class ClassTeacherInfoVo implements Serializable {
private String phone;
private String sex;
private String className;
private String classStatus;
}
@@ -19,95 +19,95 @@ import java.util.Map;
*/
public interface XgStudentMsgMapper extends BaseMapperPlus<XgStudentMsg, XgStudentMsgVo> {
/**
* 根据组织ID列表分页查询学生信息 用于导出
*
* @param page 分页参数
* @param queryWrapper 查询条件
* @param deptIds 组织ID列表
* @return 学生信息分页结果
*/
List<XgStudentMsgExportVo> queryPageListExportByDeptId(
@Param("ew") LambdaQueryWrapper<XgStudentMsg> queryWrapper,
@Param("deptIds") List<Long> deptIds);
/**
* 根据组织ID列表分页查询学生信息 用于导出
*
* @param page 分页参数
* @param queryWrapper 查询条件
* @param deptIds 组织ID列表
* @return 学生信息分页结果
*/
List<XgStudentMsgExportVo> queryPageListExportByDeptId(
@Param("ew") LambdaQueryWrapper<XgStudentMsg> queryWrapper,
@Param("deptIds") List<String> deptIds);
/**
* 根据组织ID列表分页查询学生信息
*
* @param page 分页参数
* @param queryWrapper 查询条件
* @param deptIds 组织ID列表
* @return 学生信息分页结果
*/
Page<XgStudentMsgVo> selectPageByDeptIds(@Param("page") Page<XgStudentMsgVo> page,
@Param("ew") LambdaQueryWrapper<XgStudentMsg> queryWrapper,
@Param("deptIds") List<Long> deptIds);
/**
* 根据组织ID列表分页查询学生信息
*
* @param page 分页参数
* @param queryWrapper 查询条件
* @param deptIds 组织ID列表
* @return 学生信息分页结果
*/
Page<XgStudentMsgVo> selectPageByDeptIds(@Param("page") Page<XgStudentMsgVo> page,
@Param("ew") LambdaQueryWrapper<XgStudentMsg> queryWrapper,
@Param("deptIds") List<String> deptIds);
/**
* 根据班级ID和姓名查询学生信息列表
*
* @param classId 班级ID
* @param name 学生姓名(模糊查询)
* @return 学生信息列表
*/
List<XgStudentMsgVo> selectStudentsByClassId(@Param("classId") String classId, @Param("name") String name);
/**
* 根据班级ID和姓名查询学生信息列表
*
* @param classId 班级ID
* @param name 学生姓名(模糊查询)
* @return 学生信息列表
*/
List<XgStudentMsgVo> 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<Long> selectUserIdsByCollegeIdAndRoleKey(@Param("collegeId") Long collegeId,
@Param("roleKey") String roleKey);
/**
* 根据学院ID和角色Key查询具备该角色的用户列表
*
* @param collegeId 学院ID
* @param roleKey 角色Key
* @return 用户ID列表
*/
List<Long> selectUserIdsByCollegeIdAndRoleKey(@Param("collegeId") Long collegeId,
@Param("roleKey") String roleKey);
/**
* 根据学院ID查询二级学院分管领导ID列表
*
* @param collegeId 学院ID
* @return 分管领导ID列表
*/
List<Long> selectCollegeLeaderIdsByCollegeId(@Param("collegeId") Long collegeId);
/**
* 根据学院ID查询二级学院分管领导ID列表
*
* @param collegeId 学院ID
* @return 分管领导ID列表
*/
List<Long> selectCollegeLeaderIdsByCollegeId(@Param("collegeId") Long collegeId);
/**
* 查询二级学院下的学院、专业、班级学生统计信息
*
* @param secondaryCollegeId 二级学院ID
* @return 学生统计信息列表
*/
List<Map<String, Object>> getCollegeStudentStats(@Param("secondaryCollegeId") Long secondaryCollegeId);
/**
* 查询二级学院下的学院、专业、班级学生统计信息
*
* @param secondaryCollegeId 二级学院ID
* @return 学生统计信息列表
*/
List<Map<String, Object>> getCollegeStudentStats(@Param("secondaryCollegeId") Long secondaryCollegeId);
/**
* 查询二级学院下的学院、专业、班级学生统计信息(按床位分配统计)
*
* @param secondaryCollegeId 二级学院ID
* @return 学生统计信息列表
*/
List<Map<String, Object>> getCollegeStudentStatsByClass(@Param("secondaryCollegeId") Long secondaryCollegeId);
/**
* 查询二级学院下的学院、专业、班级学生统计信息(按床位分配统计)
*
* @param secondaryCollegeId 二级学院ID
* @return 学生统计信息列表
*/
List<Map<String, Object>> getCollegeStudentStatsByClass(@Param("secondaryCollegeId") Long secondaryCollegeId);
/**
* 查询二级学院下的学院床位分配统计信息(基于college_id统计)
*
* @param secondaryCollegeId 二级学院ID
* @return 学院床位分配统计信息列表
*/
List<Map<String, Object>> getCollegeBedAssignmentStats(@Param("secondaryCollegeId") Long secondaryCollegeId);
/**
* 查询二级学院下的学院床位分配统计信息(基于college_id统计)
*
* @param secondaryCollegeId 二级学院ID
* @return 学院床位分配统计信息列表
*/
List<Map<String, Object>> getCollegeBedAssignmentStats(@Param("secondaryCollegeId") Long secondaryCollegeId);
}
@@ -65,4 +65,22 @@ public interface IXgClassMsgService {
* @return 是否删除成功
*/
Boolean deleteWithValidByIds(Collection<Long> 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<Long> ids, String classStatus);
}
@@ -83,4 +83,13 @@ public interface IXgStudentManagerService {
* @return 班主任信息列表
*/
List<ClassTeacherInfoVo> queryActiveClassTeachers(String phone, String name);
/**
* 获取所有班主任信息(按班级状态排序)
*
* @param phone 手机号
* @param name 姓名
* @return 班主任信息列表
*/
List<ClassTeacherInfoVo> queryAllClassTeachers(String phone, String name);
}
@@ -79,8 +79,10 @@ public class XgClassMsgServiceImpl implements IXgClassMsgService {
private LambdaQueryWrapper<XgClassMsg> buildQueryWrapper(XgClassMsgBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<XgClassMsg> 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<XgClassMsg> uw = Wrappers.lambdaUpdate();
uw.eq(XgClassMsg::getId, id).set(XgClassMsg::getClassStatus, classStatus);
return baseMapper.update(null, uw) > 0;
}
/**
* 批量仅更新班级状态
*/
@Override
public Boolean updateClassStatusBatch(Collection<Long> ids, String classStatus) {
if (ids == null || ids.isEmpty()) {
return false;
}
LambdaUpdateWrapper<XgClassMsg> uw = Wrappers.lambdaUpdate();
uw.in(XgClassMsg::getId, ids).set(XgClassMsg::getClassStatus, classStatus);
return baseMapper.update(null, uw) > 0;
}
}
@@ -157,7 +157,7 @@ public class XgStudentManagerServiceImpl implements IXgStudentManagerService {
@Override
public List<ClassTeacherInfoVo> 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<ClassTeacherInfoVo> 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<Object> 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;
});
}
@@ -145,8 +145,12 @@ public class XgStudentMsgServiceImpl implements IXgStudentMsgService {
LambdaQueryWrapper<XgStudentMsg> lqw = buildQueryWrapperForDeptQuery(bo);
// 第三步:分页查询学生信息
List<String> classIdList = filteredDeptIds.stream()
.map(String::valueOf)
.collect(Collectors.toList());
List<XgStudentMsgExportVo> result = baseMapper.queryPageListExportByDeptId(lqw,
filteredDeptIds);
classIdList);
return result;
}
@@ -178,7 +182,11 @@ public class XgStudentMsgServiceImpl implements IXgStudentMsgService {
LambdaQueryWrapper<XgStudentMsg> lqw = buildQueryWrapperForDeptQuery(bo);
// 第三步:分页查询学生信息
Page<XgStudentMsgVo> result = baseMapper.selectPageByDeptIds(pageQuery.build(), lqw, filteredDeptIds);
List<String> classIdList = filteredDeptIds.stream()
.map(String::valueOf)
.collect(Collectors.toList());
Page<XgStudentMsgVo> result = baseMapper.selectPageByDeptIds(pageQuery.build(), lqw, classIdList);
return TableDataInfo.build(result);
}
@@ -715,8 +723,12 @@ public class XgStudentMsgServiceImpl implements IXgStudentMsgService {
LambdaQueryWrapper<XgStudentMsg> lqw = buildAdvancedSearchQueryWrapper(bo);
// 第三步:分页查询学生信息
List<String> classIdList = filteredDeptIds.stream()
.map(String::valueOf)
.collect(Collectors.toList());
Page<XgStudentMsgVo> result = baseMapper.selectPageByDeptIds(
new Page<>(bo.getPageNum(), bo.getPageSize()), lqw, filteredDeptIds);
new Page<>(bo.getPageNum(), bo.getPageSize()), lqw, classIdList);
return TableDataInfo.build(result);
}