AiSpeakingAssignmentServiceImpl.java 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. package com.njuzr.eaibackend.service.impl;
  2. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  3. import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
  4. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  5. import com.njuzr.eaibackend.dto.AiSpeakingAssignmentDTO;
  6. import com.njuzr.eaibackend.enums.AssignmentStatus;
  7. import com.njuzr.eaibackend.enums.Role;
  8. import com.njuzr.eaibackend.exception.MyException;
  9. import com.njuzr.eaibackend.mapper.*;
  10. import com.njuzr.eaibackend.po.*;
  11. import com.njuzr.eaibackend.service.AiSpeakingAssignmentService;
  12. import com.njuzr.eaibackend.utils.ConvertUtil;
  13. import com.njuzr.eaibackend.vo.AiSpeakingAssignmentVO;
  14. import lombok.extern.slf4j.Slf4j;
  15. import org.springframework.beans.BeanUtils;
  16. import org.springframework.beans.factory.annotation.Autowired;
  17. import org.springframework.cache.annotation.CacheEvict;
  18. import org.springframework.http.HttpStatus;
  19. import org.springframework.stereotype.Service;
  20. import org.springframework.transaction.annotation.Transactional;
  21. import java.util.*;
  22. /**
  23. * @author Liululin
  24. * @date 2025/3/18 - 14:53
  25. */
  26. @Service
  27. @Slf4j
  28. public class AiSpeakingAssignmentServiceImpl extends ServiceImpl<AiSpeakingAssignmentMapper, AiSpeakingAssignment> implements AiSpeakingAssignmentService {
  29. @Autowired
  30. CourseMapper courseMapper;
  31. @Autowired
  32. AssignmentMapper assignmentMapper;
  33. @Autowired
  34. UserMapper userMapper;
  35. @Autowired
  36. StudentAssignmentMapper studentAssignmentMapper;
  37. @Override
  38. public void createSpeakingAssignment(MyUserDetails user, Long courseId, AiSpeakingAssignmentDTO aiSpeakingAssignmentDTO) {
  39. Course course = courseMapper.selectById(courseId);
  40. if (course == null)
  41. throw MyException.create(HttpStatus.BAD_REQUEST, "课程不存在");
  42. if (user.getRole() != Role.ADMIN) {
  43. List<String> teacherIds = Collections.singletonList(Optional.ofNullable(course.getTeacherIds())
  44. .orElse(Collections.emptyList().toString()));
  45. String userIdStr = String.valueOf(user.getId());
  46. boolean hasTeacherId = teacherIds.contains(userIdStr);
  47. boolean pidMatches = Objects.equals(course.getTeacherPid(), user.getPid());
  48. if (!hasTeacherId && !pidMatches) {
  49. throw MyException.create(HttpStatus.BAD_REQUEST, "无权限创建");
  50. }
  51. }
  52. Assignment assignment = new Assignment();
  53. BeanUtils.copyProperties(aiSpeakingAssignmentDTO, assignment);
  54. assignment.setCourseId(courseId);
  55. assignment.setTeacherId(user.getId());
  56. assignment.setCreateTime(new Date());
  57. try {
  58. assignmentMapper.insert(assignment);
  59. Long assignmentId = assignment.getAssignmentId();
  60. log.info("assignmentId:" + assignmentId);
  61. AiSpeakingAssignment aiSpeakingAssignment = new AiSpeakingAssignment();
  62. aiSpeakingAssignment.setAssignmentId(assignmentId);
  63. BeanUtils.copyProperties(aiSpeakingAssignmentDTO, aiSpeakingAssignment);
  64. if(aiSpeakingAssignmentDTO.getSurveyLinks() != null){
  65. aiSpeakingAssignment.setSurveyLinks(ConvertUtil.listToString(aiSpeakingAssignmentDTO.getSurveyLinks()));
  66. }
  67. baseMapper.insert(aiSpeakingAssignment);
  68. } catch (Exception e) {
  69. log.error(e.getMessage());
  70. throw MyException.create(HttpStatus.INTERNAL_SERVER_ERROR, "创建作业失败");
  71. }
  72. }
  73. @Override
  74. public AiSpeakingAssignmentVO findAssignmentById(Long assignmentId) {
  75. QueryWrapper<Assignment> wrapper = new QueryWrapper<>();
  76. wrapper.eq("assignment_id", assignmentId);
  77. Assignment assignment = assignmentMapper.selectOne(wrapper);
  78. if (assignment == null)
  79. throw MyException.create(HttpStatus.BAD_REQUEST, "作业不存在");
  80. QueryWrapper<AiSpeakingAssignment> speakingAssignmentQueryWrapper = new QueryWrapper<>();
  81. speakingAssignmentQueryWrapper.eq("assignment_id", assignmentId);
  82. AiSpeakingAssignment aiSpeakingAssignment = baseMapper.selectOne(speakingAssignmentQueryWrapper);
  83. return convertToVO(assignment, aiSpeakingAssignment);
  84. }
  85. private AiSpeakingAssignmentVO convertToVO(Assignment assignment, AiSpeakingAssignment aiSpeakingAssignment) {
  86. AiSpeakingAssignmentVO aiSpeakingAssignmentVO = new AiSpeakingAssignmentVO();
  87. BeanUtils.copyProperties(assignment, aiSpeakingAssignmentVO);
  88. BeanUtils.copyProperties(aiSpeakingAssignment, aiSpeakingAssignmentVO);
  89. if(aiSpeakingAssignment.getSurveyLinks() != null){
  90. aiSpeakingAssignmentVO.setSurveyLinks(ConvertUtil.stringToList(aiSpeakingAssignment.getSurveyLinks(), String::valueOf));
  91. }
  92. aiSpeakingAssignmentVO.setStatus(calculateStatus(aiSpeakingAssignmentVO.getStartTime(), aiSpeakingAssignmentVO.getEndTime()));
  93. // 组装老师姓名
  94. aiSpeakingAssignmentVO.setTeacherName(userMapper.selectNameById(assignment.getTeacherId()));
  95. return aiSpeakingAssignmentVO;
  96. }
  97. @Override
  98. @Transactional
  99. public boolean updateAssignment(MyUserDetails user, Long assignmentId, AiSpeakingAssignmentDTO aiSpeakingAssignmentDTO) {
  100. Assignment assignment = assignmentMapper.selectById(assignmentId);
  101. if (!Objects.equals(assignment.getTeacherId(), user.getId()))
  102. throw MyException.create(HttpStatus.BAD_REQUEST, "无权限更新");
  103. Assignment newAssignment = new Assignment();
  104. BeanUtils.copyProperties(aiSpeakingAssignmentDTO, newAssignment);
  105. newAssignment.setAssignmentId(assignmentId);
  106. AiSpeakingAssignment aiSpeakingAssignment = new AiSpeakingAssignment();
  107. BeanUtils.copyProperties(aiSpeakingAssignmentDTO, aiSpeakingAssignment);
  108. aiSpeakingAssignment.setAssignmentId(assignmentId);
  109. if(aiSpeakingAssignmentDTO.getSurveyLinks() != null){
  110. aiSpeakingAssignment.setSurveyLinks(ConvertUtil.listToString(aiSpeakingAssignmentDTO.getSurveyLinks()));
  111. }
  112. try {
  113. int code1 = assignmentMapper.updateById(newAssignment);
  114. UpdateWrapper<AiSpeakingAssignment> updateWrapper = new UpdateWrapper<>();
  115. updateWrapper.eq("assignment_id",assignmentId);
  116. int code2 = baseMapper.update(aiSpeakingAssignment, updateWrapper);
  117. if ((code1 | code2) == 0)
  118. throw MyException.create(HttpStatus.INTERNAL_SERVER_ERROR, "服务器更新失败");
  119. } catch (Exception e) {
  120. log.error(e.getMessage());
  121. throw MyException.create(HttpStatus.INTERNAL_SERVER_ERROR, "服务器更新失败");
  122. }
  123. return true;
  124. }
  125. @Override
  126. @Transactional
  127. @CacheEvict(value = "assignmentInfo", key = "'assignment_' + #assignmentId")
  128. public void deleteById(Long teacherId, Long assignmentId) {
  129. Assignment target = assignmentMapper.selectById(assignmentId);
  130. if (!Objects.equals(target.getTeacherId(), teacherId))
  131. throw MyException.create(HttpStatus.INTERNAL_SERVER_ERROR, "无权限删除");
  132. try {
  133. List<Engagement> engagements = studentAssignmentMapper.findEngagementByAssignmentId(assignmentId);
  134. for(Engagement engagement : engagements) {
  135. studentAssignmentMapper.delete(engagement.getStudentId(), assignmentId);
  136. }
  137. int code = assignmentMapper.deleteById(assignmentId);
  138. QueryWrapper<AiSpeakingAssignment> speakingAssignmentQueryWrapper = new QueryWrapper<>();
  139. speakingAssignmentQueryWrapper.eq("assignment_id", assignmentId);
  140. int code1 = baseMapper.delete(speakingAssignmentQueryWrapper);
  141. if (code==0 || code1 == 0) {
  142. throw MyException.create(HttpStatus.INTERNAL_SERVER_ERROR, "删除作业错误");
  143. }
  144. } catch (Exception e) {
  145. log.error(e.getMessage());
  146. throw MyException.create(HttpStatus.INTERNAL_SERVER_ERROR, "删除作业错误");
  147. }
  148. }
  149. private AssignmentStatus calculateStatus(Date startTime, Date endTime) {
  150. Date now = new Date();
  151. if (now.before(startTime)) {
  152. return AssignmentStatus.NOT_STARTED;
  153. } else if (now.after(endTime)) {
  154. return AssignmentStatus.FINISHED;
  155. } else {
  156. return AssignmentStatus.PROCEEDING;
  157. }
  158. }
  159. }