diff --git a/web/src/main/java/com/ibeetl/jlw/dao/QuestionLogSummaryDao.java b/web/src/main/java/com/ibeetl/jlw/dao/QuestionLogSummaryDao.java index f619791e..f554abf2 100644 --- a/web/src/main/java/com/ibeetl/jlw/dao/QuestionLogSummaryDao.java +++ b/web/src/main/java/com/ibeetl/jlw/dao/QuestionLogSummaryDao.java @@ -1,6 +1,7 @@ package com.ibeetl.jlw.dao; import com.ibeetl.jlw.entity.QuestionLogSummary; +import com.ibeetl.jlw.entity.vo.QuestionLogSummaryAnalysisVO; import com.ibeetl.jlw.web.query.QuestionLogSummaryQuery; import org.beetl.sql.core.engine.PageQuery; import org.beetl.sql.mapper.BaseMapper; @@ -38,4 +39,12 @@ public interface QuestionLogSummaryDao extends BaseMapper{ */ @Update int logicDeleteByQuestionSettingIds(String questionSettingIds); + + /** + * 题目配置,统计分析接口 + * + * @param query + * @return + */ + PageQuery analysisPageQuery(PageQuery query); } diff --git a/web/src/main/java/com/ibeetl/jlw/entity/vo/QuestionLogSummaryAnalysisVO.java b/web/src/main/java/com/ibeetl/jlw/entity/vo/QuestionLogSummaryAnalysisVO.java new file mode 100644 index 00000000..c77e4b0f --- /dev/null +++ b/web/src/main/java/com/ibeetl/jlw/entity/vo/QuestionLogSummaryAnalysisVO.java @@ -0,0 +1,94 @@ +package com.ibeetl.jlw.entity.vo; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.annotation.ExcelProperty; +import com.ibeetl.admin.core.entity.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.FieldNameConstants; + +/** + * 功能描述:
+ * + * @author: mlx + * @description: + * @date: 2022/12/12 15:56 + * @version: 1.0 + */ +@Data +@FieldNameConstants +@EqualsAndHashCode(callSuper=false) +public class QuestionLogSummaryAnalysisVO extends BaseEntity { + + /** + * 题目配置名称(作业名称、章节练习名称、考试名称等) + */ + @ExcelProperty(value = "名称", index = 1) + private String questionSettingName; + /** + * 题目总数 + */ + @ExcelProperty(value = "题目总数", index = 2) + private String questionTotalCount; + /** + * 合计场次 + */ + @ExcelProperty(value = "合计场次", index = 3) + private String totalSettingCount; + /** + * 平均答对数量 + */ + @ExcelProperty(value = "平均答对数量", index = 4) + private String avgCorrectCount; + /** + * 平均答错数量 + */ + @ExcelProperty(value = "平均答错数量", index = 5) + private String avgWrongCount; + /** + * 学生平均分数 + */ + @ExcelProperty(value = "学生平均分数", index = 6) + private String avgStudentScore; + /** + * 总班级数 + */ + @ExcelProperty(value = "总班级数", index = 7) + private String totalSchoolClassCount; + + /** + * 平均做题数量 + */ + @ExcelProperty(value = "平均做题数量", index = 8) + private String avgQuestionLogSummaryStudentDoCount; + /** + * 平均正确率 + */ + @ExcelProperty(value = "平均正确率", index = 9) + private String avgQuestionLogSummarySuccessRate; + /** + * 平均通过率 + */ + @ExcelProperty(value = "平均通过率", index = 10) + private String avgQuestionLogSummaryIsPass; + /** + * 平均用时(秒) + */ + @ExcelProperty(value = "平均用时(秒)", index = 11) + private String avgFinishSecondTime; + + /** + * 平均用时 时间格式 + */ + @ExcelProperty(value = "平均用时 时间格式", index = 12) + private String avgFinishTime; + + public void setAvgFinishSecondTime(String avgFinishSecondTime) { + this.avgFinishSecondTime = avgFinishSecondTime; + if (StrUtil.isNotBlank(avgFinishSecondTime) && NumberUtil.isNumber(avgFinishSecondTime)) { + setAvgFinishTime(DateUtil.secondToTime(NumberUtil.toBigDecimal(avgFinishSecondTime).intValue())); + } + } +} diff --git a/web/src/main/java/com/ibeetl/jlw/entity/vo/TeacherOpenCourseQuestionSettingAnalysisVO.java b/web/src/main/java/com/ibeetl/jlw/entity/vo/TeacherOpenCourseQuestionSettingAnalysisVO.java index 1c1b1fb1..2b670442 100644 --- a/web/src/main/java/com/ibeetl/jlw/entity/vo/TeacherOpenCourseQuestionSettingAnalysisVO.java +++ b/web/src/main/java/com/ibeetl/jlw/entity/vo/TeacherOpenCourseQuestionSettingAnalysisVO.java @@ -5,6 +5,7 @@ import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.StrUtil; import com.ibeetl.admin.core.entity.BaseEntity; import lombok.Data; +import lombok.EqualsAndHashCode; import lombok.experimental.FieldNameConstants; /** @@ -18,6 +19,7 @@ import lombok.experimental.FieldNameConstants; */ @Data @FieldNameConstants +@EqualsAndHashCode(callSuper=false) public class TeacherOpenCourseQuestionSettingAnalysisVO extends BaseEntity { /** diff --git a/web/src/main/java/com/ibeetl/jlw/service/QuestionLogSummaryService.java b/web/src/main/java/com/ibeetl/jlw/service/QuestionLogSummaryService.java index 067c3e82..7e7e6ae8 100644 --- a/web/src/main/java/com/ibeetl/jlw/service/QuestionLogSummaryService.java +++ b/web/src/main/java/com/ibeetl/jlw/service/QuestionLogSummaryService.java @@ -13,6 +13,7 @@ import com.ibeetl.admin.core.web.JsonReturnCode; import com.ibeetl.jlw.dao.QuestionLogSummaryDao; import com.ibeetl.jlw.entity.FileEntity; import com.ibeetl.jlw.entity.QuestionLogSummary; +import com.ibeetl.jlw.entity.vo.QuestionLogSummaryAnalysisVO; import com.ibeetl.jlw.enums.QuestionBusinessTypeEnum; import com.ibeetl.jlw.enums.ResourcesQuestionSnapshotFromTypeEnum; import com.ibeetl.jlw.web.query.QuestionLogSummaryQuery; @@ -383,4 +384,20 @@ public class QuestionLogSummaryService extends CoreBaseService> getExcelValues (QuestionLogSummaryQuery questionLogSummaryQuery){ return questionLogSummaryDao.getExcelValues(questionLogSummaryQuery); } + + /** + * 功能描述:
+ * 题目分数汇总,题目的各项平均值 + * + * + * @param query + * teacherOpenCourseId 开课ID + * questionSettingType 题目类型 {@link ResourcesQuestionSnapshotFromTypeEnum} + * @return {@link QuestionLogSummaryAnalysisVO} + * @Author: lx + * @Date: 2022/12/12 16:00 + */ + public PageQuery analysisPageQuery(PageQuery query) { + return questionLogSummaryDao.analysisPageQuery(query); + } } diff --git a/web/src/main/java/com/ibeetl/jlw/web/QuestionLogSummaryController.java b/web/src/main/java/com/ibeetl/jlw/web/QuestionLogSummaryController.java index 575ea5bb..c13cde1b 100644 --- a/web/src/main/java/com/ibeetl/jlw/web/QuestionLogSummaryController.java +++ b/web/src/main/java/com/ibeetl/jlw/web/QuestionLogSummaryController.java @@ -14,8 +14,11 @@ import com.ibeetl.admin.core.file.FileService; import com.ibeetl.admin.core.util.BeanCopyUtil; import com.ibeetl.admin.core.util.TimeTool; import com.ibeetl.admin.core.web.JsonResult; +import com.ibeetl.admin.core.web.query.PageParam; import com.ibeetl.jlw.entity.FileEntity; import com.ibeetl.jlw.entity.QuestionLogSummary; +import com.ibeetl.jlw.entity.vo.QuestionLogSummaryAnalysisVO; +import com.ibeetl.jlw.enums.ResourcesQuestionSnapshotFromTypeEnum; import com.ibeetl.jlw.service.QuestionLogSummaryService; import com.ibeetl.jlw.web.query.QuestionLogSummaryQuery; import lombok.SneakyThrows; @@ -40,9 +43,13 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.FileInputStream; +import java.io.IOException; import java.io.InputStream; import java.util.*; +import static cn.jlw.util.PageUtil.ofDefault; +import static com.ibeetl.admin.core.util.BeanCopyUtil.baseEntity2MapWithParallel; +import static com.ibeetl.admin.core.util.BeanUtil.processExcelAnnotationToMap; import static com.ibeetl.admin.core.util.ExcelUtil.convertData; import static com.ibeetl.admin.core.util.ExcelUtil.write; import static com.ibeetl.admin.core.util.user.CacheUserUtil.getUser; @@ -54,7 +61,7 @@ import static com.ibeetl.admin.core.util.user.CacheUserUtil.getUser; @RestController @Validated -public class QuestionLogSummaryController{ +public class QuestionLogSummaryController extends BaseController { private final Log log = LogFactory.getLog(this.getClass()); private static final String MODEL = "/jlw/questionLogSummary"; @@ -100,6 +107,46 @@ public class QuestionLogSummaryController{ } } + /** + * 题目配置,统计分析接口 + * @param teacherOpenCourseId 开课ID + * @param questionSettingType 题目配置类型 + * @return + */ + @PostMapping(API + "/analysis.do") + public JsonResult analysisDo(PageParam param, Long teacherOpenCourseId, ResourcesQuestionSnapshotFromTypeEnum questionSettingType, @SCoreUser CoreUser coreUser) { + PageQuery objectPageQuery = ofDefault(new PageQuery<>(), param); + objectPageQuery.setPara("questionSettingType", questionSettingType); + objectPageQuery.setPara("teacherOpenCourseId", teacherOpenCourseId); + + return JsonResult.success(questionLogSummaryService.analysisPageQuery(objectPageQuery)); + } + + /** + * 题目配置,统计分析接口 + * @param teacherOpenCourseId 开课ID + * @param questionSettingType 题目配置类型 + * @return + */ + @PostMapping(API + "/exportAnalysis.do") + public void exportAnalysisDo(Long teacherOpenCourseId, ResourcesQuestionSnapshotFromTypeEnum questionSettingType, @SCoreUser CoreUser coreUser) throws IOException { + + /** 构建表头 */ + Map header = processExcelAnnotationToMap(QuestionLogSummaryAnalysisVO.class); + + PageQuery objectPageQuery = new PageQuery<>(); + objectPageQuery.setPageNumber(1L); + objectPageQuery.setPageSize(Integer.MAX_VALUE); + objectPageQuery.setPara("questionSettingType", questionSettingType); + objectPageQuery.setPara("teacherOpenCourseId", teacherOpenCourseId); + + PageQuery page = questionLogSummaryService.analysisPageQuery(objectPageQuery); + List> maps = baseEntity2MapWithParallel(page.getList()); + + String filename = StrUtil.format("题目统计分析导出 {}.xlsx", DateUtil.now()); + write(response, filename,"Sheet1", header.values(), convertData(header.keySet(), maps)); + } + /** * 作业详情导出 * @param condition 日志记录查询条件 @@ -469,4 +516,45 @@ public class QuestionLogSummaryController{ } } + /** + * 题目配置,统计分析接口 + * @param teacherOpenCourseId 开课ID + * @param questionSettingType 题目配置类型 + * @return + */ + @PostMapping(MODEL + "/analysisPageList.json") + public JsonResult analysisPageList(PageParam param, Long teacherOpenCourseId, ResourcesQuestionSnapshotFromTypeEnum questionSettingType, @SCoreUser CoreUser coreUser) { + PageQuery objectPageQuery = ofDefault(new PageQuery<>(), param); + objectPageQuery.setPara("questionSettingType", questionSettingType); + objectPageQuery.setPara("teacherOpenCourseId", teacherOpenCourseId); + + return JsonResult.success(questionLogSummaryService.analysisPageQuery(objectPageQuery)); + } + + /** + * 题目配置,统计分析接口 + * @param teacherOpenCourseId 开课ID + * @param questionSettingType 题目配置类型 + * @return + */ + @PostMapping(MODEL + "/exportAnalysis.json") + public void exportAnalysis(Long teacherOpenCourseId, ResourcesQuestionSnapshotFromTypeEnum questionSettingType, @SCoreUser CoreUser coreUser) throws IOException { + + /** 构建表头 */ + Map header = processExcelAnnotationToMap(QuestionLogSummaryAnalysisVO.class); + + // 不需要分页,直接查询出来所有的 + PageQuery objectPageQuery = new PageQuery<>(); + objectPageQuery.setPageNumber(1); + objectPageQuery.setPageSize(Integer.MAX_VALUE); + objectPageQuery.setPara("questionSettingType", questionSettingType); + objectPageQuery.setPara("teacherOpenCourseId", teacherOpenCourseId); + + PageQuery page = questionLogSummaryService.analysisPageQuery(objectPageQuery); + List> maps = baseEntity2MapWithParallel(page.getList()); + + String filename = StrUtil.format("题目统计分析导出 {}.xlsx", DateUtil.now()); + write(response, filename,"Sheet1", header.values(), convertData(header.keySet(), maps)); + } + } diff --git a/web/src/main/java/com/ibeetl/jlw/web/TeacherOpenCourseQuestionSettingController.java b/web/src/main/java/com/ibeetl/jlw/web/TeacherOpenCourseQuestionSettingController.java index f50cc13c..c826618c 100644 --- a/web/src/main/java/com/ibeetl/jlw/web/TeacherOpenCourseQuestionSettingController.java +++ b/web/src/main/java/com/ibeetl/jlw/web/TeacherOpenCourseQuestionSettingController.java @@ -152,7 +152,7 @@ public class TeacherOpenCourseQuestionSettingController{ * @return */ @PostMapping(API + "/analysis.do") - public JsonResult analysis(Long teacherOpenCourseId, ResourcesQuestionSnapshotFromTypeEnum questionSettingType, @SCoreUser CoreUser coreUser) { + public JsonResult analysisDo(Long teacherOpenCourseId, ResourcesQuestionSnapshotFromTypeEnum questionSettingType, @SCoreUser CoreUser coreUser) { return JsonResult.success(teacherOpenCourseQuestionSettingService.analysis(teacherOpenCourseId, questionSettingType)); } @@ -324,4 +324,17 @@ public class TeacherOpenCourseQuestionSettingController{ teacherOpenCourseQuestionSettingService.editPushStatus(ids, pushStatus); return JsonResult.success(); } + + + /** + * 题目配置,统计分析接口 + * @param teacherOpenCourseId 开课ID + * @param questionSettingType 题目配置类型 + * @return + */ + @PostMapping(MODEL + "/analysis.json") + @Function("teacherOpenCourseQuestionSetting.query") + public JsonResult analysis(Long teacherOpenCourseId, ResourcesQuestionSnapshotFromTypeEnum questionSettingType, @SCoreUser CoreUser coreUser) { + return JsonResult.success(teacherOpenCourseQuestionSettingService.analysis(teacherOpenCourseId, questionSettingType)); + } } diff --git a/web/src/main/resources/sql/jlw/questionLogSummary.md b/web/src/main/resources/sql/jlw/questionLogSummary.md index d335daab..0662b067 100644 --- a/web/src/main/resources/sql/jlw/questionLogSummary.md +++ b/web/src/main/resources/sql/jlw/questionLogSummary.md @@ -864,3 +864,32 @@ getExcelValues ) )t +analysis +=== +* 题目配置,统计分析接口。用于分析所有题目类型的平均值 + + select + t.question_setting_name, + t.question_log_summary_from_type, + sum(t.question_setting_id) as total_setting_count, + avg(question_setting_total_score) as avg_question_setting_total_score, + avg(question_log_summary_student_total_score) as avg_student_score, + avg(question_log_summary_question_total_count) as question_total_count, + avg(question_log_summary_student_do_count) as avg_question_log_summary_student_do_count, + avg(question_log_summary_success_count) as avg_correct_count, + avg(question_log_summary_error_count) as avg_wrong_count, + avg(question_log_summary_success_rate) as avg_question_log_summary_success_rate, + avg(question_log_summary_is_pass) as avg_question_log_summary_is_pass, + avg(finish_second_time) as avg_finish_second_time + from question_log_summary t + left join teacher_open_course_question_setting ta on ta.teacher_open_course_question_setting_id = t.question_setting_id + where 1 = 1 + and t.question_setting_type = #questionSettingType# + and ta.teacher_open_course_question_setting_type = #questionSettingType# + and t.question_log_summary_status = 1 + and ta.teacher_open_course_id = #teacherOpenCourseId# + and ta.teacher_open_course_question_setting_status = 1 + AND ta.teacher_open_course_question_setting_push_status = 1 + group by + t.question_setting_name, + question_log_summary_from_type \ No newline at end of file diff --git a/web/src/main/resources/sql/jlw/teacherOpenCourseQuestionSetting.md b/web/src/main/resources/sql/jlw/teacherOpenCourseQuestionSetting.md index 13d3bb97..7eb6b5ab 100644 --- a/web/src/main/resources/sql/jlw/teacherOpenCourseQuestionSetting.md +++ b/web/src/main/resources/sql/jlw/teacherOpenCourseQuestionSetting.md @@ -627,7 +627,7 @@ analysisOld analysis === -* 题目配置,统计分析接口 +* 题目配置,统计分析接口。用于分析所有题目类型的平均值 select t.question_log_summary_from_type,