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.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.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;
|
import com.ycl.jxkg.utils.DateTimeUtil;
|
import com.ycl.jxkg.utils.PageUtil;
|
import lombok.RequiredArgsConstructor;
|
import org.springframework.beans.BeanUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
import org.springframework.util.Assert;
|
import org.springframework.util.CollectionUtils;
|
import java.util.Date;
|
import java.util.List;
|
import java.util.stream.Collectors;
|
|
/**
|
* 会议表 服务实现类
|
*
|
* @author flq
|
* @since 2024-06-17
|
*/
|
@Service
|
@RequiredArgsConstructor
|
public class MeetServiceImpl extends ServiceImpl<MeetMapper, Meet> implements MeetService {
|
|
private final MeetMapper meetMapper;
|
|
@Autowired
|
private WebContext webContext;
|
@Autowired
|
private ClassesUserMapper classesUserMapper;
|
private final Producer producer;
|
private final MeetStudentMapper meetStudentMapper;
|
private final StudyRecordMapper studyRecordMapper;
|
/**
|
* 添加
|
* @param form
|
* @return
|
*/
|
@Override
|
public Result add(MeetForm form) {
|
Meet entity = MeetForm.getEntityByForm(form, null);
|
entity.setStatus(MeetStatusEnum.Wait.getCode());
|
entity.setCreateUser(webContext.getCurrentUser().getId());
|
// 设置乐观锁版本
|
entity.setUpdateVersion(0);
|
if (baseMapper.insert(entity) > 0) {
|
this.sendMQ(entity, 0);
|
}
|
return Result.ok("添加成功");
|
}
|
|
/**
|
* 修改
|
* @param form
|
* @return
|
*/
|
@Override
|
public Result update(MeetForm form) {
|
Meet entity = baseMapper.selectById(form.getId());
|
// 为空抛IllegalArgumentException,做全局异常处理
|
Assert.notNull(entity, "记录不存在");
|
BeanUtils.copyProperties(form, entity);
|
// 如果修改成功发送mq消息
|
if (baseMapper.updateById(entity) > 0) {
|
this.sendMQ(entity, entity.getUpdateVersion());
|
}
|
return Result.ok("修改成功");
|
}
|
|
/**
|
* 批量删除
|
* @param ids
|
* @return
|
*/
|
@Override
|
public Result remove(List<String> ids) {
|
baseMapper.deleteBatchIds(ids);
|
return Result.ok("删除成功");
|
}
|
|
/**
|
* id删除
|
* @param id
|
* @return
|
*/
|
@Override
|
public Result removeById(String id) {
|
baseMapper.deleteById(id);
|
return Result.ok("删除成功");
|
}
|
|
/**
|
* 教师分页查询
|
* @param query
|
* @return
|
*/
|
@Override
|
public Result page(MeetQuery query) {
|
Integer id = webContext.getCurrentUser().getId();
|
//查自己创建的房间
|
query.setTeacherId(id);
|
IPage<MeetVO> page = PageUtil.getPage(query, MeetVO.class);
|
baseMapper.getPage(page, query);
|
|
return Result.ok().data(page.getRecords()).total(page.getTotal());
|
}
|
|
/**
|
* 学生分页查询
|
* @param query
|
* @return
|
*/
|
@Override
|
public Result studentPage(MeetQuery query) {
|
Integer userId = webContext.getCurrentUser().getId();
|
//查出学生所在班级
|
List<Integer> classes = classesUserMapper.getClassesByUserId(userId);
|
if(CollectionUtils.isEmpty(classes)){
|
return Result.ok("您暂未加入班级");
|
}
|
query.setClassesIds(classes);
|
IPage<MeetVO> page = PageUtil.getPage(query, MeetVO.class);
|
baseMapper.getPage(page, query);
|
|
return Result.ok().data(page.getRecords()).total(page.getTotal());
|
}
|
|
@Override
|
public Result start(MeetForm form) {
|
Meet entity = baseMapper.selectById(form.getId());
|
// 为空抛IllegalArgumentException,做全局异常处理
|
Assert.notNull(entity, "记录不存在");
|
entity.setStatus(form.getStatus());
|
// 不使用updateById这种方式,避免乐观锁加一。
|
new LambdaUpdateChainWrapper<>(meetMapper)
|
.eq(Meet::getId, entity.getId())
|
.update(entity);
|
return Result.ok();
|
}
|
|
/**
|
* 根据id查找
|
* @param id
|
* @return
|
*/
|
@Override
|
public Result detail(Integer id) {
|
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(0L);
|
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(),"房间尚未开始或已结束");
|
}
|
}
|
|
/**
|
* 列表
|
* @return
|
*/
|
@Override
|
public Result all() {
|
List<Meet> entities = baseMapper.selectList(null);
|
List<MeetVO> vos = entities.stream()
|
.map(entity -> MeetVO.getVoByEntity(entity, null))
|
.collect(Collectors.toList());
|
return Result.ok().data(vos);
|
}
|
|
/**
|
* 发送mq消息
|
*
|
* @param entity 考试实体类
|
* @param version 乐观锁版本
|
*/
|
public void sendMQ(Meet entity, Integer version) {
|
MeetStatusMsg finishedMsg = new MeetStatusMsg();
|
finishedMsg.setVersion(version);
|
finishedMsg.setMeetId(entity.getId());
|
finishedMsg.setMeetStatus(MeetStatusEnum.End.getCode());
|
producer.meetMsg(entity.getId(), JSON.toJSONString(finishedMsg), DateTimeUtil.getTwoTimeDiffMS(entity.getEndTime(), new Date()));
|
}
|
|
}
|