|
|
@@ -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));
|
|
|
+ }
|
|
|
}
|