فهرست منبع

尾号ecpm小流量实验尾号修改

yaodaoseng 1 هفته پیش
والد
کامیت
a43e93de4b

+ 64 - 0
ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/util/RootSessionIdUtil.java

@@ -0,0 +1,64 @@
+package com.tzld.piaoquan.ad.engine.commons.util;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+/**
+ * RootSessionId 工具类
+ * 用于获取 rootSessionId 的尾号,支持从 Apollo 配置中读取倒数第几位
+ *
+ * @author fanjinyang
+ */
+@Component
+public class RootSessionIdUtil {
+
+    /**
+     * 倒数 rootSessionId 的第几个尾号做广告分组,从 0 开始
+     * 0 表示最后一位,1 表示倒数第二位,以此类推
+     * 默认值为 0(最后一位)
+     */
+    @Value("${ad.rootsessionid.tail.number:0}")
+    private Integer tailNumber;
+
+    /**
+     * 获取 rootSessionId 的尾号
+     * 根据配置的 tailNumber 从后往前取字符
+     *
+     * @param rootSessionId 会话ID
+     * @return 尾号字符,如果 rootSessionId 为空或长度不足则返回 null
+     */
+    public String getTail(String rootSessionId) {
+        if (StringUtils.isBlank(rootSessionId)) {
+            return null;
+        }
+
+        // 确保 tailNumber 不为 null
+        int index = (tailNumber != null) ? tailNumber : 0;
+
+        // 确保索引不为负数
+        if (index < 0) {
+            index = 0;
+        }
+
+        // 计算实际位置:从后往前数,0 表示最后一位
+        int position = rootSessionId.length() - 1 - index;
+
+        // 检查位置是否有效
+        if (position < 0 || position >= rootSessionId.length()) {
+            return null;
+        }
+
+        return String.valueOf(rootSessionId.charAt(position));
+    }
+
+    /**
+     * 获取配置的尾号位置
+     *
+     * @return 倒数第几位(从 0 开始)
+     */
+    public Integer getTailNumber() {
+        return tailNumber;
+    }
+}
+

+ 6 - 1
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/v2/PredictStrategyByAppTypeTail.java

@@ -2,9 +2,11 @@ package com.tzld.piaoquan.ad.engine.service.predict.v2;
 
 import com.alibaba.fastjson.JSONObject;
 import com.ctrip.framework.apollo.spring.annotation.ApolloJsonValue;
+import com.tzld.piaoquan.ad.engine.commons.util.RootSessionIdUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.util.HashMap;
@@ -49,6 +51,9 @@ public class PredictStrategyByAppTypeTail extends BasicPredict {
     @ApolloJsonValue("${experiment.app.type.tail.ecpm.config:[]}")
     private List<RootSessionIdTailConfigItem> configItems;
 
+
+    @Autowired
+    private RootSessionIdUtil rootSessionIdUtil;
     /**
      * 策略名称标识
      */
@@ -77,7 +82,7 @@ public class PredictStrategyByAppTypeTail extends BasicPredict {
             }
 
             // 提取 rootSessionId 的最后一个字符作为尾号
-            String tail = rootSessionId.substring(rootSessionId.length() - 1);
+            String tail = rootSessionIdUtil.getTail(rootSessionId);
 
             // 遍历配置项,查找同时匹配 appType 和尾号的配置
             for (RootSessionIdTailConfigItem item : configItems) {