mirror of
https://codeup.aliyun.com/67762337eccfc218f6110e0e/per-boe/java-servers.git
synced 2025-12-07 01:46:47 +08:00
feat: 课程列表SQL版
完善了所有查询条件,并完善导出接口
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -130,4 +130,14 @@ public class CoursePageVo {
|
||||
* 授课教师
|
||||
*/
|
||||
private String teacherName;
|
||||
|
||||
/**
|
||||
* 是否公开课
|
||||
*/
|
||||
private Integer openCourse;
|
||||
|
||||
/**
|
||||
* 排序权重
|
||||
*/
|
||||
private Integer sortWeight;
|
||||
}
|
||||
Reference in New Issue
Block a user