fuliqi
2024-07-04 257b9a1d149333678b05196909517a4daa2b12ee
首页接口,学生上课记录
5个文件已修改
6个文件已添加
269 ■■■■■ 已修改文件
src/main/java/com/ycl/jxkg/controller/student/HomeController.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ycl/jxkg/domain/entity/MeetStudent.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ycl/jxkg/domain/entity/StudyRecord.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ycl/jxkg/domain/vo/student/HomeVO.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ycl/jxkg/job/StudyRecordJob.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ycl/jxkg/mapper/MeetMapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ycl/jxkg/mapper/MeetStudentMapper.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ycl/jxkg/service/HomeService.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ycl/jxkg/service/impl/HomeServiceImpl.java 119 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ycl/jxkg/service/impl/MeetServiceImpl.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/StudyRecordMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ycl/jxkg/controller/student/HomeController.java
New file
@@ -0,0 +1,25 @@
package com.ycl.jxkg.controller.student;
import com.ycl.jxkg.base.Result;
import com.ycl.jxkg.service.HomeService;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RequiredArgsConstructor
@RestController("HomeController")
@RequestMapping(value = "/api/student/home")
public class HomeController {
    @Autowired
    private HomeService homeService;
    @GetMapping()
    @ApiOperation(value = "首页", notes = "首页")
    public Result home() {
        Result home = homeService.home();
        return Result.ok(home);
    }
}
src/main/java/com/ycl/jxkg/domain/entity/MeetStudent.java
New file
@@ -0,0 +1,16 @@
package com.ycl.jxkg.domain.entity;
import lombok.Data;
import java.util.Date;
@Data
public class MeetStudent {
    private Integer id;
    private Integer meetId;
    private Integer studentId;
    private Date startTime;
    private Date createTime;
    private Long duringTime;
}
src/main/java/com/ycl/jxkg/domain/entity/StudyRecord.java
@@ -21,4 +21,6 @@
    @TableField("last_time")
    private Date lastTime;
    @TableField("meet_count")
    private Integer meetCount;
}
src/main/java/com/ycl/jxkg/domain/vo/student/HomeVO.java
New file
@@ -0,0 +1,32 @@
package com.ycl.jxkg.domain.vo.student;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ycl.jxkg.domain.entity.Exam;
import com.ycl.jxkg.domain.entity.Meet;
import com.ycl.jxkg.domain.vo.ExamVO;
import com.ycl.jxkg.domain.vo.MeetVO;
import lombok.Data;
import java.util.Date;
import java.util.List;
@Data
public class HomeVO {
    private Integer userId;
    //看视频时长
    private Long studyTime;
    //最后看视频时间
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date lastTime;
    //已经上过课的次数
    private Integer meetCount;
    //平均分
    private String scoreAverage;
    //会议
    private List<MeetVO> meetList;
    //考试
    private List<ExamVO> examList;
}
src/main/java/com/ycl/jxkg/job/StudyRecordJob.java
@@ -56,6 +56,7 @@
                    if (record.getStudentId().equals(cacheRecord.getStudentId())) {
                        cacheRecord.setId(record.getId());
                        cacheRecord.setStudyTime(record.getStudyTime() + cacheRecord.getStudyTime());
                        cacheRecord.setMeetCount(record.getMeetCount());
                    }
                }
            }
src/main/java/com/ycl/jxkg/mapper/MeetMapper.java
@@ -22,7 +22,7 @@
     * @param id
     * @return
     */
    MeetVO getById(Integer id);
    Meet getById(Integer id);
    /**
    *  分页
src/main/java/com/ycl/jxkg/mapper/MeetStudentMapper.java
New file
@@ -0,0 +1,21 @@
package com.ycl.jxkg.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.ycl.jxkg.domain.entity.Meet;
import com.ycl.jxkg.domain.entity.MeetStudent;
import com.ycl.jxkg.domain.query.MeetQuery;
import com.ycl.jxkg.domain.vo.MeetVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
 * 学生会议记录表 Mapper 接口
 *
 * @author flq
 * @since 2024-06-17
 */
