From f39562ffc92db29dc29b09942542315c89c1f4ff Mon Sep 17 00:00:00 2001 From: miaowenbo <1670593359@qq.com> Date: Wed, 3 Dec 2025 18:58:04 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E5=88=86=E9=A1=B5=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E8=AF=BE=E7=A8=8B=E5=AD=A6=E4=B9=A0=E8=AE=B0=E5=BD=95=E4=BB=A5?= =?UTF-8?q?=E5=8F=8A=E5=AF=BC=E5=87=BA=E8=AF=BE=E7=A8=8B=E5=AD=A6=E4=B9=A0?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E4=BF=AE=E6=94=B9=E6=97=B6=E9=97=B4=E6=9D=A1?= =?UTF-8?q?=E4=BB=B6=EF=BC=88=E5=88=9D=E7=89=88=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/StudyCourseServiceImpl.java | 165 +++++++++++------- 1 file changed, 102 insertions(+), 63 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/school/study/service/impl/StudyCourseServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/school/study/service/impl/StudyCourseServiceImpl.java index 0f4b94d5..e4266731 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/school/study/service/impl/StudyCourseServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/school/study/service/impl/StudyCourseServiceImpl.java @@ -2,7 +2,10 @@ package com.xboe.school.study.service.impl; import com.xboe.common.OrderCondition; 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.data.outside.IOutSideDataService; import com.xboe.module.course.dao.CourseContentDao; @@ -24,15 +27,16 @@ import com.xboe.system.user.vo.UserSimpleVo; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import javax.transaction.Transactional; import java.time.LocalDate; import java.time.LocalDateTime; -import java.time.LocalTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; @@ -56,6 +60,10 @@ public class StudyCourseServiceImpl implements IStudyCourseService{ @Autowired IOrganizationService organizationService; + @Autowired + @Lazy + IStudyCourseService studyCourseService; + @Autowired StudyCourseDao studyCourseDao; @@ -146,36 +154,6 @@ public class StudyCourseServiceImpl implements IStudyCourseService{ if(StringUtils.isNotBlank(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) { @@ -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 studyCourseItemList = studyCourseService.getStudyCourseItemByCourseId(sc.getCourseId()); + if (studyCourseItemList != null && !studyCourseItemList.isEmpty()) { + // 将学习内容按照studyId进行分组,便于后续计算每个studyId下的总学习时长 + Map> 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 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; } @@ -818,36 +841,6 @@ public class StudyCourseServiceImpl implements IStudyCourseService{ if (StringUtils.isNotBlank(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) { @@ -856,7 +849,53 @@ public class StudyCourseServiceImpl implements IStudyCourseService{ query.addFilter(FieldFilters.lt("status", 9)); } } - return studyCourseDao.findList(query.builder()); + // 25.12.3新增,添加基于时间的查询条件,规则如下: + List studyCourses = studyCourseDao.findList(query.builder()); + if (sc != null && StringUtils.isNotBlank(sc.getCourseId()) && StringUtils.isNotBlank(sc.getQueryStartTime()) && StringUtils.isNotBlank(sc.getQueryFinishTime())) { + List studyCourseItemList = studyCourseService.getStudyCourseItemByCourseId(sc.getCourseId()); + if (studyCourseItemList != null && !studyCourseItemList.isEmpty()) { + // 将学习内容按照studyId进行分组,便于后续计算每个studyId下的总学习时长 + Map> 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 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