Compare commits

...

2 Commits

Author SHA1 Message Date
liu.zixi
7e21784a74 feat: 数据权限确认 2025-12-01 19:10:37 +08:00
yangxinyu
4b064171e6 feat:增加查询资源学习列表的contentName字段 2025-12-01 17:22:10 +08:00
8 changed files with 105 additions and 78 deletions

View File

@@ -131,6 +131,16 @@ public class CourseManageApi extends ApiBaseController{
return success(coursePageService.pageQuery(null, coursePageQueryDTO));
}
/**
* 新-教师端 我开发的课程
* @param coursePageQueryDTO
* @return
*/
@PostMapping("/develop_page")
public JsonResponse<PageList<CoursePageVo>> teacherPage(@RequestBody CoursePageQueryDTO coursePageQueryDTO) {
return success(coursePageService.pageQuery(getCurrent(), coursePageQueryDTO));
}
/**
* 当前用户是否在管理端显示置顶相关功能
* @return

View File

@@ -6,6 +6,7 @@ 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;
@@ -229,7 +230,7 @@ public class CourseDao extends BaseDao<Course> {
// 开头判断课程培训时间的两个参数是否不为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");
// 学习人数聚合(满足时间条件的学习记录,且学习记录有效)
@@ -253,6 +254,9 @@ public class CourseDao extends BaseDao<Course> {
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
@@ -302,9 +306,14 @@ public class CourseDao extends BaseDao<Course> {
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.getTeacherName())) {
if (StringUtils.isNotBlank(queryDTO.getTeacherId())) {
builder.append(System.lineSeparator());
builder.append("AND tch.teacher_names LIKE CONCAT('%', :teacherName, '%')");
// 判断teacherId是一个还是多个
if (queryDTO.getTeacherId().contains(",")) {
builder.append("AND ct.teacher_id IN (:teacherIdList)");
} else {
builder.append("AND ct.teacher_id = :teacherId");
}
}
// 展开后条件
if (queryDTO.getEnabled() != null) {
@@ -319,9 +328,13 @@ public class CourseDao extends BaseDao<Course> {
builder.append(System.lineSeparator());
builder.append("AND c.org_id = :orgId");
}
if (StringUtils.isNotBlank(queryDTO.getCreateUser())) {
if (StringUtils.isNotBlank(queryDTO.getCreateUserId())) {
builder.append(System.lineSeparator());
builder.append("AND c.sys_create_by LIKE CONCAT('%', :createUser, '%')");
if (queryDTO.getCreateUserId().contains(",")) {
builder.append("AND c.sys_create_aid IN (:createUserIdList)");
} else {
builder.append("AND c.sys_create_aid = :createUserId");
}
}
if (StringUtils.isNotBlank(queryDTO.getCreateFrom())) {
builder.append(System.lineSeparator());
@@ -402,8 +415,14 @@ public class CourseDao extends BaseDao<Course> {
query.setParameter("learningTimeStart", queryDTO.getLearningTimeStart());
query.setParameter("learningTimeEnd", queryDTO.getLearningTimeEnd());
}
if (StringUtils.isNotBlank(queryDTO.getTeacherName())) {
query.setParameter("teacherName", queryDTO.getTeacherName());
if (StringUtils.isNotBlank(queryDTO.getTeacherId())) {
String teacherIdStr = queryDTO.getTeacherId();
if (teacherIdStr.contains(",")) {
List<String> teacherIdList = Arrays.asList(teacherIdStr.split(","));
query.setParameter("teacherIdList", teacherIdList);
} else {
query.setParameter("teacherId", queryDTO.getTeacherId());
}
}
if (queryDTO.getEnabled() != null) {
query.setParameter("enabled", queryDTO.getEnabled());
@@ -414,8 +433,14 @@ public class CourseDao extends BaseDao<Course> {
if (StringUtils.isNotBlank(queryDTO.getResOwner1())) {
query.setParameter("orgId", queryDTO.getResOwner1());
}
if (StringUtils.isNotBlank(queryDTO.getCreateUser())) {
query.setParameter("createUser", queryDTO.getCreateUser());
if (StringUtils.isNotBlank(queryDTO.getCreateUserId())) {
String createUserIdStr = queryDTO.getCreateUserId();
if (createUserIdStr.contains(",")) {
List<String> createUserIdList = Arrays.asList(createUserIdStr.split(","));
query.setParameter("createUserIdList", createUserIdList);
} else {
query.setParameter("createUserId", queryDTO.getCreateUserId());
}
}
if (StringUtils.isNotBlank(queryDTO.getCreateFrom())) {
query.setParameter("createFrom", queryDTO.getCreateFrom());

View File

@@ -31,6 +31,11 @@ public class CoursePageQueryDTO {
/**创建人*/
private String createUser;
/**
* 创建人id
*/
private String createUserId;
/**课程分类的一级*/
private String sysType1;
@@ -43,6 +48,11 @@ public class CoursePageQueryDTO {
/**授课教师*/
private String teacherName;
/**
* 授课教师id
*/
private String teacherId;
/**培训时间筛选类型*/
private String learningTimeType;
@@ -77,4 +87,11 @@ public class CoursePageQueryDTO {
/**排序顺序*/
private Boolean orderAsc;
/**
* 是否是新建在线课程页面
* false时代表是在管理端的“在线管理”、“我开发的课程”
* true时代表是在学习路径图/项目管理 中,创建在线课程的选择页面
*/
private Boolean isCreateCourse;
}

View File

@@ -82,65 +82,9 @@ 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
// 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;
// 第二版
List<String> readIds = userOrgIds.getReadIds();
orgIds.addAll(readIds);
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<>();

View File

@@ -133,15 +133,15 @@ public class StudyCourseApi extends ApiBaseController{
*
* @param pager 分页参数
* @param courseId 25.11.25新增
*
* @param contentName 资源名称
*/
@RequestMapping(value = "/pagelist-resource", method = {RequestMethod.GET, RequestMethod.POST})
public JsonResponse<PageList<CourseFinishCountDto>> findPageResource(Pagination pager, String courseId) {
public JsonResponse<PageList<CourseFinishCountDto>> findPageResource(Pagination pager, String courseId, String contentName) {
if (StringUtil.isBlank(courseId)) {
return error("课程id不能为空");
}
try {
PageList<CourseFinishCountDto> courseFinishCountDTOs = service.findPageResource(pager.getPageIndex(), pager.getPageSize(), courseId);
PageList<CourseFinishCountDto> courseFinishCountDTOs = service.findPageResource(pager.getPageIndex(), pager.getPageSize(), courseId, contentName);
return success(courseFinishCountDTOs);
} catch (Exception e) {
log.error("查询课程学习记录错误:{}", e.getMessage());

View File

@@ -18,9 +18,10 @@ public class CourseStatDao extends BaseDao<StudyCourse> {
* @param startIndex 分页开始索引
* @param pageSize 分页大小
* @param courseId 课程ID
* @param contentName 资源名称
* @return 课程完成人数统计DTO集合
*/
public List<CourseFinishCountDto> findFinishCountPage(int startIndex, int pageSize, String courseId) {
public List<CourseFinishCountDto> findFinishCountPage(int startIndex, int pageSize, String courseId, String contentName) {
StringBuilder sql = new StringBuilder();
sql.append("SELECT ")
// 课程名和DTO字段对应
@@ -42,6 +43,13 @@ public class CourseStatDao extends BaseDao<StudyCourse> {
sql.append("AND c.course_id = ? ");
params.add(courseId);
}
// 25.12.1修改 新增contentName模糊查询粗略匹配
if (StringUtils.isNotBlank(contentName)) {
// 实现“包含contentName”的模糊查询
sql.append("AND c.content_name LIKE ? ");
// 通配符%拼接在参数上防注入表示“前后任意字符包含contentName”
params.add("%" + contentName + "%");
}
// 分组+排序+分页聚合函数必须分组排序参考第一个代码的desc id
sql.append("GROUP BY c.content_id, c.content_name, cc.content_type ")
.append("ORDER BY c.content_id DESC ")
@@ -64,8 +72,14 @@ public class CourseStatDao extends BaseDao<StudyCourse> {
return dtoList;
}
// 查总条数返回int类型匹配PageList的count字段
public int findFinishCountTotal(String courseId) {
/**
* 查询课程完成人数
*
* @param courseId 课程ID
* @param contentName 资源名称
* @return 课程完成人数
*/
public int findFinishCountTotal(String courseId, String contentName) {
StringBuilder sql = new StringBuilder();
sql.append("SELECT ")
// 总条数=去重后的人数
@@ -80,6 +94,13 @@ public class CourseStatDao extends BaseDao<StudyCourse> {
sql.append("AND c.course_id = ? ");
params.add(courseId);
}
// 25.12.1修改 新增contentName模糊查询粗略匹配
if (StringUtils.isNotBlank(contentName)) {
// 实现“包含contentName”的模糊查询
sql.append("AND c.content_name LIKE ? ");
// 通配符%拼接在参数上防注入表示“前后任意字符包含contentName”
params.add("%" + contentName + "%");
}
// 用sqlCount替代sqlFindObject直接返回int类型结果
// sqlCount会执行SQL并返回COUNT的结果无需手动转换Object
return this.sqlCount(sql.toString(), params.toArray());

View File

@@ -69,8 +69,9 @@ public interface IStudyCourseService {
* @param pageIndex 页码
* @param pageSize 每页数据条数
* @param courseId 课程id
* @param contentName 资源名称
*/
PageList<CourseFinishCountDto> findPageResource(int pageIndex, int pageSize, String courseId);
PageList<CourseFinishCountDto> findPageResource(int pageIndex, int pageSize, String courseId, String contentName);
/**
* 热度榜

View File

@@ -233,15 +233,24 @@ public class StudyCourseServiceImpl implements IStudyCourseService{
}
return studyCoursePageList;
}
/**
* 分页查询课程的资源名称以及资源学习完成人数
*
* @param pageIndex 页码
* @param pageSize 每页数据条数
* @param courseId 课程id
* @param contentName 资源名称
*/
@Override
public PageList<CourseFinishCountDto> findPageResource(int pageIndex, int pageSize, String courseId) {
public PageList<CourseFinishCountDto> findPageResource(int pageIndex, int pageSize, String courseId, String contentName) {
// 1. 手动计算分页偏移量(数据库分页必需)
// pageIndex<1时设为0避免数据库LIMIT偏移量为负数
int startIndex = (pageIndex < 1) ? 0 : (pageIndex - 1) * pageSize;
// 2. 调用Dao层查当前页数据传入偏移量、每页条数、courseId条件
List<CourseFinishCountDto> dtoList = courseStatDao.findFinishCountPage(startIndex, pageSize, courseId);
List<CourseFinishCountDto> dtoList = courseStatDao.findFinishCountPage(startIndex, pageSize, courseId,contentName);
// 3. 调用Dao层查总条数对应PageList的count字段用int类型和PageList一致
int totalCount = courseStatDao.findFinishCountTotal(courseId);
int totalCount = courseStatDao.findFinishCountTotal(courseId,contentName);
// 4. 按PageList构造函数创建对象只传list和count
PageList<CourseFinishCountDto> pageList = new PageList<>(dtoList, totalCount);
// 5. 设置pageSize覆盖默认10确保总页数计算正确