Browse Source

媒体资源搜索

wangyunpeng 3 tuần trước cách đây
mục cha
commit
f029f01532

+ 70 - 0
core/src/main/java/com/tzld/supply/api/DangerFaceRecognizeService.java

@@ -0,0 +1,70 @@
+package com.tzld.supply.api;
+
+import com.alibaba.fastjson.JSONObject;
+import com.tzld.supply.model.entity.AlgFaceRecognizeResult;
+import com.tzld.supply.model.entity.PQResponse;
+import com.tzld.supply.util.HttpClientFactory;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.HttpEntity;
+import org.apache.http.StatusLine;
+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.stereotype.Service;
+
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.util.Objects;
+
+@Service
+@Slf4j
+public class DangerFaceRecognizeService {
+
+    private final CloseableHttpClient client =
+            HttpClientFactory.create(60000, 60000, 200, 200, 0, 60000);
+    private static final String url = "http://172.16.232.206:5000/recognize/url";
+
+    public AlgFaceRecognizeResult getResult(String imageUrl) {
+        int retryTimes = 3;
+        while (retryTimes > 0) {
+            AlgFaceRecognizeResult result = post(imageUrl);
+            if (Objects.nonNull(result)) {
+                return result;
+            }
+            retryTimes--;
+        }
+        return null;
+    }
+
+    public AlgFaceRecognizeResult post(String imageUrl) {
+        JSONObject params = new JSONObject();
+        params.put("url", imageUrl);
+        try {
+            HttpPost httpPost = new HttpPost(url);
+            StringEntity stringEntity = new StringEntity(params.toJSONString(), StandardCharsets.UTF_8);
+            httpPost.setHeader("Content-Type", "application/json;charset=UTF-8");
+            httpPost.setEntity(stringEntity);
+            CloseableHttpResponse response = client.execute(httpPost);
+            StatusLine statusLine = response.getStatusLine();
+            if (statusLine.getStatusCode() == 200) {
+                HttpEntity responseEntity = response.getEntity();
+                if (Objects.nonNull(responseEntity)) {
+                    String responseBody = EntityUtils.toString(responseEntity, "UTF-8");
+                    PQResponse pqResponse = JSONObject.parseObject(responseBody, PQResponse.class);
+                    if (pqResponse.getCode() == 0 && Objects.nonNull(pqResponse.getData())) {
+                        return JSONObject.parseObject(JSONObject.toJSONString(pqResponse.getData()), AlgFaceRecognizeResult.class);
+                    } else {
+                        return null;
+                    }
+                }
+            }
+        } catch (IOException e) {
+            log.error("DangerFaceRecognizeService error", e);
+        }
+        return null;
+    }
+
+
+}

+ 22 - 0
core/src/main/java/com/tzld/supply/api/SpiderApiService.java

@@ -105,4 +105,26 @@ public class SpiderApiService {
         }
         return null;
     }
+
+    /**
+     * 搜索内容图片请求
+     * @param title 标题
+     * @return ContentSearchResponse.DataItem 响应对象
+     */
+    public List<ContentSearchResponse.DataItem> searchContentImage(String title) {
+        // 搜索内容图片
+
+        return null;
+    }
+
+    /**
+     * 搜索内容视频请求
+     * @param title 标题
+     * @return ContentSearchResponse.DataItem 响应对象
+     */
+    public List<ContentSearchResponse.DataItem> searchContentVideo(String title) {
+        // 搜索内容视频
+
+        return null;
+    }
 }

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

@@ -0,0 +1,31 @@
+package com.tzld.supply.common.enums;
+
+import lombok.Getter;
+
+import java.util.Objects;
+
+@Getter
+public enum FindFaceStatusEnum {
+    EXIST(1, "有违规脸"),
+    NOT_EXIST(2, "没有违规脸"),
+
+    other(999, "其他"),
+    ;
+
+    private final Integer status;
+    private final String description;
+
+    FindFaceStatusEnum(Integer status, String description) {
+        this.status = status;
+        this.description = description;
+    }
+
+    public static FindFaceStatusEnum from(Integer status) {
+        for (FindFaceStatusEnum statusEnum : FindFaceStatusEnum.values()) {
+            if (Objects.equals(statusEnum.status, status)) {
+                return statusEnum;
+            }
+        }
+        return other;
+    }
+}

+ 30 - 0
core/src/main/java/com/tzld/supply/common/enums/SpiderContentMediaStatusEnum.java

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

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

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

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

@@ -1,6 +1,7 @@
 package com.tzld.supply.dao.mapper.supply.spider.ext;
 
 import com.tzld.supply.model.po.supply.spider.SpiderContent;
+import com.tzld.supply.model.po.supply.spider.SpiderContentMedia;
 
 import java.util.List;
 
@@ -8,9 +9,15 @@ public interface SpiderMapperExt {
 
     int batchInsertSpiderContent(List<SpiderContent> contentList);
 
+    void batchInsertSpiderContentMedia(List<SpiderContentMedia> contentList);
+
     List<SpiderContent> getRoughScreenSpiderContentHasContent();
 
     List<SpiderContent> getRoughScreenSpiderContentNoContent();
 
     List<SpiderContent> getExportContentList(List<Integer> statusList, Integer aiRoughStatus, Long startTime, Long endTime);
+
+    List<SpiderContent> getMediaSearchSpiderContent(Integer status, Long startTime, Long endTime, String mediaType);
+
+    List<SpiderContentMedia> getMediaSearchSpiderContentMedia(Integer status, Long startTime, Long endTime, Integer mediaStatus, String mediaType);
 }

+ 183 - 0
core/src/main/java/com/tzld/supply/job/ContentMediaSearchJob.java

