luojunhui 1 день назад
Родитель
Сommit
312e2b3467

+ 3 - 0
.gitignore

@@ -43,3 +43,6 @@ script/recall_test_results/
 
 CLAUDE.md
 docs
+
+### 测试配置(含本地密钥,禁止提交)###
+**/application-test-local.yml

+ 8 - 3
core/src/main/java/com/tzld/videoVector/job/MaterialQualitySyncJob.java

@@ -213,7 +213,7 @@ public class MaterialQualitySyncJob {
            .append("WHERE dt >= '").append(start).append("' AND dt <= '").append(end).append("'\n");
 
         if (creativeStatus != null && !creativeStatus.isEmpty()) {
-            sql.append("  AND `创意状态` = '").append(creativeStatus).append("'\n");
+            sql.append("  AND `创意状态` = '").append(creativeStatus.replace("'", "''")).append("'\n");
         }
 
         sql.append("GROUP BY `创意id`\n")
@@ -250,10 +250,15 @@ public class MaterialQualitySyncJob {
                 + "WHERE dt >= '" + start + "' AND dt <= '" + end + "'";
         log.info("探针-范围 SQL (dt >= {}, dt <= {}): {}", start, end, rangeSql);
         try {
+            long[] rowCount = {0};
             OdpsUtil.getOdpsDataStream(rangeSql, record -> {
-                long total = record.getBigint("total") != null ? record.getBigint("total") : 0;
-                log.info("  时间范围行数: {}", total);
+                rowCount[0] = record.getBigint("total") != null ? record.getBigint("total") : 0;
+                log.info("  时间范围行数: {}", rowCount[0]);
             });
+            if (rowCount[0] == 0) {
+                log.warn("探针-范围:时间范围内无数据, dt=[{}, {}]", start, end);
+                return false;
+            }
         } catch (Exception e) {
             log.error("探针-范围 查询失败: {}", e.getMessage(), e);
             return false;

+ 2 - 2
core/src/main/java/com/tzld/videoVector/service/recall/impl/VectorRecallTestServiceImpl.java

@@ -860,6 +860,7 @@ public class VectorRecallTestServiceImpl implements VectorRecallTestService {
             cost = mq.getCost30d();
         }
         map.put("use30d", use30d);
+        map.put("effectiveCost", cost);  // 实际用于计算的消耗(7d 不足时兜底为 30d)
 
         // 打开率(CTR) = 首层uv / 总转化量
         if (firstUv != null && firstUv > 0 && totalConv != null && totalConv > 0) {
@@ -869,11 +870,10 @@ public class VectorRecallTestServiceImpl implements VectorRecallTestService {
         if (viralCount != null && viralCount > 0 && firstUv != null && firstUv > 0) {
             map.put("viralRate7d", Math.round((double) viralCount / firstUv * 10000.0) / 10000.0);
         }
-        // ROI = 收入 / 消耗
+        // ROI = 收入 / effectiveCost
         if (cost != null && cost > 0 && rev != null && rev > 0) {
             map.put("roi7d", Math.round(rev / cost * 10000.0) / 10000.0);
         }
-        map.put("cost7d", cost);
         map.put("adOptimizationGoal", mq.getAdOptimizationGoal());
         map.put("packageName", mq.getPackageName());
         map.put("adStatus", mq.getAdStatus());

+ 1 - 1
core/src/main/java/com/tzld/videoVector/util/MaterialQualityCalculator.java

@@ -106,7 +106,7 @@ public class MaterialQualityCalculator {
 
             mq.setConversionEfficiencyScore(round2(dv.ctrPct));    // CTR 百分位
             mq.setViralScore(round2(dv.viralPct));                 // 裂变率 百分位
-            mq.setEngagementScore(round2(dv.roiPct));              // ROI 百分位
+            mq.setRevenueScore(round2(dv.roiPct));                 // ROI 百分位
             mq.setQualityScore(round2(qualityScore));
             mq.setConfidence(round2(confidence));
         }