fix:分页查询课程学习记录以及导出课程学习记录修改时间条件(初版)

This commit is contained in:
miaowenbo
2025-12-03 18:58:04 +08:00
parent 2b7d0ef35a
commit f39562ffc9

View File

@@ -2,7 +2,10 @@ package com.xboe.school.study.service.impl;
import com.xboe.common.OrderCondition; import com.xboe.common.OrderCondition;
import com.xboe.common.PageList; import com.xboe.common.PageList;
import com.xboe.core.orm.*; import com.xboe.core.orm.FieldFilters;
import com.xboe.core.orm.FieldUpdateType;
import com.xboe.core.orm.QueryBuilder;
import com.xboe.core.orm.UpdateBuilder;
import com.xboe.core.utils.ConvertUtil; import com.xboe.core.utils.ConvertUtil;
import com.xboe.data.outside.IOutSideDataService; import com.xboe.data.outside.IOutSideDataService;
import com.xboe.module.course.dao.CourseContentDao; import com.xboe.module.course.dao.CourseContentDao;
@@ -24,15 +27,16 @@ import com.xboe.system.user.vo.UserSimpleVo;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.transaction.Transactional; import javax.transaction.Transactional;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -56,6 +60,10 @@ public class StudyCourseServiceImpl implements IStudyCourseService{
@Autowired @Autowired
IOrganizationService organizationService; IOrganizationService organizationService;
@Autowired
@Lazy
IStudyCourseService studyCourseService;
@Autowired @Autowired
StudyCourseDao studyCourseDao; StudyCourseDao studyCourseDao;
@@ -146,36 +154,6 @@ public class StudyCourseServiceImpl implements IStudyCourseService{
if(StringUtils.isNotBlank(sc.getAid())) { if(StringUtils.isNotBlank(sc.getAid())) {
query.addFilter(FieldFilters.eq("aid", sc.getAid())); query.addFilter(FieldFilters.eq("aid", sc.getAid()));
} }
// 25.11.25新增:添加基于时间的查询条件
if (StringUtils.isNotBlank(sc.getQueryStartTime()) && StringUtils.isNotBlank(sc.getQueryFinishTime())) {
// 开始结束时间均传入的情况,实现筛选逻辑
// (startTime >= 查询开始时间 AND startTime <= 查询结束时间) OR (finishTime >= 查询开始时间 AND finishTime <= 查询结束时间)
// 这样兼容查询结束时间为空值的情况,因为学员课程未结束时没有结束时间
LocalDate startDate = LocalDate.parse(sc.getQueryStartTime());
LocalDateTime startDateTime = startDate.atStartOfDay();
LocalDate finishDate = LocalDate.parse(sc.getQueryFinishTime());
LocalDateTime finishDateTime = finishDate.atTime(LocalTime.MAX);
// 筛选开始时间
IFieldFilter startTimeInRange = FieldFilters.and(FieldFilters.ge("startTime", startDateTime), FieldFilters.le("startTime", finishDateTime));
// 筛选结束时间
IFieldFilter finishTimeInRange = FieldFilters.and(FieldFilters.ge("finishTime", startDateTime), FieldFilters.le("finishTime", finishDateTime));
// OR条件查询
query.addFilter(FieldFilters.or(startTimeInRange, finishTimeInRange));
} else {
// 只输出单个参数情况
// 筛选开始时间
if (StringUtils.isNotBlank(sc.getQueryStartTime())) {
LocalDate startDate = LocalDate.parse(sc.getQueryStartTime());
LocalDateTime startDateTime = startDate.atStartOfDay();
query.addFilter(FieldFilters.ge("startTime", startDateTime));
}
// 筛选结束时间
if (StringUtils.isNotBlank(sc.getQueryFinishTime())) {
LocalDate finishDate = LocalDate.parse(sc.getQueryFinishTime());
LocalDateTime finishDateTime = finishDate.atTime(LocalTime.MAX);
query.addFilter(FieldFilters.le("finishTime", finishDateTime));
}
}
} }
// 原有查询是否结束逻辑 // 原有查询是否结束逻辑
if (isFinish != null) { if (isFinish != null) {
@@ -231,6 +209,51 @@ public class StudyCourseServiceImpl implements IStudyCourseService{
} }
} }
} }
// 25.12.3新增,添加基于时间的查询条件,规则如下:
if (sc != null && StringUtils.isNotBlank(sc.getCourseId()) && StringUtils.isNotBlank(sc.getQueryStartTime()) && StringUtils.isNotBlank(sc.getQueryFinishTime())) {
List<StudyCourseItem> studyCourseItemList = studyCourseService.getStudyCourseItemByCourseId(sc.getCourseId());
if (studyCourseItemList != null && !studyCourseItemList.isEmpty()) {
// 将学习内容按照studyId进行分组便于后续计算每个studyId下的总学习时长
Map<String, List<StudyCourseItem>> itemsByStudyId = studyCourseItemList.stream().filter(item -> item.getFinishTime() != null).collect(Collectors.groupingBy(StudyCourseItem::getStudyId));
// 获取查询的起止时间
String queryStartTime = sc.getQueryStartTime();
String queryFinishTime = sc.getQueryFinishTime();
for (StudyCourse studyCourse : studyCourses) {
// 解析查询时间范围
LocalDate startDate = LocalDate.parse(queryStartTime);
LocalDate endDate = LocalDate.parse(queryFinishTime);
// 如果有查询时间范围,则计算筛选后的学习时长
if (itemsByStudyId.containsKey(studyCourse.getId())) {
List<StudyCourseItem> items = itemsByStudyId.get(studyCourse.getId());
int filteredDuration = 0;
for (StudyCourseItem item : items) {
LocalDateTime finishTime = item.getFinishTime();
LocalDate finishDate = finishTime.toLocalDate();
// 判断结束时间是否在筛选范围内
boolean inRange = true;
if (finishDate.isBefore(startDate)) {
inRange = false;
}
if (finishDate.isAfter(endDate)) {
inRange = false;
}
// 如果在范围内,则累加学习时长
if (inRange) {
Integer duration = item.getStudyDuration();
if (duration != null) {
filteredDuration += duration;
}
}
}
// 更新学习时长
studyCourse.setTotalDuration(filteredDuration);
} else {
// 查询不到item的情况默认置空
studyCourse.setTotalDuration(0);
}
}
}
}
return studyCoursePageList; return studyCoursePageList;
} }
@@ -818,36 +841,6 @@ public class StudyCourseServiceImpl implements IStudyCourseService{
if (StringUtils.isNotBlank(sc.getAid())) { if (StringUtils.isNotBlank(sc.getAid())) {
query.addFilter(FieldFilters.eq("aid", sc.getAid())); query.addFilter(FieldFilters.eq("aid", sc.getAid()));
} }
// 25.11.25新增:添加基于时间的查询条件
if (StringUtils.isNotBlank(sc.getQueryStartTime()) && StringUtils.isNotBlank(sc.getQueryFinishTime())) {
// 开始结束时间均传入的情况,实现筛选逻辑
// (startTime >= 查询开始时间 AND startTime <= 查询结束时间) OR (finishTime >= 查询开始时间 AND finishTime <= 查询结束时间)
// 这样兼容查询结束时间为空值的情况,因为学员课程未结束时没有结束时间
LocalDate startDate = LocalDate.parse(sc.getQueryStartTime());
LocalDateTime startDateTime = startDate.atStartOfDay();
LocalDate finishDate = LocalDate.parse(sc.getQueryFinishTime());
LocalDateTime finishDateTime = finishDate.atTime(LocalTime.MAX);
// 筛选开始时间
IFieldFilter startTimeInRange = FieldFilters.and(FieldFilters.ge("startTime", startDateTime), FieldFilters.le("startTime", finishDateTime));
// 筛选结束时间
IFieldFilter finishTimeInRange = FieldFilters.and(FieldFilters.ge("finishTime", startDateTime), FieldFilters.le("finishTime", finishDateTime));
// OR条件查询
query.addFilter(FieldFilters.or(startTimeInRange, finishTimeInRange));
} else {
// 只输出单个参数情况
// 筛选开始时间
if (StringUtils.isNotBlank(sc.getQueryStartTime())) {
LocalDate startDate = LocalDate.parse(sc.getQueryStartTime());
LocalDateTime startDateTime = startDate.atStartOfDay();
query.addFilter(FieldFilters.ge("startTime", startDateTime));
}
// 筛选结束时间
if (StringUtils.isNotBlank(sc.getQueryFinishTime())) {
LocalDate finishDate = LocalDate.parse(sc.getQueryFinishTime());
LocalDateTime finishDateTime = finishDate.atTime(LocalTime.MAX);
query.addFilter(FieldFilters.le("finishTime", finishDateTime));
}
}
} }
if (isFinish != null) { if (isFinish != null) {
if (isFinish) { if (isFinish) {
@@ -856,7 +849,53 @@ public class StudyCourseServiceImpl implements IStudyCourseService{
query.addFilter(FieldFilters.lt("status", 9)); query.addFilter(FieldFilters.lt("status", 9));
} }
} }
return studyCourseDao.findList(query.builder()); // 25.12.3新增,添加基于时间的查询条件,规则如下:
List<StudyCourse> studyCourses = studyCourseDao.findList(query.builder());
if (sc != null && StringUtils.isNotBlank(sc.getCourseId()) && StringUtils.isNotBlank(sc.getQueryStartTime()) && StringUtils.isNotBlank(sc.getQueryFinishTime())) {
List<StudyCourseItem> studyCourseItemList = studyCourseService.getStudyCourseItemByCourseId(sc.getCourseId());
if (studyCourseItemList != null && !studyCourseItemList.isEmpty()) {
// 将学习内容按照studyId进行分组便于后续计算每个studyId下的总学习时长
Map<String, List<StudyCourseItem>> itemsByStudyId = studyCourseItemList.stream().filter(item -> item.getFinishTime() != null).collect(Collectors.groupingBy(StudyCourseItem::getStudyId));
// 获取查询的起止时间
String queryStartTime = sc.getQueryStartTime();
String queryFinishTime = sc.getQueryFinishTime();
for (StudyCourse studyCourse : studyCourses) {
// 解析查询时间范围
LocalDate startDate = LocalDate.parse(queryStartTime);
LocalDate endDate = LocalDate.parse(queryFinishTime);
// 如果有查询时间范围,则计算筛选后的学习时长
if (itemsByStudyId.containsKey(studyCourse.getId())) {
List<StudyCourseItem> items = itemsByStudyId.get(studyCourse.getId());
int filteredDuration = 0;
for (StudyCourseItem item : items) {
LocalDateTime finishTime = item.getFinishTime();
LocalDate finishDate = finishTime.toLocalDate();
// 判断结束时间是否在筛选范围内
boolean inRange = true;
if (finishDate.isBefore(startDate)) {
inRange = false;
}
if (finishDate.isAfter(endDate)) {
inRange = false;
}
// 如果在范围内,则累加学习时长
if (inRange) {
Integer duration = item.getStudyDuration();
if (duration != null) {
filteredDuration += duration;
}
}
}
// 更新学习时长
studyCourse.setTotalDuration(filteredDuration);
} else {
// 查询不到item的情况默认置空
studyCourse.setTotalDuration(0);
}
}
}
}
return studyCourses;
} }
@Override @Override