From 362b6e28c5e412bf0b0a3cd8988c3afd788b77c6 Mon Sep 17 00:00:00 2001
From: Mlxa0324 <mlx950324@163.com>
Date: Mon, 27 Feb 2023 10:14:33 +0800
Subject: [PATCH] =?UTF-8?q?=E9=94=99=E9=A2=98=E5=BA=93=E6=94=B6=E8=97=8F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../ibeetl/jlw/entity/GeneralQuestionLog.java |  4 ++
 .../entity/TeacherOpenCourseQuestionLog.java  |  4 ++
 .../TeacherOpenCourseQuestionLogWrong.java    |  4 +-
 .../GeneralQuestionSettingService.java        |  2 +
 .../TeacherOpenCourseQuestionLogService.java  | 56 +++++++++++++++++++
 ...cherOpenCourseQuestionLogWrongService.java | 33 +++++++++++
 ...acherOpenCourseQuestionSettingService.java | 33 ++++++++---
 ...eacherOpenCourseQuestionLogController.java | 13 ++++-
 ...rOpenCourseQuestionLogWrongController.java |  1 +
 9 files changed, 139 insertions(+), 11 deletions(-)

diff --git a/web/src/main/java/com/ibeetl/jlw/entity/GeneralQuestionLog.java b/web/src/main/java/com/ibeetl/jlw/entity/GeneralQuestionLog.java
index bd36232c..ff76c0f1 100644
--- a/web/src/main/java/com/ibeetl/jlw/entity/GeneralQuestionLog.java
+++ b/web/src/main/java/com/ibeetl/jlw/entity/GeneralQuestionLog.java
@@ -195,4 +195,8 @@ public class GeneralQuestionLog extends BaseEntity{
     public Integer getErrorCount() {
         return Integer.valueOf(defaultIfNull(this.get("errorCount"), "0").toString());
     }
+
+    public void clearAnswer() {
+        this.setQuestionAnswer(null);
+    }
 }
diff --git a/web/src/main/java/com/ibeetl/jlw/entity/TeacherOpenCourseQuestionLog.java b/web/src/main/java/com/ibeetl/jlw/entity/TeacherOpenCourseQuestionLog.java
index 73b5a02e..8dbbbd09 100644
--- a/web/src/main/java/com/ibeetl/jlw/entity/TeacherOpenCourseQuestionLog.java
+++ b/web/src/main/java/com/ibeetl/jlw/entity/TeacherOpenCourseQuestionLog.java
@@ -180,6 +180,10 @@ public class TeacherOpenCourseQuestionLog extends BaseEntity {
         this.setTeacherOpenCourseQuestionLogFinishTime(null);
     }
 
