From 8c99e2d8b6c1e0d9cde6abbe80b4df75be19f6d1 Mon Sep 17 00:00:00 2001 From: Administrator <2863138610@qq.com> Date: 星期二, 29 十一月 2022 16:31:18 +0800 Subject: [PATCH] 课程与课件bug修复 --- src/main/java/com/qxueyou/scc/teach/subject/service/impl/SubjectService.java | 2687 +++++++++++++++++++++++++++++----------------------------- 1 files changed, 1,349 insertions(+), 1,338 deletions(-) diff --git a/src/main/java/com/qxueyou/scc/teach/subject/service/impl/SubjectService.java b/src/main/java/com/qxueyou/scc/teach/subject/service/impl/SubjectService.java index ab5edb5..0b95484 100644 --- a/src/main/java/com/qxueyou/scc/teach/subject/service/impl/SubjectService.java +++ b/src/main/java/com/qxueyou/scc/teach/subject/service/impl/SubjectService.java @@ -10,6 +10,7 @@ import com.qxueyou.scc.base.model.UserInfoWrapper; import com.qxueyou.scc.sys.model.CacheParamters; +import com.qxueyou.scc.teach.subject.model.view.*; import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; @@ -61,441 +62,433 @@ import com.qxueyou.scc.teach.subject.model.Subject; import com.qxueyou.scc.teach.subject.model.SubjectChapter; import com.qxueyou.scc.teach.subject.model.SubjectLecture; -import com.qxueyou.scc.teach.subject.model.view.MySubjectV; -import com.qxueyou.scc.teach.subject.model.view.OpenSubjectV; -import com.qxueyou.scc.teach.subject.model.view.QMyLectureV; -import com.qxueyou.scc.teach.subject.model.view.QMySubjectV; -import com.qxueyou.scc.teach.subject.model.view.QOpenSubjectV; import com.qxueyou.scc.teach.subject.service.ILectureService; import com.qxueyou.scc.teach.subject.service.ISubjectService; import com.qxueyou.scc.user.model.QUser; import com.qxueyou.scc.user.model.UserTeacher; +import org.springframework.transaction.annotation.Transactional; import javax.servlet.http.HttpServletRequest; @Service public class SubjectService extends CommonAppService implements ISubjectService { - private final Logger log = LogManager.getLogger(SubjectService.class); + private final Logger log = LogManager.getLogger(SubjectService.class); - @Autowired - SubjectDAO subjectDAO; + @Autowired + SubjectDAO subjectDAO; - @Autowired - IFileService fileService; + @Autowired + IFileService fileService; - @Autowired - ILectureService lectureService; + @Autowired + ILectureService lectureService; - @Autowired - IClassLectureService clsLectureService; + @Autowired + IClassLectureService clsLectureService; - @Autowired - IProgressService progressService; + @Autowired + IProgressService progressService; - @Autowired - IExamService examService; + @Autowired + IExamService examService; - @Autowired - IExerciseInfoService exerciseInfoService; + @Autowired + IExerciseInfoService exerciseInfoService; - @Autowired - ProgressDAO progressDao; + @Autowired + ProgressDAO progressDao; - @Autowired - private ITeacherService teacherService; + @Autowired + private ITeacherService teacherService; - @Autowired - private IMediaLiveService mediaLiveService; + @Autowired + private IMediaLiveService mediaLiveService; - @Override - public Result add(String subjectName,String coverPageFileId, String contentFileId,int type) { + @Override + public Result add(String subjectName, String coverPageFileId, String contentFileId, int type) { - Subject subject = new Subject(); - if (StringUtils.isNotEmpty(coverPageFileId)) { - ResFile file = fileService.read(coverPageFileId); - subject.setCoverPageFileId(coverPageFileId); - subject.setCoverPageUrl(file.getPath()); - } + Subject subject = new Subject(); + if (StringUtils.isNotEmpty(coverPageFileId)) { + ResFile file = fileService.read(coverPageFileId); + subject.setCoverPageFileId(coverPageFileId); + subject.setCoverPageUrl(file.getPath()); + } - TraceUtils.setCreateTrace(subject); - subject.setContentFileId(contentFileId); - subject.setName(subjectName); - subject.setStatus(Subject.STATUS_DRAFT); - subject.setLectureCount(0); - subject.setType(type); - subject.setOrgId(ClientUtils.getOrgId()); + TraceUtils.setCreateTrace(subject); + subject.setContentFileId(contentFileId); + subject.setName(subjectName); + subject.setStatus(Subject.STATUS_DRAFT); + subject.setLectureCount(0); + subject.setType(type); + subject.setOrgId(ClientUtils.getOrgId()); - save(subject); + save(subject); - //初始化创建 根节点 - SubjectChapter chapter = new SubjectChapter(); - TraceUtils.setCreateTrace(chapter); - chapter.setName("根节点"); - chapter.setSubjectId(subject.getSubjectId()); - chapter.setParentChapterId(SubjectChapter.ROOT_CHAPTER_ID); - save(chapter); + //初始化创建 根节点 + SubjectChapter chapter = new SubjectChapter(); + TraceUtils.setCreateTrace(chapter); + chapter.setName("根节点"); + chapter.setSubjectId(subject.getSubjectId()); + chapter.setParentChapterId(SubjectChapter.ROOT_CHAPTER_ID); + save(chapter); - return new Result(true,"success",CollectionUtils.newObjectMap("subjectId",subject.getSubjectId())); - } + return new Result(true, "success", CollectionUtils.newObjectMap("subjectId", subject.getSubjectId())); + } - @Override - public Result update(String subjectId, String subjectName, String coverPageFileId, String contentFileId,int type) { - Subject subject = read(Subject.class, subjectId); - if (StringUtils.isNotEmpty(coverPageFileId)) { - ResFile file = fileService.read(coverPageFileId); - subject.setCoverPageUrl(file.getPath()); - subject.setCoverPageFileId(coverPageFileId); - }else{ - subject.setCoverPageUrl(null); - subject.setCoverPageFileId(null); - } + @Override + public Result update(String subjectId, String subjectName, String coverPageFileId, String contentFileId, int type) { + Subject subject = read(Subject.class, subjectId); + if (StringUtils.isNotEmpty(coverPageFileId)) { + ResFile file = fileService.read(coverPageFileId); + subject.setCoverPageUrl(file.getPath()); + subject.setCoverPageFileId(coverPageFileId); + } else { + subject.setCoverPageUrl(null); + subject.setCoverPageFileId(null); + } - TraceUtils.setUpdateTrace(subject); - subject.setContentFileId(contentFileId); - subject.setName(subjectName); - subject.setType(type); + TraceUtils.setUpdateTrace(subject); + subject.setContentFileId(contentFileId); + subject.setName(subjectName); + subject.setType(type); - save(subject); + save(subject); - //更新所有关联的课程 - if(subject.getType()==Subject.TYPE_ORG_SUBJECT){ - this.bulkUpdate("update Subject t set t.name=?,t.contentFileId=?," - + "t.coverPageFileId=?,t.coverPageUrl=? where t.deleteFlag is false and t.origSubjectId=? ",new Object[]{subject.getName(), - subject.getContentFileId(),subject.getCoverPageFileId(),subject.getCoverPageUrl(),subject.getSubjectId()} ); - } + //更新所有关联的课程 + if (subject.getType() == Subject.TYPE_ORG_SUBJECT) { + this.bulkUpdate("update Subject t set t.name=?,t.contentFileId=?," + + "t.coverPageFileId=?,t.coverPageUrl=? where t.deleteFlag is false and t.origSubjectId=? ", new Object[]{subject.getName(), + subject.getContentFileId(), subject.getCoverPageFileId(), subject.getCoverPageUrl(), subject.getSubjectId()}); + } - return new Result(true, "success"); - } + return new Result(true, "success"); + } - @Override - public Result delete(String[] subjectIds) { - for (String subjectId : subjectIds) { - deleteSubject(subjectId); + @Override + public Result delete(String[] subjectIds) { + for (String subjectId : subjectIds) { + deleteSubject(subjectId); - //删除班级课程 - List<Map<String,Object>> result = this.findListWithMapByHql( - "select r.classId as classId,r.subjectId as subjectId from ClsClassReSubject r,Subject j " - + "where r.subjectId = j.subjectId and j.origSubjectId=:origSubjectId and r.deleteFlag is false and j.deleteFlag is false", - CollectionUtils.newObjectMap("origSubjectId",subjectId)); + //删除班级课程 + List<Map<String, Object>> result = this.findListWithMapByHql( + "select r.classId as classId,r.subjectId as subjectId from ClsClassReSubject r,Subject j " + + "where r.subjectId = j.subjectId and j.origSubjectId=:origSubjectId and r.deleteFlag is false and j.deleteFlag is false", + CollectionUtils.newObjectMap("origSubjectId", subjectId)); - if(result!=null && result.size()>0){ - for(Map<String,Object> map : result){ - this.deleteClsSubject((String)map.get("classId"), new String []{(String)map.get("subjectId")}); - } - } - } + if (result != null && result.size() > 0) { + for (Map<String, Object> map : result) { + this.deleteClsSubject((String) map.get("classId"), new String[]{(String) map.get("subjectId")}); + } + } + } - return new Result(true, "success"); - } + return new Result(true, "success"); + } - /** - * 删除单个课程 - * - * @param chapterId - * 章节id - * @return - */ - private Result deleteSubject(String subjectId) { + /** + * 删除单个课程 + * + * @param chapterId 章节id + * @return + */ + private Result deleteSubject(String subjectId) { - Subject subject = read(Subject.class, subjectId); + Subject subject = read(Subject.class, subjectId); - TraceUtils.setUpdateTrace(subject); - subject.setDeleteFlag(true); + TraceUtils.setUpdateTrace(subject); + subject.setDeleteFlag(true); - save(subject); + save(subject); - return new Result(true, "success"); - } + return new Result(true, "success"); + } - @Override - public List<Subject> list(String text, String teacherId, String status,Integer type, Integer pageSize, Integer pageNum) { + @Override + public List<Subject> list(String text, String teacherId, String status, Integer type, Integer pageSize, Integer pageNum) { - StringBuffer hql = new StringBuffer("from Subject where name like ? and orgId=? and deleteFlag is false and origSubjectId is null "); + StringBuffer hql = new StringBuffer("from Subject where name like ? and orgId=? and deleteFlag is false and origSubjectId is null "); - List<Object> args = CollectionUtils.newList(text + "%",ClientUtils.getOrgId()); + List<Object> args = CollectionUtils.newList(text + "%", ClientUtils.getOrgId()); - if(type!=null){ - hql.append(" and type=?"); - args.add(type); - } + if (type != null) { + hql.append(" and type=?"); + args.add(type); + } - if (!StringUtils.isEmpty(status)) { - hql.append(" and status=?"); - args.add(status); - } + if (!StringUtils.isEmpty(status)) { + hql.append(" and status=?"); + args.add(status); + } - if (!StringUtils.isEmpty(teacherId)) { - hql.append(" and createId=?"); - args.add(teacherId); - } - hql.append(" order by createTime desc"); - List<Subject> result = findList(hql.toString(), new Pager(pageSize, pageNum), args, Subject.class); + if (!StringUtils.isEmpty(teacherId)) { + hql.append(" and createId=?"); + args.add(teacherId); + } + hql.append(" order by createTime desc"); + List<Subject> result = findList(hql.toString(), new Pager(pageSize, pageNum), args, Subject.class); - return result; - } + return result; + } - /** - * app教师端课程列表 - * - * @param text - * @param status - * @param type - * @param pageSize - * @param pageNum - * @return - */ - @Override - public Result teacherSubjectList(Pager pager, String keyword, String status,Integer type) { - String teacherId = teacherService.getTeacherIdByUserId(ClientUtils.getUserId()); - if(StringUtils.isEmpty(teacherId)) { - return new Result(false, "当前用户无老师角色"); - } + /** + * app教师端课程列表 + * + * @param text + * @param status + * @param type + * @param pageSize + * @param pageNum + * @return + */ + @Override + public Result teacherSubjectList(Pager pager, String keyword, String status, Integer type) { + String teacherId = teacherService.getTeacherIdByUserId(ClientUtils.getUserId()); + if (StringUtils.isEmpty(teacherId)) { + return new Result(false, "当前用户无老师角色"); + } - QSubject qSubject = QSubject.subject; - QSubjectLecture qSubjectLecture = QSubjectLecture.subjectLecture; - QProgress qProgress = QProgress.progress; - QClsClassReSubject qClsClassReSubject = QClsClassReSubject.clsClassReSubject; + QSubject qSubject = QSubject.subject; + QSubjectLecture qSubjectLecture = QSubjectLecture.subjectLecture; + QProgress qProgress = QProgress.progress; + QClsClassReSubject qClsClassReSubject = QClsClassReSubject.clsClassReSubject; - JPAQuery<Tuple> query = this.getQueryFactory() - .select(qSubject.subjectId, qSubject.name, qSubject.term,qSubject.coverPageUrl, qSubject.schoolYear, qSubject.createTime, qSubject.type) - .from(qSubject) - .where(qSubject.deleteFlag.isFalse() - .and(qSubject.status.eq(Subject.STATUS_ISSUED)).and(qSubject.type.eq(type)) - .and(qSubject.createId.eq(ClientUtils.getUserId())) - .and(qSubject.name.like("%" + keyword + "%"))); + JPAQuery<Tuple> query = this.getQueryFactory() + .select(qSubject.subjectId, qSubject.name, qSubject.term, qSubject.coverPageUrl, qSubject.schoolYear, qSubject.createTime, qSubject.type) + .from(qSubject) + .where(qSubject.deleteFlag.isFalse() + .and(qSubject.status.eq(Subject.STATUS_ISSUED)).and(qSubject.type.eq(type)) + .and(qSubject.createId.eq(ClientUtils.getUserId())) + .and(qSubject.name.like("%" + keyword + "%"))); - long count = query.fetchCount(); + long count = query.fetchCount(); - List<Map<String, Object>> listData = query.orderBy(qSubject.createTime.desc()).limit(pager.getPageSize()) - .offset(pager.getOffset()).fetch().stream().map(tuple -> { - Map<String, Object> map = new HashMap<String, Object>(10); - String subjectId = tuple.get(qSubject.subjectId); + List<Map<String, Object>> listData = query.orderBy(qSubject.createTime.desc()).limit(pager.getPageSize()) + .offset(pager.getOffset()).fetch().stream().map(tuple -> { + Map<String, Object> map = new HashMap<String, Object>(10); + String subjectId = tuple.get(qSubject.subjectId); - map.put("name", tuple.get(qSubject.name)); - map.put("subjectId", subjectId); - map.put("schoolYear", tuple.get(qSubject.schoolYear)); - map.put("term", tuple.get(qSubject.term)); - map.put("coverPageUrl", tuple.get(qSubject.coverPageUrl)); - map.put("createTime", tuple.get(qSubject.createTime)); - map.put("type", tuple.get(qSubject.type)); - map.put("classId", ""); - map.put("studyCount", this.getQueryFactory().selectDistinct(qProgress.learnerId).from(qProgress, qSubjectLecture) - .where(qProgress.deleteFlag.isFalse().and(qSubjectLecture.subjectId.eq(subjectId)).and(qProgress.targetType.eq(Progress.PROGRESS_TYPE_LECTURE)) - .and(qProgress.targetId.eq(qSubjectLecture.lectureId)).and(qSubjectLecture.deleteFlag.isFalse())).fetchCount()); - map.put("classCount", - this.getQueryFactory().selectDistinct(qClsClassReSubject.classId) - .from(qClsClassReSubject, qSubject) - .where(qSubject.deleteFlag.isFalse().and(qClsClassReSubject.deleteFlag.isFalse()) - .and(qClsClassReSubject.subjectId.eq(qSubject.subjectId)).and(qSubject.origSubjectId.eq(subjectId))).fetchCount()); - - return map; - }).collect(Collectors.toList()); + map.put("name", tuple.get(qSubject.name)); + map.put("subjectId", subjectId); + map.put("schoolYear", tuple.get(qSubject.schoolYear)); + map.put("term", tuple.get(qSubject.term)); + map.put("coverPageUrl", tuple.get(qSubject.coverPageUrl)); + map.put("createTime", tuple.get(qSubject.createTime)); + map.put("type", tuple.get(qSubject.type)); + map.put("classId", ""); + map.put("studyCount", this.getQueryFactory().selectDistinct(qProgress.learnerId).from(qProgress, qSubjectLecture) + .where(qProgress.deleteFlag.isFalse().and(qSubjectLecture.subjectId.eq(subjectId)).and(qProgress.targetType.eq(Progress.PROGRESS_TYPE_LECTURE)) + .and(qProgress.targetId.eq(qSubjectLecture.lectureId)).and(qSubjectLecture.deleteFlag.isFalse())).fetchCount()); + map.put("classCount", + this.getQueryFactory().selectDistinct(qClsClassReSubject.classId) + .from(qClsClassReSubject, qSubject) + .where(qSubject.deleteFlag.isFalse().and(qClsClassReSubject.deleteFlag.isFalse()) + .and(qClsClassReSubject.subjectId.eq(qSubject.subjectId)).and(qSubject.origSubjectId.eq(subjectId))).fetchCount()); - return new Result(true, "", CollectionUtils.newObjectMap("count", count, "listData", listData)); - } + return map; + }).collect(Collectors.toList()); - @Override - public int listCount(String text, String teacherId, String status,Integer type) { - StringBuffer hql = new StringBuffer("from Subject where name like ? and orgId=? and deleteFlag is false and origSubjectId is null "); - List<Object> args = CollectionUtils.newList(text + "%",ClientUtils.getOrgId()); + return new Result(true, "", CollectionUtils.newObjectMap("count", count, "listData", listData)); + } - if(type!=null){ - hql.append(" and type=?"); - args.add(type); - } + @Override + public int listCount(String text, String teacherId, String status, Integer type) { + StringBuffer hql = new StringBuffer("from Subject where name like ? and orgId=? and deleteFlag is false and origSubjectId is null "); + List<Object> args = CollectionUtils.newList(text + "%", ClientUtils.getOrgId()); - if (StringUtils.isNotBlank(status)) { - hql = hql.append(" and status = ?"); - args.add(status); - } + if (type != null) { + hql.append(" and type=?"); + args.add(type); + } - if (!StringUtils.isEmpty(teacherId)) { - hql.append(" and createId=?"); - args.add(teacherId); - } + if (StringUtils.isNotBlank(status)) { + hql = hql.append(" and status = ?"); + args.add(status); + } - return findCount(hql.toString(), args); + if (!StringUtils.isEmpty(teacherId)) { + hql.append(" and createId=?"); + args.add(teacherId); + } - } + return findCount(hql.toString(), args); - @Override - public Subject read(String subjectId) { - return read(Subject.class, subjectId); - } + } - @Override - public String readSubjectContent(String subjectId) { + @Override + public Subject read(String subjectId) { + return read(Subject.class, subjectId); + } - Subject sub = read(subjectId); + @Override + public String readSubjectContent(String subjectId) { - //读取原课程 - if(StringUtils.isNotBlank(sub.getOrigSubjectId())) { - sub = read(sub.getOrigSubjectId()); - } + Subject sub = read(subjectId); - try { - if(!StringUtils.isEmpty(sub.getContentFileId())){ - return IOUtils.toString(fileService.readStreamById(sub.getContentFileId())); - } - } catch (Exception e) { - log.error(e, e); - } - return null; + //读取原课程 + if (StringUtils.isNotBlank(sub.getOrigSubjectId())) { + sub = read(sub.getOrigSubjectId()); + } - } + try { + if (!StringUtils.isEmpty(sub.getContentFileId())) { + return IOUtils.toString(fileService.readStreamById(sub.getContentFileId())); + } + } catch (Exception e) { + log.error(e, e); + } + return null; - @Override - public Result doRelease(String[] subjectIds) { - for (String subjectId : subjectIds) { - releaseSubject(subjectId); - } + } - return new Result(true, "success"); - } + @Override + public Result doRelease(String[] subjectIds) { + for (String subjectId : subjectIds) { + releaseSubject(subjectId); + } - @Override - public Result doCancel(String[] subjectIds) { - for (String subjectId : subjectIds) { - cancelSubject(subjectId); - } + return new Result(true, "success"); + } - return new Result(true, "success"); - } + @Override + public Result doCancel(String[] subjectIds) { + for (String subjectId : subjectIds) { + cancelSubject(subjectId); + } - /** - * 发布单个课程 - * - * @param chapterId - * 章节id - * @return - */ - private Result releaseSubject(String subjectId) { + return new Result(true, "success"); + } - Subject subject = read(Subject.class, subjectId); + /** + * 发布单个课程 + * + * @param chapterId 章节id + * @return + */ + private Result releaseSubject(String subjectId) { - TraceUtils.setUpdateTrace(subject); - subject.setStatus(Subject.STATUS_ISSUED); + Subject subject = read(Subject.class, subjectId); - save(subject); + TraceUtils.setUpdateTrace(subject); + subject.setStatus(Subject.STATUS_ISSUED); - //更新所有关联的课程 - this.bulkUpdate("update Subject set status='" + Subject.STATUS_ISSUED + "' where origSubjectId=? and deleteFlag is false ",new Object[]{subjectId}); + save(subject); - return new Result(true, "success"); - } + //更新所有关联的课程 + this.bulkUpdate("update Subject set status='" + Subject.STATUS_ISSUED + "' where origSubjectId=? and deleteFlag is false ", new Object[]{subjectId}); - /** - * 发布单个课程 - * - * @param chapterId - * 章节id - * @return - */ - private Result cancelSubject(String subjectId) { + return new Result(true, "success"); + } - Subject subject = read(Subject.class, subjectId); + /** + * 发布单个课程 + * + * @param chapterId 章节id + * @return + */ + private Result cancelSubject(String subjectId) { - TraceUtils.setUpdateTrace(subject); - subject.setStatus(Subject.STATUS_OFFLINE); + Subject subject = read(Subject.class, subjectId); - save(subject); + TraceUtils.setUpdateTrace(subject); + subject.setStatus(Subject.STATUS_OFFLINE); - //更新所有关联的课程 - this.bulkUpdate("update Subject set status='" + Subject.STATUS_OFFLINE + "' where origSubjectId=? and deleteFlag is false ",new Object[]{subjectId}); + save(subject); - return new Result(true, "success"); - } + //更新所有关联的课程 + this.bulkUpdate("update Subject set status='" + Subject.STATUS_OFFLINE + "' where origSubjectId=? and deleteFlag is false ", new Object[]{subjectId}); - @Override - public List<MySubjectV> listMySubjectV(String classId,String userId) { - StringBuffer hql = new StringBuffer("from MySubjectV p where p.id.userId=? and p.subjectStatus=?"); - List<Object> args = CollectionUtils.newList(userId,Subject.STATUS_ISSUED); + return new Result(true, "success"); + } - if (!StringUtils.isEmpty(classId)) { - hql.append(" and p.id.classId = ?"); - args.add(classId); + @Override + public List<MySubjectV> listMySubjectV(String classId, String userId) { + StringBuffer hql = new StringBuffer("from MySubjectV p where p.id.userId=? and p.subjectStatus=?"); + List<Object> args = CollectionUtils.newList(userId, Subject.STATUS_ISSUED); - } - List<MySubjectV> result = find(hql.toString(), args, MySubjectV.class); + if (!StringUtils.isEmpty(classId)) { + hql.append(" and p.id.classId = ?"); + args.add(classId); - return result; - } + } + List<MySubjectV> result = find(hql.toString(), args, MySubjectV.class); - @Override - public List<Map<String, Object>> listChapterStudyProgress(String subjectId) { + return result; + } - QSubjectProgressTreeV qSubjectProgressTreeV = QSubjectProgressTreeV.subjectProgressTreeV; - List<Map<String, Object>> lstResult = this.getQueryFactory().selectFrom(qSubjectProgressTreeV). - where(qSubjectProgressTreeV.id.nodeId.eq(subjectId).and(qSubjectProgressTreeV.id.userId.eq(ClientUtils.getUserId()))) - .fetch().stream().map(objSubjectProgressTreeV ->{ - Map<String, Object> map = new HashMap<>(); - map.put("chapterName", objSubjectProgressTreeV.getNodeName()); - map.put("chapterId", objSubjectProgressTreeV.getId().getNodeId()); - map.put("percent", objSubjectProgressTreeV.getPercent()); - map.put("studyTime", objSubjectProgressTreeV.getProgressValue()); + @Override + public List<Map<String, Object>> listChapterStudyProgress(String subjectId) { - return map; - }).collect(Collectors.toList()); + QSubjectProgressTreeV qSubjectProgressTreeV = QSubjectProgressTreeV.subjectProgressTreeV; + List<Map<String, Object>> lstResult = this.getQueryFactory().selectFrom(qSubjectProgressTreeV). + where(qSubjectProgressTreeV.id.nodeId.eq(subjectId).and(qSubjectProgressTreeV.id.userId.eq(ClientUtils.getUserId()))) + .fetch().stream().map(objSubjectProgressTreeV -> { + Map<String, Object> map = new HashMap<>(); + map.put("chapterName", objSubjectProgressTreeV.getNodeName()); + map.put("chapterId", objSubjectProgressTreeV.getId().getNodeId()); + map.put("percent", objSubjectProgressTreeV.getPercent()); + map.put("studyTime", objSubjectProgressTreeV.getProgressValue()); - return lstResult; - } + return map; + }).collect(Collectors.toList()); - @Override - public MySubjectV getMy1stSubjectVById(String subjectId) { - String hql = "from MySubjectV p where p.id.userId=? and p.id.subjectId=?"; - String UserId = ClientUtils.getUserId(); - MySubjectV result = findUnique(hql, CollectionUtils.newList(UserId, subjectId), - MySubjectV.class); + return lstResult; + } - return result; - } + @Override + public MySubjectV getMy1stSubjectVById(String subjectId) { + String hql = "from MySubjectV p where p.id.userId=? and p.id.subjectId=?"; + String UserId = ClientUtils.getUserId(); + MySubjectV result = findUnique(hql, CollectionUtils.newList(UserId, subjectId), + MySubjectV.class); + return result; + } - @Override - public Result addLectureCount(String subjectId, int count) { + @Override + public Result addLectureCount(String subjectId, int count) { - subjectDAO.addLectureCount(subjectId, count); + subjectDAO.addLectureCount(subjectId, count); - return new Result(true); - } + return new Result(true); + } - @Override - public Subject readSubject(String subjectId) { + @Override + public Subject readSubject(String subjectId) { - return read(Subject.class, subjectId); - } + return read(Subject.class, subjectId); + } - @Override - public Result addClsSubject(String classId,String origSubjectId, String teacherId, Integer schoolYear,Integer term) throws IllegalAccessException, InvocationTargetException { - //新增老师课程 - Subject newSubject = new Subject(); - Subject origSubject = this.read(origSubjectId); - UserTeacher teacher = this.read(UserTeacher.class, teacherId); - BeanUtils.copyProperties(newSubject,origSubject); + @Override + public Result addClsSubject(String classId, String origSubjectId, String teacherId, Integer schoolYear, Integer term) throws IllegalAccessException, InvocationTargetException { + //新增老师课程 + Subject newSubject = new Subject(); + Subject origSubject = this.read(origSubjectId); + UserTeacher teacher = this.read(UserTeacher.class, teacherId); + BeanUtils.copyProperties(newSubject, origSubject); - TraceUtils.setCreateTrace(newSubject); - newSubject.setSubjectId(null); - newSubject.setTeacherId(teacherId); - newSubject.setSchoolYear(schoolYear); - newSubject.setTerm(term); - newSubject.setStatus(origSubject.getStatus()); - newSubject.setOrigSubjectId(origSubjectId); - newSubject.setOrigCopySubjectId(origSubjectId); - newSubject.setType(Subject.TYPE_CLS_SUBJECT); - newSubject.setTeacherName(teacher.getName()); - newSubject.setOrgId(ClientUtils.getOrgId()); - save(newSubject); + TraceUtils.setCreateTrace(newSubject); + newSubject.setSubjectId(null); + newSubject.setTeacherId(teacherId); + newSubject.setSchoolYear(schoolYear); + newSubject.setTerm(term); + newSubject.setStatus(origSubject.getStatus()); + newSubject.setOrigSubjectId(origSubjectId); + newSubject.setOrigCopySubjectId(origSubjectId); + newSubject.setType(Subject.TYPE_CLS_SUBJECT); + newSubject.setTeacherName(teacher.getName()); + newSubject.setOrgId(ClientUtils.getOrgId()); + save(newSubject); - //添加班级课程关系 - addClassReSubject(newSubject.getSubjectId(),classId); + //添加班级课程关系 + addClassReSubject(newSubject.getSubjectId(), classId); - //复制课件 - clsLectureService.doCopyLecturesToClass(origSubjectId,newSubject.getSubjectId(),classId); + //复制课件 + clsLectureService.doCopyLecturesToClass(origSubjectId, newSubject.getSubjectId(), classId); - return new Result(true, "success",CollectionUtils.newStringMap("subjectId",newSubject.getSubjectId())); - } + return new Result(true, "success", CollectionUtils.newStringMap("subjectId", newSubject.getSubjectId())); + } private void addClassReSubject(String subjectId, String classId) { ClsClassReSubject re = new ClsClassReSubject(); @@ -505,1043 +498,1061 @@ save(re); } - @Override - public Result updateClsSubject(String classId,String subjectId,String origSubjectId, String teacherId, Integer schoolYear,Integer term) { - Subject origSubject = this.read(origSubjectId); - Subject subject = this.read(subjectId); - UserTeacher teacher = this.read(UserTeacher.class, teacherId); + @Override + public Result updateClsSubject(String classId, String subjectId, String origSubjectId, String teacherId, Integer schoolYear, Integer term) { + Subject origSubject = this.read(origSubjectId); + Subject subject = this.read(subjectId); + UserTeacher teacher = this.read(UserTeacher.class, teacherId); - //如果原课程做出了修改 - if(!origSubjectId.equals(subject.getOrigSubjectId())){ - subject.setContentFileId(origSubject.getCoverPageFileId()); - subject.setCoverPageUrl(origSubject.getCoverPageUrl()); - subject.setContentFileId(origSubject.getContentFileId()); - subject.setName(origSubject.getName()); - subject.setOrigSubjectId(origSubjectId); - subject.setOrigCopySubjectId(origSubjectId); + //如果原课程做出了修改 + if (!origSubjectId.equals(subject.getOrigSubjectId())) { + subject.setContentFileId(origSubject.getCoverPageFileId()); + subject.setCoverPageUrl(origSubject.getCoverPageUrl()); + subject.setContentFileId(origSubject.getContentFileId()); + subject.setName(origSubject.getName()); + subject.setOrigSubjectId(origSubjectId); + subject.setOrigCopySubjectId(origSubjectId); - //清理并复制原课程 - clsLectureService.doClearLecturesToClass(classId,subjectId); - clsLectureService.doCopyLecturesToClass(origSubjectId, subjectId, classId); - }else { - clsLectureService.doClearLecturesToClass(classId,subjectId); - clsLectureService.doCopyLecturesToClass(origSubjectId, subjectId, classId); - } - TraceUtils.setUpdateTrace(subject); - subject.setTeacherId(teacherId); - subject.setTeacherName(teacher.getName()); - subject.setSchoolYear(schoolYear); - subject.setTerm(term); + //清理并复制原课程 + clsLectureService.doClearLecturesToClass(classId, subjectId); + clsLectureService.doCopyLecturesToClass(origSubjectId, subjectId, classId); + } else { + clsLectureService.doClearLecturesToClass(classId, subjectId); + clsLectureService.doCopyLecturesToClass(origSubjectId, subjectId, classId); + } + TraceUtils.setUpdateTrace(subject); + subject.setTeacherId(teacherId); + subject.setTeacherName(teacher.getName()); + subject.setSchoolYear(schoolYear); + subject.setTerm(term); - save(subject); - return new Result(true, "success"); - } - - @Override - public Result deleteClsSubject(String classId,String[] subjectIds) { - Map<String,Object> paramMap = new HashMap<String,Object>(); - paramMap.put("classId", classId); - paramMap.put("subjectIds", subjectIds); - - List<String> reIdLst = this.findByComplexHql("select r.clsReSubjectId from ClsClassReSubject r where r.deleteFlag is false and r.classId=:classId and r.subjectId in (:subjectIds) ", - paramMap, String.class); - - //删除关联关系 - if(reIdLst!=null && reIdLst.size()>0){ - this.bulkUpdateInLoop("update ClsClassReSubject set deleteFlag = true where clsReSubjectId=?", reIdLst.toArray()); - } - - this.delete(subjectIds); - return new Result(true, "success"); - } - - @Override - public Result getPerformance4Subject() { - String findCompleteCountByHql = "from MySubjectV where id.userId = ? and percent = 1 "; - String findUndoneByHql = "from MySubjectV where id.userId = ? and (percent != 1 or percent is null)"; - String userId = ClientUtils.getUserId(); - int CompleteCount = findCount(findCompleteCountByHql, CollectionUtils.newList(userId)); - int UndoneCount = findCount(findUndoneByHql, CollectionUtils.newList(userId)); - return new Result(true, "success", - CollectionUtils.newObjectMap("CompleteCount", CompleteCount, "UndoneCount", UndoneCount)); - } - - @Override - public Result lstSubjectDetail() { - String userId = ClientUtils.getUserId(); - StringBuffer hql = new StringBuffer( - "select percent as percent,className as className ,id.classId as classId ,id.subjectId as subjectId ," - + "subjectName as subjectName ,coverPageUrl as coverPageUrl , progressValue as progressValue from" - + " MySubjectV p where p.id.userId =:userId and p.subjectStatus=:subjectStatus "); - - Map<String, Object> args = CollectionUtils.newObjectMap("userId", userId,"subjectStatus",Subject.STATUS_ISSUED); - - List<Map<String, Object>> subjectLstMap = findListWithMapByHql(hql.toString(), args); - - for (Map<String, Object> subject : subjectLstMap) { - - String classId = (String) subject.get("classId"); - String subjectId = (String) subject.get("subjectId"); - Map<String, Object> map = progressDao.getStudyById(userId, subjectId, classId); - subject.put("lectureParentId", map.get("lectureParentId")); - subject.put("lectureId", map.get("lectureId")); - subject.put("unCommitExerciseCount", exerciseInfoService.getUnCommitExerciseCount(classId, userId)); - subject.put("toBeCommitExerciseCount", exerciseInfoService.getToBeCommitExerciseCount(classId, userId)); - subject.put("CommitExerciseCount", exerciseInfoService.getCommitExerciseCount(classId, userId)); - subject.put("exerciseCount", exerciseInfoService.getExerciseCount(classId, userId)); - subject.put("examCount", examService.getExamCount(classId, userId)); - subject.put("unCommitExamCount", examService.getUnCommitExamCount(classId, userId)); - subject.put("commitExamCount", examService.getCommitExamCount(classId, userId)); - subject.put("toBeCommitExamCount", examService.getToBeCommitExamCount(classId, userId)); - - } - return new Result(true, "success", subjectLstMap); - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - @Override - public Result getDataDesc(String classId, String subjectId) { - if(StringUtils.isEmpty(classId)) { - return new Result(false, "班级id参数错误"); - } - QSubjectProgressTreeV qSubjectProgressTreeV = QSubjectProgressTreeV.subjectProgressTreeV; - - List<Map<String, Object>> percentDesc = this.percentDesc(classId, subjectId, new OrderSpecifier(Order.DESC, qSubjectProgressTreeV.percent)); - - List<Map<String, Object>> studyTimeDesc = this.percentDesc(classId, subjectId, new OrderSpecifier(Order.DESC, qSubjectProgressTreeV.progressValue)); - - List<Map<String, Object>> exerciseInfoDesc = this.exerciseInfoDesc(classId, subjectId); - - List<Map<String, Object>> examInfoDesc = this.examInfoDesc(classId, subjectId); - - return new Result(true, "success", CollectionUtils.newObjectMap("percentDesc", percentDesc, "studyTimeDesc", - studyTimeDesc, "exerciseInfoDesc", exerciseInfoDesc, "examInfoDesc", examInfoDesc)); - } - - /** - * 获取班级对应的学员 按进度进行排序 - */ - private List<Map<String, Object>> percentDesc(String classId, String subjectId, @SuppressWarnings("rawtypes") OrderSpecifier order) { - QSubjectProgressTreeV qSubjectProgressTreeV = QSubjectProgressTreeV.subjectProgressTreeV; - QUser qUser = QUser.user; - String nodeId = StringUtils.isNotEmpty(subjectId)?subjectId:classId; - String nodeType = StringUtils.isNotEmpty(subjectId)?Progress.PROGRESS_TYPE_SUBJECT:Progress.PROGRESS_TYPE_CLASS; - - List<Map<String, Object>> lstMap = this.getQueryFactory().select(qSubjectProgressTreeV.progressValue, - qSubjectProgressTreeV.percent, qUser.name, qUser.userId,qSubjectProgressTreeV.id.nodeId).from(qSubjectProgressTreeV, qUser). - where(qSubjectProgressTreeV.id.userId.eq(qUser.userId).and(qSubjectProgressTreeV.nodeType.eq(nodeType)) - .and(qSubjectProgressTreeV.id.nodeId.eq(nodeId))).orderBy(order).fetch().stream().map(tuple -> { - Map<String, Object> map = new HashMap<>(); - map.put("userName", tuple.get(qUser.name)); - map.put("userId", tuple.get(qUser.userId)); - map.put("classId", tuple.get(qSubjectProgressTreeV.id.nodeId)); - map.put("percent", tuple.get(qSubjectProgressTreeV.percent)); - map.put("progressValue", tuple.get(qSubjectProgressTreeV.progressValue)); - return map; - }).collect(Collectors.toList()); - return lstMap; - } - - /** - * 通过作业完成个数排序 - * - */ - private List<Map<String, Object>> exerciseInfoDesc(String classId, String subjectId) { - QExerciseResultV qExerciseResultV = QExerciseResultV.exerciseResultV; - //查询条件 - Predicate predicate = StringUtils.isEmpty(subjectId)?qExerciseResultV.id.classId.eq(classId): - qExerciseResultV.id.classId.eq(classId).and(qExerciseResultV.subjectId.eq(subjectId)); - //case数量判断 - NumberExpression<BigDecimal> caseCount = new CaseBuilder() - .when(qExerciseResultV.completeStatus.eq(ExerciseCompleteInfo.STATUS_CHECKED) - .or(qExerciseResultV.completeStatus.eq(ExerciseCompleteInfo.STATUS_COMMIT))) - .then(BigDecimal.ONE).otherwise(BigDecimal.ZERO).sum(); - - //case分数 - NumberExpression<BigDecimal> caseScoreSum = new CaseBuilder() - .when(qExerciseResultV.completeStatus.eq(ExerciseCompleteInfo.STATUS_CHECKED) - .or(qExerciseResultV.completeStatus.eq(ExerciseCompleteInfo.STATUS_COMMIT))) - .then(qExerciseResultV.score).otherwise(BigDecimal.ZERO).sum(); - - List<Map<String, Object>> lstMap = this.getQueryFactory().select(qExerciseResultV.userId,qExerciseResultV.studentName, - caseScoreSum.divide(caseCount), qExerciseResultV.count(), caseCount).from(qExerciseResultV).where(predicate). - groupBy(qExerciseResultV.userId). - orderBy(caseScoreSum.divide(caseCount).desc()).fetch().stream().map(tuple ->{ - Map<String, Object> map = new HashMap<>(); - map.put("userId", tuple.get(qExerciseResultV.userId)); - map.put("userName", tuple.get(qExerciseResultV.studentName)); - map.put("avgScore", tuple.get(2, BigDecimal.class)); - map.put("exerciseCount",tuple.get(3, BigDecimal.class)); - map.put("commitExerciseCount", tuple.get(4, BigDecimal.class)); - - return map; - }).collect(Collectors.toList()); - - return lstMap; - - } - - /** - * - */ - private List<Map<String, Object>> examInfoDesc(String classId, String subjectId) { - - QExamResultV qExamResultV = QExamResultV.examResultV; - //查询条件 - Predicate predicate = StringUtils.isEmpty(subjectId)?qExamResultV.id.classId.eq(classId): - qExamResultV.id.classId.eq(classId).and(qExamResultV.subjectId.eq(subjectId)); - //case判断 - NumberExpression<BigDecimal> caseCount = new CaseBuilder() - .when(qExamResultV.status.eq("0")).then(BigDecimal.ZERO).otherwise(BigDecimal.ONE).sum(); - //case分数 - NumberExpression<BigDecimal> caseScoreSum = new CaseBuilder() - .when(qExamResultV.status.eq("0")).then(BigDecimal.ZERO).otherwise(qExamResultV.score).sum(); - - List<Map<String, Object>> lstMap = this.getQueryFactory().select(qExamResultV.userId,qExamResultV.studentName, - caseScoreSum.divide(caseCount), qExamResultV.count(), caseCount).from(qExamResultV).where(predicate). - groupBy(qExamResultV.userId). - orderBy(caseScoreSum.divide(caseCount).desc()).fetch().stream().map(tuple ->{ - Map<String, Object> map = new HashMap<>(); - map.put("userId", tuple.get(qExamResultV.userId)); - map.put("userName", tuple.get(qExamResultV.studentName)); - map.put("avgScore", tuple.get(2, BigDecimal.class)); - map.put("examCount",tuple.get(3, BigDecimal.class)); - map.put("commitExamCount", tuple.get(4, BigDecimal.class)); - - return map; - }).collect(Collectors.toList()); - return lstMap; - - } - - @Override - public Result lastStudied(String userId) { - Map<String, Object> map = progressDao.getStudyByUserId(userId); - String subjectId = (String) map.get("subjectId"); - Subject subject = read(Subject.class, subjectId); - if (subject != null) { - map.put("subjectName", subject.getName()); - } - return new Result(true, "success", map); - } - - @Override - public List<Map<String,Object>> queryAvailableSubjectIdAndName(String teacherId,Integer subjectType){ - List<Map<String,Object>> result = null; - - if(subjectType==Subject.TYPE_PUBLIC_SUBJECT){ - result = this.findListWithMapByHql( - "select subjectId as subjectId ,name as subjectName from Subject where deleteFlag is false and type=" + Subject.TYPE_PUBLIC_SUBJECT + " and orgId='" + ClientUtils.getOrgId() + "'" , null); - }else{ - if(StringUtils.isNotEmpty(teacherId)){ - result = this.findListWithMapByHql( - "select distinct origSubjectId as subjectId ,name as subjectName from Subject where deleteFlag is false and type=" + Subject.TYPE_CLS_SUBJECT + " and teacherId='" + teacherId + "'", null); - }else{ - result = this.findListWithMapByHql( - "select subjectId as subjectId ,name as subjectName from Subject where deleteFlag is false and type=" + Subject.TYPE_ORG_SUBJECT + " and orgId='" + ClientUtils.getOrgId() + "'", null); - } - } - - return result; - } - - @Override - public List<Map<String, Object>> getMySubjectList() { - String sql = "SELECT o.CLASS_ID, a.`NAME` AS subjectName, a.SUBJECT_ID, o.`NAME` AS className FROM ( ( SELECT " - + "c.CLASS_ID, c.`NAME` FROM stu_student s, cls_class c WHERE s.CLASS_ID = c.CLASS_ID AND s.USER_ID =:userId" - + " ) o LEFT JOIN ( SELECT r.class_id,s.SUBJECT_ID, s.`NAME` FROM `subject` s, cls_class_re_subject r WHERE " - + "s.SUBJECT_ID = r.subject_id ) a ON o.CLASS_ID = a.class_id ) "; - List<Object[]> list = findByComplexSql(sql, CollectionUtils.newObjectMap("userId", ClientUtils.getUserId()), - Object[].class); - List<Map<String, Object>> lstMap = new ArrayList<Map<String, Object>>(list.size()); - Map<String, Object> map = null; - for (Object[] objects : list) { - map = new HashMap<String, Object>(objects.length); - map.put("classId", objects[0]); - map.put("subjectName", objects[1]); - map.put("subjectId", objects[2]); - map.put("className", objects[3]); - lstMap.add(map); - } - return lstMap; - } - - - @Override - public List<Map<String,Object>> clsSubjectlist(String classId, Integer schoolYear, Integer term) { - QSubject qSubject = QSubject.subject; - QClsClassReSubject qClsClassReSubject = QClsClassReSubject.clsClassReSubject; - - QueryDslOptionBuilder builder = new QueryDslOptionBuilder(). - and(qSubject.deleteFlag::eq, false) - .and(qClsClassReSubject.classId::eq, classId) - .and(qClsClassReSubject.subjectId::eq, qSubject.subjectId) - .and(qClsClassReSubject.deleteFlag::eq, false).and(qSubject.status::eq, Subject.STATUS_ISSUED); - if(schoolYear != null && schoolYear != 0){//学年 - builder = builder.and(qSubject.schoolYear::eq, schoolYear); - } - if(term != null && term != 0){//学期 - builder = builder.and(qSubject.term::eq, term); - } - - return this.getQueryFactory().select(qSubject.name,qSubject.origSubjectId,qSubject.subjectId,qSubject.schoolYear, qSubject.term).distinct() - .from(qSubject, qClsClassReSubject) - .where(builder.build()) - .orderBy(qSubject.createTime.desc()) - .fetch().stream() - .map(tuple -> { - Map<String,Object> map = new HashMap<String,Object>(2); - map.put("name", tuple.get(qSubject.name)); - map.put("subjectId", tuple.get(qSubject.subjectId)); - map.put("schoolYear", tuple.get(qSubject.schoolYear)); - map.put("term", tuple.get(qSubject.term)); - map.put("origSubjectId", tuple.get(qSubject.origSubjectId)); - return map; - }).collect(Collectors.toList()); - } - - @Override - public List<Map<String,Object>> termList(String classId) { - QSubject qSubject = QSubject.subject; - QClsClassReSubject qClsClassReSubject = QClsClassReSubject.clsClassReSubject; - - QueryDslOptionBuilder builder = new QueryDslOptionBuilder(). - and(qSubject.deleteFlag::eq, false) - .and(qClsClassReSubject.classId::eq, classId) - .and(qClsClassReSubject.subjectId::eq, qSubject.subjectId) - .and(qClsClassReSubject.deleteFlag::eq, false).and(qSubject.status::eq, Subject.STATUS_ISSUED); - - return this.getQueryFactory().select(qSubject.schoolYear.as("schoolYear"),qSubject.term.as("term")) - .from(qSubject, qClsClassReSubject) - .where(builder.build().and(qSubject.schoolYear.isNotNull()) - .and(qSubject.term.isNotNull())).groupBy(qSubject.schoolYear, qSubject.term) - .orderBy(qSubject.schoolYear.desc(), qSubject.term.desc()) - .fetch().stream() - .map(tuple -> { - Map<String,Object> map = new HashMap<String,Object>(2); - map.put("schoolYear", tuple.get(0, Integer.class)); - map.put("term", tuple.get(1, Integer.class)); - return map; - }).collect(Collectors.toList()); - } - - /** - * 我的班级信息 - * - * @param classId - * @return - */ - public Map<String,Object> myClassInfo(String classId){ - ClsClass objClsClass = this.read(ClsClass.class, classId); - QSubjectProgressTreeV qSubjectProgressTreeV = QSubjectProgressTreeV.subjectProgressTreeV; - - List<Subject> lstSubject = objClsClass.getSubjects(); - - //过滤掉状态为草稿的 - List<String> teachers = lstSubject.stream().filter(u->u.getStatus().equals(Subject.STATUS_ISSUED)).map(tuple -> { - return tuple.getTeacherName(); - }).collect(Collectors.toList()); - - SubjectProgressTreeV objSubjectProgressTreeV = this.getQueryFactory().selectFrom(qSubjectProgressTreeV) - .where(qSubjectProgressTreeV.id.nodeId.eq(classId).and(qSubjectProgressTreeV.id.userId.eq(ClientUtils.getUserId())).and(qSubjectProgressTreeV.nodeType.eq("class"))).fetchOne(); - - if(objSubjectProgressTreeV != null) { - - long allCount = this.getQueryFactory().selectFrom(qSubjectProgressTreeV) - .where(qSubjectProgressTreeV.id.nodeId.eq(classId)).fetchCount(); - - long lgCount = this.getQueryFactory().selectFrom(qSubjectProgressTreeV) - .where(qSubjectProgressTreeV.id.nodeId.eq(classId).and(qSubjectProgressTreeV.percent.gt(objSubjectProgressTreeV.getPercent()))).fetchCount(); - //排行 - float rank = (allCount-lgCount)/allCount; - - return CollectionUtils.newObjectMap("className", objClsClass.getName(), "progressPercent", - objSubjectProgressTreeV.getPercent(), "progressValue", objSubjectProgressTreeV.getProgressValue(), "rank", rank, "teacherName", teachers); - }else { - return CollectionUtils.newObjectMap("className", objClsClass.getName(), "percent", - 0, "progressValue", 0, "rank", 0, teachers); - } - } - - /** - * 获取我的课程进度 - * - * @param classId - * @return - */ - public List<Map<String,Object>> myClsSubjectlist(String classId, String userId, Pager pager){ - String teacherId = this.teacherService.getTeacherIdByUserId(ClientUtils.getUserId()); - QMySubjectV qMySubjectV = QMySubjectV.mySubjectV; - - Predicate predicate = null; - if(StringUtils.isNotEmpty(teacherId)) { - predicate = qMySubjectV.id.classId.eq(classId).and(qMySubjectV.id.userId.eq(userId)).and(qMySubjectV.teacherId.eq(teacherId).and(qMySubjectV.subjectStatus.eq(Subject.STATUS_ISSUED))); - }else { - predicate = qMySubjectV.id.classId.eq(classId).and(qMySubjectV.id.userId.eq(userId).and(qMySubjectV.subjectStatus.eq(Subject.STATUS_ISSUED))); - } - return this.getQueryFactory().select(qMySubjectV.id.subjectId, - qMySubjectV.subjectName,qMySubjectV.term, - qMySubjectV.schoolYear,qMySubjectV.percent, qMySubjectV.coverPageUrl,qMySubjectV.origSubjectId) - .from(qMySubjectV) - .where(predicate) - .orderBy(qMySubjectV.schoolYear.desc(),qMySubjectV.term.desc()) - .limit(pager.getPageSize()).offset(pager.getOffset()) - .fetch().stream() - .map(tuple -> { - Map<String,Object> map = new HashMap<String,Object>(5); - map.put("name", tuple.get(qMySubjectV.subjectName)); - map.put("origSubjectId", tuple.get(qMySubjectV.origSubjectId)); - map.put("subjectId", tuple.get(qMySubjectV.id.subjectId)); - map.put("progressPercent", tuple.get(qMySubjectV.percent)); - map.put("schoolYear", tuple.get(qMySubjectV.schoolYear)); - map.put("term", tuple.get(qMySubjectV.term)); - map.put("coverPageUrl", tuple.get(qMySubjectV.coverPageUrl)); - return map; - }).collect(Collectors.toList()); - } - - /** - * 获取我的课程数量 - * - * @param classId - * @return - */ - public long myClsSubjectCount(String classId){ - QMySubjectV qMySubjectV = QMySubjectV.mySubjectV; - - return this.getQueryFactory().select(qMySubjectV.id.subjectId, - qMySubjectV.subjectName,qMySubjectV.term, - qMySubjectV.schoolYear,qMySubjectV.percent) - .from(qMySubjectV) - .where(qMySubjectV.id.classId.eq(classId).and(qMySubjectV.id.userId.eq(ClientUtils.getUserId())).and(qMySubjectV.subjectStatus.eq(Subject.STATUS_ISSUED))) - .fetchCount(); - } - - /** - * 获取学员的课程进度 - * - * @param classId - * @return - */ - public List<Map<String,Object>> studentSubjectProgress(String classId, Pager pager){ - String teacherId = this.teacherService.getTeacherIdByUserId(ClientUtils.getUserId()); - QSubjectProgressTreeV qSubjectProgressTreeV = QSubjectProgressTreeV.subjectProgressTreeV; - - QMySubjectV qMySubjectV = QMySubjectV.mySubjectV; - return this.getQueryFactory().select(qMySubjectV.id.subjectId, - qMySubjectV.subjectName,qMySubjectV.term,qMySubjectV.coverPageUrl, - qMySubjectV.schoolYear,qMySubjectV.lectureCount, qMySubjectV.percent.avg().as(qMySubjectV.percent)) - .from(qMySubjectV) - .where(qMySubjectV.id.classId.eq(classId).and(qMySubjectV.teacherId.eq(teacherId))) - .groupBy(qMySubjectV.id.subjectId) - .orderBy(qMySubjectV.schoolYear.desc(),qMySubjectV.term.desc()) - .limit(pager.getPageSize()).offset(pager.getOffset()) - .fetch().stream() - .map(tuple -> { - Map<String,Object> map = new HashMap<String,Object>(5); - map.put("name", tuple.get(qMySubjectV.subjectName)); - map.put("subjectId", tuple.get(qMySubjectV.id.subjectId)); - map.put("schoolYear", tuple.get(qMySubjectV.schoolYear)); - map.put("term", tuple.get(qMySubjectV.term)); - map.put("progressPercent", - this.getQueryFactory().select(qSubjectProgressTreeV.percent.avg()) - .from(qSubjectProgressTreeV) - .where(qSubjectProgressTreeV.id.nodeId.eq(tuple.get(qMySubjectV.id.subjectId)) - .and(qSubjectProgressTreeV.nodeType.eq(Progress.PROGRESS_TYPE_SUBJECT))) - .groupBy(qSubjectProgressTreeV.id.nodeId).fetchOne()); - - map.put("coverPageUrl", tuple.get(qMySubjectV.coverPageUrl)); - map.put("lectureCount", this.getLectureCount(tuple.get(qMySubjectV.id.subjectId))); - return map; - }).collect(Collectors.toList()); - } - - /** - * 获取课件数量 - * - * @param subjectId - * @return - */ - public long getLectureCount(String subjectId) { - - Subject subject = this.read(subjectId); - if(subject == null) { - return 0l; - } - if(subject.getType() == Subject.TYPE_CLS_SUBJECT) {//班级课程 - - QClsSubjectLecture qSubjectLecture = QClsSubjectLecture.clsSubjectLecture; - - return this.getQueryFactory().selectFrom(qSubjectLecture).where(qSubjectLecture.deleteFlag.isFalse() - .and(qSubjectLecture.subjectId.eq(subjectId)).and(qSubjectLecture.status.eq(SubjectLecture.STATUS_DRAFT))).fetchCount(); - }else { - - QSubjectLecture qSubjectLecture = QSubjectLecture.subjectLecture; - - return this.getQueryFactory().selectFrom(qSubjectLecture).where(qSubjectLecture.deleteFlag.isFalse() - .and(qSubjectLecture.subjectId.eq(subjectId)).and(qSubjectLecture.status.eq(SubjectLecture.STATUS_DRAFT))).fetchCount(); - } - } - - - /** - * 我的公开课列表 - * - * @param pageNum - * @param pageSize - * @param keyword - * @return - */ - public Map<String,Object> myOpenSubjectList(Integer pageNum, Integer pageSize, String keyword){ - QSubject qSubject = QSubject.subject; - QProgress qProgress = QProgress.progress; - QSubjectLecture qSubjectLecture = QSubjectLecture.subjectLecture; - - JPAQuery<Tuple> query = this.getQueryFactory() - .select(qSubject.subjectId, qSubject.name, qSubject.term,qSubject.coverPageUrl, qSubject.schoolYear, - qProgress.progressPercent.avg().as(qProgress.progressPercent), qProgress.progressValue.sum().as(qProgress.progressValue)) - .from(qSubject, qProgress, qSubjectLecture ) - .where(qSubject.deleteFlag.isFalse().and(qSubjectLecture.subjectId.eq(qSubject.subjectId)) - .and(qSubjectLecture.deleteFlag.isFalse()).and(qSubjectLecture.lectureId.eq(qProgress.targetId)) - .and(qProgress.learnerId.eq(ClientUtils.getUserId())) - .and(qSubject.name.like("%" + keyword + "%").and(qProgress.deleteFlag.isFalse())) - .and(qProgress.type.eq(Progress.PROGRESS_TYPE_LECTURE)).and(qSubject.status.eq(Subject.STATUS_ISSUED))).groupBy(qSubject.subjectId); - - long count = query.fetchCount(); - List<Map<String, Object>> listData = query.orderBy(qProgress.createTime.desc()).limit(pageSize).offset(pageNum).fetch().stream().map(tuple -> { - Map<String, Object> map = new HashMap<String, Object>(7); - String subjectId = tuple.get(qSubject.subjectId); - - map.put("name", tuple.get(qSubject.name)); - map.put("subjectId", subjectId); - map.put("schoolYear", tuple.get(qSubject.schoolYear)); - map.put("term", tuple.get(qSubject.term)); - map.put("coverPageUrl", tuple.get(qSubject.coverPageUrl)); - map.put("progressPercent", tuple.get(qProgress.progressPercent)); - map.put("progressValue", tuple.get(qProgress.progressValue)); - - Map<String,Object> openSubjectDetail = this.openSubjectDetail(subjectId); - - // 直播数量 - map.put("mediaVideoLiveCount",openSubjectDetail.get("mediaVideoLiveCount")); - - // 课件数量 - map.put("subjectLectureCount",openSubjectDetail.get("subjectLectureCount")); - - //学习人次 - map.put("studyCount",openSubjectDetail.get("studyCount")); - - map.put("content",openSubjectDetail.get("content")); - - // 已观看完成课件数量 - map.put("subjectLectureDoCount",openSubjectDetail.get("subjectLectureDoCount")); - - return map; - }).collect(Collectors.toList()); - - return CollectionUtils.newObjectMap("count", count, "listData", listData); - } - - /** - * 课程统计详情 - * - * @param subjectId - * @return - */ - public Map<String,Object> openSubjectDetail(String subjectId){ - Map<String, Object> map = new HashMap<String, Object>(); - QMediaVideoLive qMediaVideoLive = QMediaVideoLive.mediaVideoLive; - QSubjectLecture qSubjectLecture = QSubjectLecture.subjectLecture; - QProgress qProgress = QProgress.progress; - - // 直播数量 - map.put("mediaVideoLiveCount", - this.getQueryFactory().select(qMediaVideoLive).from(qMediaVideoLive) - .where(qMediaVideoLive.deleteFlag.isFalse() - .and(qMediaVideoLive.status.gt(0)) - .and(qMediaVideoLive.subjectId.eq(subjectId))) - .fetchCount()); - - // 课件数量 - map.put("subjectLectureCount", - this.getQueryFactory().select(qSubjectLecture).from(qSubjectLecture) - .where(qSubjectLecture.deleteFlag.isFalse() - .and(qSubjectLecture.subjectId.eq(subjectId)).and(qSubjectLecture.status.eq(SubjectLecture.STATUS_DRAFT))) - .fetchCount()); - - //学习人次 - map.put("studyCount", - this.getQueryFactory().selectDistinct(qProgress.learnerId).from(qProgress, qSubjectLecture) - .where(qProgress.deleteFlag.isFalse().and(qSubjectLecture.deleteFlag.isFalse()).and(qSubjectLecture.subjectId.eq(subjectId)).and(qProgress.type.eq(Progress.PROGRESS_TYPE_LECTURE)) - .and(qProgress.targetId.eq(qSubjectLecture.lectureId))) - .fetchCount()); - - map.put("content", this.readSubjectContent(subjectId)); - - // 已观看完成课件数量 - map.put("subjectLectureDoCount", - this.getQueryFactory().select(qSubjectLecture).from(qSubjectLecture, qProgress) - .where(qSubjectLecture.deleteFlag.isFalse().and(qProgress.deleteFlag.isFalse()) - .and(qProgress.learnerId.eq(ClientUtils.getUserId())).and(qProgress.type.eq(Progress.PROGRESS_TYPE_LECTURE)) - .and(qProgress.progressPercent.gt(0.95)).and(qProgress.targetId.eq(qSubjectLecture.lectureId)) - .and(qSubjectLecture.subjectId.eq(subjectId))) - .fetchCount()); - - return map; - } - - /** - * 公开课详情 - * - * @param subjectId - * @return - */ - public Map<String,Object> openSubjectInfo(String subjectId){ - QProgress qProgress = QProgress.progress; - QSubjectLecture qSubjectLecture = QSubjectLecture.subjectLecture; - - Subject objSubject = this.read(subjectId); - - Tuple progress = this.getQueryFactory() - .select(qProgress.progressPercent.sum().as(qProgress.progressPercent), qProgress.progressValue.sum().as(qProgress.progressValue)).from(qProgress,qSubjectLecture).where(qProgress.learnerId.eq(ClientUtils.getUserId()) - .and(qProgress.targetId.eq(qSubjectLecture.lectureId)) - .and(qProgress.deleteFlag.isFalse()).and(qSubjectLecture.deleteFlag.isFalse()).and(qSubjectLecture.subjectId.eq(subjectId)) - .and(qProgress.type.eq(Progress.PROGRESS_TYPE_LECTURE))).fetchOne(); - - Map<String, Object> subjectInfo = new HashMap<String, Object>(7); - - subjectInfo.put("name", objSubject.getName()); - subjectInfo.put("subjectId", subjectId); - subjectInfo.put("schoolYear", objSubject.getSchoolYear()); - subjectInfo.put("term", objSubject.getTerm()); - subjectInfo.put("coverPageUrl", objSubject.getCoverPageUrl()); - subjectInfo.put("teacherName", objSubject.getTeacherName()); - - - Map<String,Object> openSubjectDetail = this.openSubjectDetail(subjectId); - - Map<String, Object> map = new HashMap<String, Object>(7); - - // 直播数量 - map.put("mediaVideoLiveCount",openSubjectDetail.get("mediaVideoLiveCount")); - - // 课件数量 - map.put("subjectLectureCount",openSubjectDetail.get("subjectLectureCount")); - - //学习人次 - map.put("studyCount",openSubjectDetail.get("studyCount")); - - subjectInfo.put("content",openSubjectDetail.get("content")); - - // 已观看完成课件数量 - map.put("subjectLectureDoCount",openSubjectDetail.get("subjectLectureDoCount")); - - map.put("subjectInfo", subjectInfo); - - if(openSubjectDetail.get("subjectLectureCount") == null || progress == null || progress.get(qProgress.progressPercent) == null) { - subjectInfo.put("progressPercent", 0); - }else { - subjectInfo.put("progressPercent", progress.get(qProgress.progressPercent).floatValue()/(Long)openSubjectDetail.get("subjectLectureCount")); - } - subjectInfo.put("progressValue", progress == null?0:progress.get(qProgress.progressValue)); - - return map; - } - - @Override - public Map<String, Object> mySubjectInfo(String subjectId, String classId) { - QMySubjectV qMySubjectV = QMySubjectV.mySubjectV; - QMyLectureV qMyLectureV = QMyLectureV.myLectureV; - - // 课程 - Tuple tuple = this.getQueryFactory() - .select(qMySubjectV.id.subjectId, qMySubjectV.subjectName, qMySubjectV.term, qMySubjectV.schoolYear,qMySubjectV.origSubjectId, - qMySubjectV.percent,qMySubjectV.coverPageUrl, qMySubjectV.progressValue) - .from(qMySubjectV) - .where(qMySubjectV.id.classId.eq(classId).and(qMySubjectV.id.userId.eq(ClientUtils.getUserId())) - .and(qMySubjectV.id.subjectId.eq(subjectId))) - .fetchOne(); - - Subject objSubject = this.read(subjectId); - - Map<String, Object> subject = new HashMap<String, Object>(5); - subject.put("name", objSubject.getName()); - subject.put("subjectId", subjectId); - subject.put("origSubjectId", objSubject.getOrigSubjectId()); - subject.put("schoolYear", objSubject.getSchoolYear()); - subject.put("term", objSubject.getTerm()); - subject.put("coverPageUrl", objSubject.getCoverPageUrl()); - subject.put("content", this.readSubjectContent(subjectId)); - subject.put("teacherName", objSubject.getTeacherName()); - if(tuple == null) { - subject.put("progressPercent", 0); - subject.put("progressValue", 0); - }else { - subject.put("progressPercent", tuple.get(qMySubjectV.percent)); - subject.put("progressValue", tuple.get(qMySubjectV.progressValue)); - } - - String origSubjectId = objSubject.getOrigSubjectId(); - - // 考试统计 - long examsCount = this.examService.listStudentExamCount("", new String[] {classId}, origSubjectId, null); - - // 作业统计 - long homeworksCount = exerciseInfoService.queryStuExerciseListCount("", null, ClientUtils.getUserId(), origSubjectId, null); - - // 课件统计 - Tuple tupleLecture = this.getQueryFactory().select(qMyLectureV.count(), - new CaseBuilder().when(qMyLectureV.percent.gt(0.95)).then(1).otherwise(0).sum()).// 大于95%算完成 - from(qMyLectureV) - .where(qMyLectureV.classId.eq(classId).and(qMyLectureV.id.userId.eq(ClientUtils.getUserId())) - .and(qMyLectureV.subjectId.eq(subjectId))) - .groupBy(qMyLectureV.subjectId).fetchOne(); - - long mediaVideoLivesCount = this.mediaLiveService.listCount("", new String[] {classId}, origSubjectId, null); - - return CollectionUtils.newObjectMap("mediaVideoLivesCount", mediaVideoLivesCount, "examsCount", examsCount, - "homeworksCount", homeworksCount, "subjectInfo", subject, "lectureCount", - tupleLecture == null?0:tupleLecture.get(0, Long.class), - "completeLectureCount", tupleLecture == null?0:tupleLecture.get(1,Integer.class)); - } - - /** - * 公开课列表 - * - * @param pageNum - * @param pageSize - * @param keyword - * @return - */ - public Map<String,Object> openSubjectList(Integer pageNum, Integer pageSize, String keyword){ - QOpenSubjectV qOpenSubjectV = QOpenSubjectV.openSubjectV; - - JPAQuery<OpenSubjectV> query = this.getQueryFactory().selectFrom(qOpenSubjectV).where(qOpenSubjectV.subjectName.like("%" + keyword + "%")); - - long count = query.fetchCount(); - - List<Map<String, Object>> listData = query.orderBy(qOpenSubjectV.mediaVideoCount.desc(), - qOpenSubjectV.learnerCount.desc(), qOpenSubjectV.createTime.desc()).limit(pageSize).offset(pageNum) - .fetch().stream().map(tuple -> { - Map<String, Object> map = new HashMap<String, Object>(8); - - map.put("name", tuple.getSubjectName()); - map.put("subjectId", tuple.getSubjectId()); - map.put("schoolYear", tuple.getSchoolYear()); - map.put("term", tuple.getTerm()); - map.put("coverPageUrl", tuple.getCoverPageUrl()); - map.put("mediaVideoCount", tuple.getMediaVideoCount()); - map.put("learnerCount", tuple.getLearnerCount()); - map.put("createTime", tuple.getCreateTime()); - - return map; - }).collect(Collectors.toList()); - - return CollectionUtils.newObjectMap("count", count, "listData", listData); - } - - /** - * 班级学员课件总体进度 - * - * @param subjectId - * @param classId - * @return - */ - @Override - public List<Map<String, Object>> studentSubjectLectureProgress(String subjectId, String classId) { - QMyLectureV qMyLectureV = QMyLectureV.myLectureV; - - return this.getQueryFactory() - .select(qMyLectureV.lectureName, qMyLectureV.id.lectureId, qMyLectureV.lectureType, - qMyLectureV.chapterId, qMyLectureV.subjectId, qMyLectureV.lectureCreateTime, - qMyLectureV.percent.avg().as(qMyLectureV.percent)) - .from(qMyLectureV).where(qMyLectureV.classId.eq(classId).and(qMyLectureV.subjectId.eq(subjectId))) - .groupBy(qMyLectureV.id.lectureId).orderBy(qMyLectureV.lectureCreateTime.desc()).fetch().stream() - .map(tuple -> { - Map<String, Object> map = new HashMap<String, Object>(6); - map.put("lectureName", tuple.get(qMyLectureV.lectureName)); - map.put("lectureId", tuple.get(qMyLectureV.id.lectureId)); - map.put("lectureType", tuple.get(qMyLectureV.lectureType)); - map.put("chapterId", tuple.get(qMyLectureV.chapterId)); - map.put("subjectId", tuple.get(qMyLectureV.subjectId)); - map.put("progressPercent", tuple.get(qMyLectureV.percent)); - map.put("createTime", tuple.get(qMyLectureV.lectureCreateTime)); - return map; - }).collect(Collectors.toList()); + save(subject); + return new Result(true, "success"); } - /** - * 学员课程作业进度 - * - * @param classId - * @param subjectId - * @return - */ - public Map<String, Object> studentSubjectHomeworkProgress(String classId, String subjectId, String studentId){ - QExerciseResultV qHomeworkScoreV = QExerciseResultV.exerciseResultV; + @Override + public Result deleteClsSubject(String classId, String[] subjectIds) { + Map<String, Object> paramMap = new HashMap<String, Object>(); + paramMap.put("classId", classId); + paramMap.put("subjectIds", subjectIds); - StuStudent student = read(StuStudent.class, studentId); - Subject subject = read(Subject.class, subjectId); + List<String> reIdLst = this.findByComplexHql("select r.clsReSubjectId from ClsClassReSubject r where r.deleteFlag is false and r.classId=:classId and r.subjectId in (:subjectIds) ", + paramMap, String.class); - Tuple tuple = this.getQueryFactory() - .select(qHomeworkScoreV.subjectId, qHomeworkScoreV.count(), - new CaseBuilder() - .when(qHomeworkScoreV.completeStatus.eq(ExerciseCompleteInfo.STATUS_CHECKED) - .or(qHomeworkScoreV.completeStatus.eq(ExerciseCompleteInfo.STATUS_COMMIT))) - .then(qHomeworkScoreV.studentScore).otherwise(BigDecimal.ZERO).sum(), - new CaseBuilder() - .when(qHomeworkScoreV.completeStatus.eq(ExerciseCompleteInfo.STATUS_CHECKED) - .or(qHomeworkScoreV.completeStatus.eq(ExerciseCompleteInfo.STATUS_COMMIT))) - .then(1).otherwise(0).sum()) - .from(qHomeworkScoreV) - .where(qHomeworkScoreV.subjectId.eq(subject.getOrigSubjectId()) - .and(qHomeworkScoreV.userId.eq(student.getUserId())) - .and(qHomeworkScoreV.exerciseStatus.eq(ExerciseInfo.EXERCISE_STATUS_PUBLISHED))) - .groupBy(qHomeworkScoreV.userId).fetchOne(); + //删除关联关系 + if (reIdLst != null && reIdLst.size() > 0) { + this.bulkUpdateInLoop("update ClsClassReSubject set deleteFlag = true where clsReSubjectId=?", reIdLst.toArray()); + } - Map<String,Object> map = new HashMap<String,Object>(4); - if(tuple == null) { - map.put("subjectId", subjectId); - map.put("homeworkCount", 0); - map.put("avgScore", "0"); - map.put("commitHomeworkCount", 0); - }else { - int commitHomeworkCount = tuple.get(3, Integer.class) == null?0:tuple.get(3, Integer.class); - map.put("subjectId", subjectId); - map.put("homeworkCount", tuple.get(1, Integer.class) == null?0:tuple.get(1, Integer.class)); - map.put("avgScore", String.valueOf(commitHomeworkCount == 0 || tuple.get(2, BigDecimal.class) == null?BigDecimal.ZERO:tuple.get(2, BigDecimal.class).divide(BigDecimal.valueOf(commitHomeworkCount), 2, BigDecimal.ROUND_HALF_UP))); - map.put("commitHomeworkCount", commitHomeworkCount); - } + this.delete(subjectIds); + return new Result(true, "success"); + } - return map; - } + @Override + public Result getPerformance4Subject() { + String findCompleteCountByHql = "from MySubjectV where id.userId = ? and percent = 1 "; + String findUndoneByHql = "from MySubjectV where id.userId = ? and (percent != 1 or percent is null)"; + String userId = ClientUtils.getUserId(); + int CompleteCount = findCount(findCompleteCountByHql, CollectionUtils.newList(userId)); + int UndoneCount = findCount(findUndoneByHql, CollectionUtils.newList(userId)); + return new Result(true, "success", + CollectionUtils.newObjectMap("CompleteCount", CompleteCount, "UndoneCount", UndoneCount)); + } - /** - * 学员考试作业进度 - * - * @param classId - * @param subjectId - * @return - */ - public Map<String, Object> studentSubjectExamProgress(String classId, String subjectId, String studentId){ - QExamResultV qExamScoreV = QExamResultV.examResultV; + @Override + public Result lstSubjectDetail() { + String userId = ClientUtils.getUserId(); + StringBuffer hql = new StringBuffer( + "select percent as percent,className as className ,id.classId as classId ,id.subjectId as subjectId ," + + "subjectName as subjectName ,coverPageUrl as coverPageUrl , progressValue as progressValue from" + + " MySubjectV p where p.id.userId =:userId and p.subjectStatus=:subjectStatus "); - StuStudent student = read(StuStudent.class, studentId); - Subject subject = read(Subject.class, subjectId); + Map<String, Object> args = CollectionUtils.newObjectMap("userId", userId, "subjectStatus", Subject.STATUS_ISSUED); - Tuple tuple = this.getQueryFactory().select(qExamScoreV.subjectId, qExamScoreV.count(), new CaseBuilder() - .when(qExamScoreV.status.eq("0")).then(BigDecimal.ZERO).otherwise(qExamScoreV.score).sum(), new CaseBuilder() - .when(qExamScoreV.status.eq("0")).then(0).otherwise(1).sum()). - from(qExamScoreV). - where(qExamScoreV.subjectId.eq(subject.getOrigSubjectId()).and(qExamScoreV.userId.eq(student.getUserId())).and(qExamScoreV.examStatus.eq(ExerciseInfo.EXERCISE_STATUS_PUBLISHED))). - groupBy(qExamScoreV.userId).fetchOne(); - Map<String,Object> map = new HashMap<String,Object>(4); - map.put("subjectId", subjectId); - if(tuple == null) { - map.put("examCount", 0); - map.put("avgScore", "0"); - map.put("commitExamCount", 0); - }else { - int commitExamCount = tuple.get(3, Integer.class) == null?0:tuple.get(3, Integer.class); + List<Map<String, Object>> subjectLstMap = findListWithMapByHql(hql.toString(), args); - map.put("examCount", tuple.get(1, Integer.class) == null?0:tuple.get(1, Integer.class)); - map.put("avgScore", String.valueOf(commitExamCount == 0 || tuple.get(2, BigDecimal.class) == null?BigDecimal.ZERO:tuple.get(2, BigDecimal.class).divide(new BigDecimal(commitExamCount), 2, BigDecimal.ROUND_HALF_UP))); - map.put("commitExamCount", tuple.get(3, Integer.class) == null?0:tuple.get(3, Integer.class)); - } + for (Map<String, Object> subject : subjectLstMap) { - return map; - } + String classId = (String) subject.get("classId"); + String subjectId = (String) subject.get("subjectId"); + Map<String, Object> map = progressDao.getStudyById(userId, subjectId, classId); + List<MyLectureV> myLectureVList = lectureService.listLectureVBySubjectId(userId, subjectId, "", 1000, 1, null); + Double percent = 0.0; + Double progressValue = 0.0; + Double percentAvg = 0.0; + if (!myLectureVList.isEmpty()) { + for (MyLectureV myLectureV : myLectureVList) { + if (myLectureV.getPercent() != null && myLectureV.getProgressValue() != null) { + percent += myLectureV.getPercent(); + progressValue += myLectureV.getProgressValue().intValue(); + } + } + percentAvg = percent / myLectureVList.size(); + if (percentAvg.isNaN()) { + percentAvg = 0.0; + } + } + subject.put("percent", new BigDecimal(percentAvg)); + subject.put("progressValue", new BigDecimal(progressValue)); - /** - * 我的课件情况 - * - * @param classId - * @return - */ - private List<Map<String, Object>> myLectureList(String classId){ - QMyLectureV qMyLectureV = QMyLectureV.myLectureV; + subject.put("lectureParentId", map.get("lectureParentId")); + subject.put("lectureId", map.get("lectureId")); + subject.put("unCommitExerciseCount", exerciseInfoService.getUnCommitExerciseCount(classId, userId)); + subject.put("toBeCommitExerciseCount", exerciseInfoService.getToBeCommitExerciseCount(classId, userId)); + subject.put("CommitExerciseCount", exerciseInfoService.getCommitExerciseCount(classId, userId)); + subject.put("exerciseCount", exerciseInfoService.getExerciseCount(classId, userId)); + subject.put("examCount", examService.getExamCount(classId, userId)); + subject.put("unCommitExamCount", examService.getUnCommitExamCount(classId, userId)); + subject.put("commitExamCount", examService.getCommitExamCount(classId, userId)); + subject.put("toBeCommitExamCount", examService.getToBeCommitExamCount(classId, userId)); - return this.getQueryFactory().select(qMyLectureV.subjectId, - qMyLectureV.count(), - new CaseBuilder() - .when(qMyLectureV.percent.gt(0.95)).then(1).otherwise(0).sum()).//大于95%算完成 - from(qMyLectureV). - where(qMyLectureV.classId.eq(classId).and(qMyLectureV.id.userId.eq(ClientUtils.getUserId()))). - groupBy(qMyLectureV.subjectId).fetch().stream() - .map(tuple -> { - Map<String,Object> map = new HashMap<String,Object>(3); - map.put("subjectId", tuple.get(0, String.class)); - map.put("lectureCount", tuple.get(1, Integer.class)); - map.put("completeLectureCount", tuple.get(2, String.class)); - return map; - }).collect(Collectors.toList()); - } + } + return new Result(true, "success", subjectLstMap); + } - /** - * 我的课程,按时间排序 - * - * @param classId - * @return - */ - public List<Map<String,Object>> mySubjectList(String classId, Pager pager) { - //课程 - List<Map<String,Object>> clsSubjectlist = this.myClsSubjectlist(classId, ClientUtils.getUserId(), pager); - //课件统计 - List<Map<String,Object>> lectures = this.myLectureList(classId); - for(Map<String,Object> clsSubject : clsSubjectlist) { - String origSubjectId = (String)clsSubject.get("origSubjectId"); - clsSubject.put("exam", CollectionUtils.newObjectMap("examCount", this.examService.listStudentExamCount("", new String[] {classId}, origSubjectId, null))); - clsSubject.put("homework", CollectionUtils.newObjectMap("homeworkCount", exerciseInfoService.queryStuExerciseListCount("", null, ClientUtils.getUserId(), origSubjectId, null))); - clsSubject.put("lecture", CollectionUtils.newObjectMap("lectureCount", 0, "completeLectureCount", 0)); - clsSubject.put("mediaVideoLive", CollectionUtils.newObjectMap("mediaVideoLiveCount", this.mediaLiveService.listCount("", new String[] {classId}, origSubjectId, null))); + @SuppressWarnings({"unchecked", "rawtypes"}) + @Override + public Result getDataDesc(String classId, String subjectId) { + if (StringUtils.isEmpty(classId)) { + return new Result(false, "班级id参数错误"); + } + QSubjectProgressTreeV qSubjectProgressTreeV = QSubjectProgressTreeV.subjectProgressTreeV; - this.setSubjectStatistics("lecture", clsSubject, lectures); - } + List<Map<String, Object>> percentDesc = this.percentDesc(classId, subjectId, new OrderSpecifier(Order.DESC, qSubjectProgressTreeV.percent)); - return clsSubjectlist; - } + List<Map<String, Object>> studyTimeDesc = this.percentDesc(classId, subjectId, new OrderSpecifier(Order.DESC, qSubjectProgressTreeV.progressValue)); - /** - * 统计课程的数据 - * - * @param type 类型 - * @param clsSubject 课程 - * @param lstStatistics 统计信息 - */ - private void setSubjectStatistics(String type, Map<String,Object> clsSubject, List<Map<String,Object>> lstStatistics) { - if(lstStatistics != null && !lstStatistics.isEmpty()) { - for(Map<String,Object> statistics : lstStatistics) { - if(clsSubject.get("origSubjectId").equals(statistics.get("subjectId")) || clsSubject.get("subjectId").equals(statistics.get("subjectId"))) { - clsSubject.put(type, statistics); - } - } - } + List<Map<String, Object>> exerciseInfoDesc = this.exerciseInfoDesc(classId, subjectId); - } + List<Map<String, Object>> examInfoDesc = this.examInfoDesc(classId, subjectId); - /** - * 我的课程详情 - * - * @param classId - * @return - */ - public Map<String,Object> mySubjectInfo(String subjectId, String classId,HttpServletRequest request) { + return new Result(true, "success", CollectionUtils.newObjectMap("percentDesc", percentDesc, "studyTimeDesc", + studyTimeDesc, "exerciseInfoDesc", exerciseInfoDesc, "examInfoDesc", examInfoDesc)); + } - QMySubjectV qMySubjectV = QMySubjectV.mySubjectV; - QMyLectureV qMyLectureV = QMyLectureV.myLectureV; - Object userId = request.getSession().getAttribute("userId"); - // 课程 - Tuple tuple = this.getQueryFactory() - .select(qMySubjectV.id.subjectId, qMySubjectV.subjectName, qMySubjectV.term, qMySubjectV.schoolYear,qMySubjectV.origSubjectId, - qMySubjectV.percent,qMySubjectV.coverPageUrl, qMySubjectV.progressValue) - .from(qMySubjectV) - .where(qMySubjectV.id.classId.eq(classId).and(qMySubjectV.id.userId.eq(ClientUtils.getUserId())) - .and(qMySubjectV.id.subjectId.eq(subjectId))) - .fetchOne(); - - Subject objSubject = this.read(subjectId); - - Map<String, Object> subject = new HashMap<String, Object>(5); - subject.put("name", objSubject.getName()); - subject.put("subjectId", subjectId); - subject.put("origSubjectId", objSubject.getOrigSubjectId()); - subject.put("schoolYear", objSubject.getSchoolYear()); - subject.put("term", objSubject.getTerm()); - subject.put("coverPageUrl", objSubject.getCoverPageUrl()); - subject.put("content", this.readSubjectContent(subjectId)); - subject.put("teacherName", objSubject.getTeacherName()); - if(tuple == null) { - subject.put("progressPercent", 0); - subject.put("progressValue", 0); - }else { - subject.put("progressPercent", tuple.get(qMySubjectV.percent)); - subject.put("progressValue", tuple.get(qMySubjectV.progressValue)); - } - - String origSubjectId = objSubject.getOrigSubjectId(); - - // 考试统计 - long examsCount = this.examService.listStudentExamCount("", new String[] {classId}, origSubjectId, null); - - // 作业统计 - long homeworksCount = exerciseInfoService.queryStuExerciseListCount("", null, ClientUtils.getUserId(), origSubjectId, null); - - // 课件统计 - Tuple tupleLecture = this.getQueryFactory().select(qMyLectureV.count(), - new CaseBuilder().when(qMyLectureV.percent.gt(0.95)).then(1).otherwise(0).sum()).// 大于95%算完成 - from(qMyLectureV) - .where(qMyLectureV.classId.eq(classId).and(qMyLectureV.id.userId.eq(ClientUtils.getUserId())) - .and(qMyLectureV.subjectId.eq(subjectId))) - .groupBy(qMyLectureV.subjectId).fetchOne(); - - long mediaVideoLivesCount = this.mediaLiveService.listCount("", new String[] {classId}, origSubjectId, null); - - return CollectionUtils.newObjectMap("mediaVideoLivesCount", mediaVideoLivesCount, "examsCount", examsCount, - "homeworksCount", homeworksCount, "subjectInfo", subject, "lectureCount", - tupleLecture == null?0:tupleLecture.get(0, Long.class), - "completeLectureCount", tupleLecture == null?0:tupleLecture.get(1,Integer.class)); - } - - /** - * 我的课程按学期分类 - * - * @param classId - * @return - */ - @Override - public List<Map<String,Object>> myTermSubjectList(String classId) { - //课程 - List<Map<String,Object>> clsSubjectlist = this.mySubjectList(classId, new Pager()); - System.out.println("clsSubjectlistaaaaaa"+clsSubjectlist); - return this.termSubjectList(classId, clsSubjectlist); - } + /** + * 获取班级对应的学员 按进度进行排序 + */ + private List<Map<String, Object>> percentDesc(String classId, String subjectId, @SuppressWarnings("rawtypes") OrderSpecifier order) { + QSubjectProgressTreeV qSubjectProgressTreeV = QSubjectProgressTreeV.subjectProgressTreeV; + QUser qUser = QUser.user; + String nodeId = StringUtils.isNotEmpty(subjectId) ? subjectId : classId; + String nodeType = StringUtils.isNotEmpty(subjectId) ? Progress.PROGRESS_TYPE_SUBJECT : Progress.PROGRESS_TYPE_CLASS; + List<Map<String, Object>> lstMap = this.getQueryFactory().select(qSubjectProgressTreeV.progressValue, + qSubjectProgressTreeV.percent, qUser.name, qUser.userId, qSubjectProgressTreeV.id.nodeId).from(qSubjectProgressTreeV, qUser). + where(qSubjectProgressTreeV.id.userId.eq(qUser.userId).and(qSubjectProgressTreeV.nodeType.eq(nodeType)) + .and(qSubjectProgressTreeV.id.nodeId.eq(nodeId))).orderBy(order).fetch().stream().map(tuple -> { + + Map<String, Object> map = new HashMap<>(); + map.put("userName", tuple.get(qUser.name)); + map.put("userId", tuple.get(qUser.userId)); + map.put("classId", tuple.get(qSubjectProgressTreeV.id.nodeId)); + map.put("percent", tuple.get(qSubjectProgressTreeV.percent)); + map.put("progressValue", tuple.get(qSubjectProgressTreeV.progressValue)); + return map; + }).collect(Collectors.toList()); + return lstMap; + } + + /** + * 通过作业完成个数排序 + */ + private List<Map<String, Object>> exerciseInfoDesc(String classId, String subjectId) { + QExerciseResultV qExerciseResultV = QExerciseResultV.exerciseResultV; + //查询条件 + Predicate predicate = StringUtils.isEmpty(subjectId) ? qExerciseResultV.id.classId.eq(classId) : + qExerciseResultV.id.classId.eq(classId).and(qExerciseResultV.subjectId.eq(subjectId)); + //case数量判断 + NumberExpression<BigDecimal> caseCount = new CaseBuilder() + .when(qExerciseResultV.completeStatus.eq(ExerciseCompleteInfo.STATUS_CHECKED) + .or(qExerciseResultV.completeStatus.eq(ExerciseCompleteInfo.STATUS_COMMIT))) + .then(BigDecimal.ONE).otherwise(BigDecimal.ZERO).sum(); + + //case分数 + NumberExpression<BigDecimal> caseScoreSum = new CaseBuilder() + .when(qExerciseResultV.completeStatus.eq(ExerciseCompleteInfo.STATUS_CHECKED) + .or(qExerciseResultV.completeStatus.eq(ExerciseCompleteInfo.STATUS_COMMIT))) + .then(qExerciseResultV.score).otherwise(BigDecimal.ZERO).sum(); + + List<Map<String, Object>> lstMap = this.getQueryFactory().select(qExerciseResultV.userId, qExerciseResultV.studentName, + caseScoreSum.divide(caseCount), qExerciseResultV.count(), caseCount).from(qExerciseResultV).where(predicate). + groupBy(qExerciseResultV.userId). + orderBy(caseScoreSum.divide(caseCount).desc()).fetch().stream().map(tuple -> { + Map<String, Object> map = new HashMap<>(); + map.put("userId", tuple.get(qExerciseResultV.userId)); + map.put("userName", tuple.get(qExerciseResultV.studentName)); + map.put("avgScore", tuple.get(2, BigDecimal.class)); + map.put("exerciseCount", tuple.get(3, BigDecimal.class)); + map.put("commitExerciseCount", tuple.get(4, BigDecimal.class)); + + return map; + }).collect(Collectors.toList()); + + return lstMap; + + } + + /** + * + */ + private List<Map<String, Object>> examInfoDesc(String classId, String subjectId) { + + QExamResultV qExamResultV = QExamResultV.examResultV; + //查询条件 + Predicate predicate = StringUtils.isEmpty(subjectId) ? qExamResultV.id.classId.eq(classId) : + qExamResultV.id.classId.eq(classId).and(qExamResultV.subjectId.eq(subjectId)); + //case判断 + NumberExpression<BigDecimal> caseCount = new CaseBuilder() + .when(qExamResultV.status.eq("0")).then(BigDecimal.ZERO).otherwise(BigDecimal.ONE).sum(); + //case分数 + NumberExpression<BigDecimal> caseScoreSum = new CaseBuilder() + .when(qExamResultV.status.eq("0")).then(BigDecimal.ZERO).otherwise(qExamResultV.score).sum(); + + List<Map<String, Object>> lstMap = this.getQueryFactory().select(qExamResultV.userId, qExamResultV.studentName, + caseScoreSum.divide(caseCount), qExamResultV.count(), caseCount).from(qExamResultV).where(predicate). + groupBy(qExamResultV.userId). + orderBy(caseScoreSum.divide(caseCount).desc()).fetch().stream().map(tuple -> { + Map<String, Object> map = new HashMap<>(); + map.put("userId", tuple.get(qExamResultV.userId)); + map.put("userName", tuple.get(qExamResultV.studentName)); + map.put("avgScore", tuple.get(2, BigDecimal.class)); + map.put("examCount", tuple.get(3, BigDecimal.class)); + map.put("commitExamCount", tuple.get(4, BigDecimal.class)); + + return map; + }).collect(Collectors.toList()); + return lstMap; + + } + + @Override + public Result lastStudied(String userId) { + Map<String, Object> map = progressDao.getStudyByUserId(userId); + String subjectId = (String) map.get("subjectId"); + Subject subject = read(Subject.class, subjectId); + if (subject != null) { + map.put("subjectName", subject.getName()); + } + return new Result(true, "success", map); + } + + @Override + public List<Map<String, Object>> queryAvailableSubjectIdAndName(String teacherId, Integer subjectType) { + List<Map<String, Object>> result = null; + + if (subjectType == Subject.TYPE_PUBLIC_SUBJECT) { + result = this.findListWithMapByHql( + "select subjectId as subjectId ,name as subjectName from Subject where deleteFlag is false and type=" + Subject.TYPE_PUBLIC_SUBJECT + " and orgId='" + ClientUtils.getOrgId() + "'", null); + } else { + if (StringUtils.isNotEmpty(teacherId)) { + result = this.findListWithMapByHql( + "select distinct origSubjectId as subjectId ,name as subjectName from Subject where deleteFlag is false and type=" + Subject.TYPE_CLS_SUBJECT + " and teacherId='" + teacherId + "'", null); + } else { + result = this.findListWithMapByHql( + "select subjectId as subjectId ,name as subjectName from Subject where deleteFlag is false and type=" + Subject.TYPE_ORG_SUBJECT + " and orgId='" + ClientUtils.getOrgId() + "'", null); + } + } + + return result; + } + + @Override + public List<Map<String, Object>> getMySubjectList() { + String sql = "SELECT o.CLASS_ID, a.`NAME` AS subjectName, a.SUBJECT_ID, o.`NAME` AS className FROM ( ( SELECT " + + "c.CLASS_ID, c.`NAME` FROM stu_student s, cls_class c WHERE s.CLASS_ID = c.CLASS_ID AND s.USER_ID =:userId" + + " ) o LEFT JOIN ( SELECT r.class_id,s.SUBJECT_ID, s.`NAME` FROM `subject` s, cls_class_re_subject r WHERE " + + "s.SUBJECT_ID = r.subject_id ) a ON o.CLASS_ID = a.class_id ) "; + List<Object[]> list = findByComplexSql(sql, CollectionUtils.newObjectMap("userId", ClientUtils.getUserId()), + Object[].class); + List<Map<String, Object>> lstMap = new ArrayList<Map<String, Object>>(list.size()); + Map<String, Object> map = null; + for (Object[] objects : list) { + map = new HashMap<String, Object>(objects.length); + map.put("classId", objects[0]); + map.put("subjectName", objects[1]); + map.put("subjectId", objects[2]); + map.put("className", objects[3]); + lstMap.add(map); + } + return lstMap; + } - /** - * 课程按学期分类 - * - * @param classId - * @return - */ - @Override - public List<Map<String,Object>> termSubjectList(String classId, List<Map<String,Object>> clsSubjectlist) { - //学期 - List<Map<String,Object>> termList = this.termList(classId); + @Override + public List<Map<String, Object>> clsSubjectlist(String classId, Integer schoolYear, Integer term) { + QSubject qSubject = QSubject.subject; + QClsClassReSubject qClsClassReSubject = QClsClassReSubject.clsClassReSubject; - if(termList != null && !termList.isEmpty()) { - for(Map<String,Object> term : termList) { - if(termList != null && !termList.isEmpty()) { - List<Map<String,Object>> subjectList = new ArrayList<>(); - for(Map<String,Object> clsSubject : clsSubjectlist) { - if(term.get("schoolYear").equals(clsSubject.get("schoolYear")) && - term.get("term").equals(clsSubject.get("term"))) { - subjectList.add(clsSubject); - } - term.put("subjectList", subjectList); - } - } - } - } - return termList; - } + QueryDslOptionBuilder builder = new QueryDslOptionBuilder(). + and(qSubject.deleteFlag::eq, false) + .and(qClsClassReSubject.classId::eq, classId) + .and(qClsClassReSubject.subjectId::eq, qSubject.subjectId) + .and(qClsClassReSubject.deleteFlag::eq, false).and(qSubject.status::eq, Subject.STATUS_ISSUED); + if (schoolYear != null && schoolYear != 0) {//学年 + builder = builder.and(qSubject.schoolYear::eq, schoolYear); + } + if (term != null && term != 0) {//学期 + builder = builder.and(qSubject.term::eq, term); + } + + return this.getQueryFactory().select(qSubject.name, qSubject.origSubjectId, qSubject.subjectId, qSubject.schoolYear, qSubject.term).distinct() + .from(qSubject, qClsClassReSubject) + .where(builder.build()) + .orderBy(qSubject.createTime.desc()) + .fetch().stream() + .map(tuple -> { + Map<String, Object> map = new HashMap<String, Object>(2); + map.put("name", tuple.get(qSubject.name)); + map.put("subjectId", tuple.get(qSubject.subjectId)); + map.put("schoolYear", tuple.get(qSubject.schoolYear)); + map.put("term", tuple.get(qSubject.term)); + map.put("origSubjectId", tuple.get(qSubject.origSubjectId)); + return map; + }).collect(Collectors.toList()); + } + + @Override + public List<Map<String, Object>> termList(String classId) { + QSubject qSubject = QSubject.subject; + QClsClassReSubject qClsClassReSubject = QClsClassReSubject.clsClassReSubject; + + QueryDslOptionBuilder builder = new QueryDslOptionBuilder(). + and(qSubject.deleteFlag::eq, false) + .and(qClsClassReSubject.classId::eq, classId) + .and(qClsClassReSubject.subjectId::eq, qSubject.subjectId) + .and(qClsClassReSubject.deleteFlag::eq, false).and(qSubject.status::eq, Subject.STATUS_ISSUED); + + return this.getQueryFactory().select(qSubject.schoolYear.as("schoolYear"), qSubject.term.as("term")) + .from(qSubject, qClsClassReSubject) + .where(builder.build().and(qSubject.schoolYear.isNotNull()) + .and(qSubject.term.isNotNull())).groupBy(qSubject.schoolYear, qSubject.term) + .orderBy(qSubject.schoolYear.desc(), qSubject.term.desc()) + .fetch().stream() + .map(tuple -> { + Map<String, Object> map = new HashMap<String, Object>(2); + map.put("schoolYear", tuple.get(0, Integer.class)); + map.put("term", tuple.get(1, Integer.class)); + return map; + }).collect(Collectors.toList()); + } + + /** + * 我的班级信息 + * + * @param classId + * @return + */ + public Map<String, Object> myClassInfo(String classId) { + ClsClass objClsClass = this.read(ClsClass.class, classId); + QSubjectProgressTreeV qSubjectProgressTreeV = QSubjectProgressTreeV.subjectProgressTreeV; + + List<Subject> lstSubject = objClsClass.getSubjects(); + + //过滤掉状态为草稿的 + List<String> teachers = lstSubject.stream().filter(u -> u.getStatus().equals(Subject.STATUS_ISSUED)).map(tuple -> { + return tuple.getTeacherName(); + }).collect(Collectors.toList()); + + SubjectProgressTreeV objSubjectProgressTreeV = this.getQueryFactory().selectFrom(qSubjectProgressTreeV) + .where(qSubjectProgressTreeV.id.nodeId.eq(classId).and(qSubjectProgressTreeV.id.userId.eq(ClientUtils.getUserId())).and(qSubjectProgressTreeV.nodeType.eq("class"))).fetchOne(); + + if (objSubjectProgressTreeV != null) { + + long allCount = this.getQueryFactory().selectFrom(qSubjectProgressTreeV) + .where(qSubjectProgressTreeV.id.nodeId.eq(classId)).fetchCount(); + + long lgCount = this.getQueryFactory().selectFrom(qSubjectProgressTreeV) + .where(qSubjectProgressTreeV.id.nodeId.eq(classId).and(qSubjectProgressTreeV.percent.gt(objSubjectProgressTreeV.getPercent()))).fetchCount(); + //排行 + float rank = (allCount - lgCount) / allCount; + + return CollectionUtils.newObjectMap("className", objClsClass.getName(), "progressPercent", + objSubjectProgressTreeV.getPercent(), "progressValue", objSubjectProgressTreeV.getProgressValue(), "rank", rank, "teacherName", teachers); + } else { + return CollectionUtils.newObjectMap("className", objClsClass.getName(), "percent", + 0, "progressValue", 0, "rank", 0, teachers); + } + } + + /** + * 获取我的课程进度 + * + * @param classId + * @return + */ + public List<Map<String, Object>> myClsSubjectlist(String classId, String userId, Pager pager) { + String teacherId = this.teacherService.getTeacherIdByUserId(ClientUtils.getUserId()); + QMySubjectV qMySubjectV = QMySubjectV.mySubjectV; + + Predicate predicate = null; + if (StringUtils.isNotEmpty(teacherId)) { + predicate = qMySubjectV.id.classId.eq(classId).and(qMySubjectV.id.userId.eq(userId)).and(qMySubjectV.teacherId.eq(teacherId).and(qMySubjectV.subjectStatus.eq(Subject.STATUS_ISSUED))); + } else { + predicate = qMySubjectV.id.classId.eq(classId).and(qMySubjectV.id.userId.eq(userId).and(qMySubjectV.subjectStatus.eq(Subject.STATUS_ISSUED))); + } + return this.getQueryFactory().select(qMySubjectV.id.subjectId, + qMySubjectV.subjectName, qMySubjectV.term, + qMySubjectV.schoolYear, qMySubjectV.percent, qMySubjectV.coverPageUrl, qMySubjectV.origSubjectId) + .from(qMySubjectV) + .where(predicate) + .orderBy(qMySubjectV.schoolYear.desc(), qMySubjectV.term.desc()) + .limit(pager.getPageSize()).offset(pager.getOffset()) + .fetch().stream() + .map(tuple -> { + Map<String, Object> map = new HashMap<String, Object>(5); + map.put("name", tuple.get(qMySubjectV.subjectName)); + map.put("origSubjectId", tuple.get(qMySubjectV.origSubjectId)); + map.put("subjectId", tuple.get(qMySubjectV.id.subjectId)); + map.put("progressPercent", tuple.get(qMySubjectV.percent)); + map.put("schoolYear", tuple.get(qMySubjectV.schoolYear)); + map.put("term", tuple.get(qMySubjectV.term)); + map.put("coverPageUrl", tuple.get(qMySubjectV.coverPageUrl)); + return map; + }).collect(Collectors.toList()); + } + + /** + * 获取我的课程数量 + * + * @param classId + * @return + */ + public long myClsSubjectCount(String classId) { + QMySubjectV qMySubjectV = QMySubjectV.mySubjectV; + + return this.getQueryFactory().select(qMySubjectV.id.subjectId, + qMySubjectV.subjectName, qMySubjectV.term, + qMySubjectV.schoolYear, qMySubjectV.percent) + .from(qMySubjectV) + .where(qMySubjectV.id.classId.eq(classId).and(qMySubjectV.id.userId.eq(ClientUtils.getUserId())).and(qMySubjectV.subjectStatus.eq(Subject.STATUS_ISSUED))) + .fetchCount(); + } + + /** + * 获取学员的课程进度 + * + * @param classId + * @return + */ + public List<Map<String, Object>> studentSubjectProgress(String classId, Pager pager) { + String teacherId = this.teacherService.getTeacherIdByUserId(ClientUtils.getUserId()); + QSubjectProgressTreeV qSubjectProgressTreeV = QSubjectProgressTreeV.subjectProgressTreeV; + + QMySubjectV qMySubjectV = QMySubjectV.mySubjectV; + return this.getQueryFactory().select(qMySubjectV.id.subjectId, + qMySubjectV.subjectName, qMySubjectV.term, qMySubjectV.coverPageUrl, + qMySubjectV.schoolYear, qMySubjectV.lectureCount, qMySubjectV.percent.avg().as(qMySubjectV.percent)) + .from(qMySubjectV) + .where(qMySubjectV.id.classId.eq(classId).and(qMySubjectV.teacherId.eq(teacherId))) + .groupBy(qMySubjectV.id.subjectId) + .orderBy(qMySubjectV.schoolYear.desc(), qMySubjectV.term.desc()) + .limit(pager.getPageSize()).offset(pager.getOffset()) + .fetch().stream() + .map(tuple -> { + Map<String, Object> map = new HashMap<String, Object>(5); + map.put("name", tuple.get(qMySubjectV.subjectName)); + map.put("subjectId", tuple.get(qMySubjectV.id.subjectId)); + map.put("schoolYear", tuple.get(qMySubjectV.schoolYear)); + map.put("term", tuple.get(qMySubjectV.term)); + map.put("progressPercent", + this.getQueryFactory().select(qSubjectProgressTreeV.percent.avg()) + .from(qSubjectProgressTreeV) + .where(qSubjectProgressTreeV.id.nodeId.eq(tuple.get(qMySubjectV.id.subjectId)) + .and(qSubjectProgressTreeV.nodeType.eq(Progress.PROGRESS_TYPE_SUBJECT))) + .groupBy(qSubjectProgressTreeV.id.nodeId).fetchOne()); + + map.put("coverPageUrl", tuple.get(qMySubjectV.coverPageUrl)); + map.put("lectureCount", this.getLectureCount(tuple.get(qMySubjectV.id.subjectId))); + return map; + }).collect(Collectors.toList()); + } + + /** + * 获取课件数量 + * + * @param subjectId + * @return + */ + public long getLectureCount(String subjectId) { + + Subject subject = this.read(subjectId); + if (subject == null) { + return 0l; + } + if (subject.getType() == Subject.TYPE_CLS_SUBJECT) {//班级课程 + + QClsSubjectLecture qSubjectLecture = QClsSubjectLecture.clsSubjectLecture; + + return this.getQueryFactory().selectFrom(qSubjectLecture).where(qSubjectLecture.deleteFlag.isFalse() + .and(qSubjectLecture.subjectId.eq(subjectId)).and(qSubjectLecture.status.eq(SubjectLecture.STATUS_DRAFT))).fetchCount(); + } else { + + QSubjectLecture qSubjectLecture = QSubjectLecture.subjectLecture; + + return this.getQueryFactory().selectFrom(qSubjectLecture).where(qSubjectLecture.deleteFlag.isFalse() + .and(qSubjectLecture.subjectId.eq(subjectId)).and(qSubjectLecture.status.eq(SubjectLecture.STATUS_DRAFT))).fetchCount(); + } + } - /** - * 查询课程关联的班级课程信息 - * - * @param classId - * @return - */ - @Override - public List<Map<String,Object>> querySubjectReClassInfos(String origSubjectId) { - String hql = "select s.subjectId as subjectId ,s.teacherId as teacherId,s.teacherName as teacherName," - + " s.schoolYear as schoolYear,s.term as term,c.classId as classId,c.name as className" - + " from Subject s ,ClsClassReSubject r ,ClsClass c where s.subjectId = r.subjectId " - + " and r.classId = c.classId and s.origSubjectId =:origSubjectId and s.deleteFlag is false"; + /** + * 我的公开课列表 + * + * @param pageNum + * @param pageSize + * @param keyword + * @return + */ + public Map<String, Object> myOpenSubjectList(Integer pageNum, Integer pageSize, String keyword) { + QSubject qSubject = QSubject.subject; + QProgress qProgress = QProgress.progress; + QSubjectLecture qSubjectLecture = QSubjectLecture.subjectLecture; - return this.findListWithMapByHql(hql,CollectionUtils.newObjectMap("origSubjectId",origSubjectId)); - } + JPAQuery<Tuple> query = this.getQueryFactory() + .select(qSubject.subjectId, qSubject.name, qSubject.term, qSubject.coverPageUrl, qSubject.schoolYear, + qProgress.progressPercent.avg().as(qProgress.progressPercent), qProgress.progressValue.sum().as(qProgress.progressValue)) + .from(qSubject, qProgress, qSubjectLecture) + .where(qSubject.deleteFlag.isFalse().and(qSubjectLecture.subjectId.eq(qSubject.subjectId)) + .and(qSubjectLecture.deleteFlag.isFalse()).and(qSubjectLecture.lectureId.eq(qProgress.targetId)) + .and(qProgress.learnerId.eq(ClientUtils.getUserId())) + .and(qSubject.name.like("%" + keyword + "%").and(qProgress.deleteFlag.isFalse())) + .and(qProgress.type.eq(Progress.PROGRESS_TYPE_LECTURE)).and(qSubject.status.eq(Subject.STATUS_ISSUED))).groupBy(qSubject.subjectId); + + long count = query.fetchCount(); + List<Map<String, Object>> listData = query.orderBy(qProgress.createTime.desc()).limit(pageSize).offset(pageNum).fetch().stream().map(tuple -> { + Map<String, Object> map = new HashMap<String, Object>(7); + String subjectId = tuple.get(qSubject.subjectId); + + map.put("name", tuple.get(qSubject.name)); + map.put("subjectId", subjectId); + map.put("schoolYear", tuple.get(qSubject.schoolYear)); + map.put("term", tuple.get(qSubject.term)); + map.put("coverPageUrl", tuple.get(qSubject.coverPageUrl)); + map.put("progressPercent", tuple.get(qProgress.progressPercent)); + map.put("progressValue", tuple.get(qProgress.progressValue)); + + Map<String, Object> openSubjectDetail = this.openSubjectDetail(subjectId); + + // 直播数量 + map.put("mediaVideoLiveCount", openSubjectDetail.get("mediaVideoLiveCount")); + + // 课件数量 + map.put("subjectLectureCount", openSubjectDetail.get("subjectLectureCount")); + + //学习人次 + map.put("studyCount", openSubjectDetail.get("studyCount")); + + map.put("content", openSubjectDetail.get("content")); + + // 已观看完成课件数量 + map.put("subjectLectureDoCount", openSubjectDetail.get("subjectLectureDoCount")); + + return map; + }).collect(Collectors.toList()); + + return CollectionUtils.newObjectMap("count", count, "listData", listData); + } + + /** + * 课程统计详情 + * + * @param subjectId + * @return + */ + public Map<String, Object> openSubjectDetail(String subjectId) { + Map<String, Object> map = new HashMap<String, Object>(); + QMediaVideoLive qMediaVideoLive = QMediaVideoLive.mediaVideoLive; + QSubjectLecture qSubjectLecture = QSubjectLecture.subjectLecture; + QProgress qProgress = QProgress.progress; + + // 直播数量 + map.put("mediaVideoLiveCount", + this.getQueryFactory().select(qMediaVideoLive).from(qMediaVideoLive) + .where(qMediaVideoLive.deleteFlag.isFalse() + .and(qMediaVideoLive.status.gt(0)) + .and(qMediaVideoLive.subjectId.eq(subjectId))) + .fetchCount()); + + // 课件数量 + map.put("subjectLectureCount", + this.getQueryFactory().select(qSubjectLecture).from(qSubjectLecture) + .where(qSubjectLecture.deleteFlag.isFalse() + .and(qSubjectLecture.subjectId.eq(subjectId)).and(qSubjectLecture.status.eq(SubjectLecture.STATUS_DRAFT))) + .fetchCount()); + + //学习人次 + map.put("studyCount", + this.getQueryFactory().selectDistinct(qProgress.learnerId).from(qProgress, qSubjectLecture) + .where(qProgress.deleteFlag.isFalse().and(qSubjectLecture.deleteFlag.isFalse()).and(qSubjectLecture.subjectId.eq(subjectId)).and(qProgress.type.eq(Progress.PROGRESS_TYPE_LECTURE)) + .and(qProgress.targetId.eq(qSubjectLecture.lectureId))) + .fetchCount()); + + map.put("content", this.readSubjectContent(subjectId)); + + // 已观看完成课件数量 + map.put("subjectLectureDoCount", + this.getQueryFactory().select(qSubjectLecture).from(qSubjectLecture, qProgress) + .where(qSubjectLecture.deleteFlag.isFalse().and(qProgress.deleteFlag.isFalse()) + .and(qProgress.learnerId.eq(ClientUtils.getUserId())).and(qProgress.type.eq(Progress.PROGRESS_TYPE_LECTURE)) + .and(qProgress.progressPercent.gt(0.95)).and(qProgress.targetId.eq(qSubjectLecture.lectureId)) + .and(qSubjectLecture.subjectId.eq(subjectId))) + .fetchCount()); + + return map; + } + + /** + * 公开课详情 + * + * @param subjectId + * @return + */ + public Map<String, Object> openSubjectInfo(String subjectId) { + QProgress qProgress = QProgress.progress; + QSubjectLecture qSubjectLecture = QSubjectLecture.subjectLecture; + + Subject objSubject = this.read(subjectId); + + Tuple progress = this.getQueryFactory() + .select(qProgress.progressPercent.sum().as(qProgress.progressPercent), qProgress.progressValue.sum().as(qProgress.progressValue)).from(qProgress, qSubjectLecture).where(qProgress.learnerId.eq(ClientUtils.getUserId()) + .and(qProgress.targetId.eq(qSubjectLecture.lectureId)) + .and(qProgress.deleteFlag.isFalse()).and(qSubjectLecture.deleteFlag.isFalse()).and(qSubjectLecture.subjectId.eq(subjectId)) + .and(qProgress.type.eq(Progress.PROGRESS_TYPE_LECTURE))).fetchOne(); + + Map<String, Object> subjectInfo = new HashMap<String, Object>(7); + + subjectInfo.put("name", objSubject.getName()); + subjectInfo.put("subjectId", subjectId); + subjectInfo.put("schoolYear", objSubject.getSchoolYear()); + subjectInfo.put("term", objSubject.getTerm()); + subjectInfo.put("coverPageUrl", objSubject.getCoverPageUrl()); + subjectInfo.put("teacherName", objSubject.getTeacherName()); + + + Map<String, Object> openSubjectDetail = this.openSubjectDetail(subjectId); + + Map<String, Object> map = new HashMap<String, Object>(7); + + // 直播数量 + map.put("mediaVideoLiveCount", openSubjectDetail.get("mediaVideoLiveCount")); + + // 课件数量 + map.put("subjectLectureCount", openSubjectDetail.get("subjectLectureCount")); + + //学习人次 + map.put("studyCount", openSubjectDetail.get("studyCount")); + + subjectInfo.put("content", openSubjectDetail.get("content")); + + // 已观看完成课件数量 + map.put("subjectLectureDoCount", openSubjectDetail.get("subjectLectureDoCount")); + + map.put("subjectInfo", subjectInfo); + + if (openSubjectDetail.get("subjectLectureCount") == null || progress == null || progress.get(qProgress.progressPercent) == null) { + subjectInfo.put("progressPercent", 0); + } else { + subjectInfo.put("progressPercent", progress.get(qProgress.progressPercent).floatValue() / (Long) openSubjectDetail.get("subjectLectureCount")); + } + subjectInfo.put("progressValue", progress == null ? 0 : progress.get(qProgress.progressValue)); + + return map; + } + + @Override + public Map<String, Object> mySubjectInfo(String subjectId, String classId) { + QMySubjectV qMySubjectV = QMySubjectV.mySubjectV; + QMyLectureV qMyLectureV = QMyLectureV.myLectureV; + + // 课程 + Tuple tuple = this.getQueryFactory() + .select(qMySubjectV.id.subjectId, qMySubjectV.subjectName, qMySubjectV.term, qMySubjectV.schoolYear, qMySubjectV.origSubjectId, + qMySubjectV.percent, qMySubjectV.coverPageUrl, qMySubjectV.progressValue) + .from(qMySubjectV) + .where(qMySubjectV.id.classId.eq(classId).and(qMySubjectV.id.userId.eq(ClientUtils.getUserId())) + .and(qMySubjectV.id.subjectId.eq(subjectId))) + .fetchOne(); + + Subject objSubject = this.read(subjectId); + + Map<String, Object> subject = new HashMap<String, Object>(5); + subject.put("name", objSubject.getName()); + subject.put("subjectId", subjectId); + subject.put("origSubjectId", objSubject.getOrigSubjectId()); + subject.put("schoolYear", objSubject.getSchoolYear()); + subject.put("term", objSubject.getTerm()); + subject.put("coverPageUrl", objSubject.getCoverPageUrl()); + subject.put("content", this.readSubjectContent(subjectId)); + subject.put("teacherName", objSubject.getTeacherName()); + if (tuple == null) { + subject.put("progressPercent", 0); + subject.put("progressValue", 0); + } else { + subject.put("progressPercent", tuple.get(qMySubjectV.percent)); + subject.put("progressValue", tuple.get(qMySubjectV.progressValue)); + } + + String origSubjectId = objSubject.getOrigSubjectId(); + + // 考试统计 + long examsCount = this.examService.listStudentExamCount("", new String[]{classId}, origSubjectId, null); + + // 作业统计 + long homeworksCount = exerciseInfoService.queryStuExerciseListCount("", null, ClientUtils.getUserId(), origSubjectId, null); + + // 课件统计 + Tuple tupleLecture = this.getQueryFactory().select(qMyLectureV.count(), + new CaseBuilder().when(qMyLectureV.percent.gt(0.95)).then(1).otherwise(0).sum()).// 大于95%算完成 + from(qMyLectureV) + .where(qMyLectureV.classId.eq(classId).and(qMyLectureV.id.userId.eq(ClientUtils.getUserId())) + .and(qMyLectureV.subjectId.eq(subjectId))) + .groupBy(qMyLectureV.subjectId).fetchOne(); + + long mediaVideoLivesCount = this.mediaLiveService.listCount("", new String[]{classId}, origSubjectId, null); + + return CollectionUtils.newObjectMap("mediaVideoLivesCount", mediaVideoLivesCount, "examsCount", examsCount, + "homeworksCount", homeworksCount, "subjectInfo", subject, "lectureCount", + tupleLecture == null ? 0 : tupleLecture.get(0, Long.class), + "completeLectureCount", tupleLecture == null ? 0 : tupleLecture.get(1, Integer.class)); + } + + /** + * 公开课列表 + * + * @param pageNum + * @param pageSize + * @param keyword + * @return + */ + public Map<String, Object> openSubjectList(Integer pageNum, Integer pageSize, String keyword) { + QOpenSubjectV qOpenSubjectV = QOpenSubjectV.openSubjectV; + + JPAQuery<OpenSubjectV> query = this.getQueryFactory().selectFrom(qOpenSubjectV).where(qOpenSubjectV.subjectName.like("%" + keyword + "%")); + + long count = query.fetchCount(); + + List<Map<String, Object>> listData = query.orderBy(qOpenSubjectV.mediaVideoCount.desc(), + qOpenSubjectV.learnerCount.desc(), qOpenSubjectV.createTime.desc()).limit(pageSize).offset(pageNum) + .fetch().stream().map(tuple -> { + Map<String, Object> map = new HashMap<String, Object>(8); + + map.put("name", tuple.getSubjectName()); + map.put("subjectId", tuple.getSubjectId()); + map.put("schoolYear", tuple.getSchoolYear()); + map.put("term", tuple.getTerm()); + map.put("coverPageUrl", tuple.getCoverPageUrl()); + map.put("mediaVideoCount", tuple.getMediaVideoCount()); + map.put("learnerCount", tuple.getLearnerCount()); + map.put("createTime", tuple.getCreateTime()); + + return map; + }).collect(Collectors.toList()); + + return CollectionUtils.newObjectMap("count", count, "listData", listData); + } + + /** + * 班级学员课件总体进度 + * + * @param subjectId + * @param classId + * @return + */ + @Override + public List<Map<String, Object>> studentSubjectLectureProgress(String subjectId, String classId) { + QMyLectureV qMyLectureV = QMyLectureV.myLectureV; + + return this.getQueryFactory() + .select(qMyLectureV.lectureName, qMyLectureV.id.lectureId, qMyLectureV.lectureType, + qMyLectureV.chapterId, qMyLectureV.subjectId, qMyLectureV.lectureCreateTime, + qMyLectureV.percent.avg().as(qMyLectureV.percent)) + .from(qMyLectureV).where(qMyLectureV.classId.eq(classId).and(qMyLectureV.subjectId.eq(subjectId))) + .groupBy(qMyLectureV.id.lectureId).orderBy(qMyLectureV.lectureCreateTime.desc()).fetch().stream() + .map(tuple -> { + Map<String, Object> map = new HashMap<String, Object>(6); + map.put("lectureName", tuple.get(qMyLectureV.lectureName)); + map.put("lectureId", tuple.get(qMyLectureV.id.lectureId)); + map.put("lectureType", tuple.get(qMyLectureV.lectureType)); + map.put("chapterId", tuple.get(qMyLectureV.chapterId)); + map.put("subjectId", tuple.get(qMyLectureV.subjectId)); + map.put("progressPercent", tuple.get(qMyLectureV.percent)); + map.put("createTime", tuple.get(qMyLectureV.lectureCreateTime)); + return map; + }).collect(Collectors.toList()); + } + + /** + * 学员课程作业进度 + * + * @param classId + * @param subjectId + * @return + */ + public Map<String, Object> studentSubjectHomeworkProgress(String classId, String subjectId, String studentId) { + QExerciseResultV qHomeworkScoreV = QExerciseResultV.exerciseResultV; + + StuStudent student = read(StuStudent.class, studentId); + Subject subject = read(Subject.class, subjectId); + + Tuple tuple = this.getQueryFactory() + .select(qHomeworkScoreV.subjectId, qHomeworkScoreV.count(), + new CaseBuilder() + .when(qHomeworkScoreV.completeStatus.eq(ExerciseCompleteInfo.STATUS_CHECKED) + .or(qHomeworkScoreV.completeStatus.eq(ExerciseCompleteInfo.STATUS_COMMIT))) + .then(qHomeworkScoreV.studentScore).otherwise(BigDecimal.ZERO).sum(), + new CaseBuilder() + .when(qHomeworkScoreV.completeStatus.eq(ExerciseCompleteInfo.STATUS_CHECKED) + .or(qHomeworkScoreV.completeStatus.eq(ExerciseCompleteInfo.STATUS_COMMIT))) + .then(1).otherwise(0).sum()) + .from(qHomeworkScoreV) + .where(qHomeworkScoreV.subjectId.eq(subject.getOrigSubjectId()) + .and(qHomeworkScoreV.userId.eq(student.getUserId())) + .and(qHomeworkScoreV.exerciseStatus.eq(ExerciseInfo.EXERCISE_STATUS_PUBLISHED))) + .groupBy(qHomeworkScoreV.userId).fetchOne(); + + Map<String, Object> map = new HashMap<String, Object>(4); + if (tuple == null) { + map.put("subjectId", subjectId); + map.put("homeworkCount", 0); + map.put("avgScore", "0"); + map.put("commitHomeworkCount", 0); + } else { + int commitHomeworkCount = tuple.get(3, Integer.class) == null ? 0 : tuple.get(3, Integer.class); + map.put("subjectId", subjectId); + map.put("homeworkCount", tuple.get(1, Integer.class) == null ? 0 : tuple.get(1, Integer.class)); + map.put("avgScore", String.valueOf(commitHomeworkCount == 0 || tuple.get(2, BigDecimal.class) == null ? BigDecimal.ZERO : tuple.get(2, BigDecimal.class).divide(BigDecimal.valueOf(commitHomeworkCount), 2, BigDecimal.ROUND_HALF_UP))); + map.put("commitHomeworkCount", commitHomeworkCount); + } + + return map; + } + + /** + * 学员考试作业进度 + * + * @param classId + * @param subjectId + * @return + */ + public Map<String, Object> studentSubjectExamProgress(String classId, String subjectId, String studentId) { + QExamResultV qExamScoreV = QExamResultV.examResultV; + + StuStudent student = read(StuStudent.class, studentId); + Subject subject = read(Subject.class, subjectId); + + Tuple tuple = this.getQueryFactory().select(qExamScoreV.subjectId, qExamScoreV.count(), new CaseBuilder() + .when(qExamScoreV.status.eq("0")).then(BigDecimal.ZERO).otherwise(qExamScoreV.score).sum(), new CaseBuilder() + .when(qExamScoreV.status.eq("0")).then(0).otherwise(1).sum()). + from(qExamScoreV). + where(qExamScoreV.subjectId.eq(subject.getOrigSubjectId()).and(qExamScoreV.userId.eq(student.getUserId())).and(qExamScoreV.examStatus.eq(ExerciseInfo.EXERCISE_STATUS_PUBLISHED))). + groupBy(qExamScoreV.userId).fetchOne(); + Map<String, Object> map = new HashMap<String, Object>(4); + map.put("subjectId", subjectId); + if (tuple == null) { + map.put("examCount", 0); + map.put("avgScore", "0"); + map.put("commitExamCount", 0); + } else { + int commitExamCount = tuple.get(3, Integer.class) == null ? 0 : tuple.get(3, Integer.class); + + map.put("examCount", tuple.get(1, Integer.class) == null ? 0 : tuple.get(1, Integer.class)); + map.put("avgScore", String.valueOf(commitExamCount == 0 || tuple.get(2, BigDecimal.class) == null ? BigDecimal.ZERO : tuple.get(2, BigDecimal.class).divide(new BigDecimal(commitExamCount), 2, BigDecimal.ROUND_HALF_UP))); + map.put("commitExamCount", tuple.get(3, Integer.class) == null ? 0 : tuple.get(3, Integer.class)); + } + + return map; + } + + /** + * 我的课件情况 + * + * @param classId + * @return + */ + private List<Map<String, Object>> myLectureList(String classId) { + QMyLectureV qMyLectureV = QMyLectureV.myLectureV; + + return this.getQueryFactory().select(qMyLectureV.subjectId, + qMyLectureV.count(), + new CaseBuilder() + .when(qMyLectureV.percent.gt(0.95)).then(1).otherwise(0).sum()).//大于95%算完成 + from(qMyLectureV). + where(qMyLectureV.classId.eq(classId).and(qMyLectureV.id.userId.eq(ClientUtils.getUserId()))). + groupBy(qMyLectureV.subjectId).fetch().stream() + .map(tuple -> { + Map<String, Object> map = new HashMap<String, Object>(3); + map.put("subjectId", tuple.get(0, String.class)); + map.put("lectureCount", tuple.get(1, Integer.class)); + map.put("completeLectureCount", tuple.get(2, String.class)); + return map; + }).collect(Collectors.toList()); + } + + /** + * 我的课程,按时间排序 + * + * @param classId + * @return + */ + public List<Map<String, Object>> mySubjectList(String classId, Pager pager) { + //课程 + List<Map<String, Object>> clsSubjectlist = this.myClsSubjectlist(classId, ClientUtils.getUserId(), pager); + //课件统计 + List<Map<String, Object>> lectures = this.myLectureList(classId); + for (Map<String, Object> clsSubject : clsSubjectlist) { + String origSubjectId = (String) clsSubject.get("origSubjectId"); + clsSubject.put("exam", CollectionUtils.newObjectMap("examCount", this.examService.listStudentExamCount("", new String[]{classId}, origSubjectId, null))); + clsSubject.put("homework", CollectionUtils.newObjectMap("homeworkCount", exerciseInfoService.queryStuExerciseListCount("", null, ClientUtils.getUserId(), origSubjectId, null))); + clsSubject.put("lecture", CollectionUtils.newObjectMap("lectureCount", 0, "completeLectureCount", 0)); + clsSubject.put("mediaVideoLive", CollectionUtils.newObjectMap("mediaVideoLiveCount", this.mediaLiveService.listCount("", new String[]{classId}, origSubjectId, null))); + + this.setSubjectStatistics("lecture", clsSubject, lectures); + } + + return clsSubjectlist; + } + + /** + * 统计课程的数据 + * + * @param type 类型 + * @param clsSubject 课程 + * @param lstStatistics 统计信息 + */ + private void setSubjectStatistics(String type, Map<String, Object> clsSubject, List<Map<String, Object>> lstStatistics) { + if (lstStatistics != null && !lstStatistics.isEmpty()) { + for (Map<String, Object> statistics : lstStatistics) { + if (clsSubject.get("origSubjectId").equals(statistics.get("subjectId")) || clsSubject.get("subjectId").equals(statistics.get("subjectId"))) { + clsSubject.put(type, statistics); + } + } + } + + } + + /** + * 我的课程详情 + * + * @param classId + * @return + */ + public Map<String, Object> mySubjectInfo(String subjectId, String classId, HttpServletRequest request) { + + QMySubjectV qMySubjectV = QMySubjectV.mySubjectV; + QMyLectureV qMyLectureV = QMyLectureV.myLectureV; + Object userId = request.getSession().getAttribute("userId"); + // 课程 + Tuple tuple = this.getQueryFactory() + .select(qMySubjectV.id.subjectId, qMySubjectV.subjectName, qMySubjectV.term, qMySubjectV.schoolYear, qMySubjectV.origSubjectId, + qMySubjectV.percent, qMySubjectV.coverPageUrl, qMySubjectV.progressValue) + .from(qMySubjectV) + .where(qMySubjectV.id.classId.eq(classId).and(qMySubjectV.id.userId.eq(ClientUtils.getUserId())) + .and(qMySubjectV.id.subjectId.eq(subjectId))) + .fetchOne(); + + Subject objSubject = this.read(subjectId); + + Map<String, Object> subject = new HashMap<String, Object>(5); + subject.put("name", objSubject.getName()); + subject.put("subjectId", subjectId); + subject.put("origSubjectId", objSubject.getOrigSubjectId()); + subject.put("schoolYear", objSubject.getSchoolYear()); + subject.put("term", objSubject.getTerm()); + subject.put("coverPageUrl", objSubject.getCoverPageUrl()); + subject.put("content", this.readSubjectContent(subjectId)); + subject.put("teacherName", objSubject.getTeacherName()); + if (tuple == null) { + subject.put("progressPercent", 0); + subject.put("progressValue", 0); + } else { + subject.put("progressPercent", tuple.get(qMySubjectV.percent)); + subject.put("progressValue", tuple.get(qMySubjectV.progressValue)); + } + + String origSubjectId = objSubject.getOrigSubjectId(); + + // 考试统计 + long examsCount = this.examService.listStudentExamCount("", new String[]{classId}, origSubjectId, null); + + // 作业统计 + long homeworksCount = exerciseInfoService.queryStuExerciseListCount("", null, ClientUtils.getUserId(), origSubjectId, null); + + // 课件统计 + Tuple tupleLecture = this.getQueryFactory().select(qMyLectureV.count(), + new CaseBuilder().when(qMyLectureV.percent.gt(0.95)).then(1).otherwise(0).sum()).// 大于95%算完成 + from(qMyLectureV) + .where(qMyLectureV.classId.eq(classId).and(qMyLectureV.id.userId.eq(ClientUtils.getUserId())) + .and(qMyLectureV.subjectId.eq(subjectId))) + .groupBy(qMyLectureV.subjectId).fetchOne(); + + long mediaVideoLivesCount = this.mediaLiveService.listCount("", new String[]{classId}, origSubjectId, null); + + return CollectionUtils.newObjectMap("mediaVideoLivesCount", mediaVideoLivesCount, "examsCount", examsCount, + "homeworksCount", homeworksCount, "subjectInfo", subject, "lectureCount", + tupleLecture == null ? 0 : tupleLecture.get(0, Long.class), + "completeLectureCount", tupleLecture == null ? 0 : tupleLecture.get(1, Integer.class)); + } + + /** + * 我的课程按学期分类 + * + * @param classId + * @return + */ + @Override + public List<Map<String, Object>> myTermSubjectList(String classId) { + //课程 + List<Map<String, Object>> clsSubjectlist = this.mySubjectList(classId, new Pager()); + System.out.println("clsSubjectlistaaaaaa" + clsSubjectlist); + return this.termSubjectList(classId, clsSubjectlist); + } + + + /** + * 课程按学期分类 + * + * @param classId + * @return + */ + @Override + public List<Map<String, Object>> termSubjectList(String classId, List<Map<String, Object>> clsSubjectlist) { + //学期 + List<Map<String, Object>> termList = this.termList(classId); + + if (termList != null && !termList.isEmpty()) { + for (Map<String, Object> term : termList) { + if (termList != null && !termList.isEmpty()) { + List<Map<String, Object>> subjectList = new ArrayList<>(); + for (Map<String, Object> clsSubject : clsSubjectlist) { + if (term.get("schoolYear").equals(clsSubject.get("schoolYear")) && + term.get("term").equals(clsSubject.get("term"))) { + subjectList.add(clsSubject); + } + term.put("subjectList", subjectList); + } + } + } + } + return termList; + } + + + /** + * 查询课程关联的班级课程信息 + * + * @param classId + * @return + */ + @Override + public List<Map<String, Object>> querySubjectReClassInfos(String origSubjectId) { + String hql = "select s.subjectId as subjectId ,s.teacherId as teacherId,s.teacherName as teacherName," + + " s.schoolYear as schoolYear,s.term as term,c.classId as classId,c.name as className" + + " from Subject s ,ClsClassReSubject r ,ClsClass c where s.subjectId = r.subjectId " + + " and r.classId = c.classId and s.origSubjectId =:origSubjectId and s.deleteFlag is false"; + + return this.findListWithMapByHql(hql, CollectionUtils.newObjectMap("origSubjectId", origSubjectId)); + } }; -- Gitblit v1.8.0