|
@@ -0,0 +1,268 @@
|
|
|
+package com.ssj.service.kmt.kmt.service.impl;
|
|
|
+
|
|
|
+import com.alibaba.dubbo.config.annotation.Service;
|
|
|
+import com.alibaba.fastjson.JSON;
|
|
|
+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.exercisesys.request.ExerciseTeacherClassRequest;
|
|
|
+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.kmt.service.KmtExerciseService;
|
|
|
+import com.ssj.service.mapper.KmtExerciseMapper;
|
|
|
+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.elasticsearch.script.Script;
|
|
|
+import org.elasticsearch.script.ScriptType;
|
|
|
+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;
|
|
|
+
|
|
|
+@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());
|
|
|
+ kmtExerciseMapper.updateQuestionNumByBookIdAndNum(book.getBookId(), request.getNum());
|
|
|
+ //新增小题
|
|
|
+ if (request.getQuestionClassType() == 2){
|
|
|
+ KmtExerciseQuestion kmtExerciseQuestion = new KmtExerciseQuestion();
|
|
|
+ String newQuestionId = IdWorker.generateId();
|
|
|
+ kmtExerciseQuestion.setId(newQuestionId);
|
|
|
+ kmtExerciseQuestion.setBookId(nextQuestion.getBookId());
|
|
|
+ kmtExerciseQuestion.setUnitId(nextQuestion.getUnitId());
|
|
|
+ kmtExerciseQuestion.setBookCourseId(nextQuestion.getBookCourseId());
|
|
|
+ kmtExerciseQuestion.setBigQuestionIndex(nextQuestion.getBigQuestionIndex());
|
|
|
+ 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());
|
|
|
+ if (StringUtil.isBlank(nextQuestion.getParentId())){
|
|
|
+ kmtExerciseQuestion.setParentId(null);
|
|
|
+ kmtExerciseQuestion.setQuestionClassType(1);
|
|
|
+ kmtExerciseMapper.updateParentIdAndClassType(newQuestionId, 2, book.getBookId(), request.getNum());
|
|
|
+ } else {
|
|
|
+ kmtExerciseQuestion.setParentId(nextQuestion.getParentId());
|
|
|
+ kmtExerciseQuestion.setQuestionClassType(2);
|
|
|
+ }
|
|
|
+ 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");
|
|
|
+ kmtExerciseQuestionService.save(kmtExerciseQuestion);
|
|
|
+ saveJSONFileAndEs(kmtExerciseQuestion, request, questionImage);
|
|
|
+ } else {
|
|
|
+ //新增大题
|
|
|
+
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ KmtExerciseQuestion kmtExerciseQuestion = kmtExerciseQuestionService.getById(request.getQuestionId());
|
|
|
+ if (!kmtExerciseQuestion.getBigQuestionIndex().equals(request.getBigQuestionIndex())){
|
|
|
+ return responseEntity.failure(ResponseConstant.CODE_000, "大题号不能修改");
|
|
|
+ }
|
|
|
+ kmtExerciseMapper.updateQuestionEditData(request, questionImage, answerImage);
|
|
|
+ saveJSONFileAndEs(kmtExerciseQuestion, request, questionImage);
|
|
|
+ }
|
|
|
+ return responseEntity.success("成功");
|
|
|
+ } else {
|
|
|
+ return responseEntity.failure("没有操作权限");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 保存文件json和es
|
|
|
+ * @param kmtExerciseQuestion
|
|
|
+ * @param request
|
|
|
+ * @param questionImage
|
|
|
+ */
|
|
|
+ private void saveJSONFileAndEs (KmtExerciseQuestion kmtExerciseQuestion, AddExerciseQuestionRequest request, String questionImage){
|
|
|
+ String content = JSONFileUtil.readJSONFile(PropertiesUtil.getValue("EXERCISE_JSON_FILE_PATH") + kmtExerciseQuestion.getQuestionPath());
|
|
|
+ Map<String, Object> map = JSON.parseObject(content);
|
|
|
+ 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", request.getAnalysisJson());
|
|
|
+ JSONFileUtil.saveJSONFile(PropertiesUtil.getValue("EXERCISE_JSON_FILE_PATH") + kmtExerciseQuestion.getQuestionPath(), JSON.toJSONString(content));
|
|
|
+ ThreadPool.getInstance().addTask(new SyncSaveExerciseQuestionsTask(kmtExerciseMapper, exerciseQuestionSearchService, Collections.singletonList(kmtExerciseQuestion.getId())));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 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;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ @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)){
|
|
|
+
|
|
|
+ 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;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|