luohairen
2024-11-14 247cb86585a1d1894596ed18a6c93efecb992946
src/main/java/com/ycl/jxkg/service/impl/MeetServiceImpl.java
@@ -1,23 +1,23 @@
package com.ycl.jxkg.service.impl;
import com.alibaba.fastjson2.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ycl.jxkg.base.Result;
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.entity.*;
import com.ycl.jxkg.domain.form.MeetForm;
import com.ycl.jxkg.domain.query.MeetQuery;
import com.ycl.jxkg.domain.vo.ClassesVO;
import com.ycl.jxkg.domain.vo.MeetClassesVo;
import com.ycl.jxkg.domain.vo.MeetVO;
import com.ycl.jxkg.domain.vo.StudentSimpleVO;
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.mapper.*;
import com.ycl.jxkg.rabbitmq.msg.MeetStatusMsg;
import com.ycl.jxkg.rabbitmq.product.Producer;
import com.ycl.jxkg.service.MeetService;
@@ -27,6 +27,7 @@
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
import java.util.Date;
@@ -52,12 +53,14 @@
    private final Producer producer;
    private final MeetStudentMapper meetStudentMapper;
    private final StudyRecordMapper studyRecordMapper;
    private final MeetClassesMapper meetClassesMapper;
    /**
     * 添加
     * @param form
     * @return
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Result add(MeetForm form) {
        Meet entity = MeetForm.getEntityByForm(form, null);
        entity.setStatus(MeetStatusEnum.Wait.getCode());
@@ -67,6 +70,13 @@
        if (baseMapper.insert(entity) > 0) {
            this.sendMQ(entity, 0);
        }
        // 向会议班级中间表中插入数据
        form.getClassesIds().forEach(classId -> {
            MeetClasses meetClasses = new MeetClasses();
            meetClasses.setMeetId(entity.getId());
            meetClasses.setClassesId(classId);
            meetClassesMapper.insert(meetClasses);
        });
        return Result.ok("添加成功");
    }
@@ -78,13 +88,26 @@
    @Override
    public Result update(MeetForm form) {
        Meet entity = baseMapper.selectById(form.getId());
        // 为空抛IllegalArgumentException,做全局异常处理
        Assert.notNull(entity, "记录不存在");
        BeanUtils.copyProperties(form, entity);
        // 先删除再新增
        new LambdaUpdateChainWrapper<>(meetClassesMapper)
                .eq(MeetClasses::getMeetId, entity.getId())
                .remove();
        // 向会议班级中间表中插入数据
        form.getClassesIds().forEach(classId -> {
            MeetClasses meetClasses = new MeetClasses();
            meetClasses.setMeetId(entity.getId());
            meetClasses.setClassesId(classId);
            meetClassesMapper.insert(meetClasses);
        });
        // 如果修改成功发送mq消息
        if (baseMapper.updateById(entity) > 0) {
            this.sendMQ(entity, entity.getUpdateVersion() + 1);
            this.sendMQ(entity, entity.getUpdateVersion());
        }
        return Result.ok("修改成功");
    }
@@ -118,12 +141,28 @@
     */
    @Override
    public Result page(MeetQuery query) {
        Integer id = webContext.getCurrentUser().getId();
        //查自己创建的房间
        query.setTeacherId(id);
        Integer userId = webContext.getCurrentUser().getId();
        //查自己的会议
        List<ClassesUser> classes = new LambdaQueryChainWrapper<>(classesUserMapper)
                .eq(ClassesUser::getUserId, userId)
                .eq(ClassesUser::getTeacher, Boolean.TRUE)
                .list();
        List<Integer> classesIds = classes.stream().map(ClassesUser::getClassesId).collect(Collectors.toList());
        if (CollectionUtils.isEmpty(classesIds) && 3 != webContext.getCurrentUser().getRole()) {
            throw new RuntimeException("您暂时无法访问该页面");
        }
        query.setClassesIds(classesIds);
        IPage<MeetVO> page = PageUtil.getPage(query, MeetVO.class);
        baseMapper.getPage(page, query);
        baseMapper.teacherPage(page, query);
        page.getRecords().forEach(vo -> {
            if (! CollectionUtils.isEmpty(vo.getClassesIds())) {
                // 查主讲老师
                List<String> teacherNames = classesUserMapper.getTeachersByClassesIds(vo.getClassesIds());
                if (! CollectionUtils.isEmpty(teacherNames)) {
                    vo.setTeacherNamesStr(teacherNames.stream().collect(Collectors.joining("、")));
                }
            }
        });
        return Result.ok().data(page.getRecords()).total(page.getTotal());
    }
