Ver código fonte

批次,场次定时任务和时间校验

wangliang 2 anos atrás
pai
commit
d55a451cfb

+ 47 - 65
themis-admin/src/main/java/com/qmth/themis/admin/api/TEExamController.java

@@ -155,6 +155,35 @@ public class TEExamController {
                 if (teExam.getEndTime().longValue() < oldTeExam.getEndTime().longValue()) {
                     throw new BusinessException("修改的批次结束时间只能大于未修改前的批次结束时间");
                 }
+                if (Objects.nonNull(oldTeExam) && Objects.nonNull(teExam)
+                        && oldTeExam.getForceFinish().intValue() != teExam.getForceFinish().intValue()
+                        && teExam.getMode() == oldTeExam.getMode()) {
+                    QueryWrapper<TEExamActivity> teExamActivityQueryWrapper = new QueryWrapper<>();
+                    teExamActivityQueryWrapper.lambda().eq(TEExamActivity::getExamId, oldId);
+                    List<TEExamActivity> teExamActivityList = teExamActivityService.list(teExamActivityQueryWrapper);
+                    if (!CollectionUtils.isEmpty(teExamActivityList)) {
+                        if (teExam.getForceFinish().intValue() == 1) {//从非强制交卷改成强制交卷,这时需生成场次定时任务
+                            //新增quartz任务,发送mq消息start
+                            Map<String, Object> prop = new HashMap<>();
+                            prop.put("oper", "insert");
+                            prop.put("exam", teExam);
+                            MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.EXAM_ACTIVITY.name(),
+                                    JacksonUtil.parseJson(teExamActivityList), MqTagEnum.EXAM_ACTIVITY,
+                                    String.valueOf(teExam.getId()), prop, tbUser.getName());
+                            mqDtoService.assembleSendOneOrderMsg(mqDto);
+                            //新增quartz任务,发送mq消息end
+                        } else {//否则删除场次定时任务
+                            //删除quartz任务,发送mq消息start
+                            Map<String, Object> prop = new HashMap<>();
+                            prop.put("oper", "delete");
+                            MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.EXAM_ACTIVITY.name(),
+                                    JacksonUtil.parseJson(teExamActivityList), MqTagEnum.EXAM_ACTIVITY,
+                                    String.valueOf(teExam.getId()), prop, tbUser.getName());
+                            mqDtoService.assembleSendOneOrderMsg(mqDto);
+                            //删除quartz任务,发送mq消息end
+                        }
+                    }
+                }
                 tsLogService.save(new TSLog(LogEnum.EXAM, teExam.getName(),
                         JacksonUtil.parseJson(oldTeExam),
                         JacksonUtil.parseJson(teExam),
@@ -167,59 +196,14 @@ public class TEExamController {
                 }
             }
             teExamService.saveOrUpdate(teExam);
-            if (Objects.nonNull(oldTeExam) && !Objects
-                    .equals(oldTeExam.getMode().name(), teExamDto.getMode().name())) {//如果模式改变,则删除之前模式的全部quartz
-                QueryWrapper<TEExamActivity> teExamActivityQueryWrapper = new QueryWrapper<>();
-                teExamActivityQueryWrapper.lambda().eq(TEExamActivity::getExamId, oldId);
-                List<TEExamActivity> teExamActivityList = teExamActivityService.list(teExamActivityQueryWrapper);
-                if (Objects.nonNull(teExamActivityList) && teExamActivityList.size() > 0) {
-                    //删除quartz任务,发送mq消息start
-                    Map<String, Object> prop = new HashMap<>();
-                    prop.put("oper", "delete");
-                    if (Objects.nonNull(teExamActivityList.get(0)) && teExamActivityList.get(0).getEnable() == 1) {
-                        MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.EXAM_ACTIVITY.name(),
-                                JacksonUtil.parseJson(teExamActivityList), MqTagEnum.EXAM_ACTIVITY,
-                                String.valueOf(teExam.getId()), prop, tbUser.getName());
-                        mqDtoService.assembleSendOneOrderMsg(mqDto);
-                    }
-                    //删除quartz任务,发送mq消息end
-                    //删除数据
-                    teExamActivityService.remove(teExamActivityQueryWrapper);
-                }
-            }
+            //只有集中统一模式,并且强制交卷才会生成场次定时任务。否则等待每天凌晨的定时任务交卷
             //如果是随到随考,则默认插入一条场次信息
