|
@@ -5,15 +5,14 @@ import com.alibaba.fastjson.JSONObject;
|
|
import com.tzld.piaoquan.ad.engine.commons.enums.AppTypeEnum;
|
|
import com.tzld.piaoquan.ad.engine.commons.enums.AppTypeEnum;
|
|
import com.tzld.piaoquan.ad.engine.commons.redis.AlgorithmRedisHelper;
|
|
import com.tzld.piaoquan.ad.engine.commons.redis.AlgorithmRedisHelper;
|
|
import com.tzld.piaoquan.ad.engine.commons.util.DateUtils;
|
|
import com.tzld.piaoquan.ad.engine.commons.util.DateUtils;
|
|
-import com.tzld.piaoquan.ad.engine.service.predict.config.RoiModelConfig;
|
|
|
|
-import com.tzld.piaoquan.ad.engine.service.predict.constant.RuleRedisKeyConst;
|
|
|
|
import com.tzld.piaoquan.ad.engine.service.predict.PredictModelService;
|
|
import com.tzld.piaoquan.ad.engine.service.predict.PredictModelService;
|
|
import com.tzld.piaoquan.ad.engine.service.predict.config.AbConfig;
|
|
import com.tzld.piaoquan.ad.engine.service.predict.config.AbConfig;
|
|
|
|
+import com.tzld.piaoquan.ad.engine.service.predict.config.RoiModelConfig;
|
|
|
|
+import com.tzld.piaoquan.ad.engine.service.predict.constant.RuleRedisKeyConst;
|
|
import com.tzld.piaoquan.ad.engine.service.predict.container.AbTestConfigContainer;
|
|
import com.tzld.piaoquan.ad.engine.service.predict.container.AbTestConfigContainer;
|
|
import com.tzld.piaoquan.ad.engine.service.predict.container.ThresholdModelContainer;
|
|
import com.tzld.piaoquan.ad.engine.service.predict.container.ThresholdModelContainer;
|
|
import com.tzld.piaoquan.ad.engine.service.predict.container.TopOneVideoContainer;
|
|
import com.tzld.piaoquan.ad.engine.service.predict.container.TopOneVideoContainer;
|
|
import com.tzld.piaoquan.ad.engine.service.predict.param.RoiThresholdPredictModelParam;
|
|
import com.tzld.piaoquan.ad.engine.service.predict.param.RoiThresholdPredictModelParam;
|
|
-import com.tzld.piaoquan.ad.engine.service.predict.param.RuleParamHelper;
|
|
|
|
import com.tzld.piaoquan.ad.engine.service.predict.param.ThresholdPredictModelParam;
|
|
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.RoiPredictModelRequestParam;
|
|
import com.tzld.piaoquan.ad.engine.service.predict.param.request.ThresholdPredictModelRequestParam;
|
|
import com.tzld.piaoquan.ad.engine.service.predict.param.request.ThresholdPredictModelRequestParam;
|
|
@@ -24,7 +23,10 @@ import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
-import java.util.*;
|
|
|
|
|
|
+import java.util.Date;
|
|
|
|
+import java.util.HashMap;
|
|
|
|
+import java.util.List;
|
|
|
|
+import java.util.Map;
|
|
|
|
|
|
@Service
|
|
@Service
|
|
public class PredictModelServiceImpl implements PredictModelService {
|
|
public class PredictModelServiceImpl implements PredictModelService {
|
|
@@ -47,50 +49,159 @@ public class PredictModelServiceImpl implements PredictModelService {
|
|
@Autowired
|
|
@Autowired
|
|
RoiModelConfig roiModelConfig;
|
|
RoiModelConfig roiModelConfig;
|
|
|
|
|
|
- public Map<String,Object> adPredict(ThresholdPredictModelRequestParam requestParam){
|
|
|
|
|
|
+ @Value("${ad.predict.break.switch:false}")
|
|
|
|
+ private boolean adPredictBreakSwitch;
|
|
|
|
|
|
- JSONObject object=requestParam.getAbExpInfo();
|
|
|
|
|
|
+ public Map<String, Object> adPredict(ThresholdPredictModelRequestParam requestParam) {
|
|
|
|
+ if (adPredictBreakSwitch) {
|
|
|
|
+ return adPredictNew(requestParam);
|
|
|
|
+ } else {
|
|
|
|
+ return adPredictOld(requestParam);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public Map<String, Object> adPredictNew(ThresholdPredictModelRequestParam requestParam) {
|
|
|
|
+ JSONObject object = requestParam.getAbExpInfo();
|
|
//先判断是否开启实验 和是否不出广告时间 而后判断默认0-8
|
|
//先判断是否开启实验 和是否不出广告时间 而后判断默认0-8
|
|
- Map<String,Object> result=new HashMap<>();
|
|
|
|
- int hourOfDay= DateUtils.getCurrentHour();
|
|
|
|
- Boolean condition1=abTestConfigContainer.inAdTimeTest(requestParam.getAbExpInfo());
|
|
|
|
- Boolean condition2=abTestConfigContainer.containsCode(requestParam.getAbTestCode());
|
|
|
|
- if(condition1
|
|
|
|
|
|
+ Map<String, Object> result = new HashMap<>();
|
|
|
|
+ int hourOfDay = DateUtils.getCurrentHour();
|
|
|
|
+ Boolean condition1 = abTestConfigContainer.inAdTimeTest(requestParam.getAbExpInfo());
|
|
|
|
+ Boolean condition2 = abTestConfigContainer.containsCode(requestParam.getAbTestCode());
|
|
|
|
+ if (condition1
|
|
&&
|
|
&&
|
|
condition2
|
|
condition2
|
|
&&
|
|
&&
|
|
- abTestConfigContainer.inWithoutAdTime(requestParam.getAbTestCode(),hourOfDay)){
|
|
|
|
|
|
+ abTestConfigContainer.inWithoutAdTime(requestParam.getAbTestCode(), hourOfDay)) {
|
|
|
|
+ result.put("ad_predict", 1);
|
|
|
|
+ result.put("no_ad_strategy", "no_ad_time_with_time_plan");
|
|
|
|
+ return result;
|
|
|
|
+ } else if (
|
|
|
|
+ (!condition1 || (condition1 && !condition2))
|
|
|
|
+ &&
|
|
|
|
+ (0 <= hourOfDay && hourOfDay < 8)) {
|
|
result.put("ad_predict", 1);
|
|
result.put("ad_predict", 1);
|
|
- result.put("no_ad_strategy","no_ad_time_with_time_plan");
|
|
|
|
|
|
+ result.put("no_ad_strategy", "no_ad_time_with_fixed_time");
|
|
return result;
|
|
return result;
|
|
- }else if(
|
|
|
|
- (!condition1 ||(condition1&&!condition2))
|
|
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ String[] abParamArr = abConfig.getAbParams(requestParam.getAbTestCode(), requestParam.getAbExpInfo());
|
|
|
|
+ if (abParamArr == null) {
|
|
|
|
+ result.put("msg", "abConfig_error");
|
|
|
|
+ return result;
|
|
|
|
+ }
|
|
|
|
+ String abtestId = abParamArr[0];
|
|
|
|
+ String abTestConfigTag = abParamArr[1];
|
|
|
|
+
|
|
|
|
+ HashMap<String, Map<String, Object>> abConfigMap = abConfig.getAbConfigMap();
|
|
|
|
+ Map<String, Object> abtestParam = abConfigMap.getOrDefault(abtestId + "-" + abTestConfigTag, null);
|
|
|
|
+ if (abtestParam == null) {
|
|
|
|
+ result.put("msg", "abConfig_error");
|
|
|
|
+ return result;
|
|
|
|
+ }
|
|
|
|
+ //市-中文
|
|
|
|
+ requestParam.setRegion(requestParam.getRegion().replace("省", ""));
|
|
|
|
+ requestParam.setCity(requestParam.getCity().replace("市", ""));
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ // 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();
|
|
|
|
+ String midGroup = redisHelper.getString(midGroupKeyName);
|
|
|
|
+ if (midGroup == null) {
|
|
|
|
+ midGroup = "mean_group";
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ 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)
|
|
&&
|
|
&&
|
|
- (0<=hourOfDay&&hourOfDay<8)){
|
|
|
|
|
|
+ topOneVideoContainer.inNoAdTopVideo(requestParam.getAppType().longValue(), requestParam.getVideoId())
|
|
|
|
+ ) {
|
|
|
|
+ result.put("mid_group", midGroup);
|
|
result.put("ad_predict", 1);
|
|
result.put("ad_predict", 1);
|
|
- result.put("no_ad_strategy","no_ad_time_with_fixed_time");
|
|
|
|
|
|
+ result.put("no_ad_strategy", "no_ad_mid_group_with_video");
|
|
return result;
|
|
return result;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ //设置信息
|
|
|
|
+ ThresholdPredictModelParam modelParam = ThresholdPredictModelParam.builder()
|
|
|
|
+ .build();
|
|
|
|
+ BeanUtils.copyProperties(requestParam, modelParam);
|
|
|
|
+ modelParam.setDate(new Date());
|
|
|
|
+ modelParam.setAbtestId(abtestId);
|
|
|
|
+ modelParam.setAbTestConfigTag(abTestConfigTag);
|
|
|
|
+ modelParam.setAbtestParam(abtestParam);
|
|
|
|
+ modelParam.setMidGroup(midGroup);
|
|
|
|
+ result = ThresholdModelContainer.
|
|
|
|
+ getThresholdPredictModel("modelV2")
|
|
|
|
+ .predict(modelParam);
|
|
|
|
+
|
|
|
|
+ return result;
|
|
|
|
+ }
|
|
|
|
|
|
|
|
+ public Map<String, Object> adPredictOld(ThresholdPredictModelRequestParam requestParam) {
|
|
|
|
|
|
- String[] abParamArr=abConfig.getAbParams(requestParam.getAbTestCode(),requestParam.getAbExpInfo());
|
|
|
|
- if(abParamArr==null){
|
|
|
|
- result.put("msg","abConfig_error");
|
|
|
|
|
|
+ JSONObject object = requestParam.getAbExpInfo();
|
|
|
|
+ //先判断是否开启实验 和是否不出广告时间 而后判断默认0-8
|
|
|
|
+ Map<String, Object> result = new HashMap<>();
|
|
|
|
+ int hourOfDay = DateUtils.getCurrentHour();
|
|
|
|
+ Boolean condition1 = abTestConfigContainer.inAdTimeTest(requestParam.getAbExpInfo());
|
|
|
|
+ Boolean condition2 = abTestConfigContainer.containsCode(requestParam.getAbTestCode());
|
|
|
|
+ if (condition1
|
|
|
|
+ &&
|
|
|
|
+ condition2
|
|
|
|
+ &&
|
|
|
|
+ abTestConfigContainer.inWithoutAdTime(requestParam.getAbTestCode(), hourOfDay)) {
|
|
|
|
+ result.put("ad_predict", 1);
|
|
|
|
+ result.put("no_ad_strategy", "no_ad_time_with_time_plan");
|
|
|
|
+ return result;
|
|
|
|
+ } else if (
|
|
|
|
+ (!condition1 || (condition1 && !condition2))
|
|
|
|
+ &&
|
|
|
|
+ (0 <= hourOfDay && hourOfDay < 8)) {
|
|
|
|
+ result.put("ad_predict", 1);
|
|
|
|
+ result.put("no_ad_strategy", "no_ad_time_with_fixed_time");
|
|
|
|
+ return result;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ String[] abParamArr = abConfig.getAbParams(requestParam.getAbTestCode(), requestParam.getAbExpInfo());
|
|
|
|
+ if (abParamArr == null) {
|
|
|
|
+ result.put("msg", "abConfig_error");
|
|
return result;
|
|
return result;
|
|
}
|
|
}
|
|
- String abtestId=abParamArr[0];
|
|
|
|
- String abTestConfigTag=abParamArr[1];
|
|
|
|
|
|
+ String abtestId = abParamArr[0];
|
|
|
|
+ String abTestConfigTag = abParamArr[1];
|
|
|
|
|
|
- HashMap<String,Map<String,Object>> abConfigMap=abConfig.getAbConfigMap();
|
|
|
|
- Map<String,Object> abtestParam=abConfigMap.getOrDefault(abtestId+"-"+abTestConfigTag,null);
|
|
|
|
- if(abtestParam==null){
|
|
|
|
- result.put("msg","abConfig_error");
|
|
|
|
|
|
+ HashMap<String, Map<String, Object>> abConfigMap = abConfig.getAbConfigMap();
|
|
|
|
+ Map<String, Object> abtestParam = abConfigMap.getOrDefault(abtestId + "-" + abTestConfigTag, null);
|
|
|
|
+ if (abtestParam == null) {
|
|
|
|
+ result.put("msg", "abConfig_error");
|
|
return result;
|
|
return result;
|
|
}
|
|
}
|
|
//市-中文
|
|
//市-中文
|
|
- requestParam.setRegion(requestParam.getRegion().replace("省",""));
|
|
|
|
- requestParam.setCity(requestParam.getCity().replace("市",""));
|
|
|
|
|
|
+ requestParam.setRegion(requestParam.getRegion().replace("省", ""));
|
|
|
|
+ requestParam.setCity(requestParam.getCity().replace("市", ""));
|
|
|
|
|
|
|
|
|
|
// Determine the group to which mid belongs
|
|
// Determine the group to which mid belongs
|
|
@@ -101,8 +212,8 @@ public class PredictModelServiceImpl implements PredictModelService {
|
|
midGroup = "mean_group";
|
|
midGroup = "mean_group";
|
|
}
|
|
}
|
|
|
|
|
|
- String[] noAdMidGroupList=new String[0];
|
|
|
|
- noAdMidGroupList=((JSONArray) abtestParam.get("no_ad_mid_group_list")).toArray(noAdMidGroupList);
|
|
|
|
|
|
+ String[] noAdMidGroupList = new String[0];
|
|
|
|
+ noAdMidGroupList = ((JSONArray) abtestParam.get("no_ad_mid_group_list")).toArray(noAdMidGroupList);
|
|
|
|
|
|
boolean inNoAdGroup = false;
|
|
boolean inNoAdGroup = false;
|
|
for (String group : noAdMidGroupList) {
|
|
for (String group : noAdMidGroupList) {
|
|
@@ -116,55 +227,55 @@ public class PredictModelServiceImpl implements PredictModelService {
|
|
// User is in the no-ad group, no ad should be shown
|
|
// User is in the no-ad group, no ad should be shown
|
|
result.put("mid_group", midGroup);
|
|
result.put("mid_group", midGroup);
|
|
result.put("ad_predict", 1);
|
|
result.put("ad_predict", 1);
|
|
- result.put("no_ad_strategy","no_ad_mid_group_with_video");
|
|
|
|
|
|
+ result.put("no_ad_strategy", "no_ad_mid_group_with_video");
|
|
return result;
|
|
return result;
|
|
}
|
|
}
|
|
|
|
|
|
//top1广告不出视频
|
|
//top1广告不出视频
|
|
- Map<String,List<String>> noAdGroupWithVideoMapping=(Map) abtestParam.getOrDefault("no_ad_group_with_video_mapping",new HashMap<>());
|
|
|
|
- if(noAdGroupWithVideoMapping.keySet().contains(midGroup)
|
|
|
|
|
|
+ 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())
|
|
|
|
- ){
|
|
|
|
|
|
+ topOneVideoContainer.inNoAdTopVideo(requestParam.getAppType().longValue(), requestParam.getVideoId())
|
|
|
|
+ ) {
|
|
result.put("mid_group", midGroup);
|
|
result.put("mid_group", midGroup);
|
|
result.put("ad_predict", 1);
|
|
result.put("ad_predict", 1);
|
|
- result.put("no_ad_strategy","no_ad_mid_group_with_video");
|
|
|
|
|
|
+ result.put("no_ad_strategy", "no_ad_mid_group_with_video");
|
|
return result;
|
|
return result;
|
|
}
|
|
}
|
|
|
|
|
|
//设置信息
|
|
//设置信息
|
|
- ThresholdPredictModelParam modelParam=ThresholdPredictModelParam.builder()
|
|
|
|
|
|
+ ThresholdPredictModelParam modelParam = ThresholdPredictModelParam.builder()
|
|
.build();
|
|
.build();
|
|
- BeanUtils.copyProperties(requestParam,modelParam);
|
|
|
|
|
|
+ BeanUtils.copyProperties(requestParam, modelParam);
|
|
modelParam.setDate(new Date());
|
|
modelParam.setDate(new Date());
|
|
modelParam.setAbtestId(abtestId);
|
|
modelParam.setAbtestId(abtestId);
|
|
modelParam.setAbTestConfigTag(abTestConfigTag);
|
|
modelParam.setAbTestConfigTag(abTestConfigTag);
|
|
modelParam.setAbtestParam(abtestParam);
|
|
modelParam.setAbtestParam(abtestParam);
|
|
modelParam.setMidGroup(midGroup);
|
|
modelParam.setMidGroup(midGroup);
|
|
- Object thresholdMixFunc=abtestParam.getOrDefault("threshold_mix_func","basic");
|
|
|
|
- result= ThresholdModelContainer.
|
|
|
|
|
|
+ Object thresholdMixFunc = abtestParam.getOrDefault("threshold_mix_func", "basic");
|
|
|
|
+ result = ThresholdModelContainer.
|
|
getThresholdPredictModel(thresholdMixFunc.toString())
|
|
getThresholdPredictModel(thresholdMixFunc.toString())
|
|
.predict(modelParam);
|
|
.predict(modelParam);
|
|
|
|
|
|
return result;
|
|
return result;
|
|
}
|
|
}
|
|
|
|
|
|
- public Map<String,Object> adRecommendPredictByRoiModel(RoiPredictModelRequestParam requestParam){
|
|
|
|
|
|
+ public Map<String, Object> adRecommendPredictByRoiModel(RoiPredictModelRequestParam requestParam) {
|
|
|
|
|
|
- Map<String,Object> result=new HashMap<>();
|
|
|
|
- int hourOfDay= DateUtils.getCurrentHour();
|
|
|
|
- if(hourOfDay<8&&hourOfDay>=0){
|
|
|
|
|
|
+ Map<String, Object> result = new HashMap<>();
|
|
|
|
+ int hourOfDay = DateUtils.getCurrentHour();
|
|
|
|
+ if (hourOfDay < 8 && hourOfDay >= 0) {
|
|
result.put("ad_predict", 1);
|
|
result.put("ad_predict", 1);
|
|
- result.put("no_ad_strategy","no_ad_time");
|
|
|
|
|
|
+ result.put("no_ad_strategy", "no_ad_time");
|
|
return result;
|
|
return result;
|
|
}
|
|
}
|
|
- RoiThresholdPredictModelParam modelParam=new RoiThresholdPredictModelParam();
|
|
|
|
- BeanUtils.copyProperties(requestParam,modelParam);
|
|
|
|
|
|
+ RoiThresholdPredictModelParam modelParam = new RoiThresholdPredictModelParam();
|
|
|
|
+ BeanUtils.copyProperties(requestParam, modelParam);
|
|
modelParam.setEcpm(requestParam.getAds().get(0).getEcpm());
|
|
modelParam.setEcpm(requestParam.getAds().get(0).getEcpm());
|
|
modelParam.setAdId(requestParam.getAds().get(0).getAdId());
|
|
modelParam.setAdId(requestParam.getAds().get(0).getAdId());
|
|
modelParam.setAdType(requestParam.getAds().get(0).getAdType());
|
|
modelParam.setAdType(requestParam.getAds().get(0).getAdType());
|
|
|
|
|
|
- String groupClassKey = (String)((Map<String,Object>)roiModelConfig.get(AppTypeEnum.valueOf(modelParam.getAppType()).name())).get("group_class_key");
|
|
|
|
|
|
+ String groupClassKey = (String) ((Map<String, Object>) roiModelConfig.get(AppTypeEnum.valueOf(modelParam.getAppType()).name())).get("group_class_key");
|
|
String midGroupKeyName = RuleRedisKeyConst.KEY_NAME_PREFIX_MID_GROUP + groupClassKey + ":" + modelParam.getMid();
|
|
String midGroupKeyName = RuleRedisKeyConst.KEY_NAME_PREFIX_MID_GROUP + groupClassKey + ":" + modelParam.getMid();
|
|
String midGroup = redisHelper.get(midGroupKeyName);
|
|
String midGroup = redisHelper.get(midGroupKeyName);
|
|
if (midGroup == null) {
|
|
if (midGroup == null) {
|
|
@@ -178,5 +289,4 @@ public class PredictModelServiceImpl implements PredictModelService {
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
-
|
|
|
|
}
|
|
}
|