Просмотр исходного кода

新增解构内容模块及相关数据库配置

wangyunpeng 13 часов назад
Родитель
Сommit
7007bceada
29 измененных файлов с 8619 добавлено и 219 удалено
  1. 1 1
      core/src/main/java/com/tzld/videoVector/dao/generator/MybatisGeneratorMain.java
  2. 120 0
      core/src/main/java/com/tzld/videoVector/dao/mapper/videoVector/deconstruct/DeconstructContentMapper.java
  3. 120 0
      core/src/main/java/com/tzld/videoVector/dao/mapper/videoVector/deconstruct/DeconstructContentVectorMapper.java
  4. 96 0
      core/src/main/java/com/tzld/videoVector/dao/mapper/videoVector/deconstruct/DeconstructVectorConfigMapper.java
  5. 214 106
      core/src/main/java/com/tzld/videoVector/job/VideoVectorJob.java
  6. 28 0
      core/src/main/java/com/tzld/videoVector/model/param/DeconstructParam.java
  7. 17 0
      core/src/main/java/com/tzld/videoVector/model/param/GetDeconstructParam.java
  8. 710 0
      core/src/main/java/com/tzld/videoVector/model/po/videoVector/deconstruct/DeconstructContent.java
  9. 1433 0
      core/src/main/java/com/tzld/videoVector/model/po/videoVector/deconstruct/DeconstructContentExample.java
  10. 530 0
      core/src/main/java/com/tzld/videoVector/model/po/videoVector/deconstruct/DeconstructContentVector.java
  11. 1143 0
      core/src/main/java/com/tzld/videoVector/model/po/videoVector/deconstruct/DeconstructContentVectorExample.java
  12. 602 0
      core/src/main/java/com/tzld/videoVector/model/po/videoVector/deconstruct/DeconstructVectorConfig.java
  13. 1323 0
      core/src/main/java/com/tzld/videoVector/model/po/videoVector/deconstruct/DeconstructVectorConfigExample.java
  14. 0 19
      core/src/main/java/com/tzld/videoVector/service/DeconstructService.java
  15. 65 0
      core/src/main/java/com/tzld/videoVector/service/VectorizeService.java
  16. 15 2
      core/src/main/java/com/tzld/videoVector/service/VideoSearchService.java
  17. 1 45
      core/src/main/java/com/tzld/videoVector/service/impl/DeconstructServiceImpl.java
  18. 1 2
      core/src/main/java/com/tzld/videoVector/service/impl/RedisVectorStoreServiceImpl.java
  19. 363 0
      core/src/main/java/com/tzld/videoVector/service/impl/VectorizeServiceImpl.java
  20. 241 17
      core/src/main/java/com/tzld/videoVector/service/impl/VideoSearchServiceImpl.java
  21. 8 15
      core/src/main/resources/generator/mybatis-vector-generator-config.xml
  22. 599 0
      core/src/main/resources/mapper/videoVector/deconstruct/DeconstructContentMapper.xml
  23. 511 0
      core/src/main/resources/mapper/videoVector/deconstruct/DeconstructContentVectorMapper.xml
  24. 461 0
      core/src/main/resources/mapper/videoVector/deconstruct/DeconstructVectorConfigMapper.xml
  25. 7 2
      server/src/main/java/com/tzld/videoVector/controller/XxlJobController.java
  26. 3 3
      server/src/main/resources/application-dev.yml
  27. 3 3
      server/src/main/resources/application-prod.yml
  28. 3 3
      server/src/main/resources/application-test.yml
  29. 1 1
      server/src/main/resources/application.yml

+ 1 - 1
core/src/main/java/com/tzld/videoVector/dao/generator/MybatisGeneratorMain.java

