package com.qxueyou.scc.teach.subject.service.impl; import java.util.List; import com.qxueyou.scc.admin.classes.model.ClsClassReSubject; import com.qxueyou.scc.admin.classes.service.IClassLectureService; import com.qxueyou.scc.teach.subject.model.Subject; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.Cacheable; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import com.qxueyou.scc.admin.classes.model.ClsSubjectLecture; import com.qxueyou.scc.admin.progress.model.Progress; import com.qxueyou.scc.admin.progress.model.view.SubjectProgressTreeV; import com.qxueyou.scc.admin.progress.service.IProgressService; import com.qxueyou.scc.base.model.Pager; import com.qxueyou.scc.base.model.Result; import com.qxueyou.scc.base.service.ICacheService; import com.qxueyou.scc.base.service.impl.CommonAppService; import com.qxueyou.scc.base.util.ClientUtils; import com.qxueyou.scc.base.util.CollectionUtils; import com.qxueyou.scc.base.util.TraceUtils; import com.qxueyou.scc.teach.res.model.Res; import com.qxueyou.scc.teach.res.service.IResService; import com.qxueyou.scc.teach.subject.model.SubjectChapter; import com.qxueyou.scc.teach.subject.model.SubjectLecture; import com.qxueyou.scc.teach.subject.model.view.LectureAudioV; import com.qxueyou.scc.teach.subject.model.view.LectureDocV; import com.qxueyou.scc.teach.subject.model.view.LectureVideoV; import com.qxueyou.scc.teach.subject.model.view.MyLectureV; import com.qxueyou.scc.teach.subject.service.ILectureService; import com.qxueyou.scc.teach.subject.service.ISubjectService; import org.springframework.transaction.annotation.Transactional; @Service public class SubjectLectureService extends CommonAppService implements ILectureService { public static final String RES_LECTURE_CONVER_LST = "RES_LECTURE_CONVER_LST"; @Autowired ISubjectService subjectService; @Autowired IResService resService; @Autowired ICacheService cacheService; @Autowired IProgressService progressService; @Autowired IClassLectureService clsLectureService; @Override public Result addChapter(String subjectId, String parentChapterId, String name) { SubjectChapter chapter = new SubjectChapter(); TraceUtils.setCreateTrace(chapter); chapter.setName(name); chapter.setParentChapterId(parentChapterId); chapter.setSubjectId(subjectId); save(chapter); return new Result(true, "success", CollectionUtils.newObjectMap("id", chapter.getChapterId(), "name", name)); } @Override public Result updateChapter(String chapterId, String name) { SubjectChapter chapter = read(SubjectChapter.class, chapterId); TraceUtils.setUpdateTrace(chapter); chapter.setName(name); save(chapter); return new Result(true, "success", CollectionUtils.newObjectMap("id", chapter.getChapterId(), "name", name)); } @Override public Result deleteChapter(String[] chapterIds) { for (String chapterId : chapterIds) { deleteChapter(chapterId); } return new Result(true, "success"); } /** * 删除单个章节 * * @param chapterId * 章节id * @return */ private Result deleteChapter(String chapterId) { SubjectChapter chapter = read(SubjectChapter.class, chapterId); TraceUtils.setUpdateTrace(chapter); chapter.setDeleteFlag(true); save(chapter); Result result = this.deleteCourseware4Chapter(chapterId); if (!result.isSuccess()) { return result; } return new Result(true, "success"); } private Result deleteCourseware4Chapter(String chapterId) { this.bulkUpdate("update SubjectLecture set deleteFlag = true where chapterId = ?", new String[] { chapterId }); return new Result(true); } @Override public List doGetListChapter(String subjectId, String parentChapterId) { List result = getListChapter(subjectId, parentChapterId); if (result.isEmpty() && StringUtils.isEmpty(parentChapterId)) { return CollectionUtils.newList(SubjectChapter.class, initLectureChapter(subjectId)); } return result; } @Override public List getChapterTreeVList(String subjectId, String parentChapterId) { if (parentChapterId == null) { return progressService.getSubjectChapterTreeVList(subjectId, ClientUtils.getUserId()); } return progressService.getSubjectChapterTreeVList(parentChapterId, ClientUtils.getUserId()); } /** * 初始化 * * @param subjectId * @return */ private SubjectChapter initLectureChapter(String subjectId) { SubjectChapter chapter = new SubjectChapter(); TraceUtils.setCreateTrace(chapter); chapter.setName("根节点"); chapter.setSubjectId(subjectId); chapter.setParentChapterId(SubjectChapter.ROOT_CHAPTER_ID); save(chapter); return chapter; } @Override public Result addLecture(String chapterId, String resId) { SubjectChapter chapter = read(SubjectChapter.class, chapterId); Res res = resService.read(resId); SubjectLecture lecture = new SubjectLecture(); TraceUtils.setCreateTrace(lecture); lecture.setChapterId(chapterId); lecture.setLectureType(res.getType()); lecture.setName(res.getName()); lecture.setStatus(res.getStatus()); lecture.setRemark(res.getRemark()); lecture.setSubjectId(chapter.getSubjectId()); lecture.setResItemId(res.getResId()); save(lecture); subjectService.addLectureCount(lecture.getSubjectId(), 1); return new Result(true, "success"); } @Override public Result addLectureLoad(String sectionId){ SubjectChapter chapter = read(SubjectChapter.class, sectionId); String hql = "from Subject where subjectId = ? and deleteFlag is false"; String subjectId = chapter.getSubjectId(); Subject subjectOne = findUnique(hql,CollectionUtils.newList(subjectId),Subject.class); String hqlOne = "from Subject where name = ? and deleteFlag is false"; List subjectTwo = find(hqlOne,CollectionUtils.newList(subjectOne.getName()),Subject.class); for (Subject s : subjectTwo){ String hqlTwo = "from ClsClassReSubject where subjectId = ? and deleteFlag is false"; ClsClassReSubject subject = findUnique(hqlTwo,CollectionUtils.newList(s.getSubjectId()),ClsClassReSubject.class); if(subject != null){ subjectService.updateClsSubject(subject.getClassId(),s.getSubjectId(),s.getOrigSubjectId(),s.getTeacherId(),s.getSchoolYear(),s.getTerm()); } } return new Result(true, "success"); } @Override public Result updateLecture(String lectureId, String resId) { SubjectLecture lecture = read(SubjectLecture.class, lectureId); Res res = resService.read(resId); TraceUtils.setUpdateTrace(lecture); lecture.setLectureType(res.getType()); lecture.setName(res.getName()); lecture.setRemark(res.getRemark()); lecture.setResItemId(res.getResId()); save(lecture); return new Result(true, "success"); } @Override public Result deleteLecture(String[] lectureIds) { for (String lectureId : lectureIds) { deleteLecture(lectureId); } return new Result(true, "success"); } @Override public Result deleteLectureLoad(String[] lectureIds){ SubjectLecture lecture = read(SubjectLecture.class, lectureIds[0]); String hql = "from Subject where subjectId = ? and deleteFlag is false"; String subjectId = lecture.getSubjectId(); Subject subjectOne = findUnique(hql,CollectionUtils.newList(subjectId),Subject.class); String hqlOne = "from Subject where name = ? and deleteFlag is false"; List subjectTwo = find(hqlOne,CollectionUtils.newList(subjectOne.getName()),Subject.class); for (Subject s : subjectTwo){ String hqlTwo = "from ClsClassReSubject where subjectId = ? and deleteFlag is false"; ClsClassReSubject subject = findUnique(hqlTwo,CollectionUtils.newList(s.getSubjectId()),ClsClassReSubject.class); if(subject != null){ subjectService.updateClsSubject(subject.getClassId(),s.getSubjectId(),s.getOrigSubjectId(),s.getTeacherId(),s.getSchoolYear(),s.getTerm()); } } return new Result(true, "success"); } /** * * @param lectureId * 课件id * @return */ private Result deleteLecture(String lectureId) { SubjectLecture lecture = read(SubjectLecture.class, lectureId); TraceUtils.setUpdateTrace(lecture); lecture.setDeleteFlag(true); save(lecture); subjectService.addLectureCount(lecture.getSubjectId(), -1); return new Result(true, "success"); } @Override public Result doCopyLecture(String lectureId, String destChapterId, String name) { // TODO Auto-generated method stub return null; } @Override public Result doMoveLecture(String lectureId, String destChapterId, String name) { // TODO Auto-generated method stub return null; } @Override public List listLecture(String chapterId, String keyword, Integer pageSize, Integer pageNum, String type) { StringBuffer hql = new StringBuffer("from SubjectLecture where chapterId=? and name like ? and deleteFlag is false"); List args = CollectionUtils.newList(chapterId,'%' + keyword.trim() + '%'); if (StringUtils.isNotEmpty(type)) { hql.append(" and lectureType=?"); args.add(type); } List result = findList(hql.toString(), new Pager(pageSize, pageNum), args, SubjectLecture.class); return result; } @Override public List listLectureV(String learnerId, String chapterId, String keyword, Integer pageSize, Integer pageNum, String type) { StringBuffer hql = new StringBuffer("from MyLectureV where chapterId=? and id.userId=?"); List args = CollectionUtils.newList(chapterId, learnerId); if (StringUtils.isNotEmpty(type)) { hql.append(" and lectureType=?"); args.add(type); } List result = findList(hql.toString(), new Pager(pageSize, pageNum), args, MyLectureV.class); return result; } @Override public List listLectureVBySubjectId(String learnerId, String subjectId, String keyword, Integer pageSize, Integer pageNum, String type) { StringBuffer hql = new StringBuffer("from MyLectureV where subjectId=? and id.userId=? order by lectureUpdateTime desc"); List args = CollectionUtils.newList(subjectId, learnerId); if (StringUtils.isNotEmpty(type)) { hql.append(" and lectureType=?"); args.add(type); } List result = findList(hql.toString(), new Pager(pageSize, pageNum), args, MyLectureV.class); return result; } @Override public int listLectureCount(String chapterId, String keyword, String type) { StringBuffer hql = new StringBuffer("from SubjectLecture where chapterId=? and name like ? and deleteFlag is false"); List args = CollectionUtils.newList(chapterId,'%' + keyword.trim() + '%'); if (StringUtils.isNotEmpty(type)) { hql.append(" and lectureType=?"); args.add(type); } return findCount(hql.toString(),args); } @Override public Result readLectureAccessPath(String lectureId, String attribute) { SubjectLecture lecture = read(SubjectLecture.class, lectureId); String resItemId = null; if(lecture == null) { resItemId = read(ClsSubjectLecture.class, lectureId).getResItemId();//班级课件 }else { resItemId = lecture.getResItemId(); } return resService.readAccessPath(resItemId, attribute); } @Override public SubjectLecture readLecture(String lectureId) { return read(SubjectLecture.class, lectureId); } @Override public SubjectChapter readChapter(String chapterId) { return read(SubjectChapter.class, chapterId); } @Override public List getListChapter(String subjectId, String parentChapterId) { StringBuffer hql = new StringBuffer( "from SubjectChapter where subjectId=? and deleteFlag is false and parentChapterId=?"); List args = CollectionUtils.newList(subjectId); if (StringUtils.isEmpty(parentChapterId)) { args.add(SubjectChapter.ROOT_CHAPTER_ID); } else { args.add(parentChapterId); } List result = find(hql.toString(), args, SubjectChapter.class); return result; } @Override public List listLectureBySubjectId(String subjectId) { String hql = "from SubjectLecture where subjectId=? and deleteFlag is false"; List result = find(hql, CollectionUtils.newList(subjectId), SubjectLecture.class); return result; } /** * 监控resId转码状态同步Lecture的状态 */ @Scheduled(cron = "0/2 * * * * ?") // 每2秒执行一次 public void doTimer() { String resId = cacheService.lstLeftPop(RES_LECTURE_CONVER_LST); if (StringUtils.isBlank(resId)) { return; } Res res = read(Res.class, resId); if (res.getStatus().equals(Res.STATUS_DRAFT)) { String[] resIds = resId.split(","); bulkUpdate( "update SubjectLecture set status = 'draft' where deleteFlag is false and status = 'conver' and resItemId = ?", resIds); bulkUpdate( "update ClsSubjectLecture set status = 'draft' where deleteFlag is false and status = 'conver' and resItemId = ?", resIds); return; } cacheService.lstRightPush(RES_LECTURE_CONVER_LST, resId); } @Override public Result doStudy(String lectureId, Double from, Double to) { String userId = null; return progressService.addProgress(Progress.PROGRESS_TYPE_LECTURE, lectureId, from.intValue(), to.intValue(), userId); } @Cacheable(value = "LectureVideoV", key = "#lectureId") @Override public LectureVideoV readVideoLecture(String lectureId) { return read(LectureVideoV.class, lectureId); } @Cacheable(value = "LectureAudioV", key = "#lectureId") @Override public LectureAudioV readAudioLecture(String lectureId) { return read(LectureAudioV.class, lectureId); } @Override public List getAllChapterBySubjectId(String subjectId) { String hql = "from SubjectChapter where deleteFlag is false and subjectId = ? order by createTime"; return find(hql, CollectionUtils.newList(subjectId), SubjectChapter.class); } @Override public LectureDocV readDocLecture(String lectureId) { return read(LectureDocV.class, lectureId); } }