添加了时段表,用作排课,以及作为课表使用

This commit is contained in:
Guan 2025-11-24 16:40:32 +08:00
parent f6267d7138
commit f612d41347
94 changed files with 4191 additions and 491 deletions

View File

@ -55,6 +55,8 @@
</dependency>
</dependencies>
<!-- 插件管理 -->
<build>
<plugins>

View File

@ -1,23 +0,0 @@
package com.mdd.admin.config;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class JacksonConfig {
@Bean
public ObjectMapper objectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
// 1. 下划线转驼峰解决命名不一致问题
objectMapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE);
// 2. 忽略未知属性解决前端多余字段的警告/异常
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
return objectMapper;
}
}

View File

@ -0,0 +1,69 @@
package com.mdd.admin.controller;
import com.mdd.admin.aop.Log;
import com.mdd.admin.service.IClassroomService;
import com.mdd.admin.validate.commons.IdValidate;
import com.mdd.admin.validate.ClassroomCreateValidate;
import com.mdd.admin.validate.ClassroomUpdateValidate;
import com.mdd.admin.validate.ClassroomSearchValidate;
import com.mdd.admin.validate.commons.PageValidate;
import com.mdd.admin.vo.ClassroomListedVo;
import com.mdd.admin.vo.ClassroomDetailVo;
import com.mdd.common.core.AjaxResult;
import com.mdd.common.core.PageResult;
import com.mdd.common.validator.annotation.IDMust;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@RestController
@RequestMapping("adminapi/classroom")
@Api(tags = "教室管理")
public class ClassroomController {
@Resource
IClassroomService iClassroomService;
@GetMapping("/list")
@ApiOperation(value="教室列表")
public AjaxResult<PageResult<ClassroomListedVo>> list(@Validated PageValidate pageValidate,
@Validated ClassroomSearchValidate searchValidate) {
PageResult<ClassroomListedVo> list = iClassroomService.list(pageValidate, searchValidate);
return AjaxResult.success(list);
}
@GetMapping("/detail")
@ApiOperation(value="教室详情")
public AjaxResult<ClassroomDetailVo> detail(@Validated @IDMust() @RequestParam("id") Integer id) {
ClassroomDetailVo detail = iClassroomService.detail(id);
return AjaxResult.success(detail);
}
@Log(title = "教室新增")
@PostMapping("/add")
@ApiOperation(value="教室新增")
public AjaxResult<Object> add(@Validated @RequestBody ClassroomCreateValidate createValidate) {
iClassroomService.add(createValidate);
return AjaxResult.success();
}
@Log(title = "教室编辑")
@PostMapping("/edit")
@ApiOperation(value="教室编辑")
public AjaxResult<Object> edit(@Validated @RequestBody ClassroomUpdateValidate updateValidate) {
iClassroomService.edit(updateValidate);
return AjaxResult.success();
}
@Log(title = "教室删除")
@PostMapping("/del")
@ApiOperation(value="教室删除")
public AjaxResult<Object> del(@Validated @RequestBody IdValidate idValidate) {
iClassroomService.del(idValidate.getId());
return AjaxResult.success();
}
}

View File

@ -0,0 +1,69 @@
package com.mdd.admin.controller;
import com.mdd.admin.aop.Log;
import com.mdd.admin.service.IClassroomTypeService;
import com.mdd.admin.validate.commons.IdValidate;
import com.mdd.admin.validate.ClassroomTypeCreateValidate;
import com.mdd.admin.validate.ClassroomTypeUpdateValidate;
import com.mdd.admin.validate.ClassroomTypeSearchValidate;
import com.mdd.admin.validate.commons.PageValidate;
import com.mdd.admin.vo.ClassroomTypeListedVo;
import com.mdd.admin.vo.ClassroomTypeDetailVo;
import com.mdd.common.core.AjaxResult;
import com.mdd.common.core.PageResult;
import com.mdd.common.validator.annotation.IDMust;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@RestController
@RequestMapping("adminapi/type")
@Api(tags = "教室类型管理")
public class ClassroomTypeController {
@Resource
IClassroomTypeService iClassroomTypeService;
@GetMapping("/list")
@ApiOperation(value="教室类型列表")
public AjaxResult<PageResult<ClassroomTypeListedVo>> list(@Validated PageValidate pageValidate,
@Validated ClassroomTypeSearchValidate searchValidate) {
PageResult<ClassroomTypeListedVo> list = iClassroomTypeService.list(pageValidate, searchValidate);
return AjaxResult.success(list);
}
@GetMapping("/detail")
@ApiOperation(value="教室类型详情")
public AjaxResult<ClassroomTypeDetailVo> detail(@Validated @IDMust() @RequestParam("id") Integer id) {
ClassroomTypeDetailVo detail = iClassroomTypeService.detail(id);
return AjaxResult.success(detail);
}
@Log(title = "教室类型新增")
@PostMapping("/add")
@ApiOperation(value="教室类型新增")
public AjaxResult<Object> add(@Validated @RequestBody ClassroomTypeCreateValidate createValidate) {
iClassroomTypeService.add(createValidate);
return AjaxResult.success();
}
@Log(title = "教室类型编辑")
@PostMapping("/edit")
@ApiOperation(value="教室类型编辑")
public AjaxResult<Object> edit(@Validated @RequestBody ClassroomTypeUpdateValidate updateValidate) {
iClassroomTypeService.edit(updateValidate);
return AjaxResult.success();
}
@Log(title = "教室类型删除")
@PostMapping("/del")
@ApiOperation(value="教室类型删除")
public AjaxResult<Object> del(@Validated @RequestBody IdValidate idValidate) {
iClassroomTypeService.del(idValidate.getId());
return AjaxResult.success();
}
}

View File

@ -1,6 +1,8 @@
package com.mdd.admin.controller;
import com.alibaba.fastjson2.JSONObject;
import com.mdd.admin.aop.Log;
import com.mdd.admin.dto.ExcelErrorDTO;
import com.mdd.admin.service.ICourseService;
import com.mdd.admin.validate.commons.IdValidate;
import com.mdd.admin.validate.course.CourseCreateValidate;
@ -11,13 +13,18 @@ import com.mdd.admin.vo.course.CourseListedVo;
import com.mdd.admin.vo.course.CourseDetailVo;
import com.mdd.common.core.AjaxResult;
import com.mdd.common.core.PageResult;
import com.mdd.common.enums.ErrorEnum;
import com.mdd.common.exception.OperateException;
import com.mdd.common.util.UrlUtils;
import com.mdd.common.validator.annotation.IDMust;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.util.List;
@RestController
@RequestMapping("adminapi/course")
@ -66,4 +73,68 @@ public class CourseController {
return AjaxResult.success();
}
@Log(title = "获取课程导入模板")
@GetMapping("/template")
@ApiOperation(value = "获取课程导入模板")
public AjaxResult<Object> downloadTemplate(){
String path = UrlUtils.toAdminAbsoluteUrl("/template/课程导入表.xlsx");
return AjaxResult.success(2, new JSONObject() {{
put("url", path);
}}, ErrorEnum.SHOW_MSG.getCode());
}
@Log(title = "上传课程导入模板")
@PostMapping("/upload.template")
@ApiOperation(value = "上传课程导入模板")
public AjaxResult<Object> uploadTemplate(@RequestParam("file")MultipartFile file) {
iCourseService.upload(file);
return AjaxResult.success("成功上传导入模板");
}
@Log(title = "检查导入课程信息")
@PostMapping(value = "/batch.add")
@ApiOperation(value = "检查导入课程信息")
public AjaxResult<Object> checkByExcel(@RequestParam("file") MultipartFile file) {
// 1. 基础校验文件非空
if (file == null || file.isEmpty()) {
throw new OperateException("上传文件不能为空");
}
// 2. 基础校验文件格式
String fileName = file.getOriginalFilename();
if (fileName == null || (!fileName.endsWith(".xlsx") && !fileName.endsWith(".xls"))) {
throw new OperateException("只支持.xls和.xlsx格式的文件");
}
try {
List<ExcelErrorDTO> errorList = iCourseService.checkExcel(file);
if (errorList.isEmpty()) {
List<ExcelErrorDTO> newCourseType = iCourseService.checkCourseType(file);
if(newCourseType.isEmpty()) {
iCourseService.addByExcel(file);
return AjaxResult.success("课程信息校验通过,已添加新课程");
}
else return AjaxResult.success(202, "发现未定义的课程类型", newCourseType);
}
else {
// 有错误返回错误列表前端可展示每行错误
return AjaxResult.failed(403,"课程信息校验未通过", errorList);
}
} catch (OperateException e) {
// 业务异常返回具体原因
return AjaxResult.failed(e.getMessage());
} catch (Exception e) {
// 系统异常返回通用提示
return AjaxResult.failed("系统异常,请联系管理员" + e.getMessage());
}
}
}

View File

@ -0,0 +1,69 @@
package com.mdd.admin.controller;
import com.mdd.admin.aop.Log;
import com.mdd.admin.service.ICourseTypeService;
import com.mdd.admin.validate.commons.IdValidate;
import com.mdd.admin.validate.course.CourseTypeCreateValidate;
import com.mdd.admin.validate.course.CourseTypeUpdateValidate;
import com.mdd.admin.validate.course.CourseTypeSearchValidate;
import com.mdd.admin.validate.commons.PageValidate;
import com.mdd.admin.vo.course.CourseTypeListedVo;
import com.mdd.admin.vo.course.CourseTypeDetailVo;
import com.mdd.common.core.AjaxResult;
import com.mdd.common.core.PageResult;
import com.mdd.common.validator.annotation.IDMust;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@RestController
@RequestMapping("adminapi/course.type")
@Api(tags = "课程类型管理")
public class CourseTypeController {
@Resource
ICourseTypeService iCourseTypeService;
@GetMapping("/list")
@ApiOperation(value="课程类型列表")
public AjaxResult<PageResult<CourseTypeListedVo>> list(@Validated PageValidate pageValidate,
@Validated CourseTypeSearchValidate searchValidate) {
PageResult<CourseTypeListedVo> list = iCourseTypeService.list(pageValidate, searchValidate);
return AjaxResult.success(list);
}
@GetMapping("/detail")
@ApiOperation(value="课程类型详情")
public AjaxResult<CourseTypeDetailVo> detail(@Validated @IDMust() @RequestParam("id") Integer id) {
CourseTypeDetailVo detail = iCourseTypeService.detail(id);
return AjaxResult.success(detail);
}
@Log(title = "课程类型新增")
@PostMapping("/add")
@ApiOperation(value="课程类型新增")
public AjaxResult<Object> add(@Validated @RequestBody CourseTypeCreateValidate createValidate) {
iCourseTypeService.add(createValidate);
return AjaxResult.success();
}
@Log(title = "课程类型编辑")
@PostMapping("/edit")
@ApiOperation(value="课程类型编辑")
public AjaxResult<Object> edit(@Validated @RequestBody CourseTypeUpdateValidate updateValidate) {
iCourseTypeService.edit(updateValidate);
return AjaxResult.success();
}
@Log(title = "课程类型删除")
@PostMapping("/del")
@ApiOperation(value="课程类型删除")
public AjaxResult<Object> del(@Validated @RequestBody IdValidate idValidate) {
iCourseTypeService.del(idValidate.getId());
return AjaxResult.success();
}
}

View File

@ -0,0 +1,69 @@
package com.mdd.admin.controller;
import com.mdd.admin.aop.Log;
import com.mdd.admin.service.IEquipmentRequirementService;
import com.mdd.admin.validate.commons.IdValidate;
import com.mdd.admin.validate.equipmentRequirement.EquipmentRequirementCreateValidate;
import com.mdd.admin.validate.equipmentRequirement.EquipmentRequirementUpdateValidate;
import com.mdd.admin.validate.equipmentRequirement.EquipmentRequirementSearchValidate;
import com.mdd.admin.validate.commons.PageValidate;
import com.mdd.admin.vo.EquipmentRequirementListedVo;
import com.mdd.admin.vo.EquipmentRequirementDetailVo;
import com.mdd.common.core.AjaxResult;
import com.mdd.common.core.PageResult;
import com.mdd.common.validator.annotation.IDMust;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@RestController
@RequestMapping("adminapi/requirement")
@Api(tags = "设备要求管理")
public class EquipmentRequirementController {
@Resource
IEquipmentRequirementService iEquipmentRequirementService;
@GetMapping("/list")
@ApiOperation(value="设备要求列表")
public AjaxResult<PageResult<EquipmentRequirementListedVo>> list(@Validated PageValidate pageValidate,
@Validated EquipmentRequirementSearchValidate searchValidate) {
PageResult<EquipmentRequirementListedVo> list = iEquipmentRequirementService.list(pageValidate, searchValidate);
return AjaxResult.success(list);
}
@GetMapping("/detail")
@ApiOperation(value="设备要求详情")
public AjaxResult<EquipmentRequirementDetailVo> detail(@Validated @IDMust() @RequestParam("id") Integer id) {
EquipmentRequirementDetailVo detail = iEquipmentRequirementService.detail(id);
return AjaxResult.success(detail);
}
@Log(title = "设备要求新增")
@PostMapping("/add")
@ApiOperation(value="设备要求新增")
public AjaxResult<Object> add(@Validated @RequestBody EquipmentRequirementCreateValidate createValidate) {
iEquipmentRequirementService.add(createValidate);
return AjaxResult.success();
}
@Log(title = "设备要求编辑")
@PostMapping("/edit")
@ApiOperation(value="设备要求编辑")
public AjaxResult<Object> edit(@Validated @RequestBody EquipmentRequirementUpdateValidate updateValidate) {
iEquipmentRequirementService.edit(updateValidate);
return AjaxResult.success();
}
@Log(title = "设备要求删除")
@PostMapping("/del")
@ApiOperation(value="设备要求删除")
public AjaxResult<Object> del(@Validated @RequestBody IdValidate idValidate) {
iEquipmentRequirementService.del(idValidate.getId());
return AjaxResult.success();
}
}

View File

@ -3,12 +3,13 @@ package com.mdd.admin.controller;
import com.mdd.admin.aop.Log;
import com.mdd.admin.service.IStudentInfoService;
import com.mdd.admin.validate.commons.IdValidate;
import com.mdd.admin.validate.student.StudentInfoCreateValidate;
import com.mdd.admin.validate.student.StudentInfoUpdateValidate;
import com.mdd.admin.validate.student.StudentInfoSearchValidate;
import com.mdd.admin.validate.StudentInfoCreateValidate;
import com.mdd.admin.validate.StudentInfoUpdateValidate;
import com.mdd.admin.validate.StudentInfoSearchValidate;
import com.mdd.admin.validate.commons.NumValidate;
import com.mdd.admin.validate.commons.PageValidate;
import com.mdd.admin.vo.student.StudentInfoListedVo;
import com.mdd.admin.vo.student.StudentInfoDetailVo;
import com.mdd.admin.vo.StudentInfoListedVo;
import com.mdd.admin.vo.StudentInfoDetailVo;
import com.mdd.common.core.AjaxResult;
import com.mdd.common.core.PageResult;
import com.mdd.common.validator.annotation.IDMust;
@ -66,11 +67,11 @@ public class StudentInfoController {
return AjaxResult.success();
}
@PostMapping("/create.random.info/")
@ApiOperation("创建随机学生信息(测试用)")
public AjaxResult<Object> createRandomInfo(Integer num) {
iStudentInfoService.createRandomInfo(num);
return AjaxResult.success("成功创建个"+num+"个学生");
@Log(title = "添加随机学生信息")
@PostMapping("/create.random.info")
@ApiOperation(value = "添加随机学生信息")
public AjaxResult<Object> createRandomInfo(@Validated @RequestBody NumValidate numValidate) {
iStudentInfoService.createRandomInfo(numValidate.getNum());
return AjaxResult.success();
}
}

View File

@ -0,0 +1,71 @@
package com.mdd.admin.controller;
import com.mdd.admin.aop.Log;
import com.mdd.admin.service.ITimeSlotService;
import com.mdd.admin.validate.*;
import com.mdd.admin.vo.TimeSlotListedVo;
import com.mdd.admin.vo.TimeSlotDetailVo;
import com.mdd.common.core.AjaxResult;
import com.mdd.common.validator.annotation.IDMust;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
@RestController
@RequestMapping("adminapi/slot")
@Api(tags = "时间段管理")
public class TimeSlotController {
@Resource
ITimeSlotService iTimeSlotService;
@GetMapping("/list")
@ApiOperation(value="时间段列表")
public AjaxResult<List<TimeSlotListedVo>> list() {
List<TimeSlotListedVo> list = iTimeSlotService.list();
return AjaxResult.success(list);
}
@GetMapping("/detail")
@ApiOperation(value="时间段详情")
public AjaxResult<TimeSlotDetailVo> detail(@Validated @IDMust() @RequestParam("id") Integer id) {
TimeSlotDetailVo detail = iTimeSlotService.detail(id);
return AjaxResult.success(detail);
}
@Log(title = "插入节次")
@PostMapping("/insert")
@ApiOperation(value="插入节次")
public AjaxResult<Object> insert(@Validated @RequestBody TimeSlotInsertValidate insertValidate) {
iTimeSlotService.insert(insertValidate);
return AjaxResult.success();
}
@Log(title = "修改节次")
@PostMapping("/edit")
@ApiOperation(value="时间段编辑")
public AjaxResult<Object> edit(@Validated @RequestBody TimeSlotForRowUpdateValidate updateValidate) {
iTimeSlotService.edit(updateValidate);
return AjaxResult.success();
}
@Log(title = "删除节次")
@PostMapping("/del")
@ApiOperation(value="时间段删除")
public AjaxResult<Object> del(@Validated @RequestBody TimeSlotSectionDelValidate sectionDelValidate) {
iTimeSlotService.del(sectionDelValidate.getCount());
return AjaxResult.success();
}
@Log(title = "统一节次时长")
@PostMapping("/uniform")
@ApiOperation(value = "统一节次时长")
public AjaxResult<Object> uniform(@Validated @RequestBody TimeSlotUniformValidate uniformValidate) {
iTimeSlotService.uniform(uniformValidate, null,1);
return AjaxResult.success();
}
}

View File