@@ -19,7 +19,7 @@ public class MybatisGeneratorMain {
 			throws SQLException, IOException, InterruptedException, InvalidConfigurationException, XMLParserException {
 		List<String> warnings = new ArrayList<String>();
 		boolean overwrite = true;
-		File configFile = new File(MybatisGeneratorMain.class.getResource("/generator/mybatis-spider-generator-config.xml").getFile());
+		File configFile = new File(MybatisGeneratorMain.class.getResource("/generator/mybatis-vector-generator-config.xml").getFile());
 
 		ConfigurationParser cp = new ConfigurationParser(warnings);
 		Configuration config = cp.parseConfiguration(configFile);

+ 120 - 0
core/src/main/java/com/tzld/videoVector/dao/mapper/videoVector/deconstruct/DeconstructContentMapper.java

@@ -0,0 +1,120 @@
+package com.tzld.videoVector.dao.mapper.videoVector.deconstruct;
+
+import com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructContent;
+import com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructContentExample;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+public interface DeconstructContentMapper {
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    long countByExample(DeconstructContentExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    int deleteByExample(DeconstructContentExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    int deleteByPrimaryKey(Long id);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    int insert(DeconstructContent record);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    int insertSelective(DeconstructContent record);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    List<DeconstructContent> selectByExampleWithBLOBs(DeconstructContentExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    List<DeconstructContent> selectByExample(DeconstructContentExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    DeconstructContent selectByPrimaryKey(Long id);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    int updateByExampleSelective(@Param("record") DeconstructContent record, @Param("example") DeconstructContentExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    int updateByExampleWithBLOBs(@Param("record") DeconstructContent record, @Param("example") DeconstructContentExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    int updateByExample(@Param("record") DeconstructContent record, @Param("example") DeconstructContentExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    int updateByPrimaryKeySelective(DeconstructContent record);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    int updateByPrimaryKeyWithBLOBs(DeconstructContent record);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    int updateByPrimaryKey(DeconstructContent record);
+}

+ 120 - 0
core/src/main/java/com/tzld/videoVector/dao/mapper/videoVector/deconstruct/DeconstructContentVectorMapper.java

@@ -0,0 +1,120 @@
+package com.tzld.videoVector.dao.mapper.videoVector.deconstruct;
+
+import com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructContentVector;
+import com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructContentVectorExample;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+public interface DeconstructContentVectorMapper {
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content_vector
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    long countByExample(DeconstructContentVectorExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content_vector
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    int deleteByExample(DeconstructContentVectorExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content_vector
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    int deleteByPrimaryKey(Long id);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content_vector
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    int insert(DeconstructContentVector record);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content_vector
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    int insertSelective(DeconstructContentVector record);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content_vector
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    List<DeconstructContentVector> selectByExampleWithBLOBs(DeconstructContentVectorExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content_vector
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    List<DeconstructContentVector> selectByExample(DeconstructContentVectorExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content_vector
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    DeconstructContentVector selectByPrimaryKey(Long id);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content_vector
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    int updateByExampleSelective(@Param("record") DeconstructContentVector record, @Param("example") DeconstructContentVectorExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content_vector
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    int updateByExampleWithBLOBs(@Param("record") DeconstructContentVector record, @Param("example") DeconstructContentVectorExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content_vector
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    int updateByExample(@Param("record") DeconstructContentVector record, @Param("example") DeconstructContentVectorExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content_vector
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    int updateByPrimaryKeySelective(DeconstructContentVector record);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content_vector
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    int updateByPrimaryKeyWithBLOBs(DeconstructContentVector record);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content_vector
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    int updateByPrimaryKey(DeconstructContentVector record);
+}

+ 96 - 0
core/src/main/java/com/tzld/videoVector/dao/mapper/videoVector/deconstruct/DeconstructVectorConfigMapper.java

@@ -0,0 +1,96 @@
+package com.tzld.videoVector.dao.mapper.videoVector.deconstruct;
+
+import com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructVectorConfig;
+import com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructVectorConfigExample;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+public interface DeconstructVectorConfigMapper {
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_vector_config
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    long countByExample(DeconstructVectorConfigExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_vector_config
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    int deleteByExample(DeconstructVectorConfigExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_vector_config
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    int deleteByPrimaryKey(Long id);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_vector_config
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    int insert(DeconstructVectorConfig record);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_vector_config
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    int insertSelective(DeconstructVectorConfig record);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_vector_config
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    List<DeconstructVectorConfig> selectByExample(DeconstructVectorConfigExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_vector_config
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    DeconstructVectorConfig selectByPrimaryKey(Long id);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_vector_config
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    int updateByExampleSelective(@Param("record") DeconstructVectorConfig record, @Param("example") DeconstructVectorConfigExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_vector_config
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    int updateByExample(@Param("record") DeconstructVectorConfig record, @Param("example") DeconstructVectorConfigExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_vector_config
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    int updateByPrimaryKeySelective(DeconstructVectorConfig record);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_vector_config
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    int updateByPrimaryKey(DeconstructVectorConfig record);
+}

+ 214 - 106
core/src/main/java/com/tzld/videoVector/job/VideoVectorJob.java

@@ -1,19 +1,24 @@
 package com.tzld.videoVector.job;
 
-import com.alibaba.fastjson.JSONObject;
-import com.aliyun.odps.data.Record;
-import com.tzld.videoVector.service.EmbeddingService;
-import com.tzld.videoVector.service.VectorStoreService;
-import com.tzld.videoVector.util.OdpsUtil;
+import com.tzld.videoVector.dao.mapper.videoVector.deconstruct.DeconstructContentMapper;
+import com.tzld.videoVector.model.entity.DeconstructResult;
+import com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructContent;
+import com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructContentExample;
+import com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructContentVector;
+import com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructVectorConfig;
+import com.tzld.videoVector.service.DeconstructService;
+import com.tzld.videoVector.service.VectorizeService;
 import com.xxl.job.core.biz.model.ReturnT;
 import com.xxl.job.core.handler.annotation.XxlJob;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
 
 import javax.annotation.Resource;
-import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
 import java.util.List;
-import java.util.Objects;
 import java.util.Set;
 import java.util.stream.Collectors;
 
@@ -23,92 +28,117 @@ import java.util.stream.Collectors;
 public class VideoVectorJob {
 
     @Resource
-    private VectorStoreService vectorStoreService;
+    private DeconstructContentMapper deconstructContentMapper;
 
     @Resource
-    private EmbeddingService embeddingService;
+    private DeconstructService deconstructService;
+
+    @Resource
+    private VectorizeService vectorizeService;
 
     /**
      * 每页查询数量
      */
     private static final int PAGE_SIZE = 1000;
 
+    /**
+     * 超时时间:1小时(毫秒)
+     */
+    private static final long TIMEOUT_MS = 60 * 60 * 1000L;
+
     /**
      * 视频向量化
-     * @param param
-     * @return
+     * 根据配置对解构内容进行向量化
+     *
+     * @param param 参数
+     * @return 执行结果
      */
     @XxlJob("vectorVideoJob")
     public ReturnT<String> vectorVideoJob(String param) {
         log.info("开始执行视频向量化任务, param: {}", param);
-        
+
         int totalSuccessCount = 0;
         int totalFailCount = 0;
+        int totalSkipCount = 0;
         int pageNum = 0;
-        
+
         try {
+            // 1. 获取向量配置(视频类型 content_type=3)
+            List<DeconstructVectorConfig> configs = vectorizeService.getVectorConfigs(null, 3);
+            if (CollectionUtils.isEmpty(configs)) {
+                log.warn("未找到视频类型的向量配置");
+                return ReturnT.SUCCESS;
+            }
+            log.info("加载 {} 个向量配置", configs.size());
+
             while (true) {
-                // 1. 分页查询 videoId 列表
-                List<Long> videoIds = queryVideoIdsByPage(pageNum, PAGE_SIZE);
-                if (videoIds == null || videoIds.isEmpty()) {
+                // 2. 分页查询解构成功的内容
+                List<DeconstructContent> contents = querySuccessContentsByPage(pageNum, PAGE_SIZE, (byte) 3);
+                if (CollectionUtils.isEmpty(contents)) {
                     log.info("第 {} 页没有查询到数据,分页查询结束", pageNum);
                     break;
                 }
-                log.info("第 {} 页查询到 {} 个 videoId", pageNum, videoIds.size());
-
-                // 2. 查询哪些 videoId 在 Redis 中已存在
-                Set<Long> existingIds = vectorStoreService.existsByIds(videoIds);
-                log.info("已存在 {} 个 videoId,将跳过", existingIds.size());
-
-                // 3. 过滤出不存在的 videoId
-                List<Long> newVideoIds = videoIds.stream()
-                        .filter(id -> !existingIds.contains(id))
-                        .collect(Collectors.toList());
-                
-                if (!newVideoIds.isEmpty()) {
-                    log.info("第 {} 页需要处理 {} 个新的 videoId", pageNum, newVideoIds.size());
-
-                    // 4. 逐个处理新的 videoId
-                    for (Long videoId : newVideoIds) {
-                        try {
-                            // 4.1 查询视频选题
-                            String videoTopic = queryVideoTopic(videoId);
-                            if (videoTopic == null) {
-                                log.warn("videoId={} 详情查询为空,跳过", videoId);
-                                totalFailCount++;
+                log.info("第 {} 页查询到 {} 条解构内容", pageNum, contents.size());
+
+                // 3. 逐个处理内容
+                for (DeconstructContent content : contents) {
+                    try {
+                        // 3.1 查询已有向量
+                        List<DeconstructContentVector> existingVectors = vectorizeService.getVectorsByContentId(content.getId());
+                        Set<String> existingFields = existingVectors.stream()
+                                .map(DeconstructContentVector::getSourceField)
+                                .collect(Collectors.toSet());
+
+                        // 3.2 遍历配置,对缺失的向量进行补充
+                        boolean hasNewVector = false;
+                        for (DeconstructVectorConfig config : configs) {
+                            String sourceField = config.getSourceField();
+
+                            // 检查是否已有该字段的向量
+                            if (existingFields.contains(sourceField)) {
+                                log.debug("contentId={} 已有 {} 字段向量,跳过", content.getId(), sourceField);
                                 continue;
                             }
 
-                            // 4.2 提取字段并向量化
-                            List<Float> vector = extractAndVectorize(videoTopic);
-                            if (vector == null || vector.isEmpty()) {
-                                log.warn("videoId={} 向量化失败,跳过", videoId);
-                                totalFailCount++;
+                            // 检查原始数据是否有该字段内容
+                            if (!hasSourceContent(content, config)) {
+                                log.debug("contentId={} 无 {} 字段原始数据,跳过", content.getId(), sourceField);
                                 continue;
                             }
 
-                            // 4.3 存储到 Redis
-                            vectorStoreService.save(videoId, vector);
-                            totalSuccessCount++;
-                            log.debug("videoId={} 处理成功", videoId);
+                            // 执行向量化
+                            log.info("contentId={} 开始向量化字段 {}", content.getId(), sourceField);
+                            List<DeconstructContentVector> newVectors = vectorizeService.vectorizeByConfig(content, config);
+                            if (!CollectionUtils.isEmpty(newVectors)) {
+                                vectorizeService.batchSaveVectors(newVectors);
+                                hasNewVector = true;
+                                totalSuccessCount++;
+                                log.info("contentId={} 字段 {} 向量化完成,生成 {} 条向量",
+                                        content.getId(), sourceField, newVectors.size());
+                            }
+                        }
 
-                        } catch (Exception e) {
-                            log.error("处理 videoId={} 时发生异常: {}", videoId, e.getMessage(), e);
-                            totalFailCount++;
+                        if (!hasNewVector) {
+                            totalSkipCount++;
                         }
+
+                    } catch (Exception e) {
+                        log.error("处理 contentId={} 时发生异常: {}", content.getId(), e.getMessage(), e);
+                        totalFailCount++;
                     }
                 }
 
                 // 如果查询到的数据少于 PAGE_SIZE,说明已经是最后一页
-                if (videoIds.size() < PAGE_SIZE) {
-                    log.info("第 {} 页数据量 {} 小于 PAGE_SIZE {},分页查询结束", pageNum, videoIds.size(), PAGE_SIZE);
+                if (contents.size() < PAGE_SIZE) {
+                    log.info("第 {} 页数据量 {} 小于 PAGE_SIZE {},分页查询结束", pageNum, contents.size(), PAGE_SIZE);
                     break;
                 }
-                
+
                 pageNum++;
             }
 
-            log.info("视频向量化任务完成,总成功: {}, 总失败: {}, 总页数: {}", totalSuccessCount, totalFailCount, pageNum + 1);
+            log.info("视频向量化任务完成,总成功: {}, 总失败: {}, 总跳过: {}, 总页数: {}",
+                    totalSuccessCount, totalFailCount, totalSkipCount, pageNum + 1);
             return ReturnT.SUCCESS;
 
         } catch (Exception e) {
@@ -118,69 +148,147 @@ public class VideoVectorJob {
     }
 
     /**
-     * 分页查询 videoId 列表
-     * @param pageNum 页码(从0开始)
-     * @param pageSize 每页数量
-     * @return videoId 列表
+     * 分页查询解构成功的内容
+     *
+     * @param pageNum     页码
+     * @param pageSize    每页数量
+     * @param contentType 内容类型
+     * @return 内容列表
      */
-    private List<Long> queryVideoIdsByPage(int pageNum, int pageSize) {
-        int offset = pageNum * pageSize;
-        String sql = String.format(
-                "SELECT content_id " +
-                        "FROM videoods.content_profile " +
-                        "WHERE status = 3 and is_deleted = 0 " +
-                        "ORDER BY video_id " +
-                        "LIMIT %d, %d",
-                offset, pageSize);
-        List<Record> records = OdpsUtil.getOdpsData(sql);
-        if (records == null || records.isEmpty()) {
-            return new ArrayList<>();
+    private List<DeconstructContent> querySuccessContentsByPage(int pageNum, int pageSize, Byte contentType) {
+        DeconstructContentExample example = new DeconstructContentExample();
+        DeconstructContentExample.Criteria criteria = example.createCriteria();
+        criteria.andStatusEqualTo((byte) 2); // SUCCESS
+        if (contentType != null) {
+            criteria.andContentTypeEqualTo(contentType);
         }
-        return records.stream()
-                .map(record -> record.getBigint("video_id"))
-                .filter(Objects::nonNull)
-                .collect(Collectors.toList());
+        example.setOrderByClause("id ASC LIMIT " + (pageNum * pageSize) + ", " + pageSize);
+        return deconstructContentMapper.selectByExampleWithBLOBs(example);
     }
 
     /**
-     * 查询视频选题
+     * 检查内容是否有配置所需的原始数据
+     *
+     * @param content 内容
+     * @param config  配置
+     * @return 是否有原始数据
      */
-    private String queryVideoTopic(Long videoId) {
-        String sql = String.format(
-                "SELECT video_id, raw_result " +
-                        "FROM videoods.content_profile " +
-                        "WHERE status = 3 and is_deleted = 0 and content_id = %d",
-                videoId);
-        List<Record> records = OdpsUtil.getOdpsData(sql);
-        if (records == null || records.isEmpty()) {
-            return null;
-        }
-        Record record = records.get(0);
-        JSONObject videoDeconstructContent =  JSONObject.parseObject(record.getString("raw_result"));
-        if (videoDeconstructContent == null) {
-            return null;
-        }
-        JSONObject finalNormalizationRebuild = videoDeconstructContent.getJSONObject("final_normalization_rebuild");
-        if (finalNormalizationRebuild == null) {
-            return null;
-        }
-        JSONObject topicFusionResult = finalNormalizationRebuild.getJSONObject("topic_fusion_result");
-        if (topicFusionResult == null) {
-            return null;
-        }
-        JSONObject finalTopic = topicFusionResult.getJSONObject("最终选题");
-        if (finalTopic == null) {
-            return null;
+    private boolean hasSourceContent(DeconstructContent content, DeconstructVectorConfig config) {
+        String sourceField = config.getSourceField();
+
+        switch (sourceField) {
+            case "title":
+                return StringUtils.hasText(content.getTitle());
+            case "body_text":
+                return StringUtils.hasText(content.getBodyText());
+            case "result_json":
+                return StringUtils.hasText(content.getResultJson()) && StringUtils.hasText(config.getSourcePath());
+            default:
+                // 其他字段从 result_json 中提取
+                return StringUtils.hasText(content.getResultJson()) && StringUtils.hasText(config.getSourcePath());
         }
-        return finalTopic.getString("选题");
     }
 
     /**
-     * 提取字段并向量化
+     * 重试超时的解构任务
+     * 检查创建超过一小时,状态不是成功或失败的内容重新查询解构结果
+     *
+     * @param param 参数
+     * @return 执行结果
      */
-    private List<Float> extractAndVectorize(String videoTopic) {
-        return embeddingService.embed(videoTopic);
-    }
+    @XxlJob("retryDeconstructJob")
+    public ReturnT<String> retryDeconstructJob(String param) {
+        log.info("开始执行解构任务重试, param: {}", param);
+
+        int totalRetryCount = 0;
+        int successCount = 0;
+        int failCount = 0;
+
+        try {
+            // 1. 查询超时的任务(创建时间超过1小时,状态为PENDING或RUNNING)
+            Date timeoutThreshold = new Date(System.currentTimeMillis() - TIMEOUT_MS);
 
+            DeconstructContentExample example = new DeconstructContentExample();
+            example.createCriteria().andStatusIn(Arrays.asList((byte) 0, (byte) 1))  // PENDING=0, RUNNING=1
+                    .andCreateTimeLessThanOrEqualTo(timeoutThreshold);
+            List<DeconstructContent> timeoutTasks = deconstructContentMapper.selectByExample(example);
 
+            if (timeoutTasks == null || timeoutTasks.isEmpty()) {
+                log.info("没有超时的解构任务");
+                return ReturnT.SUCCESS;
+            }
+
+            log.info("查询到 {} 个超时的解构任务", timeoutTasks.size());
+
+            // 2. 逐个重新查询解构结果
+            for (DeconstructContent content : timeoutTasks) {
+                totalRetryCount++;
+                String taskId = content.getTaskId();
+
+                try {
+                    log.info("重试解构任务,taskId={}, contentId={}, createTime={}",
+                            taskId, content.getId(), content.getCreateTime());
+
+                    // 调用API重新查询解构结果
+                    DeconstructResult result = deconstructService.getDeconstructResult(taskId);
+
+                    if (result == null) {
+                        log.warn("重试解构任务失败,API返回空,taskId={}", taskId);
+                        updateContentStatus(content, (byte) 3, "API返回空");
+                        failCount++;
+                        continue;
+                    }
+
+                    // 更新数据库记录
+                    if (result.isFinished()) {
+                        if (result.isSuccess()) {
+                            // 成功
+                            content.setStatus((byte) 2);
+                            content.setResultJson(result.getResult());
+                            content.setPointUrl(result.getPointUrl());
+                            content.setWeightUrl(result.getWeightUrl());
+                            content.setPatternUrl(result.getPatternUrl());
+                            content.setUpdateTime(new Date());
+                            deconstructContentMapper.updateByPrimaryKeySelective(content);
+                            successCount++;
+                            log.info("重试解构任务成功,taskId={}", taskId);
+                        } else {
+                            // 失败
+                            updateContentStatus(content, (byte) 3, result.getReason());
+                            failCount++;
+                            log.warn("重试解构任务失败,taskId={}, reason={}", taskId, result.getReason());
+                        }
+                    } else {
+                        // 仍在处理中,更新状态
+                        content.setStatus(result.getStatus().byteValue());
+                        content.setUpdateTime(new Date());
+                        deconstructContentMapper.updateByPrimaryKeySelective(content);
+                        log.info("解构任务仍在处理中,taskId={}, status={}", taskId, result.getStatusDesc());
+                    }
+
+                } catch (Exception e) {
+                    log.error("重试解构任务异常,taskId={}, error={}", taskId, e.getMessage(), e);
+                    failCount++;
+                }
+            }
+
+            log.info("解构任务重试完成,总数: {}, 成功: {}, 失败: {}",
+                    totalRetryCount, successCount, failCount);
+            return ReturnT.SUCCESS;
+
+        } catch (Exception e) {
+            log.error("解构任务重试执行失败: {}", e.getMessage(), e);
+            return new ReturnT<>(ReturnT.FAIL_CODE, "任务执行失败: " + e.getMessage());
+        }
+    }
+
+    /**
+     * 更新内容状态为失败
+     */
+    private void updateContentStatus(DeconstructContent content, byte status, String reason) {
+        content.setStatus(status);
+        content.setFailureReason(reason);
+        content.setUpdateTime(new Date());
+        deconstructContentMapper.updateByPrimaryKeySelective(content);
+    }
 }

+ 28 - 0
core/src/main/java/com/tzld/videoVector/model/param/DeconstructParam.java

@@ -4,8 +4,36 @@ import lombok.Data;
 
 import java.util.List;
 
+/**
+ * 内容解构参数
+ */
 @Data
 public class DeconstructParam {
+
+    /** 业务类型:0投流 */
+    private Integer bizType;
+
+    /** 内容类型:1长文 2图文 3视频 */
+    private Integer contentType;
+
+    /** 业务内容ID(帖子ID/视频ID) */
+    private String channelContentId;
+
+    /** 标题 */
     private String title;
+
+    /** 正文内容 */
+    private String bodyText;
+
+    /** 视频地址 */
+    private String videoUrl;
+
+    /** 图片列表 */
     private List<String> imageList;
+
+    /** 作者ID */
+    private String channelAccountId;
+
+    /** 作者名称 */
+    private String channelAccountName;
 }

+ 17 - 0
core/src/main/java/com/tzld/videoVector/model/param/GetDeconstructParam.java

@@ -2,7 +2,24 @@ package com.tzld.videoVector.model.param;
 
 import lombok.Data;
 
+/**
+ * 查询解构结果参数
+ */
 @Data
 public class GetDeconstructParam {
+
+    /** 解构任务ID */
     private String taskId;
+
+    /** 业务类型:0选题 1创作 2制作 */
+    private Integer bizType;
+
+    /** 内容类型:1长文 2图文 3视频 */
+    private Integer contentType;
+
+    /** 业务内容ID(帖子ID/视频ID) */
+    private String channelContentId;
+
+    /** 是否强制刷新(从API重新查询) */
+    private Boolean forceRefresh;
 }

+ 710 - 0
core/src/main/java/com/tzld/videoVector/model/po/videoVector/deconstruct/DeconstructContent.java

@@ -0,0 +1,710 @@
+package com.tzld.videoVector.model.po.videoVector.deconstruct;
+
+import java.util.Date;
+
+/**
+ *
+ * This class was generated by MyBatis Generator.
+ * This class corresponds to the database table deconstruct_content
+ */
+public class DeconstructContent {
+    /**
+     * Database Column Remarks:
+     *   主键ID
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_content.id
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    private Long id;
+
+    /**
+     * Database Column Remarks:
+     *   解构任务ID
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_content.task_id
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    private String taskId;
+
+    /**
+     * Database Column Remarks:
+     *   业务类型:0选题 1创作 2制作
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_content.biz_type
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    private Byte bizType;
+
+    /**
+     * Database Column Remarks:
+     *   内容类型:1长文 2图文 3视频
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_content.content_type
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    private Byte contentType;
+
+    /**
+     * Database Column Remarks:
+     *   业务内容ID(帖子ID/视频ID)
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_content.channel_content_id
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    private String channelContentId;
+
+    /**
+     * Database Column Remarks:
+     *   标题
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_content.title
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    private String title;
+
+    /**
+     * Database Column Remarks:
+     *   视频地址
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_content.video_url
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    private String videoUrl;
+
+    /**
+     * Database Column Remarks:
+     *   图片列表(JSON数组)
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_content.images
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    private String images;
+
+    /**
+     * Database Column Remarks:
+     *   作者ID
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_content.channel_account_id
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    private String channelAccountId;
+
+    /**
+     * Database Column Remarks:
+     *   作者名称
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_content.channel_account_name
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    private String channelAccountName;
+
+    /**
+     * Database Column Remarks:
+     *   任务状态:0待处理 1处理中 2成功 3失败
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_content.status
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    private Byte status;
+
+    /**
+     * Database Column Remarks:
+     *   失败原因
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_content.failure_reason
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    private String failureReason;
+
+    /**
+     * Database Column Remarks:
+     *   选题点结构结果页地址
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_content.point_url
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    private String pointUrl;
+
+    /**
+     * Database Column Remarks:
+     *   权重页地址
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_content.weight_url
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    private String weightUrl;
+
+    /**
+     * Database Column Remarks:
+     *   选题点聚类结果页地址
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_content.pattern_url
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    private String patternUrl;
+
+    /**
+     * Database Column Remarks:
+     *   创建时间
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_content.create_time
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    private Date createTime;
+
+    /**
+     * Database Column Remarks:
+     *   更新时间
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_content.update_time
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    private Date updateTime;
+
+    /**
+     * Database Column Remarks:
+     *   正文内容
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_content.body_text
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    private String bodyText;
+
+    /**
+     * Database Column Remarks:
+     *   解构结果JSON字符串
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_content.result_json
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    private String resultJson;
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_content.id
+     *
+     * @return the value of deconstruct_content.id
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public Long getId() {
+        return id;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_content.id
+     *
+     * @param id the value for deconstruct_content.id
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_content.task_id
+     *
+     * @return the value of deconstruct_content.task_id
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public String getTaskId() {
+        return taskId;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_content.task_id
+     *
+     * @param taskId the value for deconstruct_content.task_id
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void setTaskId(String taskId) {
+        this.taskId = taskId;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_content.biz_type
+     *
+     * @return the value of deconstruct_content.biz_type
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public Byte getBizType() {
+        return bizType;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_content.biz_type
+     *
+     * @param bizType the value for deconstruct_content.biz_type
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void setBizType(Byte bizType) {
+        this.bizType = bizType;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_content.content_type
+     *
+     * @return the value of deconstruct_content.content_type
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public Byte getContentType() {
+        return contentType;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_content.content_type
+     *
+     * @param contentType the value for deconstruct_content.content_type
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void setContentType(Byte contentType) {
+        this.contentType = contentType;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_content.channel_content_id
+     *
+     * @return the value of deconstruct_content.channel_content_id
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public String getChannelContentId() {
+        return channelContentId;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_content.channel_content_id
+     *
+     * @param channelContentId the value for deconstruct_content.channel_content_id
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void setChannelContentId(String channelContentId) {
+        this.channelContentId = channelContentId;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_content.title
+     *
+     * @return the value of deconstruct_content.title
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public String getTitle() {
+        return title;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_content.title
+     *
+     * @param title the value for deconstruct_content.title
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_content.video_url
+     *
+     * @return the value of deconstruct_content.video_url
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public String getVideoUrl() {
+        return videoUrl;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_content.video_url
+     *
+     * @param videoUrl the value for deconstruct_content.video_url
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void setVideoUrl(String videoUrl) {
+        this.videoUrl = videoUrl;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_content.images
+     *
+     * @return the value of deconstruct_content.images
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public String getImages() {
+        return images;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_content.images
+     *
+     * @param images the value for deconstruct_content.images
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void setImages(String images) {
+        this.images = images;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_content.channel_account_id
+     *
+     * @return the value of deconstruct_content.channel_account_id
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public String getChannelAccountId() {
+        return channelAccountId;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_content.channel_account_id
+     *
+     * @param channelAccountId the value for deconstruct_content.channel_account_id
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void setChannelAccountId(String channelAccountId) {
+        this.channelAccountId = channelAccountId;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_content.channel_account_name
+     *
+     * @return the value of deconstruct_content.channel_account_name
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public String getChannelAccountName() {
+        return channelAccountName;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_content.channel_account_name
+     *
+     * @param channelAccountName the value for deconstruct_content.channel_account_name
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void setChannelAccountName(String channelAccountName) {
+        this.channelAccountName = channelAccountName;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_content.status
+     *
+     * @return the value of deconstruct_content.status
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public Byte getStatus() {
+        return status;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_content.status
+     *
+     * @param status the value for deconstruct_content.status
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void setStatus(Byte status) {
+        this.status = status;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_content.failure_reason
+     *
+     * @return the value of deconstruct_content.failure_reason
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public String getFailureReason() {
+        return failureReason;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_content.failure_reason
+     *
+     * @param failureReason the value for deconstruct_content.failure_reason
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void setFailureReason(String failureReason) {
+        this.failureReason = failureReason;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_content.point_url
+     *
+     * @return the value of deconstruct_content.point_url
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public String getPointUrl() {
+        return pointUrl;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_content.point_url
+     *
+     * @param pointUrl the value for deconstruct_content.point_url
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void setPointUrl(String pointUrl) {
+        this.pointUrl = pointUrl;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_content.weight_url
+     *
+     * @return the value of deconstruct_content.weight_url
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public String getWeightUrl() {
+        return weightUrl;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_content.weight_url
+     *
+     * @param weightUrl the value for deconstruct_content.weight_url
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void setWeightUrl(String weightUrl) {
+        this.weightUrl = weightUrl;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_content.pattern_url
+     *
+     * @return the value of deconstruct_content.pattern_url
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public String getPatternUrl() {
+        return patternUrl;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_content.pattern_url
+     *
+     * @param patternUrl the value for deconstruct_content.pattern_url
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void setPatternUrl(String patternUrl) {
+        this.patternUrl = patternUrl;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_content.create_time
+     *
+     * @return the value of deconstruct_content.create_time
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_content.create_time
+     *
+     * @param createTime the value for deconstruct_content.create_time
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_content.update_time
+     *
+     * @return the value of deconstruct_content.update_time
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_content.update_time
+     *
+     * @param updateTime the value for deconstruct_content.update_time
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_content.body_text
+     *
+     * @return the value of deconstruct_content.body_text
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public String getBodyText() {
+        return bodyText;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_content.body_text
+     *
+     * @param bodyText the value for deconstruct_content.body_text
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void setBodyText(String bodyText) {
+        this.bodyText = bodyText;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_content.result_json
+     *
+     * @return the value of deconstruct_content.result_json
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public String getResultJson() {
+        return resultJson;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_content.result_json
+     *
+     * @param resultJson the value for deconstruct_content.result_json
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void setResultJson(String resultJson) {
+        this.resultJson = resultJson;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    @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(", taskId=").append(taskId);
+        sb.append(", bizType=").append(bizType);
+        sb.append(", contentType=").append(contentType);
+        sb.append(", channelContentId=").append(channelContentId);
+        sb.append(", title=").append(title);
+        sb.append(", videoUrl=").append(videoUrl);
+        sb.append(", images=").append(images);
+        sb.append(", channelAccountId=").append(channelAccountId);
+        sb.append(", channelAccountName=").append(channelAccountName);
+        sb.append(", status=").append(status);
+        sb.append(", failureReason=").append(failureReason);
+        sb.append(", pointUrl=").append(pointUrl);
+        sb.append(", weightUrl=").append(weightUrl);
+        sb.append(", patternUrl=").append(patternUrl);
+        sb.append(", createTime=").append(createTime);
+        sb.append(", updateTime=").append(updateTime);
+        sb.append(", bodyText=").append(bodyText);
+        sb.append(", resultJson=").append(resultJson);
+        sb.append("]");
+        return sb.toString();
+    }
+}

+ 1433 - 0
core/src/main/java/com/tzld/videoVector/model/po/videoVector/deconstruct/DeconstructContentExample.java

@@ -0,0 +1,1433 @@
+package com.tzld.videoVector.model.po.videoVector.deconstruct;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+public class DeconstructContentExample {
+    /**
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    protected String orderByClause;
+
+    /**
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    protected boolean distinct;
+
+    /**
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    protected List<Criteria> oredCriteria;
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public DeconstructContentExample() {
+        oredCriteria = new ArrayList<Criteria>();
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public List<Criteria> getOredCriteria() {
+        return oredCriteria;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void or(Criteria criteria) {
+        oredCriteria.add(criteria);
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    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 deconstruct_content
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    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 deconstruct_content
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    protected Criteria createCriteriaInternal() {
+        Criteria criteria = new Criteria();
+        return criteria;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void clear() {
+        oredCriteria.clear();
+        orderByClause = null;
+        distinct = false;
+    }
+
+    /**
+     * This class was generated by MyBatis Generator.
+     * This class corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    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 andTaskIdIsNull() {
+            addCriterion("task_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaskIdIsNotNull() {
+            addCriterion("task_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaskIdEqualTo(String value) {
+            addCriterion("task_id =", value, "taskId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaskIdNotEqualTo(String value) {
+            addCriterion("task_id <>", value, "taskId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaskIdGreaterThan(String value) {
+            addCriterion("task_id >", value, "taskId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaskIdGreaterThanOrEqualTo(String value) {
+            addCriterion("task_id >=", value, "taskId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaskIdLessThan(String value) {
+            addCriterion("task_id <", value, "taskId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaskIdLessThanOrEqualTo(String value) {
+            addCriterion("task_id <=", value, "taskId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaskIdLike(String value) {
+            addCriterion("task_id like", value, "taskId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaskIdNotLike(String value) {
+            addCriterion("task_id not like", value, "taskId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaskIdIn(List<String> values) {
+            addCriterion("task_id in", values, "taskId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaskIdNotIn(List<String> values) {
+            addCriterion("task_id not in", values, "taskId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaskIdBetween(String value1, String value2) {
+            addCriterion("task_id between", value1, value2, "taskId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaskIdNotBetween(String value1, String value2) {
+            addCriterion("task_id not between", value1, value2, "taskId");
+            return (Criteria) this;
+        }
+
+        public Criteria andBizTypeIsNull() {
+            addCriterion("biz_type is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andBizTypeIsNotNull() {
+            addCriterion("biz_type is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andBizTypeEqualTo(Byte value) {
+            addCriterion("biz_type =", value, "bizType");
+            return (Criteria) this;
+        }
+
+        public Criteria andBizTypeNotEqualTo(Byte value) {
+            addCriterion("biz_type <>", value, "bizType");
+            return (Criteria) this;
+        }
+
+        public Criteria andBizTypeGreaterThan(Byte value) {
+            addCriterion("biz_type >", value, "bizType");
+            return (Criteria) this;
+        }
+
+        public Criteria andBizTypeGreaterThanOrEqualTo(Byte value) {
+            addCriterion("biz_type >=", value, "bizType");
+            return (Criteria) this;
+        }
+
+        public Criteria andBizTypeLessThan(Byte value) {
+            addCriterion("biz_type <", value, "bizType");
+            return (Criteria) this;
+        }
+
+        public Criteria andBizTypeLessThanOrEqualTo(Byte value) {
+            addCriterion("biz_type <=", value, "bizType");
+            return (Criteria) this;
+        }
+
+        public Criteria andBizTypeIn(List<Byte> values) {
+            addCriterion("biz_type in", values, "bizType");
+            return (Criteria) this;
+        }
+
+        public Criteria andBizTypeNotIn(List<Byte> values) {
+            addCriterion("biz_type not in", values, "bizType");
+            return (Criteria) this;
+        }
+
+        public Criteria andBizTypeBetween(Byte value1, Byte value2) {
+            addCriterion("biz_type between", value1, value2, "bizType");
+            return (Criteria) this;
+        }
+
+        public Criteria andBizTypeNotBetween(Byte value1, Byte value2) {
+            addCriterion("biz_type not between", value1, value2, "bizType");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentTypeIsNull() {
+            addCriterion("content_type is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentTypeIsNotNull() {
+            addCriterion("content_type is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentTypeEqualTo(Byte value) {
+            addCriterion("content_type =", value, "contentType");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentTypeNotEqualTo(Byte value) {
+            addCriterion("content_type <>", value, "contentType");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentTypeGreaterThan(Byte value) {
+            addCriterion("content_type >", value, "contentType");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentTypeGreaterThanOrEqualTo(Byte value) {
+            addCriterion("content_type >=", value, "contentType");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentTypeLessThan(Byte value) {
+            addCriterion("content_type <", value, "contentType");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentTypeLessThanOrEqualTo(Byte value) {
+            addCriterion("content_type <=", value, "contentType");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentTypeIn(List<Byte> values) {
+            addCriterion("content_type in", values, "contentType");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentTypeNotIn(List<Byte> values) {
+            addCriterion("content_type not in", values, "contentType");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentTypeBetween(Byte value1, Byte value2) {
+            addCriterion("content_type between", value1, value2, "contentType");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentTypeNotBetween(Byte value1, Byte value2) {
+            addCriterion("content_type not between", value1, value2, "contentType");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelContentIdIsNull() {
+            addCriterion("channel_content_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelContentIdIsNotNull() {
+            addCriterion("channel_content_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelContentIdEqualTo(String value) {
+            addCriterion("channel_content_id =", value, "channelContentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelContentIdNotEqualTo(String value) {
+            addCriterion("channel_content_id <>", value, "channelContentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelContentIdGreaterThan(String value) {
+            addCriterion("channel_content_id >", value, "channelContentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelContentIdGreaterThanOrEqualTo(String value) {
+            addCriterion("channel_content_id >=", value, "channelContentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelContentIdLessThan(String value) {
+            addCriterion("channel_content_id <", value, "channelContentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelContentIdLessThanOrEqualTo(String value) {
+            addCriterion("channel_content_id <=", value, "channelContentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelContentIdLike(String value) {
+            addCriterion("channel_content_id like", value, "channelContentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelContentIdNotLike(String value) {
+            addCriterion("channel_content_id not like", value, "channelContentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelContentIdIn(List<String> values) {
+            addCriterion("channel_content_id in", values, "channelContentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelContentIdNotIn(List<String> values) {
+            addCriterion("channel_content_id not in", values, "channelContentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelContentIdBetween(String value1, String value2) {
+            addCriterion("channel_content_id between", value1, value2, "channelContentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelContentIdNotBetween(String value1, String value2) {
+            addCriterion("channel_content_id not between", value1, value2, "channelContentId");
+            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 andVideoUrlIsNull() {
+            addCriterion("video_url is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoUrlIsNotNull() {
+            addCriterion("video_url is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoUrlEqualTo(String value) {
+            addCriterion("video_url =", value, "videoUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoUrlNotEqualTo(String value) {
+            addCriterion("video_url <>", value, "videoUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoUrlGreaterThan(String value) {
+            addCriterion("video_url >", value, "videoUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoUrlGreaterThanOrEqualTo(String value) {
+            addCriterion("video_url >=", value, "videoUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoUrlLessThan(String value) {
+            addCriterion("video_url <", value, "videoUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoUrlLessThanOrEqualTo(String value) {
+            addCriterion("video_url <=", value, "videoUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoUrlLike(String value) {
+            addCriterion("video_url like", value, "videoUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoUrlNotLike(String value) {
+            addCriterion("video_url not like", value, "videoUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoUrlIn(List<String> values) {
+            addCriterion("video_url in", values, "videoUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoUrlNotIn(List<String> values) {
+            addCriterion("video_url not in", values, "videoUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoUrlBetween(String value1, String value2) {
+            addCriterion("video_url between", value1, value2, "videoUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoUrlNotBetween(String value1, String value2) {
+            addCriterion("video_url not between", value1, value2, "videoUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andImagesIsNull() {
+            addCriterion("images is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andImagesIsNotNull() {
+            addCriterion("images is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andImagesEqualTo(String value) {
+            addCriterion("images =", value, "images");
+            return (Criteria) this;
+        }
+
+        public Criteria andImagesNotEqualTo(String value) {
+            addCriterion("images <>", value, "images");
+            return (Criteria) this;
+        }
+
+        public Criteria andImagesGreaterThan(String value) {
+            addCriterion("images >", value, "images");
+            return (Criteria) this;
+        }
+
+        public Criteria andImagesGreaterThanOrEqualTo(String value) {
+            addCriterion("images >=", value, "images");
+            return (Criteria) this;
+        }
+
+        public Criteria andImagesLessThan(String value) {
+            addCriterion("images <", value, "images");
+            return (Criteria) this;
+        }
+
+        public Criteria andImagesLessThanOrEqualTo(String value) {
+            addCriterion("images <=", value, "images");
+            return (Criteria) this;
+        }
+
+        public Criteria andImagesLike(String value) {
+            addCriterion("images like", value, "images");
+            return (Criteria) this;
+        }
+
+        public Criteria andImagesNotLike(String value) {
+            addCriterion("images not like", value, "images");
+            return (Criteria) this;
+        }
+
+        public Criteria andImagesIn(List<String> values) {
+            addCriterion("images in", values, "images");
+            return (Criteria) this;
+        }
+
+        public Criteria andImagesNotIn(List<String> values) {
+            addCriterion("images not in", values, "images");
+            return (Criteria) this;
+        }
+
+        public Criteria andImagesBetween(String value1, String value2) {
+            addCriterion("images between", value1, value2, "images");
+            return (Criteria) this;
+        }
+
+        public Criteria andImagesNotBetween(String value1, String value2) {
+            addCriterion("images not between", value1, value2, "images");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelAccountIdIsNull() {
+            addCriterion("channel_account_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelAccountIdIsNotNull() {
+            addCriterion("channel_account_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelAccountIdEqualTo(String value) {
+            addCriterion("channel_account_id =", value, "channelAccountId");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelAccountIdNotEqualTo(String value) {
+            addCriterion("channel_account_id <>", value, "channelAccountId");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelAccountIdGreaterThan(String value) {
+            addCriterion("channel_account_id >", value, "channelAccountId");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelAccountIdGreaterThanOrEqualTo(String value) {
+            addCriterion("channel_account_id >=", value, "channelAccountId");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelAccountIdLessThan(String value) {
+            addCriterion("channel_account_id <", value, "channelAccountId");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelAccountIdLessThanOrEqualTo(String value) {
+            addCriterion("channel_account_id <=", value, "channelAccountId");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelAccountIdLike(String value) {
+            addCriterion("channel_account_id like", value, "channelAccountId");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelAccountIdNotLike(String value) {
+            addCriterion("channel_account_id not like", value, "channelAccountId");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelAccountIdIn(List<String> values) {
+            addCriterion("channel_account_id in", values, "channelAccountId");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelAccountIdNotIn(List<String> values) {
+            addCriterion("channel_account_id not in", values, "channelAccountId");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelAccountIdBetween(String value1, String value2) {
+            addCriterion("channel_account_id between", value1, value2, "channelAccountId");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelAccountIdNotBetween(String value1, String value2) {
+            addCriterion("channel_account_id not between", value1, value2, "channelAccountId");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelAccountNameIsNull() {
+            addCriterion("channel_account_name is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelAccountNameIsNotNull() {
+            addCriterion("channel_account_name is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelAccountNameEqualTo(String value) {
+            addCriterion("channel_account_name =", value, "channelAccountName");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelAccountNameNotEqualTo(String value) {
+            addCriterion("channel_account_name <>", value, "channelAccountName");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelAccountNameGreaterThan(String value) {
+            addCriterion("channel_account_name >", value, "channelAccountName");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelAccountNameGreaterThanOrEqualTo(String value) {
+            addCriterion("channel_account_name >=", value, "channelAccountName");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelAccountNameLessThan(String value) {
+            addCriterion("channel_account_name <", value, "channelAccountName");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelAccountNameLessThanOrEqualTo(String value) {
+            addCriterion("channel_account_name <=", value, "channelAccountName");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelAccountNameLike(String value) {
+            addCriterion("channel_account_name like", value, "channelAccountName");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelAccountNameNotLike(String value) {
+            addCriterion("channel_account_name not like", value, "channelAccountName");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelAccountNameIn(List<String> values) {
+            addCriterion("channel_account_name in", values, "channelAccountName");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelAccountNameNotIn(List<String> values) {
+            addCriterion("channel_account_name not in", values, "channelAccountName");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelAccountNameBetween(String value1, String value2) {
+            addCriterion("channel_account_name between", value1, value2, "channelAccountName");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelAccountNameNotBetween(String value1, String value2) {
+            addCriterion("channel_account_name not between", value1, value2, "channelAccountName");
+            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(Byte value) {
+            addCriterion("`status` =", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusNotEqualTo(Byte value) {
+            addCriterion("`status` <>", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusGreaterThan(Byte value) {
+            addCriterion("`status` >", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusGreaterThanOrEqualTo(Byte value) {
+            addCriterion("`status` >=", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusLessThan(Byte value) {
+            addCriterion("`status` <", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusLessThanOrEqualTo(Byte value) {
+            addCriterion("`status` <=", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusIn(List<Byte> values) {
+            addCriterion("`status` in", values, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusNotIn(List<Byte> values) {
+            addCriterion("`status` not in", values, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusBetween(Byte value1, Byte value2) {
+            addCriterion("`status` between", value1, value2, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusNotBetween(Byte value1, Byte value2) {
+            addCriterion("`status` not between", value1, value2, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andFailureReasonIsNull() {
+            addCriterion("failure_reason is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andFailureReasonIsNotNull() {
+            addCriterion("failure_reason is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andFailureReasonEqualTo(String value) {
+            addCriterion("failure_reason =", value, "failureReason");
+            return (Criteria) this;
+        }
+
+        public Criteria andFailureReasonNotEqualTo(String value) {
+            addCriterion("failure_reason <>", value, "failureReason");
+            return (Criteria) this;
+        }
+
+        public Criteria andFailureReasonGreaterThan(String value) {
+            addCriterion("failure_reason >", value, "failureReason");
+            return (Criteria) this;
+        }
+
+        public Criteria andFailureReasonGreaterThanOrEqualTo(String value) {
+            addCriterion("failure_reason >=", value, "failureReason");
+            return (Criteria) this;
+        }
+
+        public Criteria andFailureReasonLessThan(String value) {
+            addCriterion("failure_reason <", value, "failureReason");
+            return (Criteria) this;
+        }
+
+        public Criteria andFailureReasonLessThanOrEqualTo(String value) {
+            addCriterion("failure_reason <=", value, "failureReason");
+            return (Criteria) this;
+        }
+
+        public Criteria andFailureReasonLike(String value) {
+            addCriterion("failure_reason like", value, "failureReason");
+            return (Criteria) this;
+        }
+
+        public Criteria andFailureReasonNotLike(String value) {
+            addCriterion("failure_reason not like", value, "failureReason");
+            return (Criteria) this;
+        }
+
+        public Criteria andFailureReasonIn(List<String> values) {
+            addCriterion("failure_reason in", values, "failureReason");
+            return (Criteria) this;
+        }
+
+        public Criteria andFailureReasonNotIn(List<String> values) {
+            addCriterion("failure_reason not in", values, "failureReason");
+            return (Criteria) this;
+        }
+
+        public Criteria andFailureReasonBetween(String value1, String value2) {
+            addCriterion("failure_reason between", value1, value2, "failureReason");
+            return (Criteria) this;
+        }
+
+        public Criteria andFailureReasonNotBetween(String value1, String value2) {
+            addCriterion("failure_reason not between", value1, value2, "failureReason");
+            return (Criteria) this;
+        }
+
+        public Criteria andPointUrlIsNull() {
+            addCriterion("point_url is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPointUrlIsNotNull() {
+            addCriterion("point_url is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPointUrlEqualTo(String value) {
+            addCriterion("point_url =", value, "pointUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andPointUrlNotEqualTo(String value) {
+            addCriterion("point_url <>", value, "pointUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andPointUrlGreaterThan(String value) {
+            addCriterion("point_url >", value, "pointUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andPointUrlGreaterThanOrEqualTo(String value) {
+            addCriterion("point_url >=", value, "pointUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andPointUrlLessThan(String value) {
+            addCriterion("point_url <", value, "pointUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andPointUrlLessThanOrEqualTo(String value) {
+            addCriterion("point_url <=", value, "pointUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andPointUrlLike(String value) {
+            addCriterion("point_url like", value, "pointUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andPointUrlNotLike(String value) {
+            addCriterion("point_url not like", value, "pointUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andPointUrlIn(List<String> values) {
+            addCriterion("point_url in", values, "pointUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andPointUrlNotIn(List<String> values) {
+            addCriterion("point_url not in", values, "pointUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andPointUrlBetween(String value1, String value2) {
+            addCriterion("point_url between", value1, value2, "pointUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andPointUrlNotBetween(String value1, String value2) {
+            addCriterion("point_url not between", value1, value2, "pointUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andWeightUrlIsNull() {
+            addCriterion("weight_url is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andWeightUrlIsNotNull() {
+            addCriterion("weight_url is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andWeightUrlEqualTo(String value) {
+            addCriterion("weight_url =", value, "weightUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andWeightUrlNotEqualTo(String value) {
+            addCriterion("weight_url <>", value, "weightUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andWeightUrlGreaterThan(String value) {
+            addCriterion("weight_url >", value, "weightUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andWeightUrlGreaterThanOrEqualTo(String value) {
+            addCriterion("weight_url >=", value, "weightUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andWeightUrlLessThan(String value) {
+            addCriterion("weight_url <", value, "weightUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andWeightUrlLessThanOrEqualTo(String value) {
+            addCriterion("weight_url <=", value, "weightUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andWeightUrlLike(String value) {
+            addCriterion("weight_url like", value, "weightUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andWeightUrlNotLike(String value) {
+            addCriterion("weight_url not like", value, "weightUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andWeightUrlIn(List<String> values) {
+            addCriterion("weight_url in", values, "weightUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andWeightUrlNotIn(List<String> values) {
+            addCriterion("weight_url not in", values, "weightUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andWeightUrlBetween(String value1, String value2) {
+            addCriterion("weight_url between", value1, value2, "weightUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andWeightUrlNotBetween(String value1, String value2) {
+            addCriterion("weight_url not between", value1, value2, "weightUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andPatternUrlIsNull() {
+            addCriterion("pattern_url is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPatternUrlIsNotNull() {
+            addCriterion("pattern_url is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPatternUrlEqualTo(String value) {
+            addCriterion("pattern_url =", value, "patternUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andPatternUrlNotEqualTo(String value) {
+            addCriterion("pattern_url <>", value, "patternUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andPatternUrlGreaterThan(String value) {
+            addCriterion("pattern_url >", value, "patternUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andPatternUrlGreaterThanOrEqualTo(String value) {
+            addCriterion("pattern_url >=", value, "patternUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andPatternUrlLessThan(String value) {
+            addCriterion("pattern_url <", value, "patternUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andPatternUrlLessThanOrEqualTo(String value) {
+            addCriterion("pattern_url <=", value, "patternUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andPatternUrlLike(String value) {
+            addCriterion("pattern_url like", value, "patternUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andPatternUrlNotLike(String value) {
+            addCriterion("pattern_url not like", value, "patternUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andPatternUrlIn(List<String> values) {
+            addCriterion("pattern_url in", values, "patternUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andPatternUrlNotIn(List<String> values) {
+            addCriterion("pattern_url not in", values, "patternUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andPatternUrlBetween(String value1, String value2) {
+            addCriterion("pattern_url between", value1, value2, "patternUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andPatternUrlNotBetween(String value1, String value2) {
+            addCriterion("pattern_url not between", value1, value2, "patternUrl");
+            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(Date value) {
+            addCriterion("create_time =", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotEqualTo(Date value) {
+            addCriterion("create_time <>", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeGreaterThan(Date value) {
+            addCriterion("create_time >", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeGreaterThanOrEqualTo(Date value) {
+            addCriterion("create_time >=", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeLessThan(Date value) {
+            addCriterion("create_time <", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeLessThanOrEqualTo(Date value) {
+            addCriterion("create_time <=", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIn(List<Date> values) {
+            addCriterion("create_time in", values, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotIn(List<Date> values) {
+            addCriterion("create_time not in", values, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeBetween(Date value1, Date value2) {
+            addCriterion("create_time between", value1, value2, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotBetween(Date value1, Date 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(Date value) {
+            addCriterion("update_time =", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeNotEqualTo(Date value) {
+            addCriterion("update_time <>", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeGreaterThan(Date value) {
+            addCriterion("update_time >", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeGreaterThanOrEqualTo(Date value) {
+            addCriterion("update_time >=", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeLessThan(Date value) {
+            addCriterion("update_time <", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeLessThanOrEqualTo(Date value) {
+            addCriterion("update_time <=", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeIn(List<Date> values) {
+            addCriterion("update_time in", values, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeNotIn(List<Date> values) {
+            addCriterion("update_time not in", values, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeBetween(Date value1, Date value2) {
+            addCriterion("update_time between", value1, value2, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeNotBetween(Date value1, Date 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 deconstruct_content
+     *
+     * @mbg.generated do_not_delete_during_merge Mon Mar 09 10:39:51 CST 2026
+     */
+    public static class Criteria extends GeneratedCriteria {
+
+        protected Criteria() {
+            super();
+        }
+    }
+
+    /**
+     * This class was generated by MyBatis Generator.
+     * This class corresponds to the database table deconstruct_content
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    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);
+        }
+    }
+}

+ 530 - 0
core/src/main/java/com/tzld/videoVector/model/po/videoVector/deconstruct/DeconstructContentVector.java

@@ -0,0 +1,530 @@
+package com.tzld.videoVector.model.po.videoVector.deconstruct;
+
+import java.util.Date;
+
+/**
+ *
+ * This class was generated by MyBatis Generator.
+ * This class corresponds to the database table deconstruct_content_vector
+ */
+public class DeconstructContentVector {
+    /**
+     * Database Column Remarks:
+     *   主键ID
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_content_vector.id
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    private Long id;
+
+    /**
+     * Database Column Remarks:
+     *   关联deconstruct_content.id
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_content_vector.content_id
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    private Long contentId;
+
+    /**
+     * Database Column Remarks:
+     *   解构任务ID
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_content_vector.task_id
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    private String taskId;
+
+    /**
+     * Database Column Remarks:
+     *   向量化内容来源字段:title/summary/full_text/topics/points/theme等
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_content_vector.source_field
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    private String sourceField;
+
+    /**
+     * Database Column Remarks:
+     *   JSON路径(如result.topics[0].name)
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_content_vector.source_path
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    private String sourcePath;
+
+    /**
+     * Database Column Remarks:
+     *   向量维度
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_content_vector.vector_dimension
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    private Integer vectorDimension;
+
+    /**
+     * Database Column Remarks:
+     *   向量数据(Float数组存储为JSON)
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_content_vector.vector_data
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    private String vectorData;
+
+    /**
+     * Database Column Remarks:
+     *   文本内容MD5哈希(用于去重)
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_content_vector.text_hash
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    private String textHash;
+
+    /**
+     * Database Column Remarks:
+     *   使用的嵌入模型:Qwen3-Embedding-0.6B等
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_content_vector.embedding_model
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    private String embeddingModel;
+
+    /**
+     * Database Column Remarks:
+     *   分段索引(长文本分块时使用)
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_content_vector.segment_index
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    private Integer segmentIndex;
+
+    /**
+     * Database Column Remarks:
+     *   总分段数
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_content_vector.segment_total
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    private Integer segmentTotal;
+
+    /**
+     * Database Column Remarks:
+     *   创建时间
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_content_vector.create_time
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    private Date createTime;
+
+    /**
+     * Database Column Remarks:
+     *   更新时间
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_content_vector.update_time
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    private Date updateTime;
+
+    /**
+     * Database Column Remarks:
+     *   向量化前的原始文本内容
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_content_vector.source_text
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    private String sourceText;
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_content_vector.id
+     *
+     * @return the value of deconstruct_content_vector.id
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public Long getId() {
+        return id;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_content_vector.id
+     *
+     * @param id the value for deconstruct_content_vector.id
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_content_vector.content_id
+     *
+     * @return the value of deconstruct_content_vector.content_id
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public Long getContentId() {
+        return contentId;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_content_vector.content_id
+     *
+     * @param contentId the value for deconstruct_content_vector.content_id
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void setContentId(Long contentId) {
+        this.contentId = contentId;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_content_vector.task_id
+     *
+     * @return the value of deconstruct_content_vector.task_id
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public String getTaskId() {
+        return taskId;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_content_vector.task_id
+     *
+     * @param taskId the value for deconstruct_content_vector.task_id
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void setTaskId(String taskId) {
+        this.taskId = taskId;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_content_vector.source_field
+     *
+     * @return the value of deconstruct_content_vector.source_field
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public String getSourceField() {
+        return sourceField;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_content_vector.source_field
+     *
+     * @param sourceField the value for deconstruct_content_vector.source_field
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void setSourceField(String sourceField) {
+        this.sourceField = sourceField;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_content_vector.source_path
+     *
+     * @return the value of deconstruct_content_vector.source_path
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public String getSourcePath() {
+        return sourcePath;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_content_vector.source_path
+     *
+     * @param sourcePath the value for deconstruct_content_vector.source_path
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void setSourcePath(String sourcePath) {
+        this.sourcePath = sourcePath;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_content_vector.vector_dimension
+     *
+     * @return the value of deconstruct_content_vector.vector_dimension
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public Integer getVectorDimension() {
+        return vectorDimension;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_content_vector.vector_dimension
+     *
+     * @param vectorDimension the value for deconstruct_content_vector.vector_dimension
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void setVectorDimension(Integer vectorDimension) {
+        this.vectorDimension = vectorDimension;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_content_vector.vector_data
+     *
+     * @return the value of deconstruct_content_vector.vector_data
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public String getVectorData() {
+        return vectorData;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_content_vector.vector_data
+     *
+     * @param vectorData the value for deconstruct_content_vector.vector_data
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void setVectorData(String vectorData) {
+        this.vectorData = vectorData;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_content_vector.text_hash
+     *
+     * @return the value of deconstruct_content_vector.text_hash
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public String getTextHash() {
+        return textHash;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_content_vector.text_hash
+     *
+     * @param textHash the value for deconstruct_content_vector.text_hash
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void setTextHash(String textHash) {
+        this.textHash = textHash;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_content_vector.embedding_model
+     *
+     * @return the value of deconstruct_content_vector.embedding_model
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public String getEmbeddingModel() {
+        return embeddingModel;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_content_vector.embedding_model
+     *
+     * @param embeddingModel the value for deconstruct_content_vector.embedding_model
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void setEmbeddingModel(String embeddingModel) {
+        this.embeddingModel = embeddingModel;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_content_vector.segment_index
+     *
+     * @return the value of deconstruct_content_vector.segment_index
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public Integer getSegmentIndex() {
+        return segmentIndex;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_content_vector.segment_index
+     *
+     * @param segmentIndex the value for deconstruct_content_vector.segment_index
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void setSegmentIndex(Integer segmentIndex) {
+        this.segmentIndex = segmentIndex;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_content_vector.segment_total
+     *
+     * @return the value of deconstruct_content_vector.segment_total
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public Integer getSegmentTotal() {
+        return segmentTotal;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_content_vector.segment_total
+     *
+     * @param segmentTotal the value for deconstruct_content_vector.segment_total
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void setSegmentTotal(Integer segmentTotal) {
+        this.segmentTotal = segmentTotal;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_content_vector.create_time
+     *
+     * @return the value of deconstruct_content_vector.create_time
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_content_vector.create_time
+     *
+     * @param createTime the value for deconstruct_content_vector.create_time
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_content_vector.update_time
+     *
+     * @return the value of deconstruct_content_vector.update_time
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_content_vector.update_time
+     *
+     * @param updateTime the value for deconstruct_content_vector.update_time
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_content_vector.source_text
+     *
+     * @return the value of deconstruct_content_vector.source_text
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public String getSourceText() {
+        return sourceText;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_content_vector.source_text
+     *
+     * @param sourceText the value for deconstruct_content_vector.source_text
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void setSourceText(String sourceText) {
+        this.sourceText = sourceText;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content_vector
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    @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(", taskId=").append(taskId);
+        sb.append(", sourceField=").append(sourceField);
+        sb.append(", sourcePath=").append(sourcePath);
+        sb.append(", vectorDimension=").append(vectorDimension);
+        sb.append(", vectorData=").append(vectorData);
+        sb.append(", textHash=").append(textHash);
+        sb.append(", embeddingModel=").append(embeddingModel);
+        sb.append(", segmentIndex=").append(segmentIndex);
+        sb.append(", segmentTotal=").append(segmentTotal);
+        sb.append(", createTime=").append(createTime);
+        sb.append(", updateTime=").append(updateTime);
+        sb.append(", sourceText=").append(sourceText);
+        sb.append("]");
+        return sb.toString();
+    }
+}

+ 1143 - 0
core/src/main/java/com/tzld/videoVector/model/po/videoVector/deconstruct/DeconstructContentVectorExample.java

@@ -0,0 +1,1143 @@
+package com.tzld.videoVector.model.po.videoVector.deconstruct;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+public class DeconstructContentVectorExample {
+    /**
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database table deconstruct_content_vector
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    protected String orderByClause;
+
+    /**
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database table deconstruct_content_vector
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    protected boolean distinct;
+
+    /**
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database table deconstruct_content_vector
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    protected List<Criteria> oredCriteria;
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content_vector
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public DeconstructContentVectorExample() {
+        oredCriteria = new ArrayList<Criteria>();
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content_vector
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content_vector
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content_vector
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content_vector
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content_vector
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public List<Criteria> getOredCriteria() {
+        return oredCriteria;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content_vector
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void or(Criteria criteria) {
+        oredCriteria.add(criteria);
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content_vector
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    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 deconstruct_content_vector
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    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 deconstruct_content_vector
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    protected Criteria createCriteriaInternal() {
+        Criteria criteria = new Criteria();
+        return criteria;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_content_vector
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void clear() {
+        oredCriteria.clear();
+        orderByClause = null;
+        distinct = false;
+    }
+
+    /**
+     * This class was generated by MyBatis Generator.
+     * This class corresponds to the database table deconstruct_content_vector
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    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 andTaskIdIsNull() {
+            addCriterion("task_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaskIdIsNotNull() {
+            addCriterion("task_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaskIdEqualTo(String value) {
+            addCriterion("task_id =", value, "taskId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaskIdNotEqualTo(String value) {
+            addCriterion("task_id <>", value, "taskId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaskIdGreaterThan(String value) {
+            addCriterion("task_id >", value, "taskId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaskIdGreaterThanOrEqualTo(String value) {
+            addCriterion("task_id >=", value, "taskId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaskIdLessThan(String value) {
+            addCriterion("task_id <", value, "taskId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaskIdLessThanOrEqualTo(String value) {
+            addCriterion("task_id <=", value, "taskId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaskIdLike(String value) {
+            addCriterion("task_id like", value, "taskId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaskIdNotLike(String value) {
+            addCriterion("task_id not like", value, "taskId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaskIdIn(List<String> values) {
+            addCriterion("task_id in", values, "taskId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaskIdNotIn(List<String> values) {
+            addCriterion("task_id not in", values, "taskId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaskIdBetween(String value1, String value2) {
+            addCriterion("task_id between", value1, value2, "taskId");
+            return (Criteria) this;
+        }
+
+        public Criteria andTaskIdNotBetween(String value1, String value2) {
+            addCriterion("task_id not between", value1, value2, "taskId");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceFieldIsNull() {
+            addCriterion("source_field is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceFieldIsNotNull() {
+            addCriterion("source_field is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceFieldEqualTo(String value) {
+            addCriterion("source_field =", value, "sourceField");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceFieldNotEqualTo(String value) {
+            addCriterion("source_field <>", value, "sourceField");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceFieldGreaterThan(String value) {
+            addCriterion("source_field >", value, "sourceField");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceFieldGreaterThanOrEqualTo(String value) {
+            addCriterion("source_field >=", value, "sourceField");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceFieldLessThan(String value) {
+            addCriterion("source_field <", value, "sourceField");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceFieldLessThanOrEqualTo(String value) {
+            addCriterion("source_field <=", value, "sourceField");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceFieldLike(String value) {
+            addCriterion("source_field like", value, "sourceField");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceFieldNotLike(String value) {
+            addCriterion("source_field not like", value, "sourceField");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceFieldIn(List<String> values) {
+            addCriterion("source_field in", values, "sourceField");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceFieldNotIn(List<String> values) {
+            addCriterion("source_field not in", values, "sourceField");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceFieldBetween(String value1, String value2) {
+            addCriterion("source_field between", value1, value2, "sourceField");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceFieldNotBetween(String value1, String value2) {
+            addCriterion("source_field not between", value1, value2, "sourceField");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourcePathIsNull() {
+            addCriterion("source_path is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourcePathIsNotNull() {
+            addCriterion("source_path is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourcePathEqualTo(String value) {
+            addCriterion("source_path =", value, "sourcePath");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourcePathNotEqualTo(String value) {
+            addCriterion("source_path <>", value, "sourcePath");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourcePathGreaterThan(String value) {
+            addCriterion("source_path >", value, "sourcePath");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourcePathGreaterThanOrEqualTo(String value) {
+            addCriterion("source_path >=", value, "sourcePath");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourcePathLessThan(String value) {
+            addCriterion("source_path <", value, "sourcePath");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourcePathLessThanOrEqualTo(String value) {
+            addCriterion("source_path <=", value, "sourcePath");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourcePathLike(String value) {
+            addCriterion("source_path like", value, "sourcePath");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourcePathNotLike(String value) {
+            addCriterion("source_path not like", value, "sourcePath");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourcePathIn(List<String> values) {
+            addCriterion("source_path in", values, "sourcePath");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourcePathNotIn(List<String> values) {
+            addCriterion("source_path not in", values, "sourcePath");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourcePathBetween(String value1, String value2) {
+            addCriterion("source_path between", value1, value2, "sourcePath");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourcePathNotBetween(String value1, String value2) {
+            addCriterion("source_path not between", value1, value2, "sourcePath");
+            return (Criteria) this;
+        }
+
+        public Criteria andVectorDimensionIsNull() {
+            addCriterion("vector_dimension is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andVectorDimensionIsNotNull() {
+            addCriterion("vector_dimension is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andVectorDimensionEqualTo(Integer value) {
+            addCriterion("vector_dimension =", value, "vectorDimension");
+            return (Criteria) this;
+        }
+
+        public Criteria andVectorDimensionNotEqualTo(Integer value) {
+            addCriterion("vector_dimension <>", value, "vectorDimension");
+            return (Criteria) this;
+        }
+
+        public Criteria andVectorDimensionGreaterThan(Integer value) {
+            addCriterion("vector_dimension >", value, "vectorDimension");
+            return (Criteria) this;
+        }
+
+        public Criteria andVectorDimensionGreaterThanOrEqualTo(Integer value) {
+            addCriterion("vector_dimension >=", value, "vectorDimension");
+            return (Criteria) this;
+        }
+
+        public Criteria andVectorDimensionLessThan(Integer value) {
+            addCriterion("vector_dimension <", value, "vectorDimension");
+            return (Criteria) this;
+        }
+
+        public Criteria andVectorDimensionLessThanOrEqualTo(Integer value) {
+            addCriterion("vector_dimension <=", value, "vectorDimension");
+            return (Criteria) this;
+        }
+
+        public Criteria andVectorDimensionIn(List<Integer> values) {
+            addCriterion("vector_dimension in", values, "vectorDimension");
+            return (Criteria) this;
+        }
+
+        public Criteria andVectorDimensionNotIn(List<Integer> values) {
+            addCriterion("vector_dimension not in", values, "vectorDimension");
+            return (Criteria) this;
+        }
+
+        public Criteria andVectorDimensionBetween(Integer value1, Integer value2) {
+            addCriterion("vector_dimension between", value1, value2, "vectorDimension");
+            return (Criteria) this;
+        }
+
+        public Criteria andVectorDimensionNotBetween(Integer value1, Integer value2) {
+            addCriterion("vector_dimension not between", value1, value2, "vectorDimension");
+            return (Criteria) this;
+        }
+
+        public Criteria andVectorDataIsNull() {
+            addCriterion("vector_data is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andVectorDataIsNotNull() {
+            addCriterion("vector_data is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andVectorDataEqualTo(String value) {
+            addCriterion("vector_data =", value, "vectorData");
+            return (Criteria) this;
+        }
+
+        public Criteria andVectorDataNotEqualTo(String value) {
+            addCriterion("vector_data <>", value, "vectorData");
+            return (Criteria) this;
+        }
+
+        public Criteria andVectorDataGreaterThan(String value) {
+            addCriterion("vector_data >", value, "vectorData");
+            return (Criteria) this;
+        }
+
+        public Criteria andVectorDataGreaterThanOrEqualTo(String value) {
+            addCriterion("vector_data >=", value, "vectorData");
+            return (Criteria) this;
+        }
+
+        public Criteria andVectorDataLessThan(String value) {
+            addCriterion("vector_data <", value, "vectorData");
+            return (Criteria) this;
+        }
+
+        public Criteria andVectorDataLessThanOrEqualTo(String value) {
+            addCriterion("vector_data <=", value, "vectorData");
+            return (Criteria) this;
+        }
+
+        public Criteria andVectorDataLike(String value) {
+            addCriterion("vector_data like", value, "vectorData");
+            return (Criteria) this;
+        }
+
+        public Criteria andVectorDataNotLike(String value) {
+            addCriterion("vector_data not like", value, "vectorData");
+            return (Criteria) this;
+        }
+
+        public Criteria andVectorDataIn(List<String> values) {
+            addCriterion("vector_data in", values, "vectorData");
+            return (Criteria) this;
+        }
+
+        public Criteria andVectorDataNotIn(List<String> values) {
+            addCriterion("vector_data not in", values, "vectorData");
+            return (Criteria) this;
+        }
+
+        public Criteria andVectorDataBetween(String value1, String value2) {
+            addCriterion("vector_data between", value1, value2, "vectorData");
+            return (Criteria) this;
+        }
+
+        public Criteria andVectorDataNotBetween(String value1, String value2) {
+            addCriterion("vector_data not between", value1, value2, "vectorData");
+            return (Criteria) this;
+        }
+
+        public Criteria andTextHashIsNull() {
+            addCriterion("text_hash is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTextHashIsNotNull() {
+            addCriterion("text_hash is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTextHashEqualTo(String value) {
+            addCriterion("text_hash =", value, "textHash");
+            return (Criteria) this;
+        }
+
+        public Criteria andTextHashNotEqualTo(String value) {
+            addCriterion("text_hash <>", value, "textHash");
+            return (Criteria) this;
+        }
+
+        public Criteria andTextHashGreaterThan(String value) {
+            addCriterion("text_hash >", value, "textHash");
+            return (Criteria) this;
+        }
+
+        public Criteria andTextHashGreaterThanOrEqualTo(String value) {
+            addCriterion("text_hash >=", value, "textHash");
+            return (Criteria) this;
+        }
+
+        public Criteria andTextHashLessThan(String value) {
+            addCriterion("text_hash <", value, "textHash");
+            return (Criteria) this;
+        }
+
+        public Criteria andTextHashLessThanOrEqualTo(String value) {
+            addCriterion("text_hash <=", value, "textHash");
+            return (Criteria) this;
+        }
+
+        public Criteria andTextHashLike(String value) {
+            addCriterion("text_hash like", value, "textHash");
+            return (Criteria) this;
+        }
+
+        public Criteria andTextHashNotLike(String value) {
+            addCriterion("text_hash not like", value, "textHash");
+            return (Criteria) this;
+        }
+
+        public Criteria andTextHashIn(List<String> values) {
+            addCriterion("text_hash in", values, "textHash");
+            return (Criteria) this;
+        }
+
+        public Criteria andTextHashNotIn(List<String> values) {
+            addCriterion("text_hash not in", values, "textHash");
+            return (Criteria) this;
+        }
+
+        public Criteria andTextHashBetween(String value1, String value2) {
+            addCriterion("text_hash between", value1, value2, "textHash");
+            return (Criteria) this;
+        }
+
+        public Criteria andTextHashNotBetween(String value1, String value2) {
+            addCriterion("text_hash not between", value1, value2, "textHash");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingModelIsNull() {
+            addCriterion("embedding_model is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingModelIsNotNull() {
+            addCriterion("embedding_model is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingModelEqualTo(String value) {
+            addCriterion("embedding_model =", value, "embeddingModel");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingModelNotEqualTo(String value) {
+            addCriterion("embedding_model <>", value, "embeddingModel");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingModelGreaterThan(String value) {
+            addCriterion("embedding_model >", value, "embeddingModel");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingModelGreaterThanOrEqualTo(String value) {
+            addCriterion("embedding_model >=", value, "embeddingModel");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingModelLessThan(String value) {
+            addCriterion("embedding_model <", value, "embeddingModel");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingModelLessThanOrEqualTo(String value) {
+            addCriterion("embedding_model <=", value, "embeddingModel");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingModelLike(String value) {
+            addCriterion("embedding_model like", value, "embeddingModel");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingModelNotLike(String value) {
+            addCriterion("embedding_model not like", value, "embeddingModel");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingModelIn(List<String> values) {
+            addCriterion("embedding_model in", values, "embeddingModel");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingModelNotIn(List<String> values) {
+            addCriterion("embedding_model not in", values, "embeddingModel");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingModelBetween(String value1, String value2) {
+            addCriterion("embedding_model between", value1, value2, "embeddingModel");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingModelNotBetween(String value1, String value2) {
+            addCriterion("embedding_model not between", value1, value2, "embeddingModel");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentIndexIsNull() {
+            addCriterion("segment_index is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentIndexIsNotNull() {
+            addCriterion("segment_index is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentIndexEqualTo(Integer value) {
+            addCriterion("segment_index =", value, "segmentIndex");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentIndexNotEqualTo(Integer value) {
+            addCriterion("segment_index <>", value, "segmentIndex");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentIndexGreaterThan(Integer value) {
+            addCriterion("segment_index >", value, "segmentIndex");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentIndexGreaterThanOrEqualTo(Integer value) {
+            addCriterion("segment_index >=", value, "segmentIndex");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentIndexLessThan(Integer value) {
+            addCriterion("segment_index <", value, "segmentIndex");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentIndexLessThanOrEqualTo(Integer value) {
+            addCriterion("segment_index <=", value, "segmentIndex");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentIndexIn(List<Integer> values) {
+            addCriterion("segment_index in", values, "segmentIndex");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentIndexNotIn(List<Integer> values) {
+            addCriterion("segment_index not in", values, "segmentIndex");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentIndexBetween(Integer value1, Integer value2) {
+            addCriterion("segment_index between", value1, value2, "segmentIndex");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentIndexNotBetween(Integer value1, Integer value2) {
+            addCriterion("segment_index not between", value1, value2, "segmentIndex");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentTotalIsNull() {
+            addCriterion("segment_total is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentTotalIsNotNull() {
+            addCriterion("segment_total is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentTotalEqualTo(Integer value) {
+            addCriterion("segment_total =", value, "segmentTotal");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentTotalNotEqualTo(Integer value) {
+            addCriterion("segment_total <>", value, "segmentTotal");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentTotalGreaterThan(Integer value) {
+            addCriterion("segment_total >", value, "segmentTotal");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentTotalGreaterThanOrEqualTo(Integer value) {
+            addCriterion("segment_total >=", value, "segmentTotal");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentTotalLessThan(Integer value) {
+            addCriterion("segment_total <", value, "segmentTotal");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentTotalLessThanOrEqualTo(Integer value) {
+            addCriterion("segment_total <=", value, "segmentTotal");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentTotalIn(List<Integer> values) {
+            addCriterion("segment_total in", values, "segmentTotal");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentTotalNotIn(List<Integer> values) {
+            addCriterion("segment_total not in", values, "segmentTotal");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentTotalBetween(Integer value1, Integer value2) {
+            addCriterion("segment_total between", value1, value2, "segmentTotal");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentTotalNotBetween(Integer value1, Integer value2) {
+            addCriterion("segment_total not between", value1, value2, "segmentTotal");
+            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(Date value) {
+            addCriterion("create_time =", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotEqualTo(Date value) {
+            addCriterion("create_time <>", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeGreaterThan(Date value) {
+            addCriterion("create_time >", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeGreaterThanOrEqualTo(Date value) {
+            addCriterion("create_time >=", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeLessThan(Date value) {
+            addCriterion("create_time <", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeLessThanOrEqualTo(Date value) {
+            addCriterion("create_time <=", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIn(List<Date> values) {
+            addCriterion("create_time in", values, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotIn(List<Date> values) {
+            addCriterion("create_time not in", values, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeBetween(Date value1, Date value2) {
+            addCriterion("create_time between", value1, value2, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotBetween(Date value1, Date 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(Date value) {
+            addCriterion("update_time =", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeNotEqualTo(Date value) {
+            addCriterion("update_time <>", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeGreaterThan(Date value) {
+            addCriterion("update_time >", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeGreaterThanOrEqualTo(Date value) {
+            addCriterion("update_time >=", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeLessThan(Date value) {
+            addCriterion("update_time <", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeLessThanOrEqualTo(Date value) {
+            addCriterion("update_time <=", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeIn(List<Date> values) {
+            addCriterion("update_time in", values, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeNotIn(List<Date> values) {
+            addCriterion("update_time not in", values, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeBetween(Date value1, Date value2) {
+            addCriterion("update_time between", value1, value2, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeNotBetween(Date value1, Date 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 deconstruct_content_vector
+     *
+     * @mbg.generated do_not_delete_during_merge Mon Mar 09 10:39:51 CST 2026
+     */
+    public static class Criteria extends GeneratedCriteria {
+
+        protected Criteria() {
+            super();
+        }
+    }
+
+    /**
+     * This class was generated by MyBatis Generator.
+     * This class corresponds to the database table deconstruct_content_vector
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    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);
+        }
+    }
+}

+ 602 - 0
core/src/main/java/com/tzld/videoVector/model/po/videoVector/deconstruct/DeconstructVectorConfig.java

@@ -0,0 +1,602 @@
+package com.tzld.videoVector.model.po.videoVector.deconstruct;
+
+import java.util.Date;
+
+/**
+ *
+ * This class was generated by MyBatis Generator.
+ * This class corresponds to the database table deconstruct_vector_config
+ */
+public class DeconstructVectorConfig {
+    /**
+     * Database Column Remarks:
+     *   主键ID
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_vector_config.id
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    private Long id;
+
+    /**
+     * Database Column Remarks:
+     *   配置编码
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_vector_config.config_code
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    private String configCode;
+
+    /**
+     * Database Column Remarks:
+     *   配置名称
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_vector_config.config_name
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    private String configName;
+
+    /**
+     * Database Column Remarks:
+     *   业务类型:0选题 1创作 2制作(null表示全部)
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_vector_config.biz_type
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    private Byte bizType;
+
+    /**
+     * Database Column Remarks:
+     *   内容类型:1长文 2图文 3视频(null表示全部)
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_vector_config.content_type
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    private Byte contentType;
+
+    /**
+     * Database Column Remarks:
+     *   来源字段名
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_vector_config.source_field
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    private String sourceField;
+
+    /**
+     * Database Column Remarks:
+     *   JSON提取路径
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_vector_config.source_path
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    private String sourcePath;
+
+    /**
+     * Database Column Remarks:
+     *   提取规则(正则/JSONPath等)
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_vector_config.extract_rule
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    private String extractRule;
+
+    /**
+     * Database Column Remarks:
+     *   默认嵌入模型
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_vector_config.embedding_model
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    private String embeddingModel;
+
+    /**
+     * Database Column Remarks:
+     *   最大文本长度
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_vector_config.max_length
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    private Integer maxLength;
+
+    /**
+     * Database Column Remarks:
+     *   是否分段:0否 1是
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_vector_config.enable_segment
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    private Byte enableSegment;
+
+    /**
+     * Database Column Remarks:
+     *   分段大小
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_vector_config.segment_size
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    private Integer segmentSize;
+
+    /**
+     * Database Column Remarks:
+     *   优先级(数字越小越优先)
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_vector_config.priority
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    private Integer priority;
+
+    /**
+     * Database Column Remarks:
+     *   是否启用:0禁用 1启用
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_vector_config.enabled
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    private Byte enabled;
+
+    /**
+     * Database Column Remarks:
+     *   创建时间
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_vector_config.create_time
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    private Date createTime;
+
+    /**
+     * Database Column Remarks:
+     *   更新时间
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column deconstruct_vector_config.update_time
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    private Date updateTime;
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_vector_config.id
+     *
+     * @return the value of deconstruct_vector_config.id
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public Long getId() {
+        return id;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_vector_config.id
+     *
+     * @param id the value for deconstruct_vector_config.id
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_vector_config.config_code
+     *
+     * @return the value of deconstruct_vector_config.config_code
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public String getConfigCode() {
+        return configCode;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_vector_config.config_code
+     *
+     * @param configCode the value for deconstruct_vector_config.config_code
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void setConfigCode(String configCode) {
+        this.configCode = configCode;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_vector_config.config_name
+     *
+     * @return the value of deconstruct_vector_config.config_name
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public String getConfigName() {
+        return configName;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_vector_config.config_name
+     *
+     * @param configName the value for deconstruct_vector_config.config_name
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void setConfigName(String configName) {
+        this.configName = configName;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_vector_config.biz_type
+     *
+     * @return the value of deconstruct_vector_config.biz_type
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public Byte getBizType() {
+        return bizType;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_vector_config.biz_type
+     *
+     * @param bizType the value for deconstruct_vector_config.biz_type
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void setBizType(Byte bizType) {
+        this.bizType = bizType;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_vector_config.content_type
+     *
+     * @return the value of deconstruct_vector_config.content_type
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public Byte getContentType() {
+        return contentType;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_vector_config.content_type
+     *
+     * @param contentType the value for deconstruct_vector_config.content_type
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void setContentType(Byte contentType) {
+        this.contentType = contentType;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_vector_config.source_field
+     *
+     * @return the value of deconstruct_vector_config.source_field
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public String getSourceField() {
+        return sourceField;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_vector_config.source_field
+     *
+     * @param sourceField the value for deconstruct_vector_config.source_field
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void setSourceField(String sourceField) {
+        this.sourceField = sourceField;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_vector_config.source_path
+     *
+     * @return the value of deconstruct_vector_config.source_path
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public String getSourcePath() {
+        return sourcePath;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_vector_config.source_path
+     *
+     * @param sourcePath the value for deconstruct_vector_config.source_path
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void setSourcePath(String sourcePath) {
+        this.sourcePath = sourcePath;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_vector_config.extract_rule
+     *
+     * @return the value of deconstruct_vector_config.extract_rule
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public String getExtractRule() {
+        return extractRule;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_vector_config.extract_rule
+     *
+     * @param extractRule the value for deconstruct_vector_config.extract_rule
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void setExtractRule(String extractRule) {
+        this.extractRule = extractRule;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_vector_config.embedding_model
+     *
+     * @return the value of deconstruct_vector_config.embedding_model
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public String getEmbeddingModel() {
+        return embeddingModel;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_vector_config.embedding_model
+     *
+     * @param embeddingModel the value for deconstruct_vector_config.embedding_model
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void setEmbeddingModel(String embeddingModel) {
+        this.embeddingModel = embeddingModel;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_vector_config.max_length
+     *
+     * @return the value of deconstruct_vector_config.max_length
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public Integer getMaxLength() {
+        return maxLength;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_vector_config.max_length
+     *
+     * @param maxLength the value for deconstruct_vector_config.max_length
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void setMaxLength(Integer maxLength) {
+        this.maxLength = maxLength;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_vector_config.enable_segment
+     *
+     * @return the value of deconstruct_vector_config.enable_segment
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public Byte getEnableSegment() {
+        return enableSegment;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_vector_config.enable_segment
+     *
+     * @param enableSegment the value for deconstruct_vector_config.enable_segment
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void setEnableSegment(Byte enableSegment) {
+        this.enableSegment = enableSegment;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_vector_config.segment_size
+     *
+     * @return the value of deconstruct_vector_config.segment_size
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public Integer getSegmentSize() {
+        return segmentSize;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_vector_config.segment_size
+     *
+     * @param segmentSize the value for deconstruct_vector_config.segment_size
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void setSegmentSize(Integer segmentSize) {
+        this.segmentSize = segmentSize;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_vector_config.priority
+     *
+     * @return the value of deconstruct_vector_config.priority
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public Integer getPriority() {
+        return priority;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_vector_config.priority
+     *
+     * @param priority the value for deconstruct_vector_config.priority
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void setPriority(Integer priority) {
+        this.priority = priority;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_vector_config.enabled
+     *
+     * @return the value of deconstruct_vector_config.enabled
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public Byte getEnabled() {
+        return enabled;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_vector_config.enabled
+     *
+     * @param enabled the value for deconstruct_vector_config.enabled
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void setEnabled(Byte enabled) {
+        this.enabled = enabled;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_vector_config.create_time
+     *
+     * @return the value of deconstruct_vector_config.create_time
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_vector_config.create_time
+     *
+     * @param createTime the value for deconstruct_vector_config.create_time
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column deconstruct_vector_config.update_time
+     *
+     * @return the value of deconstruct_vector_config.update_time
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column deconstruct_vector_config.update_time
+     *
+     * @param updateTime the value for deconstruct_vector_config.update_time
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_vector_config
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    @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(", configCode=").append(configCode);
+        sb.append(", configName=").append(configName);
+        sb.append(", bizType=").append(bizType);
+        sb.append(", contentType=").append(contentType);
+        sb.append(", sourceField=").append(sourceField);
+        sb.append(", sourcePath=").append(sourcePath);
+        sb.append(", extractRule=").append(extractRule);
+        sb.append(", embeddingModel=").append(embeddingModel);
+        sb.append(", maxLength=").append(maxLength);
+        sb.append(", enableSegment=").append(enableSegment);
+        sb.append(", segmentSize=").append(segmentSize);
+        sb.append(", priority=").append(priority);
+        sb.append(", enabled=").append(enabled);
+        sb.append(", createTime=").append(createTime);
+        sb.append(", updateTime=").append(updateTime);
+        sb.append("]");
+        return sb.toString();
+    }
+}

+ 1323 - 0
core/src/main/java/com/tzld/videoVector/model/po/videoVector/deconstruct/DeconstructVectorConfigExample.java

@@ -0,0 +1,1323 @@
+package com.tzld.videoVector.model.po.videoVector.deconstruct;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+public class DeconstructVectorConfigExample {
+    /**
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database table deconstruct_vector_config
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    protected String orderByClause;
+
+    /**
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database table deconstruct_vector_config
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    protected boolean distinct;
+
+    /**
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database table deconstruct_vector_config
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    protected List<Criteria> oredCriteria;
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_vector_config
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public DeconstructVectorConfigExample() {
+        oredCriteria = new ArrayList<Criteria>();
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_vector_config
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_vector_config
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_vector_config
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_vector_config
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_vector_config
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public List<Criteria> getOredCriteria() {
+        return oredCriteria;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_vector_config
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void or(Criteria criteria) {
+        oredCriteria.add(criteria);
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_vector_config
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    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 deconstruct_vector_config
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    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 deconstruct_vector_config
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    protected Criteria createCriteriaInternal() {
+        Criteria criteria = new Criteria();
+        return criteria;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table deconstruct_vector_config
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    public void clear() {
+        oredCriteria.clear();
+        orderByClause = null;
+        distinct = false;
+    }
+
+    /**
+     * This class was generated by MyBatis Generator.
+     * This class corresponds to the database table deconstruct_vector_config
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    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 andConfigCodeIsNull() {
+            addCriterion("config_code is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigCodeIsNotNull() {
+            addCriterion("config_code is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigCodeEqualTo(String value) {
+            addCriterion("config_code =", value, "configCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigCodeNotEqualTo(String value) {
+            addCriterion("config_code <>", value, "configCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigCodeGreaterThan(String value) {
+            addCriterion("config_code >", value, "configCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigCodeGreaterThanOrEqualTo(String value) {
+            addCriterion("config_code >=", value, "configCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigCodeLessThan(String value) {
+            addCriterion("config_code <", value, "configCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigCodeLessThanOrEqualTo(String value) {
+            addCriterion("config_code <=", value, "configCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigCodeLike(String value) {
+            addCriterion("config_code like", value, "configCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigCodeNotLike(String value) {
+            addCriterion("config_code not like", value, "configCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigCodeIn(List<String> values) {
+            addCriterion("config_code in", values, "configCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigCodeNotIn(List<String> values) {
+            addCriterion("config_code not in", values, "configCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigCodeBetween(String value1, String value2) {
+            addCriterion("config_code between", value1, value2, "configCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigCodeNotBetween(String value1, String value2) {
+            addCriterion("config_code not between", value1, value2, "configCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigNameIsNull() {
+            addCriterion("config_name is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigNameIsNotNull() {
+            addCriterion("config_name is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigNameEqualTo(String value) {
+            addCriterion("config_name =", value, "configName");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigNameNotEqualTo(String value) {
+            addCriterion("config_name <>", value, "configName");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigNameGreaterThan(String value) {
+            addCriterion("config_name >", value, "configName");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigNameGreaterThanOrEqualTo(String value) {
+            addCriterion("config_name >=", value, "configName");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigNameLessThan(String value) {
+            addCriterion("config_name <", value, "configName");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigNameLessThanOrEqualTo(String value) {
+            addCriterion("config_name <=", value, "configName");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigNameLike(String value) {
+            addCriterion("config_name like", value, "configName");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigNameNotLike(String value) {
+            addCriterion("config_name not like", value, "configName");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigNameIn(List<String> values) {
+            addCriterion("config_name in", values, "configName");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigNameNotIn(List<String> values) {
+            addCriterion("config_name not in", values, "configName");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigNameBetween(String value1, String value2) {
+            addCriterion("config_name between", value1, value2, "configName");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigNameNotBetween(String value1, String value2) {
+            addCriterion("config_name not between", value1, value2, "configName");
+            return (Criteria) this;
+        }
+
+        public Criteria andBizTypeIsNull() {
+            addCriterion("biz_type is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andBizTypeIsNotNull() {
+            addCriterion("biz_type is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andBizTypeEqualTo(Byte value) {
+            addCriterion("biz_type =", value, "bizType");
+            return (Criteria) this;
+        }
+
+        public Criteria andBizTypeNotEqualTo(Byte value) {
+            addCriterion("biz_type <>", value, "bizType");
+            return (Criteria) this;
+        }
+
+        public Criteria andBizTypeGreaterThan(Byte value) {
+            addCriterion("biz_type >", value, "bizType");
+            return (Criteria) this;
+        }
+
+        public Criteria andBizTypeGreaterThanOrEqualTo(Byte value) {
+            addCriterion("biz_type >=", value, "bizType");
+            return (Criteria) this;
+        }
+
+        public Criteria andBizTypeLessThan(Byte value) {
+            addCriterion("biz_type <", value, "bizType");
+            return (Criteria) this;
+        }
+
+        public Criteria andBizTypeLessThanOrEqualTo(Byte value) {
+            addCriterion("biz_type <=", value, "bizType");
+            return (Criteria) this;
+        }
+
+        public Criteria andBizTypeIn(List<Byte> values) {
+            addCriterion("biz_type in", values, "bizType");
+            return (Criteria) this;
+        }
+
+        public Criteria andBizTypeNotIn(List<Byte> values) {
+            addCriterion("biz_type not in", values, "bizType");
+            return (Criteria) this;
+        }
+
+        public Criteria andBizTypeBetween(Byte value1, Byte value2) {
+            addCriterion("biz_type between", value1, value2, "bizType");
+            return (Criteria) this;
+        }
+
+        public Criteria andBizTypeNotBetween(Byte value1, Byte value2) {
+            addCriterion("biz_type not between", value1, value2, "bizType");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentTypeIsNull() {
+            addCriterion("content_type is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentTypeIsNotNull() {
+            addCriterion("content_type is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentTypeEqualTo(Byte value) {
+            addCriterion("content_type =", value, "contentType");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentTypeNotEqualTo(Byte value) {
+            addCriterion("content_type <>", value, "contentType");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentTypeGreaterThan(Byte value) {
+            addCriterion("content_type >", value, "contentType");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentTypeGreaterThanOrEqualTo(Byte value) {
+            addCriterion("content_type >=", value, "contentType");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentTypeLessThan(Byte value) {
+            addCriterion("content_type <", value, "contentType");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentTypeLessThanOrEqualTo(Byte value) {
+            addCriterion("content_type <=", value, "contentType");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentTypeIn(List<Byte> values) {
+            addCriterion("content_type in", values, "contentType");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentTypeNotIn(List<Byte> values) {
+            addCriterion("content_type not in", values, "contentType");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentTypeBetween(Byte value1, Byte value2) {
+            addCriterion("content_type between", value1, value2, "contentType");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentTypeNotBetween(Byte value1, Byte value2) {
+            addCriterion("content_type not between", value1, value2, "contentType");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceFieldIsNull() {
+            addCriterion("source_field is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceFieldIsNotNull() {
+            addCriterion("source_field is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceFieldEqualTo(String value) {
+            addCriterion("source_field =", value, "sourceField");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceFieldNotEqualTo(String value) {
+            addCriterion("source_field <>", value, "sourceField");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceFieldGreaterThan(String value) {
+            addCriterion("source_field >", value, "sourceField");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceFieldGreaterThanOrEqualTo(String value) {
+            addCriterion("source_field >=", value, "sourceField");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceFieldLessThan(String value) {
+            addCriterion("source_field <", value, "sourceField");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceFieldLessThanOrEqualTo(String value) {
+            addCriterion("source_field <=", value, "sourceField");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceFieldLike(String value) {
+            addCriterion("source_field like", value, "sourceField");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceFieldNotLike(String value) {
+            addCriterion("source_field not like", value, "sourceField");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceFieldIn(List<String> values) {
+            addCriterion("source_field in", values, "sourceField");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceFieldNotIn(List<String> values) {
+            addCriterion("source_field not in", values, "sourceField");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceFieldBetween(String value1, String value2) {
+            addCriterion("source_field between", value1, value2, "sourceField");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceFieldNotBetween(String value1, String value2) {
+            addCriterion("source_field not between", value1, value2, "sourceField");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourcePathIsNull() {
+            addCriterion("source_path is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourcePathIsNotNull() {
+            addCriterion("source_path is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourcePathEqualTo(String value) {
+            addCriterion("source_path =", value, "sourcePath");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourcePathNotEqualTo(String value) {
+            addCriterion("source_path <>", value, "sourcePath");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourcePathGreaterThan(String value) {
+            addCriterion("source_path >", value, "sourcePath");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourcePathGreaterThanOrEqualTo(String value) {
+            addCriterion("source_path >=", value, "sourcePath");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourcePathLessThan(String value) {
+            addCriterion("source_path <", value, "sourcePath");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourcePathLessThanOrEqualTo(String value) {
+            addCriterion("source_path <=", value, "sourcePath");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourcePathLike(String value) {
+            addCriterion("source_path like", value, "sourcePath");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourcePathNotLike(String value) {
+            addCriterion("source_path not like", value, "sourcePath");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourcePathIn(List<String> values) {
+            addCriterion("source_path in", values, "sourcePath");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourcePathNotIn(List<String> values) {
+            addCriterion("source_path not in", values, "sourcePath");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourcePathBetween(String value1, String value2) {
+            addCriterion("source_path between", value1, value2, "sourcePath");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourcePathNotBetween(String value1, String value2) {
+            addCriterion("source_path not between", value1, value2, "sourcePath");
+            return (Criteria) this;
+        }
+
+        public Criteria andExtractRuleIsNull() {
+            addCriterion("extract_rule is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andExtractRuleIsNotNull() {
+            addCriterion("extract_rule is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andExtractRuleEqualTo(String value) {
+            addCriterion("extract_rule =", value, "extractRule");
+            return (Criteria) this;
+        }
+
+        public Criteria andExtractRuleNotEqualTo(String value) {
+            addCriterion("extract_rule <>", value, "extractRule");
+            return (Criteria) this;
+        }
+
+        public Criteria andExtractRuleGreaterThan(String value) {
+            addCriterion("extract_rule >", value, "extractRule");
+            return (Criteria) this;
+        }
+
+        public Criteria andExtractRuleGreaterThanOrEqualTo(String value) {
+            addCriterion("extract_rule >=", value, "extractRule");
+            return (Criteria) this;
+        }
+
+        public Criteria andExtractRuleLessThan(String value) {
+            addCriterion("extract_rule <", value, "extractRule");
+            return (Criteria) this;
+        }
+
+        public Criteria andExtractRuleLessThanOrEqualTo(String value) {
+            addCriterion("extract_rule <=", value, "extractRule");
+            return (Criteria) this;
+        }
+
+        public Criteria andExtractRuleLike(String value) {
+            addCriterion("extract_rule like", value, "extractRule");
+            return (Criteria) this;
+        }
+
+        public Criteria andExtractRuleNotLike(String value) {
+            addCriterion("extract_rule not like", value, "extractRule");
+            return (Criteria) this;
+        }
+
+        public Criteria andExtractRuleIn(List<String> values) {
+            addCriterion("extract_rule in", values, "extractRule");
+            return (Criteria) this;
+        }
+
+        public Criteria andExtractRuleNotIn(List<String> values) {
+            addCriterion("extract_rule not in", values, "extractRule");
+            return (Criteria) this;
+        }
+
+        public Criteria andExtractRuleBetween(String value1, String value2) {
+            addCriterion("extract_rule between", value1, value2, "extractRule");
+            return (Criteria) this;
+        }
+
+        public Criteria andExtractRuleNotBetween(String value1, String value2) {
+            addCriterion("extract_rule not between", value1, value2, "extractRule");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingModelIsNull() {
+            addCriterion("embedding_model is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingModelIsNotNull() {
+            addCriterion("embedding_model is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingModelEqualTo(String value) {
+            addCriterion("embedding_model =", value, "embeddingModel");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingModelNotEqualTo(String value) {
+            addCriterion("embedding_model <>", value, "embeddingModel");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingModelGreaterThan(String value) {
+            addCriterion("embedding_model >", value, "embeddingModel");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingModelGreaterThanOrEqualTo(String value) {
+            addCriterion("embedding_model >=", value, "embeddingModel");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingModelLessThan(String value) {
+            addCriterion("embedding_model <", value, "embeddingModel");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingModelLessThanOrEqualTo(String value) {
+            addCriterion("embedding_model <=", value, "embeddingModel");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingModelLike(String value) {
+            addCriterion("embedding_model like", value, "embeddingModel");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingModelNotLike(String value) {
+            addCriterion("embedding_model not like", value, "embeddingModel");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingModelIn(List<String> values) {
+            addCriterion("embedding_model in", values, "embeddingModel");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingModelNotIn(List<String> values) {
+            addCriterion("embedding_model not in", values, "embeddingModel");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingModelBetween(String value1, String value2) {
+            addCriterion("embedding_model between", value1, value2, "embeddingModel");
+            return (Criteria) this;
+        }
+
+        public Criteria andEmbeddingModelNotBetween(String value1, String value2) {
+            addCriterion("embedding_model not between", value1, value2, "embeddingModel");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaxLengthIsNull() {
+            addCriterion("max_length is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaxLengthIsNotNull() {
+            addCriterion("max_length is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaxLengthEqualTo(Integer value) {
+            addCriterion("max_length =", value, "maxLength");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaxLengthNotEqualTo(Integer value) {
+            addCriterion("max_length <>", value, "maxLength");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaxLengthGreaterThan(Integer value) {
+            addCriterion("max_length >", value, "maxLength");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaxLengthGreaterThanOrEqualTo(Integer value) {
+            addCriterion("max_length >=", value, "maxLength");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaxLengthLessThan(Integer value) {
+            addCriterion("max_length <", value, "maxLength");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaxLengthLessThanOrEqualTo(Integer value) {
+            addCriterion("max_length <=", value, "maxLength");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaxLengthIn(List<Integer> values) {
+            addCriterion("max_length in", values, "maxLength");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaxLengthNotIn(List<Integer> values) {
+            addCriterion("max_length not in", values, "maxLength");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaxLengthBetween(Integer value1, Integer value2) {
+            addCriterion("max_length between", value1, value2, "maxLength");
+            return (Criteria) this;
+        }
+
+        public Criteria andMaxLengthNotBetween(Integer value1, Integer value2) {
+            addCriterion("max_length not between", value1, value2, "maxLength");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnableSegmentIsNull() {
+            addCriterion("enable_segment is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnableSegmentIsNotNull() {
+            addCriterion("enable_segment is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnableSegmentEqualTo(Byte value) {
+            addCriterion("enable_segment =", value, "enableSegment");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnableSegmentNotEqualTo(Byte value) {
+            addCriterion("enable_segment <>", value, "enableSegment");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnableSegmentGreaterThan(Byte value) {
+            addCriterion("enable_segment >", value, "enableSegment");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnableSegmentGreaterThanOrEqualTo(Byte value) {
+            addCriterion("enable_segment >=", value, "enableSegment");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnableSegmentLessThan(Byte value) {
+            addCriterion("enable_segment <", value, "enableSegment");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnableSegmentLessThanOrEqualTo(Byte value) {
+            addCriterion("enable_segment <=", value, "enableSegment");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnableSegmentIn(List<Byte> values) {
+            addCriterion("enable_segment in", values, "enableSegment");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnableSegmentNotIn(List<Byte> values) {
+            addCriterion("enable_segment not in", values, "enableSegment");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnableSegmentBetween(Byte value1, Byte value2) {
+            addCriterion("enable_segment between", value1, value2, "enableSegment");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnableSegmentNotBetween(Byte value1, Byte value2) {
+            addCriterion("enable_segment not between", value1, value2, "enableSegment");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentSizeIsNull() {
+            addCriterion("segment_size is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentSizeIsNotNull() {
+            addCriterion("segment_size is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentSizeEqualTo(Integer value) {
+            addCriterion("segment_size =", value, "segmentSize");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentSizeNotEqualTo(Integer value) {
+            addCriterion("segment_size <>", value, "segmentSize");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentSizeGreaterThan(Integer value) {
+            addCriterion("segment_size >", value, "segmentSize");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentSizeGreaterThanOrEqualTo(Integer value) {
+            addCriterion("segment_size >=", value, "segmentSize");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentSizeLessThan(Integer value) {
+            addCriterion("segment_size <", value, "segmentSize");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentSizeLessThanOrEqualTo(Integer value) {
+            addCriterion("segment_size <=", value, "segmentSize");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentSizeIn(List<Integer> values) {
+            addCriterion("segment_size in", values, "segmentSize");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentSizeNotIn(List<Integer> values) {
+            addCriterion("segment_size not in", values, "segmentSize");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentSizeBetween(Integer value1, Integer value2) {
+            addCriterion("segment_size between", value1, value2, "segmentSize");
+            return (Criteria) this;
+        }
+
+        public Criteria andSegmentSizeNotBetween(Integer value1, Integer value2) {
+            addCriterion("segment_size not between", value1, value2, "segmentSize");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriorityIsNull() {
+            addCriterion("priority is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriorityIsNotNull() {
+            addCriterion("priority is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriorityEqualTo(Integer value) {
+            addCriterion("priority =", value, "priority");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriorityNotEqualTo(Integer value) {
+            addCriterion("priority <>", value, "priority");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriorityGreaterThan(Integer value) {
+            addCriterion("priority >", value, "priority");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriorityGreaterThanOrEqualTo(Integer value) {
+            addCriterion("priority >=", value, "priority");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriorityLessThan(Integer value) {
+            addCriterion("priority <", value, "priority");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriorityLessThanOrEqualTo(Integer value) {
+            addCriterion("priority <=", value, "priority");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriorityIn(List<Integer> values) {
+            addCriterion("priority in", values, "priority");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriorityNotIn(List<Integer> values) {
+            addCriterion("priority not in", values, "priority");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriorityBetween(Integer value1, Integer value2) {
+            addCriterion("priority between", value1, value2, "priority");
+            return (Criteria) this;
+        }
+
+        public Criteria andPriorityNotBetween(Integer value1, Integer value2) {
+            addCriterion("priority not between", value1, value2, "priority");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledIsNull() {
+            addCriterion("enabled is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledIsNotNull() {
+            addCriterion("enabled is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledEqualTo(Byte value) {
+            addCriterion("enabled =", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledNotEqualTo(Byte value) {
+            addCriterion("enabled <>", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledGreaterThan(Byte value) {
+            addCriterion("enabled >", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledGreaterThanOrEqualTo(Byte value) {
+            addCriterion("enabled >=", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledLessThan(Byte value) {
+            addCriterion("enabled <", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledLessThanOrEqualTo(Byte value) {
+            addCriterion("enabled <=", value, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledIn(List<Byte> values) {
+            addCriterion("enabled in", values, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledNotIn(List<Byte> values) {
+            addCriterion("enabled not in", values, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledBetween(Byte value1, Byte value2) {
+            addCriterion("enabled between", value1, value2, "enabled");
+            return (Criteria) this;
+        }
+
+        public Criteria andEnabledNotBetween(Byte value1, Byte value2) {
+            addCriterion("enabled not between", value1, value2, "enabled");
+            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(Date value) {
+            addCriterion("create_time =", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotEqualTo(Date value) {
+            addCriterion("create_time <>", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeGreaterThan(Date value) {
+            addCriterion("create_time >", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeGreaterThanOrEqualTo(Date value) {
+            addCriterion("create_time >=", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeLessThan(Date value) {
+            addCriterion("create_time <", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeLessThanOrEqualTo(Date value) {
+            addCriterion("create_time <=", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIn(List<Date> values) {
+            addCriterion("create_time in", values, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotIn(List<Date> values) {
+            addCriterion("create_time not in", values, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeBetween(Date value1, Date value2) {
+            addCriterion("create_time between", value1, value2, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotBetween(Date value1, Date 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(Date value) {
+            addCriterion("update_time =", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeNotEqualTo(Date value) {
+            addCriterion("update_time <>", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeGreaterThan(Date value) {
+            addCriterion("update_time >", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeGreaterThanOrEqualTo(Date value) {
+            addCriterion("update_time >=", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeLessThan(Date value) {
+            addCriterion("update_time <", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeLessThanOrEqualTo(Date value) {
+            addCriterion("update_time <=", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeIn(List<Date> values) {
+            addCriterion("update_time in", values, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeNotIn(List<Date> values) {
+            addCriterion("update_time not in", values, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeBetween(Date value1, Date value2) {
+            addCriterion("update_time between", value1, value2, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeNotBetween(Date value1, Date 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 deconstruct_vector_config
+     *
+     * @mbg.generated do_not_delete_during_merge Mon Mar 09 10:39:51 CST 2026
+     */
+    public static class Criteria extends GeneratedCriteria {
+
+        protected Criteria() {
+            super();
+        }
+    }
+
+    /**
+     * This class was generated by MyBatis Generator.
+     * This class corresponds to the database table deconstruct_vector_config
+     *
+     * @mbg.generated Mon Mar 09 10:39:51 CST 2026
+     */
+    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 - 19
core/src/main/java/com/tzld/videoVector/service/DeconstructService.java

@@ -27,25 +27,6 @@ public interface DeconstructService {
                        String bodyText, String title, 
                        String channelAccountId, String channelAccountName);
 
-    /**
-     * 提交视频解构任务(简化版)
-     * @param videoId 视频ID
-     * @param videoUrl 视频地址
-     * @param title 标题
-     * @return taskId 任务ID
-     */
-    String deconstructVideo(String videoId, String videoUrl, String title);
-
-    /**
-     * 提交图文解构任务(简化版)
-     * @param contentId 内容ID
-     * @param title 标题
-     * @param bodyText 正文内容
-     * @param images 图片列表
-     * @return taskId 任务ID
-     */
-    String deconstructArticle(String contentId, String title, String bodyText, java.util.List<String> images);
-
     /**
      * 根据 taskId 查询解构结果
      * @param taskId 任务ID

+ 65 - 0
core/src/main/java/com/tzld/videoVector/service/VectorizeService.java

@@ -0,0 +1,65 @@
+package com.tzld.videoVector.service;
+
+import com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructContent;
+import com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructContentVector;
+import com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructVectorConfig;
+
+import java.util.List;
+
+/**
+ * 向量化服务接口
+ * 负责将解构内容按配置进行向量化处理
+ */
+public interface VectorizeService {
+
+    /**
+     * 根据业务类型和内容类型获取向量化配置
+     *
+     * @param bizType     业务类型
+     * @param contentType 内容类型
+     * @return 向量化配置列表
+     */
+    List<DeconstructVectorConfig> getVectorConfigs(Integer bizType, Integer contentType);
+
+    /**
+     * 对解构内容进行向量化处理
+     *
+     * @param content 解构内容
+     * @return 生成的向量列表
+     */
+    List<DeconstructContentVector> vectorizeContent(DeconstructContent content);
+
+    /**
+     * 根据配置提取文本并进行向量化
+     *
+     * @param content 解构内容
+     * @param config  向量化配置
+     * @return 向量列表(支持分段)
+     */
+    List<DeconstructContentVector> vectorizeByConfig(DeconstructContent content, DeconstructVectorConfig config);
+
+    /**
+     * 批量保存向量数据
+     *
+     * @param vectors 向量列表
+     * @return 保存数量
+     */
+    int batchSaveVectors(List<DeconstructContentVector> vectors);
+
+    /**
+     * 根据内容ID查询向量列表
+     *
+     * @param contentId 内容ID
+     * @return 向量列表
+     */
+    List<DeconstructContentVector> getVectorsByContentId(Long contentId);
+
+    /**
+     * 根据内容ID和字段标识查询向量
+     *
+     * @param contentId   内容ID
+     * @param sourceField 来源字段
+     * @return 向量列表
+     */
+    List<DeconstructContentVector> getVectorsByField(Long contentId, String sourceField);
+}

+ 15 - 2
core/src/main/java/com/tzld/videoVector/service/VideoSearchService.java

@@ -1,6 +1,5 @@
 package com.tzld.videoVector.service;
 
-
 import com.tzld.videoVector.model.param.DeconstructParam;
 import com.tzld.videoVector.model.param.GetDeconstructParam;
 import com.tzld.videoVector.model.param.MatchTopNVideoParam;
@@ -9,10 +8,24 @@ import java.util.List;
 
 public interface VideoSearchService {
 
-
+    /**
+     * 提交内容解构任务
+     * @param param 解构参数
+     * @return 任务ID
+     */
     String deconstruct(DeconstructParam param);
 
+    /**
+     * 查询解构结果并保存到数据库
+     * @param param 查询参数
+     * @return 解构结果JSON字符串
+     */
     String getDeconstructResult(GetDeconstructParam param);
 
+    /**
+     * 匹配TopN视频
+     * @param param 匹配参数
+     * @return 匹配结果列表
+     */
     List<Object> matchTopNVideo(MatchTopNVideoParam param);
 }

+ 1 - 45
core/src/main/java/com/tzld/videoVector/service/impl/DeconstructServiceImpl.java

@@ -103,36 +103,6 @@ public class DeconstructServiceImpl implements DeconstructService {
         }
     }
 
-    @Override
-    public String deconstructVideo(String videoId, String videoUrl, String title) {
-        return deconstruct(
-                0,              // scene: 0选题
-                3,              // content_type: 3视频
-                videoId,        // channel_content_id
-                videoUrl,       // video_url
-                null,           // images
-                null,           // body_text
-                title,          // title
-                null,           // channel_account_id
-                null            // channel_account_name
-        );
-    }
-
-    @Override
-    public String deconstructArticle(String contentId, String title, String bodyText, List<String> images) {
-        return deconstruct(
-                0,              // scene: 0选题
-                2,              // content_type: 2图文
-                contentId,      // channel_content_id
-                null,           // video_url
-                images,         // images
-                bodyText,       // body_text
-                title,          // title
-                null,           // channel_account_id
-                null            // channel_account_name
-        );
-    }
-
     @Override
     public DeconstructResult getDeconstructResult(String taskId) {
         if (taskId == null || taskId.trim().isEmpty()) {
@@ -164,22 +134,8 @@ public class DeconstructServiceImpl implements DeconstructService {
 
             // 检查响应码
             Integer code = jsonResponse.getInteger("code");
-            if (code == null) {
-                log.error("查询解构结果响应中 code 为空,taskId: {}", taskId);
-                return result;
-            }
-
-            // 404 表示任务不存在
-            if (code == 404) {
-                log.warn("任务不存在,taskId: {}", taskId);
-                result.setStatus(3); // FAILED
-                result.setSuccess(false);
-                result.setReason("任务不存在");
-                return result;
-            }
-
             // 其他非成功状态
-            if (code != 0) {
+            if (code == null || code != 0) {
                 String msg = jsonResponse.getString("msg");
                 log.error("查询解构结果失败,code: {}, msg: {}, taskId: {}", code, msg, taskId);
                 result.setSuccess(false);

+ 1 - 2
core/src/main/java/com/tzld/videoVector/service/impl/RedisVectorStoreServiceImpl.java

@@ -1,7 +1,6 @@
 package com.tzld.videoVector.service.impl;
 
 import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
 import com.tzld.videoVector.model.entity.VideoMatch;
 import com.tzld.videoVector.service.VectorStoreService;
 import lombok.extern.slf4j.Slf4j;
@@ -52,7 +51,7 @@ public class RedisVectorStoreServiceImpl implements VectorStoreService {
     @Override
     public boolean exists(Long videoId) {
         if (videoId == null) return false;
-        return Boolean.TRUE.equals(redisTemplate.hasKey(buildKey(videoId)));
+        return redisTemplate.hasKey(buildKey(videoId));
     }
 
     @Override

+ 363 - 0
core/src/main/java/com/tzld/videoVector/service/impl/VectorizeServiceImpl.java

@@ -0,0 +1,363 @@
+package com.tzld.videoVector.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.tzld.videoVector.dao.mapper.videoVector.deconstruct.DeconstructContentVectorMapper;
+import com.tzld.videoVector.dao.mapper.videoVector.deconstruct.DeconstructVectorConfigMapper;
+import com.tzld.videoVector.model.po.videoVector.deconstruct.*;
+import com.tzld.videoVector.service.EmbeddingService;
+import com.tzld.videoVector.service.VectorizeService;
+import com.tzld.videoVector.util.Md5Util;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 向量化服务实现类
+ */
+@Slf4j
+@Service
+public class VectorizeServiceImpl implements VectorizeService {
+
+    @Resource
+    private DeconstructVectorConfigMapper vectorConfigMapper;
+
+    @Resource
+    private DeconstructContentVectorMapper contentVectorMapper;
+
+    @Resource
+    private EmbeddingService embeddingService;
+
+    @Override
+    public List<DeconstructVectorConfig> getVectorConfigs(Integer bizType, Integer contentType) {
+        DeconstructVectorConfigExample example = new DeconstructVectorConfigExample();
+        DeconstructVectorConfigExample.Criteria criteria = example.createCriteria();
+        criteria.andEnabledEqualTo((byte) 1);
+
+        // 业务类型匹配(null表示通用)
+        if (bizType != null) {
+            criteria.andBizTypeEqualTo(bizType.byteValue());
+        }
+
+        // 内容类型匹配(null表示通用)
+        if (contentType != null) {
+            criteria.andContentTypeEqualTo(contentType.byteValue());
+        }
+
+        example.setOrderByClause("priority ASC");
+        return vectorConfigMapper.selectByExample(example);
+    }
+
+    @Override
+    public List<DeconstructContentVector> vectorizeContent(DeconstructContent content) {
+        if (content == null || content.getId() == null) {
+            log.error("向量化内容为空或ID为空");
+            return new ArrayList<>();
+        }
+
+        // 获取向量化配置
+        List<DeconstructVectorConfig> configs = getVectorConfigs(
+                content.getBizType() != null ? content.getBizType().intValue() : null,
+                content.getContentType() != null ? content.getContentType().intValue() : null
+        );
+
+        if (CollectionUtils.isEmpty(configs)) {
+            log.warn("未找到向量化配置,bizType={}, contentType={}",
+                    content.getBizType(), content.getContentType());
+            return new ArrayList<>();
+        }
+
+        List<DeconstructContentVector> allVectors = new ArrayList<>();
+
+        // 按配置逐个向量化
+        for (DeconstructVectorConfig config : configs) {
+            try {
+                List<DeconstructContentVector> vectors = vectorizeByConfig(content, config);
+                if (!CollectionUtils.isEmpty(vectors)) {
+                    allVectors.addAll(vectors);
+                }
+            } catch (Exception e) {
+                log.error("向量化处理失败,configCode={}, error={}",
+                        config.getConfigCode(), e.getMessage(), e);
+            }
+        }
+
+        // 批量保存
+        if (!allVectors.isEmpty()) {
+            batchSaveVectors(allVectors);
+            log.info("内容向量化完成,contentId={}, 生成向量数={}",
+                    content.getId(), allVectors.size());
+        }
+
+        return allVectors;
+    }
+
+    @Override
+    public List<DeconstructContentVector> vectorizeByConfig(DeconstructContent content,
+                                                            DeconstructVectorConfig config) {
+        List<DeconstructContentVector> vectors = new ArrayList<>();
+
+        // 提取文本内容
+        List<String> texts = extractTexts(content, config);
+        if (CollectionUtils.isEmpty(texts)) {
+            log.debug("未提取到文本内容,configCode={}", config.getConfigCode());
+            return vectors;
+        }
+
+        String embeddingModel = config.getEmbeddingModel();
+        if (!StringUtils.hasText(embeddingModel)) {
+            embeddingModel = "Qwen3-Embedding-0.6B";
+        }
+
+        int segmentIndex = 0;
+        for (String text : texts) {
+            if (!StringUtils.hasText(text)) {
+                continue;
+            }
+
+            // 文本截断
+            String truncatedText = truncateText(text, config.getMaxLength());
+
+            // 调用向量化服务
+            List<Float> vectorData = embeddingService.embed(truncatedText);
+            if (CollectionUtils.isEmpty(vectorData)) {
+                log.warn("向量化失败,text={}", truncatedText.substring(0, Math.min(50, truncatedText.length())));
+                continue;
+            }
+
+            // 构建向量实体
+            DeconstructContentVector vector = new DeconstructContentVector();
+            vector.setContentId(content.getId());
+            vector.setTaskId(content.getTaskId());
+            vector.setSourceField(config.getSourceField());
+            vector.setSourcePath(config.getSourcePath());
+            vector.setVectorDimension(vectorData.size());
+            vector.setVectorData(JSON.toJSONString(vectorData));
+            vector.setSourceText(truncatedText);
+            vector.setTextHash(Md5Util.encoderByMd5(truncatedText));
+            vector.setEmbeddingModel(embeddingModel);
+            vector.setSegmentIndex(segmentIndex++);
+            vector.setSegmentTotal(texts.size());
+            vector.setCreateTime(new Date());
+            vector.setUpdateTime(new Date());
+
+            vectors.add(vector);
+        }
+
+        return vectors;
+    }
+
+    /**
+     * 根据配置从内容中提取文本
+     */
+    private List<String> extractTexts(DeconstructContent content, DeconstructVectorConfig config) {
+        List<String> texts = new ArrayList<>();
+        String sourceField = config.getSourceField();
+        String sourcePath = config.getSourcePath();
+
+        // 根据字段名提取
+        switch (sourceField) {
+            case "title":
+                if (StringUtils.hasText(content.getTitle())) {
+                    texts.add(content.getTitle());
+                }
+                break;
+            case "body_text":
+                if (StringUtils.hasText(content.getBodyText())) {
+                    texts.add(content.getBodyText());
+                }
+                break;
+            case "result_json":
+                // 从解构结果JSON中提取
+                if (StringUtils.hasText(content.getResultJson()) && StringUtils.hasText(sourcePath)) {
+                    texts.addAll(extractFromJson(content.getResultJson(), sourcePath));
+                }
+                break;
+            default:
+                // 尝试从result_json中提取自定义字段
+                if (StringUtils.hasText(content.getResultJson()) && StringUtils.hasText(sourcePath)) {
+                    texts.addAll(extractFromJson(content.getResultJson(), sourcePath));
+                }
+                break;
+        }
+
+        return texts;
+    }
+
+    /**
+     * 从JSON中提取文本
+     * 支持路径格式:$.final_normalization_rebuild.topic_fusion_result.最终选题.选题
+     * 支持中文 key 和数组路径如 topics[*]
+     */
+    private List<String> extractFromJson(String json, String path) {
+        List<String> results = new ArrayList<>();
+
+        if (!StringUtils.hasText(json) || !StringUtils.hasText(path)) {
+            return results;
+        }
+
+        try {
+            JSONObject jsonObject = JSON.parseObject(json);
+            if (jsonObject == null) {
+                return results;
+            }
+
+            // 路径处理(如 $.final_normalization_rebuild.topic_fusion_result.最终选题.选题)
+            if (path.startsWith("$.")) {
+                String pathContent = path.substring(2);
+                // 使用正则分割,支持中文 key
+                List<String> parts = parseJsonPath(pathContent);
+                Object current = jsonObject;
+
+                for (int i = 0; i < parts.size(); i++) {
+                    String part = parts.get(i);
+                    if (current == null) {
+                        break;
+                    }
+
+                    // 处理数组路径(如 topics[*])
+                    if (part.endsWith("[*]")) {
+                        String arrayKey = part.substring(0, part.length() - 3);
+                        if (current instanceof JSONObject) {
+                            JSONArray array = ((JSONObject) current).getJSONArray(arrayKey);
+                            if (array != null) {
+                                // 递归处理数组元素
+                                List<String> remainingParts = parts.subList(i + 1, parts.size());
+                                String remainingPath = String.join(".", remainingParts);
+                                for (int j = 0; j < array.size(); j++) {
+                                    Object item = array.get(j);
+                                    if (remainingParts.isEmpty()) {
+                                        // 直接取数组元素值
+                                        if (item instanceof String) {
+                                            results.add((String) item);
+                                        }
+                                    } else {
+                                        // 继续深入
+                                        results.addAll(extractFromJson(
+                                                JSON.toJSONString(item), "$." + remainingPath));
+                                    }
+                                }
+                            }
+                        }
+                        return results;
+                    } else {
+                        // 普通对象路径(支持中文 key)
+                        if (current instanceof JSONObject) {
+                            current = ((JSONObject) current).get(part);
+                        } else {
+                            // 当前节点不是对象,无法继续
+                            break;
+                        }
+                    }
+                }
+
+                // 提取最终值
+                if (current instanceof String) {
+                    results.add((String) current);
+                } else if (current instanceof JSONArray) {
+                    JSONArray array = (JSONArray) current;
+                    for (int i = 0; i < array.size(); i++) {
+                        Object item = array.get(i);
+                        if (item instanceof String) {
+                            results.add((String) item);
+                        }
+                    }
+                }
+            }
+        } catch (Exception e) {
+            log.error("JSON提取失败,path={}, error={}", path, e.getMessage());
+        }
+
+        return results;
+    }
+
+    /**
+     * 解析 JSONPath 路径,支持中文 key
+     * 例如:final_normalization_rebuild.topic_fusion_result.最终选题.选题
+     */
+    private List<String> parseJsonPath(String pathContent) {
+        List<String> parts = new ArrayList<>();
+        StringBuilder current = new StringBuilder();
+        
+        for (int i = 0; i < pathContent.length(); i++) {
+            char c = pathContent.charAt(i);
+            if (c == '.') {
+                if (current.length() > 0) {
+                    parts.add(current.toString());
+                    current = new StringBuilder();
+                }
+            } else {
+                current.append(c);
+            }
+        }
+        // 添加最后一个部分
+        if (current.length() > 0) {
+            parts.add(current.toString());
+        }
+        
+        return parts;
+    }
+
+    /**
+     * 文本截断
+     * maxLength 为 null 或 <= 0 时不进行截断
+     */
+    private String truncateText(String text, Integer maxLength) {
+        if (text == null) {
+            return null;
+        }
+        // maxLength 为 null 或 <= 0 时不限制长度
+        if (maxLength == null || maxLength <= 0) {
+            return text;
+        }
+        if (text.length() <= maxLength) {
+            return text;
+        }
+        return text.substring(0, maxLength);
+    }
+
+    @Override
+    public int batchSaveVectors(List<DeconstructContentVector> vectors) {
+        if (CollectionUtils.isEmpty(vectors)) {
+            return 0;
+        }
+
+        int count = 0;
+        for (DeconstructContentVector vector : vectors) {
+            try {
+                contentVectorMapper.insertSelective(vector);
+                count++;
+            } catch (Exception e) {
+                log.error("保存向量失败,contentId={}, sourceField={}, error={}",
+                        vector.getContentId(), vector.getSourceField(), e.getMessage());
+            }
+        }
+
+        return count;
+    }
+
+    @Override
+    public List<DeconstructContentVector> getVectorsByContentId(Long contentId) {
+        DeconstructContentVectorExample example = new DeconstructContentVectorExample();
+        example.createCriteria().andContentIdEqualTo(contentId);
+        example.setOrderByClause("source_field ASC, segment_index ASC");
+        return contentVectorMapper.selectByExampleWithBLOBs(example);
+    }
+
+    @Override
+    public List<DeconstructContentVector> getVectorsByField(Long contentId, String sourceField) {
+        DeconstructContentVectorExample example = new DeconstructContentVectorExample();
+        example.createCriteria()
+                .andContentIdEqualTo(contentId)
+                .andSourceFieldEqualTo(sourceField);
+        example.setOrderByClause("segment_index ASC");
+        return contentVectorMapper.selectByExampleWithBLOBs(example);
+    }
+}

+ 241 - 17
core/src/main/java/com/tzld/videoVector/service/impl/VideoSearchServiceImpl.java

@@ -1,21 +1,28 @@
 package com.tzld.videoVector.service.impl;
 
 import com.alibaba.fastjson.JSONObject;
+import com.tzld.videoVector.dao.mapper.videoVector.deconstruct.DeconstructContentMapper;
 import com.tzld.videoVector.model.entity.DeconstructResult;
 import com.tzld.videoVector.model.entity.VideoMatch;
 import com.tzld.videoVector.model.param.DeconstructParam;
 import com.tzld.videoVector.model.param.GetDeconstructParam;
 import com.tzld.videoVector.model.param.MatchTopNVideoParam;
+import com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructContent;
+import com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructContentExample;
+import com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructContentVector;
 import com.tzld.videoVector.service.DeconstructService;
 import com.tzld.videoVector.service.EmbeddingService;
 import com.tzld.videoVector.service.VectorStoreService;
+import com.tzld.videoVector.service.VectorizeService;
 import com.tzld.videoVector.service.VideoSearchService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
 
 import javax.annotation.Resource;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Date;
 import java.util.List;
 
 @Slf4j
@@ -31,6 +38,12 @@ public class VideoSearchServiceImpl implements VideoSearchService {
     @Resource
     private EmbeddingService embeddingService;
 
+    @Resource
+    private DeconstructContentMapper deconstructContentMapper;
+
+    @Resource
+    private VectorizeService vectorizeService;
+
     @Override
     public String deconstruct(DeconstructParam param) {
         if (param == null) {
@@ -38,18 +51,60 @@ public class VideoSearchServiceImpl implements VideoSearchService {
             return null;
         }
 
-        log.info("调用内容解构服务,title: {}", param.getTitle());
+        log.info("调用内容解构服务,title: {}, bizType: {}, contentType: {}",
+                param.getTitle(), param.getBizType(), param.getContentType());
 
-        // 调用 DeconstructService 提交图文解构任务
-        // scene=0(选题), contentType=2(图文)
-        String taskId = deconstructService.deconstructArticle(
-                null,                       // contentId 为空,由服务端生成
-                param.getTitle(),           // 标题
-                null,                       // bodyText 为空
-                param.getImageList()        // 图片列表
+        // 获取参数
+        Integer bizType = param.getBizType() != null ? param.getBizType() : 0;
+        Integer contentType = param.getContentType() != null ? param.getContentType() : 2;
+
+        // 调用 DeconstructService 提交解构任务
+        String taskId = deconstructService.deconstruct(
+                0,                            // scene: 业务场景
+                contentType,                        // content_type: 内容类型
+                param.getChannelContentId(),        // channel_content_id
+                param.getVideoUrl(),                // video_url
+                param.getImageList(),               // images
+                param.getBodyText(),                // body_text
+                param.getTitle(),                   // title
+                param.getChannelAccountId(),        // channel_account_id
+                param.getChannelAccountName()       // channel_account_name
         );
 
+        if (!StringUtils.hasText(taskId)) {
+            log.error("解构任务提交失败");
+            return null;
+        }
+
         log.info("内容解构任务提交成功,taskId: {}", taskId);
+
+        // 保存任务到数据库
+        try {
+            DeconstructContent content = new DeconstructContent();
+            content.setTaskId(taskId);
+            content.setBizType(bizType.byteValue());
+            content.setContentType(contentType.byteValue());
+            content.setChannelContentId(param.getChannelContentId());
+            content.setTitle(param.getTitle());
+            content.setBodyText(param.getBodyText());
+            content.setVideoUrl(param.getVideoUrl());
+            content.setChannelAccountId(param.getChannelAccountId());
+            content.setChannelAccountName(param.getChannelAccountName());
+            content.setStatus((byte) 0); // PENDING
+            content.setCreateTime(new Date());
+            content.setUpdateTime(new Date());
+
+            // 处理图片列表
+            if (param.getImageList() != null && !param.getImageList().isEmpty()) {
+                content.setImages(JSONObject.toJSONString(param.getImageList()));
+            }
+
+            deconstructContentMapper.insertSelective(content);
+            log.info("解构任务已保存到数据库,contentId={}, taskId={}", content.getId(), taskId);
+        } catch (Exception e) {
+            log.error("保存解构任务失败,taskId={}, error={}", taskId, e.getMessage(), e);
+        }
+
         return taskId;
     }
 
@@ -63,21 +118,162 @@ public class VideoSearchServiceImpl implements VideoSearchService {
         String taskId = param.getTaskId();
         log.info("查询内容解构结果,taskId: {}", taskId);
 
-        // 调用 DeconstructService 查询解构结果
-        DeconstructResult result = deconstructService.getDeconstructResult(taskId);
+        // 先从数据库查询
+        DeconstructContent content = getDeconstructContentByTaskId(taskId);
 
-        if (result == null) {
-            log.error("查询解构结果失败,taskId: {}", taskId);
-            return null;
+        // 判断是否需要调用API查询
+        // 1. 数据库中不存在记录 -> 调用API
+        // 2. 数据库中记录状态非终态(PENDING/RUNNING) -> 调用API刷新
+        // 3. 强制刷新参数 -> 调用API
+        boolean needRefresh = content == null 
+                || content.getStatus() == null 
+                || content.getStatus() == 0 
+                || content.getStatus() == 1
+                || Boolean.TRUE.equals(param.getForceRefresh());
+
+        DeconstructResult result = null;
+
+        if (needRefresh) {
+            log.info("调用API查询解构结果,taskId={}, dbStatus={}", 
+                    taskId, content != null ? content.getStatus() : null);
+            // 调用 DeconstructService 查询解构结果
+            result = deconstructService.getDeconstructResult(taskId);
+
+            if (result == null) {
+                log.error("查询解构结果失败,taskId: {}", taskId);
+                // 如果数据库有记录,返回数据库内容
+                if (content != null) {
+                    return buildResultFromContent(content);
+                }
+                return null;
+            }
+
+            // 更新数据库
+            content = updateContentFromResult(content, result, taskId, param);
+        }
+
+        // 如果任务完成且成功,进行向量化
+        if (content != null && content.getStatus() != null && content.getStatus() == 2) {
+            // 检查是否已向量化
+            List<DeconstructContentVector> existingVectors = vectorizeService.getVectorsByContentId(content.getId());
+            if (existingVectors == null || existingVectors.isEmpty()) {
+                // 异步进行向量化处理
+                vectorizeContentAsync(content);
+                log.info("触发向量化处理,contentId={}, taskId={}", content.getId(), taskId);
+            }
+        }
+
+        // 构建返回结果
+        if (result != null) {
+            return buildResultFromApiResult(result);
+        } else if (content != null) {
+            return buildResultFromContent(content);
+        }
+
+        return null;
+    }
+
+    /**
+     * 根据taskId查询解构内容
+     */
+    private DeconstructContent getDeconstructContentByTaskId(String taskId) {
+        DeconstructContentExample example = new DeconstructContentExample();
+        example.createCriteria().andTaskIdEqualTo(taskId);
+        List<DeconstructContent> list = deconstructContentMapper.selectByExampleWithBLOBs(example);
+        return list.isEmpty() ? null : list.get(0);
+    }
+
+    /**
+     * 根据API结果更新数据库记录
+     */
+    private DeconstructContent updateContentFromResult(DeconstructContent content, 
+                                                        DeconstructResult result,
+                                                        String taskId,
+                                                        GetDeconstructParam param) {
+        try {
+            if (content == null) {
+                // 创建新记录
+                content = new DeconstructContent();
+                content.setTaskId(taskId);
+                content.setBizType(param.getBizType() != null ? param.getBizType().byteValue() : 0);
+                content.setContentType(param.getContentType() != null ? param.getContentType().byteValue() : 2);
+                content.setChannelContentId(param.getChannelContentId());
+                content.setCreateTime(new Date());
+            }
+
+            // 更新状态和结果
+            content.setStatus(result.getStatus() != null ? result.getStatus().byteValue() : (byte) 3);
+            content.setResultJson(result.getResult());
+            content.setFailureReason(result.getReason());
+            content.setPointUrl(result.getPointUrl());
+            content.setWeightUrl(result.getWeightUrl());
+            content.setPatternUrl(result.getPatternUrl());
+            content.setUpdateTime(new Date());
+
+            if (content.getId() == null) {
+                deconstructContentMapper.insertSelective(content);
+                log.info("创建解构内容记录,contentId={}, taskId={}", content.getId(), taskId);
+            } else {
+                deconstructContentMapper.updateByPrimaryKeySelective(content);
+                log.info("更新解构内容记录,contentId={}, taskId={}, status={}", 
+                        content.getId(), taskId, content.getStatus());
+            }
+        } catch (Exception e) {
+            log.error("更新解构内容失败,taskId={}, error={}", taskId, e.getMessage(), e);
         }
 
-        // 将结果转换为 JSON 字符串返回
+        return content;
+    }
+
+    /**
+     * 从数据库记录构建返回结果
+     */
+    private String buildResultFromContent(DeconstructContent content) {
+        JSONObject jsonResult = new JSONObject();
+        jsonResult.put("taskId", content.getTaskId());
+        jsonResult.put("status", content.getStatus());
+        jsonResult.put("statusDesc", getStatusDesc(content.getStatus()));
+        jsonResult.put("success", content.getStatus() != null && content.getStatus() == 2);
+        jsonResult.put("finished", content.getStatus() != null && (content.getStatus() == 2 || content.getStatus() == 3));
+        jsonResult.put("fromCache", true);
+
+        if (content.getResultJson() != null) {
+            jsonResult.put("result", content.getResultJson());
+        }
+
+        if (content.getFailureReason() != null) {
+            jsonResult.put("reason", content.getFailureReason());
+        }
+
+        // 添加 URL 信息
+        JSONObject urlObj = new JSONObject();
+        if (content.getPointUrl() != null) {
+            urlObj.put("pointUrl", content.getPointUrl());
+        }
+        if (content.getWeightUrl() != null) {
+            urlObj.put("weightUrl", content.getWeightUrl());
+        }
+        if (content.getPatternUrl() != null) {
+            urlObj.put("patternUrl", content.getPatternUrl());
+        }
+        if (!urlObj.isEmpty()) {
+            jsonResult.put("url", urlObj);
+        }
+
+        return jsonResult.toJSONString();
+    }
+
+    /**
+     * 从API结果构建返回结果
+     */
+    private String buildResultFromApiResult(DeconstructResult result) {
         JSONObject jsonResult = new JSONObject();
         jsonResult.put("taskId", result.getTaskId());
         jsonResult.put("status", result.getStatus());
         jsonResult.put("statusDesc", result.getStatusDesc());
         jsonResult.put("success", result.isSuccess());
         jsonResult.put("finished", result.isFinished());
+        jsonResult.put("fromCache", false);
 
         if (result.getResult() != null) {
             jsonResult.put("result", result.getResult());
@@ -102,12 +298,40 @@ public class VideoSearchServiceImpl implements VideoSearchService {
             jsonResult.put("url", urlObj);
         }
 
-        log.info("查询解构结果成功,taskId: {}, status: {}, success: {}",
-                taskId, result.getStatusDesc(), result.isSuccess());
-
         return jsonResult.toJSONString();
     }
 
+    /**
+     * 获取状态描述
+     */
+    private String getStatusDesc(Byte status) {
+        if (status == null) return "UNKNOWN";
+        switch (status) {
+            case 0: return "PENDING";
+            case 1: return "RUNNING";
+            case 2: return "SUCCESS";
+            case 3: return "FAILED";
+            default: return "UNKNOWN";
+        }
+    }
+
+    /**
+     * 异步向量化内容
+     */
+    private void vectorizeContentAsync(DeconstructContent content) {
+        // 使用异步线程执行向量化,避免阻塞接口响应
+        new Thread(() -> {
+            try {
+                log.info("开始异步向量化处理,contentId={}", content.getId());
+                vectorizeService.vectorizeContent(content);
+                log.info("异步向量化处理完成,contentId={}", content.getId());
+            } catch (Exception e) {
+                log.error("异步向量化处理失败,contentId={}, error={}",
+                        content.getId(), e.getMessage(), e);
+            }
+        }).start();
+    }
+
     @Override
     public List<Object> matchTopNVideo(MatchTopNVideoParam param) {
         if (param == null) {

+ 8 - 15
core/src/main/resources/generator/mybatis-spider-generator-config.xml → core/src/main/resources/generator/mybatis-vector-generator-config.xml

@@ -24,38 +24,31 @@
         </commentGenerator>
 
         <jdbcConnection driverClass="com.mysql.jdbc.Driver"
-                        connectionURL="jdbc:mysql://rm-bp13g3ra2f59q49xs.mysql.rds.aliyuncs.com:3306/ai_supply?useUnicode=true&amp;characterEncoding=utf-8&amp;zeroDateTimeBehavior=convertToNull&amp;useSSL=false"
-                        userId="wqsd" password="wqsd@2025">
+                        connectionURL="jdbc:mysql://rm-bp17q95335a99272b.mysql.rds.aliyuncs.com:3306/deconstruct-vector?useUnicode=true&amp;characterEncoding=utf-8&amp;zeroDateTimeBehavior=convertToNull&amp;useSSL=false"
+                        userId="crawler" password="crawler123456@">
         </jdbcConnection>
 
         <javaTypeResolver type="org.mybatis.generator.internal.types.JavaTypeResolverDefaultImpl">
             <property name="forceBigDecimals" value="false"/>
         </javaTypeResolver>
 
-        <javaModelGenerator targetPackage="com.tzld.videoVector.model.po.videoVector.spider" targetProject="core/src/main/java">
+        <javaModelGenerator targetPackage="com.tzld.videoVector.model.po.videoVector.deconstruct" targetProject="core/src/main/java">
             <property name="constructorBased" value="false"/>
             <property name="enableSubPackages" value="true"/>
             <property name="immutable" value="false"/>
         </javaModelGenerator>
 
-        <sqlMapGenerator targetPackage="mapper.videoVector.spider" targetProject="core/src/main/resources">
+        <sqlMapGenerator targetPackage="mapper.videoVector.deconstruct" targetProject="core/src/main/resources">
             <property name="enableSubPackages" value="true"/>
         </sqlMapGenerator>
 
-        <javaClientGenerator targetPackage="com.tzld.videoVector.dao.mapper.videoVector.spider" type="XMLMAPPER" targetProject="core/src/main/java">
+        <javaClientGenerator targetPackage="com.tzld.videoVector.dao.mapper.videoVector.deconstruct" type="XMLMAPPER" targetProject="core/src/main/java">
             <property name="enableSubPackages" value="true"/>
         </javaClientGenerator>
 
-<!--        <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="produce_video" domainObjectName="" alias=""/>-->
-<!--        <table tableName="produce_video_audio" domainObjectName="" alias=""/>-->
-<!--        <table tableName="produce_video_material" domainObjectName="" alias=""/>-->
-<!--        <table tableName="tools_audio_trans_record" domainObjectName="" alias=""/>-->
-        <table tableName="subtitle_style" domainObjectName="" alias=""/>
+        <table tableName="deconstruct_content" domainObjectName="" alias=""/>
+        <table tableName="deconstruct_content_vector" domainObjectName="" alias=""/>
+        <table tableName="deconstruct_vector_config" domainObjectName="" alias=""/>
     </context>
 
 </generatorConfiguration>

+ 599 - 0
core/src/main/resources/mapper/videoVector/deconstruct/DeconstructContentMapper.xml

@@ -0,0 +1,599 @@
+<?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.videoVector.dao.mapper.videoVector.deconstruct.DeconstructContentMapper">
+  <resultMap id="BaseResultMap" type="com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructContent">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Mon Mar 09 10:39:51 CST 2026.
+    -->
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="task_id" jdbcType="VARCHAR" property="taskId" />
+    <result column="biz_type" jdbcType="TINYINT" property="bizType" />
+    <result column="content_type" jdbcType="TINYINT" property="contentType" />
+    <result column="channel_content_id" jdbcType="VARCHAR" property="channelContentId" />
+    <result column="title" jdbcType="VARCHAR" property="title" />
+    <result column="video_url" jdbcType="VARCHAR" property="videoUrl" />
+    <result column="images" jdbcType="CHAR" property="images" />
+    <result column="channel_account_id" jdbcType="VARCHAR" property="channelAccountId" />
+    <result column="channel_account_name" jdbcType="VARCHAR" property="channelAccountName" />
+    <result column="status" jdbcType="TINYINT" property="status" />
+    <result column="failure_reason" jdbcType="VARCHAR" property="failureReason" />
+    <result column="point_url" jdbcType="VARCHAR" property="pointUrl" />
+    <result column="weight_url" jdbcType="VARCHAR" property="weightUrl" />
+    <result column="pattern_url" jdbcType="VARCHAR" property="patternUrl" />
+    <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
+    <result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
+  </resultMap>
+  <resultMap extends="BaseResultMap" id="ResultMapWithBLOBs" type="com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructContent">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Mon Mar 09 10:39:51 CST 2026.
+    -->
+    <result column="body_text" jdbcType="LONGVARCHAR" property="bodyText" />
+    <result column="result_json" jdbcType="LONGVARCHAR" property="resultJson" />
+  </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 Mon Mar 09 10:39:51 CST 2026.
+    -->
+    <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 Mon Mar 09 10:39:51 CST 2026.
+    -->
+    <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 Mon Mar 09 10:39:51 CST 2026.
+    -->
+    id, task_id, biz_type, content_type, channel_content_id, title, video_url, images, 
+    channel_account_id, channel_account_name, `status`, failure_reason, point_url, weight_url, 
+    pattern_url, create_time, update_time
+  </sql>
+  <sql id="Blob_Column_List">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Mon Mar 09 10:39:51 CST 2026.
+    -->
+    body_text, result_json
+  </sql>
+  <select id="selectByExampleWithBLOBs" parameterType="com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructContentExample" resultMap="ResultMapWithBLOBs">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Mon Mar 09 10:39:51 CST 2026.
+    -->
+    select
+    <if test="distinct">
+      distinct
+    </if>
+    <include refid="Base_Column_List" />
+    ,
+    <include refid="Blob_Column_List" />
+    from deconstruct_content
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+    <if test="orderByClause != null">
+      order by ${orderByClause}
+    </if>
+  </select>
+  <select id="selectByExample" parameterType="com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructContentExample" resultMap="BaseResultMap">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Mon Mar 09 10:39:51 CST 2026.
+    -->
+    select
+    <if test="distinct">
+      distinct
+    </if>
+    <include refid="Base_Column_List" />
+    from deconstruct_content
+    <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="ResultMapWithBLOBs">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Mon Mar 09 10:39:51 CST 2026.
+    -->
+    select 
+    <include refid="Base_Column_List" />
+    ,
+    <include refid="Blob_Column_List" />
+    from deconstruct_content
+    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 Mon Mar 09 10:39:51 CST 2026.
+    -->
+    delete from deconstruct_content
+    where id = #{id,jdbcType=BIGINT}
+  </delete>
+  <delete id="deleteByExample" parameterType="com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructContentExample">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Mon Mar 09 10:39:51 CST 2026.
+    -->
+    delete from deconstruct_content
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </delete>
+  <insert id="insert" parameterType="com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructContent">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Mon Mar 09 10:39:51 CST 2026.
+    -->
+    insert into deconstruct_content (id, task_id, biz_type, 
+      content_type, channel_content_id, title, 
+      video_url, images, channel_account_id, 
+      channel_account_name, `status`, failure_reason, 
+      point_url, weight_url, pattern_url, 
+      create_time, update_time, body_text, 
+      result_json)
+    values (#{id,jdbcType=BIGINT}, #{taskId,jdbcType=VARCHAR}, #{bizType,jdbcType=TINYINT}, 
+      #{contentType,jdbcType=TINYINT}, #{channelContentId,jdbcType=VARCHAR}, #{title,jdbcType=VARCHAR}, 
+      #{videoUrl,jdbcType=VARCHAR}, #{images,jdbcType=CHAR}, #{channelAccountId,jdbcType=VARCHAR}, 
+      #{channelAccountName,jdbcType=VARCHAR}, #{status,jdbcType=TINYINT}, #{failureReason,jdbcType=VARCHAR}, 
+      #{pointUrl,jdbcType=VARCHAR}, #{weightUrl,jdbcType=VARCHAR}, #{patternUrl,jdbcType=VARCHAR}, 
+      #{createTime,jdbcType=TIMESTAMP}, #{updateTime,jdbcType=TIMESTAMP}, #{bodyText,jdbcType=LONGVARCHAR}, 
+      #{resultJson,jdbcType=LONGVARCHAR})
+  </insert>
+  <insert id="insertSelective" parameterType="com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructContent">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Mon Mar 09 10:39:51 CST 2026.
+    -->
+    insert into deconstruct_content
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        id,
+      </if>
+      <if test="taskId != null">
+        task_id,
+      </if>
+      <if test="bizType != null">
+        biz_type,
+      </if>
+      <if test="contentType != null">
+        content_type,
+      </if>
+      <if test="channelContentId != null">
+        channel_content_id,
+      </if>
+      <if test="title != null">
+        title,
+      </if>
+      <if test="videoUrl != null">
+        video_url,
+      </if>
+      <if test="images != null">
+        images,
+      </if>
+      <if test="channelAccountId != null">
+        channel_account_id,
+      </if>
+      <if test="channelAccountName != null">
+        channel_account_name,
+      </if>
+      <if test="status != null">
+        `status`,
+      </if>
+      <if test="failureReason != null">
+        failure_reason,
+      </if>
+      <if test="pointUrl != null">
+        point_url,
+      </if>
+      <if test="weightUrl != null">
+        weight_url,
+      </if>
+      <if test="patternUrl != null">
+        pattern_url,
+      </if>
+      <if test="createTime != null">
+        create_time,
+      </if>
+      <if test="updateTime != null">
+        update_time,
+      </if>
+      <if test="bodyText != null">
+        body_text,
+      </if>
+      <if test="resultJson != null">
+        result_json,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        #{id,jdbcType=BIGINT},
+      </if>
+      <if test="taskId != null">
+        #{taskId,jdbcType=VARCHAR},
+      </if>
+      <if test="bizType != null">
+        #{bizType,jdbcType=TINYINT},
+      </if>
+      <if test="contentType != null">
+        #{contentType,jdbcType=TINYINT},
+      </if>
+      <if test="channelContentId != null">
+        #{channelContentId,jdbcType=VARCHAR},
+      </if>
+      <if test="title != null">
+        #{title,jdbcType=VARCHAR},
+      </if>
+      <if test="videoUrl != null">
+        #{videoUrl,jdbcType=VARCHAR},
+      </if>
+      <if test="images != null">
+        #{images,jdbcType=CHAR},
+      </if>
+      <if test="channelAccountId != null">
+        #{channelAccountId,jdbcType=VARCHAR},
+      </if>
+      <if test="channelAccountName != null">
+        #{channelAccountName,jdbcType=VARCHAR},
+      </if>
+      <if test="status != null">
+        #{status,jdbcType=TINYINT},
+      </if>
+      <if test="failureReason != null">
+        #{failureReason,jdbcType=VARCHAR},
+      </if>
+      <if test="pointUrl != null">
+        #{pointUrl,jdbcType=VARCHAR},
+      </if>
+      <if test="weightUrl != null">
+        #{weightUrl,jdbcType=VARCHAR},
+      </if>
+      <if test="patternUrl != null">
+        #{patternUrl,jdbcType=VARCHAR},
+      </if>
+      <if test="createTime != null">
+        #{createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="updateTime != null">
+        #{updateTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="bodyText != null">
+        #{bodyText,jdbcType=LONGVARCHAR},
+      </if>
+      <if test="resultJson != null">
+        #{resultJson,jdbcType=LONGVARCHAR},
+      </if>
+    </trim>
+  </insert>
+  <select id="countByExample" parameterType="com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructContentExample" resultType="java.lang.Long">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Mon Mar 09 10:39:51 CST 2026.
+    -->
+    select count(*) from deconstruct_content
+    <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 Mon Mar 09 10:39:51 CST 2026.
+    -->
+    update deconstruct_content
+    <set>
+      <if test="record.id != null">
+        id = #{record.id,jdbcType=BIGINT},
+      </if>
+      <if test="record.taskId != null">
+        task_id = #{record.taskId,jdbcType=VARCHAR},
+      </if>
+      <if test="record.bizType != null">
+        biz_type = #{record.bizType,jdbcType=TINYINT},
+      </if>
+      <if test="record.contentType != null">
+        content_type = #{record.contentType,jdbcType=TINYINT},
+      </if>
+      <if test="record.channelContentId != null">
+        channel_content_id = #{record.channelContentId,jdbcType=VARCHAR},
+      </if>
+      <if test="record.title != null">
+        title = #{record.title,jdbcType=VARCHAR},
+      </if>
+      <if test="record.videoUrl != null">
+        video_url = #{record.videoUrl,jdbcType=VARCHAR},
+      </if>
+      <if test="record.images != null">
+        images = #{record.images,jdbcType=CHAR},
+      </if>
+      <if test="record.channelAccountId != null">
+        channel_account_id = #{record.channelAccountId,jdbcType=VARCHAR},
+      </if>
+      <if test="record.channelAccountName != null">
+        channel_account_name = #{record.channelAccountName,jdbcType=VARCHAR},
+      </if>
+      <if test="record.status != null">
+        `status` = #{record.status,jdbcType=TINYINT},
+      </if>
+      <if test="record.failureReason != null">
+        failure_reason = #{record.failureReason,jdbcType=VARCHAR},
+      </if>
+      <if test="record.pointUrl != null">
+        point_url = #{record.pointUrl,jdbcType=VARCHAR},
+      </if>
+      <if test="record.weightUrl != null">
+        weight_url = #{record.weightUrl,jdbcType=VARCHAR},
+      </if>
+      <if test="record.patternUrl != null">
+        pattern_url = #{record.patternUrl,jdbcType=VARCHAR},
+      </if>
+      <if test="record.createTime != null">
+        create_time = #{record.createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="record.updateTime != null">
+        update_time = #{record.updateTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="record.bodyText != null">
+        body_text = #{record.bodyText,jdbcType=LONGVARCHAR},
+      </if>
+      <if test="record.resultJson != null">
+        result_json = #{record.resultJson,jdbcType=LONGVARCHAR},
+      </if>
+    </set>
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByExampleWithBLOBs" parameterType="map">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Mon Mar 09 10:39:51 CST 2026.
+    -->
+    update deconstruct_content
+    set id = #{record.id,jdbcType=BIGINT},
+      task_id = #{record.taskId,jdbcType=VARCHAR},
+      biz_type = #{record.bizType,jdbcType=TINYINT},
+      content_type = #{record.contentType,jdbcType=TINYINT},
+      channel_content_id = #{record.channelContentId,jdbcType=VARCHAR},
+      title = #{record.title,jdbcType=VARCHAR},
+      video_url = #{record.videoUrl,jdbcType=VARCHAR},
+      images = #{record.images,jdbcType=CHAR},
+      channel_account_id = #{record.channelAccountId,jdbcType=VARCHAR},
+      channel_account_name = #{record.channelAccountName,jdbcType=VARCHAR},
+      `status` = #{record.status,jdbcType=TINYINT},
+      failure_reason = #{record.failureReason,jdbcType=VARCHAR},
+      point_url = #{record.pointUrl,jdbcType=VARCHAR},
+      weight_url = #{record.weightUrl,jdbcType=VARCHAR},
+      pattern_url = #{record.patternUrl,jdbcType=VARCHAR},
+      create_time = #{record.createTime,jdbcType=TIMESTAMP},
+      update_time = #{record.updateTime,jdbcType=TIMESTAMP},
+      body_text = #{record.bodyText,jdbcType=LONGVARCHAR},
+      result_json = #{record.resultJson,jdbcType=LONGVARCHAR}
+    <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 Mon Mar 09 10:39:51 CST 2026.
+    -->
+    update deconstruct_content
+    set id = #{record.id,jdbcType=BIGINT},
+      task_id = #{record.taskId,jdbcType=VARCHAR},
+      biz_type = #{record.bizType,jdbcType=TINYINT},
+      content_type = #{record.contentType,jdbcType=TINYINT},
+      channel_content_id = #{record.channelContentId,jdbcType=VARCHAR},
+      title = #{record.title,jdbcType=VARCHAR},
+      video_url = #{record.videoUrl,jdbcType=VARCHAR},
+      images = #{record.images,jdbcType=CHAR},
+      channel_account_id = #{record.channelAccountId,jdbcType=VARCHAR},
+      channel_account_name = #{record.channelAccountName,jdbcType=VARCHAR},
+      `status` = #{record.status,jdbcType=TINYINT},
+      failure_reason = #{record.failureReason,jdbcType=VARCHAR},
+      point_url = #{record.pointUrl,jdbcType=VARCHAR},
+      weight_url = #{record.weightUrl,jdbcType=VARCHAR},
+      pattern_url = #{record.patternUrl,jdbcType=VARCHAR},
+      create_time = #{record.createTime,jdbcType=TIMESTAMP},
+      update_time = #{record.updateTime,jdbcType=TIMESTAMP}
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByPrimaryKeySelective" parameterType="com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructContent">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Mon Mar 09 10:39:51 CST 2026.
+    -->
+    update deconstruct_content
+    <set>
+      <if test="taskId != null">
+        task_id = #{taskId,jdbcType=VARCHAR},
+      </if>
+      <if test="bizType != null">
+        biz_type = #{bizType,jdbcType=TINYINT},
+      </if>
+      <if test="contentType != null">
+        content_type = #{contentType,jdbcType=TINYINT},
+      </if>
+      <if test="channelContentId != null">
+        channel_content_id = #{channelContentId,jdbcType=VARCHAR},
+      </if>
+      <if test="title != null">
+        title = #{title,jdbcType=VARCHAR},
+      </if>
+      <if test="videoUrl != null">
+        video_url = #{videoUrl,jdbcType=VARCHAR},
+      </if>
+      <if test="images != null">
+        images = #{images,jdbcType=CHAR},
+      </if>
+      <if test="channelAccountId != null">
+        channel_account_id = #{channelAccountId,jdbcType=VARCHAR},
+      </if>
+      <if test="channelAccountName != null">
+        channel_account_name = #{channelAccountName,jdbcType=VARCHAR},
+      </if>
+      <if test="status != null">
+        `status` = #{status,jdbcType=TINYINT},
+      </if>
+      <if test="failureReason != null">
+        failure_reason = #{failureReason,jdbcType=VARCHAR},
+      </if>
+      <if test="pointUrl != null">
+        point_url = #{pointUrl,jdbcType=VARCHAR},
+      </if>
+      <if test="weightUrl != null">
+        weight_url = #{weightUrl,jdbcType=VARCHAR},
+      </if>
+      <if test="patternUrl != null">
+        pattern_url = #{patternUrl,jdbcType=VARCHAR},
+      </if>
+      <if test="createTime != null">
+        create_time = #{createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="updateTime != null">
+        update_time = #{updateTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="bodyText != null">
+        body_text = #{bodyText,jdbcType=LONGVARCHAR},
+      </if>
+      <if test="resultJson != null">
+        result_json = #{resultJson,jdbcType=LONGVARCHAR},
+      </if>
+    </set>
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+  <update id="updateByPrimaryKeyWithBLOBs" parameterType="com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructContent">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Mon Mar 09 10:39:51 CST 2026.
+    -->
+    update deconstruct_content
+    set task_id = #{taskId,jdbcType=VARCHAR},
+      biz_type = #{bizType,jdbcType=TINYINT},
+      content_type = #{contentType,jdbcType=TINYINT},
+      channel_content_id = #{channelContentId,jdbcType=VARCHAR},
+      title = #{title,jdbcType=VARCHAR},
+      video_url = #{videoUrl,jdbcType=VARCHAR},
+      images = #{images,jdbcType=CHAR},
+      channel_account_id = #{channelAccountId,jdbcType=VARCHAR},
+      channel_account_name = #{channelAccountName,jdbcType=VARCHAR},
+      `status` = #{status,jdbcType=TINYINT},
+      failure_reason = #{failureReason,jdbcType=VARCHAR},
+      point_url = #{pointUrl,jdbcType=VARCHAR},
+      weight_url = #{weightUrl,jdbcType=VARCHAR},
+      pattern_url = #{patternUrl,jdbcType=VARCHAR},
+      create_time = #{createTime,jdbcType=TIMESTAMP},
+      update_time = #{updateTime,jdbcType=TIMESTAMP},
+      body_text = #{bodyText,jdbcType=LONGVARCHAR},
+      result_json = #{resultJson,jdbcType=LONGVARCHAR}
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructContent">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Mon Mar 09 10:39:51 CST 2026.
+    -->
+    update deconstruct_content
+    set task_id = #{taskId,jdbcType=VARCHAR},
+      biz_type = #{bizType,jdbcType=TINYINT},
+      content_type = #{contentType,jdbcType=TINYINT},
+      channel_content_id = #{channelContentId,jdbcType=VARCHAR},
+      title = #{title,jdbcType=VARCHAR},
+      video_url = #{videoUrl,jdbcType=VARCHAR},
+      images = #{images,jdbcType=CHAR},
+      channel_account_id = #{channelAccountId,jdbcType=VARCHAR},
+      channel_account_name = #{channelAccountName,jdbcType=VARCHAR},
+      `status` = #{status,jdbcType=TINYINT},
+      failure_reason = #{failureReason,jdbcType=VARCHAR},
+      point_url = #{pointUrl,jdbcType=VARCHAR},
+      weight_url = #{weightUrl,jdbcType=VARCHAR},
+      pattern_url = #{patternUrl,jdbcType=VARCHAR},
+      create_time = #{createTime,jdbcType=TIMESTAMP},
+      update_time = #{updateTime,jdbcType=TIMESTAMP}
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+</mapper>

+ 511 - 0
core/src/main/resources/mapper/videoVector/deconstruct/DeconstructContentVectorMapper.xml

@@ -0,0 +1,511 @@
+<?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.videoVector.dao.mapper.videoVector.deconstruct.DeconstructContentVectorMapper">
+  <resultMap id="BaseResultMap" type="com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructContentVector">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Mon Mar 09 10:39:51 CST 2026.
+    -->
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="content_id" jdbcType="BIGINT" property="contentId" />
+    <result column="task_id" jdbcType="VARCHAR" property="taskId" />
+    <result column="source_field" jdbcType="VARCHAR" property="sourceField" />
+    <result column="source_path" jdbcType="VARCHAR" property="sourcePath" />
+    <result column="vector_dimension" jdbcType="INTEGER" property="vectorDimension" />
+    <result column="vector_data" jdbcType="CHAR" property="vectorData" />
+    <result column="text_hash" jdbcType="VARCHAR" property="textHash" />
+    <result column="embedding_model" jdbcType="VARCHAR" property="embeddingModel" />
+    <result column="segment_index" jdbcType="INTEGER" property="segmentIndex" />
+    <result column="segment_total" jdbcType="INTEGER" property="segmentTotal" />
+    <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
+    <result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
+  </resultMap>
+  <resultMap extends="BaseResultMap" id="ResultMapWithBLOBs" type="com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructContentVector">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Mon Mar 09 10:39:51 CST 2026.
+    -->
+    <result column="source_text" jdbcType="LONGVARCHAR" property="sourceText" />
+  </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 Mon Mar 09 10:39:51 CST 2026.
+    -->
+    <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 Mon Mar 09 10:39:51 CST 2026.
+    -->
+    <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 Mon Mar 09 10:39:51 CST 2026.
+    -->
+    id, content_id, task_id, source_field, source_path, vector_dimension, vector_data, 
+    text_hash, embedding_model, segment_index, segment_total, create_time, update_time
+  </sql>
+  <sql id="Blob_Column_List">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Mon Mar 09 10:39:51 CST 2026.
+    -->
+    source_text
+  </sql>
+  <select id="selectByExampleWithBLOBs" parameterType="com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructContentVectorExample" resultMap="ResultMapWithBLOBs">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Mon Mar 09 10:39:51 CST 2026.
+    -->
+    select
+    <if test="distinct">
+      distinct
+    </if>
+    <include refid="Base_Column_List" />
+    ,
+    <include refid="Blob_Column_List" />
+    from deconstruct_content_vector
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+    <if test="orderByClause != null">
+      order by ${orderByClause}
+    </if>
+  </select>
+  <select id="selectByExample" parameterType="com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructContentVectorExample" resultMap="BaseResultMap">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Mon Mar 09 10:39:51 CST 2026.
+    -->
+    select
+    <if test="distinct">
+      distinct
+    </if>
+    <include refid="Base_Column_List" />
+    from deconstruct_content_vector
+    <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="ResultMapWithBLOBs">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Mon Mar 09 10:39:51 CST 2026.
+    -->
+    select 
+    <include refid="Base_Column_List" />
+    ,
+    <include refid="Blob_Column_List" />
+    from deconstruct_content_vector
+    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 Mon Mar 09 10:39:51 CST 2026.
+    -->
+    delete from deconstruct_content_vector
+    where id = #{id,jdbcType=BIGINT}
+  </delete>
+  <delete id="deleteByExample" parameterType="com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructContentVectorExample">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Mon Mar 09 10:39:51 CST 2026.
+    -->
+    delete from deconstruct_content_vector
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </delete>
+  <insert id="insert" parameterType="com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructContentVector">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Mon Mar 09 10:39:51 CST 2026.
+    -->
+    insert into deconstruct_content_vector (id, content_id, task_id, 
+      source_field, source_path, vector_dimension, 
+      vector_data, text_hash, embedding_model, 
+      segment_index, segment_total, create_time, 
+      update_time, source_text)
+    values (#{id,jdbcType=BIGINT}, #{contentId,jdbcType=BIGINT}, #{taskId,jdbcType=VARCHAR}, 
+      #{sourceField,jdbcType=VARCHAR}, #{sourcePath,jdbcType=VARCHAR}, #{vectorDimension,jdbcType=INTEGER}, 
+      #{vectorData,jdbcType=CHAR}, #{textHash,jdbcType=VARCHAR}, #{embeddingModel,jdbcType=VARCHAR}, 
+      #{segmentIndex,jdbcType=INTEGER}, #{segmentTotal,jdbcType=INTEGER}, #{createTime,jdbcType=TIMESTAMP}, 
+      #{updateTime,jdbcType=TIMESTAMP}, #{sourceText,jdbcType=LONGVARCHAR})
+  </insert>
+  <insert id="insertSelective" parameterType="com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructContentVector">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Mon Mar 09 10:39:51 CST 2026.
+    -->
+    insert into deconstruct_content_vector
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        id,
+      </if>
+      <if test="contentId != null">
+        content_id,
+      </if>
+      <if test="taskId != null">
+        task_id,
+      </if>
+      <if test="sourceField != null">
+        source_field,
+      </if>
+      <if test="sourcePath != null">
+        source_path,
+      </if>
+      <if test="vectorDimension != null">
+        vector_dimension,
+      </if>
+      <if test="vectorData != null">
+        vector_data,
+      </if>
+      <if test="textHash != null">
+        text_hash,
+      </if>
+      <if test="embeddingModel != null">
+        embedding_model,
+      </if>
+      <if test="segmentIndex != null">
+        segment_index,
+      </if>
+      <if test="segmentTotal != null">
+        segment_total,
+      </if>
+      <if test="createTime != null">
+        create_time,
+      </if>
+      <if test="updateTime != null">
+        update_time,
+      </if>
+      <if test="sourceText != null">
+        source_text,
+      </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="taskId != null">
+        #{taskId,jdbcType=VARCHAR},
+      </if>
+      <if test="sourceField != null">
+        #{sourceField,jdbcType=VARCHAR},
+      </if>
+      <if test="sourcePath != null">
+        #{sourcePath,jdbcType=VARCHAR},
+      </if>
+      <if test="vectorDimension != null">
+        #{vectorDimension,jdbcType=INTEGER},
+      </if>
+      <if test="vectorData != null">
+        #{vectorData,jdbcType=CHAR},
+      </if>
+      <if test="textHash != null">
+        #{textHash,jdbcType=VARCHAR},
+      </if>
+      <if test="embeddingModel != null">
+        #{embeddingModel,jdbcType=VARCHAR},
+      </if>
+      <if test="segmentIndex != null">
+        #{segmentIndex,jdbcType=INTEGER},
+      </if>
+      <if test="segmentTotal != null">
+        #{segmentTotal,jdbcType=INTEGER},
+      </if>
+      <if test="createTime != null">
+        #{createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="updateTime != null">
+        #{updateTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="sourceText != null">
+        #{sourceText,jdbcType=LONGVARCHAR},
+      </if>
+    </trim>
+  </insert>
+  <select id="countByExample" parameterType="com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructContentVectorExample" resultType="java.lang.Long">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Mon Mar 09 10:39:51 CST 2026.
+    -->
+    select count(*) from deconstruct_content_vector
+    <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 Mon Mar 09 10:39:51 CST 2026.
+    -->
+    update deconstruct_content_vector
+    <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.taskId != null">
+        task_id = #{record.taskId,jdbcType=VARCHAR},
+      </if>
+      <if test="record.sourceField != null">
+        source_field = #{record.sourceField,jdbcType=VARCHAR},
+      </if>
+      <if test="record.sourcePath != null">
+        source_path = #{record.sourcePath,jdbcType=VARCHAR},
+      </if>
+      <if test="record.vectorDimension != null">
+        vector_dimension = #{record.vectorDimension,jdbcType=INTEGER},
+      </if>
+      <if test="record.vectorData != null">
+        vector_data = #{record.vectorData,jdbcType=CHAR},
+      </if>
+      <if test="record.textHash != null">
+        text_hash = #{record.textHash,jdbcType=VARCHAR},
+      </if>
+      <if test="record.embeddingModel != null">
+        embedding_model = #{record.embeddingModel,jdbcType=VARCHAR},
+      </if>
+      <if test="record.segmentIndex != null">
+        segment_index = #{record.segmentIndex,jdbcType=INTEGER},
+      </if>
+      <if test="record.segmentTotal != null">
+        segment_total = #{record.segmentTotal,jdbcType=INTEGER},
+      </if>
+      <if test="record.createTime != null">
+        create_time = #{record.createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="record.updateTime != null">
+        update_time = #{record.updateTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="record.sourceText != null">
+        source_text = #{record.sourceText,jdbcType=LONGVARCHAR},
+      </if>
+    </set>
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByExampleWithBLOBs" parameterType="map">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Mon Mar 09 10:39:51 CST 2026.
+    -->
+    update deconstruct_content_vector
+    set id = #{record.id,jdbcType=BIGINT},
+      content_id = #{record.contentId,jdbcType=BIGINT},
+      task_id = #{record.taskId,jdbcType=VARCHAR},
+      source_field = #{record.sourceField,jdbcType=VARCHAR},
+      source_path = #{record.sourcePath,jdbcType=VARCHAR},
+      vector_dimension = #{record.vectorDimension,jdbcType=INTEGER},
+      vector_data = #{record.vectorData,jdbcType=CHAR},
+      text_hash = #{record.textHash,jdbcType=VARCHAR},
+      embedding_model = #{record.embeddingModel,jdbcType=VARCHAR},
+      segment_index = #{record.segmentIndex,jdbcType=INTEGER},
+      segment_total = #{record.segmentTotal,jdbcType=INTEGER},
+      create_time = #{record.createTime,jdbcType=TIMESTAMP},
+      update_time = #{record.updateTime,jdbcType=TIMESTAMP},
+      source_text = #{record.sourceText,jdbcType=LONGVARCHAR}
+    <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 Mon Mar 09 10:39:51 CST 2026.
+    -->
+    update deconstruct_content_vector
+    set id = #{record.id,jdbcType=BIGINT},
+      content_id = #{record.contentId,jdbcType=BIGINT},
+      task_id = #{record.taskId,jdbcType=VARCHAR},
+      source_field = #{record.sourceField,jdbcType=VARCHAR},
+      source_path = #{record.sourcePath,jdbcType=VARCHAR},
+      vector_dimension = #{record.vectorDimension,jdbcType=INTEGER},
+      vector_data = #{record.vectorData,jdbcType=CHAR},
+      text_hash = #{record.textHash,jdbcType=VARCHAR},
+      embedding_model = #{record.embeddingModel,jdbcType=VARCHAR},
+      segment_index = #{record.segmentIndex,jdbcType=INTEGER},
+      segment_total = #{record.segmentTotal,jdbcType=INTEGER},
+      create_time = #{record.createTime,jdbcType=TIMESTAMP},
+      update_time = #{record.updateTime,jdbcType=TIMESTAMP}
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByPrimaryKeySelective" parameterType="com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructContentVector">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Mon Mar 09 10:39:51 CST 2026.
+    -->
+    update deconstruct_content_vector
+    <set>
+      <if test="contentId != null">
+        content_id = #{contentId,jdbcType=BIGINT},
+      </if>
+      <if test="taskId != null">
+        task_id = #{taskId,jdbcType=VARCHAR},
+      </if>
+      <if test="sourceField != null">
+        source_field = #{sourceField,jdbcType=VARCHAR},
+      </if>
+      <if test="sourcePath != null">
+        source_path = #{sourcePath,jdbcType=VARCHAR},
+      </if>
+      <if test="vectorDimension != null">
+        vector_dimension = #{vectorDimension,jdbcType=INTEGER},
+      </if>
+      <if test="vectorData != null">
+        vector_data = #{vectorData,jdbcType=CHAR},
+      </if>
+      <if test="textHash != null">
+        text_hash = #{textHash,jdbcType=VARCHAR},
+      </if>
+      <if test="embeddingModel != null">
+        embedding_model = #{embeddingModel,jdbcType=VARCHAR},
+      </if>
+      <if test="segmentIndex != null">
+        segment_index = #{segmentIndex,jdbcType=INTEGER},
+      </if>
+      <if test="segmentTotal != null">
+        segment_total = #{segmentTotal,jdbcType=INTEGER},
+      </if>
+      <if test="createTime != null">
+        create_time = #{createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="updateTime != null">
+        update_time = #{updateTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="sourceText != null">
+        source_text = #{sourceText,jdbcType=LONGVARCHAR},
+      </if>
+    </set>
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+  <update id="updateByPrimaryKeyWithBLOBs" parameterType="com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructContentVector">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Mon Mar 09 10:39:51 CST 2026.
+    -->
+    update deconstruct_content_vector
+    set content_id = #{contentId,jdbcType=BIGINT},
+      task_id = #{taskId,jdbcType=VARCHAR},
+      source_field = #{sourceField,jdbcType=VARCHAR},
+      source_path = #{sourcePath,jdbcType=VARCHAR},
+      vector_dimension = #{vectorDimension,jdbcType=INTEGER},
+      vector_data = #{vectorData,jdbcType=CHAR},
+      text_hash = #{textHash,jdbcType=VARCHAR},
+      embedding_model = #{embeddingModel,jdbcType=VARCHAR},
+      segment_index = #{segmentIndex,jdbcType=INTEGER},
+      segment_total = #{segmentTotal,jdbcType=INTEGER},
+      create_time = #{createTime,jdbcType=TIMESTAMP},
+      update_time = #{updateTime,jdbcType=TIMESTAMP},
+      source_text = #{sourceText,jdbcType=LONGVARCHAR}
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructContentVector">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Mon Mar 09 10:39:51 CST 2026.
+    -->
+    update deconstruct_content_vector
+    set content_id = #{contentId,jdbcType=BIGINT},
+      task_id = #{taskId,jdbcType=VARCHAR},
+      source_field = #{sourceField,jdbcType=VARCHAR},
+      source_path = #{sourcePath,jdbcType=VARCHAR},
+      vector_dimension = #{vectorDimension,jdbcType=INTEGER},
+      vector_data = #{vectorData,jdbcType=CHAR},
+      text_hash = #{textHash,jdbcType=VARCHAR},
+      embedding_model = #{embeddingModel,jdbcType=VARCHAR},
+      segment_index = #{segmentIndex,jdbcType=INTEGER},
+      segment_total = #{segmentTotal,jdbcType=INTEGER},
+      create_time = #{createTime,jdbcType=TIMESTAMP},
+      update_time = #{updateTime,jdbcType=TIMESTAMP}
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+</mapper>

+ 461 - 0
core/src/main/resources/mapper/videoVector/deconstruct/DeconstructVectorConfigMapper.xml

@@ -0,0 +1,461 @@
+<?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.videoVector.dao.mapper.videoVector.deconstruct.DeconstructVectorConfigMapper">
+  <resultMap id="BaseResultMap" type="com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructVectorConfig">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Mon Mar 09 10:39:51 CST 2026.
+    -->
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="config_code" jdbcType="VARCHAR" property="configCode" />
+    <result column="config_name" jdbcType="VARCHAR" property="configName" />
+    <result column="biz_type" jdbcType="TINYINT" property="bizType" />
+    <result column="content_type" jdbcType="TINYINT" property="contentType" />
+    <result column="source_field" jdbcType="VARCHAR" property="sourceField" />
+    <result column="source_path" jdbcType="VARCHAR" property="sourcePath" />
+    <result column="extract_rule" jdbcType="VARCHAR" property="extractRule" />
+    <result column="embedding_model" jdbcType="VARCHAR" property="embeddingModel" />
+    <result column="max_length" jdbcType="INTEGER" property="maxLength" />
+    <result column="enable_segment" jdbcType="TINYINT" property="enableSegment" />
+    <result column="segment_size" jdbcType="INTEGER" property="segmentSize" />
+    <result column="priority" jdbcType="INTEGER" property="priority" />
+    <result column="enabled" jdbcType="TINYINT" property="enabled" />
+    <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
+    <result column="update_time" jdbcType="TIMESTAMP" 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 Mon Mar 09 10:39:51 CST 2026.
+    -->
+    <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 Mon Mar 09 10:39:51 CST 2026.
+    -->
+    <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 Mon Mar 09 10:39:51 CST 2026.
+    -->
+    id, config_code, config_name, biz_type, content_type, source_field, source_path, 
+    extract_rule, embedding_model, max_length, enable_segment, segment_size, priority, 
+    enabled, create_time, update_time
+  </sql>
+  <select id="selectByExample" parameterType="com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructVectorConfigExample" resultMap="BaseResultMap">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Mon Mar 09 10:39:51 CST 2026.
+    -->
+    select
+    <if test="distinct">
+      distinct
+    </if>
+    <include refid="Base_Column_List" />
+    from deconstruct_vector_config
+    <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 Mon Mar 09 10:39:51 CST 2026.
+    -->
+    select 
+    <include refid="Base_Column_List" />
+    from deconstruct_vector_config
+    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 Mon Mar 09 10:39:51 CST 2026.
+    -->
+    delete from deconstruct_vector_config
+    where id = #{id,jdbcType=BIGINT}
+  </delete>
+  <delete id="deleteByExample" parameterType="com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructVectorConfigExample">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Mon Mar 09 10:39:51 CST 2026.
+    -->
+    delete from deconstruct_vector_config
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </delete>
+  <insert id="insert" parameterType="com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructVectorConfig">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Mon Mar 09 10:39:51 CST 2026.
+    -->
+    insert into deconstruct_vector_config (id, config_code, config_name, 
+      biz_type, content_type, source_field, 
+      source_path, extract_rule, embedding_model, 
+      max_length, enable_segment, segment_size, 
+      priority, enabled, create_time, 
+      update_time)
+    values (#{id,jdbcType=BIGINT}, #{configCode,jdbcType=VARCHAR}, #{configName,jdbcType=VARCHAR}, 
+      #{bizType,jdbcType=TINYINT}, #{contentType,jdbcType=TINYINT}, #{sourceField,jdbcType=VARCHAR}, 
+      #{sourcePath,jdbcType=VARCHAR}, #{extractRule,jdbcType=VARCHAR}, #{embeddingModel,jdbcType=VARCHAR}, 
+      #{maxLength,jdbcType=INTEGER}, #{enableSegment,jdbcType=TINYINT}, #{segmentSize,jdbcType=INTEGER}, 
+      #{priority,jdbcType=INTEGER}, #{enabled,jdbcType=TINYINT}, #{createTime,jdbcType=TIMESTAMP}, 
+      #{updateTime,jdbcType=TIMESTAMP})
+  </insert>
+  <insert id="insertSelective" parameterType="com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructVectorConfig">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Mon Mar 09 10:39:51 CST 2026.
+    -->
+    insert into deconstruct_vector_config
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        id,
+      </if>
+      <if test="configCode != null">
+        config_code,
+      </if>
+      <if test="configName != null">
+        config_name,
+      </if>
+      <if test="bizType != null">
+        biz_type,
+      </if>
+      <if test="contentType != null">
+        content_type,
+      </if>
+      <if test="sourceField != null">
+        source_field,
+      </if>
+      <if test="sourcePath != null">
+        source_path,
+      </if>
+      <if test="extractRule != null">
+        extract_rule,
+      </if>
+      <if test="embeddingModel != null">
+        embedding_model,
+      </if>
+      <if test="maxLength != null">
+        max_length,
+      </if>
+      <if test="enableSegment != null">
+        enable_segment,
+      </if>
+      <if test="segmentSize != null">
+        segment_size,
+      </if>
+      <if test="priority != null">
+        priority,
+      </if>
+      <if test="enabled != null">
+        enabled,
+      </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="configCode != null">
+        #{configCode,jdbcType=VARCHAR},
+      </if>
+      <if test="configName != null">
+        #{configName,jdbcType=VARCHAR},
+      </if>
+      <if test="bizType != null">
+        #{bizType,jdbcType=TINYINT},
+      </if>
+      <if test="contentType != null">
+        #{contentType,jdbcType=TINYINT},
+      </if>
+      <if test="sourceField != null">
+        #{sourceField,jdbcType=VARCHAR},
+      </if>
+      <if test="sourcePath != null">
+        #{sourcePath,jdbcType=VARCHAR},
+      </if>
+      <if test="extractRule != null">
+        #{extractRule,jdbcType=VARCHAR},
+      </if>
+      <if test="embeddingModel != null">
+        #{embeddingModel,jdbcType=VARCHAR},
+      </if>
+      <if test="maxLength != null">
+        #{maxLength,jdbcType=INTEGER},
+      </if>
+      <if test="enableSegment != null">
+        #{enableSegment,jdbcType=TINYINT},
+      </if>
+      <if test="segmentSize != null">
+        #{segmentSize,jdbcType=INTEGER},
+      </if>
+      <if test="priority != null">
+        #{priority,jdbcType=INTEGER},
+      </if>
+      <if test="enabled != null">
+        #{enabled,jdbcType=TINYINT},
+      </if>
+      <if test="createTime != null">
+        #{createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="updateTime != null">
+        #{updateTime,jdbcType=TIMESTAMP},
+      </if>
+    </trim>
+  </insert>
+  <select id="countByExample" parameterType="com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructVectorConfigExample" resultType="java.lang.Long">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Mon Mar 09 10:39:51 CST 2026.
+    -->
+    select count(*) from deconstruct_vector_config
+    <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 Mon Mar 09 10:39:51 CST 2026.
+    -->
+    update deconstruct_vector_config
+    <set>
+      <if test="record.id != null">
+        id = #{record.id,jdbcType=BIGINT},
+      </if>
+      <if test="record.configCode != null">
+        config_code = #{record.configCode,jdbcType=VARCHAR},
+      </if>
+      <if test="record.configName != null">
+        config_name = #{record.configName,jdbcType=VARCHAR},
+      </if>
+      <if test="record.bizType != null">
+        biz_type = #{record.bizType,jdbcType=TINYINT},
+      </if>
+      <if test="record.contentType != null">
+        content_type = #{record.contentType,jdbcType=TINYINT},
+      </if>
+      <if test="record.sourceField != null">
+        source_field = #{record.sourceField,jdbcType=VARCHAR},
+      </if>
+      <if test="record.sourcePath != null">
+        source_path = #{record.sourcePath,jdbcType=VARCHAR},
+      </if>
+      <if test="record.extractRule != null">
+        extract_rule = #{record.extractRule,jdbcType=VARCHAR},
+      </if>
+      <if test="record.embeddingModel != null">
+        embedding_model = #{record.embeddingModel,jdbcType=VARCHAR},
+      </if>
+      <if test="record.maxLength != null">
+        max_length = #{record.maxLength,jdbcType=INTEGER},
+      </if>
+      <if test="record.enableSegment != null">
+        enable_segment = #{record.enableSegment,jdbcType=TINYINT},
+      </if>
+      <if test="record.segmentSize != null">
+        segment_size = #{record.segmentSize,jdbcType=INTEGER},
+      </if>
+      <if test="record.priority != null">
+        priority = #{record.priority,jdbcType=INTEGER},
+      </if>
+      <if test="record.enabled != null">
+        enabled = #{record.enabled,jdbcType=TINYINT},
+      </if>
+      <if test="record.createTime != null">
+        create_time = #{record.createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="record.updateTime != null">
+        update_time = #{record.updateTime,jdbcType=TIMESTAMP},
+      </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 Mon Mar 09 10:39:51 CST 2026.
+    -->
+    update deconstruct_vector_config
+    set id = #{record.id,jdbcType=BIGINT},
+      config_code = #{record.configCode,jdbcType=VARCHAR},
+      config_name = #{record.configName,jdbcType=VARCHAR},
+      biz_type = #{record.bizType,jdbcType=TINYINT},
+      content_type = #{record.contentType,jdbcType=TINYINT},
+      source_field = #{record.sourceField,jdbcType=VARCHAR},
+      source_path = #{record.sourcePath,jdbcType=VARCHAR},
+      extract_rule = #{record.extractRule,jdbcType=VARCHAR},
+      embedding_model = #{record.embeddingModel,jdbcType=VARCHAR},
+      max_length = #{record.maxLength,jdbcType=INTEGER},
+      enable_segment = #{record.enableSegment,jdbcType=TINYINT},
+      segment_size = #{record.segmentSize,jdbcType=INTEGER},
+      priority = #{record.priority,jdbcType=INTEGER},
+      enabled = #{record.enabled,jdbcType=TINYINT},
+      create_time = #{record.createTime,jdbcType=TIMESTAMP},
+      update_time = #{record.updateTime,jdbcType=TIMESTAMP}
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByPrimaryKeySelective" parameterType="com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructVectorConfig">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Mon Mar 09 10:39:51 CST 2026.
+    -->
+    update deconstruct_vector_config
+    <set>
+      <if test="configCode != null">
+        config_code = #{configCode,jdbcType=VARCHAR},
+      </if>
+      <if test="configName != null">
+        config_name = #{configName,jdbcType=VARCHAR},
+      </if>
+      <if test="bizType != null">
+        biz_type = #{bizType,jdbcType=TINYINT},
+      </if>
+      <if test="contentType != null">
+        content_type = #{contentType,jdbcType=TINYINT},
+      </if>
+      <if test="sourceField != null">
+        source_field = #{sourceField,jdbcType=VARCHAR},
+      </if>
+      <if test="sourcePath != null">
+        source_path = #{sourcePath,jdbcType=VARCHAR},
+      </if>
+      <if test="extractRule != null">
+        extract_rule = #{extractRule,jdbcType=VARCHAR},
+      </if>
+      <if test="embeddingModel != null">
+        embedding_model = #{embeddingModel,jdbcType=VARCHAR},
+      </if>
+      <if test="maxLength != null">
+        max_length = #{maxLength,jdbcType=INTEGER},
+      </if>
+      <if test="enableSegment != null">
+        enable_segment = #{enableSegment,jdbcType=TINYINT},
+      </if>
+      <if test="segmentSize != null">
+        segment_size = #{segmentSize,jdbcType=INTEGER},
+      </if>
+      <if test="priority != null">
+        priority = #{priority,jdbcType=INTEGER},
+      </if>
+      <if test="enabled != null">
+        enabled = #{enabled,jdbcType=TINYINT},
+      </if>
+      <if test="createTime != null">
+        create_time = #{createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="updateTime != null">
+        update_time = #{updateTime,jdbcType=TIMESTAMP},
+      </if>
+    </set>
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.tzld.videoVector.model.po.videoVector.deconstruct.DeconstructVectorConfig">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+      This element was generated on Mon Mar 09 10:39:51 CST 2026.
+    -->
+    update deconstruct_vector_config
+    set config_code = #{configCode,jdbcType=VARCHAR},
+      config_name = #{configName,jdbcType=VARCHAR},
+      biz_type = #{bizType,jdbcType=TINYINT},
+      content_type = #{contentType,jdbcType=TINYINT},
+      source_field = #{sourceField,jdbcType=VARCHAR},
+      source_path = #{sourcePath,jdbcType=VARCHAR},
+      extract_rule = #{extractRule,jdbcType=VARCHAR},
+      embedding_model = #{embeddingModel,jdbcType=VARCHAR},
+      max_length = #{maxLength,jdbcType=INTEGER},
+      enable_segment = #{enableSegment,jdbcType=TINYINT},
+      segment_size = #{segmentSize,jdbcType=INTEGER},
+      priority = #{priority,jdbcType=INTEGER},
+      enabled = #{enabled,jdbcType=TINYINT},
+      create_time = #{createTime,jdbcType=TIMESTAMP},
+      update_time = #{updateTime,jdbcType=TIMESTAMP}
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+</mapper>

+ 7 - 2
server/src/main/java/com/tzld/videoVector/controller/XxlJobController.java

@@ -14,11 +14,16 @@ public class XxlJobController {
     @Autowired
     private VideoVectorJob videoVectorJob;
 
-    @GetMapping("/spiderTaskJob")
-    public CommonResponse<Void> spiderTaskJob() {
+    @GetMapping("/vectorVideoJob")
+    public CommonResponse<Void> vectorVideoJob() {
         videoVectorJob.vectorVideoJob(null);
         return CommonResponse.success();
     }
 
+    @GetMapping("/retryDeconstructJob")
+    public CommonResponse<Void> retryDeconstructJob() {
+        videoVectorJob.retryDeconstructJob(null);
+        return CommonResponse.success();
+    }
 
 }

+ 3 - 3
server/src/main/resources/application-dev.yml

@@ -5,9 +5,9 @@ spring:
   datasource:
     video-vector:
       driver-class-name: com.mysql.jdbc.Driver
-      jdbc-url: jdbc:mysql://rm-bp13g3ra2f59q49xs.mysql.rds.aliyuncs.com:3306/ai_supply_test?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false
-      username: wqsd
-      password: wqsd@2025
+      jdbc-url: jdbc:mysql://rm-bp17q95335a99272b.mysql.rds.aliyuncs.com:3306/deconstruct-vector?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false
+      username: crawler
+      password: crawler123456@
       type: com.zaxxer.hikari.HikariDataSource
       hikari:
         minimum-idle: 10

+ 3 - 3
server/src/main/resources/application-prod.yml

@@ -5,9 +5,9 @@ spring:
   datasource:
     video-vector:
       driver-class-name: com.mysql.jdbc.Driver
-      jdbc-url: jdbc:mysql://rm-bp13g3ra2f59q49xs.mysql.rds.aliyuncs.com:3306/ai_supply?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false
-      username: wqsd
-      password: wqsd@2025
+      jdbc-url: jdbc:mysql://rm-bp17q95335a99272b.mysql.rds.aliyuncs.com:3306/deconstruct-vector?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false
+      username: crawler
+      password: crawler123456@
       type: com.zaxxer.hikari.HikariDataSource
       hikari:
         minimum-idle: 10

+ 3 - 3
server/src/main/resources/application-test.yml

@@ -5,9 +5,9 @@ spring:
   datasource:
     video-vector:
       driver-class-name: com.mysql.jdbc.Driver
-      jdbc-url: jdbc:mysql://rm-bp13g3ra2f59q49xs.mysql.rds.aliyuncs.com:3306/ai_supply_test?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false
-      username: wqsd
-      password: wqsd@2025
+      jdbc-url: jdbc:mysql://rm-bp17q95335a99272b.mysql.rds.aliyuncs.com:3306/deconstruct-vector?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false
+      username: crawler
+      password: crawler123456@
       type: com.zaxxer.hikari.HikariDataSource
       hikari:
         minimum-idle: 10

+ 1 - 1
server/src/main/resources/application.yml

@@ -59,7 +59,7 @@ eureka:
 logging:
   level:
     # 替换为你的 Mapper 接口所在包路径(根据错误日志中的包名调整)
-    com.tzld.videoVector.dao.mapper.videoVector.spider: DEBUG  # 输出该包下所有 Mapper 的 SQL 日志
+    com.tzld.videoVector.dao.mapper.videoVector.deconstruct: DEBUG  # 输出该包下所有 Mapper 的 SQL 日志
     # 可选:HikariCP 连接池日志(调试连接问题时开启)
     com.zaxxer.hikari: INFO  # 连接池基本信息(避免 DEBUG 级别日志过多)