|
|
@@ -0,0 +1,343 @@
|
|
|
+package com.ssj.service.kmt.kmt.service.impl;
|
|
|
+
|
|
|
+import com.alibaba.dubbo.config.annotation.Service;
|
|
|
+import com.alibaba.fastjson.JSON;
|
|
|
+import com.alibaba.fastjson.JSONArray;
|
|
|
+import com.ssj.bean.kmt.kmt.domain.KmtExerciseBook;
|
|
|
+import com.ssj.bean.kmt.kmt.domain.KmtExerciseQuestion;
|
|
|
+import com.ssj.bean.weixin.libmy.domain.TbLibManager;
|
|
|
+import com.ssj.dao.weixin.library.dao.IBookManagerDao;
|
|
|
+import com.ssj.es.service.ExerciseQuestionSearchService;
|
|
|
+import com.ssj.framework.core.util.PropertiesUtil;
|
|
|
+import com.ssj.framework.core.util.ResponseConstant;
|
|
|
+import com.ssj.framework.core.util.ResponseEntity;
|
|
|
+import com.ssj.framework.core.util.StringUtil;
|
|
|
+import com.ssj.framework.idworker.IdWorker;
|
|
|
+import com.ssj.framework.weixin.util.DateUtil;
|
|
|
+import com.ssj.kmt.utils.JSONFileUtil;
|
|
|
+import com.ssj.service.kmt.request.rollbackai.AddExerciseQuestionRequest;
|
|
|
+import com.ssj.service.kmt.request.rollbackai.ExerciseQuestionDealRequest;
|
|
|
+import com.ssj.service.kmt.service.KmtExerciseBookService;
|
|
|
+import com.ssj.service.kmt.service.KmtExerciseQuestionDealService;
|
|
|
+import com.ssj.service.kmt.service.KmtExerciseQuestionService;
|
|
|
+import com.ssj.service.mapper.KmtExerciseMapper;
|
|
|
+import com.ssj.service.task.SyncSaveExerciseBookCourseTask;
|
|
|
+import com.ssj.service.task.SyncSaveExerciseBookTask;
|
|
|
+import com.ssj.service.task.SyncSaveExerciseQuestionsTask;
|
|
|
+import com.ssj.taskthread.ThreadPool;
|
|
|
+import com.ssj.utils.ExerciseUtil;
|
|
|
+import org.apache.commons.collections.CollectionUtils;
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
+import org.elasticsearch.index.query.QueryBuilder;
|
|
|
+import org.elasticsearch.index.query.QueryBuilders;
|
|
|
+import org.slf4j.Logger;
|
|
|
+import org.slf4j.LoggerFactory;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+
|
|
|
+import java.util.*;
|
|
|
+import java.util.regex.Matcher;
|
|
|
+import java.util.regex.Pattern;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+@Service
|
|
|
+public class KmtExerciseQuestionDealServiceImpl implements KmtExerciseQuestionDealService {
|
|
|
+
|
|
|
+ protected Logger logger = LoggerFactory.getLogger(this.getClass());
|
|
|
+ @Autowired
|
|
|
+ private IBookManagerDao bookManagerDao;
|
|
|
+ @Autowired
|
|
|
+ private KmtExerciseQuestionService kmtExerciseQuestionService;
|
|
|
+ @Autowired
|
|
|
+ private KmtExerciseMapper kmtExerciseMapper;
|
|
|
+ @Autowired
|
|
|
+ private ExerciseQuestionSearchService exerciseQuestionSearchService;
|
|
|
+ @Autowired
|
|
|
+ private KmtExerciseBookService kmtExerciseBookService;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ResponseEntity addOrEditExerciseQuestion(String userId, AddExerciseQuestionRequest request) {
|
|
|
+ ResponseEntity responseEntity = new ResponseEntity();
|
|
|
+ if (isManagerSubmit(userId)){
|
|
|
+ String questionImage = getImagePath(request.getQuestion());
|
|
|
+ String answerImage = getImagePath(request.getAnswer());
|
|
|
+
|
|
|
+ if (StringUtils.isBlank(request.getQuestionId())){
|
|
|
+ //题目id不存在则是新增, 新增需要把一个num减1
|
|
|
+ KmtExerciseBook book = kmtExerciseBookService.getById(request.getExerciseBookId());
|
|
|
+ KmtExerciseQuestion nextQuestion = kmtExerciseMapper.findByBookIdAndNum(book.getBookId(), request.getNum());
|
|
|
+ //新增小题
|
|
|
+ if (request.getQuestionClassType() == 2){
|
|
|
+ KmtExerciseQuestion newQuestion = saveQuestion(book, request, nextQuestion, questionImage, answerImage);
|
|
|
+ saveJSONFile(newQuestion, request, questionImage);
|
|
|
+ ThreadPool.getInstance().addTask(new SyncSaveExerciseBookTask(kmtExerciseMapper, exerciseQuestionSearchService, book.getBookId()));
|
|
|
+ } else {
|
|
|
+ //新增大题, 如果已存在当前大题号,则报错
|
|
|
+ String bqi = kmtExerciseMapper.findBigQuestionIndexByBookCourseId(nextQuestion.getBookCourseId(), request.getBigQuestionIndex());
|
|
|
+ if (StringUtil.isBlank(bqi)){
|
|
|
+ KmtExerciseQuestion newQuestion = saveQuestion(book, request, nextQuestion, questionImage, answerImage);
|
|
|
+ saveJSONFile(newQuestion, request, questionImage);
|
|
|
+ ThreadPool.getInstance().addTask(new SyncSaveExerciseBookTask(kmtExerciseMapper, exerciseQuestionSearchService, book.getBookId()));
|
|
|
+ } else {
|
|
|
+ responseEntity.failure(ResponseConstant.CODE_000, "已存在大题号,请在大题号下直接添加小题");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ KmtExerciseQuestion kmtExerciseQuestion = kmtExerciseQuestionService.getById(request.getQuestionId());
|
|
|
+ if (!kmtExerciseQuestion.getBigQuestionIndex().equals(request.getBigQuestionIndex())){
|
|
|
+ return responseEntity.failure(ResponseConstant.CODE_000, "大题号不能修改");
|
|
|
+ }
|
|
|
+ kmtExerciseMapper.updateQuestionEditData(request, questionImage, answerImage);
|
|
|
+ saveJSONFile(kmtExerciseQuestion, request, questionImage);
|
|
|
+ }
|
|
|
+ return responseEntity.success("成功");
|
|
|
+ } else {
|
|
|
+ return responseEntity.failure("没有操作权限");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 保存文件json和es
|
|
|
+ * @param kmtExerciseQuestion
|
|
|
+ * @param request
|
|
|
+ * @param questionImage
|
|
|
+ */
|
|
|
+ private void saveJSONFile (KmtExerciseQuestion kmtExerciseQuestion, AddExerciseQuestionRequest request, String questionImage){
|
|
|
+ String content = JSONFileUtil.readJSONFile(PropertiesUtil.getValue("EXERCISE_JSON_FILE_PATH") + kmtExerciseQuestion.getQuestionPath());
|
|
|
+ Map<String, Object> map = null;
|
|
|
+ if (StringUtil.isBlank(content)){
|
|
|
+ map = new HashMap<>();
|
|
|
+ } else {
|
|
|
+ map = JSON.parseObject(content, Map.class);
|
|
|
+ }
|
|
|
+ map.put("question", request.getQuestion());
|
|
|
+ map.put("question_text", request.getQuestionText());
|
|
|
+ map.put("question_json", Collections.singletonList(ExerciseUtil.getExerciseQuestionAnswerValue(questionImage)));
|
|
|
+ map.put("option_answer", request.getAnswer());
|
|
|
+ map.put("answer_json", request.getAnswerJson());
|
|
|
+ map.put("analysis", request.getQuestionAnalysis());
|
|
|
+ map.put("analysis_json", JSONArray.parse(request.getAnalysisJson()));
|
|
|
+ JSONFileUtil.saveJSONFile(PropertiesUtil.getValue("EXERCISE_JSON_FILE_PATH") + kmtExerciseQuestion.getQuestionPath(), JSON.toJSONString(map));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * chax
|
|
|
+ * @param htmlStr
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private String getImagePath (String htmlStr) {
|
|
|
+ String result = null;
|
|
|
+ List<String> list = new ArrayList<>();
|
|
|
+ String img = "";
|
|
|
+ Pattern p_image;
|
|
|
+ Matcher m_image;
|
|
|
+ // String regEx_img = "<img.*src=(.*?)[^>]*?>"; //图片链接地址
|
|
|
+ String regEx_img = "<img.*src\\s*=\\s*(.*?)[^>]*?>";
|
|
|
+ p_image = Pattern.compile(regEx_img, Pattern.CASE_INSENSITIVE);
|
|
|
+ m_image = p_image.matcher(htmlStr);
|
|
|
+ while (m_image.find()) {
|
|
|
+ // 得到<img />数据
|
|
|
+ img = m_image.group();
|
|
|
+ // 匹配<img>中的src数据
|
|
|
+ Matcher m = Pattern.compile("src\\s*=\\s*[\"|\']?(.*?)([\"|\']|>|\\s+)").matcher(img);
|
|
|
+ while (m.find()) {
|
|
|
+ list.add(m.group(1));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (list.size() > 0){
|
|
|
+ result = list.get(0).replace(PropertiesUtil.getValue("STATIC_FILE_URL"), "");
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ private KmtExerciseQuestion saveQuestion(KmtExerciseBook book,AddExerciseQuestionRequest request, KmtExerciseQuestion nextQuestion, String questionImage, String answerImage){
|
|
|
+ kmtExerciseMapper.updateQuestionNumByBookIdAndNum(book.getBookId(), request.getNum());
|
|
|
+ KmtExerciseQuestion kmtExerciseQuestion = new KmtExerciseQuestion();
|
|
|
+ String newQuestionId = IdWorker.generateId();
|
|
|
+ kmtExerciseQuestion.setId(newQuestionId);
|
|
|
+ kmtExerciseQuestion.setBookId(nextQuestion.getBookId());
|
|
|
+ kmtExerciseQuestion.setUnitId(nextQuestion.getUnitId());
|
|
|
+ kmtExerciseQuestion.setBookCourseId(nextQuestion.getBookCourseId());
|
|
|
+ if (request.getQuestionClassType() == 2){
|
|
|
+ kmtExerciseQuestion.setBigQuestionIndex(nextQuestion.getBigQuestionIndex());
|
|
|
+ if (StringUtil.isBlank(nextQuestion.getParentId())){
|
|
|
+ kmtExerciseQuestion.setParentId(null);
|
|
|
+ kmtExerciseQuestion.setQuestionClassType(1);
|
|
|
+ } else {
|
|
|
+ kmtExerciseQuestion.setParentId(nextQuestion.getParentId());
|
|
|
+ kmtExerciseQuestion.setQuestionClassType(2);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ kmtExerciseQuestion.setBigQuestionIndex(request.getBigQuestionIndex());
|
|
|
+ kmtExerciseQuestion.setParentId(null);
|
|
|
+ kmtExerciseQuestion.setQuestionClassType(0);
|
|
|
+ }
|
|
|
+ kmtExerciseQuestion.setPageIndex(nextQuestion.getPageIndex());
|
|
|
+ kmtExerciseQuestion.setImage(questionImage);
|
|
|
+ kmtExerciseQuestion.setCreateTime(new Date());
|
|
|
+ kmtExerciseQuestion.setDealStatus(3);
|
|
|
+ kmtExerciseQuestion.setAnswerImage(answerImage);
|
|
|
+ kmtExerciseQuestion.setNum(nextQuestion.getNum());
|
|
|
+ kmtExerciseQuestion.setSmallQuestionName(request.getSmallQuestionIndex());
|
|
|
+ kmtExerciseQuestion.setCourseName(nextQuestion.getCourseName());
|
|
|
+ kmtExerciseQuestion.setIsCommonFlag(nextQuestion.getIsCommonFlag());
|
|
|
+ kmtExerciseQuestion.setExerciseBookId(nextQuestion.getExerciseBookId());
|
|
|
+ kmtExerciseQuestion.setHandlerSubmitTime(DateUtil.parse_yyyyMMddHHmmss("1970-01-01 00:00:01"));
|
|
|
+ kmtExerciseQuestion.setQuestionPath(nextQuestion.getQuestionPath().substring(0, nextQuestion.getQuestionPath().lastIndexOf("/")) + "/" + newQuestionId + ".json");
|
|
|
+ logger.error(JSON.toJSONString(kmtExerciseQuestion));
|
|
|
+ kmtExerciseQuestion = kmtExerciseQuestionService.save(kmtExerciseQuestion);
|
|
|
+ if (request.getQuestionClassType() == 2 && StringUtil.isBlank(nextQuestion.getParentId())) {
|
|
|
+ kmtExerciseMapper.updateParentIdAndClassType(kmtExerciseQuestion.getId(), 2, book.getBookId(), request.getNum());
|
|
|
+ }
|
|
|
+ return kmtExerciseQuestion;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ResponseEntity deleteExerciseQuestion(String userId, ExerciseQuestionDealRequest request) {
|
|
|
+ ResponseEntity responseEntity = new ResponseEntity();
|
|
|
+ if (isManagerSubmit(userId)){
|
|
|
+ if (request.getQuestionClassType() == 2){
|
|
|
+ this.deleteOneQuestions(request.getQuestionId());
|
|
|
+ } else {
|
|
|
+ this.deleteOneBigQuestions(request.getQuestionId());
|
|
|
+ }
|
|
|
+ return responseEntity.success("成功");
|
|
|
+ } else {
|
|
|
+ return responseEntity.failure("没有操作权限");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 删除小题
|
|
|
+ * @param questionId
|
|
|
+ */
|
|
|
+ private void deleteOneQuestions(String questionId){
|
|
|
+ KmtExerciseQuestion kmtExerciseQuestion = kmtExerciseQuestionService.getById(questionId);
|
|
|
+ if (kmtExerciseQuestion != null){
|
|
|
+ //如果删除的是大题,找到第二个题,把它设置为大题
|
|
|
+ if (kmtExerciseQuestion.getQuestionClassType() == 1){
|
|
|
+ List<String> questionIds = kmtExerciseMapper.findQuestionIdByParentId(questionId);
|
|
|
+ int questionClassType = 0;
|
|
|
+ if (questionIds.size() > 2) {
|
|
|
+ //删除后不只一个小题
|
|
|
+ questionClassType = 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ //更新兄弟题目字段
|
|
|
+ if (questionIds.size() > 1){
|
|
|
+ String parentId = questionIds.get(1);
|
|
|
+ kmtExerciseMapper.updateKmtExerciseQuestionClassTypeAndParentId(null, questionClassType, parentId);
|
|
|
+ for (int i = 2; i < questionIds.size(); i++){
|
|
|
+ kmtExerciseMapper.updateKmtExerciseQuestionClassTypeAndParentId(parentId, 2, questionIds.get(i));
|
|
|
+ }
|
|
|
+ ThreadPool.getInstance().addTask(new SyncSaveExerciseQuestionsTask(kmtExerciseMapper,
|
|
|
+ exerciseQuestionSearchService, questionIds.subList(1, questionIds.size())));
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ logger.info("删除={}", JSON.toJSONString(kmtExerciseQuestion));
|
|
|
+ kmtExerciseQuestionService.delete(questionId);
|
|
|
+
|
|
|
+ //删除es
|
|
|
+ exerciseQuestionSearchService.delete(questionId);
|
|
|
+ QueryBuilder queryBuilder = QueryBuilders.termQuery("question_id.keyword", questionId);
|
|
|
+ exerciseQuestionSearchService.deleteByQuery("kmt_exercise_question_know", queryBuilder);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 删除大题
|
|
|
+ * @param questionId
|
|
|
+ */
|
|
|
+ private void deleteOneBigQuestions(String questionId){
|
|
|
+ List<String> questionIds = kmtExerciseMapper.findQuestionIdByParentId(questionId);
|
|
|
+ if (CollectionUtils.isNotEmpty(questionIds)){
|
|
|
+ for (String qid : questionIds) {
|
|
|
+ kmtExerciseQuestionService.delete(qid);
|
|
|
+ }
|
|
|
+ //删除es
|
|
|
+ QueryBuilder queryBuilder = QueryBuilders.termsQuery("id.keyword", questionIds);
|
|
|
+ exerciseQuestionSearchService.deleteByQuery("kmt_exercise_questions", queryBuilder);
|
|
|
+ queryBuilder = QueryBuilders.termsQuery("question_id.keyword", questionIds);
|
|
|
+ exerciseQuestionSearchService.deleteByQuery("kmt_exercise_question_know", queryBuilder);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ResponseEntity moveExerciseQuestion(String userId, ExerciseQuestionDealRequest request) {
|
|
|
+ ResponseEntity responseEntity = new ResponseEntity();
|
|
|
+ if (isManagerSubmit(userId)){
|
|
|
+ KmtExerciseQuestion kmtExerciseQuestion = kmtExerciseQuestionService.getById(request.getQuestionId());
|
|
|
+ if (request.getQuestionClassType() == 2){
|
|
|
+ //如果一个小题不能移动
|
|
|
+ if(kmtExerciseQuestion.getQuestionClassType() == 0) {
|
|
|
+ return responseEntity.failure(ResponseConstant.CODE_000, "单题不能移动小题,请使用移动大题功能");
|
|
|
+ }
|
|
|
+ //移动小题
|
|
|
+ if (request.getType() == 1){
|
|
|
+ //上移
|
|
|
+ kmtExerciseMapper.updateByBookIdAndNum(kmtExerciseQuestion.getBookId(), kmtExerciseQuestion.getNum(),kmtExerciseQuestion.getNum() - 1);
|
|
|
+ kmtExerciseMapper.updateQuestionNumByQuestionId(kmtExerciseQuestion.getId(), kmtExerciseQuestion.getNum() - 1);
|
|
|
+ } else if (request.getType() == 2){
|
|
|
+ kmtExerciseMapper.updateByBookIdAndNum(kmtExerciseQuestion.getBookId(), kmtExerciseQuestion.getNum(), kmtExerciseQuestion.getNum() + 1);
|
|
|
+ kmtExerciseMapper.updateQuestionNumByQuestionId(kmtExerciseQuestion.getId(), kmtExerciseQuestion.getNum() + 1);
|
|
|
+ }
|
|
|
+ } else if (request.getQuestionClassType() == 1){
|
|
|
+ if (request.getType() == 1){
|
|
|
+ //大题上移, 先查找上一题的题目id列表
|
|
|
+ KmtExerciseQuestion previousQuestion = kmtExerciseMapper.findByBookIdAndNum(kmtExerciseQuestion.getBookId(), kmtExerciseQuestion.getNum() - 1);
|
|
|
+ if (previousQuestion ==null || !previousQuestion.getBookCourseId().equals(kmtExerciseQuestion.getBookCourseId())){
|
|
|
+ return responseEntity.failure(ResponseConstant.CODE_000, "已移动到第一题位置");
|
|
|
+ }
|
|
|
+
|
|
|
+ List<KmtExerciseQuestion> previousQuestions = kmtExerciseMapper.findQuestionsByBookCourseIdAndBigIndex(previousQuestion.getBookCourseId(), previousQuestion.getBigQuestionIndex());
|
|
|
+ List<KmtExerciseQuestion> thisQuestions = kmtExerciseMapper.findQuestionsByBookCourseIdAndBigIndex(kmtExerciseQuestion.getBookCourseId(), kmtExerciseQuestion.getBigQuestionIndex());
|
|
|
+ if (previousQuestions != null && thisQuestions != null){
|
|
|
+ int preSize = previousQuestions.size();
|
|
|
+ int thisSize = thisQuestions.size();
|
|
|
+ List<String> previousIds = previousQuestions.stream().map(KmtExerciseQuestion::getId).collect(Collectors.toList());
|
|
|
+ List<String> thisIds = thisQuestions.stream().map(KmtExerciseQuestion::getId).collect(Collectors.toList());
|
|
|
+ kmtExerciseMapper.updateQuestionMinusNumByQuestionIds(thisIds, preSize);
|
|
|
+ kmtExerciseMapper.updateQuestionAddNumByQuestionIds(previousIds, thisSize);
|
|
|
+ }
|
|
|
+ } else if (request.getType() == 2){
|
|
|
+ List<KmtExerciseQuestion> thisQuestions = kmtExerciseMapper.findQuestionsByBookCourseIdAndBigIndex(kmtExerciseQuestion.getBookCourseId(), kmtExerciseQuestion.getBigQuestionIndex());
|
|
|
+ int thisSize = thisQuestions.size();
|
|
|
+ KmtExerciseQuestion nextQuestion = kmtExerciseMapper.findByBookIdAndNum(kmtExerciseQuestion.getBookId(), kmtExerciseQuestion.getNum() + thisSize);
|
|
|
+ if (nextQuestion == null || !nextQuestion.getBookCourseId().equals(kmtExerciseQuestion.getBookCourseId())){
|
|
|
+ return responseEntity.failure(ResponseConstant.CODE_000, "已移动到最后一题位置");
|
|
|
+ }
|
|
|
+ List<KmtExerciseQuestion> nextQuestions = kmtExerciseMapper.findQuestionsByBookCourseIdAndBigIndex(nextQuestion.getBookCourseId(), nextQuestion.getBigQuestionIndex());
|
|
|
+ if (nextQuestions != null && thisQuestions != null){
|
|
|
+ int nextSize = nextQuestions.size();
|
|
|
+ List<String> nextIds = nextQuestions.stream().map(KmtExerciseQuestion::getId).collect(Collectors.toList());
|
|
|
+ List<String> thisIds = thisQuestions.stream().map(KmtExerciseQuestion::getId).collect(Collectors.toList());
|
|
|
+ kmtExerciseMapper.updateQuestionMinusNumByQuestionIds(nextIds, thisSize);
|
|
|
+ kmtExerciseMapper.updateQuestionAddNumByQuestionIds(thisIds, nextSize);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ThreadPool.getInstance().addTask(new SyncSaveExerciseBookCourseTask(kmtExerciseMapper, exerciseQuestionSearchService, kmtExerciseQuestion.getBookCourseId()));
|
|
|
+ return responseEntity.success("成功");
|
|
|
+ } else {
|
|
|
+ return responseEntity.failure("没有操作权限");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 是否是管理员提交
|
|
|
+ * @param userId
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private boolean isManagerSubmit (String userId){
|
|
|
+ TbLibManager manager = bookManagerDao.findByUserIdAndType(userId, 18);
|
|
|
+ if (manager != null) {
|
|
|
+ //管理员把状态设置为3,不改任何状态
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|