Browse Source

Merge branch '20251028_feature_fjy_817' of algorithm/ad-engine into master

fanjinyang 2 weeks ago
parent
commit
a3781d360d

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

@@ -27,6 +27,7 @@ import com.tzld.piaoquan.ad.engine.commons.feign.manager.service.HolidayService;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.MapUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.jetbrains.annotations.Nullable;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
@@ -70,6 +71,8 @@ public class PredictModelServiceImpl implements PredictModelService {
     private PredictStrategyBy667 predictStrategyBy667;
     @Autowired
     private PredictStrategyBy599 predictStrategyBy599;
+    @Autowired
+    private PredictStrategyBy817 predictStrategyBy817;
 
     @Autowired
     private UserService userService;
@@ -103,6 +106,9 @@ public class PredictModelServiceImpl implements PredictModelService {
     @Value("#{'${show.ad.whitelist.mid:}'.split(',')}")
     private Set<String> showAdWhitelistMidSet;
 
+    @Value("${experiment.817.ad.hour:0,8}")
+    private String experiment817WithAdHour;
+
     @Autowired
     private AdRedisHelper adRedisHelper;
 
@@ -142,6 +148,197 @@ public class PredictModelServiceImpl implements PredictModelService {
             }
 
 
+            List<Map<String, Object>> mapList = (List) requestParam.getAbExpInfo().get("ab_test002");
+
+            // 该用户所有实验合集
+            Set<String> expCodes = new HashSet<>();
+            for (Map<String, Object> map : mapList) {
+                String expCode = map.getOrDefault("abExpCode", "").toString();
+                expCodes.add(expCode);
+            }
+            boolean execute817 = false;
+            // 不出广告时间判定
+            int hourOfDay = DateUtils.getCurrentHour();
+            if ( 0 <= hourOfDay && hourOfDay < 8 && !isAdvanceShowAd() ) {
+                // 0点到8点 && 不是节日
+                boolean isIn817Time = true;
+                try{
+                    String[] split = experiment817WithAdHour.split(",");
+                    if ( !(Integer.parseInt(split[0]) <= hourOfDay && hourOfDay < Integer.parseInt(split[1])) ) {
+                        isIn817Time = false;
+                    }
+                }catch (Exception e){
+                    log.error("experiment817WithAdHour配置异常", e);
+                }
+                // 在 817实验时间范围 && 817实验开启
+                if (isIn817Time && expCodes.contains("817")) {
+                    execute817 = true;
+                } else {
+                    result.put("ad_predict", 1);
+                    result.put("no_ad_strategy", "no_ad_time_with_fixed_time");
+                    return result;
+                }
+            }
+
+            // 新老实验和填充requestParam参数(老实验可能直接返回结果)
+            Map<String, Object> result1 = getParamAndFill(requestParam, result);
+            if (result1 != null){
+                return result1;
+            }
+
+
+            PredictContext predictContext = ConvertUtil.predictParam2Context(requestParam);
+            // 817熔断
+            if (execute817) {
+                return predictStrategyBy817.predict(predictContext);
+            }
+
+            Map<String, Object> userLayerPredict = userLayerRootSessionIdPredict.predict(predictContext);
+            if (MapUtils.isNotEmpty(userLayerPredict)) {
+                return userLayerPredict;
+            }
+
+            if (expCodes.contains("673")) {
+                Map<String, Object> predictResult = predictStrategyBy673.predict(predictContext);
+                if (Objects.nonNull(predictResult)) {
+                    return predictResult;
+                }
+            }
+
+            if (expCodes.contains("599")){
+                return predictStrategyBy599.predict(predictContext);
+            }else if (expCodes.contains("667")){
+                return predictStrategyBy667.predict(predictContext);
+            }else {
+                return predictStrategyBy599.predict(predictContext);
+            }
+            
+        } catch (Exception e) {
+            log.error("svc=adPredict appType={} group={} newGroup={} pqtId={}"
+                    , requestParam.getAppType(), requestParam.getAbTestCode(), requestParam.getNewExpGroup(), requestParam.getPqtId(), e);
+            result.put("ad_predict", 1);
+            result.put("no_ad_strategy", "error");
+            return result;
+        }
+
+    }
+
+    private @Nullable Map<String, Object> getParamAndFill(ThresholdPredictModelRequestParam requestParam, Map<String, Object> result) {
+        String abtestId = null;
+        String abTestConfigTag = null;
+        Map<String, Object> abtestParam = null;
+        String midGroup = null;
+        String shareType = null;
+
+        String[] appIdArr = oldExpGroupAppId.split(",");
+        // 新老实验系统
+        List<String> appIdList = Arrays.asList(appIdArr);
+        if (appIdList.contains(requestParam.getAppType().toString())) {
+            String[] abParamArr = abConfig.getAbParams(requestParam.getAbTestCode(), requestParam.getAbExpInfo());
+            if (abParamArr == null) {
+                abParamArr = NewExpUserGroupConfig.newExpUserGroupMap.get(requestParam.getAppType().toString());
+                if (abParamArr == null) {
+                    result.put("msg", "abConfig_error");
+                    return result;
+                }
+            }
+            abtestId = abParamArr[0];
+            abTestConfigTag = abParamArr[1];
+            HashMap<String, Map<String, Object>> abConfigMap = abConfig.getAbConfigMap();
+            abtestParam = abConfigMap.getOrDefault(abtestId + "-" + abTestConfigTag, null);
+            if (abtestParam == null) {
+                result.put("msg", "abConfig_error");
+                return result;
+            }
+            // Determine the group to which mid belongs
+            String groupClassKey = (String) abtestParam.get("group_class_key");
+            String midGroupKeyName = RuleRedisKeyConst.KEY_NAME_PREFIX_MID_GROUP + groupClassKey + ":" + requestParam.getMid();
+            midGroup = redisHelper.getString(midGroupKeyName);
+
+            // 没有时为新用户或者无分享用户
+            shareType = midGroup;
+            if (midGroup == null) {
+                midGroup = "mean_group";
+                shareType = "noShare";
+            }
+            String[] noAdMidGroupList = new String[0];
+            noAdMidGroupList = ((JSONArray) abtestParam.get("no_ad_mid_group_list")).toArray(noAdMidGroupList);
+
+            boolean inNoAdGroup = false;
+            for (String group : noAdMidGroupList) {
+                if (group.equals(midGroup)) {
+                    inNoAdGroup = true;
+                    break;
+                }
+            }
+            // 不出广告组
+            if (inNoAdGroup) {
+                // User is in the no-ad group, no ad should be shown
+                result.put("mid_group", midGroup);
+                result.put("ad_predict", 1);
+                result.put("no_ad_strategy", "no_ad_mid_group_with_video");
+                return result;
+            }
+            // top1广告不出视频
+            Map<String, List<String>> noAdGroupWithVideoMapping = (Map) abtestParam.getOrDefault("no_ad_group_with_video_mapping", new HashMap<>());
+            if (noAdGroupWithVideoMapping.keySet().contains(midGroup)
+                    &&
+                    topOneVideoContainer.inNoAdTopVideo(requestParam.getAppType().longValue(), requestParam.getVideoId())
+            ) {
+                result.put("mid_group", midGroup);
+                result.put("ad_predict", 1);
+                result.put("no_ad_strategy", "no_ad_mid_group_with_video");
+                return result;
+            }
+        } else {
+            String midGroupKeyName = RuleRedisKeyConst.KEY_NAME_PREFIX_MID_GROUP + "class1:" + requestParam.getMid();
+            midGroup = redisHelper.getString(midGroupKeyName);
+            shareType = midGroup;
+            if (midGroup == null) {
+                midGroup = "mean_group";
+                shareType = "noShare";
+            }
+        }
+
+        // 市-中文
+        requestParam.setRegion(requestParam.getRegion().replace("省", ""));
+        requestParam.setCity(requestParam.getCity().replace("市", ""));
+        requestParam.setShareType(shareType);
+        String userLayer = userService.getUserLayer4Level(requestParam.getMid());
+        requestParam.setUserLayer(userLayer);
+        return null;
+    }
+
+
+    public Map<String, Object> adPredictOld(ThresholdPredictModelRequestParam requestParam) {
+        Map<String, Object> result = new HashMap<>();
+        result.put("pqtId", requestParam.getPqtId());
+
+        // 白名单用户固定出广告
+        if (CollectionUtils.isNotEmpty(showAdWhitelistMidSet) && showAdWhitelistMidSet.contains(requestParam.getMid())) {
+            result.put("ad_predict", 2);
+            result.put("ad_strategy", "show_ad_whitelist");
+            return result;
+        }
+
+        try {
+            String[] withoutAdVideoIdsArr = withoutAdVideoIds.split(",");
+            for (String videoId : withoutAdVideoIdsArr) {
+                if (videoId.equals(requestParam.getVideoId() + "")) {
+                    if (requestParam.getAppType().equals(0)
+                            || requestParam.getAppType().equals(4)
+                            || requestParam.getAppType().equals(5)
+                            || requestParam.getAppType().equals(21)
+                    ) {
+                        result = new HashMap<>();
+                        result.put("ad_predict", 1);
+                        result.put("no_ad_strategy", "no_ad_with_video_in_white_list");
+                        return result;
+                    }
+                }
+            }
+
+
             List<Map<String, Object>> mapList = (List) requestParam.getAbExpInfo().get("ab_test002");
 
             Map<String, List<JSONObject>> configMap = new HashMap<>();

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

@@ -0,0 +1,43 @@
+package com.tzld.piaoquan.ad.engine.service.predict.v2;
+
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.TypeReference;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+
+@Slf4j
+@Service
+public class PredictStrategyBy817 extends ThresholdPredictStrategy {
+    @Override
+    Map<String, Double> thresholdConfig(PredictContext ctx) {
+        try {
+            JSONObject json = ctx.getExpConfigMap().getOrDefault("817", new JSONObject());
+            return json.toJavaObject(new TypeReference<Map<String, Double>>() {
+            });
+        } catch (Exception e) {
+            log.error("PredictStrategyBy817 parse 817 exp param error \n", e);
+            return Collections.emptyMap();
+        }
+    }
+
+    @Override
+    List<String> genThresholdKeys(PredictContext ctx) {
+
+        List<String> keys = new ArrayList<>();
+        for (String appType : Arrays.asList(ctx.getAppType(), "default")) {
+            for (String userLayer : Arrays.asList(ctx.getUserLayer(), "default")) {
+                keys.add(String.join("_", appType, userLayer, ctx.getHandleAfterShareType()));
+            }
+        }
+        keys.add("default_threshold");
+        return keys;
+    }
+
+    @Override
+    public String name() {
+        return "817";
+    }
+
+}