feat: 课程列表SQL版

完善了所有查询条件,并完善导出接口
This commit is contained in:
liu.zixi
2025-11-23 18:00:19 +08:00
parent 9f685004ab
commit b28387a2c6
3 changed files with 469 additions and 58 deletions

View File

@@ -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<Course> {
@PersistenceContext
private EntityManager entityManager;
/**
* 课程分页 搜索查询
* */
@@ -70,4 +79,312 @@ public class CourseDao extends BaseDao<Course> {
}
return rs;
}
/**
* 课程查询
* 使用原生sql查询
* 入参在sql语句中用:name的方式传入
*
* @param queryDTO 页面的查询入参
* @param isSystemAdmin 是否是系统管理员
* @param orgIds 组织id列表
* @param currentAccountId 当前用户id
* @param pageQuery 是否分页查询
* @return 课程列表
*/
public List<CoursePageVo> queryCourse(CoursePageQueryDTO queryDTO,
boolean isSystemAdmin, List<String> 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<String> 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<String> 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<String> 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();
}
}

View File

@@ -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<IFieldFilter> filters = new ArrayList<>();
// 自动添加过滤已删除
filters.add(FieldFilters.eq("c.deleted", false));
// 添加权限过滤条件
if (!isSystemAdmin) {
// 非系统管理员需要进行权限过滤
List<IFieldFilter> 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<Course> coursePageList = courseDao.findPage(query.builder());
// 转换为CoursePageVo
// 第一版废弃
// // 构建查询条件
// List<IFieldFilter> filters = new ArrayList<>();
//
// // 自动添加过滤已删除
// filters.add(FieldFilters.eq("c.deleted", false));
//
// // 添加权限过滤条件
// if (!isSystemAdmin) {
// // 非系统管理员需要进行权限过滤
// List<IFieldFilter> 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<Course> coursePageList = courseDao.findPage(query.builder());
//
// // 转换为CoursePageVo
// PageList<CoursePageVo> result = new PageList<>();
// result.setCount(coursePageList.getCount());
// result.setPageSize(coursePageList.getPageSize());
//
// // 子查询根据课程id查询课程下的教师
// List<String> courseIds = coursePageList.getList().stream()
// .map(Course::getId)
// .collect(Collectors.toList());
// List<CourseTeacher> courseTeacherList = getCourseTeacherList(courseIds);
// List<CoursePageVo> 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<CoursePageVo> voList = courseDao.queryCourse(coursePageQueryDTO, isSystemAdmin, orgIds, currentAccountId, true);
PageList<CoursePageVo> result = new PageList<>();
result.setCount(coursePageList.getCount());
result.setPageSize(coursePageList.getPageSize());
// 子查询根据课程id查询课程下的教师
List<String> courseIds = coursePageList.getList().stream()
.map(Course::getId)
.collect(Collectors.toList());
List<CourseTeacher> courseTeacherList = getCourseTeacherList(courseIds);
List<CoursePageVo> 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<List<CoursePageVo>> topListSortChange(List<CoursePageVo> 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<String> orgIds = userOrgIds.getIds();
boolean isSystemAdmin = userOrgIds.getPermissions().containsKey(UserOrgIds.IsSystemAdminKey)
&& userOrgIds.getPermissions().get(UserOrgIds.IsSystemAdminKey);
List<CoursePageVo> courseList = courseDao.queryCourse(coursePageQueryDTO, isSystemAdmin, orgIds, null, false);
// 导出
LinkedHashMap<String, String> 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<Map<String, Object>> 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<String, Object> 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<String> teacherNames = courseTeacherList.stream()

View File

@@ -130,4 +130,14 @@ public class CoursePageVo {
* 授课教师
*/
private String teacherName;
}
/**
* 是否公开课
*/
private Integer openCourse;
/**
* 排序权重
*/
private Integer sortWeight;
}