|
@@ -1,28 +1,13 @@
|
|
|
package cn.com.qmth.stmms.admin.exam;
|
|
|
|
|
|
-import java.io.ByteArrayInputStream;
|
|
|
-import java.io.File;
|
|
|
-import java.io.FileOutputStream;
|
|
|
-import java.io.IOException;
|
|
|
-import java.io.InputStream;
|
|
|
+import java.io.*;
|
|
|
import java.math.BigDecimal;
|
|
|
-import java.util.ArrayList;
|
|
|
-import java.util.Arrays;
|
|
|
-import java.util.Date;
|
|
|
-import java.util.HashMap;
|
|
|
-import java.util.HashSet;
|
|
|
-import java.util.LinkedList;
|
|
|
-import java.util.List;
|
|
|
-import java.util.Map;
|
|
|
-import java.util.Set;
|
|
|
+import java.util.*;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
import javax.servlet.http.HttpServletRequest;
|
|
|
import javax.servlet.http.HttpServletResponse;
|
|
|
|
|
|
-import net.sf.json.JSONArray;
|
|
|
-import net.sf.json.JSONObject;
|
|
|
-
|
|
|
import org.apache.commons.io.IOUtils;
|
|
|
import org.apache.commons.lang.StringUtils;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
@@ -33,15 +18,14 @@ import org.springframework.data.domain.Sort;
|
|
|
import org.springframework.data.domain.Sort.Direction;
|
|
|
import org.springframework.stereotype.Controller;
|
|
|
import org.springframework.ui.Model;
|
|
|
-import org.springframework.web.bind.annotation.PathVariable;
|
|
|
-import org.springframework.web.bind.annotation.RequestMapping;
|
|
|
-import org.springframework.web.bind.annotation.RequestMethod;
|
|
|
-import org.springframework.web.bind.annotation.RequestParam;
|
|
|
-import org.springframework.web.bind.annotation.ResponseBody;
|
|
|
+import org.springframework.web.bind.annotation.*;
|
|
|
import org.springframework.web.multipart.MultipartFile;
|
|
|
import org.springframework.web.servlet.ModelAndView;
|
|
|
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
|
|
|
|
|
|
+import com.aliyun.oss.common.utils.BinaryUtil;
|
|
|
+import com.qmth.boot.tools.io.ZipReader;
|
|
|
+
|
|
|
import cn.com.qmth.stmms.admin.dto.ObjectiveQuestionDTO;
|
|
|
import cn.com.qmth.stmms.admin.dto.QuestionDTO;
|
|
|
import cn.com.qmth.stmms.admin.dto.SubjectQuestionDTO;
|
|
@@ -54,51 +38,24 @@ import cn.com.qmth.stmms.admin.vo.StructQuestion;
|
|
|
import cn.com.qmth.stmms.biz.common.domain.card.AnswerCardSubjectFile;
|
|
|
import cn.com.qmth.stmms.biz.common.domain.card.AnswerCardSubjectItem;
|
|
|
import cn.com.qmth.stmms.biz.common.domain.card.CardFile;
|
|
|
-import cn.com.qmth.stmms.biz.exam.model.AnswerCard;
|
|
|
-import cn.com.qmth.stmms.biz.exam.model.Exam;
|
|
|
-import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
|
|
|
-import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
|
|
|
-import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
|
|
|
-import cn.com.qmth.stmms.biz.exam.model.SelectiveGroup;
|
|
|
-import cn.com.qmth.stmms.biz.exam.service.AnswerCardService;
|
|
|
-import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
|
|
|
-import cn.com.qmth.stmms.biz.exam.service.ExamService;
|
|
|
-import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
|
|
|
-import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
|
|
|
-import cn.com.qmth.stmms.biz.exam.service.InspectHistoryService;
|
|
|
-import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
|
|
|
-import cn.com.qmth.stmms.biz.exam.service.MarkerService;
|
|
|
-import cn.com.qmth.stmms.biz.exam.service.SelectiveGroupService;
|
|
|
+import cn.com.qmth.stmms.biz.exam.model.*;
|
|
|
+import cn.com.qmth.stmms.biz.exam.service.*;
|
|
|
import cn.com.qmth.stmms.biz.exam.service.query.ExamQuestionSearchQuery;
|
|
|
import cn.com.qmth.stmms.biz.exam.service.query.ExamSubjectSearchQuery;
|
|
|
import cn.com.qmth.stmms.biz.file.enums.FormatType;
|
|
|
import cn.com.qmth.stmms.biz.file.service.FileService;
|
|
|
import cn.com.qmth.stmms.biz.lock.LockService;
|
|
|
import cn.com.qmth.stmms.biz.mark.service.MarkService;
|
|
|
-import cn.com.qmth.stmms.biz.report.service.ReportService;
|
|
|
-import cn.com.qmth.stmms.biz.report.service.ReportSubjectClassService;
|
|
|
-import cn.com.qmth.stmms.biz.report.service.ReportSubjectCollegeService;
|
|
|
-import cn.com.qmth.stmms.biz.report.service.ReportSubjectGroupService;
|
|
|
-import cn.com.qmth.stmms.biz.report.service.ReportSubjectQuestionService;
|
|
|
-import cn.com.qmth.stmms.biz.report.service.ReportSubjectService;
|
|
|
-import cn.com.qmth.stmms.biz.report.service.ReportSubjectTeacherService;
|
|
|
+import cn.com.qmth.stmms.biz.report.service.*;
|
|
|
import cn.com.qmth.stmms.common.annotation.Logging;
|
|
|
import cn.com.qmth.stmms.common.annotation.RoleRequire;
|
|
|
import cn.com.qmth.stmms.common.domain.WebUser;
|
|
|
-import cn.com.qmth.stmms.common.enums.CardSource;
|
|
|
-import cn.com.qmth.stmms.common.enums.LockType;
|
|
|
-import cn.com.qmth.stmms.common.enums.LogType;
|
|
|
-import cn.com.qmth.stmms.common.enums.ObjectivePolicy;
|
|
|
-import cn.com.qmth.stmms.common.enums.ObjectiveStatus;
|
|
|
-import cn.com.qmth.stmms.common.enums.QuestionType;
|
|
|
-import cn.com.qmth.stmms.common.enums.Role;
|
|
|
-import cn.com.qmth.stmms.common.enums.SubjectiveStatus;
|
|
|
+import cn.com.qmth.stmms.common.enums.*;
|
|
|
import cn.com.qmth.stmms.common.utils.ExportExcel;
|
|
|
import cn.com.qmth.stmms.common.utils.ImportExcel;
|
|
|
import cn.com.qmth.stmms.common.utils.RequestUtils;
|
|
|
-
|
|
|
-import com.aliyun.oss.common.utils.BinaryUtil;
|
|
|
-import com.qmth.boot.tools.io.ZipReader;
|
|
|
+import net.sf.json.JSONArray;
|
|
|
+import net.sf.json.JSONObject;
|
|
|
|
|
|
@Controller("examPaperController")
|
|
|
@RequestMapping("/admin/exam/paper")
|
|
@@ -107,8 +64,8 @@ public class PaperController extends BaseExamController {
|
|
|
private static final String NULL_PAPER_TYPE_PLACEHOLDER = "#";
|
|
|
|
|
|
private static final String[] SUBJECTIVE_EXCEL_HEADER = new String[] { "科目代码*", "科目名称", "大题名称*", "题目昵称",
|
|
|
- "大题号(只能用小写数字)*", "小题号(只能用小写数字)*", "小题满分*", "间隔分*", "评卷分组(只能用小写数字)*", "图片序号(用英文逗号分割)", "双评比例(0~1)", "仲裁阀值",
|
|
|
- "合分策略(1-平均,2-最高,3-最低)", "评卷模式(common-普通,track-轨迹)", "试评数量(0-跳过试评)", "选做题数量" };
|
|
|
+ "大题号(只能用小写数字)*", "小题号(只能用小写数字)*", "小题满分*", "间隔分*", "评卷分组(只能用小写数字)*", "图片序号(用英文逗号分割)", "仲裁方式(0-分组,1-小题)",
|
|
|
+ "双评比例(0~1)", "仲裁阀值", "合分策略(1-平均,2-最高,3-最低)", "评卷模式(common-普通,track-轨迹)", "试评数量(0-跳过试评)", "选做题数量" };
|
|
|
|
|
|
private static final String[] OBJECTIVE_EXCEL_HEADER = new String[] { "科目代码", "科目名称", "试卷类型", "大题名称", "题目昵称",
|
|
|
"大题号(只能用小写数字)", "小题号(只能用小写数字)", "标准答案", "小题满分", "题型(1-单选,2-多选,3-判断)" };
|
|
@@ -232,9 +189,10 @@ public class PaperController extends BaseExamController {
|
|
|
if (subject != null) {
|
|
|
List<ExamQuestion> list = new LinkedList<ExamQuestion>();
|
|
|
if (objective == null || objective) {
|
|
|
- List<ExamQuestion> objectiveList = mainNumber == null ? questionService
|
|
|
- .findByExamAndSubjectAndObjective(examId, subjectCode, true) : questionService
|
|
|
- .findByExamAndSubjectAndObjectiveAndMainNumber(examId, subjectCode, true, mainNumber);
|
|
|
+ List<ExamQuestion> objectiveList = mainNumber == null
|
|
|
+ ? questionService.findByExamAndSubjectAndObjective(examId, subjectCode, true)
|
|
|
+ : questionService.findByExamAndSubjectAndObjectiveAndMainNumber(examId, subjectCode, true,
|
|
|
+ mainNumber);
|
|
|
list.addAll(objectiveList);
|
|
|
}
|
|
|
if (objective == null || !objective) {
|
|
@@ -249,9 +207,10 @@ public class PaperController extends BaseExamController {
|
|
|
for (SelectiveGroup selectiveGroup : selectiveGroups) {
|
|
|
selectiveMap.put(selectiveGroup.getMainNumber(), selectiveGroup);
|
|
|
}
|
|
|
- List<ExamQuestion> subjectiveList = mainNumber == null ? questionService
|
|
|
- .findByExamAndSubjectAndObjective(examId, subjectCode, false) : questionService
|
|
|
- .findByExamAndSubjectAndObjectiveAndMainNumber(examId, subjectCode, false, mainNumber);
|
|
|
+ List<ExamQuestion> subjectiveList = mainNumber == null
|
|
|
+ ? questionService.findByExamAndSubjectAndObjective(examId, subjectCode, false)
|
|
|
+ : questionService.findByExamAndSubjectAndObjectiveAndMainNumber(examId, subjectCode, false,
|
|
|
+ mainNumber);
|
|
|
for (ExamQuestion examQuestion : subjectiveList) {
|
|
|
if (examQuestion.getGroupNumber() != null
|
|
|
&& maps.get(examQuestion.getGroupNumber()).getMarkedCount() > 0) {
|
|
@@ -262,12 +221,12 @@ public class PaperController extends BaseExamController {
|
|
|
// 选做题判分策略
|
|
|
if (selectiveMap.containsKey(examQuestion.getMainNumber())) {
|
|
|
examQuestion.setSelective(true);
|
|
|
- examQuestion.setSelectiveIndex(selectiveMap.get(examQuestion.getMainNumber())
|
|
|
- .getSelectiveIndex());
|
|
|
+ examQuestion
|
|
|
+ .setSelectiveIndex(selectiveMap.get(examQuestion.getMainNumber()).getSelectiveIndex());
|
|
|
examQuestion
|
|
|
.setSelectivePart(selectiveMap.get(examQuestion.getMainNumber()).getSelectivePart());
|
|
|
- examQuestion.setScorePolicy(selectiveMap.get(examQuestion.getMainNumber()).getScorePolicy()
|
|
|
- .getValue());
|
|
|
+ examQuestion.setScorePolicy(
|
|
|
+ selectiveMap.get(examQuestion.getMainNumber()).getScorePolicy().getValue());
|
|
|
} else {
|
|
|
examQuestion.setSelective(false);
|
|
|
}
|
|
@@ -339,8 +298,8 @@ public class PaperController extends BaseExamController {
|
|
|
query = questionService.findByQuery(query);
|
|
|
for (ExamQuestion q : query.getResult()) {
|
|
|
list.add(objective ? new ObjectiveQuestionDTO(q, subjectMap.get(q.getSubjectCode()))
|
|
|
- : new SubjectiveQuestionDTO(q, subjectMap.get(q.getSubjectCode()), groupMap.get(q.getSubjectCode()
|
|
|
- + "_" + q.getGroupNumber())));
|
|
|
+ : new SubjectiveQuestionDTO(q, subjectMap.get(q.getSubjectCode()),
|
|
|
+ groupMap.get(q.getSubjectCode() + "_" + q.getGroupNumber())));
|
|
|
}
|
|
|
try {
|
|
|
String fileName = objective ? "客观题数据.xlsx" : "主观题数据.xlsx";
|
|
@@ -447,7 +406,8 @@ public class PaperController extends BaseExamController {
|
|
|
@Logging(menu = "导入主观题分组", type = LogType.IMPORT_FILE)
|
|
|
@RequestMapping(value = "/importGroup", method = RequestMethod.POST)
|
|
|
@RoleRequire(Role.SCHOOL_ADMIN)
|
|
|
- public String importGroupFile(HttpServletRequest request, MultipartFile file, RedirectAttributes redirectAttributes) {
|
|
|
+ public String importGroupFile(HttpServletRequest request, MultipartFile file,
|
|
|
+ RedirectAttributes redirectAttributes) {
|
|
|
int examId = getSessionExamId(request);
|
|
|
List<String> error = new LinkedList<String>();
|
|
|
Map<String, SubjectQuestionDTO> map = parseQuestion(file, examId, false, error);
|
|
@@ -488,11 +448,13 @@ public class PaperController extends BaseExamController {
|
|
|
subject.getCode(), false, question.getMainNumber(),
|
|
|
question.getSubNumber());
|
|
|
if (old == null) {
|
|
|
- error.add("[" + group.getSubjectCode() + "_" + group.getNumber() + "] 分组有小题不存在");
|
|
|
+ error.add(
|
|
|
+ "[" + group.getSubjectCode() + "_" + group.getNumber() + "] 分组有小题不存在");
|
|
|
validate = false;
|
|
|
break;
|
|
|
}
|
|
|
old.setGroupNumber(group.getNumber());
|
|
|
+ old.setArbitrateThreshold(question.getArbitrateThreshold());
|
|
|
questionGroup.add(old);
|
|
|
}
|
|
|
// 校验通过小题才保存
|
|
@@ -607,9 +569,8 @@ public class PaperController extends BaseExamController {
|
|
|
String t = query.getTotalScoreNotEqual() == null ? "" : query.getTotalScoreNotEqual().toString();
|
|
|
ExamQuestion newQ = questionService.findByExamAndSubjectAndObjectiveAndMainNumberAndSubNumber(examId,
|
|
|
question.getSubjectCode(), question.isObjective(), question.getMainNumber(), question.getSubNumber());
|
|
|
- if (old == null
|
|
|
- || ((old.getMainNumber() != question.getMainNumber() || !old.getSubNumber().equals(
|
|
|
- question.getSubNumber())) && newQ != null)) {
|
|
|
+ if (old == null || ((old.getMainNumber() != question.getMainNumber()
|
|
|
+ || !old.getSubNumber().equals(question.getSubNumber())) && newQ != null)) {
|
|
|
addMessage(redirectAttributes, "编辑失败,编辑题目不存在或编辑后的题号已存在");
|
|
|
return "redirect:/admin/exam/paper/detail?subjectCode=" + question.getSubjectCode() + "&pageNumber="
|
|
|
+ query.getPageNumber() + "&code=" + query.getCode() + "&category=" + query.getCategory()
|
|
@@ -624,8 +585,8 @@ public class PaperController extends BaseExamController {
|
|
|
+ "&level=" + query.getLevel() + "&upload=" + u + "&totalScoreNotEqual=" + t;
|
|
|
}
|
|
|
}
|
|
|
- SelectiveGroup selectiveGroup = selectiveGroupService
|
|
|
- .findOne(examId, old.getSubjectCode(), old.getMainNumber());
|
|
|
+ SelectiveGroup selectiveGroup = selectiveGroupService.findOne(examId, old.getSubjectCode(),
|
|
|
+ old.getMainNumber());
|
|
|
if (!old.isObjective() && selectiveGroup != null) {
|
|
|
addMessage(redirectAttributes, "编辑失败,已经存在选做题分组");
|
|
|
return "redirect:/admin/exam/paper/detail?subjectCode=" + question.getSubjectCode() + "&pageNumber="
|
|
@@ -693,9 +654,8 @@ public class PaperController extends BaseExamController {
|
|
|
List<ExamQuestion> list = new ArrayList<ExamQuestion>();
|
|
|
list.add(question);
|
|
|
taskExecutor.submit(new QuestionDeleteThread(list, markService, lockService));
|
|
|
- RequestUtils.setLog(request,
|
|
|
- "开始删除题目,subjectCode:" + subjectCode + " main number:" + question.getMainNumber() + " sub number:"
|
|
|
- + question.getSubNumber());
|
|
|
+ RequestUtils.setLog(request, "开始删除题目,subjectCode:" + subjectCode + " main number:"
|
|
|
+ + question.getMainNumber() + " sub number:" + question.getSubNumber());
|
|
|
}
|
|
|
String u = upload == null ? "" : upload.toString();
|
|
|
String t = query.getTotalScoreNotEqual() == null ? "" : query.getTotalScoreNotEqual().toString();
|
|
@@ -874,8 +834,8 @@ public class PaperController extends BaseExamController {
|
|
|
question.setType(null);
|
|
|
}
|
|
|
Map<Integer, String> titleMap = new HashMap<>();
|
|
|
- List<ExamQuestion> current = questionService.findByExamAndSubjectAndObjective(examId,
|
|
|
- question.getSubjectCode(), question.isObjective());
|
|
|
+ List<ExamQuestion> current = questionService.findByExamAndSubjectAndObjective(examId, question.getSubjectCode(),
|
|
|
+ question.isObjective());
|
|
|
for (ExamQuestion q : current) {
|
|
|
titleMap.put(q.getMainNumber(), q.getMainTitle());
|
|
|
}
|
|
@@ -1111,7 +1071,7 @@ public class PaperController extends BaseExamController {
|
|
|
questionService.save(sList);
|
|
|
for (Integer number : mainMap.keySet()) {
|
|
|
MarkGroup group = new MarkGroup(examId, subject.getCode(), number, null, mainMap.get(number), null,
|
|
|
- null, null, null, 0, false, false, null, false);
|
|
|
+ null, null, null, null, 0, false, false, null, false);
|
|
|
group.setPicList(cardFile.getMarkConfigAdd(cardFile.getMarkConfig(number), 0.015));
|
|
|
groupService.save(group);
|
|
|
}
|