Commit d3362571 by liangkaiping

copy

parent a564d591
# cloud-live
123
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>com.yizhi</groupId>
<artifactId>cloud-live</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.yizhi</groupId>
<artifactId>cloud-live-api</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<kotlin.version>1.4.10</kotlin.version>
</properties>
<dependencies>
<dependency>
<groupId>com.yizhi</groupId>
<artifactId>cloud-core</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.yizhi</groupId>
<artifactId>cloud-util</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.yizhi</groupId>
<artifactId>cloud-common-api</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
<plugin>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-plugin</artifactId>
<version>${kotlin.version}</version>
<executions>
<execution>
<id>compile</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>test-compile</id>
<phase>test-compile</phase>
<goals>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
<configuration>
<jvmTarget>1.8</jvmTarget>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<executions>
<execution>
<id>compile</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>testCompile</id>
<phase>test-compile</phase>
<goals>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
\ No newline at end of file
package com.yizhi.live.application.constant;
import java.util.Arrays;
import java.util.List;
/**
* @Date 2020/9/23 8:21 下午
* @Author lvjianhui
**/
public enum EvenType {
COURSE_UP(1L, Arrays.asList(1, 2)),
COURSE_FINISH(2L, Arrays.asList(1, 2)),
ENROLL_START(3L, Arrays.asList(1, 3, 4, 5)),
TRAINING_AUDIT_PASS(4L, Arrays.asList(1, 3, 4, 5)),
TRAINING_AUDIT_FAIL(5L, Arrays.asList(1, 3, 4, 5)),
SIGN_SUCCESS(6L, Arrays.asList(1, 3, 4, 5)),
TRAINING_FINISH(7L, Arrays.asList(1, 3, 4, 5)),
ASSIGNMENT_AUDIT_FINISH(8L, Arrays.asList(1, 6, 7, 8)),
EXAM_AUDIT_FINISH(9L,Arrays.asList(1, 9, 10, 11)),
POINT_CHANGE(10L, Arrays.asList(1, 12, 13, 14));
private Long key;
private List<Integer> fieldType;
private EvenType(Long key, List<Integer> fieldType) {
this.key = key;
this.fieldType = fieldType;
}
public Long getKey() {
return this.key;
}
public List<Integer> getName() {
return this.fieldType;
}
}
package com.yizhi.live.application.constant;
public enum LiveStatusEnum {
LIVE(40,"开始直播"),
END(90,"直播结束"),
NO_START(10,"直播未开始"),
;
private int code;
private String desc;
LiveStatusEnum(int code, String desc) {
this.code = code;
this.desc = desc;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
package com.yizhi.live.application.feign;
import com.baomidou.mybatisplus.plugins.Page;
import com.yizhi.live.application.vo.*;
import com.yizhi.util.application.domain.BizResponse;
import io.swagger.annotations.ApiOperation;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
/**
* @Date 2020/12/9 1:42 下午
* @Author lvjianhui
**/
@FeignClient(name = "live", contextId = "LiveReplayClient")
public interface LiveReplayClient {
@GetMapping("/job/live/insert/replay")
@ApiOperation(value = "初始化已存在的直播回放")
public void insertLiveReplay();
@GetMapping("/remote/live/transfer/callback")
@ApiOperation(value = "直播转存成功,保利威回调接口")
public BizResponse<String> liveTransferCallback(@RequestBody PolyvLiveBackCallbackVo liveBackCallbackVo);
@PostMapping("/remote/live/replay/list")
@ApiOperation(value = "管理端根据直播间分页查询所有直播回放")
public Page<LiveReplayVo> getManageReplayList(@RequestBody LiveReviewsVo liveReviewsVo);
@PostMapping("/remote/live/replay/status/update")
@ApiOperation(value = "直播回放上架、下架")
public Boolean updateReplayStatus(@RequestBody LiveReplayOperationVo liveReplayOperationVo);
@PostMapping("/remote/live/replay/top/update")
@ApiOperation(value = "直播回放置顶")
public Boolean updateReplayTop(@RequestBody LiveReplayOperationVo liveReplayOperationVo);
@PostMapping("/remote/live/replay/info/update")
@ApiOperation(value = "直播回放信息修改")
public Boolean updateReplayInfo(@RequestBody LiveReplayInfoVo infoVo );
}
package com.yizhi.live.application.request;
import com.yizhi.core.application.context.RequestContext;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
* 直播回放列表查询
*/
@Data
@Api
public class LiveReleaseReviewReq {
@ApiModelProperty(value = "直播主题、主播名称")
private String title;
@ApiModelProperty(value = "上下文")
private RequestContext requestContext;
private int pageNo;
private int pageSize;
}
package com.yizhi.live.application.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
* @Author: XieHaijun
* @Description:
* @Date: Created in 15:57 2018/10/29
* @Modified By
*/
@Data
public class AccessLiveVO {
@ApiModelProperty(value = "要访问的直播id")
private List<Long> liveIds;
@ApiModelProperty(value = "要访问的直播的用户的组织id以及全部的上级id")
private List<Long> orgIds;
@ApiModelProperty(value = "要访问的直播的用户id集合")
private List<Long> userIds;
}
package com.yizhi.live.application.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
* @Date 2020/9/23 8:06 下午
* @Author lvjianhui
**/
@ApiModel
@Data
public class CalendarTaskParamVo {
@ApiModelProperty("时间参数")
public Date date;
@ApiModelProperty("业务类型")
public Integer taskType = 0;
@ApiModelProperty("当前页数")
public Integer pageNo;
@ApiModelProperty("页内条数")
public Integer pageSize;
}
/**
* FileName: LiveActivityResultVO
* Author: wenjunlong
* Date: 2018/6/27 20:22
* Description: 直播信息结果返回vo
* History:
* <author> <time> <version> <desc>
* 作者姓名 修改时间 版本号 描述
*/
package com.yizhi.live.application.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
* 〈一句话功能简述〉<br>
* 〈直播信息结果返回vo〉
*
* @author wenjunlong
* @create 2018/6/27
* @since 1.0.0
*/
@Data
public class LiveActivityResultVO {
private LiveActivityVO liveActivity;
List<ScopeAuthorizationVO> scopeAuthorizations;
@ApiModelProperty(value = "各个业务设置提醒时的数据")
private MessageRemindVo messageRemindVo;
}
package com.yizhi.live.application.vo;
import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.annotations.TableLogic;
import com.baomidou.mybatisplus.enums.FieldFill;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
* @Date 2020/9/29 6:13 下午
* @Author lvjianhui
**/
@Data
public class LiveActivityVO {
@ApiModelProperty(value = "主键")
private Long id;
@ApiModelProperty(value = "直播主题")
private String title;
@ApiModelProperty(value = "直播密码")
private String password;
@ApiModelProperty(value = "直播logo")
@TableField("logo_image")
private String logoImage;
@ApiModelProperty(value = "主播名称")
private String anchor;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@ApiModelProperty(value = "开始时间")
@TableField("start_time")
private Date startTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@ApiModelProperty(value = "结束时间")
@TableField("end_time")
private Date endTime;
@ApiModelProperty(value = "直播介绍")
private String description;
@ApiModelProperty(value = "可见范围 0 为站点 1 为可选范围")
private Integer scope;
@ApiModelProperty(value = "频道号")
private String channel;
@ApiModelProperty(value = "是否启用提醒 1:启用 0:关闭")
@TableField("enable_remind")
private Integer enableRemind;
@TableField(value = "create_by_id", fill = FieldFill.INSERT)
private Long createById;
@TableField(value = "create_by_name", fill = FieldFill.INSERT)
private String createByName;
@TableField(value = "create_time", fill = FieldFill.INSERT)
private Date createTime;
@ApiModelProperty(value = "企业")
@TableField("company_id")
private Long companyId;
@TableField("org_id")
private Long orgId;
@TableField("site_id")
private Long siteId;
@ApiModelProperty(value = "0 未上架 1 已上架 2 草稿")
private Integer shelves;
@ApiModelProperty(value = "secretKey")
@TableField("secret_key")
private String secretKey;
@ApiModelProperty(value = "keywords")
@TableField("keywords")
private String keywords;
@ApiModelProperty(value = "是否启用在日历任务中显示")
@TableField("enable_task")
private Integer enableTask;
@ApiModelProperty(value = "直播场景:alone: 活动拍摄 ; ppt: 三分屏; topclass: 大班课")
@TableField("scene")
private String scene;
@ApiModelProperty(value = "观看类型:0: 公开播放 ; 1: 站内授权播放; ")
@TableField("view_type")
private Integer viewType;
@TableLogic
@TableField("deleted")
private Integer deleted;
@ApiModelProperty(value = "直播回放开关状态 1: 开 0:关闭")
private Boolean replayStatus;
}
/**
* FileName: LiveAppIdVo
* Author: wenjunlong
* Date: 2018/4/24 15:12
* Description: 直播的账号
* History:
* <author> <time> <version> <desc>
* 作者姓名 修改时间 版本号 描述
*/
package com.yizhi.live.application.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 〈一句话功能简述〉<br>
* 〈直播的账号〉
*
* @author wenjunlong
* @create 2018/4/24
* @since 1.0.0
*/
@Data
public class LiveAppIdVo {
@ApiModelProperty(value = "对应app_id")
private String appId;
@ApiModelProperty(value = "对应app_secret")
private String appSecret;
}
/**
* FileName: LiveAppIdVo
* Author: wenjunlong
* Date: 2018/4/24 15:12
* Description: 直播的账号
* History:
* <author> <time> <version> <desc>
* 作者姓名 修改时间 版本号 描述
*/
package com.yizhi.live.application.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 直播在线人数
*/
@Data
public class LiveOnlineCountVo {
@ApiModelProperty(value = "channelId")
private String channelId;
@ApiModelProperty(value = "count")
private Integer count = 0;
@ApiModelProperty(value = "time")
private String time;
}
/**
* FileName: LiveQueryVO
* Author: wenjunlong
* Date: 2018/6/12 15:12
* Description: 查询对象传参
* History:
* <author> <time> <version> <desc>
* 作者姓名 修改时间 版本号 描述
*/
package com.yizhi.live.application.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
import java.util.List;
/**
* 〈一句话功能简述〉<br>
* 〈查询对象传参〉
*
* @author wenjunlong
* @create 2018/6/12
* @since 1.0.0
*/
@Data
public class LiveQueryVO {
@ApiModelProperty(value = "直播主题")
private String title;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@ApiModelProperty(value = "开始时间")
private Date startTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@ApiModelProperty(value = "结束时间")
private Date endTime;
@ApiModelProperty(value = "企业")
private Long companyId;
private List<Long> orgIds;
private Long siteId;
private Integer pageNo;
private Integer pageSize;
}
package com.yizhi.live.application.vo;
import com.yizhi.core.application.context.RequestContext;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
直播回放vo
*/
@Api
@Data
public class LiveReplayInfoVo {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "直播回放ID")
private Long replayId;
@ApiModelProperty(value = "是否使用本身封面;true是;false不是")
private Boolean defaultLogo;
@ApiModelProperty(value = "回放封面图")
private String replayLogoUrl;
@ApiModelProperty(value = "主播名称")
private String anchor;
@ApiModelProperty(value = "回放图片说明")
private String imageDesc;
private RequestContext context;
}
package com.yizhi.live.application.vo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
直播回放vo
*/
@Api
@Data
public class LiveReplayOperationVo {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "直播回放ID")
private Long replayId;
@ApiModelProperty(value = "操作")
private Boolean operation;
}
package com.yizhi.live.application.vo;
import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.enums.IdType;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
直播回放vo
*/
@Api
@Data
public class LiveReplayVo {
private static final long serialVersionUID = 1L;
private Long id;
@ApiModelProperty(value = "直播ID")
private Long liveId;
@ApiModelProperty(value = "直播计划开始时间")
private Date livePlanStartAt;
@ApiModelProperty(value = "直播logo url")
private String liveLogoUrl;
@ApiModelProperty(value = "主播名称")
private String liveAnchor;
@ApiModelProperty(value = "直播观看人数")
private Integer liveViewers;
@ApiModelProperty(value = "直播系统生成的id")
private String videoId;
@ApiModelProperty(value = "点播视频ID")
private String videoPoolId;
@ApiModelProperty(value = "回放视频对应的直播频道id")
private String channelId;
@ApiModelProperty(value = "视频标题")
private String title;
@ApiModelProperty(value = "视频首图")
private String firstImage;
@ApiModelProperty(value = "时长")
private String duration;
@ApiModelProperty(value = "回放排序")
private Integer rank;
@ApiModelProperty(value = "视频播放地址,注:如果视频为加密视频,则此地址无法访问")
private String url;
@ApiModelProperty(value = "liveType alone, ppt")
private String liveType;
@ApiModelProperty(value = "直播观看类型:0: 公开播放 ; 1: 站内授权播放; ")
private Integer viewType;
@ApiModelProperty(value = "是否使用本身封面图片;true:是;false:不是")
private Boolean defaultLogo;
@ApiModelProperty(value = "回放图片说明")
private String imageDesc;
@ApiModelProperty(value = "直播开始时间")
private Date startTime;
@ApiModelProperty(value = "直播回放状态 1: 上架 0:下架")
private Boolean liveReplayStatus;
@ApiModelProperty(value = "回放置顶时间")
private Date topTime;
@ApiModelProperty(value = "直播间主题")
private String liveTitle;
@ApiModelProperty(value = "直播默认图片地址")
private String liveDefaultLogoUrl;
}
package com.yizhi.live.application.vo;
import com.yizhi.core.application.context.RequestContext;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
* 直播回放列表查询
*/
@Data
@Api
public class LiveReviewListVo {
@ApiModelProperty(value = "直播主题、主播名称")
private String title;
@ApiModelProperty(value = "直播id")
private List<Long> liveIdList;
@ApiModelProperty(value = "上下文")
private RequestContext requestContext;
private int pageNo = 1;
private int pageSize = 10;
}
package com.yizhi.live.application.vo;
import com.yizhi.core.application.context.RequestContext;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 有直播回放的直播列表查询
*/
@Data
@Api
public class LiveReviewsVo {
@ApiModelProperty(value = "直播回放id")
private Long replayId;
@ApiModelProperty(value = "上下文")
private RequestContext requestContext;
@ApiModelProperty(value = "直播间id")
private Long liveId;
private int pageNo = 1;
private int pageSize = 10;
}
package com.yizhi.live.application.vo;
import lombok.Data;
/**
* 直播统计数据
*/
@Data
public class LiveStatisticDataVo {
private String channelId;
//频道名称
private String name;
//pc端播放时长,单位:分钟
private Integer pcPlayDuration;
//pc端播放流量,单位为Byte
private Integer pcFlowSize;
//pc视频播放量
private Integer pcVideoView;
//pc端唯一观众数
private Integer pcUniqueViewer;
//移动端播放时长,单位:分钟
private Integer mobilePlayDuration;
//移动端播放流量,单位为Byte
private Integer mobileFlowSize;
//移动端播放量
private Integer mobileVideoView;
//移动端唯一观众数
private Integer mobileUniqueViewer;
//PC直播播放时长,单位为分钟
private Integer livePcPlayDuration;
//PC回放播放时长,单位为分钟
private Integer playbackPcPlayDuration;
//移动端直播播放时长,单位为分钟
private Integer liveMobilePlayDuration;
//移动端回放播放时长,单位为分钟
private Integer playbackMobilePlayDuration;
//pc 其他 播放时长,单位为分钟
private Integer unknownPcPlayDuration;
//移动端其他 播放时长,单位为分钟
private Integer unknownMobilePlayDuration;
}
package com.yizhi.live.application.vo;
import lombok.Data;
@Data
public class LiveTitleVo {
private String channelId;
private Long liveId;
private String title;
}
/**
* FileName: LiveTokenVo
* Author: wenjunlong
* Date: 2018/4/26 9:44
* Description: 直播token生成记录
* History:
* <author> <time> <version> <desc>
* 作者姓名 修改时间 版本号 描述
*/
package com.yizhi.live.application.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
* 〈一句话功能简述〉<br>
* 〈直播token生成记录〉
*
* @author wenjunlong
* @create 2018/4/26
* @since 1.0.0
*/
@Data
public class LiveTokenVo {
private Long createById;
private String createByName;
private Date createTime;
@ApiModelProperty(value = "频道号")
private String channel;
}
package com.yizhi.live.application.vo;
import com.yizhi.core.application.context.RequestContext;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* @Date 2020/9/23 8:14 下午
* @Author lvjianhui
**/
@Data
public class MessageRemindVo implements Serializable {
private static final long serialVersionUID = -7621642684091133619L;
@ApiModelProperty("提醒id ")
private Long id;
@ApiModelProperty("消息id")
private Long messageId;
@ApiModelProperty("消息类型:1、自定义消息;2、系统消息;3、事件触发消息")
private Integer messageType;
@ApiModelProperty("用户id 主要用于触发消息 个人完成发消息类型")
private Long accountId;
@ApiModelProperty("消息内容(完整版)")
private String messageContext;
@ApiModelProperty("关联模块类型(1:学习计划、2:考试、3:调研、4、投票5:报名、6:作业、7:签到、8:项目、9:直播、10:积分)")
private Integer relationType;
@ApiModelProperty("关联的业务id: 比如调研id")
private Long relationId;
@ApiModelProperty("发送方式:1、站内信;2、短信;3、邮件")
private Integer sendType;
@ApiModelProperty("该业务提醒是被关闭,关闭则为true,默认false")
private Boolean hasDeleted = false;
@ApiModelProperty("该业务提醒是否有变化,有则为true,默认false")
private Boolean isChangge = false;
@ApiModelProperty("专门存放提醒时间设置")
private List<MessageTaskRemindVo> messageTaskRemindVos = new ArrayList();
@ApiModelProperty("目前只有培训项目需要,计划同步项目可见范围")
private Boolean visibleRangeUpdate = false;
@ApiModelProperty("指定范围(0:全平台,1:指定用户)")
private Integer visibleRange;
@ApiModelProperty("业务参数对象")
private TaskVo taskVo;
@ApiModelProperty("触发消息专用 发送时间")
private Date sendTime;
@ApiModelProperty("是否设置为上架状态")
private Boolean hasUp = false;
@ApiModelProperty("是否是 修改业务状态 ")
private Boolean taskStatusUpdate = false;
@ApiModelProperty("业务状态 1:才允上架许发送(业务上架)0:不允许发送(业务非上架) 仅针对于系统消息")
private Integer taskStatus;
@ApiModelProperty("上下文 必传,主要需要 siteId companyId accountId accountName 都不能是空")
private RequestContext requestContext;
@ApiModelProperty("调研是否为复制类型")
private Boolean isCopy = false;
@ApiModelProperty("复制调研时,旧的调研id")
private Long oldRelationId;
}
package com.yizhi.live.application.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* @Date 2020/9/23 8:16 下午
* @Author lvjianhui
**/
@Data
public class MessageTaskRemindVo implements Serializable {
@ApiModelProperty("待发消息id")
private Long messageRemindId;
@ApiModelProperty("提醒时间事件类型 1:业务开始时间、 2:业务结束时间、3:自定义时间")
private Integer timeEventType;
@ApiModelProperty("发生时间枚举:1:五分钟前、2:十分钟前、3:三十分钟前、4:一个小时前、5:两个小时前、6:一天前、7:两天前")
private Integer timeType;
@ApiModelProperty("最终发送时间")
private Date sendTime;
}
package com.yizhi.live.application.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.util.StringUtils;
import java.util.Date;
public class PageLiveVo {
@ApiModelProperty(value = "主键")
private Long id;
@ApiModelProperty(value = "直播主题")
private String title;
@ApiModelProperty(value = "直播密码")
private String password;
@ApiModelProperty(value = "直播logo")
private String logoImage;
@ApiModelProperty(value = "主播名称")
private String anchor;
@ApiModelProperty(value = "开始时间")
private Date startTime;
@ApiModelProperty(value = "结束时间")
private Date endTime;
@ApiModelProperty(value = "直播状态 ")
private String status;
@ApiModelProperty(value = "频道号")
private String channel;
@ApiModelProperty(value = "0 未上架 1 已上架")
private Integer shelves;
@ApiModelProperty(value = "可见范围 0全平台 1指定用户")
private Integer scope;
@ApiModelProperty(value = "直播介绍")
private String description;
@ApiModelProperty(value = "0 公开直播。1:站内直播")
private Integer viewType;
@ApiModelProperty(value = "直播在学人数")
private Integer onlineCount;
private Integer liveStatus;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getLogoImage() {
return logoImage;
}
public void setLogoImage(String logoImage) {
this.logoImage = logoImage;
}
public String getAnchor() {
return anchor;
}
public void setAnchor(String anchor) {
this.anchor = anchor;
}
public Date getStartTime() {
return startTime;
}
public void setStartTime(Date startTime) {
this.startTime = startTime;
}
public Date getEndTime() {
return endTime;
}
public void setEndTime(Date endTime) {
this.endTime = endTime;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getChannel() {
return channel;
}
public void setChannel(String channel) {
this.channel = channel;
}
public Integer getShelves() {
return shelves;
}
public void setShelves(Integer shelves) {
this.shelves = shelves;
}
public Integer getScope() {
return scope;
}
public void setScope(Integer scope) {
this.scope = scope;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Integer getViewType() {
return viewType;
}
public void setViewType(Integer viewType) {
this.viewType = viewType;
}
public Integer getOnlineCount() {
return onlineCount;
}
public void setOnlineCount(Integer onlineCount) {
this.onlineCount = onlineCount;
}
public Integer getLiveStatus() {
if (StringUtils.isEmpty(this.status)){
return 10;
}else {
return Integer.valueOf(this.status);
}
}
public void setLiveStatus(Integer liveStatus) {
this.liveStatus = liveStatus;
}
}
package com.yizhi.live.application.vo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 直播回放回调
*/
@Data
@Api
public class PolyvLiveBackCallbackVo {
@ApiModelProperty(value = "频道ID")
private String channelId;
@ApiModelProperty(value = "转存成功的视频ID")
private String vid;
@ApiModelProperty(value = "视频标题")
private String title;
@ApiModelProperty(value = "视频时长 格式为 hh:mm:ss")
private String duration;
@ApiModelProperty(value = "视频文件大小,单位为byte")
private Long fileSize;
@ApiModelProperty(value = "13位的时间戳")
private long timestamp;
@ApiModelProperty(value = "校验的加密字符串,生成的规则md5(AppSecret+timestamp),AppSecret是直播系统的用密匙")
private String sign;
@ApiModelProperty(value = "录制的场次和时间对应的数组字符串,格式:[\"20190703145126,4,fdqbopvtnv\",\"20190703145126,8,fdqbopvtnv\"] ,其中:\"20190703145126,4,fdqbopvtnv\" 第一个字段是开始时间,第二个字段是直播的时长,第三个是对应的sessionId。")
private String sessionIds;
@ApiModelProperty(value = "回放对应的单个场次id")
private String sessionIs;
@ApiModelProperty(value = "转存对应的录制文件id")
private String filedId;
@ApiModelProperty(value = "转存回放唯一的id")
private String videoId;
@ApiModelProperty(value = "录制来源。manual-云录制,auto-自动录制,merge-合并,clip-裁剪")
private String origin;
@ApiModelProperty(value = "用户id")
private String userId;
@ApiModelProperty(value = "转存成功返回success")
private String status;
@ApiModelProperty(value = "录制文件地址")
private String fileUrl;
@ApiModelProperty(value = "文件类型,m3u8或者mp4")
private String format;
@ApiModelProperty(value = "录制唯一的id")
private String fileId;
@ApiModelProperty(value = "该字段只对开启云录制功能有用),值为 'Y',表示该场直播录制同时存在云录制和自动录制,值为\"N\",该场直播只有自动录制")
private String hasRtcRecord;
}
package com.yizhi.live.application.vo;
import lombok.Data;
@Data
public class PolyvResponseVo<T> {
private int code;
private String status;
private String message;
private T data;
}
package com.yizhi.live.application.vo;
import com.baomidou.mybatisplus.annotations.TableField;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @Date 2020/9/29 6:15 下午
* @Author lvjianhui
**/
@Data
public class ScopeAuthorizationVO {
@ApiModelProperty(value = "主键")
private Long id;
@ApiModelProperty(value = "账号id")
@TableField("account_id")
private Long accountId;
@ApiModelProperty(value = "直播活动id")
@TableField("live_id")
private Long liveId;
@ApiModelProperty(value = "1.部门、2.用户")
private Integer type;
@TableField("site_id")
private Long siteId;
@TableField("name")
private String name;
@ApiModelProperty(value = "用户名")
@TableField(exist = false)
private String fullName;
@ApiModelProperty(value = "工号")
@TableField(exist = false)
private String workNum;
}
package com.yizhi.live.application.vo;
import com.yizhi.live.application.constant.EvenType;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* @Date 2020/9/23 8:17 下午
* @Author lvjianhui
**/
@Data
public class TaskVo implements Serializable {
@ApiModelProperty("业务名称")
private String taskName;
@ApiModelProperty("业务开始时间")
private Date taskStratTime;
@ApiModelProperty("业务结束时间")
private Date taskEndTime;
@ApiModelProperty("业务得分")
private Double taskScore;
@ApiModelProperty("业务发生原因(主要用于积分)")
private String reason;
@ApiModelProperty("业务时间(主要用于积分)")
private Date taskTime;
@ApiModelProperty("事件类型")
private EvenType evenType;
}
package com.yizhi.live.application.vo;
import java.util.List;
import com.yizhi.core.application.context.RequestContext;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 2019/09/19
* @author wangfeida
*
*/
@Data
public class VisibleRangeExport {
@ApiModelProperty(name="bizId",value="具体业务id")
private Long bizId;
@ApiModelProperty(name="bizName",value="具体业务名字")
private String bizName;
@ApiModelProperty(name="个人ID集合",value="个人id集合")
private List<Long> accountIds;
@ApiModelProperty(name="组织ID集合",value="组织ID集合")
private List<Long> orgIds;
@ApiModelProperty(name="上下文对象",value="上下文对象")
private RequestContext context;
}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>com.yizhi</groupId>
<artifactId>cloud-live</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.yizhi</groupId>
<artifactId>cloud-live-service</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.yizhi</groupId>
<artifactId>cloud-core</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.yizhi</groupId>
<artifactId>cloud-util</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.yizhi</groupId>
<artifactId>cloud-common-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.yizhi</groupId>
<artifactId>cloud-live-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.yizhi</groupId>
<artifactId>cloud-job-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.yizhi</groupId>
<artifactId>cloud-newMessage-api</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.yizhi</groupId>
<artifactId>cloud-orm</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.yizhi</groupId>
<artifactId>cloud-system-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
</project>
\ No newline at end of file
package com.yizhi.live.application;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.ComponentScan;
/**
*
* @author scotthu
*
* @date 2018年2月28日
*/
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients(basePackages = {"com.yizhi"})
@ComponentScan(basePackages = {"com.yizhi"})
public class LiveApplication {
public static void main(java.lang.String[] args) {
SpringApplication.run(LiveApplication.class, args);
}
}
package com.yizhi.live.application;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
/**
* @Author: shengchenglong
* @Date: 2018/3/6 14:30
*/
@Configuration
@EnableSwagger2
public class SwaggerConfig extends WebMvcConfigurerAdapter {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.groupName("后台直播管理端")
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.yizhi.live.application"))
.paths(PathSelectors.any())
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("直播管理端接口")
//版本
.version("1.0")
.build();
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("docs.html").addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
}
}
package com.yizhi.live.application.constant;
import com.alibaba.fastjson.JSONObject;
import lombok.Data;
import java.util.List;
/**
* @Date 2020/12/21 7:22 下午
* @Author lvjianhui
**/
@Data
public class PolyvCountVO {
private Integer pageNumber;
private Integer limit;
private Integer totalItems;
private List<JSONObject> contents;
}
package com.yizhi.live.application.constant;
import lombok.Data;
/**
* @Date 2020/12/22 2:05 上午
* @Author lvjianhui
**/
@Data
public class PolyvLiveCount {
private String channelId;
private String sessionId;
private Long startTime;
private Long endTime;
}
package com.yizhi.live.application.constant;
import com.alibaba.fastjson.JSONObject;
import lombok.Data;
/**
* @Date 2020/12/8 3:22 下午
* @Author lvjianhui
**/
@Data
public class PolyvResponseVO {
// 响应代码,成功为200,失败为400,签名错误为401,异常错误500
private Integer code;
// 成功为success,失败为error
private String status;
// 错误时为错误提示消息
private String message;
// 成功响应时业务数据
private JSONObject data;
}
package com.yizhi.live.application.constant;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @Date 2020/12/10 3:58 下午
* @Author lvjianhui
**/
@Data
public class PolyvUpdatePO {
@ApiModelProperty("对应系统的直播title")
private String name;
private String channelPasswd;
private String publisher;
private Long startTime;
private String desc;
}
package com.yizhi.live.application.constant;
public class UtilConstants {
public static final String APP_USER_ID = "ehat3jubx2";
public static final String APP_ID = "el100m1ent";
public static final String APP_SECRET = "84d3345d8de848d79635d7b16b03e028";
public static final String CREATE_CHANNEL_URL = "http://api.polyv.net/live/v2/channels/";
public static final String LIVE_STATUS_URL = "http://api.polyv.net/live/v2/channels/live-status";
public static final String LIVE_AUTH_UPDATE_URL = "http://api.polyv.net/live/v3/channel/auth/update";
public static final String LIVE_CHANNEL_SETTING_URL = "http://api.polyv.net/live/v2/channelSetting/%s/oauth-custom";
public static final String LIVE_CHANNELSETTING_URL = "http://api.polyv.net/live/v2/channelSetting/";
public static final String DEV_LIVE_CUSTOM_URI = "https://wenjl.vmceshi.com/manage/live/public/auth";
public static final String SIT_LIVE_CUSTOM_URI = "https://test.mg.kmelearning.com/web-manage/manage/live/public/auth";
public static final String UAT_LIVE_CUSTOM_URI = "https://uat.mg.kmelearning.com/web-manage/manage/live/public/auth";
public static final String PRO_LIVE_CUSTOM_URI = "https://mg.kmelearning.com/web-manage/manage/live/public/auth";
public static final String CHANNEL_TITLE_NAME_UPDATE = "http://api.polyv.net/live/v2/channels/%s/update";
public static final String CHANNEL_PASSWD_UPDATE = "http://api.polyv.net/live/v2/channels/%s/passwdSetting";
public static final String CHANNEL_ANCHOR_UPDATE = "http://api.polyv.net/live/v2/channelSetting/%s/setPublisher";
public static final String CHANNEL_DESC_UPDATE = "http://api.polyv.net/live/v2/channelSetting/%s/%s/set-menu";
public static final String CHANNEL_STARTDATE_UPDATE = "http://api.polyv.net/live/v2/channelSetting/%s/set-countdown";
public static final String CHANNEL_ALL_INFO_UPDATE = "http://api.polyv.net/live/v3/channel/basic/update?appId=%s&timestamp=%s&channelId=%s&sign=%s";
;
public static final String CHANNEL_SIMPLE_INFO_UPDATE = "http://api.polyv.net/live/v3/channel/detail/update";
public static final String LIVE_STATISTICS_BATCH_COUNT = "https://api.polyv.net/live/v2/statistics/get-realtime-viewers";
//查询直播实时在线人数
//批量查询直播实时在线人数
public static final String LIVE_STATISTICS_COUNT = "http://api.polyv.net/live/v1/statistics/%s/realtime";
//查询频道回放开关状态
public static final String LIVE_BACK_SWITCH_GET = "http://api.polyv.net/live/v3/channel/playback/get-enabled";
//查询回放视频库列表 %s=channelId
public static final String LIVE_REPLAY_LIST = "http://api.polyv.net/live/v2/channel/recordFile/%s/playback/list";
//批量查询视频某段时间内的统计数据 %s =userId
public static final String LIVE_CHANNELS_STATISTIC_DATA = "http://api.polyv.net/live/v2/statistics/%s/channel_summary";
//查询视频某段时间内的统计数据 %s =channelId
public static final String LIVE_CHANNEL_STATISTIC_DATA = "http://api.polyv.net/live/v2/statistics/%s/summary";
}
package com.yizhi.live.application.controller;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.plugins.Page;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.yizhi.application.orm.id.IdGenerator;
import com.yizhi.core.application.context.ContextHolder;
import com.yizhi.core.application.context.RequestContext;
import com.yizhi.live.application.domain.LiveActivity;
import com.yizhi.live.application.request.LiveReleaseReviewReq;
import com.yizhi.live.application.service.ILiveActivityService;
import com.yizhi.live.application.service.ILiveReplayService;
import com.yizhi.live.application.service.ILiveTokenService;
import com.yizhi.live.application.service.IScopeAuthorizationService;
import com.yizhi.live.application.vo.*;
import com.yizhi.util.application.domain.BizResponse;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
@Api(tags = "直播接口")
@RestController
@RequestMapping("/remote/live")
public class RemoteLiveController {
private static final Logger LOG = LoggerFactory.getLogger(RemoteLiveController.class);
@Autowired
ILiveActivityService liveActivityService;
@Autowired
IdGenerator idGenerator;
@Autowired
ILiveTokenService liveTokenService;
@Autowired
IScopeAuthorizationService scopeAuthorizationService;
@Autowired
ILiveReplayService replayService;
/**
* 查询近7天的已完成的直播(包含今天的)
*
* @return
*/
@GetMapping("/sevenDays/get")
public List<LiveActivity> findWithinSevenDaysLive() {
RequestContext rt = ContextHolder.get();
return liveActivityService.findWithinSevenDaysLive(rt.getCompanyId(), rt.getSiteId(), rt.getAccountId());
}
@GetMapping("/statistics/online/count/realtime")
@ApiOperation(value = "实时查询直播在线人数;多个频道用逗号隔开")
public List<LiveOnlineCountVo> liveCountOnlineRealTime(@RequestParam("channelIds") String channelIds) {
try {
return liveActivityService.getChannelOnlineCountRealTime(channelIds);
} catch (JsonProcessingException e) {
LOG.error("获取频道在线人数异常",e);
}
return new ArrayList<>();
}
/**
* 保利威回调接口 直播状态修改
* @param channelId 频道id
* @param status 直播状态 :live表示开始直播,end表示直播结束
*/
@GetMapping("/status/callback")
@ApiOperation(value = "直播状态改变,保利威回调接口")
public BizResponse liveStatusCallback(@RequestParam(value = "channelId") String channelId
,@RequestParam(value = "status") String status
,@RequestParam(value = "timestamp") Long timestamp
,@RequestParam(value = "sign") String sign
,@RequestParam(value = "sessionId") String sessionId
,@RequestParam(value = "startTime") String startTime
,@RequestParam(value = "endTime") String endTime) {
LOG.info("保利威直播状态回调;channelId={},status={},sign={},startTime={},endTime={},sessionId={}",channelId,status,sign,startTime,endTime,sessionId);
return liveActivityService.liveStatusCallback(channelId,status,timestamp,sign,sessionId,startTime,endTime);
}
@GetMapping("/transfer/callback")
@ApiOperation(value = "直播转存成功,保利威回调接口")
public BizResponse<String> liveTransferCallback(@RequestBody PolyvLiveBackCallbackVo liveBackCallbackVo) {
LOG.info("直播转存成功,保利威回调参数channelId = {};",liveBackCallbackVo.getChannelId());
return liveActivityService.liveTransferCallback(liveBackCallbackVo);
}
@GetMapping("/play/review/list")
@ApiOperation(value = "查询所有直播回放列表 废弃")
@Deprecated
public Page<LiveReplayVo> playReviewList(@RequestBody LiveReviewListVo liveReviewListVo) {
return null;
}
@GetMapping("/review/switch/on/live/list")
@ApiOperation(value = "查询有直播回放的直播间列表 废弃!!")
@Deprecated
public BizResponse<List<LiveTitleVo>> reviewLiveList(@RequestBody LiveReviewsVo liveReviewsVo) {
return liveActivityService.reviewLiveList(liveReviewsVo);
}
@GetMapping("/review/switch/on/live/page/list")
@ApiOperation(value = "分页查询有直播回放的直播间列表")
public Page<LiveTitleVo> getHasReplayLiveList(@RequestBody LiveReleaseReviewReq replayVo) {
return liveActivityService.getHasReplayLiveList(replayVo);
}
@GetMapping("/reviews/get")
@ApiOperation(value = "根据直播间查询上架的直播回放")
public BizResponse<List<LiveReplayVo>> reviewsList(@RequestBody LiveReviewsVo liveReviewsVo) {
return liveActivityService.reviewsList(liveReviewsVo);
}
@GetMapping("/review/one/get")
@ApiOperation(value = "查询直播回放详情")
public BizResponse<LiveReplayVo> getReview(@RequestParam(name = "replayId") Long replayId) {
return replayService.getReplay(replayId);
}
@PostMapping("/release/replay/list")
@ApiOperation(value = "查询所有上架的直播回放列表")
public Page<LiveReplayVo> getReleaseReplayList(@RequestBody LiveReleaseReviewReq reviewReq) {
return replayService.getReleaseReplayList(reviewReq);
}
@PostMapping("/replay/list")
@ApiOperation(value = "管理端根据直播间分页查询所有直播回放")
public Page<LiveReplayVo> getManageReplayList(@RequestBody LiveReviewsVo liveReviewsVo) {
Page<LiveReplayVo> page = liveActivityService.getReplayList(liveReviewsVo);
if (null == page){
return new Page<>(liveReviewsVo.getPageNo(),liveReviewsVo.getPageSize());
}
return page;
}
@PostMapping("/replay/status/update")
@ApiOperation(value = "直播回放上架、下架")
public Boolean updateReplayStatus(@RequestBody LiveReplayOperationVo liveReplayOperationVo) {
return liveActivityService.updateReplayStatus(liveReplayOperationVo.getReplayId(),liveReplayOperationVo.getOperation());
}
@PostMapping("/replay/top/update")
@ApiOperation(value = "直播回放置顶")
public Boolean updateReplayTop(@RequestBody LiveReplayOperationVo liveReplayOperationVo) {
return liveActivityService.updateReplayTop(liveReplayOperationVo.getReplayId(),liveReplayOperationVo.getOperation());
}
@PostMapping("/replay/info/update")
@ApiOperation(value = "直播回放信息修改")
public Boolean updateReplayInfo(@RequestBody LiveReplayInfoVo infoVo ) {
return liveActivityService.updateReplayInfos(infoVo);
}
}
\ No newline at end of file
package com.yizhi.live.application.controller;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.yizhi.live.application.domain.ScopeAuthorization;
import com.yizhi.live.application.service.IScopeAuthorizationService;
import com.yizhi.live.application.vo.VisibleRangeExport;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
@RestController
@RequestMapping("/manage/live/scope")
public class ScopeAuthorizationController {
@Autowired
IScopeAuthorizationService scopeAuthorizationService;
@GetMapping("/message/getList")
public VisibleRangeExport getListToMessage(@RequestParam("liveId") Long liveId) {
VisibleRangeExport vo = new VisibleRangeExport();
ScopeAuthorization range = new ScopeAuthorization();
range.setLiveId(liveId);
List<ScopeAuthorization> list = scopeAuthorizationService.selectList(new EntityWrapper<>(range));
if (!CollectionUtils.isEmpty(list)) {
List<Long> orgIds = new ArrayList<>(list.size());
List<Long> accountIds = new ArrayList<>(list.size());
for (ScopeAuthorization a : list) {
if (a.getType() == 1) {
orgIds.add(a.getAccountId());
} else {
accountIds.add(a.getAccountId());
}
}
vo.setAccountIds(accountIds);
vo.setOrgIds(orgIds);
}
return vo;
}
}
package com.yizhi.live.application.domain;
import com.baomidou.mybatisplus.activerecord.Model;
import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.annotations.TableLogic;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baomidou.mybatisplus.enums.FieldFill;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* <p>
* 直播活动表
* </p>
*
* @author fulan123
* @since 2018-04-10
*/
@Data
@Api(tags = "LiveActivity", description = "直播活动表")
@TableName("live_activity")
public class LiveActivity extends Model<LiveActivity> {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "主键")
private Long id;
@ApiModelProperty(value = "直播主题")
private String title;
@ApiModelProperty(value = "直播密码")
private String password;
@ApiModelProperty(value = "直播logo")
@TableField("logo_image")
private String logoImage;
@ApiModelProperty(value = "主播名称")
private String anchor;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@ApiModelProperty(value = "开始时间")
@TableField("start_time")
private Date startTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@ApiModelProperty(value = "结束时间")
@TableField("end_time")
private Date endTime;
@ApiModelProperty(value = "直播介绍")
private String description;
@ApiModelProperty(value = "可见范围 0 为站点 1 为可选范围")
private Integer scope;
@ApiModelProperty(value = "频道号")
private String channel;
@ApiModelProperty(value = "是否启用提醒 1:启用 0:关闭")
@TableField("enable_remind")
private Integer enableRemind;
@TableField(value = "create_by_id", fill = FieldFill.INSERT)
private Long createById;
@TableField(value = "create_by_name", fill = FieldFill.INSERT)
private String createByName;
@TableField(value = "create_time", fill = FieldFill.INSERT)
private Date createTime;
@ApiModelProperty(value = "企业")
@TableField("company_id")
private Long companyId;
@TableField("org_id")
private Long orgId;
@TableField("site_id")
private Long siteId;
@ApiModelProperty(value = "0 未上架 1 已上架 2 草稿")
private Integer shelves;
@ApiModelProperty(value = "secretKey")
@TableField("secret_key")
private String secretKey;
@ApiModelProperty(value = "keywords")
@TableField("keywords")
private String keywords;
@ApiModelProperty(value = "是否启用在日历任务中显示")
@TableField("enable_task")
private Integer enableTask;
@ApiModelProperty(value = "直播场景:alone: 活动拍摄 ; ppt: 三分屏; topclass: 大班课")
@TableField("scene")
private String scene;
@ApiModelProperty(value = "观看类型:0: 公开播放 ; 1: 站内授权播放; ")
@TableField("view_type")
private Integer viewType;
@TableLogic
@TableField("deleted")
private Integer deleted;
@ApiModelProperty(value = "排序")
@TableField("sort")
private Integer sort;
@ApiModelProperty(value = "直播状态 10:未开始 40:直播中 90:已结束")
@TableField("status")
private Integer status;
@ApiModelProperty(value = "直播回放开关状态 1: 开 0:关闭")
@TableField("replay_status")
private Boolean replayStatus;
@ApiModelProperty(value = "直播回放回调状态 1:已回调 0:未回调")
@TableField("replay_callback_status")
private Boolean replayCallbackStatus;
@Override
protected Serializable pkVal() {
return this.id;
}
@Override
public String toString() {
return "LiveActivity{" +
"id=" + id +
", title='" + title + '\'' +
", password='" + password + '\'' +
", logoImage='" + logoImage + '\'' +
", anchor='" + anchor + '\'' +
", startTime=" + startTime +
", endTime=" + endTime +
", description='" + description + '\'' +
", scope=" + scope +
", channel='" + channel + '\'' +
", createById=" + createById +
", createByName='" + createByName + '\'' +
", createTime=" + createTime +
", companyId=" + companyId +
", orgId=" + orgId +
", siteId=" + siteId +
", shelves=" + shelves +
", secretKey='" + secretKey + '\'' +
'}';
}
}
package com.yizhi.live.application.domain;
import com.baomidou.mybatisplus.activerecord.Model;
import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baomidou.mybatisplus.enums.FieldFill;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* <p>
* 直播生成的token保存
* </p>
*
* @author fulan123
* @since 2018-04-25
*/
@Data
@Api(tags = "LiveToken", description = "直播生成的token保存")
@TableName("live_token")
public class LiveToken extends Model<LiveToken> {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "主键")
private Long id;
@ApiModelProperty(value = "生成的token")
private String token;
@TableField(value = "create_by_id", fill = FieldFill.INSERT)
private Long createById;
@TableField(value = "create_by_name", fill = FieldFill.INSERT)
private String createByName;
@TableField(value = "create_time", fill = FieldFill.INSERT)
private Date createTime;
@Override
protected Serializable pkVal() {
return this.id;
}
}
package com.yizhi.live.application.domain;
import com.baomidou.mybatisplus.activerecord.Model;
import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.annotations.TableName;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
/**
* <p>
* 直播授权课件范围表
* </p>
*
* @author fulan123
* @since 2018-04-10
*/
@Data
@Api(tags = "ScopeAuthorization", description = "直播授权课件范围表")
@TableName("scope_authorization")
public class ScopeAuthorization extends Model<ScopeAuthorization> {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "主键")
private Long id;
@ApiModelProperty(value = "账号id")
@TableField("account_id")
private Long accountId;
@ApiModelProperty(value = "直播活动id")
@TableField("live_id")
private Long liveId;
@ApiModelProperty(value = "1.部门、2.用户")
private Integer type;
@TableField("site_id")
private Long siteId;
@TableField("name")
private String name;
@ApiModelProperty(value = "用户名")
@TableField(exist = false)
private String fullName;
@ApiModelProperty(value = "工号")
@TableField(exist = false)
private String workNum;
@Override
protected Serializable pkVal() {
return this.id;
}
}
package com.yizhi.live.application.enums;
public enum LiveStatus {
END(1L, "end"),//直播结束
LIVE(2L, "live"),//正在直播
NOT_START(3L, "notStart");//即将开始
private Long code;
private String name;
LiveStatus(Long code, String name) {
this.name = name;
this.code = code;
}
public Long getCode() {
return code;
}
public String getName() {
return name;
}
}
package com.yizhi.live.application.enums;
/**
* @Date 2020/12/21 6:22 下午
* @Author lvjianhui
**/
public enum LiveStatusV2 {
UN_START(10,"未开始"),
RUNNING(30,"直播中"),
REPLAY(40,"直播回放"),
END(90,"已结束");
private Integer code;
private String name;
LiveStatusV2(Integer code, String name) {
this.name = name;
this.code = code;
}
public Integer getCode() {
return code;
}
public String getName() {
return name;
}
}
package com.yizhi.live.application.enums;
public enum PolyvReqEnum {
APP_ID("appId","从API设置中获取,在直播系统登记的appId"),
TIMESTAMP("timestamp","当前13位毫秒级时间戳,3分钟内有效"),
SIGN("sign","签名,32位大写MD5值"),
CHANNEL_IDS("channelIds","多个频道ID,用逗号隔开"),
CHANNEL_ID("channelId","多个频道ID,用逗号隔开"),
LIVE("live","开始直播"),
END("end","直播结束"),
START_DATE("startDate","开始时间"),
END_DATE("endDate","结束时间"),
;
private String name;
private String value;
PolyvReqEnum(String name, String value) {
this.name = name;
this.value = value;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
package com.yizhi.live.application.jobhandler;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.yizhi.application.orm.id.IdGenerator;
import com.yizhi.live.application.domain.LiveActivity;
import com.yizhi.live.application.domain.LiveReplay;
import com.yizhi.live.application.service.ILiveActivityService;
import com.yizhi.live.application.service.ILiveReplayService;
import com.yizhi.live.application.util.PolyvUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* @Date 2020/12/8 2:22 下午
* @Author lvjianhui
**/
@RestController
@RequestMapping("/job/live")
public class PolyvReplayLogHandler {
@Autowired
private ILiveActivityService iLiveActivityService;
@Autowired
private ILiveReplayService iLiveReplayService;
@Autowired
IdGenerator idGenerator;
private Logger logger = LoggerFactory.getLogger(PolyvReplayLogHandler.class);
@GetMapping("/insert/replay")
public void insertLiveReplay() {
Date currencyDate = new Date();
List<LiveActivity> allLive = getAllLive();
logger.trace("直播数量为:{}", allLive.size());
allLive.stream().forEach(live -> {
List<LiveReplay> list = new ArrayList<>();
try {
list = PolyvUtils.getChannelReplay(live.getChannel());
} catch (Exception e) {
logger.error("查询视频回放出错", e);
return;
}
logger.trace("查询视频回放 :{}", list.size());
list.stream().forEach(replay -> {
LiveReplay liveReplay = iLiveReplayService.getByVideoPoolId(replay.getVideoPoolId());
if (null == liveReplay) {
replay.setId(idGenerator.generate());
replay.setChannelId(live.getChannel());
replay.setLiveId(live.getId());
replay.setLivePlanStartAt(live.getStartTime());
replay.setLiveLogoUrl(live.getLogoImage());
replay.setLiveAnchor(live.getAnchor());
replay.setCompanyId(live.getCompanyId());
replay.setSiteId(live.getSiteId());
try {
iLiveReplayService.insert(replay);
} catch (Exception e) {
logger.error("新增视频回放出错", e);
}
}else {
liveReplay.setTitle(replay.getTitle());
liveReplay.setUpdatedAt(currencyDate);
iLiveReplayService.updateById(liveReplay);
}
});
});
// 更新时间小于当前时间,证明已再保利威删除,故直接删除
iLiveReplayService.deleteByUpdateTime(new Date(currencyDate.getTime() - 5 * 60 * 1000));
}
private List<LiveActivity> getAllLive() {
LiveActivity liveActivity = new LiveActivity();
liveActivity.setDeleted(0);
EntityWrapper<LiveActivity> entityWrapper = new EntityWrapper<>(liveActivity);
return iLiveActivityService.selectList(entityWrapper);
}
}
package com.yizhi.live.application.mapper;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.yizhi.live.application.domain.LiveActivity;
import com.yizhi.live.application.vo.PageLiveVo;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.session.RowBounds;
import java.util.Date;
import java.util.List;
import java.util.Set;
/**
* <p>
* 直播活动表 Mapper 接口
* </p>
*
* @author fulan123
* @since 2018-04-10
*/
public interface LiveActivityMapper extends BaseMapper<LiveActivity> {
List<PageLiveVo> apiSearchPage(@Param("ids") List<Long> ids, @Param("title") String title, @Param("siteId") Long siteId,
@Param("companyId") Long companyId,
Page<PageLiveVo> page);
Integer apiSearchPageCount(@Param("ids") List<Long> ids, @Param("title") String title, @Param("siteId") Long siteId,
@Param("companyId") Long companyId);
List<PageLiveVo> portalList2(@Param("title") String title, @Param("startTime") Date startTime, @Param("endTime") Date endTime,
@Param("companyId") Long companyId, @Param("siteId") Long siteId,
@Param("orgId") List<Long> orgId, Page<PageLiveVo> page);
List<PageLiveVo> portalList(@Param("title") String title, @Param("startTime") Date startTime, @Param("endTime") Date endTime,
@Param("companyId") Long companyId, @Param("siteId") Long siteId,
@Param("orgId") List<Long> orgId, RowBounds rowBounds);
List<PageLiveVo> getPageLiveVoList(@Param("title") String title, @Param("siteId") Long siteId,
@Param("companyId") Long companyId,
RowBounds rowBounds);
Integer getPageLiveVoListCount(@Param("title") String title, @Param("siteId") Long siteId,
@Param("companyId") Long companyId);
Set<PageLiveVo> queryLiveListByRelationIds(@Param("relationIds")List<Long> relationIds,@Param("siteId")Long siteId, RowBounds rowBounds);
List<Long> getIdsByDate(@Param("currentDate") Date currentDate, @Param("siteId") Long siteId);
List<PageLiveVo> getPageToCalendar(@Param("finishTrIds") List<Long> finishTrIds,
@Param("trIds") List<Long> trIds,
@Param("currentDate") Date currentDate,
@Param("siteId") Long siteId,
Page page);
Integer getPageToCalendarNum(@Param("finishTrIds") List<Long> finishTrIds,
@Param("trIds") List<Long> trIds,
@Param("currentDate") Date currentDate,
@Param("siteId") Long siteId);
}
package com.yizhi.live.application.mapper;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.yizhi.live.application.domain.LiveReplay;
import com.yizhi.live.application.vo.LiveReplayVo;
import com.yizhi.live.application.vo.LiveTitleVo;
import com.yizhi.util.application.domain.BizResponse;
import org.apache.ibatis.annotations.Param;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.Date;
import java.util.List;
public interface LiveReplayMapper extends BaseMapper<LiveReplay> {
/**
* 查询直播回放
* @param liveIdList 直播id
*/
List<LiveReplayVo> selectReplayList(@Param(value = "liveIdList") List<Long> liveIdList,@Param(value = "title") String title, Page<LiveReplayVo> page);
/**
* 查询有直播回放的直播列表
*/
List<LiveTitleVo> selectHashReviewLiveList(@Param(value = "liveIdList") List<Long> liveIdList, @Param("companyId") Long companyId, @Param("siteId") Long siteId,Page<LiveTitleVo> page);
void deleteByUpdateTime(@Param("updateTime") Date updateTime);
/**
* 根据直播查询回放列表
* @param liveId 直播id
*/
List<LiveReplayVo> selectReplayListByLiveId(@Param("liveId") Long liveId, Page<LiveReplayVo> page);
/**
* 批量删除
*/
void deleteReplayBatch(@Param("delReplayIdList") List<Long> delReplayIdList);
/**
* 更新直播回放置顶
* @param topTime 置顶时间
*/
void updateTopTime(@Param("id") Long id ,@Param("topTime") Date topTime);
}
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yizhi.live.application.mapper.LiveReplayMapper">
<resultMap id="BaseResultMap" type="com.yizhi.live.application.domain.LiveReplay">
<id column="id" jdbcType="BIGINT" property="id" />
<result column="live_id" jdbcType="BIGINT" property="liveId" />
<result column="live_status" jdbcType="INTEGER" property="liveStatus" />
<result column="live_replay_status" jdbcType="BIT" property="liveReplayStatus" />
<result column="live_plan_start_at" jdbcType="TIMESTAMP" property="livePlanStartAt" />
<result column="live_logo_url" jdbcType="VARCHAR" property="liveLogoUrl" />
<result column="live_anchor" jdbcType="VARCHAR" property="liveAnchor" />
<result column="live_viewers" jdbcType="INTEGER" property="liveViewers" />
<result column="company_id" jdbcType="BIGINT" property="companyId" />
<result column="site_id" jdbcType="BIGINT" property="siteId" />
<result column="page_number" jdbcType="INTEGER" property="pageNumber" />
<result column="total_items" jdbcType="INTEGER" property="totalItems" />
<result column="video_id" jdbcType="VARCHAR" property="videoId" />
<result column="video_pool_id" jdbcType="VARCHAR" property="videoPoolId" />
<result column="user_id" jdbcType="VARCHAR" property="userId" />
<result column="channel_id" jdbcType="VARCHAR" property="channelId" />
<result column="title" jdbcType="VARCHAR" property="title" />
<result column="first_image" jdbcType="VARCHAR" property="firstImage" />
<result column="duration" jdbcType="VARCHAR" property="duration" />
<result column="my_br" jdbcType="INTEGER" property="myBr" />
<result column="seed" jdbcType="BIT" property="seed" />
<result column="created_time" jdbcType="TIMESTAMP" property="createdTime" />
<result column="last_modified" jdbcType="TIMESTAMP" property="lastModified" />
<result column="rank" jdbcType="INTEGER" property="rank" />
<result column="as_default" jdbcType="BIT" property="asDefault" />
<result column="url" jdbcType="VARCHAR" property="url" />
<result column="file_id" jdbcType="VARCHAR" property="fileId" />
<result column="file_url" jdbcType="VARCHAR" property="fileUrl" />
<result column="watch_url" jdbcType="VARCHAR" property="watchUrl" />
<result column="channel_session_id" jdbcType="VARCHAR" property="channelSessionId" />
<result column="merge_info" jdbcType="VARCHAR" property="mergeInfo" />
<result column="start_time" jdbcType="TIMESTAMP" property="startTime" />
<result column="live_type" jdbcType="VARCHAR" property="liveType" />
<result column="first_page" jdbcType="BIT" property="firstPage" />
<result column="last_page" jdbcType="BIT" property="lastPage" />
<result column="next_page_number" jdbcType="INTEGER" property="nextPageNumber" />
<result column="pre_page_number" jdbcType="INTEGER" property="prePageNumber" />
<result column="total_pages" jdbcType="INTEGER" property="totalPages" />
<result column="start_row" jdbcType="INTEGER" property="startRow" />
<result column="end_row" jdbcType="INTEGER" property="endRow" />
<result column="created_at" jdbcType="TIMESTAMP" property="createdAt" />
<result column="updated_at" jdbcType="TIMESTAMP" property="updatedAt" />
<result column="image_desc" jdbcType="VARCHAR" property="imageDesc" />
<result column="top_time" jdbcType="TIMESTAMP" property="topTime" />
</resultMap>
<resultMap extends="BaseResultMap" id="ResultMapWithBLOBs" type="com.yizhi.live.application.domain.LiveReplay">
<result column="qid" jdbcType="LONGVARCHAR" property="qid" />
</resultMap>
<sql id="Base_Column_List">
id, live_id, live_status, live_replay_status, live_plan_start_at, live_logo_url,
live_anchor, live_viewers, company_id, site_id, page_number, total_items, video_id,
video_pool_id, user_id, channel_id, title, first_image, duration, my_br, seed, created_time,
last_modified, rank, as_default, url, file_id, file_url, watch_url, lang, channel_session_id,
merge_info, start_time, live_type, first_page, last_page, next_page_number, pre_page_number,
total_pages, start_row, end_row, created_at, updated_at,top_time,image_desc
</sql>
<sql id="Blob_Column_List">
qid
</sql>
<update id="updateTopTime">
update live_replay set top_time = #{topTime} where id = #{id}
</update>
<delete id="deleteByUpdateTime">
delete from live_replay where updated_at &lt;= #{updateTime}
</delete>
<delete id="deleteReplayBatch">
<if test="delReplayIdList != null and delReplayIdList.size() > 0">
delete from live_replay where id in
<foreach collection="delReplayIdList" open="(" close=")" separator="," item="id">
#{id}
</foreach>
</if>
</delete>
<select id="selectReplayList" resultType="com.yizhi.live.application.vo.LiveReplayVo">
select replay.*
,act.view_type as viewType
from live_replay replay
left join live_activity act on replay.live_id = act.id
where replay.live_replay_status = '1'
<if test="null != title and title != ''">
and ( replay.title LIKE CONCAT('%', #{title}, '%') or replay.live_anchor LIKE CONCAT('%', #{title}, '%') )
</if>
<if test="null != liveIdList and liveIdList.size > 0">
and replay.live_id in
<foreach collection="liveIdList" open="(" close=")" separator="," item="liveId">
#{liveId}
</foreach>
</if>
ORDER BY replay.top_time desc ,replay.start_time desc
</select>
<select id="selectHashReviewLiveList" resultType="com.yizhi.live.application.vo.LiveTitleVo">
select live_id liveId, channel_id channelId, title
from live_replay
where live_replay_status = '1'
<if test="null != liveIdList and liveIdList.size > 0">
and live_id in
<foreach collection="liveIdList" open="(" close=")" separator="," item="liveId">
#{liveId}
</foreach>
</if>
GROUP BY live_id
ORDER BY live_plan_start_at desc, live_id ASC,start_time asc
</select>
<select id="selectReplayListByLiveId" resultType="com.yizhi.live.application.vo.LiveReplayVo">
select * from live_replay
where live_id = #{liveId}
order by top_time desc ,start_time desc
</select>
</mapper>
\ No newline at end of file
package com.yizhi.live.application.mapper;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.yizhi.live.application.domain.LiveToken;
/**
* <p>
* 直播生成的token保存 Mapper 接口
* </p>
*
* @author fulan123
* @since 2018-04-25
*/
public interface LiveTokenMapper extends BaseMapper<LiveToken> {
}
package com.yizhi.live.application.mapper;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.yizhi.live.application.domain.ScopeAuthorization;
import com.yizhi.live.application.vo.ScopeAuthorizationVO;
import org.apache.ibatis.annotations.Param;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
import java.util.Set;
/**
* <p>
* 直播授权课件范围表 Mapper 接口
* </p>
*
* @author fulan123
* @since 2018-04-10
*/
public interface ScopeAuthorizationMapper extends BaseMapper<ScopeAuthorization> {
List<Long> selectLiveIdByRelationId(@Param("relationIds") List<Long> relationIds);
Boolean insertListVO(@Param("list")List<ScopeAuthorizationVO> list);
Boolean insertList(@Param("list")List<ScopeAuthorization> list);
Set<Long> selectLiveId(@Param("relationIds") List<Long> relationIds, @Param("siteId") Long siteId);
List<Long> getUsefulIds(@Param("ids") List<Long> ids,
@Param("relationIds") List<Long> relationIds,
@Param("siteId") Long siteId);
/**
* 删除可见范围
* @param liveId
*/
void deleteAuthorize(@Param("liveId") Long liveId);
/**
* 查询直播回放开启的直播间id集合
* @param authLiveIds 指定用户可见的直播id
* @return
*/
List<Long> selectReplayOnLiveIds(@RequestParam("authLiveIds") List<Long> authLiveIds,@RequestParam("companyId") Long companyId,@RequestParam("siteId") Long siteId);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.yizhi.live.application.mapper.ScopeAuthorizationMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.yizhi.live.application.domain.ScopeAuthorization">
<id column="id" property="id" />
<result column="account_id" property="accountId" />
<result column="live_id" property="liveId" />
<result column="type" property="type" />
</resultMap>
<delete id="deleteAuthorize">
DELETE
FROM
scope_authorization
WHERE
live_id = #{liveId}
</delete>
<select id="selectLiveIdByRelationId" resultType="java.lang.Long">
<if test="relationIds != null">
select live_id
from scope_authorization
<where>
account_id in
<foreach collection="relationIds" open="(" close=")" item="item" separator=",">
#{item}
</foreach>
</where>
</if>
</select>
<!-- 数据批量插入 -->
<insert id="insertList" parameterType="java.util.ArrayList">
insert into scope_authorization (id,live_id,account_id,type,name,site_id) VALUES
<foreach collection="list" item="item" index="index" separator=",">
(#{item.id},#{item.liveId},#{item.accountId},#{item.type},#{item.name},#{item.siteId})
</foreach>
</insert>
<!-- 数据批量插入 -->
<insert id="insertListVO" parameterType="java.util.ArrayList">
insert into scope_authorization (id,live_id,account_id,type,name,site_id) VALUES
<foreach collection="list" item="item" index="index" separator=",">
(#{item.id},#{item.liveId},#{item.accountId},#{item.type},#{item.name},#{item.siteId})
</foreach>
</insert>
<select id="selectLiveId" resultType="java.lang.Long">
<if test="relationIds != null">
select live_id
from scope_authorization
<where>
site_id = #{siteId} and
account_id in
<foreach collection="relationIds" open="(" close=")" item="item" separator=",">
#{item}
</foreach>
</where>
</if>
</select>
<select id="getUsefulIds" resultType="java.lang.Long">
select live_id
from scope_authorization
<where>
site_id = #{siteId}
<if test="relationIds != null and relationIds.size() > 0">
and account_id in
<foreach collection="relationIds" open="(" close=")" item="item" separator=",">
#{item}
</foreach>
</if>
<if test="ids != null and ids.size()>0">
and live_id in <foreach collection="ids" open="(" close=")" item="id" separator=","> #{id} </foreach>
</if>
</where>
</select>
<select id="selectReplayOnLiveIds" resultType="java.lang.Long">
select c.id
FROM
live_activity c
<where>
c.shelves = 1 and deleted = 0 and replay_status = '1'
<if test="companyId != null">
AND c.`company_id` = #{companyId}
</if>
<if test="siteId != null">
AND c.`site_id` = #{siteId}
</if>
AND
(c.scope = 0
<if test="authLiveIds != null and authLiveIds.size > 0">
or
(c.id in
<foreach collection="authLiveIds" open="(" close=")" separator="," item="item">
#{item}
</foreach>
)
</if>
)
</where>
</select>
</mapper>
package com.yizhi.live.application.service;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.IService;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.yizhi.core.application.context.RequestContext;
import com.yizhi.core.application.vo.DroolsVo;
import com.yizhi.live.application.domain.LiveActivity;
import com.yizhi.live.application.request.LiveReleaseReviewReq;
import com.yizhi.live.application.vo.*;
import com.yizhi.util.application.domain.BizResponse;
import org.apache.xpath.operations.Bool;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* <p>
* 直播活动表 服务类
* </p>
*
* @author fulan123
* @since 2018-04-10
*/
public interface ILiveActivityService extends IService<LiveActivity> {
/**
* 创建直播间
*
* @param params
* @return
*/
String createChanel(Map<String, String> params);
Page<PageLiveVo> searchPage(String title, String startTimeString, String endTimeString,
Long companyId, Long siteId,
List<Long> orgId, int pageNo, int pageSize,
String expTimeString, Integer status , Integer viewType,Boolean startTimeAsc,Boolean endTimeAsc);
/**
* 查询近七天的已完成的直播
* @param companyId
* @param siteId
* @return
*/
List<LiveActivity> findWithinSevenDaysLive(Long companyId, Long siteId, Long accountId);
Boolean deleteChanel(String chanel);
String setToken(String chanel);
List<PageLiveVo> apiSearchHomeList(List<Long> relationIds,String title,
Long companyId, Long siteId,
int pageNo, int pageSize);
Page<PageLiveVo> apiSearchPageList(List<Long> relationIds,String title,
Long companyId, Long siteId,
int pageNo, int pageSize);
Boolean saveLive(LiveActivityResultVO liveActivityResultVO);
Boolean updateLive(LiveActivityResultVO liveActivityResultVO);
List<PageLiveVo> portalList(String title, Date startTime, Date endTime,
Long companyId, Long siteId,
List<Long> orgId, int pageNo, int pageSize);
Page<PageLiveVo> portalList2(String title, Date startTime, Date endTime,
Long companyId, Long siteId,
List<Long> orgId, int pageNo, int pageSize);
/**
* 范围人员导出 管理端-------2018/09/19
* @param assignmentId
* @return
*/
public VisibleRangeExport vsibleRangeExport(Long liveId);
/**
* 根据relationId 判断这个人是否可以看到这这场直播
* @param relationId 里面可能有accountId or orgId
* @param liveId 直播Id
* @return
*/
Boolean judgeScope (List<Long> relationId,Long liveId);
Page<PageLiveVo> getPageLiveVoList(Long siteId, Integer pageNo, Integer pageSize);
Page<LiveActivity> getPageLiveVoListNotIds(List<Long> ids, Long siteId, Integer pageNo, Integer pageSize);
Page<LiveActivity> LiveActivityByIds(List<Long> listIds, Integer pageNo, Integer pageSize);
/**
* 根据传入的频道Id,返回直播状态
* @param channelId
* @return
*/
Integer getLiveStatus(String channelId);
/**
* 根据传入的relationIds 里面有accountId、orgId
* @param relationIds
* @param pageNo
* @param pageSize
* @return
*/
List<PageLiveVo> queryLiveListByRelationIds( List<Long> relationIds, Integer pageNo, Integer pageSize);
List<Map<String, Object>> getServerByCompanyIdAndIds(Long companyId,List<Long> ids);
Page<PageLiveVo> pcSearchPageList(List<Long> relationIds, String title, Long companyId, Long siteId, int pageNo, int pageSize);
Page<PageLiveVo> getPageToCalendar(Date date, Page<PageLiveVo> page);
Page<DroolsVo> getPageByDrools(String field, String value, Page<DroolsVo> page);
/**
* 获取直播的实时在线人数
* @param channelIds 多个直播号用逗号隔开
* @return 在线人数list
*/
List<LiveOnlineCountVo> getChannelOnlineCountRealTime(String channelIds) throws JsonProcessingException;
/**
* 直播状态修改;保利威回调接口
* @param channelId 频道id
*/
BizResponse liveStatusCallback(String channelId, String status, Long timestamp, String sign, String sessionId, String startTime, String endTime);
/**
* 回放生成成功;保利威回调接口
*/
BizResponse livebackCallback(PolyvLiveBackCallbackVo liveBackCallbackVo);
/**
* 直播转存成功;保利威回调接口
*/
BizResponse<String> liveTransferCallback(PolyvLiveBackCallbackVo liveBackCallbackVo);
/**
* 查询有直播回放的直播列表
* @param liveReviewsVo 参数
*/
BizResponse<List<LiveTitleVo>> reviewLiveList(LiveReviewsVo liveReviewsVo);
/**
* 查询有直播回放的直播间
* 分页查询
* @param replayVo 入参 pageNo;pageSize
* @return 直播间列表
*/
Page<LiveTitleVo> getHasReplayLiveList(LiveReleaseReviewReq replayVo);
/**
* 查询直播间所有回放视频
* @param liveReviewsVo 参数
*/
BizResponse<List<LiveReplayVo>> reviewsList(LiveReviewsVo liveReviewsVo);
/**
* 获取开启直播回放的直播间ids
* @param context 上下文
* @return 直播间ids
*/
List<Long> getReplayOnLiveIds(RequestContext context);
/**
* 管理端查询直播下的直播回放
* @param liveReviewsVo liveId 直播id
*/
Page<LiveReplayVo> getReplayList(LiveReviewsVo liveReviewsVo);
/**
* 直播回放上架、下架
* @param replayId 回放id
* @param operation true上架;false下架
*/
Boolean updateReplayStatus(Long replayId, Boolean operation);
/**
* 直播回放上架、下架
* @param replayId 回放id
* @param top true上架;false下架
*/
Boolean updateReplayTop(Long replayId, Boolean top);
/**
* 修改回放主播名和封面
* @param infoVo 修改信息
*/
Boolean updateReplayInfos(LiveReplayInfoVo infoVo);
}
package com.yizhi.live.application.service;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.IService;
import com.yizhi.live.application.domain.LiveReplay;
import com.yizhi.live.application.request.LiveReleaseReviewReq;
import com.yizhi.live.application.vo.LiveReplayVo;
import com.yizhi.live.application.vo.LiveReviewListVo;
import com.yizhi.util.application.domain.BizResponse;
import java.util.Date;
/**
* @Date 2020/12/9 9:47 上午
* @Author lvjianhui
**/
public interface ILiveReplayService extends IService<LiveReplay> {
/**
* 查询直播回放列表
*/
Page<LiveReplayVo> getReplayList(LiveReviewListVo liveReviewListVo);
BizResponse<LiveReplayVo> getReplay(Long replayId);
/**
* 查询上架的直播回放列表
* @param reviewReq 请求入参
* @return 回放列表
*/
Page<LiveReplayVo> getReleaseReplayList(LiveReleaseReviewReq reviewReq);
LiveReplay getByVideoPoolId(String videoPoolId);
void deleteByUpdateTime(Date date);
}
package com.yizhi.live.application.service;
import com.baomidou.mybatisplus.service.IService;
import com.yizhi.live.application.domain.LiveToken;
/**
* <p>
* 直播生成的token保存 服务类
* </p>
*
* @author fulan123
* @since 2018-04-25
*/
public interface ILiveTokenService extends IService<LiveToken> {
}
package com.yizhi.live.application.service;
import com.baomidou.mybatisplus.service.IService;
import com.yizhi.live.application.domain.ScopeAuthorization;
import java.util.List;
/**
* <p>
* 直播授权课件范围表 服务类
* </p>
*
* @author fulan123
* @since 2018-04-10
*/
public interface IScopeAuthorizationService extends IService<ScopeAuthorization> {
//删除之前记录
Boolean insertList(List<ScopeAuthorization> list);
//不删除之前记录
Boolean insertAllList(List<ScopeAuthorization> list);
List<ScopeAuthorization> listScopeAuthorization(Long liveId);
}
package com.yizhi.live.application.service.impl;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.yizhi.core.application.cache.RedisCache;
import com.yizhi.core.application.context.RequestContext;
import com.yizhi.core.application.enums.InternationalEnums;
import com.yizhi.live.application.domain.LiveActivity;
import com.yizhi.live.application.domain.LiveReplay;
import com.yizhi.live.application.mapper.LiveActivityMapper;
import com.yizhi.live.application.mapper.LiveReplayMapper;
import com.yizhi.live.application.request.LiveReleaseReviewReq;
import com.yizhi.live.application.service.ILiveActivityService;
import com.yizhi.live.application.service.ILiveReplayService;
import com.yizhi.live.application.util.PolyvUtils;
import com.yizhi.live.application.vo.LiveReplayVo;
import com.yizhi.live.application.vo.LiveReviewListVo;
import com.yizhi.live.application.vo.LiveStatisticDataVo;
import com.yizhi.live.application.vo.PageLiveVo;
import com.yizhi.util.application.domain.BizResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
/**
* @Date 2020/12/9 9:47 上午
* @Author lvjianhui
**/
@Service
public class ILiveReplayServiceImpl extends ServiceImpl<LiveReplayMapper, LiveReplay> implements ILiveReplayService {
private static final Logger logger = LoggerFactory.getLogger(ILiveReplayServiceImpl.class);
@Autowired
private ILiveActivityService liveActivityService;
@Autowired
private LiveReplayMapper replayMapper;
@Autowired
private RedisCache redisCache;
@Autowired
private LiveActivityMapper liveActivityMapper;
@Override
public void deleteByUpdateTime(Date updateTime) {
replayMapper.deleteByUpdateTime(updateTime);
}
@Override
public Page<LiveReplayVo> getReplayList(LiveReviewListVo liveReviewListVo) {
Page<LiveReplayVo> page = new Page<>(liveReviewListVo.getPageNo(),liveReviewListVo.getPageSize());
/*List<LiveReplayVo> replayVoList = new ArrayList<>();
Map<String,Integer> liveViewTypeMap = new HashMap<>();
page.setRecords(replayVoList);
List<Long> liveIdList = liveReviewListVo.getLiveIdList();
if (null == liveIdList || liveIdList.isEmpty()){
liveIdList = new ArrayList<>();
RequestContext context = liveReviewListVo.getRequestContext();
Page<PageLiveVo> liveActivityPage = liveActivityService.apiSearchPageList(context.getRelationIds(), null, context.getCompanyId(), context.getSiteId(), 1, Integer.MAX_VALUE);
if (null == liveActivityPage || null == liveActivityPage.getRecords()){
logger.warn("查询直播列表为空;accountId = {},companyId = {},siteId ={}",context.getAccountId(),context.getCompanyId(),context.getSiteId());
return page;
}
List<PageLiveVo> records = liveActivityPage.getRecords();
liveIdList = records.stream().map(PageLiveVo::getId).collect(Collectors.toList());
// 获取直播类型
for (PageLiveVo pageLiveVo : records) {
String channel = pageLiveVo.getChannel();
Integer viewType = pageLiveVo.getViewType();
liveViewTypeMap.put(channel,viewType);
}
}
logger.info("直播id listSize= {}", liveIdList.size());
List<LiveReplayVo> list = replayMapper.selectReplayList(liveIdList,liveReviewListVo.getTitle(),page);
if (null == list || list.isEmpty()){
logger.info("获取到直播回放列表size为空");
return page;
}
// 查询直播观看人数
String hKey = "live:viewer";
list.forEach(liveReplayVo -> {
//redis中获取;接口有限制
String channelId = liveReplayVo.getChannelId();
Integer viewType = liveViewTypeMap.get(channelId);
liveReplayVo.setViewType(viewType);
String viewerSum = (String) redisCache.hget(hKey,channelId);
if (!StringUtils.isEmpty(viewerSum)){
liveReplayVo.setLiveViewers(Integer.valueOf(viewerSum));
}else {
Date livePlanStartAt = liveReplayVo.getLivePlanStartAt();
List<LiveStatisticDataVo> liveStatistic = PolyvUtils.getLiveStatistic(channelId, livePlanStartAt, new Date());
if (null != liveStatistic && liveStatistic.size() > 0){
for (LiveStatisticDataVo liveStatisticDataVo : liveStatistic) {
Integer mobileUniqueViewer = liveStatisticDataVo.getMobileUniqueViewer();
Integer pcUniqueViewer = liveStatisticDataVo.getPcUniqueViewer();
Integer sum = mobileUniqueViewer + pcUniqueViewer;
liveReplayVo.setLiveViewers(sum);
redisCache.hset(hKey,channelId,String.valueOf(sum));
//过期时间60s
redisCache.expire(hKey,60);
}
}
}
});
page.setRecords(list);*/
return page;
}
@Override
public BizResponse<LiveReplayVo> getReplay(Long replayId) {
if (null == replayId){
logger.error("查询直播回放详情;直播回放id为空!");
return BizResponse.fail(InternationalEnums.INTERNATIONALIZATIONWORDCONTROLLER1.getCode());
}
LiveReplay liveReplay = replayMapper.selectById(replayId);
LiveReplayVo replayVo = new LiveReplayVo();
BeanUtils.copyProperties(liveReplay,replayVo);
Long liveId = replayVo.getLiveId();
LiveActivity activity = liveActivityMapper.selectById(liveId);
if (null != activity){
replayVo.setViewType(activity.getViewType());
}
return BizResponse.ok(replayVo);
}
@Override
public LiveReplay getByVideoPoolId(String videoPoolId) {
LiveReplay lr = new LiveReplay();
lr.setVideoPoolId(videoPoolId);
return this.baseMapper.selectOne(lr);
}
@Override
public Page<LiveReplayVo> getReleaseReplayList(LiveReleaseReviewReq reviewReq) {
// 获取上架的直播间回放
int pageNo = reviewReq.getPageNo();
int pageSize = reviewReq.getPageSize();
if (pageNo == 0 || pageSize == 0){
pageNo = 1;
pageSize = Integer.MAX_VALUE;
}
Page<LiveReplayVo> page = new Page<>(pageNo,pageSize);
List<LiveReplayVo> replayVoList = new ArrayList<>();
Map<String,Integer> liveViewTypeMap = new HashMap<>();
page.setRecords(replayVoList);
RequestContext context = reviewReq.getRequestContext();
List<Long> liveIdList = liveActivityService.getReplayOnLiveIds(context);
if (null == liveIdList || liveIdList.isEmpty()){
logger.error("查询直播回放列表,直播间获取为空;companyId = {} , siteId = {} ,accountId = {}",context.getCompanyId(),context.getSiteId(),context.getAccountId());
return page;
}
logger.info("直播id listSize= {}", liveIdList.size());
List<LiveReplayVo> list = replayMapper.selectReplayList(liveIdList,reviewReq.getTitle(),page);
if (null == list || list.isEmpty()){
logger.info("获取到直播回放列表size为空");
return page;
}
// 查询直播观看人数
String hKey = "live:viewer";
list.forEach(liveReplayVo -> {
//redis中获取;接口有限制
String channelId = liveReplayVo.getChannelId();
String viewerSum = (String) redisCache.hget(hKey,channelId);
if (!StringUtils.isEmpty(viewerSum)){
liveReplayVo.setLiveViewers(Integer.valueOf(viewerSum));
}else {
Date livePlanStartAt = liveReplayVo.getLivePlanStartAt();
List<LiveStatisticDataVo> liveStatistic = PolyvUtils.getLiveStatistic(channelId, livePlanStartAt, new Date());
if (null != liveStatistic && liveStatistic.size() > 0){
for (LiveStatisticDataVo liveStatisticDataVo : liveStatistic) {
Integer mobileUniqueViewer = liveStatisticDataVo.getMobileUniqueViewer();
Integer pcUniqueViewer = liveStatisticDataVo.getPcUniqueViewer();
Integer sum = mobileUniqueViewer + pcUniqueViewer;
liveReplayVo.setLiveViewers(sum);
redisCache.hset(hKey,channelId,String.valueOf(sum));
//过期时间60s
redisCache.expire(hKey,60);
}
}
}
});
page.setRecords(list);
return page;
}
}
package com.yizhi.live.application.service.impl;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.yizhi.live.application.domain.LiveToken;
import com.yizhi.live.application.mapper.LiveTokenMapper;
import com.yizhi.live.application.service.ILiveTokenService;
import org.springframework.stereotype.Service;
/**
* <p>
* 直播生成的token保存 服务实现类
* </p>
*
* @author fulan123
* @since 2018-04-25
*/
@Service
public class LiveTokenServiceImpl extends ServiceImpl<LiveTokenMapper, LiveToken> implements ILiveTokenService {
}
package com.yizhi.live.application.service.impl;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.yizhi.application.orm.id.IdGenerator;
import com.yizhi.live.application.domain.ScopeAuthorization;
import com.yizhi.live.application.mapper.ScopeAuthorizationMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import com.yizhi.live.application.service.IScopeAuthorizationService;
import java.util.List;
/**
* <p>
* 直播授权课件范围表 服务实现类
* </p>
*
* @author fulan123
* @since 2018-04-10
*/
@Service
@Transactional
public class ScopeAuthorizationServiceImpl extends ServiceImpl<ScopeAuthorizationMapper, ScopeAuthorization> implements IScopeAuthorizationService {
private Logger logger = LoggerFactory.getLogger(ScopeAuthorizationServiceImpl.class);
@Autowired
IdGenerator idGenerator;
@Override
public Boolean insertList(List<ScopeAuthorization> list) {
if (list.size() > 0) {
//保存之前先删除 修改时时 不用做数据对比
Long liveId = list.get(0).getLiveId();
this.baseMapper.deleteAuthorize(liveId);
//保存
for (ScopeAuthorization scopeAuthorization1 : list) {
scopeAuthorization1.setId(idGenerator.generate());
}
return this.baseMapper.insertList(list);
} else {
return Boolean.FALSE;
}
}
@Override
public Boolean insertAllList(List<ScopeAuthorization> list) {
if (!CollectionUtils.isEmpty(list)) {
Long liveId = list.get(0).getLiveId();
this.baseMapper.deleteAuthorize(liveId);
for (ScopeAuthorization scopeAuthorization1 : list) {
scopeAuthorization1.setId(idGenerator.generate());
}
return this.baseMapper.insertList(list);
} else {
logger.error("列表为空");
return Boolean.FALSE;
}
}
@Override
public List<ScopeAuthorization> listScopeAuthorization(Long liveId) {
// TODO Auto-generated method stub
ScopeAuthorization scopeAuthorization=new ScopeAuthorization();
scopeAuthorization.setLiveId(liveId);
EntityWrapper<ScopeAuthorization> wrapper=new EntityWrapper<ScopeAuthorization>(scopeAuthorization);
return this.selectList(wrapper);
}
}
package com.yizhi.live.application.util;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import java.lang.reflect.Field;
import java.util.*;
public class JsonUtil {
public static Map<String, Object> parseJSON2Map(String jsonStr) throws Exception{
Map<String, Object> map = new HashMap<String, Object>();
JSONObject json = JSONObject.parseObject(jsonStr);
for(Object k : json.keySet()){
Object v = json.get(k);
if(v instanceof JSONArray){
List<Map<String, Object>> list = new ArrayList<Map<String,Object>>();
JSONArray json2 = JSONArray.parseArray(v.toString());
for(int i=0;i<json2.size();i++){
// 遍历 jsonarray 数组,把每一个对象转成 json 对象
JSONObject job = json2.getJSONObject(i);
list.add(parseJSON2Map(job.toString()));
}
map.put(k.toString(), list);
} else {
map.put(k.toString(), v);
}
}
return map;
}
}
package com.yizhi.live.application.util;
import com.yizhi.core.application.context.RequestContext;
import com.yizhi.core.application.event.EventWrapper;
import com.yizhi.core.application.publish.CloudEventPublisher;
import com.yizhi.live.application.domain.LiveActivity;
import com.yizhi.live.application.vo.MessageRemindVo;
import com.yizhi.live.application.vo.MessageTaskRemindVo;
import com.yizhi.message.application.constans.Constans;
import com.yizhi.message.application.enums.RelationType;
import com.yizhi.message.application.vo.TaskVo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
@Component
public class LiveEvenSendMessage {
@Autowired
private CloudEventPublisher cloudEventPublisher;
private Logger logger = LoggerFactory.getLogger(LiveEvenSendMessage.class);
/**
* 系统模板,发消息
*
* @param liveActivity 业务参数对象
*/
public void systemSendMessage(LiveActivity liveActivity, MessageRemindVo remindVo, RequestContext context) {
com.yizhi.message.application.vo.MessageRemindVo vo = new com.yizhi.message.application.vo.MessageRemindVo();
//共用参数
vo.setMessageType(2);
vo.setRelationId(liveActivity.getId());
vo.setRelationType(RelationType.ZB.getKey());
if (context == null) {
context = new RequestContext();
context.setCompanyId(liveActivity.getCompanyId());
context.setSiteId(liveActivity.getSiteId());
context.setAccountName(liveActivity.getCreateByName());
context.setAccountId(liveActivity.getCreateById());
}
vo.setRequestContext(context);
if (vo.getMessageType() == null || vo.getRelationId() == null || vo.getRelationType() == null) {
logger.info("messageType:"+remindVo.getMessageType()+"||"+"RelationId:"+remindVo.getRelationId()
+"||"+"RelationType:"+remindVo.getRelationType());
logger.info("相关参数缺失!!");
return;
}
if (remindVo.getHasDeleted()) {
vo.setHasDeleted(remindVo.getHasDeleted());
cloudEventPublisher.publish(Constans.MESSAGE_QUEUE, new EventWrapper<com.yizhi.message.application.vo.MessageRemindVo>(null, vo));
} else {
//修改直播的状态
if (remindVo.getTaskStatusUpdate()) {
//1 为消息业务可发送状态 0 则不行
vo.setTaskStatus(liveActivity.getShelves().equals(1) ? 1 : 0);
vo.setTaskStatusUpdate(remindVo.getTaskStatusUpdate());
cloudEventPublisher.publish(Constans.MESSAGE_QUEUE, new EventWrapper<com.yizhi.message.application.vo.MessageRemindVo>(null, vo));
logger.info("发送修改业务状态消息成功=====================");
return;
}
if (liveActivity != null) {
if (!CollectionUtils.isEmpty(remindVo.getMessageTaskRemindVos())) {
com.yizhi.message.application.vo.TaskVo taskVo = new TaskVo();
taskVo.setTaskName(liveActivity.getTitle());
taskVo.setTaskStratTime(liveActivity.getStartTime());
taskVo.setTaskEndTime(liveActivity.getEndTime());
vo.setTaskStatus(liveActivity.getShelves().equals(1) ? 1 : 0);
vo.setMessageType(remindVo.getMessageType());
vo.setMessageId(remindVo.getMessageId());
vo.setIsChangge(remindVo.getIsChangge());
List<MessageTaskRemindVo> m= remindVo.getMessageTaskRemindVos();
List<com.yizhi.message.application.vo.MessageTaskRemindVo> m2=new ArrayList<>();
for (MessageTaskRemindVo m1:m
) {
com.yizhi.message.application.vo.MessageTaskRemindVo mx=new com.yizhi.message.application.vo.MessageTaskRemindVo();
BeanUtils.copyProperties(m1,mx);
m2.add(mx);
}
vo.setMessageTaskRemindVos(m2);
vo.setSendType(remindVo.getSendType());
vo.setVisibleRange(remindVo.getVisibleRange());
vo.setTaskVo(taskVo);
if (vo.getMessageId() == null || vo.getSendType() == null || vo.getVisibleRange() == null) {
logger.info("messageID:"+remindVo.getMessageId()+"||"+"sendType:"+remindVo.getSendType()
+"||"+"VisibleRange:"+remindVo.getVisibleRange());
logger.info("相关参数缺失!!!!!");
return;
}
try {
cloudEventPublisher.publish(Constans.MESSAGE_QUEUE, new EventWrapper<com.yizhi.message.application.vo.MessageRemindVo>(null, vo));
logger.info("发送消息成功=====================");
} catch (Exception e) {
e.printStackTrace();
logger.error("发送消息失败=====================", e);
}
}
}
}
}
}
package com.yizhi.live.application.util;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.util.*;
@Component
public class LiveUtil {
private RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(15000).setConnectTimeout(15000)
.setConnectionRequestTimeout(15000).build();
public String sendHttpPost(String httpUrl, Map<String, String> maps) {
HttpPost httpPost = new HttpPost(httpUrl);
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
for (String key : maps.keySet()) {
nameValuePairs.add(new BasicNameValuePair(key, maps.get(key)));
}
try {
httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs, "UTF-8"));
} catch (Exception e) {
e.printStackTrace();
}
return sendHttpPost(httpPost);
}
private String sendHttpPost(HttpPost httpPost) {
CloseableHttpClient httpClient = null;
CloseableHttpResponse response = null;
HttpEntity entity = null;
String responseContent = null;
try {
httpClient = HttpClients.createDefault();
httpPost.setConfig(requestConfig);
response = httpClient.execute(httpPost);
entity = response.getEntity();
responseContent = EntityUtils.toString(entity, "UTF-8");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (response != null) {
response.close();
}
if (httpClient != null) {
httpClient.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return responseContent;
}
public String generateSign(Map<String, String> parray, String secretKey) {
Map<String, String> params = this.paraFilter(parray);
String concatedStr = this.concatParams(params);
String plain = secretKey + concatedStr + secretKey;
String encrypted = MD5Utils.getMD5String(plain);
String upperCase = encrypted.toUpperCase();
return upperCase;
}
private Map<String, String> paraFilter(Map<String, String> sArray) {
Map<String, String> result = new HashMap<String, String>();
if (sArray == null || sArray.size() <= 0) {
return result;
}
for (String key : sArray.keySet()) {
String value = sArray.get(key);
if (value == null || value.equals("") || key.equalsIgnoreCase("sign")
|| key.equalsIgnoreCase("sign_type")) {
continue;
}
result.put(key, value);
}
return result;
}
private String concatParams(Map<String, String> params) {
List<String> keys = new ArrayList<String>(params.keySet());
Collections.sort(keys);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < keys.size(); i++) {
String key = keys.get(i);
String value = params.get(key);
sb.append(key).append(value);
}
return sb.toString();
}
public static String getMD5(String str) {
try {
// 生成一个MD5加密计算摘要
MessageDigest md = MessageDigest.getInstance("MD5");
// 计算md5函数
md.update(str.getBytes());
// digest()最后确定返回md5 hash值,返回值为8为字符串。因为md5 hash值是16位的hex值,实际上就是8位的字符
// BigInteger函数则将8位的字符串转换成16位hex值,用字符串来表示;得到字符串形式的hash值
String md5=new BigInteger(1, md.digest()).toString(16);
//BigInteger会把0省略掉,需补全至32位
return fillMD5(md5);
} catch (Exception e) {
throw new RuntimeException("MD5加密错误:"+e.getMessage(),e);
}
}
public static String fillMD5(String md5){
return md5.length()==32?md5:fillMD5("0"+md5);
}
}
package com.yizhi.live.application.util;
import com.yizhi.live.application.constant.UtilConstants;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
import java.util.*;
/**
* post 请求 url 不拼参数,没有请求体
*/
public class LiveUtilPostUrlNotParam {
private static RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(15000).setConnectTimeout(15000)
.setConnectionRequestTimeout(15000).build();
/**
* 发送请求
* @param url
* @param param
* @return
*/
public static String sendPost(String url , Map<String, String> param) {
Map<String, String> map = new HashMap<>();
String timestamp = Long.toString(System.currentTimeMillis());
map.put("appId", UtilConstants.APP_ID);
map.put("timestamp", timestamp);
for(Map.Entry<String, String> item : param.entrySet()){
map.put(item.getKey(), item.getValue());
}
String sign = generateSign(map, UtilConstants.APP_SECRET);
map.put("sign", sign);
return sendHttpPost(url, map);
}
private static String sendHttpPost(String httpUrl, Map<String, String> maps) {
HttpPost httpPost = new HttpPost(httpUrl);
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
for (String key : maps.keySet()) {
nameValuePairs.add(new BasicNameValuePair(key, maps.get(key)));
}
try {
httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs, "UTF-8"));
} catch (Exception e) {
e.printStackTrace();
}
return sendHttpPost(httpPost);
}
private static String sendHttpPost(HttpPost httpPost) {
CloseableHttpClient httpClient = null;
CloseableHttpResponse response = null;
HttpEntity entity = null;
String responseContent = null;
try {
httpClient = HttpClients.createDefault();
httpPost.setConfig(requestConfig);
response = httpClient.execute(httpPost);
entity = response.getEntity();
responseContent = EntityUtils.toString(entity, "UTF-8");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (response != null) {
response.close();
}
if (httpClient != null) {
httpClient.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return responseContent;
}
protected static String generateSign(Map<String, String> parray, String secretKey) {
Map<String, String> params = paraFilter(parray);
String concatedStr = concatParams(params);
String plain = secretKey + concatedStr + secretKey;
String encrypted = MD5Utils.getMD5String(plain);
String upperCase = encrypted.toUpperCase();
return upperCase;
}
private static Map<String, String> paraFilter(Map<String, String> sArray) {
Map<String, String> result = new HashMap<String, String>();
if (sArray == null || sArray.size() <= 0) {
return result;
}
for (String key : sArray.keySet()) {
String value = sArray.get(key);
if (value == null || value.equals("") || key.equalsIgnoreCase("sign")
|| key.equalsIgnoreCase("sign_type")) {
continue;
}
result.put(key, value);
}
return result;
}
private static String concatParams(Map<String, String> params) {
List<String> keys = new ArrayList<String>(params.keySet());
Collections.sort(keys);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < keys.size(); i++) {
String key = keys.get(i);
String value = params.get(key);
sb.append(key).append(value);
}
return sb.toString();
}
}
package com.yizhi.live.application.util;
import com.yizhi.live.application.constant.UtilConstants;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.*;
/**
* post 请求带参数,请求体为json(不签名)
*/
public class LiveUtilPostUrlParam {
private static RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(15000).setConnectTimeout(15000)
.setConnectionRequestTimeout(15000).build();
/**
* 保利威 api 发送post的请求
* @param url api接口地址
* @param postBody 请求的post参数
* @param param 需要进行sing签名的参数,最后会根据这些参数生成sign ,然后在url后面加上key=value的&拼接的
* @return
*/
public static String sendPost(String url , String postBody, Map<String, String> param) {
//UtilConstants.APP_SECRET
//UtilConstants.APP_ID
//String url = "http://api.polyv.net/live/v3/channel/auth/update";
//String channelId = "频道号";
//String appId = "appId";
//String key = "secretKey";
Map<String, String> map = new HashMap<>();
String timestamp = Long.toString(System.currentTimeMillis());
map.put("appId", UtilConstants.APP_ID);
map.put("timestamp", timestamp);
for(Map.Entry<String, String> item : param.entrySet()){
map.put(item.getKey(), item.getValue());
}
String sign = getSign(map, UtilConstants.APP_SECRET);
map.put("sign", sign);
//String body = "{\"authSettings\":[{\"rank\":1,\"enabled\":\"N\"},{\"rank\":2,\"enabled\":\"N\"}]}";
//String content = sendHttpPost(url, map, body);
//System.out.println(content);
return sendHttpPost(url, map, postBody);
}
/**
* 发送 post请求
* @param httpUrl 地址
* @param maps 参数
*/
private static String sendHttpPost(String httpUrl, Map<String, String> maps, String body) {
StringBuilder url = new StringBuilder();
url.append(httpUrl).append("?");
for (Map.Entry<String, String> map : maps.entrySet()) {
url.append(map.getKey()).append("=").append(map.getValue()).append("&");
}
String urlStr = url.toString().substring(0, url.length() - 1);
System.out.println(urlStr);
// 创建httpPost
HttpPost httpPost = new HttpPost(urlStr);
try {
if(StringUtils.isNotBlank(body)){
StringEntity entity = new StringEntity(body, Charset.forName("UTF-8"));
httpPost.setEntity(entity);
}
} catch (Exception e) {
// ...
}
return sendHttpPost(httpPost);
}
/**
* 发送Post请求
* @param httpPost
* @return
*/
private static String sendHttpPost(HttpPost httpPost) {
CloseableHttpClient httpClient = null;
CloseableHttpResponse response = null;
HttpEntity entity;
String responseContent = null;
try {
// 创建默认的httpClient实例.
httpClient = HttpClients.createDefault();
httpPost.setConfig(requestConfig);
// 执行请求
response = httpClient.execute(httpPost);
entity = response.getEntity();
responseContent = EntityUtils.toString(entity, "UTF-8");
} catch (Exception e) {
// ...
} finally {
try {
// 关闭连接,释放资源
if (response != null) {
response.close();
}
if (null != httpPost) {
httpPost.releaseConnection();
}
if (httpClient != null) {
httpClient.close();
}
} catch (IOException e) {
// ...
}
}
return responseContent;
}
/**
* 根据map里的参数构建加密串
* @param map
* @param secretKey
* @return
*/
protected static String getSign(Map<String, String> map, String secretKey) {
Map<String, String> params = paraFilter(map);
// 处理参数,计算MD5哈希值
String concatedStr = concatParams(params);
String plain = secretKey + concatedStr + secretKey;
String encrypted = MD5Utils.getMD5String(plain);
// 32位大写MD5值
return encrypted.toUpperCase();
}
/**
* 对params根据key来排序并且以key1=value1&key2=value2的形式拼接起来
* @param params
* @return
*/
private static String concatParams(Map<String, String> params) {
List<String> keys = new ArrayList<>(params.keySet());
Collections.sort(keys);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < keys.size(); i++) {
String key = keys.get(i);
String value = params.get(key);
sb.append(key).append(value);
}
return sb.toString();
}
/**
* 除去数组中的空值和签名参数
* @param sArray 签名参数组
* @return 去掉空值与签名参数后的新签名参数组
*/
private static Map<String, String> paraFilter(Map<String, String> sArray) {
Map<String, String> result = new HashMap<>();
if (sArray == null || sArray.size() <= 0) {
return result;
}
for (String key : sArray.keySet()) {
String value = sArray.get(key);
if (value == null || value.equals("") || key.equalsIgnoreCase("sign")
|| key.equalsIgnoreCase("sign_type")) {
continue;
}
result.put(key, value);
}
return result;
}
}
package com.yizhi.live.application.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5Utils {
protected static char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e',
'f' };
protected static MessageDigest messagedigest = null;
static {
try {
messagedigest = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException nsaex) {
nsaex.printStackTrace();
}
}
public static String getFileMD5String(File file) throws IOException {
FileInputStream in = new FileInputStream(file);
FileChannel ch = in.getChannel();
MappedByteBuffer byteBuffer = ch.map(FileChannel.MapMode.READ_ONLY, 0, file.length());
messagedigest.update(byteBuffer);
in.close();
return bufferToHex(messagedigest.digest());
}
public static String getFileMD5String(File file, String userid) throws Exception {
FileInputStream in = new FileInputStream(file);
FileChannel ch = in.getChannel();
// 避免outofmemory,最多取前1000个字节
long length = file.length() > 1000 ? 1000 : file.length();
MappedByteBuffer byteBuffer = ch.map(FileChannel.MapMode.READ_ONLY, 0, length);
messagedigest.update(byteBuffer);
String temp = bufferToHex(messagedigest.digest()) + file.length();
byte[] btemp = temp.getBytes();
String vid = bufferToHex(messagedigest.digest(btemp));
in.close();
return userid.toLowerCase() + vid.substring(userid.length(), vid.length());
}
public static String getMD5String(String s) {
return getMD5String(s.getBytes());
}
public static String getMD5String(byte[] bytes) {
messagedigest.update(bytes);
return bufferToHex(messagedigest.digest());
}
public static String getMD5String(String s, String userid) {
String md5string = getMD5String(s.getBytes());
return userid.toLowerCase() + md5string.substring(userid.length(), md5string.length());
}
private static String bufferToHex(byte bytes[]) {
return bufferToHex(bytes, 0, bytes.length);
}
private static String bufferToHex(byte bytes[], int m, int n) {
StringBuffer stringbuffer = new StringBuffer(2 * n);
int k = m + n;
for (int l = m; l < k; l++) {
appendHexPair(bytes[l], stringbuffer);
}
return stringbuffer.toString();
}
private static void appendHexPair(byte bt, StringBuffer stringbuffer) {
char c0 = hexDigits[(bt & 0xf0) >> 4];
char c1 = hexDigits[bt & 0xf];
stringbuffer.append(c0);
stringbuffer.append(c1);
}
public static boolean checkPassword(String password, String md5PwdStr) {
String s = getMD5String(password);
return s.equals(md5PwdStr);
}
}
server.port=33654
spring.application.name=live
ACTIVE=${spring.profiles.active}
spring.profiles.active=sit
# nacos
spring.cloud.nacos.config.shared-dataids=common-${spring.profiles.active}.properties
spring.cloud.nacos.config.namespace=${spring.profiles.active}
spring.cloud.nacos.config.prefix=${spring.application.name}
spring.cloud.nacos.config.file-extension=properties
#spring.cloud.nacos.config.server-addr=192.168.0.203:8848
#spring.cloud.nacos.config.na
#spring.cloud.nacos.config.server-addr=192.168.1.22:3333,192.168.1.22:4444,192.168.1.22:5555
spring.cloud.nacos.config.server-addr=192.168.1.13:3333,192.168.1.24:4444,192.168.1.38:5555
#回放表新增、修改字段
ALTER TABLE `live_replay` add COLUMN top_time datetime DEFAULT NULL COMMENT '直播回放置顶时间';
ALTER TABLE `live_replay` add COLUMN image_desc varchar(255) DEFAULT NULL COMMENT '图片说明';
ALTER TABLE `live_replay` MODIFY live_replay_status bit(1) DEFAULT b'1' COMMENT '直播回放状态 1: 上架 0:下架';
ALTER TABLE `live_replay` MODIFY id bigint(20) NOT NULL COMMENT '主键';
#直播表默认回放开关状态修改
ALTER TABLE `live_activity` MODIFY replay_status bit(1) DEFAULT b'0' COMMENT '直播回放开关状态 1: 开 0:关闭';
\ No newline at end of file
#新增排序字段
ALTER TABLE live_activity add sort INT(11) DEFAULT '999' COMMENT '直播排序;默认999';
#门户装修-移动端 头部导航 新增直播功能项
INSERT INTO `cloud_portal`.`site_dic` (`id`, `parent_id`, `name`, `code`, `des`, `img_url`, `status`, `type`, `create_time`, `update_time`, `sort`, `backup_desc`) VALUES ('134', '15', '直播', 'live', '直播', NULL, '1', '29', '2020-12-03 11:05:54', '2020-12-03 11:05:54', NULL, '0');
#门户装修-pc 头部导航 新增直播功能项
INSERT INTO `cloud_portal`.`site_dic` (`id`, `parent_id`, `name`, `code`, `des`, `img_url`, `status`, `type`, `create_time`, `update_time`, `sort`, `backup_desc`) VALUES ('135', '32', '我的直播', 'live', '直播', NULL, '1', '29', '2020-12-03 18:09:10', '2020-12-03 18:09:10', NULL, '0');
#门户装修-pc 新增模块配置选项
INSERT INTO `cloud_portal`.`site_dic` (`id`, `parent_id`, `name`, `code`, `des`, `img_url`, `status`, `type`, `create_time`, `update_time`, `sort`, `backup_desc`) VALUES ('136', '7', '直播', 'live', '直播', NULL, '1', '15', '2020-12-07 15:43:50', '2020-12-07 15:43:50', NULL, '0');
/* 2:32:35 PM yz-dev-开发 cloud_live */
ALTER TABLE `live_activity` ADD `status` INT NULL DEFAULT NULL COMMENT '直播状态 10:未开始 40:直播中 90:已结束' AFTER `sort`;
/* 2:33:35 PM yz-dev-开发 cloud_live */
ALTER TABLE `live_activity` ADD `replay_status` INT NULL DEFAULT NULL COMMENT '直播回放开关状态 1: 开 0:关闭' AFTER `status`;
/* 2:36:59 PM yz-dev-开发 cloud_live */
ALTER TABLE `live_activity` CHANGE `replay_status` `replay_status` BIT(1) NULL DEFAULT 1 COMMENT '直播回放开关状态 1: 开 0:关闭';
/* 2:38:35 PM yz-dev-开发 cloud_live */
ALTER TABLE `live_activity` ADD `replay_callback_status` BIT(1) NULL DEFAULT 0 COMMENT '直播回放回调状态 1:已回调 0:未回调' AFTER `replay_status`;
#直播回放表
-- ----------------------------
-- Table structure for live_replay
-- ----------------------------
CREATE TABLE `live_replay` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`live_id` bigint(20) DEFAULT NULL COMMENT '直播ID',
`live_status` int(11) DEFAULT NULL COMMENT '直播状态 10:未开始 40:直播中 90:已结束',
`live_replay_status` bit(1) DEFAULT b'1' COMMENT '直播回放开关状态 1: 开 0:关闭',
`live_plan_start_at` datetime DEFAULT NULL COMMENT '直播计划开始时间',
`live_logo_url` varchar(128) DEFAULT NULL COMMENT '直播logo url',
`live_anchor` varchar(32) DEFAULT NULL COMMENT '主播名称',
`live_viewers` int(11) DEFAULT NULL COMMENT '直播观看人数',
`company_id` bigint(20) DEFAULT NULL,
`site_id` bigint(20) DEFAULT NULL,
`page_number` int(11) DEFAULT NULL COMMENT '视频列表页数(默认以12条数据为1页)',
`total_items` int(11) DEFAULT NULL COMMENT '回放视频总个数',
`video_id` varchar(64) DEFAULT NULL COMMENT '直播系统生成的id',
`video_pool_id` varchar(64) DEFAULT NULL COMMENT '点播视频ID',
`user_id` varchar(64) DEFAULT NULL COMMENT '点播后台用户id',
`channel_id` varchar(32) DEFAULT NULL COMMENT '回放视频对应的直播频道id',
`title` varchar(256) DEFAULT NULL COMMENT '视频标题',
`first_image` varchar(256) DEFAULT NULL COMMENT '视频首图',
`duration` varchar(32) DEFAULT NULL COMMENT '时长',
`my_br` int(11) DEFAULT NULL COMMENT '默认视频的播放清晰度,1为流畅,2为高清,3为超清',
`qid` text COMMENT '访客信息收集id',
`seed` bit(1) DEFAULT b'0' COMMENT '视频加密状态,1表示为加密状态,0为非加密',
`created_time` datetime DEFAULT NULL COMMENT '添加为回放视频的日期',
`last_modified` datetime DEFAULT NULL COMMENT '视频最后修改日期',
`rank` int(11) DEFAULT NULL COMMENT '回放排序',
`as_default` bit(11) DEFAULT b'1' COMMENT '是否为默认播放视频,值为1:Y 0:N',
`url` varchar(256) DEFAULT NULL COMMENT '视频播放地址,注:如果视频为加密视频,则此地址无法访问',
`file_id` varchar(64) DEFAULT NULL COMMENT '文件ID',
`file_url` varchar(512) DEFAULT NULL COMMENT '文件URL',
`watch_url` varchar(512) DEFAULT NULL COMMENT '观看URL',
`lang` varchar(32) DEFAULT NULL COMMENT '语言类型',
`channel_session_id` varchar(128) DEFAULT NULL COMMENT '用于PPT请求数据,与PPT直播的回放相关,普通直播回放值为null',
`merge_info` varchar(256) DEFAULT NULL COMMENT '视频合并信息,后续补充',
`start_time` datetime DEFAULT NULL COMMENT '直播开始时间',
`live_type` varchar(32) DEFAULT NULL COMMENT 'liveType alone, ppt',
`first_page` bit(11) DEFAULT b'1' COMMENT '是否为第一页,值为:1:true,0:false',
`last_page` bit(1) DEFAULT b'1' COMMENT '是否为最后一页,值为:1:true,0:false',
`next_page_number` int(11) DEFAULT NULL COMMENT '下一页编号',
`pre_page_number` int(11) DEFAULT NULL COMMENT '上一页编号',
`total_pages` int(11) DEFAULT NULL COMMENT '总页数',
`start_row` int(11) DEFAULT NULL COMMENT '当前页第一个视频在回放视频中的位置',
`end_row` int(11) DEFAULT NULL COMMENT '当前页最后一个视频在回放视频中的位置',
`created_at` datetime DEFAULT CURRENT_TIMESTAMP,
`updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uni_video_pool_id` (`video_pool_id`),
KEY `idx_live_id` (`live_id`),
KEY `idx_cid` (`company_id`),
KEY `idx_siteId` (`site_id`),
KEY `idx_start_time` (`start_time`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.google.gson.JsonObject;
import com.yizhi.live.application.LiveApplication;
import com.yizhi.live.application.constant.PolyvResponseVO;
import com.yizhi.live.application.constant.PolyvUpdatePO;
import com.yizhi.live.application.constant.UtilConstants;
import com.yizhi.live.application.domain.LiveReplay;
import com.yizhi.live.application.enums.LiveStatusV2;
import com.yizhi.live.application.jobhandler.PolyvReplayLogHandler;
import com.yizhi.live.application.util.PolyvUtils;
import com.yizhi.live.application.vo.PolyvResponseVo;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.omg.CORBA.OBJ_ADAPTER;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @Date 2020/12/8 4:02 下午
* @Author lvjianhui
**/
//@Ignore
//@SpringBootTest(classes = LiveApplication.class)
//@RunWith(SpringRunner.class)
public class PolyvTest {
@Test
public void test() {
LiveStatusV2 status = PolyvUtils.getLiveStatus("2061401", DateUtil.parse("2020-12-22 01:45:00").toJdkDate(),DateUtil.parse("2020-12-22 01:55:00").toJdkDate(),null);
System.out.println("==========="+status.getCode());
// List<LiveReplay> list = PolyvUtils.getChannelReplay("2019615");
// System.out.println(JSONObject.toJSONString(list));
// PolyvUpdatePO po = new PolyvUpdatePO();
// po.setName("070直播修改测试22222");
// System.out.println(JSONObject.toJSONString(PolyvUtils.updateChannelParams("1820239", po,true,"","")));
//
// Map params = new HashMap<String,Object>();
// params.put("appId", UtilConstants.APP_ID);
// params.put("timestamp", System.currentTimeMillis());
// System.out.println(PolyvUtils.execPolyvApi(null, params, "http://api.polyv.net/live/v2/channels/1820239/get", null));
//
//// String url = String.format(UtilConstants.LIVE_REPLAY_LIST,2016376);
// Map<String,Object> params = new HashMap<>();
// params.put("appId",UtilConstants.APP_ID);
// params.put("timestamp",System.currentTimeMillis()+"");
// params.put("page","0");
// PolyvResponseVo<JSONObject> reslut = PolyvUtils.execPolyvApi(params,url);
//
// JSONArray listObject = (JSONArray) reslut.getData().get("contents");
//
// List<LiveReplay> list = JSONObject.parseArray(JSONObject.toJSONString(listObject),LiveReplay.class);
// System.out.println(JSONObject.toJSONString(listObject.get(0)));
// System.out.println(JSONObject.toJSONString(list.get(0)));
}
// @Autowired
// private PolyvReplayLogHandler polyvReplayLogHandler;
//
// @Test
// public void insertReplay() {
// polyvReplayLogHandler.insertLiveReplay();
// }
}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.yizhi</groupId>
<artifactId>wmy-parent</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath/>
</parent>
<groupId>com.yizhi</groupId>
<artifactId>cloud-live</artifactId>
<version>1.0-SNAPSHOT</version>
<modules>
<module>cloud-live-api</module>
<module>cloud-live-service</module>
</modules>
<packaging>pom</packaging>
<repositories>
<repository>
<id>wmy4.0</id>
<url>http://mvn.km365.pw/nexus/content/groups/wmy4.0-group/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
</repository>
</repositories>
</project>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment