package com.qxueyou.scc.stucontroller; import java.util.*; import java.util.concurrent.TimeUnit; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.qxueyou.scc.base.dao.CommonDAO; import com.qxueyou.scc.base.model.Pager; import com.qxueyou.scc.config.IpUtils; import com.qxueyou.scc.sdk.MTCloud; import com.qxueyou.scc.teach.live.model.AccessLog; import com.qxueyou.scc.teach.live.utils.RedisCache; import com.qxueyou.scc.teach.student.model.StuStudent; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.qxueyou.scc.admin.classes.model.ClsClass; import com.qxueyou.scc.admin.classes.service.IClassService; import com.qxueyou.scc.base.model.Result; import com.qxueyou.scc.base.util.ClientUtils; import com.qxueyou.scc.base.util.CollectionUtils; import com.qxueyou.scc.base.util.QBeanUtils; import com.qxueyou.scc.teach.live.dao.MediaLiveDAO; import com.qxueyou.scc.teach.live.model.MediaVideoLive; import com.qxueyou.scc.teach.live.service.IMediaLiveService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import javax.servlet.http.HttpServletRequest; @Slf4j @Api(tags="直播接口-学员端") @RestController @CrossOrigin @RequestMapping(value = "/stu/live") public class StuLiveController { @Autowired IClassService classService; @Autowired IMediaLiveService liveService; @Autowired MediaLiveDAO dao; @Autowired RedisCache redisCache; @Autowired CommonDAO commonDAO; private final static short[] PUBLIC_LIVE_STATUS = new short[] { MediaVideoLive.STATUS_LIVE_LIVE,MediaVideoLive.STATUS_LIVE_PAUSE, MediaVideoLive.STATUS_LIVE_STOP,MediaVideoLive.STATUS_LIVE_REVIEW }; /** * 获取直播列表 * @param classId 班级id * @return */ @ApiOperation(value = "获取直播列表", notes = "") @ApiImplicitParams({ @ApiImplicitParam(name = "classId", value = "班级id", required = true, paramType="query", dataType = "String"), @ApiImplicitParam(name = "status", value = "直播状态(2正在直播,5直播中的暂停状态,9停止直播,3回放)", required = true, paramType="query", dataType = "String"), }) @GetMapping(value = "list") public Result list(String classId, Short status) { short[] _status = null; if(status == null || status == 0) { _status = PUBLIC_LIVE_STATUS; }else { _status = new short[]{status}; } List liveIds = getLiveIdLst(StringUtils.isEmpty(classId)?ClientUtils.getClassId():classId); List lives = liveService.readByStatus(liveIds,_status); List> lst =QBeanUtils.listBean2ListMap(lives, CollectionUtils.newStringMap( "creator","creator", "startTime","startTime", "endTime","endTime", "updateTime","lastUpdateTime", "videoLiveId","videoLiveId", "name","name", "status","status", "hlsPullUrl","hlsPullUrl", "previewImgUrl","imgPath" )); //添加聊天室id if(lst!=null && lst.size()>0){ for(Map map:lst) { map.put("chatroomId", dao.getChatRoomId((String)map.get("videoLiveId"))); } } return new Result(true, "success", CollectionUtils.newObjectMap("liveCount", lst==null?0:lst.size(), "liveLst",lst)); } /** * 获取直播id * @param classId * @return */ private List getLiveIdLst(String classId) { List liveIds = new ArrayList(5); //获取班级列表及班级所在直播列表 if(StringUtils.isNotEmpty(classId)) { liveIds = dao.getClassLives(classId); }else { //查询学员所在的全部班级 List clsLst = classService.listMyClass(); Set ids = new HashSet(); for(ClsClass cls:clsLst) { ids.addAll(dao.getClassLives(cls.getClassId())); } liveIds.addAll(ids); } return liveIds; } /** * 查看直播明细 * @param couresId 直播id * @return */ @GetMapping(value = "view") public Result view(String couresId, String userId, String userName, String logId, HttpServletRequest request) throws Exception { String redisLiveUrl = redisCache.getCacheObject("LIVE_URL" + userId); AccessLog accessLog=new AccessLog(); if(StringUtils.isEmpty(logId)){ String ip = IpUtils.getIpAddr(request); String cityInfo = null; try { cityInfo = IpUtils.getCityInfo(ip); } catch (Exception e) { log.error("获取ip归属地信息失败!"); } accessLog.setCourseId(couresId); accessLog.setEnterTime(new Date()); accessLog.setType("guangxi"); accessLog.setName(userName); accessLog.setIp(ip); accessLog.setIpAttribution(cityInfo); accessLog.setCreateTime(new Date()); accessLog.setUpdateTime(new Date()); commonDAO.save(accessLog); } if (!StringUtils.isEmpty(redisLiveUrl)){ return new Result(true, "success",CollectionUtils.newObjectMap("url",redisLiveUrl,"log",accessLog.getLogId())); } MTCloud client = new MTCloud(); String userRole = null; HashMap options = new HashMap(); if(userId.equals("")){ userId= randomId(); } if(userName.equals("") || userName==null){ userName= "游客"; userRole=MTCloud.ROLE_GUEST; }else { userRole=MTCloud.ROLE_USER; } options.put("ssl", false); String res = client.courseAccess(couresId,userId,userName,userRole, 10000, options); JSONObject jsonObject = JSON.parseObject(res); if(jsonObject.getString("code").equals("0")){ JSONObject data = jsonObject.getJSONObject("data"); String liveUrl = (String) data.get("liveUrl"); StringBuffer redisLiveKey = new StringBuffer("LIVE_URL"); redisLiveKey.append(userId); redisCache.setCacheObject(redisLiveKey.toString(),liveUrl,5, TimeUnit.MINUTES); return new Result(true, "success",CollectionUtils.newObjectMap("url",liveUrl,"log",accessLog.getLogId())); } return new Result(false, jsonObject.getString("msg")); } @ApiOperation(value = "离开路演直播间") @GetMapping(value = "leaveRoadShow") public Result enterIntoRoadShow(String logId) { // System.out.println(logId); if(!StringUtils.isEmpty(logId)){ StringBuffer hql=new StringBuffer("from AccessLog where logId=?"); List args = CollectionUtils.newList(logId); AccessLog accessLogs = commonDAO.findUnique(hql.toString(), args, AccessLog.class); // System.out.println(accessLogs); accessLogs.setLeaveTime(new Date()); accessLogs.setUpdateTime(new Date()); commonDAO.update(accessLogs); return new Result(true,"退出成功"); } return new Result(false,"logId不能为空"); } public String randomId() { Random random=new Random(); String str=""; for (int i = 0; i <12; i++) { if(i==0){ //首位不能为0且数字取值区间为 [1,9] str+=(random.nextInt(9)+1); }else{ //其余位的数字的取值区间为 [0,9] str+=random.nextInt(10); } } return str; } }