@ -79,7 +79,7 @@ public class UploadController {
for (MultipartFile file : files) {
StorageDriver storageDriver = new StorageDriver();
UploadFilesVo vo = storageDriver.upload(file, "image", AlbumEnum.Doc.getCode());
UploadFilesVo vo = storageDriver.upload(file, "file", AlbumEnum.Doc.getCode());
Map<String, String> album = new LinkedHashMap<>();
album.put("aid", String.valueOf(LikeAdminThreadLocal.getAdminId()));
album.put("cid", cid);

View File

@ -0,0 +1,64 @@
package com.mdd.admin.dto;
import com.alibaba.excel.annotation.ExcelProperty;
import javax.validation.constraints.*;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.math.BigDecimal;
@Setter
@Getter
public class CourseExcelDTO implements Serializable {
private static final long serialVersionUID = 1L;
@ExcelProperty("序号") // 对应Excel列名
@NotNull(message = "序号不能为空")
@Min(value = 1, message = "序号必须大于0")
private Integer order;
@ExcelProperty("课程代码")
@NotBlank(message = "课程代码不能为空")
@Size(max = 20, message = "课程代码长度不能超过20个字符")
private String courseCode;
@ExcelProperty("课程名称")
@NotBlank(message = "课程名称不能为空")
@Size(max = 50, message = "课程名称长度不能超过50个字符")
private String courseName;
@ExcelProperty("课程类型")
@NotBlank(message = "课程类型不能为空")
private String courseType;
@ExcelProperty("学分")
@NotNull(message = "学分不能为空")
@DecimalMin(value = "0.5", message = "学分不能小于0.5")
@DecimalMax(value = "10.0", message = "学分不能大于10.0")
private BigDecimal credits;
@ExcelProperty("总学时")
@NotNull(message = "总学时不能为空")
@Min(value = 1, message = "总学时必须大于0")
@Max(value = 200, message = "总学时不能超过200")
private Integer totalHours;
@ExcelProperty("每次连上节数")
@NotNull(message = "每次连上节数不能为空")
@Min(value = 1, message = "每次连上节数必须大于0")
@Max(value = 4, message = "每次连上节数不能超过4")
private Integer durationPerSession;
@ExcelProperty("每周次数")
@NotNull(message = "每周次数不能为空")
@Min(value = 1, message = "每周次数必须大于0")
@Max(value = 7, message = "每周次数不能超过7")
private Integer sessionsPerWeek;
@ExcelProperty("课程描述")
@Size(max = 200, message = "课程描述长度不能超过200个字符")
private String description;
}

View File

@ -0,0 +1,18 @@
package com.mdd.admin.dto;
import lombok.Data;
import java.io.Serializable;
@Data
public class ExcelErrorDTO implements Serializable {
private static final long serialVersionUID = 1L;
/** Excel实际行号用户可见非程序索引 */
private Integer rowNum;
/** Excel列名如"课程代码" */
private String columnName;
/** 错误原因(如"课程代码不能为空" */
private String errorMsg;
}

View File

@ -0,0 +1,16 @@
package com.mdd.admin.dto;
import lombok.Data;
import java.time.LocalTime;
@Data
public class TimeSlotCreateDTO {
private String slotCode; // 时间段代码
private Integer dayOfWeek; // 星期几
private LocalTime startTime; // 开始时间
private LocalTime endTime; // 结束时间
private String slotName; // 节次名
private Integer section; // 节次
private Integer isScheduled; // 是否排课
}

View File

@ -0,0 +1,176 @@
package com.mdd.admin.excelListener.course;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.exception.ExcelAnalysisException;
import com.alibaba.excel.exception.ExcelDataConvertException;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import com.mdd.admin.dto.CourseExcelDTO;
import com.mdd.admin.dto.ExcelErrorDTO;
import lombok.Getter;
import javax.validation.ConstraintViolation;
import javax.validation.Validator;
import java.lang.reflect.Field;
import java.util.*;
/**
* 课程Excel数据验证监听器
* 负责读取Excel数据并进行验证不执行实际的数据导入
*/
public class CourseExcelValidationListener extends AnalysisEventListener<CourseExcelDTO> {
/** JSR380校验器 */
private final Validator validator;
/** 错误信息列表
* -- GETTER --
* 获取所有错误信息
*/
@Getter
private final List<ExcelErrorDTO> errorList = new ArrayList<>();
/** DTO字段名 -> Excel列名 映射(用于报错时显示列名) */
private final Map<String, String> fieldColumnMap;
/** 起始行 跳过了表头 示例数据 */
private final int start = 2;
// 构造方法注入校验器
public CourseExcelValidationListener(Validator validator) {
this.validator = validator;
this.fieldColumnMap = buildFieldColumnMap();
}
/** 反射构建DTO字段与Excel列名的映射基于@ExcelProperty注解 */
private Map<String, String> buildFieldColumnMap() {
Map<String, String> map = new HashMap<>();
Field[] fields = CourseExcelDTO.class.getDeclaredFields();
for (Field field : fields) {
com.alibaba.excel.annotation.ExcelProperty excelProperty = field.getAnnotation(com.alibaba.excel.annotation.ExcelProperty.class);
if (excelProperty != null && excelProperty.value().length > 0) {
map.put(field.getName(), excelProperty.value()[0]);
}
}
return map;
}
/** 逐行校验Excel数据核心方法 */
@Override
public void invoke(CourseExcelDTO data, AnalysisContext context) {
// 1. 先获取当前数据行的程序索引
int dataRowIndex = context.readRowHolder().getRowIndex();
// 2. 跳过示例行
if (dataRowIndex < start) {
return;
}
if (isRowEmpty(data)) {
return; // 空行终止当前行处理
}
// 1. JSR380注解规则校验不能为空长度限制等
Set<ConstraintViolation<CourseExcelDTO>> violations = validator.validate(data);
for (ConstraintViolation<CourseExcelDTO> violation : violations) {
ExcelErrorDTO error = new ExcelErrorDTO();
error.setRowNum(dataRowIndex-1);
String fieldName = violation.getPropertyPath().toString(); // 违反规则的字段名
error.setColumnName(fieldColumnMap.getOrDefault(fieldName, fieldName)); // 对应Excel列名
error.setErrorMsg(violation.getMessage()); // 注解配置的错误信息
errorList.add(error);
}
}
/**
* 核心判断当前行是否为空行所有字段均为空/空白
* 可根据实际需求调整比如允许部分非必填字段为空只判断必填字段是否全空
*/
private boolean isRowEmpty(CourseExcelDTO data) {
if (data == null) {
return true;
}
// 遍历DTO所有核心字段判断是否均为空根据CourseExcelDTO字段类型适配
return isEmpty(data.getOrder()) // Integer
&& isEmpty(data.getCourseCode()) // String
&& isEmpty(data.getCourseName()) // String
&& isEmpty(data.getCourseType()) // String
&& isEmpty(data.getCredits()) // BigDecimal
&& isEmpty(data.getTotalHours()) // Integer
&& isEmpty(data.getDurationPerSession()) // Integer
&& isEmpty(data.getSessionsPerWeek()) // Integer
&& isEmpty(data.getDescription()); // String非必填也参与空行判断
}
/**
* 通用空值判断工具方法
* 处理String空白字符Integer/BigDecimalnull
*/
private <T> boolean isEmpty(T value) {
if (value == null) {
return true;
}
if (value instanceof String) {
// String类型判断是否为空白空格制表符空字符串
return ((String) value).trim().isEmpty();
}
// 其他类型IntegerBigDecimal非null即不为空
return false;
}
/** 捕获Excel读取异常 */
@Override
public void onException(Exception exception, AnalysisContext context) {
ExcelErrorDTO error = new ExcelErrorDTO();
int rowNum = context.readRowHolder().getRowIndex();
if (rowNum < start) return;
int actualRowNum = rowNum - 1;
error.setRowNum(actualRowNum);
// 核心适配处理ExcelDataConvertException类型转换错误
if (exception instanceof ExcelDataConvertException) {
ExcelDataConvertException dc = (ExcelDataConvertException) exception;
ExcelContentProperty contentProperty = dc.getExcelContentProperty();
String columnName = "未知列";
String targetTypeName = "未知类型";
// 从ExcelContentProperty中提取字段信息关键
if (contentProperty != null && contentProperty.getField() != null) {
Field field = contentProperty.getField();
String fieldName = field.getName(); // DTO字段名
columnName = fieldColumnMap.getOrDefault(fieldName, fieldName); // 映射为Excel列名
targetTypeName = field.getType().getSimpleName(); // 目标类型如IntegerBigDecimal
} else {
// 若字段信息获取失败用列索引提示如第2列
Integer columnIndex = dc.getColumnIndex();
if (columnIndex != null) {
columnName = "" + (columnIndex + 1) + ""; // 列索引从0开始+1转为用户可见列号
}
}
// 构建错误信息包含单元格原始值更友好
String cellValue = dc.getCellData() != null ? dc.getCellData().getStringValue() : "空值";
error.setColumnName(columnName);
error.setErrorMsg(String.format("数据类型错误:单元格值为「%s」无法转换为%s", cellValue, targetTypeName));
} else if (exception instanceof ExcelAnalysisException) {
// 处理Excel读取通用异常如格式损坏密码保护等
ExcelAnalysisException ae = (ExcelAnalysisException) exception;
error.setColumnName("未知列");
error.setErrorMsg("Excel读取失败" + ae.getMessage());
} else {
// 处理其他系统异常
error.setColumnName("未知列");
error.setErrorMsg("系统异常:" + exception.getMessage());
}
errorList.add(error);
}
/** 读取完成后的收尾操作 */
@Override
public void doAfterAllAnalysed(AnalysisContext context) {}
}

View File

@ -0,0 +1,104 @@
package com.mdd.admin.excelListener.course;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.mdd.admin.dto.CourseExcelDTO;
import com.mdd.admin.dto.ExcelErrorDTO;
import com.mdd.common.entity.CourseType;
import lombok.Getter;
import javax.annotation.Nonnull;
import java.util.*;
public class CourseTypeExcelValidationListener extends AnalysisEventListener<CourseExcelDTO>{
/** DTO字段名 -> Excel列名 映射用于报错时显示列名
* -- GETTER --
* 获取所有错误信息
*/
@Getter
private final List<ExcelErrorDTO> errorList = new ArrayList<>();
/**
* 已存在的课程类型列表
* */
private final List<String> courseTypeList;
public CourseTypeExcelValidationListener(List<String> courseTypeList) {
this.courseTypeList = courseTypeList;
}
@Override
public void invoke(CourseExcelDTO courseExcelDTO, AnalysisContext analysisContext) {
// 1. 先获取当前数据行的程序索引
int dataRowIndex = analysisContext.readRowHolder().getRowIndex();
// 2. 跳过示例行
int start = 2;
if (dataRowIndex < start) {
return;
}
if (isRowEmpty(courseExcelDTO)) {
return; // 空行终止当前行处理
}
@Nonnull
String courseType = courseExcelDTO.getCourseType();
for(String name:courseTypeList) {
if (name.equals(courseType))
return;
}
ExcelErrorDTO newCourseType = new ExcelErrorDTO();
newCourseType.setColumnName("课程名称");
newCourseType.setRowNum(dataRowIndex-1);
newCourseType.setErrorMsg(courseType);
errorList.add(newCourseType);
}
@Override
public void onException(Exception exception, AnalysisContext context) {
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
}
/**
* 核心判断当前行是否为空行所有字段均为空/空白
* 可根据实际需求调整比如允许部分非必填字段为空只判断必填字段是否全空
*/
private boolean isRowEmpty(CourseExcelDTO data) {
if (data == null) {
return true;
}
// 遍历DTO所有核心字段判断是否均为空根据CourseExcelDTO字段类型适配
return isEmpty(data.getOrder()) // Integer
&& isEmpty(data.getCourseCode()) // String
&& isEmpty(data.getCourseName()) // String
&& isEmpty(data.getCourseType()) // String
&& isEmpty(data.getCredits()) // BigDecimal
&& isEmpty(data.getTotalHours()) // Integer
&& isEmpty(data.getDurationPerSession()) // Integer
&& isEmpty(data.getSessionsPerWeek()) // Integer
&& isEmpty(data.getDescription()); // String非必填也参与空行判断
}
/**
* 通用空值判断工具方法
* 处理String空白字符Integer/BigDecimalnull
*/
private <T> boolean isEmpty(T value) {
if (value == null) {
return true;
}
if (value instanceof String) {
// String类型判断是否为空白空格制表符空字符串
return ((String) value).trim().isEmpty();
}
// 其他类型IntegerBigDecimal非null即不为空
return false;
}
}

View File

@ -0,0 +1,84 @@
package com.mdd.admin.excelListener.course;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.mdd.admin.dto.CourseExcelDTO;
import com.mdd.admin.service.impl.CourseServiceImpl;
import com.mdd.admin.validate.course.CourseCreateValidate;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
public class ExcelValidationListener extends AnalysisEventListener<CourseExcelDTO> {
Map<String, Integer> map = new HashMap<>();
CourseServiceImpl courseService;
public ExcelValidationListener(Map<String, Integer> map, CourseServiceImpl courseService) {
this.map = map;
this.courseService = courseService;
}
@Override
public void invoke(CourseExcelDTO courseExcelDTO, AnalysisContext analysisContext) {
int start = 2;
int dataRowIndex = analysisContext.readRowHolder().getRowIndex();
if (dataRowIndex < start) {
return;
}
if (isRowEmpty(courseExcelDTO)) {
return;
}
CourseCreateValidate courseCreateValidate = new CourseCreateValidate();
courseCreateValidate.setCourseName(courseExcelDTO.getCourseName());
courseCreateValidate.setCourseCode(courseExcelDTO.getCourseCode());
courseCreateValidate.setCredits(courseExcelDTO.getCredits());
courseCreateValidate.setDescription(courseExcelDTO.getDescription());
courseCreateValidate.setDurationPerSession(courseExcelDTO.getDurationPerSession());
courseCreateValidate.setSessionsPerWeek(courseExcelDTO.getSessionsPerWeek());
courseCreateValidate.setTotalHours(courseExcelDTO.getTotalHours());
Integer courseTypeId = map.get(courseExcelDTO.getCourseType());
courseCreateValidate.setCourseTypeId(courseTypeId);
courseCreateValidate.setEquipmentRequirements(new ArrayList<>());
courseService.add(courseCreateValidate);
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
}
@Override
public void onException(Exception exception, AnalysisContext context) throws Exception {
}
private boolean isRowEmpty(CourseExcelDTO data) {
if (data == null) {
return true;
}
return isEmpty(data.getOrder()) // Integer
&& isEmpty(data.getCourseCode()) // String
&& isEmpty(data.getCourseName()) // String
&& isEmpty(data.getCourseType()) // String
&& isEmpty(data.getCredits()) // BigDecimal
&& isEmpty(data.getTotalHours()) // Integer
&& isEmpty(data.getDurationPerSession()) // Integer
&& isEmpty(data.getSessionsPerWeek()) // Integer
&& isEmpty(data.getDescription()); // String非必填也参与空行判断
}
private <T> boolean isEmpty(T value) {
if (value == null) {
return true;
}
if (value instanceof String) {
// String类型判断是否为空白空格制表符空字符串
return ((String) value).trim().isEmpty();
}
// 其他类型IntegerBigDecimal非null即不为空
return false;
}
}

View File

@ -0,0 +1,60 @@
package com.mdd.admin.service;
import com.mdd.admin.validate.commons.PageValidate;
import com.mdd.admin.validate.ClassroomCreateValidate;
import com.mdd.admin.validate.ClassroomUpdateValidate;
import com.mdd.admin.validate.ClassroomSearchValidate;
import com.mdd.admin.vo.ClassroomListedVo;
import com.mdd.admin.vo.ClassroomDetailVo;
import com.mdd.common.core.PageResult;
/**
* 教室服务接口类
* @author LikeAdmin
*/
public interface IClassroomService {
/**
* 教室列表
*
* @author LikeAdmin
* @param pageValidate 分页参数
* @param searchValidate 搜索参数
* @return PageResult<ClassroomListedVo>
*/
PageResult<ClassroomListedVo> list(PageValidate pageValidate, ClassroomSearchValidate searchValidate);
/**
* 教室详情
*
* @author LikeAdmin
* @param id 主键ID
* @return ClassroomDetailVo
*/
ClassroomDetailVo detail(Integer id);
/**
* 教室新增
*
* @author LikeAdmin
* @param createValidate 参数
*/
void add(ClassroomCreateValidate createValidate);
/**
* 教室编辑
*
* @author LikeAdmin
* @param updateValidate 参数
*/
void edit(ClassroomUpdateValidate updateValidate);
/**
* 教室删除
*
* @author LikeAdmin
* @param id 主键ID
*/
void del(Integer id);
}

View File

@ -0,0 +1,60 @@
package com.mdd.admin.service;
import com.mdd.admin.validate.commons.PageValidate;
import com.mdd.admin.validate.ClassroomTypeCreateValidate;
import com.mdd.admin.validate.ClassroomTypeUpdateValidate;
import com.mdd.admin.validate.ClassroomTypeSearchValidate;
import com.mdd.admin.vo.ClassroomTypeListedVo;
import com.mdd.admin.vo.ClassroomTypeDetailVo;
import com.mdd.common.core.PageResult;
/**
* 教室类型服务接口类
* @author gyp
*/
public interface IClassroomTypeService {
/**
* 教室类型列表
*
* @author gyp
* @param pageValidate 分页参数
* @param searchValidate 搜索参数
* @return PageResult<ClassroomTypeListedVo>
*/
PageResult<ClassroomTypeListedVo> list(PageValidate pageValidate, ClassroomTypeSearchValidate searchValidate);
/**
* 教室类型详情
*
* @author gyp
* @param id 主键ID
* @return ClassroomTypeDetailVo
*/
ClassroomTypeDetailVo detail(Integer id);
/**
* 教室类型新增
*
* @author gyp
* @param createValidate 参数
*/
void add(ClassroomTypeCreateValidate createValidate);
/**
* 教室类型编辑
*
* @author gyp
* @param updateValidate 参数
*/
void edit(ClassroomTypeUpdateValidate updateValidate);
/**
* 教室类型删除
*
* @author gyp
* @param id 主键ID
*/
void del(Integer id);
}

View File

@ -1,5 +1,6 @@
package com.mdd.admin.service;
import com.mdd.admin.dto.ExcelErrorDTO;
import com.mdd.admin.validate.commons.PageValidate;
import com.mdd.admin.validate.course.CourseCreateValidate;
import com.mdd.admin.validate.course.CourseUpdateValidate;
@ -7,6 +8,9 @@ import com.mdd.admin.validate.course.CourseSearchValidate;
import com.mdd.admin.vo.course.CourseListedVo;
import com.mdd.admin.vo.course.CourseDetailVo;
import com.mdd.common.core.PageResult;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
/**
* 课程服务接口类
@ -57,4 +61,20 @@ public interface ICourseService {
*/
void del(Integer id);
/**
* 上传excel导入表格
*
* @author gyp
*/
void upload(MultipartFile file);
/**
* 批量添加excel表格信息
*
*/
List<ExcelErrorDTO> checkExcel(MultipartFile file);
List<ExcelErrorDTO> checkCourseType(MultipartFile file);
void addByExcel(MultipartFile file);
}

View File

@ -0,0 +1,60 @@
package com.mdd.admin.service;
import com.mdd.admin.validate.commons.PageValidate;
import com.mdd.admin.validate.course.CourseTypeCreateValidate;
import com.mdd.admin.validate.course.CourseTypeUpdateValidate;
import com.mdd.admin.validate.course.CourseTypeSearchValidate;
import com.mdd.admin.vo.course.CourseTypeListedVo;
import com.mdd.admin.vo.course.CourseTypeDetailVo;
import com.mdd.common.core.PageResult;
/**
* 课程类型服务接口类
* @author LikeAdmin
*/
public interface ICourseTypeService {
/**
* 课程类型列表
*
* @author LikeAdmin
* @param pageValidate 分页参数
* @param searchValidate 搜索参数
* @return PageResult<CourseTypeListedVo>
*/
PageResult<CourseTypeListedVo> list(PageValidate pageValidate, CourseTypeSearchValidate searchValidate);
/**
* 课程类型详情
*
* @author LikeAdmin
* @param id 主键ID
* @return CourseTypeDetailVo
*/
CourseTypeDetailVo detail(Integer id);
/**
* 课程类型新增
*
* @author LikeAdmin
* @param createValidate 参数
*/
void add(CourseTypeCreateValidate createValidate);
/**
* 课程类型编辑
*
* @author LikeAdmin
* @param updateValidate 参数
*/
void edit(CourseTypeUpdateValidate updateValidate);
/**
* 课程类型删除
*
* @author LikeAdmin
* @param id 主键ID
*/
void del(Integer id);
}

View File

@ -0,0 +1,60 @@
package com.mdd.admin.service;
import com.mdd.admin.validate.commons.PageValidate;
import com.mdd.admin.validate.equipmentRequirement.EquipmentRequirementCreateValidate;
import com.mdd.admin.validate.equipmentRequirement.EquipmentRequirementUpdateValidate;
import com.mdd.admin.validate.equipmentRequirement.EquipmentRequirementSearchValidate;
import com.mdd.admin.vo.EquipmentRequirementListedVo;
import com.mdd.admin.vo.EquipmentRequirementDetailVo;
import com.mdd.common.core.PageResult;
/**
* 设备要求服务接口类
* @author gyp
*/
public interface IEquipmentRequirementService {
/**
* 设备要求列表
*
* @author gyp
* @param pageValidate 分页参数
* @param searchValidate 搜索参数
* @return PageResult<EquipmentRequirementListedVo>
*/
PageResult<EquipmentRequirementListedVo> list(PageValidate pageValidate, EquipmentRequirementSearchValidate searchValidate);
/**
* 设备要求详情
*
* @author gyp
* @param id 主键ID
* @return EquipmentRequirementDetailVo
*/
EquipmentRequirementDetailVo detail(Integer id);
/**
* 设备要求新增
*
* @author gyp
* @param createValidate 参数
*/
void add(EquipmentRequirementCreateValidate createValidate);
/**
* 设备要求编辑
*
* @author gyp
* @param updateValidate 参数
*/
void edit(EquipmentRequirementUpdateValidate updateValidate);
/**
* 设备要求删除
*
* @author gyp
* @param id 主键ID
*/
void del(Integer id);
}

View File

@ -1,13 +1,15 @@
package com.mdd.admin.service;
import com.mdd.admin.validate.commons.PageValidate;
import com.mdd.admin.validate.student.StudentInfoCreateValidate;
import com.mdd.admin.validate.student.StudentInfoUpdateValidate;
import com.mdd.admin.validate.student.StudentInfoSearchValidate;
import com.mdd.admin.vo.student.StudentInfoListedVo;
import com.mdd.admin.vo.student.StudentInfoDetailVo;
import com.mdd.admin.validate.StudentInfoCreateValidate;
import com.mdd.admin.validate.StudentInfoUpdateValidate;
import com.mdd.admin.validate.StudentInfoSearchValidate;
import com.mdd.admin.vo.StudentInfoListedVo;
import com.mdd.admin.vo.StudentInfoDetailVo;
import com.mdd.common.core.PageResult;
import javax.validation.constraints.NotNull;
/**
* 学生信息服务接口类
* @author gyp
@ -58,10 +60,10 @@ public interface IStudentInfoService {
void del(Integer id);
/**
* 学生信息删除
* 添加随机学生信息
*
* @author gyp
* @param num 创建随机学生
* @param num
*/
void createRandomInfo(Integer num);
void createRandomInfo(@NotNull(message = "数量参数缺失") Integer num);
}

View File

