|
|
@@ -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<>();
|