wangyunpeng il y a 3 semaines
Parent
commit
9195d3dd24
33 fichiers modifiés avec 3282 ajouts et 8 suppressions
  1. 212 0
      core/src/main/java/com/tzld/supply/api/AigcFFmpegApiService.java
  2. 1 1
      core/src/main/java/com/tzld/supply/api/fish/FishApiService.java
  3. 2 1
      core/src/main/java/com/tzld/supply/api/fish/FishApiServiceImpl.java
  4. 31 0
      core/src/main/java/com/tzld/supply/common/enums/ProduceVideoStatusEnum.java
  5. 96 0
      core/src/main/java/com/tzld/supply/dao/mapper/supply/spider/ProduceVideoAudioMapper.java
  6. 96 0
      core/src/main/java/com/tzld/supply/dao/mapper/supply/spider/ProduceVideoMapper.java
  7. 2 0
      core/src/main/java/com/tzld/supply/dao/mapper/supply/spider/ext/SpiderMapperExt.java
  8. 111 0
      core/src/main/java/com/tzld/supply/job/VideoVoiceGenerateJob.java
  9. 17 0
      core/src/main/java/com/tzld/supply/model/param/FFmpeg/AudioSplitParam.java
  10. 13 0
      core/src/main/java/com/tzld/supply/model/param/FFmpeg/AudioVolumeParam.java
  11. 13 0
      core/src/main/java/com/tzld/supply/model/param/FFmpeg/CommandParam.java
  12. 14 0
      core/src/main/java/com/tzld/supply/model/param/FFmpeg/ExtraVideoSrtParam.java
  13. 15 0
      core/src/main/java/com/tzld/supply/model/param/FFmpeg/MediaSimpleMergeParam.java
  14. 14 0
      core/src/main/java/com/tzld/supply/model/param/FFmpeg/MergeBgVideoParam.java
  15. 14 0
      core/src/main/java/com/tzld/supply/model/param/FFmpeg/RemoveBgParam.java
  16. 11 0
      core/src/main/java/com/tzld/supply/model/param/FFmpeg/VideoAddAssSubtitleParam.java
  17. 19 0
      core/src/main/java/com/tzld/supply/model/param/FFmpeg/VideoAddAudioParam.java
  18. 61 0
      core/src/main/java/com/tzld/supply/model/param/FFmpeg/VideoAddTailParam.java
  19. 14 0
      core/src/main/java/com/tzld/supply/model/param/FFmpeg/VideoInfoParam.java
  20. 12 0
      core/src/main/java/com/tzld/supply/model/param/FFmpeg/VideoTextureParam.java
  21. 12 0
      core/src/main/java/com/tzld/supply/model/param/FFmpeg/VideoTimeCutParam.java
  22. 12 0
      core/src/main/java/com/tzld/supply/model/param/FFmpeg/VideoTimeExtraFrameParam.java
  23. 12 0
      core/src/main/java/com/tzld/supply/model/param/FFmpeg/VideoTranscodingParam.java
  24. 16 0
      core/src/main/java/com/tzld/supply/model/param/FFmpeg/VideoUrlsParam.java
  25. 200 0
      core/src/main/java/com/tzld/supply/model/po/supply/spider/ProduceVideo.java
  26. 272 0
      core/src/main/java/com/tzld/supply/model/po/supply/spider/ProduceVideoAudio.java
  27. 752 0
      core/src/main/java/com/tzld/supply/model/po/supply/spider/ProduceVideoAudioExample.java
  28. 612 0
      core/src/main/java/com/tzld/supply/model/po/supply/spider/ProduceVideoExample.java
  29. 4 2
      core/src/main/resources/generator/mybatis-spider-generator-config.xml
  30. 318 0
      core/src/main/resources/mapper/supply/spider/ProduceVideoAudioMapper.xml
  31. 286 0
      core/src/main/resources/mapper/supply/spider/ProduceVideoMapper.xml
  32. 9 0
      core/src/main/resources/mapper/supply/spider/ext/SpiderMapperExt.xml
  33. 9 4
      server/src/main/java/com/tzld/supply/controller/XxlJobController.java

+ 212 - 0
core/src/main/java/com/tzld/supply/api/AigcFFmpegApiService.java

@@ -0,0 +1,212 @@
+package com.tzld.supply.api;
+
+
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.TypeReference;
+import com.tzld.supply.common.base.CommonResponse;
+import com.tzld.supply.model.param.FFmpeg.*;
+import com.tzld.supply.util.HttpClientFactory;
+import lombok.extern.slf4j.Slf4j;
+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.util.EntityUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import java.nio.charset.StandardCharsets;
+import java.util.List;
+
+@Slf4j
+@Component
+public class AigcFFmpegApiService {
+
+    @Value("${ffmpeg.base.url:http://ffmpeg.aiddit.com/aigc}")
+    private String FFMPEG_BASE_URL;
+
+    private final CloseableHttpClient client = HttpClientFactory.create(
+            60000, 60000, 200, 200, 0, 60000);
+
+    /**
+     * 融合背景视频
+     */
+    public String mergeBgVideo(MergeBgVideoParam param) {
+        return post("/mergeBgVideo", param, String.class);
+    }
+
+    /**
+     * 去除背景
+     */
+    public String removeBg(RemoveBgParam param) {
+        return post("/removeBg", param, String.class);
+    }
+
+    /**
+     * 视频添加ass字幕
+     */
+    public String videoAddAssSubtitle(VideoAddAssSubtitleParam param) {
+        return post("/videoAddAssSubtitle", param, String.class);
+    }
+
+    /**
+     * 视频提取音频
+     */
+    public List<String> videoExtraAudio(VideoUrlsParam param) {
+        return post("/extraAudio", param, List.class);
+    }
+
+    /**
+     * 视频提取文本
+     */
+    public List<String> videoExtraText(VideoUrlsParam param) {
+        return post("/extraText", param, List.class);
+    }
+
+    /**
+     * 视频提取srt
+     */
+    public String extraVideoSrt(ExtraVideoSrtParam param) {
+        return post("/extraVideoSrt", param, String.class);
+    }
+
+    /**
+     * 视频提取关键帧
+     */
+    public List<String> videoExtraFrame(VideoUrlsParam param) {
+        return post("/extraFrame", param, List.class);
+    }
+
+    /**
+     * 视频截帧-根据时间戳
+     */
+    public String videoTimeExtraFrame(VideoTimeExtraFrameParam param) {
+        return post("/timeExtraFrame", param, String.class);
+    }
+
+    /**
+     * 视频片段截取-根据时间范围
+     */
+    public String timeCutVideo(VideoTimeCutParam param) {
+        return post("/timeCutVideo", param, String.class);
+    }
+
+    /**
+     * 视频提取音频-根据时间范围
+     */
+    public String timeExtraAudio(VideoTimeCutParam param) {
+        return post("/timeExtraAudio", param, String.class);
+    }
+
+    /**
+     * 视频音频简单合并
+     */
+    public String mediaSimpleMerge(MediaSimpleMergeParam param) {
+        return post("/media/merge/simple", param, String.class);
+    }
+
+    /**
+     * 视频贴图
+     */
+    public String videoTexture(VideoTextureParam param) {
+        return post("/videoTexture", param, String.class);
+    }
+
+    /**
+     * 获取视频宽高等信息
+     */
+    public String videoInfo(VideoInfoParam param) {
+        return post("/video/info", param, String.class);
+    }
+
+    /**
+     * 视频拼接
+     */
+    public String videoConcat(VideoUrlsParam param) {
+        return post("/videoConcat", param, String.class);
+    }
+
+    /**
+     * 视频增加片尾
+     */
+    public String videoAddTail(VideoAddTailParam param) {
+        return post("/videoAddTail", param, String.class);
+    }
+
+    /**
+     * 视频转码
+     */
+    public String videoTranscoding(VideoTranscodingParam param) {
+        return post("/videoTranscoding", param, String.class);
+    }
+
+    /**
+     * 视频添加音频
+     */
+    public String videoAddAudio(VideoAddAudioParam param) {
+        return post("/videoAddAudio", param, String.class);
+    }
+
+    /**
+     * 音频降噪
+     */
+    public String audioVolume(AudioVolumeParam param) {
+        return post("/audioVolume", param, String.class);
+    }
+
+    /**
+     * 音频切割
+     */
+    public String audioSplit(AudioSplitParam param) {
+        return post("/audio/split", param, String.class);
+    }
+
+    /**
+     * 命令行执行
+     */
+    public String command(CommandParam param) {
+        return post("/command", param, String.class);
+    }
+
+    /**
+     * 通用 POST 请求发送方法
+     * @param endpoint 接口路径(相对于基础 URL)
+     * @param param 请求参数对象
+     * @param dataType 返回数据类型
+     * @return 接口返回数据(CommonResponse.data)
+     */
+    private <T> T post(String endpoint, Object param, Class<T> dataType) {
+        String url = FFMPEG_BASE_URL + "/infrastructure/ffmpeg" + endpoint;
+        try {
+            HttpPost httpPost = new HttpPost(url);
+            // 设置请求体
+            StringEntity entity = new StringEntity(
+                    JSONObject.toJSONString(param),
+                    StandardCharsets.UTF_8
+            );
+            httpPost.setEntity(entity);
+            httpPost.setHeader("Content-Type", "application/json;charset=UTF-8");
+            // 执行请求
+            CloseableHttpResponse response = client.execute(httpPost);
+            int statusCode = response.getStatusLine().getStatusCode();
+            if (statusCode != 200) {
+                log.error("调用FFmpeg接口失败,URL:{},状态码:{}", url, statusCode);
+                return null;
+            }
+            // 解析响应
+            String responseBody = EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8);
+            CommonResponse<T> commonResponse = JSONObject.parseObject(
+                    responseBody,
+                    new TypeReference<CommonResponse<T>>() {}
+            );
+            if (commonResponse == null || commonResponse.getCode() != 0) {
+                log.error("调用FFmpeg接口返回异常,URL:{},响应:{}", url, responseBody);
+                return null;
+            }
+            return commonResponse.getData();
+        } catch (Exception e) {
+            log.error("调用FFmpeg接口异常,URL:{}", url, e);
+            return null;
+        }
+    }
+}