+    public void clearAnswer() {
+        this.setQuestionAnswer(null);
+    }
+
     /**
      * 功能描述: <br>
      * 设置做对的正确数量
diff --git a/web/src/main/java/com/ibeetl/jlw/entity/TeacherOpenCourseQuestionLogWrong.java b/web/src/main/java/com/ibeetl/jlw/entity/TeacherOpenCourseQuestionLogWrong.java
index 9756dcd2..eb664203 100644
--- a/web/src/main/java/com/ibeetl/jlw/entity/TeacherOpenCourseQuestionLogWrong.java
+++ b/web/src/main/java/com/ibeetl/jlw/entity/TeacherOpenCourseQuestionLogWrong.java
@@ -344,6 +344,8 @@ public class TeacherOpenCourseQuestionLogWrong extends BaseEntity{
     public void setUserId(Long userId){
         this.userId = userId;
     }
-
+    public void clearAnswer() {
+        this.setQuestionAnswer(null);
+    }
 
 }
diff --git a/web/src/main/java/com/ibeetl/jlw/service/GeneralQuestionSettingService.java b/web/src/main/java/com/ibeetl/jlw/service/GeneralQuestionSettingService.java
index 7029e5f9..a38920c3 100644
--- a/web/src/main/java/com/ibeetl/jlw/service/GeneralQuestionSettingService.java
+++ b/web/src/main/java/com/ibeetl/jlw/service/GeneralQuestionSettingService.java
@@ -714,6 +714,8 @@ public class GeneralQuestionSettingService extends CoreBaseService<GeneralQuesti
         logQuery.setGeneralQuestionSettingId(questionSettingId);
         List<GeneralQuestionLog> list = generalQuestionLogService.getValuesByQueryNotWithPermission(logQuery);
 
+        list.forEach(GeneralQuestionLog::clearAnswer);
+
         if (ObjectUtil.isNotEmpty(list)) {
             return BeanUtil.copyToList(list, GeneralResourcesQuestionSnapshot.class);
         }
diff --git a/web/src/main/java/com/ibeetl/jlw/service/TeacherOpenCourseQuestionLogService.java b/web/src/main/java/com/ibeetl/jlw/service/TeacherOpenCourseQuestionLogService.java
index 9c92d976..9170917a 100644
--- a/web/src/main/java/com/ibeetl/jlw/service/TeacherOpenCourseQuestionLogService.java
+++ b/web/src/main/java/com/ibeetl/jlw/service/TeacherOpenCourseQuestionLogService.java
@@ -31,6 +31,8 @@ import com.ibeetl.jlw.enums.ResourcesQuestionSnapshotFromTypeEnum;
 import com.ibeetl.jlw.web.query.QuestionLogSummaryQuery;
 import com.ibeetl.jlw.web.query.TeacherOpenCourseQuestionLogQuery;
 import com.ibeetl.jlw.web.query.TeacherOpenCourseQuestionSettingQuery;
+import lombok.AllArgsConstructor;
+import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.beetl.sql.core.SqlId;
@@ -1168,4 +1170,58 @@ public class TeacherOpenCourseQuestionLogService extends CoreBaseService<Teacher
 
         return BeanUtil.copyProperties(log, FileQuestionLogListVO.class);
     }
+
+    /**
+     * 获取收藏夹和错题库的答案
+     *
+     * @param questionLogId
+     * @return
+     */
+    public TuckOrErrorListQuestionAnswer getTuckOrErrorListQuestionAnswer(Long questionLogId) {
+        TeacherOpenCourseQuestionLogQuery logQuery = new TeacherOpenCourseQuestionLogQuery();
+        logQuery.setTeacherOpenCourseQuestionLogId(questionLogId);
+        logQuery.setQuestionLogAddType(FINALLY_SUBMIT);
+        List<TeacherOpenCourseQuestionLog> logList = getValuesByQueryNotWithPermission(logQuery);
+
+        Optional<TeacherOpenCourseQuestionLog> optional = logList.stream().filter(item -> item.getIsTuck() || item.getIsErrorFavorite()).findFirst();
+        TeacherOpenCourseQuestionLog questionLog = optional.get();
+
+        if (questionLog != null) {
+            return new TuckOrErrorListQuestionAnswer(questionLog.getQuestionAnswer(), questionLog.getQuestionAnalysis());
+        }
+
+        return null;
+    }
+
+    /**
+     * 题目日志的答案和题目解析
+     */
+    @Data
+    @AllArgsConstructor
+    protected class TuckOrErrorListQuestionAnswer {
+        private String questionAnswer;
+        private String questionAnalysis;
+    }
+
+    /**
+     * 通过学生ID和错题库列表,查询做题日志的列表
+     *
+     * @param logWrongList      错题列表
+     * @param studentId         学生ID
+     * @return
+     */
+    public List<TeacherOpenCourseQuestionLog> getQuestionLogByLogWrongList(List<TeacherOpenCourseQuestionLogWrong> logWrongList, Long studentId) {
+        if (CollectionUtil.isEmpty(logWrongList)) {
+            return Collections.emptyList();
+        }
+
+        final String questionSnapshotIds = listJoin(logWrongList, TeacherOpenCourseQuestionLogWrong::getResourcesQuestionSnapshotId);
+        final String questionSettingIds = listJoin(logWrongList, TeacherOpenCourseQuestionLogWrong::getTeacherOpenCourseQuestionSettingId);
+
+        TeacherOpenCourseQuestionLogQuery logQuery = new TeacherOpenCourseQuestionLogQuery();
+        logQuery.setResourcesQuestionSnapshotIdPlural(questionSnapshotIds);
+        logQuery.setTeacherOpenCourseQuestionSettingIdPlural(questionSettingIds);
+        logQuery.setStudentId(studentId);
+        return getValuesByQueryNotWithPermission(logQuery);
+    }
 }
