| | |
| | | import com.qxueyou.scc.teach.subject.model.SubjectChapter; |
| | | |
| | | /** |
| | | * 课程服务 |
| | | * 课程服务 |
| | | * |
| | | * @author 德虎 |
| | | * @author 德虎 |
| | | * |
| | | */ |
| | | @Service |
| | |
| | | private static final String OPERATE_TYPE_STOP = "Stop"; |
| | | |
| | | /** |
| | | * 依赖注入 |
| | | * 依赖注入 |
| | | * |
| | | * @param lessonDAO |
| | | */ |
| | |
| | | } |
| | | |
| | | /** |
| | | * 定时发布、停用 |
| | | * 定时发布、停用 |
| | | */ |
| | | @Override |
| | | public Result doVideoIssueStop() { |
| | | |
| | | doVideoIssue(); // 发布未发布的视频 |
| | | //doVideoStop(); // 停用已过期的视频 |
| | | doVideoIssue(); // 发布未发布的视频 |
| | | //doVideoStop(); // 停用已过期的视频 |
| | | |
| | | return new Result(true); |
| | | } |
| | | |
| | | /** |
| | | * 定时发布 |
| | | * 定时发布 |
| | | */ |
| | | @SuppressWarnings("unused") |
| | | public Result doVideoIssue() { |
| | | |
| | | Date now = new Date(); |
| | | |
| | | // 查询未发布的视频 ---- 只有草稿状态的视频才能发布 |
| | | // 查询未发布的视频 ---- 只有草稿状态的视频才能发布 |
| | | String hql = "from MediaVideo where deleteFlag is false and status = ? and startTime <= ? and endTime > ? "; |
| | | List<MediaVideo> mediaLst = this.find(hql, CollectionUtils.newList(MediaVideo.STATUS_DRAFT,now,now), MediaVideo.class); |
| | | |
| | | // for (MediaVideo mediaVideo : mediaLst) { |
| | | // // 发送消息 发布视频 |
| | | // // 发送消息 发布视频 |
| | | // sendMsgVideoIssueStop(OPERATE_TYPE_ISSUE, mediaVideo.getVideoId()); |
| | | // } |
| | | // |
| | |
| | | |
| | | Date now = new Date(); |
| | | |
| | | // 查询已过期的视频 ---- 只有已发布的视频才能停用 |
| | | // 查询已过期的视频 ---- 只有已发布的视频才能停用 |
| | | String hql = "from MediaVideo where deleteFlag is false and status = ? and endTime <= ?"; |
| | | List<MediaVideo> mediaLst = this.find(hql, CollectionUtils.newList(MediaVideo.STATUS_PUBLISHED,now), MediaVideo.class); |
| | | |
| | | // for (MediaVideo mediaVideo : mediaLst) { |
| | | // // 发送消息 停用视频 |
| | | // // 发送消息 停用视频 |
| | | // sendMsgVideoIssueStop(OPERATE_TYPE_STOP, mediaVideo.getVideoId()); |
| | | // } |
| | | return new Result(true); |
| | |
| | | |
| | | |
| | | /** |
| | | * 单个处理视频发布与上传 |
| | | * 单个处理视频发布与上传 |
| | | */ |
| | | @SuppressWarnings("unused") |
| | | @Override |
| | | public Result doSingleVideoIssueStop(String videoId,String operateType) { |
| | | |
| | | MediaVideo video = read(MediaVideo.class, videoId); |
| | | if(OPERATE_TYPE_ISSUE.equals(operateType)){ // 发布 |
| | | log.info("发布"); |
| | | if(OPERATE_TYPE_ISSUE.equals(operateType)){ // 发布 |
| | | log.info("发布"); |
| | | bulkUpdateInLoop("update MediaVideo set status = " + MediaVideo.STATUS_PUBLISHED + " where videoId = ? " ,new Object[] { videoId }); |
| | | bulkUpdateInLoop("update SchCourseware set status = " + MediaVideo.STATUS_PUBLISHED + " where id = ? " ,new Object[] { videoId }); |
| | | |
| | |
| | | // log.error("Lesson.sendMsg.videoId: " + video.getVideoId(), e); |
| | | // } |
| | | |
| | | }else if(OPERATE_TYPE_STOP.equals(operateType)){ // 停用 |
| | | log.info("停用"); |
| | | }else if(OPERATE_TYPE_STOP.equals(operateType)){ // 停用 |
| | | log.info("停用"); |
| | | bulkUpdateInLoop("update MediaVideo set status = " + MediaVideo.STATUS_TAKEOFF + " where videoId = ? " ,new Object[] { videoId }); |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | /** |
| | | * 添加视频 |
| | | * 添加视频 |
| | | */ |
| | | @Override |
| | | public Result insertVideo(MediaVideo video, String lessonId, boolean isCopy) { |
| | | |
| | | this.insertVideoSingle(video, lessonId, isCopy); |
| | | |
| | | // 将数据插入转码队列 |
| | | // 将数据插入转码队列 |
| | | mediaVideoService.insertVideoConverTask(video); |
| | | |
| | | // 调用本地转码服务 |
| | | // 调用本地转码服务 |
| | | //mediaVideoService.doFfmpegMediaTrascode(video.getVideoId(), video.getName()); |
| | | |
| | | return new Result(true, video.getVideoId()); |
| | | } |
| | | |
| | | /** |
| | | * 添加视频,不调用转码 |
| | | * 添加视频,不调用转码 |
| | | */ |
| | | @Override |
| | | public Result insertVideoSingle(MediaVideo video, String lessonId, boolean isCopy) { |
| | |
| | | if(isCopy){ |
| | | video.setStatus(video.getStatus() == MediaVideo.STATUS_PUBLISHED ?MediaVideo.STATUS_DRAFT: video.getStatus()); |
| | | }else{ |
| | | //jgw 暂时直接修改为 |
| | | //jgw 暂时直接修改为 |
| | | // video.setStatus(MediaVideo.STATUS_LINEUP); |
| | | video.setStatus(MediaVideo.STATUS_PUBLISHED); |
| | | } |
| | | |
| | | // 序号 |
| | | // 序号 |
| | | String hql = "select MAX(c.videoOrder) from MediaVideo c where c.deleteFlag is false and c.classId = ? "; |
| | | Integer iMax = this.findUnique(hql, CollectionUtils.newList(ClientUtils.getClassId()), Integer.class); |
| | | |
| | |
| | | |
| | | this.mediaVideoService.saveVideo(video); |
| | | |
| | | // 保存OrgText —— 视频详情 |
| | | // 保存OrgText —— 视频详情 |
| | | orgTextService.doSaveOrgText(video.getVideoId(), OrgText.TABLE_NAME_VIDEO, video.getRemark()); |
| | | |
| | | if(StringUtils.isNotBlank(lessonId)){ |
| | |
| | | this.save(re); |
| | | } |
| | | |
| | | //标记班级有视频 |
| | | //标记班级有视频 |
| | | ClsClass cls = read(ClsClass.class, ClientUtils.getClassId()); |
| | | if(cls!=null&&cls.getHaveVideo()==ClsClass.NOT_HAVE_VIDEO){ |
| | | cls.setHaveVideo(ClsClass.HAVE_VIDEO); |
| | |
| | | } |
| | | |
| | | /** |
| | | * 批量发布视频 |
| | | * 批量发布视频 |
| | | */ |
| | | @Override |
| | | public Result doStartVideos(String videoIds) { |
| | | |
| | | if(StringUtils.isEmpty(videoIds)){ |
| | | return new Result(false, "参数错误"); |
| | | return new Result(false, "参数错误"); |
| | | } |
| | | String[] ids = videoIds.split(","); |
| | | boolean resultFlag = false; |
| | |
| | | } |
| | | } |
| | | |
| | | // // 发送消息 |
| | | // // 发送消息 |
| | | // ONSMsg msg = new ONSMsg(onsProducer.getTopic()); |
| | | // msg.put("msgType", "VIDEO_PUBLISH"); |
| | | // msg.put("videoIds", videoIds); |
| | |
| | | } |
| | | |
| | | /** |
| | | * 发布视频 |
| | | * 发布视频 |
| | | */ |
| | | public Result doStartVideo(String videoId) { |
| | | |
| | | MediaVideo video = read(MediaVideo.class, videoId); |
| | | |
| | | if( video.getStatus() == MediaVideo.STATUS_DRAFT || video.getStatus() == MediaVideo.STATUS_TAKEOFF || video.getStatus() == MediaVideo.STATUS_PUBLISHED){ // 草稿、已下架 |
| | | if( video.getStatus() == MediaVideo.STATUS_DRAFT || video.getStatus() == MediaVideo.STATUS_TAKEOFF || video.getStatus() == MediaVideo.STATUS_PUBLISHED){ // 草稿、已下架 |
| | | |
| | | TraceUtils.setUpdateTrace(video); |
| | | video.setStatus(MediaVideo.STATUS_PUBLISHED); |
| | |
| | | } |
| | | |
| | | /** |
| | | * 批量停用视频 |
| | | * 批量停用视频 |
| | | */ |
| | | @Override |
| | | public Result doStopVideos(String videoIds) { |
| | | if(StringUtils.isEmpty(videoIds)){ |
| | | return new Result(false, "参数错误"); |
| | | return new Result(false, "参数错误"); |
| | | } |
| | | boolean resultFlag = false; |
| | | |
| | |
| | | } |
| | | |
| | | /** |
| | | * 停用视频 |
| | | * 停用视频 |
| | | */ |
| | | public Result doStopVideo(String videoId) { |
| | | |
| | | MediaVideo video = read(MediaVideo.class, videoId); |
| | | |
| | | if(video.getStatus() == MediaVideo.STATUS_PUBLISHED){ // 已发布 |
| | | if(video.getStatus() == MediaVideo.STATUS_PUBLISHED){ // 已发布 |
| | | |
| | | TraceUtils.setUpdateTrace(video); |
| | | video.setStatus(MediaVideo.STATUS_TAKEOFF); |
| | |
| | | return new Result(true); |
| | | }else{ |
| | | |
| | | return new Result(false,"视频已发布状态才能停用视频"); |
| | | return new Result(false,"视频已发布状态才能停用视频"); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 添加视频 |
| | | * 添加视频 |
| | | */ |
| | | @Override |
| | | public Result insertOrgVideo(MediaVideo video, String collegeCourseId, boolean isCopy) { |
| | |
| | | video.setOriginVideoId(video.getVideoId()); |
| | | mediaVideoService.saveVideo(video); |
| | | |
| | | // 保存OrgText —— 视频详情 |
| | | // 保存OrgText —— 视频详情 |
| | | orgTextService.doSaveOrgText(video.getVideoId(), OrgText.TABLE_NAME_VIDEO, video.getRemark()); |
| | | |
| | | // 序号 |
| | | // 序号 |
| | | hql = "select MAX(c.videoOrder) from MediaVideoReCourse c where c.deleteFlag is false and c.collegeCourseId = ? "; |
| | | Integer iMax = this.findUnique(hql, CollectionUtils.newList(collegeCourseId), Integer.class); |
| | | |
| | |
| | | save(course); |
| | | |
| | | //mediaVideoService.doFfmpegMediaTrascode(video.getVideoId(), video.getName()); |
| | | // 将数据插入转码队列 |
| | | // 将数据插入转码队列 |
| | | mediaVideoService.insertVideoConverTask(video); |
| | | |
| | | // TODO 不自动指定给自己 |
| | | // TODO 不自动指定给自己 |
| | | // insertAppointSelfOrg(video.getVideoId(), ClientUtils.getOrgId(),collegeCourseId); |
| | | Result result = new Result(true,video.getVideoId()); |
| | | result.addData("count", count+1); |
| | |
| | | |
| | | public Result insertAppointOrgVideo(String videoIds[], String orgIds[], String classIds[]) { |
| | | if(videoIds.length == 0){ |
| | | return new Result(false,"参数错误"); |
| | | return new Result(false,"参数错误"); |
| | | } |
| | | //预先按videoId和OrgId查询mediavideoreCourse表,需要把当前机构ID也放进lstOrgIds一起查 |
| | | //预先按videoId和OrgId查询mediavideoreCourse表,需要把当前机构ID也放进lstOrgIds一起查 |
| | | List<String> lstOrgIds0 = Arrays.asList(orgIds); |
| | | List<String> lstOrgIds = new ArrayList<String>(); |
| | | lstOrgIds.addAll(lstOrgIds0); |
| | |
| | | for (MediaVideoReCourse mediaVideoReCourse : lstMediaCourse) { |
| | | videoOrgCourseMap.put(mediaVideoReCourse.getVideoId()+mediaVideoReCourse.getOrgId(), mediaVideoReCourse); |
| | | } |
| | | if(orgIds.length!=0){ // 添加管理员视频 |
| | | if(orgIds.length!=0){ // 添加管理员视频 |
| | | insertOrgVideo(videoIds,orgIds,videoOrgCourseMap); |
| | | } |
| | | if(classIds.length!=0){ // 添加班级视频 |
| | | if(classIds.length!=0){ // 添加班级视频 |
| | | insertClassVideo(videoIds,classIds,ClientUtils.getOrgId(),videoOrgCourseMap); |
| | | } |
| | | |
| | |
| | | Map<String,MediaVideo> videoMap = new HashMap<String, MediaVideo>(); |
| | | Map<String,MediaVideo> originVideoMap = new HashMap<String, MediaVideo>(); |
| | | Map<String,SchClassSubject> origSubjectMap = new HashMap<String, SchClassSubject>(); |
| | | //章节id |
| | | //章节id |
| | | List<String> lstCharpteIds = new ArrayList<String>(); |
| | | Map<String,SubjectChapter> origChapterMap = new HashMap<String, SubjectChapter>(); |
| | | List<String> keys = new ArrayList<String>(); |
| | |
| | | } |
| | | keys.add(mediaVideo.getVideoId()); |
| | | } |
| | | //查询所有originVideoId对应的mediaVideo |
| | | //查询所有originVideoId对应的mediaVideo |
| | | hql = " from MediaVideo where originVideoId in (:originVideoIds) and deleteFlag is false and classId in (:classIds)"; |
| | | args = new HashMap<String, Object>(); |
| | | args.put("originVideoIds", lstOriginVideoIds.toArray()); |
| | |
| | | for (String clsId : classIds) { |
| | | for (String videoId : videoIds) { |
| | | MediaVideo video = videoMap.get(videoId); |
| | | MediaVideo mv = originVideoMap.get(video.getOriginVideoId()+clsId); // 判断当前班级有没有这个视频 |
| | | MediaVideo mv = originVideoMap.get(video.getOriginVideoId()+clsId); // 判断当前班级有没有这个视频 |
| | | if (mv == null) { |
| | | SchClassSubject clsSubject = origSubjectMap.get(clsId+video.getSubjectId()); |
| | | mv = new MediaVideo(); |
| | |
| | | mv.setChapterId(null); |
| | | } |
| | | } catch (Exception e) { |
| | | log.error("视频下发到班级BeanUtils.copyProperties()方法copy失败", e); |
| | | log.error("视频下发到班级BeanUtils.copyProperties()方法copy失败", e); |
| | | } |
| | | TraceUtils.setCreateTrace(mv); |
| | | this.mediaVideoService.saveVideo(mv); |
| | | |
| | | OrgText oldOrgText = (OrgText) orgTextMap.get(video.getVideoId()); // 插入OrgText |
| | | OrgText oldOrgText = (OrgText) orgTextMap.get(video.getVideoId()); // 插入OrgText |
| | | orgTextService.doInsertOrgText(mv.getVideoId(), OrgText.TABLE_NAME_VIDEO, oldOrgText != null ? oldOrgText.getContent() : video.getRemark()); |
| | | } |
| | | } |
| | | //标记班级有视频 |
| | | //标记班级有视频 |
| | | ClsClass cls = read(ClsClass.class, clsId); |
| | | if(cls!=null&&cls.getHaveVideo()==ClsClass.NOT_HAVE_VIDEO){ |
| | | cls.setHaveVideo(ClsClass.HAVE_VIDEO); |
| | |
| | | @Override |
| | | public Result deleteVideos(String videoIds) { |
| | | if(StringUtils.isEmpty(videoIds)){ |
| | | return new Result(false, "参数错误"); |
| | | return new Result(false, "参数错误"); |
| | | } |
| | | |
| | | String[] ids = videoIds.split(","); |
| | |
| | | } |
| | | } |
| | | |
| | | // 转码记录 |
| | | // 转码记录 |
| | | bulkUpdateInLoop("update MediaVideoTrans set deleteFlag = true where videoId = ?", lst.toArray()); |
| | | this.bulkUpdateInLoop("update SchCourseware set deleteFlag=1 where id=?", lst.toArray()); |
| | | |
| | |
| | | |
| | | if(MediaVideo.STATUS_TAKEOFF == v.getStatus()){ |
| | | if(null != video.getStartTime() && video.getStartTime().before(new Date()) |
| | | && null != video.getEndTime() && !video.getEndTime().before(new Date())){ // video.getStartTime()在new Date()之前返回true,否则返回false |
| | | && null != video.getEndTime() && !video.getEndTime().before(new Date())){ // video.getStartTime()在new Date()之前返回true,否则返回false |
| | | |
| | | v.setStatus(MediaVideo.STATUS_PUBLISHED); |
| | | } |
| | |
| | | |
| | | if(MediaVideo.STATUS_PUBLISHED == v.getStatus()&&null != video.getEndTime() && video.getEndTime().before(new Date()) |
| | | && null != video.getStartTime() && video.getStartTime().before(new Date())){ |
| | | // video.getEndTime()在new Date()之前 |
| | | // video.getEndTime()在new Date()之前 |
| | | v.setStatus(MediaVideo.STATUS_TAKEOFF); |
| | | |
| | | } |
| | |
| | | v.setTeacherName(video.getTeacherName()); |
| | | this.mediaVideoService.saveVideo(v); |
| | | |
| | | // 保存OrgText —— 视频详情 |
| | | // 保存OrgText —— 视频详情 |
| | | orgTextService.doSaveOrgText(v.getVideoId(), OrgText.TABLE_NAME_VIDEO, video.getRemark()); |
| | | |
| | | String hql = " from MediaVideo where videoId!=? and deleteFlag is false and originVideoId = ?"; |
| | |
| | | |
| | | public Result deleteOrgVideo(String videoId, Integer delAll, String orgIds[], String classIds[]) { |
| | | if ((orgIds != null && orgIds.length != 0) || (classIds != null && classIds.length != 0)) { |
| | | // 删除需要回撤的视频 |
| | | // 删除需要回撤的视频 |
| | | return deleteAppoint(videoId, orgIds, classIds); |
| | | } |
| | | |
| | |
| | | video.setDeleteFlag(true); |
| | | this.mediaVideoService.saveVideo(video); |
| | | }*/ |
| | | // 用户选择同时删除下级视频 |
| | | // 用户选择同时删除下级视频 |
| | | if (delAll == 1) { |
| | | deleteSub(videoId,ClientUtils.getOrgId()); |
| | | |
| | |
| | | |
| | | @SuppressWarnings("unchecked") |
| | | private void deleteSub(String videoId,String currOrgId) { |
| | | // 机构层级视频是没有重新new ,查询出机构下级ID再删关联表 |
| | | // 机构层级视频是没有重新new ,查询出机构下级ID再删关联表 |
| | | String sql = " select oa.organization_id from organization as oa,organization ob " + |
| | | " where " + |
| | | " ob.ORGANIZATION_ID = ? " + |
| | |
| | | } |
| | | |
| | | MediaVideo video = read(MediaVideo.class, videoId); |
| | | // 班主任层面视频指定过后都是new 出来的,通过originVideoId 可以查出所有指定过去的视频 |
| | | // 班主任层面视频指定过后都是new 出来的,通过originVideoId 可以查出所有指定过去的视频 |
| | | hql = "select classId from ClsClass where orgId in (:orgIds) and deleteFlag is false"; |
| | | map = new HashMap<String, Object>(); |
| | | map.put("orgIds", orgIds.toArray()); |
| | |
| | | } |
| | | |
| | | /** |
| | | * 删除需要回撤的视频 |
| | | * 删除需要回撤的视频 |
| | | * |
| | | * @param videoId |
| | | * @param orgIds |
| | |
| | | */ |
| | | private Result deleteAppoint(String videoId, String orgIds[], String classIds[]) { |
| | | Map<String, Object> args = new HashMap<String, Object>(); |
| | | // 删除需要回撤的机构视频 |
| | | // 删除需要回撤的机构视频 |
| | | if (orgIds.length != 0) { |
| | | |
| | | String hql = " from MediaVideoReCourse where videoId = :videoId and deleteFlag is false and orgId in (:orgIds) and orgId != :currOrgId"; |
| | |
| | | } |
| | | } |
| | | |
| | | // 删除需要回撤的班主任视频 |
| | | // 删除需要回撤的班主任视频 |
| | | if (classIds.length != 0) { |
| | | args = new HashMap<String, Object>(); |
| | | args.put("videoId", videoId); |
| | |
| | | } |
| | | |
| | | /** |
| | | * 课程表列表 |
| | | * 课程表列表 |
| | | * |
| | | * @return |
| | | */ |
| | |
| | | } |
| | | |
| | | /** |
| | | * 根据直播查询讲师 |
| | | * 根据直播查询讲师 |
| | | * |
| | | * @param orgTeacherId |
| | | * @return |
| | |
| | | } |
| | | |
| | | /** |
| | | * 分享课程页面的全部课程表 |
| | | * 分享课程页面的全部课程表 |
| | | * |
| | | * @param classId |
| | | * @return |
| | |
| | | String hql = " from SchClassSchedule where deleteFlag is false and classId = ? order by startTime"; |
| | | List<SchClassSchedule> classScheduleLst = find(hql, CollectionUtils.newList(classId), SchClassSchedule.class); |
| | | |
| | | // 组装课表信息内容 |
| | | // 组装课表信息内容 |
| | | Map<String, Object> nowLesson = new HashMap<String, Object>(5); |
| | | nowLesson.put("beginWeek", ""); |
| | | nowLesson.put("lessonCount", classScheduleLst.size()); |
| | |
| | | nowLesson.put("endTime", cls.getEndTime()); |
| | | |
| | | if (!classScheduleLst.isEmpty()) { |
| | | // 班级开始时间在课程开始时间之后 |
| | | // 班级开始时间在课程开始时间之后 |
| | | if (cls.getStartTime().compareTo(classScheduleLst.get(0).getStartTime()) > 0) { |
| | | nowLesson.put("startTime", classScheduleLst.get(0).getStartTime()); |
| | | } |
| | | // 班级结束时间在课程结束时间之前 |
| | | // 班级结束时间在课程结束时间之前 |
| | | if (cls.getEndTime().compareTo(classScheduleLst.get(classScheduleLst.size() - 1).getEndTime()) < 0) { |
| | | nowLesson.put("endTime", classScheduleLst.get(classScheduleLst.size() - 1).getEndTime()); |
| | | } |
| | |
| | | map.put("teacher", schedule.getTeacher()); |
| | | map.put("mode", schedule.getMode()); |
| | | |
| | | if (new Date().compareTo(schedule.getEndTime()) > 0) { // 当前时间在结束时间之后 - 已经上过的课 |
| | | if (new Date().compareTo(schedule.getEndTime()) > 0) { // 当前时间在结束时间之后 - 已经上过的课 |
| | | |
| | | map.put("classStyle", "go-out"); |
| | | } else { // 正在上或还没上的课 |
| | | if (index == 0) { // 正在上的课 |
| | | } else { // 正在上或还没上的课 |
| | | if (index == 0) { // 正在上的课 |
| | | map.put("classStyle", "now"); |
| | | index++; |
| | | |
| | | // 组装课表信息内容 |
| | | // 组装课表信息内容 |
| | | Calendar cal = Calendar.getInstance(); |
| | | cal.setTime(schedule.getStartTime()); |
| | | int begin_week = cal.get(Calendar.DAY_OF_WEEK); |
| | |
| | | nowLesson.put("beginWeek", str_begin_week); |
| | | nowLesson.put("beginTime", schedule.getStartTime()); |
| | | |
| | | } else { // 还没上的课 |
| | | } else { // 还没上的课 |
| | | map.put("classStyle", "future"); |
| | | } |
| | | } |
| | |
| | | } |
| | | mv.addObject("nowLesson", nowLesson); |
| | | mv.addObject("lessons", lstMap); |
| | | mv.addObject("mode", newwork>0&&faceToface>0?"线上、线下":newwork>0&&faceToface==0?"线上":"线下"); |
| | | mv.addObject("mode", newwork>0&&faceToface>0?"线上、线下":newwork>0&&faceToface==0?"线上":"线下"); |
| | | return new Result(true); |
| | | } |
| | | } |