wuzhen 班级管理功能提交
This commit is contained in:
1 parent
6820ebc45f
commit
c809141195
12 files changed
+4731
No files matched your search
+265
@@ -0,0 +1,265 @@
|
|||||||
|
package org.dromara.xg.controller;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
|
import jakarta.validation.constraints.*;
|
||||||
|
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
import org.dromara.common.idempotent.annotation.RepeatSubmit;
|
||||||
|
import org.dromara.common.log.annotation.Log;
|
||||||
|
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.core.validate.AddGroup;
|
||||||
|
import org.dromara.common.core.validate.EditGroup;
|
||||||
|
import org.dromara.common.log.enums.BusinessType;
|
||||||
|
import org.dromara.common.excel.utils.ExcelUtil;
|
||||||
|
import org.dromara.xg.domain.vo.XgClassInfoVo;
|
||||||
|
import org.dromara.xg.domain.bo.XgClassInfoBo;
|
||||||
|
import org.dromara.xg.service.IXgClassInfoService;
|
||||||
|
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级信息管理
|
||||||
|
*
|
||||||
|
* @author Cursor AI
|
||||||
|
* @date 2025-01-21
|
||||||
|
*/
|
||||||
|
@Validated
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/xg/classInfo")
|
||||||
|
public class XgClassInfoController extends BaseController {
|
||||||
|
|
||||||
|
private final IXgClassInfoService xgClassInfoService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询班级信息列表
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("xg:classInfo:list")
|
||||||
|
@GetMapping("/list")
|
||||||
|
public TableDataInfo<XgClassInfoVo> list(XgClassInfoBo bo, PageQuery pageQuery) {
|
||||||
|
return xgClassInfoService.queryPageList(bo, pageQuery);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导出班级信息列表
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("xg:classInfo:export")
|
||||||
|
@Log(title = "班级信息", businessType = BusinessType.EXPORT)
|
||||||
|
@PostMapping("/export")
|
||||||
|
public void export(XgClassInfoBo bo, HttpServletResponse response) {
|
||||||
|
List<XgClassInfoVo> list = xgClassInfoService.queryList(bo);
|
||||||
|
ExcelUtil.exportExcel(list, "班级信息", XgClassInfoVo.class, response);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取班级信息详细信息
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("xg:classInfo:query")
|
||||||
|
@GetMapping("/{id}")
|
||||||
|
public R<XgClassInfoVo> getInfo(@NotNull(message = "主键不能为空")
|
||||||
|
@PathVariable Long id) {
|
||||||
|
return R.ok(xgClassInfoService.queryById(id));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增班级信息
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("xg:classInfo:add")
|
||||||
|
@Log(title = "班级信息", businessType = BusinessType.INSERT)
|
||||||
|
@RepeatSubmit()
|
||||||
|
@PostMapping()
|
||||||
|
public R<Void> add(@Validated(AddGroup.class) @RequestBody XgClassInfoBo bo) {
|
||||||
|
return toAjax(xgClassInfoService.insertByBo(bo));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改班级信息
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("xg:classInfo:edit")
|
||||||
|
@Log(title = "班级信息", businessType = BusinessType.UPDATE)
|
||||||
|
@RepeatSubmit()
|
||||||
|
@PutMapping()
|
||||||
|
public R<Void> edit(@Validated(EditGroup.class) @RequestBody XgClassInfoBo bo) {
|
||||||
|
return toAjax(xgClassInfoService.updateByBo(bo));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除班级信息
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("xg:classInfo:remove")
|
||||||
|
@Log(title = "班级信息", businessType = BusinessType.DELETE)
|
||||||
|
@DeleteMapping("/{ids}")
|
||||||
|
public R<Void> remove(@NotEmpty(message = "主键不能为空")
|
||||||
|
@PathVariable Long[] ids) {
|
||||||
|
return toAjax(xgClassInfoService.deleteWithValidByIds(List.of(ids), true));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据班级代码查询班级信息
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("xg:classInfo:query")
|
||||||
|
@GetMapping("/getByClassCode/{classCode}")
|
||||||
|
public R<XgClassInfoVo> getByClassCode(@NotBlank(message = "班级代码不能为空")
|
||||||
|
@PathVariable String classCode) {
|
||||||
|
return R.ok(xgClassInfoService.queryByClassCode(classCode));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据年级查询班级信息列表
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("xg:classInfo:query")
|
||||||
|
@GetMapping("/getByGrade/{grade}")
|
||||||
|
public R<List<XgClassInfoVo>> getByGrade(@NotBlank(message = "年级不能为空")
|
||||||
|
@PathVariable String grade) {
|
||||||
|
return R.ok(xgClassInfoService.queryByGrade(grade));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据学院代码查询班级信息列表
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("xg:classInfo:query")
|
||||||
|
@GetMapping("/getByCollegeCode/{collegeCode}")
|
||||||
|
public R<List<XgClassInfoVo>> getByCollegeCode(@NotBlank(message = "学院代码不能为空")
|
||||||
|
@PathVariable String collegeCode) {
|
||||||
|
return R.ok(xgClassInfoService.queryByCollegeCode(collegeCode));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据专业代码查询班级信息列表
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("xg:classInfo:query")
|
||||||
|
@GetMapping("/getByMajorCode/{majorCode}")
|
||||||
|
public R<List<XgClassInfoVo>> getByMajorCode(@NotBlank(message = "专业代码不能为空")
|
||||||
|
@PathVariable String majorCode) {
|
||||||
|
return R.ok(xgClassInfoService.queryByMajorCode(majorCode));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据辅导员ID查询班级信息列表
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("xg:classInfo:query")
|
||||||
|
@GetMapping("/getByCounselorId/{counselorId}")
|
||||||
|
public R<List<XgClassInfoVo>> getByCounselorId(@NotNull(message = "辅导员ID不能为空")
|
||||||
|
@PathVariable Long counselorId) {
|
||||||
|
return R.ok(xgClassInfoService.queryByCounselorId(counselorId));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据班主任ID查询班级信息列表
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("xg:classInfo:query")
|
||||||
|
@GetMapping("/getByClassTeacherId/{classTeacherId}")
|
||||||
|
public R<List<XgClassInfoVo>> getByClassTeacherId(@NotNull(message = "班主任ID不能为空")
|
||||||
|
@PathVariable Long classTeacherId) {
|
||||||
|
return R.ok(xgClassInfoService.queryByClassTeacherId(classTeacherId));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取班级可用选项列表(用于下拉框)
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("xg:classInfo:query")
|
||||||
|
@GetMapping("/getClassOptions")
|
||||||
|
public R<List<XgClassInfoVo>> getClassOptions() {
|
||||||
|
return R.ok(xgClassInfoService.getClassOptions());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新班级学生统计数据
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("xg:classInfo:edit")
|
||||||
|
@Log(title = "班级信息", businessType = BusinessType.UPDATE)
|
||||||
|
@PostMapping("/updateStudentCount/{id}")
|
||||||
|
public R<Void> updateStudentCount(@NotNull(message = "班级ID不能为空")
|
||||||
|
@PathVariable Long id) {
|
||||||
|
return toAjax(xgClassInfoService.updateStudentCount(id));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量更新班级学生统计数据
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("xg:classInfo:edit")
|
||||||
|
@Log(title = "班级信息", businessType = BusinessType.UPDATE)
|
||||||
|
@PostMapping("/batchUpdateStudentCount")
|
||||||
|
public R<Void> batchUpdateStudentCount(@NotEmpty(message = "班级ID列表不能为空")
|
||||||
|
@RequestBody List<Long> ids) {
|
||||||
|
return toAjax(xgClassInfoService.batchUpdateStudentCount(ids));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 启用班级
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("xg:classInfo:edit")
|
||||||
|
@Log(title = "班级信息", businessType = BusinessType.UPDATE)
|
||||||
|
@PostMapping("/enable/{id}")
|
||||||
|
public R<Void> enable(@NotNull(message = "班级ID不能为空")
|
||||||
|
@PathVariable Long id) {
|
||||||
|
return toAjax(xgClassInfoService.enableClass(id));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 禁用班级
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("xg:classInfo:edit")
|
||||||
|
@Log(title = "班级信息", businessType = BusinessType.UPDATE)
|
||||||
|
@PostMapping("/disable/{id}")
|
||||||
|
public R<Void> disable(@NotNull(message = "班级ID不能为空")
|
||||||
|
@PathVariable Long id) {
|
||||||
|
return toAjax(xgClassInfoService.disableClass(id));
|
||||||
|
}
|
||||||
|
|
||||||
|
// ================================
|
||||||
|
// 统计数据接口 - 新增
|
||||||
|
// ================================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取班级信息统计概览
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("xg:classInfo:statistics")
|
||||||
|
@GetMapping("/statistics")
|
||||||
|
public R<Map<String, Object>> getStatistics() {
|
||||||
|
return R.ok(xgClassInfoService.getStatistics());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 统计各学院班级数量
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("xg:classInfo:statistics")
|
||||||
|
@GetMapping("/statistics/college")
|
||||||
|
public R<List<Map<String, Object>>> countByCollege() {
|
||||||
|
return R.ok(xgClassInfoService.countByCollege());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 统计各年级班级数量
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("xg:classInfo:statistics")
|
||||||
|
@GetMapping("/statistics/grade")
|
||||||
|
public R<List<Map<String, Object>>> countByGrade() {
|
||||||
|
return R.ok(xgClassInfoService.countByGrade());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 统计各专业班级数量
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("xg:classInfo:statistics")
|
||||||
|
@GetMapping("/statistics/major")
|
||||||
|
public R<List<Map<String, Object>>> countByMajor() {
|
||||||
|
return R.ok(xgClassInfoService.countByMajor());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 统计班级状态分布
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("xg:classInfo:statistics")
|
||||||
|
@GetMapping("/statistics/status")
|
||||||
|
public R<List<Map<String, Object>>> countByStatus() {
|
||||||
|
return R.ok(xgClassInfoService.countByStatus());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+346
@@ -0,0 +1,346 @@
|
|||||||
|
package org.dromara.xg.domain;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.*;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import org.dromara.common.mybatis.core.domain.BaseEntity;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级信息对象 xg_class_info
|
||||||
|
*
|
||||||
|
* @author Cursor AI
|
||||||
|
* @date 2025-01-21
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@TableName("xg_class_info")
|
||||||
|
public class XgClassInfo extends BaseEntity implements Serializable {
|
||||||
|
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级ID
|
||||||
|
*/
|
||||||
|
@TableId(value = "id", type = IdType.ASSIGN_ID)
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 租户编号
|
||||||
|
*/
|
||||||
|
@TableField("tenant_id")
|
||||||
|
private String tenantId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级代码
|
||||||
|
*/
|
||||||
|
@TableField("class_code")
|
||||||
|
private String classCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级名称
|
||||||
|
*/
|
||||||
|
@TableField("class_name")
|
||||||
|
private String className;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级类型:regular-普通班级,honor-荣誉班级,experimental-实验班级,special-特殊班级
|
||||||
|
*/
|
||||||
|
@TableField("class_type")
|
||||||
|
private String classType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 年级
|
||||||
|
*/
|
||||||
|
@TableField("grade")
|
||||||
|
private String grade;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 入学年份
|
||||||
|
*/
|
||||||
|
@TableField("enrollment_year")
|
||||||
|
private Integer enrollmentYear;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 毕业年份
|
||||||
|
*/
|
||||||
|
@TableField("graduation_year")
|
||||||
|
private Integer graduationYear;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 专业代码
|
||||||
|
*/
|
||||||
|
@TableField("major_code")
|
||||||
|
private String majorCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 专业名称
|
||||||
|
*/
|
||||||
|
@TableField("major_name")
|
||||||
|
private String majorName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 培养方式:全日制、在职、函授、夜大等
|
||||||
|
*/
|
||||||
|
@TableField("training_type")
|
||||||
|
private String trainingType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 学位类型:本科、专科、研究生等
|
||||||
|
*/
|
||||||
|
@TableField("degree_type")
|
||||||
|
private String degreeType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 学院代码
|
||||||
|
*/
|
||||||
|
@TableField("college_code")
|
||||||
|
private String collegeCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 学院名称
|
||||||
|
*/
|
||||||
|
@TableField("college_name")
|
||||||
|
private String collegeName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 辅导员ID
|
||||||
|
*/
|
||||||
|
@TableField("counselor_id")
|
||||||
|
private Long counselorId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 辅导员姓名
|
||||||
|
*/
|
||||||
|
@TableField("counselor_name")
|
||||||
|
private String counselorName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班主任ID
|
||||||
|
*/
|
||||||
|
@TableField("class_teacher_id")
|
||||||
|
private Long classTeacherId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班主任姓名
|
||||||
|
*/
|
||||||
|
@TableField("class_teacher_name")
|
||||||
|
private String classTeacherName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级导师ID
|
||||||
|
*/
|
||||||
|
@TableField("class_advisor_id")
|
||||||
|
private Long classAdvisorId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级导师姓名
|
||||||
|
*/
|
||||||
|
@TableField("class_advisor_name")
|
||||||
|
private String classAdvisorName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班长ID
|
||||||
|
*/
|
||||||
|
@TableField("class_monitor_id")
|
||||||
|
private Long classMonitorId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班长姓名
|
||||||
|
*/
|
||||||
|
@TableField("class_monitor_name")
|
||||||
|
private String classMonitorName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 副班长ID
|
||||||
|
*/
|
||||||
|
@TableField("deputy_monitor_id")
|
||||||
|
private Long deputyMonitorId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 副班长姓名
|
||||||
|
*/
|
||||||
|
@TableField("deputy_monitor_name")
|
||||||
|
private String deputyMonitorName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级状态:1-正常,2-暂停,3-毕业,4-解散
|
||||||
|
*/
|
||||||
|
@TableField("class_status")
|
||||||
|
private String classStatus;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否毕业:0-未毕业,1-已毕业
|
||||||
|
*/
|
||||||
|
@TableField("is_graduation")
|
||||||
|
private Integer isGraduation;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 毕业日期
|
||||||
|
*/
|
||||||
|
@TableField("graduation_date")
|
||||||
|
private LocalDate graduationDate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 计划容量
|
||||||
|
*/
|
||||||
|
@TableField("planned_capacity")
|
||||||
|
private Integer plannedCapacity;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当前学生数量
|
||||||
|
*/
|
||||||
|
@TableField("current_student_count")
|
||||||
|
private Integer currentStudentCount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 最大学生数量
|
||||||
|
*/
|
||||||
|
@TableField("max_student_count")
|
||||||
|
private Integer maxStudentCount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 男生数量
|
||||||
|
*/
|
||||||
|
@TableField("male_count")
|
||||||
|
private Integer maleCount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 女生数量
|
||||||
|
*/
|
||||||
|
@TableField("female_count")
|
||||||
|
private Integer femaleCount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 在籍学生数量
|
||||||
|
*/
|
||||||
|
@TableField("active_count")
|
||||||
|
private Integer activeCount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转入学生数量
|
||||||
|
*/
|
||||||
|
@TableField("transfer_in_count")
|
||||||
|
private Integer transferInCount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转出学生数量
|
||||||
|
*/
|
||||||
|
@TableField("transfer_out_count")
|
||||||
|
private Integer transferOutCount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 退学学生数量
|
||||||
|
*/
|
||||||
|
@TableField("dropout_count")
|
||||||
|
private Integer dropoutCount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 毕业学生数量
|
||||||
|
*/
|
||||||
|
@TableField("graduate_count")
|
||||||
|
private Integer graduateCount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 办公室位置
|
||||||
|
*/
|
||||||
|
@TableField("office_location")
|
||||||
|
private String officeLocation;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 教室位置
|
||||||
|
*/
|
||||||
|
@TableField("class_location")
|
||||||
|
private String classLocation;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 联系电话
|
||||||
|
*/
|
||||||
|
@TableField("contact_phone")
|
||||||
|
private String contactPhone;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* QQ群号
|
||||||
|
*/
|
||||||
|
@TableField("qq_group")
|
||||||
|
private String qqGroup;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 微信群
|
||||||
|
*/
|
||||||
|
@TableField("wechat_group")
|
||||||
|
private String wechatGroup;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 邮箱
|
||||||
|
*/
|
||||||
|
@TableField("email")
|
||||||
|
private String email;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 课程安排
|
||||||
|
*/
|
||||||
|
@TableField("class_schedule")
|
||||||
|
private String classSchedule;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级文化
|
||||||
|
*/
|
||||||
|
@TableField("class_culture")
|
||||||
|
private String classCulture;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级规章制度
|
||||||
|
*/
|
||||||
|
@TableField("class_rules")
|
||||||
|
private String classRules;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级描述
|
||||||
|
*/
|
||||||
|
@TableField("class_description")
|
||||||
|
private String classDescription;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 最后统计更新时间
|
||||||
|
*/
|
||||||
|
@TableField("last_count_update")
|
||||||
|
private LocalDateTime lastCountUpdate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 扩展字段1
|
||||||
|
*/
|
||||||
|
@TableField("ext_field1")
|
||||||
|
private String extField1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 扩展字段2
|
||||||
|
*/
|
||||||
|
@TableField("ext_field2")
|
||||||
|
private String extField2;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 扩展字段3
|
||||||
|
*/
|
||||||
|
@TableField("ext_field3")
|
||||||
|
private String extField3;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 备注
|
||||||
|
*/
|
||||||
|
@TableField("remark")
|
||||||
|
private String remark;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除标志(0代表存在 1代表删除)
|
||||||
|
*/
|
||||||
|
@TableField("deleted")
|
||||||
|
@TableLogic
|
||||||
|
private Integer deleted;
|
||||||
|
|
||||||
|
}
|
||||||
+378
@@ -0,0 +1,378 @@
|
|||||||
|
package org.dromara.xg.domain.bo;
|
||||||
|
|
||||||
|
import org.dromara.xg.domain.XgClassInfo;
|
||||||
|
import org.dromara.common.mybatis.core.domain.BaseEntity;
|
||||||
|
import org.dromara.common.core.validate.AddGroup;
|
||||||
|
import org.dromara.common.core.validate.EditGroup;
|
||||||
|
import io.github.linpeilie.annotations.AutoMapper;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import jakarta.validation.constraints.*;
|
||||||
|
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级信息业务对象 xg_class_info
|
||||||
|
*
|
||||||
|
* @author Cursor AI
|
||||||
|
* @date 2025-01-21
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@AutoMapper(target = XgClassInfo.class, reverseConvertGenerate = false)
|
||||||
|
public class XgClassInfoBo extends BaseEntity {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级ID
|
||||||
|
*/
|
||||||
|
@NotNull(message = "班级ID不能为空", groups = { EditGroup.class })
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级代码
|
||||||
|
*/
|
||||||
|
@NotBlank(message = "班级代码不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||||
|
@Size(max = 32, message = "班级代码长度不能超过32个字符")
|
||||||
|
private String classCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级名称
|
||||||
|
*/
|
||||||
|
@NotBlank(message = "班级名称不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||||
|
@Size(max = 100, message = "班级名称长度不能超过100个字符")
|
||||||
|
private String className;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级类型:regular-普通班级,honor-荣誉班级,experimental-实验班级,special-特殊班级
|
||||||
|
*/
|
||||||
|
private String classType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 年级
|
||||||
|
*/
|
||||||
|
@NotBlank(message = "年级不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||||
|
@Size(max = 10, message = "年级长度不能超过10个字符")
|
||||||
|
private String grade;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 入学年份
|
||||||
|
*/
|
||||||
|
@NotNull(message = "入学年份不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||||
|
@Min(value = 1900, message = "入学年份不能小于1900")
|
||||||
|
@Max(value = 2100, message = "入学年份不能大于2100")
|
||||||
|
private Integer enrollmentYear;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 毕业年份
|
||||||
|
*/
|
||||||
|
@Min(value = 1900, message = "毕业年份不能小于1900")
|
||||||
|
@Max(value = 2100, message = "毕业年份不能大于2100")
|
||||||
|
private Integer graduationYear;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 专业代码
|
||||||
|
*/
|
||||||
|
@Size(max = 20, message = "专业代码长度不能超过20个字符")
|
||||||
|
private String majorCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 专业名称
|
||||||
|
*/
|
||||||
|
@Size(max = 100, message = "专业名称长度不能超过100个字符")
|
||||||
|
private String majorName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 培养方式:全日制、在职、函授、夜大等
|
||||||
|
*/
|
||||||
|
@Size(max = 20, message = "培养方式长度不能超过20个字符")
|
||||||
|
private String trainingType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 学位类型:本科、专科、研究生等
|
||||||
|
*/
|
||||||
|
@Size(max = 20, message = "学位类型长度不能超过20个字符")
|
||||||
|
private String degreeType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 学院代码
|
||||||
|
*/
|
||||||
|
@Size(max = 20, message = "学院代码长度不能超过20个字符")
|
||||||
|
private String collegeCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 学院名称
|
||||||
|
*/
|
||||||
|
@Size(max = 100, message = "学院名称长度不能超过100个字符")
|
||||||
|
private String collegeName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 辅导员ID
|
||||||
|
*/
|
||||||
|
private Long counselorId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 辅导员姓名
|
||||||
|
*/
|
||||||
|
@Size(max = 50, message = "辅导员姓名长度不能超过50个字符")
|
||||||
|
private String counselorName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班主任ID
|
||||||
|
*/
|
||||||
|
private Long classTeacherId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班主任姓名
|
||||||
|
*/
|
||||||
|
@Size(max = 50, message = "班主任姓名长度不能超过50个字符")
|
||||||
|
private String classTeacherName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级导师ID
|
||||||
|
*/
|
||||||
|
private Long classAdvisorId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级导师姓名
|
||||||
|
*/
|
||||||
|
@Size(max = 50, message = "班级导师姓名长度不能超过50个字符")
|
||||||
|
private String classAdvisorName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班长ID
|
||||||
|
*/
|
||||||
|
private Long classMonitorId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班长姓名
|
||||||
|
*/
|
||||||
|
@Size(max = 50, message = "班长姓名长度不能超过50个字符")
|
||||||
|
private String classMonitorName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 副班长ID
|
||||||
|
*/
|
||||||
|
private Long deputyMonitorId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 副班长姓名
|
||||||
|
*/
|
||||||
|
@Size(max = 50, message = "副班长姓名长度不能超过50个字符")
|
||||||
|
private String deputyMonitorName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级状态:1-正常,2-暂停,3-毕业,4-解散
|
||||||
|
*/
|
||||||
|
private String classStatus;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否毕业:0-未毕业,1-已毕业
|
||||||
|
*/
|
||||||
|
private Integer isGraduation;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 毕业日期
|
||||||
|
*/
|
||||||
|
private LocalDate graduationDate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 计划容量
|
||||||
|
*/
|
||||||
|
@Min(value = 1, message = "计划容量不能小于1")
|
||||||
|
@Max(value = 200, message = "计划容量不能大于200")
|
||||||
|
private Integer plannedCapacity;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当前学生数量
|
||||||
|
*/
|
||||||
|
private Integer currentStudentCount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 最大学生数量
|
||||||
|
*/
|
||||||
|
@Min(value = 1, message = "最大学生数量不能小于1")
|
||||||
|
@Max(value = 200, message = "最大学生数量不能大于200")
|
||||||
|
private Integer maxStudentCount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 男生数量
|
||||||
|
*/
|
||||||
|
private Integer maleCount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 女生数量
|
||||||
|
*/
|
||||||
|
private Integer femaleCount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 在籍学生数量
|
||||||
|
*/
|
||||||
|
private Integer activeCount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转入学生数量
|
||||||
|
*/
|
||||||
|
private Integer transferInCount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转出学生数量
|
||||||
|
*/
|
||||||
|
private Integer transferOutCount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 退学学生数量
|
||||||
|
*/
|
||||||
|
private Integer dropoutCount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 毕业学生数量
|
||||||
|
*/
|
||||||
|
private Integer graduateCount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 办公室位置
|
||||||
|
*/
|
||||||
|
@Size(max = 200, message = "办公室位置长度不能超过200个字符")
|
||||||
|
private String officeLocation;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 教室位置
|
||||||
|
*/
|
||||||
|
@Size(max = 100, message = "教室位置长度不能超过100个字符")
|
||||||
|
private String classLocation;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 联系电话
|
||||||
|
*/
|
||||||
|
@Size(max = 20, message = "联系电话长度不能超过20个字符")
|
||||||
|
private String contactPhone;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* QQ群号
|
||||||
|
*/
|
||||||
|
@Size(max = 20, message = "QQ群号长度不能超过20个字符")
|
||||||
|
private String qqGroup;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 微信群
|
||||||
|
*/
|
||||||
|
@Size(max = 100, message = "微信群长度不能超过100个字符")
|
||||||
|
private String wechatGroup;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 邮箱
|
||||||
|
*/
|
||||||
|
@Email(message = "邮箱格式不正确")
|
||||||
|
@Size(max = 100, message = "邮箱长度不能超过100个字符")
|
||||||
|
private String email;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 课程安排
|
||||||
|
*/
|
||||||
|
private String classSchedule;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级文化
|
||||||
|
*/
|
||||||
|
private String classCulture;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级规章制度
|
||||||
|
*/
|
||||||
|
private String classRules;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级描述
|
||||||
|
*/
|
||||||
|
@Size(max = 500, message = "班级描述长度不能超过500个字符")
|
||||||
|
private String classDescription;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 最后统计更新时间
|
||||||
|
*/
|
||||||
|
private LocalDateTime lastCountUpdate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 扩展字段1
|
||||||
|
*/
|
||||||
|
@Size(max = 200, message = "扩展字段1长度不能超过200个字符")
|
||||||
|
private String extField1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 扩展字段2
|
||||||
|
*/
|
||||||
|
@Size(max = 200, message = "扩展字段2长度不能超过200个字符")
|
||||||
|
private String extField2;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 扩展字段3
|
||||||
|
*/
|
||||||
|
@Size(max = 200, message = "扩展字段3长度不能超过200个字符")
|
||||||
|
private String extField3;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 备注
|
||||||
|
*/
|
||||||
|
@Size(max = 500, message = "备注长度不能超过500个字符")
|
||||||
|
private String remark;
|
||||||
|
|
||||||
|
// ========== 查询条件字段 ==========
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 入学年份开始
|
||||||
|
*/
|
||||||
|
private Integer enrollmentYearStart;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 入学年份结束
|
||||||
|
*/
|
||||||
|
private Integer enrollmentYearEnd;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级代码列表(用于批量查询)
|
||||||
|
*/
|
||||||
|
private List<String> classCodeList;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级状态列表(用于批量查询)
|
||||||
|
*/
|
||||||
|
private List<String> classStatusList;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 学院代码列表(用于批量查询)
|
||||||
|
*/
|
||||||
|
private List<String> collegeCodeList;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 专业代码列表(用于批量查询)
|
||||||
|
*/
|
||||||
|
private List<String> majorCodeList;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 年级列表(用于批量查询)
|
||||||
|
*/
|
||||||
|
private List<String> gradeList;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 辅导员ID列表(用于批量查询)
|
||||||
|
*/
|
||||||
|
private List<Long> counselorIdList;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班主任ID列表(用于批量查询)
|
||||||
|
*/
|
||||||
|
private List<Long> classTeacherIdList;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建时间开始
|
||||||
|
*/
|
||||||
|
private String createTimeStart;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建时间结束
|
||||||
|
*/
|
||||||
|
private String createTimeEnd;
|
||||||
|
|
||||||
|
}
|
||||||
+355
@@ -0,0 +1,355 @@
|
|||||||
|
package org.dromara.xg.domain.vo;
|
||||||
|
|
||||||
|
import org.dromara.xg.domain.XgClassInfo;
|
||||||
|
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
|
||||||
|
import cn.idev.excel.annotation.ExcelProperty;
|
||||||
|
import org.dromara.common.excel.annotation.ExcelDictFormat;
|
||||||
|
import org.dromara.common.excel.convert.ExcelDictConvert;
|
||||||
|
import io.github.linpeilie.annotations.AutoMapper;
|
||||||
|
import lombok.Data;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级信息视图对象 xg_class_info
|
||||||
|
*
|
||||||
|
* @author Cursor AI
|
||||||
|
* @date 2025-01-21
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@ExcelIgnoreUnannotated
|
||||||
|
@AutoMapper(target = XgClassInfo.class)
|
||||||
|
public class XgClassInfoVo implements Serializable {
|
||||||
|
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级ID
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "班级ID")
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级代码
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "班级代码")
|
||||||
|
private String classCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级名称
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "班级名称")
|
||||||
|
private String className;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级类型:regular-普通班级,honor-荣誉班级,experimental-实验班级,special-特殊班级
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "班级类型", converter = ExcelDictConvert.class)
|
||||||
|
@ExcelDictFormat(dictType = "xg_class_type")
|
||||||
|
private String classType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 年级
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "年级")
|
||||||
|
private String grade;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 入学年份
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "入学年份")
|
||||||
|
private Integer enrollmentYear;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 毕业年份
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "毕业年份")
|
||||||
|
private Integer graduationYear;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 专业代码
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "专业代码")
|
||||||
|
private String majorCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 专业名称
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "专业名称")
|
||||||
|
private String majorName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 培养方式:全日制、在职、函授、夜大等
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "培养方式")
|
||||||
|
private String trainingType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 学位类型:本科、专科、研究生等
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "学位类型")
|
||||||
|
private String degreeType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 学院代码
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "学院代码")
|
||||||
|
private String collegeCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 学院名称
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "学院名称")
|
||||||
|
private String collegeName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 辅导员ID
|
||||||
|
*/
|
||||||
|
private Long counselorId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 辅导员姓名
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "辅导员姓名")
|
||||||
|
private String counselorName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班主任ID
|
||||||
|
*/
|
||||||
|
private Long classTeacherId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班主任姓名
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "班主任姓名")
|
||||||
|
private String classTeacherName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级导师ID
|
||||||
|
*/
|
||||||
|
private Long classAdvisorId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级导师姓名
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "班级导师姓名")
|
||||||
|
private String classAdvisorName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班长ID
|
||||||
|
*/
|
||||||
|
private Long classMonitorId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班长姓名
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "班长姓名")
|
||||||
|
private String classMonitorName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 副班长ID
|
||||||
|
*/
|
||||||
|
private Long deputyMonitorId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 副班长姓名
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "副班长姓名")
|
||||||
|
private String deputyMonitorName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级状态:1-正常,2-暂停,3-毕业,4-解散
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "班级状态", converter = ExcelDictConvert.class)
|
||||||
|
@ExcelDictFormat(dictType = "xg_class_status")
|
||||||
|
private String classStatus;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否毕业:0-未毕业,1-已毕业
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "是否毕业", converter = ExcelDictConvert.class)
|
||||||
|
@ExcelDictFormat(readConverterExp = "0=未毕业,1=已毕业")
|
||||||
|
private Integer isGraduation;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 毕业日期
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "毕业日期")
|
||||||
|
@JsonFormat(pattern = "yyyy-MM-dd")
|
||||||
|
private LocalDate graduationDate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 计划容量
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "计划容量")
|
||||||
|
private Integer plannedCapacity;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当前学生数量
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "当前学生数量")
|
||||||
|
private Integer currentStudentCount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 最大学生数量
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "最大学生数量")
|
||||||
|
private Integer maxStudentCount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 男生数量
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "男生数量")
|
||||||
|
private Integer maleCount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 女生数量
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "女生数量")
|
||||||
|
private Integer femaleCount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 在籍学生数量
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "在籍学生数量")
|
||||||
|
private Integer activeCount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转入学生数量
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "转入学生数量")
|
||||||
|
private Integer transferInCount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转出学生数量
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "转出学生数量")
|
||||||
|
private Integer transferOutCount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 退学学生数量
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "退学学生数量")
|
||||||
|
private Integer dropoutCount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 毕业学生数量
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "毕业学生数量")
|
||||||
|
private Integer graduateCount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 办公室位置
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "办公室位置")
|
||||||
|
private String officeLocation;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 教室位置
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "教室位置")
|
||||||
|
private String classLocation;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 联系电话
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "联系电话")
|
||||||
|
private String contactPhone;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* QQ群号
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "QQ群号")
|
||||||
|
private String qqGroup;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 微信群
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "微信群")
|
||||||
|
private String wechatGroup;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 邮箱
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "邮箱")
|
||||||
|
private String email;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 课程安排
|
||||||
|
*/
|
||||||
|
private String classSchedule;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级文化
|
||||||
|
*/
|
||||||
|
private String classCulture;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级规章制度
|
||||||
|
*/
|
||||||
|
private String classRules;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级描述
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "班级描述")
|
||||||
|
private String classDescription;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 最后统计更新时间
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "最后统计更新时间")
|
||||||
|
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||||
|
private LocalDateTime lastCountUpdate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 扩展字段1
|
||||||
|
*/
|
||||||
|
private String extField1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 扩展字段2
|
||||||
|
*/
|
||||||
|
private String extField2;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 扩展字段3
|
||||||
|
*/
|
||||||
|
private String extField3;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 备注
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "备注")
|
||||||
|
private String remark;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建者
|
||||||
|
*/
|
||||||
|
private Long createBy;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建时间
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "创建时间")
|
||||||
|
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||||
|
private LocalDateTime createTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新者
|
||||||
|
*/
|
||||||
|
private Long updateBy;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新时间
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "更新时间")
|
||||||
|
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||||
|
private LocalDateTime updateTime;
|
||||||
|
|
||||||
|
}
|
||||||
+106
@@ -0,0 +1,106 @@
|
|||||||
|
package org.dromara.xg.mapper;
|
||||||
|
|
||||||
|
import org.dromara.xg.domain.XgClassInfo;
|
||||||
|
import org.dromara.xg.domain.vo.XgClassInfoVo;
|
||||||
|
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.Wrapper;
|
||||||
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级信息Mapper接口
|
||||||
|
*
|
||||||
|
* @author Cursor AI
|
||||||
|
* @date 2025-01-21
|
||||||
|
*/
|
||||||
|
public interface XgClassInfoMapper extends BaseMapperPlus<XgClassInfo, XgClassInfoVo> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 重写分页查询方法,使用自定义ResultMap
|
||||||
|
*
|
||||||
|
* @param page 分页参数
|
||||||
|
* @param wrapper 查询条件
|
||||||
|
* @return 分页结果
|
||||||
|
*/
|
||||||
|
<P extends IPage<XgClassInfoVo>> P selectVoPage(IPage<XgClassInfo> page, @Param("ew") Wrapper<XgClassInfo> wrapper);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据班级代码查询班级信息
|
||||||
|
*
|
||||||
|
* @param classCode 班级代码
|
||||||
|
* @return 班级信息
|
||||||
|
*/
|
||||||
|
XgClassInfoVo selectByClassCode(String classCode);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询指定年级的班级列表
|
||||||
|
*
|
||||||
|
* @param grade 年级
|
||||||
|
* @return 班级列表
|
||||||
|
*/
|
||||||
|
List<XgClassInfoVo> selectByGrade(String grade);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询指定学院的班级列表
|
||||||
|
*
|
||||||
|
* @param collegeCode 学院代码
|
||||||
|
* @return 班级列表
|
||||||
|
*/
|
||||||
|
List<XgClassInfoVo> selectByCollegeCode(String collegeCode);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询指定专业的班级列表
|
||||||
|
*
|
||||||
|
* @param majorCode 专业代码
|
||||||
|
* @return 班级列表
|
||||||
|
*/
|
||||||
|
List<XgClassInfoVo> selectByMajorCode(String majorCode);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询指定辅导员的班级列表
|
||||||
|
*
|
||||||
|
* @param counselorId 辅导员ID
|
||||||
|
* @return 班级列表
|
||||||
|
*/
|
||||||
|
List<XgClassInfoVo> selectByCounselorId(Long counselorId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询指定班主任的班级列表
|
||||||
|
*
|
||||||
|
* @param classTeacherId 班主任ID
|
||||||
|
* @return 班级列表
|
||||||
|
*/
|
||||||
|
List<XgClassInfoVo> selectByClassTeacherId(Long classTeacherId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 统计各学院班级数量
|
||||||
|
*
|
||||||
|
* @return 学院班级数量统计
|
||||||
|
*/
|
||||||
|
List<Map<String, Object>> countByCollege();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 统计各年级班级数量
|
||||||
|
*
|
||||||
|
* @return 年级班级数量统计
|
||||||
|
*/
|
||||||
|
List<Map<String, Object>> countByGrade();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 统计各专业班级数量
|
||||||
|
*
|
||||||
|
* @return 专业班级数量统计
|
||||||
|
*/
|
||||||
|
List<Map<String, Object>> countByMajor();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 统计班级状态分布
|
||||||
|
*
|
||||||
|
* @return 班级状态统计
|
||||||
|
*/
|
||||||
|
List<Map<String, Object>> countByClassStatus();
|
||||||
|
|
||||||
|
}
|
||||||
+195
@@ -0,0 +1,195 @@
|
|||||||
|
package org.dromara.xg.service;
|
||||||
|
|
||||||
|
import org.dromara.xg.domain.vo.XgClassInfoVo;
|
||||||
|
import org.dromara.xg.domain.bo.XgClassInfoBo;
|
||||||
|
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||||
|
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级信息Service接口
|
||||||
|
*
|
||||||
|
* @author Cursor AI
|
||||||
|
* @date 2025-01-21
|
||||||
|
*/
|
||||||
|
public interface IXgClassInfoService {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询班级信息
|
||||||
|
*
|
||||||
|
* @param id 班级信息主键
|
||||||
|
* @return 班级信息
|
||||||
|
*/
|
||||||
|
XgClassInfoVo queryById(Long id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询班级信息列表
|
||||||
|
*
|
||||||
|
* @param bo 班级信息
|
||||||
|
* @return 班级信息集合
|
||||||
|
*/
|
||||||
|
TableDataInfo<XgClassInfoVo> queryPageList(XgClassInfoBo bo, PageQuery pageQuery);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询班级信息列表
|
||||||
|
*
|
||||||
|
* @param bo 班级信息
|
||||||
|
* @return 班级信息集合
|
||||||
|
*/
|
||||||
|
List<XgClassInfoVo> queryList(XgClassInfoBo bo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增班级信息
|
||||||
|
*
|
||||||
|
* @param bo 班级信息
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
Boolean insertByBo(XgClassInfoBo bo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改班级信息
|
||||||
|
*
|
||||||
|
* @param bo 班级信息
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
Boolean updateByBo(XgClassInfoBo bo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 校验并批量删除班级信息信息
|
||||||
|
*
|
||||||
|
* @param ids 需要删除的班级信息主键集合
|
||||||
|
* @param isValid 是否校验,true-删除前校验,false-不校验
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据班级代码查询班级信息
|
||||||
|
*
|
||||||
|
* @param classCode 班级代码
|
||||||
|
* @return 班级信息
|
||||||
|
*/
|
||||||
|
XgClassInfoVo queryByClassCode(String classCode);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据年级查询班级信息列表
|
||||||
|
*
|
||||||
|
* @param grade 年级
|
||||||
|
* @return 班级信息集合
|
||||||
|
*/
|
||||||
|
List<XgClassInfoVo> queryByGrade(String grade);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据学院代码查询班级信息列表
|
||||||
|
*
|
||||||
|
* @param collegeCode 学院代码
|
||||||
|
* @return 班级信息集合
|
||||||
|
*/
|
||||||
|
List<XgClassInfoVo> queryByCollegeCode(String collegeCode);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据专业代码查询班级信息列表
|
||||||
|
*
|
||||||
|
* @param majorCode 专业代码
|
||||||
|
* @return 班级信息集合
|
||||||
|
*/
|
||||||
|
List<XgClassInfoVo> queryByMajorCode(String majorCode);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据辅导员ID查询班级信息列表
|
||||||
|
*
|
||||||
|
* @param counselorId 辅导员ID
|
||||||
|
* @return 班级信息集合
|
||||||
|
*/
|
||||||
|
List<XgClassInfoVo> queryByCounselorId(Long counselorId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据班主任ID查询班级信息列表
|
||||||
|
*
|
||||||
|
* @param classTeacherId 班主任ID
|
||||||
|
* @return 班级信息集合
|
||||||
|
*/
|
||||||
|
List<XgClassInfoVo> queryByClassTeacherId(Long classTeacherId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取班级可用选项列表(用于下拉框)
|
||||||
|
*
|
||||||
|
* @return 班级选项集合
|
||||||
|
*/
|
||||||
|
List<XgClassInfoVo> getClassOptions();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新班级学生统计数据
|
||||||
|
*
|
||||||
|
* @param classId 班级ID
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
Boolean updateStudentCount(Long classId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量更新班级学生统计数据
|
||||||
|
*
|
||||||
|
* @param classIds 班级ID集合
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
Boolean batchUpdateStudentCount(Collection<Long> classIds);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 启用班级
|
||||||
|
*
|
||||||
|
* @param id 班级ID
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
Boolean enableClass(Long id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 禁用班级
|
||||||
|
*
|
||||||
|
* @param id 班级ID
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
Boolean disableClass(Long id);
|
||||||
|
|
||||||
|
// ================================
|
||||||
|
// 统计数据接口 - 新增
|
||||||
|
// ================================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取班级信息统计概览
|
||||||
|
*
|
||||||
|
* @return 统计概览数据
|
||||||
|
*/
|
||||||
|
Map<String, Object> getStatistics();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 统计各学院班级数量
|
||||||
|
*
|
||||||
|
* @return 学院班级数量统计
|
||||||
|
*/
|
||||||
|
List<Map<String, Object>> countByCollege();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 统计各年级班级数量
|
||||||
|
*
|
||||||
|
* @return 年级班级数量统计
|
||||||
|
*/
|
||||||
|
List<Map<String, Object>> countByGrade();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 统计各专业班级数量
|
||||||
|
*
|
||||||
|
* @return 专业班级数量统计
|
||||||
|
*/
|
||||||
|
List<Map<String, Object>> countByMajor();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 统计班级状态分布
|
||||||
|
*
|
||||||
|
* @return 班级状态统计
|
||||||
|
*/
|
||||||
|
List<Map<String, Object>> countByStatus();
|
||||||
|
|
||||||
|
}
|
||||||
+513
@@ -0,0 +1,513 @@
|
|||||||
|
package org.dromara.xg.service.impl;
|
||||||
|
|
||||||
|
import org.dromara.common.core.utils.MapstructUtils;
|
||||||
|
import org.dromara.common.core.utils.StringUtils;
|
||||||
|
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||||
|
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.dromara.xg.domain.bo.XgClassInfoBo;
|
||||||
|
import org.dromara.xg.domain.vo.XgClassInfoVo;
|
||||||
|
import org.dromara.xg.domain.XgClassInfo;
|
||||||
|
import org.dromara.xg.mapper.XgClassInfoMapper;
|
||||||
|
import org.dromara.xg.service.IXgClassInfoService;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级信息Service业务层处理
|
||||||
|
*
|
||||||
|
* @author Cursor AI
|
||||||
|
* @date 2025-01-21
|
||||||
|
*/
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
@Service
|
||||||
|
public class XgClassInfoServiceImpl implements IXgClassInfoService {
|
||||||
|
|
||||||
|
private static final Logger log = LoggerFactory.getLogger(XgClassInfoServiceImpl.class);
|
||||||
|
|
||||||
|
private final XgClassInfoMapper baseMapper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询班级信息
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public XgClassInfoVo queryById(Long id) {
|
||||||
|
return baseMapper.selectVoById(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询班级信息列表
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public TableDataInfo<XgClassInfoVo> queryPageList(XgClassInfoBo bo, PageQuery pageQuery) {
|
||||||
|
log.info("=== 班级信息分页查询开始 ===");
|
||||||
|
log.info("查询条件: {}", bo);
|
||||||
|
log.info("分页参数: {}", pageQuery);
|
||||||
|
|
||||||
|
// 构建查询条件
|
||||||
|
LambdaQueryWrapper<XgClassInfo> lqw = buildQueryWrapper(bo);
|
||||||
|
log.info("Service构建的Lambda查询条件: {}", lqw.getTargetSql());
|
||||||
|
|
||||||
|
// 执行分页查询
|
||||||
|
Page<XgClassInfoVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
|
||||||
|
log.info("Mapper查询结果 - 总数: {}, 当前页记录数: {}", result.getTotal(), result.getRecords().size());
|
||||||
|
|
||||||
|
if (!result.getRecords().isEmpty()) {
|
||||||
|
log.info("第一条记录详情: {}", result.getRecords().get(0));
|
||||||
|
} else {
|
||||||
|
log.warn("Mapper查询结果为空!");
|
||||||
|
}
|
||||||
|
|
||||||
|
TableDataInfo<XgClassInfoVo> tableDataInfo = TableDataInfo.build(result);
|
||||||
|
log.info("最终返回结果 - 总数: {}, 行数: {}", tableDataInfo.getTotal(), tableDataInfo.getRows().size());
|
||||||
|
log.info("=== 班级信息分页查询结束 ===");
|
||||||
|
|
||||||
|
return tableDataInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询班级信息列表
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public List<XgClassInfoVo> queryList(XgClassInfoBo bo) {
|
||||||
|
LambdaQueryWrapper<XgClassInfo> lqw = buildQueryWrapper(bo);
|
||||||
|
return baseMapper.selectVoList(lqw);
|
||||||
|
}
|
||||||
|
|
||||||
|
private LambdaQueryWrapper<XgClassInfo> buildQueryWrapper(XgClassInfoBo bo) {
|
||||||
|
Map<String, Object> params = bo.getParams();
|
||||||
|
LambdaQueryWrapper<XgClassInfo> lqw = Wrappers.lambdaQuery();
|
||||||
|
lqw.eq(StringUtils.isNotBlank(bo.getClassCode()), XgClassInfo::getClassCode, bo.getClassCode());
|
||||||
|
lqw.like(StringUtils.isNotBlank(bo.getClassName()), XgClassInfo::getClassName, bo.getClassName());
|
||||||
|
lqw.eq(StringUtils.isNotBlank(bo.getClassType()), XgClassInfo::getClassType, bo.getClassType());
|
||||||
|
lqw.eq(StringUtils.isNotBlank(bo.getGrade()), XgClassInfo::getGrade, bo.getGrade());
|
||||||
|
lqw.eq(bo.getEnrollmentYear() != null, XgClassInfo::getEnrollmentYear, bo.getEnrollmentYear());
|
||||||
|
lqw.ge(bo.getEnrollmentYearStart() != null, XgClassInfo::getEnrollmentYear, bo.getEnrollmentYearStart());
|
||||||
|
lqw.le(bo.getEnrollmentYearEnd() != null, XgClassInfo::getEnrollmentYear, bo.getEnrollmentYearEnd());
|
||||||
|
lqw.eq(bo.getGraduationYear() != null, XgClassInfo::getGraduationYear, bo.getGraduationYear());
|
||||||
|
lqw.eq(StringUtils.isNotBlank(bo.getMajorCode()), XgClassInfo::getMajorCode, bo.getMajorCode());
|
||||||
|
lqw.like(StringUtils.isNotBlank(bo.getMajorName()), XgClassInfo::getMajorName, bo.getMajorName());
|
||||||
|
lqw.eq(StringUtils.isNotBlank(bo.getTrainingType()), XgClassInfo::getTrainingType, bo.getTrainingType());
|
||||||
|
lqw.eq(StringUtils.isNotBlank(bo.getDegreeType()), XgClassInfo::getDegreeType, bo.getDegreeType());
|
||||||
|
lqw.eq(StringUtils.isNotBlank(bo.getCollegeCode()), XgClassInfo::getCollegeCode, bo.getCollegeCode());
|
||||||
|
lqw.like(StringUtils.isNotBlank(bo.getCollegeName()), XgClassInfo::getCollegeName, bo.getCollegeName());
|
||||||
|
lqw.eq(bo.getCounselorId() != null, XgClassInfo::getCounselorId, bo.getCounselorId());
|
||||||
|
lqw.like(StringUtils.isNotBlank(bo.getCounselorName()), XgClassInfo::getCounselorName, bo.getCounselorName());
|
||||||
|
lqw.eq(bo.getClassTeacherId() != null, XgClassInfo::getClassTeacherId, bo.getClassTeacherId());
|
||||||
|
lqw.like(StringUtils.isNotBlank(bo.getClassTeacherName()), XgClassInfo::getClassTeacherName, bo.getClassTeacherName());
|
||||||
|
lqw.eq(StringUtils.isNotBlank(bo.getClassStatus()), XgClassInfo::getClassStatus, bo.getClassStatus());
|
||||||
|
lqw.eq(bo.getIsGraduation() != null, XgClassInfo::getIsGraduation, bo.getIsGraduation());
|
||||||
|
|
||||||
|
// 批量查询条件
|
||||||
|
lqw.in(bo.getClassCodeList() != null && !bo.getClassCodeList().isEmpty(), XgClassInfo::getClassCode, bo.getClassCodeList());
|
||||||
|
lqw.in(bo.getClassStatusList() != null && !bo.getClassStatusList().isEmpty(), XgClassInfo::getClassStatus, bo.getClassStatusList());
|
||||||
|
lqw.in(bo.getCollegeCodeList() != null && !bo.getCollegeCodeList().isEmpty(), XgClassInfo::getCollegeCode, bo.getCollegeCodeList());
|
||||||
|
lqw.in(bo.getMajorCodeList() != null && !bo.getMajorCodeList().isEmpty(), XgClassInfo::getMajorCode, bo.getMajorCodeList());
|
||||||
|
lqw.in(bo.getGradeList() != null && !bo.getGradeList().isEmpty(), XgClassInfo::getGrade, bo.getGradeList());
|
||||||
|
lqw.in(bo.getCounselorIdList() != null && !bo.getCounselorIdList().isEmpty(), XgClassInfo::getCounselorId, bo.getCounselorIdList());
|
||||||
|
lqw.in(bo.getClassTeacherIdList() != null && !bo.getClassTeacherIdList().isEmpty(), XgClassInfo::getClassTeacherId, bo.getClassTeacherIdList());
|
||||||
|
|
||||||
|
// 时间范围查询
|
||||||
|
lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null,
|
||||||
|
XgClassInfo::getCreateTime, params.get("beginCreateTime"), params.get("endCreateTime"));
|
||||||
|
|
||||||
|
return lqw;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增班级信息
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Boolean insertByBo(XgClassInfoBo bo) {
|
||||||
|
XgClassInfo add = MapstructUtils.convert(bo, XgClassInfo.class);
|
||||||
|
validEntityBeforeSave(add);
|
||||||
|
boolean flag = baseMapper.insert(add) > 0;
|
||||||
|
if (flag) {
|
||||||
|
bo.setId(add.getId());
|
||||||
|
}
|
||||||
|
return flag;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改班级信息
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Boolean updateByBo(XgClassInfoBo bo) {
|
||||||
|
XgClassInfo update = MapstructUtils.convert(bo, XgClassInfo.class);
|
||||||
|
validEntityBeforeSave(update);
|
||||||
|
return baseMapper.updateById(update) > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 保存前的数据校验
|
||||||
|
*/
|
||||||
|
private void validEntityBeforeSave(XgClassInfo entity) {
|
||||||
|
// 校验班级代码唯一性
|
||||||
|
if (StringUtils.isNotBlank(entity.getClassCode())) {
|
||||||
|
LambdaQueryWrapper<XgClassInfo> lqw = Wrappers.lambdaQuery();
|
||||||
|
lqw.eq(XgClassInfo::getClassCode, entity.getClassCode());
|
||||||
|
lqw.ne(entity.getId() != null, XgClassInfo::getId, entity.getId());
|
||||||
|
XgClassInfo existEntity = baseMapper.selectOne(lqw);
|
||||||
|
if (existEntity != null) {
|
||||||
|
throw new RuntimeException("班级代码已存在,请重新输入");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 设置默认值
|
||||||
|
if (entity.getClassType() == null) {
|
||||||
|
entity.setClassType("regular");
|
||||||
|
}
|
||||||
|
if (entity.getClassStatus() == null) {
|
||||||
|
entity.setClassStatus("1");
|
||||||
|
}
|
||||||
|
if (entity.getIsGraduation() == null) {
|
||||||
|
entity.setIsGraduation(0);
|
||||||
|
}
|
||||||
|
if (entity.getPlannedCapacity() == null) {
|
||||||
|
entity.setPlannedCapacity(50);
|
||||||
|
}
|
||||||
|
if (entity.getMaxStudentCount() == null) {
|
||||||
|
entity.setMaxStudentCount(entity.getPlannedCapacity());
|
||||||
|
}
|
||||||
|
if (entity.getCurrentStudentCount() == null) {
|
||||||
|
entity.setCurrentStudentCount(0);
|
||||||
|
}
|
||||||
|
if (entity.getMaleCount() == null) {
|
||||||
|
entity.setMaleCount(0);
|
||||||
|
}
|
||||||
|
if (entity.getFemaleCount() == null) {
|
||||||
|
entity.setFemaleCount(0);
|
||||||
|
}
|
||||||
|
if (entity.getActiveCount() == null) {
|
||||||
|
entity.setActiveCount(0);
|
||||||
|
}
|
||||||
|
if (entity.getTransferInCount() == null) {
|
||||||
|
entity.setTransferInCount(0);
|
||||||
|
}
|
||||||
|
if (entity.getTransferOutCount() == null) {
|
||||||
|
entity.setTransferOutCount(0);
|
||||||
|
}
|
||||||
|
if (entity.getDropoutCount() == null) {
|
||||||
|
entity.setDropoutCount(0);
|
||||||
|
}
|
||||||
|
if (entity.getGraduateCount() == null) {
|
||||||
|
entity.setGraduateCount(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量删除班级信息
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
|
||||||
|
if (isValid) {
|
||||||
|
// 校验是否存在学生关联
|
||||||
|
// TODO: 添加学生关联校验逻辑
|
||||||
|
}
|
||||||
|
return baseMapper.deleteBatchIds(ids) > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据班级代码查询班级信息
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public XgClassInfoVo queryByClassCode(String classCode) {
|
||||||
|
LambdaQueryWrapper<XgClassInfo> lqw = Wrappers.lambdaQuery();
|
||||||
|
lqw.eq(XgClassInfo::getClassCode, classCode);
|
||||||
|
return baseMapper.selectVoOne(lqw);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据年级查询班级信息列表
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public List<XgClassInfoVo> queryByGrade(String grade) {
|
||||||
|
LambdaQueryWrapper<XgClassInfo> lqw = Wrappers.lambdaQuery();
|
||||||
|
lqw.eq(XgClassInfo::getGrade, grade);
|
||||||
|
lqw.eq(XgClassInfo::getClassStatus, "1");
|
||||||
|
lqw.orderByAsc(XgClassInfo::getClassCode);
|
||||||
|
return baseMapper.selectVoList(lqw);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据学院代码查询班级信息列表
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public List<XgClassInfoVo> queryByCollegeCode(String collegeCode) {
|
||||||
|
LambdaQueryWrapper<XgClassInfo> lqw = Wrappers.lambdaQuery();
|
||||||
|
lqw.eq(XgClassInfo::getCollegeCode, collegeCode);
|
||||||
|
lqw.eq(XgClassInfo::getClassStatus, "1");
|
||||||
|
lqw.orderByAsc(XgClassInfo::getGrade, XgClassInfo::getClassCode);
|
||||||
|
return baseMapper.selectVoList(lqw);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据专业代码查询班级信息列表
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public List<XgClassInfoVo> queryByMajorCode(String majorCode) {
|
||||||
|
LambdaQueryWrapper<XgClassInfo> lqw = Wrappers.lambdaQuery();
|
||||||
|
lqw.eq(XgClassInfo::getMajorCode, majorCode);
|
||||||
|
lqw.eq(XgClassInfo::getClassStatus, "1");
|
||||||
|
lqw.orderByAsc(XgClassInfo::getGrade, XgClassInfo::getClassCode);
|
||||||
|
return baseMapper.selectVoList(lqw);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据辅导员ID查询班级信息列表
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public List<XgClassInfoVo> queryByCounselorId(Long counselorId) {
|
||||||
|
LambdaQueryWrapper<XgClassInfo> lqw = Wrappers.lambdaQuery();
|
||||||
|
lqw.eq(XgClassInfo::getCounselorId, counselorId);
|
||||||
|
lqw.eq(XgClassInfo::getClassStatus, "1");
|
||||||
|
lqw.orderByAsc(XgClassInfo::getGrade, XgClassInfo::getClassCode);
|
||||||
|
return baseMapper.selectVoList(lqw);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据班主任ID查询班级信息列表
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public List<XgClassInfoVo> queryByClassTeacherId(Long classTeacherId) {
|
||||||
|
LambdaQueryWrapper<XgClassInfo> lqw = Wrappers.lambdaQuery();
|
||||||
|
lqw.eq(XgClassInfo::getClassTeacherId, classTeacherId);
|
||||||
|
lqw.eq(XgClassInfo::getClassStatus, "1");
|
||||||
|
lqw.orderByAsc(XgClassInfo::getGrade, XgClassInfo::getClassCode);
|
||||||
|
return baseMapper.selectVoList(lqw);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取班级可用选项列表(用于下拉框)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public List<XgClassInfoVo> getClassOptions() {
|
||||||
|
LambdaQueryWrapper<XgClassInfo> lqw = Wrappers.lambdaQuery();
|
||||||
|
lqw.eq(XgClassInfo::getClassStatus, "1");
|
||||||
|
lqw.select(XgClassInfo::getId, XgClassInfo::getClassCode, XgClassInfo::getClassName,
|
||||||
|
XgClassInfo::getGrade, XgClassInfo::getMajorName, XgClassInfo::getCollegeName);
|
||||||
|
lqw.orderByAsc(XgClassInfo::getGrade, XgClassInfo::getClassCode);
|
||||||
|
return baseMapper.selectVoList(lqw);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新班级学生统计数据
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Boolean updateStudentCount(Long classId) {
|
||||||
|
// TODO: 实现学生统计数据更新逻辑
|
||||||
|
// 1. 查询班级下的学生数量
|
||||||
|
// 2. 统计男女学生数量
|
||||||
|
// 3. 统计在籍学生数量
|
||||||
|
// 4. 更新班级统计字段
|
||||||
|
|
||||||
|
XgClassInfo classInfo = baseMapper.selectById(classId);
|
||||||
|
if (classInfo != null) {
|
||||||
|
classInfo.setLastCountUpdate(LocalDateTime.now());
|
||||||
|
return baseMapper.updateById(classInfo) > 0;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量更新班级学生统计数据
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Boolean batchUpdateStudentCount(Collection<Long> classIds) {
|
||||||
|
boolean result = true;
|
||||||
|
for (Long classId : classIds) {
|
||||||
|
result = result && updateStudentCount(classId);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 启用班级
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Boolean enableClass(Long id) {
|
||||||
|
XgClassInfo classInfo = baseMapper.selectById(id);
|
||||||
|
if (classInfo != null) {
|
||||||
|
classInfo.setClassStatus("1");
|
||||||
|
return baseMapper.updateById(classInfo) > 0;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 禁用班级
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Boolean disableClass(Long id) {
|
||||||
|
XgClassInfo classInfo = baseMapper.selectById(id);
|
||||||
|
if (classInfo != null) {
|
||||||
|
classInfo.setClassStatus("0");
|
||||||
|
return baseMapper.updateById(classInfo) > 0;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ================================
|
||||||
|
// 统计数据接口实现 - 新增
|
||||||
|
// ================================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取班级信息统计概览
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Map<String, Object> getStatistics() {
|
||||||
|
Map<String, Object> result = new HashMap<>();
|
||||||
|
|
||||||
|
// 总班级数
|
||||||
|
LambdaQueryWrapper<XgClassInfo> totalLqw = Wrappers.lambdaQuery();
|
||||||
|
long totalCount = baseMapper.selectCount(totalLqw);
|
||||||
|
result.put("totalCount", totalCount);
|
||||||
|
|
||||||
|
// 正常班级数
|
||||||
|
LambdaQueryWrapper<XgClassInfo> activeLqw = Wrappers.lambdaQuery();
|
||||||
|
activeLqw.eq(XgClassInfo::getClassStatus, "1");
|
||||||
|
long activeCount = baseMapper.selectCount(activeLqw);
|
||||||
|
result.put("activeCount", activeCount);
|
||||||
|
|
||||||
|
// 暂停班级数
|
||||||
|
LambdaQueryWrapper<XgClassInfo> pausedLqw = Wrappers.lambdaQuery();
|
||||||
|
pausedLqw.eq(XgClassInfo::getClassStatus, "2");
|
||||||
|
long pausedCount = baseMapper.selectCount(pausedLqw);
|
||||||
|
result.put("pausedCount", pausedCount);
|
||||||
|
|
||||||
|
// 已毕业班级数
|
||||||
|
LambdaQueryWrapper<XgClassInfo> graduatedLqw = Wrappers.lambdaQuery();
|
||||||
|
graduatedLqw.eq(XgClassInfo::getClassStatus, "3");
|
||||||
|
long graduatedCount = baseMapper.selectCount(graduatedLqw);
|
||||||
|
result.put("graduatedCount", graduatedCount);
|
||||||
|
|
||||||
|
// 总学生数(统计当前学生数量字段的总和)
|
||||||
|
LambdaQueryWrapper<XgClassInfo> studentLqw = Wrappers.lambdaQuery();
|
||||||
|
studentLqw.select(XgClassInfo::getCurrentStudentCount);
|
||||||
|
List<XgClassInfo> classList = baseMapper.selectList(studentLqw);
|
||||||
|
long totalStudents = classList.stream()
|
||||||
|
.mapToLong(c -> c.getCurrentStudentCount() != null ? c.getCurrentStudentCount() : 0)
|
||||||
|
.sum();
|
||||||
|
result.put("totalStudents", totalStudents);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 统计各学院班级数量
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public List<Map<String, Object>> countByCollege() {
|
||||||
|
LambdaQueryWrapper<XgClassInfo> lqw = Wrappers.lambdaQuery();
|
||||||
|
lqw.select(XgClassInfo::getCollegeCode, XgClassInfo::getCollegeName)
|
||||||
|
.groupBy(XgClassInfo::getCollegeCode, XgClassInfo::getCollegeName);
|
||||||
|
|
||||||
|
List<XgClassInfo> list = baseMapper.selectList(lqw);
|
||||||
|
List<Map<String, Object>> result = new ArrayList<>();
|
||||||
|
|
||||||
|
for (XgClassInfo item : list) {
|
||||||
|
LambdaQueryWrapper<XgClassInfo> countLqw = Wrappers.lambdaQuery();
|
||||||
|
countLqw.eq(XgClassInfo::getCollegeCode, item.getCollegeCode());
|
||||||
|
long count = baseMapper.selectCount(countLqw);
|
||||||
|
|
||||||
|
Map<String, Object> map = new HashMap<>();
|
||||||
|
map.put("collegeCode", item.getCollegeCode());
|
||||||
|
map.put("collegeName", item.getCollegeName());
|
||||||
|
map.put("count", count);
|
||||||
|
result.add(map);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 统计各年级班级数量
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public List<Map<String, Object>> countByGrade() {
|
||||||
|
LambdaQueryWrapper<XgClassInfo> lqw = Wrappers.lambdaQuery();
|
||||||
|
lqw.select(XgClassInfo::getGrade)
|
||||||
|
.groupBy(XgClassInfo::getGrade);
|
||||||
|
|
||||||
|
List<XgClassInfo> list = baseMapper.selectList(lqw);
|
||||||
|
List<Map<String, Object>> result = new ArrayList<>();
|
||||||
|
|
||||||
|
for (XgClassInfo item : list) {
|
||||||
|
LambdaQueryWrapper<XgClassInfo> countLqw = Wrappers.lambdaQuery();
|
||||||
|
countLqw.eq(XgClassInfo::getGrade, item.getGrade());
|
||||||
|
long count = baseMapper.selectCount(countLqw);
|
||||||
|
|
||||||
|
Map<String, Object> map = new HashMap<>();
|
||||||
|
map.put("grade", item.getGrade());
|
||||||
|
map.put("count", count);
|
||||||
|
result.add(map);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 统计各专业班级数量
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public List<Map<String, Object>> countByMajor() {
|
||||||
|
LambdaQueryWrapper<XgClassInfo> lqw = Wrappers.lambdaQuery();
|
||||||
|
lqw.select(XgClassInfo::getMajorCode, XgClassInfo::getMajorName)
|
||||||
|
.groupBy(XgClassInfo::getMajorCode, XgClassInfo::getMajorName);
|
||||||
|
|
||||||
|
List<XgClassInfo> list = baseMapper.selectList(lqw);
|
||||||
|
List<Map<String, Object>> result = new ArrayList<>();
|
||||||
|
|
||||||
|
for (XgClassInfo item : list) {
|
||||||
|
LambdaQueryWrapper<XgClassInfo> countLqw = Wrappers.lambdaQuery();
|
||||||
|
countLqw.eq(XgClassInfo::getMajorCode, item.getMajorCode());
|
||||||
|
long count = baseMapper.selectCount(countLqw);
|
||||||
|
|
||||||
|
Map<String, Object> map = new HashMap<>();
|
||||||
|
map.put("majorCode", item.getMajorCode());
|
||||||
|
map.put("majorName", item.getMajorName());
|
||||||
|
map.put("count", count);
|
||||||
|
result.add(map);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 统计班级状态分布
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public List<Map<String, Object>> countByStatus() {
|
||||||
|
List<Map<String, Object>> result = new ArrayList<>();
|
||||||
|
|
||||||
|
// 状态码对应的名称
|
||||||
|
String[] statusCodes = {"1", "2", "3", "4"};
|
||||||
|
String[] statusNames = {"正常", "暂停", "毕业", "解散"};
|
||||||
|
|
||||||
|
for (int i = 0; i < statusCodes.length; i++) {
|
||||||
|
LambdaQueryWrapper<XgClassInfo> lqw = Wrappers.lambdaQuery();
|
||||||
|
lqw.eq(XgClassInfo::getClassStatus, statusCodes[i]);
|
||||||
|
long count = baseMapper.selectCount(lqw);
|
||||||
|
|
||||||
|
Map<String, Object> map = new HashMap<>();
|
||||||
|
map.put("statusCode", statusCodes[i]);
|
||||||
|
map.put("statusName", statusNames[i]);
|
||||||
|
map.put("count", count);
|
||||||
|
result.add(map);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,239 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
<!DOCTYPE mapper
|
||||||
|
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||||
|
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
|
<mapper namespace="org.dromara.xg.mapper.XgClassInfoMapper">
|
||||||
|
|
||||||
|
<resultMap type="org.dromara.xg.domain.vo.XgClassInfoVo" id="XgClassInfoVoResult">
|
||||||
|
<result property="id" column="id"/>
|
||||||
|
<result property="classCode" column="class_code"/>
|
||||||
|
<result property="className" column="class_name"/>
|
||||||
|
<result property="classType" column="class_type"/>
|
||||||
|
<result property="grade" column="grade"/>
|
||||||
|
<result property="enrollmentYear" column="enrollment_year"/>
|
||||||
|
<result property="graduationYear" column="graduation_year"/>
|
||||||
|
<result property="majorCode" column="major_code"/>
|
||||||
|
<result property="majorName" column="major_name"/>
|
||||||
|
<result property="trainingType" column="training_type"/>
|
||||||
|
<result property="degreeType" column="degree_type"/>
|
||||||
|
<result property="collegeCode" column="college_code"/>
|
||||||
|
<result property="collegeName" column="college_name"/>
|
||||||
|
<result property="counselorId" column="counselor_id"/>
|
||||||
|
<result property="counselorName" column="counselor_name"/>
|
||||||
|
<result property="classTeacherId" column="class_teacher_id"/>
|
||||||
|
<result property="classTeacherName" column="class_teacher_name"/>
|
||||||
|
<result property="classAdvisorId" column="class_advisor_id"/>
|
||||||
|
<result property="classAdvisorName" column="class_advisor_name"/>
|
||||||
|
<result property="classMonitorId" column="class_monitor_id"/>
|
||||||
|
<result property="classMonitorName" column="class_monitor_name"/>
|
||||||
|
<result property="deputyMonitorId" column="deputy_monitor_id"/>
|
||||||
|
<result property="deputyMonitorName" column="deputy_monitor_name"/>
|
||||||
|
<result property="classStatus" column="class_status"/>
|
||||||
|
<result property="isGraduation" column="is_graduation"/>
|
||||||
|
<result property="graduationDate" column="graduation_date"/>
|
||||||
|
<result property="plannedCapacity" column="planned_capacity"/>
|
||||||
|
<result property="currentStudentCount" column="current_student_count"/>
|
||||||
|
<result property="maxStudentCount" column="max_student_count"/>
|
||||||
|
<result property="maleCount" column="male_count"/>
|
||||||
|
<result property="femaleCount" column="female_count"/>
|
||||||
|
<result property="activeCount" column="active_count"/>
|
||||||
|
<result property="transferInCount" column="transfer_in_count"/>
|
||||||
|
<result property="transferOutCount" column="transfer_out_count"/>
|
||||||
|
<result property="dropoutCount" column="dropout_count"/>
|
||||||
|
<result property="graduateCount" column="graduate_count"/>
|
||||||
|
<result property="officeLocation" column="office_location"/>
|
||||||
|
<result property="classLocation" column="class_location"/>
|
||||||
|
<result property="contactPhone" column="contact_phone"/>
|
||||||
|
<result property="qqGroup" column="qq_group"/>
|
||||||
|
<result property="wechatGroup" column="wechat_group"/>
|
||||||
|
<result property="email" column="email"/>
|
||||||
|
<result property="classSchedule" column="class_schedule"/>
|
||||||
|
<result property="classCulture" column="class_culture"/>
|
||||||
|
<result property="classRules" column="class_rules"/>
|
||||||
|
<result property="classDescription" column="class_description"/>
|
||||||
|
<result property="lastCountUpdate" column="last_count_update"/>
|
||||||
|
<result property="extField1" column="ext_field1"/>
|
||||||
|
<result property="extField2" column="ext_field2"/>
|
||||||
|
<result property="extField3" column="ext_field3"/>
|
||||||
|
<result property="remark" column="remark"/>
|
||||||
|
<result property="createBy" column="create_by"/>
|
||||||
|
<result property="createTime" column="create_time"/>
|
||||||
|
<result property="updateBy" column="update_by"/>
|
||||||
|
<result property="updateTime" column="update_time"/>
|
||||||
|
</resultMap>
|
||||||
|
|
||||||
|
<!-- 自定义分页查询方法 - 移除tenant_id字段查询,但保留WHERE条件 -->
|
||||||
|
<select id="selectVoPage" resultMap="XgClassInfoVoResult">
|
||||||
|
<!-- 调试信息:开始执行班级信息自定义分页查询 -->
|
||||||
|
SELECT
|
||||||
|
id, class_code, class_name, class_type, grade, enrollment_year, graduation_year,
|
||||||
|
major_code, major_name, training_type, degree_type, college_code, college_name,
|
||||||
|
counselor_id, counselor_name, class_teacher_id, class_teacher_name,
|
||||||
|
class_advisor_id, class_advisor_name, class_monitor_id, class_monitor_name,
|
||||||
|
deputy_monitor_id, deputy_monitor_name, class_status, is_graduation, graduation_date,
|
||||||
|
planned_capacity, current_student_count, max_student_count, male_count, female_count,
|
||||||
|
active_count, transfer_in_count, transfer_out_count, dropout_count, graduate_count,
|
||||||
|
office_location, class_location, contact_phone, qq_group, wechat_group, email,
|
||||||
|
class_schedule, class_culture, class_rules, class_description, last_count_update,
|
||||||
|
ext_field1, ext_field2, ext_field3, remark,
|
||||||
|
create_by, create_time, update_by, update_time
|
||||||
|
FROM xg_class_info
|
||||||
|
WHERE deleted = 0 AND tenant_id = '000000'
|
||||||
|
<if test="ew != null and ew.sqlSegment != null and ew.sqlSegment != '' and !ew.sqlSegment.trim().toUpperCase().startsWith('ORDER BY')">
|
||||||
|
AND ${ew.sqlSegment}
|
||||||
|
</if>
|
||||||
|
<if test="ew != null and ew.sqlSegment != null and ew.sqlSegment != '' and ew.sqlSegment.trim().toUpperCase().startsWith('ORDER BY')">
|
||||||
|
${ew.sqlSegment}
|
||||||
|
</if>
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<!-- 自定义详情查询方法 - 移除tenant_id字段查询,但保留WHERE条件 -->
|
||||||
|
<select id="selectVoById" parameterType="java.io.Serializable" resultMap="XgClassInfoVoResult">
|
||||||
|
SELECT
|
||||||
|
id, class_code, class_name, class_type, grade, enrollment_year, graduation_year,
|
||||||
|
major_code, major_name, training_type, degree_type, college_code, college_name,
|
||||||
|
counselor_id, counselor_name, class_teacher_id, class_teacher_name,
|
||||||
|
class_advisor_id, class_advisor_name, class_monitor_id, class_monitor_name,
|
||||||
|
deputy_monitor_id, deputy_monitor_name, class_status, is_graduation, graduation_date,
|
||||||
|
planned_capacity, current_student_count, max_student_count, male_count, female_count,
|
||||||
|
active_count, transfer_in_count, transfer_out_count, dropout_count, graduate_count,
|
||||||
|
office_location, class_location, contact_phone, qq_group, wechat_group, email,
|
||||||
|
class_schedule, class_culture, class_rules, class_description, last_count_update,
|
||||||
|
ext_field1, ext_field2, ext_field3, remark,
|
||||||
|
create_by, create_time, update_by, update_time
|
||||||
|
FROM xg_class_info
|
||||||
|
WHERE id = #{id}
|
||||||
|
AND deleted = 0
|
||||||
|
AND tenant_id = '000000'
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<sql id="selectXgClassInfoVo">
|
||||||
|
select id, class_code, class_name, class_type, grade, enrollment_year, graduation_year,
|
||||||
|
major_code, major_name, training_type, degree_type, college_code, college_name,
|
||||||
|
counselor_id, counselor_name, class_teacher_id, class_teacher_name,
|
||||||
|
class_advisor_id, class_advisor_name, class_monitor_id, class_monitor_name,
|
||||||
|
deputy_monitor_id, deputy_monitor_name, class_status, is_graduation, graduation_date,
|
||||||
|
planned_capacity, current_student_count, max_student_count, male_count, female_count,
|
||||||
|
active_count, transfer_in_count, transfer_out_count, dropout_count, graduate_count,
|
||||||
|
office_location, class_location, contact_phone, qq_group, wechat_group, email,
|
||||||
|
class_schedule, class_culture, class_rules, class_description, last_count_update,
|
||||||
|
ext_field1, ext_field2, ext_field3, remark, create_by, create_time, update_by, update_time
|
||||||
|
from xg_class_info
|
||||||
|
</sql>
|
||||||
|
|
||||||
|
<!-- 根据班级代码查询班级信息 -->
|
||||||
|
<select id="selectByClassCode" parameterType="String" resultMap="XgClassInfoVoResult">
|
||||||
|
SELECT * FROM xg_class_info
|
||||||
|
WHERE class_code = #{classCode}
|
||||||
|
AND deleted = 0
|
||||||
|
AND tenant_id = '000000'
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<!-- 查询指定年级的班级列表 -->
|
||||||
|
<select id="selectByGrade" parameterType="String" resultMap="XgClassInfoVoResult">
|
||||||
|
SELECT * FROM xg_class_info
|
||||||
|
WHERE grade = #{grade}
|
||||||
|
AND deleted = 0
|
||||||
|
AND tenant_id = '000000'
|
||||||
|
AND class_status = '1'
|
||||||
|
ORDER BY class_code
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<!-- 查询指定学院的班级列表 -->
|
||||||
|
<select id="selectByCollegeCode" parameterType="String" resultMap="XgClassInfoVoResult">
|
||||||
|
SELECT * FROM xg_class_info
|
||||||
|
WHERE college_code = #{collegeCode}
|
||||||
|
AND deleted = 0
|
||||||
|
AND tenant_id = '000000'
|
||||||
|
AND class_status = '1'
|
||||||
|
ORDER BY grade, class_code
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<!-- 查询指定专业的班级列表 -->
|
||||||
|
<select id="selectByMajorCode" parameterType="String" resultMap="XgClassInfoVoResult">
|
||||||
|
SELECT * FROM xg_class_info
|
||||||
|
WHERE major_code = #{majorCode}
|
||||||
|
AND deleted = 0
|
||||||
|
AND tenant_id = '000000'
|
||||||
|
AND class_status = '1'
|
||||||
|
ORDER BY grade, class_code
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<!-- 查询指定辅导员的班级列表 -->
|
||||||
|
<select id="selectByCounselorId" parameterType="Long" resultMap="XgClassInfoVoResult">
|
||||||
|
SELECT * FROM xg_class_info
|
||||||
|
WHERE counselor_id = #{counselorId}
|
||||||
|
AND deleted = 0
|
||||||
|
AND tenant_id = '000000'
|
||||||
|
AND class_status = '1'
|
||||||
|
ORDER BY grade, class_code
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<!-- 查询指定班主任的班级列表 -->
|
||||||
|
<select id="selectByClassTeacherId" parameterType="Long" resultMap="XgClassInfoVoResult">
|
||||||
|
SELECT * FROM xg_class_info
|
||||||
|
WHERE class_teacher_id = #{classTeacherId}
|
||||||
|
AND deleted = 0
|
||||||
|
AND tenant_id = '000000'
|
||||||
|
AND class_status = '1'
|
||||||
|
ORDER BY grade, class_code
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<!-- 统计各学院班级数量 -->
|
||||||
|
<select id="countByCollege" resultType="java.util.Map">
|
||||||
|
SELECT
|
||||||
|
college_code,
|
||||||
|
college_name,
|
||||||
|
COUNT(*) as count
|
||||||
|
FROM xg_class_info
|
||||||
|
WHERE deleted = 0
|
||||||
|
AND tenant_id = '000000'
|
||||||
|
GROUP BY college_code, college_name
|
||||||
|
ORDER BY count DESC
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<!-- 统计各年级班级数量 -->
|
||||||
|
<select id="countByGrade" resultType="java.util.Map">
|
||||||
|
SELECT
|
||||||
|
grade,
|
||||||
|
COUNT(*) as count
|
||||||
|
FROM xg_class_info
|
||||||
|
WHERE deleted = 0
|
||||||
|
AND tenant_id = '000000'
|
||||||
|
GROUP BY grade
|
||||||
|
ORDER BY grade
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<!-- 统计各专业班级数量 -->
|
||||||
|
<select id="countByMajor" resultType="java.util.Map">
|
||||||
|
SELECT
|
||||||
|
major_code,
|
||||||
|
major_name,
|
||||||
|
COUNT(*) as count
|
||||||
|
FROM xg_class_info
|
||||||
|
WHERE deleted = 0
|
||||||
|
AND tenant_id = '000000'
|
||||||
|
GROUP BY major_code, major_name
|
||||||
|
ORDER BY count DESC
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<!-- 统计班级状态分布 -->
|
||||||
|
<select id="countByClassStatus" resultType="java.util.Map">
|
||||||
|
SELECT
|
||||||
|
class_status,
|
||||||
|
CASE
|
||||||
|
WHEN class_status = '1' THEN '正常'
|
||||||
|
WHEN class_status = '2' THEN '暂停'
|
||||||
|
WHEN class_status = '3' THEN '毕业'
|
||||||
|
WHEN class_status = '4' THEN '解散'
|
||||||
|
ELSE '未知'
|
||||||
|
END as status_name,
|
||||||
|
COUNT(*) as count
|
||||||
|
FROM xg_class_info
|
||||||
|
WHERE deleted = 0
|
||||||
|
AND tenant_id = '000000'
|
||||||
|
GROUP BY class_status
|
||||||
|
ORDER BY class_status
|
||||||
|
</select>
|
||||||
|
|
||||||
|
</mapper>
|
||||||
@@ -0,0 +1,287 @@
|
|||||||
|
import request from '@/utils/request'
|
||||||
|
import { AxiosPromise } from 'axios'
|
||||||
|
import { ClassInfoVO, ClassInfoQuery, ClassInfoForm, OptionData } from './classInfo/types'
|
||||||
|
|
||||||
|
// 通用类型定义
|
||||||
|
interface TableDataInfo<T> {
|
||||||
|
code: number;
|
||||||
|
msg: string;
|
||||||
|
rows: T[];
|
||||||
|
total: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface R<T> {
|
||||||
|
code: number;
|
||||||
|
msg: string;
|
||||||
|
data: T;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询班级信息列表
|
||||||
|
*/
|
||||||
|
export const listClassInfo = (query: ClassInfoQuery): AxiosPromise<TableDataInfo<ClassInfoVO>> => {
|
||||||
|
return request({
|
||||||
|
url: '/xg/classInfo/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询班级信息详细
|
||||||
|
*/
|
||||||
|
export const getClassInfo = (id: string | number): AxiosPromise<R<ClassInfoVO>> => {
|
||||||
|
return request({
|
||||||
|
url: '/xg/classInfo/' + id,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增班级信息
|
||||||
|
*/
|
||||||
|
export const addClassInfo = (data: ClassInfoForm): AxiosPromise<R<void>> => {
|
||||||
|
return request({
|
||||||
|
url: '/xg/classInfo',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改班级信息
|
||||||
|
*/
|
||||||
|
export const updateClassInfo = (data: ClassInfoForm): AxiosPromise<R<void>> => {
|
||||||
|
return request({
|
||||||
|
url: '/xg/classInfo',
|
||||||
|
method: 'put',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除班级信息
|
||||||
|
*/
|
||||||
|
export const delClassInfo = (id: string | number | Array<string | number>): AxiosPromise<R<void>> => {
|
||||||
|
return request({
|
||||||
|
url: '/xg/classInfo/' + id,
|
||||||
|
method: 'delete'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导出班级信息
|
||||||
|
*/
|
||||||
|
export const exportClassInfo = (query: ClassInfoQuery): AxiosPromise<any> => {
|
||||||
|
return request({
|
||||||
|
url: '/xg/classInfo/export',
|
||||||
|
method: 'post',
|
||||||
|
data: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据班级代码查询班级信息
|
||||||
|
*/
|
||||||
|
export const getClassInfoByCode = (classCode: string): AxiosPromise<R<ClassInfoVO>> => {
|
||||||
|
return request({
|
||||||
|
url: '/xg/classInfo/getByClassCode/' + classCode,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据年级查询班级信息列表
|
||||||
|
*/
|
||||||
|
export const getClassInfoByGrade = (grade: string): AxiosPromise<R<ClassInfoVO[]>> => {
|
||||||
|
return request({
|
||||||
|
url: '/xg/classInfo/getByGrade/' + grade,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据学院代码查询班级信息列表
|
||||||
|
*/
|
||||||
|
export const getClassInfoByCollege = (collegeCode: string): AxiosPromise<R<ClassInfoVO[]>> => {
|
||||||
|
return request({
|
||||||
|
url: '/xg/classInfo/getByCollegeCode/' + collegeCode,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据专业代码查询班级信息列表
|
||||||
|
*/
|
||||||
|
export const getClassInfoByMajor = (majorCode: string): AxiosPromise<R<ClassInfoVO[]>> => {
|
||||||
|
return request({
|
||||||
|
url: '/xg/classInfo/getByMajorCode/' + majorCode,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据辅导员ID查询班级信息列表
|
||||||
|
*/
|
||||||
|
export const getClassInfoByCounselor = (counselorId: number): AxiosPromise<R<ClassInfoVO[]>> => {
|
||||||
|
return request({
|
||||||
|
url: '/xg/classInfo/getByCounselorId/' + counselorId,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据班主任ID查询班级信息列表
|
||||||
|
*/
|
||||||
|
export const getClassInfoByClassTeacher = (classTeacherId: number): AxiosPromise<R<ClassInfoVO[]>> => {
|
||||||
|
return request({
|
||||||
|
url: '/xg/classInfo/getByClassTeacherId/' + classTeacherId,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取班级选项列表(用于下拉框)
|
||||||
|
*/
|
||||||
|
export const getClassOptions = (): AxiosPromise<R<ClassInfoVO[]>> => {
|
||||||
|
return request({
|
||||||
|
url: '/xg/classInfo/getClassOptions', // 修正路径:从 /options 改为 /getClassOptions
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新班级学生统计
|
||||||
|
*/
|
||||||
|
export const updateStudentCount = (classId: number): AxiosPromise<R<void>> => {
|
||||||
|
return request({
|
||||||
|
url: '/xg/classInfo/updateStudentCount/' + classId,
|
||||||
|
method: 'post' // 修正HTTP方法:从 put 改为 post
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量更新班级学生统计
|
||||||
|
*/
|
||||||
|
export const batchUpdateStudentCount = (classIds: number[]): AxiosPromise<R<void>> => {
|
||||||
|
return request({
|
||||||
|
url: '/xg/classInfo/batchUpdateStudentCount',
|
||||||
|
method: 'post', // 修正HTTP方法:从 put 改为 post
|
||||||
|
data: classIds
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 启用班级
|
||||||
|
*/
|
||||||
|
export const enableClass = (id: number): AxiosPromise<R<void>> => {
|
||||||
|
return request({
|
||||||
|
url: '/xg/classInfo/enable/' + id,
|
||||||
|
method: 'post' // 修正HTTP方法:从 put 改为 post
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 禁用班级
|
||||||
|
*/
|
||||||
|
export const disableClass = (id: number): AxiosPromise<R<void>> => {
|
||||||
|
return request({
|
||||||
|
url: '/xg/classInfo/disable/' + id,
|
||||||
|
method: 'post' // 修正HTTP方法:从 put 改为 post
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// ================================
|
||||||
|
// 统计数据接口 - 新增
|
||||||
|
// ================================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取班级信息统计概览
|
||||||
|
*/
|
||||||
|
export const getClassStatistics = (): AxiosPromise<R<any>> => {
|
||||||
|
return request({
|
||||||
|
url: '/xg/classInfo/statistics',
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 统计各学院班级数量
|
||||||
|
*/
|
||||||
|
export const countClassByCollege = (): AxiosPromise<R<any[]>> => {
|
||||||
|
return request({
|
||||||
|
url: '/xg/classInfo/statistics/college',
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 统计各年级班级数量
|
||||||
|
*/
|
||||||
|
export const countClassByGrade = (): AxiosPromise<R<any[]>> => {
|
||||||
|
return request({
|
||||||
|
url: '/xg/classInfo/statistics/grade',
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 统计各专业班级数量
|
||||||
|
*/
|
||||||
|
export const countClassByMajor = (): AxiosPromise<R<any[]>> => {
|
||||||
|
return request({
|
||||||
|
url: '/xg/classInfo/statistics/major',
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 统计班级状态分布
|
||||||
|
*/
|
||||||
|
export const countClassByStatus = (): AxiosPromise<R<any[]>> => {
|
||||||
|
return request({
|
||||||
|
url: '/xg/classInfo/statistics/status',
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取学院选项
|
||||||
|
*/
|
||||||
|
export const getCollegeOptions = (): AxiosPromise<R<any[]>> => {
|
||||||
|
return request({
|
||||||
|
url: '/xg/studentInfo/options/colleges',
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取专业选项
|
||||||
|
*/
|
||||||
|
export const getMajorOptions = (collegeCode?: string): AxiosPromise<R<any[]>> => {
|
||||||
|
return request({
|
||||||
|
url: '/xg/studentInfo/options/majors',
|
||||||
|
method: 'get',
|
||||||
|
params: { collegeCode }
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取辅导员选项
|
||||||
|
*/
|
||||||
|
export const getCounselorOptions = (): AxiosPromise<R<any[]>> => {
|
||||||
|
return request({
|
||||||
|
url: '/xg/studentInfo/options/counselors',
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取班主任选项
|
||||||
|
*/
|
||||||
|
export const getClassTeacherOptions = (): AxiosPromise<R<any[]>> => {
|
||||||
|
return request({
|
||||||
|
url: '/xg/studentInfo/options/classTeachers',
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -0,0 +1,786 @@
|
|||||||
|
/**
|
||||||
|
* 班级信息管理模块 - 类型定义
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级信息 VO
|
||||||
|
*/
|
||||||
|
export interface ClassInfoVO {
|
||||||
|
/**
|
||||||
|
* 主键ID
|
||||||
|
*/
|
||||||
|
id: string | number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 租户编号
|
||||||
|
*/
|
||||||
|
tenantId?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级代码
|
||||||
|
*/
|
||||||
|
classCode: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级名称
|
||||||
|
*/
|
||||||
|
className: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级类型:regular-普通班级,honor-荣誉班级,experimental-实验班级,special-特殊班级
|
||||||
|
*/
|
||||||
|
classType?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 年级
|
||||||
|
*/
|
||||||
|
grade: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 入学年份
|
||||||
|
*/
|
||||||
|
enrollmentYear: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 毕业年份
|
||||||
|
*/
|
||||||
|
graduationYear?: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 专业代码
|
||||||
|
*/
|
||||||
|
majorCode?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 专业名称
|
||||||
|
*/
|
||||||
|
majorName?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 培养方式:全日制、在职、函授、夜大等
|
||||||
|
*/
|
||||||
|
trainingType?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 学位类型:本科、专科、研究生等
|
||||||
|
*/
|
||||||
|
degreeType?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 学院代码
|
||||||
|
*/
|
||||||
|
collegeCode?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 学院名称
|
||||||
|
*/
|
||||||
|
collegeName?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 辅导员ID
|
||||||
|
*/
|
||||||
|
counselorId?: string | number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 辅导员姓名
|
||||||
|
*/
|
||||||
|
counselorName?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班主任ID
|
||||||
|
*/
|
||||||
|
classTeacherId?: string | number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班主任姓名
|
||||||
|
*/
|
||||||
|
classTeacherName?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级导师ID
|
||||||
|
*/
|
||||||
|
classAdvisorId?: string | number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级导师姓名
|
||||||
|
*/
|
||||||
|
classAdvisorName?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班长ID
|
||||||
|
*/
|
||||||
|
classMonitorId?: string | number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班长姓名
|
||||||
|
*/
|
||||||
|
classMonitorName?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 副班长ID
|
||||||
|
*/
|
||||||
|
deputyMonitorId?: string | number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 副班长姓名
|
||||||
|
*/
|
||||||
|
deputyMonitorName?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级状态:1-正常,2-暂停,3-毕业,4-解散
|
||||||
|
*/
|
||||||
|
classStatus?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否毕业:0-未毕业,1-已毕业
|
||||||
|
*/
|
||||||
|
isGraduation?: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 毕业日期
|
||||||
|
*/
|
||||||
|
graduationDate?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 计划容量
|
||||||
|
*/
|
||||||
|
plannedCapacity?: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当前学生数量
|
||||||
|
*/
|
||||||
|
currentStudentCount?: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 最大学生数量
|
||||||
|
*/
|
||||||
|
maxStudentCount?: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 男生数量
|
||||||
|
*/
|
||||||
|
maleCount?: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 女生数量
|
||||||
|
*/
|
||||||
|
femaleCount?: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 在籍学生数量
|
||||||
|
*/
|
||||||
|
activeCount?: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转入学生数量
|
||||||
|
*/
|
||||||
|
transferInCount?: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转出学生数量
|
||||||
|
*/
|
||||||
|
transferOutCount?: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 退学学生数量
|
||||||
|
*/
|
||||||
|
dropoutCount?: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 毕业学生数量
|
||||||
|
*/
|
||||||
|
graduateCount?: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 办公室位置
|
||||||
|
*/
|
||||||
|
officeLocation?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 教室位置
|
||||||
|
*/
|
||||||
|
classLocation?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 联系电话
|
||||||
|
*/
|
||||||
|
contactPhone?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* QQ群号
|
||||||
|
*/
|
||||||
|
qqGroup?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 微信群
|
||||||
|
*/
|
||||||
|
wechatGroup?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 邮箱
|
||||||
|
*/
|
||||||
|
email?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 课程安排
|
||||||
|
*/
|
||||||
|
classSchedule?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级文化
|
||||||
|
*/
|
||||||
|
classCulture?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级规章制度
|
||||||
|
*/
|
||||||
|
classRules?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级描述
|
||||||
|
*/
|
||||||
|
classDescription?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 最后统计更新时间
|
||||||
|
*/
|
||||||
|
lastCountUpdate?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 扩展字段1
|
||||||
|
*/
|
||||||
|
extField1?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 扩展字段2
|
||||||
|
*/
|
||||||
|
extField2?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 扩展字段3
|
||||||
|
*/
|
||||||
|
extField3?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 备注
|
||||||
|
*/
|
||||||
|
remark?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建者
|
||||||
|
*/
|
||||||
|
createBy?: string | number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建时间
|
||||||
|
*/
|
||||||
|
createTime?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新者
|
||||||
|
*/
|
||||||
|
updateBy?: string | number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新时间
|
||||||
|
*/
|
||||||
|
updateTime?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级信息查询对象
|
||||||
|
*/
|
||||||
|
export interface ClassInfoQuery {
|
||||||
|
/**
|
||||||
|
* 当前页数
|
||||||
|
*/
|
||||||
|
pageNum?: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 每页显示记录数
|
||||||
|
*/
|
||||||
|
pageSize?: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级代码
|
||||||
|
*/
|
||||||
|
classCode?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级名称
|
||||||
|
*/
|
||||||
|
className?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级类型
|
||||||
|
*/
|
||||||
|
classType?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 年级
|
||||||
|
*/
|
||||||
|
grade?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 入学年份
|
||||||
|
*/
|
||||||
|
enrollmentYear?: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 毕业年份
|
||||||
|
*/
|
||||||
|
graduationYear?: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 学院代码
|
||||||
|
*/
|
||||||
|
collegeCode?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 学院名称
|
||||||
|
*/
|
||||||
|
collegeName?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 专业代码
|
||||||
|
*/
|
||||||
|
majorCode?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 专业名称
|
||||||
|
*/
|
||||||
|
majorName?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班主任ID
|
||||||
|
*/
|
||||||
|
classTeacherId?: string | number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班主任姓名
|
||||||
|
*/
|
||||||
|
classTeacherName?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 辅导员ID
|
||||||
|
*/
|
||||||
|
counselorId?: string | number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 辅导员姓名
|
||||||
|
*/
|
||||||
|
counselorName?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级状态
|
||||||
|
*/
|
||||||
|
classStatus?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级代码列表(批量查询)
|
||||||
|
*/
|
||||||
|
classCodeList?: string[];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级状态列表(批量查询)
|
||||||
|
*/
|
||||||
|
classStatusList?: string[];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 入学年份开始
|
||||||
|
*/
|
||||||
|
enrollmentYearStart?: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 入学年份结束
|
||||||
|
*/
|
||||||
|
enrollmentYearEnd?: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建时间开始
|
||||||
|
*/
|
||||||
|
createTimeStart?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建时间结束
|
||||||
|
*/
|
||||||
|
createTimeEnd?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级信息表单对象
|
||||||
|
*/
|
||||||
|
export interface ClassInfoForm {
|
||||||
|
/**
|
||||||
|
* 主键ID
|
||||||
|
*/
|
||||||
|
id?: string | number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级代码
|
||||||
|
*/
|
||||||
|
classCode?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级名称
|
||||||
|
*/
|
||||||
|
className?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级类型
|
||||||
|
*/
|
||||||
|
classType?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 年级
|
||||||
|
*/
|
||||||
|
grade?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 入学年份
|
||||||
|
*/
|
||||||
|
enrollmentYear?: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 毕业年份
|
||||||
|
*/
|
||||||
|
graduationYear?: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 专业代码
|
||||||
|
*/
|
||||||
|
majorCode?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 专业名称
|
||||||
|
*/
|
||||||
|
majorName?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 培养方式
|
||||||
|
*/
|
||||||
|
trainingType?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 学位类型
|
||||||
|
*/
|
||||||
|
degreeType?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 学院代码
|
||||||
|
*/
|
||||||
|
collegeCode?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 学院名称
|
||||||
|
*/
|
||||||
|
collegeName?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 辅导员ID
|
||||||
|
*/
|
||||||
|
counselorId?: string | number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 辅导员姓名
|
||||||
|
*/
|
||||||
|
counselorName?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班主任ID
|
||||||
|
*/
|
||||||
|
classTeacherId?: string | number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班主任姓名
|
||||||
|
*/
|
||||||
|
classTeacherName?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级导师ID
|
||||||
|
*/
|
||||||
|
classAdvisorId?: string | number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级导师姓名
|
||||||
|
*/
|
||||||
|
classAdvisorName?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班长ID
|
||||||
|
*/
|
||||||
|
classMonitorId?: string | number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班长姓名
|
||||||
|
*/
|
||||||
|
classMonitorName?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 副班长ID
|
||||||
|
*/
|
||||||
|
deputyMonitorId?: string | number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 副班长姓名
|
||||||
|
*/
|
||||||
|
deputyMonitorName?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级状态
|
||||||
|
*/
|
||||||
|
classStatus?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否毕业
|
||||||
|
*/
|
||||||
|
isGraduation?: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 毕业日期
|
||||||
|
*/
|
||||||
|
graduationDate?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 计划容量
|
||||||
|
*/
|
||||||
|
plannedCapacity?: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当前学生数量
|
||||||
|
*/
|
||||||
|
currentStudentCount?: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 最大学生数量
|
||||||
|
*/
|
||||||
|
maxStudentCount?: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 男生数量
|
||||||
|
*/
|
||||||
|
maleCount?: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 女生数量
|
||||||
|
*/
|
||||||
|
femaleCount?: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 在籍学生数量
|
||||||
|
*/
|
||||||
|
activeCount?: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转入学生数量
|
||||||
|
*/
|
||||||
|
transferInCount?: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转出学生数量
|
||||||
|
*/
|
||||||
|
transferOutCount?: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 退学学生数量
|
||||||
|
*/
|
||||||
|
dropoutCount?: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 毕业学生数量
|
||||||
|
*/
|
||||||
|
graduateCount?: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 办公室位置
|
||||||
|
*/
|
||||||
|
officeLocation?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 教室位置
|
||||||
|
*/
|
||||||
|
classLocation?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 联系电话
|
||||||
|
*/
|
||||||
|
contactPhone?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* QQ群号
|
||||||
|
*/
|
||||||
|
qqGroup?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 微信群
|
||||||
|
*/
|
||||||
|
wechatGroup?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 邮箱
|
||||||
|
*/
|
||||||
|
email?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 课程安排
|
||||||
|
*/
|
||||||
|
classSchedule?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级文化
|
||||||
|
*/
|
||||||
|
classCulture?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级规章制度
|
||||||
|
*/
|
||||||
|
classRules?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级描述
|
||||||
|
*/
|
||||||
|
classDescription?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 最后统计更新时间
|
||||||
|
*/
|
||||||
|
lastCountUpdate?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 扩展字段1
|
||||||
|
*/
|
||||||
|
extField1?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 扩展字段2
|
||||||
|
*/
|
||||||
|
extField2?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 扩展字段3
|
||||||
|
*/
|
||||||
|
extField3?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 备注
|
||||||
|
*/
|
||||||
|
remark?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级统计数据
|
||||||
|
*/
|
||||||
|
export interface ClassStatisticsData {
|
||||||
|
/**
|
||||||
|
* 总班级数
|
||||||
|
*/
|
||||||
|
totalCount: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 正常班级数
|
||||||
|
*/
|
||||||
|
activeCount: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 已毕业班级数
|
||||||
|
*/
|
||||||
|
graduatedCount: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 暂停班级数
|
||||||
|
*/
|
||||||
|
suspendedCount: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 解散班级数
|
||||||
|
*/
|
||||||
|
dissolvedCount: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 总学生数
|
||||||
|
*/
|
||||||
|
totalStudentCount: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 平均班级人数
|
||||||
|
*/
|
||||||
|
averageClassSize: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级选项数据
|
||||||
|
*/
|
||||||
|
export interface OptionData {
|
||||||
|
/**
|
||||||
|
* 值
|
||||||
|
*/
|
||||||
|
value: string | number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 标签
|
||||||
|
*/
|
||||||
|
label: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否禁用
|
||||||
|
*/
|
||||||
|
disabled?: boolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 扩展数据
|
||||||
|
*/
|
||||||
|
data?: any;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 班级图表数据
|
||||||
|
*/
|
||||||
|
export interface ClassChartData {
|
||||||
|
/**
|
||||||
|
* 类别
|
||||||
|
*/
|
||||||
|
category: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 数值
|
||||||
|
*/
|
||||||
|
value: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 颜色
|
||||||
|
*/
|
||||||
|
color?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 百分比
|
||||||
|
*/
|
||||||
|
percentage?: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量操作结果
|
||||||
|
*/
|
||||||
|
export interface BatchOperationResult {
|
||||||
|
/**
|
||||||
|
* 总数
|
||||||
|
*/
|
||||||
|
total: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 成功数
|
||||||
|
*/
|
||||||
|
success: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 失败数
|
||||||
|
*/
|
||||||
|
failed: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 失败的记录
|
||||||
|
*/
|
||||||
|
failedRecords?: Array<{
|
||||||
|
id: string | number;
|
||||||
|
reason: string;
|
||||||
|
}>;
|
||||||
|
}
|
||||||
@@ -0,0 +1,217 @@
|
|||||||
|
# 班级信息管理模块
|
||||||
|
|
||||||
|
## 📋 模块说明
|
||||||
|
|
||||||
|
- **模块名称**: 班级信息管理 (Class Information Management)
|
||||||
|
- **模块简称**: classInfo
|
||||||
|
- **对应后端**: backend/ruoyi-modules/ruoyi-xg-xx/
|
||||||
|
- **对应API**: web/src/api/xg-xx/classInfo.ts
|
||||||
|
|
||||||
|
## 🎯 功能概述
|
||||||
|
|
||||||
|
班级信息管理模块提供完整的班级信息管理功能,包括:
|
||||||
|
|
||||||
|
### 📊 统计概览
|
||||||
|
- 总班级数统计
|
||||||
|
- 正常班级数统计
|
||||||
|
- 总学生数统计
|
||||||
|
- 平均学生数统计
|
||||||
|
|
||||||
|
### 🔍 查询功能
|
||||||
|
- 班级代码、班级名称模糊查询
|
||||||
|
- 年级、学院、专业级联查询
|
||||||
|
- 班级类型、班级状态筛选
|
||||||
|
- 班主任姓名查询
|
||||||
|
|
||||||
|
### 📝 基础管理
|
||||||
|
- 班级信息新增、修改、删除
|
||||||
|
- 班级信息详情查看
|
||||||
|
- 班级信息批量导出
|
||||||
|
|
||||||
|
### 👥 人员配置
|
||||||
|
- 班主任、辅导员配置
|
||||||
|
- 班干部信息管理(班长、学习委员、生活委员等)
|
||||||
|
- 联系方式管理
|
||||||
|
|
||||||
|
### 📈 统计功能
|
||||||
|
- 学生数量统计更新
|
||||||
|
- 批量统计刷新
|
||||||
|
- 实时数据同步
|
||||||
|
|
||||||
|
## 🎨 页面设计
|
||||||
|
|
||||||
|
### 页面布局
|
||||||
|
- **搜索区域**: 8个搜索条件,支持组合查询
|
||||||
|
- **统计卡片**: 4个统计指标,渐变色彩设计
|
||||||
|
- **表格区域**: 完整的班级信息展示
|
||||||
|
- **操作按钮**: 查看、编辑、删除、统计更新
|
||||||
|
|
||||||
|
### 对话框设计
|
||||||
|
- **新增/编辑**: 分页签设计(基本信息、人员配置、联系方式)
|
||||||
|
- **详情查看**: 描述列表展示完整信息
|
||||||
|
- **响应式布局**: 适配不同屏幕尺寸
|
||||||
|
|
||||||
|
## 🔧 技术特性
|
||||||
|
|
||||||
|
### 前端技术
|
||||||
|
- **Vue 3.5.13** + **TypeScript 5.8.3**
|
||||||
|
- **Element Plus** UI组件库
|
||||||
|
- **Composition API** 组合式API
|
||||||
|
- **响应式设计** 适配多端
|
||||||
|
|
||||||
|
### 样式设计
|
||||||
|
- **参考后勤管理模块** 保持风格一致
|
||||||
|
- **渐变色卡片** 美观的统计展示
|
||||||
|
- **悬停效果** 良好的交互体验
|
||||||
|
- **操作按钮** 图标化设计
|
||||||
|
|
||||||
|
### 数据处理
|
||||||
|
- **级联选择** 学院-专业联动
|
||||||
|
- **表单验证** 完整的输入校验
|
||||||
|
- **状态管理** 响应式数据更新
|
||||||
|
- **错误处理** 友好的错误提示
|
||||||
|
|
||||||
|
## 📋 API接口
|
||||||
|
|
||||||
|
### 16个标准API接口
|
||||||
|
|
||||||
|
#### 基础CRUD接口
|
||||||
|
1. `GET /list` - 查询班级信息列表
|
||||||
|
2. `POST /export` - 导出班级信息列表
|
||||||
|
3. `GET /{id}` - 获取班级信息详情
|
||||||
|
4. `POST /` - 新增班级信息
|
||||||
|
5. `PUT /` - 修改班级信息
|
||||||
|
6. `DELETE /{ids}` - 删除班级信息
|
||||||
|
|
||||||
|
#### 业务查询接口
|
||||||
|
7. `GET /getByClassCode/{classCode}` - 根据班级代码查询
|
||||||
|
8. `GET /getByGrade/{grade}` - 根据年级查询
|
||||||
|
9. `GET /getByCollegeCode/{collegeCode}` - 根据学院代码查询
|
||||||
|
10. `GET /getByMajorCode/{majorCode}` - 根据专业代码查询
|
||||||
|
11. `GET /getByCounselorId/{counselorId}` - 根据辅导员ID查询
|
||||||
|
12. `GET /getByClassTeacherId/{classTeacherId}` - 根据班主任ID查询
|
||||||
|
|
||||||
|
#### 辅助功能接口
|
||||||
|
13. `GET /getClassOptions` - 获取班级选项列表
|
||||||
|
14. `POST /updateStudentCount/{id}` - 更新班级学生统计
|
||||||
|
15. `POST /batchUpdateStudentCount` - 批量更新学生统计
|
||||||
|
16. `POST /enable/{id}` 和 `POST /disable/{id}` - 启用/禁用班级
|
||||||
|
|
||||||
|
## 🎯 权限控制
|
||||||
|
|
||||||
|
### 权限编码
|
||||||
|
- `xg:classInfo:list` - 班级信息查询
|
||||||
|
- `xg:classInfo:query` - 班级信息详情
|
||||||
|
- `xg:classInfo:add` - 班级信息新增
|
||||||
|
- `xg:classInfo:edit` - 班级信息修改
|
||||||
|
- `xg:classInfo:remove` - 班级信息删除
|
||||||
|
- `xg:classInfo:export` - 班级信息导出
|
||||||
|
|
||||||
|
### 按钮权限
|
||||||
|
- 所有操作按钮都配置了对应的权限控制
|
||||||
|
- 使用 `v-hasPermi` 指令进行权限验证
|
||||||
|
- 无权限时自动隐藏相关按钮
|
||||||
|
|
||||||
|
## 📊 数据字典
|
||||||
|
|
||||||
|
### 班级类型 (xg_class_type)
|
||||||
|
- `regular` - 普通班级
|
||||||
|
- `honor` - 荣誉班级
|
||||||
|
- `experimental` - 实验班级
|
||||||
|
- `special` - 特殊班级
|
||||||
|
|
||||||
|
### 班级状态 (xg_class_status)
|
||||||
|
- `1` - 正常
|
||||||
|
- `2` - 暂停
|
||||||
|
- `3` - 毕业
|
||||||
|
- `4` - 解散
|
||||||
|
|
||||||
|
### 年级选项 (xg_grade_options)
|
||||||
|
- 支持动态配置年级选项
|
||||||
|
- 适配不同学制需求
|
||||||
|
|
||||||
|
## 🔄 数据流程
|
||||||
|
|
||||||
|
### 查询流程
|
||||||
|
1. 用户输入查询条件
|
||||||
|
2. 前端组装查询参数
|
||||||
|
3. 调用列表查询API
|
||||||
|
4. 后端返回分页数据
|
||||||
|
5. 前端渲染表格和统计
|
||||||
|
|
||||||
|
### 新增/修改流程
|
||||||
|
1. 用户填写表单信息
|
||||||
|
2. 前端表单验证
|
||||||
|
3. 调用新增/修改API
|
||||||
|
4. 后端业务处理
|
||||||
|
5. 返回操作结果
|
||||||
|
6. 刷新列表和统计
|
||||||
|
|
||||||
|
### 统计更新流程
|
||||||
|
1. 用户点击统计更新
|
||||||
|
2. 调用统计更新API
|
||||||
|
3. 后端重新计算学生数
|
||||||
|
4. 更新班级统计信息
|
||||||
|
5. 返回最新统计数据
|
||||||
|
|
||||||
|
## 🎨 样式规范
|
||||||
|
|
||||||
|
### 色彩设计
|
||||||
|
- **主色调**: 蓝色系 (#409eff)
|
||||||
|
- **统计卡片**: 渐变色设计
|
||||||
|
- **状态标签**: 语义化颜色
|
||||||
|
- **交互效果**: 悬停和点击反馈
|
||||||
|
|
||||||
|
### 布局规范
|
||||||
|
- **页面间距**: 8px 外边距
|
||||||
|
- **组件间距**: 10px 组件间距
|
||||||
|
- **表格样式**: 斑马纹和悬停效果
|
||||||
|
- **按钮样式**: 图标化小按钮
|
||||||
|
|
||||||
|
### 响应式设计
|
||||||
|
- **搜索区域**: 4列布局,支持响应式
|
||||||
|
- **统计卡片**: 4列布局,移动端自适应
|
||||||
|
- **表格列**: 固定宽度和自适应结合
|
||||||
|
- **对话框**: 固定宽度,内容自适应
|
||||||
|
|
||||||
|
## 📝 使用说明
|
||||||
|
|
||||||
|
### 基本操作
|
||||||
|
1. **查询班级**: 使用搜索条件筛选班级信息
|
||||||
|
2. **新增班级**: 点击"新增班级"按钮,填写班级信息
|
||||||
|
3. **修改班级**: 点击表格行的"编辑"按钮
|
||||||
|
4. **查看详情**: 双击表格行或点击"查看"按钮
|
||||||
|
5. **删除班级**: 选择班级后点击"删除"按钮
|
||||||
|
|
||||||
|
### 高级功能
|
||||||
|
1. **批量操作**: 选择多个班级进行批量删除
|
||||||
|
2. **导出数据**: 根据查询条件导出Excel文件
|
||||||
|
3. **统计更新**: 手动更新班级学生统计数据
|
||||||
|
4. **级联查询**: 学院-专业联动查询
|
||||||
|
|
||||||
|
### 注意事项
|
||||||
|
- 班级代码必须唯一,系统会自动校验
|
||||||
|
- 删除班级前请确认该班级下无学生信息
|
||||||
|
- 统计数据会定期自动更新,也可手动刷新
|
||||||
|
- 导出功能会根据当前查询条件生成文件
|
||||||
|
|
||||||
|
## 🚀 扩展功能
|
||||||
|
|
||||||
|
### 计划功能
|
||||||
|
- 班级学生管理集成
|
||||||
|
- 班级活动管理
|
||||||
|
- 班级成绩统计
|
||||||
|
- 班级考勤管理
|
||||||
|
|
||||||
|
### 技术优化
|
||||||
|
- 虚拟滚动优化大数据量
|
||||||
|
- 缓存机制提升查询性能
|
||||||
|
- 实时数据推送
|
||||||
|
- 移动端适配优化
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**📅 创建时间**: 2025-01-01
|
||||||
|
**👨💻 开发者**: Cursor AI
|
||||||
|
**📝 版本**: v1.0.0
|
||||||
|
**🔄 更新**: 持续迭代中
|
||||||
File diff suppressed because it is too large.
Load diff
Reference in new issue
Block a user