diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseManageApi.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseManageApi.java index 9556b4fd..eb79b007 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseManageApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseManageApi.java @@ -131,16 +131,6 @@ public class CourseManageApi extends ApiBaseController{ return success(coursePageService.pageQuery(null, coursePageQueryDTO)); } - /** - * 新-教师端 我开发的课程 - * @param coursePageQueryDTO - * @return - */ - @PostMapping("/develop_page") - public JsonResponse> teacherPage(@RequestBody CoursePageQueryDTO coursePageQueryDTO) { - return success(coursePageService.pageQuery(getCurrent(), coursePageQueryDTO)); - } - /** * 当前用户是否在管理端显示置顶相关功能 * @return diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseDao.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseDao.java index 787452ad..f1bb45ed 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseDao.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseDao.java @@ -6,7 +6,6 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import com.xboe.module.course.dto.CoursePageQueryDTO; @@ -230,7 +229,7 @@ public class CourseDao extends BaseDao { // 开头判断:课程培训时间的两个参数是否不为null boolean filterLearningTime = queryDTO.getLearningTimeStart() != null && queryDTO.getLearningTimeEnd() != null; builder.append(" FROM boe_course c"); - // 聚合教师姓名 + // 聚合教师姓名(仅未删除的教师) builder.append(System.lineSeparator()); builder.append("LEFT JOIN (SELECT course_id, GROUP_CONCAT(teacher_name ORDER BY id SEPARATOR ',') AS teacher_names FROM boe_course_teacher GROUP BY course_id) tch ON c.id = tch.course_id"); // 学习人数聚合(满足时间条件的学习记录,且学习记录有效) @@ -254,9 +253,6 @@ public class CourseDao extends BaseDao { builder.append(System.lineSeparator()); builder.append("LEFT JOIN ").append(userCenterSchema) .append(".organization org ON c.org_id = org.organization_id AND org.deleted = 0"); - // 教师联查 - builder.append(System.lineSeparator()); - builder.append("LEFT JOIN boe_course_teacher ct ON c.id = ct.course_id"); // where条件 // 第一个条件:deleted = 0 @@ -306,14 +302,9 @@ public class CourseDao extends BaseDao { builder.append("AND (:learningTimeStart IS NULL OR :learningTimeEnd IS NULL OR EXISTS (SELECT 1 FROM boe_study_course sc WHERE sc.course_id = c.id AND sc.finish_time IS NOT NULL AND sc.add_time >= :learningTimeStart AND sc.finish_time <= :learningTimeEnd))"); } // 授课教师 - if (StringUtils.isNotBlank(queryDTO.getTeacherId())) { + if (StringUtils.isNotBlank(queryDTO.getTeacherName())) { builder.append(System.lineSeparator()); - // 判断teacherId是一个还是多个 - if (queryDTO.getTeacherId().contains(",")) { - builder.append("AND ct.teacher_id IN (:teacherIdList)"); - } else { - builder.append("AND ct.teacher_id = :teacherId"); - } + builder.append("AND tch.teacher_names LIKE CONCAT('%', :teacherName, '%')"); } // 展开后条件 if (queryDTO.getEnabled() != null) { @@ -328,13 +319,9 @@ public class CourseDao extends BaseDao { builder.append(System.lineSeparator()); builder.append("AND c.org_id = :orgId"); } - if (StringUtils.isNotBlank(queryDTO.getCreateUserId())) { + if (StringUtils.isNotBlank(queryDTO.getCreateUser())) { builder.append(System.lineSeparator()); - if (queryDTO.getCreateUserId().contains(",")) { - builder.append("AND c.sys_create_aid IN (:createUserIdList)"); - } else { - builder.append("AND c.sys_create_aid = :createUserId"); - } + builder.append("AND c.sys_create_by LIKE CONCAT('%', :createUser, '%')"); } if (StringUtils.isNotBlank(queryDTO.getCreateFrom())) { builder.append(System.lineSeparator()); @@ -415,14 +402,8 @@ public class CourseDao extends BaseDao { query.setParameter("learningTimeStart", queryDTO.getLearningTimeStart()); query.setParameter("learningTimeEnd", queryDTO.getLearningTimeEnd()); } - if (StringUtils.isNotBlank(queryDTO.getTeacherId())) { - String teacherIdStr = queryDTO.getTeacherId(); - if (teacherIdStr.contains(",")) { - List teacherIdList = Arrays.asList(teacherIdStr.split(",")); - query.setParameter("teacherIdList", teacherIdList); - } else { - query.setParameter("teacherId", queryDTO.getTeacherId()); - } + if (StringUtils.isNotBlank(queryDTO.getTeacherName())) { + query.setParameter("teacherName", queryDTO.getTeacherName()); } if (queryDTO.getEnabled() != null) { query.setParameter("enabled", queryDTO.getEnabled()); @@ -433,14 +414,8 @@ public class CourseDao extends BaseDao { if (StringUtils.isNotBlank(queryDTO.getResOwner1())) { query.setParameter("orgId", queryDTO.getResOwner1()); } - if (StringUtils.isNotBlank(queryDTO.getCreateUserId())) { - String createUserIdStr = queryDTO.getCreateUserId(); - if (createUserIdStr.contains(",")) { - List createUserIdList = Arrays.asList(createUserIdStr.split(",")); - query.setParameter("createUserIdList", createUserIdList); - } else { - query.setParameter("createUserId", queryDTO.getCreateUserId()); - } + if (StringUtils.isNotBlank(queryDTO.getCreateUser())) { + query.setParameter("createUser", queryDTO.getCreateUser()); } if (StringUtils.isNotBlank(queryDTO.getCreateFrom())) { query.setParameter("createFrom", queryDTO.getCreateFrom()); diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/dto/CoursePageQueryDTO.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/dto/CoursePageQueryDTO.java index 795fcfab..2df4f5d4 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/dto/CoursePageQueryDTO.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/dto/CoursePageQueryDTO.java @@ -31,11 +31,6 @@ public class CoursePageQueryDTO { /**创建人*/ private String createUser; - /** - * 创建人id - */ - private String createUserId; - /**课程分类的一级*/ private String sysType1; @@ -48,11 +43,6 @@ public class CoursePageQueryDTO { /**授课教师*/ private String teacherName; - /** - * 授课教师id - */ - private String teacherId; - /**培训时间筛选类型*/ private String learningTimeType; @@ -87,11 +77,4 @@ public class CoursePageQueryDTO { /**排序顺序*/ private Boolean orderAsc; - - /** - * 是否是新建在线课程页面 - * false时,代表是在管理端的“在线管理”、“我开发的课程” - * true时,代表是在学习路径图/项目管理 中,创建在线课程的选择页面 - */ - private Boolean isCreateCourse; } \ No newline at end of file diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CoursePageServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CoursePageServiceImpl.java index ad9e37d8..eb1f9223 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CoursePageServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CoursePageServiceImpl.java @@ -82,9 +82,65 @@ public class CoursePageServiceImpl implements ICoursePageService { String currentAccountId = currentUser == null ? null : currentUser.getAccountId(); - List readIds = userOrgIds.getReadIds(); - orgIds.addAll(readIds); - + // 第一版废弃 +// // 构建查询条件 +// List filters = new ArrayList<>(); +// +// // 自动添加过滤已删除 +// filters.add(FieldFilters.eq("c.deleted", false)); +// +// // 添加权限过滤条件 +// if (!isSystemAdmin) { +// // 非系统管理员需要进行权限过滤 +// List permissionFilters = new ArrayList<>(); +// +// // 添加组织权限过滤 +// if (orgIds != null && !orgIds.isEmpty()) { +// permissionFilters.add(FieldFilters.in("c.orgId", orgIds)); +// } +// +// // 添加创建人过滤(可以看到自己创建的课程) +// if (StringUtils.isNotBlank(currentAccountId)) { +// permissionFilters.add(FieldFilters.eq("c.sysCreateAid", currentAccountId)); +// } +// +// // 如果有权限条件,则添加OR条件 +// if (!permissionFilters.isEmpty()) { +// filters.add(FieldFilters.or(permissionFilters)); +// } +// } +// filters.addAll(createFilters(coursePageQueryDTO)); +// +// QueryBuilder query = QueryBuilder.from(Course.class.getSimpleName() + " c").addFilters(filters); +// // 处理排序 +// handleOrder(query, coursePageQueryDTO.getOrderField(), coursePageQueryDTO.getOrderAsc()); +// +// // 设置分页参数 +// int pageIndex = coursePageQueryDTO.getPageIndex() != null ? coursePageQueryDTO.getPageIndex() : 0; +// int pageSize = coursePageQueryDTO.getPageSize() != null ? coursePageQueryDTO.getPageSize() : 10; +// query.setPageIndex(pageIndex); +// query.setPageSize(pageSize); +// +// // 执行查询 +// PageList coursePageList = courseDao.findPage(query.builder()); +// +// // 转换为CoursePageVo +// PageList result = new PageList<>(); +// result.setCount(coursePageList.getCount()); +// result.setPageSize(coursePageList.getPageSize()); +// +// // 子查询:根据课程id查询课程下的教师 +// List courseIds = coursePageList.getList().stream() +// .map(Course::getId) +// .collect(Collectors.toList()); +// List courseTeacherList = getCourseTeacherList(courseIds); +// List voList = coursePageList.getList().stream() +// .map(c -> convertToVo(c, courseTeacherList)) +// .collect(Collectors.toList()); +// result.setList(voList); +// +// return result; + // 第二版 long total = courseDao.countCourse(coursePageQueryDTO, isSystemAdmin, orgIds, currentAccountId, mySqlSchemaProperties.getUserCenterSchema()); List voList = courseDao.queryCourse(coursePageQueryDTO, isSystemAdmin, orgIds, currentAccountId, true, mySqlSchemaProperties.getUserCenterSchema()); PageList result = new PageList<>(); 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 e4266731..cba83a6e 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,10 +2,7 @@ package com.xboe.school.study.service.impl; import com.xboe.common.OrderCondition; import com.xboe.common.PageList; -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.orm.*; import com.xboe.core.utils.ConvertUtil; import com.xboe.data.outside.IOutSideDataService; import com.xboe.module.course.dao.CourseContentDao; @@ -27,16 +24,15 @@ 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; @@ -60,10 +56,6 @@ public class StudyCourseServiceImpl implements IStudyCourseService{ @Autowired IOrganizationService organizationService; - @Autowired - @Lazy - IStudyCourseService studyCourseService; - @Autowired StudyCourseDao studyCourseDao; @@ -154,6 +146,36 @@ 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) { @@ -209,51 +231,6 @@ 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; } @@ -841,6 +818,36 @@ public class StudyCourseServiceImpl implements IStudyCourseService{ if (StringUtils.isNotBlank(sc.getAid())) { query.addFilter(FieldFilters.eq("aid", sc.getAid())); } + // 25.11.25新增:添加基于时间的查询条件 + if (sc.getQueryStartTime() != null && sc.getQueryFinishTime() != null) { + // 开始结束时间均传入的情况,实现筛选逻辑 + // (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 (sc.getQueryStartTime() != null) { + LocalDate startDate = LocalDate.parse(sc.getQueryStartTime()); + LocalDateTime startDateTime = startDate.atStartOfDay(); + query.addFilter(FieldFilters.ge("startTime", startDateTime)); + } + // 筛选结束时间 + if (sc.getQueryFinishTime() != null) { + LocalDate finishDate = LocalDate.parse(sc.getQueryFinishTime()); + LocalDateTime finishDateTime = finishDate.atTime(LocalTime.MAX); + query.addFilter(FieldFilters.le("finishTime", finishDateTime)); + } + } } if (isFinish != null) { if (isFinish) { @@ -849,53 +856,7 @@ public class StudyCourseServiceImpl implements IStudyCourseService{ query.addFilter(FieldFilters.lt("status", 9)); } } - // 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; + return studyCourseDao.findList(query.builder()); } @Override