@Mapper
public interface MeetStudentMapper extends BaseMapper<MeetStudent> {
}
src/main/java/com/ycl/jxkg/service/HomeService.java
New file
@@ -0,0 +1,20 @@
package com.ycl.jxkg.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ycl.jxkg.base.Result;
import com.ycl.jxkg.domain.entity.Meet;
import com.ycl.jxkg.domain.form.MeetForm;
import com.ycl.jxkg.domain.query.MeetQuery;
import java.util.List;
/**
 * 首页 服务类
 *
 * @author flq
 * @since 2024-06-17
 */
public interface HomeService {
    Result home();
}
src/main/java/com/ycl/jxkg/service/impl/HomeServiceImpl.java
New file
@@ -0,0 +1,119 @@
package com.ycl.jxkg.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ycl.jxkg.base.Result;
import com.ycl.jxkg.context.WebContext;
import com.ycl.jxkg.domain.entity.Exam;
import com.ycl.jxkg.domain.entity.ExamPaperScore;
import com.ycl.jxkg.domain.entity.Meet;
import com.ycl.jxkg.domain.entity.StudyRecord;
import com.ycl.jxkg.domain.vo.ExamVO;
import com.ycl.jxkg.domain.vo.MeetVO;
import com.ycl.jxkg.domain.vo.student.HomeVO;
import com.ycl.jxkg.mapper.*;
import com.ycl.jxkg.service.ExamPaperScoreService;
import com.ycl.jxkg.service.HomeService;
import lombok.RequiredArgsConstructor;
import org.checkerframework.checker.units.qual.A;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
 * 首页 服务实现类
 *
 * @author flq
 * @since 2024-06-17
 */
