From b28387a2c6c759f624059c431e8bdddbcd74369f Mon Sep 17 00:00:00 2001 From: "liu.zixi" Date: Sun, 23 Nov 2025 18:00:19 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=AF=BE=E7=A8=8B=E5=88=97=E8=A1=A8SQL?= =?UTF-8?q?=E7=89=88=20=E5=AE=8C=E5=96=84=E4=BA=86=E6=89=80=E6=9C=89?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E6=9D=A1=E4=BB=B6=EF=BC=8C=E5=B9=B6=E5=AE=8C?= =?UTF-8?q?=E5=96=84=E5=AF=BC=E5=87=BA=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/xboe/module/course/dao/CourseDao.java | 317 ++++++++++++++++++ .../service/impl/CoursePageServiceImpl.java | 198 +++++++---- .../xboe/module/course/vo/CoursePageVo.java | 12 +- 3 files changed, 469 insertions(+), 58 deletions(-) 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 534bf424..7f161b23 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,6 +6,9 @@ import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; +import com.xboe.module.course.dto.CoursePageQueryDTO; +import com.xboe.module.course.vo.CoursePageVo; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Repository; import com.xboe.common.OrderCondition; @@ -17,8 +20,14 @@ import com.xboe.core.orm.QueryBuilder; import com.xboe.module.course.dto.RankingDto; import com.xboe.module.course.entity.Course; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.Query; + @Repository public class CourseDao extends BaseDao { + @PersistenceContext + private EntityManager entityManager; /** * 课程分页 搜索查询 * */ @@ -70,4 +79,312 @@ public class CourseDao extends BaseDao { } return rs; } + + /** + * 课程查询 + * 使用原生sql查询 + * 入参在sql语句中用:name的方式传入 + * + * @param queryDTO 页面的查询入参 + * @param isSystemAdmin 是否是系统管理员 + * @param orgIds 组织id列表 + * @param currentAccountId 当前用户id + * @param pageQuery 是否分页查询 + * @return 课程列表 + */ + public List queryCourse(CoursePageQueryDTO queryDTO, + boolean isSystemAdmin, List orgIds, String currentAccountId, + boolean pageQuery) { + // select字段 + StringBuilder builder = new StringBuilder("select "); + builder.append("c.id,"); + builder.append("c.name,"); + builder.append("c.cover_img AS coverImg,"); + builder.append("c.sys_type1 AS sysType1,"); + builder.append("c.sys_type2 AS sysType2,"); + builder.append("c.sys_type3 AS sysType3,"); + builder.append("c.res_owner1 AS resOwner1,"); + builder.append("c.res_owner2 AS resOwner2,"); + builder.append("c.res_owner3 AS resOwner3,"); + builder.append("c.sys_create_by AS sysCreateBy,"); + builder.append("c.create_from AS createFrom,"); + builder.append("c.sys_create_time AS sysCreateTime,"); + builder.append("c.for_users AS forUsers,"); + builder.append("c.status,"); + builder.append("c.audit_type AS auditType,"); + builder.append("c.published,"); + builder.append("c.publish_time AS publishTime,"); + builder.append("COALESCE(stu.studys, 0) AS studys,"); + builder.append("COALESCE(grd.score, 0.0) AS score,"); + builder.append("COALESCE(cc.duration_sum, 0) AS courseDuration,"); + builder.append("c.enabled,"); + builder.append("c.open_course AS openCourse,"); + builder.append("c.is_top AS isTop,"); + builder.append("COALESCE(tch.teacher_names, '') AS teacherName"); + // 拼接FROM及查询条件语句 + appendFrom(builder, queryDTO, isSystemAdmin, orgIds, currentAccountId); + // 排序语句 + appendOrder(builder, queryDTO); + + Query query = entityManager.createNativeQuery(builder.toString(), CoursePageVo.class); + setQueryParams(query, queryDTO, isSystemAdmin, orgIds, currentAccountId, pageQuery); + return query.getResultList(); + } + + public long countCourse(CoursePageQueryDTO queryDTO, + boolean isSystemAdmin, List orgIds, String currentAccountId) { + // select count + StringBuilder builder = new StringBuilder("select count(*)"); + // 拼接FROM及查询条件语句 + appendFrom(builder, queryDTO, isSystemAdmin, orgIds, currentAccountId); + // 排序语句 + appendOrder(builder, queryDTO); + + Query query = entityManager.createNativeQuery(builder.toString(), CoursePageVo.class); + setQueryParams(query, queryDTO, isSystemAdmin, orgIds, currentAccountId, false); + Number count = (Number) query.getSingleResult(); + return count.longValue(); + } + + /** + * 拼接FROM及查询条件语句 + * + * @param builder + * @param queryDTO + * @param isSystemAdmin + * @param orgIds + * @param currentAccountId + */ + private void appendFrom(StringBuilder builder, CoursePageQueryDTO queryDTO, + boolean isSystemAdmin, List orgIds, String currentAccountId) { + // 开头判断:课程培训时间的两个参数是否不为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"); + // 学习人数聚合(满足时间条件的学习记录,且学习记录有效) + builder.append(System.lineSeparator()); + builder.append("LEFT JOIN (SELECT course_id, COUNT(*) AS studys FROM boe_base.boe_study_course"); + if (filterLearningTime) { + builder.append(" WHERE (add_time >= :learningTimeStart AND add_time <= :learningTimeEnd) OR (finish_time >= :learningTimeStart AND finish_time <= :learningTimeEnd)"); + } + builder.append(" GROUP BY course_id) stu ON c.id = stu.course_id"); + // 评分聚合(在时间区间内的有效打分) + builder.append(System.lineSeparator()); + builder.append("LEFT JOIN (SELECT course_id, AVG(scores) AS score FROM boe_base.boe_grade"); + if (filterLearningTime) { + builder.append(" WHERE sys_create_time >= :learningTimeStart AND sys_create_time <= :learningTimeEnd"); + } + builder.append(" GROUP BY course_id) grd ON c.id = grd.course_id"); + // 课件聚合 + builder.append(System.lineSeparator()); + builder.append("LEFT JOIN (SELECT course_id, SUM(duration) AS duration_sum FROM boe_base.boe_course_content WHERE deleted = 0 GROUP BY course_id) cc ON c.id = cc.course_id"); + // where条件 + // 第一个条件:deleted = 0 + builder.append(System.lineSeparator()); + builder.append("WHERE c.deleted = 0"); + // 数据权限筛选:系统管理员可查看所有课程,非系统管理员只能看到自己创建的课程或所属组织的课程 + if (!isSystemAdmin) { + if (orgIds != null && !orgIds.isEmpty() && StringUtils.isNotBlank(currentAccountId)) { + builder.append(System.lineSeparator()); + builder.append("AND (c.sys_create_aid = :currentAccountId OR c.org_id IN (:orgIds))"); + } else if (orgIds != null && !orgIds.isEmpty()) { + builder.append(System.lineSeparator()); + builder.append("AND c.org_id IN (:orgIds)"); + } else if (StringUtils.isNotBlank(currentAccountId)) { + builder.append(System.lineSeparator()); + builder.append("AND c.sys_create_aid = :currentAccountId"); + } + } + // 简单查询条件(展开前) + if (StringUtils.isNotBlank(queryDTO.getName())) { + builder.append(System.lineSeparator()); + builder.append("AND c.name LIKE CONCAT('%', :name, '%')"); + } + if (StringUtils.isNotBlank(queryDTO.getSysType1())) { + builder.append(System.lineSeparator()); + builder.append("AND c.sys_type1 = :sysType1"); + } + if (StringUtils.isNotBlank(queryDTO.getSysType2())) { + builder.append(System.lineSeparator()); + builder.append("AND c.sys_type2 = :sysType2"); + } + if (StringUtils.isNotBlank(queryDTO.getSysType3())) { + builder.append(System.lineSeparator()); + builder.append("AND c.sys_type3 = :sysType3"); + } + if (StringUtils.isNotBlank(queryDTO.getStatus())) { + builder.append(System.lineSeparator()); + builder.append("AND c.status = :status"); + } + if (queryDTO.getPublish() != null) { + builder.append(System.lineSeparator()); + builder.append("AND c.published = :publish"); + } + // 时间筛选逻辑:只有当两个时间参数都提供时才启用学习记录存在性校验 + if (filterLearningTime) { + builder.append(System.lineSeparator()); + builder.append("AND (:learningTimeStart IS NULL OR :learningTimeEnd IS NULL OR EXISTS (SELECT 1 FROM boe_base.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.getTeacherName())) { + builder.append(System.lineSeparator()); + builder.append("AND tch.teacher_names LIKE CONCAT('%', :teacherName, '%')"); + } + // 展开后条件 + if (queryDTO.getEnabled() != null) { + builder.append(System.lineSeparator()); + builder.append("AND c.enabled = :enabled"); + } + if (queryDTO.getOpenCourse() != null) { + builder.append(System.lineSeparator()); + builder.append("AND c.open_course = :openCourse"); + } + if (StringUtils.isNotBlank(queryDTO.getResOwner1())) { + builder.append(System.lineSeparator()); + builder.append("AND c.res_owner1 = :resOwner1"); + } + if (StringUtils.isNotBlank(queryDTO.getResOwner2())) { + builder.append(System.lineSeparator()); + builder.append("AND c.res_owner2 = :resOwner2"); + } + if (StringUtils.isNotBlank(queryDTO.getResOwner3())) { + builder.append(System.lineSeparator()); + builder.append("AND c.res_owner3 = :resOwner3"); + } + if (StringUtils.isNotBlank(queryDTO.getCreateUser())) { + builder.append(System.lineSeparator()); + builder.append("AND c.sys_create_by LIKE CONCAT('%', :createUser, '%')"); + } + if (StringUtils.isNotBlank(queryDTO.getCreateFrom())) { + builder.append(System.lineSeparator()); + builder.append("AND c.create_from = :createFrom"); + } + } + + /** + * 拼接ORDER BY语句 + * @param builder + * @param queryDTO + */ + private void appendOrder(StringBuilder builder, CoursePageQueryDTO queryDTO) { + builder.append(System.lineSeparator()); + builder.append("ORDER BY "); + // 页面选择的排序字段处理 + String orderField = queryDTO.getOrderField(); + // 小驼峰转MySQL字段 + String orderFieldSql = camelToUnderline(orderField); + Boolean orderAsc = queryDTO.getOrderAsc(); + if (StringUtils.isNotBlank(orderField)) { + // 排序逻辑 + String orderAscStr = orderAsc == null || orderAsc ? "ASC" : "DESC"; + // 多字段排序: sysType resOwner + if (StringUtils.equals(orderField, "sysType") || StringUtils.equals(orderField, "resOwner")) { + for (int i = 1; i <= 3; i++) { + builder.append("c.").append(orderFieldSql).append(i).append(" ").append(orderAscStr).append(", "); + } + } else if (StringUtils.equals(orderField, "studys")) { + builder.append("COALESCE(stu.studys, 0) ").append(orderAscStr).append(", "); + } else if (StringUtils.equals(orderField, "score")) { + builder.append("COALESCE(grd.score, 0) ").append(orderAscStr).append(", "); + } else if (StringUtils.equals(orderField, "courseDuration")) { + builder.append("COALESCE(cc.duration_sum, 0) ").append(orderAscStr).append(", "); + } else { + builder.append("c.").append(orderFieldSql).append(" ").append(orderAscStr).append(", "); + } + } + builder.append("c.is_top DESC, c.sort_weight ASC, c.sys_create_time DESC"); + } + + private void setQueryParams(Query query, + CoursePageQueryDTO queryDTO, + boolean isSystemAdmin, List orgIds, String currentAccountId, + boolean pageQuery) { + boolean filterLearningTime = queryDTO.getLearningTimeStart() != null && queryDTO.getLearningTimeEnd() != null; + // 数据权限 + if (!isSystemAdmin) { + if (orgIds != null && !orgIds.isEmpty()) { + query.setParameter("orgIds", orgIds); + } + if (StringUtils.isNotBlank(currentAccountId)) { + query.setParameter("currentAccountId", currentAccountId); + } + } + + if (StringUtils.isNotBlank(queryDTO.getName())) { + query.setParameter("name", queryDTO.getName()); + } + if (StringUtils.isNotBlank(queryDTO.getSysType1())) { + query.setParameter("sysType1", queryDTO.getSysType1()); + } + if (StringUtils.isNotBlank(queryDTO.getSysType2())) { + query.setParameter("sysType2", queryDTO.getSysType2()); + } + if (StringUtils.isNotBlank(queryDTO.getSysType3())) { + query.setParameter("sysType3", queryDTO.getSysType3()); + } + if (StringUtils.isNotBlank(queryDTO.getStatus())) { + query.setParameter("status", queryDTO.getStatus()); + } + if (queryDTO.getPublish() != null) { + query.setParameter("publish", queryDTO.getPublish()); + } + if (filterLearningTime) { + query.setParameter("learningTimeStart", queryDTO.getLearningTimeStart()); + query.setParameter("learningTimeEnd", queryDTO.getLearningTimeEnd()); + } + if (StringUtils.isNotBlank(queryDTO.getTeacherName())) { + query.setParameter("teacherName", queryDTO.getTeacherName()); + } + if (queryDTO.getEnabled() != null) { + query.setParameter("enabled", queryDTO.getEnabled()); + } + if (queryDTO.getOpenCourse() != null) { + query.setParameter("openCourse", queryDTO.getOpenCourse()); + } + if (StringUtils.isNotBlank(queryDTO.getResOwner1())) { + query.setParameter("resOwner1", queryDTO.getResOwner1()); + } + if (StringUtils.isNotBlank(queryDTO.getResOwner2())) { + query.setParameter("resOwner2", queryDTO.getResOwner2()); + } + if (StringUtils.isNotBlank(queryDTO.getResOwner3())) { + query.setParameter("resOwner3", queryDTO.getResOwner3()); + } + if (StringUtils.isNotBlank(queryDTO.getCreateUser())) { + query.setParameter("createUser", queryDTO.getCreateUser()); + } + if (StringUtils.isNotBlank(queryDTO.getCreateFrom())) { + query.setParameter("createFrom", queryDTO.getCreateFrom()); + } + if (pageQuery) { + // 设置OFFSET和LIMIT + query.setFirstResult((queryDTO.getPageIndex() - 1) * queryDTO.getPageSize()); + query.setMaxResults(queryDTO.getPageSize()); + } + } + + /** + * 将小驼峰命名转换为下划线命名 + * @param camelCase 小驼峰命名字符串 + * @return 下划线命名字符串 + */ + public String camelToUnderline(String camelCase) { + if (StringUtils.isBlank(camelCase)) { + return camelCase; + } + StringBuilder result = new StringBuilder(); + result.append(Character.toLowerCase(camelCase.charAt(0))); + for (int i = 1; i < camelCase.length(); i++) { + char ch = camelCase.charAt(i); + if (Character.isUpperCase(ch)) { + result.append("_"); + result.append(Character.toLowerCase(ch)); + } else { + result.append(ch); + } + } + return result.toString(); + } } 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 cfe10c39..51dfd02d 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 @@ -2,6 +2,7 @@ package com.xboe.module.course.service.impl; import com.xboe.common.OrderCondition; import com.xboe.common.PageList; +import com.xboe.common.exception.AppException; import com.xboe.core.CurrentUser; import com.xboe.core.orm.FieldFilters; import com.xboe.core.orm.IFieldFilter; @@ -9,6 +10,8 @@ import com.xboe.core.orm.QueryBuilder; import com.xboe.core.orm.UpdateBuilder; import com.xboe.data.dto.UserOrgIds; import com.xboe.data.outside.IOutSideDataService; +import com.xboe.enums.CourseCreateFromEnum; +import com.xboe.enums.CourseStatusEnum; import com.xboe.module.course.dao.CourseDao; import com.xboe.module.course.dao.CourseTeacherDao; import com.xboe.module.course.dto.CoursePageQueryDTO; @@ -18,6 +21,7 @@ import com.xboe.module.course.entity.CourseTeacher; import com.xboe.module.course.service.ICourseFullTextSearch; import com.xboe.module.course.service.ICoursePageService; import com.xboe.module.course.vo.CoursePageVo; +import com.xboe.module.excel.ExportsExcelSenderUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -25,9 +29,10 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; +import java.io.OutputStream; import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; +import java.time.format.DateTimeFormatter; +import java.util.*; import java.util.stream.Collectors; @Service @@ -65,62 +70,71 @@ public class CoursePageServiceImpl implements ICoursePageService { String currentAccountId = currentUser == null ? null : currentUser.getAccountId(); - // 构建查询条件 - 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 + // 第一版废弃 +// // 构建查询条件 +// 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); + List voList = courseDao.queryCourse(coursePageQueryDTO, isSystemAdmin, orgIds, currentAccountId, true); 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.setCount((int) total); + result.setPageSize(coursePageQueryDTO.getPageSize()); result.setList(voList); - return result; } @@ -199,11 +213,80 @@ public class CoursePageServiceImpl implements ICoursePageService { @Override public ServiceResponse> topListSortChange(List topList) { - return null; + // 1. 按sortWeight升序排序 + topList.sort(Comparator.comparingInt(CoursePageVo::getSortWeight)); + // 2. 更新 + for (CoursePageVo vo : topList) { + courseDao.updateMultiFieldById(vo.getId(), + UpdateBuilder.create("sortWeight", vo.getSortWeight())); + } + return ServiceResponse.success(topList); } @Override public void exportCourseList(CoursePageQueryDTO coursePageQueryDTO, HttpServletResponse response) { + /* + * 1. 前置权限过滤 + * 权限说明:管理员端 可查看本人创建的课程及被授权的课程,其他课程不可见,被赋予查看权的用户可直接引用可查看的课程; + * 教师端 当前用户创建的课程及具有管理权、查看权的课程清单 + */ + UserOrgIds userOrgIds = outSideDataService.getOrgIds(); + + List orgIds = userOrgIds.getIds(); + + boolean isSystemAdmin = userOrgIds.getPermissions().containsKey(UserOrgIds.IsSystemAdminKey) + && userOrgIds.getPermissions().get(UserOrgIds.IsSystemAdminKey); + + List courseList = courseDao.queryCourse(coursePageQueryDTO, isSystemAdmin, orgIds, null, false); + + // 导出 + LinkedHashMap exportMap = new LinkedHashMap<>(); + exportMap.put("课程名称", "name"); + exportMap.put("课程分类", "sysType"); + exportMap.put("授课教师", "teacherName"); + exportMap.put("课程时长", "courseDuration"); + exportMap.put("学习人数", "studys"); + exportMap.put("课程评分", "score"); + exportMap.put("审核状态", "status"); + exportMap.put("发布状态", "published"); + exportMap.put("启停用状态", "enabled"); + exportMap.put("公开课", "openCourse"); + exportMap.put("资源归属", "resOwner"); + exportMap.put("创建人", "sysCreateBy"); + exportMap.put("创建来源", "createFrom"); + exportMap.put("创建时间", "sysCreateTime"); + List> dataList = new ArrayList<>(); + if (courseList != null && !courseList.isEmpty()) { + // TODO 查询sysType和resOwner + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + for (CoursePageVo coursePageVo : courseList) { + Map map = new HashMap<>(); + map.put("name", coursePageVo.getName()); + map.put("sysType", coursePageVo.getSysType1()); // FIXME 三级分类用/拼接 + map.put("teacherName", coursePageVo.getTeacherName()); + // 课程时长:秒转分 + map.put("courseDuration", coursePageVo.getCourseDuration() / 60); + map.put("studys", coursePageVo.getStudys()); + map.put("score", coursePageVo.getScore()); + map.put("status", CourseStatusEnum.getByCode(coursePageVo.getStatus()).getLabel()); + map.put("published", coursePageVo.getPublished() == null || !coursePageVo.getPublished() ? "未发布" : "已发布"); + map.put("enabled", coursePageVo.getEnabled() == null || coursePageVo.getEnabled() ? "停用" : "启用"); + map.put("openCourse", coursePageVo.getOpenCourse() == null || coursePageVo.getOpenCourse() == 0 ? "否" : "是"); + map.put("resOwner", coursePageVo.getResOwner1()); // FIXME 三级分类用/拼接 + map.put("sysCreateBy", coursePageVo.getSysCreateBy()); + map.put("createFrom", CourseCreateFromEnum.getByCode(coursePageVo.getCreateFrom()).getLabel()); + map.put("sysCreateTime", formatter.format(coursePageVo.getSysCreateTime())); + + dataList.add(map); + } + } + + // output + try (OutputStream out = response.getOutputStream()) { + ExportsExcelSenderUtil.exportDynamic(exportMap, dataList, out, null); + } catch (Exception e) { + throw new AppException("导出课程列表发生异常", e); + } } /** @@ -296,6 +379,7 @@ public class CoursePageServiceImpl implements ICoursePageService { // courseDuration 需要计算,这里暂时设置为默认值 vo.setCourseDuration(course.getCourseDuration()); vo.setEnabled(course.getEnabled()); + vo.setSortWeight(course.getSortWeight()); // 获取教师名称 List teacherNames = courseTeacherList.stream() diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/vo/CoursePageVo.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/vo/CoursePageVo.java index c9e0b866..eee44447 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/vo/CoursePageVo.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/vo/CoursePageVo.java @@ -130,4 +130,14 @@ public class CoursePageVo { * 授课教师 */ private String teacherName; -} \ No newline at end of file + + /** + * 是否公开课 + */ + private Integer openCourse; + + /** + * 排序权重 + */ + private Integer sortWeight; +}