|
@@ -1,950 +1,1069 @@
|
|
-package com.qmth.cqb.paper.service;
|
|
|
|
-
|
|
|
|
-import java.text.SimpleDateFormat;
|
|
|
|
-import java.util.ArrayList;
|
|
|
|
-import java.util.Collections;
|
|
|
|
-import java.util.Date;
|
|
|
|
-import java.util.HashMap;
|
|
|
|
-import java.util.HashSet;
|
|
|
|
-import java.util.List;
|
|
|
|
-import java.util.Map;
|
|
|
|
-import java.util.Set;
|
|
|
|
-import java.util.regex.Matcher;
|
|
|
|
-import java.util.regex.Pattern;
|
|
|
|
-
|
|
|
|
-import com.qmth.cqb.utils.exception.PaperException;
|
|
|
|
-
|
|
|
|
-import org.apache.commons.lang3.StringUtils;
|
|
|
|
-import org.nlpcn.commons.lang.util.StringUtil;
|
|
|
|
-import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
-import org.springframework.beans.factory.annotation.Value;
|
|
|
|
-import org.springframework.data.domain.Example;
|
|
|
|
-import org.springframework.data.domain.Page;
|
|
|
|
-import org.springframework.data.domain.PageImpl;
|
|
|
|
-import org.springframework.data.domain.PageRequest;
|
|
|
|
-import org.springframework.data.domain.Pageable;
|
|
|
|
-import org.springframework.data.domain.Sort;
|
|
|
|
-import org.springframework.data.domain.Sort.Direction;
|
|
|
|
-import org.springframework.data.domain.Sort.Order;
|
|
|
|
-import org.springframework.data.mongodb.core.MongoTemplate;
|
|
|
|
-import org.springframework.data.mongodb.core.query.Criteria;
|
|
|
|
-import org.springframework.data.mongodb.core.query.Query;
|
|
|
|
-import org.springframework.stereotype.Service;
|
|
|
|
-import org.springframework.util.Assert;
|
|
|
|
-
|
|
|
|
-import com.google.gson.Gson;
|
|
|
|
-import com.qmth.cqb.paper.dao.ExamPaperRepo;
|
|
|
|
-import com.qmth.cqb.paper.dao.PaperDetailRepo;
|
|
|
|
-import com.qmth.cqb.paper.dao.PaperDetailUnitRepo;
|
|
|
|
-import com.qmth.cqb.paper.dao.PaperRepo;
|
|
|
|
-import com.qmth.cqb.paper.dto.PaperDetailExp;
|
|
|
|
-import com.qmth.cqb.paper.dto.PaperDetailUnitExp;
|
|
|
|
-import com.qmth.cqb.paper.dto.PaperExp;
|
|
|
|
-import com.qmth.cqb.paper.model.ExamPaper;
|
|
|
|
-import com.qmth.cqb.paper.model.Paper;
|
|
|
|
-import com.qmth.cqb.paper.model.PaperDetail;
|
|
|
|
-import com.qmth.cqb.paper.model.PaperDetailUnit;
|
|
|
|
-import com.qmth.cqb.paper.model.PaperSearchInfo;
|
|
|
|
-import com.qmth.cqb.question.dao.QuesBakRepo;
|
|
|
|
-import com.qmth.cqb.question.dao.QuesRepo;
|
|
|
|
-import com.qmth.cqb.question.model.QuesOption;
|
|
|
|
-import com.qmth.cqb.question.model.Question;
|
|
|
|
-import com.qmth.cqb.question.model.QuestionBak;
|
|
|
|
-import com.qmth.cqb.question.model.QuestionType;
|
|
|
|
-import com.qmth.cqb.question.service.QuesService;
|
|
|
|
-import com.qmth.cqb.utils.BeanCopierUtil;
|
|
|
|
-import com.qmth.cqb.utils.CommonUtils;
|
|
|
|
-import com.qmth.cqb.utils.enums.PaperStatus;
|
|
|
|
-import com.qmth.cqb.utils.enums.PaperType;
|
|
|
|
-
|
|
|
|
-import cn.com.qmth.examcloud.common.dto.question.enums.QuesStructType;
|
|
|
|
-import cn.com.qmth.examcloud.common.uac.entity.AccessUser;
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- * Created by songyue on 16/12/28.
|
|
|
|
- */
|
|
|
|
-@Service
|
|
|
|
-public class PaperService {
|
|
|
|
-
|
|
|
|
- @Autowired
|
|
|
|
- PaperRepo paperRepo;
|
|
|
|
-
|
|
|
|
- @Autowired
|
|
|
|
- PaperDetailService paperDetailService;
|
|
|
|
-
|
|
|
|
- @Autowired
|
|
|
|
- ExamPaperRepo examPaperRepo;
|
|
|
|
-
|
|
|
|
- @Autowired
|
|
|
|
- PaperDetailRepo paperDetailRepo;
|
|
|
|
-
|
|
|
|
- @Autowired
|
|
|
|
- PaperDetailUnitRepo paperDetailUnitRepo;
|
|
|
|
-
|
|
|
|
- @Autowired
|
|
|
|
- QuesRepo quesRepo;
|
|
|
|
-
|
|
|
|
- @Autowired
|
|
|
|
- QuesBakRepo quesBakRepo;
|
|
|
|
-
|
|
|
|
- @Autowired
|
|
|
|
- Gson gson;
|
|
|
|
-
|
|
|
|
- @Autowired
|
|
|
|
- PaperDetailUnitService paperDetailUnitService;
|
|
|
|
-
|
|
|
|
- @Autowired
|
|
|
|
- QuesService quesService;
|
|
|
|
-
|
|
|
|
- @Autowired
|
|
|
|
- ExtractConfigService extractConfigService;
|
|
|
|
-
|
|
|
|
- @Autowired
|
|
|
|
- private MongoTemplate mongoTemplate;
|
|
|
|
-
|
|
|
|
- @Value("${upyun.radioType}")
|
|
|
|
- protected String radioType;
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * 查询所有已导入试卷
|
|
|
|
- *
|
|
|
|
- * @param paperSearchInfo
|
|
|
|
- * @param curPage
|
|
|
|
- * @param pageSize
|
|
|
|
- * @return
|
|
|
|
- */
|
|
|
|
- public Page<Paper> getImportPapers(PaperSearchInfo paperSearchInfo, int curPage, int pageSize) {
|
|
|
|
- Query query = new Query();
|
|
|
|
- query.addCriteria(Criteria.where("paperType").is(PaperType.IMPORT));
|
|
|
|
- if(StringUtils.isNotBlank(paperSearchInfo.getCourseNo())){
|
|
|
|
- query.addCriteria(Criteria.where("courseNo").is(paperSearchInfo.getCourseNo()));
|
|
|
|
- }
|
|
|
|
- query.addCriteria(Criteria.where("orgId").is(paperSearchInfo.getOrgId()));
|
|
|
|
- long count = this.mongoTemplate.count(query, Paper.class);
|
|
|
|
- query.with(new Sort(new Order(Direction.DESC,"createTime")));
|
|
|
|
- query.limit(pageSize);
|
|
|
|
- query.skip((curPage - 1) * pageSize);
|
|
|
|
- List<Paper> paperList = this.mongoTemplate.find(query, Paper.class);
|
|
|
|
- return new PageImpl<Paper>(paperList, new PageRequest(curPage - 1, pageSize), count);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * 查询所有待审核和审核不通过的导入试卷
|
|
|
|
- *
|
|
|
|
- * @param paperSearchInfo
|
|
|
|
- * @param curPage
|
|
|
|
- * @param pageSize
|
|
|
|
- * @return
|
|
|
|
- */
|
|
|
|
- public Page<Paper> getImportPapersNotSuccess(PaperSearchInfo paperSearchInfo, int curPage, int pageSize) {
|
|
|
|
- Query query = new Query();
|
|
|
|
- if (paperSearchInfo.getPaperStatus() != null) {
|
|
|
|
- query.addCriteria(Criteria.where("paperStatus").is(paperSearchInfo.getPaperStatus()));
|
|
|
|
- } else {
|
|
|
|
- query.addCriteria(Criteria.where("paperStatus").ne(PaperStatus.PASS));
|
|
|
|
- }
|
|
|
|
- query.addCriteria(Criteria.where("paperType").is(PaperType.IMPORT));
|
|
|
|
- query.addCriteria(Criteria.where("orgId").is(paperSearchInfo.getOrgId()));
|
|
|
|
- if (StringUtil.isNotBlank(paperSearchInfo.getCourseNo())) {
|
|
|
|
- query.addCriteria(Criteria.where("courseNo").is(paperSearchInfo.getCourseNo()));
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- long totalNumber = this.mongoTemplate.count(query, Paper.class);
|
|
|
|
- query.limit(pageSize);
|
|
|
|
- query.skip((curPage - 1) * pageSize);
|
|
|
|
- List<Paper> paperList = this.mongoTemplate.find(query, Paper.class);
|
|
|
|
- return new PageImpl<Paper>(paperList, new PageRequest(curPage - 1, pageSize), totalNumber);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * 根据条件查询
|
|
|
|
- *
|
|
|
|
- * @param paperSearchInfo
|
|
|
|
- * @return
|
|
|
|
- */
|
|
|
|
- public List<Paper> getImportPapersBySearch(PaperSearchInfo paperSearchInfo) {
|
|
|
|
- formatPaperSearchInfo(paperSearchInfo);
|
|
|
|
- Paper importPaper = BeanCopierUtil.copyProperties(paperSearchInfo, Paper.class);
|
|
|
|
- importPaper.setPaperType(PaperType.IMPORT);
|
|
|
|
- return paperRepo.findAll(Example.of(importPaper));
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * 根据条件查询
|
|
|
|
- *
|
|
|
|
- * @param paperSearchInfo
|
|
|
|
- * @return
|
|
|
|
- */
|
|
|
|
- public List<Paper> getGenPapersBySearch(PaperSearchInfo paperSearchInfo) {
|
|
|
|
- formatPaperSearchInfo(paperSearchInfo);
|
|
|
|
- Paper genPaper = BeanCopierUtil.copyProperties(paperSearchInfo, Paper.class);
|
|
|
|
- genPaper.setPaperType(PaperType.GENERATE);
|
|
|
|
- return paperRepo.findAll(Example.of(genPaper));
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * 保存试卷
|
|
|
|
- *
|
|
|
|
- * @param paperExp
|
|
|
|
- * @return
|
|
|
|
- */
|
|
|
|
- public Map<String, Object> savePaper(PaperExp paperExp, AccessUser user) {
|
|
|
|
- Map<String, Object> msgMap = new HashMap<String, Object>();
|
|
|
|
- Paper oldPaper = paperRepo.findOne(paperExp.getId());
|
|
|
|
- if (oldPaper != null) {
|
|
|
|
- String oldName = oldPaper.getName().trim();
|
|
|
|
- oldPaper.setTitle(paperExp.getTitle());
|
|
|
|
- oldPaper.setName(paperExp.getName().trim());
|
|
|
|
- oldPaper.setLastModifyName(user.getName());
|
|
|
|
- if (!oldName.equals(paperExp.getName().trim())) {// 假如改变了试卷名称
|
|
|
|
- // 则要效验试卷名称唯一性
|
|
|
|
- String msg = this.checkPaperName(paperExp.getName().trim(), user.getRootOrgId().toString());
|
|
|
|
- if (msg == null) {
|
|
|
|
- paperRepo.save(oldPaper);
|
|
|
|
- msgMap.put("msg", "success");
|
|
|
|
- } else {
|
|
|
|
- msgMap.put("msg", msg);
|
|
|
|
- }
|
|
|
|
- } else {
|
|
|
|
- paperRepo.save(oldPaper);
|
|
|
|
- msgMap.put("msg", "success");
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
- return msgMap;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * 查询所有已组试卷
|
|
|
|
- *
|
|
|
|
- * @param paperSearchInfo
|
|
|
|
- * @param curPage
|
|
|
|
- * @param pageSize
|
|
|
|
- * @return
|
|
|
|
- */
|
|
|
|
- public Page<Paper> getGenPapers(PaperSearchInfo paperSearchInfo, int curPage, int pageSize) {
|
|
|
|
- Query query = new Query();
|
|
|
|
- query.addCriteria(Criteria.where("paperType").is(PaperType.GENERATE.name()));
|
|
|
|
- if(StringUtils.isNotBlank(paperSearchInfo.getCourseNo())){
|
|
|
|
- query.addCriteria(Criteria.where("courseNo").is(paperSearchInfo.getCourseNo()));
|
|
|
|
- }
|
|
|
|
- query.addCriteria(Criteria.where("orgId").is(paperSearchInfo.getOrgId()));
|
|
|
|
- long count = this.mongoTemplate.count(query, Paper.class);
|
|
|
|
- query.with(new Sort(new Order(Direction.DESC,"createTime")));
|
|
|
|
- query.limit(pageSize);
|
|
|
|
- query.skip((curPage - 1) * pageSize);
|
|
|
|
- List<Paper> paperList = this.mongoTemplate.find(query, Paper.class);
|
|
|
|
- return new PageImpl<Paper>(paperList, new PageRequest(curPage - 1, pageSize), count);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * 查询考试试卷
|
|
|
|
- *
|
|
|
|
- * @param id
|
|
|
|
- * @param courseCode
|
|
|
|
- * @param groupCode
|
|
|
|
- * @return
|
|
|
|
- */
|
|
|
|
- public List<Paper> listExamPapers(long id, String courseCode, String groupCode) {
|
|
|
|
- List<Paper> papers = new ArrayList<Paper>();
|
|
|
|
- ExamPaper examPaper = new ExamPaper();
|
|
|
|
- examPaper.setExamId(id);
|
|
|
|
- examPaper.setCourseCode(courseCode);
|
|
|
|
- examPaper.setGroupCode(groupCode);
|
|
|
|
- Example<ExamPaper> example = Example.of(examPaper);
|
|
|
|
- List<ExamPaper> examPapers = examPaperRepo.findAll(example);
|
|
|
|
- for (ExamPaper ePaper : examPapers) {
|
|
|
|
- Paper paper = paperRepo.findOne(ePaper.getPaper().getId());
|
|
|
|
- papers.add(paper);
|
|
|
|
- }
|
|
|
|
- return papers;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * 设置考试试卷
|
|
|
|
- *
|
|
|
|
- * @param examId
|
|
|
|
- * @param courseCode
|
|
|
|
- * @param groupCode
|
|
|
|
- * @param paperId
|
|
|
|
- * @return
|
|
|
|
- */
|
|
|
|
- public void joinToExamPaper(long examId, String courseCode, String groupCode, String paperId) {
|
|
|
|
- ExamPaper examPaper = new ExamPaper();
|
|
|
|
- examPaper.setExamId(examId);
|
|
|
|
- examPaper.setGroupCode(groupCode);
|
|
|
|
- examPaper.setCourseCode(courseCode);
|
|
|
|
- // examPaper.setPaperId(paperId);
|
|
|
|
- examPaperRepo.save(examPaper);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- public void releaseExamPaper(long examId, String courseCode, String groupCode, String paperId) {
|
|
|
|
- ExamPaper examPaper = new ExamPaper();
|
|
|
|
- examPaper.setExamId(examId);
|
|
|
|
- examPaper.setGroupCode(groupCode);
|
|
|
|
- examPaper.setCourseCode(courseCode);
|
|
|
|
- // examPaper.setPaperId(paperId);
|
|
|
|
- examPaperRepo.delete(examPaper);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- public Set<String> listGroupCodes(long examId, String courseCode) {
|
|
|
|
- Set<String> groupSet = new HashSet<String>();
|
|
|
|
- ExamPaper examPaper = new ExamPaper();
|
|
|
|
- examPaper.setExamId(examId);
|
|
|
|
- examPaper.setCourseCode(courseCode);
|
|
|
|
- List<ExamPaper> examPapers = examPaperRepo.findAll(Example.of(examPaper));
|
|
|
|
- for (ExamPaper expaper : examPapers) {
|
|
|
|
- groupSet.add(expaper.getGroupCode());
|
|
|
|
- }
|
|
|
|
- return groupSet;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- public void deletGroupCode(long examId, String courseCode, String groupCode) {
|
|
|
|
- ExamPaper examPaper = new ExamPaper();
|
|
|
|
- examPaper.setExamId(examId);
|
|
|
|
- examPaper.setCourseCode(courseCode);
|
|
|
|
- examPaper.setCourseCode(courseCode);
|
|
|
|
- examPaperRepo.delete(examPaper);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * 根据试卷ID获取试卷下面的大题
|
|
|
|
- *
|
|
|
|
- * @param id
|
|
|
|
- * @return
|
|
|
|
- */
|
|
|
|
- public List<PaperDetail> findPaperDetailsById(String id) {
|
|
|
|
- return paperDetailService.getPaperDetailsByPaper(paperRepo.findOne(id));
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * 批量删除试卷
|
|
|
|
- *
|
|
|
|
- * @param paperIds
|
|
|
|
- */
|
|
|
|
- public Map<String, Object> deletePapers(List<String> paperIds) {
|
|
|
|
- Map<String, Object> msgMap = new HashMap<String, Object>();
|
|
|
|
- String msg = "";
|
|
|
|
- List<Paper> papers = CommonUtils.toList(paperRepo.findAll(paperIds));
|
|
|
|
- if (papers.get(0).getPaperType() == PaperType.IMPORT) {
|
|
|
|
- List<Question> quesList = new ArrayList<Question>();
|
|
|
|
- for (Paper paper : papers) {
|
|
|
|
- List<PaperDetailUnit> paperUnits = paperDetailUnitRepo.findByPaper(paper);
|
|
|
|
- for (PaperDetailUnit pdu : paperUnits) {
|
|
|
|
- if (pdu.getQuestion() != null) {
|
|
|
|
- quesList.add(pdu.getQuestion());
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- List<PaperDetailUnit> allUnits = paperDetailUnitRepo.findByQuestionIn(quesList);
|
|
|
|
- for (PaperDetailUnit pdu : allUnits) {
|
|
|
|
- if (pdu.getPaper() != null && pdu.getPaper().getPaperType() == PaperType.GENERATE) {
|
|
|
|
- msg = "待删除试卷中有试题被组卷使用,不能删除!";
|
|
|
|
- msgMap.put("msg", msg);
|
|
|
|
- msgMap.put("paperName", pdu.getPaper().getName());
|
|
|
|
- return msgMap;
|
|
|
|
- // for(PaperDetailUnit ipdu: importPaperUnits){
|
|
|
|
- // if(ipdu.getQuestion().getId().equals(pdu.getQuestion().getId())){
|
|
|
|
- //
|
|
|
|
- // }
|
|
|
|
- // }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- quesRepo.delete(quesList);
|
|
|
|
- } else if (papers.get(0).getPaperType() == PaperType.GENERATE) {
|
|
|
|
- for (Paper paper : papers) {
|
|
|
|
- List<String> examPaperIds = extractConfigService.getExamPaperId(paper.getCourseNo(), paper.getOrgId());
|
|
|
|
- if (examPaperIds != null && examPaperIds.contains(paper.getId())) {
|
|
|
|
- msg = "待删除试卷有被调卷规则使 用,不能删除!";
|
|
|
|
- msgMap.put("msg", msg);
|
|
|
|
- msgMap.put("paperName", paper.getName());
|
|
|
|
- return msgMap;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- paperDetailService.deletePaperDetailsByPapers(papers);
|
|
|
|
- paperRepo.delete(papers);
|
|
|
|
- msg = "success";
|
|
|
|
- msgMap.put("msg", msg);
|
|
|
|
- return msgMap;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * 批量通过试卷
|
|
|
|
- *
|
|
|
|
- * @param paperIds
|
|
|
|
- */
|
|
|
|
- public void passPapers(List<String> paperIds) {
|
|
|
|
- List<Paper> papers = CommonUtils.toList(paperRepo.findAll(paperIds));
|
|
|
|
- papers.stream().forEach(paper -> {
|
|
|
|
- paper.setPaperStatus(PaperStatus.PASS);
|
|
|
|
- });
|
|
|
|
- paperRepo.save(papers);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * 批量不通过试卷
|
|
|
|
- *
|
|
|
|
- * @param paperIds
|
|
|
|
- */
|
|
|
|
- public void noPassPapers(List<String> paperIds) {
|
|
|
|
- List<Paper> papers = CommonUtils.toList(paperRepo.findAll(paperIds));
|
|
|
|
- papers.stream().forEach(paper -> {
|
|
|
|
- paper.setPaperStatus(PaperStatus.NOPASS);
|
|
|
|
- });
|
|
|
|
- paperRepo.save(papers);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * 批量待审核试卷
|
|
|
|
- *
|
|
|
|
- * @param paperIds
|
|
|
|
- */
|
|
|
|
- public void backPapers(List<String> paperIds) {
|
|
|
|
- List<Paper> papers = CommonUtils.toList(paperRepo.findAll(paperIds));
|
|
|
|
- papers.stream().forEach(paper -> {
|
|
|
|
- paper.setPaperStatus(PaperStatus.DRAFT);
|
|
|
|
- });
|
|
|
|
- paperRepo.save(papers);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * 初始化导出试卷DTO
|
|
|
|
- *
|
|
|
|
- * @param id
|
|
|
|
- * @return
|
|
|
|
- */
|
|
|
|
- public PaperExp getPaperDto(String id) {
|
|
|
|
-
|
|
|
|
- // 获取paper
|
|
|
|
- Paper paper = paperRepo.findOne(id);
|
|
|
|
- // 创建paperDto
|
|
|
|
- PaperExp paperExp = BeanCopierUtil.copyProperties(paper, PaperExp.class);
|
|
|
|
- // 获取大题
|
|
|
|
- List<PaperDetail> paperDetails = paperDetailRepo.findByPaper(paper);
|
|
|
|
- List<PaperDetailExp> paperDetailExps = BeanCopierUtil.copyPropertiesOfList(paperDetails, PaperDetailExp.class);
|
|
|
|
- paperExp.setPaperDetails(paperDetailExps);
|
|
|
|
-
|
|
|
|
- // 封装小题
|
|
|
|
- for (int i = 0; i < paperDetailExps.size(); i++) {
|
|
|
|
- List<PaperDetailUnit> paperDetailUnits = paperDetailUnitRepo.findByPaperDetailOrderByNumber(paperDetails.get(i));
|
|
|
|
- if (paperDetailUnits != null && paperDetailUnits.size() > 0) {
|
|
|
|
- List<PaperDetailUnitExp> paperDetailUnitExps = BeanCopierUtil.copyPropertiesOfList(paperDetailUnits,
|
|
|
|
- PaperDetailUnitExp.class);
|
|
|
|
- // 选择题,套题下选择题 选项顺序重新排列
|
|
|
|
- reorderChoicequestionOption(paperDetailUnitExps);
|
|
|
|
- paperDetailExps.get(i).setPaperDetailUnits(paperDetailUnitExps);
|
|
|
|
- } else {
|
|
|
|
- paperDetailExps.get(i).setUnitCount(0);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
- // 初始化试卷内容
|
|
|
|
- initPaper(paperExp);
|
|
|
|
-
|
|
|
|
- return paperExp;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * 重新对选择题option进行排序(多选、单选、套题下选择题)
|
|
|
|
- */
|
|
|
|
- public void reorderChoicequestionOption(List<PaperDetailUnitExp> paperDetailUnitExps) {
|
|
|
|
- for (PaperDetailUnitExp paperDetailUnitExp : paperDetailUnitExps) {
|
|
|
|
- String optionOrder = paperDetailUnitExp.getOptionOrder();
|
|
|
|
- if (StringUtil.isNotBlank(optionOrder)) {
|
|
|
|
- Question question = paperDetailUnitExp.getQuestion();
|
|
|
|
- if (question.getQuestionType() == QuesStructType.SINGLE_ANSWER_QUESTION
|
|
|
|
- || question.getQuestionType() == QuesStructType.MULTIPLE_ANSWER_QUESTION) {
|
|
|
|
- question.setQuesOptions(reorderOptionCore(question.getQuesOptions(), optionOrder));
|
|
|
|
- }
|
|
|
|
- if (question.getQuestionType() == QuesStructType.NESTED_ANSWER_QUESTION) {
|
|
|
|
- List<Question> subQuestions = question.getSubQuestions();
|
|
|
|
- int index = 0;
|
|
|
|
- for (int k = 0; k < subQuestions.size(); k++) {
|
|
|
|
- Question subQuestion = subQuestions.get(k);
|
|
|
|
- if (subQuestion.getQuestionType() == QuesStructType.SINGLE_ANSWER_QUESTION
|
|
|
|
- || subQuestion.getQuestionType() == QuesStructType.MULTIPLE_ANSWER_QUESTION) {
|
|
|
|
- subQuestion.setQuesOptions(
|
|
|
|
- reorderOptionCore(subQuestion.getQuesOptions(), optionOrder.split(";")[index]));
|
|
|
|
- index++;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- public List<QuesOption> reorderOptionCore(List<QuesOption> quesOptions, String optionOrder) {
|
|
|
|
- List<QuesOption> newQuesOptions = new ArrayList<QuesOption>();
|
|
|
|
- if (StringUtil.isBlank(optionOrder) || quesOptions.isEmpty()) {
|
|
|
|
- return null;
|
|
|
|
- }
|
|
|
|
- String[] optionOrderArr = optionOrder.split(",");
|
|
|
|
- for (int j = 0; j < optionOrderArr.length; j++) {
|
|
|
|
- for (int k = 0; k < quesOptions.size(); k++) {
|
|
|
|
- if (optionOrderArr[j].equals(quesOptions.get(k).getNumber())) {
|
|
|
|
- newQuesOptions.add(quesOptions.get(k));
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- quesOptions = null;
|
|
|
|
- return newQuesOptions;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * 初始化试卷内容(增加序号)
|
|
|
|
- *
|
|
|
|
- * @param paperExp
|
|
|
|
- */
|
|
|
|
- public void initPaper(PaperExp paperExp) {
|
|
|
|
- if (paperExp.getPaperDetails() == null || paperExp.getPaperDetails().size() == 0) {
|
|
|
|
- return;
|
|
|
|
- }
|
|
|
|
- int mainNum = 0;
|
|
|
|
- int subNum = 0;
|
|
|
|
- Collections.sort(paperExp.getPaperDetails());
|
|
|
|
- List<PaperDetailExp> paperDetailExpList = paperExp.getPaperDetails();
|
|
|
|
- for (PaperDetailExp paperDetail : paperDetailExpList) {
|
|
|
|
- // 大题序号
|
|
|
|
- paperDetail.setNumber(++mainNum);
|
|
|
|
- paperDetail.setCnNum(CommonUtils.toCHNum(paperDetail.getNumber()));
|
|
|
|
- // 小题序号
|
|
|
|
- if (paperDetail != null && paperDetail.getPaperDetailUnits() != null
|
|
|
|
- && paperDetail.getPaperDetailUnits().size() > 0) {
|
|
|
|
- for (PaperDetailUnitExp paperDetailUnit : paperDetail.getPaperDetailUnits()) {
|
|
|
|
- if (paperDetailUnit.getQuestion() != null) {
|
|
|
|
- quesService.formatQuesUnit(paperDetailUnit.getQuestion());
|
|
|
|
- List<Question> subQuesList = paperDetailUnit.getQuestion().getSubQuestions();
|
|
|
|
- // 套题序号
|
|
|
|
- if (subQuesList != null && subQuesList.size() > 0) {
|
|
|
|
- int index = subNum;
|
|
|
|
- for (Question subQues : subQuesList) {
|
|
|
|
- Map<String, String> params = new HashMap<String, String>();
|
|
|
|
- params.put("number", String.valueOf(++subNum));
|
|
|
|
- subQues.setQuesParams(params);
|
|
|
|
- quesService.formatQuesUnit(subQues);
|
|
|
|
- }
|
|
|
|
- String quesBodyHtml = relaceQuestionIdx(paperDetailUnit.getQuestion().getQuesBody(), index);
|
|
|
|
- paperDetailUnit.getQuestion().setQuesBody(quesBodyHtml);
|
|
|
|
- } else {
|
|
|
|
- paperDetailUnit.setNumber(++subNum);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * 格式化查询条件
|
|
|
|
- *
|
|
|
|
- * @param paperSearchInfo
|
|
|
|
- */
|
|
|
|
- public void formatPaperSearchInfo(PaperSearchInfo paperSearchInfo) {
|
|
|
|
- if (StringUtils.isEmpty(paperSearchInfo.getCourseNo())) {
|
|
|
|
- paperSearchInfo.setCourseNo(null);
|
|
|
|
- }
|
|
|
|
- if (StringUtils.isEmpty(paperSearchInfo.getCreateTime())) {
|
|
|
|
- paperSearchInfo.setCreateTime(null);
|
|
|
|
- }
|
|
|
|
- if (StringUtils.isEmpty(paperSearchInfo.getCreator())) {
|
|
|
|
- paperSearchInfo.setCreator(null);
|
|
|
|
- }
|
|
|
|
- if (StringUtils.isEmpty(paperSearchInfo.getName())) {
|
|
|
|
- paperSearchInfo.setName(null);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * 填充大题小题数量与分数
|
|
|
|
- *
|
|
|
|
- * @param paper
|
|
|
|
- */
|
|
|
|
- public void formatPaper(Paper paper, AccessUser user) {
|
|
|
|
- List<PaperDetail> paperDetails = paperDetailRepo.findByPaper(paper);
|
|
|
|
- // 计算试卷总分
|
|
|
|
- List<PaperDetailUnit> paperDetailUnitAll = paperDetailUnitRepo.findByPaper(paper);
|
|
|
|
- int allQuesCount = 0;
|
|
|
|
- double totalScore = 0;
|
|
|
|
- for (PaperDetailUnit unit : paperDetailUnitAll) {
|
|
|
|
- if (unit.getScore() != null) {
|
|
|
|
- totalScore += unit.getScore();
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
- // 计算各大题总分
|
|
|
|
- for (PaperDetail paperDetail : paperDetails) {
|
|
|
|
- List<PaperDetailUnit> paperDetailUnits = paperDetailUnitRepo.findByPaperDetailOrderByNumber(paperDetail);
|
|
|
|
- Collections.sort(paperDetailUnits);
|
|
|
|
- if (paperDetailUnits.size() > 0) {
|
|
|
|
- int count = 0;
|
|
|
|
- double score = 0;
|
|
|
|
- int nestQusNum = 0;
|
|
|
|
- for (PaperDetailUnit unit : paperDetailUnits) {
|
|
|
|
- if (unit.getScore() != null) {
|
|
|
|
- score += unit.getScore();
|
|
|
|
- }
|
|
|
|
- if (unit.getQuestion() != null && unit.getQuestion().getSubQuestions() != null
|
|
|
|
- && unit.getQuestion().getSubQuestions().size() > 0) {
|
|
|
|
- nestQusNum += unit.getQuestion().getSubQuestions().size() - 1;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
- count = paperDetailUnits.size() + nestQusNum;
|
|
|
|
- paperDetail.setScore(score);
|
|
|
|
- paperDetail.setUnitCount(count);
|
|
|
|
- allQuesCount += count;
|
|
|
|
- } else {
|
|
|
|
- paperDetail.setScore(0d);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- paper.setUnitCount(allQuesCount);
|
|
|
|
- paper.setPaperDetailCount(paperDetails.size());
|
|
|
|
- paper.setTotalScore(totalScore);
|
|
|
|
- if (user != null) {
|
|
|
|
- paper.setLastModifyName(user.getName());
|
|
|
|
- }
|
|
|
|
- paperDetailRepo.save(paperDetails);
|
|
|
|
- paperRepo.save(paper);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * 先备份准备删掉的试题,然后再删掉
|
|
|
|
- *
|
|
|
|
- * @param questionId
|
|
|
|
- * @return
|
|
|
|
- */
|
|
|
|
- public List<String> deleteImportQuestionById(String questionId, AccessUser user) {
|
|
|
|
- Question ques = quesRepo.findOne(questionId);
|
|
|
|
- List<PaperDetailUnit> pdus = CommonUtils.toList(paperDetailUnitRepo.findByQuestion(ques));
|
|
|
|
- List<String> paperNames = new ArrayList<String>();
|
|
|
|
- List<PaperDetailUnit> needPdus = new ArrayList<PaperDetailUnit>();// 需要删除的小题
|
|
|
|
- List<Paper> papers = new ArrayList<Paper>();
|
|
|
|
- for (PaperDetailUnit pdu : pdus) {
|
|
|
|
- if (pdu.getPaper() != null) {
|
|
|
|
- if (!papers.contains(pdu.getPaper())) {
|
|
|
|
- papers.add(pdu.getPaper());
|
|
|
|
- }
|
|
|
|
- if (PaperType.GENERATE == pdu.getPaper().getPaperType()) {
|
|
|
|
- paperNames.add(pdu.getPaper().getName());
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if (paperNames.size() == 0) {
|
|
|
|
- needPdus.addAll(pdus);// 此试题没有被组卷调用,则可以删除此试题
|
|
|
|
- paperDetailUnitRepo.delete(needPdus);
|
|
|
|
- quesBakRepo.save(BeanCopierUtil.copyProperties(ques, QuestionBak.class));
|
|
|
|
- quesRepo.delete(ques);
|
|
|
|
- for (Paper paper : papers) {
|
|
|
|
- formatPaper(paper, user);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
- return paperNames;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * 向试卷中插入一个试题
|
|
|
|
- *
|
|
|
|
- * @param paperId
|
|
|
|
- * @param paperDetailId
|
|
|
|
- * @return
|
|
|
|
- */
|
|
|
|
- public Paper insertQuestionToPaper(String paperId, String paperDetailId, Question question, AccessUser user) {
|
|
|
|
- question.setOrgId(user.getRootOrgId().toString());
|
|
|
|
- quesService.updateQuesWord(question);
|
|
|
|
- question = quesRepo.save(question);
|
|
|
|
- Paper paper = paperRepo.findOne(paperId);
|
|
|
|
- PaperDetail pd = paperDetailRepo.findOne(paperDetailId);
|
|
|
|
- PaperDetailUnit pdu = new PaperDetailUnit();
|
|
|
|
- List<PaperDetailUnit> pdus = paperDetailUnitRepo.findByPaperDetailOrderByNumber(pd);
|
|
|
|
- pdu.setPaper(paper);
|
|
|
|
- pdu.setQuestionType(question.getQuestionType());
|
|
|
|
- pdu.setQuestion(question);
|
|
|
|
- pdu.setCreateTime(CommonUtils.getCurDateTime());
|
|
|
|
- pdu.setPaperDetail(pd);
|
|
|
|
- pdus.add(pdu);
|
|
|
|
- Collections.sort(pdus);
|
|
|
|
- pdu.setNumber(pdus.indexOf(pdu) + 1);
|
|
|
|
- pdu.setScore(0d);
|
|
|
|
- paperDetailUnitRepo.save(pdu);
|
|
|
|
- formatPaper(paper, user);
|
|
|
|
- return paper;
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * 获取试题所在的试卷名称
|
|
|
|
- *
|
|
|
|
- * @param questionId
|
|
|
|
- * @return
|
|
|
|
- */
|
|
|
|
- public List<String> getPaperNamesByQuestionId(String questionId) {
|
|
|
|
- List<String> paperNames = new ArrayList<String>();
|
|
|
|
- List<PaperDetailUnit> pdus = paperDetailUnitRepo.findByQuestion(quesRepo.findOne(questionId));
|
|
|
|
- for (PaperDetailUnit pdu : pdus) {
|
|
|
|
- paperNames.add(pdu.getPaper().getName());
|
|
|
|
- }
|
|
|
|
- return paperNames;
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- public Page<Question> listQuestionforSelect(String paperId,
|
|
|
|
- int curPage,
|
|
|
|
- int pageSize,
|
|
|
|
- QuesStructType quesType,
|
|
|
|
- AccessUser accessUser) {
|
|
|
|
- Set<String> selectedIds = new HashSet<>();
|
|
|
|
- Paper paper = paperRepo.findOne(paperId);
|
|
|
|
- // QuestionSearchCondition ques = new QuestionSearchCondition();
|
|
|
|
- // if (quesType != null) {
|
|
|
|
- // ques.setQuestionType(quesType);
|
|
|
|
- // }
|
|
|
|
- // Map<String, String> quesParams = new HashMap<String, String>();
|
|
|
|
- // quesParams.put("courseName", paper.getCourseName());
|
|
|
|
- // ques.setQuesParams(quesParams);
|
|
|
|
- List<PaperDetailUnit> pdus = paperDetailUnitRepo.findByPaper(paper);
|
|
|
|
- for (PaperDetailUnit pdu : pdus) {
|
|
|
|
- selectedIds.add(pdu.getQuestion().getId());
|
|
|
|
- }
|
|
|
|
- // Page<Question> allQuestions = quesService.findAll(ques, curPage,
|
|
|
|
- // pageSize);
|
|
|
|
- // Iterator<Question> que = allQuestions.iterator();
|
|
|
|
- // while (que.hasNext()) {
|
|
|
|
- // if (selectedIds.contains(que.next().getId())) {
|
|
|
|
- // que.remove();
|
|
|
|
- // }
|
|
|
|
- // }
|
|
|
|
- return quesService.findByIdExclude(selectedIds, paper.getCourseNo(), quesType, curPage, pageSize,accessUser.getRootOrgId());
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- public Paper selectQuestionsToPaper(String paperId, String paperDetailId, List<Question> questions,
|
|
|
|
- AccessUser user) {
|
|
|
|
- Paper paper = paperRepo.findOne(paperId);
|
|
|
|
- PaperDetail pd = paperDetailRepo.findOne(paperDetailId);
|
|
|
|
- List<PaperDetailUnit> pdus = paperDetailUnitRepo.findByPaperDetailOrderByNumber(pd);
|
|
|
|
- List<PaperDetailUnit> saveUnits = new ArrayList<PaperDetailUnit>();
|
|
|
|
- for (Question ques : questions) {
|
|
|
|
- PaperDetailUnit pdu = new PaperDetailUnit();
|
|
|
|
- pdu.setPaper(paper);
|
|
|
|
- pdu.setQuestionType(ques.getQuestionType());
|
|
|
|
- pdu.setQuestion(ques);
|
|
|
|
- pdu.setCreateTime(CommonUtils.getCurDateTime());
|
|
|
|
- pdu.setPaperDetail(pd);
|
|
|
|
- pdu.setScore(0d);
|
|
|
|
- pdus.add(pdu);
|
|
|
|
- saveUnits.add(pdu);
|
|
|
|
- }
|
|
|
|
- Collections.sort(pdus);
|
|
|
|
- for (int i = 0; i < saveUnits.size(); i++) {
|
|
|
|
- saveUnits.get(i).setNumber(pdus.indexOf(saveUnits.get(i)) + 1);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- paperDetailUnitRepo.save(saveUnits);
|
|
|
|
- formatPaper(paper, user);
|
|
|
|
- return paper;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- public String checkPaperName(String paperName, String orgId) {
|
|
|
|
- String msg = null;
|
|
|
|
- Paper paperTemp = new Paper();
|
|
|
|
- paperTemp.setCreateTime(null);
|
|
|
|
- paperTemp.setName(paperName.trim());
|
|
|
|
- paperTemp.setOrgId(orgId);
|
|
|
|
- Paper paper = paperRepo.findOne(Example.of(paperTemp));
|
|
|
|
- if (paper != null) {
|
|
|
|
- msg = "试卷名称重复,请重新命名";
|
|
|
|
- }
|
|
|
|
- return msg;
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- public void checkPaperNameNew(String paperName, String orgId)throws Exception{
|
|
|
|
- Paper paperTemp = new Paper();
|
|
|
|
- paperTemp.setCreateTime(null);
|
|
|
|
- paperTemp.setName(paperName.trim());
|
|
|
|
- paperTemp.setOrgId(orgId);
|
|
|
|
- Paper paper = paperRepo.findOne(Example.of(paperTemp));
|
|
|
|
- if (paper != null) {
|
|
|
|
- throw new PaperException("试卷名称重复,请重新命名");
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- private String relaceQuestionIdx(String str, int baseIdx) {
|
|
|
|
- StringBuffer sb = new StringBuffer("");
|
|
|
|
- Pattern pattern = Pattern.compile("##(\\d+)##");
|
|
|
|
-
|
|
|
|
- Matcher matcher = pattern.matcher(str);
|
|
|
|
-
|
|
|
|
- while (matcher.find()) {
|
|
|
|
- String idx = matcher.group(1);
|
|
|
|
- matcher.appendReplacement(sb, "___" + String.valueOf(Integer.parseInt(idx) + baseIdx) + "___");
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if (StringUtils.isEmpty(sb.toString())) {
|
|
|
|
- return str;
|
|
|
|
- } else {
|
|
|
|
- matcher.appendTail(sb);
|
|
|
|
- return sb.toString();
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- public Page<Paper> getImportPapersNotInIds(PaperSearchInfo paperSearchInfo, String[] ids, int curPage,
|
|
|
|
- int pageSize) {
|
|
|
|
- Set<String> selectedIds = new HashSet<>();
|
|
|
|
- for (String id : ids) {
|
|
|
|
- selectedIds.add(id);
|
|
|
|
- }
|
|
|
|
- Pageable page = new PageRequest(curPage - 1, pageSize);
|
|
|
|
- return paperRepo.findByIdNotInAndCourseNoAndOrgIdAndPaperType(selectedIds, paperSearchInfo.getCourseNo(),
|
|
|
|
- paperSearchInfo.getOrgId(), PaperType.IMPORT, page);
|
|
|
|
- }
|
|
|
|
- /**
|
|
|
|
- * 将选中的导入试卷复制为卷库试卷
|
|
|
|
- */
|
|
|
|
- public void useBasePaper(String selectedPaperIds,String userId){
|
|
|
|
- Assert.hasLength(selectedPaperIds, "试卷id不能为空!");
|
|
|
|
- String[] paperIds = selectedPaperIds.split(",");
|
|
|
|
- for(int i = 0;i<paperIds.length;i++){
|
|
|
|
- Paper oldpaper = paperRepo.findOne(paperIds[i]);
|
|
|
|
- List<PaperDetail> paperDetails = paperDetailRepo.findByPaper(oldpaper);
|
|
|
|
- oldpaper.setId(null);
|
|
|
|
- SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
|
- String createTime = sdf.format(new Date());
|
|
|
|
- oldpaper.setCreateTime(createTime);
|
|
|
|
- oldpaper.setCreator(userId);
|
|
|
|
- oldpaper.setLastModifyName(userId);
|
|
|
|
- oldpaper.setPaperType(PaperType.GENERATE);//试卷类型 修改为组卷
|
|
|
|
- Paper newPaper = paperRepo.save(oldpaper);
|
|
|
|
- for(int j = 0;j<paperDetails.size();j++){
|
|
|
|
- PaperDetail paperDetail = paperDetails.get(j);
|
|
|
|
- List<PaperDetailUnit> paperDetailUnits = paperDetailUnitService.getUnitsByPaperDetail(paperDetail);
|
|
|
|
- paperDetail.setPaper(newPaper);//关联新Paper
|
|
|
|
- paperDetail.setId(null);
|
|
|
|
- paperDetail.setCreateTime(createTime);
|
|
|
|
- paperDetail.setCreator(userId);
|
|
|
|
- PaperDetail newPaperDetail = paperDetailRepo.save(paperDetail);//保存新的paperDetail
|
|
|
|
- for(int k = 0;k<paperDetailUnits.size();k++){
|
|
|
|
- //重新设置保存PaperDetailUnit
|
|
|
|
- PaperDetailUnit paperDetailUnit = paperDetailUnits.get(k);
|
|
|
|
- paperDetailUnit.setPaper(newPaper); //关联新Paper
|
|
|
|
- paperDetailUnit.setPaperDetail(newPaperDetail); //关联新paperDetail
|
|
|
|
- paperDetailUnit.setId(null);
|
|
|
|
- paperDetailUnit.setCreateTime(createTime);
|
|
|
|
- paperDetailUnit.setCreator(userId);
|
|
|
|
- paperDetailUnitRepo.save(paperDetailUnit);//保存新的paperDetailUnit
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- /**
|
|
|
|
- * 根据试卷名称、试卷类型检查名称是否存在
|
|
|
|
- * @param paperName
|
|
|
|
- * @param paperType
|
|
|
|
- * @param orgId
|
|
|
|
- * @return
|
|
|
|
- * @throws Exception
|
|
|
|
- */
|
|
|
|
- public boolean checkPaperName(String paperName, PaperType paperType,String orgId)throws Exception{
|
|
|
|
- Paper paperTemp = new Paper();
|
|
|
|
- paperTemp.setCreateTime(null);
|
|
|
|
- paperTemp.setName(paperName.trim());
|
|
|
|
- paperTemp.setOrgId(orgId);
|
|
|
|
- paperTemp.setPaperType(paperType);
|
|
|
|
- Paper paper = paperRepo.findOne(Example.of(paperTemp));
|
|
|
|
- if(paper!=null){
|
|
|
|
- return false;
|
|
|
|
- }
|
|
|
|
- return true;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- public Map<String, String> checkRadioFile(String paperId,List<String> filesName){
|
|
|
|
- Map<String, String> messageMap = new HashMap<String, String>();
|
|
|
|
- //判断文件名中格式是否正确
|
|
|
|
- for(String fileName: filesName){
|
|
|
|
- String fileTpye[] = fileName.split("\\.");
|
|
|
|
- String fileType = fileTpye[fileTpye.length-1];
|
|
|
|
- if(radioType.indexOf(fileType)<0){
|
|
|
|
- messageMap.put("errorMsg", fileName+"文件格式不对");
|
|
|
|
- return messageMap;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- //根据试卷id,查询该试卷
|
|
|
|
- Paper paper = paperRepo.findOne(paperId);
|
|
|
|
- //根据试卷查询所有的小题
|
|
|
|
- List<PaperDetailUnit> paperDetailUnits = paperDetailUnitRepo.findByPaper(paper);
|
|
|
|
- String names = "";
|
|
|
|
- for(PaperDetailUnit paperDetailUnit:paperDetailUnits){
|
|
|
|
- names = names + paperDetailUnit.getNumber().toString() + ",";
|
|
|
|
- }
|
|
|
|
- for(String fileName: filesName){
|
|
|
|
- String fileNames[] = fileName.split("_");
|
|
|
|
- //先判断小题号是否正确
|
|
|
|
- String fileNameFirst = fileNames[0];
|
|
|
|
- if(!names.contains(fileNameFirst)){
|
|
|
|
- messageMap.put("errorMsg", fileName + "文件,试卷中没有对应的小题");
|
|
|
|
- return messageMap;
|
|
|
|
- }
|
|
|
|
- //再判断题干中是否存在ABCD
|
|
|
|
- String fileNameSecond = fileNames[1];
|
|
|
|
- if(fileNameSecond.equals("1")){
|
|
|
|
- if(fileNames.length>3){
|
|
|
|
- Matcher m = Pattern.compile(".*[a-zA-Z]+.*").matcher(fileNames[2]);
|
|
|
|
- if(m.matches()){
|
|
|
|
- messageMap.put("errorMsg", fileName + "文件名称不对,文件名为题干,但存在选项");
|
|
|
|
- return messageMap;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- //判断选项
|
|
|
|
- else if(fileNameSecond.equals("2")){
|
|
|
|
- messageMap = checkOptions(paperDetailUnits, fileNames, fileName);
|
|
|
|
- if(messageMap != null){
|
|
|
|
- return messageMap;
|
|
|
|
- }
|
|
|
|
- continue;
|
|
|
|
- }else {
|
|
|
|
- messageMap.put("errorMsg", fileName + "文件名称不对,无法识别为题干或选项 ");
|
|
|
|
- return messageMap;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- messageMap.put("message", "OK!");
|
|
|
|
- return messageMap;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- //判断选项
|
|
|
|
- public Map<String, String> checkOptions(List<PaperDetailUnit> paperDetailUnits,String fileNames[],String fileName){
|
|
|
|
- Map<String, String> messageMap = new HashMap<String, String>();
|
|
|
|
- for(PaperDetailUnit paperDetailUnit:paperDetailUnits){
|
|
|
|
- if(paperDetailUnit.getNumber().toString().equals(fileNames[0])){
|
|
|
|
- //判断是否为选择题
|
|
|
|
- if(paperDetailUnit.getQuestionType() != QuesStructType.SINGLE_ANSWER_QUESTION
|
|
|
|
- &&paperDetailUnit.getQuestionType() != QuesStructType.MULTIPLE_ANSWER_QUESTION){
|
|
|
|
- Matcher m = Pattern.compile(".*[a-zA-Z]+.*").matcher(fileNames[2]);
|
|
|
|
- if(m.matches()){
|
|
|
|
- messageMap.put("errorMsg", fileName + "文件名称有误,题目不是选择题");
|
|
|
|
- return messageMap;
|
|
|
|
- }
|
|
|
|
- break;
|
|
|
|
- }else {
|
|
|
|
- List<QuesOption> options = paperDetailUnit.getQuestion().getQuesOptions();
|
|
|
|
- String option = "";
|
|
|
|
- for(QuesOption quesOption:options){
|
|
|
|
- option = option + quesOption.getNumber()+",";
|
|
|
|
- }
|
|
|
|
- Integer integer = CommonUtils.characterToNumber(fileNames[2]);
|
|
|
|
- if(!option.contains(integer.toString())){
|
|
|
|
- messageMap.put("errorMsg", fileName + "文件名称有误,题目中没有对应的"+fileNames[2]+"选项");
|
|
|
|
- return messageMap;
|
|
|
|
- }
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- return null;
|
|
|
|
- }
|
|
|
|
-}
|
|
|
|
|
|
+package com.qmth.cqb.paper.service;
|
|
|
|
+
|
|
|
|
+import java.io.BufferedInputStream;
|
|
|
|
+import java.io.File;
|
|
|
|
+import java.io.FileNotFoundException;
|
|
|
|
+import java.io.FileOutputStream;
|
|
|
|
+import java.io.IOException;
|
|
|
|
+import java.text.SimpleDateFormat;
|
|
|
|
+import java.util.ArrayList;
|
|
|
|
+import java.util.Collections;
|
|
|
|
+import java.util.Date;
|
|
|
|
+import java.util.HashMap;
|
|
|
|
+import java.util.HashSet;
|
|
|
|
+import java.util.List;
|
|
|
|
+import java.util.Map;
|
|
|
|
+import java.util.Set;
|
|
|
|
+import java.util.regex.Matcher;
|
|
|
|
+import java.util.regex.Pattern;
|
|
|
|
+
|
|
|
|
+import com.qmth.cqb.utils.exception.PaperException;
|
|
|
|
+
|
|
|
|
+import main.java.com.UpYun;
|
|
|
|
+
|
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
|
+import org.nlpcn.commons.lang.util.StringUtil;
|
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
+import org.springframework.beans.factory.annotation.Value;
|
|
|
|
+import org.springframework.data.domain.Example;
|
|
|
|
+import org.springframework.data.domain.Page;
|
|
|
|
+import org.springframework.data.domain.PageImpl;
|
|
|
|
+import org.springframework.data.domain.PageRequest;
|
|
|
|
+import org.springframework.data.domain.Pageable;
|
|
|
|
+import org.springframework.data.domain.Sort;
|
|
|
|
+import org.springframework.data.domain.Sort.Direction;
|
|
|
|
+import org.springframework.data.domain.Sort.Order;
|
|
|
|
+import org.springframework.data.mongodb.core.MongoTemplate;
|
|
|
|
+import org.springframework.data.mongodb.core.query.Criteria;
|
|
|
|
+import org.springframework.data.mongodb.core.query.Query;
|
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
|
+import org.springframework.util.Assert;
|
|
|
|
+import org.springframework.web.multipart.MultipartFile;
|
|
|
|
+
|
|
|
|
+import com.google.gson.Gson;
|
|
|
|
+import com.qmth.cqb.paper.dao.ExamPaperRepo;
|
|
|
|
+import com.qmth.cqb.paper.dao.PaperDetailRepo;
|
|
|
|
+import com.qmth.cqb.paper.dao.PaperDetailUnitRepo;
|
|
|
|
+import com.qmth.cqb.paper.dao.PaperRepo;
|
|
|
|
+import com.qmth.cqb.paper.dto.PaperDetailExp;
|
|
|
|
+import com.qmth.cqb.paper.dto.PaperDetailUnitExp;
|
|
|
|
+import com.qmth.cqb.paper.dto.PaperExp;
|
|
|
|
+import com.qmth.cqb.paper.model.ExamPaper;
|
|
|
|
+import com.qmth.cqb.paper.model.Paper;
|
|
|
|
+import com.qmth.cqb.paper.model.PaperDetail;
|
|
|
|
+import com.qmth.cqb.paper.model.PaperDetailUnit;
|
|
|
|
+import com.qmth.cqb.paper.model.PaperSearchInfo;
|
|
|
|
+import com.qmth.cqb.question.dao.QuesBakRepo;
|
|
|
|
+import com.qmth.cqb.question.dao.QuesRepo;
|
|
|
|
+import com.qmth.cqb.question.model.QuesOption;
|
|
|
|
+import com.qmth.cqb.question.model.Question;
|
|
|
|
+import com.qmth.cqb.question.model.QuestionAudio;
|
|
|
|
+import com.qmth.cqb.question.model.QuestionBak;
|
|
|
|
+import com.qmth.cqb.question.model.QuestionType;
|
|
|
|
+import com.qmth.cqb.question.service.QuesService;
|
|
|
|
+import com.qmth.cqb.question.service.impl.QuestionAudioServiceImpl;
|
|
|
|
+import com.qmth.cqb.utils.BeanCopierUtil;
|
|
|
|
+import com.qmth.cqb.utils.CommonUtils;
|
|
|
|
+import com.qmth.cqb.utils.enums.PaperStatus;
|
|
|
|
+import com.qmth.cqb.utils.enums.PaperType;
|
|
|
|
+
|
|
|
|
+import cn.com.qmth.examcloud.common.dto.question.enums.QuesStructType;
|
|
|
|
+import cn.com.qmth.examcloud.common.uac.entity.AccessUser;
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * Created by songyue on 16/12/28.
|
|
|
|
+ */
|
|
|
|
+@Service
|
|
|
|
+public class PaperService {
|
|
|
|
+
|
|
|
|
+ @Autowired
|
|
|
|
+ PaperRepo paperRepo;
|
|
|
|
+
|
|
|
|
+ @Autowired
|
|
|
|
+ PaperDetailService paperDetailService;
|
|
|
|
+
|
|
|
|
+ @Autowired
|
|
|
|
+ ExamPaperRepo examPaperRepo;
|
|
|
|
+
|
|
|
|
+ @Autowired
|
|
|
|
+ PaperDetailRepo paperDetailRepo;
|
|
|
|
+
|
|
|
|
+ @Autowired
|
|
|
|
+ PaperDetailUnitRepo paperDetailUnitRepo;
|
|
|
|
+
|
|
|
|
+ @Autowired
|
|
|
|
+ QuesRepo quesRepo;
|
|
|
|
+
|
|
|
|
+ @Autowired
|
|
|
|
+ QuesBakRepo quesBakRepo;
|
|
|
|
+
|
|
|
|
+ @Autowired
|
|
|
|
+ Gson gson;
|
|
|
|
+
|
|
|
|
+ @Autowired
|
|
|
|
+ PaperDetailUnitService paperDetailUnitService;
|
|
|
|
+
|
|
|
|
+ @Autowired
|
|
|
|
+ QuesService quesService;
|
|
|
|
+
|
|
|
|
+ @Autowired
|
|
|
|
+ ExtractConfigService extractConfigService;
|
|
|
|
+
|
|
|
|
+ @Autowired
|
|
|
|
+ private MongoTemplate mongoTemplate;
|
|
|
|
+
|
|
|
|
+ @Autowired
|
|
|
|
+ private QuestionAudioServiceImpl questionAudioService;
|
|
|
|
+
|
|
|
|
+ @Value("${upyun.radioType}")
|
|
|
|
+ protected String radioType;
|
|
|
|
+
|
|
|
|
+ @Value("${upyun.audio.uploadUrl}")
|
|
|
|
+ protected String upyunRadioPath;
|
|
|
|
+
|
|
|
|
+ @Value("${upyun.bucketName}")
|
|
|
|
+ protected String bucketName;
|
|
|
|
+
|
|
|
|
+ @Value("${upyun.userName}")
|
|
|
|
+ protected String userName;
|
|
|
|
+
|
|
|
|
+ @Value("${upyun.password}")
|
|
|
|
+ protected String password;
|
|
|
|
+
|
|
|
|
+ public static final String TEMP_FILE_EXP = "docxExport/";
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 查询所有已导入试卷
|
|
|
|
+ *
|
|
|
|
+ * @param paperSearchInfo
|
|
|
|
+ * @param curPage
|
|
|
|
+ * @param pageSize
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public Page<Paper> getImportPapers(PaperSearchInfo paperSearchInfo, int curPage, int pageSize) {
|
|
|
|
+ Query query = new Query();
|
|
|
|
+ query.addCriteria(Criteria.where("paperType").is(PaperType.IMPORT));
|
|
|
|
+ if(StringUtils.isNotBlank(paperSearchInfo.getCourseNo())){
|
|
|
|
+ query.addCriteria(Criteria.where("courseNo").is(paperSearchInfo.getCourseNo()));
|
|
|
|
+ }
|
|
|
|
+ query.addCriteria(Criteria.where("orgId").is(paperSearchInfo.getOrgId()));
|
|
|
|
+ long count = this.mongoTemplate.count(query, Paper.class);
|
|
|
|
+ query.with(new Sort(new Order(Direction.DESC,"createTime")));
|
|
|
|
+ query.limit(pageSize);
|
|
|
|
+ query.skip((curPage - 1) * pageSize);
|
|
|
|
+ List<Paper> paperList = this.mongoTemplate.find(query, Paper.class);
|
|
|
|
+ return new PageImpl<Paper>(paperList, new PageRequest(curPage - 1, pageSize), count);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 查询所有待审核和审核不通过的导入试卷
|
|
|
|
+ *
|
|
|
|
+ * @param paperSearchInfo
|
|
|
|
+ * @param curPage
|
|
|
|
+ * @param pageSize
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public Page<Paper> getImportPapersNotSuccess(PaperSearchInfo paperSearchInfo, int curPage, int pageSize) {
|
|
|
|
+ Query query = new Query();
|
|
|
|
+ if (paperSearchInfo.getPaperStatus() != null) {
|
|
|
|
+ query.addCriteria(Criteria.where("paperStatus").is(paperSearchInfo.getPaperStatus()));
|
|
|
|
+ } else {
|
|
|
|
+ query.addCriteria(Criteria.where("paperStatus").ne(PaperStatus.PASS));
|
|
|
|
+ }
|
|
|
|
+ query.addCriteria(Criteria.where("paperType").is(PaperType.IMPORT));
|
|
|
|
+ query.addCriteria(Criteria.where("orgId").is(paperSearchInfo.getOrgId()));
|
|
|
|
+ if (StringUtil.isNotBlank(paperSearchInfo.getCourseNo())) {
|
|
|
|
+ query.addCriteria(Criteria.where("courseNo").is(paperSearchInfo.getCourseNo()));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ long totalNumber = this.mongoTemplate.count(query, Paper.class);
|
|
|
|
+ query.limit(pageSize);
|
|
|
|
+ query.skip((curPage - 1) * pageSize);
|
|
|
|
+ List<Paper> paperList = this.mongoTemplate.find(query, Paper.class);
|
|
|
|
+ return new PageImpl<Paper>(paperList, new PageRequest(curPage - 1, pageSize), totalNumber);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 根据条件查询
|
|
|
|
+ *
|
|
|
|
+ * @param paperSearchInfo
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public List<Paper> getImportPapersBySearch(PaperSearchInfo paperSearchInfo) {
|
|
|
|
+ formatPaperSearchInfo(paperSearchInfo);
|
|
|
|
+ Paper importPaper = BeanCopierUtil.copyProperties(paperSearchInfo, Paper.class);
|
|
|
|
+ importPaper.setPaperType(PaperType.IMPORT);
|
|
|
|
+ return paperRepo.findAll(Example.of(importPaper));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 根据条件查询
|
|
|
|
+ *
|
|
|
|
+ * @param paperSearchInfo
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public List<Paper> getGenPapersBySearch(PaperSearchInfo paperSearchInfo) {
|
|
|
|
+ formatPaperSearchInfo(paperSearchInfo);
|
|
|
|
+ Paper genPaper = BeanCopierUtil.copyProperties(paperSearchInfo, Paper.class);
|
|
|
|
+ genPaper.setPaperType(PaperType.GENERATE);
|
|
|
|
+ return paperRepo.findAll(Example.of(genPaper));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 保存试卷
|
|
|
|
+ *
|
|
|
|
+ * @param paperExp
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public Map<String, Object> savePaper(PaperExp paperExp, AccessUser user) {
|
|
|
|
+ Map<String, Object> msgMap = new HashMap<String, Object>();
|
|
|
|
+ Paper oldPaper = paperRepo.findOne(paperExp.getId());
|
|
|
|
+ if (oldPaper != null) {
|
|
|
|
+ String oldName = oldPaper.getName().trim();
|
|
|
|
+ oldPaper.setTitle(paperExp.getTitle());
|
|
|
|
+ oldPaper.setName(paperExp.getName().trim());
|
|
|
|
+ oldPaper.setLastModifyName(user.getName());
|
|
|
|
+ if (!oldName.equals(paperExp.getName().trim())) {// 假如改变了试卷名称
|
|
|
|
+ // 则要效验试卷名称唯一性
|
|
|
|
+ String msg = this.checkPaperName(paperExp.getName().trim(), user.getRootOrgId().toString());
|
|
|
|
+ if (msg == null) {
|
|
|
|
+ paperRepo.save(oldPaper);
|
|
|
|
+ msgMap.put("msg", "success");
|
|
|
|
+ } else {
|
|
|
|
+ msgMap.put("msg", msg);
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ paperRepo.save(oldPaper);
|
|
|
|
+ msgMap.put("msg", "success");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ return msgMap;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 查询所有已组试卷
|
|
|
|
+ *
|
|
|
|
+ * @param paperSearchInfo
|
|
|
|
+ * @param curPage
|
|
|
|
+ * @param pageSize
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public Page<Paper> getGenPapers(PaperSearchInfo paperSearchInfo, int curPage, int pageSize) {
|
|
|
|
+ Query query = new Query();
|
|
|
|
+ query.addCriteria(Criteria.where("paperType").is(PaperType.GENERATE.name()));
|
|
|
|
+ if(StringUtils.isNotBlank(paperSearchInfo.getCourseNo())){
|
|
|
|
+ query.addCriteria(Criteria.where("courseNo").is(paperSearchInfo.getCourseNo()));
|
|
|
|
+ }
|
|
|
|
+ query.addCriteria(Criteria.where("orgId").is(paperSearchInfo.getOrgId()));
|
|
|
|
+ long count = this.mongoTemplate.count(query, Paper.class);
|
|
|
|
+ query.with(new Sort(new Order(Direction.DESC,"createTime")));
|
|
|
|
+ query.limit(pageSize);
|
|
|
|
+ query.skip((curPage - 1) * pageSize);
|
|
|
|
+ List<Paper> paperList = this.mongoTemplate.find(query, Paper.class);
|
|
|
|
+ return new PageImpl<Paper>(paperList, new PageRequest(curPage - 1, pageSize), count);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 查询考试试卷
|
|
|
|
+ *
|
|
|
|
+ * @param id
|
|
|
|
+ * @param courseCode
|
|
|
|
+ * @param groupCode
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public List<Paper> listExamPapers(long id, String courseCode, String groupCode) {
|
|
|
|
+ List<Paper> papers = new ArrayList<Paper>();
|
|
|
|
+ ExamPaper examPaper = new ExamPaper();
|
|
|
|
+ examPaper.setExamId(id);
|
|
|
|
+ examPaper.setCourseCode(courseCode);
|
|
|
|
+ examPaper.setGroupCode(groupCode);
|
|
|
|
+ Example<ExamPaper> example = Example.of(examPaper);
|
|
|
|
+ List<ExamPaper> examPapers = examPaperRepo.findAll(example);
|
|
|
|
+ for (ExamPaper ePaper : examPapers) {
|
|
|
|
+ Paper paper = paperRepo.findOne(ePaper.getPaper().getId());
|
|
|
|
+ papers.add(paper);
|
|
|
|
+ }
|
|
|
|
+ return papers;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 设置考试试卷
|
|
|
|
+ *
|
|
|
|
+ * @param examId
|
|
|
|
+ * @param courseCode
|
|
|
|
+ * @param groupCode
|
|
|
|
+ * @param paperId
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public void joinToExamPaper(long examId, String courseCode, String groupCode, String paperId) {
|
|
|
|
+ ExamPaper examPaper = new ExamPaper();
|
|
|
|
+ examPaper.setExamId(examId);
|
|
|
|
+ examPaper.setGroupCode(groupCode);
|
|
|
|
+ examPaper.setCourseCode(courseCode);
|
|
|
|
+ // examPaper.setPaperId(paperId);
|
|
|
|
+ examPaperRepo.save(examPaper);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public void releaseExamPaper(long examId, String courseCode, String groupCode, String paperId) {
|
|
|
|
+ ExamPaper examPaper = new ExamPaper();
|
|
|
|
+ examPaper.setExamId(examId);
|
|
|
|
+ examPaper.setGroupCode(groupCode);
|
|
|
|
+ examPaper.setCourseCode(courseCode);
|
|
|
|
+ // examPaper.setPaperId(paperId);
|
|
|
|
+ examPaperRepo.delete(examPaper);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public Set<String> listGroupCodes(long examId, String courseCode) {
|
|
|
|
+ Set<String> groupSet = new HashSet<String>();
|
|
|
|
+ ExamPaper examPaper = new ExamPaper();
|
|
|
|
+ examPaper.setExamId(examId);
|
|
|
|
+ examPaper.setCourseCode(courseCode);
|
|
|
|
+ List<ExamPaper> examPapers = examPaperRepo.findAll(Example.of(examPaper));
|
|
|
|
+ for (ExamPaper expaper : examPapers) {
|
|
|
|
+ groupSet.add(expaper.getGroupCode());
|
|
|
|
+ }
|
|
|
|
+ return groupSet;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public void deletGroupCode(long examId, String courseCode, String groupCode) {
|
|
|
|
+ ExamPaper examPaper = new ExamPaper();
|
|
|
|
+ examPaper.setExamId(examId);
|
|
|
|
+ examPaper.setCourseCode(courseCode);
|
|
|
|
+ examPaper.setCourseCode(courseCode);
|
|
|
|
+ examPaperRepo.delete(examPaper);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 根据试卷ID获取试卷下面的大题
|
|
|
|
+ *
|
|
|
|
+ * @param id
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public List<PaperDetail> findPaperDetailsById(String id) {
|
|
|
|
+ return paperDetailService.getPaperDetailsByPaper(paperRepo.findOne(id));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 批量删除试卷
|
|
|
|
+ *
|
|
|
|
+ * @param paperIds
|
|
|
|
+ */
|
|
|
|
+ public Map<String, Object> deletePapers(List<String> paperIds) {
|
|
|
|
+ Map<String, Object> msgMap = new HashMap<String, Object>();
|
|
|
|
+ String msg = "";
|
|
|
|
+ List<Paper> papers = CommonUtils.toList(paperRepo.findAll(paperIds));
|
|
|
|
+ if (papers.get(0).getPaperType() == PaperType.IMPORT) {
|
|
|
|
+ List<Question> quesList = new ArrayList<Question>();
|
|
|
|
+ for (Paper paper : papers) {
|
|
|
|
+ List<PaperDetailUnit> paperUnits = paperDetailUnitRepo.findByPaper(paper);
|
|
|
|
+ for (PaperDetailUnit pdu : paperUnits) {
|
|
|
|
+ if (pdu.getQuestion() != null) {
|
|
|
|
+ quesList.add(pdu.getQuestion());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ List<PaperDetailUnit> allUnits = paperDetailUnitRepo.findByQuestionIn(quesList);
|
|
|
|
+ for (PaperDetailUnit pdu : allUnits) {
|
|
|
|
+ if (pdu.getPaper() != null && pdu.getPaper().getPaperType() == PaperType.GENERATE) {
|
|
|
|
+ msg = "待删除试卷中有试题被组卷使用,不能删除!";
|
|
|
|
+ msgMap.put("msg", msg);
|
|
|
|
+ msgMap.put("paperName", pdu.getPaper().getName());
|
|
|
|
+ return msgMap;
|
|
|
|
+ // for(PaperDetailUnit ipdu: importPaperUnits){
|
|
|
|
+ // if(ipdu.getQuestion().getId().equals(pdu.getQuestion().getId())){
|
|
|
|
+ //
|
|
|
|
+ // }
|
|
|
|
+ // }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ quesRepo.delete(quesList);
|
|
|
|
+ } else if (papers.get(0).getPaperType() == PaperType.GENERATE) {
|
|
|
|
+ for (Paper paper : papers) {
|
|
|
|
+ List<String> examPaperIds = extractConfigService.getExamPaperId(paper.getCourseNo(), paper.getOrgId());
|
|
|
|
+ if (examPaperIds != null && examPaperIds.contains(paper.getId())) {
|
|
|
|
+ msg = "待删除试卷有被调卷规则使 用,不能删除!";
|
|
|
|
+ msgMap.put("msg", msg);
|
|
|
|
+ msgMap.put("paperName", paper.getName());
|
|
|
|
+ return msgMap;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ paperDetailService.deletePaperDetailsByPapers(papers);
|
|
|
|
+ paperRepo.delete(papers);
|
|
|
|
+ msg = "success";
|
|
|
|
+ msgMap.put("msg", msg);
|
|
|
|
+ return msgMap;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 批量通过试卷
|
|
|
|
+ *
|
|
|
|
+ * @param paperIds
|
|
|
|
+ */
|
|
|
|
+ public void passPapers(List<String> paperIds) {
|
|
|
|
+ List<Paper> papers = CommonUtils.toList(paperRepo.findAll(paperIds));
|
|
|
|
+ papers.stream().forEach(paper -> {
|
|
|
|
+ paper.setPaperStatus(PaperStatus.PASS);
|
|
|
|
+ });
|
|
|
|
+ paperRepo.save(papers);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 批量不通过试卷
|
|
|
|
+ *
|
|
|
|
+ * @param paperIds
|
|
|
|
+ */
|
|
|
|
+ public void noPassPapers(List<String> paperIds) {
|
|
|
|
+ List<Paper> papers = CommonUtils.toList(paperRepo.findAll(paperIds));
|
|
|
|
+ papers.stream().forEach(paper -> {
|
|
|
|
+ paper.setPaperStatus(PaperStatus.NOPASS);
|
|
|
|
+ });
|
|
|
|
+ paperRepo.save(papers);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 批量待审核试卷
|
|
|
|
+ *
|
|
|
|
+ * @param paperIds
|
|
|
|
+ */
|
|
|
|
+ public void backPapers(List<String> paperIds) {
|
|
|
|
+ List<Paper> papers = CommonUtils.toList(paperRepo.findAll(paperIds));
|
|
|
|
+ papers.stream().forEach(paper -> {
|
|
|
|
+ paper.setPaperStatus(PaperStatus.DRAFT);
|
|
|
|
+ });
|
|
|
|
+ paperRepo.save(papers);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 初始化导出试卷DTO
|
|
|
|
+ *
|
|
|
|
+ * @param id
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public PaperExp getPaperDto(String id) {
|
|
|
|
+
|
|
|
|
+ // 获取paper
|
|
|
|
+ Paper paper = paperRepo.findOne(id);
|
|
|
|
+ // 创建paperDto
|
|
|
|
+ PaperExp paperExp = BeanCopierUtil.copyProperties(paper, PaperExp.class);
|
|
|
|
+ // 获取大题
|
|
|
|
+ List<PaperDetail> paperDetails = paperDetailRepo.findByPaper(paper);
|
|
|
|
+ List<PaperDetailExp> paperDetailExps = BeanCopierUtil.copyPropertiesOfList(paperDetails, PaperDetailExp.class);
|
|
|
|
+ paperExp.setPaperDetails(paperDetailExps);
|
|
|
|
+
|
|
|
|
+ // 封装小题
|
|
|
|
+ for (int i = 0; i < paperDetailExps.size(); i++) {
|
|
|
|
+ List<PaperDetailUnit> paperDetailUnits = paperDetailUnitRepo.findByPaperDetailOrderByNumber(paperDetails.get(i));
|
|
|
|
+ if (paperDetailUnits != null && paperDetailUnits.size() > 0) {
|
|
|
|
+ List<PaperDetailUnitExp> paperDetailUnitExps = BeanCopierUtil.copyPropertiesOfList(paperDetailUnits,
|
|
|
|
+ PaperDetailUnitExp.class);
|
|
|
|
+ // 选择题,套题下选择题 选项顺序重新排列
|
|
|
|
+ reorderChoicequestionOption(paperDetailUnitExps);
|
|
|
|
+ paperDetailExps.get(i).setPaperDetailUnits(paperDetailUnitExps);
|
|
|
|
+ } else {
|
|
|
|
+ paperDetailExps.get(i).setUnitCount(0);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ // 初始化试卷内容
|
|
|
|
+ initPaper(paperExp);
|
|
|
|
+
|
|
|
|
+ return paperExp;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 重新对选择题option进行排序(多选、单选、套题下选择题)
|
|
|
|
+ */
|
|
|
|
+ public void reorderChoicequestionOption(List<PaperDetailUnitExp> paperDetailUnitExps) {
|
|
|
|
+ for (PaperDetailUnitExp paperDetailUnitExp : paperDetailUnitExps) {
|
|
|
|
+ String optionOrder = paperDetailUnitExp.getOptionOrder();
|
|
|
|
+ if (StringUtil.isNotBlank(optionOrder)) {
|
|
|
|
+ Question question = paperDetailUnitExp.getQuestion();
|
|
|
|
+ if (question.getQuestionType() == QuesStructType.SINGLE_ANSWER_QUESTION
|
|
|
|
+ || question.getQuestionType() == QuesStructType.MULTIPLE_ANSWER_QUESTION) {
|
|
|
|
+ question.setQuesOptions(reorderOptionCore(question.getQuesOptions(), optionOrder));
|
|
|
|
+ }
|
|
|
|
+ if (question.getQuestionType() == QuesStructType.NESTED_ANSWER_QUESTION) {
|
|
|
|
+ List<Question> subQuestions = question.getSubQuestions();
|
|
|
|
+ int index = 0;
|
|
|
|
+ for (int k = 0; k < subQuestions.size(); k++) {
|
|
|
|
+ Question subQuestion = subQuestions.get(k);
|
|
|
|
+ if (subQuestion.getQuestionType() == QuesStructType.SINGLE_ANSWER_QUESTION
|
|
|
|
+ || subQuestion.getQuestionType() == QuesStructType.MULTIPLE_ANSWER_QUESTION) {
|
|
|
|
+ subQuestion.setQuesOptions(
|
|
|
|
+ reorderOptionCore(subQuestion.getQuesOptions(), optionOrder.split(";")[index]));
|
|
|
|
+ index++;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public List<QuesOption> reorderOptionCore(List<QuesOption> quesOptions, String optionOrder) {
|
|
|
|
+ List<QuesOption> newQuesOptions = new ArrayList<QuesOption>();
|
|
|
|
+ if (StringUtil.isBlank(optionOrder) || quesOptions.isEmpty()) {
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+ String[] optionOrderArr = optionOrder.split(",");
|
|
|
|
+ for (int j = 0; j < optionOrderArr.length; j++) {
|
|
|
|
+ for (int k = 0; k < quesOptions.size(); k++) {
|
|
|
|
+ if (optionOrderArr[j].equals(quesOptions.get(k).getNumber())) {
|
|
|
|
+ newQuesOptions.add(quesOptions.get(k));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ quesOptions = null;
|
|
|
|
+ return newQuesOptions;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 初始化试卷内容(增加序号)
|
|
|
|
+ *
|
|
|
|
+ * @param paperExp
|
|
|
|
+ */
|
|
|
|
+ public void initPaper(PaperExp paperExp) {
|
|
|
|
+ if (paperExp.getPaperDetails() == null || paperExp.getPaperDetails().size() == 0) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ int mainNum = 0;
|
|
|
|
+ int subNum = 0;
|
|
|
|
+ Collections.sort(paperExp.getPaperDetails());
|
|
|
|
+ List<PaperDetailExp> paperDetailExpList = paperExp.getPaperDetails();
|
|
|
|
+ for (PaperDetailExp paperDetail : paperDetailExpList) {
|
|
|
|
+ // 大题序号
|
|
|
|
+ paperDetail.setNumber(++mainNum);
|
|
|
|
+ paperDetail.setCnNum(CommonUtils.toCHNum(paperDetail.getNumber()));
|
|
|
|
+ // 小题序号
|
|
|
|
+ if (paperDetail != null && paperDetail.getPaperDetailUnits() != null
|
|
|
|
+ && paperDetail.getPaperDetailUnits().size() > 0) {
|
|
|
|
+ for (PaperDetailUnitExp paperDetailUnit : paperDetail.getPaperDetailUnits()) {
|
|
|
|
+ if (paperDetailUnit.getQuestion() != null) {
|
|
|
|
+ quesService.formatQuesUnit(paperDetailUnit.getQuestion());
|
|
|
|
+ List<Question> subQuesList = paperDetailUnit.getQuestion().getSubQuestions();
|
|
|
|
+ // 套题序号
|
|
|
|
+ if (subQuesList != null && subQuesList.size() > 0) {
|
|
|
|
+ int index = subNum;
|
|
|
|
+ for (Question subQues : subQuesList) {
|
|
|
|
+ Map<String, String> params = new HashMap<String, String>();
|
|
|
|
+ params.put("number", String.valueOf(++subNum));
|
|
|
|
+ subQues.setQuesParams(params);
|
|
|
|
+ quesService.formatQuesUnit(subQues);
|
|
|
|
+ }
|
|
|
|
+ String quesBodyHtml = relaceQuestionIdx(paperDetailUnit.getQuestion().getQuesBody(), index);
|
|
|
|
+ paperDetailUnit.getQuestion().setQuesBody(quesBodyHtml);
|
|
|
|
+ } else {
|
|
|
|
+ paperDetailUnit.setNumber(++subNum);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 格式化查询条件
|
|
|
|
+ *
|
|
|
|
+ * @param paperSearchInfo
|
|
|
|
+ */
|
|
|
|
+ public void formatPaperSearchInfo(PaperSearchInfo paperSearchInfo) {
|
|
|
|
+ if (StringUtils.isEmpty(paperSearchInfo.getCourseNo())) {
|
|
|
|
+ paperSearchInfo.setCourseNo(null);
|
|
|
|
+ }
|
|
|
|
+ if (StringUtils.isEmpty(paperSearchInfo.getCreateTime())) {
|
|
|
|
+ paperSearchInfo.setCreateTime(null);
|
|
|
|
+ }
|
|
|
|
+ if (StringUtils.isEmpty(paperSearchInfo.getCreator())) {
|
|
|
|
+ paperSearchInfo.setCreator(null);
|
|
|
|
+ }
|
|
|
|
+ if (StringUtils.isEmpty(paperSearchInfo.getName())) {
|
|
|
|
+ paperSearchInfo.setName(null);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 填充大题小题数量与分数
|
|
|
|
+ *
|
|
|
|
+ * @param paper
|
|
|
|
+ */
|
|
|
|
+ public void formatPaper(Paper paper, AccessUser user) {
|
|
|
|
+ List<PaperDetail> paperDetails = paperDetailRepo.findByPaper(paper);
|
|
|
|
+ // 计算试卷总分
|
|
|
|
+ List<PaperDetailUnit> paperDetailUnitAll = paperDetailUnitRepo.findByPaper(paper);
|
|
|
|
+ int allQuesCount = 0;
|
|
|
|
+ double totalScore = 0;
|
|
|
|
+ for (PaperDetailUnit unit : paperDetailUnitAll) {
|
|
|
|
+ if (unit.getScore() != null) {
|
|
|
|
+ totalScore += unit.getScore();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ // 计算各大题总分
|
|
|
|
+ for (PaperDetail paperDetail : paperDetails) {
|
|
|
|
+ List<PaperDetailUnit> paperDetailUnits = paperDetailUnitRepo.findByPaperDetailOrderByNumber(paperDetail);
|
|
|
|
+ Collections.sort(paperDetailUnits);
|
|
|
|
+ if (paperDetailUnits.size() > 0) {
|
|
|
|
+ int count = 0;
|
|
|
|
+ double score = 0;
|
|
|
|
+ int nestQusNum = 0;
|
|
|
|
+ for (PaperDetailUnit unit : paperDetailUnits) {
|
|
|
|
+ if (unit.getScore() != null) {
|
|
|
|
+ score += unit.getScore();
|
|
|
|
+ }
|
|
|
|
+ if (unit.getQuestion() != null && unit.getQuestion().getSubQuestions() != null
|
|
|
|
+ && unit.getQuestion().getSubQuestions().size() > 0) {
|
|
|
|
+ nestQusNum += unit.getQuestion().getSubQuestions().size() - 1;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ count = paperDetailUnits.size() + nestQusNum;
|
|
|
|
+ paperDetail.setScore(score);
|
|
|
|
+ paperDetail.setUnitCount(count);
|
|
|
|
+ allQuesCount += count;
|
|
|
|
+ } else {
|
|
|
|
+ paperDetail.setScore(0d);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ paper.setUnitCount(allQuesCount);
|
|
|
|
+ paper.setPaperDetailCount(paperDetails.size());
|
|
|
|
+ paper.setTotalScore(totalScore);
|
|
|
|
+ if (user != null) {
|
|
|
|
+ paper.setLastModifyName(user.getName());
|
|
|
|
+ }
|
|
|
|
+ paperDetailRepo.save(paperDetails);
|
|
|
|
+ paperRepo.save(paper);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 先备份准备删掉的试题,然后再删掉
|
|
|
|
+ *
|
|
|
|
+ * @param questionId
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public List<String> deleteImportQuestionById(String questionId, AccessUser user) {
|
|
|
|
+ Question ques = quesRepo.findOne(questionId);
|
|
|
|
+ List<PaperDetailUnit> pdus = CommonUtils.toList(paperDetailUnitRepo.findByQuestion(ques));
|
|
|
|
+ List<String> paperNames = new ArrayList<String>();
|
|
|
|
+ List<PaperDetailUnit> needPdus = new ArrayList<PaperDetailUnit>();// 需要删除的小题
|
|
|
|
+ List<Paper> papers = new ArrayList<Paper>();
|
|
|
|
+ for (PaperDetailUnit pdu : pdus) {
|
|
|
|
+ if (pdu.getPaper() != null) {
|
|
|
|
+ if (!papers.contains(pdu.getPaper())) {
|
|
|
|
+ papers.add(pdu.getPaper());
|
|
|
|
+ }
|
|
|
|
+ if (PaperType.GENERATE == pdu.getPaper().getPaperType()) {
|
|
|
|
+ paperNames.add(pdu.getPaper().getName());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (paperNames.size() == 0) {
|
|
|
|
+ needPdus.addAll(pdus);// 此试题没有被组卷调用,则可以删除此试题
|
|
|
|
+ paperDetailUnitRepo.delete(needPdus);
|
|
|
|
+ quesBakRepo.save(BeanCopierUtil.copyProperties(ques, QuestionBak.class));
|
|
|
|
+ quesRepo.delete(ques);
|
|
|
|
+ for (Paper paper : papers) {
|
|
|
|
+ formatPaper(paper, user);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ return paperNames;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 向试卷中插入一个试题
|
|
|
|
+ *
|
|
|
|
+ * @param paperId
|
|
|
|
+ * @param paperDetailId
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public Paper insertQuestionToPaper(String paperId, String paperDetailId, Question question, AccessUser user) {
|
|
|
|
+ question.setOrgId(user.getRootOrgId().toString());
|
|
|
|
+ quesService.updateQuesWord(question);
|
|
|
|
+ question = quesRepo.save(question);
|
|
|
|
+ Paper paper = paperRepo.findOne(paperId);
|
|
|
|
+ PaperDetail pd = paperDetailRepo.findOne(paperDetailId);
|
|
|
|
+ PaperDetailUnit pdu = new PaperDetailUnit();
|
|
|
|
+ List<PaperDetailUnit> pdus = paperDetailUnitRepo.findByPaperDetailOrderByNumber(pd);
|
|
|
|
+ pdu.setPaper(paper);
|
|
|
|
+ pdu.setQuestionType(question.getQuestionType());
|
|
|
|
+ pdu.setQuestion(question);
|
|
|
|
+ pdu.setCreateTime(CommonUtils.getCurDateTime());
|
|
|
|
+ pdu.setPaperDetail(pd);
|
|
|
|
+ pdus.add(pdu);
|
|
|
|
+ Collections.sort(pdus);
|
|
|
|
+ pdu.setNumber(pdus.indexOf(pdu) + 1);
|
|
|
|
+ pdu.setScore(0d);
|
|
|
|
+ paperDetailUnitRepo.save(pdu);
|
|
|
|
+ formatPaper(paper, user);
|
|
|
|
+ return paper;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 获取试题所在的试卷名称
|
|
|
|
+ *
|
|
|
|
+ * @param questionId
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public List<String> getPaperNamesByQuestionId(String questionId) {
|
|
|
|
+ List<String> paperNames = new ArrayList<String>();
|
|
|
|
+ List<PaperDetailUnit> pdus = paperDetailUnitRepo.findByQuestion(quesRepo.findOne(questionId));
|
|
|
|
+ for (PaperDetailUnit pdu : pdus) {
|
|
|
|
+ paperNames.add(pdu.getPaper().getName());
|
|
|
|
+ }
|
|
|
|
+ return paperNames;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public Page<Question> listQuestionforSelect(String paperId,
|
|
|
|
+ int curPage,
|
|
|
|
+ int pageSize,
|
|
|
|
+ QuesStructType quesType,
|
|
|
|
+ AccessUser accessUser) {
|
|
|
|
+ Set<String> selectedIds = new HashSet<>();
|
|
|
|
+ Paper paper = paperRepo.findOne(paperId);
|
|
|
|
+ // QuestionSearchCondition ques = new QuestionSearchCondition();
|
|
|
|
+ // if (quesType != null) {
|
|
|
|
+ // ques.setQuestionType(quesType);
|
|
|
|
+ // }
|
|
|
|
+ // Map<String, String> quesParams = new HashMap<String, String>();
|
|
|
|
+ // quesParams.put("courseName", paper.getCourseName());
|
|
|
|
+ // ques.setQuesParams(quesParams);
|
|
|
|
+ List<PaperDetailUnit> pdus = paperDetailUnitRepo.findByPaper(paper);
|
|
|
|
+ for (PaperDetailUnit pdu : pdus) {
|
|
|
|
+ selectedIds.add(pdu.getQuestion().getId());
|
|
|
|
+ }
|
|
|
|
+ // Page<Question> allQuestions = quesService.findAll(ques, curPage,
|
|
|
|
+ // pageSize);
|
|
|
|
+ // Iterator<Question> que = allQuestions.iterator();
|
|
|
|
+ // while (que.hasNext()) {
|
|
|
|
+ // if (selectedIds.contains(que.next().getId())) {
|
|
|
|
+ // que.remove();
|
|
|
|
+ // }
|
|
|
|
+ // }
|
|
|
|
+ return quesService.findByIdExclude(selectedIds, paper.getCourseNo(), quesType, curPage, pageSize,accessUser.getRootOrgId());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public Paper selectQuestionsToPaper(String paperId, String paperDetailId, List<Question> questions,
|
|
|
|
+ AccessUser user) {
|
|
|
|
+ Paper paper = paperRepo.findOne(paperId);
|
|
|
|
+ PaperDetail pd = paperDetailRepo.findOne(paperDetailId);
|
|
|
|
+ List<PaperDetailUnit> pdus = paperDetailUnitRepo.findByPaperDetailOrderByNumber(pd);
|
|
|
|
+ List<PaperDetailUnit> saveUnits = new ArrayList<PaperDetailUnit>();
|
|
|
|
+ for (Question ques : questions) {
|
|
|
|
+ PaperDetailUnit pdu = new PaperDetailUnit();
|
|
|
|
+ pdu.setPaper(paper);
|
|
|
|
+ pdu.setQuestionType(ques.getQuestionType());
|
|
|
|
+ pdu.setQuestion(ques);
|
|
|
|
+ pdu.setCreateTime(CommonUtils.getCurDateTime());
|
|
|
|
+ pdu.setPaperDetail(pd);
|
|
|
|
+ pdu.setScore(0d);
|
|
|
|
+ pdus.add(pdu);
|
|
|
|
+ saveUnits.add(pdu);
|
|
|
|
+ }
|
|
|
|
+ Collections.sort(pdus);
|
|
|
|
+ for (int i = 0; i < saveUnits.size(); i++) {
|
|
|
|
+ saveUnits.get(i).setNumber(pdus.indexOf(saveUnits.get(i)) + 1);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ paperDetailUnitRepo.save(saveUnits);
|
|
|
|
+ formatPaper(paper, user);
|
|
|
|
+ return paper;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public String checkPaperName(String paperName, String orgId) {
|
|
|
|
+ String msg = null;
|
|
|
|
+ Paper paperTemp = new Paper();
|
|
|
|
+ paperTemp.setCreateTime(null);
|
|
|
|
+ paperTemp.setName(paperName.trim());
|
|
|
|
+ paperTemp.setOrgId(orgId);
|
|
|
|
+ Paper paper = paperRepo.findOne(Example.of(paperTemp));
|
|
|
|
+ if (paper != null) {
|
|
|
|
+ msg = "试卷名称重复,请重新命名";
|
|
|
|
+ }
|
|
|
|
+ return msg;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public void checkPaperNameNew(String paperName, String orgId)throws Exception{
|
|
|
|
+ Paper paperTemp = new Paper();
|
|
|
|
+ paperTemp.setCreateTime(null);
|
|
|
|
+ paperTemp.setName(paperName.trim());
|
|
|
|
+ paperTemp.setOrgId(orgId);
|
|
|
|
+ Paper paper = paperRepo.findOne(Example.of(paperTemp));
|
|
|
|
+ if (paper != null) {
|
|
|
|
+ throw new PaperException("试卷名称重复,请重新命名");
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private String relaceQuestionIdx(String str, int baseIdx) {
|
|
|
|
+ StringBuffer sb = new StringBuffer("");
|
|
|
|
+ Pattern pattern = Pattern.compile("##(\\d+)##");
|
|
|
|
+
|
|
|
|
+ Matcher matcher = pattern.matcher(str);
|
|
|
|
+
|
|
|
|
+ while (matcher.find()) {
|
|
|
|
+ String idx = matcher.group(1);
|
|
|
|
+ matcher.appendReplacement(sb, "___" + String.valueOf(Integer.parseInt(idx) + baseIdx) + "___");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (StringUtils.isEmpty(sb.toString())) {
|
|
|
|
+ return str;
|
|
|
|
+ } else {
|
|
|
|
+ matcher.appendTail(sb);
|
|
|
|
+ return sb.toString();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public Page<Paper> getImportPapersNotInIds(PaperSearchInfo paperSearchInfo, String[] ids, int curPage,
|
|
|
|
+ int pageSize) {
|
|
|
|
+ Set<String> selectedIds = new HashSet<>();
|
|
|
|
+ for (String id : ids) {
|
|
|
|
+ selectedIds.add(id);
|
|
|
|
+ }
|
|
|
|
+ Pageable page = new PageRequest(curPage - 1, pageSize);
|
|
|
|
+ return paperRepo.findByIdNotInAndCourseNoAndOrgIdAndPaperType(selectedIds, paperSearchInfo.getCourseNo(),
|
|
|
|
+ paperSearchInfo.getOrgId(), PaperType.IMPORT, page);
|
|
|
|
+ }
|
|
|
|
+ /**
|
|
|
|
+ * 将选中的导入试卷复制为卷库试卷
|
|
|
|
+ */
|
|
|
|
+ public void useBasePaper(String selectedPaperIds,String userId){
|
|
|
|
+ Assert.hasLength(selectedPaperIds, "试卷id不能为空!");
|
|
|
|
+ String[] paperIds = selectedPaperIds.split(",");
|
|
|
|
+ for(int i = 0;i<paperIds.length;i++){
|
|
|
|
+ Paper oldpaper = paperRepo.findOne(paperIds[i]);
|
|
|
|
+ List<PaperDetail> paperDetails = paperDetailRepo.findByPaper(oldpaper);
|
|
|
|
+ oldpaper.setId(null);
|
|
|
|
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
|
+ String createTime = sdf.format(new Date());
|
|
|
|
+ oldpaper.setCreateTime(createTime);
|
|
|
|
+ oldpaper.setCreator(userId);
|
|
|
|
+ oldpaper.setLastModifyName(userId);
|
|
|
|
+ oldpaper.setPaperType(PaperType.GENERATE);//试卷类型 修改为组卷
|
|
|
|
+ Paper newPaper = paperRepo.save(oldpaper);
|
|
|
|
+ for(int j = 0;j<paperDetails.size();j++){
|
|
|
|
+ PaperDetail paperDetail = paperDetails.get(j);
|
|
|
|
+ List<PaperDetailUnit> paperDetailUnits = paperDetailUnitService.getUnitsByPaperDetail(paperDetail);
|
|
|
|
+ paperDetail.setPaper(newPaper);//关联新Paper
|
|
|
|
+ paperDetail.setId(null);
|
|
|
|
+ paperDetail.setCreateTime(createTime);
|
|
|
|
+ paperDetail.setCreator(userId);
|
|
|
|
+ PaperDetail newPaperDetail = paperDetailRepo.save(paperDetail);//保存新的paperDetail
|
|
|
|
+ for(int k = 0;k<paperDetailUnits.size();k++){
|
|
|
|
+ //重新设置保存PaperDetailUnit
|
|
|
|
+ PaperDetailUnit paperDetailUnit = paperDetailUnits.get(k);
|
|
|
|
+ paperDetailUnit.setPaper(newPaper); //关联新Paper
|
|
|
|
+ paperDetailUnit.setPaperDetail(newPaperDetail); //关联新paperDetail
|
|
|
|
+ paperDetailUnit.setId(null);
|
|
|
|
+ paperDetailUnit.setCreateTime(createTime);
|
|
|
|
+ paperDetailUnit.setCreator(userId);
|
|
|
|
+ paperDetailUnitRepo.save(paperDetailUnit);//保存新的paperDetailUnit
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ /**
|
|
|
|
+ * 根据试卷名称、试卷类型检查名称是否存在
|
|
|
|
+ * @param paperName
|
|
|
|
+ * @param paperType
|
|
|
|
+ * @param orgId
|
|
|
|
+ * @return
|
|
|
|
+ * @throws Exception
|
|
|
|
+ */
|
|
|
|
+ public boolean checkPaperName(String paperName, PaperType paperType,String orgId)throws Exception{
|
|
|
|
+ Paper paperTemp = new Paper();
|
|
|
|
+ paperTemp.setCreateTime(null);
|
|
|
|
+ paperTemp.setName(paperName.trim());
|
|
|
|
+ paperTemp.setOrgId(orgId);
|
|
|
|
+ paperTemp.setPaperType(paperType);
|
|
|
|
+ Paper paper = paperRepo.findOne(Example.of(paperTemp));
|
|
|
|
+ if(paper!=null){
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+ return true;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 上传音频文件检查
|
|
|
|
+ * @param paperId
|
|
|
|
+ * @param filesName
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public Map<String, String> checkRadioFile(String paperId,List<String> filesName){
|
|
|
|
+ Map<String, String> messageMap = new HashMap<String, String>();
|
|
|
|
+ //判断文件名中格式是否正确
|
|
|
|
+ for(String fileName: filesName){
|
|
|
|
+ String fileTpye[] = fileName.split("\\.");
|
|
|
|
+ String fileType = fileTpye[fileTpye.length-1];
|
|
|
|
+ if(radioType.indexOf(fileType)<0){
|
|
|
|
+ messageMap.put("errorMsg", fileName+"文件格式不对");
|
|
|
|
+ return messageMap;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ //根据试卷id,查询该试卷
|
|
|
|
+ Paper paper = paperRepo.findOne(paperId);
|
|
|
|
+ //根据试卷查询所有的小题
|
|
|
|
+ List<PaperDetailUnit> paperDetailUnits = paperDetailUnitRepo.findByPaper(paper);
|
|
|
|
+ String names = "";
|
|
|
|
+ for(PaperDetailUnit paperDetailUnit:paperDetailUnits){
|
|
|
|
+ names = names + paperDetailUnit.getNumber().toString() + ",";
|
|
|
|
+ }
|
|
|
|
+ for(String fileName: filesName){
|
|
|
|
+ String fileNames[] = fileName.split("_");
|
|
|
|
+ //先判断小题号是否正确
|
|
|
|
+ String fileNameFirst = fileNames[0];
|
|
|
|
+ if(!names.contains(fileNameFirst)){
|
|
|
|
+ messageMap.put("errorMsg", fileName + "文件,试卷中没有对应的小题");
|
|
|
|
+ return messageMap;
|
|
|
|
+ }
|
|
|
|
+ //再判断题干中是否存在ABCD
|
|
|
|
+ String fileNameSecond = fileNames[1];
|
|
|
|
+ if(fileNameSecond.equals("1")){
|
|
|
|
+ if(fileNames.length>3){
|
|
|
|
+ Matcher m = Pattern.compile(".*[a-zA-Z]+.*").matcher(fileNames[2]);
|
|
|
|
+ if(m.matches()){
|
|
|
|
+ messageMap.put("errorMsg", fileName + "文件名称不对,文件名为题干,但存在选项");
|
|
|
|
+ return messageMap;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ //判断选项
|
|
|
|
+ else if(fileNameSecond.equals("2")){
|
|
|
|
+ messageMap = checkOptions(paperDetailUnits, fileNames, fileName);
|
|
|
|
+ if(messageMap != null){
|
|
|
|
+ return messageMap;
|
|
|
|
+ }
|
|
|
|
+ continue;
|
|
|
|
+ }else {
|
|
|
|
+ messageMap.put("errorMsg", fileName + "文件名称不对,无法识别为题干或选项 ");
|
|
|
|
+ return messageMap;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ messageMap.put("message", "OK!");
|
|
|
|
+ return messageMap;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //判断选项
|
|
|
|
+ public Map<String, String> checkOptions(List<PaperDetailUnit> paperDetailUnits,String fileNames[],String fileName){
|
|
|
|
+ Map<String, String> messageMap = new HashMap<String, String>();
|
|
|
|
+ for(PaperDetailUnit paperDetailUnit:paperDetailUnits){
|
|
|
|
+ if(paperDetailUnit.getNumber().toString().equals(fileNames[0])){
|
|
|
|
+ //判断是否为选择题
|
|
|
|
+ if(paperDetailUnit.getQuestionType() != QuesStructType.SINGLE_ANSWER_QUESTION
|
|
|
|
+ &&paperDetailUnit.getQuestionType() != QuesStructType.MULTIPLE_ANSWER_QUESTION){
|
|
|
|
+ Matcher m = Pattern.compile(".*[a-zA-Z]+.*").matcher(fileNames[2]);
|
|
|
|
+ if(m.matches()){
|
|
|
|
+ messageMap.put("errorMsg", fileName + "文件名称有误,题目不是选择题");
|
|
|
|
+ return messageMap;
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ }else {
|
|
|
|
+ List<QuesOption> options = paperDetailUnit.getQuestion().getQuesOptions();
|
|
|
|
+ String option = "";
|
|
|
|
+ for(QuesOption quesOption:options){
|
|
|
|
+ option = option + quesOption.getNumber()+",";
|
|
|
|
+ }
|
|
|
|
+ Integer integer = CommonUtils.characterToNumber(fileNames[2]);
|
|
|
|
+ if(!option.contains(integer.toString())){
|
|
|
|
+ messageMap.put("errorMsg", fileName + "文件名称有误,题目中没有对应的"+fileNames[2]+"选项");
|
|
|
|
+ return messageMap;
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 上传音频文件到又拍云
|
|
|
|
+ * @param files
|
|
|
|
+ * @param paperId
|
|
|
|
+ * @param accessUser
|
|
|
|
+ * @throws IOException
|
|
|
|
+ */
|
|
|
|
+ public void uploadRadio(List<MultipartFile> files,String paperId,AccessUser accessUser) throws IOException{
|
|
|
|
+ String mp3DirectoryPath = TEMP_FILE_EXP + File.separator + paperId;
|
|
|
|
+ //新建文件夹
|
|
|
|
+ File mp3Directory = new File(mp3DirectoryPath);
|
|
|
|
+ if(!mp3Directory.exists()){
|
|
|
|
+ mp3Directory.mkdirs();
|
|
|
|
+ }
|
|
|
|
+ byte[] bufs = new byte[1024 * 10];
|
|
|
|
+ for(MultipartFile file: files){
|
|
|
|
+ //新建MP3文件
|
|
|
|
+ String questionId = "";
|
|
|
|
+ String numbers[] = file.getOriginalFilename().split("_");
|
|
|
|
+ //根据试卷id,查询该试卷
|
|
|
|
+ Paper paper = paperRepo.findOne(paperId);
|
|
|
|
+ //根据试卷查询所有的小题
|
|
|
|
+ List<PaperDetailUnit> paperDetailUnits = paperDetailUnitRepo.findByPaper(paper);
|
|
|
|
+ for(PaperDetailUnit paperDetailUnit:paperDetailUnits){
|
|
|
|
+ if(paperDetailUnit.getNumber().toString().equals(numbers[0])){
|
|
|
|
+ questionId = paperDetailUnit.getQuestion().getId();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ String mp3FileNameString = questionId + "_" + file.getOriginalFilename();
|
|
|
|
+ File mp3File = new File(mp3DirectoryPath + File.separator +mp3FileNameString);
|
|
|
|
+ FileOutputStream outputStream = new FileOutputStream(mp3File);
|
|
|
|
+ BufferedInputStream bis = new BufferedInputStream(file.getInputStream(),1024*10);
|
|
|
|
+ int read = 0;
|
|
|
|
+ while ((read = bis.read(bufs,0,1024*10)) != -1) {
|
|
|
|
+ outputStream.write(bufs,0,read);
|
|
|
|
+ }
|
|
|
|
+ bis.close();
|
|
|
|
+ outputStream.flush();
|
|
|
|
+ outputStream.close();
|
|
|
|
+ //上传到又拍云
|
|
|
|
+ UpYun upYun = new UpYun(bucketName, userName, password);
|
|
|
|
+ upYun.writeFile(upyunRadioPath, mp3File,true);
|
|
|
|
+ //删除服务器上文件
|
|
|
|
+ mp3File.delete();
|
|
|
|
+ }
|
|
|
|
+ //删除服务器文件夹
|
|
|
|
+ mp3Directory.delete();
|
|
|
|
+ saveQuestionAudio(files, paperId, accessUser);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 保存音频文件到本地
|
|
|
|
+ * @param files
|
|
|
|
+ * @param paperId
|
|
|
|
+ * @param accessUser
|
|
|
|
+ */
|
|
|
|
+ public void saveQuestionAudio(List<MultipartFile> files,String paperId,AccessUser accessUser){
|
|
|
|
+ for(MultipartFile file:files){
|
|
|
|
+ String fileName = paperId + "_" + file.getOriginalFilename();
|
|
|
|
+ String questionId = "";
|
|
|
|
+ String numbers[] = file.getOriginalFilename().split("_");
|
|
|
|
+ //根据试卷id,查询该试卷
|
|
|
|
+ Paper paper = paperRepo.findOne(paperId);
|
|
|
|
+ //根据试卷查询所有的小题
|
|
|
|
+ List<PaperDetailUnit> paperDetailUnits = paperDetailUnitRepo.findByPaper(paper);
|
|
|
|
+ for(PaperDetailUnit paperDetailUnit:paperDetailUnits){
|
|
|
|
+ if(paperDetailUnit.getNumber().toString().equals(numbers[0])){
|
|
|
|
+ questionId = paperDetailUnit.getQuestion().getId();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ String fileUrl = upyunRadioPath + fileName;
|
|
|
|
+ QuestionAudio questionAudio = new QuestionAudio(questionId, fileName, fileUrl);
|
|
|
|
+ questionAudioService.saveQuestionAudio(questionAudio, accessUser);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|