feat:资源学习情况分页查询-考试信息,同时修复原资源学习情况分页查询接口在参数为null时的错误查询结果

This commit is contained in:
miaowenbo
2025-11-26 20:22:34 +08:00
parent 3392602854
commit 6bf11cea79
4 changed files with 140 additions and 62 deletions

View File

@@ -72,6 +72,9 @@ public class StudyCourseApi extends ApiBaseController{
@Autowired
IStudyExamService studyExamService;
@Autowired
IStudyHomeWorkService studyHomeWorkService;
@Resource
private ThirdApi thirdApi;
@@ -1185,15 +1188,18 @@ public class StudyCourseApi extends ApiBaseController{
return error("查询失败",e.getMessage());
}
}
/**
* 资源学习情况详细信息,此接口用于管理端处理
* @param pager
* @param courseId
* @param contentId
* @return
* 资源学习情况分页查询,此接口用于管理端处理
* 25.11.25修改,修改资源学习情况的查询字段,修改为管理端和教师端均可以查询,并添加部门和工号查询逻辑
*
* @param pager 分页参数
* @param courseId 课程id
* @param contentId 内容id
* @param name 用户名称
* @param status 用户学习状态1-未开始2-已完成3-进行中)
* @return 资源学习情况分页集合
*/
@RequestMapping(value="/contents",method = {RequestMethod.GET,RequestMethod.POST})
public JsonResponse<PageList<StudyCourseItem>> findPage(Pagination pager,String courseId,String contentId,String name,Integer status){
@@ -1201,14 +1207,55 @@ public class StudyCourseApi extends ApiBaseController{
return error("无课程信息");
}
try {
PageList<StudyCourseItem> rs=studyService.findItemPage(pager.getPageIndex(),pager.getPageSize(),contentId,courseId,name,status);
PageList<StudyCourseItem> rs = studyService.findItemPage(pager.getPageIndex(), pager.getPageSize(), null, contentId, courseId, name, status);
return success(rs);
}catch(Exception e) {
log.error("查询课程学习记录错误",e.getMessage());
log.error("【资源学习情况分页查询】错误:{}", e.getMessage());
return error("查询失败",e.getMessage());
}
}
/**
* 资源学习情况分页查询-考试信息
* 此接口只查询考试信息
*
* @param pager 分页参数
* @param courseId 课程id
* @param contentId 内容id
* @param name 用户名称
* @param status 用户学习状态1-未开始2-已完成3-进行中)
* @return 资源学习情况分页集合
*/
@RequestMapping(value = "/contents-exam", method = {RequestMethod.GET, RequestMethod.POST})
public JsonResponse<PageList<StudyCourseItem>> findPageExam(Pagination pager, String courseId, String contentId, String name, Integer status) {
if (StringUtils.isBlank(courseId)) {
return error("无课程信息");
}
try {
// 查询当前课程的考试信息
List<StudyExam> studyExams = studyExamService.getByCourseId(courseId);
// 空值校验
if (studyExams == null || studyExams.isEmpty()) {
return success(new PageList<>());
}
List<String> studyCourseItemIds = studyExams.stream().map(StudyExam::getStudyItemId).collect(Collectors.toList());
// 分页查询资源学习信息
PageList<StudyCourseItem> rs = studyService.findItemPage(pager.getPageIndex(), pager.getPageSize(), studyCourseItemIds, contentId, courseId, name, status);
// 拼接考试信息
List<StudyCourseItem> studyCourseItems = rs.getList();
if (studyCourseItems != null && !studyCourseItems.isEmpty() && !studyExams.isEmpty()) {
for (StudyCourseItem studyCourseItem : studyCourseItems) {
// 获取当前课程的考试信息,并按lastTime字段倒序排列
studyCourseItem.setStudyExams(studyExams.stream().filter(studyExam -> studyExam.getStudyItemId().equals(studyCourseItem.getId())).sorted(Comparator.comparing(StudyExam::getLastTime).reversed()).collect(Collectors.toList()));
}
}
return success(rs);
} catch (Exception e) {
log.error("【资源学习情况分页查询-考试信息】错误:{}", e.getMessage());
return error("查询失败", e.getMessage());
}
}
@RequestMapping(value="/study-course-content",method = {RequestMethod.GET,RequestMethod.POST})
public JsonResponse<StudyCourseItem> findStudyCourseItem(String studyId,String contentId){
if(StringUtils.isBlank(studyId)){

View File

@@ -1,19 +1,18 @@
package com.xboe.school.study.entity;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.xboe.core.SysConstant;
import com.xboe.core.orm.IdEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.Transient;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.xboe.core.SysConstant;
import com.xboe.core.orm.IdEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
/*
* 课程学习记录表,相当于课程学习表的子表
@@ -138,4 +137,11 @@ public class StudyCourseItem extends IdEntity {
@Transient
private BigDecimal progressVideo;
/**
* 考试记录集合
* 仅在资源学习情况分页查询-考试信息接口使用
* 25.11.25新增
*/
@Transient
private List<StudyExam> studyExams;
}

View File

@@ -1,14 +1,14 @@
package com.xboe.school.study.service;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import com.xboe.common.PageList;
import com.xboe.school.study.dto.StudyContentDto;
import com.xboe.school.study.entity.StudyCourseItem;
import com.xboe.school.study.entity.StudyTime;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
/**
* 学习情况处理,比较综合一个处理类
* @author seastar
@@ -85,18 +85,21 @@ public interface IStudyService {
* @return
*/
List<StudyCourseItem> findByStudyId(String studyId);
/**
* 查询学习内容记录
* @param pageIndex
* @param pageSize
* @param contentId
* @param courseId
* @param name
* @param status
* @return
* 资源学习情况分页查询,此接口用于管理端处理
* 25.11.25修改,修改资源学习情况的查询字段,修改为管理端和教师端均可以查询,并添加部门和工号查询逻辑
*
* @param ids 资源学习id集合
* @param pageIndex 页码
* @param pageSize 每页数量
* @param courseId 课程id
* @param contentId 内容id
* @param name 用户名称
* @param status 用户学习状态1-未开始2-已完成3-进行中)
* @return 资源学习情况分页集合
*/
PageList<StudyCourseItem> findItemPage(int pageIndex, int pageSize, String contentId, String courseId, String name, Integer status);
PageList<StudyCourseItem> findItemPage(int pageIndex, int pageSize, List<String> ids, String contentId, String courseId, String name, Integer status);
List<StudyCourseItem> getList(String courseId, String contentId, String name, Integer status);

View File

@@ -1,20 +1,5 @@
package com.xboe.school.study.service.impl;
import java.time.Duration;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.transaction.Transactional;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import com.xboe.common.OrderCondition;
import com.xboe.common.PageList;
import com.xboe.core.orm.FieldFilters;
@@ -32,8 +17,20 @@ import com.xboe.school.study.entity.StudyTime;
import com.xboe.school.study.service.IStudyService;
import com.xboe.standard.enums.BoedxContentType;
import com.xboe.system.user.dao.UserDao;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import javax.transaction.Transactional;
import java.time.Duration;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Slf4j
@Service
public class StudyServiceImpl implements IStudyService{
@@ -223,14 +220,30 @@ public class StudyServiceImpl implements IStudyService{
return list;
}
/**
* 资源学习情况分页查询,此接口用于管理端处理
* 25.11.25修改,修改资源学习情况的查询字段,修改为管理端和教师端均可以查询,并添加部门和工号查询逻辑
*
* @param ids 资源学习id集合
* @param pageIndex 页码
* @param pageSize 每页数量
* @param courseId 课程id
* @param contentId 内容id
* @param name 用户名称
* @param status 用户学习状态1-未开始2-已完成3-进行中)
* @return 资源学习情况分页集合
*/
@Override
public PageList<StudyCourseItem> findItemPage(int pageIndex, int pageSize, String contentId, String courseId,String name,Integer status) {
public PageList<StudyCourseItem> findItemPage(int pageIndex, int pageSize, List<String> ids, String contentId, String courseId,String name,Integer status) {
QueryBuilder query = QueryBuilder.from(StudyCourseItem.class);
query.setPageIndex(pageIndex);
query.setPageSize(pageSize);
OrderCondition oc=OrderCondition.desc("id");
query.addOrder(oc);
if (ids != null && !ids.isEmpty()) {
query.addFilter(FieldFilters.in("id",ids));
}
if(StringUtils.isNotBlank(contentId)) {
query.addFilter(FieldFilters.eq("contentId",contentId));
}
@@ -251,16 +264,22 @@ public class StudyServiceImpl implements IStudyService{
}else if (status == 1) {
String sql = "select bsc.id,bsc.course_id,bsc.course_name,bsc.aname,item.content_id,0 as progress,1 as status from boe_study_course bsc " +
" left join boe_study_course_item item on bsc.course_id = item.course_id and bsc.id = item.study_id" +
" where bsc.course_id = '"+courseId+"' and bsc.aname like '%"+name+"%' and bsc.id not in(" +
" where bsc.course_id = '" + courseId + "'" +
(StringUtils.isBlank(name) ? "" : "and bsc.aname like '%"+name+"%'") + "and bsc.id not in(" +
" select item.study_id from boe_study_course_item item " +
" where item.course_id = '" + courseId + "' and item.content_id = '"+ contentId+"' and item.aname like '%"+name+"%' group by item.study_id" +
" where item.course_id = '" + courseId + "'" +
(StringUtils.isBlank(contentId) ? "" : "and item.content_id = '" + contentId + "'") +
(StringUtils.isBlank(name) ? "" : "and item.aname like '%" + name+"%'") + " group by item.study_id" +
" ) group by bsc.id limit "+ pageIndex2+","+ pageSize+";";
String sql2 = "select count(*) as total from (select bsc.id,bsc.course_id,bsc.course_name,bsc.aname,item.content_id,0 as progress,1 as status from boe_study_course bsc " +
" left join boe_study_course_item item on bsc.course_id = item.course_id and bsc.id = item.study_id" +
" where bsc.course_id = '"+courseId+"' and bsc.aname like '%"+name+"%' and bsc.id not in(" +
" where bsc.course_id = '"+courseId+"'" +
(StringUtils.isBlank(name) ? "" : "and bsc.aname like '%"+name+"%'") + " and bsc.id not in(" +
" select item.study_id from boe_study_course_item item " +
" where item.course_id = '" + courseId + "' and item.content_id = '"+ contentId+"' and item.aname like '%"+name+"%' group by item.study_id" +
" where item.course_id = '" + courseId + "'" +
(StringUtils.isBlank(contentId) ? "" : "and item.content_id = '" + contentId + "'") +
(StringUtils.isBlank(name) ? "" : "and item.aname like '%" + name+"%'") + " group by item.study_id" +
" ) group by bsc.id) as total";
log.info("资源完成情况未开始sql"+sql);
List<Object[]> list = scDao.sqlFindList(sql);
@@ -285,20 +304,23 @@ public class StudyServiceImpl implements IStudyService{
String sql = "select a.id, a.course_id, a.course_name, a.aname, " +
"IFNULL(b.finish_time, '0') as finish_time, IFNULL(b.progress, 0) as progress, IFNULL(b.status, 1) as status,b.score " +
"from (select id, course_id, course_name, aname, 0, 1 from boe_study_course where course_id = '" + courseId + "' and aname like '%"+name+"%') a " +
"from (select id, course_id, course_name, aname, 0, 1 from boe_study_course where course_id = '" + courseId + "'" +
(StringUtils.isBlank(name) ? "" : "and item.aname like '%"+name+"%'") + ") a " +
"left join " +
"(select bsc.id, bsc.course_id, bsc.course_name, bsc.aname, item.finish_time, item.progress, item.status,MAX(item.score) score " +
"from boe_study_course bsc left join boe_study_course_item item on item.course_id = bsc.course_id and item.study_id = bsc.id " +
"where bsc.course_id = '" + courseId + "' and item.content_id = '" + contentId + "' and item.aname like '%"+name+"%' group by bsc.id) b " +
"where bsc.course_id = '" + courseId + "'" +
(StringUtils.isBlank(contentId) ? "" : "and item.content_id = '" + contentId + "'") +
(StringUtils.isBlank(name) ? "" : "and item.aname like '%" + name +"%'") + " group by bsc.id) b " +
"on a.course_id = b.course_id and a.id = b.id " +
"group by a.id limit "+ pageIndex2+","+ pageSize+";";
String sql2 = "select count(*) as total from (select a.id, a.course_id, a.course_name, a.aname, " +
"IFNULL(b.finish_time, 0) as finish_time, IFNULL(b.progress, 0) as progress, IFNULL(b.status, 1) as status " +
"from (select id, course_id, course_name, aname, 0, 1 from boe_study_course where course_id = '" + courseId + "' and aname like '%"+name+"%') a " +
"left join " +
"(select bsc.id, bsc.course_id, bsc.course_name, bsc.aname, item.finish_time, item.progress, item.status " +
"from boe_study_course bsc left join boe_study_course_item item on item.course_id = bsc.course_id and item.study_id = bsc.id " +
"where bsc.course_id = '" + courseId + "' and item.content_id = '" + contentId + "' and item.aname like '%"+name+"%' group by bsc.id) b " +
"from (select id, course_id, course_name, aname, 0, 1 from boe_study_course where course_id = '" + courseId + "'" +
(StringUtils.isBlank(name) ? "" : "and item.aname like '%" + name + "%'") + ") a " + "left join " + "(select bsc.id, bsc.course_id, bsc.course_name, bsc.aname, item.finish_time, item.progress, item.status " + "from boe_study_course bsc left join boe_study_course_item item on item.course_id = bsc.course_id and item.study_id = bsc.id " + "where bsc.course_id = '" + courseId + "'" +
(StringUtils.isBlank(contentId) ? "" : "and item.content_id = '" + contentId + "'") +
(StringUtils.isBlank(name) ? "" : "and item.aname like '%" + name +"%'") +
" group by bsc.id) b " +
"on a.course_id = b.course_id and a.id = b.id " +
"group by a.id) as total";
log.info("资源完成情况全部sql"+sql);