feat: 课程列表分页、导出功能修改

This commit is contained in:
liu.zixi
2025-11-26 16:31:15 +08:00
parent 8b52a5680b
commit 3413c73fc8
9 changed files with 119 additions and 41 deletions

View File

@@ -0,0 +1,17 @@
package com.xboe.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
/**
* 整体系统MySQL数据库schema配置
*/
@ConfigurationProperties(prefix = "mysql.schema")
@Data
public class MySqlSchemaProperties {
/**
* 用户中心数据库schema
*/
private String userCenterSchema;
}

View File

@@ -96,7 +96,7 @@ public class CourseDao extends BaseDao<Course> {
*/
public List<CoursePageVo> queryCourse(CoursePageQueryDTO queryDTO,
boolean isSystemAdmin, List<String> orgIds, String currentAccountId,
boolean pageQuery) {
boolean pageQuery, String userCenterSchema) {
// select字段
StringBuilder builder = new StringBuilder("select ");
builder.append("c.id,");
@@ -105,9 +105,9 @@ public class CourseDao extends BaseDao<Course> {
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.org_id AS orgId,");
builder.append("org.org_name AS orgName,");
builder.append("org.org_name_path AS orgFullName,");
builder.append("c.sys_create_by AS sysCreateBy,");
builder.append("c.create_from AS createFrom,");
builder.append("c.sys_create_time AS sysCreateTime,");
@@ -124,7 +124,7 @@ public class CourseDao extends BaseDao<Course> {
builder.append("COALESCE(tch.teacher_names, '') AS teacherName,");
builder.append("c.sort_weight AS sortWeight");
// 拼接FROM及查询条件语句
appendFrom(builder, queryDTO, isSystemAdmin, orgIds, currentAccountId);
appendFrom(builder, queryDTO, isSystemAdmin, orgIds, currentAccountId, userCenterSchema);
// 排序语句
appendOrder(builder, queryDTO);
@@ -146,9 +146,9 @@ public class CourseDao extends BaseDao<Course> {
vo.setSysType1((String) row[3]);
vo.setSysType2((String) row[4]);
vo.setSysType3((String) row[5]);
vo.setResOwner1((String) row[6]);
vo.setResOwner2((String) row[7]);
vo.setResOwner3((String) row[8]);
vo.setOrgId((String) row[6]);
vo.setOrgName((String) row[7]);
vo.setOrgFullName((String) row[8]);
vo.setSysCreateBy((String) row[9]);
vo.setCreateFrom((String) row[10]);
@@ -201,11 +201,11 @@ public class CourseDao extends BaseDao<Course> {
}
public long countCourse(CoursePageQueryDTO queryDTO,
boolean isSystemAdmin, List<String> orgIds, String currentAccountId) {
boolean isSystemAdmin, List<String> orgIds, String currentAccountId, String userCenterSchema) {
// select count
StringBuilder builder = new StringBuilder("select count(*)");
// 拼接FROM及查询条件语句
appendFrom(builder, queryDTO, isSystemAdmin, orgIds, currentAccountId);
appendFrom(builder, queryDTO, isSystemAdmin, orgIds, currentAccountId, userCenterSchema);
// 排序语句
appendOrder(builder, queryDTO);
@@ -225,7 +225,7 @@ public class CourseDao extends BaseDao<Course> {
* @param currentAccountId
*/
private void appendFrom(StringBuilder builder, CoursePageQueryDTO queryDTO,
boolean isSystemAdmin, List<String> orgIds, String currentAccountId) {
boolean isSystemAdmin, List<String> orgIds, String currentAccountId, String userCenterSchema) {
// 开头判断课程培训时间的两个参数是否不为null
boolean filterLearningTime = queryDTO.getLearningTimeStart() != null && queryDTO.getLearningTimeEnd() != null;
builder.append(" FROM boe_course c");
@@ -249,6 +249,11 @@ public class CourseDao extends BaseDao<Course> {
// 课件聚合
builder.append(System.lineSeparator());
builder.append("LEFT JOIN (SELECT course_id, SUM(duration) AS duration_sum FROM boe_course_content WHERE deleted = 0 GROUP BY course_id) cc ON c.id = cc.course_id");
// 组织机构聚合
builder.append(System.lineSeparator());
builder.append("LEFT JOIN ").append(userCenterSchema)
.append(".organization org ON c.org_id = org.organization_id AND org.deleted = 0");
// where条件
// 第一个条件deleted = 0
builder.append(System.lineSeparator());
@@ -310,17 +315,9 @@ public class CourseDao extends BaseDao<Course> {
builder.append(System.lineSeparator());
builder.append("AND c.open_course = :openCourse");
}
if (StringUtils.isNotBlank(queryDTO.getResOwner1())) {
if (StringUtils.isNotBlank(queryDTO.getOrgId())) {
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");
builder.append("AND c.org_id = :orgId");
}
if (StringUtils.isNotBlank(queryDTO.getCreateUser())) {
builder.append(System.lineSeparator());
@@ -349,10 +346,12 @@ public class CourseDao extends BaseDao<Course> {
// 排序逻辑
String orderAscStr = orderAsc == null || orderAsc ? "ASC" : "DESC";
// 多字段排序: sysType resOwner
if (StringUtils.equals(orderField, "sysType") || StringUtils.equals(orderField, "resOwner")) {
if (StringUtils.equals(orderField, "sysType")) {
for (int i = 1; i <= 3; i++) {
builder.append("c.").append(orderFieldSql).append(i).append(" ").append(orderAscStr).append(", ");
}
} else if (StringUtils.equals(orderField, "resOwner")) {
builder.append("org.org_name ").append(orderAscStr).append(", ");
} else if (StringUtils.equals(orderField, "studys")) {
builder.append("COALESCE(stu.studys, 0) ").append(orderAscStr).append(", ");
} else if (StringUtils.equals(orderField, "score")) {
@@ -413,13 +412,7 @@ public class CourseDao extends BaseDao<Course> {
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());
query.setParameter("orgId", queryDTO.getResOwner1());
}
if (StringUtils.isNotBlank(queryDTO.getCreateUser())) {
query.setParameter("createUser", queryDTO.getCreateUser());

View File

@@ -20,6 +20,11 @@ public class CoursePageQueryDTO {
/**资源归属三级*/
private String resOwner3;
/**
* 资源归属机构id
*/
private String orgId;
/**是否发布,无就是全部*/
private Boolean publish;

View File

@@ -1,8 +1,10 @@
package com.xboe.module.course.service.impl;
import com.boe.feign.api.usercenter.entity.ApiOrgListVo;
import com.xboe.common.OrderCondition;
import com.xboe.common.PageList;
import com.xboe.common.exception.AppException;
import com.xboe.config.MySqlSchemaProperties;
import com.xboe.core.CurrentUser;
import com.xboe.core.orm.FieldFilters;
import com.xboe.core.orm.IFieldFilter;
@@ -22,24 +24,30 @@ 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 com.xboe.module.type.entity.Type;
import com.xboe.module.type.service.ITypeService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
@EnableConfigurationProperties({MySqlSchemaProperties.class})
@Service
@Slf4j
public class CoursePageServiceImpl implements ICoursePageService {
@Autowired
private MySqlSchemaProperties mySqlSchemaProperties;
@Resource
private CourseDao courseDao;
@@ -49,6 +57,9 @@ public class CoursePageServiceImpl implements ICoursePageService {
@Autowired
private IOutSideDataService outSideDataService;
@Resource
private ITypeService typeService;
@Autowired(required = false)
private ICourseFullTextSearch fullTextSearch;
@@ -130,8 +141,8 @@ public class CoursePageServiceImpl implements ICoursePageService {
//
// return result;
// 第二版
long total = courseDao.countCourse(coursePageQueryDTO, isSystemAdmin, orgIds, currentAccountId);
List<CoursePageVo> voList = courseDao.queryCourse(coursePageQueryDTO, isSystemAdmin, orgIds, currentAccountId, true);
long total = courseDao.countCourse(coursePageQueryDTO, isSystemAdmin, orgIds, currentAccountId, mySqlSchemaProperties.getUserCenterSchema());
List<CoursePageVo> voList = courseDao.queryCourse(coursePageQueryDTO, isSystemAdmin, orgIds, currentAccountId, true, mySqlSchemaProperties.getUserCenterSchema());
PageList<CoursePageVo> result = new PageList<>();
result.setCount((int) total);
result.setPageSize(coursePageQueryDTO.getPageSize());
@@ -239,7 +250,7 @@ public class CoursePageServiceImpl implements ICoursePageService {
boolean isSystemAdmin = userOrgIds.getPermissions().containsKey(UserOrgIds.IsSystemAdminKey)
&& userOrgIds.getPermissions().get(UserOrgIds.IsSystemAdminKey);
List<CoursePageVo> courseList = courseDao.queryCourse(coursePageQueryDTO, isSystemAdmin, orgIds, null, false);
List<CoursePageVo> courseList = courseDao.queryCourse(coursePageQueryDTO, isSystemAdmin, orgIds, null, false, mySqlSchemaProperties.getUserCenterSchema());
// 导出
LinkedHashMap<String, String> exportMap = new LinkedHashMap<>();
@@ -253,18 +264,39 @@ public class CoursePageServiceImpl implements ICoursePageService {
exportMap.put("发布状态", "published");
exportMap.put("启停用状态", "enabled");
exportMap.put("公开课", "openCourse");
exportMap.put("资源归属", "resOwner");
exportMap.put("资源归属", "orgName");
exportMap.put("创建人", "sysCreateBy");
exportMap.put("创建来源", "createFrom");
exportMap.put("创建时间", "sysCreateTime");
List<Map<String, Object>> dataList = new ArrayList<>();
if (courseList != null && !courseList.isEmpty()) {
// TODO 查询sysType和resOwner
// 查询sysType
Type sysTypeParam = new Type();
sysTypeParam.setSysResType(1);
sysTypeParam.setStatus(1);
List<Type> typeList = typeService.findList(sysTypeParam);
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 三级分类用/拼接
// 课程分类
StringBuilder sysTypeBuilder = new StringBuilder();
typeList.stream()
.filter(t -> StringUtils.equals(coursePageVo.getSysType1(), t.getId()))
.findFirst().ifPresent(t -> sysTypeBuilder.append(t.getName()));
if (StringUtils.isNotBlank(coursePageVo.getSysType2())) {
typeList.stream()
.filter(t -> StringUtils.equals(coursePageVo.getSysType2(), t.getId()))
.findFirst().ifPresent(t -> sysTypeBuilder.append("/").append(t.getName()));
}
if (StringUtils.isNotBlank(coursePageVo.getSysType3())) {
typeList.stream()
.filter(t -> StringUtils.equals(coursePageVo.getSysType3(), t.getId()))
.findFirst().ifPresent(t -> sysTypeBuilder.append("/").append(t.getName()));
}
map.put("sysType", sysTypeBuilder.toString());
// map.put("sysType", coursePageVo.getSysType1());
map.put("teacherName", coursePageVo.getTeacherName());
// 课程时长:秒转分
map.put("courseDuration", coursePageVo.getCourseDuration() / 60);
@@ -274,7 +306,7 @@ public class CoursePageServiceImpl implements ICoursePageService {
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("orgName", coursePageVo.getOrgName());
map.put("sysCreateBy", coursePageVo.getSysCreateBy());
map.put("createFrom", CourseCreateFromEnum.getByCode(coursePageVo.getCreateFrom()).getLabel());
map.put("sysCreateTime", formatter.format(coursePageVo.getSysCreateTime()));

View File

@@ -53,6 +53,21 @@ public class CoursePageVo {
* 资源归属三级
*/
private String resOwner3;
/**
* 机构ID
*/
private String orgId;
/**
* 机构名称
*/
private String orgName;
/**
* 机构全名
*/
private String orgFullName;
/**
* 创建人

View File

@@ -117,4 +117,8 @@ aop-log-record:
password: admin
elasticsearch:
host: 192.168.0.253
port: 9200
port: 9200
mysql:
schema:
user-center-schema: userbasic

View File

@@ -194,4 +194,8 @@ aop-log-record:
password: admin
elasticsearch:
host: 10.251.129.21
port: 9200
port: 9200
mysql:
schema:
user-center-schema: user_basic

View File

@@ -147,4 +147,8 @@ boe:
pcPageUrl: ${boe.domain-name}/pc/course/studyindex?id=
h5PageUrl: ${boe.domain-name}/mobile/pages/study/courseStudy?id=
pcLoginUrl: ${boe.domain-name}/web/
h5LoginUrl: ${boe.domain-name}/m/loginuser
h5LoginUrl: ${boe.domain-name}/m/loginuser
mysql:
schema:
user-center-schema: user_basic

View File

@@ -221,4 +221,8 @@ aop-log-record:
host: 10.251.129.25
port: 9200
user: elastic
password: Boe@es123
password: Boe@es123
mysql:
schema:
user-center-schema: userbasic