@ -0,0 +1,64 @@
package com.mdd.admin.service;
import com.mdd.admin.dto.TimeSlotCreateDTO;
import com.mdd.admin.validate.*;
import com.mdd.admin.validate.commons.PageValidate;
import com.mdd.admin.vo.TimeSlotListedVo;
import com.mdd.admin.vo.TimeSlotDetailVo;
import com.mdd.common.core.PageResult;
import java.time.LocalTime;
import java.util.List;
/**
* 时间段服务接口类
* @author gyp
*/
public interface ITimeSlotService {
/**
* 时间段列表
*
* @author gyp
* @return PageResult<TimeSlotListedVo>
*/
List<TimeSlotListedVo> list();
/**
* 时间段详情
*
* @author gyp
* @param id 主键ID
* @return TimeSlotDetailVo
*/
TimeSlotDetailVo detail(Integer id);
/**
* 时间段新增
*
* @author gyp
*/
void add(TimeSlotCreateDTO dto);
/**
* 时间段编辑
*
* @author gyp
* @param updateValidate 参数
*/
void edit(TimeSlotForRowUpdateValidate updateValidate);
/**
* 时间段删除
*
* @author gyp
* @param count 要删除的节次数
*/
void del(Integer count);
void insert(TimeSlotInsertValidate insertValidate);
void uniform(TimeSlotUniformValidate uniformValidate, LocalTime lastEndTime, Integer section);
}

View File

@ -0,0 +1,172 @@
package com.mdd.admin.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.github.yulichang.query.MPJQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.mdd.admin.validate.commons.PageValidate;
import com.mdd.admin.service.IClassroomService;
import com.mdd.admin.validate.ClassroomCreateValidate;
import com.mdd.admin.validate.ClassroomUpdateValidate;
import com.mdd.admin.validate.ClassroomSearchValidate;
import com.mdd.admin.vo.ClassroomListedVo;
import com.mdd.admin.vo.ClassroomDetailVo;
import com.mdd.common.config.GlobalConfig;
import com.mdd.common.core.PageResult;
import com.mdd.common.entity.Classroom;
import com.mdd.common.entity.ClassroomType;
import com.mdd.common.mapper.ClassroomMapper;
import com.mdd.common.mapper.ClassroomTypeMapper;
import com.mdd.common.util.ListUtils;
import com.mdd.common.util.TimeUtils;
import com.mdd.common.util.UrlUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import javax.annotation.Resource;
import java.util.*;
/**
* 教室实现类
* @author LikeAdmin
*/
@Service
public class ClassroomServiceImpl implements IClassroomService {
@Resource
ClassroomMapper classroomMapper;
@Autowired
private ClassroomTypeMapper classroomTypeMapper;
/**
* 教室列表
*
* @author LikeAdmin
* @param pageValidate 分页参数
* @param searchValidate 搜索参数
* @return PageResult<ClassroomListedVo>
*/
@Override
public PageResult<ClassroomListedVo> list(PageValidate pageValidate, ClassroomSearchValidate searchValidate) {
Integer page = pageValidate.getPage_no();
Integer limit = pageValidate.getPage_size();
QueryWrapper<Classroom> queryWrapper = new QueryWrapper<>();
queryWrapper.orderByDesc("id");
classroomMapper.setSearch(queryWrapper, searchValidate, new String[]{
"like:classroomCode@classroom_code:str",
"like:classroomName@classroom_name:str",
"=:classroomTypeId@classroom_type_id:int",
"=:location:str",
"=:status:int",
});
IPage<Classroom> iPage = classroomMapper.selectPage(new Page<>(page, limit), queryWrapper);
List<ClassroomListedVo> list = new LinkedList<>();
for(Classroom item : iPage.getRecords()) {
ClassroomListedVo vo = new ClassroomListedVo();
BeanUtils.copyProperties(item, vo);
vo.setCreateTime(TimeUtils.timestampToDate(item.getCreateTime()));
vo.setUpdateTime(TimeUtils.timestampToDate(item.getUpdateTime()));
ClassroomType classroomType = classroomTypeMapper.selectById(item.getClassroomTypeId());
vo.setClassroomTypeName(classroomType.getTypeName());
list.add(vo);
}
return PageResult.iPageHandle(iPage.getTotal(), iPage.getCurrent(), iPage.getSize(), list);
}
/**
* 教室详情
*
* @author LikeAdmin
* @param id 主键参数
* @return Classroom
*/
@Override
public ClassroomDetailVo detail(Integer id) {
Classroom model = classroomMapper.selectOne(
new QueryWrapper<Classroom>()
.eq("id", id)
.last("limit 1"));
Assert.notNull(model, "数据不存在");
ClassroomDetailVo vo = new ClassroomDetailVo();
BeanUtils.copyProperties(model, vo);
ClassroomType classroomType = classroomTypeMapper.selectById(vo.getClassroomTypeId());
vo.setClassroomTypeName(classroomType.getTypeName());
return vo;
}
/**
* 教室新增
*
* @author LikeAdmin
* @param createValidate 参数
*/
@Override
public void add(ClassroomCreateValidate createValidate) {
Classroom model = new Classroom();
model.setClassroomCode(createValidate.getClassroomCode());
model.setClassroomName(createValidate.getClassroomName());
model.setClassroomTypeId(createValidate.getClassroomTypeId());
model.setCapacity(createValidate.getCapacity());
model.setLocation(createValidate.getLocation());
model.setSpecialRequirements(createValidate.getSpecialRequirements());
model.setStatus(createValidate.getStatus());
model.setCreateTime(System.currentTimeMillis() / 1000);
model.setUpdateTime(System.currentTimeMillis() / 1000);
classroomMapper.insert(model);
}
/**
* 教室编辑
*
* @author LikeAdmin
* @param updateValidate 参数
*/
@Override
public void edit(ClassroomUpdateValidate updateValidate) {
Classroom model = classroomMapper.selectOne(
new QueryWrapper<Classroom>()
.eq("id", updateValidate.getId())
.last("limit 1"));
Assert.notNull(model, "数据不存在!");
model.setId(updateValidate.getId());
model.setClassroomCode(updateValidate.getClassroomCode());
model.setClassroomName(updateValidate.getClassroomName());
model.setClassroomTypeId(updateValidate.getClassroomTypeId());
model.setCapacity(updateValidate.getCapacity());
model.setLocation(updateValidate.getLocation());
model.setSpecialRequirements(updateValidate.getSpecialRequirements());
model.setStatus(updateValidate.getStatus());
model.setUpdateTime(System.currentTimeMillis() / 1000);
classroomMapper.updateById(model);
}
/**
* 教室删除
*
* @author LikeAdmin
* @param id 主键ID
*/
@Override
public void del(Integer id) {
Classroom model = classroomMapper.selectOne(
new QueryWrapper<Classroom>()
.eq("id", id)
.last("limit 1"));
Assert.notNull(model, "数据不存在!");
classroomMapper.delete(new QueryWrapper<Classroom>().eq("id", id));
}
}

View File

@ -0,0 +1,155 @@
package com.mdd.admin.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.github.yulichang.query.MPJQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.mdd.admin.validate.commons.PageValidate;
import com.mdd.admin.service.IClassroomTypeService;
import com.mdd.admin.validate.ClassroomTypeCreateValidate;
import com.mdd.admin.validate.ClassroomTypeUpdateValidate;
import com.mdd.admin.validate.ClassroomTypeSearchValidate;
import com.mdd.admin.vo.ClassroomTypeListedVo;
import com.mdd.admin.vo.ClassroomTypeDetailVo;
import com.mdd.common.config.GlobalConfig;
import com.mdd.common.core.PageResult;
import com.mdd.common.entity.ClassroomType;
import com.mdd.common.mapper.ClassroomTypeMapper;
import com.mdd.common.util.ListUtils;
import com.mdd.common.util.TimeUtils;
import com.mdd.common.util.UrlUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import javax.annotation.Resource;
import java.util.*;
/**
* 教室类型实现类
* @author gyp
*/
@Service
public class ClassroomTypeServiceImpl implements IClassroomTypeService {
@Resource
ClassroomTypeMapper classroomTypeMapper;
/**
* 教室类型列表
*
* @author gyp
* @param pageValidate 分页参数
* @param searchValidate 搜索参数
* @return PageResult<ClassroomTypeListedVo>
*/
@Override
public PageResult<ClassroomTypeListedVo> list(PageValidate pageValidate, ClassroomTypeSearchValidate searchValidate) {
Integer page = pageValidate.getPage_no();
Integer limit = pageValidate.getPage_size();
QueryWrapper<ClassroomType> queryWrapper = new QueryWrapper<>();
queryWrapper.orderByDesc("id");
classroomTypeMapper.setSearch(queryWrapper, searchValidate, new String[]{
"like:typeName@type_name:str",
"like:typeCode@type_code:str",
"=:status:int",
});
IPage<ClassroomType> iPage = classroomTypeMapper.selectPage(new Page<>(page, limit), queryWrapper);
List<ClassroomTypeListedVo> list = new LinkedList<>();
for(ClassroomType item : iPage.getRecords()) {
ClassroomTypeListedVo vo = new ClassroomTypeListedVo();
BeanUtils.copyProperties(item, vo);
vo.setCreateTime(TimeUtils.timestampToDate(item.getCreateTime()));
vo.setUpdateTime(TimeUtils.timestampToDate(item.getUpdateTime()));
list.add(vo);
}
return PageResult.iPageHandle(iPage.getTotal(), iPage.getCurrent(), iPage.getSize(), list);
}
/**
* 教室类型详情
*
* @author gyp
* @param id 主键参数
* @return ClassroomType
*/
@Override
public ClassroomTypeDetailVo detail(Integer id) {
ClassroomType model = classroomTypeMapper.selectOne(
new QueryWrapper<ClassroomType>()
.eq("id", id)
.last("limit 1"));
Assert.notNull(model, "数据不存在");
ClassroomTypeDetailVo vo = new ClassroomTypeDetailVo();
BeanUtils.copyProperties(model, vo);
return vo;
}
/**
* 教室类型新增
*
* @author gyp
* @param createValidate 参数
*/
@Override
public void add(ClassroomTypeCreateValidate createValidate) {
ClassroomType model = new ClassroomType();
model.setTypeName(createValidate.getTypeName());
model.setTypeCode(createValidate.getTypeCode());
model.setDescription(createValidate.getDescription());
model.setStatus(createValidate.getStatus());
model.setCreateTime(System.currentTimeMillis() / 1000);
model.setUpdateTime(System.currentTimeMillis() / 1000);
classroomTypeMapper.insert(model);
}
/**
* 教室类型编辑
*
* @author gyp
* @param updateValidate 参数
*/
@Override
public void edit(ClassroomTypeUpdateValidate updateValidate) {
ClassroomType model = classroomTypeMapper.selectOne(
new QueryWrapper<ClassroomType>()
.eq("id", updateValidate.getId())
.last("limit 1"));
Assert.notNull(model, "数据不存在!");
model.setId(updateValidate.getId());
model.setTypeName(updateValidate.getTypeName());
model.setTypeCode(updateValidate.getTypeCode());
model.setDescription(updateValidate.getDescription());
model.setStatus(updateValidate.getStatus());
model.setUpdateTime(System.currentTimeMillis() / 1000);
classroomTypeMapper.updateById(model);
}
/**
* 教室类型删除
*
* @author gyp
* @param id 主键ID
*/
@Override
public void del(Integer id) {
ClassroomType model = classroomTypeMapper.selectOne(
new QueryWrapper<ClassroomType>()
.eq("id", id)
.last("limit 1"));
Assert.notNull(model, "数据不存在!");
classroomTypeMapper.delete(new QueryWrapper<ClassroomType>().eq("id", id));
}
}

View File

@ -1,67 +1,97 @@
package com.mdd.admin.service.impl;
import com.alibaba.excel.EasyExcel;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.mdd.admin.dto.CourseExcelDTO;
import com.mdd.admin.dto.ExcelErrorDTO;
import com.mdd.admin.excelListener.course.CourseTypeExcelValidationListener;
import com.mdd.admin.excelListener.course.ExcelValidationListener;
import com.mdd.admin.validate.commons.PageValidate;
import com.mdd.admin.service.ICourseService;
import com.mdd.admin.validate.course.CourseCreateValidate;
import com.mdd.admin.excelListener.course.CourseExcelValidationListener;
import com.mdd.admin.validate.course.CourseUpdateValidate;
import com.mdd.admin.validate.course.CourseSearchValidate;
import com.mdd.admin.vo.course.CourseListedVo;
import com.mdd.admin.vo.course.CourseDetailVo;
import com.mdd.common.core.PageResult;
import com.mdd.common.entity.Course;
import com.mdd.common.entity.CourseEquipment;
import com.mdd.common.entity.CourseType;
import com.mdd.common.exception.OperateException;
import com.mdd.common.mapper.CourseEquipmentMapper;
import com.mdd.common.mapper.CourseMapper;
import com.mdd.common.mapper.CourseTypeMapper;
import com.mdd.common.util.TimeUtils;
import com.mdd.common.util.YmlUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.validation.Validation;
import javax.validation.Validator;
import java.io.File;
import java.io.IOException;
import java.util.*;
/**
* 课程实现类
* @author gyp
*/
@Slf4j
@Service
public class CourseServiceImpl implements ICourseService {
@Resource
CourseMapper courseMapper;
@Autowired
private CourseEquipmentMapper courseEquipmentMapper;
@Autowired
private CourseTypeMapper courseTypeMapper;
@Autowired
private CourseTypeServiceImpl courseTypeServiceImpl;
@Autowired
private CourseServiceImpl courseServiceImpl;
/**
* 课程列表
*
* @author gyp
* @param pageValidate 分页参数
* @param pageValidate 分页参数
* @param searchValidate 搜索参数
* @return PageResult<CourseListedVo>
* @author gyp
*/
@Override
public PageResult<CourseListedVo> list(PageValidate pageValidate, CourseSearchValidate searchValidate) {
Integer page = pageValidate.getPage_no();
Integer page = pageValidate.getPage_no();
Integer limit = pageValidate.getPage_size();
QueryWrapper<Course> queryWrapper = new QueryWrapper<>();
queryWrapper.orderByDesc("id");
courseMapper.setSearch(queryWrapper, searchValidate, new String[]{
"=:courseCode@course_code:str",
"like:courseName@course_name:str",
"=:courseType@course_type:int",
"=:status:int",
"=:courseCode@course_code:str",
"like:courseName@course_name:str",
"=:courseTypeId@course_type_id:int",
"=:status:int",
});
IPage<Course> iPage = courseMapper.selectPage(new Page<>(page, limit), queryWrapper);
List<CourseListedVo> list = new LinkedList<>();
for(Course item : iPage.getRecords()) {
for (Course item : iPage.getRecords()) {
CourseListedVo vo = new CourseListedVo();
BeanUtils.copyProperties(item, vo);
vo.setCreateTime(TimeUtils.timestampToDate(item.getCreateTime()));
vo.setUpdateTime(TimeUtils.timestampToDate(item.getUpdateTime()));
CourseType courseType = courseTypeMapper.selectById(item.getCourseTypeId());
vo.setCourseTypeName(courseType.getTypeName());
list.add(vo);
}
@ -71,94 +101,209 @@ public class CourseServiceImpl implements ICourseService {
/**
* 课程详情
*
* @author gyp
* @param id 主键参数
* @return Course
* @author gyp
*/
@Override
public CourseDetailVo detail(Integer id) {
Course model = courseMapper.selectOne(
new QueryWrapper<Course>()
.eq("id", id)
.last("limit 1"));
.eq("id", id)
.last("limit 1"));
Assert.notNull(model, "数据不存在");
CourseDetailVo vo = new CourseDetailVo();
BeanUtils.copyProperties(model, vo);
CourseType courseType = courseTypeMapper.selectById(model.getCourseTypeId());
vo.setCourseTypeName(courseType.getTypeName());
return vo;
}
/**
* 课程新增
*
* @author gyp
* @param createValidate 参数
* @author gyp
*/
@Override
public void add(CourseCreateValidate createValidate) {
Course model = new Course();
model.setCourseCode(createValidate.getCourseCode());
model.setCourseName(createValidate.getCourseName());
model.setCourseType(createValidate.getCourseType());
model.setCourseTypeId(createValidate.getCourseTypeId());
model.setCredits(createValidate.getCredits());
model.setTotalHours(createValidate.getTotalHours());
model.setDurationPerSession(createValidate.getDurationPerSession());
model.setSessionsPerWeek(createValidate.getSessionsPerWeek());
model.setEquipmentRequirements(createValidate.getEquipmentRequirements());
model.setDescription(createValidate.getDescription());
model.setStatus(createValidate.getStatus());
model.setCreateTime(System.currentTimeMillis() / 1000);
model.setUpdateTime(System.currentTimeMillis() / 1000);
// 关联表绑定
CourseEquipment courseEquipment = new CourseEquipment();
for (Integer id : createValidate.getEquipmentRequirements()) {
courseEquipment.setId(id);
courseEquipment.setCourseId(model.getId());
courseEquipment.setCreateTime(System.currentTimeMillis() / 1000);
courseEquipmentMapper.insert(courseEquipment);
}
courseMapper.insert(model);
}
/**
* 课程编辑
*
* @author gyp
* @param updateValidate 参数
* @author gyp
*/
@Override
public void edit(CourseUpdateValidate updateValidate) {
Course model = courseMapper.selectOne(
new QueryWrapper<Course>()
.eq("id", updateValidate.getId())
.last("limit 1"));
.eq("id", updateValidate.getId())
.last("limit 1"));
Assert.notNull(model, "数据不存在!");
model.setId(updateValidate.getId());
model.setCourseCode(updateValidate.getCourseCode());
model.setCourseName(updateValidate.getCourseName());
model.setCourseType(updateValidate.getCourseType());
model.setCourseTypeId(updateValidate.getCourseTypeId());
model.setCredits(updateValidate.getCredits());
model.setTotalHours(updateValidate.getTotalHours());
model.setDurationPerSession(updateValidate.getDurationPerSession());
model.setSessionsPerWeek(updateValidate.getSessionsPerWeek());
model.setEquipmentRequirements(updateValidate.getEquipmentRequirements());
model.setDescription(updateValidate.getDescription());
model.setStatus(updateValidate.getStatus());
model.setUpdateTime(System.currentTimeMillis() / 1000);
// 关联表绑定先清除原本的关联
courseEquipmentMapper.delete(new QueryWrapper<CourseEquipment>().eq("course_id", model.getId()));
for (Integer id : updateValidate.getEquipmentRequirements()) {
CourseEquipment courseEquipment = new CourseEquipment();
courseEquipment.setEquipmentRequirementId(id);
courseEquipment.setCourseId(model.getId());
courseEquipment.setCreateTime(System.currentTimeMillis() / 1000);
courseEquipmentMapper.insert(courseEquipment);
}
courseMapper.updateById(model);
}
/**
* 课程删除
*
* @author gyp
* @param id 主键ID
* @author gyp
*/
@Override
public void del(Integer id) {
Course model = courseMapper.selectOne(
new QueryWrapper<Course>()
.eq("id", id)
.last("limit 1"));
.eq("id", id)
.last("limit 1"));
Assert.notNull(model, "数据不存在!");
courseMapper.delete(new QueryWrapper<Course>().eq("id", id));
}
@Override
public void upload(MultipartFile file) {
// 校验文件是否为空
if (file == null || file.isEmpty()) {
throw new OperateException("上传文件不能为空");
}
// 校验文件类型
String originalFilename = file.getOriginalFilename();
// 若文件名不为空且后缀既不是xlsx也不是xls
if (originalFilename != null && !originalFilename.endsWith(".xlsx") && !originalFilename.endsWith(".xls")) {
throw new OperateException("只支持.xls和xlsx格式的文件");
}
// 保存到指定地址
String folderPath = "/template/";
String path = folderPath + "课程导入表.xlsx";
String filePath = YmlUtils.get("like.upload-directory") + path;
File folder = new File(YmlUtils.get("like.upload-directory") + folderPath);
if (!folder.exists()) {
if (!folder.mkdirs()) {
throw new OperateException("创建文件夹失败");
}
}
try {
File destFile = new File(filePath);
file.transferTo(destFile);
} catch (IOException e) {
throw new OperateException("文件保存失败: " + e.getMessage());
} catch (Exception e) {
throw new OperateException("上传过程发生错误: " + e.getMessage());
}
}
@Override
public List<ExcelErrorDTO> checkExcel(MultipartFile file) {
// 初始化校验器和监听器
Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
CourseExcelValidationListener listener = new CourseExcelValidationListener(validator);
// 读取Excel并执行校验headRowNumber=1跳过表头示例数据由Listener检测跳过
try {
EasyExcel.read(file.getInputStream(), CourseExcelDTO.class, listener)
.headRowNumber(1)
.sheet(0) // 读取第一个sheet
.doRead();
} catch (Exception e) {
throw new OperateException("Excel读取失败" + e.getMessage());
}
// 返回收集的错误列表
return listener.getErrorList();
}
@Override
public List<ExcelErrorDTO> checkCourseType(MultipartFile file) {
// 初始化监听器
List<String> courseTypeList = new ArrayList<>();
List<CourseType> courseTypes = courseTypeServiceImpl.courseTypeMapper.selectList(null);
for (CourseType courseType : courseTypes) {
courseTypeList.add(courseType.getTypeName());
}
CourseTypeExcelValidationListener listener = new CourseTypeExcelValidationListener(courseTypeList);
// 读取Excel并执行校验headRowNumber=1跳过表头示例数据由Listener检测跳过
try {
EasyExcel.read(file.getInputStream(), CourseExcelDTO.class, listener)
.headRowNumber(1)
.sheet(0) // 读取第一个sheet
.doRead();
} catch (Exception e) {
throw new OperateException("Excel读取失败" + e.getMessage());
}
// 返回发现的新课程类型
return listener.getErrorList();
}
@Override
public void addByExcel(MultipartFile file) {
// 初始化监听器
Map<String, Integer> map = new HashMap<>();
List<CourseType> courseTypes = courseTypeServiceImpl.courseTypeMapper.selectList(null);
for (CourseType courseType : courseTypes) {
map.put(courseType.getTypeName(), courseType.getId());
}
ExcelValidationListener listener = new ExcelValidationListener(map, courseServiceImpl);
// 读取Excel并添加课程headRowNumber=1跳过表头示例数据由Listener检测跳过
try {
EasyExcel.read(file.getInputStream(), CourseExcelDTO.class, listener)
.headRowNumber(1)
.sheet(0) // 读取第一个sheet
.doRead();
} catch (Exception e) {
throw new OperateException("Excel读取失败" + e.getMessage());
}
}
}