+ 1 - 1
core/src/main/java/com/tzld/supply/api/fish/FishApiService.java

@@ -6,7 +6,7 @@ public interface FishApiService {
 
     void importTTSModels(String speakerId);
 
-    String tts(String speakerId, String text, String bizId);
+    String tts(String speakerId, String text, Double speed, String bizId);
 
     String ttsByAudio(byte[] referenceAudio, String referenceText, String text, String bizId);
 

+ 2 - 1
core/src/main/java/com/tzld/supply/api/fish/FishApiServiceImpl.java

@@ -176,7 +176,7 @@ public class FishApiServiceImpl implements FishApiService {
     }
 
     @Override
-    public String tts(String speakerId, String text, String bizId) {
+    public String tts(String speakerId, String text, Double speed, String bizId) {
         // 先从缓存中拿
         String textMd5 = Md5Util.encoderByMd5(text);
         String ttsUrl = getCacheTtsUrl(speakerId, textMd5);
@@ -189,6 +189,7 @@ public class FishApiServiceImpl implements FishApiService {
         Map<String, String> paramMap = new HashMap<>();
         paramMap.put("reference_id", speakerId);
         paramMap.put("text", text);
+        paramMap.put("speed", String.valueOf(speed));
 
         boolean enableRetry = false;
         // retry 3 times

+ 31 - 0
core/src/main/java/com/tzld/supply/common/enums/ProduceVideoStatusEnum.java

@@ -0,0 +1,31 @@
+package com.tzld.supply.common.enums;
+
+import lombok.Getter;
+
+@Getter
+public enum ProduceVideoStatusEnum {
+    WAITING(0, "待执行"),
+    PROCESSING(1, "执行中"),
+    PASSED(2, "执行成功"),
+    ABANDONED(3, "执行失败"),
+    ;
+
+    // 处理状态 0-待分析 1-筛选中 2-通过 3-废弃
+    private int code;
+    private String msg;
+
+
+    ProduceVideoStatusEnum(int code, String msg) {
+        this.code = code;
+        this.msg = msg;
+    }
+
+    public static ProduceVideoStatusEnum getByCode(int code) {
+        for (ProduceVideoStatusEnum statusEnum : ProduceVideoStatusEnum.values()) {
+            if (statusEnum.getCode() == code) {
+                return statusEnum;
+            }
+        }
+        return null;
+    }
+}

+ 96 - 0
core/src/main/java/com/tzld/supply/dao/mapper/supply/spider/ProduceVideoAudioMapper.java

@@ -0,0 +1,96 @@
+package com.tzld.supply.dao.mapper.supply.spider;
+
+import com.tzld.supply.model.po.supply.spider.ProduceVideoAudio;
+import com.tzld.supply.model.po.supply.spider.ProduceVideoAudioExample;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+public interface ProduceVideoAudioMapper {
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table produce_video_audio
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    long countByExample(ProduceVideoAudioExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table produce_video_audio
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    int deleteByExample(ProduceVideoAudioExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table produce_video_audio
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    int deleteByPrimaryKey(String id);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table produce_video_audio
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    int insert(ProduceVideoAudio record);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table produce_video_audio
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    int insertSelective(ProduceVideoAudio record);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table produce_video_audio
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    List<ProduceVideoAudio> selectByExample(ProduceVideoAudioExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table produce_video_audio
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    ProduceVideoAudio selectByPrimaryKey(String id);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table produce_video_audio
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    int updateByExampleSelective(@Param("record") ProduceVideoAudio record, @Param("example") ProduceVideoAudioExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table produce_video_audio
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    int updateByExample(@Param("record") ProduceVideoAudio record, @Param("example") ProduceVideoAudioExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table produce_video_audio
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    int updateByPrimaryKeySelective(ProduceVideoAudio record);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table produce_video_audio
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    int updateByPrimaryKey(ProduceVideoAudio record);
+}

+ 96 - 0
core/src/main/java/com/tzld/supply/dao/mapper/supply/spider/ProduceVideoMapper.java

@@ -0,0 +1,96 @@
+package com.tzld.supply.dao.mapper.supply.spider;
+
+import com.tzld.supply.model.po.supply.spider.ProduceVideo;
+import com.tzld.supply.model.po.supply.spider.ProduceVideoExample;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+public interface ProduceVideoMapper {
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table produce_video
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    long countByExample(ProduceVideoExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table produce_video
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    int deleteByExample(ProduceVideoExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table produce_video
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    int deleteByPrimaryKey(String id);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table produce_video
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    int insert(ProduceVideo record);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table produce_video
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    int insertSelective(ProduceVideo record);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table produce_video
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    List<ProduceVideo> selectByExample(ProduceVideoExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table produce_video
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    ProduceVideo selectByPrimaryKey(String id);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table produce_video
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    int updateByExampleSelective(@Param("record") ProduceVideo record, @Param("example") ProduceVideoExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table produce_video
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    int updateByExample(@Param("record") ProduceVideo record, @Param("example") ProduceVideoExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table produce_video
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    int updateByPrimaryKeySelective(ProduceVideo record);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table produce_video
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    int updateByPrimaryKey(ProduceVideo record);
+}

+ 2 - 0
core/src/main/java/com/tzld/supply/dao/mapper/supply/spider/ext/SpiderMapperExt.java

@@ -20,4 +20,6 @@ public interface SpiderMapperExt {
     List<SpiderContent> getMediaSearchSpiderContent(Integer status, Long startTime, Long endTime, String mediaType);
 
     List<SpiderContentMedia> getMediaSearchSpiderContentMedia(Integer status, Long startTime, Long endTime, Integer mediaStatus, String mediaType);
+
+    List<SpiderContent> getVideoGenerateContent(Integer status, Long startTime, Long endTime);
 }

+ 111 - 0
core/src/main/java/com/tzld/supply/job/VideoVoiceGenerateJob.java

@@ -0,0 +1,111 @@
+package com.tzld.supply.job;
+
+
+import cn.hutool.core.collection.CollectionUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.tzld.supply.api.AigcFFmpegApiService;
+import com.tzld.supply.api.fish.FishApiService;
+import com.tzld.supply.common.enums.ProduceVideoStatusEnum;
+import com.tzld.supply.common.enums.SpiderContentStatusEnum;
+import com.tzld.supply.dao.mapper.supply.spider.AiModelTtsMapper;
+import com.tzld.supply.dao.mapper.supply.spider.ProduceVideoAudioMapper;
+import com.tzld.supply.dao.mapper.supply.spider.ProduceVideoMapper;
+import com.tzld.supply.dao.mapper.supply.spider.ext.SpiderMapperExt;
+import com.tzld.supply.model.param.FFmpeg.VideoInfoParam;
+import com.tzld.supply.model.po.supply.spider.*;
+import com.tzld.supply.util.DateUtils;
+import com.tzld.supply.util.DistributedIdGenerator;
+import com.xxl.job.core.biz.model.ReturnT;
+import com.xxl.job.core.handler.annotation.XxlJob;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.experimental.Accessors;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Random;
+
+@Slf4j
+@Component
+public class VideoVoiceGenerateJob {
+
+    @Autowired
+    private SpiderMapperExt spiderMapperExt;
+    @Autowired
+    private FishApiService fishApiService;
+    @Autowired
+    private AiModelTtsMapper ttsMapper;
+    @Autowired
+    private ProduceVideoMapper produceVideoMapper;
+    @Autowired
+    private ProduceVideoAudioMapper produceVideoAudioMapper;
+    @Autowired
+    private AigcFFmpegApiService ffmpegApiService;
+
+    @XxlJob("videoVoiceGenerateJob")
+    public ReturnT<String> videoVoiceGenerateJob(String param) {
+        Long startTime = DateUtils.getTodayStart();
+        if (StringUtils.isNotBlank(param)) {
+            startTime = DateUtils.getStartOfDay(param, "yyyyMMdd");
+        }
+        Long endTime = startTime + 86400 * 1000;
+        List<SpiderContent> contentList = spiderMapperExt.getVideoGenerateContent(SpiderContentStatusEnum.PASSED.getCode(),
+                startTime, endTime);
+        if (CollectionUtil.isEmpty(contentList)) {
+            return ReturnT.SUCCESS;
+        }
+        for (SpiderContent content : contentList) {
+            // 检查是否存在模型
+            List<AiModelTts> ttsList = ttsMapper.selectByExample(new AiModelTtsExample());
+            // 随机选择一个模型
+            AiModelTts tts = ttsList.get(new Random().nextInt(ttsList.size()));
+            String audioId = DistributedIdGenerator.generate();
+            String voiceUrl = fishApiService.tts(tts.getSpeakerId(), content.getPqImproveNarrationScript(), 1.0, audioId);
+            if (StringUtils.isBlank(voiceUrl)) {
+                log.error("生成语音失败,contentId: {}", content.getId());
+                continue;
+            }
+
+            // 获取音频信息
+            String mediaInfo = ffmpegApiService.videoInfo(new VideoInfoParam(voiceUrl));
+            AudioInfo audioInfo = JSONObject.parseObject(mediaInfo, AudioInfo.class);
+
+            // save video
+            Long now = System.currentTimeMillis();
+            ProduceVideo video = new ProduceVideo();
+            video.setId(DistributedIdGenerator.generate());
+            video.setContentId(content.getId());
+            video.setStatus(ProduceVideoStatusEnum.PROCESSING.getCode());
+            video.setCreateTime(now);
+            video.setUpdateTime(now);
+            produceVideoMapper.insertSelective(video);
+
+            // 保存语音
+            ProduceVideoAudio audio = new ProduceVideoAudio();
+            audio.setId(audioId);
+            audio.setProduceVideoId(video.getId());
+            audio.setUrl(voiceUrl);
+            audio.setDuration(audioInfo.getDuration());
+            audio.setStatus(1);
+            audio.setCreateTime(now);
+            audio.setUpdateTime(now);
+            produceVideoAudioMapper.insertSelective(audio);
+        }
+        return ReturnT.SUCCESS;
+    }
+
+    @Getter
+    @Setter
+    @Accessors(chain = true)
+    public static class AudioInfo {
+        // 毫秒
+        private Integer duration;
+        // Byte
+        private Integer size;
+        // 音频采样率
+        private Integer sampleRate;
+    }
+}

+ 17 - 0
core/src/main/java/com/tzld/supply/model/param/FFmpeg/AudioSplitParam.java

@@ -0,0 +1,17 @@
+package com.tzld.supply.model.param.FFmpeg;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+@Data
+@Accessors(chain = true)
+public class AudioSplitParam {
+
+    private String audioUrl;
+
+    /**
+     * 间隔时长,按照间隔时长切分时需要
+     */
+    private Integer segmentTime;
+
+}

+ 13 - 0
core/src/main/java/com/tzld/supply/model/param/FFmpeg/AudioVolumeParam.java

@@ -0,0 +1,13 @@
+package com.tzld.supply.model.param.FFmpeg;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+@Data
+@Accessors(chain = true)
+public class AudioVolumeParam {
+
+    private String audioUrl;
+
+    private Double volume;
+}

+ 13 - 0
core/src/main/java/com/tzld/supply/model/param/FFmpeg/CommandParam.java

@@ -0,0 +1,13 @@
+package com.tzld.supply.model.param.FFmpeg;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class CommandParam {
+    private String ffmpegCommand;
+    private String outputFile;
+    // video audio image text unknown
+    private String outputType;
+}

+ 14 - 0
core/src/main/java/com/tzld/supply/model/param/FFmpeg/ExtraVideoSrtParam.java

@@ -0,0 +1,14 @@
+package com.tzld.supply.model.param.FFmpeg;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.experimental.Accessors;
+
+
+@Getter
+@Setter
+@Accessors(chain = true)
+public class ExtraVideoSrtParam {
+    private String videoUrl;
+
+}

+ 15 - 0
core/src/main/java/com/tzld/supply/model/param/FFmpeg/MediaSimpleMergeParam.java

@@ -0,0 +1,15 @@
+package com.tzld.supply.model.param.FFmpeg;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.experimental.Accessors;
+
+import java.util.List;
+
+@Getter
+@Setter
+@Accessors(chain = true)
+public class MediaSimpleMergeParam {
+    private List<String> videoUrls;
+    private List<String> audioUrls;
+}

+ 14 - 0
core/src/main/java/com/tzld/supply/model/param/FFmpeg/MergeBgVideoParam.java

@@ -0,0 +1,14 @@
+package com.tzld.supply.model.param.FFmpeg;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class MergeBgVideoParam {
+    private String mainVideo;
+    private String type;
+    private String bgMedia;
+    // 0x00FF00
+    private String color;
+}

+ 14 - 0
core/src/main/java/com/tzld/supply/model/param/FFmpeg/RemoveBgParam.java

@@ -0,0 +1,14 @@
+package com.tzld.supply.model.param.FFmpeg;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class RemoveBgParam {
+    // video/image
+    private String mediaType;
+    private String mediaUrl;
+    // 0x00FF00
+    private String color;
+}

+ 11 - 0
core/src/main/java/com/tzld/supply/model/param/FFmpeg/VideoAddAssSubtitleParam.java

@@ -0,0 +1,11 @@
+package com.tzld.supply.model.param.FFmpeg;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class VideoAddAssSubtitleParam {
+    private String videoUrl;
+    private String assSubtitle;
+}

+ 19 - 0
core/src/main/java/com/tzld/supply/model/param/FFmpeg/VideoAddAudioParam.java

@@ -0,0 +1,19 @@
+package com.tzld.supply.model.param.FFmpeg;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class VideoAddAudioParam {
+    private String videoUrl;
+    private String audioUrl;
+    // 主时间轴,video/audio
+    private String mainTimeline;
+    // 是否保留视频原声
+    private Boolean keepVideoOriginalSound;
+    // 视频音量 1-100
+    private Integer videoVolume;
+    // 音频音量 1-100
+    private Integer audioVolume;
+}

+ 61 - 0
core/src/main/java/com/tzld/supply/model/param/FFmpeg/VideoAddTailParam.java

@@ -0,0 +1,61 @@
+package com.tzld.supply.model.param.FFmpeg;
+
+import com.alibaba.fastjson.JSON;
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class VideoAddTailParam {
+    private String bizId;
+    private String originVideoUrl;
+    private String tailType;
+    private String tailVideoUrl;
+    private String tailAudioUrl;
+    private String assSubtitle;
+    private Integer srtMillisDuration;
+    // 原视频音量 1-100
+    private Integer originVideoVolume;
+    // 片尾音量 1-100
+    private Integer tailVolume;
+
+    public static void main(String[] args) {
+        VideoAddTailParam param = new VideoAddTailParam();
+        param.setOriginVideoUrl("http://testres.cybertogether.net/test/2.mp4");
+        param.setTailType("lastFrame");
+        param.setTailVideoUrl("http://testres.cybertogether.net/test/7.mp4");
+        param.setTailAudioUrl("http://testres.cybertogether.net/test/2.mp3");
+        param.setAssSubtitle("[Script Info]\n" +
+                "; Script generated by Aegisub 3.2.2\n" +
+                "; http://www.aegisub.org/\n" +
+                "Title: Default Aegisub file\n" +
+                "ScriptType: v4.00+\n" +
+                "WrapStyle: 0\n" +
+                "ScaledBorderAndShadow: yes\n" +
+                "YCbCr Matrix: None\n" +
+                "PlayResX: 100\n" +
+                "PlayResY: 100\n" +
+                "\n" +
+                "[Aegisub Project Garbage]\n" +
+                "Last Style Storage: Default\n" +
+                "Active Line: 1\n" +
+                "\n" +
+                "[V4+ Styles]\n" +
+                "Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, " +
+                "Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, " +
+                "Alignment, MarginL, MarginR, MarginV, Encoding\n" +
+                "Style: Default,PingFang SC,6,&H00000000,&H00000000,&H0000DEFF,&HFF00DEFF,-1,0,0,0,100,100,0,0,3,0.1," +
+                "2,2,10,10,10,134\n" +
+                "\n" +
+                "\n" +
+                "[Events]\n" +
+                "Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text\n" +
+                "Dialogue: 0,00:00:00.04,00:00:04.06,Default,,0,0,0,,叠个千纸鹤再系个红飘带\n" +
+                "Dialogue: 0,00:00:04.12,00:00:08.24,Default,,0,0,0,,愿善良的人们天天好运来\n" +
+                "Dialogue: 0,00:00:08.24,00:00:12.76,Default,,0,0,0,,你勤劳生活美你健康春常\\N在\n" +
+                "Dialogue: 0,00:00:12.76,00:00:17.26,Default,,0,0,0,,你一生的忙碌为了笑逐颜\\N开\n" +
+                "Dialogue: 0,00:00:18.12,00:00:22.44,Default,,0,0,0,,打个中国结请春风剪个彩\n");
+        param.setSrtMillisDuration(22044);
+        System.out.println(JSON.toJSONString(param));
+    }
+}

+ 14 - 0
core/src/main/java/com/tzld/supply/model/param/FFmpeg/VideoInfoParam.java

@@ -0,0 +1,14 @@
+package com.tzld.supply.model.param.FFmpeg;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+public class VideoInfoParam {
+    private String videoUrl;
+}

+ 12 - 0
core/src/main/java/com/tzld/supply/model/param/FFmpeg/VideoTextureParam.java

@@ -0,0 +1,12 @@
+package com.tzld.supply.model.param.FFmpeg;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class VideoTextureParam {
+    private String videoUrl;
+    private String imageUrl;
+    private Integer border;
+}

+ 12 - 0
core/src/main/java/com/tzld/supply/model/param/FFmpeg/VideoTimeCutParam.java

@@ -0,0 +1,12 @@
+package com.tzld.supply.model.param.FFmpeg;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class VideoTimeCutParam {
+    private String videoUrl;
+    private String startTime;
+    private String endTime;
+}

+ 12 - 0
core/src/main/java/com/tzld/supply/model/param/FFmpeg/VideoTimeExtraFrameParam.java

@@ -0,0 +1,12 @@
+package com.tzld.supply.model.param.FFmpeg;
+
+import lombok.Getter;
+import lombok.Setter;
+
+
+@Getter
+@Setter
+public class VideoTimeExtraFrameParam {
+    private String videoUrl;
+    private String time;
+}

+ 12 - 0
core/src/main/java/com/tzld/supply/model/param/FFmpeg/VideoTranscodingParam.java

@@ -0,0 +1,12 @@
+package com.tzld.supply.model.param.FFmpeg;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class VideoTranscodingParam {
+    private String videoUrl;
+    private String coding;
+    private String bitrate;
+}

+ 16 - 0
core/src/main/java/com/tzld/supply/model/param/FFmpeg/VideoUrlsParam.java

@@ -0,0 +1,16 @@
+package com.tzld.supply.model.param.FFmpeg;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.experimental.Accessors;
+
+import java.util.List;
+
+@Getter
+@Setter
+@Accessors(chain = true)
+public class VideoUrlsParam {
+    private List<String> videoUrls;
+
+    private Integer pretreatmentSwitch;
+}

+ 200 - 0
core/src/main/java/com/tzld/supply/model/po/supply/spider/ProduceVideo.java

@@ -0,0 +1,200 @@
+package com.tzld.supply.model.po.supply.spider;
+
+/**
+ *
+ * This class was generated by MyBatis Generator.
+ * This class corresponds to the database table produce_video
+ */
+public class ProduceVideo {
+    /**
+     * Database Column Remarks:
+     *   主键ID
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column produce_video.id
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    private String id;
+
+    /**
+     * Database Column Remarks:
+     *   来源内容ID
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column produce_video.content_id
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    private Long contentId;
+
+    /**
+     * Database Column Remarks:
+     *   状态 0-待执行 1-执行中 2-成功 3-失败
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column produce_video.status
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    private Integer status;
+
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column produce_video.create_time
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    private Long createTime;
+
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column produce_video.update_time
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    private Long updateTime;
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column produce_video.id
+     *
+     * @return the value of produce_video.id
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    public String getId() {
+        return id;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column produce_video.id
+     *
+     * @param id the value for produce_video.id
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column produce_video.content_id
+     *
+     * @return the value of produce_video.content_id
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    public Long getContentId() {
+        return contentId;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column produce_video.content_id
+     *
+     * @param contentId the value for produce_video.content_id
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    public void setContentId(Long contentId) {
+        this.contentId = contentId;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column produce_video.status
+     *
+     * @return the value of produce_video.status
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    public Integer getStatus() {
+        return status;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column produce_video.status
+     *
+     * @param status the value for produce_video.status
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column produce_video.create_time
+     *
+     * @return the value of produce_video.create_time
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    public Long getCreateTime() {
+        return createTime;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column produce_video.create_time
+     *
+     * @param createTime the value for produce_video.create_time
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    public void setCreateTime(Long createTime) {
+        this.createTime = createTime;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column produce_video.update_time
+     *
+     * @return the value of produce_video.update_time
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    public Long getUpdateTime() {
+        return updateTime;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column produce_video.update_time
+     *
+     * @param updateTime the value for produce_video.update_time
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    public void setUpdateTime(Long updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table produce_video
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(getClass().getSimpleName());
+        sb.append(" [");
+        sb.append("Hash = ").append(hashCode());
+        sb.append(", id=").append(id);
+        sb.append(", contentId=").append(contentId);
+        sb.append(", status=").append(status);
+        sb.append(", createTime=").append(createTime);
+        sb.append(", updateTime=").append(updateTime);
+        sb.append("]");
+        return sb.toString();
+    }
+}

+ 272 - 0
core/src/main/java/com/tzld/supply/model/po/supply/spider/ProduceVideoAudio.java

@@ -0,0 +1,272 @@
+package com.tzld.supply.model.po.supply.spider;
+
+/**
+ *
+ * This class was generated by MyBatis Generator.
+ * This class corresponds to the database table produce_video_audio
+ */
+public class ProduceVideoAudio {
+    /**
+     * Database Column Remarks:
+     *   主键ID
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column produce_video_audio.id
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    private String id;
+
+    /**
+     * Database Column Remarks:
+     *   生成视频ID
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column produce_video_audio.produce_video_id
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    private String produceVideoId;
+
+    /**
+     * Database Column Remarks:
+     *   音频url
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column produce_video_audio.url
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    private String url;
+
+    /**
+     * Database Column Remarks:
+     *   时长
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column produce_video_audio.duration
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    private Integer duration;
+
+    /**
+     * Database Column Remarks:
+     *   状态 0-待生成 1-成功 2-失败
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column produce_video_audio.status
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    private Integer status;
+
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column produce_video_audio.create_time
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    private Long createTime;
+
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column produce_video_audio.update_time
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    private Long updateTime;
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column produce_video_audio.id
+     *
+     * @return the value of produce_video_audio.id
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    public String getId() {
+        return id;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column produce_video_audio.id
+     *
+     * @param id the value for produce_video_audio.id
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column produce_video_audio.produce_video_id
+     *
+     * @return the value of produce_video_audio.produce_video_id
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    public String getProduceVideoId() {
+        return produceVideoId;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column produce_video_audio.produce_video_id
+     *
+     * @param produceVideoId the value for produce_video_audio.produce_video_id
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    public void setProduceVideoId(String produceVideoId) {
+        this.produceVideoId = produceVideoId;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column produce_video_audio.url
+     *
+     * @return the value of produce_video_audio.url
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    public String getUrl() {
+        return url;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column produce_video_audio.url
+     *
+     * @param url the value for produce_video_audio.url
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column produce_video_audio.duration
+     *
+     * @return the value of produce_video_audio.duration
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    public Integer getDuration() {
+        return duration;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column produce_video_audio.duration
+     *
+     * @param duration the value for produce_video_audio.duration
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    public void setDuration(Integer duration) {
+        this.duration = duration;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column produce_video_audio.status
+     *
+     * @return the value of produce_video_audio.status
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    public Integer getStatus() {
+        return status;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column produce_video_audio.status
+     *
+     * @param status the value for produce_video_audio.status
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column produce_video_audio.create_time
+     *
+     * @return the value of produce_video_audio.create_time
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    public Long getCreateTime() {
+        return createTime;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column produce_video_audio.create_time
+     *
+     * @param createTime the value for produce_video_audio.create_time
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    public void setCreateTime(Long createTime) {
+        this.createTime = createTime;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column produce_video_audio.update_time
+     *
+     * @return the value of produce_video_audio.update_time
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    public Long getUpdateTime() {
+        return updateTime;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column produce_video_audio.update_time
+     *
+     * @param updateTime the value for produce_video_audio.update_time
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    public void setUpdateTime(Long updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table produce_video_audio
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(getClass().getSimpleName());
+        sb.append(" [");
+        sb.append("Hash = ").append(hashCode());
+        sb.append(", id=").append(id);
+        sb.append(", produceVideoId=").append(produceVideoId);
+        sb.append(", url=").append(url);
+        sb.append(", duration=").append(duration);
+        sb.append(", status=").append(status);
+        sb.append(", createTime=").append(createTime);
+        sb.append(", updateTime=").append(updateTime);
+        sb.append("]");
+        return sb.toString();
+    }
+}

+ 752 - 0
core/src/main/java/com/tzld/supply/model/po/supply/spider/ProduceVideoAudioExample.java

@@ -0,0 +1,752 @@
+package com.tzld.supply.model.po.supply.spider;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ProduceVideoAudioExample {
+    /**
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database table produce_video_audio
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    protected String orderByClause;
+
+    /**
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database table produce_video_audio
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    protected boolean distinct;
+
+    /**
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database table produce_video_audio
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    protected List<Criteria> oredCriteria;
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table produce_video_audio
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    public ProduceVideoAudioExample() {
+        oredCriteria = new ArrayList<Criteria>();
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table produce_video_audio
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table produce_video_audio
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table produce_video_audio
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table produce_video_audio
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table produce_video_audio
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    public List<Criteria> getOredCriteria() {
+        return oredCriteria;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table produce_video_audio
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    public void or(Criteria criteria) {
+        oredCriteria.add(criteria);
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table produce_video_audio
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    public Criteria or() {
+        Criteria criteria = createCriteriaInternal();
+        oredCriteria.add(criteria);
+        return criteria;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table produce_video_audio
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    public Criteria createCriteria() {
+        Criteria criteria = createCriteriaInternal();
+        if (oredCriteria.size() == 0) {
+            oredCriteria.add(criteria);
+        }
+        return criteria;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table produce_video_audio
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    protected Criteria createCriteriaInternal() {
+        Criteria criteria = new Criteria();
+        return criteria;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table produce_video_audio
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    public void clear() {
+        oredCriteria.clear();
+        orderByClause = null;
+        distinct = false;
+    }
+
+    /**
+     * This class was generated by MyBatis Generator.
+     * This class corresponds to the database table produce_video_audio
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    protected abstract static class GeneratedCriteria {
+        protected List<Criterion> criteria;
+
+        protected GeneratedCriteria() {
+            super();
+            criteria = new ArrayList<Criterion>();
+        }
+
+        public boolean isValid() {
+            return criteria.size() > 0;
+        }
+
+        public List<Criterion> getAllCriteria() {
+            return criteria;
+        }
+
+        public List<Criterion> getCriteria() {
+            return criteria;
+        }
+
+        protected void addCriterion(String condition) {
+            if (condition == null) {
+                throw new RuntimeException("Value for condition cannot be null");
+            }
+            criteria.add(new Criterion(condition));
+        }
+
+        protected void addCriterion(String condition, Object value, String property) {
+            if (value == null) {
+                throw new RuntimeException("Value for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value));
+        }
+
+        protected void addCriterion(String condition, Object value1, Object value2, String property) {
+            if (value1 == null || value2 == null) {
+                throw new RuntimeException("Between values for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value1, value2));
+        }
+
+        public Criteria andIdIsNull() {
+            addCriterion("id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIsNotNull() {
+            addCriterion("id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdEqualTo(String value) {
+            addCriterion("id =", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotEqualTo(String value) {
+            addCriterion("id <>", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThan(String value) {
+            addCriterion("id >", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThanOrEqualTo(String value) {
+            addCriterion("id >=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThan(String value) {
+            addCriterion("id <", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThanOrEqualTo(String value) {
+            addCriterion("id <=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLike(String value) {
+            addCriterion("id like", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotLike(String value) {
+            addCriterion("id not like", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIn(List<String> values) {
+            addCriterion("id in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotIn(List<String> values) {
+            addCriterion("id not in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdBetween(String value1, String value2) {
+            addCriterion("id between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotBetween(String value1, String value2) {
+            addCriterion("id not between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andProduceVideoIdIsNull() {
+            addCriterion("produce_video_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andProduceVideoIdIsNotNull() {
+            addCriterion("produce_video_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andProduceVideoIdEqualTo(String value) {
+            addCriterion("produce_video_id =", value, "produceVideoId");
+            return (Criteria) this;
+        }
+
+        public Criteria andProduceVideoIdNotEqualTo(String value) {
+            addCriterion("produce_video_id <>", value, "produceVideoId");
+            return (Criteria) this;
+        }
+
+        public Criteria andProduceVideoIdGreaterThan(String value) {
+            addCriterion("produce_video_id >", value, "produceVideoId");
+            return (Criteria) this;
+        }
+
+        public Criteria andProduceVideoIdGreaterThanOrEqualTo(String value) {
+            addCriterion("produce_video_id >=", value, "produceVideoId");
+            return (Criteria) this;
+        }
+
+        public Criteria andProduceVideoIdLessThan(String value) {
+            addCriterion("produce_video_id <", value, "produceVideoId");
+            return (Criteria) this;
+        }
+
+        public Criteria andProduceVideoIdLessThanOrEqualTo(String value) {
+            addCriterion("produce_video_id <=", value, "produceVideoId");
+            return (Criteria) this;
+        }
+
+        public Criteria andProduceVideoIdLike(String value) {
+            addCriterion("produce_video_id like", value, "produceVideoId");
+            return (Criteria) this;
+        }
+
+        public Criteria andProduceVideoIdNotLike(String value) {
+            addCriterion("produce_video_id not like", value, "produceVideoId");
+            return (Criteria) this;
+        }
+
+        public Criteria andProduceVideoIdIn(List<String> values) {
+            addCriterion("produce_video_id in", values, "produceVideoId");
+            return (Criteria) this;
+        }
+
+        public Criteria andProduceVideoIdNotIn(List<String> values) {
+            addCriterion("produce_video_id not in", values, "produceVideoId");
+            return (Criteria) this;
+        }
+
+        public Criteria andProduceVideoIdBetween(String value1, String value2) {
+            addCriterion("produce_video_id between", value1, value2, "produceVideoId");
+            return (Criteria) this;
+        }
+
+        public Criteria andProduceVideoIdNotBetween(String value1, String value2) {
+            addCriterion("produce_video_id not between", value1, value2, "produceVideoId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlIsNull() {
+            addCriterion("url is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlIsNotNull() {
+            addCriterion("url is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlEqualTo(String value) {
+            addCriterion("url =", value, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlNotEqualTo(String value) {
+            addCriterion("url <>", value, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlGreaterThan(String value) {
+            addCriterion("url >", value, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlGreaterThanOrEqualTo(String value) {
+            addCriterion("url >=", value, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlLessThan(String value) {
+            addCriterion("url <", value, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlLessThanOrEqualTo(String value) {
+            addCriterion("url <=", value, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlLike(String value) {
+            addCriterion("url like", value, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlNotLike(String value) {
+            addCriterion("url not like", value, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlIn(List<String> values) {
+            addCriterion("url in", values, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlNotIn(List<String> values) {
+            addCriterion("url not in", values, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlBetween(String value1, String value2) {
+            addCriterion("url between", value1, value2, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlNotBetween(String value1, String value2) {
+            addCriterion("url not between", value1, value2, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andDurationIsNull() {
+            addCriterion("duration is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDurationIsNotNull() {
+            addCriterion("duration is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDurationEqualTo(Integer value) {
+            addCriterion("duration =", value, "duration");
+            return (Criteria) this;
+        }
+
+        public Criteria andDurationNotEqualTo(Integer value) {
+            addCriterion("duration <>", value, "duration");
+            return (Criteria) this;
+        }
+
+        public Criteria andDurationGreaterThan(Integer value) {
+            addCriterion("duration >", value, "duration");
+            return (Criteria) this;
+        }
+
+        public Criteria andDurationGreaterThanOrEqualTo(Integer value) {
+            addCriterion("duration >=", value, "duration");
+            return (Criteria) this;
+        }
+
+        public Criteria andDurationLessThan(Integer value) {
+            addCriterion("duration <", value, "duration");
+            return (Criteria) this;
+        }
+
+        public Criteria andDurationLessThanOrEqualTo(Integer value) {
+            addCriterion("duration <=", value, "duration");
+            return (Criteria) this;
+        }
+
+        public Criteria andDurationIn(List<Integer> values) {
+            addCriterion("duration in", values, "duration");
+            return (Criteria) this;
+        }
+
+        public Criteria andDurationNotIn(List<Integer> values) {
+            addCriterion("duration not in", values, "duration");
+            return (Criteria) this;
+        }
+
+        public Criteria andDurationBetween(Integer value1, Integer value2) {
+            addCriterion("duration between", value1, value2, "duration");
+            return (Criteria) this;
+        }
+
+        public Criteria andDurationNotBetween(Integer value1, Integer value2) {
+            addCriterion("duration not between", value1, value2, "duration");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusIsNull() {
+            addCriterion("`status` is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusIsNotNull() {
+            addCriterion("`status` is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusEqualTo(Integer value) {
+            addCriterion("`status` =", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusNotEqualTo(Integer value) {
+            addCriterion("`status` <>", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusGreaterThan(Integer value) {
+            addCriterion("`status` >", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusGreaterThanOrEqualTo(Integer value) {
+            addCriterion("`status` >=", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusLessThan(Integer value) {
+            addCriterion("`status` <", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusLessThanOrEqualTo(Integer value) {
+            addCriterion("`status` <=", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusIn(List<Integer> values) {
+            addCriterion("`status` in", values, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusNotIn(List<Integer> values) {
+            addCriterion("`status` not in", values, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusBetween(Integer value1, Integer value2) {
+            addCriterion("`status` between", value1, value2, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusNotBetween(Integer value1, Integer value2) {
+            addCriterion("`status` not between", value1, value2, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIsNull() {
+            addCriterion("create_time is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIsNotNull() {
+            addCriterion("create_time is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeEqualTo(Long value) {
+            addCriterion("create_time =", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotEqualTo(Long value) {
+            addCriterion("create_time <>", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeGreaterThan(Long value) {
+            addCriterion("create_time >", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeGreaterThanOrEqualTo(Long value) {
+            addCriterion("create_time >=", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeLessThan(Long value) {
+            addCriterion("create_time <", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeLessThanOrEqualTo(Long value) {
+            addCriterion("create_time <=", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIn(List<Long> values) {
+            addCriterion("create_time in", values, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotIn(List<Long> values) {
+            addCriterion("create_time not in", values, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeBetween(Long value1, Long value2) {
+            addCriterion("create_time between", value1, value2, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotBetween(Long value1, Long value2) {
+            addCriterion("create_time not between", value1, value2, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeIsNull() {
+            addCriterion("update_time is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeIsNotNull() {
+            addCriterion("update_time is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeEqualTo(Long value) {
+            addCriterion("update_time =", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeNotEqualTo(Long value) {
+            addCriterion("update_time <>", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeGreaterThan(Long value) {
+            addCriterion("update_time >", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeGreaterThanOrEqualTo(Long value) {
+            addCriterion("update_time >=", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeLessThan(Long value) {
+            addCriterion("update_time <", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeLessThanOrEqualTo(Long value) {
+            addCriterion("update_time <=", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeIn(List<Long> values) {
+            addCriterion("update_time in", values, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeNotIn(List<Long> values) {
+            addCriterion("update_time not in", values, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeBetween(Long value1, Long value2) {
+            addCriterion("update_time between", value1, value2, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeNotBetween(Long value1, Long value2) {
+            addCriterion("update_time not between", value1, value2, "updateTime");
+            return (Criteria) this;
+        }
+    }
+
+    /**
+     * This class was generated by MyBatis Generator.
+     * This class corresponds to the database table produce_video_audio
+     *
+     * @mbg.generated do_not_delete_during_merge Fri Oct 24 16:58:10 CST 2025
+     */
+    public static class Criteria extends GeneratedCriteria {
+
+        protected Criteria() {
+            super();
+        }
+    }
+
+    /**
+     * This class was generated by MyBatis Generator.
+     * This class corresponds to the database table produce_video_audio
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    public static class Criterion {
+        private String condition;
+
+        private Object value;
+
+        private Object secondValue;
+
+        private boolean noValue;
+
+        private boolean singleValue;
+
+        private boolean betweenValue;
+
+        private boolean listValue;
+
+        private String typeHandler;
+
+        public String getCondition() {
+            return condition;
+        }
+
+        public Object getValue() {
+            return value;
+        }
+
+        public Object getSecondValue() {
+            return secondValue;
+        }
+
+        public boolean isNoValue() {
+            return noValue;
+        }
+
+        public boolean isSingleValue() {
+            return singleValue;
+        }
+
+        public boolean isBetweenValue() {
+            return betweenValue;
+        }
+
+        public boolean isListValue() {
+            return listValue;
+        }
+
+        public String getTypeHandler() {
+            return typeHandler;
+        }
+
+        protected Criterion(String condition) {
+            super();
+            this.condition = condition;
+            this.typeHandler = null;
+            this.noValue = true;
+        }
+
+        protected Criterion(String condition, Object value, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.typeHandler = typeHandler;
+            if (value instanceof List<?>) {
+                this.listValue = true;
+            } else {
+                this.singleValue = true;
+            }
+        }
+
+        protected Criterion(String condition, Object value) {
+            this(condition, value, null);
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.secondValue = secondValue;
+            this.typeHandler = typeHandler;
+            this.betweenValue = true;
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue) {
+            this(condition, value, secondValue, null);
+        }
+    }
+}

+ 612 - 0
core/src/main/java/com/tzld/supply/model/po/supply/spider/ProduceVideoExample.java

@@ -0,0 +1,612 @@
+package com.tzld.supply.model.po.supply.spider;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ProduceVideoExample {
+    /**
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database table produce_video
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    protected String orderByClause;
+
+    /**
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database table produce_video
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    protected boolean distinct;
+
+    /**
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database table produce_video
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    protected List<Criteria> oredCriteria;
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table produce_video
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    public ProduceVideoExample() {
+        oredCriteria = new ArrayList<Criteria>();
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table produce_video
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table produce_video
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table produce_video
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table produce_video
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table produce_video
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    public List<Criteria> getOredCriteria() {
+        return oredCriteria;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table produce_video
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    public void or(Criteria criteria) {
+        oredCriteria.add(criteria);
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table produce_video
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    public Criteria or() {
+        Criteria criteria = createCriteriaInternal();
+        oredCriteria.add(criteria);
+        return criteria;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table produce_video
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    public Criteria createCriteria() {
+        Criteria criteria = createCriteriaInternal();
+        if (oredCriteria.size() == 0) {
+            oredCriteria.add(criteria);
+        }
+        return criteria;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table produce_video
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    protected Criteria createCriteriaInternal() {
+        Criteria criteria = new Criteria();
+        return criteria;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table produce_video
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    public void clear() {
+        oredCriteria.clear();
+        orderByClause = null;
+        distinct = false;
+    }
+
+    /**
+     * This class was generated by MyBatis Generator.
+     * This class corresponds to the database table produce_video
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    protected abstract static class GeneratedCriteria {
+        protected List<Criterion> criteria;
+
+        protected GeneratedCriteria() {
+            super();
+            criteria = new ArrayList<Criterion>();
+        }
+
+        public boolean isValid() {
+            return criteria.size() > 0;
+        }
+
+        public List<Criterion> getAllCriteria() {
+            return criteria;
+        }
+
+        public List<Criterion> getCriteria() {
+            return criteria;
+        }
+
+        protected void addCriterion(String condition) {
+            if (condition == null) {
+                throw new RuntimeException("Value for condition cannot be null");
+            }
+            criteria.add(new Criterion(condition));
+        }
+
+        protected void addCriterion(String condition, Object value, String property) {
+            if (value == null) {
+                throw new RuntimeException("Value for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value));
+        }
+
+        protected void addCriterion(String condition, Object value1, Object value2, String property) {
+            if (value1 == null || value2 == null) {
+                throw new RuntimeException("Between values for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value1, value2));
+        }
+
+        public Criteria andIdIsNull() {
+            addCriterion("id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIsNotNull() {
+            addCriterion("id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdEqualTo(String value) {
+            addCriterion("id =", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotEqualTo(String value) {
+            addCriterion("id <>", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThan(String value) {
+            addCriterion("id >", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThanOrEqualTo(String value) {
+            addCriterion("id >=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThan(String value) {
+            addCriterion("id <", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThanOrEqualTo(String value) {
+            addCriterion("id <=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLike(String value) {
+            addCriterion("id like", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotLike(String value) {
+            addCriterion("id not like", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIn(List<String> values) {
+            addCriterion("id in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotIn(List<String> values) {
+            addCriterion("id not in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdBetween(String value1, String value2) {
+            addCriterion("id between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotBetween(String value1, String value2) {
+            addCriterion("id not between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentIdIsNull() {
+            addCriterion("content_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentIdIsNotNull() {
+            addCriterion("content_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentIdEqualTo(Long value) {
+            addCriterion("content_id =", value, "contentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentIdNotEqualTo(Long value) {
+            addCriterion("content_id <>", value, "contentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentIdGreaterThan(Long value) {
+            addCriterion("content_id >", value, "contentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("content_id >=", value, "contentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentIdLessThan(Long value) {
+            addCriterion("content_id <", value, "contentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentIdLessThanOrEqualTo(Long value) {
+            addCriterion("content_id <=", value, "contentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentIdIn(List<Long> values) {
+            addCriterion("content_id in", values, "contentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentIdNotIn(List<Long> values) {
+            addCriterion("content_id not in", values, "contentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentIdBetween(Long value1, Long value2) {
+            addCriterion("content_id between", value1, value2, "contentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentIdNotBetween(Long value1, Long value2) {
+            addCriterion("content_id not between", value1, value2, "contentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusIsNull() {
+            addCriterion("`status` is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusIsNotNull() {
+            addCriterion("`status` is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusEqualTo(Integer value) {
+            addCriterion("`status` =", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusNotEqualTo(Integer value) {
+            addCriterion("`status` <>", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusGreaterThan(Integer value) {
+            addCriterion("`status` >", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusGreaterThanOrEqualTo(Integer value) {
+            addCriterion("`status` >=", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusLessThan(Integer value) {
+            addCriterion("`status` <", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusLessThanOrEqualTo(Integer value) {
+            addCriterion("`status` <=", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusIn(List<Integer> values) {
+            addCriterion("`status` in", values, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusNotIn(List<Integer> values) {
+            addCriterion("`status` not in", values, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusBetween(Integer value1, Integer value2) {
+            addCriterion("`status` between", value1, value2, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusNotBetween(Integer value1, Integer value2) {
+            addCriterion("`status` not between", value1, value2, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIsNull() {
+            addCriterion("create_time is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIsNotNull() {
+            addCriterion("create_time is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeEqualTo(Long value) {
+            addCriterion("create_time =", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotEqualTo(Long value) {
+            addCriterion("create_time <>", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeGreaterThan(Long value) {
+            addCriterion("create_time >", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeGreaterThanOrEqualTo(Long value) {
+            addCriterion("create_time >=", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeLessThan(Long value) {
+            addCriterion("create_time <", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeLessThanOrEqualTo(Long value) {
+            addCriterion("create_time <=", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIn(List<Long> values) {
+            addCriterion("create_time in", values, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotIn(List<Long> values) {
+            addCriterion("create_time not in", values, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeBetween(Long value1, Long value2) {
+            addCriterion("create_time between", value1, value2, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotBetween(Long value1, Long value2) {
+            addCriterion("create_time not between", value1, value2, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeIsNull() {
+            addCriterion("update_time is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeIsNotNull() {
+            addCriterion("update_time is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeEqualTo(Long value) {
+            addCriterion("update_time =", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeNotEqualTo(Long value) {
+            addCriterion("update_time <>", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeGreaterThan(Long value) {
+            addCriterion("update_time >", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeGreaterThanOrEqualTo(Long value) {
+            addCriterion("update_time >=", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeLessThan(Long value) {
+            addCriterion("update_time <", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeLessThanOrEqualTo(Long value) {
+            addCriterion("update_time <=", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeIn(List<Long> values) {
+            addCriterion("update_time in", values, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeNotIn(List<Long> values) {
+            addCriterion("update_time not in", values, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeBetween(Long value1, Long value2) {
+            addCriterion("update_time between", value1, value2, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeNotBetween(Long value1, Long value2) {
+            addCriterion("update_time not between", value1, value2, "updateTime");
+            return (Criteria) this;
+        }
+    }
+
+    /**
+     * This class was generated by MyBatis Generator.
+     * This class corresponds to the database table produce_video
+     *
+     * @mbg.generated do_not_delete_during_merge Fri Oct 24 16:58:10 CST 2025
+     */
+    public static class Criteria extends GeneratedCriteria {
+
+        protected Criteria() {
+            super();
+        }
+    }
+
+    /**
+     * This class was generated by MyBatis Generator.
+     * This class corresponds to the database table produce_video
+     *
+     * @mbg.generated Fri Oct 24 16:58:10 CST 2025
+     */
+    public static class Criterion {
+        private String condition;
+
+        private Object value;
+
+        private Object secondValue;
+
+        private boolean noValue;
+
+        private boolean singleValue;
+
+        private boolean betweenValue;
+
+        private boolean listValue;
+
+        private String typeHandler;
+
+        public String getCondition() {
+            return condition;
+        }
+
+        public Object getValue() {
+            return value;
+        }
+
+        public Object getSecondValue() {
+            return secondValue;
+        }
+
+        public boolean isNoValue() {
+            return noValue;
+        }
+
+        public boolean isSingleValue() {
+            return singleValue;
+        }
+
+        public boolean isBetweenValue() {
+            return betweenValue;
+        }
+
+        public boolean isListValue() {
+            return listValue;
+        }
+
+        public String getTypeHandler() {
+            return typeHandler;
+        }
+
+        protected Criterion(String condition) {
+            super();
+            this.condition = condition;
+            this.typeHandler = null;
+            this.noValue = true;
+        }
+
+        protected Criterion(String condition, Object value, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.typeHandler = typeHandler;
+            if (value instanceof List<?>) {
+                this.listValue = true;
+            } else {
+                this.singleValue = true;
+            }
+        }
+
+        protected Criterion(String condition, Object value) {
+            this(condition, value, null);
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.secondValue = secondValue;
+            this.typeHandler = typeHandler;
+            this.betweenValue = true;
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue) {
+            this(condition, value, secondValue, null);
+        }
+    }
+}

+ 4 - 2
core/src/main/resources/generator/mybatis-spider-generator-config.xml

@@ -49,8 +49,10 @@
 <!--        <table tableName="spider_task" domainObjectName="" alias=""/>-->
 <!--        <table tableName="spider_content" domainObjectName="" alias=""/>-->
 <!--        <table tableName="spider_content_media" domainObjectName="" alias=""/>-->
-        <table tableName="ai_model_tts" domainObjectName="" alias=""/>
-        <table tableName="fish_api_record" domainObjectName="" alias=""/>
+<!--        <table tableName="ai_model_tts" domainObjectName="" alias=""/>-->
+<!--        <table tableName="fish_api_record" domainObjectName="" alias=""/>-->
+        <table tableName="produce_video" domainObjectName="" alias=""/>
+        <table tableName="produce_video_audio" domainObjectName="" alias=""/>
     </context>
 
 </generatorConfiguration>

+ 318 - 0
core/src/main/resources/mapper/supply/spider/ProduceVideoAudioMapper.xml

@@ -0,0 +1,318 @@
+<?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.tzld.supply.dao.mapper.supply.spider.ProduceVideoAudioMapper">
+  <resultMap id="BaseResultMap" type="com.tzld.supply.model.po.supply.spider.ProduceVideoAudio">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Oct 24 16:58:10 CST 2025.
+    -->
+    <id column="id" jdbcType="VARCHAR" property="id" />
+    <result column="produce_video_id" jdbcType="VARCHAR" property="produceVideoId" />
+    <result column="url" jdbcType="VARCHAR" property="url" />
+    <result column="duration" jdbcType="INTEGER" property="duration" />
+    <result column="status" jdbcType="INTEGER" property="status" />
+    <result column="create_time" jdbcType="BIGINT" property="createTime" />
+    <result column="update_time" jdbcType="BIGINT" property="updateTime" />
+  </resultMap>
+  <sql id="Example_Where_Clause">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Oct 24 16:58:10 CST 2025.
+    -->
+    <where>
+      <foreach collection="oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Update_By_Example_Where_Clause">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Oct 24 16:58:10 CST 2025.
+    -->
+    <where>
+      <foreach collection="example.oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Base_Column_List">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Oct 24 16:58:10 CST 2025.
+    -->
+    id, produce_video_id, url, duration, `status`, create_time, update_time
+  </sql>
+  <select id="selectByExample" parameterType="com.tzld.supply.model.po.supply.spider.ProduceVideoAudioExample" resultMap="BaseResultMap">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Oct 24 16:58:10 CST 2025.
+    -->
+    select
+    <if test="distinct">
+      distinct
+    </if>
+    <include refid="Base_Column_List" />
+    from produce_video_audio
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+    <if test="orderByClause != null">
+      order by ${orderByClause}
+    </if>
+  </select>
+  <select id="selectByPrimaryKey" parameterType="java.lang.String" resultMap="BaseResultMap">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Oct 24 16:58:10 CST 2025.
+    -->
+    select 
+    <include refid="Base_Column_List" />
+    from produce_video_audio
+    where id = #{id,jdbcType=VARCHAR}
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.String">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Oct 24 16:58:10 CST 2025.
+    -->
+    delete from produce_video_audio
+    where id = #{id,jdbcType=VARCHAR}
+  </delete>
+  <delete id="deleteByExample" parameterType="com.tzld.supply.model.po.supply.spider.ProduceVideoAudioExample">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Oct 24 16:58:10 CST 2025.
+    -->
+    delete from produce_video_audio
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </delete>
+  <insert id="insert" parameterType="com.tzld.supply.model.po.supply.spider.ProduceVideoAudio">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Oct 24 16:58:10 CST 2025.
+    -->
+    insert into produce_video_audio (id, produce_video_id, url, 
+      duration, `status`, create_time, 
+      update_time)
+    values (#{id,jdbcType=VARCHAR}, #{produceVideoId,jdbcType=VARCHAR}, #{url,jdbcType=VARCHAR}, 
+      #{duration,jdbcType=INTEGER}, #{status,jdbcType=INTEGER}, #{createTime,jdbcType=BIGINT}, 
+      #{updateTime,jdbcType=BIGINT})
+  </insert>
+  <insert id="insertSelective" parameterType="com.tzld.supply.model.po.supply.spider.ProduceVideoAudio">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Oct 24 16:58:10 CST 2025.
+    -->
+    insert into produce_video_audio
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        id,
+      </if>
+      <if test="produceVideoId != null">
+        produce_video_id,
+      </if>
+      <if test="url != null">
+        url,
+      </if>
+      <if test="duration != null">
+        duration,
+      </if>
+      <if test="status != null">
+        `status`,
+      </if>
+      <if test="createTime != null">
+        create_time,
+      </if>
+      <if test="updateTime != null">
+        update_time,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        #{id,jdbcType=VARCHAR},
+      </if>
+      <if test="produceVideoId != null">
+        #{produceVideoId,jdbcType=VARCHAR},
+      </if>
+      <if test="url != null">
+        #{url,jdbcType=VARCHAR},
+      </if>
+      <if test="duration != null">
+        #{duration,jdbcType=INTEGER},
+      </if>
+      <if test="status != null">
+        #{status,jdbcType=INTEGER},
+      </if>
+      <if test="createTime != null">
+        #{createTime,jdbcType=BIGINT},
+      </if>
+      <if test="updateTime != null">
+        #{updateTime,jdbcType=BIGINT},
+      </if>
+    </trim>
+  </insert>
+  <select id="countByExample" parameterType="com.tzld.supply.model.po.supply.spider.ProduceVideoAudioExample" resultType="java.lang.Long">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Oct 24 16:58:10 CST 2025.
+    -->
+    select count(*) from produce_video_audio
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </select>
+  <update id="updateByExampleSelective" parameterType="map">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Oct 24 16:58:10 CST 2025.
+    -->
+    update produce_video_audio
+    <set>
+      <if test="record.id != null">
+        id = #{record.id,jdbcType=VARCHAR},
+      </if>
+      <if test="record.produceVideoId != null">
+        produce_video_id = #{record.produceVideoId,jdbcType=VARCHAR},
+      </if>
+      <if test="record.url != null">
+        url = #{record.url,jdbcType=VARCHAR},
+      </if>
+      <if test="record.duration != null">
+        duration = #{record.duration,jdbcType=INTEGER},
+      </if>
+      <if test="record.status != null">
+        `status` = #{record.status,jdbcType=INTEGER},
+      </if>
+      <if test="record.createTime != null">
+        create_time = #{record.createTime,jdbcType=BIGINT},
+      </if>
+      <if test="record.updateTime != null">
+        update_time = #{record.updateTime,jdbcType=BIGINT},
+      </if>
+    </set>
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByExample" parameterType="map">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Oct 24 16:58:10 CST 2025.
+    -->
+    update produce_video_audio
+    set id = #{record.id,jdbcType=VARCHAR},
+      produce_video_id = #{record.produceVideoId,jdbcType=VARCHAR},
+      url = #{record.url,jdbcType=VARCHAR},
+      duration = #{record.duration,jdbcType=INTEGER},
+      `status` = #{record.status,jdbcType=INTEGER},
+      create_time = #{record.createTime,jdbcType=BIGINT},
+      update_time = #{record.updateTime,jdbcType=BIGINT}
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByPrimaryKeySelective" parameterType="com.tzld.supply.model.po.supply.spider.ProduceVideoAudio">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Oct 24 16:58:10 CST 2025.
+    -->
+    update produce_video_audio
+    <set>
+      <if test="produceVideoId != null">
+        produce_video_id = #{produceVideoId,jdbcType=VARCHAR},
+      </if>
+      <if test="url != null">
+        url = #{url,jdbcType=VARCHAR},
+      </if>
+      <if test="duration != null">
+        duration = #{duration,jdbcType=INTEGER},
+      </if>
+      <if test="status != null">
+        `status` = #{status,jdbcType=INTEGER},
+      </if>
+      <if test="createTime != null">
+        create_time = #{createTime,jdbcType=BIGINT},
+      </if>
+      <if test="updateTime != null">
+        update_time = #{updateTime,jdbcType=BIGINT},
+      </if>
+    </set>
+    where id = #{id,jdbcType=VARCHAR}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.tzld.supply.model.po.supply.spider.ProduceVideoAudio">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Oct 24 16:58:10 CST 2025.
+    -->
+    update produce_video_audio
+    set produce_video_id = #{produceVideoId,jdbcType=VARCHAR},
+      url = #{url,jdbcType=VARCHAR},
+      duration = #{duration,jdbcType=INTEGER},
+      `status` = #{status,jdbcType=INTEGER},
+      create_time = #{createTime,jdbcType=BIGINT},
+      update_time = #{updateTime,jdbcType=BIGINT}
+    where id = #{id,jdbcType=VARCHAR}
+  </update>
+</mapper>

+ 286 - 0
core/src/main/resources/mapper/supply/spider/ProduceVideoMapper.xml

@@ -0,0 +1,286 @@
+<?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.tzld.supply.dao.mapper.supply.spider.ProduceVideoMapper">
+  <resultMap id="BaseResultMap" type="com.tzld.supply.model.po.supply.spider.ProduceVideo">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Oct 24 16:58:10 CST 2025.
+    -->
+    <id column="id" jdbcType="VARCHAR" property="id" />
+    <result column="content_id" jdbcType="BIGINT" property="contentId" />
+    <result column="status" jdbcType="INTEGER" property="status" />
+    <result column="create_time" jdbcType="BIGINT" property="createTime" />
+    <result column="update_time" jdbcType="BIGINT" property="updateTime" />
+  </resultMap>
+  <sql id="Example_Where_Clause">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Oct 24 16:58:10 CST 2025.
+    -->
+    <where>
+      <foreach collection="oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Update_By_Example_Where_Clause">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Oct 24 16:58:10 CST 2025.
+    -->
+    <where>
+      <foreach collection="example.oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Base_Column_List">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Oct 24 16:58:10 CST 2025.
+    -->
+    id, content_id, `status`, create_time, update_time
+  </sql>
+  <select id="selectByExample" parameterType="com.tzld.supply.model.po.supply.spider.ProduceVideoExample" resultMap="BaseResultMap">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Oct 24 16:58:10 CST 2025.
+    -->
+    select
+    <if test="distinct">
+      distinct
+    </if>
+    <include refid="Base_Column_List" />
+    from produce_video
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+    <if test="orderByClause != null">
+      order by ${orderByClause}
+    </if>
+  </select>
+  <select id="selectByPrimaryKey" parameterType="java.lang.String" resultMap="BaseResultMap">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Oct 24 16:58:10 CST 2025.
+    -->
+    select 
+    <include refid="Base_Column_List" />
+    from produce_video
+    where id = #{id,jdbcType=VARCHAR}
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.String">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Oct 24 16:58:10 CST 2025.
+    -->
+    delete from produce_video
+    where id = #{id,jdbcType=VARCHAR}
+  </delete>
+  <delete id="deleteByExample" parameterType="com.tzld.supply.model.po.supply.spider.ProduceVideoExample">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Oct 24 16:58:10 CST 2025.
+    -->
+    delete from produce_video
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </delete>
+  <insert id="insert" parameterType="com.tzld.supply.model.po.supply.spider.ProduceVideo">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Oct 24 16:58:10 CST 2025.
+    -->
+    insert into produce_video (id, content_id, `status`, 
+      create_time, update_time)
+    values (#{id,jdbcType=VARCHAR}, #{contentId,jdbcType=BIGINT}, #{status,jdbcType=INTEGER}, 
+      #{createTime,jdbcType=BIGINT}, #{updateTime,jdbcType=BIGINT})
+  </insert>
+  <insert id="insertSelective" parameterType="com.tzld.supply.model.po.supply.spider.ProduceVideo">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Oct 24 16:58:10 CST 2025.
+    -->
+    insert into produce_video
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        id,
+      </if>
+      <if test="contentId != null">
+        content_id,
+      </if>
+      <if test="status != null">
+        `status`,
+      </if>
+      <if test="createTime != null">
+        create_time,
+      </if>
+      <if test="updateTime != null">
+        update_time,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        #{id,jdbcType=VARCHAR},
+      </if>
+      <if test="contentId != null">
+        #{contentId,jdbcType=BIGINT},
+      </if>
+      <if test="status != null">
+        #{status,jdbcType=INTEGER},
+      </if>
+      <if test="createTime != null">
+        #{createTime,jdbcType=BIGINT},
+      </if>
+      <if test="updateTime != null">
+        #{updateTime,jdbcType=BIGINT},
+      </if>
+    </trim>
+  </insert>
+  <select id="countByExample" parameterType="com.tzld.supply.model.po.supply.spider.ProduceVideoExample" resultType="java.lang.Long">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Oct 24 16:58:10 CST 2025.
+    -->
+    select count(*) from produce_video
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </select>
+  <update id="updateByExampleSelective" parameterType="map">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Oct 24 16:58:10 CST 2025.
+    -->
+    update produce_video
+    <set>
+      <if test="record.id != null">
+        id = #{record.id,jdbcType=VARCHAR},
+      </if>
+      <if test="record.contentId != null">
+        content_id = #{record.contentId,jdbcType=BIGINT},
+      </if>
+      <if test="record.status != null">
+        `status` = #{record.status,jdbcType=INTEGER},
+      </if>
+      <if test="record.createTime != null">
+        create_time = #{record.createTime,jdbcType=BIGINT},
+      </if>
+      <if test="record.updateTime != null">
+        update_time = #{record.updateTime,jdbcType=BIGINT},
+      </if>
+    </set>
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByExample" parameterType="map">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Oct 24 16:58:10 CST 2025.
+    -->
+    update produce_video
+    set id = #{record.id,jdbcType=VARCHAR},
+      content_id = #{record.contentId,jdbcType=BIGINT},
+      `status` = #{record.status,jdbcType=INTEGER},
+      create_time = #{record.createTime,jdbcType=BIGINT},
+      update_time = #{record.updateTime,jdbcType=BIGINT}
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByPrimaryKeySelective" parameterType="com.tzld.supply.model.po.supply.spider.ProduceVideo">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Oct 24 16:58:10 CST 2025.
+    -->
+    update produce_video
+    <set>
+      <if test="contentId != null">
+        content_id = #{contentId,jdbcType=BIGINT},
+      </if>
+      <if test="status != null">
+        `status` = #{status,jdbcType=INTEGER},
+      </if>
+      <if test="createTime != null">
+        create_time = #{createTime,jdbcType=BIGINT},
+      </if>
+      <if test="updateTime != null">
+        update_time = #{updateTime,jdbcType=BIGINT},
+      </if>
+    </set>
+    where id = #{id,jdbcType=VARCHAR}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.tzld.supply.model.po.supply.spider.ProduceVideo">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Oct 24 16:58:10 CST 2025.
+    -->
+    update produce_video
+    set content_id = #{contentId,jdbcType=BIGINT},
+      `status` = #{status,jdbcType=INTEGER},
+      create_time = #{createTime,jdbcType=BIGINT},
+      update_time = #{updateTime,jdbcType=BIGINT}
+    where id = #{id,jdbcType=VARCHAR}
+  </update>
+</mapper>

+ 9 - 0
core/src/main/resources/mapper/supply/spider/ext/SpiderMapperExt.xml

@@ -64,4 +64,13 @@
         and media.status = #{mediaStatus}
     </select>
 
+    <select id="getVideoGenerateContent" resultType="com.tzld.supply.model.po.supply.spider.SpiderContent">
+        select *
+        from spider_content
+        where `status` = #{status}
+          and create_time between #{startTime} and #{endTime}
+          and pq_improve_narration_script is not null
+          and id not in (select content_id from produce_video)
+    </select>
+
 </mapper>

+ 9 - 4
server/src/main/java/com/tzld/supply/controller/XxlJobController.java

@@ -1,10 +1,7 @@
 package com.tzld.supply.controller;
 
 import com.tzld.supply.common.base.CommonResponse;
-import com.tzld.supply.job.ContentMediaSearchJob;
-import com.tzld.supply.job.ContentScreenJob;
-import com.tzld.supply.job.SpiderContentFeishuJob;
-import com.tzld.supply.job.SpiderJob;
+import com.tzld.supply.job.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -22,6 +19,8 @@ public class XxlJobController {
     private SpiderContentFeishuJob contentFeishuJob;
     @Autowired
     private ContentMediaSearchJob contentMediaSearchJob;
+    @Autowired
+    private VideoVoiceGenerateJob videoVoiceGenerateJob;
 
     @GetMapping("/spiderTaskJob")
     public CommonResponse<Void> spiderTaskJob() {
@@ -83,4 +82,10 @@ public class XxlJobController {
         return CommonResponse.success();
     }
 
+    @GetMapping("/videoVoiceGenerateJob")
+    public CommonResponse<Void> videoVoiceGenerateJob(String dateStr) {
+        videoVoiceGenerateJob.videoVoiceGenerateJob(dateStr);
+        return CommonResponse.success();
+    }
+
 }