diff --git a/web/src/main/java/com/ibeetl/jlw/service/TeacherOpenCourseQuestionLogWrongService.java b/web/src/main/java/com/ibeetl/jlw/service/TeacherOpenCourseQuestionLogWrongService.java
index 03eae7ad..157a918d 100644
--- a/web/src/main/java/com/ibeetl/jlw/service/TeacherOpenCourseQuestionLogWrongService.java
+++ b/web/src/main/java/com/ibeetl/jlw/service/TeacherOpenCourseQuestionLogWrongService.java
@@ -13,6 +13,7 @@ import com.ibeetl.admin.core.web.JsonResult;
 import com.ibeetl.admin.core.web.JsonReturnCode;
 import com.ibeetl.jlw.dao.TeacherOpenCourseQuestionLogWrongDao;
 import com.ibeetl.jlw.entity.FileEntity;
+import com.ibeetl.jlw.entity.Student;
 import com.ibeetl.jlw.entity.TeacherOpenCourseQuestionLog;
 import com.ibeetl.jlw.entity.TeacherOpenCourseQuestionLogWrong;
 import com.ibeetl.jlw.web.query.TeacherOpenCourseQuestionLogWrongQuery;
@@ -26,6 +27,7 @@ import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.beetl.sql.core.SqlId;
 import org.beetl.sql.core.engine.PageQuery;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
@@ -36,6 +38,7 @@ import java.math.BigDecimal;
 import java.util.*;
 import java.util.stream.Collectors;
 
+import static cn.jlw.util.CacheUserUtil.getStudent;
 import static com.ibeetl.admin.core.util.ExcelUtil.getCellFormatValue;
 import static java.util.stream.Collectors.joining;
 
@@ -48,9 +51,12 @@ import static java.util.stream.Collectors.joining;
 @Transactional
 @Validated
 @Slf4j
+@Deprecated
 public class TeacherOpenCourseQuestionLogWrongService extends CoreBaseService<TeacherOpenCourseQuestionLogWrong> implements DeleteResourcesBy{
 
     @Autowired private TeacherOpenCourseQuestionLogWrongDao teacherOpenCourseQuestionLogWrongDao;
+    @Autowired @Lazy
+    private TeacherOpenCourseQuestionLogService teacherOpenCourseQuestionLogService;
 
     public PageQuery<TeacherOpenCourseQuestionLogWrong>queryByCondition(PageQuery query){
         PageQuery ret =  teacherOpenCourseQuestionLogWrongDao.queryByCondition(query);
@@ -83,6 +89,33 @@ public class TeacherOpenCourseQuestionLogWrongService extends CoreBaseService<Te
         }
     }
 
