wanghongbo

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

1 package com.wondertek.controller; 1 package com.wondertek.controller;
2 2
3 3
  4 +import com.wondertek.dto.BackupChangeDto;
4 import com.wondertek.dto.BackupMaterialDto; 5 import com.wondertek.dto.BackupMaterialDto;
5 import com.wondertek.dto.BackupUploadVo; 6 import com.wondertek.dto.BackupUploadVo;
6 import com.wondertek.service.BackupMaterialService; 7 import com.wondertek.service.BackupMaterialService;
@@ -8,10 +9,7 @@ import com.wondertek.util.PageBean; @@ -8,10 +9,7 @@ import com.wondertek.util.PageBean;
8 import com.wondertek.util.ResultBean; 9 import com.wondertek.util.ResultBean;
9 import jakarta.annotation.Resource; 10 import jakarta.annotation.Resource;
10 import lombok.extern.slf4j.Slf4j; 11 import lombok.extern.slf4j.Slf4j;
11 -import org.springframework.web.bind.annotation.GetMapping;  
12 -import org.springframework.web.bind.annotation.PostMapping;  
13 -import org.springframework.web.bind.annotation.RequestMapping;  
14 -import org.springframework.web.bind.annotation.RestController; 12 +import org.springframework.web.bind.annotation.*;
15 import org.springframework.web.multipart.MultipartFile; 13 import org.springframework.web.multipart.MultipartFile;
16 14
17 @Slf4j 15 @Slf4j
@@ -27,9 +25,34 @@ public class BackupMaterialController { @@ -27,9 +25,34 @@ public class BackupMaterialController {
27 return backupMaterialService.queryPage(backupMaterialDto); 25 return backupMaterialService.queryPage(backupMaterialDto);
28 } 26 }
29 27
30 - //垫片上传 28 +
  29 + /**
  30 + * @description 垫片上传
  31 + * @author W5669
  32 + * @date 2025/7/24
  33 + * @param backupFile
  34 + * @param backupUploadVo
  35 + * @return ResultBean
  36 + */
31 @PostMapping("upload") 37 @PostMapping("upload")
32 ResultBean upload(MultipartFile backupFile, BackupUploadVo backupUploadVo){ 38 ResultBean upload(MultipartFile backupFile, BackupUploadVo backupUploadVo){
33 return backupMaterialService.upload(backupFile, backupUploadVo); 39 return backupMaterialService.upload(backupFile, backupUploadVo);
34 } 40 }
  41 +
  42 + /**
  43 + * @description 获取审片间垫片列表
  44 + * @author W5669
  45 + * @date 2025/7/24
  46 + * @param roomId
  47 + * @return ResultBean
  48 + */
  49 + @GetMapping("getByRoom")
  50 + ResultBean getByRoom(@RequestParam(value = "roomId") Long roomId){
  51 + return backupMaterialService.getByRoom(roomId);
  52 + }
  53 +
  54 + @PostMapping("change")
  55 + ResultBean change(@RequestBody BackupChangeDto backupChangeDto){
  56 + return backupMaterialService.change(backupChangeDto);
  57 + }
35 } 58 }
  1 +package com.wondertek.dto;
  2 +
  3 +import lombok.Data;
  4 +
  5 +/**
  6 + * @Description: 垫片切换请求体
  7 + * @Author W5669
  8 + * @Create 2025/7/24
  9 + * @Version 1.0
  10 + */
  11 +@Data
  12 +public class BackupChangeDto {
  13 + private Long roomId;
  14 + private Long backupId;
  15 +}
@@ -15,8 +15,8 @@ public class BackupUploadVo { @@ -15,8 +15,8 @@ public class BackupUploadVo {
15 //垫片名 15 //垫片名
16 private String backupName; 16 private String backupName;
17 //审片间id 17 //审片间id
18 - private String roomId; 18 + private Long roomId;
19 //1:垫片1,2:垫片2 19 //1:垫片1,2:垫片2
20 - private String backupOrder; 20 + private Integer backupOrder;
21 21
22 } 22 }
@@ -23,6 +23,7 @@ public class BackupConfig { @@ -23,6 +23,7 @@ public class BackupConfig {
23 private String backupPath; 23 private String backupPath;
24 /** 垫片序号 */ 24 /** 垫片序号 */
25 private Integer backupOrder; 25 private Integer backupOrder;
  26 + /** 垫片状态 0-默认 1-当前选中 */
  27 + private String backupStatus;
26 28
27 - // Getter 和 Setter 方法  
28 } 29 }
1 package com.wondertek.entity; 1 package com.wondertek.entity;
2 2
3 3
  4 +import com.baomidou.mybatisplus.annotation.IdType;
