| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- 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<AiSpeakingAssignmentMapper, AiSpeakingAssignment> 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<String> 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<Assignment> wrapper = new QueryWrapper<>();
- wrapper.eq("assignment_id", assignmentId);
- Assignment assignment = assignmentMapper.selectOne(wrapper);
- if (assignment == null)
- throw MyException.create(HttpStatus.BAD_REQUEST, "作业不存在");
- QueryWrapper<AiSpeakingAssignment> 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<AiSpeakingAssignment> 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<Engagement> engagements = studentAssignmentMapper.findEngagementByAssignmentId(assignmentId);
- for(Engagement engagement : engagements) {
- studentAssignmentMapper.delete(engagement.getStudentId(), assignmentId);
- }
- int code = assignmentMapper.deleteById(assignmentId);
- QueryWrapper<AiSpeakingAssignment> 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;
- }
- }
- }
|