+    /**
+     * 根据当前登录的学生身份,修改日志中的错题标记
+     * @param ids
+     */
+    public void deleteTeacherOpenCourseQuestionLogWrongWithStudent(String ids) {
+
+        deleteTeacherOpenCourseQuestionLogWrong(ids);
+        Student student = getStudent();
+
+        // 不是学生身份,不操作做题日志数据
+        if (student != null) {
+            List<TeacherOpenCourseQuestionLogWrong> logWrongList = teacherOpenCourseQuestionLogWrongDao.selectByIds(Arrays.asList(ids.split(",")));
+            List<TeacherOpenCourseQuestionLog> questionLogList = teacherOpenCourseQuestionLogService.getQuestionLogByLogWrongList(logWrongList, student.getStudentId());
+
+            if (CollectionUtil.isNotEmpty(questionLogList)) {
+                // 修改做题日志的错题状态
+                List<TeacherOpenCourseQuestionLog> updateLogPOList = questionLogList.stream().map(item -> {
+                    TeacherOpenCourseQuestionLog questionLog = new TeacherOpenCourseQuestionLog();
+                    questionLog.setTeacherOpenCourseQuestionLogId(item.getTeacherOpenCourseQuestionLogId());
+                    questionLog.setIsErrorFavorite(false);
+                    return questionLog;
+                }).collect(Collectors.toList());
+                teacherOpenCourseQuestionLogService.upsertBatchByTemplate(updateLogPOList);
+            }
+        }
+    }
+
     /**
      * 根据题目配置ID 批量真删除
      * @param settingIds
diff --git a/web/src/main/java/com/ibeetl/jlw/service/TeacherOpenCourseQuestionSettingService.java b/web/src/main/java/com/ibeetl/jlw/service/TeacherOpenCourseQuestionSettingService.java
index 36e5764e..1cc6042b 100644
--- a/web/src/main/java/com/ibeetl/jlw/service/TeacherOpenCourseQuestionSettingService.java
+++ b/web/src/main/java/com/ibeetl/jlw/service/TeacherOpenCourseQuestionSettingService.java
@@ -900,7 +900,7 @@ public class TeacherOpenCourseQuestionSettingService extends CoreBaseService<Tea
      * @Author: 87966
      * @Date: 2022/12/1 9:27
      */
-    public List<ResourcesQuestionSnapshot> questionDetailTest(@NotNull(message = "题目配置ID不能为空!") Long questionSettingId,
+    public List<TeacherOpenCourseQuestionLog> questionDetailTest(@NotNull(message = "题目配置ID不能为空!") Long questionSettingId,
                                                               @NotNull(message = "练习类型不能为空!") TuckOrErrorEnum tuckOrError, @NotNull(message = "改接口只能学生访问") Student student) {
         final Long studentId = student.getStudentId();
 
@@ -915,28 +915,45 @@ public class TeacherOpenCourseQuestionSettingService extends CoreBaseService<Tea
             logQuery.setQuestionLogAddType(FINALLY_SUBMIT);
             List<TeacherOpenCourseQuestionLog> list = teacherOpenCourseQuestionLogService.getValuesByQueryNotWithPermission(logQuery);
 
+            list.forEach(TeacherOpenCourseQuestionLog::clearAnswer);
+
             if (ObjectUtil.isNotEmpty(list)) {
-                return BeanUtil.copyToList(list, ResourcesQuestionSnapshot.class);
+                return list;
             }
 
         }
         // 错题库,本来是一张表管理的。
         else if(ERROR_TEST.equals(tuckOrError)) {
 //            logQuery.setIsErrorFavorite(true);
-            TeacherOpenCourseQuestionLogWrongQuery wrongQuery = new TeacherOpenCourseQuestionLogWrongQuery();
-            wrongQuery.setStudentId(studentId);
-            wrongQuery.setTeacherOpenCourseQuestionLogStatus(1);
-            wrongQuery.setTeacherOpenCourseQuestionSettingId(questionSettingId);
-            List<TeacherOpenCourseQuestionLogWrong> list = teacherOpenCourseQuestionLogWrongService.getValuesByQuery(wrongQuery);
+//            TeacherOpenCourseQuestionLogWrongQuery wrongQuery = new TeacherOpenCourseQuestionLogWrongQuery();
+//            wrongQuery.setStudentId(studentId);
+//            wrongQuery.setTeacherOpenCourseQuestionLogStatus(1);
+//            wrongQuery.setTeacherOpenCourseQuestionSettingId(questionSettingId);
+//            List<TeacherOpenCourseQuestionLogWrong> list = teacherOpenCourseQuestionLogWrongService.getValuesByQuery(wrongQuery);
+//
+//            list.forEach(TeacherOpenCourseQuestionLogWrong::clearAnswer);
+//            if (ObjectUtil.isNotEmpty(list)) {
+//                return BeanUtil.copyToList(list, ResourcesQuestionSnapshot.class);
+//            }
+
+            logQuery.setIsErrorFavorite(true);
+            logQuery.setStudentId(studentId);
+            logQuery.setTeacherOpenCourseQuestionLogStatusPlural("1,2");
+            logQuery.setTeacherOpenCourseQuestionSettingId(questionSettingId);
+            logQuery.setQuestionLogAddType(FINALLY_SUBMIT);
+            List<TeacherOpenCourseQuestionLog> list = teacherOpenCourseQuestionLogService.getValuesByQueryNotWithPermission(logQuery);
+
+            list.forEach(TeacherOpenCourseQuestionLog::clearAnswer);
 
             if (ObjectUtil.isNotEmpty(list)) {
-                return BeanUtil.copyToList(list, ResourcesQuestionSnapshot.class);
+                return list;
             }
         }
 
         return Collections.emptyList();
     }
 
