From 247cb86585a1d1894596ed18a6c93efecb992946 Mon Sep 17 00:00:00 2001
From: luohairen <3399054449@qq.com>
Date: 星期四, 14 十一月 2024 10:34:27 +0800
Subject: [PATCH] 班级成绩图表分析

---
 src/main/java/com/ycl/jxkg/service/impl/MeetServiceImpl.java |  224 ++++++++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 179 insertions(+), 45 deletions(-)

diff --git a/src/main/java/com/ycl/jxkg/service/impl/MeetServiceImpl.java b/src/main/java/com/ycl/jxkg/service/impl/MeetServiceImpl.java
index 50ba3f3..481ed76 100644
--- a/src/main/java/com/ycl/jxkg/service/impl/MeetServiceImpl.java
+++ b/src/main/java/com/ycl/jxkg/service/impl/MeetServiceImpl.java
@@ -1,28 +1,36 @@
 package com.ycl.jxkg.service.impl;
 
-import com.alibaba.fastjson2.JSONArray;
+import com.alibaba.fastjson2.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.ycl.jxkg.context.WebContext;
-import com.ycl.jxkg.domain.entity.Meet;
-import com.ycl.jxkg.mapper.ClassesUserMapper;
-import com.ycl.jxkg.mapper.MeetMapper;
-import com.ycl.jxkg.service.MeetService;
-import com.ycl.jxkg.base.Result;
+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.*;
 import com.ycl.jxkg.domain.form.MeetForm;
-import com.ycl.jxkg.domain.vo.MeetVO;
 import com.ycl.jxkg.domain.query.MeetQuery;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.core.context.SecurityContextHolder;
-import org.springframework.security.core.userdetails.User;
-import org.springframework.stereotype.Service;
-import lombok.RequiredArgsConstructor;
+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.*;
+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.transaction.annotation.Transactional;
 import org.springframework.util.Assert;
 import org.springframework.util.CollectionUtils;
-
-import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -42,16 +50,33 @@
     private WebContext webContext;
     @Autowired
     private ClassesUserMapper classesUserMapper;
+    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());
         entity.setCreateUser(webContext.getCurrentUser().getId());
-        baseMapper.insert(entity);
+        // 璁剧疆涔愯閿佺増鏈�
+        entity.setUpdateVersion(0);
+        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("娣诲姞鎴愬姛");
     }
 
@@ -63,11 +88,27 @@
     @Override
     public Result update(MeetForm form) {
         Meet entity = baseMapper.selectById(form.getId());
-
         // 涓虹┖鎶汭llegalArgumentException锛屽仛鍏ㄥ眬寮傚父澶勭悊
         Assert.notNull(entity, "璁板綍涓嶅瓨鍦�");
         BeanUtils.copyProperties(form, entity);
-        baseMapper.updateById(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);
+        });
+
+
+        // 濡傛灉淇敼鎴愬姛鍙戦�乵q娑堟伅
+        if (baseMapper.updateById(entity) > 0) {
+            this.sendMQ(entity, entity.getUpdateVersion());
+        }
         return Result.ok("淇敼鎴愬姛");
     }
 
@@ -100,18 +141,29 @@
      */
     @Override
     public Result page(MeetQuery query) {
-        Integer id = webContext.getCurrentUser().getId();
-        query.setTeacherId(id);
-        IPage<Meet> page = PageUtil.getPage(query, Meet.class);
-        baseMapper.getPage(page, query);
-        List<Meet> records = page.getRecords();
-        List<MeetVO> vos = new ArrayList<>();
-        for (Meet record : records) {
-            MeetVO meetVO = new MeetVO();
-            BeanUtils.copyProperties(record,meetVO);
-            vos.add(meetVO);
+        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("鎮ㄦ殏鏃舵棤娉曡闂椤甸潰");
         }
-        return Result.ok().data(vos).total(page.getTotal());
+        query.setClassesIds(classesIds);
+        IPage<MeetVO> page = PageUtil.getPage(query, MeetVO.class);
+        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());
     }
 
     /**
@@ -122,22 +174,39 @@
     @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<Meet> page = PageUtil.getPage(query, Meet.class);
-        baseMapper.getPage(page, query);
-        List<Meet> records = page.getRecords();
-        List<MeetVO> vos = new ArrayList<>();
-        for (Meet record : records) {
-            MeetVO meetVO = new MeetVO();
-            BeanUtils.copyProperties(record,meetVO);
-            vos.add(meetVO);
+        IPage<MeetVO> page = PageUtil.getPage(query, MeetVO.class);
+        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(vos).total(page.getTotal());
+        return Result.ok().data(page.getRecords()).total(page.getTotal());
+    }
+
+    @Override
+    public Result start(MeetForm form) {
+        Meet entity = baseMapper.selectById(form.getId());
+        // 涓虹┖鎶汭llegalArgumentException锛屽仛鍏ㄥ眬寮傚父澶勭悊
+        Assert.notNull(entity, "璁板綍涓嶅瓨鍦�");
+        // 涓嶄娇鐢╱pdateById杩欑鏂瑰紡锛岄伩鍏嶄箰瑙傞攣鍔犱竴銆�
+        new LambdaUpdateChainWrapper<>(meetMapper)
+                .eq(Meet::getId, entity.getId())
+                .set(Meet::getStatus,form.getStatus())
+                .update();
+        return Result.ok();
     }
 
     /**
@@ -147,9 +216,46 @@
      */
     @Override
     public Result detail(Integer id) {
-        MeetVO vo = baseMapper.getById(id);
+        Meet vo = baseMapper.getById(id);
         Assert.notNull(vo, "璁板綍涓嶅瓨鍦�");
-        return Result.ok().data(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);
+            //瀛︾敓瀛︿範妗f鏇存柊
+            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(),"鎴块棿灏氭湭寮�濮嬫垨宸茬粨鏉�");
+        }
     }
 
     /**
@@ -164,4 +270,32 @@
                 .collect(Collectors.toList());
         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);
+    }
+
+    /**
+     * 鍙戦�乵q娑堟伅
+     *
+     * @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()));
+    }
+
 }

--
Gitblit v1.8.0