4 import com.baomidou.mybatisplus.annotation.TableId; 5 import com.baomidou.mybatisplus.annotation.TableId;
5 import com.baomidou.mybatisplus.annotation.TableName; 6 import com.baomidou.mybatisplus.annotation.TableName;
6 import com.baomidou.mybatisplus.extension.activerecord.Model; 7 import com.baomidou.mybatisplus.extension.activerecord.Model;
7 import com.fasterxml.jackson.annotation.JsonFormat; 8 import com.fasterxml.jackson.annotation.JsonFormat;
8 import lombok.Data; 9 import lombok.Data;
  10 +import org.yaml.snakeyaml.events.Event;
9 11
10 import java.io.Serializable; 12 import java.io.Serializable;
11 import java.time.LocalDateTime; 13 import java.time.LocalDateTime;
@@ -20,8 +22,10 @@ import java.util.Date; @@ -20,8 +22,10 @@ import java.util.Date;
20 @TableName("crp_backup_material") 22 @TableName("crp_backup_material")
21 public class BackupMaterial extends Model<BackupMaterial> { 23 public class BackupMaterial extends Model<BackupMaterial> {
22 /** id */ 24 /** id */
23 - @TableId 25 + @TableId(type = IdType.AUTO)
24 private Long id ; 26 private Long id ;
  27 + /** 文件标识 */
  28 + private String fileId ;
25 /** 文件类型 */ 29 /** 文件类型 */
26 private String fileType ; 30 private String fileType ;
27 /** 文件路径 */ 31 /** 文件路径 */
1 package com.wondertek.service; 1 package com.wondertek.service;
2 2
3 import com.baomidou.mybatisplus.extension.service.IService; 3 import com.baomidou.mybatisplus.extension.service.IService;
  4 +import com.wondertek.dto.BackupChangeDto;
4 import com.wondertek.dto.BackupMaterialDto; 5 import com.wondertek.dto.BackupMaterialDto;
5 import com.wondertek.dto.BackupUploadVo; 6 import com.wondertek.dto.BackupUploadVo;
6 import com.wondertek.entity.BackupMaterial; 7 import com.wondertek.entity.BackupMaterial;
@@ -13,4 +14,8 @@ public interface BackupMaterialService extends IService<BackupMaterial> { @@ -13,4 +14,8 @@ public interface BackupMaterialService extends IService<BackupMaterial> {
13 PageBean queryPage(BackupMaterialDto BackupMaterialDto); 14 PageBean queryPage(BackupMaterialDto BackupMaterialDto);
14 15
15 ResultBean upload(MultipartFile backupFile, BackupUploadVo backupUploadVo); 16 ResultBean upload(MultipartFile backupFile, BackupUploadVo backupUploadVo);
  17 +
  18 + ResultBean getByRoom(Long roomId);
  19 +
  20 + ResultBean change(BackupChangeDto backupChangeDto);
16 } 21 }
  1 +package com.wondertek.service;
  2 +
  3 +import org.springframework.web.multipart.MultipartFile;
  4 +
  5 +import java.io.IOException;
  6 +
  7 +/**
  8 + * @Description: 文件服务
  9 + * @Author W5669
  10 + * @Create 2025/7/24
  11 + * @Version 1.0
  12 + */
  13 +public interface FileService {
  14 + /**
  15 + * @Description: 文件上传
  16 + * @Author W5669
  17 + * @Create 2025/7/24
  18 + * @Param [backupFile, destFilePath]
  19 + * @Return void
  20 + */
  21 + void upload(MultipartFile backupFile, String destFilePath) throws IOException;
  22 +}
1 package com.wondertek.service.impl; 1 package com.wondertek.service.impl;
2 2
  3 +import cn.hutool.core.collection.CollectionUtil;
  4 +import cn.hutool.core.util.ObjectUtil;
3 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 5 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
4 import com.baomidou.mybatisplus.core.metadata.IPage; 6 import com.baomidou.mybatisplus.core.metadata.IPage;
5 import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 7 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
6 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 8 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  9 +import com.wondertek.dto.BackupChangeDto;
7 import com.wondertek.dto.BackupMaterialDto; 10 import com.wondertek.dto.BackupMaterialDto;
8 import com.wondertek.dto.BackupUploadVo; 11 import com.wondertek.dto.BackupUploadVo;
  12 +import com.wondertek.entity.BackupConfig;
9 import com.wondertek.entity.BackupMaterial; 13 import com.wondertek.entity.BackupMaterial;
  14 +import com.wondertek.exception.BusinessException;
  15 +import com.wondertek.mapper.BackupConfigMapper;
10 import com.wondertek.mapper.BackupMaterialMapper; 16 import com.wondertek.mapper.BackupMaterialMapper;
11 import com.wondertek.service.BackupMaterialService; 17 import com.wondertek.service.BackupMaterialService;
  18 +import com.wondertek.service.FileService;
  19 +import com.wondertek.util.FileUtils;
12 import com.wondertek.util.PageBean; 20 import com.wondertek.util.PageBean;
13 import com.wondertek.util.ResultBean; 21 import com.wondertek.util.ResultBean;
  22 +import com.wondertek.util.UUIDUtil;
14 import jakarta.annotation.Resource; 23 import jakarta.annotation.Resource;
15 import org.apache.commons.lang3.StringUtils; 24 import org.apache.commons.lang3.StringUtils;
  25 +import org.springframework.beans.factory.annotation.Value;
16 import org.springframework.stereotype.Service; 26 import org.springframework.stereotype.Service;
17 import org.springframework.web.multipart.MultipartFile; 27 import org.springframework.web.multipart.MultipartFile;
18 28
  29 +import java.time.LocalDateTime;
  30 +import java.util.List;
  31 +
19 @Service 32 @Service
20 public class BackupMaterialServiceImpl extends ServiceImpl<BackupMaterialMapper, BackupMaterial> implements BackupMaterialService { 33 public class BackupMaterialServiceImpl extends ServiceImpl<BackupMaterialMapper, BackupMaterial> implements BackupMaterialService {
21 34
22 @Resource 35 @Resource
23 private BackupMaterialMapper backupMaterialMapper; 36 private BackupMaterialMapper backupMaterialMapper;
  37 + @Resource
  38 + private FileService fileService;
  39 + @Value("${file.realPath}")
  40 + private String realPath;
  41 + @Resource
  42 + private BackupConfigMapper backupConfigMapper;
  43 +
24 44
25 @Override 45 @Override
26 public PageBean queryPage(BackupMaterialDto backupMaterialDto) { 46 public PageBean queryPage(BackupMaterialDto backupMaterialDto) {
@@ -46,11 +66,77 @@ public class BackupMaterialServiceImpl extends ServiceImpl<BackupMaterialMapper, @@ -46,11 +66,77 @@ public class BackupMaterialServiceImpl extends ServiceImpl<BackupMaterialMapper,
46 @Override 66 @Override
47 public ResultBean upload(MultipartFile backupFile, BackupUploadVo backupUploadVo) { 67 public ResultBean upload(MultipartFile backupFile, BackupUploadVo backupUploadVo) {
48 //上传文件 68 //上传文件
49 - //加入保存垫片素材表 69 + if(!"mp4".equalsIgnoreCase(backupUploadVo.getFileType())){
  70 + throw new BusinessException("仅支持上传mp4格式的垫片文件!");
  71 + }
  72 +
  73 + String fileId = UUIDUtil.randomUUID();
  74 + String fileName = backupUploadVo.getBackupName() + "." + backupUploadVo.getFileType();
  75 + ///home/wondertek/material_file_assets/dianpian/2025/07/24/roomid/
  76 + String filedir = FileUtils.generateDianPianDir(backupUploadVo.getRoomId().toString(), realPath);
  77 + String destFilePath = filedir + fileName;//文件上传目录
  78 + try {
  79 + fileService.upload(backupFile, destFilePath);
  80 + } catch (Exception e) {
  81 + return ResultBean.error("上传文件异常");
  82 + }
  83 +
  84 + //保存垫片素材表
  85 + BackupMaterial backupMaterial = new BackupMaterial();
  86 + backupMaterial.setFileId(fileId);
  87 + backupMaterial.setBackupName(backupUploadVo.getBackupName());
  88 + String relativePath = destFilePath.replace(realPath, "");
  89 + backupMaterial.setFilePath(relativePath);
  90 + backupMaterial.setFileType(backupUploadVo.getFileType());
  91 + backupMaterial.setCreatedTime(LocalDateTime.now());
  92 + backupMaterial.setCreatedBy("admin");
  93 + backupMaterialMapper.insert(backupMaterial);
50 //添加审片间垫片配置 94 //添加审片间垫片配置
51 - //垫片搬迁到转码平台,对应垫片任务切流 95 + LambdaQueryWrapper<BackupConfig> wrapper = new LambdaQueryWrapper<>();
  96 + wrapper.eq(BackupConfig::getRoomId,backupUploadVo.getRoomId());
  97 + wrapper.eq(BackupConfig::getBackupOrder,backupUploadVo.getBackupOrder());
  98 + BackupConfig backupConfig = backupConfigMapper.selectOne(wrapper);
  99 + if(ObjectUtil.isNull(backupConfig)){
  100 + backupConfig = new BackupConfig();
  101 + }
  102 + backupConfig.setRoomId(backupUploadVo.getRoomId());
  103 + backupConfig.setBackupId(backupMaterial.getId());
  104 + backupConfig.setBackupOrder(backupUploadVo.getBackupOrder());
  105 + backupConfigMapper.insertOrUpdate(backupConfig);
  106 +
  107 + //对应垫片任务切源(转码平台演示环境已挂载统一存储)
  108 +
52 //判断是否需要修改当前播出流的垫片 109 //判断是否需要修改当前播出流的垫片
53 110
54 - return null; 111 + return ResultBean.ok("上传成功");
55 } 112 }
  113 +
  114 + @Override
  115 + public ResultBean getByRoom(Long roomId) {
  116 + LambdaQueryWrapper<BackupConfig> wrapper = new LambdaQueryWrapper<>();
  117 + wrapper.eq(BackupConfig::getRoomId,roomId);
  118 + List<BackupConfig> backupConfigs = backupConfigMapper.selectList(wrapper);
  119 + return ResultBean.ok(backupConfigs);
  120 + }
  121 +
  122 + @Override
  123 + public ResultBean change(BackupChangeDto backupChangeDto) {
  124 + LambdaQueryWrapper<BackupConfig> wrapper = new LambdaQueryWrapper<>();
  125 + wrapper.eq(BackupConfig::getRoomId,backupChangeDto.getRoomId());
  126 + List<BackupConfig> backupConfigs = backupConfigMapper.selectList(wrapper);
  127 + if(CollectionUtil.isNotEmpty(backupConfigs)){
  128 + backupConfigs.forEach(backupConfig -> {
  129 + if(backupConfig.getBackupId().equals(backupChangeDto.getBackupId())){
  130 + backupConfig.setBackupStatus("1");
  131 + //将播放流的垫片配置切到此垫片上
  132 + }else {
  133 + backupConfig.setBackupStatus("0");
  134 + }
  135 + backupConfigMapper.updateById(backupConfig);
  136 + });
  137 +
  138 + }
  139 + return ResultBean.ok();
  140 + }
  141 +
56 } 142 }
  1 +package com.wondertek.service.impl;
  2 +
  3 +import com.wondertek.service.FileService;
  4 +import lombok.extern.slf4j.Slf4j;
  5 +import org.springframework.stereotype.Service;
  6 +
  7 +import org.springframework.util.StringUtils;
  8 +import org.springframework.web.multipart.MultipartFile;
  9 +import java.io.File;
  10 +import java.io.IOException;
  11 +import java.nio.file.Files;
  12 +import java.nio.file.Path;
  13 +import java.nio.file.Paths;
  14 +
  15 +/**
  16 + * @Description:
  17 + * @Author W5669
  18 + * @Create 2025/7/24
  19 + * @Version 1.0
  20 + */
  21 +@Service
  22 +@Slf4j
  23 +public class FileServiceImpl implements FileService {
  24 + @Override
  25 + public void upload(MultipartFile backupFile, String filePath) throws IOException {
  26 + // 检查文件是否为空
  27 + if (backupFile.isEmpty()) {
  28 + throw new IllegalArgumentException("上传文件为空");
  29 + }
  30 +
  31 + // 创建目标文件对象
  32 + File dest = new File(filePath);
  33 +
  34 + // 检查目标目录是否存在,不存在则创建
  35 + File parentDir = dest.getParentFile();
  36 + if (!parentDir.exists()) {
  37 + if (!parentDir.mkdirs()) {
  38 + throw new IOException("目录创建失败: " + parentDir.getAbsolutePath());
  39 + }
  40 + }
  41 +
  42 + try {
  43 + // 转存文件到指定路径
  44 + backupFile.transferTo(dest);
  45 + } catch (IOException e) {
  46 + throw new IOException("文件写入失败: " + e.getMessage(), e);
  47 + } catch (IllegalStateException e) {
  48 + throw new IOException("文件状态错误: " + e.getMessage(), e);
  49 + }
  50 +
  51 +
  52 + }
  53 +}
  1 +package com.wondertek.util;
  2 +
  3 +import cn.hutool.core.util.StrUtil;
  4 +import lombok.extern.slf4j.Slf4j;
  5 +import java.text.SimpleDateFormat;
  6 +import java.util.Date;
  7 +
  8 +/**
  9 + * Title: FileUtils <br>
  10 + * Description: FileUtils <br>
  11 + */
  12 +@Slf4j
  13 +public class FileUtils {
  14 + /**
  15 + * <p><b>Title:</b> getDatePathI</p>
  16 + * <p><b>Description:</b> 得到 年/月/日 格式字符串,如: 2020/03/30</p>
  17 + *
  18 + * @return
  19 + */
  20 + public static String getDatePathI() {
  21 + SimpleDateFormat ymd = new SimpleDateFormat("yyyy/MM/dd");
  22 + return ymd.format(new Date());
  23 + }
  24 +
  25 + /**
  26 + * 垫片文件存储规则
  27 + *
  28 + * @param id
  29 + * @param realPath
  30 + * @return
  31 + */
  32 + public static String generateDianPianDir(String id, String realPath) {
  33 + return generateDianPianDir(id, realPath, getDatePathI());
  34 + }
  35 +
  36 + public static String generateDianPianDir(String id, String realPath, String time) {
  37 + return StrUtil.concat(false, new String[] { realPath,"dianpian/", time, "/", id, "/" });
  38 + }
  39 +
  40 +
  41 +}
  1 +package com.wondertek.util;
  2 +
  3 +import java.util.UUID;
  4 +
  5 +public class UUIDUtil {
  6 +
  7 + public static String randomUUID() {
  8 + String uuid = UUID.randomUUID().toString().replaceAll("-", "");
  9 + return uuid;
  10 + }
  11 +
  12 + public static void main(String[] args) {
  13 + System.out.println(randomUUID());
  14 + }
  15 +}
@@ -60,9 +60,13 @@ mybatis-plus: @@ -60,9 +60,13 @@ mybatis-plus:
60 logic-delete-value: 0 60 logic-delete-value: 0
61 61
62 transcode: 62 transcode:
63 - delayTimeUrl: http://192.168.1.41:8080/transcode/delayTime # 延迟接口 63 + delayTimeUrl: http://192.168.1.237:9002/api/v1/delayTime # 延迟接口
  64 + blockStatusUrl: http://192.168.1.237:9002/api/v1/blockStatus # 屏蔽/恢复
64 getTaskDetail: http://192.168.1.237:9002/api/v1/getTaskDetail 65 getTaskDetail: http://192.168.1.237:9002/api/v1/getTaskDetail
65 66
  67 +file:
  68 + realPath: /home/wondertek/material_file_assets/
  69 +
66 crp: 70 crp:
67 user: 71 user:
68 username: admin 72 username: admin