View File

@ -0,0 +1,146 @@
package com.mdd.admin.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.mdd.admin.validate.commons.PageValidate;
import com.mdd.admin.service.ICourseTypeService;
import com.mdd.admin.validate.course.CourseTypeCreateValidate;
import com.mdd.admin.validate.course.CourseTypeUpdateValidate;
import com.mdd.admin.validate.course.CourseTypeSearchValidate;
import com.mdd.admin.vo.course.CourseTypeListedVo;
import com.mdd.admin.vo.course.CourseTypeDetailVo;
import com.mdd.common.core.PageResult;
import com.mdd.common.entity.CourseType;
import com.mdd.common.mapper.CourseTypeMapper;
import com.mdd.common.util.TimeUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import javax.annotation.Resource;
import java.util.*;
/**
* 课程类型实现类
* @author LikeAdmin
*/
@Service
public class CourseTypeServiceImpl implements ICourseTypeService {
@Resource
CourseTypeMapper courseTypeMapper;
/**
* 课程类型列表
*
* @author LikeAdmin
* @param pageValidate 分页参数
* @param searchValidate 搜索参数
* @return PageResult<CourseTypeListedVo>
*/
@Override
public PageResult<CourseTypeListedVo> list(PageValidate pageValidate, CourseTypeSearchValidate searchValidate) {
Integer page = pageValidate.getPage_no();
Integer limit = pageValidate.getPage_size();
QueryWrapper<CourseType> queryWrapper = new QueryWrapper<>();
queryWrapper.orderByDesc("sort_order");
courseTypeMapper.setSearch(queryWrapper, searchValidate, new String[]{
"like:typeName@type_name:str",
});
IPage<CourseType> iPage = courseTypeMapper.selectPage(new Page<>(page, limit), queryWrapper);
List<CourseTypeListedVo> list = new LinkedList<>();
for(CourseType item : iPage.getRecords()) {
CourseTypeListedVo vo = new CourseTypeListedVo();
BeanUtils.copyProperties(item, vo);
vo.setCreateTime(TimeUtils.timestampToDate(item.getCreateTime()));
list.add(vo);
}
return PageResult.iPageHandle(iPage.getTotal(), iPage.getCurrent(), iPage.getSize(), list);
}
/**
* 课程类型详情
*
* @author LikeAdmin
* @param id 主键参数
* @return CourseType
*/
@Override
public CourseTypeDetailVo detail(Integer id) {
CourseType model = courseTypeMapper.selectOne(
new QueryWrapper<CourseType>()
.eq("id", id)
.last("limit 1"));
Assert.notNull(model, "数据不存在");
CourseTypeDetailVo vo = new CourseTypeDetailVo();
BeanUtils.copyProperties(model, vo);
return vo;
}
/**
* 课程类型新增
*
* @author LikeAdmin
* @param createValidate 参数
*/
@Override
public void add(CourseTypeCreateValidate createValidate) {
CourseType model = new CourseType();
model.setTypeName(createValidate.getTypeName());
model.setDescription(createValidate.getDescription());
model.setSortOrder(createValidate.getSortOrder());
model.setCreateTime(System.currentTimeMillis() / 1000);
courseTypeMapper.insert(model);
model.setSortOrder(model.getId());
courseTypeMapper.updateById(model);
}
/**
* 课程类型编辑
*
* @author LikeAdmin
* @param updateValidate 参数
*/
@Override
public void edit(CourseTypeUpdateValidate updateValidate) {
CourseType model = courseTypeMapper.selectOne(
new QueryWrapper<CourseType>()
.eq("id", updateValidate.getId())
.last("limit 1"));
Assert.notNull(model, "数据不存在!");
model.setId(updateValidate.getId());
model.setTypeName(updateValidate.getTypeName());
model.setDescription(updateValidate.getDescription());
model.setSortOrder(updateValidate.getSortOrder());
courseTypeMapper.updateById(model);
}
/**
* 课程类型删除
*
* @author LikeAdmin
* @param id 主键ID
*/
@Override
public void del(Integer id) {
CourseType model = courseTypeMapper.selectOne(
new QueryWrapper<CourseType>()
.eq("id", id)
.last("limit 1"));
Assert.notNull(model, "数据不存在!");
courseTypeMapper.delete(new QueryWrapper<CourseType>().eq("id", id));
}
}

View File

@ -0,0 +1,154 @@
package com.mdd.admin.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.mdd.admin.validate.commons.PageValidate;
import com.mdd.admin.service.IEquipmentRequirementService;
import com.mdd.admin.validate.equipmentRequirement.EquipmentRequirementCreateValidate;
import com.mdd.admin.validate.equipmentRequirement.EquipmentRequirementUpdateValidate;
import com.mdd.admin.validate.equipmentRequirement.EquipmentRequirementSearchValidate;
import com.mdd.admin.vo.EquipmentRequirementListedVo;
import com.mdd.admin.vo.EquipmentRequirementDetailVo;
import com.mdd.common.core.PageResult;
import com.mdd.common.entity.EquipmentRequirement;
import com.mdd.common.mapper.EquipmentRequirementMapper;
import com.mdd.common.util.TimeUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import javax.annotation.Resource;
import java.util.*;
/**
* 设备要求实现类
* @author gyp
*/
@Service
public class EquipmentRequirementServiceImpl implements IEquipmentRequirementService {
@Resource
EquipmentRequirementMapper equipmentRequirementMapper;
/**
* 设备要求列表
*
* @author gyp
* @param pageValidate 分页参数
* @param searchValidate 搜索参数
* @return PageResult<EquipmentRequirementListedVo>
*/
@Override
public PageResult<EquipmentRequirementListedVo> list(PageValidate pageValidate, EquipmentRequirementSearchValidate searchValidate) {
Integer page = pageValidate.getPage_no();
Integer limit = pageValidate.getPage_size();
QueryWrapper<EquipmentRequirement> queryWrapper = new QueryWrapper<>();
queryWrapper.orderByDesc("id");
equipmentRequirementMapper.setSearch(queryWrapper, searchValidate, new String[]{
"like:equipmentName@equipment_name:str",
"=:equipmentCode@equipment_code:str",
"=:equipmentType@equipment_type:int",
"=:status:int",
});
IPage<EquipmentRequirement> iPage = equipmentRequirementMapper.selectPage(new Page<>(page, limit), queryWrapper);
List<EquipmentRequirementListedVo> list = new LinkedList<>();
for(EquipmentRequirement item : iPage.getRecords()) {
EquipmentRequirementListedVo vo = new EquipmentRequirementListedVo();
BeanUtils.copyProperties(item, vo);
vo.setCreateTime(TimeUtils.timestampToDate(item.getCreateTime()));
vo.setUpdateTime(TimeUtils.timestampToDate(item.getUpdateTime()));
list.add(vo);
}
return PageResult.iPageHandle(iPage.getTotal(), iPage.getCurrent(), iPage.getSize(), list);
}
/**
* 设备要求详情
*
* @author gyp
* @param id 主键参数
* @return EquipmentRequirement
*/
@Override
public EquipmentRequirementDetailVo detail(Integer id) {
EquipmentRequirement model = equipmentRequirementMapper.selectOne(
new QueryWrapper<EquipmentRequirement>()
.eq("id", id)
.last("limit 1"));
Assert.notNull(model, "数据不存在");
EquipmentRequirementDetailVo vo = new EquipmentRequirementDetailVo();
BeanUtils.copyProperties(model, vo);
return vo;
}
/**
* 设备要求新增
*
* @author gyp
* @param createValidate 参数
*/
@Override
public void add(EquipmentRequirementCreateValidate createValidate) {
EquipmentRequirement model = new EquipmentRequirement();
model.setEquipmentName(createValidate.getEquipmentName());
model.setEquipmentCode(createValidate.getEquipmentCode());
model.setEquipmentType(createValidate.getEquipmentType());
model.setDescription(createValidate.getDescription());
model.setStatus(createValidate.getStatus());
model.setCreateTime(System.currentTimeMillis() / 1000);
model.setUpdateTime(System.currentTimeMillis() / 1000);
equipmentRequirementMapper.insert(model);
}
/**
* 设备要求编辑
*
* @author gyp
* @param updateValidate 参数
*/
@Override
public void edit(EquipmentRequirementUpdateValidate updateValidate) {
EquipmentRequirement model = equipmentRequirementMapper.selectOne(
new QueryWrapper<EquipmentRequirement>()
.eq("id", updateValidate.getId())
.last("limit 1"));
Assert.notNull(model, "数据不存在!");
model.setId(updateValidate.getId());
model.setEquipmentName(updateValidate.getEquipmentName());
model.setEquipmentCode(updateValidate.getEquipmentCode());
model.setEquipmentType(updateValidate.getEquipmentType());
model.setDescription(updateValidate.getDescription());
model.setStatus(updateValidate.getStatus());
model.setUpdateTime(System.currentTimeMillis() / 1000);
equipmentRequirementMapper.updateById(model);
}
/**
* 设备要求删除
*
* @author gyp
* @param id 主键ID
*/
@Override
public void del(Integer id) {
EquipmentRequirement model = equipmentRequirementMapper.selectOne(
new QueryWrapper<EquipmentRequirement>()
.eq("id", id)
.last("limit 1"));
Assert.notNull(model, "数据不存在!");
equipmentRequirementMapper.delete(new QueryWrapper<EquipmentRequirement>().eq("id", id));
}
}

View File

