AiSpeakingAssignmentServiceImpl.java 9.3 KB

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