From 3303fef314b45020d8ea62a908d887060d695b3f Mon Sep 17 00:00:00 2001
From: fuliqi <fuliqi@qq.com>
Date: 星期三, 03 七月 2024 09:39:32 +0800
Subject: [PATCH] 教学资源增加班级
---
src/main/java/com/ycl/jxkg/service/impl/ExamServiceImpl.java | 113 ++++++++++++++++++++++++++++++++++++++++++++++----------
1 files changed, 92 insertions(+), 21 deletions(-)
diff --git a/src/main/java/com/ycl/jxkg/service/impl/ExamServiceImpl.java b/src/main/java/com/ycl/jxkg/service/impl/ExamServiceImpl.java
index 70dc960..fe1d8e5 100644
--- a/src/main/java/com/ycl/jxkg/service/impl/ExamServiceImpl.java
+++ b/src/main/java/com/ycl/jxkg/service/impl/ExamServiceImpl.java
@@ -2,6 +2,7 @@
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
@@ -29,10 +30,13 @@
import com.ycl.jxkg.enums.general.ExamStatusEnum;
import com.ycl.jxkg.enums.general.ExamSubmitTempStatusEnum;
import com.ycl.jxkg.mapper.*;
+import com.ycl.jxkg.rabbitmq.msg.ExamStatusMsg;
+import com.ycl.jxkg.rabbitmq.product.Producer;
import com.ycl.jxkg.server.WebsocketServer;
import com.ycl.jxkg.service.ExamPaperScoreService;
import com.ycl.jxkg.service.ExamPaperService;
import com.ycl.jxkg.service.ExamService;
+import com.ycl.jxkg.utils.DateTimeUtil;
import com.ycl.jxkg.utils.PageUtil;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
@@ -56,6 +60,8 @@
@RequiredArgsConstructor
public class ExamServiceImpl extends ServiceImpl<ExamMapper, Exam> implements ExamService {
+ private static final String ANSWER_SPLIT = ",";
+
private final ExamMapper examMapper;
private final WebContext webContext;
private final QuestionMapper questionMapper;
@@ -67,7 +73,9 @@
private final UserMapper userMapper;
private final ExamPaperScoreMapper examPaperScoreMapper;
private final ExamPaperScoreService examPaperScoreService;
- private static final String ANSWER_SPLIT = ",";
+
+ private final Producer producer;
+
/**
* 娣诲姞
*
@@ -79,7 +87,11 @@
Exam entity = ExamForm.getEntityByForm(form, null);
entity.setStatus(ExamStatusEnum.getStatusByTime(form.getStartTime(), form.getEndTime(), null));
entity.setTeacherId(webContext.getCurrentUser().getId());
- baseMapper.insert(entity);
+ // 璁剧疆涔愯閿佺増鏈�
+ entity.setUpdateVersion(0);
+ if (baseMapper.insert(entity) > 0) {
+ this.sendMQ(entity, 0);
+ }
return Result.ok("娣诲姞鎴愬姛");
}
@@ -94,10 +106,62 @@
Exam entity = baseMapper.selectById(form.getId());
// 涓虹┖鎶汭llegalArgumentException锛屽仛鍏ㄥ眬寮傚父澶勭悊
Assert.notNull(entity, "璁板綍涓嶅瓨鍦�");
+ // 鍒ゆ柇鑰冭瘯鐘舵��
+ if (! ExamStatusEnum.NOT_START.equals(entity.getStatus())) {
+ throw new RuntimeException("鍙兘淇敼杩樻湭寮�濮嬬殑鑰冭瘯");
+ }
BeanUtils.copyProperties(form, entity);
entity.setStatus(ExamStatusEnum.getStatusByTime(form.getStartTime(), form.getEndTime(), null));
- baseMapper.updateById(entity);
+ // 濡傛灉淇敼鎴愬姛鍙戦�乵q娑堟伅
+ if (baseMapper.updateById(entity) > 0) {
+ this.sendMQ(entity, entity.getUpdateVersion() + 1);
+ }
return Result.ok("淇敼鎴愬姛");
+ }
+
+ /**
+ * 鍙戦�乵q娑堟伅
+ *
+ * @param entity 鑰冭瘯瀹炰綋绫�
+ * @param version 涔愯閿佺増鏈�
+ */
+ public void sendMQ(Exam entity, Integer version) {
+ // 濡傛灉褰撳墠鐘舵�佷负鏈紑濮嬶紝鍒欏彂閫佷袱鏉q娑堟伅锛屼竴鏉¤缃姸鎬佷负杩涜涓紝涓�鏉¤缃姸鎬佷负宸茬粨鏉�
+ if (ExamStatusEnum.NOT_START.equals(entity.getStatus())) {
+ // 杩涜鐘舵�佹秷鎭�
+ ExamStatusMsg ingMsg = new ExamStatusMsg();
+ ingMsg.setVersion(version);
+ ingMsg.setExamId(entity.getId());
+ ingMsg.setTargetStatus(ExamStatusEnum.ING);
+ producer.examMsg(entity.getId(), JSON.toJSONString(ingMsg), DateTimeUtil.getTwoTimeDiffMS(entity.getStartTime(), new Date()));
+ // 缁撴潫鐘舵�佹秷鎭�
+ ExamStatusMsg finishedMsg = new ExamStatusMsg();
+ finishedMsg.setVersion(version);
+ finishedMsg.setExamId(entity.getId());
+ finishedMsg.setTargetStatus(ExamStatusEnum.FINISHED);
+ producer.examMsg(entity.getId(), JSON.toJSONString(finishedMsg), DateTimeUtil.getTwoTimeDiffMS(entity.getEndTime(), new Date()));
+ } else if (ExamStatusEnum.ING.equals(entity.getStatus())) { // 褰撳墠鏄繘琛屼腑鐘舵�佸垯鍙渶鍙戦�佺粨鏉熸秷鎭�
+ // 缁撴潫鐘舵�佹秷鎭�
+ ExamStatusMsg finishedMsg = new ExamStatusMsg();
+ finishedMsg.setVersion(0);
+ finishedMsg.setExamId(entity.getId());
+ finishedMsg.setTargetStatus(ExamStatusEnum.FINISHED);
+ producer.examMsg(entity.getId(), JSON.toJSONString(finishedMsg), DateTimeUtil.getTwoTimeDiffMS(entity.getEndTime(), new Date()));
+ }
+ }
+
+ /**
+ * 鏍规嵁鑰冭瘯鐨勫綋鍓嶇姸鎬侊紝寰楀埌涓嬩竴涓姸鎬�
+ *
+ * @param currentStatus
+ * @return
+ */
+ public ExamStatusEnum getNextStatus(ExamStatusEnum currentStatus) {
+ if (ExamStatusEnum.NOT_START.equals(currentStatus)) {
+ return ExamStatusEnum.ING;
+ } else {
+ return ExamStatusEnum.FINISHED;
+ }
}
/**
@@ -407,9 +471,6 @@
// 鐜板湪鍙渶瑕佷繚瀛樺埌涓�寮犱复鏃惰〃
// 璇ユ帴鍙f槸涓诲姩鎻愪氦锛屾墍浠ョ姸鎬侀兘璁剧疆涓哄畬鎴愶紝浠ヤ究鍚庣画鑰佸笀闃呭嵎
saveTempExam(submitData, ExamSubmitTempStatusEnum.finish);
-
- //TODO:鑰冭瘯鐘舵�佽瀹氫负缁撴潫
-
return Result.ok();
}
@@ -445,9 +506,8 @@
Date now = new Date();
one.setExamSubmit(JSON.toJSONString(submitData.getTitleList()));
one.setUpdateTime(now);
- long doTimeL = now.getTime() - one.getCreateTime().getTime();
- Integer doTime = (int) doTimeL;
- one.setDoTime(doTime);
+ int doTimeInSeconds = (int) (now.getTime() - one.getCreateTime().getTime()) / 1000;
+ one.setDoTime(doTimeInSeconds);
one.setStatus(status);
examSubmitTempMapper.updateById(one);
} else {
@@ -481,7 +541,7 @@
// 鍙傝�冧絾鏈畬鎴愭彁浜や汉鏁�
Integer joinButNotFinishedNum = Math.toIntExact(examSubmitTempList.stream().filter(item -> ExamSubmitTempStatusEnum.temp.equals(item.getStatus())).count());
- List<StudentExamInfoVO> studentExamList = classesUserMapper.getClassesUserList(exam.getClassesId());
+ List<StudentExamInfoVO> studentExamList = classesUserMapper.getClassesUserList(exam.getId(), exam.getClassesId());
// 搴旇�冧汉鏁�
Integer shouldUserNum = studentExamList.size();
@@ -596,7 +656,7 @@
if (StringUtils.isEmpty(doQuestionVO.getQuestionAnswer())) {
return Result.fail(SystemCode.InnerError.getCode(), "棰樼洰id涓猴細" + doQuestionVO.getId() + "鐨勯鐩己灏戠瓟妗堬紝璇峰厛瀹屽杽");
}
- trueOrFalse(score,doQuestionVO, navbarVO, doQuestionVO.getQuestionAnswer().equals(doQuestionVO.getAnswer()));
+ score = trueOrFalse(score, doQuestionVO, navbarVO, doQuestionVO.getQuestionAnswer().equals(doQuestionVO.getAnswer()));
}
/* 濡傛灉鏄閫� */
else if (QuestionTypeEnum.MultipleChoice.getCode().equals(questionType)) {
@@ -612,7 +672,7 @@
List<String> questionAnswerList = Arrays.asList(questionAnswer.split(","));
//瀛︾敓绛旀涓虹┖锛屽垽鏂负閿�
if (CollectionUtils.isEmpty(answerList)) {
- trueOrFalse(score,doQuestionVO, navbarVO, false);
+ score = trueOrFalse(score, doQuestionVO, navbarVO, false);
num++;
navbar.add(navbarVO);
continue;
@@ -623,7 +683,7 @@
Set<String> set2 = new HashSet<>(questionAnswerList);
//绛旀瀹屽叏涓�鑷达紝婊″垎
if (set1.equals(set2)) {
- trueOrFalse(score,doQuestionVO, navbarVO, true);
+ score = trueOrFalse(score, doQuestionVO, navbarVO, true);
num++;
navbar.add(navbarVO);
continue;
@@ -633,20 +693,20 @@
}
//濡傛灉澶氶�夊緱鍒嗙被鍨嬩负 绛旈敊涓嶅緱鍒�
if (Integer.valueOf(DeductTypeEnum.AllCorrect.getCode()).equals(paperMarkVO.getDeductType())) {
- trueOrFalse(score,doQuestionVO, navbarVO, false);
+ score = trueOrFalse(score, doQuestionVO, navbarVO, false);
}
//濡傛灉澶氶�夊緱鍒嗙被鍨嬩负 婕忛�夊緱鍥哄畾鍒嗗��,鍖呭惈閿欒閫夐」涓嶅緱鍒�
else if (Integer.valueOf(DeductTypeEnum.PartCorrect.getCode()).equals(paperMarkVO.getDeductType())) {
//瀛︾敓绛旀绉婚櫎鎵�鏈夋纭瓟妗堬紝濡傛灉杩樻湁鍏冪礌璇存槑鍖呭惈閿欒閫夐」
answerList.removeAll(questionAnswerList);
if (!CollectionUtils.isEmpty(answerList)) {
- trueOrFalse(score,doQuestionVO, navbarVO, false);
+ score = trueOrFalse(score, doQuestionVO, navbarVO, false);
} else {
navbarVO.setRight(false);
doQuestionVO.setRight(false);
//婕忛�夊緱鍥哄畾鍒�
- score = score.add(paperMarkVO.getDeductScore());
doQuestionVO.setScore(paperMarkVO.getDeductScore());
+ score = score.add(doQuestionVO.getScore());
}
}
//濡傛灉澶氶�夊緱鍒嗙被鍨嬩负 姣忓涓�棰樺緱鐩稿簲鍒嗗��,鍖呭惈閿欒閫夐」涓嶅緱鍒�
@@ -654,12 +714,13 @@
//瀛︾敓绛旀绉婚櫎鎵�鏈夋纭瓟妗堬紝濡傛灉杩樻湁鍏冪礌璇存槑鍖呭惈閿欒閫夐」
answerList.removeAll(questionAnswerList);
if (!CollectionUtils.isEmpty(answerList)) {
- trueOrFalse(score,doQuestionVO, navbarVO, false);
+ score = trueOrFalse(score, doQuestionVO, navbarVO, false);
} else {
navbarVO.setRight(false);
doQuestionVO.setRight(false);
//婕忛�夊緱鍒�
doQuestionVO.setScore(paperMarkVO.getDeductScore().multiply(new BigDecimal(answerCount)));
+ score = score.add(doQuestionVO.getScore());
}
}
}
@@ -677,7 +738,7 @@
List<String> questionAnswerList = Arrays.asList(questionAnswer.split(","));
//瀛︾敓绛旀涓虹┖锛屽垽鏂负閿�
if (CollectionUtils.isEmpty(answerList)) {
- trueOrFalse(score,doQuestionVO, navbarVO, false);
+ score = trueOrFalse(score, doQuestionVO, navbarVO, false);
num++;
navbar.add(navbarVO);
continue;
@@ -686,7 +747,7 @@
int questionAnswerCount = questionAnswerList.size();
//绛旀瀹屽叏涓�鑷达紝婊″垎
if (answerList.equals(questionAnswerList)) {
- trueOrFalse(score,doQuestionVO, navbarVO, true);
+ score = trueOrFalse(score, doQuestionVO, navbarVO, true);
} else {
navbarVO.setRight(false);
doQuestionVO.setRight(false);
@@ -704,6 +765,7 @@
//濉┖寰楀垎
BigDecimal gapScore = scoreEach.multiply(new BigDecimal(count));
doQuestionVO.setScore(gapScore);
+ score = score.add(doQuestionVO.getScore());
}
}
@@ -713,11 +775,12 @@
}
paperMarkVO.setTitleItems(titleItems);
paperMarkVO.setNavbar(navbar);
+ paperMarkVO.setScore(score + "");
return null;
}
//璁剧疆鍏ㄥ鎴栧叏閿�
- private void trueOrFalse(BigDecimal score,DoQuestionVO doQuestionVO, ExamPaperMarkNavbarVO orderVO, Boolean isCorrect) {
+ private BigDecimal trueOrFalse(BigDecimal score, DoQuestionVO doQuestionVO, ExamPaperMarkNavbarVO orderVO, Boolean isCorrect) {
if (isCorrect) {
//姝g‘
orderVO.setRight(isCorrect);
@@ -730,6 +793,7 @@
doQuestionVO.setRight(isCorrect);
doQuestionVO.setScore(BigDecimal.ZERO);
}
+ return score;
}
//灏佽闃呭嵎杩斿洖鏁版嵁
@@ -767,7 +831,7 @@
long questionCorrect = 0;
long questionCount = 0;
if (!CollectionUtils.isEmpty(examPaperMark.getNavbar())) {
- questionCorrect = examPaperMark.getNavbar().stream().filter(ExamPaperMarkNavbarVO::getRight).count();
+ questionCorrect = examPaperMark.getNavbar().stream().filter(vo -> vo.getRight()!=null && vo.getRight()).count();
questionCount = examPaperMark.getNavbar().size();
}
examPaperScore.setQuestionCorrect(Integer.valueOf(questionCorrect + ""));
@@ -779,6 +843,13 @@
examPaperScoreMapper.updateById(examPaperScore);
} else {
examPaperScoreMapper.insert(examPaperScore);
+ //淇敼鑰冭瘯閲岃瘯鍗风姸鎬佷负宸查槄鍗�
+ ExamSubmitTemp userExam = new LambdaQueryChainWrapper<>(examSubmitTempMapper)
+ .eq(ExamSubmitTemp::getExamId, examPaperMark.getExamId())
+ .eq(ExamSubmitTemp::getUserId, examPaperMark.getUserId())
+ .one();
+ userExam.setMarkPaperStatus(ExamSubmitTempStatusEnum.finish);
+ examSubmitTempMapper.updateById(userExam);
}
return Result.ok();
}
--
Gitblit v1.8.0