@ -1,22 +1,35 @@
package com.mdd.admin.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.github.yulichang.query.MPJQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.mdd.admin.validate.commons.PageValidate;
import com.mdd.admin.service.IStudentInfoService;
import com.mdd.admin.validate.student.StudentInfoCreateValidate;
import com.mdd.admin.validate.student.StudentInfoUpdateValidate;
import com.mdd.admin.validate.student.StudentInfoSearchValidate;
import com.mdd.admin.vo.student.StudentInfoListedVo;
import com.mdd.admin.vo.student.StudentInfoDetailVo;
import com.mdd.admin.validate.StudentInfoCreateValidate;
import com.mdd.admin.validate.StudentInfoUpdateValidate;
import com.mdd.admin.validate.StudentInfoSearchValidate;
import com.mdd.admin.vo.StudentInfoListedVo;
import com.mdd.admin.vo.StudentInfoDetailVo;
import com.mdd.common.config.GlobalConfig;
import com.mdd.common.core.PageResult;
import com.mdd.common.entity.Class;
import com.mdd.common.entity.College;
import com.mdd.common.entity.Major;
import com.mdd.common.entity.StudentInfo;
import com.mdd.common.entity.admin.Admin;
import com.mdd.common.entity.user.User;
import com.mdd.common.mapper.ClassMapper;
import com.mdd.common.mapper.CollegeMapper;
import com.mdd.common.mapper.MajorMapper;
import com.mdd.common.mapper.StudentInfoMapper;
import com.mdd.common.mapper.admin.AdminMapper;
import com.mdd.common.mapper.user.UserMapper;
import com.mdd.common.util.*;
import io.netty.util.internal.ThreadLocalRandom;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
@ -24,7 +37,6 @@ import javax.annotation.Resource;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.concurrent.ThreadLocalRandom;
/**
* 学生信息实现类
@ -35,9 +47,16 @@ public class StudentInfoServiceImpl implements IStudentInfoService {
@Resource
StudentInfoMapper studentInfoMapper;
@Resource
UserMapper userMapper;
@Autowired
private CollegeMapper collegeMapper;
@Autowired
private MajorMapper majorMapper;
@Autowired
private ClassMapper classMapper;
@Autowired
private AdminMapper adminMapper;
@Autowired
private UserMapper userMapper;
/**
* 学生信息列表
@ -56,45 +75,45 @@ public class StudentInfoServiceImpl implements IStudentInfoService {
queryWrapper.orderByDesc("id");
studentInfoMapper.setSearch(queryWrapper, searchValidate, new String[]{
"=:userId@user_id:int",
"like:name@name:str",
"=:gender@gender:int",
"=:studentNumber@student_number:str",
"=:college:str",
"=:major:str",
"like:className@class_name:str",
"=:grade:str",
"=:enrollmentYear@enrollment_year:str",
"=:expectedGraduationYear@expected_graduation_year:str",
"=:studentStatus@student_status:str",
"=:idCard@id_card:str",
"=:birthday:str",
"=:politicalStatus@political_status:str",
"=:nativePlace@native_place:str",
"=:homeAddress@home_address:str",
"=:emergencyContact@emergency_contact:str",
"=:emergencyPhone@emergency_phone:str",
"=:dormitory:str",
"=:counselorId@counselor_id:str",
"=:totalCredits@total_credits:str",
"=:gpa:str",
"=:scholarshipLevel@scholarship_level:str",
"=:academicWarnings@academic_warnings:str",
"=:isVerified@is_verified:str",
"=:verifiedBy@verified_by:",
"=:verifiedTime@verified_time:str",
"like:name:str",
"=:gender:int",
"like:studentNumber@student_number:str",
"=:collegeId@college_id:int",
"=:majorId@major_id:int",
"=:classId@class_id:int",
"=:grade:int",
"=:enrollmentYear@enrollment_year:int",
"=:studentStatus@student_status:int",
"=:politicalStatus@political_status:int",
"like:dormitory:str",
"=:counselorId@counselor_id:int",
"=:academicWarnings@academic_warnings:int",
"=:isVerified@is_verified:int",
"=:verifiedBy@verified_by:int",
});
IPage<StudentInfo> iPage = studentInfoMapper.selectPage(new Page<>(page, limit), queryWrapper);
List<StudentInfoListedVo> list = new LinkedList<>();
for(StudentInfo item : iPage.getRecords()) {
StudentInfoListedVo vo = new StudentInfoListedVo();
BeanUtils.copyProperties(item, vo);
User user = userMapper.selectOne(new QueryWrapper<User>().eq("id", vo.getUserId()));
vo.setName(user.getRealName());
vo.setGender(user.getSex().toString());
vo.setVerifiedTime(TimeUtils.timestampToDate(item.getVerifiedTime()));
vo.setCreateTime(TimeUtils.timestampToDate(item.getCreateTime()));
vo.setUpdateTime(TimeUtils.timestampToDate(item.getUpdateTime()));
College college = collegeMapper.selectById(item.getCollegeId());
Major major = majorMapper.selectById(item.getMajorId());
Class clazz = classMapper.selectById(item.getClassId());
Admin counselor = adminMapper.selectById(item.getCounselorId());
Admin verifier = adminMapper.selectById(item.getVerifiedBy());
vo.setCollegeName(college.getCollegeName());
vo.setMajorName(major.getMajorName());
vo.setClassName(clazz.getClassName());
vo.setCounselorName(counselor.getName());
vo.setVerifierName(verifier.getName());
list.add(vo);
}
@ -119,11 +138,6 @@ public class StudentInfoServiceImpl implements IStudentInfoService {
StudentInfoDetailVo vo = new StudentInfoDetailVo();
BeanUtils.copyProperties(model, vo);
User user = userMapper.selectOne(new QueryWrapper<User>().eq("id", model.getUserId()));
vo.setName(user.getRealName());
vo.setGender(user.getSex().toString());
return vo;
}
@ -136,14 +150,13 @@ public class StudentInfoServiceImpl implements IStudentInfoService {
@Override
public void add(StudentInfoCreateValidate createValidate) {
StudentInfo model = new StudentInfo();
model.setName(createValidate.getName());
model.setGender(createValidate.getGender());
model.setUserId(createValidate.getUserId());
User user = userMapper.selectOne(new QueryWrapper<User>().eq("id", model.getUserId()));
model.setName(user.getRealName());
model.setGender(user.getSex());
model.setStudentNumber(createValidate.getStudentNumber());
model.setCollege(createValidate.getCollege());
model.setMajor(createValidate.getMajor());
model.setClassName(createValidate.getClassName());
model.setCollegeId(createValidate.getCollegeId());
model.setMajorId(createValidate.getMajorId());
model.setClassId(createValidate.getClassId());
model.setGrade(createValidate.getGrade());
model.setEnrollmentYear(createValidate.getEnrollmentYear());
model.setExpectedGraduationYear(createValidate.getExpectedGraduationYear());
@ -157,10 +170,6 @@ public class StudentInfoServiceImpl implements IStudentInfoService {
model.setEmergencyPhone(createValidate.getEmergencyPhone());
model.setDormitory(createValidate.getDormitory());
model.setCounselorId(createValidate.getCounselorId());
model.setTotalCredits(createValidate.getTotalCredits());
model.setGpa(createValidate.getGpa());
model.setScholarshipLevel(createValidate.getScholarshipLevel());
model.setAcademicWarnings(createValidate.getAcademicWarnings());
model.setIsVerified(createValidate.getIsVerified());
model.setVerifiedBy(createValidate.getVerifiedBy());
model.setVerifiedTime(createValidate.getVerifiedTime());
@ -185,14 +194,13 @@ public class StudentInfoServiceImpl implements IStudentInfoService {
Assert.notNull(model, "数据不存在!");
model.setId(updateValidate.getId());
model.setName(updateValidate.getName());
model.setGender(updateValidate.getGender());
model.setUserId(updateValidate.getUserId());
User user = userMapper.selectOne(new QueryWrapper<User>().eq("id", model.getUserId()));
model.setName(user.getRealName());
model.setGender(user.getSex());
model.setStudentNumber(updateValidate.getStudentNumber());
model.setCollege(updateValidate.getCollege());
model.setMajor(updateValidate.getMajor());
model.setClassName(updateValidate.getClassName());
model.setCollegeId(updateValidate.getCollegeId());
model.setMajorId(updateValidate.getMajorId());
model.setClassId(updateValidate.getClassId());
model.setGrade(updateValidate.getGrade());
model.setEnrollmentYear(updateValidate.getEnrollmentYear());
model.setExpectedGraduationYear(updateValidate.getExpectedGraduationYear());
@ -208,7 +216,6 @@ public class StudentInfoServiceImpl implements IStudentInfoService {
model.setCounselorId(updateValidate.getCounselorId());
model.setTotalCredits(updateValidate.getTotalCredits());
model.setGpa(updateValidate.getGpa());
model.setScholarshipLevel(updateValidate.getScholarshipLevel());
model.setAcademicWarnings(updateValidate.getAcademicWarnings());
model.setIsVerified(updateValidate.getIsVerified());
model.setVerifiedBy(updateValidate.getVerifiedBy());
@ -237,6 +244,7 @@ public class StudentInfoServiceImpl implements IStudentInfoService {
@Override
public void createRandomInfo(Integer num) {
if (num == null) throw new NullPointerException("未发送数量");
for (int i = 0; i < num; i++) {
// 生成随机姓名
String name = SimpleRandomGenerator.randomName();
@ -252,25 +260,85 @@ public class StudentInfoServiceImpl implements IStudentInfoService {
// 生成学生信息
StudentInfoCreateValidate createValidate = new StudentInfoCreateValidate();
createValidate.setUserId(userId);
createValidate.setName(name);
createValidate.setGender(SimpleRandomGenerator.extractGenderFromIdCard(idCard));
createValidate.setStudentNumber(account);
createValidate.setCollege("测试学院");
createValidate.setMajor("测试专业");
createValidate.setClassName("测试25001");
createValidate.setGrade("1");
createValidate.setEnrollmentYear("2022");
createValidate.setExpectedGraduationYear("2026");
createValidate.setStudentStatus("1");
Class clazz = getRandomEntity(classMapper);
if (clazz == null) {throw new RuntimeException("为随机学生分配班级信息错误");}
createValidate.setClassId(clazz.getId());
createValidate.setMajorId(clazz.getMajorId());
createValidate.setCollegeId(clazz.getCollegeId());
Integer enrollmentYear = clazz.getEnrollmentYear();
createValidate.setGrade(calculateGrade(enrollmentYear));
createValidate.setEnrollmentYear(enrollmentYear);
createValidate.setExpectedGraduationYear(enrollmentYear + 4);
createValidate.setStudentStatus(1);
createValidate.setIdCard(idCard);
createValidate.setBirthday(SimpleRandomGenerator.extractBirthdayFromIdCard(idCard));
createValidate.setPoliticalStatus("3");
createValidate.setIsVerified("1");
createValidate.setVerifiedBy("1");
createValidate.setPoliticalStatus(random.nextInt(3) + 1);
createValidate.setIsVerified(1);
createValidate.setVerifiedBy(1);
createValidate.setVerifiedTime(System.currentTimeMillis() / 1000);
createValidate.setCounselorId(clazz.getHeadTeacherId());
// 创建学生信息
add(createValidate);
}
}
private <T, M extends BaseMapper<T>> T getRandomEntity(M mapper) {
try {
QueryWrapper<T> wrapper = new QueryWrapper<>();
List<T> entityList = mapper.selectList(wrapper);
// 检查列表是否为空
if (entityList == null || entityList.isEmpty()) {
return null;
}
// 生成随机索引
Random random = new Random();
int randomIndex = random.nextInt(entityList.size());
return entityList.get(randomIndex);
} catch (Exception e) {
return null;
}
}
/**
* 根据班级入学年份计算当前年级
* @param enrollmentYear 班级入学年份
* @return 当前年级1-4 对应大一到大四
*/
private Integer calculateGrade(Integer enrollmentYear) {
if (enrollmentYear == null) {
return null;
}
// 获取当前年份
Calendar calendar = Calendar.getInstance();
int currentYear = calendar.get(Calendar.YEAR);
int currentMonth = calendar.get(Calendar.MONTH) + 1; // 月份从0开始需要+1
// 计算年级
int grade = currentYear - enrollmentYear;
// 调整如果当前月份在9月之前秋季学期开始前年级减1
if (currentMonth < 9) {
grade--;
}
// 确保年级在合理范围内1-4
if (grade < 1) {
grade = 1; // 最小为大一
} else if (grade > 4) {
grade = 4; // 最大为大四
}
return grade;
}
private Integer createRandomUser(String name, String idCard, Integer sn) {
User user = new User();
user.setNickname(name);
@ -292,6 +360,7 @@ public class StudentInfoServiceImpl implements IStudentInfoService {
User user2 = userMapper.selectOne(new QueryWrapper<User>().eq("account", user.getAccount()));
return user2.getId();
}
}
class SimpleRandomGenerator {

View File

@ -0,0 +1,250 @@
package com.mdd.admin.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.mdd.admin.dto.TimeSlotCreateDTO;
import com.mdd.admin.validate.TimeSlotForRowUpdateValidate;
import com.mdd.admin.service.ITimeSlotService;
import com.mdd.admin.validate.TimeSlotInsertValidate;
import com.mdd.admin.validate.TimeSlotSearchValidate;
import com.mdd.admin.validate.TimeSlotUniformValidate;
import com.mdd.admin.vo.TimeSlotListedVo;
import com.mdd.admin.vo.TimeSlotDetailVo;
import com.mdd.common.core.PageResult;
import com.mdd.common.entity.TimeSlot;
import com.mdd.common.mapper.TimeSlotMapper;
import com.mdd.common.util.TimeUtils;
import org.checkerframework.checker.guieffect.qual.UIPackage;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import javax.annotation.Resource;
import java.time.Duration;
import java.time.LocalTime;
import java.util.*;
/**
* 时间段实现类
* @author gyp
*/
@Service
public class TimeSlotServiceImpl implements ITimeSlotService {
@Resource
TimeSlotMapper timeSlotMapper;
/**
* 时间段列表
*
* @author gyp
* @return PageResult<TimeSlotListedVo>
*/
@Override
public List<TimeSlotListedVo> list() {
List<TimeSlot> list = timeSlotMapper.selectList(null);
List<TimeSlotListedVo> result = new LinkedList<>();
for(TimeSlot item : list) {
TimeSlotListedVo vo = new TimeSlotListedVo();
BeanUtils.copyProperties(item, vo);
vo.setCreateTime(TimeUtils.timestampToDate(item.getCreateTime()));
vo.setUpdateTime(TimeUtils.timestampToDate(item.getUpdateTime()));
result.add(vo);
}
return result;
}
/**
* 时间段详情
*
* @author gyp
* @param id 主键参数
* @return TimeSlot
*/
@Override
public TimeSlotDetailVo detail(Integer id) {
TimeSlot model = timeSlotMapper.selectOne(
new QueryWrapper<TimeSlot>()
.eq("id", id)
.last("limit 1"));
Assert.notNull(model, "数据不存在");
TimeSlotDetailVo vo = new TimeSlotDetailVo();
BeanUtils.copyProperties(model, vo);
return vo;
}
/**
* 时间段新增
*
* @author gyp
*/
@Override
public void add(TimeSlotCreateDTO dto) {
TimeSlot model = new TimeSlot();
BeanUtils.copyProperties(dto, model);
model.setCreateTime(System.currentTimeMillis() / 1000);
model.setUpdateTime(System.currentTimeMillis() / 1000);
timeSlotMapper.insert(model);
}
/**
* 节次编辑
* 修改节次开始时间和修改节次时长保证修改后上节次结束时间与早于等于下节次的开始时间
*
* @author gyp
* @param updateValidate 参数
*/
@Override
public void edit(TimeSlotForRowUpdateValidate updateValidate) {
if (updateValidate.getSection() == null) {
throw new RuntimeException("未选择编辑节次");
}
// 提取所有为该节次的时间段
QueryWrapper<TimeSlot> queryWrapper = new QueryWrapper<>();
queryWrapper.orderByDesc("day_of_week");
timeSlotMapper.setSearch(queryWrapper, updateValidate, new String[]{"=:section@section:int",});
List<TimeSlot> timeSlots = timeSlotMapper.selectList(queryWrapper);
// 递归修改所有节次
recursiveEditing(timeSlots, updateValidate);
}
private void recursiveEditing(List<TimeSlot> timeSlots, TimeSlotForRowUpdateValidate updateValidate) {
for(TimeSlot timeSlot : timeSlots) {
timeSlot.setUpdateTime(System.currentTimeMillis() / 1000);
timeSlot.setStartTime(updateValidate.getStartTime());
timeSlot.setEndTime(updateValidate.getEndTime());
timeSlot.setIsScheduled(updateValidate.getIsScheduled());
timeSlotMapper.updateById(timeSlot);
}
// 修改完成后提取下个节次的所有时间段
TimeSlotForRowUpdateValidate updateValidate2 = new TimeSlotForRowUpdateValidate();
updateValidate2.setSection(updateValidate.getSection()+1);
QueryWrapper<TimeSlot> queryWrapper = new QueryWrapper<>();
queryWrapper.orderByDesc("day_of_week");
timeSlotMapper.setSearch(queryWrapper, updateValidate2, new String[]{"=:section@section:int",});
List<TimeSlot> timeSlots2 = timeSlotMapper.selectList(queryWrapper);
if(timeSlots2.isEmpty()) return; // 没有下一时间段跳出递归
LocalTime a = updateValidate.getEndTime(); // 当前节次结束时间
LocalTime b = timeSlots2.get(0).getStartTime(); // 下一节次开始时间
LocalTime c = timeSlots2.get(0).getEndTime(); // 下一节次结束时间
// 若当前结束时间比下一开始时间晚进入递归
if(a.isAfter(b)) {
long min = Duration.between(b,a).toMinutes();
updateValidate2.setStartTime(b.plusMinutes(min));
updateValidate2.setEndTime(c.plusMinutes(min));
updateValidate2.setIsScheduled(timeSlots2.get(0).getIsScheduled());
recursiveEditing(timeSlots2, updateValidate2);
}
}
/**
* 时间段删除
*
* @author gyp
*/
@Override
public void del(Integer count) {
Integer index = getDailySectionCount(); // 当前节次数
for(int i = 0; i < count; i++) {
int section = index-i; // 要删除的节次
if(section < 1) break; // 若要删除的节次已经小于1则无可删除提取结束循环
timeSlotMapper.delete(new QueryWrapper<TimeSlot>().eq("section", section));
}
}
@Override
public void insert(TimeSlotInsertValidate insertValidate) {
int num = 0;
if(insertValidate.getNum() != null) num = insertValidate.getNum();
LocalTime startTime = insertValidate.getStartTime();
Integer duration = insertValidate.getDuration();
Integer intervalDuration = insertValidate.getIntervalDuration();
int index = getDailySectionCount();
for (int i = 0; i < num; i++) { // 连续添加节次行数
// 当前开始时间 = 初始开始时间 + 循环次数 * (上课时长+下课时长)
LocalTime curStartTime = startTime.plusMinutes((long) i *(duration+intervalDuration));
for (int j = 0; j < 7; j++) { // 添加一行节次(7次即每周有7天)
TimeSlotCreateDTO dto = new TimeSlotCreateDTO();
dto.setSection(index+1+i); // 设置当前时间段的节次
dto.setDayOfWeek(j+1); // 设置星期几
dto.setSlotCode(getSlotCode(dto)); // 设置时间段代码(节次+星期几)
dto.setSlotName(dto.getSlotCode()); // 没想好命名
dto.setIsScheduled(insertValidate.getIsScheduled());// 是否参与排课
dto.setStartTime(curStartTime);
dto.setEndTime(dto.getStartTime().plusMinutes(insertValidate.getDuration()));// 结束时间
add(dto);
}
}
}
@Override
public void uniform(TimeSlotUniformValidate uniformValidate, LocalTime lastEndTime, Integer section) {
// 获取当前节次开始与结束时间
TimeSlot timeSlot = timeSlotMapper.selectOne(
new QueryWrapper<TimeSlot>().eq("section", section).eq("day_of_week", 1));
if(timeSlot == null) return;
LocalTime startTime = timeSlot.getStartTime();
LocalTime endTime = timeSlot.getEndTime();
// 判断是否要修改当前节次的开始时间
if(lastEndTime != null && Duration.between(lastEndTime, startTime).toMinutes() < uniformValidate.getIntervalDuration()) {
startTime = lastEndTime.plusMinutes(uniformValidate.getIntervalDuration());
}
// 获取间隔时间差
Integer duration = (int)Duration.between(startTime,endTime).toMinutes();
// 计算需要修改的时间差
int diffVal = uniformValidate.getDuration() - duration;
// 修改当前节的结束时间
endTime = endTime.plusMinutes(diffVal);
// 调用edit方法更新
TimeSlotForRowUpdateValidate updateValidate = new TimeSlotForRowUpdateValidate();
updateValidate.setSection(timeSlot.getSection());
updateValidate.setStartTime(startTime);
updateValidate.setEndTime(endTime);
updateValidate.setIsScheduled(timeSlot.getIsScheduled());
edit(updateValidate);
// 递归修改
uniform(uniformValidate, endTime, section+1);
}
/**
* 设置时间段代码(星期几+节次)
* */
private String getSlotCode(TimeSlotCreateDTO dto) {
Integer dayOfWeek = dto.getDayOfWeek();
Integer section = dto.getSection();
String code = section.toString();
if(section < 10) code = "0"+section;
String dayOfWeekStr;
switch (dayOfWeek) {
case 1: dayOfWeekStr = "mon"; break;
case 2: dayOfWeekStr = "tue"; break;
case 3: dayOfWeekStr = "wed"; break;
case 4: dayOfWeekStr = "thu"; break;
case 5: dayOfWeekStr = "fri"; break;
case 6: dayOfWeekStr = "sat"; break;
case 7: dayOfWeekStr = "sun"; break;
default: dayOfWeekStr = "";
}
return code + dayOfWeekStr;
}
/**
* 查询一共有多少个有效节次
* @return 周一的时间段数量无数据返回 0
*/
private Integer getDailySectionCount() {
// 构建查询条件1. 周一day_of_week=12. 未逻辑删除delete_time IS NULL
QueryWrapper<TimeSlot> queryWrapper = new QueryWrapper<TimeSlot>()
.eq("day_of_week", 1) // 表结构注释1=周一
.isNull("delete_time"); // 过滤已删除的无效数据
long count = timeSlotMapper.selectCount(queryWrapper);
return (int) count;
}
}

View File

@ -527,7 +527,7 @@ public class AdminServiceImpl implements IAdminService {
AdminMySelfVo ret = new AdminMySelfVo();
// 当前管理员角色拥有的菜单
ret.setMenu(systemMenuService.selectMenuByRoleId(roleIds));
// 当前管理员色拥有的按钮权限
// 当前管理员色拥有的按钮权限
ret.setPermissions(iAuthService.getBtnAuthByRoleId(id));
SystemAuthAdminDetailVo admin = detail(id);
AuthMySelfVo user = new AuthMySelfVo();

View File

@ -71,7 +71,36 @@ public class SystemMenuServiceImpl implements ISystemMenuService {
}
JSONArray jsonArray = JSONArray.parseArray(JSONArray.toJSONString(lists));
return ListUtils.listToTree(jsonArray, "id", "pid", "children");
JSONArray r = ListUtils.listToTree(jsonArray, "id", "pid", "children");
return r;
}
/**
* 递归遍历树形结构设置hasChildren字段
* @param nodes 节点数组
* @param childFieldName 子节点字段名
*/
private static void setHasChildrenField(JSONArray nodes, String childFieldName) {
for (Object nodeObj : nodes) {
JSONObject node = (JSONObject) nodeObj;
// 检查当前节点是否有子节点
if (node.containsKey(childFieldName)) {
JSONArray children = node.getJSONArray(childFieldName);
if (children != null && !children.isEmpty()) {
// 有子节点设置hasChildren为true
node.put("hasChildren", true);
// 递归处理子节点
setHasChildrenField(children, childFieldName);
} else {
// 有children字段但为空设置为false
node.put("hasChildren", false);
}
} else {
// 没有children字段设置为0
node.put("hasChildren", false);
}
}
}
/**
@ -128,8 +157,8 @@ public class SystemMenuServiceImpl implements ISystemMenuService {
}
JSONArray jsonArray = JSONArray.parseArray(JSONArray.toJSONString(lists));
return ListUtils.listToTree(jsonArray, "id", "pid", "children");
JSONArray r = ListUtils.listToTree(jsonArray, "id", "pid", "children");
return r;
}
/**

View File

@ -0,0 +1,42 @@
package com.mdd.admin.validate;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import javax.validation.constraints.*;
@Data
@ApiModel("教室创建参数")
public class ClassroomCreateValidate implements Serializable {
private static final long serialVersionUID = 1L;
@NotNull(message = "classroomCode参数缺失")
@ApiModelProperty(value = "教室编号")
private String classroomCode;
@NotNull(message = "classroomName参数缺失")
@ApiModelProperty(value = "教室名称")
private String classroomName;
@NotNull(message = "classroomTypeId参数缺失")
@ApiModelProperty(value = "教室类型ID")
private Integer classroomTypeId;
@NotNull(message = "capacity参数缺失")
@ApiModelProperty(value = "教室容量(座位数)")
private Integer capacity;
@NotNull(message = "location参数缺失")
@ApiModelProperty(value = "教室位置")
private String location;
@ApiModelProperty(value = "特殊要求说明")
private String specialRequirements;
@NotNull(message = "status参数缺失")
@ApiModelProperty(value = "状态1-启用0-禁用")
private Integer status;
}

View File

@ -0,0 +1,29 @@
package com.mdd.admin.validate;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@Data
@ApiModel("教室搜素参数")
public class ClassroomSearchValidate implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "教室编号")
private String classroomCode;
@ApiModelProperty(value = "教室名称")
private String classroomName;
@ApiModelProperty(value = "教室类型ID")
private Integer classroomTypeId;
@ApiModelProperty(value = "教室位置")
private String location;
@ApiModelProperty(value = "状态1-启用0-禁用")
private Integer status;
}

View File

@ -0,0 +1,30 @@
package com.mdd.admin.validate;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import javax.validation.constraints.*;
@Data
@ApiModel("教室类型创建参数")
public class ClassroomTypeCreateValidate implements Serializable {
private static final long serialVersionUID = 1L;
@NotNull(message = "typeName参数缺失")
@ApiModelProperty(value = "类型名称(如:普通教室、实验室、多媒体教室、体育场等)")
private String typeName;
@NotNull(message = "typeCode参数缺失")
@ApiModelProperty(value = "类型编码")
private String typeCode;
@ApiModelProperty(value = "类型描述")
private String description;
@NotNull(message = "status参数缺失")
@ApiModelProperty(value = "状态1-启用0-禁用")
private Integer status;
}

View File

@ -0,0 +1,23 @@
package com.mdd.admin.validate;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@Data
@ApiModel("教室类型搜素参数")
public class ClassroomTypeSearchValidate implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "类型名称(如:普通教室、实验室、多媒体教室、体育场等)")
private String typeName;
@ApiModelProperty(value = "类型编码")
private String typeCode;
@ApiModelProperty(value = "状态1-启用0-禁用")
private Integer status;
}

View File

@ -0,0 +1,39 @@
package com.mdd.admin.validate;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import javax.validation.constraints.*;
import com.mdd.common.validator.annotation.IDMust;
/**
* 教室类型参数
* @author gyp
*/
@Data
@ApiModel("教室类型更新参数")
public class ClassroomTypeUpdateValidate implements Serializable {
private static final long serialVersionUID = 1L;
@IDMust(message = "id参数必传且需大于0")
@ApiModelProperty(value = "")
private Integer id;
@NotNull(message = "typeName参数缺失")
@ApiModelProperty(value = "类型名称(如:普通教室、实验室、多媒体教室、体育场等)")
private String typeName;
@NotNull(message = "typeCode参数缺失")
@ApiModelProperty(value = "类型编码")
private String typeCode;
@ApiModelProperty(value = "类型描述")
private String description;
@NotNull(message = "status参数缺失")
@ApiModelProperty(value = "状态1-启用0-禁用")
private Integer status;
}

View File

@ -0,0 +1,51 @@
package com.mdd.admin.validate;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import javax.validation.constraints.*;
import com.mdd.common.validator.annotation.IDMust;
/**
* 教室参数
* @author LikeAdmin
*/
@Data
@ApiModel("教室更新参数")
public class ClassroomUpdateValidate implements Serializable {
private static final long serialVersionUID = 1L;
@IDMust(message = "id参数必传且需大于0")
@ApiModelProperty(value = "")
private Integer id;
@NotNull(message = "classroomCode参数缺失")
@ApiModelProperty(value = "教室编号")
private String classroomCode;
@NotNull(message = "classroomName参数缺失")
@ApiModelProperty(value = "教室名称")
private String classroomName;
@NotNull(message = "classroomTypeId参数缺失")
@ApiModelProperty(value = "教室类型ID")
private Integer classroomTypeId;
@NotNull(message = "capacity参数缺失")
@ApiModelProperty(value = "教室容量(座位数)")
private Integer capacity;
@NotNull(message = "location参数缺失")
@ApiModelProperty(value = "教室位置")
private String location;
@ApiModelProperty(value = "特殊要求说明")
private String specialRequirements;
@NotNull(message = "status参数缺失")
@ApiModelProperty(value = "状态1-启用0-禁用")
private Integer status;
}

View File

@ -0,0 +1,104 @@
package com.mdd.admin.validate;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.math.BigDecimal;
import javax.validation.constraints.*;
@Data
@ApiModel("学生信息创建参数")
public class StudentInfoCreateValidate implements Serializable {
private static final long serialVersionUID = 1L;
@NotNull(message = "name参数缺失")
@ApiModelProperty(value = "姓名")
private String name;
@NotNull(message = "gender参数缺失")
@ApiModelProperty(value = "性别 1-男 2-女")
private Integer gender;
@NotNull(message = "userId参数缺失")
@ApiModelProperty(value = "关联用户ID")
private Integer userId;
@NotNull(message = "studentNumber参数缺失")
@ApiModelProperty(value = "学号")
private String studentNumber;
@NotNull(message = "collegeId参数缺失")
@ApiModelProperty(value = "学院ID")
private Integer collegeId;
@NotNull(message = "majorId参数缺失")
@ApiModelProperty(value = "专业ID")
private Integer majorId;
@NotNull(message = "classId参数缺失")
@ApiModelProperty(value = "班级ID")
private Integer classId;
@NotNull(message = "grade参数缺失")
@ApiModelProperty(value = "年级")
private Integer grade;
@NotNull(message = "enrollmentYear参数缺失")
@ApiModelProperty(value = "入学年份")
private Integer enrollmentYear;
@NotNull(message = "expectedGraduationYear参数缺失")
@ApiModelProperty(value = "预计毕业年份")
private Integer expectedGraduationYear;
@NotNull(message = "studentStatus参数缺失")
@ApiModelProperty(value = "学生状态: [1=在读, 2=休学, 3=毕业, 4=退学]")
private Integer studentStatus;
@NotNull(message = "idCard参数缺失")
@ApiModelProperty(value = "身份证号")
private String idCard;
@NotNull(message = "birthday参数缺失")
@ApiModelProperty(value = "出生日期")
private String birthday;
@NotNull(message = "politicalStatus参数缺失")
@ApiModelProperty(value = "政治面貌: [1=党员, 2=团员, 3=群众]")
private Integer politicalStatus;
@NotNull(message = "nativePlace参数缺失")
@ApiModelProperty(value = "籍贯")
private String nativePlace;
@ApiModelProperty(value = "家庭住址")
private String homeAddress;
@ApiModelProperty(value = "紧急联系人")
private String emergencyContact;
@ApiModelProperty(value = "紧急联系电话")
private String emergencyPhone;
@ApiModelProperty(value = "宿舍号")
private String dormitory;
@ApiModelProperty(value = "辅导员用户ID")
private Integer counselorId;
@NotNull(message = "isVerified参数缺失")
@ApiModelProperty(value = "是否认证: [0=未认证, 1=已认证]")
private Integer isVerified;
@NotNull(message = "verifiedBy参数缺失")
@ApiModelProperty(value = "认证人ID")
private Integer verifiedBy;
@NotNull(message = "verifiedTime参数缺失")
@ApiModelProperty(value = "认证时间")
private Long verifiedTime;
}

View File

@ -0,0 +1,61 @@
package com.mdd.admin.validate;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.math.BigDecimal;
@Data
@ApiModel("学生信息搜素参数")
public class StudentInfoSearchValidate implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "姓名")
private String name;
@ApiModelProperty(value = "性别 1-男 2-女")
private Integer gender;
@ApiModelProperty(value = "学号")
private String studentNumber;
@ApiModelProperty(value = "学院ID")
private Integer collegeId;
@ApiModelProperty(value = "专业ID")
private Integer majorId;
@ApiModelProperty(value = "班级ID")
private Integer classId;
@ApiModelProperty(value = "年级")
private Integer grade;
@ApiModelProperty(value = "入学年份")
private Integer enrollmentYear;
@ApiModelProperty(value = "学生状态: [1=在读, 2=休学, 3=毕业, 4=退学]")
private Integer studentStatus;
@ApiModelProperty(value = "政治面貌: [1=党员, 2=团员, 3=群众]")
private Integer politicalStatus;
@ApiModelProperty(value = "宿舍号")
private String dormitory;
@ApiModelProperty(value = "辅导员用户ID")
private Integer counselorId;
@ApiModelProperty(value = "学业预警: [0=无, 1=一级预警, 2=二级预警, 3=三级预警]")
private Integer academicWarnings;
@ApiModelProperty(value = "是否认证: [0=未认证, 1=已认证]")
private Integer isVerified;
@ApiModelProperty(value = "认证人ID")
private Integer verifiedBy;
}

