瀏覽代碼

需求匹配视频任务

wangyunpeng 9 小時之前
父節點
當前提交
30d8ecec2f
共有 21 個文件被更改,包括 5930 次插入44 次删除
  1. 96 0
      core/src/main/java/com/tzld/videoVector/dao/mapper/pgVector/ChannelDemandMatchConfigMapper.java
  2. 96 0
      core/src/main/java/com/tzld/videoVector/dao/mapper/pgVector/ChannelDemandMatchResultMapper.java
  3. 16 0
      core/src/main/java/com/tzld/videoVector/dao/mapper/pgVector/ext/ChannelDemandMatchResultMapperExt.java
  4. 375 0
      core/src/main/java/com/tzld/videoVector/job/ChannelDemandMatchJob.java
  5. 39 39
      core/src/main/java/com/tzld/videoVector/job/VideoVectorJob.java
  6. 28 0
      core/src/main/java/com/tzld/videoVector/model/param/ChannelDemandMatchQueryParam.java
  7. 43 0
      core/src/main/java/com/tzld/videoVector/model/param/RecallVideoScoreParam.java
  8. 310 0
      core/src/main/java/com/tzld/videoVector/model/po/pgVector/ChannelDemandMatchConfig.java
  9. 793 0
      core/src/main/java/com/tzld/videoVector/model/po/pgVector/ChannelDemandMatchConfigExample.java
  10. 896 0
      core/src/main/java/com/tzld/videoVector/model/po/pgVector/ChannelDemandMatchResult.java
  11. 1893 0
      core/src/main/java/com/tzld/videoVector/model/po/pgVector/ChannelDemandMatchResultExample.java
  12. 64 0
      core/src/main/java/com/tzld/videoVector/model/vo/ChannelDemandMatchVO.java
  13. 71 0
      core/src/main/java/com/tzld/videoVector/model/vo/RecallVideoScoreVO.java
  14. 24 0
      core/src/main/java/com/tzld/videoVector/service/VideoSearchService.java
  15. 220 0
      core/src/main/java/com/tzld/videoVector/service/impl/VideoSearchServiceImpl.java
  16. 11 5
      core/src/main/resources/generator/mybatis-pgvector-generator-config.xml
  17. 312 0
      core/src/main/resources/mapper/pgVector/ChannelDemandMatchConfigMapper.xml
  18. 582 0
      core/src/main/resources/mapper/pgVector/ChannelDemandMatchResultMapper.xml
  19. 25 0
      core/src/main/resources/mapper/pgVector/ext/ChannelDemandMatchResultMapperExt.xml
  20. 25 0
      server/src/main/java/com/tzld/videoVector/controller/VideoSearchController.java
  21. 11 0
      server/src/main/java/com/tzld/videoVector/controller/XxlJobController.java

+ 96 - 0
core/src/main/java/com/tzld/videoVector/dao/mapper/pgVector/ChannelDemandMatchConfigMapper.java

