CourseServiceImpl.java 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. package com.njuzr.eaibackend.service.impl;
  2. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  3. import com.baomidou.mybatisplus.core.metadata.IPage;
  4. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  5. import com.njuzr.eaibackend.controller.MyResponse;
  6. import com.njuzr.eaibackend.dto.course.CourseDTO;
  7. import com.njuzr.eaibackend.dto.course.CourseQueryDTO;
  8. import com.njuzr.eaibackend.dto.course.CourseUpdateDTO;
  9. import com.njuzr.eaibackend.dto.course.EnrollDTO;
  10. import com.njuzr.eaibackend.enums.Role;
  11. import com.njuzr.eaibackend.exception.MyException;
  12. import com.njuzr.eaibackend.mapper.CourseMapper;
  13. import com.njuzr.eaibackend.mapper.CourseStudentMapper;
  14. import com.njuzr.eaibackend.mapper.UserMapper;
  15. import com.njuzr.eaibackend.po.Course;
  16. import com.njuzr.eaibackend.po.Enrollment;
  17. import com.njuzr.eaibackend.po.MyUserDetails;
  18. import com.njuzr.eaibackend.po.User;
  19. import com.njuzr.eaibackend.service.CourseService;
  20. import com.njuzr.eaibackend.utils.ConvertUtil;
  21. import com.njuzr.eaibackend.utils.ModelMapperUtil;
  22. import com.njuzr.eaibackend.utils.PageMapperUtil;
  23. import com.njuzr.eaibackend.vo.CourseVO;
  24. import lombok.extern.slf4j.Slf4j;
  25. import org.springframework.beans.BeanUtils;
  26. import org.springframework.beans.factory.annotation.Autowired;
  27. import org.springframework.http.HttpStatus;
  28. import org.springframework.stereotype.Service;
  29. import java.time.LocalDate;
  30. import java.time.format.DateTimeFormatter;
  31. import java.util.Date;
  32. /**
  33. * @author: Leonezhurui
  34. * @Date: 2024/3/5 - 22:09
  35. * @Package: EAI-Backend
  36. */
  37. @Slf4j
  38. @Service
  39. public class CourseServiceImpl implements CourseService {
  40. private final CourseMapper courseMapper;
  41. private final UserMapper userMapper;
  42. private final CourseStudentMapper courseStudentMapper;
  43. @Autowired
  44. public CourseServiceImpl(CourseMapper courseMapper, UserMapper userMapper, CourseStudentMapper courseStudentMapper) {
  45. this.courseMapper = courseMapper;
  46. this.userMapper = userMapper;
  47. this.courseStudentMapper = courseStudentMapper;
  48. }
  49. @Override
  50. public CourseVO createCourse(CourseDTO courseDTO) {
  51. // 类型转换
  52. Course targetCourse = convertToPO(courseDTO);
  53. targetCourse.setCreateTime(new Date());
  54. log.info("类型转换后的targetCourse"+targetCourse);
  55. // 插入数据库
  56. int status = courseMapper.insert(targetCourse);
  57. if (status == 0) {
  58. log.error("创建课程失败,数据库插入错误!");
  59. throw new MyException(HttpStatus.INTERNAL_SERVER_ERROR.value(), HttpStatus.INTERNAL_SERVER_ERROR.getReasonPhrase()+":"+"创建课程错误");
  60. }
  61. return convertToVO(targetCourse);
  62. }
  63. @Override
  64. public IPage<CourseVO> findCoursesPage(Page<Course> page, CourseQueryDTO courseQueryDTO) {
  65. QueryWrapper<Course> wrapper = getCourseQueryWrapper(courseQueryDTO);
  66. IPage<Course> courses = courseMapper.selectPage(page, wrapper);
  67. return PageMapperUtil.convert(courses, this::convertToVO);
  68. }
  69. /**
  70. * 设置查询条件
  71. * @param courseQueryDTO
  72. * @return
  73. */
  74. private static QueryWrapper<Course> getCourseQueryWrapper(CourseQueryDTO courseQueryDTO) {
  75. QueryWrapper<Course> wrapper = new QueryWrapper<>();
  76. if (courseQueryDTO.getCourseId() != null) { // courseId直接判断是否相等
  77. wrapper.eq("course_id", courseQueryDTO.getCourseId());
  78. }
  79. if (courseQueryDTO.getTeacherId() != null) { // 模糊匹配teacherIds中是否包含这个字段
  80. wrapper.like("teacher_ids", "%" + courseQueryDTO.getTeacherId() + "%"); // 模糊匹配
  81. }
  82. if (courseQueryDTO.getCourseName() != null) { // 模糊匹配课程名字
  83. wrapper.like("course_name", courseQueryDTO.getCourseName());
  84. }
  85. if (courseQueryDTO.getStudentId() != null) { // 联表查询学生所选课程
  86. wrapper.inSql("course_id", "SELECT course_id FROM course_student WHERE student_id = " + courseQueryDTO.getStudentId());
  87. }
  88. if (courseQueryDTO.getSemester() != null) { // 课程时间过滤,转换成具体日期
  89. String semester = courseQueryDTO.getSemester();
  90. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
  91. LocalDate startDate, endDate;
  92. // 解析输入字符串获取学年和学期
  93. try {
  94. String[] parts = semester.split("学年第");
  95. String[] years = parts[0].split("-");
  96. int yearStart = Integer.parseInt(years[0]);
  97. int semesterType = parts[1].startsWith("一") ? 1 : 2;
  98. // 根据学期计算开始和结束日期
  99. if (semesterType == 1) {
  100. startDate = LocalDate.of(yearStart, 9, 1);
  101. endDate = LocalDate.of(yearStart + 1, 3, 1);
  102. } else {
  103. startDate = LocalDate.of(yearStart + 1, 3, 1);
  104. endDate = LocalDate.of(yearStart + 1, 9, 1);
  105. }
  106. } catch (Exception e) {
  107. log.error(e.getMessage());
  108. throw MyException.create(HttpStatus.BAD_REQUEST, "学期字符串解析错误");
  109. }
  110. wrapper.ge("start_time", startDate.format(formatter))
  111. .le("end_time", endDate.format(formatter));
  112. }
  113. return wrapper;
  114. }
  115. /**
  116. * 更新课程信息
  117. * @param courseUpdateDTO
  118. */
  119. @Override
  120. public CourseVO updateCourse(Long userId, Long courseId, CourseUpdateDTO courseUpdateDTO) {
  121. User targetUser = userMapper.selectById(userId);
  122. Course targetCourse = courseMapper.selectById(courseId);
  123. if (targetCourse == null)
  124. throw MyException.create(HttpStatus.BAD_REQUEST, "课程不存在");
  125. if (targetUser.getRole() != Role.ADMIN && !targetCourse.getTeacherIds().contains(String.valueOf(userId)))
  126. throw MyException.create(HttpStatus.BAD_REQUEST, "无权限更新");
  127. Course opeCourse = convertToPO(courseUpdateDTO);
  128. opeCourse.setCourseId(courseId);
  129. try {
  130. int code = courseMapper.updateById(opeCourse);
  131. if (code == 0) {
  132. throw MyException.create(HttpStatus.INTERNAL_SERVER_ERROR, "更新课程失败");
  133. }
  134. } catch (Exception e) {
  135. log.error(e.getMessage());
  136. throw MyException.create(HttpStatus.INTERNAL_SERVER_ERROR, "更新课程失败");
  137. }
  138. return convertToVO(courseMapper.selectById(courseId));
  139. }
  140. /**
  141. * 删除课程
  142. * @param user
  143. * @param courseId
  144. */
  145. @Override
  146. public void deleteById(MyUserDetails user, Long courseId) {
  147. Course course = courseMapper.selectById(courseId);
  148. if (course == null)
  149. throw MyException.create(HttpStatus.BAD_REQUEST, "课程不存在");
  150. if (user.getRole() != Role.ADMIN && !course.getTeacherIds().contains(String.valueOf(user.getId())))
  151. throw MyException.create(HttpStatus.BAD_REQUEST, "无权限删除");
  152. try {
  153. int code = courseMapper.deleteById(courseId);
  154. if (code == 0)
  155. throw MyException.create(HttpStatus.INTERNAL_SERVER_ERROR, "删除课程失败");
  156. } catch (Exception e) {
  157. log.error(e.getMessage());
  158. throw MyException.create(HttpStatus.INTERNAL_SERVER_ERROR, "删除课程失败");
  159. }
  160. }
  161. /**
  162. * 学生选课。给course_student表添加记录。
  163. * @param enrollDTO
  164. */
  165. @Override
  166. public void enroll(EnrollDTO enrollDTO) {
  167. Course target = courseMapper.selectById(enrollDTO.getCourseId());
  168. if (target == null)
  169. throw MyException.create(HttpStatus.BAD_REQUEST, "课程不存在");
  170. if (!target.getEnrollCode().equals(enrollDTO.getEnrollCode()))
  171. throw MyException.create(HttpStatus.BAD_REQUEST, "选课码错误");
  172. Enrollment enrollment = ModelMapperUtil.map(enrollDTO, Enrollment.class);
  173. courseStudentMapper.insert(enrollment);
  174. }
  175. /**
  176. * 将DTO转换成PO
  177. * @param courseDTO
  178. * @return
  179. */
  180. private Course convertToPO(CourseDTO courseDTO) {
  181. Course course = new Course();
  182. BeanUtils.copyProperties(courseDTO, course);
  183. course.setTeacherIds(ConvertUtil.listToString(courseDTO.getTeacherIds()));
  184. if (courseDTO.getCourseImages() != null)
  185. course.setCourseImages(ConvertUtil.listToString(courseDTO.getCourseImages()));
  186. return course;
  187. }
  188. private Course convertToPO(CourseUpdateDTO updateDTO) {
  189. Course course = new Course();
  190. BeanUtils.copyProperties(updateDTO, course);
  191. if (updateDTO.getTeacherIds() != null)
  192. course.setTeacherIds(ConvertUtil.listToString(updateDTO.getTeacherIds()));
  193. if (updateDTO.getCourseImages() != null)
  194. course.setCourseImages(ConvertUtil.listToString(updateDTO.getCourseImages()));
  195. return course;
  196. }
  197. /**
  198. * 将PO转换成VO
  199. * @param course
  200. * @return
  201. */
  202. private CourseVO convertToVO(Course course) {
  203. CourseVO res = new CourseVO();
  204. BeanUtils.copyProperties(course, res);
  205. res.setTeacherIds(ConvertUtil.stringToList(course.getTeacherIds(), Long::valueOf));
  206. if (course.getCourseImages() != null)
  207. res.setCourseImages(ConvertUtil.stringToList(course.getCourseImages(), String::valueOf));
  208. return res;
  209. }
  210. }