diff --git a/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java b/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java index ba3ced2a..48476c49 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java @@ -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> findPage(Pagination pager,String courseId,String contentId,String name,Integer status){ @@ -1201,14 +1207,55 @@ public class StudyCourseApi extends ApiBaseController{ return error("无课程信息"); } try { - PageList rs=studyService.findItemPage(pager.getPageIndex(),pager.getPageSize(),contentId,courseId,name,status); + PageList 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> findPageExam(Pagination pager, String courseId, String contentId, String name, Integer status) { + if (StringUtils.isBlank(courseId)) { + return error("无课程信息"); + } + try { + // 查询当前课程的考试信息 + List studyExams = studyExamService.getByCourseId(courseId); + // 空值校验 + if (studyExams == null || studyExams.isEmpty()) { + return success(new PageList<>()); + } + List studyCourseItemIds = studyExams.stream().map(StudyExam::getStudyItemId).collect(Collectors.toList()); + // 分页查询资源学习信息 + PageList rs = studyService.findItemPage(pager.getPageIndex(), pager.getPageSize(), studyCourseItemIds, contentId, courseId, name, status); + // 拼接考试信息 + List 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 findStudyCourseItem(String studyId,String contentId){ if(StringUtils.isBlank(studyId)){ diff --git a/servers/boe-server-all/src/main/java/com/xboe/school/study/entity/StudyCourseItem.java b/servers/boe-server-all/src/main/java/com/xboe/school/study/entity/StudyCourseItem.java index 3389f515..2fcb3fca 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/school/study/entity/StudyCourseItem.java +++ b/servers/boe-server-all/src/main/java/com/xboe/school/study/entity/StudyCourseItem.java @@ -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 studyExams; } diff --git a/servers/boe-server-all/src/main/java/com/xboe/school/study/service/IStudyService.java b/servers/boe-server-all/src/main/java/com/xboe/school/study/service/IStudyService.java index 99341ed7..4c8c5005 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/school/study/service/IStudyService.java +++ b/servers/boe-server-all/src/main/java/com/xboe/school/study/service/IStudyService.java @@ -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 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 findItemPage(int pageIndex, int pageSize, String contentId, String courseId, String name, Integer status); + PageList findItemPage(int pageIndex, int pageSize, List ids, String contentId, String courseId, String name, Integer status); List getList(String courseId, String contentId, String name, Integer status); diff --git a/servers/boe-server-all/src/main/java/com/xboe/school/study/service/impl/StudyServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/school/study/service/impl/StudyServiceImpl.java index 20473a76..a8259e70 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/school/study/service/impl/StudyServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/school/study/service/impl/StudyServiceImpl.java @@ -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 findItemPage(int pageIndex, int pageSize, String contentId, String courseId,String name,Integer status) { + public PageList findItemPage(int pageIndex, int pageSize, List 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 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);