@Service
@RequiredArgsConstructor
public class HomeServiceImpl implements HomeService {
    @Autowired
    private WebContext webContext;
    @Autowired
    private MeetMapper meetMapper;
    @Autowired
    private ExamMapper examMapper;
    @Autowired
    private StudyRecordMapper studyRecordMapper;
    @Autowired
    private ExamPaperScoreMapper scoreMapper;
    @Autowired
    private ClassesUserMapper classesUserMapper;
    @Override
    public Result home() {
        HomeVO vo = new HomeVO();
        Integer userId = webContext.getCurrentUser().getId();
        vo.setUserId(userId);
        //所在的班级
        List<Integer> classes = classesUserMapper.getClassesByUserId(userId);
        //学习记录
        StudyRecord studyRecord = studyRecordMapper.getByStudentId(userId);
        if (studyRecord != null) {
            vo.setLastTime(studyRecord.getLastTime());
            vo.setStudyTime(studyRecord.getStudyTime());
            vo.setMeetCount(studyRecord.getMeetCount());
        }else {
            vo.setStudyTime(0L);
            vo.setMeetCount(0);
        }
        //平均分
        QueryWrapper<ExamPaperScore> scoreWapper = new QueryWrapper<ExamPaperScore>();
        scoreWapper.eq("user_id", userId);
        List<ExamPaperScore> examPaperScores = scoreMapper.selectList(scoreWapper);
        if (CollectionUtils.isEmpty(examPaperScores)) {
            vo.setScoreAverage("0");
        } else {
            BigDecimal totalScore = examPaperScores.stream()
                    .map(ExamPaperScore::getScore)
                    .reduce(BigDecimal.ZERO, BigDecimal::add);
            int size = examPaperScores.size();
            vo.setScoreAverage(totalScore.divide(new BigDecimal(size), 1, RoundingMode.HALF_UP) + "");
        }
        List<MeetVO> meetList = new ArrayList<>();
        List<ExamVO> examList = new ArrayList<>();
        if (!CollectionUtils.isEmpty(classes)) {
            LocalDate nowDate = LocalDate.now();
            // 计算七天后的日期
            LocalDate sevenDayLaterDate = nowDate.plusDays(7);
            LocalDateTime now = LocalDateTime.of(nowDate, LocalTime.MIN);
            LocalDateTime sevenDayLater = LocalDateTime.of(sevenDayLaterDate, LocalTime.MIN);
            //我的课程
            QueryWrapper<Meet> meetQueryWrapper = new QueryWrapper<>();
            meetQueryWrapper.in("classes_id",classes);
            meetQueryWrapper.between("start_time", now,sevenDayLater);
            List<Meet> meets = meetMapper.selectList(meetQueryWrapper);
            for (Meet meet : meets) {
                MeetVO meetVO = new MeetVO();
                BeanUtils.copyProperties(meet,meetVO);
                meetList.add(meetVO);
            }
            //我的考试
            QueryWrapper<Exam> examQueryWrapper = new QueryWrapper<>();
            examQueryWrapper.in("classes_id",classes);
            examQueryWrapper.between("start_time", now,sevenDayLater);
            List<Exam> exams = examMapper.selectList(examQueryWrapper);
            for (Exam exam : exams) {
                ExamVO examVO = new ExamVO();
                BeanUtils.copyProperties(exam,examVO);
                examList.add(examVO);
            }
        }
        //我的课程
        vo.setMeetList(meetList);
        //我的考试
        vo.setExamList(examList);
        return Result.ok(vo);
    }
}
src/main/java/com/ycl/jxkg/service/impl/MeetServiceImpl.java
@@ -8,12 +8,16 @@
import com.ycl.jxkg.base.SystemCode;
import com.ycl.jxkg.context.WebContext;
import com.ycl.jxkg.domain.entity.Meet;
import com.ycl.jxkg.domain.entity.MeetStudent;
import com.ycl.jxkg.domain.entity.StudyRecord;
import com.ycl.jxkg.domain.form.MeetForm;
import com.ycl.jxkg.domain.query.MeetQuery;
import com.ycl.jxkg.domain.vo.MeetVO;
import com.ycl.jxkg.enums.MeetStatusEnum;
import com.ycl.jxkg.mapper.ClassesUserMapper;
import com.ycl.jxkg.mapper.MeetMapper;
import com.ycl.jxkg.mapper.MeetStudentMapper;
import com.ycl.jxkg.mapper.StudyRecordMapper;
import com.ycl.jxkg.rabbitmq.msg.MeetStatusMsg;
import com.ycl.jxkg.rabbitmq.product.Producer;
import com.ycl.jxkg.service.MeetService;
@@ -46,6 +50,8 @@
    @Autowired
    private ClassesUserMapper classesUserMapper;
    private final Producer producer;
    private final MeetStudentMapper meetStudentMapper;
    private final StudyRecordMapper studyRecordMapper;
    /**
     * 添加
     * @param form
@@ -161,9 +167,31 @@
     */
    @Override
    public Result detail(Integer id) {
        MeetVO vo = baseMapper.getById(id);
        Meet vo = baseMapper.getById(id);
        Assert.notNull(vo, "记录不存在");
        if(vo.getStatus().equals(MeetStatusEnum.Starting.getCode())){
            //增加学生上课记录
            Integer userId = webContext.getCurrentUser().getId();
            MeetStudent meetStudent = new MeetStudent();
            meetStudent.setMeetId(id);
            meetStudent.setStudentId(userId);
            meetStudent.setCreateTime(new Date());
            meetStudent.setStartTime(vo.getStartTime());
            //TODO:暂时处理,后期考虑jitsiApi
            meetStudent.setDuringTime((vo.getEndTime().getTime()-new Date().getTime())/1000);
            meetStudentMapper.insert(meetStudent);
            //学生学习档案更新
            StudyRecord studyRecord = studyRecordMapper.getByStudentId(userId);
            if(studyRecord ==null){
                StudyRecord record = new StudyRecord();
                record.setMeetCount(0);
                record.setStudyTime(0L);
                record.setStudentId(userId);
                studyRecordMapper.insert(record);
            }else {
                studyRecord.setMeetCount(studyRecord.getMeetCount()+1);
                studyRecordMapper.updateById(studyRecord);
            }
            return Result.ok();
        }else {
            return Result.fail(SystemCode.InnerError.getCode(),"房间尚未开始或已结束");
src/main/resources/mapper/StudyRecordMapper.xml
@@ -8,6 +8,7 @@
        <result column="student_id" property="studentId"/>
        <result column="study_time" property="studyTime"/>
        <result column="last_time" property="lastTime"/>
        <result column="meet_count" property="meetCount"/>
    </resultMap>