|
@@ -204,6 +204,7 @@ public class QuizTrackServiceImpl extends ServiceImpl<QuizTrackLogMapper, QuizTr
|
|
|
long total = userRecordMapper.selectCount(wrapper);
|
|
long total = userRecordMapper.selectCount(wrapper);
|
|
|
|
|
|
|
|
// 去重汇总统计(同一道题只算一次,与排行榜口径一致)
|
|
// 去重汇总统计(同一道题只算一次,与排行榜口径一致)
|
|
|
|
|
+ // 注意:不在SQL层排序,避免大JSON字段排序导致MySQL sort memory溢出,改为Java内存排序
|
|
|
List<QuizUserRecord> allRecordsForSummary = userRecordMapper.selectList(
|
|
List<QuizUserRecord> allRecordsForSummary = userRecordMapper.selectList(
|
|
|
new LambdaQueryWrapper<QuizUserRecord>()
|
|
new LambdaQueryWrapper<QuizUserRecord>()
|
|
|
.eq(subjectId != null, QuizUserRecord::getSubjectId, subjectId)
|
|
.eq(subjectId != null, QuizUserRecord::getSubjectId, subjectId)
|
|
@@ -211,8 +212,15 @@ public class QuizTrackServiceImpl extends ServiceImpl<QuizTrackLogMapper, QuizTr
|
|
|
.eq(completeStatus != null, QuizUserRecord::getStatus, completeStatus)
|
|
.eq(completeStatus != null, QuizUserRecord::getStatus, completeStatus)
|
|
|
.ge(QuizUserRecord::getCreateTime, timeRange[0])
|
|
.ge(QuizUserRecord::getCreateTime, timeRange[0])
|
|
|
.le(QuizUserRecord::getCreateTime, timeRange[1])
|
|
.le(QuizUserRecord::getCreateTime, timeRange[1])
|
|
|
- .orderByDesc(QuizUserRecord::getCreateTime)
|
|
|
|
|
);
|
|
);
|
|
|
|
|
+ allRecordsForSummary.sort((a, b) -> {
|
|
|
|
|
+ LocalDateTime ta = a.getCreateTime();
|
|
|
|
|
+ LocalDateTime tb = b.getCreateTime();
|
|
|
|
|
+ if (ta == null && tb == null) return 0;
|
|
|
|
|
+ if (ta == null) return 1;
|
|
|
|
|
+ if (tb == null) return -1;
|
|
|
|
|
+ return tb.compareTo(ta);
|
|
|
|
|
+ });
|
|
|
Map<Long, Integer> summaryLatestMap = QuizDedupUtils.extractLatestAnswerMap(allRecordsForSummary);
|
|
Map<Long, Integer> summaryLatestMap = QuizDedupUtils.extractLatestAnswerMap(allRecordsForSummary);
|
|
|
int summaryTotalCount = summaryLatestMap.size();
|
|
int summaryTotalCount = summaryLatestMap.size();
|
|
|
int summaryCorrectCount = 0;
|
|
int summaryCorrectCount = 0;
|
|
@@ -492,6 +500,7 @@ public class QuizTrackServiceImpl extends ServiceImpl<QuizTrackLogMapper, QuizTr
|
|
|
case 1 -> "章节练习";
|
|
case 1 -> "章节练习";
|
|
|
case 2 -> "每日一练";
|
|
case 2 -> "每日一练";
|
|
|
case 3 -> "真题模考";
|
|
case 3 -> "真题模考";
|
|
|
|
|
+ case 4 -> "错题重做";
|
|
|
case 99 -> "收藏";
|
|
case 99 -> "收藏";
|
|
|
default -> "未知(" + answerType + ")";
|
|
default -> "未知(" + answerType + ")";
|
|
|
};
|
|
};
|
|
@@ -521,7 +530,8 @@ public class QuizTrackServiceImpl extends ServiceImpl<QuizTrackLogMapper, QuizTr
|
|
|
List<List<Object>> data = new ArrayList<>();
|
|
List<List<Object>> data = new ArrayList<>();
|
|
|
for (Map<String, Object> item : list) {
|
|
for (Map<String, Object> item : list) {
|
|
|
List<Object> row = new ArrayList<>();
|
|
List<Object> row = new ArrayList<>();
|
|
|
- row.add(item.get("userId"));
|
|
|
|
|
|
|
+ Object userId = item.get("userId");
|
|
|
|
|
+ row.add(userId != null ? userId.toString() : "");
|
|
|
row.add(item.get("nickname"));
|
|
row.add(item.get("nickname"));
|
|
|
row.add(item.get("phone"));
|
|
row.add(item.get("phone"));
|
|
|
row.add(item.get("totalAnswerCount"));
|
|
row.add(item.get("totalAnswerCount"));
|
|
@@ -549,7 +559,8 @@ public class QuizTrackServiceImpl extends ServiceImpl<QuizTrackLogMapper, QuizTr
|
|
|
List<List<Object>> data = new ArrayList<>();
|
|
List<List<Object>> data = new ArrayList<>();
|
|
|
for (Map<String, Object> item : list) {
|
|
for (Map<String, Object> item : list) {
|
|
|
List<Object> row = new ArrayList<>();
|
|
List<Object> row = new ArrayList<>();
|
|
|
- row.add(item.get("userId"));
|
|
|
|
|
|
|
+ Object userId = item.get("userId");
|
|
|
|
|
+ row.add(userId != null ? userId.toString() : "");
|
|
|
row.add(item.get("answerTypeName"));
|
|
row.add(item.get("answerTypeName"));
|
|
|
row.add(item.get("subjectName"));
|
|
row.add(item.get("subjectName"));
|
|
|
row.add(item.get("totalCount"));
|
|
row.add(item.get("totalCount"));
|