-            if (Objects.equals(teExam.getMode().name(), ExamModeEnum.ANYTIME.name())) {//随到随考模式
+            if (teExam.getMode() == ExamModeEnum.ANYTIME) {//随到随考模式
                 QueryWrapper<TEExamActivity> teExamActivityQueryWrapper = new QueryWrapper<>();
-                teExamActivityQueryWrapper.lambda().eq(TEExamActivity::getExamId, oldId);
-                List<TEExamActivity> teExamActivityList = teExamActivityService.list(teExamActivityQueryWrapper);
-                if (Objects.nonNull(teExamActivityList) && teExamActivityList.size() > 0) {
-                    //修改数据
-                    TEExam finalTeExam = teExam;
-                    teExamActivityList.forEach(s -> {
-                        s.setPrepareSeconds(finalTeExam.getPrepareSeconds());
-                        s.setMaxDurationSeconds(finalTeExam.getMaxDurationSeconds());
-                        s.setOpeningSeconds((int) ((finalTeExam.getEndTime() - finalTeExam.getStartTime()) / 1000));
-                        s.setStartTime(finalTeExam.getStartTime());
-                        s.setFinishTime(finalTeExam.getEndTime());
-                        s.setUpdateId(tbUser.getId());
-                        teExamActivityService.saveOrUpdate(s);
-                    });
-                    for (TEExamActivity ac : teExamActivityList) {
-                        teExamActivityService.updateExamActivityCacheBean(ac.getId());
-                    }
-                    if (Objects.nonNull(teExam.getForceFinish()) && teExam.getForceFinish().intValue() == 1) {
-                        //新增quartz任务,发送mq消息start
-                        Map<String, Object> prop = new HashMap<>();
-                        prop.put("oper", "insert");
-                        prop.put("exam", teExam);
-                        MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.EXAM_ACTIVITY.name(),
-                                JacksonUtil.parseJson(teExamActivityList), MqTagEnum.EXAM_ACTIVITY,
-                                String.valueOf(teExam.getId()), prop, tbUser.getName());
-                        mqDtoService.assembleSendOneOrderMsg(mqDto);
-                        //新增quartz任务,发送mq消息end
-                    }
-                } else {
-                    TEExamActivity teExamActivity = new TEExamActivity(teExam.getId(), teExam.getPrepareSeconds(),
+                teExamActivityQueryWrapper.lambda().eq(TEExamActivity::getExamId, teExam.getId());
+                TEExamActivity teExamActivity = teExamActivityService.getOne(teExamActivityQueryWrapper);
+                if (Objects.isNull(teExamActivity)) {
+                    teExamActivity = new TEExamActivity(teExam.getId(), teExam.getPrepareSeconds(),
                             teExam.getMaxDurationSeconds(),
                             (int) ((teExam.getEndTime() - teExam.getStartTime()) / 1000), teExam.getStartTime(),
                             teExam.getEndTime(), tbUser.getId());
@@ -227,17 +211,6 @@ public class TEExamController {
                     teExamActivity.setEnable(1);
                     teExamActivityService.saveOrUpdate(teExamActivity);
                     teExamActivityService.updateExamActivityCacheBean(teExamActivity.getId());
-                    if (Objects.nonNull(teExam.getForceFinish()) && teExam.getForceFinish().intValue() == 1 && Objects
-                            .nonNull(teExamActivity) && teExamActivity.getEnable().intValue() == 1) {
-                        //新增quartz任务,发送mq消息start
-                        Map<String, Object> prop = new HashMap<>();
-                        prop.put("oper", "insert");
-                        prop.put("exam", teExam);
-                        MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.EXAM_ACTIVITY.name(),
-                                JacksonUtil.parseJson(Arrays.asList(teExamActivity)), MqTagEnum.EXAM_ACTIVITY,
-                                String.valueOf(teExam.getId()), prop, tbUser.getName());
-                        mqDtoService.assembleSendOneOrderMsg(mqDto);
-                    }
                 }
             }
         } catch (Exception e) {
@@ -398,7 +371,7 @@ public class TEExamController {
             QueryWrapper<TEExamActivity> teExamActivityQueryWrapper = new QueryWrapper<>();
             teExamActivityQueryWrapper.lambda().eq(TEExamActivity::getExamId, examId);
             teExamActivityList = teExamActivityService.list(teExamActivityQueryWrapper);
-            if (Objects.nonNull(teExamActivityList)) {
+            if (!CollectionUtils.isEmpty(teExamActivityList)) {
                 teExamActivityList.forEach(s -> {
                     s.setId(uidUtil.getId());
                     s.setExamId(teExam.getId());
@@ -407,8 +380,17 @@ public class TEExamController {
                     s.setUpdateTime(null);
                     s.setCode(String.valueOf(redisUtil.getRedisActivityCodeSequence(teExam.getId())));
                 });
-                for (TEExamActivity ac : teExamActivityList) {
-                    teExamActivityService.saveOrUpdate(ac);
+                teExamActivityService.saveOrUpdateBatch(teExamActivityList);
+                if (Objects.nonNull(teExam.getForceFinish()) && teExam.getForceFinish().intValue() == 1) {
+                    //新增quartz任务,发送mq消息start
+                    Map<String, Object> prop = new HashMap<>();
+                    prop.put("oper", "insert");
+                    prop.put("exam", teExam);
+                    MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.EXAM_ACTIVITY.name(),
+                            JacksonUtil.parseJson(teExamActivityList), MqTagEnum.EXAM_ACTIVITY,
+                            String.valueOf(teExam.getId()), prop, tbUser.getName());
+                    mqDtoService.assembleSendOneOrderMsg(mqDto);
+                    //新增quartz任务,发送mq消息end
                 }
             }
         } catch (Exception e) {

+ 24 - 5
themis-business/src/main/java/com/qmth/themis/business/service/impl/TEExamActivityServiceImpl.java

@@ -7,7 +7,6 @@ import com.qmth.themis.business.cache.bean.ExamActivityCacheBean;
 import com.qmth.themis.business.cache.bean.ExamCacheBean;
 import com.qmth.themis.business.cache.bean.ExamCourseCacheBean;
 import com.qmth.themis.business.cache.bean.ExamStudentCacheBean;
-import com.qmth.themis.business.constant.SpringContextHolder;
 import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.dao.TEExamActivityMapper;
 import com.qmth.themis.business.dto.MqDto;
@@ -370,6 +369,27 @@ public class TEExamActivityServiceImpl extends ServiceImpl<TEExamActivityMapper,
                             if (s.getFinishTime().longValue() < teExamActivityDb.getFinishTime().longValue()) {
                                 throw new BusinessException("修改的场次结束时间只能大于未修改前的场次结束时间");
                             }
+                            if (Objects.nonNull(teExam.getForceFinish()) && teExam.getForceFinish().intValue() == 1
+                                    && s.getFinishTime().longValue() != teExamActivityDb.getFinishTime().longValue()) {
+                                //删除quartz任务,发送mq消息start
+                                Map<String, Object> prop = new HashMap<>();
+                                prop.put("oper", "delete");
+                                MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.EXAM_ACTIVITY.name(),
+                                        JacksonUtil.parseJson(Arrays.asList(s)), MqTagEnum.EXAM_ACTIVITY,
+                                        String.valueOf(teExam.getId()), prop, tbUser.getName());
+                                mqDtoService.assembleSendOneOrderMsg(mqDto);
+                                //删除quartz任务,发送mq消息end
+
+                                //新增quartz任务,发送mq消息start
+                                prop = new HashMap<>();
+                                prop.put("oper", "insert");
+                                prop.put("exam", teExam);
+                                mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.EXAM_ACTIVITY.name(),
+                                        JacksonUtil.parseJson(Arrays.asList(s)), MqTagEnum.EXAM_ACTIVITY,
+                                        String.valueOf(teExam.getId()), prop, tbUser.getName());
+                                mqDtoService.assembleSendOneOrderMsg(mqDto);
+                                //新增quartz任务,发送mq消息end
+                            }
                             tsLogService.save(new TSLog(LogEnum.EXAM_ACTIVITY, s.getCode(),
                                     JacksonUtil.parseJson(teExamActivityDb),
                                     JacksonUtil.parseJson(s),
@@ -384,17 +404,16 @@ public class TEExamActivityServiceImpl extends ServiceImpl<TEExamActivityMapper,
                     teAudioList.add(new TEAudio(tbUser.getOrgId(), s.getId(), SystemConstant.BEFORE_AUDIO_ATTACHMENT_Id, AudioTypeEnum.BEFORE.getTitle(), AudioTypeEnum.BEFORE, AudioDefaultEnum.SYS, tbUser.getId(), SystemConstant.BEFORE_AUDIO_SECOND));//开考前语音
                     teAudioList.add(new TEAudio(tbUser.getOrgId(), s.getId(), SystemConstant.AFTER_AUDIO_ATTACHMENT_Id, AudioTypeEnum.AFTER.getTitle(), AudioTypeEnum.AFTER, AudioDefaultEnum.SYS, tbUser.getId(), SystemConstant.AFTER_AUDIO_SECOND));//考试结束前语音
                 }
-                this.saveOrUpdate(s);
             });
+            this.saveOrUpdateBatch(teExamActivityList);
             if (!CollectionUtils.isEmpty(teAudioList)) {
                 teAudioService.saveOrUpdateBatch(teAudioList);
             }
 
-            TEExamActivityService teExamActivityService = SpringContextHolder.getBean(TEExamActivityService.class);
             for (TEExamActivity ac : teExamActivityList) {
-                teExamActivityService.updateExamActivityCacheBean(ac.getId());
+                this.updateExamActivityCacheBean(ac.getId());
             }
-            if (Objects.nonNull(teExam.getForceFinish()) && teExam.getForceFinish().intValue() == 1) {
+            if (size.get() > 0 && (Objects.nonNull(teExam.getForceFinish()) && teExam.getForceFinish().intValue() == 1)) {
                 //新增quartz任务,发送mq消息start
                 Map<String, Object> prop = new HashMap<>();
                 prop.put("oper", "insert");