@@ -0,0 +1,96 @@
+package com.tzld.videoVector.dao.mapper.pgVector;
+
+import com.tzld.videoVector.model.po.pgVector.ChannelDemandMatchConfig;
+import com.tzld.videoVector.model.po.pgVector.ChannelDemandMatchConfigExample;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+public interface ChannelDemandMatchConfigMapper {
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table channel_demand_match_config
+     *
+     * @mbg.generated
+     */
+    long countByExample(ChannelDemandMatchConfigExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table channel_demand_match_config
+     *
+     * @mbg.generated
+     */
+    int deleteByExample(ChannelDemandMatchConfigExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table channel_demand_match_config
+     *
+     * @mbg.generated
+     */
+    int deleteByPrimaryKey(Long id);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table channel_demand_match_config
+     *
+     * @mbg.generated
+     */
+    int insert(ChannelDemandMatchConfig record);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table channel_demand_match_config
+     *
+     * @mbg.generated
+     */
+    int insertSelective(ChannelDemandMatchConfig record);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table channel_demand_match_config
+     *
+     * @mbg.generated
+     */
+    List<ChannelDemandMatchConfig> selectByExample(ChannelDemandMatchConfigExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table channel_demand_match_config
+     *
+     * @mbg.generated
+     */
+    ChannelDemandMatchConfig selectByPrimaryKey(Long id);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table channel_demand_match_config
+     *
+     * @mbg.generated
+     */
+    int updateByExampleSelective(@Param("record") ChannelDemandMatchConfig record, @Param("example") ChannelDemandMatchConfigExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table channel_demand_match_config
+     *
+     * @mbg.generated
+     */
+    int updateByExample(@Param("record") ChannelDemandMatchConfig record, @Param("example") ChannelDemandMatchConfigExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table channel_demand_match_config
+     *
+     * @mbg.generated
+     */
+    int updateByPrimaryKeySelective(ChannelDemandMatchConfig record);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table channel_demand_match_config
+     *
+     * @mbg.generated
+     */
+    int updateByPrimaryKey(ChannelDemandMatchConfig record);
+}

+ 96 - 0
core/src/main/java/com/tzld/videoVector/dao/mapper/pgVector/ChannelDemandMatchResultMapper.java

@@ -0,0 +1,96 @@
+package com.tzld.videoVector.dao.mapper.pgVector;
+
+import com.tzld.videoVector.model.po.pgVector.ChannelDemandMatchResult;
+import com.tzld.videoVector.model.po.pgVector.ChannelDemandMatchResultExample;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+public interface ChannelDemandMatchResultMapper {
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table channel_demand_match_result
+     *
+     * @mbg.generated
+     */
+    long countByExample(ChannelDemandMatchResultExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table channel_demand_match_result
+     *
+     * @mbg.generated
+     */
+    int deleteByExample(ChannelDemandMatchResultExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table channel_demand_match_result
+     *
+     * @mbg.generated
+     */
+    int deleteByPrimaryKey(Long id);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table channel_demand_match_result
+     *
+     * @mbg.generated
+     */
+    int insert(ChannelDemandMatchResult record);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table channel_demand_match_result
+     *
+     * @mbg.generated
+     */
+    int insertSelective(ChannelDemandMatchResult record);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table channel_demand_match_result
+     *
+     * @mbg.generated
+     */
+    List<ChannelDemandMatchResult> selectByExample(ChannelDemandMatchResultExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table channel_demand_match_result
+     *
+     * @mbg.generated
+     */
+    ChannelDemandMatchResult selectByPrimaryKey(Long id);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table channel_demand_match_result
+     *
+     * @mbg.generated
+     */
+    int updateByExampleSelective(@Param("record") ChannelDemandMatchResult record, @Param("example") ChannelDemandMatchResultExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table channel_demand_match_result
+     *
+     * @mbg.generated
+     */
+    int updateByExample(@Param("record") ChannelDemandMatchResult record, @Param("example") ChannelDemandMatchResultExample example);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table channel_demand_match_result
+     *
+     * @mbg.generated
+     */
+    int updateByPrimaryKeySelective(ChannelDemandMatchResult record);
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table channel_demand_match_result
+     *
+     * @mbg.generated
+     */
+    int updateByPrimaryKey(ChannelDemandMatchResult record);
+}

+ 16 - 0
core/src/main/java/com/tzld/videoVector/dao/mapper/pgVector/ext/ChannelDemandMatchResultMapperExt.java

@@ -0,0 +1,16 @@
+package com.tzld.videoVector.dao.mapper.pgVector.ext;
+
+import com.tzld.videoVector.model.po.pgVector.ChannelDemandMatchResult;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * ChannelDemandMatchResult 自定义操作 Mapper(与 MBG 生成的基础 Mapper 分离)
+ */
+public interface ChannelDemandMatchResultMapperExt {
+
+    /**
+     * 批量插入匹配结果
+     */
+    int batchInsert(@Param("list") List<ChannelDemandMatchResult> list);
+}

+ 375 - 0
core/src/main/java/com/tzld/videoVector/job/ChannelDemandMatchJob.java

@@ -0,0 +1,375 @@
+package com.tzld.videoVector.job;
+
+import com.aliyun.odps.data.Record;
+import com.tzld.videoVector.dao.mapper.pgVector.ChannelDemandMatchConfigMapper;
+import com.tzld.videoVector.dao.mapper.pgVector.ChannelDemandMatchResultMapper;
+import com.tzld.videoVector.dao.mapper.pgVector.ext.ChannelDemandMatchResultMapperExt;
+import com.tzld.videoVector.model.param.RecallVideoScoreParam;
+import com.tzld.videoVector.model.po.pgVector.ChannelDemandMatchConfig;
+import com.tzld.videoVector.model.po.pgVector.ChannelDemandMatchConfigExample;
+import com.tzld.videoVector.model.po.pgVector.ChannelDemandMatchResult;
+import com.tzld.videoVector.model.po.pgVector.ChannelDemandMatchResultExample;
+import com.tzld.videoVector.model.vo.RecallVideoScoreVO;
+import com.tzld.videoVector.service.VideoSearchService;
+import com.tzld.videoVector.util.OdpsUtil;
+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.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * 渠道需求匹配Job
+ * 1. 从配置表读取启用的渠道配置(渠道名称、UV阈值、ROV阈值)
+ * 2. 构造ODPS SQL查询需求数据
+ * 3. 遍历需求,按点类型确定configCode + 用标准化元素作queryText调用recallWithScore
+ * 4. 将匹配结果写入channel_demand_match_result表
+ */
+@Slf4j
+@Component
+public class ChannelDemandMatchJob {
+
+    @Resource
+    private ChannelDemandMatchConfigMapper configMapper;
+
+    @Resource
+    private ChannelDemandMatchResultMapper resultMapper;
+
+    @Resource
+    private ChannelDemandMatchResultMapperExt resultMapperExt;
+
+    @Resource
+    private VideoSearchService videoSearchService;
+
+    /** 需求匹配并发线程数 */
+    private static final int MATCH_THREAD_POOL_SIZE = 5;
+
+    /** 点类型 → 向量配置编码映射 */
+    private static final Map<String, String> POINT_TYPE_CONFIG_CODE_MAP = new HashMap<>();
+    static {
+        POINT_TYPE_CONFIG_CODE_MAP.put("关键点", "VIDEO_KEYPOINT");
+        POINT_TYPE_CONFIG_CODE_MAP.put("灵感点", "VIDEO_INSPIRATION");
+        POINT_TYPE_CONFIG_CODE_MAP.put("目的点", "VIDEO_PURPOSE");
+    }
+
+    /**
+     * 渠道需求匹配任务
+     * param格式: dt=20260508 (可选,不传默认取前一天)
+     */
+    @XxlJob("channelDemandMatchJob")
+    public ReturnT<String> channelDemandMatchJob(String param) {
+        log.info("开始执行渠道需求匹配任务, param: {}", param);
+
+        try {
+            // 1. 解析日期参数
+            String dt = parseDt(param);
+            log.info("数据日期: {}", dt);
+
+            // 2. 读取所有启用的渠道配置
+            List<ChannelDemandMatchConfig> configs = getEnabledConfigs();
+            if (CollectionUtils.isEmpty(configs)) {
+                log.warn("未找到启用的渠道需求匹配配置");
+                return ReturnT.SUCCESS;
+            }
+            log.info("加载 {} 个渠道配置", configs.size());
+
+            AtomicInteger totalDemands = new AtomicInteger(0);
+            AtomicInteger totalMatched = new AtomicInteger(0);
+            AtomicInteger totalFailed = new AtomicInteger(0);
+
+            // 3. 逐个渠道配置处理
+            for (ChannelDemandMatchConfig config : configs) {
+                processChannelConfig(config, dt, totalDemands, totalMatched, totalFailed);
+            }
+
+            log.info("渠道需求匹配任务完成,总需求: {}, 已匹配: {}, 失败: {}",
+                    totalDemands.get(), totalMatched.get(), totalFailed.get());
+            return ReturnT.SUCCESS;
+        } catch (Exception e) {
+            log.error("渠道需求匹配任务执行失败: {}", e.getMessage(), e);
+            return new ReturnT<>(ReturnT.FAIL_CODE, "任务执行失败: " + e.getMessage());
+        }
+    }
+
+    /**
+     * 处理单个渠道配置:查询ODPS需求数据 → 写入待匹配记录 → 逐条匹配
+     */
+    private void processChannelConfig(ChannelDemandMatchConfig config, String dt,
+                                      AtomicInteger totalDemands, AtomicInteger totalMatched, AtomicInteger totalFailed) {
+        String channelName = config.getChannelName();
+        int minUv = config.getMinUv() != null ? config.getMinUv() : 2000;
+        double minRov = config.getMinRov() != null ? config.getMinRov() : 0;
+        int topN = config.getTopN() != null ? config.getTopN() : 10;
+
+        log.info("开始处理渠道: {}, minUv={}, minRov={}, topN={}", channelName, minUv, minRov, topN);
+
+        // 1. 先清理该渠道+日期的历史数据(支持重跑)
+        deleteExistingResults(config.getId(), dt);
+
+        // 2. 构造ODPS SQL并查询需求数据
+        String sql = buildDemandSql(channelName, dt, minUv, minRov);
+        log.info("查询ODPS需求, 渠道: {}, sql长度: {}", channelName, sql.length());
+
+        List<ChannelDemandMatchResult> demandResults = new ArrayList<>();
+
+        OdpsUtil.getOdpsDataStream(sql, record -> {
+            try {
+                ChannelDemandMatchResult result = new ChannelDemandMatchResult();
+                result.setConfigId(config.getId());
+                result.setDt(dt);
+                result.setChannelName(channelName);
+                result.setCrowdSegment(record.getString("人群细分"));
+                result.setDimension(record.getString("维度"));
+                result.setPointType(record.getString("点类型"));
+                result.setStandardElement(record.getString("标准化元素"));
+                result.setCategoryName(record.getString("分类名称"));
+
+                // 统计指标
+                result.setCrowdCount(safeGetInt(record, "人群人数"));
+                result.setVideoCount(safeGetInt(record, "视频量"));
+                result.setVisitUv(safeGetLong(record, "访问uv"));
+                result.setVisitPv(safeGetLong(record, "访问pv"));
+                result.setSharePv(safeGetLong(record, "单层分享pv"));
+                result.setBackflowUv(safeGetLong(record, "拉回uv"));
+                result.setTotalRov(safeGetDouble(record, "总rov"));
+
+                result.setMatchStatus((short) 0); // 待匹配
+
+                synchronized (demandResults) {
+                    demandResults.add(result);
+                }
+            } catch (Exception e) {
+                log.error("解析ODPS需求记录失败: {}", e.getMessage());
+            }
+        });
+
+        log.info("渠道 {} 查询到 {} 条需求", channelName, demandResults.size());
+        totalDemands.addAndGet(demandResults.size());
+
+        if (demandResults.isEmpty()) {
+            return;
+        }
+
+        // 3. 并发执行向量匹配并写入结果
+        ExecutorService executor = Executors.newFixedThreadPool(MATCH_THREAD_POOL_SIZE);
+        for (ChannelDemandMatchResult demand : demandResults) {
+            executor.submit(() -> {
+                try {
+                    matchDemandAndSave(demand, topN);
+                    totalMatched.incrementAndGet();
+                } catch (Exception e) {
+                    log.error("匹配需求失败, pointType={}, element={}: {}",
+                            demand.getPointType(), demand.getStandardElement(), e.getMessage());
+                    // 写入一条失败记录
+                    demand.setMatchStatus((short) 3);
+                    resultMapper.insertSelective(demand);
+                    totalFailed.incrementAndGet();
+                }
+            });
+        }
+        executor.shutdown();
+        try {
+            if (!executor.awaitTermination(30, TimeUnit.MINUTES)) {
+                log.warn("渠道 {} 匹配任务超时,强制终止", channelName);
+                executor.shutdownNow();
+            }
+        } catch (InterruptedException e) {
+            log.error("渠道 {} 匹配任务被中断", channelName);
+            executor.shutdownNow();
+            Thread.currentThread().interrupt();
+        }
+    }
+
+    /**
+     * 对单条需求执行向量匹配,将所有匹配到的视频逐条写入结果表
+     * 每条需求 × 每个匹配视频 = 一行记录
+     */
+    private void matchDemandAndSave(ChannelDemandMatchResult demand, int topN) {
+        String pointType = demand.getPointType();
+        String queryText = demand.getStandardElement();
+
+        if (!StringUtils.hasText(queryText)) {
+            log.warn("标准化元素为空, pointType={}", pointType);
+            demand.setMatchStatus((short) 2); // 无结果
+            resultMapper.insertSelective(demand);
+            return;
+        }
+
+        // 根据点类型确定configCode
+        String configCode = POINT_TYPE_CONFIG_CODE_MAP.getOrDefault(pointType, "VIDEO_TOPIC");
+
+        // 调用recallWithScore
+        RecallVideoScoreParam param = new RecallVideoScoreParam();
+        param.setQueryText(queryText);
+        param.setConfigCode(configCode);
+        param.setTopN(topN);
+
+        RecallVideoScoreVO scoreVO = videoSearchService.recallWithScore(param);
+        if (scoreVO == null || CollectionUtils.isEmpty(scoreVO.getItems())) {
+            log.debug("未匹配到视频, pointType={}, queryText={}", pointType, queryText);
+            demand.setMatchStatus((short) 2); // 无结果
+            resultMapper.insertSelective(demand);
+            return;
+        }
+
+        // 将所有匹配结果收集后批量写入(每条需求对应多个匹配视频,按videoId去重)
+        List<RecallVideoScoreVO.ScoredVideoItem> items = scoreVO.getItems();
+        Set<Long> seenVideoIds = new HashSet<>();
+        List<ChannelDemandMatchResult> batchRows = new ArrayList<>();
+        for (RecallVideoScoreVO.ScoredVideoItem item : items) {
+            // videoId去重:同一条需求下不写入重复的视频
+            if (item.getVideoId() == null || !seenVideoIds.add(item.getVideoId())) {
+                continue;
+            }
+            ChannelDemandMatchResult row = new ChannelDemandMatchResult();
+            // 复制需求维度字段
+            row.setConfigId(demand.getConfigId());
+            row.setDt(demand.getDt());
+            row.setChannelName(demand.getChannelName());
+            row.setCrowdSegment(demand.getCrowdSegment());
+            row.setDimension(demand.getDimension());
+            row.setPointType(demand.getPointType());
+            row.setStandardElement(demand.getStandardElement());
+            row.setCategoryName(demand.getCategoryName());
+            row.setCrowdCount(demand.getCrowdCount());
+            row.setVideoCount(demand.getVideoCount());
+            row.setVisitUv(demand.getVisitUv());
+            row.setVisitPv(demand.getVisitPv());
+            row.setSharePv(demand.getSharePv());
+            row.setBackflowUv(demand.getBackflowUv());
+            row.setTotalRov(demand.getTotalRov());
+            // 填充匹配结果
+            row.setMatchVideoId(item.getVideoId());
+            row.setMatchConfigCode(item.getConfigCode());
+            row.setMatchScore(item.getScore());
+            row.setMatchSim(item.getSim());
+            row.setMatchRov(item.getRov());
+            row.setMatchText(item.getText());
+            row.setMatchStatus((short) 1); // 已匹配
+
+            batchRows.add(row);
+        }
+        if (!batchRows.isEmpty()) {
+            resultMapperExt.batchInsert(batchRows);
+        }
+        log.debug("需求匹配完成, pointType={}, queryText={}, 召回{}条, 去重后写入{}条视频",
+                pointType, queryText, items.size(), batchRows.size());
+    }
+
+    /**
+     * 构造ODPS查询需求SQL
+     */
+    private String buildDemandSql(String channelName, String dt, int minUv, double minRov) {
+        StringBuilder sb = new StringBuilder();
+        sb.append("SELECT 人群细分");
+        sb.append(",CONCAT(CASE WHEN 来源 = '传播' THEN '传播' WHEN 来源 = '增长首层' THEN '增长' END,");
+        sb.append("'的',CASE WHEN 场景 = 'dist' THEN '分发' WHEN 场景 = 'head' THEN '头部' END) AS 维度");
+        sb.append(",点类型");
+        sb.append(",标准化元素");
+        sb.append(",分类名称");
+        sb.append(",CAST(AVG(人群人数) AS BIGINT) AS 人群人数");
+        sb.append(",COUNT(DISTINCT videoid) AS 视频量");
+        sb.append(",SUM(曝光uv) AS 访问uv");
+        sb.append(",SUM(曝光pv) AS 访问pv");
+        sb.append(",SUM(分享pv) AS 单层分享pv");
+        sb.append(",SUM(单层回流uv) AS 拉回uv");
+        sb.append(",(SUM(单层回流uv) + SUM(头部进分发单层回流人数)) / SUM(曝光uv) AS 总rov");
+        sb.append(" FROM loghubods.dwd_channel_element_video_stat_mid");
+        sb.append(" WHERE dt = '").append(dt).append("'");
+        sb.append(" AND 渠道类 = '").append(channelName.replace("'", "''")).append("'");
+        sb.append(" AND 渠道类 IS NOT NULL");
+        sb.append(" AND 人群细分 IS NOT NULL");
+        sb.append(" AND 分类名称 IS NOT NULL");
+        sb.append(" GROUP BY 人群细分");
+        sb.append(",CONCAT(CASE WHEN 来源 = '传播' THEN '传播' WHEN 来源 = '增长首层' THEN '增长' END,");
+        sb.append("'的',CASE WHEN 场景 = 'dist' THEN '分发' WHEN 场景 = 'head' THEN '头部' END)");
+        sb.append(",点类型");
+        sb.append(",标准化元素");
+        sb.append(",分类名称");
+        sb.append(" HAVING 访问uv >= ").append(minUv);
+        if (minRov > 0) {
+            sb.append(" rov >= ").append(minRov);
+        }
+        sb.append(";");
+        return sb.toString();
+    }
+
+    /**
+     * 获取所有启用的渠道配置
+     */
+    private List<ChannelDemandMatchConfig> getEnabledConfigs() {
+        ChannelDemandMatchConfigExample example = new ChannelDemandMatchConfigExample();
+        example.createCriteria().andStatusEqualTo((short) 1);
+        return configMapper.selectByExample(example);
+    }
+
+    /**
+     * 删除已有的结果记录(支持任务重跑)
+     */
+    private void deleteExistingResults(Long configId, String dt) {
+        ChannelDemandMatchResultExample example = new ChannelDemandMatchResultExample();
+        example.createCriteria().andConfigIdEqualTo(configId).andDtEqualTo(dt);
+        int deleted = resultMapper.deleteByExample(example);
+        if (deleted > 0) {
+            log.info("清理历史结果 configId={}, dt={}, 删除 {} 条", configId, dt, deleted);
+        }
+    }
+
+    /**
+     * 解析dt参数,默认取前一天
+     */
+    private String parseDt(String param) {
+        if (StringUtils.hasText(param)) {
+            // 支持 dt=20260508 格式
+            if (param.contains("=")) {
+                String[] parts = param.split("=");
+                if (parts.length == 2 && "dt".equals(parts[0].trim())) {
+                    return parts[1].trim();
+                }
+            }
+            // 直接传日期
+            if (param.matches("\\d{8}")) {
+                return param;
+            }
+        }
+        // 默认前一天
+        return LocalDate.now().minusDays(1).format(DateTimeFormatter.ofPattern("yyyyMMdd"));
+    }
+
+    // ========================== 安全取值工具方法 ==========================
+
+    private Integer safeGetInt(Record record, String fieldName) {
+        try {
+            Long val = record.getBigint(fieldName);
+            return val != null ? val.intValue() : null;
+        } catch (Exception e) {
+            return null;
+        }
+    }
+
+    private Long safeGetLong(Record record, String fieldName) {
+        try {
+            return record.getBigint(fieldName);
+        } catch (Exception e) {
+            return null;
+        }
+    }
+
+    private Double safeGetDouble(Record record, String fieldName) {
+        try {
+            return record.getDouble(fieldName);
+        } catch (Exception e) {
+            return null;
+        }
+    }
+}

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

@@ -112,45 +112,45 @@ public class VideoVectorJob {
             AtomicInteger totalSuccessCount = new AtomicInteger(0);
             AtomicInteger totalFailCount = new AtomicInteger(0);
             int pageNum = 0;
-
-            while (true) {
-                // 2. 分页查询 videoId 列表
-                List<Long> videoIds = queryVideoIdsByPage(pageNum, VectorConstants.PAGE_SIZE);
-                if (CollectionUtils.isEmpty(videoIds)) {
-                    log.info("第 {} 页没有查询到数据,分页查询结束", pageNum);
-                    break;
-                }
-                log.info("第 {} 页查询到 {} 个 videoId", pageNum, videoIds.size());
-
-                // 3. 先进行审核过滤(每页只过滤一次,避免在 config 循环内重复调用)
-                List<Long> auditPassedIds = filterAuditPassedIds(videoIds);
-                if (auditPassedIds.isEmpty()) {
-                    log.info("第 {} 页所有视频均未通过审核,跳过", pageNum);
-                    if (videoIds.size() < VectorConstants.PAGE_SIZE) {
-                        break;
-                    }
-                    pageNum++;
-                    continue;
-                }
-                log.info("第 {} 页审核通过 {} 个视频", pageNum, auditPassedIds.size());
-
-                // 4. 对每个配置并发处理
-                ExecutorService configExecutor = Executors.newFixedThreadPool(configs.size());
-                List<Future<?>> configFutures = new ArrayList<>();
-                for (DeconstructVectorConfig config : configs) {
-                    configFutures.add(configExecutor.submit(() ->
-                            processConfigForRawResult(config, auditPassedIds, totalSuccessCount, totalFailCount)
-                    ));
-                }
-                awaitAndShutdown(configFutures, configExecutor, 10, "配置并发");
-
-                // 如果查询到的数据少于 PAGE_SIZE,说明已经是最后一页
-                if (videoIds.size() < VectorConstants.PAGE_SIZE) {
-                    log.info("第 {} 页数据量 {} 小于 PAGE_SIZE {},分页查询结束", pageNum, videoIds.size(), VectorConstants.PAGE_SIZE);
-                    break;
-                }
-                pageNum++;
-            }
+//
+//            while (true) {
+//                // 2. 分页查询 videoId 列表
+//                List<Long> videoIds = queryVideoIdsByPage(pageNum, VectorConstants.PAGE_SIZE);
+//                if (CollectionUtils.isEmpty(videoIds)) {
+//                    log.info("第 {} 页没有查询到数据,分页查询结束", pageNum);
+//                    break;
+//                }
+//                log.info("第 {} 页查询到 {} 个 videoId", pageNum, videoIds.size());
+//
+//                // 3. 先进行审核过滤(每页只过滤一次,避免在 config 循环内重复调用)
+//                List<Long> auditPassedIds = filterAuditPassedIds(videoIds);
+//                if (auditPassedIds.isEmpty()) {
+//                    log.info("第 {} 页所有视频均未通过审核,跳过", pageNum);
+//                    if (videoIds.size() < VectorConstants.PAGE_SIZE) {
+//                        break;
+//                    }
+//                    pageNum++;
+//                    continue;
+//                }
+//                log.info("第 {} 页审核通过 {} 个视频", pageNum, auditPassedIds.size());
+//
+//                // 4. 对每个配置并发处理
+//                ExecutorService configExecutor = Executors.newFixedThreadPool(configs.size());
+//                List<Future<?>> configFutures = new ArrayList<>();
+//                for (DeconstructVectorConfig config : configs) {
+//                    configFutures.add(configExecutor.submit(() ->
+//                            processConfigForRawResult(config, auditPassedIds, totalSuccessCount, totalFailCount)
+//                    ));
+//                }
+//                awaitAndShutdown(configFutures, configExecutor, 10, "配置并发");
+//
+//                // 如果查询到的数据少于 PAGE_SIZE,说明已经是最后一页
+//                if (videoIds.size() < VectorConstants.PAGE_SIZE) {
+//                    log.info("第 {} 页数据量 {} 小于 PAGE_SIZE {},分页查询结束", pageNum, videoIds.size(), VectorConstants.PAGE_SIZE);
+//                    break;
+//                }
+//                pageNum++;
+//            }
             log.info("视频向量化任务完成,总成功: {}, 总失败: {}, 总页数: {}", totalSuccessCount.get(), totalFailCount.get(), pageNum + 1);
             return ReturnT.SUCCESS;
         } catch (Exception e) {

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

@@ -0,0 +1,28 @@
+package com.tzld.videoVector.model.param;
+
+import lombok.Data;
+
+/**
+ * 渠道需求匹配结果查询参数
+ */
+@Data
+public class ChannelDemandMatchQueryParam {
+
+    /** 数据日期(yyyyMMdd),必填 */
+    private String dt;
+
+    /** 渠道类名称,必填 */
+    private String channelName;
+
+    /** 人群细分,可选 */
+    private String crowdSegment;
+
+    /** 维度(如"传播的分发"),可选 */
+    private String dimension;
+
+    /** 点类型(关键点/灵感点/目的点),可选 */
+    private String pointType;
+
+    /** 标准化元素,可选 */
+    private String standardElement;
+}

+ 43 - 0
core/src/main/java/com/tzld/videoVector/model/param/RecallVideoScoreParam.java

@@ -0,0 +1,43 @@
+package com.tzld.videoVector.model.param;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 召回视频综合评分请求参数
+ * 召回后按 sim + rov 综合分排序返回
+ */
+@Data
+public class RecallVideoScoreParam {
+
+    /** 业务内容ID(帖子ID/视频ID) */
+    private String channelContentId;
+
+    /** 配置编码,用于指定搜索哪个向量配置(如不指定则使用默认配置) */
+    private String configCode;
+
+    /** 查询文本,将被向量化后进行检索 */
+    private String queryText;
+
+    /** 直接传入查询向量(与 queryText 二选一,优先使用此字段) */
+    private List<Float> queryVector;
+
+    /** 返回 Top-N 结果数量,默认 10 */
+    private Integer topN = 10;
+
+    /**
+     * 相关性权重 alpha,取值 0~1,默认 0.6
+     * alpha 越大越看重相关性(sim),越小越看重效率分(rov)
+     */
+    private Double alpha;
+
+    /** ROV 全局历史 P95,默认 0.05 */
+    private Double rovP95;
+
+    /** ROV 全局历史 P5,默认 0.005 */
+    private Double rovP5;
+
+    /** 相似度下界(粗筛阈值),默认 0.7 */
+    private Double simMin;
+}

+ 310 - 0
core/src/main/java/com/tzld/videoVector/model/po/pgVector/ChannelDemandMatchConfig.java

@@ -0,0 +1,310 @@
+package com.tzld.videoVector.model.po.pgVector;
+
+import java.util.Date;
+
+/**
+ * Database Table Remarks:
+ *   渠道需求匹配配置表
+ *
+ * This class was generated by MyBatis Generator.
+ * This class corresponds to the database table channel_demand_match_config
+ */
+public class ChannelDemandMatchConfig {
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column channel_demand_match_config.id
+     *
+     * @mbg.generated
+     */
+    private Long id;
+
+    /**
+     * Database Column Remarks:
+     *   渠道类名称
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column channel_demand_match_config.channel_name
+     *
+     * @mbg.generated
+     */
+    private String channelName;
+
+    /**
+     * Database Column Remarks:
+     *   最低访问UV阈值
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column channel_demand_match_config.min_uv
+     *
+     * @mbg.generated
+     */
+    private Integer minUv;
+
+    /**
+     * Database Column Remarks:
+     *   最低总ROV阈值(0表示不限制)
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column channel_demand_match_config.min_rov
+     *
+     * @mbg.generated
+     */
+    private Double minRov;
+
+    /**
+     * Database Column Remarks:
+     *   每条需求召回TopN
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column channel_demand_match_config.top_n
+     *
+     * @mbg.generated
+     */
+    private Integer topN;
+
+    /**
+     * Database Column Remarks:
+     *   状态: 1-启用 0-停用
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column channel_demand_match_config.status
+     *
+     * @mbg.generated
+     */
+    private Short status;
+
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column channel_demand_match_config.create_time
+     *
+     * @mbg.generated
+     */
+    private Date createTime;
+
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column channel_demand_match_config.update_time
+     *
+     * @mbg.generated
+     */
+    private Date updateTime;
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column channel_demand_match_config.id
+     *
+     * @return the value of channel_demand_match_config.id
+     *
+     * @mbg.generated
+     */
+    public Long getId() {
+        return id;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column channel_demand_match_config.id
+     *
+     * @param id the value for channel_demand_match_config.id
+     *
+     * @mbg.generated
+     */
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column channel_demand_match_config.channel_name
+     *
+     * @return the value of channel_demand_match_config.channel_name
+     *
+     * @mbg.generated
+     */
+    public String getChannelName() {
+        return channelName;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column channel_demand_match_config.channel_name
+     *
+     * @param channelName the value for channel_demand_match_config.channel_name
+     *
+     * @mbg.generated
+     */
+    public void setChannelName(String channelName) {
+        this.channelName = channelName;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column channel_demand_match_config.min_uv
+     *
+     * @return the value of channel_demand_match_config.min_uv
+     *
+     * @mbg.generated
+     */
+    public Integer getMinUv() {
+        return minUv;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column channel_demand_match_config.min_uv
+     *
+     * @param minUv the value for channel_demand_match_config.min_uv
+     *
+     * @mbg.generated
+     */
+    public void setMinUv(Integer minUv) {
+        this.minUv = minUv;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column channel_demand_match_config.min_rov
+     *
+     * @return the value of channel_demand_match_config.min_rov
+     *
+     * @mbg.generated
+     */
+    public Double getMinRov() {
+        return minRov;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column channel_demand_match_config.min_rov
+     *
+     * @param minRov the value for channel_demand_match_config.min_rov
+     *
+     * @mbg.generated
+     */
+    public void setMinRov(Double minRov) {
+        this.minRov = minRov;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column channel_demand_match_config.top_n
+     *
+     * @return the value of channel_demand_match_config.top_n
+     *
+     * @mbg.generated
+     */
+    public Integer getTopN() {
+        return topN;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column channel_demand_match_config.top_n
+     *
+     * @param topN the value for channel_demand_match_config.top_n
+     *
+     * @mbg.generated
+     */
+    public void setTopN(Integer topN) {
+        this.topN = topN;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column channel_demand_match_config.status
+     *
+     * @return the value of channel_demand_match_config.status
+     *
+     * @mbg.generated
+     */
+    public Short getStatus() {
+        return status;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column channel_demand_match_config.status
+     *
+     * @param status the value for channel_demand_match_config.status
+     *
+     * @mbg.generated
+     */
+    public void setStatus(Short status) {
+        this.status = status;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column channel_demand_match_config.create_time
+     *
+     * @return the value of channel_demand_match_config.create_time
+     *
+     * @mbg.generated
+     */
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column channel_demand_match_config.create_time
+     *
+     * @param createTime the value for channel_demand_match_config.create_time
+     *
+     * @mbg.generated
+     */
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column channel_demand_match_config.update_time
+     *
+     * @return the value of channel_demand_match_config.update_time
+     *
+     * @mbg.generated
+     */
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column channel_demand_match_config.update_time
+     *
+     * @param updateTime the value for channel_demand_match_config.update_time
+     *
+     * @mbg.generated
+     */
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table channel_demand_match_config
+     *
+     * @mbg.generated
+     */
+    @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(", channelName=").append(channelName);
+        sb.append(", minUv=").append(minUv);
+        sb.append(", minRov=").append(minRov);
+        sb.append(", topN=").append(topN);
+        sb.append(", status=").append(status);
+        sb.append(", createTime=").append(createTime);
+        sb.append(", updateTime=").append(updateTime);
+        sb.append("]");
+        return sb.toString();
+    }
+}

+ 793 - 0
core/src/main/java/com/tzld/videoVector/model/po/pgVector/ChannelDemandMatchConfigExample.java

@@ -0,0 +1,793 @@
+package com.tzld.videoVector.model.po.pgVector;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+public class ChannelDemandMatchConfigExample {
+    /**
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database table channel_demand_match_config
+     *
+     * @mbg.generated
+     */
+    protected String orderByClause;
+
+    /**
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database table channel_demand_match_config
+     *
+     * @mbg.generated
+     */
+    protected boolean distinct;
+
+    /**
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database table channel_demand_match_config
+     *
+     * @mbg.generated
+     */
+    protected List<Criteria> oredCriteria;
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table channel_demand_match_config
+     *
+     * @mbg.generated
+     */
+    public ChannelDemandMatchConfigExample() {
+        oredCriteria = new ArrayList<Criteria>();
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table channel_demand_match_config
+     *
+     * @mbg.generated
+     */
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table channel_demand_match_config
+     *
+     * @mbg.generated
+     */
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table channel_demand_match_config
+     *
+     * @mbg.generated
+     */
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table channel_demand_match_config
+     *
+     * @mbg.generated
+     */
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table channel_demand_match_config
+     *
+     * @mbg.generated
+     */
+    public List<Criteria> getOredCriteria() {
+        return oredCriteria;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table channel_demand_match_config
+     *
+     * @mbg.generated
+     */
+    public void or(Criteria criteria) {
+        oredCriteria.add(criteria);
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table channel_demand_match_config
+     *
+     * @mbg.generated
+     */
+    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 channel_demand_match_config
+     *
+     * @mbg.generated
+     */
+    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 channel_demand_match_config
+     *
+     * @mbg.generated
+     */
+    protected Criteria createCriteriaInternal() {
+        Criteria criteria = new Criteria();
+        return criteria;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table channel_demand_match_config
+     *
+     * @mbg.generated
+     */
+    public void clear() {
+        oredCriteria.clear();
+        orderByClause = null;
+        distinct = false;
+    }
+
+    /**
+     * This class was generated by MyBatis Generator.
+     * This class corresponds to the database table channel_demand_match_config
+     *
+     * @mbg.generated
+     */
+    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 andChannelNameIsNull() {
+            addCriterion("channel_name is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelNameIsNotNull() {
+            addCriterion("channel_name is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelNameEqualTo(String value) {
+            addCriterion("channel_name =", value, "channelName");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelNameNotEqualTo(String value) {
+            addCriterion("channel_name <>", value, "channelName");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelNameGreaterThan(String value) {
+            addCriterion("channel_name >", value, "channelName");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelNameGreaterThanOrEqualTo(String value) {
+            addCriterion("channel_name >=", value, "channelName");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelNameLessThan(String value) {
+            addCriterion("channel_name <", value, "channelName");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelNameLessThanOrEqualTo(String value) {
+            addCriterion("channel_name <=", value, "channelName");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelNameLike(String value) {
+            addCriterion("channel_name like", value, "channelName");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelNameNotLike(String value) {
+            addCriterion("channel_name not like", value, "channelName");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelNameIn(List<String> values) {
+            addCriterion("channel_name in", values, "channelName");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelNameNotIn(List<String> values) {
+            addCriterion("channel_name not in", values, "channelName");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelNameBetween(String value1, String value2) {
+            addCriterion("channel_name between", value1, value2, "channelName");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelNameNotBetween(String value1, String value2) {
+            addCriterion("channel_name not between", value1, value2, "channelName");
+            return (Criteria) this;
+        }
+
+        public Criteria andMinUvIsNull() {
+            addCriterion("min_uv is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMinUvIsNotNull() {
+            addCriterion("min_uv is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMinUvEqualTo(Integer value) {
+            addCriterion("min_uv =", value, "minUv");
+            return (Criteria) this;
+        }
+
+        public Criteria andMinUvNotEqualTo(Integer value) {
+            addCriterion("min_uv <>", value, "minUv");
+            return (Criteria) this;
+        }
+
+        public Criteria andMinUvGreaterThan(Integer value) {
+            addCriterion("min_uv >", value, "minUv");
+            return (Criteria) this;
+        }
+
+        public Criteria andMinUvGreaterThanOrEqualTo(Integer value) {
+            addCriterion("min_uv >=", value, "minUv");
+            return (Criteria) this;
+        }
+
+        public Criteria andMinUvLessThan(Integer value) {
+            addCriterion("min_uv <", value, "minUv");
+            return (Criteria) this;
+        }
+
+        public Criteria andMinUvLessThanOrEqualTo(Integer value) {
+            addCriterion("min_uv <=", value, "minUv");
+            return (Criteria) this;
+        }
+
+        public Criteria andMinUvIn(List<Integer> values) {
+            addCriterion("min_uv in", values, "minUv");
+            return (Criteria) this;
+        }
+
+        public Criteria andMinUvNotIn(List<Integer> values) {
+            addCriterion("min_uv not in", values, "minUv");
+            return (Criteria) this;
+        }
+
+        public Criteria andMinUvBetween(Integer value1, Integer value2) {
+            addCriterion("min_uv between", value1, value2, "minUv");
+            return (Criteria) this;
+        }
+
+        public Criteria andMinUvNotBetween(Integer value1, Integer value2) {
+            addCriterion("min_uv not between", value1, value2, "minUv");
+            return (Criteria) this;
+        }
+
+        public Criteria andMinRovIsNull() {
+            addCriterion("min_rov is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMinRovIsNotNull() {
+            addCriterion("min_rov is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMinRovEqualTo(Double value) {
+            addCriterion("min_rov =", value, "minRov");
+            return (Criteria) this;
+        }
+
+        public Criteria andMinRovNotEqualTo(Double value) {
+            addCriterion("min_rov <>", value, "minRov");
+            return (Criteria) this;
+        }
+
+        public Criteria andMinRovGreaterThan(Double value) {
+            addCriterion("min_rov >", value, "minRov");
+            return (Criteria) this;
+        }
+
+        public Criteria andMinRovGreaterThanOrEqualTo(Double value) {
+            addCriterion("min_rov >=", value, "minRov");
+            return (Criteria) this;
+        }
+
+        public Criteria andMinRovLessThan(Double value) {
+            addCriterion("min_rov <", value, "minRov");
+            return (Criteria) this;
+        }
+
+        public Criteria andMinRovLessThanOrEqualTo(Double value) {
+            addCriterion("min_rov <=", value, "minRov");
+            return (Criteria) this;
+        }
+
+        public Criteria andMinRovIn(List<Double> values) {
+            addCriterion("min_rov in", values, "minRov");
+            return (Criteria) this;
+        }
+
+        public Criteria andMinRovNotIn(List<Double> values) {
+            addCriterion("min_rov not in", values, "minRov");
+            return (Criteria) this;
+        }
+
+        public Criteria andMinRovBetween(Double value1, Double value2) {
+            addCriterion("min_rov between", value1, value2, "minRov");
+            return (Criteria) this;
+        }
+
+        public Criteria andMinRovNotBetween(Double value1, Double value2) {
+            addCriterion("min_rov not between", value1, value2, "minRov");
+            return (Criteria) this;
+        }
+
+        public Criteria andTopNIsNull() {
+            addCriterion("top_n is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTopNIsNotNull() {
+            addCriterion("top_n is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTopNEqualTo(Integer value) {
+            addCriterion("top_n =", value, "topN");
+            return (Criteria) this;
+        }
+
+        public Criteria andTopNNotEqualTo(Integer value) {
+            addCriterion("top_n <>", value, "topN");
+            return (Criteria) this;
+        }
+
+        public Criteria andTopNGreaterThan(Integer value) {
+            addCriterion("top_n >", value, "topN");
+            return (Criteria) this;
+        }
+
+        public Criteria andTopNGreaterThanOrEqualTo(Integer value) {
+            addCriterion("top_n >=", value, "topN");
+            return (Criteria) this;
+        }
+
+        public Criteria andTopNLessThan(Integer value) {
+            addCriterion("top_n <", value, "topN");
+            return (Criteria) this;
+        }
+
+        public Criteria andTopNLessThanOrEqualTo(Integer value) {
+            addCriterion("top_n <=", value, "topN");
+            return (Criteria) this;
+        }
+
+        public Criteria andTopNIn(List<Integer> values) {
+            addCriterion("top_n in", values, "topN");
+            return (Criteria) this;
+        }
+
+        public Criteria andTopNNotIn(List<Integer> values) {
+            addCriterion("top_n not in", values, "topN");
+            return (Criteria) this;
+        }
+
+        public Criteria andTopNBetween(Integer value1, Integer value2) {
+            addCriterion("top_n between", value1, value2, "topN");
+            return (Criteria) this;
+        }
+
+        public Criteria andTopNNotBetween(Integer value1, Integer value2) {
+            addCriterion("top_n not between", value1, value2, "topN");
+            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(Short value) {
+            addCriterion("\"status\" =", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusNotEqualTo(Short value) {
+            addCriterion("\"status\" <>", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusGreaterThan(Short value) {
+            addCriterion("\"status\" >", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusGreaterThanOrEqualTo(Short value) {
+            addCriterion("\"status\" >=", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusLessThan(Short value) {
+            addCriterion("\"status\" <", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusLessThanOrEqualTo(Short value) {
+            addCriterion("\"status\" <=", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusIn(List<Short> values) {
+            addCriterion("\"status\" in", values, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusNotIn(List<Short> values) {
+            addCriterion("\"status\" not in", values, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusBetween(Short value1, Short value2) {
+            addCriterion("\"status\" between", value1, value2, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusNotBetween(Short value1, Short value2) {
+            addCriterion("\"status\" not between", value1, value2, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIsNull() {
+            addCriterion("create_time is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIsNotNull() {
+            addCriterion("create_time is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeEqualTo(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 channel_demand_match_config
+     *
+     * @mbg.generated do_not_delete_during_merge
+     */
+    public static class Criteria extends GeneratedCriteria {
+
+        protected Criteria() {
+            super();
+        }
+    }
+
+    /**
+     * This class was generated by MyBatis Generator.
+     * This class corresponds to the database table channel_demand_match_config
+     *
+     * @mbg.generated
+     */
+    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);
+        }
+    }
+}

+ 896 - 0
core/src/main/java/com/tzld/videoVector/model/po/pgVector/ChannelDemandMatchResult.java

@@ -0,0 +1,896 @@
+package com.tzld.videoVector.model.po.pgVector;
+
+import java.util.Date;
+
+/**
+ * Database Table Remarks:
+ *   渠道需求匹配结果表(需求+视频匹配)
+ *
+ * This class was generated by MyBatis Generator.
+ * This class corresponds to the database table channel_demand_match_result
+ */
+public class ChannelDemandMatchResult {
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column channel_demand_match_result.id
+     *
+     * @mbg.generated
+     */
+    private Long id;
+
+    /**
+     * Database Column Remarks:
+     *   关联配置表ID
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column channel_demand_match_result.config_id
+     *
+     * @mbg.generated
+     */
+    private Long configId;
+
+    /**
+     * Database Column Remarks:
+     *   数据日期(yyyyMMdd)
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column channel_demand_match_result.dt
+     *
+     * @mbg.generated
+     */
+    private String dt;
+
+    /**
+     * Database Column Remarks:
+     *   渠道类
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column channel_demand_match_result.channel_name
+     *
+     * @mbg.generated
+     */
+    private String channelName;
+
+    /**
+     * Database Column Remarks:
+     *   人群细分
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column channel_demand_match_result.crowd_segment
+     *
+     * @mbg.generated
+     */
+    private String crowdSegment;
+
+    /**
+     * Database Column Remarks:
+     *   维度
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column channel_demand_match_result.dimension
+     *
+     * @mbg.generated
+     */
+    private String dimension;
+
+    /**
+     * Database Column Remarks:
+     *   点类型(关键点/灵感点/目的点)
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column channel_demand_match_result.point_type
+     *
+     * @mbg.generated
+     */
+    private String pointType;
+
+    /**
+     * Database Column Remarks:
+     *   标准化元素(搜索词)
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column channel_demand_match_result.standard_element
+     *
+     * @mbg.generated
+     */
+    private String standardElement;
+
+    /**
+     * Database Column Remarks:
+     *   分类名称
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column channel_demand_match_result.category_name
+     *
+     * @mbg.generated
+     */
+    private String categoryName;
+
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column channel_demand_match_result.crowd_count
+     *
+     * @mbg.generated
+     */
+    private Integer crowdCount;
+
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column channel_demand_match_result.video_count
+     *
+     * @mbg.generated
+     */
+    private Integer videoCount;
+
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column channel_demand_match_result.visit_uv
+     *
+     * @mbg.generated
+     */
+    private Long visitUv;
+
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column channel_demand_match_result.visit_pv
+     *
+     * @mbg.generated
+     */
+    private Long visitPv;
+
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column channel_demand_match_result.share_pv
+     *
+     * @mbg.generated
+     */
+    private Long sharePv;
+
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column channel_demand_match_result.backflow_uv
+     *
+     * @mbg.generated
+     */
+    private Long backflowUv;
+
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column channel_demand_match_result.total_rov
+     *
+     * @mbg.generated
+     */
+    private Double totalRov;
+
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column channel_demand_match_result.match_video_id
+     *
+     * @mbg.generated
+     */
+    private Long matchVideoId;
+
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column channel_demand_match_result.match_config_code
+     *
+     * @mbg.generated
+     */
+    private String matchConfigCode;
+
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column channel_demand_match_result.match_score
+     *
+     * @mbg.generated
+     */
+    private Double matchScore;
+
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column channel_demand_match_result.match_sim
+     *
+     * @mbg.generated
+     */
+    private Double matchSim;
+
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column channel_demand_match_result.match_rov
+     *
+     * @mbg.generated
+     */
+    private Double matchRov;
+
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column channel_demand_match_result.match_text
+     *
+     * @mbg.generated
+     */
+    private String matchText;
+
+    /**
+     * Database Column Remarks:
+     *   0-待匹配 1-已匹配 2-无结果 3-匹配失败
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column channel_demand_match_result.match_status
+     *
+     * @mbg.generated
+     */
+    private Short matchStatus;
+
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column channel_demand_match_result.create_time
+     *
+     * @mbg.generated
+     */
+    private Date createTime;
+
+    /**
+     *
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column channel_demand_match_result.update_time
+     *
+     * @mbg.generated
+     */
+    private Date updateTime;
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column channel_demand_match_result.id
+     *
+     * @return the value of channel_demand_match_result.id
+     *
+     * @mbg.generated
+     */
+    public Long getId() {
+        return id;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column channel_demand_match_result.id
+     *
+     * @param id the value for channel_demand_match_result.id
+     *
+     * @mbg.generated
+     */
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column channel_demand_match_result.config_id
+     *
+     * @return the value of channel_demand_match_result.config_id
+     *
+     * @mbg.generated
+     */
+    public Long getConfigId() {
+        return configId;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column channel_demand_match_result.config_id
+     *
+     * @param configId the value for channel_demand_match_result.config_id
+     *
+     * @mbg.generated
+     */
+    public void setConfigId(Long configId) {
+        this.configId = configId;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column channel_demand_match_result.dt
+     *
+     * @return the value of channel_demand_match_result.dt
+     *
+     * @mbg.generated
+     */
+    public String getDt() {
+        return dt;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column channel_demand_match_result.dt
+     *
+     * @param dt the value for channel_demand_match_result.dt
+     *
+     * @mbg.generated
+     */
+    public void setDt(String dt) {
+        this.dt = dt;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column channel_demand_match_result.channel_name
+     *
+     * @return the value of channel_demand_match_result.channel_name
+     *
+     * @mbg.generated
+     */
+    public String getChannelName() {
+        return channelName;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column channel_demand_match_result.channel_name
+     *
+     * @param channelName the value for channel_demand_match_result.channel_name
+     *
+     * @mbg.generated
+     */
+    public void setChannelName(String channelName) {
+        this.channelName = channelName;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column channel_demand_match_result.crowd_segment
+     *
+     * @return the value of channel_demand_match_result.crowd_segment
+     *
+     * @mbg.generated
+     */
+    public String getCrowdSegment() {
+        return crowdSegment;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column channel_demand_match_result.crowd_segment
+     *
+     * @param crowdSegment the value for channel_demand_match_result.crowd_segment
+     *
+     * @mbg.generated
+     */
+    public void setCrowdSegment(String crowdSegment) {
+        this.crowdSegment = crowdSegment;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column channel_demand_match_result.dimension
+     *
+     * @return the value of channel_demand_match_result.dimension
+     *
+     * @mbg.generated
+     */
+    public String getDimension() {
+        return dimension;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column channel_demand_match_result.dimension
+     *
+     * @param dimension the value for channel_demand_match_result.dimension
+     *
+     * @mbg.generated
+     */
+    public void setDimension(String dimension) {
+        this.dimension = dimension;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column channel_demand_match_result.point_type
+     *
+     * @return the value of channel_demand_match_result.point_type
+     *
+     * @mbg.generated
+     */
+    public String getPointType() {
+        return pointType;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column channel_demand_match_result.point_type
+     *
+     * @param pointType the value for channel_demand_match_result.point_type
+     *
+     * @mbg.generated
+     */
+    public void setPointType(String pointType) {
+        this.pointType = pointType;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column channel_demand_match_result.standard_element
+     *
+     * @return the value of channel_demand_match_result.standard_element
+     *
+     * @mbg.generated
+     */
+    public String getStandardElement() {
+        return standardElement;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column channel_demand_match_result.standard_element
+     *
+     * @param standardElement the value for channel_demand_match_result.standard_element
+     *
+     * @mbg.generated
+     */
+    public void setStandardElement(String standardElement) {
+        this.standardElement = standardElement;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column channel_demand_match_result.category_name
+     *
+     * @return the value of channel_demand_match_result.category_name
+     *
+     * @mbg.generated
+     */
+    public String getCategoryName() {
+        return categoryName;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column channel_demand_match_result.category_name
+     *
+     * @param categoryName the value for channel_demand_match_result.category_name
+     *
+     * @mbg.generated
+     */
+    public void setCategoryName(String categoryName) {
+        this.categoryName = categoryName;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column channel_demand_match_result.crowd_count
+     *
+     * @return the value of channel_demand_match_result.crowd_count
+     *
+     * @mbg.generated
+     */
+    public Integer getCrowdCount() {
+        return crowdCount;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column channel_demand_match_result.crowd_count
+     *
+     * @param crowdCount the value for channel_demand_match_result.crowd_count
+     *
+     * @mbg.generated
+     */
+    public void setCrowdCount(Integer crowdCount) {
+        this.crowdCount = crowdCount;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column channel_demand_match_result.video_count
+     *
+     * @return the value of channel_demand_match_result.video_count
+     *
+     * @mbg.generated
+     */
+    public Integer getVideoCount() {
+        return videoCount;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column channel_demand_match_result.video_count
+     *
+     * @param videoCount the value for channel_demand_match_result.video_count
+     *
+     * @mbg.generated
+     */
+    public void setVideoCount(Integer videoCount) {
+        this.videoCount = videoCount;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column channel_demand_match_result.visit_uv
+     *
+     * @return the value of channel_demand_match_result.visit_uv
+     *
+     * @mbg.generated
+     */
+    public Long getVisitUv() {
+        return visitUv;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column channel_demand_match_result.visit_uv
+     *
+     * @param visitUv the value for channel_demand_match_result.visit_uv
+     *
+     * @mbg.generated
+     */
+    public void setVisitUv(Long visitUv) {
+        this.visitUv = visitUv;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column channel_demand_match_result.visit_pv
+     *
+     * @return the value of channel_demand_match_result.visit_pv
+     *
+     * @mbg.generated
+     */
+    public Long getVisitPv() {
+        return visitPv;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column channel_demand_match_result.visit_pv
+     *
+     * @param visitPv the value for channel_demand_match_result.visit_pv
+     *
+     * @mbg.generated
+     */
+    public void setVisitPv(Long visitPv) {
+        this.visitPv = visitPv;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column channel_demand_match_result.share_pv
+     *
+     * @return the value of channel_demand_match_result.share_pv
+     *
+     * @mbg.generated
+     */
+    public Long getSharePv() {
+        return sharePv;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column channel_demand_match_result.share_pv
+     *
+     * @param sharePv the value for channel_demand_match_result.share_pv
+     *
+     * @mbg.generated
+     */
+    public void setSharePv(Long sharePv) {
+        this.sharePv = sharePv;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column channel_demand_match_result.backflow_uv
+     *
+     * @return the value of channel_demand_match_result.backflow_uv
+     *
+     * @mbg.generated
+     */
+    public Long getBackflowUv() {
+        return backflowUv;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column channel_demand_match_result.backflow_uv
+     *
+     * @param backflowUv the value for channel_demand_match_result.backflow_uv
+     *
+     * @mbg.generated
+     */
+    public void setBackflowUv(Long backflowUv) {
+        this.backflowUv = backflowUv;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column channel_demand_match_result.total_rov
+     *
+     * @return the value of channel_demand_match_result.total_rov
+     *
+     * @mbg.generated
+     */
+    public Double getTotalRov() {
+        return totalRov;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column channel_demand_match_result.total_rov
+     *
+     * @param totalRov the value for channel_demand_match_result.total_rov
+     *
+     * @mbg.generated
+     */
+    public void setTotalRov(Double totalRov) {
+        this.totalRov = totalRov;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column channel_demand_match_result.match_video_id
+     *
+     * @return the value of channel_demand_match_result.match_video_id
+     *
+     * @mbg.generated
+     */
+    public Long getMatchVideoId() {
+        return matchVideoId;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column channel_demand_match_result.match_video_id
+     *
+     * @param matchVideoId the value for channel_demand_match_result.match_video_id
+     *
+     * @mbg.generated
+     */
+    public void setMatchVideoId(Long matchVideoId) {
+        this.matchVideoId = matchVideoId;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column channel_demand_match_result.match_config_code
+     *
+     * @return the value of channel_demand_match_result.match_config_code
+     *
+     * @mbg.generated
+     */
+    public String getMatchConfigCode() {
+        return matchConfigCode;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column channel_demand_match_result.match_config_code
+     *
+     * @param matchConfigCode the value for channel_demand_match_result.match_config_code
+     *
+     * @mbg.generated
+     */
+    public void setMatchConfigCode(String matchConfigCode) {
+        this.matchConfigCode = matchConfigCode;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column channel_demand_match_result.match_score
+     *
+     * @return the value of channel_demand_match_result.match_score
+     *
+     * @mbg.generated
+     */
+    public Double getMatchScore() {
+        return matchScore;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column channel_demand_match_result.match_score
+     *
+     * @param matchScore the value for channel_demand_match_result.match_score
+     *
+     * @mbg.generated
+     */
+    public void setMatchScore(Double matchScore) {
+        this.matchScore = matchScore;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column channel_demand_match_result.match_sim
+     *
+     * @return the value of channel_demand_match_result.match_sim
+     *
+     * @mbg.generated
+     */
+    public Double getMatchSim() {
+        return matchSim;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column channel_demand_match_result.match_sim
+     *
+     * @param matchSim the value for channel_demand_match_result.match_sim
+     *
+     * @mbg.generated
+     */
+    public void setMatchSim(Double matchSim) {
+        this.matchSim = matchSim;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column channel_demand_match_result.match_rov
+     *
+     * @return the value of channel_demand_match_result.match_rov
+     *
+     * @mbg.generated
+     */
+    public Double getMatchRov() {
+        return matchRov;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column channel_demand_match_result.match_rov
+     *
+     * @param matchRov the value for channel_demand_match_result.match_rov
+     *
+     * @mbg.generated
+     */
+    public void setMatchRov(Double matchRov) {
+        this.matchRov = matchRov;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column channel_demand_match_result.match_text
+     *
+     * @return the value of channel_demand_match_result.match_text
+     *
+     * @mbg.generated
+     */
+    public String getMatchText() {
+        return matchText;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column channel_demand_match_result.match_text
+     *
+     * @param matchText the value for channel_demand_match_result.match_text
+     *
+     * @mbg.generated
+     */
+    public void setMatchText(String matchText) {
+        this.matchText = matchText;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column channel_demand_match_result.match_status
+     *
+     * @return the value of channel_demand_match_result.match_status
+     *
+     * @mbg.generated
+     */
+    public Short getMatchStatus() {
+        return matchStatus;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column channel_demand_match_result.match_status
+     *
+     * @param matchStatus the value for channel_demand_match_result.match_status
+     *
+     * @mbg.generated
+     */
+    public void setMatchStatus(Short matchStatus) {
+        this.matchStatus = matchStatus;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column channel_demand_match_result.create_time
+     *
+     * @return the value of channel_demand_match_result.create_time
+     *
+     * @mbg.generated
+     */
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column channel_demand_match_result.create_time
+     *
+     * @param createTime the value for channel_demand_match_result.create_time
+     *
+     * @mbg.generated
+     */
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method returns the value of the database column channel_demand_match_result.update_time
+     *
+     * @return the value of channel_demand_match_result.update_time
+     *
+     * @mbg.generated
+     */
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method sets the value of the database column channel_demand_match_result.update_time
+     *
+     * @param updateTime the value for channel_demand_match_result.update_time
+     *
+     * @mbg.generated
+     */
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table channel_demand_match_result
+     *
+     * @mbg.generated
+     */
+    @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(", configId=").append(configId);
+        sb.append(", dt=").append(dt);
+        sb.append(", channelName=").append(channelName);
+        sb.append(", crowdSegment=").append(crowdSegment);
+        sb.append(", dimension=").append(dimension);
+        sb.append(", pointType=").append(pointType);
+        sb.append(", standardElement=").append(standardElement);
+        sb.append(", categoryName=").append(categoryName);
+        sb.append(", crowdCount=").append(crowdCount);
+        sb.append(", videoCount=").append(videoCount);
+        sb.append(", visitUv=").append(visitUv);
+        sb.append(", visitPv=").append(visitPv);
+        sb.append(", sharePv=").append(sharePv);
+        sb.append(", backflowUv=").append(backflowUv);
+        sb.append(", totalRov=").append(totalRov);
+        sb.append(", matchVideoId=").append(matchVideoId);
+        sb.append(", matchConfigCode=").append(matchConfigCode);
+        sb.append(", matchScore=").append(matchScore);
+        sb.append(", matchSim=").append(matchSim);
+        sb.append(", matchRov=").append(matchRov);
+        sb.append(", matchText=").append(matchText);
+        sb.append(", matchStatus=").append(matchStatus);
+        sb.append(", createTime=").append(createTime);
+        sb.append(", updateTime=").append(updateTime);
+        sb.append("]");
+        return sb.toString();
+    }
+}

+ 1893 - 0
core/src/main/java/com/tzld/videoVector/model/po/pgVector/ChannelDemandMatchResultExample.java

@@ -0,0 +1,1893 @@
+package com.tzld.videoVector.model.po.pgVector;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+public class ChannelDemandMatchResultExample {
+    /**
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database table channel_demand_match_result
+     *
+     * @mbg.generated
+     */
+    protected String orderByClause;
+
+    /**
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database table channel_demand_match_result
+     *
+     * @mbg.generated
+     */
+    protected boolean distinct;
+
+    /**
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database table channel_demand_match_result
+     *
+     * @mbg.generated
+     */
+    protected List<Criteria> oredCriteria;
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table channel_demand_match_result
+     *
+     * @mbg.generated
+     */
+    public ChannelDemandMatchResultExample() {
+        oredCriteria = new ArrayList<Criteria>();
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table channel_demand_match_result
+     *
+     * @mbg.generated
+     */
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table channel_demand_match_result
+     *
+     * @mbg.generated
+     */
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table channel_demand_match_result
+     *
+     * @mbg.generated
+     */
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table channel_demand_match_result
+     *
+     * @mbg.generated
+     */
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table channel_demand_match_result
+     *
+     * @mbg.generated
+     */
+    public List<Criteria> getOredCriteria() {
+        return oredCriteria;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table channel_demand_match_result
+     *
+     * @mbg.generated
+     */
+    public void or(Criteria criteria) {
+        oredCriteria.add(criteria);
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table channel_demand_match_result
+     *
+     * @mbg.generated
+     */
+    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 channel_demand_match_result
+     *
+     * @mbg.generated
+     */
+    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 channel_demand_match_result
+     *
+     * @mbg.generated
+     */
+    protected Criteria createCriteriaInternal() {
+        Criteria criteria = new Criteria();
+        return criteria;
+    }
+
+    /**
+     * This method was generated by MyBatis Generator.
+     * This method corresponds to the database table channel_demand_match_result
+     *
+     * @mbg.generated
+     */
+    public void clear() {
+        oredCriteria.clear();
+        orderByClause = null;
+        distinct = false;
+    }
+
+    /**
+     * This class was generated by MyBatis Generator.
+     * This class corresponds to the database table channel_demand_match_result
+     *
+     * @mbg.generated
+     */
+    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 andConfigIdIsNull() {
+            addCriterion("config_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigIdIsNotNull() {
+            addCriterion("config_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigIdEqualTo(Long value) {
+            addCriterion("config_id =", value, "configId");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigIdNotEqualTo(Long value) {
+            addCriterion("config_id <>", value, "configId");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigIdGreaterThan(Long value) {
+            addCriterion("config_id >", value, "configId");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("config_id >=", value, "configId");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigIdLessThan(Long value) {
+            addCriterion("config_id <", value, "configId");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigIdLessThanOrEqualTo(Long value) {
+            addCriterion("config_id <=", value, "configId");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigIdIn(List<Long> values) {
+            addCriterion("config_id in", values, "configId");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigIdNotIn(List<Long> values) {
+            addCriterion("config_id not in", values, "configId");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigIdBetween(Long value1, Long value2) {
+            addCriterion("config_id between", value1, value2, "configId");
+            return (Criteria) this;
+        }
+
+        public Criteria andConfigIdNotBetween(Long value1, Long value2) {
+            addCriterion("config_id not between", value1, value2, "configId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDtIsNull() {
+            addCriterion("dt is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDtIsNotNull() {
+            addCriterion("dt is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDtEqualTo(String value) {
+            addCriterion("dt =", value, "dt");
+            return (Criteria) this;
+        }
+
+        public Criteria andDtNotEqualTo(String value) {
+            addCriterion("dt <>", value, "dt");
+            return (Criteria) this;
+        }
+
+        public Criteria andDtGreaterThan(String value) {
+            addCriterion("dt >", value, "dt");
+            return (Criteria) this;
+        }
+
+        public Criteria andDtGreaterThanOrEqualTo(String value) {
+            addCriterion("dt >=", value, "dt");
+            return (Criteria) this;
+        }
+
+        public Criteria andDtLessThan(String value) {
+            addCriterion("dt <", value, "dt");
+            return (Criteria) this;
+        }
+
+        public Criteria andDtLessThanOrEqualTo(String value) {
+            addCriterion("dt <=", value, "dt");
+            return (Criteria) this;
+        }
+
+        public Criteria andDtLike(String value) {
+            addCriterion("dt like", value, "dt");
+            return (Criteria) this;
+        }
+
+        public Criteria andDtNotLike(String value) {
+            addCriterion("dt not like", value, "dt");
+            return (Criteria) this;
+        }
+
+        public Criteria andDtIn(List<String> values) {
+            addCriterion("dt in", values, "dt");
+            return (Criteria) this;
+        }
+
+        public Criteria andDtNotIn(List<String> values) {
+            addCriterion("dt not in", values, "dt");
+            return (Criteria) this;
+        }
+
+        public Criteria andDtBetween(String value1, String value2) {
+            addCriterion("dt between", value1, value2, "dt");
+            return (Criteria) this;
+        }
+
+        public Criteria andDtNotBetween(String value1, String value2) {
+            addCriterion("dt not between", value1, value2, "dt");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelNameIsNull() {
+            addCriterion("channel_name is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelNameIsNotNull() {
+            addCriterion("channel_name is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelNameEqualTo(String value) {
+            addCriterion("channel_name =", value, "channelName");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelNameNotEqualTo(String value) {
+            addCriterion("channel_name <>", value, "channelName");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelNameGreaterThan(String value) {
+            addCriterion("channel_name >", value, "channelName");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelNameGreaterThanOrEqualTo(String value) {
+            addCriterion("channel_name >=", value, "channelName");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelNameLessThan(String value) {
+            addCriterion("channel_name <", value, "channelName");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelNameLessThanOrEqualTo(String value) {
+            addCriterion("channel_name <=", value, "channelName");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelNameLike(String value) {
+            addCriterion("channel_name like", value, "channelName");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelNameNotLike(String value) {
+            addCriterion("channel_name not like", value, "channelName");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelNameIn(List<String> values) {
+            addCriterion("channel_name in", values, "channelName");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelNameNotIn(List<String> values) {
+            addCriterion("channel_name not in", values, "channelName");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelNameBetween(String value1, String value2) {
+            addCriterion("channel_name between", value1, value2, "channelName");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelNameNotBetween(String value1, String value2) {
+            addCriterion("channel_name not between", value1, value2, "channelName");
+            return (Criteria) this;
+        }
+
+        public Criteria andCrowdSegmentIsNull() {
+            addCriterion("crowd_segment is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCrowdSegmentIsNotNull() {
+            addCriterion("crowd_segment is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCrowdSegmentEqualTo(String value) {
+            addCriterion("crowd_segment =", value, "crowdSegment");
+            return (Criteria) this;
+        }
+
+        public Criteria andCrowdSegmentNotEqualTo(String value) {
+            addCriterion("crowd_segment <>", value, "crowdSegment");
+            return (Criteria) this;
+        }
+
+        public Criteria andCrowdSegmentGreaterThan(String value) {
+            addCriterion("crowd_segment >", value, "crowdSegment");
+            return (Criteria) this;
+        }
+
+        public Criteria andCrowdSegmentGreaterThanOrEqualTo(String value) {
+            addCriterion("crowd_segment >=", value, "crowdSegment");
+            return (Criteria) this;
+        }
+
+        public Criteria andCrowdSegmentLessThan(String value) {
+            addCriterion("crowd_segment <", value, "crowdSegment");
+            return (Criteria) this;
+        }
+
+        public Criteria andCrowdSegmentLessThanOrEqualTo(String value) {
+            addCriterion("crowd_segment <=", value, "crowdSegment");
+            return (Criteria) this;
+        }
+
+        public Criteria andCrowdSegmentLike(String value) {
+            addCriterion("crowd_segment like", value, "crowdSegment");
+            return (Criteria) this;
+        }
+
+        public Criteria andCrowdSegmentNotLike(String value) {
+            addCriterion("crowd_segment not like", value, "crowdSegment");
+            return (Criteria) this;
+        }
+
+        public Criteria andCrowdSegmentIn(List<String> values) {
+            addCriterion("crowd_segment in", values, "crowdSegment");
+            return (Criteria) this;
+        }
+
+        public Criteria andCrowdSegmentNotIn(List<String> values) {
+            addCriterion("crowd_segment not in", values, "crowdSegment");
+            return (Criteria) this;
+        }
+
+        public Criteria andCrowdSegmentBetween(String value1, String value2) {
+            addCriterion("crowd_segment between", value1, value2, "crowdSegment");
+            return (Criteria) this;
+        }
+
+        public Criteria andCrowdSegmentNotBetween(String value1, String value2) {
+            addCriterion("crowd_segment not between", value1, value2, "crowdSegment");
+            return (Criteria) this;
+        }
+
+        public Criteria andDimensionIsNull() {
+            addCriterion("dimension is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDimensionIsNotNull() {
+            addCriterion("dimension is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDimensionEqualTo(String value) {
+            addCriterion("dimension =", value, "dimension");
+            return (Criteria) this;
+        }
+
+        public Criteria andDimensionNotEqualTo(String value) {
+            addCriterion("dimension <>", value, "dimension");
+            return (Criteria) this;
+        }
+
+        public Criteria andDimensionGreaterThan(String value) {
+            addCriterion("dimension >", value, "dimension");
+            return (Criteria) this;
+        }
+
+        public Criteria andDimensionGreaterThanOrEqualTo(String value) {
+            addCriterion("dimension >=", value, "dimension");
+            return (Criteria) this;
+        }
+
+        public Criteria andDimensionLessThan(String value) {
+            addCriterion("dimension <", value, "dimension");
+            return (Criteria) this;
+        }
+
+        public Criteria andDimensionLessThanOrEqualTo(String value) {
+            addCriterion("dimension <=", value, "dimension");
+            return (Criteria) this;
+        }
+
+        public Criteria andDimensionLike(String value) {
+            addCriterion("dimension like", value, "dimension");
+            return (Criteria) this;
+        }
+
+        public Criteria andDimensionNotLike(String value) {
+            addCriterion("dimension not like", value, "dimension");
+            return (Criteria) this;
+        }
+
+        public Criteria andDimensionIn(List<String> values) {
+            addCriterion("dimension in", values, "dimension");
+            return (Criteria) this;
+        }
+
+        public Criteria andDimensionNotIn(List<String> values) {
+            addCriterion("dimension not in", values, "dimension");
+            return (Criteria) this;
+        }
+
+        public Criteria andDimensionBetween(String value1, String value2) {
+            addCriterion("dimension between", value1, value2, "dimension");
+            return (Criteria) this;
+        }
+
+        public Criteria andDimensionNotBetween(String value1, String value2) {
+            addCriterion("dimension not between", value1, value2, "dimension");
+            return (Criteria) this;
+        }
+
+        public Criteria andPointTypeIsNull() {
+            addCriterion("point_type is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPointTypeIsNotNull() {
+            addCriterion("point_type is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPointTypeEqualTo(String value) {
+            addCriterion("point_type =", value, "pointType");
+            return (Criteria) this;
+        }
+
+        public Criteria andPointTypeNotEqualTo(String value) {
+            addCriterion("point_type <>", value, "pointType");
+            return (Criteria) this;
+        }
+
+        public Criteria andPointTypeGreaterThan(String value) {
+            addCriterion("point_type >", value, "pointType");
+            return (Criteria) this;
+        }
+
+        public Criteria andPointTypeGreaterThanOrEqualTo(String value) {
+            addCriterion("point_type >=", value, "pointType");
+            return (Criteria) this;
+        }
+
+        public Criteria andPointTypeLessThan(String value) {
+            addCriterion("point_type <", value, "pointType");
+            return (Criteria) this;
+        }
+
+        public Criteria andPointTypeLessThanOrEqualTo(String value) {
+            addCriterion("point_type <=", value, "pointType");
+            return (Criteria) this;
+        }
+
+        public Criteria andPointTypeLike(String value) {
+            addCriterion("point_type like", value, "pointType");
+            return (Criteria) this;
+        }
+
+        public Criteria andPointTypeNotLike(String value) {
+            addCriterion("point_type not like", value, "pointType");
+            return (Criteria) this;
+        }
+
+        public Criteria andPointTypeIn(List<String> values) {
+            addCriterion("point_type in", values, "pointType");
+            return (Criteria) this;
+        }
+
+        public Criteria andPointTypeNotIn(List<String> values) {
+            addCriterion("point_type not in", values, "pointType");
+            return (Criteria) this;
+        }
+
+        public Criteria andPointTypeBetween(String value1, String value2) {
+            addCriterion("point_type between", value1, value2, "pointType");
+            return (Criteria) this;
+        }
+
+        public Criteria andPointTypeNotBetween(String value1, String value2) {
+            addCriterion("point_type not between", value1, value2, "pointType");
+            return (Criteria) this;
+        }
+
+        public Criteria andStandardElementIsNull() {
+            addCriterion("standard_element is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andStandardElementIsNotNull() {
+            addCriterion("standard_element is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andStandardElementEqualTo(String value) {
+            addCriterion("standard_element =", value, "standardElement");
+            return (Criteria) this;
+        }
+
+        public Criteria andStandardElementNotEqualTo(String value) {
+            addCriterion("standard_element <>", value, "standardElement");
+            return (Criteria) this;
+        }
+
+        public Criteria andStandardElementGreaterThan(String value) {
+            addCriterion("standard_element >", value, "standardElement");
+            return (Criteria) this;
+        }
+
+        public Criteria andStandardElementGreaterThanOrEqualTo(String value) {
+            addCriterion("standard_element >=", value, "standardElement");
+            return (Criteria) this;
+        }
+
+        public Criteria andStandardElementLessThan(String value) {
+            addCriterion("standard_element <", value, "standardElement");
+            return (Criteria) this;
+        }
+
+        public Criteria andStandardElementLessThanOrEqualTo(String value) {
+            addCriterion("standard_element <=", value, "standardElement");
+            return (Criteria) this;
+        }
+
+        public Criteria andStandardElementLike(String value) {
+            addCriterion("standard_element like", value, "standardElement");
+            return (Criteria) this;
+        }
+
+        public Criteria andStandardElementNotLike(String value) {
+            addCriterion("standard_element not like", value, "standardElement");
+            return (Criteria) this;
+        }
+
+        public Criteria andStandardElementIn(List<String> values) {
+            addCriterion("standard_element in", values, "standardElement");
+            return (Criteria) this;
+        }
+
+        public Criteria andStandardElementNotIn(List<String> values) {
+            addCriterion("standard_element not in", values, "standardElement");
+            return (Criteria) this;
+        }
+
+        public Criteria andStandardElementBetween(String value1, String value2) {
+            addCriterion("standard_element between", value1, value2, "standardElement");
+            return (Criteria) this;
+        }
+
+        public Criteria andStandardElementNotBetween(String value1, String value2) {
+            addCriterion("standard_element not between", value1, value2, "standardElement");
+            return (Criteria) this;
+        }
+
+        public Criteria andCategoryNameIsNull() {
+            addCriterion("category_name is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCategoryNameIsNotNull() {
+            addCriterion("category_name is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCategoryNameEqualTo(String value) {
+            addCriterion("category_name =", value, "categoryName");
+            return (Criteria) this;
+        }
+
+        public Criteria andCategoryNameNotEqualTo(String value) {
+            addCriterion("category_name <>", value, "categoryName");
+            return (Criteria) this;
+        }
+
+        public Criteria andCategoryNameGreaterThan(String value) {
+            addCriterion("category_name >", value, "categoryName");
+            return (Criteria) this;
+        }
+
+        public Criteria andCategoryNameGreaterThanOrEqualTo(String value) {
+            addCriterion("category_name >=", value, "categoryName");
+            return (Criteria) this;
+        }
+
+        public Criteria andCategoryNameLessThan(String value) {
+            addCriterion("category_name <", value, "categoryName");
+            return (Criteria) this;
+        }
+
+        public Criteria andCategoryNameLessThanOrEqualTo(String value) {
+            addCriterion("category_name <=", value, "categoryName");
+            return (Criteria) this;
+        }
+
+        public Criteria andCategoryNameLike(String value) {
+            addCriterion("category_name like", value, "categoryName");
+            return (Criteria) this;
+        }
+
+        public Criteria andCategoryNameNotLike(String value) {
+            addCriterion("category_name not like", value, "categoryName");
+            return (Criteria) this;
+        }
+
+        public Criteria andCategoryNameIn(List<String> values) {
+            addCriterion("category_name in", values, "categoryName");
+            return (Criteria) this;
+        }
+
+        public Criteria andCategoryNameNotIn(List<String> values) {
+            addCriterion("category_name not in", values, "categoryName");
+            return (Criteria) this;
+        }
+
+        public Criteria andCategoryNameBetween(String value1, String value2) {
+            addCriterion("category_name between", value1, value2, "categoryName");
+            return (Criteria) this;
+        }
+
+        public Criteria andCategoryNameNotBetween(String value1, String value2) {
+            addCriterion("category_name not between", value1, value2, "categoryName");
+            return (Criteria) this;
+        }
+
+        public Criteria andCrowdCountIsNull() {
+            addCriterion("crowd_count is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCrowdCountIsNotNull() {
+            addCriterion("crowd_count is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCrowdCountEqualTo(Integer value) {
+            addCriterion("crowd_count =", value, "crowdCount");
+            return (Criteria) this;
+        }
+
+        public Criteria andCrowdCountNotEqualTo(Integer value) {
+            addCriterion("crowd_count <>", value, "crowdCount");
+            return (Criteria) this;
+        }
+
+        public Criteria andCrowdCountGreaterThan(Integer value) {
+            addCriterion("crowd_count >", value, "crowdCount");
+            return (Criteria) this;
+        }
+
+        public Criteria andCrowdCountGreaterThanOrEqualTo(Integer value) {
+            addCriterion("crowd_count >=", value, "crowdCount");
+            return (Criteria) this;
+        }
+
+        public Criteria andCrowdCountLessThan(Integer value) {
+            addCriterion("crowd_count <", value, "crowdCount");
+            return (Criteria) this;
+        }
+
+        public Criteria andCrowdCountLessThanOrEqualTo(Integer value) {
+            addCriterion("crowd_count <=", value, "crowdCount");
+            return (Criteria) this;
+        }
+
+        public Criteria andCrowdCountIn(List<Integer> values) {
+            addCriterion("crowd_count in", values, "crowdCount");
+            return (Criteria) this;
+        }
+
+        public Criteria andCrowdCountNotIn(List<Integer> values) {
+            addCriterion("crowd_count not in", values, "crowdCount");
+            return (Criteria) this;
+        }
+
+        public Criteria andCrowdCountBetween(Integer value1, Integer value2) {
+            addCriterion("crowd_count between", value1, value2, "crowdCount");
+            return (Criteria) this;
+        }
+
+        public Criteria andCrowdCountNotBetween(Integer value1, Integer value2) {
+            addCriterion("crowd_count not between", value1, value2, "crowdCount");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoCountIsNull() {
+            addCriterion("video_count is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoCountIsNotNull() {
+            addCriterion("video_count is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoCountEqualTo(Integer value) {
+            addCriterion("video_count =", value, "videoCount");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoCountNotEqualTo(Integer value) {
+            addCriterion("video_count <>", value, "videoCount");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoCountGreaterThan(Integer value) {
+            addCriterion("video_count >", value, "videoCount");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoCountGreaterThanOrEqualTo(Integer value) {
+            addCriterion("video_count >=", value, "videoCount");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoCountLessThan(Integer value) {
+            addCriterion("video_count <", value, "videoCount");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoCountLessThanOrEqualTo(Integer value) {
+            addCriterion("video_count <=", value, "videoCount");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoCountIn(List<Integer> values) {
+            addCriterion("video_count in", values, "videoCount");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoCountNotIn(List<Integer> values) {
+            addCriterion("video_count not in", values, "videoCount");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoCountBetween(Integer value1, Integer value2) {
+            addCriterion("video_count between", value1, value2, "videoCount");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoCountNotBetween(Integer value1, Integer value2) {
+            addCriterion("video_count not between", value1, value2, "videoCount");
+            return (Criteria) this;
+        }
+
+        public Criteria andVisitUvIsNull() {
+            addCriterion("visit_uv is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andVisitUvIsNotNull() {
+            addCriterion("visit_uv is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andVisitUvEqualTo(Long value) {
+            addCriterion("visit_uv =", value, "visitUv");
+            return (Criteria) this;
+        }
+
+        public Criteria andVisitUvNotEqualTo(Long value) {
+            addCriterion("visit_uv <>", value, "visitUv");
+            return (Criteria) this;
+        }
+
+        public Criteria andVisitUvGreaterThan(Long value) {
+            addCriterion("visit_uv >", value, "visitUv");
+            return (Criteria) this;
+        }
+
+        public Criteria andVisitUvGreaterThanOrEqualTo(Long value) {
+            addCriterion("visit_uv >=", value, "visitUv");
+            return (Criteria) this;
+        }
+
+        public Criteria andVisitUvLessThan(Long value) {
+            addCriterion("visit_uv <", value, "visitUv");
+            return (Criteria) this;
+        }
+
+        public Criteria andVisitUvLessThanOrEqualTo(Long value) {
+            addCriterion("visit_uv <=", value, "visitUv");
+            return (Criteria) this;
+        }
+
+        public Criteria andVisitUvIn(List<Long> values) {
+            addCriterion("visit_uv in", values, "visitUv");
+            return (Criteria) this;
+        }
+
+        public Criteria andVisitUvNotIn(List<Long> values) {
+            addCriterion("visit_uv not in", values, "visitUv");
+            return (Criteria) this;
+        }
+
+        public Criteria andVisitUvBetween(Long value1, Long value2) {
+            addCriterion("visit_uv between", value1, value2, "visitUv");
+            return (Criteria) this;
+        }
+
+        public Criteria andVisitUvNotBetween(Long value1, Long value2) {
+            addCriterion("visit_uv not between", value1, value2, "visitUv");
+            return (Criteria) this;
+        }
+
+        public Criteria andVisitPvIsNull() {
+            addCriterion("visit_pv is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andVisitPvIsNotNull() {
+            addCriterion("visit_pv is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andVisitPvEqualTo(Long value) {
+            addCriterion("visit_pv =", value, "visitPv");
+            return (Criteria) this;
+        }
+
+        public Criteria andVisitPvNotEqualTo(Long value) {
+            addCriterion("visit_pv <>", value, "visitPv");
+            return (Criteria) this;
+        }
+
+        public Criteria andVisitPvGreaterThan(Long value) {
+            addCriterion("visit_pv >", value, "visitPv");
+            return (Criteria) this;
+        }
+
+        public Criteria andVisitPvGreaterThanOrEqualTo(Long value) {
+            addCriterion("visit_pv >=", value, "visitPv");
+            return (Criteria) this;
+        }
+
+        public Criteria andVisitPvLessThan(Long value) {
+            addCriterion("visit_pv <", value, "visitPv");
+            return (Criteria) this;
+        }
+
+        public Criteria andVisitPvLessThanOrEqualTo(Long value) {
+            addCriterion("visit_pv <=", value, "visitPv");
+            return (Criteria) this;
+        }
+
+        public Criteria andVisitPvIn(List<Long> values) {
+            addCriterion("visit_pv in", values, "visitPv");
+            return (Criteria) this;
+        }
+
+        public Criteria andVisitPvNotIn(List<Long> values) {
+            addCriterion("visit_pv not in", values, "visitPv");
+            return (Criteria) this;
+        }
+
+        public Criteria andVisitPvBetween(Long value1, Long value2) {
+            addCriterion("visit_pv between", value1, value2, "visitPv");
+            return (Criteria) this;
+        }
+
+        public Criteria andVisitPvNotBetween(Long value1, Long value2) {
+            addCriterion("visit_pv not between", value1, value2, "visitPv");
+            return (Criteria) this;
+        }
+
+        public Criteria andSharePvIsNull() {
+            addCriterion("share_pv is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSharePvIsNotNull() {
+            addCriterion("share_pv is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSharePvEqualTo(Long value) {
+            addCriterion("share_pv =", value, "sharePv");
+            return (Criteria) this;
+        }
+
+        public Criteria andSharePvNotEqualTo(Long value) {
+            addCriterion("share_pv <>", value, "sharePv");
+            return (Criteria) this;
+        }
+
+        public Criteria andSharePvGreaterThan(Long value) {
+            addCriterion("share_pv >", value, "sharePv");
+            return (Criteria) this;
+        }
+
+        public Criteria andSharePvGreaterThanOrEqualTo(Long value) {
+            addCriterion("share_pv >=", value, "sharePv");
+            return (Criteria) this;
+        }
+
+        public Criteria andSharePvLessThan(Long value) {
+            addCriterion("share_pv <", value, "sharePv");
+            return (Criteria) this;
+        }
+
+        public Criteria andSharePvLessThanOrEqualTo(Long value) {
+            addCriterion("share_pv <=", value, "sharePv");
+            return (Criteria) this;
+        }
+
+        public Criteria andSharePvIn(List<Long> values) {
+            addCriterion("share_pv in", values, "sharePv");
+            return (Criteria) this;
+        }
+
+        public Criteria andSharePvNotIn(List<Long> values) {
+            addCriterion("share_pv not in", values, "sharePv");
+            return (Criteria) this;
+        }
+
+        public Criteria andSharePvBetween(Long value1, Long value2) {
+            addCriterion("share_pv between", value1, value2, "sharePv");
+            return (Criteria) this;
+        }
+
+        public Criteria andSharePvNotBetween(Long value1, Long value2) {
+            addCriterion("share_pv not between", value1, value2, "sharePv");
+            return (Criteria) this;
+        }
+
+        public Criteria andBackflowUvIsNull() {
+            addCriterion("backflow_uv is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andBackflowUvIsNotNull() {
+            addCriterion("backflow_uv is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andBackflowUvEqualTo(Long value) {
+            addCriterion("backflow_uv =", value, "backflowUv");
+            return (Criteria) this;
+        }
+
+        public Criteria andBackflowUvNotEqualTo(Long value) {
+            addCriterion("backflow_uv <>", value, "backflowUv");
+            return (Criteria) this;
+        }
+
+        public Criteria andBackflowUvGreaterThan(Long value) {
+            addCriterion("backflow_uv >", value, "backflowUv");
+            return (Criteria) this;
+        }
+
+        public Criteria andBackflowUvGreaterThanOrEqualTo(Long value) {
+            addCriterion("backflow_uv >=", value, "backflowUv");
+            return (Criteria) this;
+        }
+
+        public Criteria andBackflowUvLessThan(Long value) {
+            addCriterion("backflow_uv <", value, "backflowUv");
+            return (Criteria) this;
+        }
+
+        public Criteria andBackflowUvLessThanOrEqualTo(Long value) {
+            addCriterion("backflow_uv <=", value, "backflowUv");
+            return (Criteria) this;
+        }
+
+        public Criteria andBackflowUvIn(List<Long> values) {
+            addCriterion("backflow_uv in", values, "backflowUv");
+            return (Criteria) this;
+        }
+
+        public Criteria andBackflowUvNotIn(List<Long> values) {
+            addCriterion("backflow_uv not in", values, "backflowUv");
+            return (Criteria) this;
+        }
+
+        public Criteria andBackflowUvBetween(Long value1, Long value2) {
+            addCriterion("backflow_uv between", value1, value2, "backflowUv");
+            return (Criteria) this;
+        }
+
+        public Criteria andBackflowUvNotBetween(Long value1, Long value2) {
+            addCriterion("backflow_uv not between", value1, value2, "backflowUv");
+            return (Criteria) this;
+        }
+
+        public Criteria andTotalRovIsNull() {
+            addCriterion("total_rov is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTotalRovIsNotNull() {
+            addCriterion("total_rov is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTotalRovEqualTo(Double value) {
+            addCriterion("total_rov =", value, "totalRov");
+            return (Criteria) this;
+        }
+
+        public Criteria andTotalRovNotEqualTo(Double value) {
+            addCriterion("total_rov <>", value, "totalRov");
+            return (Criteria) this;
+        }
+
+        public Criteria andTotalRovGreaterThan(Double value) {
+            addCriterion("total_rov >", value, "totalRov");
+            return (Criteria) this;
+        }
+
+        public Criteria andTotalRovGreaterThanOrEqualTo(Double value) {
+            addCriterion("total_rov >=", value, "totalRov");
+            return (Criteria) this;
+        }
+
+        public Criteria andTotalRovLessThan(Double value) {
+            addCriterion("total_rov <", value, "totalRov");
+            return (Criteria) this;
+        }
+
+        public Criteria andTotalRovLessThanOrEqualTo(Double value) {
+            addCriterion("total_rov <=", value, "totalRov");
+            return (Criteria) this;
+        }
+
+        public Criteria andTotalRovIn(List<Double> values) {
+            addCriterion("total_rov in", values, "totalRov");
+            return (Criteria) this;
+        }
+
+        public Criteria andTotalRovNotIn(List<Double> values) {
+            addCriterion("total_rov not in", values, "totalRov");
+            return (Criteria) this;
+        }
+
+        public Criteria andTotalRovBetween(Double value1, Double value2) {
+            addCriterion("total_rov between", value1, value2, "totalRov");
+            return (Criteria) this;
+        }
+
+        public Criteria andTotalRovNotBetween(Double value1, Double value2) {
+            addCriterion("total_rov not between", value1, value2, "totalRov");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchVideoIdIsNull() {
+            addCriterion("match_video_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchVideoIdIsNotNull() {
+            addCriterion("match_video_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchVideoIdEqualTo(Long value) {
+            addCriterion("match_video_id =", value, "matchVideoId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchVideoIdNotEqualTo(Long value) {
+            addCriterion("match_video_id <>", value, "matchVideoId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchVideoIdGreaterThan(Long value) {
+            addCriterion("match_video_id >", value, "matchVideoId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchVideoIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("match_video_id >=", value, "matchVideoId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchVideoIdLessThan(Long value) {
+            addCriterion("match_video_id <", value, "matchVideoId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchVideoIdLessThanOrEqualTo(Long value) {
+            addCriterion("match_video_id <=", value, "matchVideoId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchVideoIdIn(List<Long> values) {
+            addCriterion("match_video_id in", values, "matchVideoId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchVideoIdNotIn(List<Long> values) {
+            addCriterion("match_video_id not in", values, "matchVideoId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchVideoIdBetween(Long value1, Long value2) {
+            addCriterion("match_video_id between", value1, value2, "matchVideoId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchVideoIdNotBetween(Long value1, Long value2) {
+            addCriterion("match_video_id not between", value1, value2, "matchVideoId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchConfigCodeIsNull() {
+            addCriterion("match_config_code is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchConfigCodeIsNotNull() {
+            addCriterion("match_config_code is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchConfigCodeEqualTo(String value) {
+            addCriterion("match_config_code =", value, "matchConfigCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchConfigCodeNotEqualTo(String value) {
+            addCriterion("match_config_code <>", value, "matchConfigCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchConfigCodeGreaterThan(String value) {
+            addCriterion("match_config_code >", value, "matchConfigCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchConfigCodeGreaterThanOrEqualTo(String value) {
+            addCriterion("match_config_code >=", value, "matchConfigCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchConfigCodeLessThan(String value) {
+            addCriterion("match_config_code <", value, "matchConfigCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchConfigCodeLessThanOrEqualTo(String value) {
+            addCriterion("match_config_code <=", value, "matchConfigCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchConfigCodeLike(String value) {
+            addCriterion("match_config_code like", value, "matchConfigCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchConfigCodeNotLike(String value) {
+            addCriterion("match_config_code not like", value, "matchConfigCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchConfigCodeIn(List<String> values) {
+            addCriterion("match_config_code in", values, "matchConfigCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchConfigCodeNotIn(List<String> values) {
+            addCriterion("match_config_code not in", values, "matchConfigCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchConfigCodeBetween(String value1, String value2) {
+            addCriterion("match_config_code between", value1, value2, "matchConfigCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchConfigCodeNotBetween(String value1, String value2) {
+            addCriterion("match_config_code not between", value1, value2, "matchConfigCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchScoreIsNull() {
+            addCriterion("match_score is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchScoreIsNotNull() {
+            addCriterion("match_score is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchScoreEqualTo(Double value) {
+            addCriterion("match_score =", value, "matchScore");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchScoreNotEqualTo(Double value) {
+            addCriterion("match_score <>", value, "matchScore");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchScoreGreaterThan(Double value) {
+            addCriterion("match_score >", value, "matchScore");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchScoreGreaterThanOrEqualTo(Double value) {
+            addCriterion("match_score >=", value, "matchScore");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchScoreLessThan(Double value) {
+            addCriterion("match_score <", value, "matchScore");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchScoreLessThanOrEqualTo(Double value) {
+            addCriterion("match_score <=", value, "matchScore");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchScoreIn(List<Double> values) {
+            addCriterion("match_score in", values, "matchScore");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchScoreNotIn(List<Double> values) {
+            addCriterion("match_score not in", values, "matchScore");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchScoreBetween(Double value1, Double value2) {
+            addCriterion("match_score between", value1, value2, "matchScore");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchScoreNotBetween(Double value1, Double value2) {
+            addCriterion("match_score not between", value1, value2, "matchScore");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchSimIsNull() {
+            addCriterion("match_sim is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchSimIsNotNull() {
+            addCriterion("match_sim is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchSimEqualTo(Double value) {
+            addCriterion("match_sim =", value, "matchSim");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchSimNotEqualTo(Double value) {
+            addCriterion("match_sim <>", value, "matchSim");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchSimGreaterThan(Double value) {
+            addCriterion("match_sim >", value, "matchSim");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchSimGreaterThanOrEqualTo(Double value) {
+            addCriterion("match_sim >=", value, "matchSim");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchSimLessThan(Double value) {
+            addCriterion("match_sim <", value, "matchSim");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchSimLessThanOrEqualTo(Double value) {
+            addCriterion("match_sim <=", value, "matchSim");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchSimIn(List<Double> values) {
+            addCriterion("match_sim in", values, "matchSim");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchSimNotIn(List<Double> values) {
+            addCriterion("match_sim not in", values, "matchSim");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchSimBetween(Double value1, Double value2) {
+            addCriterion("match_sim between", value1, value2, "matchSim");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchSimNotBetween(Double value1, Double value2) {
+            addCriterion("match_sim not between", value1, value2, "matchSim");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchRovIsNull() {
+            addCriterion("match_rov is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchRovIsNotNull() {
+            addCriterion("match_rov is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchRovEqualTo(Double value) {
+            addCriterion("match_rov =", value, "matchRov");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchRovNotEqualTo(Double value) {
+            addCriterion("match_rov <>", value, "matchRov");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchRovGreaterThan(Double value) {
+            addCriterion("match_rov >", value, "matchRov");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchRovGreaterThanOrEqualTo(Double value) {
+            addCriterion("match_rov >=", value, "matchRov");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchRovLessThan(Double value) {
+            addCriterion("match_rov <", value, "matchRov");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchRovLessThanOrEqualTo(Double value) {
+            addCriterion("match_rov <=", value, "matchRov");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchRovIn(List<Double> values) {
+            addCriterion("match_rov in", values, "matchRov");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchRovNotIn(List<Double> values) {
+            addCriterion("match_rov not in", values, "matchRov");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchRovBetween(Double value1, Double value2) {
+            addCriterion("match_rov between", value1, value2, "matchRov");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchRovNotBetween(Double value1, Double value2) {
+            addCriterion("match_rov not between", value1, value2, "matchRov");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchTextIsNull() {
+            addCriterion("match_text is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchTextIsNotNull() {
+            addCriterion("match_text is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchTextEqualTo(String value) {
+            addCriterion("match_text =", value, "matchText");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchTextNotEqualTo(String value) {
+            addCriterion("match_text <>", value, "matchText");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchTextGreaterThan(String value) {
+            addCriterion("match_text >", value, "matchText");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchTextGreaterThanOrEqualTo(String value) {
+            addCriterion("match_text >=", value, "matchText");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchTextLessThan(String value) {
+            addCriterion("match_text <", value, "matchText");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchTextLessThanOrEqualTo(String value) {
+            addCriterion("match_text <=", value, "matchText");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchTextLike(String value) {
+            addCriterion("match_text like", value, "matchText");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchTextNotLike(String value) {
+            addCriterion("match_text not like", value, "matchText");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchTextIn(List<String> values) {
+            addCriterion("match_text in", values, "matchText");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchTextNotIn(List<String> values) {
+            addCriterion("match_text not in", values, "matchText");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchTextBetween(String value1, String value2) {
+            addCriterion("match_text between", value1, value2, "matchText");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchTextNotBetween(String value1, String value2) {
+            addCriterion("match_text not between", value1, value2, "matchText");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchStatusIsNull() {
+            addCriterion("match_status is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchStatusIsNotNull() {
+            addCriterion("match_status is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchStatusEqualTo(Short value) {
+            addCriterion("match_status =", value, "matchStatus");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchStatusNotEqualTo(Short value) {
+            addCriterion("match_status <>", value, "matchStatus");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchStatusGreaterThan(Short value) {
+            addCriterion("match_status >", value, "matchStatus");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchStatusGreaterThanOrEqualTo(Short value) {
+            addCriterion("match_status >=", value, "matchStatus");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchStatusLessThan(Short value) {
+            addCriterion("match_status <", value, "matchStatus");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchStatusLessThanOrEqualTo(Short value) {
+            addCriterion("match_status <=", value, "matchStatus");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchStatusIn(List<Short> values) {
+            addCriterion("match_status in", values, "matchStatus");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchStatusNotIn(List<Short> values) {
+            addCriterion("match_status not in", values, "matchStatus");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchStatusBetween(Short value1, Short value2) {
+            addCriterion("match_status between", value1, value2, "matchStatus");
+            return (Criteria) this;
+        }
+
+        public Criteria andMatchStatusNotBetween(Short value1, Short value2) {
+            addCriterion("match_status not between", value1, value2, "matchStatus");
+            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 channel_demand_match_result
+     *
+     * @mbg.generated do_not_delete_during_merge
+     */
+    public static class Criteria extends GeneratedCriteria {
+
+        protected Criteria() {
+            super();
+        }
+    }
+
+    /**
+     * This class was generated by MyBatis Generator.
+     * This class corresponds to the database table channel_demand_match_result
+     *
+     * @mbg.generated
+     */
+    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);
+        }
+    }
+}

+ 64 - 0
core/src/main/java/com/tzld/videoVector/model/vo/ChannelDemandMatchVO.java

@@ -0,0 +1,64 @@
+package com.tzld.videoVector.model.vo;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 渠道需求匹配结果VO
+ */
+@Data
+public class ChannelDemandMatchVO {
+
+    /** 数据日期 */
+    private String dt;
+
+    /** 渠道类 */
+    private String channelName;
+
+    /** 人群细分 */
+    private String crowdSegment;
+
+    /** 维度 */
+    private String dimension;
+
+    /** 点类型 */
+    private String pointType;
+
+    /** 标准化元素(搜索词) */
+    private String standardElement;
+
+    /** 分类名称 */
+    private String categoryName;
+
+    /** 访问UV */
+    private Long visitUv;
+
+    /** 总ROV */
+    private Double totalRov;
+
+    /** 匹配到的视频列表 */
+    private List<MatchedVideo> matchedVideos;
+
+    @Data
+    public static class MatchedVideo {
+
+        /** 匹配视频ID */
+        private Long videoId;
+
+        /** 匹配使用的向量配置编码 */
+        private String configCode;
+
+        /** 综合评分 */
+        private Double score;
+
+        /** 相似度分数 */
+        private Double sim;
+
+        /** 匹配视频ROV */
+        private Double rov;
+
+        /** 匹配命中的向量原文 */
+        private String text;
+    }
+}

+ 71 - 0
core/src/main/java/com/tzld/videoVector/model/vo/RecallVideoScoreVO.java

@@ -0,0 +1,71 @@
+package com.tzld.videoVector.model.vo;
+
+import lombok.Data;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 召回视频综合评分结果
+ * 包含 sim(相似度)、rov(效率分)和综合评分 score
+ */
+@Data
+public class RecallVideoScoreVO {
+
+    /** 评分后的结果列表(按综合分 score 降序) */
+    private List<ScoredVideoItem> items;
+
+    /** 总条数 */
+    private int total;
+
+    /** 使用的评分参数 */
+    private ScoreParams scoreParams;
+
+    @Data
+    public static class ScoredVideoItem {
+
+        /** 匹配到的视频ID */
+        private Long videoId;
+
+        /** 命中的配置编码 */
+        private String configCode;
+
+        /** 原始相似度分数 (sim) */
+        private Double sim;
+
+        /** 归一化后的相似度 (sim_norm) */
+        private Double simNorm;
+
+        /** 效率分 (rov),来自视频维度表 */
+        private Double rov;
+
+        /** 归一化后的效率分 (rov_norm) */
+        private Double rovNorm;
+
+        /** 综合得分 = alpha * sim_norm + (1-alpha) * rov_norm */
+        private Double score;
+
+        /** 向量化原文 */
+        private String text;
+
+        /**
+         * 视频基础信息(从大数据表同步至Redis)
+         * 含 deconstruct 子对象
+         */
+        private Map<String, Object> videoDetail;
+    }
+
+    @Data
+    public static class ScoreParams {
+        /** 相关性权重 */
+        private Double alpha;
+        /** ROV P95 */
+        private Double rovP95;
+        /** ROV P5 */
+        private Double rovP5;
+        /** 相似度下界 */
+        private Double simMin;
+        /** 相似度上界 */
+        private Double simMax;
+    }
+}

+ 24 - 0
core/src/main/java/com/tzld/videoVector/service/VideoSearchService.java

@@ -1,10 +1,14 @@
 package com.tzld.videoVector.service;
 
 import com.alibaba.fastjson.JSONObject;
+import com.tzld.videoVector.model.param.ChannelDemandMatchQueryParam;
 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.param.RecallVideoScoreParam;
 
+import com.tzld.videoVector.model.vo.ChannelDemandMatchVO;
+import com.tzld.videoVector.model.vo.RecallVideoScoreVO;
 import com.tzld.videoVector.model.vo.VideoMatchResult;
 
 import java.util.List;
@@ -63,4 +67,24 @@ public interface VideoSearchService {
      * @return {"topic": "...", "highValuePoints": [...]},解析失败返回 null
      */
     JSONObject parseDecodeResult(JSONObject rawJson);
+
+    /**
+     * 召回视频并按综合评分排序
+     * 综合分 = alpha * sim_norm + (1-alpha) * rov_norm
+     * sim_norm = (sim - simMin) / (1.0 - simMin)
+     * rov_norm = clip((rov - rovP5) / (rovP95 - rovP5), 0, 1)
+     *
+     * @param param 召回评分参数
+     * @return 按综合分降序排列的结果
+     */
+    RecallVideoScoreVO recallWithScore(RecallVideoScoreParam param);
+
+    /**
+     * 查询渠道需求匹配结果
+     * 按日期、渠道、人群、维度查询匹配到的视频ID及分数
+     *
+     * @param param 查询参数
+     * @return 按需求维度分组的匹配结果列表
+     */
+    List<ChannelDemandMatchVO> queryDemandMatchResult(ChannelDemandMatchQueryParam param);
 }

+ 220 - 0
core/src/main/java/com/tzld/videoVector/service/impl/VideoSearchServiceImpl.java

@@ -4,16 +4,21 @@ import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.tzld.videoVector.api.VideoApiService;
 import com.tzld.videoVector.common.constant.VectorConstants;
+import com.tzld.videoVector.dao.mapper.pgVector.ChannelDemandMatchResultMapper;
 import com.tzld.videoVector.dao.mapper.pgVector.DeconstructContentMapper;
 import com.tzld.videoVector.dao.mapper.pgVector.DeconstructVectorConfigMapper;
 import com.tzld.videoVector.dao.mapper.pgVector.ext.ContentVectorMapperExt;
 import com.tzld.videoVector.model.entity.DeconstructResult;
 import com.tzld.videoVector.model.entity.VideoDetail;
 import com.tzld.videoVector.model.entity.VideoMatch;
+import com.tzld.videoVector.model.param.ChannelDemandMatchQueryParam;
 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.param.RecallVideoScoreParam;
 import com.tzld.videoVector.model.po.pgVector.*;
+import com.tzld.videoVector.model.vo.ChannelDemandMatchVO;
+import com.tzld.videoVector.model.vo.RecallVideoScoreVO;
 import com.tzld.videoVector.model.vo.VideoMatchResult;
 import com.tzld.videoVector.service.DeconstructService;
 import com.tzld.videoVector.service.EmbeddingService;
@@ -48,6 +53,9 @@ public class VideoSearchServiceImpl implements VideoSearchService {
     @Resource
     private DeconstructContentMapper deconstructContentMapper;
 
+    @Resource
+    private ChannelDemandMatchResultMapper channelDemandMatchResultMapper;
+
     @Resource
     private ContentVectorMapperExt pgContentVectorMapper;
 
@@ -1306,4 +1314,216 @@ public class VideoSearchServiceImpl implements VideoSearchService {
         }
         return result;
     }
+
+    // ========================== 召回综合评分 ==========================
+
+    /** 默认评分参数 */
+    private static final double DEFAULT_ALPHA = 0.6;
+    private static final double DEFAULT_SIM_MIN = 0.7;
+    private static final double DEFAULT_SIM_MAX = 1.0;
+    private static final double DEFAULT_ROV_P5 = 0.005;
+    private static final double DEFAULT_ROV_P95 = 0.05;
+
+    @Override
+    public RecallVideoScoreVO recallWithScore(RecallVideoScoreParam param) {
+        if (param == null) {
+            log.error("recallWithScore 参数为空");
+            return emptyScoreResult(DEFAULT_ALPHA, DEFAULT_ROV_P95, DEFAULT_ROV_P5, DEFAULT_SIM_MIN);
+        }
+
+        // 解析评分参数,使用默认值
+        double alpha = param.getAlpha() != null ? param.getAlpha() : DEFAULT_ALPHA;
+        double rovP95 = param.getRovP95() != null ? param.getRovP95() : DEFAULT_ROV_P95;
+        double rovP5 = param.getRovP5() != null ? param.getRovP5() : DEFAULT_ROV_P5;
+        double simMin = param.getSimMin() != null ? param.getSimMin() : DEFAULT_SIM_MIN;
+
+        // 1. 复用现有 matchTopNVideo 进行向量召回
+        MatchTopNVideoParam matchParam = new MatchTopNVideoParam();
+        matchParam.setChannelContentId(param.getChannelContentId());
+        matchParam.setConfigCode(param.getConfigCode());
+        matchParam.setQueryText(param.getQueryText());
+        matchParam.setQueryVector(param.getQueryVector());
+        matchParam.setTopN(param.getTopN() != null && param.getTopN() > 0 ? param.getTopN() : 10);
+
+        List<VideoMatchResult> rawMatches = matchTopNVideo(matchParam);
+        if (rawMatches == null || rawMatches.isEmpty()) {
+            log.info("recallWithScore: 召回结果为空");
+            return emptyScoreResult(alpha, rovP95, rovP5, simMin);
+        }
+
+        // 2. 对每条结果计算综合评分
+        List<RecallVideoScoreVO.ScoredVideoItem> scoredItems = new ArrayList<>();
+        for (VideoMatchResult match : rawMatches) {
+            RecallVideoScoreVO.ScoredVideoItem item = new RecallVideoScoreVO.ScoredVideoItem();
+            item.setVideoId(match.getVideoId());
+            item.setConfigCode(match.getConfigCode());
+            item.setText(match.getText());
+            item.setVideoDetail(match.getVideoDetail());
+
+            // sim = 原始相似度分数
+            double sim = match.getScore() != null ? match.getScore() : 0.0;
+            // 最低相似分限制,低于simMin的结果直接过滤
+            if (sim < simMin) {
+                continue;
+            }
+            item.setSim(sim);
+
+            // 从 videoDetail 中提取 rov
+            double rov = extractRov(match.getVideoDetail());
+            item.setRov(rov);
+
+            // sim 归一化: sim_norm = (sim - simMin) / (simMax - simMin)
+            double simNorm = (DEFAULT_SIM_MAX - simMin) > 0
+                    ? (sim - simMin) / (DEFAULT_SIM_MAX - simMin)
+                    : 0.0;
+            simNorm = Math.max(0.0, Math.min(1.0, simNorm));
+            item.setSimNorm(round(simNorm));
+
+            // rov 归一化: rov_norm = clip((rov - rovP5) / (rovP95 - rovP5), 0, 1)
+            double rovNorm = (rovP95 - rovP5) > 0
+                    ? (rov - rovP5) / (rovP95 - rovP5)
+                    : 0.0;
+            rovNorm = Math.max(0.0, Math.min(1.0, rovNorm));
+            item.setRovNorm(round(rovNorm));
+
+            // 综合得分: score = alpha * sim_norm + (1-alpha) * rov_norm
+            double score = alpha * simNorm + (1 - alpha) * rovNorm;
+            item.setScore(round(score));
+
+            scoredItems.add(item);
+        }
+
+        // 3. 按综合分降序排序
+        scoredItems.sort((a, b) -> Double.compare(b.getScore(), a.getScore()));
+
+        log.info("recallWithScore 完成,共 {} 条结果,alpha={}, simMin={}, rovP5={}, rovP95={}",
+                scoredItems.size(), alpha, simMin, rovP5, rovP95);
+
+        // 4. 构建返回结果
+        RecallVideoScoreVO vo = new RecallVideoScoreVO();
+        vo.setItems(scoredItems);
+        vo.setTotal(scoredItems.size());
+
+        RecallVideoScoreVO.ScoreParams scoreParams = new RecallVideoScoreVO.ScoreParams();
+        scoreParams.setAlpha(alpha);
+        scoreParams.setRovP95(rovP95);
+        scoreParams.setRovP5(rovP5);
+        scoreParams.setSimMin(simMin);
+        scoreParams.setSimMax(DEFAULT_SIM_MAX);
+        vo.setScoreParams(scoreParams);
+
+        return vo;
+    }
+
+    /**
+     * 从 videoDetail Map 中提取 rov 值
+     * videoDetail 来源于 Redis video:detail:{videoId},由 syncVideoDetailJob 从 ODPS 同步
+     */
+    private double extractRov(Map<String, Object> videoDetail) {
+        if (videoDetail == null) {
+            return 0.0;
+        }
+        Object rovObj = videoDetail.get("rov");
+        if (rovObj == null) {
+            return 0.0;
+        }
+        try {
+            if (rovObj instanceof Number) {
+                return ((Number) rovObj).doubleValue();
+            }
+            return Double.parseDouble(rovObj.toString());
+        } catch (NumberFormatException e) {
+            log.warn("extractRov 解析失败, rovObj={}", rovObj);
+            return 0.0;
+        }
+    }
+
+    /**
+     * 四舍五入保留4位小数
+     */
+    private double round(double value) {
+        return Math.round(value * 10000.0) / 10000.0;
+    }
+
+    /**
+     * 构建空的评分结果
+     */
+    private RecallVideoScoreVO emptyScoreResult(double alpha, double rovP95, double rovP5, double simMin) {
+        RecallVideoScoreVO vo = new RecallVideoScoreVO();
+        vo.setItems(Collections.emptyList());
+        vo.setTotal(0);
+        RecallVideoScoreVO.ScoreParams scoreParams = new RecallVideoScoreVO.ScoreParams();
+        scoreParams.setAlpha(alpha);
+        scoreParams.setRovP95(rovP95);
+        scoreParams.setRovP5(rovP5);
+        scoreParams.setSimMin(simMin);
+        scoreParams.setSimMax(DEFAULT_SIM_MAX);
+        vo.setScoreParams(scoreParams);
+        return vo;
+    }
+
+    @Override
+    public List<ChannelDemandMatchVO> queryDemandMatchResult(ChannelDemandMatchQueryParam param) {
+        // 构造查询条件
+        ChannelDemandMatchResultExample example = new ChannelDemandMatchResultExample();
+        ChannelDemandMatchResultExample.Criteria criteria = example.createCriteria();
+
+        if (StringUtils.hasText(param.getDt())) {
+            criteria.andDtEqualTo(param.getDt());
+        }
+        if (StringUtils.hasText(param.getChannelName())) {
+            criteria.andChannelNameEqualTo(param.getChannelName());
+        }
+        if (StringUtils.hasText(param.getCrowdSegment())) {
+            criteria.andCrowdSegmentEqualTo(param.getCrowdSegment());
+        }
+        if (StringUtils.hasText(param.getDimension())) {
+            criteria.andDimensionEqualTo(param.getDimension());
+        }
+        if (StringUtils.hasText(param.getPointType())) {
+            criteria.andPointTypeEqualTo(param.getPointType());
+        }
+        if (StringUtils.hasText(param.getStandardElement())) {
+            criteria.andStandardElementEqualTo(param.getStandardElement());
+        }
+        // 只查已匹配成功的
+        criteria.andMatchStatusEqualTo((short) 1);
+
+        List<ChannelDemandMatchResult> results = channelDemandMatchResultMapper.selectByExample(example);
+
+        // 按需求维度分组,同一需求下的多个匹配视频聚合到一个VO
+        Map<String, ChannelDemandMatchVO> groupMap = new LinkedHashMap<>();
+        for (ChannelDemandMatchResult r : results) {
+            String key = r.getDt() + "|" + r.getChannelName() + "|" + r.getCrowdSegment()
+                    + "|" + r.getDimension() + "|" + r.getPointType() + "|" + r.getStandardElement();
+
+            ChannelDemandMatchVO vo = groupMap.computeIfAbsent(key, k -> {
+                ChannelDemandMatchVO v = new ChannelDemandMatchVO();
+                v.setDt(r.getDt());
+                v.setChannelName(r.getChannelName());
+                v.setCrowdSegment(r.getCrowdSegment());
+                v.setDimension(r.getDimension());
+                v.setPointType(r.getPointType());
+                v.setStandardElement(r.getStandardElement());
+                v.setCategoryName(r.getCategoryName());
+                v.setVisitUv(r.getVisitUv());
+                v.setTotalRov(r.getTotalRov());
+                v.setMatchedVideos(new ArrayList<>());
+                return v;
+            });
+
+            if (r.getMatchVideoId() != null) {
+                ChannelDemandMatchVO.MatchedVideo mv = new ChannelDemandMatchVO.MatchedVideo();
+                mv.setVideoId(r.getMatchVideoId());
+                mv.setConfigCode(r.getMatchConfigCode());
+                mv.setScore(r.getMatchScore());
+                mv.setSim(r.getMatchSim());
+                mv.setRov(r.getMatchRov());
+                mv.setText(r.getMatchText());
+                vo.getMatchedVideos().add(mv);
+            }
+        }
+
+        return new ArrayList<>(groupMap.values());
+    }
 }

+ 11 - 5
core/src/main/resources/generator/mybatis-pgvector-generator-config.xml

@@ -55,11 +55,11 @@
         </javaClientGenerator>
 
         <!-- 视频向量主表 -->
-        <table tableName="video_vectors" domainObjectName="VideoVector" alias="">
-            <generatedKey column="id" sqlStatement="JDBC" identity="true"/>
-            <!-- pgvector 的 vector 类型强制映射为 String -->
-            <columnOverride column="embedding" javaType="java.lang.String" jdbcType="VARCHAR"/>
-        </table>
+<!--        <table tableName="video_vectors" domainObjectName="VideoVector" alias="">-->
+<!--            <generatedKey column="id" sqlStatement="JDBC" identity="true"/>-->
+<!--            &lt;!&ndash; pgvector 的 vector 类型强制映射为 String &ndash;&gt;-->
+<!--            <columnOverride column="embedding" javaType="java.lang.String" jdbcType="VARCHAR"/>-->
+<!--        </table>-->
 
         <!-- 素材向量表(embedding 列类型 MBG 不识别,生成后需手动补充) -->
 <!--        <table tableName="content_vectors" domainObjectName="ContentVector" alias="">-->
@@ -77,6 +77,12 @@
 <!--        <table tableName="deconstruct_vector_config" domainObjectName="DeconstructVectorConfig" alias="">-->
 <!--            <generatedKey column="id" sqlStatement="JDBC" identity="true"/>-->
 <!--        </table>-->
+        <table tableName="channel_demand_match_config" domainObjectName="ChannelDemandMatchConfig" alias="">
+            <generatedKey column="id" sqlStatement="JDBC" identity="true"/>
+        </table>
+        <table tableName="channel_demand_match_result" domainObjectName="ChannelDemandMatchResult" alias="">
+            <generatedKey column="id" sqlStatement="JDBC" identity="true"/>
+        </table>
     </context>
 
 </generatorConfiguration>

+ 312 - 0
core/src/main/resources/mapper/pgVector/ChannelDemandMatchConfigMapper.xml

@@ -0,0 +1,312 @@
+<?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.pgVector.ChannelDemandMatchConfigMapper">
+  <resultMap id="BaseResultMap" type="com.tzld.videoVector.model.po.pgVector.ChannelDemandMatchConfig">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+    -->
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="channel_name" jdbcType="VARCHAR" property="channelName" />
+    <result column="min_uv" jdbcType="INTEGER" property="minUv" />
+    <result column="min_rov" jdbcType="DOUBLE" property="minRov" />
+    <result column="top_n" jdbcType="INTEGER" property="topN" />
+    <result column="status" jdbcType="SMALLINT" property="status" />
+    <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.
+    -->
+    <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.
+    -->
+    <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.
+    -->
+    id, channel_name, min_uv, min_rov, top_n, "status", create_time, update_time
+  </sql>
+  <select id="selectByExample" parameterType="com.tzld.videoVector.model.po.pgVector.ChannelDemandMatchConfigExample" resultMap="BaseResultMap">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+    -->
+    select
+    <if test="distinct">
+      distinct
+    </if>
+    <include refid="Base_Column_List" />
+    from channel_demand_match_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.
+    -->
+    select 
+    <include refid="Base_Column_List" />
+    from channel_demand_match_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.
+    -->
+    delete from channel_demand_match_config
+    where id = #{id,jdbcType=BIGINT}
+  </delete>
+  <delete id="deleteByExample" parameterType="com.tzld.videoVector.model.po.pgVector.ChannelDemandMatchConfigExample">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+    -->
+    delete from channel_demand_match_config
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </delete>
+  <insert id="insert" keyColumn="id" keyProperty="id" parameterType="com.tzld.videoVector.model.po.pgVector.ChannelDemandMatchConfig" useGeneratedKeys="true">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+    -->
+    insert into channel_demand_match_config (channel_name, min_uv, min_rov, 
+      top_n, "status", create_time, 
+      update_time)
+    values (#{channelName,jdbcType=VARCHAR}, #{minUv,jdbcType=INTEGER}, #{minRov,jdbcType=DOUBLE}, 
+      #{topN,jdbcType=INTEGER}, #{status,jdbcType=SMALLINT}, #{createTime,jdbcType=TIMESTAMP}, 
+      #{updateTime,jdbcType=TIMESTAMP})
+  </insert>
+  <insert id="insertSelective" keyColumn="id" keyProperty="id" parameterType="com.tzld.videoVector.model.po.pgVector.ChannelDemandMatchConfig" useGeneratedKeys="true">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+    -->
+    insert into channel_demand_match_config
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="channelName != null">
+        channel_name,
+      </if>
+      <if test="minUv != null">
+        min_uv,
+      </if>
+      <if test="minRov != null">
+        min_rov,
+      </if>
+      <if test="topN != null">
+        top_n,
+      </if>
+      <if test="status != null">
+        "status",
+      </if>
+      <if test="createTime != null">
+        create_time,
+      </if>
+      <if test="updateTime != null">
+        update_time,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="channelName != null">
+        #{channelName,jdbcType=VARCHAR},
+      </if>
+      <if test="minUv != null">
+        #{minUv,jdbcType=INTEGER},
+      </if>
+      <if test="minRov != null">
+        #{minRov,jdbcType=DOUBLE},
+      </if>
+      <if test="topN != null">
+        #{topN,jdbcType=INTEGER},
+      </if>
+      <if test="status != null">
+        #{status,jdbcType=SMALLINT},
+      </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.pgVector.ChannelDemandMatchConfigExample" resultType="java.lang.Long">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+    -->
+    select count(*) from channel_demand_match_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.
+    -->
+    update channel_demand_match_config
+    <set>
+      <if test="record.id != null">
+        id = #{record.id,jdbcType=BIGINT},
+      </if>
+      <if test="record.channelName != null">
+        channel_name = #{record.channelName,jdbcType=VARCHAR},
+      </if>
+      <if test="record.minUv != null">
+        min_uv = #{record.minUv,jdbcType=INTEGER},
+      </if>
+      <if test="record.minRov != null">
+        min_rov = #{record.minRov,jdbcType=DOUBLE},
+      </if>
+      <if test="record.topN != null">
+        top_n = #{record.topN,jdbcType=INTEGER},
+      </if>
+      <if test="record.status != null">
+        "status" = #{record.status,jdbcType=SMALLINT},
+      </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.
+    -->
+    update channel_demand_match_config
+    set id = #{record.id,jdbcType=BIGINT},
+      channel_name = #{record.channelName,jdbcType=VARCHAR},
+      min_uv = #{record.minUv,jdbcType=INTEGER},
+      min_rov = #{record.minRov,jdbcType=DOUBLE},
+      top_n = #{record.topN,jdbcType=INTEGER},
+      "status" = #{record.status,jdbcType=SMALLINT},
+      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.pgVector.ChannelDemandMatchConfig">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+    -->
+    update channel_demand_match_config
+    <set>
+      <if test="channelName != null">
+        channel_name = #{channelName,jdbcType=VARCHAR},
+      </if>
+      <if test="minUv != null">
+        min_uv = #{minUv,jdbcType=INTEGER},
+      </if>
+      <if test="minRov != null">
+        min_rov = #{minRov,jdbcType=DOUBLE},
+      </if>
+      <if test="topN != null">
+        top_n = #{topN,jdbcType=INTEGER},
+      </if>
+      <if test="status != null">
+        "status" = #{status,jdbcType=SMALLINT},
+      </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.pgVector.ChannelDemandMatchConfig">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+    -->
+    update channel_demand_match_config
+    set channel_name = #{channelName,jdbcType=VARCHAR},
+      min_uv = #{minUv,jdbcType=INTEGER},
+      min_rov = #{minRov,jdbcType=DOUBLE},
+      top_n = #{topN,jdbcType=INTEGER},
+      "status" = #{status,jdbcType=SMALLINT},
+      create_time = #{createTime,jdbcType=TIMESTAMP},
+      update_time = #{updateTime,jdbcType=TIMESTAMP}
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+</mapper>

+ 582 - 0
core/src/main/resources/mapper/pgVector/ChannelDemandMatchResultMapper.xml

@@ -0,0 +1,582 @@
+<?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.pgVector.ChannelDemandMatchResultMapper">
+  <resultMap id="BaseResultMap" type="com.tzld.videoVector.model.po.pgVector.ChannelDemandMatchResult">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+    -->
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="config_id" jdbcType="BIGINT" property="configId" />
+    <result column="dt" jdbcType="VARCHAR" property="dt" />
+    <result column="channel_name" jdbcType="VARCHAR" property="channelName" />
+    <result column="crowd_segment" jdbcType="VARCHAR" property="crowdSegment" />
+    <result column="dimension" jdbcType="VARCHAR" property="dimension" />
+    <result column="point_type" jdbcType="VARCHAR" property="pointType" />
+    <result column="standard_element" jdbcType="VARCHAR" property="standardElement" />
+    <result column="category_name" jdbcType="VARCHAR" property="categoryName" />
+    <result column="crowd_count" jdbcType="INTEGER" property="crowdCount" />
+    <result column="video_count" jdbcType="INTEGER" property="videoCount" />
+    <result column="visit_uv" jdbcType="BIGINT" property="visitUv" />
+    <result column="visit_pv" jdbcType="BIGINT" property="visitPv" />
+    <result column="share_pv" jdbcType="BIGINT" property="sharePv" />
+    <result column="backflow_uv" jdbcType="BIGINT" property="backflowUv" />
+    <result column="total_rov" jdbcType="DOUBLE" property="totalRov" />
+    <result column="match_video_id" jdbcType="BIGINT" property="matchVideoId" />
+    <result column="match_config_code" jdbcType="VARCHAR" property="matchConfigCode" />
+    <result column="match_score" jdbcType="DOUBLE" property="matchScore" />
+    <result column="match_sim" jdbcType="DOUBLE" property="matchSim" />
+    <result column="match_rov" jdbcType="DOUBLE" property="matchRov" />
+    <result column="match_text" jdbcType="VARCHAR" property="matchText" />
+    <result column="match_status" jdbcType="SMALLINT" property="matchStatus" />
+    <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.
+    -->
+    <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.
+    -->
+    <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.
+    -->
+    id, config_id, dt, channel_name, crowd_segment, dimension, point_type, standard_element, 
+    category_name, crowd_count, video_count, visit_uv, visit_pv, share_pv, backflow_uv, 
+    total_rov, match_video_id, match_config_code, match_score, match_sim, match_rov, 
+    match_text, match_status, create_time, update_time
+  </sql>
+  <select id="selectByExample" parameterType="com.tzld.videoVector.model.po.pgVector.ChannelDemandMatchResultExample" resultMap="BaseResultMap">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+    -->
+    select
+    <if test="distinct">
+      distinct
+    </if>
+    <include refid="Base_Column_List" />
+    from channel_demand_match_result
+    <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.
+    -->
+    select 
+    <include refid="Base_Column_List" />
+    from channel_demand_match_result
+    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.
+    -->
+    delete from channel_demand_match_result
+    where id = #{id,jdbcType=BIGINT}
+  </delete>
+  <delete id="deleteByExample" parameterType="com.tzld.videoVector.model.po.pgVector.ChannelDemandMatchResultExample">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+    -->
+    delete from channel_demand_match_result
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </delete>
+  <insert id="insert" keyColumn="id" keyProperty="id" parameterType="com.tzld.videoVector.model.po.pgVector.ChannelDemandMatchResult" useGeneratedKeys="true">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+    -->
+    insert into channel_demand_match_result (config_id, dt, channel_name, 
+      crowd_segment, dimension, point_type, 
+      standard_element, category_name, crowd_count, 
+      video_count, visit_uv, visit_pv, 
+      share_pv, backflow_uv, total_rov, 
+      match_video_id, match_config_code, match_score, 
+      match_sim, match_rov, match_text, 
+      match_status, create_time, update_time
+      )
+    values (#{configId,jdbcType=BIGINT}, #{dt,jdbcType=VARCHAR}, #{channelName,jdbcType=VARCHAR}, 
+      #{crowdSegment,jdbcType=VARCHAR}, #{dimension,jdbcType=VARCHAR}, #{pointType,jdbcType=VARCHAR}, 
+      #{standardElement,jdbcType=VARCHAR}, #{categoryName,jdbcType=VARCHAR}, #{crowdCount,jdbcType=INTEGER}, 
+      #{videoCount,jdbcType=INTEGER}, #{visitUv,jdbcType=BIGINT}, #{visitPv,jdbcType=BIGINT}, 
+      #{sharePv,jdbcType=BIGINT}, #{backflowUv,jdbcType=BIGINT}, #{totalRov,jdbcType=DOUBLE}, 
+      #{matchVideoId,jdbcType=BIGINT}, #{matchConfigCode,jdbcType=VARCHAR}, #{matchScore,jdbcType=DOUBLE}, 
+      #{matchSim,jdbcType=DOUBLE}, #{matchRov,jdbcType=DOUBLE}, #{matchText,jdbcType=VARCHAR}, 
+      #{matchStatus,jdbcType=SMALLINT}, #{createTime,jdbcType=TIMESTAMP}, #{updateTime,jdbcType=TIMESTAMP}
+      )
+  </insert>
+  <insert id="insertSelective" keyColumn="id" keyProperty="id" parameterType="com.tzld.videoVector.model.po.pgVector.ChannelDemandMatchResult" useGeneratedKeys="true">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+    -->
+    insert into channel_demand_match_result
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="configId != null">
+        config_id,
+      </if>
+      <if test="dt != null">
+        dt,
+      </if>
+      <if test="channelName != null">
+        channel_name,
+      </if>
+      <if test="crowdSegment != null">
+        crowd_segment,
+      </if>
+      <if test="dimension != null">
+        dimension,
+      </if>
+      <if test="pointType != null">
+        point_type,
+      </if>
+      <if test="standardElement != null">
+        standard_element,
+      </if>
+      <if test="categoryName != null">
+        category_name,
+      </if>
+      <if test="crowdCount != null">
+        crowd_count,
+      </if>
+      <if test="videoCount != null">
+        video_count,
+      </if>
+      <if test="visitUv != null">
+        visit_uv,
+      </if>
+      <if test="visitPv != null">
+        visit_pv,
+      </if>
+      <if test="sharePv != null">
+        share_pv,
+      </if>
+      <if test="backflowUv != null">
+        backflow_uv,
+      </if>
+      <if test="totalRov != null">
+        total_rov,
+      </if>
+      <if test="matchVideoId != null">
+        match_video_id,
+      </if>
+      <if test="matchConfigCode != null">
+        match_config_code,
+      </if>
+      <if test="matchScore != null">
+        match_score,
+      </if>
+      <if test="matchSim != null">
+        match_sim,
+      </if>
+      <if test="matchRov != null">
+        match_rov,
+      </if>
+      <if test="matchText != null">
+        match_text,
+      </if>
+      <if test="matchStatus != null">
+        match_status,
+      </if>
+      <if test="createTime != null">
+        create_time,
+      </if>
+      <if test="updateTime != null">
+        update_time,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="configId != null">
+        #{configId,jdbcType=BIGINT},
+      </if>
+      <if test="dt != null">
+        #{dt,jdbcType=VARCHAR},
+      </if>
+      <if test="channelName != null">
+        #{channelName,jdbcType=VARCHAR},
+      </if>
+      <if test="crowdSegment != null">
+        #{crowdSegment,jdbcType=VARCHAR},
+      </if>
+      <if test="dimension != null">
+        #{dimension,jdbcType=VARCHAR},
+      </if>
+      <if test="pointType != null">
+        #{pointType,jdbcType=VARCHAR},
+      </if>
+      <if test="standardElement != null">
+        #{standardElement,jdbcType=VARCHAR},
+      </if>
+      <if test="categoryName != null">
+        #{categoryName,jdbcType=VARCHAR},
+      </if>
+      <if test="crowdCount != null">
+        #{crowdCount,jdbcType=INTEGER},
+      </if>
+      <if test="videoCount != null">
+        #{videoCount,jdbcType=INTEGER},
+      </if>
+      <if test="visitUv != null">
+        #{visitUv,jdbcType=BIGINT},
+      </if>
+      <if test="visitPv != null">
+        #{visitPv,jdbcType=BIGINT},
+      </if>
+      <if test="sharePv != null">
+        #{sharePv,jdbcType=BIGINT},
+      </if>
+      <if test="backflowUv != null">
+        #{backflowUv,jdbcType=BIGINT},
+      </if>
+      <if test="totalRov != null">
+        #{totalRov,jdbcType=DOUBLE},
+      </if>
+      <if test="matchVideoId != null">
+        #{matchVideoId,jdbcType=BIGINT},
+      </if>
+      <if test="matchConfigCode != null">
+        #{matchConfigCode,jdbcType=VARCHAR},
+      </if>
+      <if test="matchScore != null">
+        #{matchScore,jdbcType=DOUBLE},
+      </if>
+      <if test="matchSim != null">
+        #{matchSim,jdbcType=DOUBLE},
+      </if>
+      <if test="matchRov != null">
+        #{matchRov,jdbcType=DOUBLE},
+      </if>
+      <if test="matchText != null">
+        #{matchText,jdbcType=VARCHAR},
+      </if>
+      <if test="matchStatus != null">
+        #{matchStatus,jdbcType=SMALLINT},
+      </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.pgVector.ChannelDemandMatchResultExample" resultType="java.lang.Long">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+    -->
+    select count(*) from channel_demand_match_result
+    <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.
+    -->
+    update channel_demand_match_result
+    <set>
+      <if test="record.id != null">
+        id = #{record.id,jdbcType=BIGINT},
+      </if>
+      <if test="record.configId != null">
+        config_id = #{record.configId,jdbcType=BIGINT},
+      </if>
+      <if test="record.dt != null">
+        dt = #{record.dt,jdbcType=VARCHAR},
+      </if>
+      <if test="record.channelName != null">
+        channel_name = #{record.channelName,jdbcType=VARCHAR},
+      </if>
+      <if test="record.crowdSegment != null">
+        crowd_segment = #{record.crowdSegment,jdbcType=VARCHAR},
+      </if>
+      <if test="record.dimension != null">
+        dimension = #{record.dimension,jdbcType=VARCHAR},
+      </if>
+      <if test="record.pointType != null">
+        point_type = #{record.pointType,jdbcType=VARCHAR},
+      </if>
+      <if test="record.standardElement != null">
+        standard_element = #{record.standardElement,jdbcType=VARCHAR},
+      </if>
+      <if test="record.categoryName != null">
+        category_name = #{record.categoryName,jdbcType=VARCHAR},
+      </if>
+      <if test="record.crowdCount != null">
+        crowd_count = #{record.crowdCount,jdbcType=INTEGER},
+      </if>
+      <if test="record.videoCount != null">
+        video_count = #{record.videoCount,jdbcType=INTEGER},
+      </if>
+      <if test="record.visitUv != null">
+        visit_uv = #{record.visitUv,jdbcType=BIGINT},
+      </if>
+      <if test="record.visitPv != null">
+        visit_pv = #{record.visitPv,jdbcType=BIGINT},
+      </if>
+      <if test="record.sharePv != null">
+        share_pv = #{record.sharePv,jdbcType=BIGINT},
+      </if>
+      <if test="record.backflowUv != null">
+        backflow_uv = #{record.backflowUv,jdbcType=BIGINT},
+      </if>
+      <if test="record.totalRov != null">
+        total_rov = #{record.totalRov,jdbcType=DOUBLE},
+      </if>
+      <if test="record.matchVideoId != null">
+        match_video_id = #{record.matchVideoId,jdbcType=BIGINT},
+      </if>
+      <if test="record.matchConfigCode != null">
+        match_config_code = #{record.matchConfigCode,jdbcType=VARCHAR},
+      </if>
+      <if test="record.matchScore != null">
+        match_score = #{record.matchScore,jdbcType=DOUBLE},
+      </if>
+      <if test="record.matchSim != null">
+        match_sim = #{record.matchSim,jdbcType=DOUBLE},
+      </if>
+      <if test="record.matchRov != null">
+        match_rov = #{record.matchRov,jdbcType=DOUBLE},
+      </if>
+      <if test="record.matchText != null">
+        match_text = #{record.matchText,jdbcType=VARCHAR},
+      </if>
+      <if test="record.matchStatus != null">
+        match_status = #{record.matchStatus,jdbcType=SMALLINT},
+      </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.
+    -->
+    update channel_demand_match_result
+    set id = #{record.id,jdbcType=BIGINT},
+      config_id = #{record.configId,jdbcType=BIGINT},
+      dt = #{record.dt,jdbcType=VARCHAR},
+      channel_name = #{record.channelName,jdbcType=VARCHAR},
+      crowd_segment = #{record.crowdSegment,jdbcType=VARCHAR},
+      dimension = #{record.dimension,jdbcType=VARCHAR},
+      point_type = #{record.pointType,jdbcType=VARCHAR},
+      standard_element = #{record.standardElement,jdbcType=VARCHAR},
+      category_name = #{record.categoryName,jdbcType=VARCHAR},
+      crowd_count = #{record.crowdCount,jdbcType=INTEGER},
+      video_count = #{record.videoCount,jdbcType=INTEGER},
+      visit_uv = #{record.visitUv,jdbcType=BIGINT},
+      visit_pv = #{record.visitPv,jdbcType=BIGINT},
+      share_pv = #{record.sharePv,jdbcType=BIGINT},
+      backflow_uv = #{record.backflowUv,jdbcType=BIGINT},
+      total_rov = #{record.totalRov,jdbcType=DOUBLE},
+      match_video_id = #{record.matchVideoId,jdbcType=BIGINT},
+      match_config_code = #{record.matchConfigCode,jdbcType=VARCHAR},
+      match_score = #{record.matchScore,jdbcType=DOUBLE},
+      match_sim = #{record.matchSim,jdbcType=DOUBLE},
+      match_rov = #{record.matchRov,jdbcType=DOUBLE},
+      match_text = #{record.matchText,jdbcType=VARCHAR},
+      match_status = #{record.matchStatus,jdbcType=SMALLINT},
+      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.pgVector.ChannelDemandMatchResult">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+    -->
+    update channel_demand_match_result
+    <set>
+      <if test="configId != null">
+        config_id = #{configId,jdbcType=BIGINT},
+      </if>
+      <if test="dt != null">
+        dt = #{dt,jdbcType=VARCHAR},
+      </if>
+      <if test="channelName != null">
+        channel_name = #{channelName,jdbcType=VARCHAR},
+      </if>
+      <if test="crowdSegment != null">
+        crowd_segment = #{crowdSegment,jdbcType=VARCHAR},
+      </if>
+      <if test="dimension != null">
+        dimension = #{dimension,jdbcType=VARCHAR},
+      </if>
+      <if test="pointType != null">
+        point_type = #{pointType,jdbcType=VARCHAR},
+      </if>
+      <if test="standardElement != null">
+        standard_element = #{standardElement,jdbcType=VARCHAR},
+      </if>
+      <if test="categoryName != null">
+        category_name = #{categoryName,jdbcType=VARCHAR},
+      </if>
+      <if test="crowdCount != null">
+        crowd_count = #{crowdCount,jdbcType=INTEGER},
+      </if>
+      <if test="videoCount != null">
+        video_count = #{videoCount,jdbcType=INTEGER},
+      </if>
+      <if test="visitUv != null">
+        visit_uv = #{visitUv,jdbcType=BIGINT},
+      </if>
+      <if test="visitPv != null">
+        visit_pv = #{visitPv,jdbcType=BIGINT},
+      </if>
+      <if test="sharePv != null">
+        share_pv = #{sharePv,jdbcType=BIGINT},
+      </if>
+      <if test="backflowUv != null">
+        backflow_uv = #{backflowUv,jdbcType=BIGINT},
+      </if>
+      <if test="totalRov != null">
+        total_rov = #{totalRov,jdbcType=DOUBLE},
+      </if>
+      <if test="matchVideoId != null">
+        match_video_id = #{matchVideoId,jdbcType=BIGINT},
+      </if>
+      <if test="matchConfigCode != null">
+        match_config_code = #{matchConfigCode,jdbcType=VARCHAR},
+      </if>
+      <if test="matchScore != null">
+        match_score = #{matchScore,jdbcType=DOUBLE},
+      </if>
+      <if test="matchSim != null">
+        match_sim = #{matchSim,jdbcType=DOUBLE},
+      </if>
+      <if test="matchRov != null">
+        match_rov = #{matchRov,jdbcType=DOUBLE},
+      </if>
+      <if test="matchText != null">
+        match_text = #{matchText,jdbcType=VARCHAR},
+      </if>
+      <if test="matchStatus != null">
+        match_status = #{matchStatus,jdbcType=SMALLINT},
+      </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.pgVector.ChannelDemandMatchResult">
+    <!--
+      WARNING - @mbg.generated
+      This element is automatically generated by MyBatis Generator, do not modify.
+    -->
+    update channel_demand_match_result
+    set config_id = #{configId,jdbcType=BIGINT},
+      dt = #{dt,jdbcType=VARCHAR},
+      channel_name = #{channelName,jdbcType=VARCHAR},
+      crowd_segment = #{crowdSegment,jdbcType=VARCHAR},
+      dimension = #{dimension,jdbcType=VARCHAR},
+      point_type = #{pointType,jdbcType=VARCHAR},
+      standard_element = #{standardElement,jdbcType=VARCHAR},
+      category_name = #{categoryName,jdbcType=VARCHAR},
+      crowd_count = #{crowdCount,jdbcType=INTEGER},
+      video_count = #{videoCount,jdbcType=INTEGER},
+      visit_uv = #{visitUv,jdbcType=BIGINT},
+      visit_pv = #{visitPv,jdbcType=BIGINT},
+      share_pv = #{sharePv,jdbcType=BIGINT},
+      backflow_uv = #{backflowUv,jdbcType=BIGINT},
+      total_rov = #{totalRov,jdbcType=DOUBLE},
+      match_video_id = #{matchVideoId,jdbcType=BIGINT},
+      match_config_code = #{matchConfigCode,jdbcType=VARCHAR},
+      match_score = #{matchScore,jdbcType=DOUBLE},
+      match_sim = #{matchSim,jdbcType=DOUBLE},
+      match_rov = #{matchRov,jdbcType=DOUBLE},
+      match_text = #{matchText,jdbcType=VARCHAR},
+      match_status = #{matchStatus,jdbcType=SMALLINT},
+      create_time = #{createTime,jdbcType=TIMESTAMP},
+      update_time = #{updateTime,jdbcType=TIMESTAMP}
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+</mapper>

+ 25 - 0
core/src/main/resources/mapper/pgVector/ext/ChannelDemandMatchResultMapperExt.xml

@@ -0,0 +1,25 @@
+<?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.pgVector.ext.ChannelDemandMatchResultMapperExt">
+  <insert id="batchInsert" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
+    insert into channel_demand_match_result (config_id, dt, channel_name,
+      crowd_segment, dimension, point_type,
+      standard_element, category_name, crowd_count,
+      video_count, visit_uv, visit_pv,
+      share_pv, backflow_uv, total_rov,
+      match_video_id, match_config_code, match_score,
+      match_sim, match_rov, match_text,
+      match_status)
+    values
+    <foreach collection="list" item="item" separator=",">
+      (#{item.configId,jdbcType=BIGINT}, #{item.dt,jdbcType=VARCHAR}, #{item.channelName,jdbcType=VARCHAR},
+      #{item.crowdSegment,jdbcType=VARCHAR}, #{item.dimension,jdbcType=VARCHAR}, #{item.pointType,jdbcType=VARCHAR},
+      #{item.standardElement,jdbcType=VARCHAR}, #{item.categoryName,jdbcType=VARCHAR}, #{item.crowdCount,jdbcType=INTEGER},
+      #{item.videoCount,jdbcType=INTEGER}, #{item.visitUv,jdbcType=BIGINT}, #{item.visitPv,jdbcType=BIGINT},
+      #{item.sharePv,jdbcType=BIGINT}, #{item.backflowUv,jdbcType=BIGINT}, #{item.totalRov,jdbcType=DOUBLE},
+      #{item.matchVideoId,jdbcType=BIGINT}, #{item.matchConfigCode,jdbcType=VARCHAR}, #{item.matchScore,jdbcType=DOUBLE},
+      #{item.matchSim,jdbcType=DOUBLE}, #{item.matchRov,jdbcType=DOUBLE}, #{item.matchText,jdbcType=VARCHAR},
+      #{item.matchStatus,jdbcType=SMALLINT})
+    </foreach>
+  </insert>
+</mapper>

+ 25 - 0
server/src/main/java/com/tzld/videoVector/controller/VideoSearchController.java

@@ -2,9 +2,13 @@ package com.tzld.videoVector.controller;
 
 import com.alibaba.fastjson.JSONObject;
 import com.tzld.videoVector.common.base.CommonResponse;
+import com.tzld.videoVector.model.param.ChannelDemandMatchQueryParam;
 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.param.RecallVideoScoreParam;
+import com.tzld.videoVector.model.vo.ChannelDemandMatchVO;
+import com.tzld.videoVector.model.vo.RecallVideoScoreVO;
 import com.tzld.videoVector.model.vo.VideoMatchResult;
 import com.tzld.videoVector.service.VideoSearchService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -49,4 +53,25 @@ public class VideoSearchController {
     public CommonResponse<Map<String, String>> getAllConfigCodes() {
         return CommonResponse.success(videoSearchService.getAllConfigCodes());
     }
+
+    /**
+     * 召回视频并按综合评分排序
+     * 综合分 = alpha * sim_norm + (1-alpha) * rov_norm
+     * POST /videoSearch/recallWithScore
+     */
+    @PostMapping("/recallWithScore")
+    public CommonResponse<RecallVideoScoreVO> recallWithScore(@RequestBody RecallVideoScoreParam param) {
+        return CommonResponse.success(videoSearchService.recallWithScore(param));
+    }
+
+    /**
+     * 查询渠道需求匹配结果
+     * 按日期、渠道、人群、维度查询匹配到的视频ID及分数
+     * POST /videoSearch/queryDemandMatchResult
+     */
+    @PostMapping("/queryDemandMatchResult")
+    public CommonResponse<List<ChannelDemandMatchVO>> queryDemandMatchResult(
+            @RequestBody ChannelDemandMatchQueryParam param) {
+        return CommonResponse.success(videoSearchService.queryDemandMatchResult(param));
+    }
 }

+ 11 - 0
server/src/main/java/com/tzld/videoVector/controller/XxlJobController.java

@@ -29,6 +29,9 @@ public class XxlJobController {
     @Autowired
     private AiUnderstandingSyncJob aiUnderstandingSyncJob;
 
+    @Autowired
+    private ChannelDemandMatchJob channelDemandMatchJob;
+
     // ==================== 视频向量化任务 ====================
 
     @GetMapping("/vectorVideoJob")
@@ -99,4 +102,12 @@ public class XxlJobController {
         return CommonResponse.success();
     }
 
+    // ==================== 渠道需求匹配任务 ====================
+
+    @GetMapping("/channelDemandMatchJob")
+    public CommonResponse<Void> channelDemandMatchJob() {
+        channelDemandMatchJob.channelDemandMatchJob(null);
+        return CommonResponse.success();
+    }
+
 }