View File

@ -1,18 +1,36 @@
package com.mdd.admin.validate.student;
package com.mdd.admin.validate;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import javax.validation.constraints.*;
import java.math.BigDecimal;
import java.math.BigDecimal;
import com.mdd.common.validator.annotation.IDMust;
/**
* 学生信息参数
* @author gyp
*/
@Data
@ApiModel("学生信息创建参数")
public class StudentInfoCreateValidate implements Serializable {
@ApiModel("学生信息更新参数")
public class StudentInfoUpdateValidate implements Serializable {
private static final long serialVersionUID = 1L;
@IDMust(message = "id参数必传且需大于0")
@ApiModelProperty(value = "主键")
private Integer id;
@NotNull(message = "name参数缺失")
@ApiModelProperty(value = "姓名")
private String name;
@NotNull(message = "gender参数缺失")
@ApiModelProperty(value = "性别 1-男 2-女")
private Integer gender;
@NotNull(message = "userId参数缺失")
@ApiModelProperty(value = "关联用户ID")
private Integer userId;
@ -21,33 +39,33 @@ public class StudentInfoCreateValidate implements Serializable {
@ApiModelProperty(value = "学号")
private String studentNumber;
@NotNull(message = "college参数缺失")
@ApiModelProperty(value = "学院")
private String college;
@NotNull(message = "collegeId参数缺失")
@ApiModelProperty(value = "学院ID")
private Integer collegeId;
@NotNull(message = "major参数缺失")
@ApiModelProperty(value = "专业")
private String major;
@NotNull(message = "majorId参数缺失")
@ApiModelProperty(value = "专业ID")
private Integer majorId;
@NotNull(message = "className参数缺失")
@ApiModelProperty(value = "班级")
private String className;
@NotNull(message = "classId参数缺失")
@ApiModelProperty(value = "班级ID")
private Integer classId;
@NotNull(message = "grade参数缺失")
@ApiModelProperty(value = "年级")
private String grade;
private Integer grade;
@NotNull(message = "enrollmentYear参数缺失")
@ApiModelProperty(value = "入学年份")
private String enrollmentYear;
private Integer enrollmentYear;
@NotNull(message = "expectedGraduationYear参数缺失")
@ApiModelProperty(value = "预计毕业年份")
private String expectedGraduationYear;
private Integer expectedGraduationYear;
@NotNull(message = "studentStatus参数缺失")
@ApiModelProperty(value = "学生状态: [1=在读, 2=休学, 3=毕业, 4=退学]")
private String studentStatus;
private Integer studentStatus;
@NotNull(message = "idCard参数缺失")
@ApiModelProperty(value = "身份证号")
@ -59,58 +77,46 @@ public class StudentInfoCreateValidate implements Serializable {
@NotNull(message = "politicalStatus参数缺失")
@ApiModelProperty(value = "政治面貌: [1=党员, 2=团员, 3=群众]")
private String politicalStatus;
private Integer politicalStatus;
@NotNull(message = "nativePlace参数缺失")
@ApiModelProperty(value = "籍贯")
private String nativePlace;
@NotNull(message = "homeAddress参数缺失")
@ApiModelProperty(value = "家庭住址")
private String homeAddress;
@NotNull(message = "emergencyContact参数缺失")
@ApiModelProperty(value = "紧急联系人")
private String emergencyContact;
@NotNull(message = "emergencyPhone参数缺失")
@ApiModelProperty(value = "紧急联系电话")
private String emergencyPhone;
@NotNull(message = "dormitory参数缺失")
@ApiModelProperty(value = "宿舍号")
private String dormitory;
@NotNull(message = "counselorId参数缺失")
@ApiModelProperty(value = "辅导员用户ID")
private String counselorId;
private Integer counselorId;
@NotNull(message = "totalCredits参数缺失")
@ApiModelProperty(value = "总学分")
private BigDecimal totalCredits;
@NotNull(message = "gpa参数缺失")
@ApiModelProperty(value = "平均绩点")
private BigDecimal gpa;
@NotNull(message = "scholarshipLevel参数缺失")
@ApiModelProperty(value = "奖学金等级: [0=无, 1=一等奖, 2=二等奖, 3=三等奖]")
private String scholarshipLevel;
@NotNull(message = "academicWarnings参数缺失")
@ApiModelProperty(value = "学业预警: [0=无, 1=一级预警, 2=二级预警, 3=三级预警]")
private String academicWarnings;
private Integer academicWarnings;
@NotNull(message = "isVerified参数缺失")
@ApiModelProperty(value = "是否认证: [0=未认证, 1=已认证]")
private String isVerified;
private Integer isVerified;
@NotNull(message = "verifiedBy参数缺失")
@ApiModelProperty(value = "认证人ID")
private String verifiedBy;
private Integer verifiedBy;
@NotNull(message = "verifiedTime参数缺失")
@ApiModelProperty(value = "认证时间")
private String verifiedTime;
private Long verifiedTime;
}

View File

@ -0,0 +1,34 @@
package com.mdd.admin.validate;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.models.auth.In;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.time.LocalTime;
/**
* 时间段参数
* @author gyp
*/
@Data
@ApiModel("某节时间段更新参数")
public class TimeSlotForRowUpdateValidate implements Serializable {
private static final long serialVersionUID = 1L;
@NotNull(message = "所选节次不为空")
@ApiModelProperty(value = "要修改的节次")
private Integer section;
@ApiModelProperty(value = "该节次开始时间")
private LocalTime startTime;
@ApiModelProperty(value = "该节次结束时间")
private LocalTime endTime;
@ApiModelProperty(value = "是否排课")
private Integer isScheduled;
}

View File

@ -0,0 +1,33 @@
package com.mdd.admin.validate;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalTime;
import javax.validation.constraints.*;
@Data
@ApiModel("时间表创建参数")
public class TimeSlotInsertValidate implements Serializable {
private static final long serialVersionUID = 1L;
@NotNull(message = "开始时间不为空")
@ApiModelProperty(value = "开始时间")
private LocalTime startTime;
@NotNull(message = "节次时长不为空")
@ApiModelProperty(value = "每节课时长(分钟)")
private Integer duration;
@NotNull(message = "未决定节次是否参与排课")
@ApiModelProperty(value = "是否参与排课")
private Integer isScheduled;
@ApiModelProperty(value = "连续插入节次数")
private Integer num;
@ApiModelProperty(value = "每节课间隔时长(分钟)")
private Integer intervalDuration;
}

View File

@ -0,0 +1,29 @@
package com.mdd.admin.validate;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@Data
@ApiModel("时间段搜素参数")
public class TimeSlotSearchValidate implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "时间段代码")
private String slotCode;
@ApiModelProperty(value = "星期几1-周一2-周二3-周三4-周四5-周五6-周六7-周日")
private Integer dayOfWeek;
@ApiModelProperty(value = "时间段名称")
private String slotName;
@ApiModelProperty(value = "时间段类型1-上午2-下午3-晚上")
private Integer slotType;
@ApiModelProperty(value = "状态1-启用0-禁用")
private Integer status;
}

View File

@ -0,0 +1,19 @@
package com.mdd.admin.validate;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiOperation;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
@Data
@ApiModel("TimeSlotSectionDelValidate删除节次数参数")
public class TimeSlotSectionDelValidate implements Serializable {
private static final long serialVersionUID = 1L;
@NotNull(message = "删除节次数不为空")
@ApiModelProperty(value = "要删除的节次数")
private Integer count;
}

View File

@ -0,0 +1,22 @@
package com.mdd.admin.validate;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
@Data
@ApiModel("TimeSlotSectionDelValidate删除节次数参数")
public class TimeSlotUniformValidate implements Serializable {
private static final long serialVersionUID = 1L;
@NotNull(message = "节次统一时长不为空")
@ApiModelProperty(value = "统一节次时长")
private Integer duration;
@NotNull
@ApiModelProperty(value = "统一最小节次间隔")
private Integer intervalDuration;
}

View File

@ -0,0 +1,31 @@
package com.mdd.admin.validate;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import javax.validation.constraints.*;
import com.mdd.common.validator.annotation.IDMust;
/**
* 时间段参数
* @author gyp
*/
@Data
@ApiModel("时间表更新参数")
public class TimeSlotUpdateValidate implements Serializable {
private static final long serialVersionUID = 1L;
@NotNull(message = "每天节次不为空")
@ApiModelProperty(value = "每天节次")
private Integer num;
@NotNull(message = "每节课时长不为空(分钟)")
@ApiModelProperty(value = "每节课时长")
private Integer duration;
@NotNull(message = "每节课间隔时长不为空")
@ApiModelProperty(value = "每节课间隔时长(分钟)")
private Integer intervalDuration;
}

View File

@ -0,0 +1,18 @@
package com.mdd.admin.validate.commons;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
@Data
@ApiModel("数量参数")
public class NumValidate implements Serializable {
private static final long serialVersionUID = 1L;
@NotNull(message = "数量参数缺失")
@ApiModelProperty(value = "数量", required = true)
private Integer num;
}

View File

@ -5,6 +5,7 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
@Data
@ApiModel("课程创建参数")
@ -12,19 +13,19 @@ public class CourseCreateValidate implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "课程代码")
@ApiModelProperty(value = "课程代码(必填,唯一标识)")
private String courseCode;
@ApiModelProperty(value = "课程名称")
@ApiModelProperty(value = "课程名称(必填,全称)")
private String courseName;
@ApiModelProperty(value = "课程类型1-理论课2-实验课3-研讨课4-体育课5-实践课")
private Integer courseType;
@ApiModelProperty(value = "课程类型ID")
private Integer courseTypeId;
@ApiModelProperty(value = "学分")
@ApiModelProperty(value = "学分(必填,支持小数)")
private BigDecimal credits;
@ApiModelProperty(value = "总学时")
@ApiModelProperty(value = "总学时(必填,整数)")
private Integer totalHours;
@ApiModelProperty(value = "每次连上节数")
@ -33,13 +34,12 @@ public class CourseCreateValidate implements Serializable {
@ApiModelProperty(value = "每周次数")
private Integer sessionsPerWeek;
@ApiModelProperty(value = "设备要求")
private String equipmentRequirements;
@ApiModelProperty(value = "设备要求(多设备用逗号分隔)")
private List<Integer> equipmentRequirements;
@ApiModelProperty(value = "课程描述")
private String description;
@ApiModelProperty(value = "状态1-启用0-禁用")
private Integer status;
}

View File

@ -17,8 +17,8 @@ public class CourseSearchValidate implements Serializable {
@ApiModelProperty(value = "课程名称")
private String courseName;
@ApiModelProperty(value = "课程类型1-理论课2-实验课3-研讨课4-体育课5-实践课")
private Integer courseType;
@ApiModelProperty(value = "课程类型ID")
private Integer courseTypeId;
@ApiModelProperty(value = "状态1-启用0-禁用")
private Integer status;

View File

@ -0,0 +1,25 @@
package com.mdd.admin.validate.course;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import javax.validation.constraints.*;
@Data
@ApiModel("课程类型创建参数")
public class CourseTypeCreateValidate implements Serializable {
private static final long serialVersionUID = 1L;
@NotNull(message = "typeName参数缺失")
@ApiModelProperty(value = "类型名称")
private String typeName;
@ApiModelProperty(value = "类型描述")
private String description;
@ApiModelProperty(value = "排序")
private Integer sortOrder;
}

View File

@ -0,0 +1,17 @@
package com.mdd.admin.validate.course;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@Data
@ApiModel("课程类型搜素参数")
public class CourseTypeSearchValidate implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "类型名称")
private String typeName;
}

View File

@ -0,0 +1,34 @@
package com.mdd.admin.validate.course;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import javax.validation.constraints.*;
import com.mdd.common.validator.annotation.IDMust;
/**
* 课程类型参数
* @author LikeAdmin
*/
@Data
@ApiModel("课程类型更新参数")
public class CourseTypeUpdateValidate implements Serializable {
private static final long serialVersionUID = 1L;
@IDMust(message = "id参数必传且需大于0")
@ApiModelProperty(value = "")
private Integer id;
@NotNull(message = "typeName参数缺失")
@ApiModelProperty(value = "类型名称")
private String typeName;
@ApiModelProperty(value = "类型描述")
private String description;
@ApiModelProperty(value = "排序")
private Integer sortOrder;
}

View File

@ -5,6 +5,8 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
import com.mdd.common.validator.annotation.IDMust;
/**
@ -27,8 +29,8 @@ public class CourseUpdateValidate implements Serializable {
@ApiModelProperty(value = "课程名称")
private String courseName;
@ApiModelProperty(value = "课程类型1-理论课2-实验课3-研讨课4-体育课5-实践课")
private Integer courseType;
@ApiModelProperty(value = "课程类型")
private Integer courseTypeId;
@ApiModelProperty(value = "学分")
private BigDecimal credits;
@ -43,7 +45,7 @@ public class CourseUpdateValidate implements Serializable {
private Integer sessionsPerWeek;
@ApiModelProperty(value = "设备要求")
private String equipmentRequirements;
private List<Integer> equipmentRequirements;
@ApiModelProperty(value = "课程描述")
private String description;

View File

@ -0,0 +1,34 @@
package com.mdd.admin.validate.equipmentRequirement;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import javax.validation.constraints.*;
@Data
@ApiModel("设备要求创建参数")
public class EquipmentRequirementCreateValidate implements Serializable {
private static final long serialVersionUID = 1L;
@NotNull(message = "equipmentName参数缺失")
@ApiModelProperty(value = "设备名称")
private String equipmentName;
@NotNull(message = "equipmentCode参数缺失")
@ApiModelProperty(value = "设备编码")
private String equipmentCode;
@NotNull(message = "equipmentType参数缺失")
@ApiModelProperty(value = "设备类型1-基础设备2-专业设备3-特殊设备")
private Integer equipmentType;
@ApiModelProperty(value = "设备描述")
private String description;
@NotNull(message = "status参数缺失")
@ApiModelProperty(value = "状态1-启用0-禁用")
private Integer status;
}

View File

@ -0,0 +1,26 @@
package com.mdd.admin.validate.equipmentRequirement;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@Data
@ApiModel("设备要求搜素参数")
public class EquipmentRequirementSearchValidate implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "设备名称")
private String equipmentName;
@ApiModelProperty(value = "设备编码")
private String equipmentCode;
@ApiModelProperty(value = "设备类型1-基础设备2-专业设备3-特殊设备")
private Integer equipmentType;
@ApiModelProperty(value = "状态1-启用0-禁用")
private Integer status;
}

View File

@ -0,0 +1,44 @@
package com.mdd.admin.validate.equipmentRequirement;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import javax.validation.constraints.*;
import com.mdd.common.validator.annotation.IDMust;
/**
* 设备要求参数
* @author gyp
*/
@Data
@ApiModel("设备要求更新参数")
public class EquipmentRequirementUpdateValidate implements Serializable {
private static final long serialVersionUID = 1L;
@IDMust(message = "id参数必传且需大于0")
@ApiModelProperty(value = "")
private Integer id;
@NotNull(message = "equipmentName参数缺失")
@ApiModelProperty(value = "设备名称")
private String equipmentName;
@NotNull(message = "equipmentCode参数缺失")
@ApiModelProperty(value = "设备编码")
private String equipmentCode;
@NotNull(message = "equipmentType参数缺失")
@ApiModelProperty(value = "设备类型1-基础设备2-专业设备3-特殊设备")
private Integer equipmentType;
@ApiModelProperty(value = "设备描述")
private String description;
@NotNull(message = "status参数缺失")
@ApiModelProperty(value = "状态1-启用0-禁用")
private Integer status;
}

View File

@ -3,6 +3,8 @@ package com.mdd.admin.validate.major;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.math.BigDecimal;
@ -13,23 +15,28 @@ public class MajorCreateValidate implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "专业代码")
@NotNull(message = "专业代码不为空")
private String majorCode;
@NotNull(message = "专业名称不为空")
@ApiModelProperty(value = "专业名称")
private String majorName;
@ApiModelProperty(value = "专业英文名")
private String majorEnglishName;
@NotNull(message = "所属学院不为空")
@ApiModelProperty(value = "所属学院ID")
private Integer collegeId;
@NotNull(message = "专业类型不为空")
@ApiModelProperty(value = "专业类型: [1=本科, 2=硕士, 3=博士, 4=专科]")
private Integer majorType;
@ApiModelProperty(value = "学科门类")
private String disciplineCategory;
@NotNull(message = "学年制不为空")
@ApiModelProperty(value = "学制(年)")
private Integer studyDuration;

View File

@ -1,97 +0,0 @@
package com.mdd.admin.validate.student;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.models.auth.In;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
@Data
@ApiModel("学生信息搜素参数")
public class StudentInfoSearchValidate implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "关联用户ID")
private String userId;
@ApiModelProperty(value = "姓名")
private String name;
@ApiModelProperty(value = "性别")
private Integer gender;
@ApiModelProperty(value = "学号")
private String studentNumber;
@ApiModelProperty(value = "学院")
private String college;
@ApiModelProperty(value = "专业")
private String major;
@ApiModelProperty(value = "班级")
private String className;
@ApiModelProperty(value = "年级")
private String grade;
@ApiModelProperty(value = "入学年份")
private String enrollmentYear;
@ApiModelProperty(value = "预计毕业年份")
private String expectedGraduationYear;
@ApiModelProperty(value = "学生状态: [1=在读, 2=休学, 3=毕业, 4=退学]")
private String studentStatus;
@ApiModelProperty(value = "身份证号")
private String idCard;
@ApiModelProperty(value = "出生日期")
private String birthday;
@ApiModelProperty(value = "政治面貌: [1=党员, 2=团员, 3=群众]")
private String politicalStatus;
@ApiModelProperty(value = "籍贯")
private String nativePlace;
@ApiModelProperty(value = "家庭住址")
private String homeAddress;
@ApiModelProperty(value = "紧急联系人")
private String emergencyContact;
@ApiModelProperty(value = "紧急联系电话")
private String emergencyPhone;
@ApiModelProperty(value = "宿舍号")
private String dormitory;
@ApiModelProperty(value = "辅导员用户ID")
private String counselorId;
@ApiModelProperty(value = "总学分")
private BigDecimal totalCredits;
@ApiModelProperty(value = "平均绩点")
private BigDecimal gpa;
@ApiModelProperty(value = "奖学金等级: [0=无, 1=一等奖, 2=二等奖, 3=三等奖]")
private String scholarshipLevel;
@ApiModelProperty(value = "学业预警: [0=无, 1=一级预警, 2=二级预警, 3=三级预警]")
private String academicWarnings;
@ApiModelProperty(value = "是否认证: [0=未认证, 1=已认证]")
private String isVerified;
@ApiModelProperty(value = "认证人ID")
private String verifiedBy;
@ApiModelProperty(value = "认证时间")
private String verifiedTime;
}

