package com.njuzr.eaibackend.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.njuzr.eaibackend.dto.AiSpeakingAssignmentDTO; import com.njuzr.eaibackend.enums.AssignmentStatus; import com.njuzr.eaibackend.enums.Role; import com.njuzr.eaibackend.exception.MyException; import com.njuzr.eaibackend.mapper.*; import com.njuzr.eaibackend.po.*; import com.njuzr.eaibackend.service.AiSpeakingAssignmentService; import com.njuzr.eaibackend.utils.ConvertUtil; import com.njuzr.eaibackend.vo.AiSpeakingAssignmentVO; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheEvict; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.*; /** * @author Liululin * @date 2025/3/18 - 14:53 */ @Service @Slf4j public class AiSpeakingAssignmentServiceImpl extends ServiceImpl implements AiSpeakingAssignmentService { @Autowired CourseMapper courseMapper; @Autowired AssignmentMapper assignmentMapper; @Autowired UserMapper userMapper; @Autowired StudentAssignmentMapper studentAssignmentMapper; @Override public void createSpeakingAssignment(MyUserDetails user, Long courseId, AiSpeakingAssignmentDTO aiSpeakingAssignmentDTO) { Course course = courseMapper.selectById(courseId); if (course == null) throw MyException.create(HttpStatus.BAD_REQUEST, "课程不存在"); if (user.getRole() != Role.ADMIN) { List teacherIds = Collections.singletonList(Optional.ofNullable(course.getTeacherIds()) .orElse(Collections.emptyList().toString())); String userIdStr = String.valueOf(user.getId()); boolean hasTeacherId = teacherIds.contains(userIdStr); boolean pidMatches = Objects.equals(course.getTeacherPid(), user.getPid()); if (!hasTeacherId && !pidMatches) { throw MyException.create(HttpStatus.BAD_REQUEST, "无权限创建"); } } Assignment assignment = new Assignment(); BeanUtils.copyProperties(aiSpeakingAssignmentDTO, assignment); assignment.setCourseId(courseId); assignment.setTeacherId(user.getId()); assignment.setCreateTime(new Date()); try { assignmentMapper.insert(assignment); Long assignmentId = assignment.getAssignmentId(); log.info("assignmentId:" + assignmentId); AiSpeakingAssignment aiSpeakingAssignment = new AiSpeakingAssignment(); aiSpeakingAssignment.setAssignmentId(assignmentId); BeanUtils.copyProperties(aiSpeakingAssignmentDTO, aiSpeakingAssignment); if(aiSpeakingAssignmentDTO.getSurveyLinks() != null){ aiSpeakingAssignment.setSurveyLinks(ConvertUtil.listToString(aiSpeakingAssignmentDTO.getSurveyLinks())); } baseMapper.insert(aiSpeakingAssignment); } catch (Exception e) { log.error(e.getMessage()); throw MyException.create(HttpStatus.INTERNAL_SERVER_ERROR, "创建作业失败"); } } @Override public AiSpeakingAssignmentVO findAssignmentById(Long assignmentId) { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("assignment_id", assignmentId); Assignment assignment = assignmentMapper.selectOne(wrapper); if (assignment == null) throw MyException.create(HttpStatus.BAD_REQUEST, "作业不存在"); QueryWrapper speakingAssignmentQueryWrapper = new QueryWrapper<>(); speakingAssignmentQueryWrapper.eq("assignment_id", assignmentId); AiSpeakingAssignment aiSpeakingAssignment = baseMapper.selectOne(speakingAssignmentQueryWrapper); return convertToVO(assignment, aiSpeakingAssignment); } private AiSpeakingAssignmentVO convertToVO(Assignment assignment, AiSpeakingAssignment aiSpeakingAssignment) { AiSpeakingAssignmentVO aiSpeakingAssignmentVO = new AiSpeakingAssignmentVO(); BeanUtils.copyProperties(assignment, aiSpeakingAssignmentVO); BeanUtils.copyProperties(aiSpeakingAssignment, aiSpeakingAssignmentVO); if(aiSpeakingAssignment.getSurveyLinks() != null){ aiSpeakingAssignmentVO.setSurveyLinks(ConvertUtil.stringToList(aiSpeakingAssignment.getSurveyLinks(), String::valueOf)); } aiSpeakingAssignmentVO.setStatus(calculateStatus(aiSpeakingAssignmentVO.getStartTime(), aiSpeakingAssignmentVO.getEndTime())); // 组装老师姓名 aiSpeakingAssignmentVO.setTeacherName(userMapper.selectNameById(assignment.getTeacherId())); return aiSpeakingAssignmentVO; } @Override @Transactional public boolean updateAssignment(MyUserDetails user, Long assignmentId, AiSpeakingAssignmentDTO aiSpeakingAssignmentDTO) { Assignment assignment = assignmentMapper.selectById(assignmentId); if (!Objects.equals(assignment.getTeacherId(), user.getId())) throw MyException.create(HttpStatus.BAD_REQUEST, "无权限更新"); Assignment newAssignment = new Assignment(); BeanUtils.copyProperties(aiSpeakingAssignmentDTO, newAssignment); newAssignment.setAssignmentId(assignmentId); AiSpeakingAssignment aiSpeakingAssignment = new AiSpeakingAssignment(); BeanUtils.copyProperties(aiSpeakingAssignmentDTO, aiSpeakingAssignment); aiSpeakingAssignment.setAssignmentId(assignmentId); if(aiSpeakingAssignmentDTO.getSurveyLinks() != null){ aiSpeakingAssignment.setSurveyLinks(ConvertUtil.listToString(aiSpeakingAssignmentDTO.getSurveyLinks())); } try { int code1 = assignmentMapper.updateById(newAssignment); UpdateWrapper updateWrapper = new UpdateWrapper<>(); updateWrapper.eq("assignment_id",assignmentId); int code2 = baseMapper.update(aiSpeakingAssignment, updateWrapper); if ((code1 | code2) == 0) throw MyException.create(HttpStatus.INTERNAL_SERVER_ERROR, "服务器更新失败"); } catch (Exception e) { log.error(e.getMessage()); throw MyException.create(HttpStatus.INTERNAL_SERVER_ERROR, "服务器更新失败"); } return true; } @Override @Transactional @CacheEvict(value = "assignmentInfo", key = "'assignment_' + #assignmentId") public void deleteById(Long teacherId, Long assignmentId) { Assignment target = assignmentMapper.selectById(assignmentId); if (!Objects.equals(target.getTeacherId(), teacherId)) throw MyException.create(HttpStatus.INTERNAL_SERVER_ERROR, "无权限删除"); try { List engagements = studentAssignmentMapper.findEngagementByAssignmentId(assignmentId); for(Engagement engagement : engagements) { studentAssignmentMapper.delete(engagement.getStudentId(), assignmentId); } int code = assignmentMapper.deleteById(assignmentId); QueryWrapper speakingAssignmentQueryWrapper = new QueryWrapper<>(); speakingAssignmentQueryWrapper.eq("assignment_id", assignmentId); int code1 = baseMapper.delete(speakingAssignmentQueryWrapper); if (code==0 || code1 == 0) { throw MyException.create(HttpStatus.INTERNAL_SERVER_ERROR, "删除作业错误"); } } catch (Exception e) { log.error(e.getMessage()); throw MyException.create(HttpStatus.INTERNAL_SERVER_ERROR, "删除作业错误"); } } private AssignmentStatus calculateStatus(Date startTime, Date endTime) { Date now = new Date(); if (now.before(startTime)) { return AssignmentStatus.NOT_STARTED; } else if (now.after(endTime)) { return AssignmentStatus.FINISHED; } else { return AssignmentStatus.PROCEEDING; } } }