|
@@ -2,14 +2,17 @@ package cn.com.qmth.examcloud.core.questions.service;
|
|
|
|
|
|
import java.io.File;
|
|
|
import java.io.FileOutputStream;
|
|
|
+import java.io.IOException;
|
|
|
import java.io.OutputStream;
|
|
|
import java.math.BigDecimal;
|
|
|
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.Random;
|
|
|
import java.util.Set;
|
|
|
import java.util.UUID;
|
|
|
import java.util.regex.Pattern;
|
|
@@ -22,6 +25,7 @@ import cn.com.qmth.examcloud.core.questions.dao.CoursePropertyRepo;
|
|
|
import cn.com.qmth.examcloud.core.questions.dao.PropertyRepo;
|
|
|
import cn.com.qmth.examcloud.core.questions.dao.QuesPkgPathRepo;
|
|
|
import cn.com.qmth.examcloud.core.questions.dao.entity.QuestionPkgPath;
|
|
|
+import main.java.com.UpYun;
|
|
|
|
|
|
import org.apache.commons.io.FileUtils;
|
|
|
import org.apache.commons.io.IOUtils;
|
|
@@ -32,6 +36,7 @@ import org.docx4j.wml.P;
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.beans.factory.annotation.Value;
|
|
|
import org.springframework.data.domain.Example;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.web.multipart.commons.CommonsMultipartFile;
|
|
@@ -52,6 +57,7 @@ import cn.com.qmth.examcloud.core.questions.dao.entity.Property;
|
|
|
import cn.com.qmth.examcloud.core.questions.dao.entity.QuesOption;
|
|
|
import cn.com.qmth.examcloud.core.questions.dao.entity.QuesProperty;
|
|
|
import cn.com.qmth.examcloud.core.questions.dao.entity.Question;
|
|
|
+import cn.com.qmth.examcloud.core.questions.dao.entity.QuestionAudio;
|
|
|
import cn.com.qmth.examcloud.core.questions.dao.entity.QuestionType;
|
|
|
import cn.com.qmth.examcloud.core.questions.service.QuesService;
|
|
|
import cn.com.qmth.examcloud.core.questions.base.CommonUtils;
|
|
@@ -108,6 +114,23 @@ public class ImportPaperService {
|
|
|
@Autowired
|
|
|
PropertyRepo propertyRepo;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ QuestionAudioService questionAudioService;
|
|
|
+
|
|
|
+ @Value("${upyun.bucketName}")
|
|
|
+ protected String bucketName;
|
|
|
+
|
|
|
+ @Value("${upyun.userName}")
|
|
|
+ protected String userName;
|
|
|
+
|
|
|
+ @Value("${upyun.password}")
|
|
|
+ protected String password;
|
|
|
+
|
|
|
+ @Value("${upyun.audio.uploadUrl}")
|
|
|
+ private String upyunRadioPath;
|
|
|
+
|
|
|
+ public static final String TEMP_FILE_EXP = "docxExport/";
|
|
|
+
|
|
|
/**
|
|
|
* 获取上传文件
|
|
|
*
|
|
@@ -1756,7 +1779,7 @@ public class ImportPaperService {
|
|
|
paperDetailUnit.setSubScoreList(oldPaperDetailUnit.getSubScoreList());
|
|
|
paperDetailUnit.setPaperDetail(paperDetail);
|
|
|
paperDetailUnit.setQuestionType(oldPaperDetailUnit.getQuestionType());
|
|
|
- copyQuestion(paperDetailUnit,oldPaperDetailUnit,course);
|
|
|
+ copyQuestion(paperDetailUnit,oldPaperDetailUnit,course,user);
|
|
|
paperDetailUnit.setOptionOrder(oldPaperDetailUnit.getOptionOrder());
|
|
|
paperDetailUnit.setCreator(user.getDisplayName());
|
|
|
paperDetailUnit.setCreateTime(CommonUtils.getCurDateTime());
|
|
@@ -1769,7 +1792,7 @@ public class ImportPaperService {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private void copyQuestion(PaperDetailUnit paperDetailUnit,PaperDetailUnit oldPaperDetailUnit,Course course) {
|
|
|
+ private void copyQuestion(PaperDetailUnit paperDetailUnit,PaperDetailUnit oldPaperDetailUnit,Course course,User user) {
|
|
|
Question oldQuestion = oldPaperDetailUnit.getQuestion();
|
|
|
Question newQuestion = BeanCopierUtil.copyProperties(oldQuestion,Question.class);
|
|
|
QuestionPkgPath oldQuesPkgPath = quesPkgPathRepo.findFirstById(oldQuestion.getQuesPkgPathId());
|
|
@@ -1782,8 +1805,103 @@ public class ImportPaperService {
|
|
|
newQuestion.setQuesProperties(null);
|
|
|
newQuestion.setPropertyGroup(null);
|
|
|
newQuestion = quesRepo.save(newQuestion);
|
|
|
+ //复制音频
|
|
|
+ if(oldQuestion.getHasAudio()!=null && oldQuestion.getHasAudio()){
|
|
|
+ try {
|
|
|
+ //查询旧音频
|
|
|
+ List<QuestionAudio> oldQuestionAudios = questionAudioService.findQuestionAudiosByQuestionId(oldQuestion.getId());
|
|
|
+ //复制文件下载路径
|
|
|
+ String copyAudioPath = TEMP_FILE_EXP + File.separator + user.getDisplayName()+"_copyAudioPath";
|
|
|
+ //新建文件夹
|
|
|
+ File copyAudioDir = new File(copyAudioPath);
|
|
|
+ if(!copyAudioDir.exists()){
|
|
|
+ copyAudioDir.mkdirs();
|
|
|
+ }
|
|
|
+ for(QuestionAudio oldAudio:oldQuestionAudios){
|
|
|
+ //生成随机数,防止文件重名
|
|
|
+ Random random = new Random();
|
|
|
+ int randomNumber = random.nextInt(1000);
|
|
|
+ //定义文件下载名称,下载音频文件
|
|
|
+ String newAudioFileName = newQuestion.getId()+"_"+randomNumber+"_"+ oldAudio.getFileName();
|
|
|
+ UpYun upyun = new UpYun(bucketName,userName,password);
|
|
|
+ //下载音频
|
|
|
+ File audioFile = new File(copyAudioPath + File.separator + newAudioFileName);
|
|
|
+ try{
|
|
|
+ upyun.readFile(oldAudio.getFileUrl(), audioFile);
|
|
|
+ }catch(Exception e){
|
|
|
+ e.printStackTrace();
|
|
|
+ throw new RuntimeException("下载音频失败");
|
|
|
+ }
|
|
|
+ //重新上传新的音频文件
|
|
|
+ upyun.writeFile(upyunRadioPath+newAudioFileName, audioFile,true);
|
|
|
+ audioFile.delete();
|
|
|
+ //拷贝旧对象
|
|
|
+ QuestionAudio newAudio = new QuestionAudio(newQuestion.getId(), oldAudio.getFileName(), upyunRadioPath+newAudioFileName);
|
|
|
+ newAudio.setCreateTime(new Date());
|
|
|
+ newAudio.setCreateUser(user.getDisplayName());
|
|
|
+ questionAudioService.saveQuestionAudio(newAudio,user);
|
|
|
+ }
|
|
|
+ //删除文件夹
|
|
|
+ copyAudioDir.delete();
|
|
|
+ //查询新音频
|
|
|
+ List<QuestionAudio> newQuestionAudios = questionAudioService.findQuestionAudiosByQuestionId(newQuestion.getId());
|
|
|
+ Map<String,String> newMap = new HashMap<String, String>();
|
|
|
+ for(QuestionAudio audio:newQuestionAudios){
|
|
|
+ newMap.put(audio.getFileName(), audio.getId());
|
|
|
+ }
|
|
|
+ //在题干html片段中替换音频存储id
|
|
|
+ String body = newQuestion.getQuesBody();
|
|
|
+ List<String> ids = CommonUtils.getTagANames(body);
|
|
|
+ List<String> names = CommonUtils.getTagANames2(body);
|
|
|
+ Map<String, String> oldBodyMap = new HashMap<String, String>();
|
|
|
+ for(int i=0;i<ids.size();i++){
|
|
|
+ oldBodyMap.put(names.get(i), ids.get(i));
|
|
|
+ }
|
|
|
+ for(String key:oldBodyMap.keySet()){
|
|
|
+ body = body.replace(oldBodyMap.get(key), newMap.get(key));
|
|
|
+ }
|
|
|
+ newQuestion.setQuesBody(body);
|
|
|
+ //替换选项中的音频存储id
|
|
|
+ if(newQuestion.getQuesOptions()!=null&&newQuestion.getQuesOptions().size()>0){
|
|
|
+ for(QuesOption option:newQuestion.getQuesOptions()){
|
|
|
+ String newOptionBody = option.getOptionBody();
|
|
|
+ List<String> optionIds = CommonUtils.getTagANames(newOptionBody);
|
|
|
+ List<String> optionNames = CommonUtils.getTagANames2(newOptionBody);
|
|
|
+ Map<String, String> oldOptionMap = new HashMap<String, String>();
|
|
|
+ for(int i=0;i<optionIds.size();i++){
|
|
|
+ oldOptionMap.put(optionNames.get(i), optionIds.get(i));
|
|
|
+ }
|
|
|
+ for(String key:oldOptionMap.keySet()){
|
|
|
+ newOptionBody = newOptionBody.replace(oldOptionMap.get(key), newMap.get(key));
|
|
|
+ }
|
|
|
+ option.setOptionBody(newOptionBody);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ newQuestion = quesRepo.save(newQuestion);
|
|
|
+ }catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
paperDetailUnit.setQuestion(newQuestion);
|
|
|
}
|
|
|
+
|
|
|
+ public static void main(String[] args){
|
|
|
+ try {
|
|
|
+ String copyAudioPath = "H:" + File.separator + "audio";
|
|
|
+ String newAudioFileName = "111_2.mp3";
|
|
|
+ UpYun upyun = new UpYun("exam-cloud-test","examcloud","examcloud123456");
|
|
|
+ //下载音频
|
|
|
+ File audioFile = new File(copyAudioPath + File.separator + newAudioFileName);
|
|
|
+ upyun.readFile("/comm-ques-bank/dev/audio/5b387c9f80a362313ce94162_503_1_1_1.mp3", audioFile);
|
|
|
+ //重新上传新的音频文件
|
|
|
+ File audioFileNew = new File(copyAudioPath + File.separator + newAudioFileName);
|
|
|
+ upyun.writeFile("/comm-ques-bank/dev/audio/"+newAudioFileName, audioFileNew,true);
|
|
|
+ //audioFile.delete();
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ System.out.println("OK");
|
|
|
+ }
|
|
|
|
|
|
//克隆原试卷所有属性
|
|
|
private Paper cloneOldPaper(Paper oldPaper,String paperName,Course course, User user) {
|