@@ -135,15 +174,25 @@
    @Override
    public Result studentPage(MeetQuery query) {
        Integer userId = webContext.getCurrentUser().getId();
        //查出学生所在班级
        List<Integer> classes = classesUserMapper.getClassesByUserId(userId);
        if(CollectionUtils.isEmpty(classes)){
            return Result.ok("您暂未加入班级");
        if (CollectionUtils.isEmpty(query.getClassesIds())) {
            //查出学生所在班级
            List<Integer> classes = classesUserMapper.getClassesByUserId(userId);
            if(CollectionUtils.isEmpty(classes)){
                return Result.fail(500, "您暂未加入班级");
            }
            query.setClassesIds(classes);
        }
        query.setClassesIds(classes);
        IPage<MeetVO> page = PageUtil.getPage(query, MeetVO.class);
        baseMapper.getPage(page, query);
        baseMapper.studentPage(page, query);
        for (MeetVO vo : page.getRecords()) {
            if (! CollectionUtils.isEmpty(vo.getClassesIds())) {
                // 查主讲老师
                List<String> teacherNames = classesUserMapper.getTeachersByClassesIds(vo.getClassesIds());
                if (! CollectionUtils.isEmpty(teacherNames)) {
                    vo.setTeacherNamesStr(teacherNames.stream().collect(Collectors.joining("、")));
                }
            }
        }
        return Result.ok().data(page.getRecords()).total(page.getTotal());
    }
@@ -152,10 +201,10 @@
        Meet entity = baseMapper.selectById(form.getId());
        // 为空抛IllegalArgumentException,做全局异常处理
        Assert.notNull(entity, "记录不存在");
        BeanUtils.copyProperties(form, entity);
        // 不使用updateById这种方式,避免乐观锁加一。
        new LambdaUpdateChainWrapper<>(meetMapper)
                .eq(Meet::getId, entity.getId())
                .set(Meet::getStatus,form.getStatus())
                .update();
        return Result.ok();
    }
@@ -170,15 +219,26 @@
        Meet vo = baseMapper.getById(id);
        Assert.notNull(vo, "记录不存在");
        if(vo.getStatus().equals(MeetStatusEnum.Starting.getCode())){
            //增加学生上课记录
            Integer userId = webContext.getCurrentUser().getId();
            //验证有没有重复进入(重复进入会导致上课次数增多)
            QueryWrapper<MeetStudent> queryWrapper = new QueryWrapper<>();
            queryWrapper.eq("meet_id",id);
            queryWrapper.eq("student_id",userId);
            queryWrapper.eq("version",vo.getUpdateVersion());
            MeetStudent one = meetStudentMapper.selectOne(queryWrapper);
            if(one != null){
                return Result.ok();
            }
            //增加学生上课记录
            MeetStudent meetStudent = new MeetStudent();
            meetStudent.setMeetId(id);
            meetStudent.setStudentId(userId);
            meetStudent.setCreateTime(new Date());
            meetStudent.setStartTime(vo.getStartTime());
            meetStudent.setVersion(vo.getUpdateVersion());
            meetStudent.setMeetName(vo.getMeetName());
            //TODO:暂时处理,后期考虑jitsiApi
            meetStudent.setDuringTime((vo.getEndTime().getTime()-new Date().getTime())/1000);
            meetStudent.setDuringTime(0L);
            meetStudentMapper.insert(meetStudent);
            //学生学习档案更新
            StudyRecord studyRecord = studyRecordMapper.getByStudentId(userId);
@@ -211,6 +271,19 @@
        return Result.ok().data(vos);
    }
    @Override
    public Result getStudentList(Integer meetId, String keyword) {
        List<StudentSimpleVO> studentList = baseMapper.getStudentList(meetId, keyword);
        return Result.ok().data(studentList);
    }
    @Override
    public Result getStudentClasses() {
        Integer userId = webContext.getCurrentUser().getId();
        List<ClassesVO> classes = classesUserMapper.getClassesByUserId1(userId);
        return Result.ok().data(classes);
    }
    /**
     * 发送mq消息
     *