wanghongbo

素材提交、上传审片间

package com.wondertek.controller;
import com.wondertek.dto.BackupChangeDto;
import com.wondertek.dto.BackupMaterialDto;
import com.wondertek.dto.BackupUploadVo;
import com.wondertek.dto.MaterialUploadVo;
import com.wondertek.dto.*;
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.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
... ... @@ -57,13 +55,13 @@ public class BackupMaterialController {
* @description 提交到素材库
* @author W5669
* @date 2025/8/21 11:26
* @param backupChangeDto
* @param materialSubmitVo
* @return ResultBean
*/
@PostMapping("submit")
ResultBean submit(BackupChangeDto backupChangeDto){
//
return ResultBean.ok();
ResultBean submit(@RequestBody @Validated MaterialSubmitVo materialSubmitVo){
log.info("-->直播剪辑素材提交:{}",materialSubmitVo);
return backupMaterialService.submitOrUpload(materialSubmitVo);
}
/**
... ...
package com.wondertek.dto;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
/**
* @Description: 素材提交
* @Author W5669
* @Create 2025/7/24
* @Version 1.0
*/
@Data
public class MaterialSubmitVo {
//png、jpg、mp4等
@NotBlank(message = "文件类型不能为空")
private String fileType;
//垫片名
@NotBlank(message = "垫片名不能为空")
private String backupName;
//审片间id
private Long roomId;
//1:垫片1,2:垫片2
private Integer backupOrder;
//垫片状态 0-默认 1-当前选中
private String backupStatus;
// 操作类型 0-提交素材库 1-上传审片间
@NotBlank(message = "操作类型不能为空")
private String operateType;
//文件路径,绝对路径
@NotBlank(message = "文件路径不能为空")
private String filePath;
//封面图路径,绝对路径
private String coverPath;
//时长
@NotNull(message = "时长不能为空")
private Long duration;
}
... ...
... ... @@ -6,7 +6,7 @@ package com.wondertek.enums;
public enum MaterialSourceEnum {
UPLOAD("upload", "上传"),
NAS("nas", "nas"),
clip("clip", "剪辑");
CLIP("clip", "剪辑");
private final String code;
private final String name;
... ...
package com.wondertek.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.wondertek.dto.BackupChangeDto;
import com.wondertek.dto.BackupMaterialDto;
import com.wondertek.dto.BackupUploadVo;
import com.wondertek.dto.MaterialUploadVo;
import com.wondertek.dto.*;
import com.wondertek.entity.BackupMaterial;
import com.wondertek.util.PageBean;
import com.wondertek.util.ResultBean;
... ... @@ -23,4 +20,6 @@ public interface BackupMaterialService extends IService<BackupMaterial> {
ResultBean uploadToMaterial(MultipartFile backupFile, MaterialUploadVo materialUploadVo);
ResultBean batchDelete(Long[] ids);
ResultBean submitOrUpload(MaterialSubmitVo materialSubmitVo);
}
... ...
... ... @@ -406,4 +406,86 @@ public class BackupMaterialServiceImpl extends ServiceImpl<BackupMaterialMapper,
return rows > 0 ? ResultBean.ok() : ResultBean.error();
}
@Override
public ResultBean submitOrUpload(MaterialSubmitVo materialSubmitVo) {
//校验文件类型
if(!"mp4".equalsIgnoreCase(materialSubmitVo.getFileType())){
return ResultBean.error("文件类型错误");
}
StreamTask streamTask = null;
if(materialSubmitVo.getOperateType().equals("1")){
if (materialSubmitVo.getRoomId()== null || materialSubmitVo.getBackupOrder() == null){
return ResultBean.error("请选择审片间和垫片序号");
}
//找到对应垫片任务
LambdaQueryWrapper<StreamTask> backupWrapper = new LambdaQueryWrapper<>();
backupWrapper.eq(StreamTask::getRoomId,materialSubmitVo.getRoomId());
String palyType = materialSubmitVo.getBackupOrder() == 1? PlayTypeEnum.BACKUP1.getCode() : PlayTypeEnum.BACKUP2.getCode();
backupWrapper.eq(StreamTask::getPlayType,palyType);
streamTask = streamTaskMapper.selectOne(backupWrapper);
if (streamTask == null){
return ResultBean.error("未找到该直播间对应的垫片任务");
}
}
String fileId = UUIDUtil.randomUUID();
//保存垫片素材表
BackupMaterial backupMaterial = new BackupMaterial();
backupMaterial.setFileId(fileId);
backupMaterial.setBackupName(materialSubmitVo.getBackupName());
String destFilePath = materialSubmitVo.getFilePath();
String relativePath = materialSubmitVo.getFilePath().replace(realPath, "");
backupMaterial.setFilePath(relativePath);
backupMaterial.setFileType(materialSubmitVo.getFileType());
backupMaterial.setCreatedTime(LocalDateTime.now());
backupMaterial.setCreatedBy("admin");
backupMaterial.setDel("0");
backupMaterial.setSource(MaterialSourceEnum.CLIP.getCode());
//封面图
if(StringUtils.isNotEmpty(materialSubmitVo.getCoverPath())){
backupMaterial.setCoverPath(materialSubmitVo.getCoverPath().replace(realPath, ""));
}
//时长
backupMaterial.setDuration(materialSubmitVo.getDuration());
backupMaterialMapper.insert(backupMaterial);
if(materialSubmitVo.getOperateType().equals("1")){
}
//添加审片间垫片配置
LambdaQueryWrapper<BackupConfig> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(BackupConfig::getRoomId,materialSubmitVo.getRoomId());
wrapper.eq(BackupConfig::getBackupOrder,materialSubmitVo.getBackupOrder());
BackupConfig backupConfig = backupConfigMapper.selectOne(wrapper);
if(ObjectUtil.isNull(backupConfig)){
backupConfig = new BackupConfig();
backupConfig.setBackupStatus("0");
}
backupConfig.setRoomId(materialSubmitVo.getRoomId());
backupConfig.setBackupId(backupMaterial.getId());
backupConfig.setBackupOrder(materialSubmitVo.getBackupOrder());
backupConfig.setBackupPath(relativePath);
backupConfigMapper.insertOrUpdate(backupConfig);
//对应垫片任务切源(转码平台演示环境已挂载统一存储),请求转码平台修改垫片任务直播源
changeChannelSource(streamTask.getTaskId(), destFilePath);
//判断是否需要修改当前播出流的垫片
if("1".equals(backupConfig.getBackupStatus())){
//切换播出流垫片(主、备)
LambdaQueryWrapper<StreamTask> playWrapper = new LambdaQueryWrapper<>();
playWrapper.eq(StreamTask::getRoomId,materialSubmitVo.getRoomId());
playWrapper.eq(StreamTask::getPlayType,"play");
List<StreamTask> playTasks = streamTaskMapper.selectList(playWrapper);
if(CollectionUtil.isNotEmpty(playTasks)){
playTasks.forEach(playTask -> {
changeBackup(playTask.getTaskId(), destFilePath);
});
}
}
return ResultBean.ok("提交成功");
}
}
... ...