Kaynağa Gözat

feat: 5-6点出广告

jiandong.liu 5 gün önce
ebeveyn
işleme
1528849626

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

@@ -78,6 +78,8 @@ public class PredictModelServiceImpl implements PredictModelService {
     @Autowired
     private PredictStrategyBy820 predictStrategyBy820;
     @Autowired
+    private PredictStrategyByMorning56 predictStrategyByMorning56;
+    @Autowired
     private PredictStrategyByRor predictStrategyByRor;
     @Autowired
     private PredictStrategyByRorMorning predictStrategyByRorMorning;
@@ -126,6 +128,9 @@ public class PredictModelServiceImpl implements PredictModelService {
     @Value("${experiment.817.ad.hour:5,8}")
     private String experiment817WithAdHour;
 
+    @Value("${experiment.morning56.ad.hour:5,6}")
+    private String experimentMorning56WithAdHour;
+
     @Autowired
     private AdRedisHelper adRedisHelper;
 
@@ -190,10 +195,24 @@ public class PredictModelServiceImpl implements PredictModelService {
             }
             boolean execute817 = false;
             boolean in817time = false;
+            boolean inMorning56time = false;
             // 不出广告时间判定
             int hourOfDay = DateUtils.getCurrentHour();
             if ( 0 <= hourOfDay && hourOfDay < 8 && !isAdvanceShowAd() ) {
                 // 0点到8点 && 不是节日
+
+                // 判断是否在morning56时间范围(5-6点)
+                boolean isInMorning56Time = false;
+                try{
+                    String[] split = experimentMorning56WithAdHour.split(",");
+                    if ( Integer.parseInt(split[0]) <= hourOfDay && hourOfDay < Integer.parseInt(split[1]) ) {
+                        isInMorning56Time = true;
+                    }
+                }catch (Exception e){
+                    log.error("experimentMorning56WithAdHour配置异常", e);
+                }
+
+                // 判断是否在817时间范围
                 boolean isIn817Time = false;
                 try{
                     String[] split = experiment817WithAdHour.split(",");
@@ -203,8 +222,12 @@ public class PredictModelServiceImpl implements PredictModelService {
                 }catch (Exception e){
                     log.error("experiment817WithAdHour配置异常", e);
                 }
-                // 在 817实验时间范围 && 817实验开启
-                if (isIn817Time) {
+
+                // 优先判断morning56(5-6点)
+                if (isInMorning56Time) {
+                    inMorning56time = true;
+                } else if (isIn817Time) {
+                    // 在 817实验时间范围 && 817实验开启
                     in817time = true;
                     execute817 = expCodes.contains("817");
                 } else {
@@ -224,6 +247,11 @@ public class PredictModelServiceImpl implements PredictModelService {
 
             PredictContext predictContext = ConvertUtil.predictParam2Context(requestParam);
 
+            // morning56策略(5-6点,所有用户执行)
+            if(inMorning56time){
+                return predictStrategyByMorning56.predict(predictContext);
+            }
+
             if(in817time){
 
                 // 早间ror熔断

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

@@ -0,0 +1,102 @@
+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 lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+
+@Slf4j
+@Service
+public class PredictStrategyByMorning56 extends BasicPredict {
+
+    @ApolloJsonValue("${experiment.morning56.root.session.id.tail.config:[]}")
+    private List<RootSessionIdTailConfigItem> configItems;
+
+    @Override
+    public String name() {
+        return "morning56";
+    }
+
+    @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)) {
+            Map<String, Object> returnMap = new HashMap<>();
+            returnMap.putAll(rtnNoAdPredict(ctx));
+            returnMap.put("msg","no_config_error");
+            return returnMap;
+        }
+
+        double score = this.calcScoreByMid(ctx.getMid());
+        String tail = rootSessionId.substring(rootSessionId.length() - 1);
+        if (StringUtils.isNotBlank(shareType)) {
+            shareType = shareType.replace("return", "")
+                    .replace("mids", "");
+        }
+
+        for (RootSessionIdTailConfigItem item : configItems) {
+            if (item.getTail().contains(tail)) {
+                Map<String, Object> returnMap = new HashMap<>();
+                double threshold;
+                String thresholdKey = "";
+
+                // 生成可用的Key列表
+                List<String> keys = Arrays.asList(userLayer + "_" + shareType, "default_" + shareType, "default_threshold");
+                for (String key : keys) {
+                    if (item.getConfig().containsKey(key)) {
+                        thresholdKey = key;
+                        break;
+                    }
+                }
+
+
+                threshold = item.getConfig().getOrDefault(thresholdKey, 0.0);
+
+                if (score < threshold) {
+                    returnMap.putAll(rtnAdPredict(ctx));
+                    returnMap.put("model", this.name());
+                } else {
+                    returnMap.putAll(rtnNoAdPredict(ctx));
+                    returnMap.put("no_ad_strategy", this.name());
+                }
+
+                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", ctx.getAppType());
+                logJson.put("rootSessionIdTail", tail);
+                logJson.put("shareType", shareType);
+
+                logJson.put("expId", "morning56Exp");
+                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("广告跳出选择 -- morning56实验结果: {}, 参数: {}",
+                        JSONUtils.toJson(returnMap), logJson.toJSONString());
+
+                return returnMap;
+            }
+        }
+
+        Map<String, Object> returnMap = new HashMap<>();
+        returnMap.putAll(rtnNoAdPredict(ctx));
+        returnMap.put("msg","no_config_error");
+        return returnMap;
+    }
+
+}