View File

@ -1,101 +0,0 @@
package com.mdd.admin.validate.student;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import javax.validation.constraints.*;
import java.math.BigDecimal;
import com.mdd.common.validator.annotation.IDMust;
/**
* 学生信息参数
* @author gyp
*/
@Data
@ApiModel("学生信息更新参数")
public class StudentInfoUpdateValidate implements Serializable {
private static final long serialVersionUID = 1L;
@IDMust(message = "id参数必传且需大于0")
@ApiModelProperty(value = "主键")
private Integer id;
@NotNull(message = "userId参数缺失")
@ApiModelProperty(value = "关联用户ID")
private Integer userId;
@ApiModelProperty(value = "学号")
private String studentNumber;
@ApiModelProperty(value = "学院")
private String college;
@ApiModelProperty(value = "专业")
private String major;
@ApiModelProperty(value = "班级")
private String className;
@ApiModelProperty(value = "年级")
private String grade;
@ApiModelProperty(value = "入学年份")
private String enrollmentYear;
@ApiModelProperty(value = "预计毕业年份")
private String expectedGraduationYear;
@ApiModelProperty(value = "学生状态: [1=在读, 2=休学, 3=毕业, 4=退学]")
private String studentStatus;
@ApiModelProperty(value = "身份证号")
private String idCard;
@ApiModelProperty(value = "出生日期")
private String birthday;
@ApiModelProperty(value = "政治面貌: [1=党员, 2=团员, 3=群众]")
private String politicalStatus;
@ApiModelProperty(value = "籍贯")
private String nativePlace;
@ApiModelProperty(value = "家庭住址")
private String homeAddress;
@ApiModelProperty(value = "紧急联系人")
private String emergencyContact;
@ApiModelProperty(value = "紧急联系电话")
private String emergencyPhone;
@ApiModelProperty(value = "宿舍号")
private String dormitory;
@ApiModelProperty(value = "辅导员用户ID")
private String counselorId;
@ApiModelProperty(value = "总学分")
private BigDecimal totalCredits;
@ApiModelProperty(value = "平均绩点")
private BigDecimal gpa;
@ApiModelProperty(value = "奖学金等级: [0=无, 1=一等奖, 2=二等奖, 3=三等奖]")
private String scholarshipLevel;
@ApiModelProperty(value = "学业预警: [0=无, 1=一级预警, 2=二级预警, 3=三级预警]")
private String academicWarnings;
@ApiModelProperty(value = "是否认证: [0=未认证, 1=已认证]")
private String isVerified;
@ApiModelProperty(value = "认证人ID")
private String verifiedBy;
@ApiModelProperty(value = "认证时间")
private String verifiedTime;
}

View File

@ -0,0 +1,43 @@
package com.mdd.admin.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@Data
@ApiModel("教室详情Vo")
public class ClassroomDetailVo implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "")
private Integer id;
@ApiModelProperty(value = "教室编号")
private String classroomCode;
@ApiModelProperty(value = "教室名称")
private String classroomName;
@ApiModelProperty(value = "教室类型ID")
private Integer classroomTypeId;
@ApiModelProperty(value = "教室类型名称")
private String classroomTypeName;
@ApiModelProperty(value = "教室容量(座位数)")
private Integer capacity;
@ApiModelProperty(value = "教室位置")
private String location;
@ApiModelProperty(value = "特殊要求说明")
private String specialRequirements;
@ApiModelProperty(value = "状态1-启用0-禁用")
private Integer status;
}

View File

@ -0,0 +1,49 @@
package com.mdd.admin.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@Data
@ApiModel("教室列表Vo")
public class ClassroomListedVo implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "")
private Integer id;
@ApiModelProperty(value = "教室编号")
private String classroomCode;
@ApiModelProperty(value = "教室名称")
private String classroomName;
@ApiModelProperty(value = "教室类型ID")
private Integer classroomTypeId;
@ApiModelProperty(value = "教师类型名称")
private String classroomTypeName;
@ApiModelProperty(value = "教室容量(座位数)")
private Integer capacity;
@ApiModelProperty(value = "教室位置")
private String location;
@ApiModelProperty(value = "特殊要求说明")
private String specialRequirements;
@ApiModelProperty(value = "状态1-启用0-禁用")
private Integer status;
@ApiModelProperty(value = "创建时间")
private String createTime;
@ApiModelProperty(value = "修改时间")
private String updateTime;
}

View File

@ -0,0 +1,31 @@
package com.mdd.admin.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@Data
@ApiModel("教室类型详情Vo")
public class ClassroomTypeDetailVo implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "")
private Integer id;
@ApiModelProperty(value = "类型名称(如:普通教室、实验室、多媒体教室、体育场等)")
private String typeName;
@ApiModelProperty(value = "类型编码")
private String typeCode;
@ApiModelProperty(value = "类型描述")
private String description;
@ApiModelProperty(value = "状态1-启用0-禁用")
private Integer status;
}

View File

@ -0,0 +1,37 @@
package com.mdd.admin.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@Data
@ApiModel("教室类型列表Vo")
public class ClassroomTypeListedVo implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "")
private Integer id;
@ApiModelProperty(value = "类型名称(如:普通教室、实验室、多媒体教室、体育场等)")
private String typeName;
@ApiModelProperty(value = "类型编码")
private String typeCode;
@ApiModelProperty(value = "类型描述")
private String description;
@ApiModelProperty(value = "状态1-启用0-禁用")
private Integer status;
@ApiModelProperty(value = "创建时间")
private String createTime;
@ApiModelProperty(value = "修改时间")
private String updateTime;
}

View File

@ -0,0 +1,36 @@
package com.mdd.admin.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
import java.util.Date;
@Data
@ApiModel("设备要求详情Vo")
public class EquipmentRequirementDetailVo implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "")
private Integer id;
@ApiModelProperty(value = "设备名称")
private String equipmentName;
@ApiModelProperty(value = "设备编码")
private String equipmentCode;
@ApiModelProperty(value = "设备类型1-基础设备2-专业设备3-特殊设备")
private Integer equipmentType;
@ApiModelProperty(value = "设备描述")
private String description;
@ApiModelProperty(value = "状态1-启用0-禁用")
private Integer status;
}

View File

@ -0,0 +1,42 @@
package com.mdd.admin.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
import java.util.Date;
@Data
@ApiModel("设备要求列表Vo")
public class EquipmentRequirementListedVo implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "")
private Integer id;
@ApiModelProperty(value = "设备名称")
private String equipmentName;
@ApiModelProperty(value = "设备编码")
private String equipmentCode;
@ApiModelProperty(value = "设备类型1-基础设备2-专业设备3-特殊设备")
private Integer equipmentType;
@ApiModelProperty(value = "设备描述")
private String description;
@ApiModelProperty(value = "状态1-启用0-禁用")
private Integer status;
@ApiModelProperty(value = "")
private String createTime;
@ApiModelProperty(value = "")
private String updateTime;
}

View File

@ -1,4 +1,4 @@
package com.mdd.admin.vo.student;
package com.mdd.admin.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@ -6,6 +6,7 @@ import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.math.BigDecimal;
@Data
@ApiModel("学生信息详情Vo")
@ -16,38 +17,38 @@ public class StudentInfoDetailVo implements Serializable {
@ApiModelProperty(value = "主键")
private Integer id;
@ApiModelProperty(value = "关联用户ID")
private Integer userId;
@ApiModelProperty(value = "姓名")
private String name;
@ApiModelProperty(value = "性别")
private String gender;
@ApiModelProperty(value = "性别 1-男 2-女")
private Integer gender;
@ApiModelProperty(value = "关联用户ID")
private Integer userId;
@ApiModelProperty(value = "学号")
private String studentNumber;
@ApiModelProperty(value = "学院")
private String college;
@ApiModelProperty(value = "学院ID")
private Integer collegeId;
@ApiModelProperty(value = "专业")
private String major;
@ApiModelProperty(value = "专业ID")
private Integer majorId;
@ApiModelProperty(value = "班级")
private String className;
@ApiModelProperty(value = "班级ID")
private Integer classId;
@ApiModelProperty(value = "年级")
private String grade;
private Integer grade;
@ApiModelProperty(value = "入学年份")
private String enrollmentYear;
private Integer enrollmentYear;
@ApiModelProperty(value = "预计毕业年份")
private String expectedGraduationYear;
private Integer expectedGraduationYear;
@ApiModelProperty(value = "学生状态: [1=在读, 2=休学, 3=毕业, 4=退学]")
private String studentStatus;
private Integer studentStatus;
@ApiModelProperty(value = "身份证号")
private String idCard;
@ -56,7 +57,7 @@ public class StudentInfoDetailVo implements Serializable {
private String birthday;
@ApiModelProperty(value = "政治面貌: [1=党员, 2=团员, 3=群众]")
private String politicalStatus;
private Integer politicalStatus;
@ApiModelProperty(value = "籍贯")
private String nativePlace;
@ -74,7 +75,7 @@ public class StudentInfoDetailVo implements Serializable {
private String dormitory;
@ApiModelProperty(value = "辅导员用户ID")
private String counselorId;
private Integer counselorId;
@ApiModelProperty(value = "总学分")
private BigDecimal totalCredits;
@ -82,20 +83,17 @@ public class StudentInfoDetailVo implements Serializable {
@ApiModelProperty(value = "平均绩点")
private BigDecimal gpa;
@ApiModelProperty(value = "奖学金等级: [0=无, 1=一等奖, 2=二等奖, 3=三等奖]")
private String scholarshipLevel;
@ApiModelProperty(value = "学业预警: [0=无, 1=一级预警, 2=二级预警, 3=三级预警]")
private String academicWarnings;
private Integer academicWarnings;
@ApiModelProperty(value = "是否认证: [0=未认证, 1=已认证]")
private String isVerified;
private Integer isVerified;
@ApiModelProperty(value = "认证人ID")
private String verifiedBy;
private Integer verifiedBy;
@ApiModelProperty(value = "认证时间")
private String verifiedTime;
private Long verifiedTime;
}

View File

@ -1,4 +1,4 @@
package com.mdd.admin.vo.student;
package com.mdd.admin.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@ -6,6 +6,7 @@ import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.math.BigDecimal;
@Data
@ApiModel("学生信息列表Vo")
@ -16,38 +17,44 @@ public class StudentInfoListedVo implements Serializable {
@ApiModelProperty(value = "主键")
private Integer id;
@ApiModelProperty(value = "关联用户ID")
private Integer userId;
@ApiModelProperty(value = "姓名")
private String name;
@ApiModelProperty(value = "性别")
private String gender;
@ApiModelProperty(value = "性别 1-男 2-女")
private Integer gender;
@ApiModelProperty(value = "学号")
private String studentNumber;
@ApiModelProperty(value = "学院")
private String college;
@ApiModelProperty(value = "学院ID")
private Integer collegeId;
@ApiModelProperty(value = "专业")
private String major;
@ApiModelProperty(value = "学院名称")
private String collegeName;
@ApiModelProperty(value = "班级")
@ApiModelProperty(value = "专业ID")
private Integer majorId;
@ApiModelProperty(value = "专业名称")
private String majorName;
@ApiModelProperty(value = "班级ID")
private Integer classId;
@ApiModelProperty(value = "班级名称")
private String className;
@ApiModelProperty(value = "年级")
private String grade;
private Integer grade;
@ApiModelProperty(value = "入学年份")
private String enrollmentYear;
private Integer enrollmentYear;
@ApiModelProperty(value = "预计毕业年份")
private String expectedGraduationYear;
private Integer expectedGraduationYear;
@ApiModelProperty(value = "学生状态: [1=在读, 2=休学, 3=毕业, 4=退学]")
private String studentStatus;
private Integer studentStatus;
@ApiModelProperty(value = "身份证号")
private String idCard;
@ -56,7 +63,7 @@ public class StudentInfoListedVo implements Serializable {
private String birthday;
@ApiModelProperty(value = "政治面貌: [1=党员, 2=团员, 3=群众]")
private String politicalStatus;
private Integer politicalStatus;
@ApiModelProperty(value = "籍贯")
private String nativePlace;
@ -74,7 +81,10 @@ public class StudentInfoListedVo implements Serializable {
private String dormitory;
@ApiModelProperty(value = "辅导员用户ID")
private String counselorId;
private Integer counselorId;
@ApiModelProperty(value = "辅导员姓名")
private String counselorName;
@ApiModelProperty(value = "总学分")
private BigDecimal totalCredits;
@ -82,17 +92,17 @@ public class StudentInfoListedVo implements Serializable {
@ApiModelProperty(value = "平均绩点")
private BigDecimal gpa;
@ApiModelProperty(value = "奖学金等级: [0=无, 1=一等奖, 2=二等奖, 3=三等奖]")
private String scholarshipLevel;
@ApiModelProperty(value = "学业预警: [0=无, 1=一级预警, 2=二级预警, 3=三级预警]")
private String academicWarnings;
private Integer academicWarnings;
@ApiModelProperty(value = "是否认证: [0=未认证, 1=已认证]")
private String isVerified;
private Integer isVerified;
@ApiModelProperty(value = "认证人ID")
private String verifiedBy;
private Integer verifierId;
@ApiModelProperty(value = "认证人姓名")
private String verifierName;
@ApiModelProperty(value = "认证时间")
private String verifiedTime;

View File

@ -0,0 +1,44 @@
package com.mdd.admin.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalTime;
@Data
@ApiModel("时间段详情Vo")
public class TimeSlotDetailVo implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "")
private Integer id;
@ApiModelProperty(value = "时间段代码")
private String slotCode;
@ApiModelProperty(value = "星期几1-周一2-周二3-周三4-周四5-周五6-周六7-周日")
private Integer dayOfWeek;
@ApiModelProperty(value = "开始时间")
private LocalTime startTime;
@ApiModelProperty(value = "结束时间")
private LocalTime endTime;
@ApiModelProperty(value = "时间段名称")
private String slotName;
@ApiModelProperty(value = "时间段类型1-上午2-下午3-晚上")
private Integer slotType;
@ApiModelProperty(value = "排序")
private Integer slotOrder;
@ApiModelProperty(value = "状态1-启用0-禁用")
private Integer status;
}

View File

@ -0,0 +1,50 @@
package com.mdd.admin.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalTime;
@Data
@ApiModel("时间段列表Vo")
public class TimeSlotListedVo implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "")
private Integer id;
@ApiModelProperty(value = "时间段代码")
private String slotCode;
@ApiModelProperty(value = "星期几1-周一2-周二3-周三4-周四5-周五6-周六7-周日")
private Integer dayOfWeek;
@ApiModelProperty(value = "开始时间")
private LocalTime startTime;
@ApiModelProperty(value = "结束时间")
private LocalTime endTime;
@ApiModelProperty(value = "时间段名称")
private String slotName;
@ApiModelProperty(value = "节次1-第一节2-第二节3-第三节")
private Integer section;
@ApiModelProperty(value = "排序")
private Integer slotOrder;
@ApiModelProperty(value = "是否参与排课1-是0-否")
private Integer isScheduled;
@ApiModelProperty(value = "创建时间")
private String createTime;
@ApiModelProperty(value = "更新时间")
private String updateTime;
}

View File

@ -22,8 +22,11 @@ public class CourseDetailVo implements Serializable {
@ApiModelProperty(value = "课程名称")
private String courseName;
@ApiModelProperty(value = "课程类型1-理论课2-实验课3-研讨课4-体育课5-实践课")
private Integer courseType;
@ApiModelProperty(value = "课程类型ID")
private Integer courseTypeId;
@ApiModelProperty(value = "课程类型名")
private String courseTypeName;
@ApiModelProperty(value = "学分")
private BigDecimal credits;

View File

@ -22,8 +22,11 @@ public class CourseListedVo implements Serializable {
@ApiModelProperty(value = "课程名称")
private String courseName;
@ApiModelProperty(value = "课程类型1-理论课2-实验课3-研讨课4-体育课5-实践课")
private Integer courseType;
@ApiModelProperty(value = "课程类型ID")
private Integer courseTypeId;
@ApiModelProperty(value = "课程类型名")
private String courseTypeName;
@ApiModelProperty(value = "学分")
private BigDecimal credits;

View File

@ -0,0 +1,28 @@
package com.mdd.admin.vo.course;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@Data
@ApiModel("课程类型详情Vo")
public class CourseTypeDetailVo implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "")
private Integer id;
@ApiModelProperty(value = "类型名称")
private String typeName;
@ApiModelProperty(value = "类型描述")
private String description;
@ApiModelProperty(value = "排序")
private Integer sortOrder;
}

View File

@ -0,0 +1,31 @@
package com.mdd.admin.vo.course;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@Data
@ApiModel("课程类型列表Vo")
public class CourseTypeListedVo implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "")
private Integer id;
@ApiModelProperty(value = "类型名称")
private String typeName;
@ApiModelProperty(value = "类型描述")
private String description;
@ApiModelProperty(value = "排序")
private Integer sortOrder;
@ApiModelProperty(value = "创建时间")
private String createTime;
}

View File

@ -0,0 +1,51 @@
package com.mdd.common.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@Data
@ApiModel("教室实体")
public class Classroom implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value="id", type= IdType.AUTO)
@ApiModelProperty(value = "")
private Integer id;
@ApiModelProperty(value = "教室编号")
private String classroomCode;
@ApiModelProperty(value = "教室名称")
private String classroomName;
@ApiModelProperty(value = "教室类型ID")
private Integer classroomTypeId;
@ApiModelProperty(value = "教室容量(座位数)")
private Integer capacity;
@ApiModelProperty(value = "教室位置")
private String location;
@ApiModelProperty(value = "特殊要求说明")
private String specialRequirements;
@ApiModelProperty(value = "状态1-启用0-禁用")
private Integer status;
@ApiModelProperty(value = "创建时间")
private Long createTime;
@ApiModelProperty(value = "修改时间")
private Long updateTime;
@ApiModelProperty(value = "删除时间")
private Long deleteTime;
}

View File

@ -0,0 +1,42 @@
package com.mdd.common.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@Data
@ApiModel("教室类型实体")
public class ClassroomType implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value="id", type= IdType.AUTO)
@ApiModelProperty(value = "")
private Integer id;
@ApiModelProperty(value = "类型名称(如:普通教室、实验室、多媒体教室、体育场等)")
private String typeName;
@ApiModelProperty(value = "类型编码")
private String typeCode;
@ApiModelProperty(value = "类型描述")
private String description;
@ApiModelProperty(value = "状态1-启用0-禁用")
private Integer status;
@ApiModelProperty(value = "创建时间")
private Long createTime;
@ApiModelProperty(value = "修改时间")
private Long updateTime;
@ApiModelProperty(value = "删除时间")
private Long deleteTime;
}

View File

@ -25,8 +25,8 @@ public class Course implements Serializable {
@ApiModelProperty(value = "课程名称")
private String courseName;
@ApiModelProperty(value = "课程类型1-理论课2-实验课3-研讨课4-体育课5-实践课")
private Integer courseType;
@ApiModelProperty(value = "课程类型ID")
private Integer courseTypeId;
@ApiModelProperty(value = "学分")
private BigDecimal credits;
@ -40,9 +40,6 @@ public class Course implements Serializable {
@ApiModelProperty(value = "每周次数")
private Integer sessionsPerWeek;
@ApiModelProperty(value = "设备要求")
private String equipmentRequirements;
@ApiModelProperty(value = "课程描述")
private String description;

View File

@ -0,0 +1,30 @@
package com.mdd.common.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@Data
@ApiModel("课程设备关联实体")
public class CourseEquipment implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value="id", type= IdType.AUTO)
@ApiModelProperty(value = "")
private Integer id;
@ApiModelProperty(value = "课程ID")
private Integer courseId;
@ApiModelProperty(value = "设备要求ID")
private Integer equipmentRequirementId;
@ApiModelProperty(value = "创建时间")
private Long createTime;
}

View File

@ -0,0 +1,33 @@
package com.mdd.common.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@Data
@ApiModel("课程类型实体")
public class CourseType implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value="id", type= IdType.AUTO)
@ApiModelProperty(value = "")
private Integer id;
@ApiModelProperty(value = "类型名称")
private String typeName;
@ApiModelProperty(value = "类型描述")
private String description;
@ApiModelProperty(value = "排序")
private Integer sortOrder;
@ApiModelProperty(value = "创建时间")
private Long createTime;
}

View File

