fanjinyang преди 6 дни
родител
ревизия
f8650bd9f5
променени са 1 файла, в които са добавени 34 реда и са изтрити 1 реда
  1. 34 1
      ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/helper/CreativeKFinalDataHelper.java

+ 34 - 1
ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/helper/CreativeKFinalDataHelper.java

@@ -2,6 +2,8 @@ package com.tzld.piaoquan.ad.engine.commons.helper;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.ctrip.framework.apollo.spring.annotation.ApolloJsonValue;
+import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -28,8 +30,22 @@ public class CreativeKFinalDataHelper {
     private static final String CREATIVE_CODE_SET_KEY_FORMAT = "ad:addv:cost:current:creative:code:%s";
     private static final String CREATIVE_K_KEY_FORMAT = "ad:addv:cost:k:%s";
 
+    /**
+     * Apollo 动态配置:kFlow 转换参数
+     * 配置格式:{"kFlowMax": 1, "kFlowMin": 0.95, "kMin": 0.8}
+     */
+    @ApolloJsonValue("${ad.addv.kfinal.flow.config:{}}")
+    private KFlowConfig kFlowConfig;
+
     private volatile static Map<String, Double> creativeKFinalMap = Collections.emptyMap();
 
+    @Data
+    static class KFlowConfig {
+        private double kFlowMax = 1.0;
+        private double kFlowMin = 0.95;
+        private double kMin = 0.8;
+    }
+
     // 服务启动时初始化数据
     @PostConstruct
     public void init() {
@@ -69,7 +85,8 @@ public class CreativeKFinalDataHelper {
                         JSONObject jsonObject = JSON.parseObject(value);
                         Double kFinal = jsonObject.getDouble("kFinal");
                         if (kFinal != null) {
-                            tmpMap.put(creativeCode, kFinal);
+                            double kFlow = computeKFlow(kFinal);
+                            tmpMap.put(creativeCode, kFlow);
                         }
                     }
                 } catch (Exception e) {
@@ -82,4 +99,20 @@ public class CreativeKFinalDataHelper {
         }
         return tmpMap;
     }
+
+    /**
+     * 根据 kFinal 计算 kFlow:
+     * 1. kFlow = kFlowMin + (kFinal - kMin) / (1 - kMin) * (kFlowMax - kFlowMin)
+     * 2. kFlow = clamp(kFlow, kFlowMin, kFlowMax)
+     */
+    private double computeKFlow(double kFinal) {
+        double kFlowMax = kFlowConfig != null ? kFlowConfig.getKFlowMax() : 1.0;
+        double kFlowMin = kFlowConfig != null ? kFlowConfig.getKFlowMin() : 0.95;
+        double kMin = kFlowConfig != null ? kFlowConfig.getKMin() : 0.8;
+        if(kMin >=1){
+            return 1d;
+        }
+        double kFlow = kFlowMin + (kFinal - kMin) / (1.0 - kMin) * (kFlowMax - kFlowMin);
+        return Math.max(kFlowMin, Math.min(kFlowMax, kFlow));
+    }
 }