wanghongbo

审片间相关操作接口

... ... @@ -2,17 +2,21 @@ package com.wondertek.controller;
import com.wondertek.dto.BackupMaterialDto;
import com.wondertek.dto.BackupUploadVo;
import com.wondertek.service.BackupMaterialService;
import com.wondertek.util.PageBean;
import com.wondertek.util.ResultBean;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
@Slf4j
@RestController
@RequestMapping("bkMaterial")
@RequestMapping("/backup/material")
public class BackupMaterialController {
@Resource
private BackupMaterialService backupMaterialService;
... ... @@ -22,4 +26,10 @@ public class BackupMaterialController {
PageBean queryPage(BackupMaterialDto backupMaterialDto){
return backupMaterialService.queryPage(backupMaterialDto);
}
//垫片上传
@PostMapping("upload")
ResultBean upload(MultipartFile backupFile, BackupUploadVo backupUploadVo){
return backupMaterialService.upload(backupFile, backupUploadVo);
}
}
... ...
package com.wondertek.controller;
import com.wondertek.dto.BlockParam;
import com.wondertek.dto.DelayParam;
import com.wondertek.dto.MarkParam;
import com.wondertek.service.RoomOperationSerivice;
import com.wondertek.util.ResultBean;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
/**
* @Description: 审片间控制
... ... @@ -21,10 +22,42 @@ public class RoomOperationController {
@Resource
private RoomOperationSerivice roomOperationSerivice;
@RequestMapping("/setDelayTime")
public ResultBean setDelayTime(DelayParam delayParam) {
/**
* @Description: 设置延时
* @Author W5669
* @Create 2025/7/22
* @Version 1.0
*/
@PostMapping("/setDelayTime")
public ResultBean setDelayTime(@RequestBody DelayParam delayParam) {
log.info("-->【云审片平台】审片间延时设置,delayParam:{}",delayParam);
return roomOperationSerivice.setDelayTime(delayParam);
}
/**
* @Description: 屏蔽/恢复
* @Author W5669
* @Create 2025/7/22
* @Version 1.0
*/
@PostMapping("/blockStatus")
public ResultBean blockStatus (@RequestBody BlockParam blockParam) {
log.info("-->审片间【{}】操作,参数:{}",blockParam.getBlockStatus().equals(0)?"恢复":"屏蔽",blockParam);
return roomOperationSerivice.blockStatus(blockParam);
}
@PostMapping("/addMark")
public ResultBean addMark (@RequestBody MarkParam markParam) {
log.info("-->审片间标记,参数:{}",markParam);
return roomOperationSerivice.addMark(markParam);
}
@GetMapping("/operation/list")
public ResultBean operationList(@RequestParam(value = "roomId") Long roomId) {
return roomOperationSerivice.operationList(roomId);
}
}
... ...
package com.wondertek.dto;
import lombok.Data;
/**
* @Description: 垫片上传参数
* @Author W5669
* @Create 2025/7/24
* @Version 1.0
*/
@Data
public class BackupUploadVo {
//png、jpg、mp4等
private String fileType;
//垫片名
private String backupName;
//审片间id
private String roomId;
//1:垫片1,2:垫片2
private String backupOrder;
}
... ...
package com.wondertek.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.time.LocalDateTime;
/**
* @Description: 屏蔽/恢复参数
* @Author W5669
* @Create 2025/7/22
* @Version 1.0
*/
@Data
public class BlockParam {
private Long roomId;
/**
执行操作。0: 恢复(对应屏蔽状态未屏蔽),1: 屏蔽(对应屏蔽状态已屏蔽
*/
private Integer blockStatus;
/**
屏蔽类型,0:音画屏蔽 1-画面屏蔽(暂不支持)
*/
private Integer blockType;
/**
操作时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime operationTime;
}
... ...
package com.wondertek.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.time.LocalDateTime;
/**
* @Description: 审片间标记
* @Author W5669
* @Create 2025/7/24
* @Version 1.0
*/
@Data
public class MarkParam {
private Long roomId;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime markStartTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime markEndTime;
}
... ...
... ... @@ -34,7 +34,7 @@ public class MonitorMark {
*/
private String createdBy;
/**
* 操作时间
* 创建时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime createdTime;
... ... @@ -49,4 +49,15 @@ public class MonitorMark {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime markEndTime;
/**
* 操作类型, mark-标记,block-屏蔽。recover-恢复
*/
private String operationType;
/**
* 操作时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime OperationTime;
}
\ No newline at end of file
... ...
package com.wondertek.enums;
/**
* @Description:审片间播控操作类型
*/
public enum RoomOperationEnum {
MARK("mark", "标记"),
BLOCK("block", "屏蔽"),
RECOVER("recover", "恢复");
private final String code;
private final String name;
RoomOperationEnum(String status, String name) {
this.code = status;
this.name = name;
}
public String getCode() {
return code;
}
public String getName() {
return name;
}
}
... ...
... ... @@ -2,10 +2,15 @@ package com.wondertek.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.wondertek.dto.BackupMaterialDto;
import com.wondertek.dto.BackupUploadVo;
import com.wondertek.entity.BackupMaterial;
import com.wondertek.util.PageBean;
import com.wondertek.util.ResultBean;
import org.springframework.web.multipart.MultipartFile;
public interface BackupMaterialService extends IService<BackupMaterial> {
PageBean queryPage(BackupMaterialDto BackupMaterialDto);
ResultBean upload(MultipartFile backupFile, BackupUploadVo backupUploadVo);
}
... ...
package com.wondertek.service;
import com.wondertek.dto.BlockParam;
import com.wondertek.dto.DelayParam;
import com.wondertek.dto.MarkParam;
import com.wondertek.util.ResultBean;
/**
... ... @@ -16,4 +18,25 @@ public interface RoomOperationSerivice {
* @return
*/
ResultBean setDelayTime(DelayParam delayParam);
/**
* 屏蔽、恢复
* @param blockParam
* @return
*/
ResultBean blockStatus(BlockParam blockParam);
/**
* 标记
* @param markParam
* @return
*/
ResultBean addMark(MarkParam markParam);
/**
* 获取播控操作记录
* @param roomId
* @return
*/
ResultBean operationList(Long roomId);
}
... ...
... ... @@ -5,13 +5,16 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.wondertek.dto.BackupMaterialDto;
import com.wondertek.dto.BackupUploadVo;
import com.wondertek.entity.BackupMaterial;
import com.wondertek.mapper.BackupMaterialMapper;
import com.wondertek.service.BackupMaterialService;
import com.wondertek.util.PageBean;
import com.wondertek.util.ResultBean;
import jakarta.annotation.Resource;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
@Service
public class BackupMaterialServiceImpl extends ServiceImpl<BackupMaterialMapper, BackupMaterial> implements BackupMaterialService {
... ... @@ -39,4 +42,15 @@ public class BackupMaterialServiceImpl extends ServiceImpl<BackupMaterialMapper,
IPage<BackupMaterial> resultPage = backupMaterialMapper.selectPage(pageInfo, queryWrapper);
return new PageBean(Integer.parseInt(String.valueOf(resultPage.getPages())),resultPage.getTotal(),resultPage.getRecords());
}
@Override
public ResultBean upload(MultipartFile backupFile, BackupUploadVo backupUploadVo) {
//上传文件
//加入保存垫片素材表
//添加审片间垫片配置
//垫片搬迁到转码平台,对应垫片任务切流
//判断是否需要修改当前播出流的垫片
return null;
}
}
... ...
package com.wondertek.service.impl;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.fasterxml.jackson.core.type.TypeReference;
import com.wondertek.dto.BlockParam;
import com.wondertek.dto.DelayParam;
import com.wondertek.dto.MarkParam;
import com.wondertek.entity.LiveMonitorRoom;
import com.wondertek.entity.MonitorMark;
import com.wondertek.entity.StreamTask;
import com.wondertek.enums.RoomOperationEnum;
import com.wondertek.exception.BusinessException;
import com.wondertek.mapper.LiveMonitorRoomMapper;
import com.wondertek.mapper.MonitorMarkMapper;
import com.wondertek.mapper.StreamTaskMapper;
import com.wondertek.service.RoomOperationSerivice;
import com.wondertek.util.JSONUtils;
import com.wondertek.util.ResponseData;
import com.wondertek.util.ResultBean;
import com.wondertek.vo.RoomBlock;
import com.wondertek.vo.RoomMark;
import com.wondertek.vo.RoomOperationVo;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
... ... @@ -37,10 +50,13 @@ public class RoomOperationServiceImpl implements RoomOperationSerivice {
private StreamTaskMapper streamTaskMapper;
@Value("${transcode.delayTimeUrl}")
private String delayTimeUrl;
@Value("${transcode.blockStatusUrl}")
private String blockStatusUrl;
@Resource
private MonitorMarkMapper monitorMarkMapper;
@Override
public ResultBean setDelayTime(DelayParam delayParam) {
log.info("-->【云审片平台】审片间延时设置,delayParam:{}",delayParam);
LiveMonitorRoom liveMonitorRoom = liveMonitorRoomMapper.selectById(delayParam.getRoomId());
LambdaQueryWrapper<StreamTask> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(StreamTask::getRoomId,delayParam.getRoomId());
... ... @@ -53,6 +69,18 @@ public class RoomOperationServiceImpl implements RoomOperationSerivice {
streamTask.setDelayTime(delayParam.getDelayFirst());
streamTaskMapper.updateById(streamTask);
}
if (streamTask.getPlayType().equals("delay2")){
delayTask(streamTask.getTaskId(),delayParam.getDelaySecond());
//更新任务
streamTask.setDelayTime(delayParam.getDelaySecond());
streamTaskMapper.updateById(streamTask);
}
if (streamTask.getPlayType().equals("play")){
delayTask(streamTask.getTaskId(),delayParam.getDelayPlay());
//更新任务
streamTask.setDelayTime(delayParam.getDelayPlay());
streamTaskMapper.updateById(streamTask);
}
});
//2.更新多画
... ... @@ -86,4 +114,112 @@ public class RoomOperationServiceImpl implements RoomOperationSerivice {
log.error("请求转码系统延时接口失败,url:{}", delayTimeUrl, e);
}
}
@Override
public ResultBean blockStatus(BlockParam blockParam) {
LiveMonitorRoom liveMonitorRoom = liveMonitorRoomMapper.selectById(blockParam.getRoomId());
if (ObjectUtil.isNull(liveMonitorRoom)){
return ResultBean.error("审片间不存在");
}
//获取当前播出流
LambdaQueryWrapper<StreamTask> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(StreamTask::getRoomId,blockParam.getRoomId());
wrapper.eq(StreamTask::getPlayType,"play");
List<StreamTask> streamTasks = streamTaskMapper.selectList(wrapper);
if (CollectionUtils.isEmpty(streamTasks)){
return ResultBean.error("当前审片间没有播放任务");
}
streamTasks.forEach(streamTask -> {
//调用屏蔽接口
Map<String, Object> paramsMap = new HashMap<>();
paramsMap.put("taskId", streamTask.getTaskId());
paramsMap.put("blockStatus", blockParam.getBlockStatus());
HttpResponse execute = null;
try {
execute = HttpRequest.post(blockStatusUrl)
.header("Content-Type", "application/json")
.body(JSONUtils.obj2json(paramsMap)).timeout(30000).execute();
if (execute.isOk()) {
log.info("-->请求转码系统屏蔽接口,url:{},paramsMap:{}",blockStatusUrl,paramsMap);
String body = execute.body();
ResponseData response = JSONUtils.jsonToObject(body, new TypeReference<ResponseData>() {
});
if (response.getResultCode().equals("0")) {
log.info("请求转码系统屏蔽接口成功");
}else {
log.info("请求转码系统屏蔽接口响应失败,response:{}",response);
throw new BusinessException("block_status_error", "屏蔽状态错误");
}
} else {
log.error("请求转码系统屏蔽接口失败,url:{},body:{}", blockStatusUrl, execute.body());
throw new BusinessException("block_status_error", "屏蔽状态错误");
}
} catch (Exception e) {
log.error("请求转码系统屏蔽接口失败,url:{}", blockStatusUrl, e);
throw new BusinessException("block_status_error", "屏蔽状态错误");
}
});
//保存播控操作记录
MonitorMark monitorMark = new MonitorMark();
monitorMark.setRoomId(blockParam.getRoomId());
monitorMark.setCreatedTime(LocalDateTime.now());
monitorMark.setCreatedBy("admin");
monitorMark.setOperationType(blockParam.getBlockStatus().equals("0") ? RoomOperationEnum.RECOVER.getCode() : RoomOperationEnum.BLOCK.getCode());
monitorMark.setOperationTime(LocalDateTime.now());
monitorMarkMapper.insert(monitorMark);
liveMonitorRoom.setBrocStatus(String.valueOf(blockParam.getBlockStatus()));
liveMonitorRoomMapper.updateById(liveMonitorRoom);
return ResultBean.ok("设置成功");
}
@Override
public ResultBean addMark(MarkParam markParam) {
MonitorMark monitorMark = new MonitorMark();
monitorMark.setRoomId(markParam.getRoomId());
monitorMark.setMarkStartTime(markParam.getMarkStartTime());
monitorMark.setMarkEndTime(markParam.getMarkEndTime());
monitorMark.setOperationType(RoomOperationEnum.MARK.getCode());
monitorMark.setCreatedTime(LocalDateTime.now());
monitorMark.setCreatedBy("admin");
monitorMarkMapper.insert(monitorMark);
return ResultBean.ok("标记成功");
}
@Override
public ResultBean operationList(Long roomId) {
LambdaQueryWrapper<MonitorMark> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(MonitorMark::getRoomId, roomId);
List<MonitorMark> monitorMarks = monitorMarkMapper.selectList(wrapper);
RoomOperationVo roomOperationVo = new RoomOperationVo();
ArrayList<RoomMark> markList = new ArrayList<>();
ArrayList<RoomBlock> blockList = new ArrayList<>();
if(CollectionUtils.isNotEmpty(monitorMarks)){
//根据operationType处理数据
monitorMarks.forEach(monitorMark -> {
if (monitorMark.getOperationType().equals(RoomOperationEnum.MARK.getCode())){
RoomMark roomMark = new RoomMark();
roomMark.setId(monitorMark.getId());
roomMark.setMarkStartTime(monitorMark.getMarkStartTime());
roomMark.setMarkEndTime(monitorMark.getMarkEndTime());
markList.add(roomMark);
}else {
RoomBlock roomBlock = new RoomBlock();
roomBlock.setId(monitorMark.getId());
roomBlock.setOperationTime(monitorMark.getOperationTime());
roomBlock.setOperationType(monitorMark.getOperationType());
blockList.add(roomBlock);
}
});
roomOperationVo.setMarkList(markList);
roomOperationVo.setBlockList(blockList);
}
roomOperationVo.setMarkList(markList);
roomOperationVo.setBlockList(blockList);
return ResultBean.ok(roomOperationVo);
}
}
... ...
package com.wondertek.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
/**
* @Description:
* @Author W5669
* @Create 2025/7/24
* @Version 1.0
*/
@Data
public class RoomBlock {
private Long id;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime operationTime;
private String operationType;
}
... ...
package com.wondertek.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
/**
* @Description:
* @Author W5669
* @Create 2025/7/24
* @Version 1.0
*/
@Data
public class RoomMark {
private Long id;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime markStartTime;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime markEndTime;
}
... ...
package com.wondertek.vo;
import lombok.Data;
import java.util.List;
/**
* @Description: 审片间播控操作记录
* @Author W5669
* @Create 2025/7/24
* @Version 1.0
*/
@Data
public class RoomOperationVo {
//标记
private List<RoomMark> markList;
//屏蔽、恢复
private List<RoomBlock> blockList;
}
... ...
... ... @@ -60,7 +60,8 @@ mybatis-plus:
logic-delete-value: 0
transcode:
delayTimeUrl: http://192.168.1.41:8080/transcode/delayTime # 延迟接口
delayTimeUrl: http://192.168.1.237:9002/api/v1/delayTime # 延迟接口
blockStatusUrl: http://192.168.1.237:9002/api/v1/blockStatus # 屏蔽/恢复
getTaskDetail: http://192.168.1.237:9002/api/v1/getTaskDetail
crp:
... ...