@ -0,0 +1,44 @@
package com.mdd.common.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
import java.util.Date;
@Data
@ApiModel("设备要求实体")
public class EquipmentRequirement implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value="id", type= IdType.AUTO)
@ApiModelProperty(value = "")
private Integer id;
@ApiModelProperty(value = "设备名称")
private String equipmentName;
@ApiModelProperty(value = "设备编码")
private String equipmentCode;
@ApiModelProperty(value = "设备类型1-基础设备2-专业设备3-特殊设备")
private Integer equipmentType;
@ApiModelProperty(value = "设备描述")
private String description;
@ApiModelProperty(value = "状态1-启用0-禁用")
private Integer status;
@ApiModelProperty(value = "")
private Long createTime;
@ApiModelProperty(value = "")
private Long updateTime;
}

View File

@ -61,7 +61,7 @@ public class Major implements Serializable {
@ApiModelProperty(value = "招生状态: [1=正常招生, 2=暂停招生, 3=停止招生]")
private Integer enrollmentStatus;
@ApiModelProperty(value = "专业状态: [1=正常, 2=停用]")
@ApiModelProperty(value = "专业状态: [1=正常, 0=停用]")
private Integer majorStatus;
@ApiModelProperty(value = "排序")

View File

@ -23,7 +23,7 @@ public class StudentInfo implements Serializable {
@ApiModelProperty(value = "姓名")
private String name;
@ApiModelProperty(value = "性别")
@ApiModelProperty(value = "性别 1-男 2-女")
private Integer gender;
@ApiModelProperty(value = "关联用户ID")
@ -32,26 +32,26 @@ public class StudentInfo implements Serializable {
@ApiModelProperty(value = "学号")
private String studentNumber;
@ApiModelProperty(value = "学院")
private String college;
@ApiModelProperty(value = "学院ID")
private Integer collegeId;
@ApiModelProperty(value = "专业")
private String major;
@ApiModelProperty(value = "专业ID")
private Integer majorId;
@ApiModelProperty(value = "班级")
private String className;
@ApiModelProperty(value = "班级ID")
private Integer classId;
@ApiModelProperty(value = "年级")
private String grade;
private Integer grade;
@ApiModelProperty(value = "入学年份")
private String enrollmentYear;
private Integer enrollmentYear;
@ApiModelProperty(value = "预计毕业年份")
private String expectedGraduationYear;
private Integer expectedGraduationYear;
@ApiModelProperty(value = "学生状态: [1=在读, 2=休学, 3=毕业, 4=退学]")
private String studentStatus;
private Integer studentStatus;
@ApiModelProperty(value = "身份证号")
private String idCard;
@ -60,7 +60,7 @@ public class StudentInfo implements Serializable {
private String birthday;
@ApiModelProperty(value = "政治面貌: [1=党员, 2=团员, 3=群众]")
private String politicalStatus;
private Integer politicalStatus;
@ApiModelProperty(value = "籍贯")
private String nativePlace;
@ -78,7 +78,7 @@ public class StudentInfo implements Serializable {
private String dormitory;
@ApiModelProperty(value = "辅导员用户ID")
private String counselorId;
private Integer counselorId;
@ApiModelProperty(value = "总学分")
private BigDecimal totalCredits;
@ -86,20 +86,17 @@ public class StudentInfo implements Serializable {
@ApiModelProperty(value = "平均绩点")
private BigDecimal gpa;
@ApiModelProperty(value = "奖学金等级: [0=无, 1=一等奖, 2=二等奖, 3=三等奖]")
private String scholarshipLevel;
@ApiModelProperty(value = "学业预警: [0=无, 1=一级预警, 2=二级预警, 3=三级预警]")
private String academicWarnings;
private Integer academicWarnings;
@ApiModelProperty(value = "是否认证: [0=未认证, 1=已认证]")
private String isVerified;
private Integer isVerified;
@ApiModelProperty(value = "认证人ID")
private String verifiedBy;
private Integer verifiedBy;
@ApiModelProperty(value = "认证时间")
private String verifiedTime;
private Long verifiedTime;
@ApiModelProperty(value = "创建时间")
private Long createTime;

View File

@ -0,0 +1,55 @@
package com.mdd.common.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalTime;
@Data
@ApiModel("时间段实体")
public class TimeSlot implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value="id", type= IdType.AUTO)
@ApiModelProperty(value = "")
private Integer id;
@ApiModelProperty(value = "时间段代码")
private String slotCode;
@ApiModelProperty(value = "星期几1-周一2-周二3-周三4-周四5-周五6-周六7-周日")
private Integer dayOfWeek;
@ApiModelProperty(value = "开始时间")
private LocalTime startTime;
@ApiModelProperty(value = "结束时间")
private LocalTime endTime;
@ApiModelProperty(value = "时间段名称")
private String slotName;
@ApiModelProperty(value = "节次")
private Integer section;
@ApiModelProperty(value = "排序")
private Integer slotOrder;
@ApiModelProperty(value = "是否参与排课")
private Integer isScheduled;
@ApiModelProperty(value = "创建时间")
private Long createTime;
@ApiModelProperty(value = "更新时间")
private Long updateTime;
@ApiModelProperty(value = "删除时间")
private Long deleteTime;
}

View File

@ -0,0 +1,13 @@
package com.mdd.common.enums;
/**
* EasyExcel监听器错误类型枚举
*/
public enum ErrorType {
REQUIRED_FIELD, // 必填字段为空
TYPE_CONVERSION, // 类型转换错误
VALUE_RANGE, // 值范围错误
LENGTH_EXCEEDED, // 长度超限
BUSINESS_RULE, // 业务规则错误
FORMAT_ERROR // 格式错误
}

View File

@ -18,4 +18,5 @@ public class OperateException extends BaseException {
public OperateException(String msg, Integer errCode, Integer showCode) {
super(errCode, msg, showCode);
}
}

View File

@ -0,0 +1,13 @@
package com.mdd.common.mapper;
import com.mdd.common.core.basics.IBaseMapper;
import com.mdd.common.entity.Classroom;
import org.apache.ibatis.annotations.Mapper;
/**
* 教室Mapper
* @author LikeAdmin
*/
@Mapper
public interface ClassroomMapper extends IBaseMapper<Classroom> {
}

View File

@ -0,0 +1,13 @@
package com.mdd.common.mapper;
import com.mdd.common.core.basics.IBaseMapper;
import com.mdd.common.entity.ClassroomType;
import org.apache.ibatis.annotations.Mapper;
/**
* 教室类型Mapper
* @author gyp
*/
@Mapper
public interface ClassroomTypeMapper extends IBaseMapper<ClassroomType> {
}

View File

@ -0,0 +1,13 @@
package com.mdd.common.mapper;
import com.mdd.common.core.basics.IBaseMapper;
import com.mdd.common.entity.CourseEquipment;
import org.apache.ibatis.annotations.Mapper;
/**
* 课程设备关联Mapper
* @author LikeAdmin
*/
@Mapper
public interface CourseEquipmentMapper extends IBaseMapper<CourseEquipment> {
}

View File

@ -0,0 +1,13 @@
package com.mdd.common.mapper;
import com.mdd.common.core.basics.IBaseMapper;
import com.mdd.common.entity.CourseType;
import org.apache.ibatis.annotations.Mapper;
/**
* 课程类型Mapper
* @author LikeAdmin
*/
@Mapper
public interface CourseTypeMapper extends IBaseMapper<CourseType> {
}

View File

@ -0,0 +1,13 @@
package com.mdd.common.mapper;
import com.mdd.common.core.basics.IBaseMapper;
import com.mdd.common.entity.EquipmentRequirement;
import org.apache.ibatis.annotations.Mapper;
/**
* 设备要求Mapper
* @author gyp
*/
@Mapper
public interface EquipmentRequirementMapper extends IBaseMapper<EquipmentRequirement> {
}

View File

@ -0,0 +1,13 @@
package com.mdd.common.mapper;
import com.mdd.common.core.basics.IBaseMapper;
import com.mdd.common.entity.TimeSlot;
import org.apache.ibatis.annotations.Mapper;
/**
* 时间段Mapper
* @author gyp
*/
@Mapper
public interface TimeSlotMapper extends IBaseMapper<TimeSlot> {
}

View File

@ -1,7 +1,7 @@
# 项目配置
like:
# 上传目录
upload-directory: /www/uploads/likeadmin-java/
upload-directory: D:/www/uploads/likeadmin-java/
# Swagger配置
swagger:
# 是否开启swagger

View File

@ -44,7 +44,7 @@
<oshi-core.version>6.1.2</oshi-core.version>
<sa-token.version>1.32.0</sa-token.version>
<sa-token-redis.version>1.32.0</sa-token-redis.version>
<easyexcel.version>3.1.3</easyexcel.version>
<easyexcel.version>3.3.4</easyexcel.version>
<quartz-scheduler.version>2.3.2</quartz-scheduler.version>
<qiniu.version>7.17.0</qiniu.version>

View File

@ -1219,19 +1219,19 @@ SET FOREIGN_KEY_CHECKS = 1;
CREATE TABLE `la_student_info` (
`id` int unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` varchar(50) NOT NULL DEFAULT '姓名错误' COMMENT '姓名',
`gender` tinyint unsigned NOT NULL DEFAULT '' COMMENT '性别 1-男 2-女',
`user_id` int unsigned NOT NULL DEFAULT '0' COMMENT '关联用户ID',
`student_number` varchar(32) NOT NULL DEFAULT '' COMMENT '学号',
`college` varchar(100) NOT NULL DEFAULT '' COMMENT '学院',
`major` varchar(100) NOT NULL DEFAULT '' COMMENT '专业',
`class_name` varchar(50) NOT NULL DEFAULT '' COMMENT '班级',
`grade` varchar(20) NOT NULL DEFAULT '' COMMENT '年级',
`name` varchar(50) DEFAULT NULL COMMENT '姓名',
`gender` tinyint unsigned DEFAULT NULL COMMENT '性别 1-男 2-女',
`user_id` int unsigned NOT NULL COMMENT '关联用户ID',
`student_number` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '学号',
`college_id` int unsigned NOT NULL COMMENT '学院ID',
`major_id` int unsigned NOT NULL COMMENT '专业ID',
`class_id` int unsigned NOT NULL COMMENT '班级ID',
`grade` tinyint unsigned NOT NULL COMMENT '年级',
`enrollment_year` int unsigned NOT NULL DEFAULT '0' COMMENT '入学年份',
`expected_graduation_year` int unsigned NOT NULL DEFAULT '0' COMMENT '预计毕业年份',
`student_status` tinyint unsigned NOT NULL DEFAULT '1' COMMENT '学生状态: [1=在读, 2=休学, 3=毕业, 4=退学]',
`id_card` varchar(20) NOT NULL DEFAULT '' COMMENT '身份证号',
`birthday` int unsigned NOT NULL DEFAULT '0' COMMENT '出生日期',
`birthday` varchar(20) NOT NULL DEFAULT '0' COMMENT '出生日期',
`political_status` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '政治面貌: [1=党员, 2=团员, 3=群众]',
`native_place` varchar(100) NOT NULL DEFAULT '' COMMENT '籍贯',
`home_address` varchar(200) NOT NULL DEFAULT '' COMMENT '家庭住址',
@ -1241,7 +1241,6 @@ CREATE TABLE `la_student_info` (
`counselor_id` int unsigned NOT NULL DEFAULT '0' COMMENT '辅导员用户ID',
`total_credits` decimal(5,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '总学分',
`gpa` decimal(3,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '平均绩点',
`scholarship_level` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '奖学金等级: [0=无, 1=一等奖, 2=二等奖, 3=三等奖]',
`academic_warnings` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '学业预警: [0=无, 1=一级预警, 2=二级预警, 3=三级预警]',
`is_verified` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '是否认证: [0=未认证, 1=已认证]',
`verified_by` int unsigned NOT NULL DEFAULT '0' COMMENT '认证人ID',
@ -1253,10 +1252,10 @@ CREATE TABLE `la_student_info` (
UNIQUE KEY `student_number` (`student_number`) USING BTREE COMMENT '学号唯一',
UNIQUE KEY `user_id` (`user_id`) USING BTREE COMMENT '用户ID唯一',
UNIQUE KEY `id_card` (`id_card`) USING BTREE COMMENT '身份证号唯一',
KEY `college_major` (`college`,`major`) USING BTREE COMMENT '学院专业索引',
KEY `class_name` (`class_name`) USING BTREE COMMENT '班级索引',
KEY `college_major` (`college_id`,`major_id`) USING BTREE COMMENT '学院专业索引',
KEY `class_name` (`class_id`) USING BTREE COMMENT '班级索引',
KEY `enrollment_year` (`enrollment_year`) USING BTREE COMMENT '入学年份索引'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='学生信息表';
) ENGINE=InnoDB AUTO_INCREMENT=274 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='学生信息表';
CREATE TABLE `la_college` (
`id` int unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
@ -1367,12 +1366,11 @@ CREATE TABLE `la_course` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`course_code` varchar(50) NOT NULL DEFAULT '' COMMENT '课程代码',
`course_name` varchar(100) NOT NULL DEFAULT '' COMMENT '课程名称',
`course_type` tinyint unsigned NOT NULL DEFAULT '1' COMMENT '课程类型1-理论课2-实验课3-研讨课4-体育课5-实践课',
`course_type_id` int unsigned NOT NULL COMMENT '课程类型ID',
`credits` decimal(3,1) NOT NULL DEFAULT '0.0' COMMENT '学分',
`total_hours` int unsigned NOT NULL DEFAULT '0' COMMENT '总学时',
`duration_per_session` int unsigned NOT NULL DEFAULT '2' COMMENT '每次连上节数',
`sessions_per_week` int unsigned NOT NULL DEFAULT '1' COMMENT '每周次数',
`equipment_requirements` json DEFAULT NULL COMMENT '设备要求',
`description` text COMMENT '课程描述',
`status` tinyint unsigned DEFAULT '1' COMMENT '状态1-启用0-禁用',
`create_time` int NOT NULL COMMENT '创建时间',
@ -1380,10 +1378,26 @@ CREATE TABLE `la_course` (
`delete_time` int DEFAULT NULL COMMENT '删除时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `uk_course_code` (`course_code`) USING BTREE,
KEY `idx_course_type` (`course_type`) USING BTREE,
KEY `idx_course_type` (`course_type_id`) USING BTREE,
KEY `idx_status` (`status`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='课程表';
CREATE TABLE `la_course_type` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`type_name` varchar(50) NOT NULL DEFAULT '' COMMENT '类型名称',
`description` varchar(200) DEFAULT '' COMMENT '类型描述',
`sort_order` int unsigned NOT NULL DEFAULT '0' COMMENT '排序',
`create_time` int NOT NULL COMMENT '创建时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='课程类型表';
ALTER TABLE `la_course`
ADD CONSTRAINT `fk_course_course_type`
FOREIGN KEY (`course_type_id`)
REFERENCES `la_course_type` (`id`)
ON DELETE RESTRICT
ON UPDATE CASCADE;
CREATE TABLE `la_curriculum_version` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`major_id` int unsigned NOT NULL COMMENT '专业ID',
@ -1399,6 +1413,7 @@ CREATE TABLE `la_curriculum_version` (
KEY `idx_current` (`is_current`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='培养方案版本表';
CREATE TABLE `la_time_slot` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`slot_code` varchar(50) NOT NULL DEFAULT '' COMMENT '时间段代码',
@ -1406,18 +1421,17 @@ CREATE TABLE `la_time_slot` (
`start_time` time NOT NULL COMMENT '开始时间',
`end_time` time NOT NULL COMMENT '结束时间',
`slot_name` varchar(50) NOT NULL DEFAULT '' COMMENT '时间段名称',
`slot_type` tinyint unsigned NOT NULL DEFAULT '1' COMMENT '时间段类型1-上午2-下午3-晚上',
`section` tinyint unsigned NOT NULL DEFAULT '1' COMMENT '节次',
`slot_order` int unsigned NOT NULL DEFAULT '0' COMMENT '排序',
`status` tinyint unsigned DEFAULT '1' COMMENT '状态1-启用0-禁用',
`is_scheduled` tinyint unsigned DEFAULT '1' COMMENT '是否参与排课0-不参与1-参与',
`create_time` int NOT NULL COMMENT '创建时间',
`update_time` int DEFAULT NULL COMMENT '更新时间',
`delete_time` int DEFAULT NULL COMMENT '删除时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `uk_slot_code` (`slot_code`) USING BTREE,
UNIQUE KEY `uk_day_time` (`day_of_week`, `start_time`, `end_time`) USING BTREE,
KEY `idx_day_order` (`day_of_week`, `slot_order`) USING BTREE,
KEY `idx_slot_type` (`slot_type`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='时间段表';
KEY `idx_day_order` (`day_of_week`,`slot_order`) USING BTREE,
KEY `idx_slot_type` (`section`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=257 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='时间段表';
CREATE TABLE `la_semester_config` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
@ -1488,4 +1502,76 @@ CREATE TABLE `la_teacher_unavailable` (
UNIQUE KEY `uk_teacher_time` (`teacher_id`,`time_slot_id`,`semester_id`) USING BTREE,
KEY `idx_time_slot` (`time_slot_id`) USING BTREE,
KEY `idx_semester` (`semester_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='教师不可用时间表';
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='教师不可用时间表';
CREATE TABLE `la_equipment_requirement` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`equipment_name` varchar(100) NOT NULL COMMENT '设备名称',
`equipment_code` varchar(50) NOT NULL COMMENT '设备编码',
`equipment_type` tinyint(1) NOT NULL COMMENT '设备类型1-基础设备2-专业设备3-特殊设备',
`description` text COMMENT '设备描述',
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态1-启用0-禁用',
`create_time` int DEFAULT CURRENT_TIMESTAMP,
`update_time` int DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_equipment_code` (`equipment_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='设备要求表';
CREATE TABLE `la_course_equipment` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`course_id` bigint unsigned NOT NULL COMMENT '课程ID',
`equipment_requirement_id` bigint unsigned NOT NULL COMMENT '设备要求ID',
`create_time` int NOT NULL COMMENT '创建时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `uk_course_equipment` (`course_id`, `equipment_requirement_id`) USING BTREE,
KEY `idx_equipment_id` (`equipment_requirement_id`) USING BTREE,
CONSTRAINT `fk_course_equipment_course` FOREIGN KEY (`course_id`) REFERENCES `la_course` (`id`) ON DELETE CASCADE,
CONSTRAINT `fk_course_equipment_equipment` FOREIGN KEY (`equipment_requirement_id`) REFERENCES `la_equipment_requirement` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='课程设备关联表';
CREATE TABLE `la_classroom_type` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`type_name` varchar(50) NOT NULL DEFAULT '' COMMENT '类型名称(如:普通教室、实验室、多媒体教室、体育场等)',
`type_code` varchar(50) NOT NULL DEFAULT '' COMMENT '类型编码',
`description` text COMMENT '类型描述',
`status` tinyint unsigned DEFAULT '1' COMMENT '状态1-启用0-禁用',
`create_time` int NOT NULL COMMENT '创建时间',
`update_time` int DEFAULT NULL COMMENT '修改时间',
`delete_time` int DEFAULT NULL COMMENT '删除时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `uk_type_code` (`type_code`) USING BTREE,
KEY `idx_status` (`status`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='教室类型表';
CREATE TABLE `la_classroom` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`classroom_code` varchar(50) NOT NULL DEFAULT '' COMMENT '教室编号',
`classroom_name` varchar(100) NOT NULL DEFAULT '' COMMENT '教室名称',
`classroom_type_id` bigint unsigned NOT NULL COMMENT '教室类型ID',
`capacity` int unsigned NOT NULL DEFAULT '0' COMMENT '教室容量(座位数)',
`location` varchar(200) NOT NULL DEFAULT '' COMMENT '教室位置',
`special_requirements` text COMMENT '特殊要求说明',
`status` tinyint unsigned DEFAULT '1' COMMENT '状态1-启用0-禁用',
`create_time` int NOT NULL COMMENT '创建时间',
`update_time` int DEFAULT NULL COMMENT '修改时间',
`delete_time` int DEFAULT NULL COMMENT '删除时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `uk_classroom_code` (`classroom_code`) USING BTREE,
KEY `idx_classroom_type_id` (`classroom_type_id`) USING BTREE,
KEY `idx_location` (`location`(50)) USING BTREE,
KEY `idx_status` (`status`) USING BTREE,
CONSTRAINT `fk_classroom_type` FOREIGN KEY (`classroom_type_id`) REFERENCES `la_classroom_type` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='教室表';
CREATE TABLE `la_classroom_equipment` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`classroom_id` bigint unsigned NOT NULL COMMENT '教室ID',
`equipment_requirement_id` bigint unsigned NOT NULL COMMENT '设备要求ID',
`create_time` int NOT NULL COMMENT '创建时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `uk_classroom_equipment` (`classroom_id`, `equipment_requirement_id`) USING BTREE,
KEY `idx_equipment_id` (`equipment_requirement_id`) USING BTREE,
CONSTRAINT `fk_classroom_equipment_classroom` FOREIGN KEY (`classroom_id`) REFERENCES `la_classroom` (`id`) ON DELETE CASCADE,
CONSTRAINT `fk_classroom_equipment_equipment` FOREIGN KEY (`equipment_requirement_id`) REFERENCES `la_equipment_requirement` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='教室设备关系表';