wanghongbo

垫片上传、切垫片、垫片列表

package com.wondertek.controller;
import com.wondertek.dto.BackupChangeDto;
import com.wondertek.dto.BackupMaterialDto;
import com.wondertek.dto.BackupUploadVo;
import com.wondertek.service.BackupMaterialService;
... ... @@ -8,10 +9,7 @@ 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.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@Slf4j
... ... @@ -27,9 +25,34 @@ public class BackupMaterialController {
return backupMaterialService.queryPage(backupMaterialDto);
}
//垫片上传
/**
* @description 垫片上传
* @author W5669
* @date 2025/7/24
* @param backupFile
* @param backupUploadVo
* @return ResultBean
*/
@PostMapping("upload")
ResultBean upload(MultipartFile backupFile, BackupUploadVo backupUploadVo){
return backupMaterialService.upload(backupFile, backupUploadVo);
}
/**
* @description 获取审片间垫片列表
* @author W5669
* @date 2025/7/24
* @param roomId
* @return ResultBean
*/
@GetMapping("getByRoom")
ResultBean getByRoom(@RequestParam(value = "roomId") Long roomId){
return backupMaterialService.getByRoom(roomId);
}
@PostMapping("change")
ResultBean change(@RequestBody BackupChangeDto backupChangeDto){
return backupMaterialService.change(backupChangeDto);
}
}
... ...
package com.wondertek.dto;
import lombok.Data;
/**
* @Description: 垫片切换请求体
* @Author W5669
* @Create 2025/7/24
* @Version 1.0
*/
@Data
public class BackupChangeDto {
private Long roomId;
private Long backupId;
}
... ...
... ... @@ -15,8 +15,8 @@ public class BackupUploadVo {
//垫片名
private String backupName;
//审片间id
private String roomId;
private Long roomId;
//1:垫片1,2:垫片2
private String backupOrder;
private Integer backupOrder;
}
... ...
... ... @@ -23,6 +23,7 @@ public class BackupConfig {
private String backupPath;
/** 垫片序号 */
private Integer backupOrder;
/** 垫片状态 0-默认 1-当前选中 */
private String backupStatus;
// Getter 和 Setter 方法
}
\ No newline at end of file
... ...
package com.wondertek.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.yaml.snakeyaml.events.Event;
import java.io.Serializable;
import java.time.LocalDateTime;
... ... @@ -20,8 +22,10 @@ import java.util.Date;
@TableName("crp_backup_material")
public class BackupMaterial extends Model<BackupMaterial> {
/** id */
@TableId
@TableId(type = IdType.AUTO)
private Long id ;
/** 文件标识 */
private String fileId ;
/** 文件类型 */
private String fileType ;
/** 文件路径 */
... ...
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.entity.BackupMaterial;
... ... @@ -13,4 +14,8 @@ public interface BackupMaterialService extends IService<BackupMaterial> {
PageBean queryPage(BackupMaterialDto BackupMaterialDto);
ResultBean upload(MultipartFile backupFile, BackupUploadVo backupUploadVo);
ResultBean getByRoom(Long roomId);
ResultBean change(BackupChangeDto backupChangeDto);
}
... ...
package com.wondertek.service;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
/**
* @Description: 文件服务
* @Author W5669
* @Create 2025/7/24
* @Version 1.0
*/
public interface FileService {
/**
* @Description: 文件上传
* @Author W5669
* @Create 2025/7/24
* @Param [backupFile, destFilePath]
* @Return void
*/
void upload(MultipartFile backupFile, String destFilePath) throws IOException;
}
... ...
package com.wondertek.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
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.BackupChangeDto;
import com.wondertek.dto.BackupMaterialDto;
import com.wondertek.dto.BackupUploadVo;
import com.wondertek.entity.BackupConfig;
import com.wondertek.entity.BackupMaterial;
import com.wondertek.exception.BusinessException;
import com.wondertek.mapper.BackupConfigMapper;
import com.wondertek.mapper.BackupMaterialMapper;
import com.wondertek.service.BackupMaterialService;
import com.wondertek.service.FileService;
import com.wondertek.util.FileUtils;
import com.wondertek.util.PageBean;
import com.wondertek.util.ResultBean;
import com.wondertek.util.UUIDUtil;
import jakarta.annotation.Resource;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.time.LocalDateTime;
import java.util.List;
@Service
public class BackupMaterialServiceImpl extends ServiceImpl<BackupMaterialMapper, BackupMaterial> implements BackupMaterialService {
@Resource
private BackupMaterialMapper backupMaterialMapper;
@Resource
private FileService fileService;
@Value("${file.realPath}")
private String realPath;
@Resource
private BackupConfigMapper backupConfigMapper;
@Override
public PageBean queryPage(BackupMaterialDto backupMaterialDto) {
... ... @@ -46,11 +66,77 @@ public class BackupMaterialServiceImpl extends ServiceImpl<BackupMaterialMapper,
@Override
public ResultBean upload(MultipartFile backupFile, BackupUploadVo backupUploadVo) {
//上传文件
//加入保存垫片素材表
if(!"mp4".equalsIgnoreCase(backupUploadVo.getFileType())){
throw new BusinessException("仅支持上传mp4格式的垫片文件!");
}
String fileId = UUIDUtil.randomUUID();
String fileName = backupUploadVo.getBackupName() + "." + backupUploadVo.getFileType();
///home/wondertek/material_file_assets/dianpian/2025/07/24/roomid/
String filedir = FileUtils.generateDianPianDir(backupUploadVo.getRoomId().toString(), realPath);
String destFilePath = filedir + fileName;//文件上传目录
try {
fileService.upload(backupFile, destFilePath);
} catch (Exception e) {
return ResultBean.error("上传文件异常");
}
//保存垫片素材表
BackupMaterial backupMaterial = new BackupMaterial();
backupMaterial.setFileId(fileId);
backupMaterial.setBackupName(backupUploadVo.getBackupName());
String relativePath = destFilePath.replace(realPath, "");
backupMaterial.setFilePath(relativePath);
backupMaterial.setFileType(backupUploadVo.getFileType());
backupMaterial.setCreatedTime(LocalDateTime.now());
backupMaterial.setCreatedBy("admin");
backupMaterialMapper.insert(backupMaterial);
//添加审片间垫片配置
//垫片搬迁到转码平台,对应垫片任务切流
LambdaQueryWrapper<BackupConfig> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(BackupConfig::getRoomId,backupUploadVo.getRoomId());
wrapper.eq(BackupConfig::getBackupOrder,backupUploadVo.getBackupOrder());
BackupConfig backupConfig = backupConfigMapper.selectOne(wrapper);
if(ObjectUtil.isNull(backupConfig)){
backupConfig = new BackupConfig();
}
backupConfig.setRoomId(backupUploadVo.getRoomId());
backupConfig.setBackupId(backupMaterial.getId());
backupConfig.setBackupOrder(backupUploadVo.getBackupOrder());
backupConfigMapper.insertOrUpdate(backupConfig);
//对应垫片任务切源(转码平台演示环境已挂载统一存储)
//判断是否需要修改当前播出流的垫片
return null;
return ResultBean.ok("上传成功");
}
@Override
public ResultBean getByRoom(Long roomId) {
LambdaQueryWrapper<BackupConfig> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(BackupConfig::getRoomId,roomId);
List<BackupConfig> backupConfigs = backupConfigMapper.selectList(wrapper);
return ResultBean.ok(backupConfigs);
}
@Override
public ResultBean change(BackupChangeDto backupChangeDto) {
LambdaQueryWrapper<BackupConfig> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(BackupConfig::getRoomId,backupChangeDto.getRoomId());
List<BackupConfig> backupConfigs = backupConfigMapper.selectList(wrapper);
if(CollectionUtil.isNotEmpty(backupConfigs)){
backupConfigs.forEach(backupConfig -> {
if(backupConfig.getBackupId().equals(backupChangeDto.getBackupId())){
backupConfig.setBackupStatus("1");
//将播放流的垫片配置切到此垫片上
}else {
backupConfig.setBackupStatus("0");
}
backupConfigMapper.updateById(backupConfig);
});
}
return ResultBean.ok();
}
}
... ...
package com.wondertek.service.impl;
import com.wondertek.service.FileService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
/**
* @Description:
* @Author W5669
* @Create 2025/7/24
* @Version 1.0
*/
@Service
@Slf4j
public class FileServiceImpl implements FileService {
@Override
public void upload(MultipartFile backupFile, String filePath) throws IOException {
// 检查文件是否为空
if (backupFile.isEmpty()) {
throw new IllegalArgumentException("上传文件为空");
}
// 创建目标文件对象
File dest = new File(filePath);
// 检查目标目录是否存在,不存在则创建
File parentDir = dest.getParentFile();
if (!parentDir.exists()) {
if (!parentDir.mkdirs()) {
throw new IOException("目录创建失败: " + parentDir.getAbsolutePath());
}
}
try {
// 转存文件到指定路径
backupFile.transferTo(dest);
} catch (IOException e) {
throw new IOException("文件写入失败: " + e.getMessage(), e);
} catch (IllegalStateException e) {
throw new IOException("文件状态错误: " + e.getMessage(), e);
}
}
}
... ...
package com.wondertek.util;
import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* Title: FileUtils <br>
* Description: FileUtils <br>
*/
@Slf4j
public class FileUtils {
/**
* <p><b>Title:</b> getDatePathI</p>
* <p><b>Description:</b> 得到 年/月/日 格式字符串,如: 2020/03/30</p>
*
* @return
*/
public static String getDatePathI() {
SimpleDateFormat ymd = new SimpleDateFormat("yyyy/MM/dd");
return ymd.format(new Date());
}
/**
* 垫片文件存储规则
*
* @param id
* @param realPath
* @return
*/
public static String generateDianPianDir(String id, String realPath) {
return generateDianPianDir(id, realPath, getDatePathI());
}
public static String generateDianPianDir(String id, String realPath, String time) {
return StrUtil.concat(false, new String[] { realPath,"dianpian/", time, "/", id, "/" });
}
}
... ...
package com.wondertek.util;
import java.util.UUID;
public class UUIDUtil {
public static String randomUUID() {
String uuid = UUID.randomUUID().toString().replaceAll("-", "");
return uuid;
}
public static void main(String[] args) {
System.out.println(randomUUID());
}
}
... ...
... ... @@ -60,9 +60,13 @@ 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
file:
realPath: /home/wondertek/material_file_assets/
crp:
user:
username: admin
... ...