|
@@ -61,842 +61,869 @@ import cn.com.qmth.examcloud.web.bootstrap.PropertyHolder;
|
|
|
@Service
|
|
|
public class ImportDdCollegePaperService {
|
|
|
|
|
|
- protected static final Logger log = LoggerFactory.getLogger(ImportDdCollegePaperService.class);
|
|
|
- @Autowired
|
|
|
- private PaperRepo paperRepo;
|
|
|
-
|
|
|
- @Autowired
|
|
|
- private PaperDetailRepo paperDetailRepo;
|
|
|
-
|
|
|
- @Autowired
|
|
|
- private PaperDetailUnitRepo paperDetailUnitRepo;
|
|
|
-
|
|
|
- @Autowired
|
|
|
- private QuesRepo quesRepo;
|
|
|
-
|
|
|
- @Autowired
|
|
|
- private CourseService courseService;
|
|
|
-
|
|
|
- @Autowired
|
|
|
- private QuesPkgPathRepo quesPkgPathRepo;
|
|
|
-
|
|
|
- public void importDdCollegePaper(MultipartFile dataFile, User user, Long rootOrgId) {
|
|
|
- String tempDir = PropertyHolder.getString("examcloud.web.sys.tempDataDir");
|
|
|
- String dir = tempDir + File.separator + UUID.randomUUID() + File.separator;
|
|
|
- try {
|
|
|
- File dfile = new File(dir);
|
|
|
- dfile.mkdirs();
|
|
|
- File zfile = new File(dir + dataFile.getOriginalFilename());
|
|
|
- zfile.createNewFile();
|
|
|
- dataFile.transferTo(zfile);
|
|
|
- FileUtil.unZip(dfile, zfile);
|
|
|
- resolvingImportFile(dataFile.getOriginalFilename().split("\\.")[0], dir, user, rootOrgId);
|
|
|
- } catch (StatusException e) {
|
|
|
- throw e;
|
|
|
- } catch (Exception e) {
|
|
|
- throw new StatusException("100001", "导入试卷失败:"+e.getMessage(), e);
|
|
|
- } finally {
|
|
|
- FileUtil.deleteFolder(dir);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- private void resolvingImportFile(String courseCode, String dir, User user, Long rootOrgId) throws IOException {
|
|
|
- XSSFWorkbook wb = null;
|
|
|
- try {
|
|
|
- wb = new XSSFWorkbook(dir + courseCode + ".xlsx");
|
|
|
- XSSFSheet sheet0 = wb.getSheetAt(0);
|
|
|
- Course course = courseService.getCourse(rootOrgId, courseCode);
|
|
|
- if (course == null) {
|
|
|
- throw new StatusException("200002", "课程信息不存在");
|
|
|
- }
|
|
|
- List<TestPaper> papers = new ArrayList<>();
|
|
|
- for (int i = 1; i <= sheet0.getLastRowNum(); i++) {
|
|
|
- XSSFRow row = sheet0.getRow(i);
|
|
|
- TestPaper tp = new TestPaper();
|
|
|
- tp.setId(row.getCell(0).getStringCellValue());
|
|
|
- tp.setName(row.getCell(1).getStringCellValue());
|
|
|
- tp.setTestPaperContentId(row.getCell(2).getStringCellValue());
|
|
|
- tp.setScore(getDoubleByString(row.getCell(3).getStringCellValue()));
|
|
|
- papers.add(tp);
|
|
|
- }
|
|
|
- if (papers == null || papers.size() == 0) {
|
|
|
- throw new StatusException("200001", "试卷信息为空");
|
|
|
- }
|
|
|
- int quesSheetIndex = 1;
|
|
|
- for (TestPaper testPaper : papers) {
|
|
|
- // 查询试题详情
|
|
|
- XSSFSheet quesheet = wb.getSheetAt(quesSheetIndex);
|
|
|
- List<TestQuestion> questions = queryTestPaper(dir, quesheet);
|
|
|
- quesSheetIndex++;
|
|
|
- // 构建大题和小题对应关系
|
|
|
- Map<Integer, List<TestQuestion>> map = sortPaperDetail(questions);
|
|
|
- // 初始化试卷
|
|
|
- Paper paper = initPaper(testPaper, rootOrgId + "", course, map, user);
|
|
|
- // 定义大题集合
|
|
|
- List<PaperDetail> paperDetails = new ArrayList<>();
|
|
|
- // 定义小题集合
|
|
|
- List<PaperDetailUnit> paperDetailUnits = new ArrayList<>();
|
|
|
- // 试题---资源 对应关系
|
|
|
- Map<Question, QuestionPkgPath> map2 = new HashMap<>();
|
|
|
- // 定义试卷难度
|
|
|
- double difficulty = 0;
|
|
|
- int error = 1;
|
|
|
- for (Integer key : map.keySet()) {
|
|
|
- List<TestQuestion> dQuestions = map.get(key);
|
|
|
- // 初始化大题对象
|
|
|
- PaperDetail paperDetail = initPaperDetail(dQuestions, paper, user);
|
|
|
- if (dQuestions != null && dQuestions.size() > 0) {
|
|
|
- for (TestQuestion testQuestion : dQuestions) {
|
|
|
- TestQuestionInfo testQuestionInfo = JsonUtil.fromJson(testQuestion.getJson(),
|
|
|
- TestQuestionInfo.class);
|
|
|
- // 初始化试题对象
|
|
|
- Question question = null;
|
|
|
- try {
|
|
|
- question = initQuestion(testQuestionInfo, testQuestion, course, map2, difficulty, dir,
|
|
|
- quesheet);
|
|
|
- } catch (Exception e) {
|
|
|
- throw new StatusException("600001", "初始化试题失败 courseCode:" + courseCode + " 试卷内容ID:"
|
|
|
- + testPaper.getTestPaperContentId() + " 错误题号:" + error +" 试题ID:"+testQuestion.getId()+ " " + e.getMessage());
|
|
|
- }
|
|
|
- // 初始化小题对象
|
|
|
- PaperDetailUnit paperDetailUnit = initPaperDetailUnit(paper, paperDetail, question,
|
|
|
- testQuestion, user);
|
|
|
- paperDetailUnits.add(paperDetailUnit);
|
|
|
- error++;
|
|
|
- }
|
|
|
- }
|
|
|
- paperDetails.add(paperDetail);
|
|
|
- }
|
|
|
- // 保存试题资源
|
|
|
- quesPkgPathRepo.saveAll(map2.values());
|
|
|
- for (Map.Entry<Question, QuestionPkgPath> entry : map2.entrySet()) {
|
|
|
- entry.getKey().setQuesPkgPathId(entry.getValue().getId());
|
|
|
- }
|
|
|
- // 计算试卷难度
|
|
|
- paper.setDifficultyDegree(0.5);
|
|
|
- // 重新计算试题序号
|
|
|
- Map<PaperDetail, List<PaperDetailUnit>> map3 = new LinkedHashMap<>();
|
|
|
- List<PaperDetailUnit> newList = null;
|
|
|
- for (PaperDetail paperDetail : paperDetails) {
|
|
|
- for (PaperDetailUnit paperDetailUnit : paperDetailUnits) {
|
|
|
- if (paperDetail.getName().equals(paperDetailUnit.getPaperDetail().getName())) {
|
|
|
- if (map3.get(paperDetail) == null) {
|
|
|
- newList = new ArrayList<>();
|
|
|
- newList.add(paperDetailUnit);
|
|
|
- } else {
|
|
|
- newList = map3.get(paperDetail);
|
|
|
- newList.add(paperDetailUnit);
|
|
|
- }
|
|
|
- map3.put(paperDetail, newList);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- int number = 1;
|
|
|
- for (Map.Entry<PaperDetail, List<PaperDetailUnit>> entry : map3.entrySet()) {
|
|
|
- for (PaperDetailUnit paperDetailUnit : entry.getValue()) {
|
|
|
- paperDetailUnit.setNumber(number);
|
|
|
- number++;
|
|
|
- }
|
|
|
- }
|
|
|
- quesRepo.saveAll(map2.keySet());
|
|
|
- paperRepo.save(paper);
|
|
|
- paperDetailRepo.saveAll(paperDetails);
|
|
|
- paperDetailUnitRepo.saveAll(paperDetailUnits);
|
|
|
- }
|
|
|
-
|
|
|
- } finally {
|
|
|
- if (wb != null) {
|
|
|
- wb.close();
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- private List<TestQuestion> queryTestPaper(String dir, XSSFSheet sheet) {
|
|
|
- List<TestQuestion> questions = new ArrayList<TestQuestion>();
|
|
|
- for (int i = 1; i <= sheet.getLastRowNum(); i++) {
|
|
|
- XSSFRow row = sheet.getRow(i);
|
|
|
- String pid = row.getCell(5).getStringCellValue();
|
|
|
- if ("00000000000000000000000000000000".equals(pid)) {
|
|
|
- TestQuestion tq = new TestQuestion();
|
|
|
- tq.setId(row.getCell(0).getStringCellValue());
|
|
|
- tq.setdNumber(getIntByString(row.getCell(1).getStringCellValue()));
|
|
|
- tq.setdName(row.getCell(2).getStringCellValue());
|
|
|
- tq.setNumber(getIntByString(row.getCell(3).getStringCellValue()));
|
|
|
- tq.setScore(getDoubleByString(row.getCell(4).getStringCellValue()));
|
|
|
- tq.setParentId(row.getCell(5).getStringCellValue());
|
|
|
- tq.setType(getIntByString(row.getCell(6).getStringCellValue()));
|
|
|
- File quesJson = new File(dir + tq.getId() + ".txt");
|
|
|
- if (!quesJson.exists()) {
|
|
|
- throw new StatusException("300002", "试题信息文件不存在");
|
|
|
- }
|
|
|
- tq.setJson(FileUtil.readFileContent(quesJson));
|
|
|
- questions.add(tq);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if (questions.size() == 0) {
|
|
|
- throw new StatusException("300001", "试题信息为空");
|
|
|
- }
|
|
|
- return questions;
|
|
|
- }
|
|
|
-
|
|
|
- private Integer getIntByString(String v) {
|
|
|
- if (StringUtils.isEmpty(v)) {
|
|
|
- return null;
|
|
|
- }
|
|
|
- return Integer.valueOf(v);
|
|
|
- }
|
|
|
-
|
|
|
- private Double getDoubleByString(String v) {
|
|
|
- if (StringUtils.isEmpty(v)) {
|
|
|
- return null;
|
|
|
- }
|
|
|
- return Double.valueOf(v);
|
|
|
- }
|
|
|
-
|
|
|
- // 将大题和小题分类
|
|
|
- private Map<Integer, List<TestQuestion>> sortPaperDetail(List<TestQuestion> questions) {
|
|
|
- Map<Integer, List<TestQuestion>> map = new HashMap<>();
|
|
|
- List<TestQuestion> sortQuestions = null;
|
|
|
- for (TestQuestion testQuestion : questions) {
|
|
|
- if (map.get(testQuestion.getdNumber()) == null) {
|
|
|
- sortQuestions = new ArrayList<TestQuestion>();
|
|
|
- sortQuestions.add(testQuestion);
|
|
|
- } else {
|
|
|
- sortQuestions = map.get(testQuestion.getdNumber());
|
|
|
- sortQuestions.add(testQuestion);
|
|
|
- }
|
|
|
- map.put(testQuestion.getdNumber(), sortQuestions);
|
|
|
- }
|
|
|
- return map;
|
|
|
- }
|
|
|
-
|
|
|
- // 初始化试卷对象
|
|
|
- private Paper initPaper(TestPaper testPaper, String orgId, Course course, Map<Integer, List<TestQuestion>> map,
|
|
|
- User user) {
|
|
|
- int unitCount = 0;
|
|
|
- Set<Integer> paperDetails = map.keySet();
|
|
|
- for (Map.Entry<Integer, List<TestQuestion>> entry : map.entrySet()) {
|
|
|
- unitCount = unitCount + entry.getValue().size();
|
|
|
- }
|
|
|
- Paper paper = new Paper();
|
|
|
- paper.setName(testPaper.getName());
|
|
|
- paper.setTitle(testPaper.getName());
|
|
|
- paper.setPaperType(PaperType.IMPORT);
|
|
|
- paper.setPaperStatus(PaperStatus.DRAFT);
|
|
|
- paper.setOrgId(orgId);
|
|
|
- paper.setCreator(user.getDisplayName());
|
|
|
- paper.setTotalScore(testPaper.getScore());
|
|
|
- paper.setCourse(course);
|
|
|
- paper.setCourseName(course.getName());
|
|
|
- paper.setCourseNo(course.getCode());
|
|
|
- paper.setCreateTime(CommonUtils.getCurDateTime());
|
|
|
- paper.setPaperDetailCount(paperDetails.size());
|
|
|
- paper.setUnitCount(unitCount);
|
|
|
- return paper;
|
|
|
- }
|
|
|
-
|
|
|
- // 初始化大题对象
|
|
|
- private PaperDetail initPaperDetail(List<TestQuestion> dQuestions, Paper paper, User user) {
|
|
|
- // 定义大题分数
|
|
|
- double dTotal = 0;
|
|
|
- PaperDetail paperDetail = new PaperDetail();
|
|
|
- if (dQuestions != null && dQuestions.size() > 0) {
|
|
|
- for (TestQuestion question : dQuestions) {
|
|
|
- dTotal = dTotal + question.getScore();
|
|
|
- }
|
|
|
- paperDetail.setPaper(paper);
|
|
|
- paperDetail.setNumber(dQuestions.get(0).getdNumber());
|
|
|
- paperDetail.setName(dQuestions.get(0).getdName());
|
|
|
- paperDetail.setScore(dTotal);
|
|
|
- paperDetail.setUnitCount(dQuestions.size());
|
|
|
- paperDetail.setCreator(user.getDisplayName());
|
|
|
- paperDetail.setCreateTime(CommonUtils.getCurDateTime());
|
|
|
- }
|
|
|
- return paperDetail;
|
|
|
- }
|
|
|
-
|
|
|
- // 初始化试题对象
|
|
|
- private Question initQuestion(TestQuestionInfo testQuestionInfo, TestQuestion testQuestion, Course course,
|
|
|
- Map<Question, QuestionPkgPath> map, double difficulty, String dir, XSSFSheet sheet) throws Exception {
|
|
|
- Question question = new Question();
|
|
|
- question.setCreateTime(CommonUtils.getCurDateTime());
|
|
|
- question.setScore(testQuestion.getScore());
|
|
|
- question.setCourse(course);
|
|
|
- question.setOrgId(course.getOrgId());
|
|
|
- question.setHasAudio(false);
|
|
|
- question.setDifficulty("中");
|
|
|
- question.setDifficultyDegree(0.5);
|
|
|
- question.setPublicity(true);
|
|
|
- // 按试题分类初始化题干,答案,选项
|
|
|
- initQuestionInfo(question, testQuestionInfo, map, testQuestion, dir, sheet);
|
|
|
- difficulty = question.getScore() * 0.5 + difficulty;
|
|
|
- return question;
|
|
|
- }
|
|
|
-
|
|
|
- // 初始化题干,答案,选项,资源
|
|
|
- private void initQuestionInfo(Question question, TestQuestionInfo testQuestionInfo,
|
|
|
- Map<Question, QuestionPkgPath> map, TestQuestion testQuestion, String dir, XSSFSheet sheet)
|
|
|
- throws Exception {
|
|
|
- WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
|
|
|
- // 选词填空
|
|
|
- if (testQuestionInfo.getQuestionType() == 14) {
|
|
|
- String quesBody = testQuestionInfo.getQuestionHTML();
|
|
|
- // 去掉<span>标签中的lang
|
|
|
- quesBody = replaceLang(quesBody);
|
|
|
- // 获取img标签
|
|
|
- LinkedHashMap<String, String> bodyImgList = imgList(quesBody);
|
|
|
- if (bodyImgList != null && bodyImgList.size() > 0) {
|
|
|
- int number = 1;
|
|
|
- for (Map.Entry<String, String> entry : bodyImgList.entrySet()) {
|
|
|
- if (StringUtils.isBlank(entry.getValue())) {
|
|
|
- quesBody = quesBody.replace(entry.getKey(), "##" + number + "##");
|
|
|
- number++;
|
|
|
- } else {
|
|
|
- quesBody = quesBody.replace(entry.getKey(), entry.getValue());
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- question.setQuesBody("<p>" + quesBody + "</p>");
|
|
|
- question.setQuesBodyWord(
|
|
|
- DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(question.getQuesBody())));
|
|
|
- question.setQuestionType(QuesStructType.NESTED_ANSWER_QUESTION);
|
|
|
- List<Question> subQuestions = initSubQuestionsByOther(testQuestionInfo, wordMLPackage);
|
|
|
- question.setSubQuestions(subQuestions);
|
|
|
- }
|
|
|
- // 阅读理解题
|
|
|
- if (testQuestionInfo.getQuestionType() == 42) {
|
|
|
- String quesBody = testQuestionInfo.getQuestionHTML();
|
|
|
- // 去掉<span>标签中的lang
|
|
|
- quesBody = replaceLang(quesBody);
|
|
|
- // 获取img标签
|
|
|
- LinkedHashMap<String, String> bodyImgList = imgList(quesBody);
|
|
|
- // 替换、补全Img标签
|
|
|
- quesBody = replaceImg(bodyImgList, quesBody);
|
|
|
- question.setQuesBody("<p>" + quesBody + "</p>");
|
|
|
- question.setQuesBodyWord(
|
|
|
- DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(question.getQuesBody())));
|
|
|
- question.setQuestionType(QuesStructType.NESTED_ANSWER_QUESTION);
|
|
|
- List<Question> subQues = new ArrayList<Question>();
|
|
|
- // 查询所有子题
|
|
|
- List<TestQuestion> subQuestions = querySubQuestions(testQuestion.getId(), dir, sheet);
|
|
|
- if (subQuestions != null && subQuestions.size() > 0) {
|
|
|
- for (TestQuestion testQuestion2 : subQuestions) {
|
|
|
- TestQuestionInfo testQuestionInfo2 = JsonUtil.fromJson(testQuestion2.getJson(),
|
|
|
- TestQuestionInfo.class);
|
|
|
- Question subQuestion = new Question();
|
|
|
- subQuestion.setDifficulty("中");
|
|
|
- subQuestion.setDifficultyDegree(0.5);
|
|
|
- subQuestion.setPublicity(true);
|
|
|
- // 按试题分类初始化题干,答案,选项
|
|
|
- initQuestionInfo(subQuestion, testQuestionInfo2, map, testQuestion2, dir, sheet);
|
|
|
- subQues.add(subQuestion);
|
|
|
- }
|
|
|
- question.setSubQuestions(subQues);
|
|
|
- }
|
|
|
- }
|
|
|
- // 完形填空题
|
|
|
- if (testQuestionInfo.getQuestionType() == 15) {
|
|
|
- String quesBody = testQuestionInfo.getQuestionHTML();
|
|
|
- // 去掉<span>标签中的lang
|
|
|
- quesBody = replaceLang(quesBody);
|
|
|
- // 获取img标签
|
|
|
- LinkedHashMap<String, String> bodyImgList = imgList(quesBody);
|
|
|
- if (bodyImgList != null && bodyImgList.size() > 0) {
|
|
|
- int number = 1;
|
|
|
- for (Map.Entry<String, String> entry : bodyImgList.entrySet()) {
|
|
|
- if (StringUtils.isBlank(entry.getValue())) {
|
|
|
- quesBody = quesBody.replace(entry.getKey(), "##" + number + "##");
|
|
|
- number++;
|
|
|
- } else {
|
|
|
- quesBody = quesBody.replace(entry.getKey(), entry.getValue());
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- question.setQuesBody("<p>" + quesBody + "</p>");
|
|
|
- question.setQuesBodyWord(
|
|
|
- DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(question.getQuesBody())));
|
|
|
- question.setQuestionType(QuesStructType.NESTED_ANSWER_QUESTION);
|
|
|
- // 获取所有选项
|
|
|
- List<TestFillAnswer> blanks = testQuestionInfo.getBlanks();
|
|
|
- List<Question> subQuestions = initSubQuestions(blanks, wordMLPackage);
|
|
|
- question.setSubQuestions(subQuestions);
|
|
|
- }
|
|
|
- // 问答题 、 名词解释
|
|
|
- if (testQuestionInfo.getQuestionType() == 60 || testQuestionInfo.getQuestionType() == 69) {
|
|
|
- String quesBody = testQuestionInfo.getQuestionHTML();
|
|
|
- // 去掉<span>标签中的lang
|
|
|
- quesBody = replaceLang(quesBody);
|
|
|
- // 获取img标签
|
|
|
- LinkedHashMap<String, String> bodyImgList = imgList(quesBody);
|
|
|
- // 替换、补全Img标签
|
|
|
- quesBody = replaceImg(bodyImgList, quesBody);
|
|
|
- question.setQuesBody("<p>" + quesBody + "</p>");
|
|
|
- question.setQuesBodyWord(
|
|
|
- DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(question.getQuesBody())));
|
|
|
- question.setQuestionType(QuesStructType.TEXT_ANSWER_QUESTION);
|
|
|
- String answer = testQuestionInfo.getAnswer();
|
|
|
- // 去掉<span>标签中的lang
|
|
|
- answer = replaceLang(answer);
|
|
|
- // 获取img标签
|
|
|
- LinkedHashMap<String, String> answerImgList = imgList(answer);
|
|
|
- // 替换、补全Img标签
|
|
|
- answer = replaceImg(answerImgList, answer);
|
|
|
- question.setQuesAnswer("<p>" + answer + "</p>");
|
|
|
- question.setQuesAnswerWord(
|
|
|
- DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(question.getQuesAnswer())));
|
|
|
- }
|
|
|
- // 单选题
|
|
|
- if (testQuestionInfo.getQuestionType() == 11) {
|
|
|
- String quesBody = testQuestionInfo.getQuestionHTML();
|
|
|
- // 去掉<span>标签中的lang
|
|
|
- quesBody = replaceLang(quesBody);
|
|
|
- // 获取img标签
|
|
|
- LinkedHashMap<String, String> bodyImgList = imgList(quesBody);
|
|
|
- // 替换、补全Img标签
|
|
|
- quesBody = replaceImg(bodyImgList, quesBody);
|
|
|
- question.setQuesBody("<p>" + quesBody + "</p>");
|
|
|
- question.setQuesBodyWord(
|
|
|
- DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(question.getQuesBody())));
|
|
|
- question.setQuestionType(QuesStructType.SINGLE_ANSWER_QUESTION);
|
|
|
- List<QuesOption> quesOptions = new ArrayList<QuesOption>();
|
|
|
- List<TestOption> options = testQuestionInfo.getOptions();
|
|
|
- Integer answerNumber = null;
|
|
|
- if (options != null && options.size() > 0) {
|
|
|
- int number = 1;
|
|
|
- short isCorrect = 0;
|
|
|
- for (TestOption testOption : options) {
|
|
|
- if (testOption.getID().equals(testQuestionInfo.getAnswerId())) {
|
|
|
- isCorrect = 1;
|
|
|
- answerNumber = number;
|
|
|
- } else {
|
|
|
- isCorrect = 0;
|
|
|
- }
|
|
|
- QuesOption quesOption = initQuesOption(testOption, number, isCorrect, wordMLPackage);
|
|
|
- quesOptions.add(quesOption);
|
|
|
- number++;
|
|
|
- }
|
|
|
- }
|
|
|
- question.setQuesOptions(quesOptions);
|
|
|
- if (answerNumber != null) {
|
|
|
- char c1 = (char) (answerNumber + 64);
|
|
|
- question.setQuesAnswer(String.valueOf(c1));
|
|
|
- question.setQuesAnswerWord(DocxProcessUtil.html2Docx(wordMLPackage,
|
|
|
- CommonUtils.formatHtml("<p>" + question.getQuesAnswer() + "</p>")));
|
|
|
- }
|
|
|
- }
|
|
|
- // 多选题
|
|
|
- if (testQuestionInfo.getQuestionType() == 12) {
|
|
|
- String quesBody = testQuestionInfo.getQuestionHTML();
|
|
|
- // 去掉<span>标签中的lang
|
|
|
- quesBody = replaceLang(quesBody);
|
|
|
- // 获取img标签
|
|
|
- LinkedHashMap<String, String> bodyImgList = imgList(quesBody);
|
|
|
- // 替换、补全Img标签
|
|
|
- quesBody = replaceImg(bodyImgList, quesBody);
|
|
|
- question.setQuesBody("<p>" + quesBody + "</p>");
|
|
|
- question.setQuesBodyWord(
|
|
|
- DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(question.getQuesBody())));
|
|
|
- question.setQuestionType(QuesStructType.MULTIPLE_ANSWER_QUESTION);
|
|
|
- List<QuesOption> quesOptions = new ArrayList<QuesOption>();
|
|
|
- List<TestOption> options = testQuestionInfo.getOptions();
|
|
|
- List<Integer> answerNumbers = new ArrayList<Integer>();
|
|
|
- if (options != null && options.size() > 0) {
|
|
|
- int number = 1;
|
|
|
- short isCorrect = 0;
|
|
|
- for (TestOption testOption : options) {
|
|
|
- if (testQuestionInfo.getAnswers().contains(testOption.getID())) {
|
|
|
- isCorrect = 1;
|
|
|
- answerNumbers.add(number);
|
|
|
- } else {
|
|
|
- isCorrect = 0;
|
|
|
- }
|
|
|
- QuesOption quesOption = initQuesOption(testOption, number, isCorrect, wordMLPackage);
|
|
|
- quesOptions.add(quesOption);
|
|
|
- number++;
|
|
|
- }
|
|
|
- }
|
|
|
- question.setQuesOptions(quesOptions);
|
|
|
- if (answerNumbers != null && answerNumbers.size() > 0) {
|
|
|
- String answers = "";
|
|
|
- for (Integer number : answerNumbers) {
|
|
|
- char c1 = (char) (number + 64);
|
|
|
- if (StringUtils.isBlank(answers)) {
|
|
|
- answers = String.valueOf(c1);
|
|
|
- } else {
|
|
|
- answers = answers + "," + String.valueOf(c1);
|
|
|
- }
|
|
|
- }
|
|
|
- question.setQuesAnswer(answers);
|
|
|
- question.setQuesAnswerWord(DocxProcessUtil.html2Docx(wordMLPackage,
|
|
|
- CommonUtils.formatHtml("<p>" + question.getQuesAnswer() + "</p>")));
|
|
|
- }
|
|
|
- }
|
|
|
- // 填空题 ###
|
|
|
- if (testQuestionInfo.getQuestionType() == 13) {
|
|
|
- String quesBody = testQuestionInfo.getQuestionHTML();
|
|
|
- // 去掉<span>标签中的lang
|
|
|
- quesBody = replaceLang(quesBody);
|
|
|
- // 获取img标签
|
|
|
- LinkedHashMap<String, String> imgList = imgList(quesBody);
|
|
|
- if (imgList != null && imgList.size() > 0) {
|
|
|
- for (Map.Entry<String, String> entry : imgList.entrySet()) {
|
|
|
- if (StringUtils.isBlank(entry.getValue())) {
|
|
|
- quesBody = quesBody.replace(entry.getKey(), "(###)");
|
|
|
- } else {
|
|
|
- quesBody = quesBody.replace(entry.getKey(), entry.getValue());
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- question.setQuesBody("<p>" + quesBody + "</p>");
|
|
|
- question.setQuesBodyWord(
|
|
|
- DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(question.getQuesBody())));
|
|
|
- question.setQuestionType(QuesStructType.FILL_BLANK_QUESTION);
|
|
|
- String answer = "";
|
|
|
- List<TestFillAnswer> blanks = testQuestionInfo.getBlanks();
|
|
|
- if (blanks != null && blanks.size() > 0) {
|
|
|
- for (TestFillAnswer testFillAnswer : blanks) {
|
|
|
- List<TestFillContent> answers = testFillAnswer.getAnswers();
|
|
|
- if (answers != null && answers.size() > 0) {
|
|
|
- for (TestFillContent testFillContent : answers) {
|
|
|
- if (StringUtils.isBlank(answer)) {
|
|
|
- answer = testFillContent.getContent();
|
|
|
- } else {
|
|
|
- answer = answer + "##" + testFillContent.getContent();
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- // 去掉<span>标签中的lang
|
|
|
- answer = replaceLang(answer);
|
|
|
- // 获取img标签
|
|
|
- LinkedHashMap<String, String> answerImgList = imgList(answer);
|
|
|
- // 替换、补全Img标签
|
|
|
- answer = replaceImg(answerImgList, answer);
|
|
|
- question.setQuesAnswer("<p>" + answer + "</p>");
|
|
|
- question.setQuesAnswerWord(
|
|
|
- DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(question.getQuesAnswer())));
|
|
|
- }
|
|
|
- }
|
|
|
- // 判断题
|
|
|
- if (testQuestionInfo.getQuestionType() == 20) {
|
|
|
- String quesBody = testQuestionInfo.getQuestionHTML();
|
|
|
- // 去掉<span>标签中的lang
|
|
|
- quesBody = replaceLang(quesBody);
|
|
|
- // 获取img标签
|
|
|
- LinkedHashMap<String, String> bodyImgList = imgList(quesBody);
|
|
|
- // 替换、补全Img标签
|
|
|
- quesBody = replaceImg(bodyImgList, quesBody);
|
|
|
- question.setQuesBody("<p>" + quesBody + "</p>");
|
|
|
- question.setQuesBodyWord(
|
|
|
- DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(question.getQuesBody())));
|
|
|
- question.setQuestionType(QuesStructType.BOOL_ANSWER_QUESTION);
|
|
|
- String answer = testQuestionInfo.getAnswer();
|
|
|
- if (answer.equals("false")) {
|
|
|
- answer = "错误";
|
|
|
- } else {
|
|
|
- answer = "正确";
|
|
|
- }
|
|
|
- question.setQuesAnswer(answer);
|
|
|
- question.setQuesAnswerWord(DocxProcessUtil.html2Docx(wordMLPackage,
|
|
|
- CommonUtils.formatHtml("<p>" + question.getQuesAnswer() + "</p>")));
|
|
|
- }
|
|
|
- byte[] pkgByte = DocxProcessUtil.getPkgByte(wordMLPackage);
|
|
|
- QuestionPkgPath quesPkgPath = new QuestionPkgPath(pkgByte);
|
|
|
- map.put(question, quesPkgPath);
|
|
|
- }
|
|
|
-
|
|
|
- // 去除<span> 标签中lang = EN - US
|
|
|
- private String replaceLang(String str) {
|
|
|
- if (str.contains("lang=EN-US")) {
|
|
|
- str = str.replace("lang=EN-US", "");
|
|
|
- }
|
|
|
- if (str.contains("alt=\"\u0012\"")) {
|
|
|
- str = str.replace("alt=\"\u0012\"", "alt=\"\"");
|
|
|
- }
|
|
|
- if (str.contains("alt=\"\"")) {
|
|
|
- str = str.replace("alt=\"\"", "alt=\"\"");
|
|
|
- }
|
|
|
- if (str.contains("\u000b")) {
|
|
|
- str = str.replaceAll("\u000b", "");
|
|
|
- }
|
|
|
- if (str.contains("�")) {
|
|
|
- str = str.replaceAll("�", "");
|
|
|
- }
|
|
|
- if (str.contains("<img width=\"25\" height=\"23\" src=\"/UploadFiles/Import/Image/3cf48167-932f-4ae6-be69-37520a02cd23_.png\"/>")) {
|
|
|
- str = str.replaceAll("<img width=\"25\" height=\"23\" src=\"/UploadFiles/Import/Image/3cf48167-932f-4ae6-be69-37520a02cd23_.png\"/>",
|
|
|
- "图片缺失");
|
|
|
- }
|
|
|
- if (str.contains("<img width=\"25\" height=\"23\" src=\"/UploadFiles/Import/Image/3cf48167-932f-4ae6-be69-37520a02cd23_.png\"/>")) {
|
|
|
- str = str.replaceAll("<img width=\"25\" height=\"23\" src=\"/UploadFiles/Import/Image/3cf48167-932f-4ae6-be69-37520a02cd23_.png\"/>", "图片缺失");
|
|
|
- }
|
|
|
- if (str.contains("<img width=\"24\" height=\"24\" src=\"/UploadFiles/Import/Image/811ae8b2-4d74-4cc2-a8a3-9665e5e810c1_.png\"/>")) {
|
|
|
- str = str.replaceAll("<img width=\"24\" height=\"24\" src=\"/UploadFiles/Import/Image/811ae8b2-4d74-4cc2-a8a3-9665e5e810c1_.png\"/>", "图片缺失");
|
|
|
- }
|
|
|
- if (str.contains("<img width=\"12\" height=\"13\" src=\"管理会计%20专升本.files/image001.png\">")) {
|
|
|
- str = str.replaceAll("<img width=\"12\" height=\"13\" src=\"管理会计%20专升本.files/image001.png\">", "图片缺失");
|
|
|
- }
|
|
|
- if (str.contains("<img style=\"max-width: 600px; height: auto\" alt=\"\" src=\"/UploadFiles/刘晓平/Images/OnlineExam20180709151328.png\" />")) {
|
|
|
- str = str.replaceAll("<img style=\"max-width: 600px; height: auto\" alt=\"\" src=\"/UploadFiles/刘晓平/Images/OnlineExam20180709151328.png\" />", "图片缺失");
|
|
|
- }
|
|
|
- if (str.contains("<img width=\"52\" height=\"45\" src=\"机械制造工艺学%20专升本%20综合测试2.files/image002.png\">")) {
|
|
|
- str = str.replaceAll("<img width=\"52\" height=\"45\" src=\"机械制造工艺学%20专升本%20综合测试2.files/image002.png\">", "图片缺失");
|
|
|
- }
|
|
|
- if (str.contains("<img width=\"25\" height=\"23\" src=\"/UploadFiles/Import/Image/001d24f0-a007-4c13-8cb4-2a138d0545ae_.png\"/>")) {
|
|
|
- str = str.replaceAll("<img width=\"25\" height=\"23\" src=\"/UploadFiles/Import/Image/001d24f0-a007-4c13-8cb4-2a138d0545ae_.png\"/>", "图片缺失");
|
|
|
- }
|
|
|
- if (str.contains("<img src=\"/UploadFiles/李家林/Images/OnlineExam20140312164501.png\" alt=\"\" />")) {
|
|
|
- str = str.replaceAll("<img src=\"/UploadFiles/李家林/Images/OnlineExam20140312164501.png\" alt=\"\" />", "图片缺失");
|
|
|
- }
|
|
|
- if (str.contains("<img width=\"25\" height=\"23\" src=\"/UploadFiles/Import/Image/001d24f0-a007-4c13-8cb4-2a138d0545ae_.png\"/>")) {
|
|
|
- str = str.replaceAll("<img width=\"25\" height=\"23\" src=\"/UploadFiles/Import/Image/001d24f0-a007-4c13-8cb4-2a138d0545ae_.png\"/>", "图片缺失");
|
|
|
- }
|
|
|
- if (str.contains("<img width=\"24\" height=\"24\" src=\"/UploadFiles/Import/Image/7828a9f0-5ec4-435d-ac78-cc400bc4cc22_.png\"/>")) {
|
|
|
- str = str.replaceAll("<img width=\"24\" height=\"24\" src=\"/UploadFiles/Import/Image/7828a9f0-5ec4-435d-ac78-cc400bc4cc22_.png\"/>", "图片缺失");
|
|
|
- }
|
|
|
- if (str.contains("<img alt=\"\" src=\"/UploadFiles/王建军/Images/OnlineExam20160319160348.jpg\" />")) {
|
|
|
- str = str.replaceAll("<img alt=\"\" src=\"/UploadFiles/王建军/Images/OnlineExam20160319160348.jpg\" />", "图片缺失");
|
|
|
- }
|
|
|
-
|
|
|
-// if (str.contains("<")) {
|
|
|
-// str = str.replace("<", "<");
|
|
|
-// }
|
|
|
-// if (str.contains(">")) {
|
|
|
-// str = str.replace(">", ">");
|
|
|
-// }
|
|
|
-// if (str.contains("&")) {
|
|
|
-// str = str.replaceAll("&", "&");
|
|
|
-// }
|
|
|
-// if (str.contains("<")) {
|
|
|
-// str = str.replaceAll("<", "<");
|
|
|
-// }
|
|
|
-// if (str.contains(">")) {
|
|
|
-// str = str.replaceAll(">", ">");
|
|
|
-// }
|
|
|
- return str;
|
|
|
- }
|
|
|
-
|
|
|
- // 替换img标签,补全图片
|
|
|
- private String replaceImg(LinkedHashMap<String, String> imgList, String str) {
|
|
|
- if (imgList != null && imgList.size() > 0) {
|
|
|
- for (Map.Entry<String, String> entry : imgList.entrySet()) {
|
|
|
- if (StringUtils.isBlank(entry.getValue())) {
|
|
|
- str = str.replace(entry.getKey(), "___");
|
|
|
- } else {
|
|
|
- str = str.replace(entry.getKey(), entry.getValue());
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- return str;
|
|
|
- }
|
|
|
-
|
|
|
- // 將url路徑中的中文转码
|
|
|
- private String regexCH(String str) throws UnsupportedEncodingException {
|
|
|
- StringBuffer s = new StringBuffer();
|
|
|
- Pattern pat = Pattern.compile("[\u4E00-\u9FA5]");
|
|
|
- Matcher mat = pat.matcher(str);
|
|
|
- while (mat.find()) {
|
|
|
- s.append(mat.group());
|
|
|
- }
|
|
|
- String url = URLEncoder.encode(s.toString(), "utf-8");
|
|
|
- return str.replace(s.toString(), url);
|
|
|
- }
|
|
|
-
|
|
|
- // 去除图片中有下划线的图片,并补全图片下载地址
|
|
|
- private LinkedHashMap<String, String> imgList(String str) throws Exception {
|
|
|
- LinkedHashMap<String, String> map = new LinkedHashMap<>();
|
|
|
- // 获取img标签
|
|
|
- List<String> srcList = ImgDataUtils.parseImages(str);
|
|
|
- if (srcList != null && srcList.size() > 0) {
|
|
|
- for (String img : srcList) {
|
|
|
- if (img.contains("/Shared/UnderLine")) {
|
|
|
- map.put(img, "");
|
|
|
- } else {
|
|
|
- List<String> parseImageSrc = ImgDataUtils.parseImageSrc(img);
|
|
|
- if (parseImageSrc != null && parseImageSrc.size() > 0) {
|
|
|
- String src = parseImageSrc.get(0);
|
|
|
- String url = regexCH(src);
|
|
|
- String picture=null;
|
|
|
- if(url.startsWith("http://ncexam.cug.edu.cn/")) {
|
|
|
- picture = url;
|
|
|
- }else {
|
|
|
- picture = "http://ncexam.cug.edu.cn" + url;
|
|
|
- }
|
|
|
- String base64 = ImgDataUtils.loadImageToBase64(picture);
|
|
|
- if (base64 == null) {
|
|
|
- throw new StatusException("50001", "图片下载失败" + picture);
|
|
|
- } else {
|
|
|
- if (src.contains("jpg")) {
|
|
|
- map.put(img, img.replace(src, "data:image/jpg;base64," + base64));
|
|
|
- } else if(src.contains("bmp")){
|
|
|
- map.put(img, img.replace(src, "data:image/bmp;base64," + base64));
|
|
|
- }else {
|
|
|
- map.put(img, img.replace(src, "data:image/png;base64," + base64));
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- return map;
|
|
|
- }
|
|
|
- return null;
|
|
|
- }
|
|
|
-
|
|
|
- private List<Question> initSubQuestionsByOther(TestQuestionInfo testQuestionInfo,
|
|
|
- WordprocessingMLPackage wordMLPackage) throws Exception {
|
|
|
- List<Question> subQuestions = new ArrayList<Question>();
|
|
|
- if (testQuestionInfo.getBlanks() != null && testQuestionInfo.getBlanks().size() > 0) {
|
|
|
- List<TestFillAnswer> blanks = testQuestionInfo.getBlanks();
|
|
|
- for (TestFillAnswer testFillAnswer : blanks) {
|
|
|
- Question subQuestion = new Question();
|
|
|
- subQuestion.setId(IdUtils.uuid());
|
|
|
- subQuestion.setQuestionType(QuesStructType.SINGLE_ANSWER_QUESTION);
|
|
|
- subQuestion.setDifficulty("中");
|
|
|
- subQuestion.setDifficultyDegree(0.5);
|
|
|
- subQuestion.setPublicity(true);
|
|
|
- subQuestion.setQuesBody("______");
|
|
|
- subQuestion.setQuesBodyWord(DocxProcessUtil.html2Docx(wordMLPackage,
|
|
|
- CommonUtils.formatHtml("<p>" + subQuestion.getQuesBody() + "</p>")));
|
|
|
- List<QuesOption> quesOptions = new ArrayList<QuesOption>();
|
|
|
- TestOptionGroup optionGroup = testQuestionInfo.getOptionGroup();
|
|
|
- List<TestOption> options = optionGroup.getOptions();
|
|
|
- Integer answerNumber = null;
|
|
|
- if (options != null && options.size() > 0) {
|
|
|
- for (TestOption subOption : options) {
|
|
|
- int subNumber = 1;
|
|
|
- short isCorrect = 0;
|
|
|
- if (testFillAnswer.getAnswerId().equals(subOption.getID())) {
|
|
|
- isCorrect = 1;
|
|
|
- answerNumber = subNumber;
|
|
|
- } else {
|
|
|
- isCorrect = 0;
|
|
|
- }
|
|
|
- QuesOption quesOption = initQuesOption(subOption, subNumber, isCorrect, wordMLPackage);
|
|
|
- quesOptions.add(quesOption);
|
|
|
- subNumber++;
|
|
|
- }
|
|
|
- }
|
|
|
- subQuestion.setQuesOptions(quesOptions);
|
|
|
- if (answerNumber != null) {
|
|
|
- char c1 = (char) (answerNumber + 64);
|
|
|
- subQuestion.setQuesAnswer(String.valueOf(c1));
|
|
|
- subQuestion.setQuesAnswerWord(DocxProcessUtil.html2Docx(wordMLPackage,
|
|
|
- CommonUtils.formatHtml("<p>" + subQuestion.getQuesAnswer() + "</p>")));
|
|
|
- }
|
|
|
- subQuestions.add(subQuestion);
|
|
|
- }
|
|
|
- }
|
|
|
- return subQuestions;
|
|
|
- }
|
|
|
-
|
|
|
- // 初始化选项
|
|
|
- private QuesOption initQuesOption(TestOption testOption, int number, short isCorrect,
|
|
|
- WordprocessingMLPackage wordMLPackage) throws Exception {
|
|
|
- QuesOption quesOption = new QuesOption();
|
|
|
- quesOption.setNumber(String.valueOf(number));
|
|
|
- quesOption.setIsCorrect(isCorrect);
|
|
|
- String optionBody = testOption.getOptionHTML();
|
|
|
- // 去掉<span>标签中的lang
|
|
|
- optionBody = replaceLang(optionBody);
|
|
|
- // 获取img标签
|
|
|
- LinkedHashMap<String, String> optionBodyImgList = imgList(optionBody);
|
|
|
- // 替换、补全Img标签
|
|
|
- optionBody = replaceImg(optionBodyImgList, optionBody);
|
|
|
- quesOption.setOptionBody("<p>" + optionBody + "</p>");
|
|
|
- quesOption.setOptionBodyWord(
|
|
|
- DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(quesOption.getOptionBody())));
|
|
|
- return quesOption;
|
|
|
- }
|
|
|
-
|
|
|
- // 根据父ID查询子题
|
|
|
- private List<TestQuestion> querySubQuestions(String parentId, String dir, XSSFSheet sheet) {
|
|
|
- List<TestQuestion> questions = new ArrayList<TestQuestion>();
|
|
|
- for (int i = 1; i <= sheet.getLastRowNum(); i++) {
|
|
|
- XSSFRow row = sheet.getRow(i);
|
|
|
- String pid = row.getCell(5).getStringCellValue();
|
|
|
- if (parentId.equals(pid)) {
|
|
|
- TestQuestion tq = new TestQuestion();
|
|
|
- tq.setId(row.getCell(0).getStringCellValue());
|
|
|
- tq.setdNumber(getIntByString(row.getCell(1).getStringCellValue()));
|
|
|
- tq.setdName(row.getCell(2).getStringCellValue());
|
|
|
- tq.setNumber(getIntByString(row.getCell(3).getStringCellValue()));
|
|
|
- tq.setScore(getDoubleByString(row.getCell(4).getStringCellValue()));
|
|
|
- tq.setParentId(row.getCell(5).getStringCellValue());
|
|
|
- tq.setType(getIntByString(row.getCell(6).getStringCellValue()));
|
|
|
- File quesJson = new File(dir + tq.getId() + ".txt");
|
|
|
- if (!quesJson.exists()) {
|
|
|
- throw new StatusException("400002", "试题信息文件不存在");
|
|
|
- }
|
|
|
- tq.setJson(FileUtil.readFileContent(quesJson));
|
|
|
- questions.add(tq);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if (questions.size() == 0) {
|
|
|
- throw new StatusException("400001", "试题信息为空");
|
|
|
- }
|
|
|
- return questions;
|
|
|
- }
|
|
|
-
|
|
|
- // 完形填空初始化所有子题
|
|
|
- private List<Question> initSubQuestions(List<TestFillAnswer> blanks, WordprocessingMLPackage wordMLPackage)
|
|
|
- throws Exception {
|
|
|
- List<Question> subQuestions = new ArrayList<Question>();
|
|
|
- if (blanks != null && blanks.size() > 0) {
|
|
|
- for (TestFillAnswer testFillAnswer : blanks) {
|
|
|
- Question question = new Question();
|
|
|
- question.setId(IdUtils.uuid());
|
|
|
- question.setQuestionType(QuesStructType.SINGLE_ANSWER_QUESTION);
|
|
|
- question.setDifficulty("中");
|
|
|
- question.setDifficultyDegree(0.5);
|
|
|
- question.setPublicity(true);
|
|
|
- question.setQuesBody("______");
|
|
|
- question.setQuesBodyWord(DocxProcessUtil.html2Docx(wordMLPackage,
|
|
|
- CommonUtils.formatHtml("<p>" + question.getQuesBody() + "</p>")));
|
|
|
- TestOptionGroup optionGroup = testFillAnswer.getOptionGroup();
|
|
|
- List<QuesOption> quesOptions = new ArrayList<QuesOption>();
|
|
|
- List<TestOption> subOptions = optionGroup.getOptions();
|
|
|
- Integer answerNumber = null;
|
|
|
- if (subOptions != null && subOptions.size() > 0) {
|
|
|
- int subNumber = 1;
|
|
|
- short isCorrect = 0;
|
|
|
- for (TestOption subOption : subOptions) {
|
|
|
- if (testFillAnswer.getAnswerId().equals(subOption.getID())) {
|
|
|
- isCorrect = 1;
|
|
|
- answerNumber = subNumber;
|
|
|
- } else {
|
|
|
- isCorrect = 0;
|
|
|
- }
|
|
|
- QuesOption quesOption = initQuesOption(subOption, subNumber, isCorrect, wordMLPackage);
|
|
|
- quesOptions.add(quesOption);
|
|
|
- subNumber++;
|
|
|
- }
|
|
|
- }
|
|
|
- question.setQuesOptions(quesOptions);
|
|
|
- if (answerNumber != null) {
|
|
|
- char c1 = (char) (answerNumber + 64);
|
|
|
- question.setQuesAnswer(String.valueOf(c1));
|
|
|
- question.setQuesAnswerWord(DocxProcessUtil.html2Docx(wordMLPackage,
|
|
|
- CommonUtils.formatHtml("<p>" + question.getQuesAnswer() + "</p>")));
|
|
|
- }
|
|
|
- subQuestions.add(question);
|
|
|
- }
|
|
|
- }
|
|
|
- return subQuestions;
|
|
|
- }
|
|
|
-
|
|
|
- // 初始化小题对象
|
|
|
- private PaperDetailUnit initPaperDetailUnit(Paper paper, PaperDetail paperDetail, Question question,
|
|
|
- TestQuestion testQuestion, User user) {
|
|
|
- PaperDetailUnit paperDetailUnit = new PaperDetailUnit();
|
|
|
- paperDetailUnit.setPaper(paper);
|
|
|
- paperDetailUnit.setNumber(testQuestion.getNumber());
|
|
|
- paperDetailUnit.setScore(testQuestion.getScore());
|
|
|
- paperDetailUnit.setPaperDetail(paperDetail);
|
|
|
- paperDetailUnit.setQuestionType(question.getQuestionType());
|
|
|
- paperDetailUnit.setCreator(user.getDisplayName());
|
|
|
- paperDetailUnit.setCreateTime(CommonUtils.getCurDateTime());
|
|
|
- paperDetailUnit.setQuestion(question);
|
|
|
- return paperDetailUnit;
|
|
|
- }
|
|
|
+ protected static final Logger log = LoggerFactory.getLogger(ImportDdCollegePaperService.class);
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private PaperRepo paperRepo;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private PaperDetailRepo paperDetailRepo;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private PaperDetailUnitRepo paperDetailUnitRepo;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private QuesRepo quesRepo;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private CourseService courseService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private QuesPkgPathRepo quesPkgPathRepo;
|
|
|
+
|
|
|
+ public void importDdCollegePaper(MultipartFile dataFile, User user, Long rootOrgId) {
|
|
|
+ String tempDir = PropertyHolder.getString("examcloud.web.sys.tempDataDir");
|
|
|
+ String dir = tempDir + File.separator + UUID.randomUUID() + File.separator;
|
|
|
+ try {
|
|
|
+ File dfile = new File(dir);
|
|
|
+ dfile.mkdirs();
|
|
|
+ File zfile = new File(dir + dataFile.getOriginalFilename());
|
|
|
+ zfile.createNewFile();
|
|
|
+ dataFile.transferTo(zfile);
|
|
|
+ FileUtil.unZip(dfile, zfile);
|
|
|
+ resolvingImportFile(dataFile.getOriginalFilename().split("\\.")[0], dir, user, rootOrgId);
|
|
|
+ } catch (StatusException e) {
|
|
|
+ throw e;
|
|
|
+ } catch (Exception e) {
|
|
|
+ throw new StatusException("100001", "导入试卷失败:" + e.getMessage(), e);
|
|
|
+ } finally {
|
|
|
+ FileUtil.deleteFolder(dir);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private void resolvingImportFile(String courseCode, String dir, User user, Long rootOrgId) throws IOException {
|
|
|
+ XSSFWorkbook wb = null;
|
|
|
+ try {
|
|
|
+ wb = new XSSFWorkbook(dir + courseCode + ".xlsx");
|
|
|
+ XSSFSheet sheet0 = wb.getSheetAt(0);
|
|
|
+ Course course = courseService.getCourse(rootOrgId, courseCode);
|
|
|
+ if (course == null) {
|
|
|
+ throw new StatusException("200002", "课程信息不存在");
|
|
|
+ }
|
|
|
+ List<TestPaper> papers = new ArrayList<>();
|
|
|
+ for (int i = 1; i <= sheet0.getLastRowNum(); i++) {
|
|
|
+ XSSFRow row = sheet0.getRow(i);
|
|
|
+ TestPaper tp = new TestPaper();
|
|
|
+ tp.setId(row.getCell(0).getStringCellValue());
|
|
|
+ tp.setName(row.getCell(1).getStringCellValue());
|
|
|
+ tp.setTestPaperContentId(row.getCell(2).getStringCellValue());
|
|
|
+ tp.setScore(getDoubleByString(row.getCell(3).getStringCellValue()));
|
|
|
+ papers.add(tp);
|
|
|
+ }
|
|
|
+ if (papers == null || papers.size() == 0) {
|
|
|
+ throw new StatusException("200001", "试卷信息为空");
|
|
|
+ }
|
|
|
+ int quesSheetIndex = 1;
|
|
|
+ for (TestPaper testPaper : papers) {
|
|
|
+ // 查询试题详情
|
|
|
+ XSSFSheet quesheet = wb.getSheetAt(quesSheetIndex);
|
|
|
+ List<TestQuestion> questions = queryTestPaper(dir, quesheet);
|
|
|
+ quesSheetIndex++;
|
|
|
+ // 构建大题和小题对应关系
|
|
|
+ Map<Integer, List<TestQuestion>> map = sortPaperDetail(questions);
|
|
|
+ // 初始化试卷
|
|
|
+ Paper paper = initPaper(testPaper, rootOrgId + "", course, map, user);
|
|
|
+ // 定义大题集合
|
|
|
+ List<PaperDetail> paperDetails = new ArrayList<>();
|
|
|
+ // 定义小题集合
|
|
|
+ List<PaperDetailUnit> paperDetailUnits = new ArrayList<>();
|
|
|
+ // 试题---资源 对应关系
|
|
|
+ Map<Question, QuestionPkgPath> map2 = new HashMap<>();
|
|
|
+ // 定义试卷难度
|
|
|
+ double difficulty = 0;
|
|
|
+ int error = 1;
|
|
|
+ for (Integer key : map.keySet()) {
|
|
|
+ List<TestQuestion> dQuestions = map.get(key);
|
|
|
+ // 初始化大题对象
|
|
|
+ PaperDetail paperDetail = initPaperDetail(dQuestions, paper, user);
|
|
|
+ if (dQuestions != null && dQuestions.size() > 0) {
|
|
|
+ for (TestQuestion testQuestion : dQuestions) {
|
|
|
+ TestQuestionInfo testQuestionInfo = JsonUtil.fromJson(testQuestion.getJson(),
|
|
|
+ TestQuestionInfo.class);
|
|
|
+ // 初始化试题对象
|
|
|
+ Question question = null;
|
|
|
+ try {
|
|
|
+ question = initQuestion(testQuestionInfo, testQuestion, course, map2, difficulty, dir,
|
|
|
+ quesheet);
|
|
|
+ } catch (Exception e) {
|
|
|
+ throw new StatusException("600001",
|
|
|
+ "初始化试题失败 courseCode:" + courseCode + " 试卷内容ID:"
|
|
|
+ + testPaper.getTestPaperContentId() + " 错误题号:" + error + " 试题ID:"
|
|
|
+ + testQuestion.getId() + " " + e.getMessage());
|
|
|
+ }
|
|
|
+ // 初始化小题对象
|
|
|
+ PaperDetailUnit paperDetailUnit = initPaperDetailUnit(paper, paperDetail, question,
|
|
|
+ testQuestion, user);
|
|
|
+ paperDetailUnits.add(paperDetailUnit);
|
|
|
+ error++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ paperDetails.add(paperDetail);
|
|
|
+ }
|
|
|
+ // 保存试题资源
|
|
|
+ quesPkgPathRepo.saveAll(map2.values());
|
|
|
+ for (Map.Entry<Question, QuestionPkgPath> entry : map2.entrySet()) {
|
|
|
+ entry.getKey().setQuesPkgPathId(entry.getValue().getId());
|
|
|
+ }
|
|
|
+ // 计算试卷难度
|
|
|
+ paper.setDifficultyDegree(0.5);
|
|
|
+ // 重新计算试题序号
|
|
|
+ Map<PaperDetail, List<PaperDetailUnit>> map3 = new LinkedHashMap<>();
|
|
|
+ List<PaperDetailUnit> newList = null;
|
|
|
+ for (PaperDetail paperDetail : paperDetails) {
|
|
|
+ for (PaperDetailUnit paperDetailUnit : paperDetailUnits) {
|
|
|
+ if (paperDetail.getName().equals(paperDetailUnit.getPaperDetail().getName())) {
|
|
|
+ if (map3.get(paperDetail) == null) {
|
|
|
+ newList = new ArrayList<>();
|
|
|
+ newList.add(paperDetailUnit);
|
|
|
+ } else {
|
|
|
+ newList = map3.get(paperDetail);
|
|
|
+ newList.add(paperDetailUnit);
|
|
|
+ }
|
|
|
+ map3.put(paperDetail, newList);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ int number = 1;
|
|
|
+ for (Map.Entry<PaperDetail, List<PaperDetailUnit>> entry : map3.entrySet()) {
|
|
|
+ for (PaperDetailUnit paperDetailUnit : entry.getValue()) {
|
|
|
+ paperDetailUnit.setNumber(number);
|
|
|
+ number++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ quesRepo.saveAll(map2.keySet());
|
|
|
+ paperRepo.save(paper);
|
|
|
+ paperDetailRepo.saveAll(paperDetails);
|
|
|
+ paperDetailUnitRepo.saveAll(paperDetailUnits);
|
|
|
+ }
|
|
|
+
|
|
|
+ } finally {
|
|
|
+ if (wb != null) {
|
|
|
+ wb.close();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private List<TestQuestion> queryTestPaper(String dir, XSSFSheet sheet) {
|
|
|
+ List<TestQuestion> questions = new ArrayList<TestQuestion>();
|
|
|
+ for (int i = 1; i <= sheet.getLastRowNum(); i++) {
|
|
|
+ XSSFRow row = sheet.getRow(i);
|
|
|
+ String pid = row.getCell(5).getStringCellValue();
|
|
|
+ if ("00000000000000000000000000000000".equals(pid)) {
|
|
|
+ TestQuestion tq = new TestQuestion();
|
|
|
+ tq.setId(row.getCell(0).getStringCellValue());
|
|
|
+ tq.setdNumber(getIntByString(row.getCell(1).getStringCellValue()));
|
|
|
+ tq.setdName(row.getCell(2).getStringCellValue());
|
|
|
+ tq.setNumber(getIntByString(row.getCell(3).getStringCellValue()));
|
|
|
+ tq.setScore(getDoubleByString(row.getCell(4).getStringCellValue()));
|
|
|
+ tq.setParentId(row.getCell(5).getStringCellValue());
|
|
|
+ tq.setType(getIntByString(row.getCell(6).getStringCellValue()));
|
|
|
+ File quesJson = new File(dir + tq.getId() + ".txt");
|
|
|
+ if (!quesJson.exists()) {
|
|
|
+ throw new StatusException("300002", "试题信息文件不存在");
|
|
|
+ }
|
|
|
+ tq.setJson(FileUtil.readFileContent(quesJson));
|
|
|
+ questions.add(tq);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (questions.size() == 0) {
|
|
|
+ throw new StatusException("300001", "试题信息为空");
|
|
|
+ }
|
|
|
+ return questions;
|
|
|
+ }
|
|
|
+
|
|
|
+ private Integer getIntByString(String v) {
|
|
|
+ if (StringUtils.isEmpty(v)) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ return Integer.valueOf(v);
|
|
|
+ }
|
|
|
+
|
|
|
+ private Double getDoubleByString(String v) {
|
|
|
+ if (StringUtils.isEmpty(v)) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ return Double.valueOf(v);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 将大题和小题分类
|
|
|
+ private Map<Integer, List<TestQuestion>> sortPaperDetail(List<TestQuestion> questions) {
|
|
|
+ Map<Integer, List<TestQuestion>> map = new HashMap<>();
|
|
|
+ List<TestQuestion> sortQuestions = null;
|
|
|
+ for (TestQuestion testQuestion : questions) {
|
|
|
+ if (map.get(testQuestion.getdNumber()) == null) {
|
|
|
+ sortQuestions = new ArrayList<TestQuestion>();
|
|
|
+ sortQuestions.add(testQuestion);
|
|
|
+ } else {
|
|
|
+ sortQuestions = map.get(testQuestion.getdNumber());
|
|
|
+ sortQuestions.add(testQuestion);
|
|
|
+ }
|
|
|
+ map.put(testQuestion.getdNumber(), sortQuestions);
|
|
|
+ }
|
|
|
+ return map;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 初始化试卷对象
|
|
|
+ private Paper initPaper(TestPaper testPaper, String orgId, Course course, Map<Integer, List<TestQuestion>> map,
|
|
|
+ User user) {
|
|
|
+ int unitCount = 0;
|
|
|
+ Set<Integer> paperDetails = map.keySet();
|
|
|
+ for (Map.Entry<Integer, List<TestQuestion>> entry : map.entrySet()) {
|
|
|
+ unitCount = unitCount + entry.getValue().size();
|
|
|
+ }
|
|
|
+ Paper paper = new Paper();
|
|
|
+ paper.setName(testPaper.getName());
|
|
|
+ paper.setTitle(testPaper.getName());
|
|
|
+ paper.setPaperType(PaperType.IMPORT);
|
|
|
+ paper.setPaperStatus(PaperStatus.DRAFT);
|
|
|
+ paper.setOrgId(orgId);
|
|
|
+ paper.setCreator(user.getDisplayName());
|
|
|
+ paper.setTotalScore(testPaper.getScore());
|
|
|
+ paper.setCourse(course);
|
|
|
+ paper.setCourseName(course.getName());
|
|
|
+ paper.setCourseNo(course.getCode());
|
|
|
+ paper.setCreateTime(CommonUtils.getCurDateTime());
|
|
|
+ paper.setPaperDetailCount(paperDetails.size());
|
|
|
+ paper.setUnitCount(unitCount);
|
|
|
+ return paper;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 初始化大题对象
|
|
|
+ private PaperDetail initPaperDetail(List<TestQuestion> dQuestions, Paper paper, User user) {
|
|
|
+ // 定义大题分数
|
|
|
+ double dTotal = 0;
|
|
|
+ PaperDetail paperDetail = new PaperDetail();
|
|
|
+ if (dQuestions != null && dQuestions.size() > 0) {
|
|
|
+ for (TestQuestion question : dQuestions) {
|
|
|
+ dTotal = dTotal + question.getScore();
|
|
|
+ }
|
|
|
+ paperDetail.setPaper(paper);
|
|
|
+ paperDetail.setNumber(dQuestions.get(0).getdNumber());
|
|
|
+ paperDetail.setName(dQuestions.get(0).getdName());
|
|
|
+ paperDetail.setScore(dTotal);
|
|
|
+ paperDetail.setUnitCount(dQuestions.size());
|
|
|
+ paperDetail.setCreator(user.getDisplayName());
|
|
|
+ paperDetail.setCreateTime(CommonUtils.getCurDateTime());
|
|
|
+ }
|
|
|
+ return paperDetail;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 初始化试题对象
|
|
|
+ private Question initQuestion(TestQuestionInfo testQuestionInfo, TestQuestion testQuestion, Course course,
|
|
|
+ Map<Question, QuestionPkgPath> map, double difficulty, String dir, XSSFSheet sheet) throws Exception {
|
|
|
+ Question question = new Question();
|
|
|
+ question.setCreateTime(CommonUtils.getCurDateTime());
|
|
|
+ question.setScore(testQuestion.getScore());
|
|
|
+ question.setCourse(course);
|
|
|
+ question.setOrgId(course.getOrgId());
|
|
|
+ question.setHasAudio(false);
|
|
|
+ question.setDifficulty("中");
|
|
|
+ question.setDifficultyDegree(0.5);
|
|
|
+ question.setPublicity(true);
|
|
|
+ // 按试题分类初始化题干,答案,选项
|
|
|
+ initQuestionInfo(question, testQuestionInfo, map, testQuestion, dir, sheet);
|
|
|
+ difficulty = question.getScore() * 0.5 + difficulty;
|
|
|
+ return question;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 初始化题干,答案,选项,资源
|
|
|
+ private void initQuestionInfo(Question question, TestQuestionInfo testQuestionInfo,
|
|
|
+ Map<Question, QuestionPkgPath> map, TestQuestion testQuestion, String dir, XSSFSheet sheet)
|
|
|
+ throws Exception {
|
|
|
+ WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
|
|
|
+ // 选词填空
|
|
|
+ if (testQuestionInfo.getQuestionType() == 14) {
|
|
|
+ String quesBody = testQuestionInfo.getQuestionHTML();
|
|
|
+ // 去掉<span>标签中的lang
|
|
|
+ quesBody = replaceLang(quesBody);
|
|
|
+ // 获取img标签
|
|
|
+ LinkedHashMap<String, String> bodyImgList = imgList(quesBody);
|
|
|
+ if (bodyImgList != null && bodyImgList.size() > 0) {
|
|
|
+ int number = 1;
|
|
|
+ for (Map.Entry<String, String> entry : bodyImgList.entrySet()) {
|
|
|
+ if (StringUtils.isBlank(entry.getValue())) {
|
|
|
+ quesBody = quesBody.replace(entry.getKey(), "##" + number + "##");
|
|
|
+ number++;
|
|
|
+ } else {
|
|
|
+ quesBody = quesBody.replace(entry.getKey(), entry.getValue());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ question.setQuesBody("<p>" + quesBody + "</p>");
|
|
|
+ question.setQuesBodyWord(
|
|
|
+ DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(question.getQuesBody())));
|
|
|
+ question.setQuestionType(QuesStructType.NESTED_ANSWER_QUESTION);
|
|
|
+ List<Question> subQuestions = initSubQuestionsByOther(testQuestionInfo, wordMLPackage);
|
|
|
+ question.setSubQuestions(subQuestions);
|
|
|
+ }
|
|
|
+ // 阅读理解题
|
|
|
+ if (testQuestionInfo.getQuestionType() == 42) {
|
|
|
+ String quesBody = testQuestionInfo.getQuestionHTML();
|
|
|
+ // 去掉<span>标签中的lang
|
|
|
+ quesBody = replaceLang(quesBody);
|
|
|
+ // 获取img标签
|
|
|
+ LinkedHashMap<String, String> bodyImgList = imgList(quesBody);
|
|
|
+ // 替换、补全Img标签
|
|
|
+ quesBody = replaceImg(bodyImgList, quesBody);
|
|
|
+ question.setQuesBody("<p>" + quesBody + "</p>");
|
|
|
+ question.setQuesBodyWord(
|
|
|
+ DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(question.getQuesBody())));
|
|
|
+ question.setQuestionType(QuesStructType.NESTED_ANSWER_QUESTION);
|
|
|
+ List<Question> subQues = new ArrayList<Question>();
|
|
|
+ // 查询所有子题
|
|
|
+ List<TestQuestion> subQuestions = querySubQuestions(testQuestion.getId(), dir, sheet);
|
|
|
+ if (subQuestions != null && subQuestions.size() > 0) {
|
|
|
+ for (TestQuestion testQuestion2 : subQuestions) {
|
|
|
+ TestQuestionInfo testQuestionInfo2 = JsonUtil.fromJson(testQuestion2.getJson(),
|
|
|
+ TestQuestionInfo.class);
|
|
|
+ Question subQuestion = new Question();
|
|
|
+ subQuestion.setDifficulty("中");
|
|
|
+ subQuestion.setDifficultyDegree(0.5);
|
|
|
+ subQuestion.setPublicity(true);
|
|
|
+ // 按试题分类初始化题干,答案,选项
|
|
|
+ initQuestionInfo(subQuestion, testQuestionInfo2, map, testQuestion2, dir, sheet);
|
|
|
+ subQues.add(subQuestion);
|
|
|
+ }
|
|
|
+ question.setSubQuestions(subQues);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 完形填空题
|
|
|
+ if (testQuestionInfo.getQuestionType() == 15) {
|
|
|
+ String quesBody = testQuestionInfo.getQuestionHTML();
|
|
|
+ // 去掉<span>标签中的lang
|
|
|
+ quesBody = replaceLang(quesBody);
|
|
|
+ // 获取img标签
|
|
|
+ LinkedHashMap<String, String> bodyImgList = imgList(quesBody);
|
|
|
+ if (bodyImgList != null && bodyImgList.size() > 0) {
|
|
|
+ int number = 1;
|
|
|
+ for (Map.Entry<String, String> entry : bodyImgList.entrySet()) {
|
|
|
+ if (StringUtils.isBlank(entry.getValue())) {
|
|
|
+ quesBody = quesBody.replace(entry.getKey(), "##" + number + "##");
|
|
|
+ number++;
|
|
|
+ } else {
|
|
|
+ quesBody = quesBody.replace(entry.getKey(), entry.getValue());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ question.setQuesBody("<p>" + quesBody + "</p>");
|
|
|
+ question.setQuesBodyWord(
|
|
|
+ DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(question.getQuesBody())));
|
|
|
+ question.setQuestionType(QuesStructType.NESTED_ANSWER_QUESTION);
|
|
|
+ // 获取所有选项
|
|
|
+ List<TestFillAnswer> blanks = testQuestionInfo.getBlanks();
|
|
|
+ List<Question> subQuestions = initSubQuestions(blanks, wordMLPackage);
|
|
|
+ question.setSubQuestions(subQuestions);
|
|
|
+ }
|
|
|
+ // 问答题 、 名词解释
|
|
|
+ if (testQuestionInfo.getQuestionType() == 60 || testQuestionInfo.getQuestionType() == 69) {
|
|
|
+ String quesBody = testQuestionInfo.getQuestionHTML();
|
|
|
+ // 去掉<span>标签中的lang
|
|
|
+ quesBody = replaceLang(quesBody);
|
|
|
+ // 获取img标签
|
|
|
+ LinkedHashMap<String, String> bodyImgList = imgList(quesBody);
|
|
|
+ // 替换、补全Img标签
|
|
|
+ quesBody = replaceImg(bodyImgList, quesBody);
|
|
|
+ question.setQuesBody("<p>" + quesBody + "</p>");
|
|
|
+ question.setQuesBodyWord(
|
|
|
+ DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(question.getQuesBody())));
|
|
|
+ question.setQuestionType(QuesStructType.TEXT_ANSWER_QUESTION);
|
|
|
+ String answer = testQuestionInfo.getAnswer();
|
|
|
+ // 去掉<span>标签中的lang
|
|
|
+ answer = replaceLang(answer);
|
|
|
+ // 获取img标签
|
|
|
+ LinkedHashMap<String, String> answerImgList = imgList(answer);
|
|
|
+ // 替换、补全Img标签
|
|
|
+ answer = replaceImg(answerImgList, answer);
|
|
|
+ question.setQuesAnswer("<p>" + answer + "</p>");
|
|
|
+ question.setQuesAnswerWord(
|
|
|
+ DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(question.getQuesAnswer())));
|
|
|
+ }
|
|
|
+ // 单选题
|
|
|
+ if (testQuestionInfo.getQuestionType() == 11) {
|
|
|
+ String quesBody = testQuestionInfo.getQuestionHTML();
|
|
|
+ // 去掉<span>标签中的lang
|
|
|
+ quesBody = replaceLang(quesBody);
|
|
|
+ // 获取img标签
|
|
|
+ LinkedHashMap<String, String> bodyImgList = imgList(quesBody);
|
|
|
+ // 替换、补全Img标签
|
|
|
+ quesBody = replaceImg(bodyImgList, quesBody);
|
|
|
+ question.setQuesBody("<p>" + quesBody + "</p>");
|
|
|
+ question.setQuesBodyWord(
|
|
|
+ DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(question.getQuesBody())));
|
|
|
+ question.setQuestionType(QuesStructType.SINGLE_ANSWER_QUESTION);
|
|
|
+ List<QuesOption> quesOptions = new ArrayList<QuesOption>();
|
|
|
+ List<TestOption> options = testQuestionInfo.getOptions();
|
|
|
+ Integer answerNumber = null;
|
|
|
+ if (options != null && options.size() > 0) {
|
|
|
+ int number = 1;
|
|
|
+ short isCorrect = 0;
|
|
|
+ for (TestOption testOption : options) {
|
|
|
+ if (testOption.getID().equals(testQuestionInfo.getAnswerId())) {
|
|
|
+ isCorrect = 1;
|
|
|
+ answerNumber = number;
|
|
|
+ } else {
|
|
|
+ isCorrect = 0;
|
|
|
+ }
|
|
|
+ QuesOption quesOption = initQuesOption(testOption, number, isCorrect, wordMLPackage);
|
|
|
+ quesOptions.add(quesOption);
|
|
|
+ number++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ question.setQuesOptions(quesOptions);
|
|
|
+ if (answerNumber != null) {
|
|
|
+ char c1 = (char) (answerNumber + 64);
|
|
|
+ question.setQuesAnswer(String.valueOf(c1));
|
|
|
+ question.setQuesAnswerWord(DocxProcessUtil.html2Docx(wordMLPackage,
|
|
|
+ CommonUtils.formatHtml("<p>" + question.getQuesAnswer() + "</p>")));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 多选题
|
|
|
+ if (testQuestionInfo.getQuestionType() == 12) {
|
|
|
+ String quesBody = testQuestionInfo.getQuestionHTML();
|
|
|
+ // 去掉<span>标签中的lang
|
|
|
+ quesBody = replaceLang(quesBody);
|
|
|
+ // 获取img标签
|
|
|
+ LinkedHashMap<String, String> bodyImgList = imgList(quesBody);
|
|
|
+ // 替换、补全Img标签
|
|
|
+ quesBody = replaceImg(bodyImgList, quesBody);
|
|
|
+ question.setQuesBody("<p>" + quesBody + "</p>");
|
|
|
+ question.setQuesBodyWord(
|
|
|
+ DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(question.getQuesBody())));
|
|
|
+ question.setQuestionType(QuesStructType.MULTIPLE_ANSWER_QUESTION);
|
|
|
+ List<QuesOption> quesOptions = new ArrayList<QuesOption>();
|
|
|
+ List<TestOption> options = testQuestionInfo.getOptions();
|
|
|
+ List<Integer> answerNumbers = new ArrayList<Integer>();
|
|
|
+ if (options != null && options.size() > 0) {
|
|
|
+ int number = 1;
|
|
|
+ short isCorrect = 0;
|
|
|
+ for (TestOption testOption : options) {
|
|
|
+ if (testQuestionInfo.getAnswers().contains(testOption.getID())) {
|
|
|
+ isCorrect = 1;
|
|
|
+ answerNumbers.add(number);
|
|
|
+ } else {
|
|
|
+ isCorrect = 0;
|
|
|
+ }
|
|
|
+ QuesOption quesOption = initQuesOption(testOption, number, isCorrect, wordMLPackage);
|
|
|
+ quesOptions.add(quesOption);
|
|
|
+ number++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ question.setQuesOptions(quesOptions);
|
|
|
+ if (answerNumbers != null && answerNumbers.size() > 0) {
|
|
|
+ String answers = "";
|
|
|
+ for (Integer number : answerNumbers) {
|
|
|
+ char c1 = (char) (number + 64);
|
|
|
+ if (StringUtils.isBlank(answers)) {
|
|
|
+ answers = String.valueOf(c1);
|
|
|
+ } else {
|
|
|
+ answers = answers + "," + String.valueOf(c1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ question.setQuesAnswer(answers);
|
|
|
+ question.setQuesAnswerWord(DocxProcessUtil.html2Docx(wordMLPackage,
|
|
|
+ CommonUtils.formatHtml("<p>" + question.getQuesAnswer() + "</p>")));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 填空题 ###
|
|
|
+ if (testQuestionInfo.getQuestionType() == 13) {
|
|
|
+ String quesBody = testQuestionInfo.getQuestionHTML();
|
|
|
+ // 去掉<span>标签中的lang
|
|
|
+ quesBody = replaceLang(quesBody);
|
|
|
+ // 获取img标签
|
|
|
+ LinkedHashMap<String, String> imgList = imgList(quesBody);
|
|
|
+ if (imgList != null && imgList.size() > 0) {
|
|
|
+ for (Map.Entry<String, String> entry : imgList.entrySet()) {
|
|
|
+ if (StringUtils.isBlank(entry.getValue())) {
|
|
|
+ quesBody = quesBody.replace(entry.getKey(), "(###)");
|
|
|
+ } else {
|
|
|
+ quesBody = quesBody.replace(entry.getKey(), entry.getValue());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ question.setQuesBody("<p>" + quesBody + "</p>");
|
|
|
+ question.setQuesBodyWord(
|
|
|
+ DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(question.getQuesBody())));
|
|
|
+ question.setQuestionType(QuesStructType.FILL_BLANK_QUESTION);
|
|
|
+ String answer = "";
|
|
|
+ List<TestFillAnswer> blanks = testQuestionInfo.getBlanks();
|
|
|
+ if (blanks != null && blanks.size() > 0) {
|
|
|
+ for (TestFillAnswer testFillAnswer : blanks) {
|
|
|
+ List<TestFillContent> answers = testFillAnswer.getAnswers();
|
|
|
+ if (answers != null && answers.size() > 0) {
|
|
|
+ for (TestFillContent testFillContent : answers) {
|
|
|
+ if (StringUtils.isBlank(answer)) {
|
|
|
+ answer = testFillContent.getContent();
|
|
|
+ } else {
|
|
|
+ answer = answer + "##" + testFillContent.getContent();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 去掉<span>标签中的lang
|
|
|
+ answer = replaceLang(answer);
|
|
|
+ // 获取img标签
|
|
|
+ LinkedHashMap<String, String> answerImgList = imgList(answer);
|
|
|
+ // 替换、补全Img标签
|
|
|
+ answer = replaceImg(answerImgList, answer);
|
|
|
+ question.setQuesAnswer("<p>" + answer + "</p>");
|
|
|
+ question.setQuesAnswerWord(
|
|
|
+ DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(question.getQuesAnswer())));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 判断题
|
|
|
+ if (testQuestionInfo.getQuestionType() == 20) {
|
|
|
+ String quesBody = testQuestionInfo.getQuestionHTML();
|
|
|
+ // 去掉<span>标签中的lang
|
|
|
+ quesBody = replaceLang(quesBody);
|
|
|
+ // 获取img标签
|
|
|
+ LinkedHashMap<String, String> bodyImgList = imgList(quesBody);
|
|
|
+ // 替换、补全Img标签
|
|
|
+ quesBody = replaceImg(bodyImgList, quesBody);
|
|
|
+ question.setQuesBody("<p>" + quesBody + "</p>");
|
|
|
+ question.setQuesBodyWord(
|
|
|
+ DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(question.getQuesBody())));
|
|
|
+ question.setQuestionType(QuesStructType.BOOL_ANSWER_QUESTION);
|
|
|
+ String answer = testQuestionInfo.getAnswer();
|
|
|
+ if (answer.equals("false")) {
|
|
|
+ answer = "错误";
|
|
|
+ } else {
|
|
|
+ answer = "正确";
|
|
|
+ }
|
|
|
+ question.setQuesAnswer(answer);
|
|
|
+ question.setQuesAnswerWord(DocxProcessUtil.html2Docx(wordMLPackage,
|
|
|
+ CommonUtils.formatHtml("<p>" + question.getQuesAnswer() + "</p>")));
|
|
|
+ }
|
|
|
+ byte[] pkgByte = DocxProcessUtil.getPkgByte(wordMLPackage);
|
|
|
+ QuestionPkgPath quesPkgPath = new QuestionPkgPath(pkgByte);
|
|
|
+ map.put(question, quesPkgPath);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 去除<span> 标签中lang = EN - US
|
|
|
+ private String replaceLang(String str) {
|
|
|
+ if (str.contains("lang=EN-US")) {
|
|
|
+ str = str.replace("lang=EN-US", "");
|
|
|
+ }
|
|
|
+ if (str.contains("alt=\"\u0012\"")) {
|
|
|
+ str = str.replace("alt=\"\u0012\"", "alt=\"\"");
|
|
|
+ }
|
|
|
+ if (str.contains("alt=\"\"")) {
|
|
|
+ str = str.replace("alt=\"\"", "alt=\"\"");
|
|
|
+ }
|
|
|
+ if (str.contains("\u000b")) {
|
|
|
+ str = str.replaceAll("\u000b", "");
|
|
|
+ }
|
|
|
+ if (str.contains("�")) {
|
|
|
+ str = str.replaceAll("�", "");
|
|
|
+ }
|
|
|
+ if (str.contains(
|
|
|
+ "<img width=\"25\" height=\"23\" src=\"/UploadFiles/Import/Image/3cf48167-932f-4ae6-be69-37520a02cd23_.png\"/>")) {
|
|
|
+ str = str.replaceAll(
|
|
|
+ "<img width=\"25\" height=\"23\" src=\"/UploadFiles/Import/Image/3cf48167-932f-4ae6-be69-37520a02cd23_.png\"/>",
|
|
|
+ "图片缺失");
|
|
|
+ }
|
|
|
+ if (str.contains(
|
|
|
+ "<img width=\"25\" height=\"23\" src=\"/UploadFiles/Import/Image/3cf48167-932f-4ae6-be69-37520a02cd23_.png\"/>")) {
|
|
|
+ str = str.replaceAll(
|
|
|
+ "<img width=\"25\" height=\"23\" src=\"/UploadFiles/Import/Image/3cf48167-932f-4ae6-be69-37520a02cd23_.png\"/>",
|
|
|
+ "图片缺失");
|
|
|
+ }
|
|
|
+ if (str.contains(
|
|
|
+ "<img width=\"24\" height=\"24\" src=\"/UploadFiles/Import/Image/811ae8b2-4d74-4cc2-a8a3-9665e5e810c1_.png\"/>")) {
|
|
|
+ str = str.replaceAll(
|
|
|
+ "<img width=\"24\" height=\"24\" src=\"/UploadFiles/Import/Image/811ae8b2-4d74-4cc2-a8a3-9665e5e810c1_.png\"/>",
|
|
|
+ "图片缺失");
|
|
|
+ }
|
|
|
+ if (str.contains("<img width=\"12\" height=\"13\" src=\"管理会计%20专升本.files/image001.png\">")) {
|
|
|
+ str = str.replaceAll("<img width=\"12\" height=\"13\" src=\"管理会计%20专升本.files/image001.png\">", "图片缺失");
|
|
|
+ }
|
|
|
+ if (str.contains(
|
|
|
+ "<img style=\"max-width: 600px; height: auto\" alt=\"\" src=\"/UploadFiles/刘晓平/Images/OnlineExam20180709151328.png\" />")) {
|
|
|
+ str = str.replaceAll(
|
|
|
+ "<img style=\"max-width: 600px; height: auto\" alt=\"\" src=\"/UploadFiles/刘晓平/Images/OnlineExam20180709151328.png\" />",
|
|
|
+ "图片缺失");
|
|
|
+ }
|
|
|
+ if (str.contains("<img width=\"52\" height=\"45\" src=\"机械制造工艺学%20专升本%20综合测试2.files/image002.png\">")) {
|
|
|
+ str = str.replaceAll("<img width=\"52\" height=\"45\" src=\"机械制造工艺学%20专升本%20综合测试2.files/image002.png\">",
|
|
|
+ "图片缺失");
|
|
|
+ }
|
|
|
+ if (str.contains(
|
|
|
+ "<img width=\"25\" height=\"23\" src=\"/UploadFiles/Import/Image/001d24f0-a007-4c13-8cb4-2a138d0545ae_.png\"/>")) {
|
|
|
+ str = str.replaceAll(
|
|
|
+ "<img width=\"25\" height=\"23\" src=\"/UploadFiles/Import/Image/001d24f0-a007-4c13-8cb4-2a138d0545ae_.png\"/>",
|
|
|
+ "图片缺失");
|
|
|
+ }
|
|
|
+ if (str.contains("<img src=\"/UploadFiles/李家林/Images/OnlineExam20140312164501.png\" alt=\"\" />")) {
|
|
|
+ str = str.replaceAll("<img src=\"/UploadFiles/李家林/Images/OnlineExam20140312164501.png\" alt=\"\" />",
|
|
|
+ "图片缺失");
|
|
|
+ }
|
|
|
+ if (str.contains(
|
|
|
+ "<img width=\"25\" height=\"23\" src=\"/UploadFiles/Import/Image/001d24f0-a007-4c13-8cb4-2a138d0545ae_.png\"/>")) {
|
|
|
+ str = str.replaceAll(
|
|
|
+ "<img width=\"25\" height=\"23\" src=\"/UploadFiles/Import/Image/001d24f0-a007-4c13-8cb4-2a138d0545ae_.png\"/>",
|
|
|
+ "图片缺失");
|
|
|
+ }
|
|
|
+ if (str.contains(
|
|
|
+ "<img width=\"24\" height=\"24\" src=\"/UploadFiles/Import/Image/7828a9f0-5ec4-435d-ac78-cc400bc4cc22_.png\"/>")) {
|
|
|
+ str = str.replaceAll(
|
|
|
+ "<img width=\"24\" height=\"24\" src=\"/UploadFiles/Import/Image/7828a9f0-5ec4-435d-ac78-cc400bc4cc22_.png\"/>",
|
|
|
+ "图片缺失");
|
|
|
+ }
|
|
|
+ if (str.contains("<img alt=\"\" src=\"/UploadFiles/王建军/Images/OnlineExam20160319160348.jpg\" />")) {
|
|
|
+ str = str.replaceAll("<img alt=\"\" src=\"/UploadFiles/王建军/Images/OnlineExam20160319160348.jpg\" />",
|
|
|
+ "图片缺失");
|
|
|
+ }
|
|
|
+
|
|
|
+ // if (str.contains("<")) {
|
|
|
+ // str = str.replace("<", "<");
|
|
|
+ // }
|
|
|
+ // if (str.contains(">")) {
|
|
|
+ // str = str.replace(">", ">");
|
|
|
+ // }
|
|
|
+ // if (str.contains("&")) {
|
|
|
+ // str = str.replaceAll("&", "&");
|
|
|
+ // }
|
|
|
+ // if (str.contains("<")) {
|
|
|
+ // str = str.replaceAll("<", "<");
|
|
|
+ // }
|
|
|
+ // if (str.contains(">")) {
|
|
|
+ // str = str.replaceAll(">", ">");
|
|
|
+ // }
|
|
|
+ return str;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 替换img标签,补全图片
|
|
|
+ private String replaceImg(LinkedHashMap<String, String> imgList, String str) {
|
|
|
+ if (imgList != null && imgList.size() > 0) {
|
|
|
+ for (Map.Entry<String, String> entry : imgList.entrySet()) {
|
|
|
+ if (StringUtils.isBlank(entry.getValue())) {
|
|
|
+ str = str.replace(entry.getKey(), "___");
|
|
|
+ } else {
|
|
|
+ str = str.replace(entry.getKey(), entry.getValue());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return str;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 將url路徑中的中文转码
|
|
|
+ private String regexCH(String str) throws UnsupportedEncodingException {
|
|
|
+ StringBuffer s = new StringBuffer();
|
|
|
+ Pattern pat = Pattern.compile("[\u4E00-\u9FA5]");
|
|
|
+ Matcher mat = pat.matcher(str);
|
|
|
+ while (mat.find()) {
|
|
|
+ s.append(mat.group());
|
|
|
+ }
|
|
|
+ String url = URLEncoder.encode(s.toString(), "utf-8");
|
|
|
+ return str.replace(s.toString(), url);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 去除图片中有下划线的图片,并补全图片下载地址
|
|
|
+ private LinkedHashMap<String, String> imgList(String str) throws Exception {
|
|
|
+ LinkedHashMap<String, String> map = new LinkedHashMap<>();
|
|
|
+ // 获取img标签
|
|
|
+ List<String> srcList = ImgDataUtils.parseImages(str);
|
|
|
+ if (srcList != null && srcList.size() > 0) {
|
|
|
+ for (String img : srcList) {
|
|
|
+ if (img.contains("/Shared/UnderLine")) {
|
|
|
+ map.put(img, "");
|
|
|
+ } else {
|
|
|
+ List<String> parseImageSrc = ImgDataUtils.parseImageSrc(img);
|
|
|
+ if (parseImageSrc != null && parseImageSrc.size() > 0) {
|
|
|
+ String src = parseImageSrc.get(0);
|
|
|
+ String url = regexCH(src);
|
|
|
+ String picture = null;
|
|
|
+ if (url.startsWith("http://ncexam.cug.edu.cn/")) {
|
|
|
+ picture = url;
|
|
|
+ } else {
|
|
|
+ picture = "http://ncexam.cug.edu.cn" + url;
|
|
|
+ }
|
|
|
+ String base64 = ImgDataUtils.loadImageToBase64(picture);
|
|
|
+ if (base64 == null) {
|
|
|
+ throw new StatusException("50001", "图片下载失败" + picture);
|
|
|
+ } else {
|
|
|
+ if (src.contains("jpg")) {
|
|
|
+ map.put(img, img.replace(src, "data:image/jpg;base64," + base64));
|
|
|
+ } else if (src.contains("bmp")) {
|
|
|
+ map.put(img, img.replace(src, "data:image/bmp;base64," + base64));
|
|
|
+ } else {
|
|
|
+ map.put(img, img.replace(src, "data:image/png;base64," + base64));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return map;
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ private List<Question> initSubQuestionsByOther(TestQuestionInfo testQuestionInfo,
|
|
|
+ WordprocessingMLPackage wordMLPackage) throws Exception {
|
|
|
+ List<Question> subQuestions = new ArrayList<Question>();
|
|
|
+ if (testQuestionInfo.getBlanks() != null && testQuestionInfo.getBlanks().size() > 0) {
|
|
|
+ List<TestFillAnswer> blanks = testQuestionInfo.getBlanks();
|
|
|
+ for (TestFillAnswer testFillAnswer : blanks) {
|
|
|
+ Question subQuestion = new Question();
|
|
|
+ subQuestion.setId(IdUtils.uuid());
|
|
|
+ subQuestion.setQuestionType(QuesStructType.SINGLE_ANSWER_QUESTION);
|
|
|
+ subQuestion.setDifficulty("中");
|
|
|
+ subQuestion.setDifficultyDegree(0.5);
|
|
|
+ subQuestion.setPublicity(true);
|
|
|
+ subQuestion.setQuesBody("______");
|
|
|
+ subQuestion.setQuesBodyWord(DocxProcessUtil.html2Docx(wordMLPackage,
|
|
|
+ CommonUtils.formatHtml("<p>" + subQuestion.getQuesBody() + "</p>")));
|
|
|
+ List<QuesOption> quesOptions = new ArrayList<QuesOption>();
|
|
|
+ TestOptionGroup optionGroup = testQuestionInfo.getOptionGroup();
|
|
|
+ List<TestOption> options = optionGroup.getOptions();
|
|
|
+ Integer answerNumber = null;
|
|
|
+ if (options != null && options.size() > 0) {
|
|
|
+ for (TestOption subOption : options) {
|
|
|
+ int subNumber = 1;
|
|
|
+ short isCorrect = 0;
|
|
|
+ if (testFillAnswer.getAnswerId().equals(subOption.getID())) {
|
|
|
+ isCorrect = 1;
|
|
|
+ answerNumber = subNumber;
|
|
|
+ } else {
|
|
|
+ isCorrect = 0;
|
|
|
+ }
|
|
|
+ QuesOption quesOption = initQuesOption(subOption, subNumber, isCorrect, wordMLPackage);
|
|
|
+ quesOptions.add(quesOption);
|
|
|
+ subNumber++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ subQuestion.setQuesOptions(quesOptions);
|
|
|
+ if (answerNumber != null) {
|
|
|
+ char c1 = (char) (answerNumber + 64);
|
|
|
+ subQuestion.setQuesAnswer(String.valueOf(c1));
|
|
|
+ subQuestion.setQuesAnswerWord(DocxProcessUtil.html2Docx(wordMLPackage,
|
|
|
+ CommonUtils.formatHtml("<p>" + subQuestion.getQuesAnswer() + "</p>")));
|
|
|
+ }
|
|
|
+ subQuestions.add(subQuestion);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return subQuestions;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 初始化选项
|
|
|
+ private QuesOption initQuesOption(TestOption testOption, int number, short isCorrect,
|
|
|
+ WordprocessingMLPackage wordMLPackage) throws Exception {
|
|
|
+ QuesOption quesOption = new QuesOption();
|
|
|
+ quesOption.setNumber(String.valueOf(number));
|
|
|
+ quesOption.setIsCorrect(isCorrect);
|
|
|
+ String optionBody = testOption.getOptionHTML();
|
|
|
+ // 去掉<span>标签中的lang
|
|
|
+ optionBody = replaceLang(optionBody);
|
|
|
+ // 获取img标签
|
|
|
+ LinkedHashMap<String, String> optionBodyImgList = imgList(optionBody);
|
|
|
+ // 替换、补全Img标签
|
|
|
+ optionBody = replaceImg(optionBodyImgList, optionBody);
|
|
|
+ quesOption.setOptionBody("<p>" + optionBody + "</p>");
|
|
|
+ quesOption.setOptionBodyWord(
|
|
|
+ DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(quesOption.getOptionBody())));
|
|
|
+ return quesOption;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 根据父ID查询子题
|
|
|
+ private List<TestQuestion> querySubQuestions(String parentId, String dir, XSSFSheet sheet) {
|
|
|
+ List<TestQuestion> questions = new ArrayList<TestQuestion>();
|
|
|
+ for (int i = 1; i <= sheet.getLastRowNum(); i++) {
|
|
|
+ XSSFRow row = sheet.getRow(i);
|
|
|
+ String pid = row.getCell(5).getStringCellValue();
|
|
|
+ if (parentId.equals(pid)) {
|
|
|
+ TestQuestion tq = new TestQuestion();
|
|
|
+ tq.setId(row.getCell(0).getStringCellValue());
|
|
|
+ tq.setdNumber(getIntByString(row.getCell(1).getStringCellValue()));
|
|
|
+ tq.setdName(row.getCell(2).getStringCellValue());
|
|
|
+ tq.setNumber(getIntByString(row.getCell(3).getStringCellValue()));
|
|
|
+ tq.setScore(getDoubleByString(row.getCell(4).getStringCellValue()));
|
|
|
+ tq.setParentId(row.getCell(5).getStringCellValue());
|
|
|
+ tq.setType(getIntByString(row.getCell(6).getStringCellValue()));
|
|
|
+ File quesJson = new File(dir + tq.getId() + ".txt");
|
|
|
+ if (!quesJson.exists()) {
|
|
|
+ throw new StatusException("400002", "试题信息文件不存在");
|
|
|
+ }
|
|
|
+ tq.setJson(FileUtil.readFileContent(quesJson));
|
|
|
+ questions.add(tq);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (questions.size() == 0) {
|
|
|
+ throw new StatusException("400001", "试题信息为空");
|
|
|
+ }
|
|
|
+ return questions;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 完形填空初始化所有子题
|
|
|
+ private List<Question> initSubQuestions(List<TestFillAnswer> blanks, WordprocessingMLPackage wordMLPackage)
|
|
|
+ throws Exception {
|
|
|
+ List<Question> subQuestions = new ArrayList<Question>();
|
|
|
+ if (blanks != null && blanks.size() > 0) {
|
|
|
+ for (TestFillAnswer testFillAnswer : blanks) {
|
|
|
+ Question question = new Question();
|
|
|
+ question.setId(IdUtils.uuid());
|
|
|
+ question.setQuestionType(QuesStructType.SINGLE_ANSWER_QUESTION);
|
|
|
+ question.setDifficulty("中");
|
|
|
+ question.setDifficultyDegree(0.5);
|
|
|
+ question.setPublicity(true);
|
|
|
+ question.setQuesBody("______");
|
|
|
+ question.setQuesBodyWord(DocxProcessUtil.html2Docx(wordMLPackage,
|
|
|
+ CommonUtils.formatHtml("<p>" + question.getQuesBody() + "</p>")));
|
|
|
+ TestOptionGroup optionGroup = testFillAnswer.getOptionGroup();
|
|
|
+ List<QuesOption> quesOptions = new ArrayList<QuesOption>();
|
|
|
+ List<TestOption> subOptions = optionGroup.getOptions();
|
|
|
+ Integer answerNumber = null;
|
|
|
+ if (subOptions != null && subOptions.size() > 0) {
|
|
|
+ int subNumber = 1;
|
|
|
+ short isCorrect = 0;
|
|
|
+ for (TestOption subOption : subOptions) {
|
|
|
+ if (testFillAnswer.getAnswerId().equals(subOption.getID())) {
|
|
|
+ isCorrect = 1;
|
|
|
+ answerNumber = subNumber;
|
|
|
+ } else {
|
|
|
+ isCorrect = 0;
|
|
|
+ }
|
|
|
+ QuesOption quesOption = initQuesOption(subOption, subNumber, isCorrect, wordMLPackage);
|
|
|
+ quesOptions.add(quesOption);
|
|
|
+ subNumber++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ question.setQuesOptions(quesOptions);
|
|
|
+ if (answerNumber != null) {
|
|
|
+ char c1 = (char) (answerNumber + 64);
|
|
|
+ question.setQuesAnswer(String.valueOf(c1));
|
|
|
+ question.setQuesAnswerWord(DocxProcessUtil.html2Docx(wordMLPackage,
|
|
|
+ CommonUtils.formatHtml("<p>" + question.getQuesAnswer() + "</p>")));
|
|
|
+ }
|
|
|
+ subQuestions.add(question);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return subQuestions;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 初始化小题对象
|
|
|
+ private PaperDetailUnit initPaperDetailUnit(Paper paper, PaperDetail paperDetail, Question question,
|
|
|
+ TestQuestion testQuestion, User user) {
|
|
|
+ PaperDetailUnit paperDetailUnit = new PaperDetailUnit();
|
|
|
+ paperDetailUnit.setPaper(paper);
|
|
|
+ paperDetailUnit.setNumber(testQuestion.getNumber());
|
|
|
+ paperDetailUnit.setScore(testQuestion.getScore());
|
|
|
+ paperDetailUnit.setPaperDetail(paperDetail);
|
|
|
+ paperDetailUnit.setQuestionType(question.getQuestionType());
|
|
|
+ paperDetailUnit.setCreator(user.getDisplayName());
|
|
|
+ paperDetailUnit.setCreateTime(CommonUtils.getCurDateTime());
|
|
|
+ paperDetailUnit.setQuestion(question);
|
|
|
+ paperDetailUnit.setPaperType(PaperType.IMPORT);
|
|
|
+ return paperDetailUnit;
|
|
|
+ }
|
|
|
}
|