weiwenhai 8 жил өмнө
parent
commit
f1f634e2a1

+ 1069 - 950
cqb-paper/src/main/java/com/qmth/cqb/paper/service/PaperService.java

@@ -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);
+    	}
+    }
+}
+
+
+
+
+
+
+
+
+
+

+ 22 - 0
cqb-paper/src/main/java/com/qmth/cqb/paper/web/PaperController.java

@@ -1,5 +1,6 @@
 package com.qmth.cqb.paper.web;
 
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashSet;
@@ -29,6 +30,7 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
 
 import com.google.gson.Gson;
 import com.qmth.cqb.paper.dao.PaperRepo;
@@ -572,4 +574,24 @@ public class PaperController {
     	Map<String, String> errorMessage = paperService.checkRadioFile(paperId, filesName);
     	return new ResponseEntity(errorMessage,HttpStatus.OK);
     }
+    
+    @ApiOperation(value="上传音频文件", notes="上传音频文件")
+    @PostMapping(value="/uploadRadio/{paperId}")
+    public ResponseEntity uploadRadio(List<MultipartFile> files,@PathVariable String paperId,HttpServletRequest request){
+    	AccessUser user = (AccessUser) request.getAttribute("accessUser");
+    	try {
+			paperService.uploadRadio(files, paperId, null);
+		} catch (IOException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+    	return null;
+    }
 }
+
+
+
+
+
+
+

+ 84 - 78
cqb-question-resource/src/main/java/com/qmth/cqb/question/model/QuestionAudio.java

@@ -1,78 +1,84 @@
-package com.qmth.cqb.question.model;
-
-import java.io.Serializable;
-import java.util.Date;
-
-/**
- * @author  	chenken
- * @date    	2017年8月1日 上午10:56:23
- * @company 	QMTH
- * @description QuestionAudio.java
- */
-public class QuestionAudio implements Serializable{
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 7190928471784053821L;
-
-	private String id;
-	/**
-	 * 试题ID
-	 */
-	private String questionId;
-	/**
-	 * 文件名称
-	 */
-	private String fileName;
-	/**
-	 * 存放路径
-	 */
-	private String fileUrl;
-	/**
-	 * 创建时间
-	 */
-	private Date createTime;
-	/**
-	 * 创建人
-	 */
-	private String createUser;
-	
-	public String getId() {
-		return id;
-	}
-	public void setId(String id) {
-		this.id = id;
-	}
-	public String getQuestionId() {
-		return questionId;
-	}
-	public void setQuestionId(String questionId) {
-		this.questionId = questionId;
-	}
-	public String getFileName() {
-		return fileName;
-	}
-	public void setFileName(String fileName) {
-		this.fileName = fileName;
-	}
-	public String getFileUrl() {
-		return fileUrl;
-	}
-	public void setFileUrl(String fileUrl) {
-		this.fileUrl = fileUrl;
-	}
-	public Date getCreateTime() {
-		return createTime;
-	}
-	public void setCreateTime(Date createTime) {
-		this.createTime = createTime;
-	}
-	public String getCreateUser() {
-		return createUser;
-	}
-	public void setCreateUser(String createUser) {
-		this.createUser = createUser;
-	}
-	
-}
-
+package com.qmth.cqb.question.model;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @author  	chenken
+ * @date    	2017年8月1日 上午10:56:23
+ * @company 	QMTH
+ * @description QuestionAudio.java
+ */
+public class QuestionAudio implements Serializable{
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 7190928471784053821L;
+
+	private String id;
+	/**
+	 * 试题ID
+	 */
+	private String questionId;
+	/**
+	 * 文件名称
+	 */
+	private String fileName;
+	/**
+	 * 存放路径
+	 */
+	private String fileUrl;
+	/**
+	 * 创建时间
+	 */
+	private Date createTime;
+	/**
+	 * 创建人
+	 */
+	private String createUser;
+	
+	public QuestionAudio(String questionId,String fileName,String fileUrl){
+		this.questionId = questionId;
+		this.fileName = fileName;
+		this.fileUrl = fileUrl;
+	}
+	
+	public String getId() {
+		return id;
+	}
+	public void setId(String id) {
+		this.id = id;
+	}
+	public String getQuestionId() {
+		return questionId;
+	}
+	public void setQuestionId(String questionId) {
+		this.questionId = questionId;
+	}
+	public String getFileName() {
+		return fileName;
+	}
+	public void setFileName(String fileName) {
+		this.fileName = fileName;
+	}
+	public String getFileUrl() {
+		return fileUrl;
+	}
+	public void setFileUrl(String fileUrl) {
+		this.fileUrl = fileUrl;
+	}
+	public Date getCreateTime() {
+		return createTime;
+	}
+	public void setCreateTime(Date createTime) {
+		this.createTime = createTime;
+	}
+	public String getCreateUser() {
+		return createUser;
+	}
+	public void setCreateUser(String createUser) {
+		this.createUser = createUser;
+	}
+	
+}
+