package com.mindskip.xzs.service.impl;
import com.mindskip.xzs.domain.*;
import com.mindskip.xzs.domain.enums.ExamPaperAnswerStatusEnum;
import com.mindskip.xzs.domain.enums.ExamPaperTypeEnum;
import com.mindskip.xzs.domain.enums.QuestionTypeEnum;
import com.mindskip.xzs.domain.exam.ExamPaperTitleItemObject;
import com.mindskip.xzs.domain.other.KeyValue;
import com.mindskip.xzs.domain.other.ExamPaperAnswerUpdate;
import com.mindskip.xzs.domain.task.TaskItemAnswerObject;
import com.mindskip.xzs.repository.*;
import com.mindskip.xzs.repository.ExamPaperAnswerMapper;
import com.mindskip.xzs.repository.ExamPaperMapper;
import com.mindskip.xzs.repository.QuestionMapper;
import com.mindskip.xzs.repository.TaskExamCustomerAnswerMapper;
import com.mindskip.xzs.service.ExamPaperAnswerService;
import com.mindskip.xzs.service.ExamPaperQuestionCustomerAnswerService;
import com.mindskip.xzs.service.TextContentService;
import com.mindskip.xzs.utility.DateTimeUtil;
import com.mindskip.xzs.utility.ExamUtil;
import com.mindskip.xzs.utility.JsonUtil;
import com.mindskip.xzs.viewmodel.student.exam.ExamPaperSubmitItemVM;
import com.mindskip.xzs.viewmodel.student.exam.ExamPaperSubmitVM;
import com.mindskip.xzs.viewmodel.student.exampaper.ExamPaperAnswerPageVM;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.mindskip.xzs.domain.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
@Service
public class ExamPaperAnswerServiceImpl extends BaseServiceImpl<ExamPaperAnswer> implements ExamPaperAnswerService {
private final ExamPaperAnswerMapper examPaperAnswerMapper;
private final ExamPaperMapper examPaperMapper;
private final TextContentService textContentService;
private final QuestionMapper questionMapper;
private final ExamPaperQuestionCustomerAnswerService examPaperQuestionCustomerAnswerService;
private final TaskExamCustomerAnswerMapper taskExamCustomerAnswerMapper;
@Autowired
public ExamPaperAnswerServiceImpl(ExamPaperAnswerMapper examPaperAnswerMapper, ExamPaperMapper examPaperMapper, TextContentService textContentService, QuestionMapper questionMapper, ExamPaperQuestionCustomerAnswerService examPaperQuestionCustomerAnswerService, TaskExamCustomerAnswerMapper taskExamCustomerAnswerMapper) {
super(examPaperAnswerMapper);
this.examPaperAnswerMapper = examPaperAnswerMapper;
this.examPaperMapper = examPaperMapper;
this.textContentService = textContentService;
this.questionMapper = questionMapper;
this.examPaperQuestionCustomerAnswerService = examPaperQuestionCustomerAnswerService;
this.taskExamCustomerAnswerMapper = taskExamCustomerAnswerMapper;
}
@Override
public PageInfo<ExamPaperAnswer> studentPage(ExamPaperAnswerPageVM requestVM) {
return PageHelper.startPage(requestVM.getPageIndex(), requestVM.getPageSize(), "id desc").doSelectPageInfo(() ->
examPaperAnswerMapper.studentPage(requestVM));
}
@Override
public ExamPaperAnswerInfo calculateExamPaperAnswer(ExamPaperSubmitVM examPaperSubmitVM, User user) {
ExamPaperAnswerInfo examPaperAnswerInfo = new ExamPaperAnswerInfo();
Date now = new Date();
ExamPaper examPaper = examPaperMapper.selectByPrimaryKey(examPaperSubmitVM.getId());
ExamPaperTypeEnum paperTypeEnum = ExamPaperTypeEnum.fromCode(examPaper.getPaperType());
//任务试卷只能做一次
if (paperTypeEnum == ExamPaperTypeEnum.Task) {
ExamPaperAnswer examPaperAnswer = examPaperAnswerMapper.getByPidUid(examPaperSubmitVM.getId(), user.getId());
if (null != examPaperAnswer)
return null;
}
String frameTextContent = textContentService.selectById(examPaper.getFrameTextContentId()).getContent();
List<ExamPaperTitleItemObject> examPaperTitleItemObjects = JsonUtil.toJsonListObject(frameTextContent, ExamPaperTitleItemObject.class);
List<Integer> questionIds = examPaperTitleItemObjects.stream().flatMap(t -> t.getQuestionItems().stream().map(q -> q.getId())).collect(Collectors.toList());
List<Question> questions = questionMapper.selectByIds(questionIds);
//将题目结构的转化为题目答案
List<ExamPaperQuestionCustomerAnswer> examPaperQuestionCustomerAnswers = examPaperTitleItemObjects.stream()
.flatMap(t -> t.getQuestionItems().stream()
.map(q -> {
Question question = questions.stream().filter(tq -> tq.getId().equals(q.getId())).findFirst().get();
ExamPaperSubmitItemVM customerQuestionAnswer = examPaperSubmitVM.getAnswerItems().stream()
.filter(tq -> tq.getQuestionId().equals(q.getId()))
.findFirst()
.orElse(null);
return ExamPaperQuestionCustomerAnswerFromVM(question, customerQuestionAnswer, examPaper, q.getItemOrder(), user, now);
})
).collect(Collectors.toList());
ExamPaperAnswer examPaperAnswer = ExamPaperAnswerFromVM(examPaperSubmitVM, examPaper, examPaperQuestionCustomerAnswers, user, now);
examPaperAnswerInfo.setExamPaper(examPaper);
examPaperAnswerInfo.setExamPaperAnswer(examPaperAnswer);
examPaperAnswerInfo.setExamPaperQuestionCustomerAnswers(examPaperQuestionCustomerAnswers);
return examPaperAnswerInfo;
}
@Override
@Transactional
public String judge(ExamPaperSubmitVM examPaperSubmitVM) {
ExamPaperAnswer examPaperAnswer = examPaperAnswerMapper.selectByPrimaryKey(examPaperSubmitVM.getId());
List<ExamPaperSubmitItemVM> judgeItems = examPaperSubmitVM.getAnswerItems().stream().filter(d -> d.getDoRight() == null).collect(Collectors.toList());
List<ExamPaperAnswerUpdate> examPaperAnswerUpdates = new ArrayList<>(judgeItems.size());
Integer customerScore = examPaperAnswer.getUserScore();
Integer questionCorrect = examPaperAnswer.getQuestionCorrect();
for (ExamPaperSubmitItemVM d : judgeItems) {
ExamPaperAnswerUpdate examPaperAnswerUpdate = new ExamPaperAnswerUpdate();
examPaperAnswerUpdate.setId(d.getId());
examPaperAnswerUpdate.setCustomerScore(ExamUtil.scoreFromVM(d.getScore()));
boolean doRight = examPaperAnswerUpdate.getCustomerScore().equals(ExamUtil.scoreFromVM(d.getQuestionScore()));
examPaperAnswerUpdate.setDoRight(doRight);
examPaperAnswerUpdates.add(examPaperAnswerUpdate);
customerScore += examPaperAnswerUpdate.getCustomerScore();
if (examPaperAnswerUpdate.getDoRight()) {
++questionCorrect;
}
}
examPaperAnswer.setUserScore(customerScore);
examPaperAnswer.setQuestionCorrect(questionCorrect);
examPaperAnswer.setStatus(ExamPaperAnswerStatusEnum.Complete.getCode());
examPaperAnswerMapper.updateByPrimaryKeySelective(examPaperAnswer);
examPaperQuestionCustomerAnswerService.updateScore(examPaperAnswerUpdates);
ExamPaperTypeEnum examPaperTypeEnum = ExamPaperTypeEnum.fromCode(examPaperAnswer.getPaperType());
switch (examPaperTypeEnum) {
case Task:
//任务试卷批改完成后,需要更新任务的状态
ExamPaper examPaper = examPaperMapper.selectByPrimaryKey(examPaperAnswer.getExamPaperId());
Integer taskId = examPaper.getTaskExamId();
Integer userId = examPaperAnswer.getCreateUser();
TaskExamCustomerAnswer taskExamCustomerAnswer = taskExamCustomerAnswerMapper.getB
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
学之思开源考试系统是一款基于Java和Vue的前后端分离的考试系统,具有诸多优点。首先,其开发和部署过程简单快捷,使得用户能够迅速搭建起一个稳定可靠的考试系统。其界面设计友好,用户体验良好,使得用户能够轻松上手并高效使用系统。同时,代码结构清晰,方便开发人员进行二次开发和定制。该系统支持web端和微信小程序,能够覆盖到PC机和手机等多种设备,满足用户在不同场景下的需求。此外,学之思开源考试系统支持多种部署方式,包括集成部署、前后端分离部署以及docker部署,使得用户能够根据自身需求选择最适合的部署方式,提高系统的灵活性和可扩展性。总的来说,学之思开源考试系统是一款功能丰富、易用性强的考试系统,适用于各种场景下的考试需求。其简单快捷的开发和部署方式、友好的界面设计、清晰的代码结构以及多样化的部署方式,使得该系统成为了许多用户的首选。无论是教育机构、企业培训部门还是个人教育者,都能从学之思开源考试系统中获得便利和效益。此外,学之思开源考试系统还具有良好的扩展性和定制性,用户可以根据自身需求进行定制化开发,满足不同场景下的特定需求。系统的稳定性和安全性也得到了充分考虑,保障用户数据和信息
资源推荐
资源详情
资源评论
收起资源包目录
学之思开源考试系统是一款 java + vue 的前后端分离的考试系统主要优点是开发部署简单快捷界面设计友好代码结构清晰 (2000个子文件)
.browserslistrc 21B
.browserslistrc 21B
mvnw.cmd 5KB
index.css 414KB
index.css 414KB
index.8cfb15e0.css 253KB
index.8cfb15e0.css 253KB
chunk-vendors.23fc2e8f.css 239KB
chunk-vendors.23fc2e8f.css 239KB
ueditor.css 34KB
ueditor.css 34KB
ueditor.css 34KB
ueditor.min.css 34KB
ueditor.min.css 34KB
ueditor.min.css 34KB
style.dc49a209.css 31KB
image.css 14KB
image.css 14KB
image.css 14KB
ui.css 9KB
ui.css 9KB
ui.css 9KB
fui.min.css 7KB
fui.min.css 7KB
fui.min.css 7KB
fui.css 7KB
fui.css 7KB
fui.css 7KB
chunk-51b3d799.f7258f92.css 6KB
chunk-6ee38484.56c3b546.css 6KB
chunk-51b3d799.f7258f92.css 6KB
chunk-6ee38484.56c3b546.css 6KB
index.a703c7b0.css 5KB
index.a703c7b0.css 5KB
chunk-29e872af.ee265b23.css 5KB
chunk-29e872af.ee265b23.css 5KB
chunk-29e872af.ee265b23.css 5KB
chunk-29e872af.ee265b23.css 5KB
chunk-vendors.ee57d822.css 3KB
chunk-vendors.ee57d822.css 3KB
chunk-e5a55b30.d650a2aa.css 3KB
chunk-e5a55b30.d650a2aa.css 3KB
codemirror.css 2KB
codemirror.css 2KB
codemirror.css 2KB
chunk-1ea4b0bc.7efc732e.css 2KB
chunk-1ea4b0bc.7efc732e.css 2KB
dialogbase.css 1KB
dialogbase.css 1KB
dialogbase.css 1KB
scrollbar.css 1KB
scrollbar.css 1KB
scrollbar.css 1KB
edittable.css 878B
edittable.css 878B
edittable.css 878B
chunk-6637202a.89936c18.css 846B
chunk-6637202a.89936c18.css 846B
chunk-113dc76b.b56209ba.css 712B
chunk-113dc76b.b56209ba.css 712B
webuploader.css 428B
webuploader.css 428B
webuploader.css 428B
base.css 361B
base.css 361B
base.css 361B
chunk-766c7376.ad364b97.css 260B
chunk-54cf4066.54efd6ce.css 260B
chunk-261045d2.f72e8178.css 260B
chunk-766c7376.ad364b97.css 260B
chunk-54cf4066.54efd6ce.css 260B
chunk-261045d2.f72e8178.css 260B
chunk-7f4da1fa.c8588555.css 162B
chunk-7f4da1fa.c8588555.css 162B
chunk-4f968f6e.c306629d.css 114B
chunk-c3daaaa6.c306629d.css 114B
chunk-7f29f698.c306629d.css 114B
chunk-9cf4b2a6.c306629d.css 114B
chunk-28529d14.c306629d.css 114B
chunk-42c0876a.c306629d.css 114B
chunk-7f082044.c306629d.css 114B
chunk-7af902fe.c306629d.css 114B
chunk-4423d042.c306629d.css 114B
chunk-3204336d.c306629d.css 114B
chunk-eab8a8ca.dd8c5d56.css 114B
chunk-352e2714.dd8c5d56.css 114B
chunk-1ecaf02c.dd8c5d56.css 114B
chunk-c04a81d4.dd8c5d56.css 114B
chunk-4f968f6e.c306629d.css 114B
chunk-c3daaaa6.c306629d.css 114B
chunk-7f29f698.c306629d.css 114B
chunk-9cf4b2a6.c306629d.css 114B
chunk-28529d14.c306629d.css 114B
chunk-42c0876a.c306629d.css 114B
chunk-7f082044.c306629d.css 114B
chunk-7af902fe.c306629d.css 114B
chunk-4423d042.c306629d.css 114B
chunk-3204336d.c306629d.css 114B
chunk-eab8a8ca.dd8c5d56.css 114B
chunk-352e2714.dd8c5d56.css 114B
共 2000 条
- 1
- 2
- 3
- 4
- 5
- 6
- 20
资源评论
传奇开心果编程
- 粉丝: 8477
- 资源: 335
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- html动态爱心代码一(附源码)
- c40539bc-071a-486c-9d52-9d0c18d62dac 4.html
- 基于物理的非视域成像(NLOS)算法,利用了nerf+python源码+文档说明
- yuluer知更鸟.7z(1).001
- python课程设计-基于tensorflow实现的图文生成程序,数据集flickr30k-images+源代码+文档说明+截图
- python作业-基于Flickr30k数据集实现图像文本跨模态搜索python源码+数据集+测试界面+项目说明(高分课程设计)
- 基于Qt实现医院信息管理系统c++源码+文档说明+数据库(期末大作业)
- 基于python实现的医院信息管理系统完整源码+sql数据库+详细注释(高分课程设计)
- 基于python的眼底图像视杯视盘分割项目源码+文档说明+截图演示+详细注释(高分课程设计)
- ImageBasedModellingEdu-贰壹贰叁零
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功