Browse Source

Merge branch 'feature_20250812_zhaohaipeng_793' of algorithm/ad-engine into master

zhaohaipeng 14 hours ago
parent
commit
61e44064fd

+ 17 - 7
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/impl/PredictModelServiceImpl.java

@@ -23,10 +23,8 @@ import com.tzld.piaoquan.ad.engine.service.predict.param.RoiThresholdPredictMode
 import com.tzld.piaoquan.ad.engine.service.predict.param.ThresholdPredictModelParam;
 import com.tzld.piaoquan.ad.engine.service.predict.param.request.RoiPredictModelRequestParam;
 import com.tzld.piaoquan.ad.engine.service.predict.param.request.ThresholdPredictModelRequestParam;
-import com.tzld.piaoquan.ad.engine.service.predict.v2.ConvertUtil;
-import com.tzld.piaoquan.ad.engine.service.predict.v2.PredictContext;
-import com.tzld.piaoquan.ad.engine.service.predict.v2.PredictServiceV2;
-import com.tzld.piaoquan.ad.engine.service.predict.v2.RootSessionIdPredict;
+import com.tzld.piaoquan.ad.engine.service.predict.v2.*;
+import com.tzld.piaoquan.ad.engine.service.user.UserService;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.MapUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -67,6 +65,11 @@ public class PredictModelServiceImpl implements PredictModelService {
     private PredictServiceV2 predictServiceV2;
     @Autowired
     private RootSessionIdPredict rootSessionIdPredict;
+    @Autowired
+    private UserLayerRootSessionIdPredict userLayerRootSessionIdPredict;
+
+    @Autowired
+    private UserService userService;
 
     @Autowired
     private LogHubService logHubService;
@@ -271,14 +274,21 @@ public class PredictModelServiceImpl implements PredictModelService {
             modelParam.addUserExtraFuture("shareType", shareType);
             setExtraParam(modelParam);
 
+            requestParam.setShareType(shareType);
+            String userLayer = userService.getUserLayerByMid(requestParam.getMid());
+            requestParam.setUserLayer(userLayer);
+
             // 先走rootSessionId 实验
-            PredictContext ctx = ConvertUtil.predictParam2Context(requestParam);
-            ctx.setShareType(shareType);
-            Map<String, Object> predict = rootSessionIdPredict.predict(ctx);
+            Map<String, Object> predict = rootSessionIdPredict.predict(ConvertUtil.predictParam2Context(requestParam));
             if (MapUtils.isNotEmpty(predict)) {
                 return predict;
             }
 
+            Map<String, Object> userLayerPredict = userLayerRootSessionIdPredict.predict(ConvertUtil.predictParam2Context(requestParam));
+            if (MapUtils.isNotEmpty(userLayerPredict)) {
+                return userLayerPredict;
+            }
+
             String appTypeStr = requestParam.getAppType().toString();
 
             List<String> userSourceAndLayerAdRateExpIds = Arrays.asList(userSourceLayerAdRateExpIds.split(","));

+ 4 - 0
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/param/request/ThresholdPredictModelRequestParam.java

@@ -41,4 +41,8 @@ public class ThresholdPredictModelRequestParam {
     private String shareLayer;
 
     private String rootSessionId;
+
+    private String shareType;
+
+    private String userLayer;
 }

+ 18 - 0
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/v2/BasicPredict.java

@@ -1,7 +1,12 @@
 package com.tzld.piaoquan.ad.engine.service.predict.v2;
 
+import com.tzld.piaoquan.ad.engine.service.predict.container.RandWContainer;
+import lombok.Data;
+
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Map;
+import java.util.Set;
 
 public abstract class BasicPredict {
 
@@ -22,4 +27,17 @@ public abstract class BasicPredict {
         rtnMap.put("pqtId", ctx.getPqtId());
         return rtnMap;
     }
+
+    protected double calcScoreByMid(String mid) {
+        int hash = mid.hashCode();
+        hash = hash < 0 ? -hash : hash;
+        return (hash + RandWContainer.getRandW()) % 100 / 100d;
+    }
+
+    @Data
+    protected static class RootSessionIdTailConfigItem {
+        private Set<String> appType = new HashSet<>();
+        private Set<String> tail = new HashSet<>();
+        private Map<String, Double> config = new HashMap<>();
+    }
 }

+ 2 - 0
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/v2/ConvertUtil.java

@@ -29,6 +29,8 @@ public class ConvertUtil {
 
         context.setRootSessionId(param.getRootSessionId());
         context.setAdPlatformType(param.getAdPlatformType());
+        context.setShareType(param.getShareType());
+        context.setUserLayer(param.getUserLayer());
 
         JSONObject abExpInfo = param.getAbExpInfo();
         Map<String, JSONObject> expConfigMap = ConvertUtil.parseAbTest002Info(abExpInfo);

+ 2 - 0
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/v2/PredictContext.java

@@ -73,5 +73,7 @@ public class PredictContext {
 
     private String adPlatformType;
 
+    private String userLayer;
+
     private PredictLogParam logParam = new PredictLogParam();
 }

+ 8 - 15
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/v2/RootSessionIdPredict.java

@@ -3,21 +3,22 @@ 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.JSONUtils;
-import com.tzld.piaoquan.ad.engine.service.predict.container.RandWContainer;
-import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Component;
 
-import java.util.*;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 @Slf4j
 @Component
 public class RootSessionIdPredict extends BasicPredict {
 
     @ApolloJsonValue("${root.session.id.tail.predict.config:[]}")
-    private List<ConfigItem> configItems;
+    private List<RootSessionIdTailConfigItem> configItems;
 
     @Override
     public Map<String, Object> predict(PredictContext ctx) {
@@ -26,9 +27,8 @@ public class RootSessionIdPredict extends BasicPredict {
             return Collections.emptyMap();
         }
 
-        int hash = ctx.getMid().hashCode();
-        hash = hash < 0 ? -hash : hash;
-        double score = (hash + RandWContainer.getRandW()) % 100 / 100d;
+
+        double score = this.calcScoreByMid(ctx.getMid());
 
         String appType = ctx.getAppType();
         String tail = rootSessionId.substring(rootSessionId.length() - 1);
@@ -37,7 +37,7 @@ public class RootSessionIdPredict extends BasicPredict {
                 .replace("mids", "");
 
 
-        for (ConfigItem item : configItems) {
+        for (RootSessionIdTailConfigItem item : configItems) {
             if (item.getAppType().contains(appType) && item.getTail().contains(tail)) {
                 double threshold;
                 if (item.getConfig().containsKey(shareType)) {
@@ -83,11 +83,4 @@ public class RootSessionIdPredict extends BasicPredict {
 
         return Collections.emptyMap();
     }
-
-    @Data
-    private static class ConfigItem {
-        private Set<String> appType = new HashSet<>();
-        private Set<String> tail = new HashSet<>();
-        private Map<String, Double> config = new HashMap<>();
-    }
 }

+ 92 - 0
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/v2/UserLayerRootSessionIdPredict.java

@@ -0,0 +1,92 @@
+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.JSONUtils;
+import com.tzld.piaoquan.ad.engine.service.user.UserService;
+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.Component;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Slf4j
+@Component
+public class UserLayerRootSessionIdPredict extends BasicPredict {
+
+    @Autowired
+    private UserService userService;
+
+    @ApolloJsonValue("${user.layer.root.session.id.tail.predict.config:[]}")
+    private List<RootSessionIdTailConfigItem> configItems;
+
+    @Override
+    public Map<String, Object> predict(PredictContext ctx) {
+
+        String rootSessionId = ctx.getRootSessionId();
+        String userLayer = ctx.getUserLayer();
+        String shareType = ctx.getShareType();
+        if (CollectionUtils.isEmpty(configItems) || StringUtils.isAnyBlank(rootSessionId, userLayer, shareType)) {
+            return Collections.emptyMap();
+        }
+
+        double score = this.calcScoreByMid(ctx.getMid());
+        String appType = ctx.getAppType();
+        String tail = rootSessionId.substring(rootSessionId.length() - 1);
+        shareType = ctx.getShareType()
+                .replace("return", "")
+                .replace("mids", "");
+
+        for (RootSessionIdTailConfigItem item : configItems) {
+            if (item.getAppType().contains(appType) && item.getTail().contains(tail)) {
+                Map<String, Object> returnMap = new HashMap<>();
+                double threshold;
+                String thresholdKey = userLayer + "_" + shareType;
+                if (item.getConfig().containsKey(thresholdKey)) {
+                    threshold = item.getConfig().getOrDefault(thresholdKey, 0.0);
+                } else {
+                    threshold = item.getConfig().getOrDefault("default_" + shareType, 0.0);
+                }
+
+                if (score < threshold) {
+                    returnMap.putAll(rtnAdPredict(ctx));
+                    returnMap.put("model", "userLayerRootSessionIdTailModel");
+                } else {
+                    returnMap.putAll(rtnNoAdPredict(ctx));
+                    returnMap.put("no_ad_strategy", "userLayerRootSessionIdTailModel");
+                }
+
+                returnMap.put("score", score);
+                returnMap.put("threshold", threshold);
+                returnMap.put("userLayer", userLayer);
+
+                JSONObject logJson = new JSONObject();
+                logJson.putAll(returnMap);
+                logJson.put("mid", ctx.getMid());
+                logJson.put("appType", appType);
+                logJson.put("rootSessionIdTail", tail);
+                logJson.put("shareType", shareType);
+
+                logJson.put("expId", "userLayerRootSessionIdTailExp");
+                logJson.put("thresholdParamKey", thresholdKey);
+                logJson.put("adPlatformType", ctx.getAdPlatformType());
+                logJson.put("abCode", ctx.getAdAbCode());
+                logJson.put("configItem", item);
+                logJson.put("rootSessionId", ctx.getRootSessionId());
+
+                log.info("广告跳出选择 -- userLayerRootSessionId尾号实验结果: {}, 参数: {}",
+                        JSONUtils.toJson(returnMap), logJson.toJSONString());
+
+                return returnMap;
+            }
+        }
+
+
+        return Collections.emptyMap();
+    }
+}

+ 5 - 0
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/user/UserService.java

@@ -0,0 +1,5 @@
+package com.tzld.piaoquan.ad.engine.service.user;
+
+public interface UserService {
+    String getUserLayerByMid(String mid);
+}

+ 42 - 0
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/user/impl/UserServiceImpl.java

@@ -0,0 +1,42 @@
+package com.tzld.piaoquan.ad.engine.service.user.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.TypeReference;
+import com.tzld.piaoquan.ad.engine.commons.redis.AlgorithmRedisHelper;
+import com.tzld.piaoquan.ad.engine.service.user.UserService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Map;
+
+@Slf4j
+@Service
+public class UserServiceImpl implements UserService {
+
+    @Autowired
+    protected AlgorithmRedisHelper algRedisHelper;
+
+    @Override
+    public String getUserLayerByMid(String mid) {
+        String key = String.format("ad:engine:mid:layer:%s", mid);
+        String value = algRedisHelper.get(key);
+        if (StringUtils.isEmpty(value)) {
+            return "无曝光";
+        }
+        try {
+            Map<String, String> layerMap = JSON.parseObject(value, new TypeReference<Map<String, String>>() {
+            });
+            String layer = layerMap.getOrDefault("layer", "无曝光");
+            if (StringUtils.equals(layer, "已转化")) {
+                layer = "有转化";
+            }
+            return layer;
+        } catch (Exception e) {
+            log.error("UserServiceImpl getUserLayerByMi error: ", e);
+        }
+
+        return "无曝光";
+    }
+}