@@ -0,0 +1,183 @@
+package com.tzld.supply.job;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.http.HttpUtil;
+import com.stuuudy.commons.external.filestorage.enums.EnumPublicBuckets;
+import com.tzld.supply.api.DangerFaceRecognizeService;
+import com.tzld.supply.api.SpiderApiService;
+import com.tzld.supply.common.enums.FindFaceStatusEnum;
+import com.tzld.supply.common.enums.SpiderContentMediaStatusEnum;
+import com.tzld.supply.common.enums.SpiderContentStatusEnum;
+import com.tzld.supply.dao.mapper.supply.spider.SpiderContentMediaMapper;
+import com.tzld.supply.dao.mapper.supply.spider.ext.SpiderMapperExt;
+import com.tzld.supply.model.entity.AlgFaceRecognizeResult;
+import com.tzld.supply.model.entity.ContentSearchResponse;
+import com.tzld.supply.model.po.supply.spider.SpiderContent;
+import com.tzld.supply.model.po.supply.spider.SpiderContentMedia;
+import com.tzld.supply.util.AliOssFileTool;
+import com.tzld.supply.util.CdnUtil;
+import com.tzld.supply.util.DateUtils;
+import com.xxl.job.core.biz.model.ReturnT;
+import com.xxl.job.core.handler.annotation.XxlJob;
+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.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+@Slf4j
+@Component
+public class ContentMediaSearchJob {
+
+    @Autowired
+    private SpiderApiService spiderApiService;
+    @Autowired
+    private DangerFaceRecognizeService dangerFaceRecognizeService;
+    @Autowired
+    private SpiderContentMediaMapper spiderContentMediaMapper;
+    @Autowired
+    private SpiderMapperExt spiderMapperExt;
+
+
+    @XxlJob("contentImageMediaSearchJob")
+    public ReturnT<String> contentImageMediaSearchJob(String param) {
+        Long startTime = DateUtils.getTodayStart();
+        if (StringUtils.isNotBlank(param)) {
+            startTime = DateUtils.getStartOfDay(param, "yyyyMMdd");
+        }
+        Long endTime = startTime + 86400 * 1000;
+        List<SpiderContent> contentList = spiderMapperExt.getMediaSearchSpiderContent(SpiderContentStatusEnum.PASSED.getCode(),
+                startTime, endTime, "image");
+        if (CollectionUtil.isEmpty(contentList)) {
+            return ReturnT.SUCCESS;
+        }
+        for (SpiderContent content : contentList) {
+            List<ContentSearchResponse.DataItem> dataItems = spiderApiService.searchContentImage(content.getTitle());
+            if (CollectionUtil.isEmpty(dataItems)) {
+                continue;
+            }
+            List<SpiderContentMedia> saveList = new ArrayList<>();
+            Long now = System.currentTimeMillis();
+            for (ContentSearchResponse.DataItem dataItem : dataItems) {
+                // 2. 调用saveInPublic转存到OSS
+                String fileName = String.format("image/%s_%d.jpg", content.getId(), System.currentTimeMillis());
+                String fileUrl = downloadAndSaveInOSS(fileName, dataItem.getUrl(), "image/jpeg");
+                if (StringUtils.isBlank(fileUrl)) {
+                    log.warn("图片转存OSS失败,URL: {}", dataItem.getUrl());
+                    continue;
+                }
+
+                SpiderContentMedia media = new SpiderContentMedia();
+                media.setContentId(content.getId());
+                media.setMediaType("image");
+                media.setUrl(dataItem.getUrl());
+                media.setTitle(dataItem.getTitle());
+                media.setOssKey(fileUrl);
+                media.setStatus(SpiderContentMediaStatusEnum.WAITING.getCode());
+                media.setCreateTime(now);
+                media.setUpdateTime(now);
+                saveList.add(media);
+            }
+            spiderMapperExt.batchInsertSpiderContentMedia(saveList);
+
+        }
+
+        return ReturnT.SUCCESS;
+    }
+
+    private String downloadAndSaveInOSS(String fileName, String url, String contentType) {
+        try {
+            byte[] fileData = HttpUtil.downloadBytes(url);
+            if (fileData == null || fileData.length == 0) {
+                log.warn("下载media失败,URL: {}", url);
+                return null;
+            }
+            InputStream inputStream = new java.io.ByteArrayInputStream(fileData);
+            return CdnUtil.getOssHttpUrl(AliOssFileTool.saveInPublic(EnumPublicBuckets.PUBBUCKET.getBucketName(),
+                    fileName, inputStream, contentType));
+        } catch (Exception e) {
+            log.error("下载转存OSS失败,URL: {}", url, e);
+            return null;
+        }
+    }
+
+    @XxlJob("contentMediaImageCheckJob")
+    public ReturnT<String> contentMediaImageCheckJob(String param) {
+        Long startTime = DateUtils.getTodayStart();
+        if (StringUtils.isNotBlank(param)) {
+            startTime = DateUtils.getStartOfDay(param, "yyyyMMdd");
+        }
+        Long endTime = startTime + 86400 * 1000;
+        List<SpiderContentMedia> mediaList = spiderMapperExt.getMediaSearchSpiderContentMedia(SpiderContentStatusEnum.PASSED.getCode(),
+                startTime, endTime, SpiderContentMediaStatusEnum.WAITING.getCode(), "image");
+        if (CollectionUtil.isEmpty(mediaList)) {
+            return ReturnT.SUCCESS;
+        }
+        for (SpiderContentMedia media : mediaList) {
+            // 调用封面检测
+            AlgFaceRecognizeResult result = dangerFaceRecognizeService.getResult(media.getOssKey());
+            if (Objects.equals(result.getFind_face_status(), FindFaceStatusEnum.NOT_EXIST.getStatus())) {
+                // 审核通过,更新文章状态
+                media.setStatus(SpiderContentMediaStatusEnum.PASSED.getCode());
+                media.setUpdateTime(System.currentTimeMillis());
+                spiderContentMediaMapper.updateByPrimaryKeySelective(media);
+            } else if (Objects.equals(result.getFind_face_status(), FindFaceStatusEnum.EXIST.getStatus())) {
+                // 审核不通过,删除文章
+                media.setStatus(SpiderContentMediaStatusEnum.ABANDONED.getCode());
+                media.setUpdateTime(System.currentTimeMillis());
+                spiderContentMediaMapper.updateByPrimaryKeySelective(media);
+            }
+        }
+        return ReturnT.SUCCESS;
+    }
+
+
+    @XxlJob("contentVideoMediaSearchJob")
+    public ReturnT<String> contentVideoMediaSearchJob(String param) {
+        Long startTime = DateUtils.getTodayStart();
+        if (StringUtils.isNotBlank(param)) {
+            startTime = DateUtils.getStartOfDay(param, "yyyyMMdd");
+        }
+        Long endTime = startTime + 86400 * 1000;
+        List<SpiderContent> contentList = spiderMapperExt.getMediaSearchSpiderContent(SpiderContentStatusEnum.PASSED.getCode(),
+                startTime, endTime, "video");
+        if (CollectionUtil.isEmpty(contentList)) {
+            return ReturnT.SUCCESS;
+        }
+        for (SpiderContent content : contentList) {
+            List<ContentSearchResponse.DataItem> dataItems = spiderApiService.searchContentVideo(content.getTitle());
+            if (CollectionUtil.isEmpty(dataItems)) {
+                continue;
+            }
+            List<SpiderContentMedia> saveList = new ArrayList<>();
+            Long now = System.currentTimeMillis();
+            for (ContentSearchResponse.DataItem dataItem : dataItems) {
+                String fileName = String.format("video/%s_%d.mp4", content.getId(), System.currentTimeMillis());
+                String fileUrl = downloadAndSaveInOSS(fileName, dataItem.getUrl(), "video/mp4");
+                if (StringUtils.isBlank(fileUrl)) {
+                    log.warn("视频转存OSS失败,URL: {}", dataItem.getUrl());
+                    continue;
+                }
+                SpiderContentMedia media = new SpiderContentMedia();
+                media.setContentId(content.getId());
+                media.setMediaType("video");
+                media.setUrl(dataItem.getUrl());
+                media.setTitle(dataItem.getTitle());
+                media.setOssKey(fileUrl);
+                media.setStatus(SpiderContentMediaStatusEnum.PASSED.getCode());
+                media.setCreateTime(now);
+                media.setUpdateTime(now);
+                saveList.add(media);
+            }
+            spiderMapperExt.batchInsertSpiderContentMedia(saveList);
+        }
+
+        return ReturnT.SUCCESS;
+    }
+
+
+}

