src/main/java/com/ycl/jxkg/controller/student/HomeController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/ycl/jxkg/domain/entity/MeetStudent.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/ycl/jxkg/domain/entity/StudyRecord.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/ycl/jxkg/domain/vo/student/HomeVO.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/ycl/jxkg/job/StudyRecordJob.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/ycl/jxkg/mapper/MeetMapper.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/ycl/jxkg/mapper/MeetStudentMapper.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/ycl/jxkg/service/HomeService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/ycl/jxkg/service/impl/HomeServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/ycl/jxkg/service/impl/MeetServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/resources/mapper/StudyRecordMapper.xml | ●●●●● 补丁 | 查看 | 原始文档 | 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>