Browse Source

图片题目去除功能

chen 4 years ago
parent
commit
905cbbfe76

+ 2 - 2
ssj-common-oss/src/main/java/com/ssj/framework/core/util/OSSUtils.java

@@ -147,12 +147,12 @@ public class OSSUtils {
 
 
     //重载方法 下载文件
-    public void downloadFile(String downloadPath,String key){
+    public static void downloadFile(String downloadPath,String key){
         downloadFile(bucketName,downloadPath,key);
     }
 
     //重载方法 下载文件
-    public void downloadFile(String bucketName,String downloadPath,String key){
+    public static void downloadFile(String bucketName,String downloadPath,String key){
         OSSClient ossClient=OSSUtils.getOSSClient();
         try {
             DownloadFileRequest downloadFileRequest=new DownloadFileRequest(bucketName, key);

+ 16 - 0
ssj-kmt-exercise-api/src/main/java/com/ssj/aijia/kmt/exercise/controller/KmtExerciseController.java

@@ -21,6 +21,7 @@ import com.ssj.service.kmt.dto.KmtSysUserDTO;
 import com.ssj.service.kmt.dto.exercise.ExerciseQuestionRollbacks;
 import com.ssj.service.kmt.exercise.request.SubmitAnswerProofreadResultReq;
 import com.ssj.service.kmt.request.*;
+import com.ssj.service.kmt.request.questionmark.QuestionNumMarkRemoveVo;
 import com.ssj.service.kmt.request.rollbackai.AddExerciseQuestionRequest;
 import com.ssj.service.kmt.request.rollbackai.ExerciseBooksEditRequest;
 import com.ssj.service.kmt.request.rollbackai.ExerciseQuestionDealRequest;
@@ -721,4 +722,19 @@ public class KmtExerciseController extends BaseController {
         return responseEntity;
     }
 
+    @RequestMapping(value = "/removeQuestionNumMark", method = RequestMethod.POST)
+    @ApiOperation(value = "抹除题目题号", httpMethod = "POST", notes = "抹除题目题号")
+    public ResponseEntity removeQuestionNumMark(@RequestParam(name = "accessToken") String accessToken,
+                                                    @RequestBody QuestionNumMarkRemoveVo request) {
+        ResponseEntity responseEntity = new ResponseEntity();
+        try {
+            String userId = tokenManager.getUserId(accessToken);
+            responseEntity = kmtExerciseQuestionDealService.removeQuestionNumMark(userId, request);
+        } catch (Exception e) {
+            logger.error("异常", e);
+            responseEntity.failure(ResponseConstant.CODE_500, "系统繁忙,请稍后重试");
+        }
+        return responseEntity;
+    }
+
 }

+ 113 - 4
ssj-kmt-exercise-service-impl/src/main/java/com/ssj/service/kmt/kmt/service/impl/KmtExerciseQuestionDealServiceImpl.java

@@ -9,16 +9,14 @@ 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.core.util.*;
 import com.ssj.framework.idworker.IdWorker;
 import com.ssj.framework.weixin.util.DateUtil;
 import com.ssj.kmt.utils.JSONFileUtil;
 import com.ssj.service.kmt.constant.KnowledgeVersion;
 import com.ssj.service.kmt.dto.exercise.ExerciseBookEditDto;
 import com.ssj.service.kmt.dto.exercise.ExerciseQuestionEditDto;
+import com.ssj.service.kmt.request.questionmark.QuestionNumMarkRemoveVo;
 import com.ssj.service.kmt.request.rollbackai.AddExerciseQuestionRequest;
 import com.ssj.service.kmt.request.rollbackai.ExerciseBooksEditRequest;
 import com.ssj.service.kmt.request.rollbackai.ExerciseQuestionDealRequest;
@@ -34,6 +32,7 @@ import com.ssj.taskthread.ThreadPool;
 import com.ssj.utils.ExerciseUtil;
 import com.ssj.utils.SortByChineseUtil;
 import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.elasticsearch.index.query.QueryBuilder;
 import org.elasticsearch.index.query.QueryBuilders;
@@ -41,6 +40,10 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 
+import javax.imageio.ImageIO;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.FileOutputStream;
 import java.util.*;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -528,4 +531,110 @@ public class KmtExerciseQuestionDealServiceImpl implements KmtExerciseQuestionDe
         data.put("list", list);
         return new ResponseEntity().success(data, "成功");
     }
+
+    @Override
+    public ResponseEntity removeQuestionNumMark(String userId, QuestionNumMarkRemoveVo request) {
+        KmtExerciseQuestion kmtExerciseQuestion = kmtExerciseQuestionService.getById(request.getQuestionId());
+        kmtExerciseMapper.updateQuestionStartPointAndEndPoint(request.getStartX(), request.getStartY(),
+                request.getEndX(), request.getEndY(), request.getQuestionId());
+        ResponseEntity responseEntity = new ResponseEntity();
+        TbLibManager manager = bookManagerDao.findByUserIdAndType(userId, 18);
+        if (manager != null && kmtExerciseQuestion.getDealStatus() > 3 && kmtExerciseQuestion.getDealStatus() != 7){
+            this.removeQuestionNumMark(request.getStartX(), request.getStartY(), request.getEndX(), request.getEndY(), kmtExerciseQuestion.getImage());
+        }
+        return responseEntity.success("成功");
+    }
+
+    @Override
+    public void  removeQuestionNumMark(int startX, int startY, int endX, int endY, String filePath) {
+        int temp = 0;
+        if (startX > endX){
+            temp = startX;
+            startX = endX;
+            endX = temp;
+        }
+        if (startY > endY){
+            temp = startY;
+            startY = endY;
+            endY = temp;
+        }
+        if (StringUtil.isNotBlank(filePath) && endX > 0 && endY > 0){
+            //1、查询是否有备份图片,没有的话新增一个备份图片
+            this.checkBakImage(filePath);
+            //2、生成一个临时图片, 图片区域填充, 临时图片要随机, 把图片上传到oss
+            this.createNewFile(startX, startY, endX, endY, filePath);
+        }
+    }
+
+    /**
+     * 检查是否有备份图片
+     * @param relatePath
+     */
+    private void checkBakImage (String relatePath){
+        String bakParentPath = "/www/files/data/upload/ai/picture_bak/"; //备份图片父级目录
+        if (relatePath.indexOf("/ai/results") != -1){
+            String filePath = relatePath.replace("/ai/results/", bakParentPath); //备份图片绝对路径
+            //如果目录不存在,新建目录,如果存在,判断文件是否存在
+            String dir = filePath.substring(0, filePath.lastIndexOf("/") + 1);
+            File dirFile = new File(dir);
+            if (dirFile.isDirectory()) {
+                if (!dirFile.exists()){
+                    dirFile.mkdirs();
+                }
+                File file  = new File(filePath);
+                if (!file.exists()){
+                    OSSUtils.downloadFile(filePath, relatePath.substring(1));
+                }
+            }
+        } else {
+            logger.error("图片路径不存在 = {}", relatePath);
+        }
+    }
+
+    private void createNewFile (int startX, int startY, int endX, int endY, String relatePath) {
+        String tempPath = "/www/files/data/upload/ai/picture_bak/temp/";
+        String tempFilePath = tempPath + IdWorker.generateId() + relatePath.substring(relatePath.lastIndexOf("."));
+        File dirFile = new File(tempPath);
+        if (!dirFile.exists()){
+            dirFile.mkdirs();
+        }
+        OSSUtils.downloadFile(tempFilePath, relatePath.substring(1));
+        drawImagePartColorByPosition(startX, startY, endX, endY, tempFilePath);
+        OSSUtils.uploadFile(tempFilePath, relatePath.substring(1));
+        File tempFile = new File(tempFilePath);
+        tempFile.delete();
+    }
+
+    /**
+     * 区域颜色填充,以左上角颜色填充
+     * @param minx
+     * @param miny
+     * @param maxx
+     * @param maxy
+     * @param filePath
+     */
+    public void drawImagePartColorByPosition (int minx, int miny,  int maxx, int maxy, String filePath) {
+        BufferedImage bi = null;
+        try {
+            //有宽高的才处理
+            if (maxx > 0 && maxy > 0){
+                File file = new File(filePath);
+                bi = ImageIO.read(file);
+                int pixel = bi.getRGB(minx, miny); //左上角像素值
+//                int pixel = -256;
+                for (int i = minx; i < maxx; i++) {
+                    for (int j = miny; j < maxy; j++) {
+                        bi.setRGB(i, j, pixel);
+                    }
+                }
+
+                FileOutputStream ops = new FileOutputStream(file);
+                ImageIO.write(bi, filePath.substring(filePath.lastIndexOf(".") + 1), ops);
+                ops.flush();
+                ops.close();
+            }
+        } catch (Exception e) {
+            logger.error("异常", e);
+        }
+    }
 }

+ 4 - 1
ssj-kmt-exercise-service-impl/src/main/java/com/ssj/service/kmt/kmt/service/impl/KmtExerciseServiceImpl.java

@@ -88,7 +88,8 @@ public class KmtExerciseServiceImpl implements KmtExerciseService {
     private PushTemplateService pushTemplateService;
     @Autowired
     private KmtQualityQuestionsService kmtQualityQuestionsService;
-
+    @Autowired
+    private KmtExerciseQuestionDealService kmtExerciseQuestionDealService;
 
     @Autowired
     private TokenManager tokenManager;
@@ -433,6 +434,8 @@ public class KmtExerciseServiceImpl implements KmtExerciseService {
                     kmtExerciseQuestion.setDealStatus(4);
                 } else {
                     kmtExerciseQuestion.setDealStatus(5);
+                    kmtExerciseQuestionDealService.removeQuestionNumMark(Integer.parseInt(kmtExerciseQuestion.getConciseId()), kmtExerciseQuestion.getAnalysisSubmitType(),
+                            kmtExerciseQuestion.getUpdateType(), kmtExerciseQuestion.getEsLoaded(), kmtExerciseQuestion.getImage());
                 }
                 kmtExerciseQuestion.setPublishTime(new Date());
             } else if (kmtExerciseQuestion.getDealStatus() == 0 || kmtExerciseQuestion.getDealStatus() == 1){

+ 5 - 0
ssj-kmt-exercise-service-impl/src/main/java/com/ssj/service/kmt/kmt/service/impl/KmtExerciseSubmitServiceImpl.java

@@ -24,6 +24,7 @@ import com.ssj.service.kmt.dto.KnowledgeBaseDto;
 import com.ssj.service.kmt.exercisesys.enums.ProofreadStatusEnum;
 import com.ssj.service.kmt.request.AuditingV1Request;
 import com.ssj.service.kmt.request.QuestionUpdateRequest;
+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.kmt.service.KmtExerciseSubmitService;
@@ -69,6 +70,8 @@ public class KmtExerciseSubmitServiceImpl implements KmtExerciseSubmitService {
     private BaseSearchService baseSearchService;
     @Autowired
     private ExerciseQuestionSearchService exerciseQuestionSearchService;
+    @Autowired
+    private KmtExerciseQuestionDealService kmtExerciseQuestionDealService;
 
 
     @Override
@@ -509,6 +512,8 @@ public class KmtExerciseSubmitServiceImpl implements KmtExerciseSubmitService {
                     this.updateKmtQuestionCommonData(question, updateRequest);
                     question.setPublishTime(new Date());
                     question.setDealStatus(5);
+                    kmtExerciseQuestionDealService.removeQuestionNumMark(Integer.parseInt(question.getConciseId()), question.getAnalysisSubmitType(),
+                            question.getUpdateType(), question.getEsLoaded(), question.getImage());
                 }
             }
         }

+ 40 - 0
ssj-kmt-exercise-service/src/main/java/com/ssj/service/kmt/dto/ExerciseQuetionDto.java

@@ -92,6 +92,14 @@ public class ExerciseQuetionDto implements Serializable {
 
     private int isCommonFlag;
 
+    private int startX;
+
+    private int startY;
+
+    private int endX;
+
+    private int endY;
+
     @JSONField(serialize = false)
     private String handleUserId;
 
@@ -718,4 +726,36 @@ public class ExerciseQuetionDto implements Serializable {
     public void setIsCommonFlag(int isCommonFlag) {
         this.isCommonFlag = isCommonFlag;
     }
+
+    public int getStartX() {
+        return startX;
+    }
+
+    public void setStartX(int startX) {
+        this.startX = startX;
+    }
+
+    public int getStartY() {
+        return startY;
+    }
+
+    public void setStartY(int startY) {
+        this.startY = startY;
+    }
+
+    public int getEndX() {
+        return endX;
+    }
+
+    public void setEndX(int endX) {
+        this.endX = endX;
+    }
+
+    public int getEndY() {
+        return endY;
+    }
+
+    public void setEndY(int endY) {
+        this.endY = endY;
+    }
 }

+ 58 - 0
ssj-kmt-exercise-service/src/main/java/com/ssj/service/kmt/request/questionmark/QuestionNumMarkRemoveVo.java

@@ -0,0 +1,58 @@
+package com.ssj.service.kmt.request.questionmark;
+
+import com.ssj.bean.common.framework.core.domain.BaseRequest;
+
+public class QuestionNumMarkRemoveVo extends BaseRequest {
+
+    private static final long serialVersionUID = 1L;
+
+    private String questionId;
+
+    private int startX;
+
+    private int startY;
+
+    private int endX;
+
+    private int endY;
+
+    public String getQuestionId() {
+        return questionId;
+    }
+
+    public void setQuestionId(String questionId) {
+        this.questionId = questionId;
+    }
+
+    public int getStartX() {
+        return startX;
+    }
+
+    public void setStartX(int startX) {
+        this.startX = startX;
+    }
+
+    public int getStartY() {
+        return startY;
+    }
+
+    public void setStartY(int startY) {
+        this.startY = startY;
+    }
+
+    public int getEndX() {
+        return endX;
+    }
+
+    public void setEndX(int endX) {
+        this.endX = endX;
+    }
+
+    public int getEndY() {
+        return endY;
+    }
+
+    public void setEndY(int endY) {
+        this.endY = endY;
+    }
+}

+ 11 - 0
ssj-kmt-exercise-service/src/main/java/com/ssj/service/kmt/service/KmtExerciseQuestionDealService.java

@@ -1,6 +1,7 @@
 package com.ssj.service.kmt.service;
 
 import com.ssj.framework.core.util.ResponseEntity;
+import com.ssj.service.kmt.request.questionmark.QuestionNumMarkRemoveVo;
 import com.ssj.service.kmt.request.rollbackai.AddExerciseQuestionRequest;
 import com.ssj.service.kmt.request.rollbackai.ExerciseBooksEditRequest;
 import com.ssj.service.kmt.request.rollbackai.ExerciseQuestionDealRequest;
@@ -45,4 +46,14 @@ public interface KmtExerciseQuestionDealService {
      * @return
      */
     ResponseEntity findEditExerciseQuestions (ExerciseQuestionsEditRequest request);
+
+    /**
+     * 删除题号
+     * @param userId
+     * @param request
+     * @return
+     */
+    ResponseEntity removeQuestionNumMark (String userId, QuestionNumMarkRemoveVo request);
+
+    void  removeQuestionNumMark(int startX, int startY, int endX, int endY, String filePath);
 }

+ 4 - 0
ssj-mybatis-service-impl/src/main/java/com/ssj/service/mapper/KmtExerciseMapper.java

@@ -1263,4 +1263,8 @@ public interface KmtExerciseMapper {
 
     List<ExerciseBookEditDto> findErrorExerciseBooks(@Param("bookName") String bookName,
                                                      @Param("userId") String userId);
+
+    @Update("update kmt_exercise_questions set concise_id=#{startX}, analysis_submit_type=#{startY}, update_type=#{endX}," +
+            " es_loaded=#{endY} where id=#{questionId}")
+    int updateQuestionStartPointAndEndPoint (int startX, int startY, int endX, int endY, String questionId);
 }

+ 6 - 3
ssj-mybatis-service-impl/src/main/resources/mybatis/mapper/KmtExerciseMapper.xml

@@ -108,7 +108,8 @@
         eq.big_question_index, eq.small_question_name small_question_index, eq.is_common_flag,
         eq.deal_status question_status, eq.create_time, eq.remark reason, eq.from_user_id, eq.to_user_id,
         eq.question_type question_types, eq.difficulty_level difficulty_levels, eq.real_exam_type real_exam_types,
-        eq.training_skill training_skills, eq.parent_id, eq.proofread_status, eq.question_path, eq.num, eq.create_time
+        eq.training_skill training_skills, eq.parent_id, eq.proofread_status, eq.question_path, eq.num,
+        eq.image question_image, eq.concise_id start_X, eq.analysis_submit_type start_Y, eq.update_type end_X, eq.es_loaded end_Y
         from kmt_exercise_questions eq  left join kmt_exercise_book eb on eq.exercise_book_id=eb.id
         where eq.book_course_id = #{bookCourseId} and (eq.exercise_book_id=#{exerciseBookId} or eq.is_common_flag = 0)
         <if test = "dealType == 2">
@@ -155,7 +156,8 @@
         eq.big_question_index, eq.small_question_name small_question_index,
         eq.deal_status question_status, eq.create_time, eq.remark reason, eq.from_user_id, eq.to_user_id,
         eq.question_type question_types, eq.difficulty_level difficulty_levels, eq.real_exam_type real_exam_types,
-        eq.training_skill training_skills, eq.parent_id, eq.proofread_status, eq.question_path, eq.num, eq.create_time
+        eq.training_skill training_skills, eq.parent_id, eq.proofread_status, eq.question_path, eq.num,
+        eq.image question_image, eq.concise_id start_X, eq.analysis_submit_type start_Y, eq.update_type end_X, eq.es_loaded end_Y
         from kmt_exercise_questions eq  left join kmt_exercise_book eb on eq.exercise_book_id=eb.id
         where eq.book_course_id = #{bookCourseId} and eq.exercise_book_id=#{exerciseBookId}
         order by eq.num, eq.create_time
@@ -2026,7 +2028,8 @@
         eq.big_question_index, eq.small_question_name small_question_index, eq.is_common_flag,
         eq.deal_status question_status, eq.create_time, eq.remark reason, eq.from_user_id, eq.to_user_id,
         eq.question_type question_types, eq.difficulty_level difficulty_levels, eq.real_exam_type real_exam_types,
-        eq.training_skill training_skills, eq.parent_id, eq.proofread_status, eq.question_path, eq.num, eq.create_time
+        eq.training_skill training_skills, eq.parent_id, eq.proofread_status, eq.question_path, eq.num,
+        eq.image question_image, eq.concise_id start_X, eq.analysis_submit_type start_Y, eq.update_type end_X, eq.es_loaded end_Y
         from kmt_exercise_questions eq  left join kmt_exercise_book eb on eq.exercise_book_id=eb.id
         where eq.id=#{questionId}
     </select>