+ 8 - 0
core/src/main/java/com/tzld/supply/model/entity/AlgFaceRecognizeResult.java

@@ -0,0 +1,8 @@
+package com.tzld.supply.model.entity;
+
+import lombok.Data;
+
+@Data
+public class AlgFaceRecognizeResult {
+    private Integer find_face_status;
+}

+ 15 - 0
core/src/main/java/com/tzld/supply/model/entity/PQResponse.java

@@ -0,0 +1,15 @@
+package com.tzld.supply.model.entity;
+
+import lombok.Data;
+
+@Data
+public class PQResponse<T> {
+
+    private long code;
+    private String msg;
+    private T data;
+
+}
+
+
+

+ 452 - 0
core/src/main/java/com/tzld/supply/model/po/supply/spider/SpiderContentMedia.java

@@ -0,0 +1,452 @@
+package com.tzld.supply.model.po.supply.spider;
+
+/**
+ *
+ * This class was generated by MyBatis Generator.
+ * This class corresponds to the database table spider_content_media
+ */
+public class SpiderContentMedia {
+    /**
+     * Database Column Remarks:
+     *   主键ID
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column spider_content_media.id
+     *
+     * @mbg.generated Fri Oct 24 11:02:20 CST 2025
+     */
+    private Long id;
+
+    /**
+     * Database Column Remarks:
+     *   内容ID
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column spider_content_media.content_id
+     *
+     * @mbg.generated Fri Oct 24 11:02:20 CST 2025
+     */
+    private Long contentId;
+
+    /**
+     * Database Column Remarks:
+     *   类型(video/image)
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column spider_content_media.media_type
+     *
+     * @mbg.generated Fri Oct 24 11:02:20 CST 2025
+     */
+    private String mediaType;
+
+    /**
+     * Database Column Remarks:
+     *   来源网站
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column spider_content_media.source_site
+     *
+     * @mbg.generated Fri Oct 24 11:02:20 CST 2025
+     */
+    private String sourceSite;
+
+    /**
+     * Database Column Remarks:
+     *   原始URL
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column spider_content_media.url
+     *
+     * @mbg.generated Fri Oct 24 11:02:20 CST 2025
+     */
+    private String url;
+
+    /**
+     * Database Column Remarks:
+     *   标题
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column spider_content_media.title
+     *
+     * @mbg.generated Fri Oct 24 11:02:20 CST 2025
+     */
+    private String title;
+
+    /**
+     * Database Column Remarks:
+     *   视频时长
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column spider_content_media.duration
+     *
+     * @mbg.generated Fri Oct 24 11:02:20 CST 2025
+     */
+    private Integer duration;
+
+    /**
+     * Database Column Remarks:
+     *   转存oss路径
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column spider_content_media.oss_key
+     *
+     * @mbg.generated Fri Oct 24 11:02:20 CST 2025
+     */
+    private String ossKey;
+
+    /**
+     * Database Column Remarks:
+     *   相关性分值
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column spider_content_media.relevance_score
+     *
+     * @mbg.generated Fri Oct 24 11:02:20 CST 2025
+     */
+    private Double relevanceScore;
+
+    /**
+     * Database Column Remarks:
+     *   状态(1-有效/0-废弃)
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column spider_content_media.status
+     *
+     * @mbg.generated Fri Oct 24 11:02:20 CST 2025
+     */
+    private Integer status;
+
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column spider_content_media.create_time
+     *
+     * @mbg.generated Fri Oct 24 11:02:20 CST 2025
+     */
+    private Long createTime;
+
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column spider_content_media.update_time
+     *
+     * @mbg.generated Fri Oct 24 11:02:20 CST 2025
+     */
+    private Long updateTime;
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column spider_content_media.id
+     *
+     * @return the value of spider_content_media.id
+     *
+     * @mbg.generated Fri Oct 24 11:02:20 CST 2025
+     */
+    public Long getId() {
+        return id;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column spider_content_media.id
+     *
+     * @param id the value for spider_content_media.id
+     *
+     * @mbg.generated Fri Oct 24 11:02:20 CST 2025
+     */
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column spider_content_media.content_id
+     *
+     * @return the value of spider_content_media.content_id
+     *
+     * @mbg.generated Fri Oct 24 11:02:20 CST 2025
+     */
+    public Long getContentId() {
+        return contentId;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column spider_content_media.content_id
+     *
+     * @param contentId the value for spider_content_media.content_id
+     *
+     * @mbg.generated Fri Oct 24 11:02:20 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 spider_content_media.media_type
+     *
+     * @return the value of spider_content_media.media_type
+     *
+     * @mbg.generated Fri Oct 24 11:02:20 CST 2025
+     */
+    public String getMediaType() {
+        return mediaType;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column spider_content_media.media_type
+     *
+     * @param mediaType the value for spider_content_media.media_type
+     *
+     * @mbg.generated Fri Oct 24 11:02:20 CST 2025
+     */
+    public void setMediaType(String mediaType) {
+        this.mediaType = mediaType;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column spider_content_media.source_site
+     *
+     * @return the value of spider_content_media.source_site
+     *
+     * @mbg.generated Fri Oct 24 11:02:20 CST 2025
+     */
+    public String getSourceSite() {
+        return sourceSite;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column spider_content_media.source_site
+     *
+     * @param sourceSite the value for spider_content_media.source_site
+     *
+     * @mbg.generated Fri Oct 24 11:02:20 CST 2025
+     */
+    public void setSourceSite(String sourceSite) {
+        this.sourceSite = sourceSite;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column spider_content_media.url
+     *
+     * @return the value of spider_content_media.url
+     *
+     * @mbg.generated Fri Oct 24 11:02:20 CST 2025
+     */
+    public String getUrl() {
+        return url;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column spider_content_media.url
+     *
+     * @param url the value for spider_content_media.url
+     *
+     * @mbg.generated Fri Oct 24 11:02:20 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 spider_content_media.title
+     *
+     * @return the value of spider_content_media.title
+     *
+     * @mbg.generated Fri Oct 24 11:02:20 CST 2025
+     */
+    public String getTitle() {
+        return title;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column spider_content_media.title
+     *
+     * @param title the value for spider_content_media.title
+     *
+     * @mbg.generated Fri Oct 24 11:02:20 CST 2025
+     */
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column spider_content_media.duration
+     *
+     * @return the value of spider_content_media.duration
+     *
+     * @mbg.generated Fri Oct 24 11:02:20 CST 2025
+     */
+    public Integer getDuration() {
+        return duration;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column spider_content_media.duration
+     *
+     * @param duration the value for spider_content_media.duration
+     *
+     * @mbg.generated Fri Oct 24 11:02:20 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 spider_content_media.oss_key
+     *
+     * @return the value of spider_content_media.oss_key
+     *
+     * @mbg.generated Fri Oct 24 11:02:20 CST 2025
+     */
+    public String getOssKey() {
+        return ossKey;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column spider_content_media.oss_key
+     *
+     * @param ossKey the value for spider_content_media.oss_key
+     *
+     * @mbg.generated Fri Oct 24 11:02:20 CST 2025
+     */
+    public void setOssKey(String ossKey) {
+        this.ossKey = ossKey;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column spider_content_media.relevance_score
+     *
+     * @return the value of spider_content_media.relevance_score
+     *
+     * @mbg.generated Fri Oct 24 11:02:20 CST 2025
+     */
+    public Double getRelevanceScore() {
+        return relevanceScore;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column spider_content_media.relevance_score
+     *
+     * @param relevanceScore the value for spider_content_media.relevance_score
+     *
+     * @mbg.generated Fri Oct 24 11:02:20 CST 2025
+     */
+    public void setRelevanceScore(Double relevanceScore) {
+        this.relevanceScore = relevanceScore;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column spider_content_media.status
+     *
+     * @return the value of spider_content_media.status
+     *
+     * @mbg.generated Fri Oct 24 11:02:20 CST 2025
+     */
+    public Integer getStatus() {
+        return status;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column spider_content_media.status
+     *
+     * @param status the value for spider_content_media.status
+     *
+     * @mbg.generated Fri Oct 24 11:02:20 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 spider_content_media.create_time
+     *
+     * @return the value of spider_content_media.create_time
+     *
+     * @mbg.generated Fri Oct 24 11:02:20 CST 2025
+     */
+    public Long getCreateTime() {
+        return createTime;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column spider_content_media.create_time
+     *
+     * @param createTime the value for spider_content_media.create_time
+     *
+     * @mbg.generated Fri Oct 24 11:02:20 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 spider_content_media.update_time
+     *
+     * @return the value of spider_content_media.update_time
+     *
+     * @mbg.generated Fri Oct 24 11:02:20 CST 2025
+     */
+    public Long getUpdateTime() {
+        return updateTime;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column spider_content_media.update_time
+     *
+     * @param updateTime the value for spider_content_media.update_time
+     *
+     * @mbg.generated Fri Oct 24 11:02:20 CST 2025
+     */
+    public void setUpdateTime(Long updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table spider_content_media
+     *
+     * @mbg.generated Fri Oct 24 11:02:20 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(", mediaType=").append(mediaType);
+        sb.append(", sourceSite=").append(sourceSite);
+        sb.append(", url=").append(url);
+        sb.append(", title=").append(title);
+        sb.append(", duration=").append(duration);
+        sb.append(", ossKey=").append(ossKey);
+        sb.append(", relevanceScore=").append(relevanceScore);
+        sb.append(", status=").append(status);
+        sb.append(", createTime=").append(createTime);
+        sb.append(", updateTime=").append(updateTime);
+        sb.append("]");
+        return sb.toString();
+    }
+}

+ 1072 - 0
core/src/main/java/com/tzld/supply/model/po/supply/spider/SpiderContentMediaExample.java

@@ -0,0 +1,1072 @@
+package com.tzld.supply.model.po.supply.spider;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class SpiderContentMediaExample {
+    /**
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database table spider_content_media
+     *
+     * @mbg.generated Fri Oct 24 11:02:20 CST 2025
+     */
+    protected String orderByClause;
+
+    /**
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database table spider_content_media
+     *
+     * @mbg.generated Fri Oct 24 11:02:20 CST 2025
+     */
+    protected boolean distinct;
+
+    /**
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database table spider_content_media
+     *
+     * @mbg.generated Fri Oct 24 11:02:20 CST 2025
+     */
+    protected List<Criteria> oredCriteria;
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table spider_content_media
+     *
+     * @mbg.generated Fri Oct 24 11:02:20 CST 2025
+     */
+    public SpiderContentMediaExample() {
+        oredCriteria = new ArrayList<Criteria>();
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table spider_content_media
+     *
+     * @mbg.generated Fri Oct 24 11:02:20 CST 2025
+     */
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table spider_content_media
+     *
+     * @mbg.generated Fri Oct 24 11:02:20 CST 2025
+     */
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table spider_content_media
+     *
+     * @mbg.generated Fri Oct 24 11:02:20 CST 2025
+     */
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table spider_content_media
+     *
+     * @mbg.generated Fri Oct 24 11:02:20 CST 2025
+     */
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table spider_content_media
+     *
+     * @mbg.generated Fri Oct 24 11:02:20 CST 2025
+     */
+    public List<Criteria> getOredCriteria() {
+        return oredCriteria;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table spider_content_media
+     *
+     * @mbg.generated Fri Oct 24 11:02:20 CST 2025
+     */
+    public void or(Criteria criteria) {
+        oredCriteria.add(criteria);
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table spider_content_media
+     *
+     * @mbg.generated Fri Oct 24 11:02:20 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 spider_content_media
+     *
+     * @mbg.generated Fri Oct 24 11:02:20 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 spider_content_media
+     *
+     * @mbg.generated Fri Oct 24 11:02:20 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 spider_content_media
+     *
+     * @mbg.generated Fri Oct 24 11:02:20 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 spider_content_media
+     *
+     * @mbg.generated Fri Oct 24 11:02:20 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(Long value) {
+            addCriterion("id =", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotEqualTo(Long value) {
+            addCriterion("id <>", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThan(Long value) {
+            addCriterion("id >", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("id >=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThan(Long value) {
+            addCriterion("id <", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThanOrEqualTo(Long value) {
+            addCriterion("id <=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIn(List<Long> values) {
+            addCriterion("id in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotIn(List<Long> values) {
+            addCriterion("id not in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdBetween(Long value1, Long value2) {
+            addCriterion("id between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotBetween(Long value1, Long 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 andMediaTypeIsNull() {
+            addCriterion("media_type is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMediaTypeIsNotNull() {
+            addCriterion("media_type is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMediaTypeEqualTo(String value) {
+            addCriterion("media_type =", value, "mediaType");
+            return (Criteria) this;
+        }
+
+        public Criteria andMediaTypeNotEqualTo(String value) {
+            addCriterion("media_type <>", value, "mediaType");
+            return (Criteria) this;
+        }
+
+        public Criteria andMediaTypeGreaterThan(String value) {
+            addCriterion("media_type >", value, "mediaType");
+            return (Criteria) this;
+        }
+
+        public Criteria andMediaTypeGreaterThanOrEqualTo(String value) {
+            addCriterion("media_type >=", value, "mediaType");
+            return (Criteria) this;
+        }
+
+        public Criteria andMediaTypeLessThan(String value) {
+            addCriterion("media_type <", value, "mediaType");
+            return (Criteria) this;
+        }
+
+        public Criteria andMediaTypeLessThanOrEqualTo(String value) {
+            addCriterion("media_type <=", value, "mediaType");
+            return (Criteria) this;
+        }
+
+        public Criteria andMediaTypeLike(String value) {
+            addCriterion("media_type like", value, "mediaType");
+            return (Criteria) this;
+        }
+
+        public Criteria andMediaTypeNotLike(String value) {
+            addCriterion("media_type not like", value, "mediaType");
+            return (Criteria) this;
+        }
+
+        public Criteria andMediaTypeIn(List<String> values) {
+            addCriterion("media_type in", values, "mediaType");
+            return (Criteria) this;
+        }
+
+        public Criteria andMediaTypeNotIn(List<String> values) {
+            addCriterion("media_type not in", values, "mediaType");
+            return (Criteria) this;
+        }
+
+        public Criteria andMediaTypeBetween(String value1, String value2) {
+            addCriterion("media_type between", value1, value2, "mediaType");
+            return (Criteria) this;
+        }
+
+        public Criteria andMediaTypeNotBetween(String value1, String value2) {
+            addCriterion("media_type not between", value1, value2, "mediaType");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceSiteIsNull() {
+            addCriterion("source_site is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceSiteIsNotNull() {
+            addCriterion("source_site is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceSiteEqualTo(String value) {
+            addCriterion("source_site =", value, "sourceSite");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceSiteNotEqualTo(String value) {
+            addCriterion("source_site <>", value, "sourceSite");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceSiteGreaterThan(String value) {
+            addCriterion("source_site >", value, "sourceSite");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceSiteGreaterThanOrEqualTo(String value) {
+            addCriterion("source_site >=", value, "sourceSite");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceSiteLessThan(String value) {
+            addCriterion("source_site <", value, "sourceSite");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceSiteLessThanOrEqualTo(String value) {
+            addCriterion("source_site <=", value, "sourceSite");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceSiteLike(String value) {
+            addCriterion("source_site like", value, "sourceSite");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceSiteNotLike(String value) {
+            addCriterion("source_site not like", value, "sourceSite");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceSiteIn(List<String> values) {
+            addCriterion("source_site in", values, "sourceSite");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceSiteNotIn(List<String> values) {
+            addCriterion("source_site not in", values, "sourceSite");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceSiteBetween(String value1, String value2) {
+            addCriterion("source_site between", value1, value2, "sourceSite");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceSiteNotBetween(String value1, String value2) {
+            addCriterion("source_site not between", value1, value2, "sourceSite");
+            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 andTitleIsNull() {
+            addCriterion("title is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleIsNotNull() {
+            addCriterion("title is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleEqualTo(String value) {
+            addCriterion("title =", value, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleNotEqualTo(String value) {
+            addCriterion("title <>", value, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleGreaterThan(String value) {
+            addCriterion("title >", value, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleGreaterThanOrEqualTo(String value) {
+            addCriterion("title >=", value, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleLessThan(String value) {
+            addCriterion("title <", value, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleLessThanOrEqualTo(String value) {
+            addCriterion("title <=", value, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleLike(String value) {
+            addCriterion("title like", value, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleNotLike(String value) {
+            addCriterion("title not like", value, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleIn(List<String> values) {
+            addCriterion("title in", values, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleNotIn(List<String> values) {
+            addCriterion("title not in", values, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleBetween(String value1, String value2) {
+            addCriterion("title between", value1, value2, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleNotBetween(String value1, String value2) {
+            addCriterion("title not between", value1, value2, "title");
+            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 andOssKeyIsNull() {
+            addCriterion("oss_key is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andOssKeyIsNotNull() {
+            addCriterion("oss_key is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andOssKeyEqualTo(String value) {
+            addCriterion("oss_key =", value, "ossKey");
+            return (Criteria) this;
+        }
+
+        public Criteria andOssKeyNotEqualTo(String value) {
+            addCriterion("oss_key <>", value, "ossKey");
+            return (Criteria) this;
+        }
+
+        public Criteria andOssKeyGreaterThan(String value) {
+            addCriterion("oss_key >", value, "ossKey");
+            return (Criteria) this;
+        }
+
+        public Criteria andOssKeyGreaterThanOrEqualTo(String value) {
+            addCriterion("oss_key >=", value, "ossKey");
+            return (Criteria) this;
+        }
+
+        public Criteria andOssKeyLessThan(String value) {
+            addCriterion("oss_key <", value, "ossKey");
+            return (Criteria) this;
+        }
+
+        public Criteria andOssKeyLessThanOrEqualTo(String value) {
+            addCriterion("oss_key <=", value, "ossKey");
+            return (Criteria) this;
+        }
+
+        public Criteria andOssKeyLike(String value) {
+            addCriterion("oss_key like", value, "ossKey");
+            return (Criteria) this;
+        }
+
+        public Criteria andOssKeyNotLike(String value) {
+            addCriterion("oss_key not like", value, "ossKey");
+            return (Criteria) this;
+        }
+
+        public Criteria andOssKeyIn(List<String> values) {
+            addCriterion("oss_key in", values, "ossKey");
+            return (Criteria) this;
+        }
+
+        public Criteria andOssKeyNotIn(List<String> values) {
+            addCriterion("oss_key not in", values, "ossKey");
+            return (Criteria) this;
+        }
+
+        public Criteria andOssKeyBetween(String value1, String value2) {
+            addCriterion("oss_key between", value1, value2, "ossKey");
+            return (Criteria) this;
+        }
+
+        public Criteria andOssKeyNotBetween(String value1, String value2) {
+            addCriterion("oss_key not between", value1, value2, "ossKey");
+            return (Criteria) this;
+        }
+
+        public Criteria andRelevanceScoreIsNull() {
+            addCriterion("relevance_score is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andRelevanceScoreIsNotNull() {
+            addCriterion("relevance_score is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andRelevanceScoreEqualTo(Double value) {
+            addCriterion("relevance_score =", value, "relevanceScore");
+            return (Criteria) this;
+        }
+
+        public Criteria andRelevanceScoreNotEqualTo(Double value) {
+            addCriterion("relevance_score <>", value, "relevanceScore");
+            return (Criteria) this;
+        }
+
+        public Criteria andRelevanceScoreGreaterThan(Double value) {
+            addCriterion("relevance_score >", value, "relevanceScore");
+            return (Criteria) this;
+        }
+
+        public Criteria andRelevanceScoreGreaterThanOrEqualTo(Double value) {
+            addCriterion("relevance_score >=", value, "relevanceScore");
+            return (Criteria) this;
+        }
+
+        public Criteria andRelevanceScoreLessThan(Double value) {
+            addCriterion("relevance_score <", value, "relevanceScore");
+            return (Criteria) this;
+        }
+
+        public Criteria andRelevanceScoreLessThanOrEqualTo(Double value) {
+            addCriterion("relevance_score <=", value, "relevanceScore");
+            return (Criteria) this;
+        }
+
+        public Criteria andRelevanceScoreIn(List<Double> values) {
+            addCriterion("relevance_score in", values, "relevanceScore");
+            return (Criteria) this;
+        }
+
+        public Criteria andRelevanceScoreNotIn(List<Double> values) {
+            addCriterion("relevance_score not in", values, "relevanceScore");
+            return (Criteria) this;
+        }
+
+        public Criteria andRelevanceScoreBetween(Double value1, Double value2) {
+            addCriterion("relevance_score between", value1, value2, "relevanceScore");
+            return (Criteria) this;
+        }
+
+        public Criteria andRelevanceScoreNotBetween(Double value1, Double value2) {
+            addCriterion("relevance_score not between", value1, value2, "relevanceScore");
+            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 spider_content_media
+     *
+     * @mbg.generated do_not_delete_during_merge Fri Oct 24 11:02:20 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 spider_content_media
+     *
+     * @mbg.generated Fri Oct 24 11:02:20 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);
+        }
+    }
+}

+ 0 - 1
core/src/main/resources/generator/mybatis-spider-generator-config.xml

@@ -49,7 +49,6 @@
 <!--        <table tableName="spider_task" domainObjectName="" alias=""/>-->
 <!--        <table tableName="spider_content" domainObjectName="" alias=""/>-->
         <table tableName="spider_content_media" domainObjectName="" alias=""/>
-        <table tableName="tools_audio_trans_record" domainObjectName="" alias=""/>
     </context>
 
 </generatorConfiguration>

+ 398 - 0
core/src/main/resources/mapper/supply/spider/SpiderContentMediaMapper.xml

@@ -0,0 +1,398 @@
+<?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.SpiderContentMediaMapper">
+  <resultMap id="BaseResultMap" type="com.tzld.supply.model.po.supply.spider.SpiderContentMedia">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Oct 24 11:02:20 CST 2025.
+    -->
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="content_id" jdbcType="BIGINT" property="contentId" />
+    <result column="media_type" jdbcType="VARCHAR" property="mediaType" />
+    <result column="source_site" jdbcType="VARCHAR" property="sourceSite" />
+    <result column="url" jdbcType="VARCHAR" property="url" />
+    <result column="title" jdbcType="VARCHAR" property="title" />
+    <result column="duration" jdbcType="INTEGER" property="duration" />
+    <result column="oss_key" jdbcType="VARCHAR" property="ossKey" />
+    <result column="relevance_score" jdbcType="DOUBLE" property="relevanceScore" />
+    <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 11:02:20 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 11:02:20 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 11:02:20 CST 2025.
+    -->
+    id, content_id, media_type, source_site, url, title, duration, oss_key, relevance_score, 
+    `status`, create_time, update_time
+  </sql>
+  <select id="selectByExample" parameterType="com.tzld.supply.model.po.supply.spider.SpiderContentMediaExample" resultMap="BaseResultMap">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Oct 24 11:02:20 CST 2025.
+    -->
+    select
+    <if test="distinct">
+      distinct
+    </if>
+    <include refid="Base_Column_List" />
+    from spider_content_media
+    <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.Long" resultMap="BaseResultMap">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Oct 24 11:02:20 CST 2025.
+    -->
+    select 
+    <include refid="Base_Column_List" />
+    from spider_content_media
+    where id = #{id,jdbcType=BIGINT}
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="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 11:02:20 CST 2025.
+    -->
+    delete from spider_content_media
+    where id = #{id,jdbcType=BIGINT}
+  </delete>
+  <delete id="deleteByExample" parameterType="com.tzld.supply.model.po.supply.spider.SpiderContentMediaExample">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Oct 24 11:02:20 CST 2025.
+    -->
+    delete from spider_content_media
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </delete>
+  <insert id="insert" parameterType="com.tzld.supply.model.po.supply.spider.SpiderContentMedia">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Oct 24 11:02:20 CST 2025.
+    -->
+    insert into spider_content_media (id, content_id, media_type, 
+      source_site, url, title, 
+      duration, oss_key, relevance_score, 
+      `status`, create_time, update_time
+      )
+    values (#{id,jdbcType=BIGINT}, #{contentId,jdbcType=BIGINT}, #{mediaType,jdbcType=VARCHAR}, 
+      #{sourceSite,jdbcType=VARCHAR}, #{url,jdbcType=VARCHAR}, #{title,jdbcType=VARCHAR}, 
+      #{duration,jdbcType=INTEGER}, #{ossKey,jdbcType=VARCHAR}, #{relevanceScore,jdbcType=DOUBLE}, 
+      #{status,jdbcType=INTEGER}, #{createTime,jdbcType=BIGINT}, #{updateTime,jdbcType=BIGINT}
+      )
+  </insert>
+  <insert id="insertSelective" parameterType="com.tzld.supply.model.po.supply.spider.SpiderContentMedia">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Oct 24 11:02:20 CST 2025.
+    -->
+    insert into spider_content_media
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        id,
+      </if>
+      <if test="contentId != null">
+        content_id,
+      </if>
+      <if test="mediaType != null">
+        media_type,
+      </if>
+      <if test="sourceSite != null">
+        source_site,
+      </if>
+      <if test="url != null">
+        url,
+      </if>
+      <if test="title != null">
+        title,
+      </if>
+      <if test="duration != null">
+        duration,
+      </if>
+      <if test="ossKey != null">
+        oss_key,
+      </if>
+      <if test="relevanceScore != null">
+        relevance_score,
+      </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=BIGINT},
+      </if>
+      <if test="contentId != null">
+        #{contentId,jdbcType=BIGINT},
+      </if>
+      <if test="mediaType != null">
+        #{mediaType,jdbcType=VARCHAR},
+      </if>
+      <if test="sourceSite != null">
+        #{sourceSite,jdbcType=VARCHAR},
+      </if>
+      <if test="url != null">
+        #{url,jdbcType=VARCHAR},
+      </if>
+      <if test="title != null">
+        #{title,jdbcType=VARCHAR},
+      </if>
+      <if test="duration != null">
+        #{duration,jdbcType=INTEGER},
+      </if>
+      <if test="ossKey != null">
+        #{ossKey,jdbcType=VARCHAR},
+      </if>
+      <if test="relevanceScore != null">
+        #{relevanceScore,jdbcType=DOUBLE},
+      </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.SpiderContentMediaExample" 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 11:02:20 CST 2025.
+    -->
+    select count(*) from spider_content_media
+    <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 11:02:20 CST 2025.
+    -->
+    update spider_content_media
+    <set>
+      <if test="record.id != null">
+        id = #{record.id,jdbcType=BIGINT},
+      </if>
+      <if test="record.contentId != null">
+        content_id = #{record.contentId,jdbcType=BIGINT},
+      </if>
+      <if test="record.mediaType != null">
+        media_type = #{record.mediaType,jdbcType=VARCHAR},
+      </if>
+      <if test="record.sourceSite != null">
+        source_site = #{record.sourceSite,jdbcType=VARCHAR},
+      </if>
+      <if test="record.url != null">
+        url = #{record.url,jdbcType=VARCHAR},
+      </if>
+      <if test="record.title != null">
+        title = #{record.title,jdbcType=VARCHAR},
+      </if>
+      <if test="record.duration != null">
+        duration = #{record.duration,jdbcType=INTEGER},
+      </if>
+      <if test="record.ossKey != null">
+        oss_key = #{record.ossKey,jdbcType=VARCHAR},
+      </if>
+      <if test="record.relevanceScore != null">
+        relevance_score = #{record.relevanceScore,jdbcType=DOUBLE},
+      </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 11:02:20 CST 2025.
+    -->
+    update spider_content_media
+    set id = #{record.id,jdbcType=BIGINT},
+      content_id = #{record.contentId,jdbcType=BIGINT},
+      media_type = #{record.mediaType,jdbcType=VARCHAR},
+      source_site = #{record.sourceSite,jdbcType=VARCHAR},
+      url = #{record.url,jdbcType=VARCHAR},
+      title = #{record.title,jdbcType=VARCHAR},
+      duration = #{record.duration,jdbcType=INTEGER},
+      oss_key = #{record.ossKey,jdbcType=VARCHAR},
+      relevance_score = #{record.relevanceScore,jdbcType=DOUBLE},
+      `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.SpiderContentMedia">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Oct 24 11:02:20 CST 2025.
+    -->
+    update spider_content_media
+    <set>
+      <if test="contentId != null">
+        content_id = #{contentId,jdbcType=BIGINT},
+      </if>
+      <if test="mediaType != null">
+        media_type = #{mediaType,jdbcType=VARCHAR},
+      </if>
+      <if test="sourceSite != null">
+        source_site = #{sourceSite,jdbcType=VARCHAR},
+      </if>
+      <if test="url != null">
+        url = #{url,jdbcType=VARCHAR},
+      </if>
+      <if test="title != null">
+        title = #{title,jdbcType=VARCHAR},
+      </if>
+      <if test="duration != null">
+        duration = #{duration,jdbcType=INTEGER},
+      </if>
+      <if test="ossKey != null">
+        oss_key = #{ossKey,jdbcType=VARCHAR},
+      </if>
+      <if test="relevanceScore != null">
+        relevance_score = #{relevanceScore,jdbcType=DOUBLE},
+      </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=BIGINT}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.tzld.supply.model.po.supply.spider.SpiderContentMedia">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Fri Oct 24 11:02:20 CST 2025.
+    -->
+    update spider_content_media
+    set content_id = #{contentId,jdbcType=BIGINT},
+      media_type = #{mediaType,jdbcType=VARCHAR},
+      source_site = #{sourceSite,jdbcType=VARCHAR},
+      url = #{url,jdbcType=VARCHAR},
+      title = #{title,jdbcType=VARCHAR},
+      duration = #{duration,jdbcType=INTEGER},
+      oss_key = #{ossKey,jdbcType=VARCHAR},
+      relevance_score = #{relevanceScore,jdbcType=DOUBLE},
+      `status` = #{status,jdbcType=INTEGER},
+      create_time = #{createTime,jdbcType=BIGINT},
+      update_time = #{updateTime,jdbcType=BIGINT}
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+</mapper>

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

@@ -11,6 +11,16 @@
         </foreach>
     </insert>
 
+    <insert id="batchInsertSpiderContentMedia" parameterType="java.util.List">
+        insert into spider_content_media (content_id, media_type, source_site, url, title, duration, oss_key,
+                                          relevance_score, `status`, create_time, update_time)
+        values
+        <foreach collection="contentList" item="item" separator=",">
+            (#{item.contentId}, #{item.mediaType}, #{item.sourceSite}, #{item.url}, #{item.title},
+             #{item.duration}, #{item.ossKey}, #{item.relevanceScore}, #{item.status}, #{item.createTime}, #{item.updateTime})
+        </foreach>
+    </insert>
+
     <select id="getRoughScreenSpiderContentHasContent" resultType="com.tzld.supply.model.po.supply.spider.SpiderContent">
         select *
         from spider_content
@@ -35,4 +45,23 @@
         and content is not null
     </select>
 
+    <select id="getMediaSearchSpiderContent" resultType="com.tzld.supply.model.po.supply.spider.SpiderContent">
+        select content.*
+        from spider_content content
+        left join spider_content_media media on content.id = media.content_id and media.media_type = #{mediaType}
+        where content.`status` = #{status}
+        and content.create_time between #{startTime} and #{endTime}
+        and content.pq_improve_narration_script is not null
+        and media.id is null
+    </select>
+
+    <select id="getMediaSearchSpiderContentMedia" resultType="com.tzld.supply.model.po.supply.spider.SpiderContentMedia">
+        select media.*
+        from spider_content content
+        join spider_content_media media on content.id = media.content_id and media.media_type = #{mediaType}
+        where content.`status` = #{status}
+        and content.create_time between #{startTime} and #{endTime}
+        and media.status = #{mediaStatus}
+    </select>
+
 </mapper>

+ 1 - 1
pom.xml

@@ -264,7 +264,7 @@
 
         <dependency>
             <groupId>cn.hutool</groupId>
-            <artifactId>hutool-core</artifactId>
+            <artifactId>hutool-all</artifactId>
             <version>5.8.18</version>
         </dependency>
 

+ 22 - 0
server/src/main/java/com/tzld/supply/controller/XxlJobController.java

@@ -1,6 +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;
@@ -19,6 +20,8 @@ public class XxlJobController {
     private ContentScreenJob contentScreenJob;
     @Autowired
     private SpiderContentFeishuJob contentFeishuJob;
+    @Autowired
+    private ContentMediaSearchJob contentMediaSearchJob;
 
     @GetMapping("/spiderTaskJob")
     public CommonResponse<Void> spiderTaskJob() {
@@ -61,4 +64,23 @@ public class XxlJobController {
         contentFeishuJob.spiderContentFeishuJob(dateStr);
         return CommonResponse.success();
     }
+
+    @GetMapping("/contentImageMediaSearchJob")
+    public CommonResponse<Void> contentImageMediaSearchJob(String dateStr) {
+        contentMediaSearchJob.contentImageMediaSearchJob(dateStr);
+        return CommonResponse.success();
+    }
+
+    @GetMapping("/contentMediaImageCheckJob")
+    public CommonResponse<Void> contentMediaImageCheckJob(String dateStr) {
+        contentMediaSearchJob.contentMediaImageCheckJob(dateStr);
+        return CommonResponse.success();
+    }
+
+    @GetMapping("/contentVideoMediaSearchJob")
+    public CommonResponse<Void> contentVideoMediaSearchJob(String dateStr) {
+        contentMediaSearchJob.contentVideoMediaSearchJob(dateStr);
+        return CommonResponse.success();
+    }
+
 }