+
     /**
      * 功能描述: <br>
      * 分析汇总
diff --git a/web/src/main/java/com/ibeetl/jlw/web/TeacherOpenCourseQuestionLogController.java b/web/src/main/java/com/ibeetl/jlw/web/TeacherOpenCourseQuestionLogController.java
index 67977a0b..f64acafb 100644
--- a/web/src/main/java/com/ibeetl/jlw/web/TeacherOpenCourseQuestionLogController.java
+++ b/web/src/main/java/com/ibeetl/jlw/web/TeacherOpenCourseQuestionLogController.java
@@ -1,7 +1,6 @@
 package com.ibeetl.jlw.web;
 
 import cn.hutool.core.bean.BeanUtil;
-import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.lang.Assert;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
@@ -329,6 +328,17 @@ public class TeacherOpenCourseQuestionLogController extends BaseController {
         return JsonResult.success();
     }
 
+    /**
+     * 通过日志ID获取答案(仅限于错误或收藏夹)
+     * @param questionLogId    题目日志ID
+     * @return
+     */
+    @PostMapping(API + "/getTuckOrErrorListQuestionAnswer.do")
+    @ResponseBody
+    public JsonResult getTuckOrErrorListQuestionAnswer(Long questionLogId, @SCoreUser CoreUser coreUser) {
+        return JsonResult.success(teacherOpenCourseQuestionLogService.getTuckOrErrorListQuestionAnswer(questionLogId));
+    }
+
     /**
      * 教师端-做题日志导出
      * @param condition   日志记录查询条件
@@ -569,5 +579,4 @@ public class TeacherOpenCourseQuestionLogController extends BaseController {
         return JsonResult.success(teacherOpenCourseQuestionLogService.getHomeWorkLogExportPageList(teacherOpenCourseQuestionSettingId.getPageQuery()));
     }
 
-
 }
diff --git a/web/src/main/java/com/ibeetl/jlw/web/TeacherOpenCourseQuestionLogWrongController.java b/web/src/main/java/com/ibeetl/jlw/web/TeacherOpenCourseQuestionLogWrongController.java
index 054b4032..4af76839 100644
--- a/web/src/main/java/com/ibeetl/jlw/web/TeacherOpenCourseQuestionLogWrongController.java
+++ b/web/src/main/java/com/ibeetl/jlw/web/TeacherOpenCourseQuestionLogWrongController.java
@@ -50,6 +50,7 @@ import static cn.jlw.util.CacheUserUtil.getStudent;
 
 @RestController
 @Validated
+@Deprecated
 public class TeacherOpenCourseQuestionLogWrongController{
 
     private final Log log = LogFactory.getLog(this.getClass());