|  | @@ -206,14 +206,13 @@ public abstract class RankStrategyBasic implements RankStrategy {
 | 
	
		
			
				|  |  |          Map<String, String> userLayer = getUserLayer(request.getMid());
 | 
	
		
			
				|  |  |          String layer = userLayer.getOrDefault("layer", "无曝光");
 | 
	
		
			
				|  |  |          String clazz = userLayer.getOrDefault("class", "近期未出现");
 | 
	
		
			
				|  |  | -        if (StringUtils.isNotEmpty(layer) && layer.equals("已转化")) {
 | 
	
		
			
				|  |  | -            layer = "有转化";
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  |          if (request.getIsFilterUser()) {
 | 
	
		
			
				|  |  |              layer = layer + "-炸";
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          String userLayerClass = layer + "-" + clazz;
 | 
	
		
			
				|  |  |          map.put("user_layer_class", userLayerClass);
 | 
	
		
			
				|  |  | +        map.put("layer", layer);
 | 
	
		
			
				|  |  | +        map.put("clazz", clazz);
 | 
	
		
			
				|  |  |          return map;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -270,9 +269,6 @@ public abstract class RankStrategyBasic implements RankStrategy {
 | 
	
		
			
				|  |  |          Map<String, String> userLayer = this.getUserLayer(request.getMid());
 | 
	
		
			
				|  |  |          String layer = userLayer.getOrDefault("layer", "无曝光");
 | 
	
		
			
				|  |  |          String clazz = userLayer.getOrDefault("class", "近期未出现");
 | 
	
		
			
				|  |  | -        if (StringUtils.isNotEmpty(layer) && layer.equals("已转化")) {
 | 
	
		
			
				|  |  | -            layer = "有转化";
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  |          //有转化中医层,中医和兴趣教育同时存在过滤兴趣教育行业
 | 
	
		
			
				|  |  |          if (Objects.equals(layer, "有转化") && Objects.equals(clazz, "中医") && scoreParam.getExpCodeSet().contains(excludeExp)) {
 | 
	
		
			
				|  |  |              List<AdPlatformCreativeDTO> adIdList = request.getAdIdList();
 | 
	
	
		
			
				|  | @@ -396,17 +392,11 @@ public abstract class RankStrategyBasic implements RankStrategy {
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    protected Map<Long, CorrectCpaParam> getCorrectCpaParamMap(RankRecommendRequestParam request, ScoreParam scoreParam) {
 | 
	
		
			
				|  |  | +    protected Map<Long, CorrectCpaParam> getCorrectCpaParamMap(RankRecommendRequestParam request, ScoreParam scoreParam, Map<String, String> reqFeature) {
 | 
	
		
			
				|  |  |          Map<String, String> userLayer = this.getUserLayer(request.getMid());
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        String layer = userLayer.getOrDefault("layer", "无曝光");
 | 
	
		
			
				|  |  | -        String clazz = userLayer.getOrDefault("class", "近期未出现");
 | 
	
		
			
				|  |  | -        if (StringUtils.isNotEmpty(layer) && layer.equals("已转化")) {
 | 
	
		
			
				|  |  | -            layer = "有转化";
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -        if (request.getIsFilterUser()) {
 | 
	
		
			
				|  |  | -            layer = layer + "-炸";
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | +        String layer = reqFeature.get("layer");
 | 
	
		
			
				|  |  | +        String clazz = reqFeature.get("clazz");
 | 
	
		
			
				|  |  |          Map<Long, CorrectCpaParam> resultMap = new HashMap<>();
 | 
	
		
			
				|  |  |          try {
 | 
	
		
			
				|  |  |              if (CollectionUtils.isEmpty(request.getAdIdList())) {
 | 
	
	
		
			
				|  | @@ -526,11 +516,11 @@ public abstract class RankStrategyBasic implements RankStrategy {
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    protected void calculateCtcvrScore(List<AdRankItem> items, RankRecommendRequestParam request, ScoreParam scoreParam, String modelName) {
 | 
	
		
			
				|  |  | +    protected void calculateCtcvrScore(List<AdRankItem> items, RankRecommendRequestParam request, ScoreParam scoreParam, String modelName, Map<String, String> reqFeature) {
 | 
	
		
			
				|  |  |          //判断是否走校准试验
 | 
	
		
			
				|  |  |          if (scoreParam.getExpCodeSet().contains(calibrationCtcvrExp)) {
 | 
	
		
			
				|  |  |              try {
 | 
	
		
			
				|  |  | -                calibrationDnnCtcvrScore(items, request.getMid(), request.getIsFilterUser(), modelName);
 | 
	
		
			
				|  |  | +                calibrationDnnCtcvrScore(items, modelName, reqFeature);
 | 
	
		
			
				|  |  |              } catch (Exception e) {
 | 
	
		
			
				|  |  |                  log.error("calibrationDnnCtcvrScore error", e);
 | 
	
		
			
				|  |  |              }
 | 
	
	
		
			
				|  | @@ -538,19 +528,15 @@ public abstract class RankStrategyBasic implements RankStrategy {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          if (scoreParam.getExpCodeSet().contains(calibrationCoefficientExp)) {
 | 
	
		
			
				|  |  |              try {
 | 
	
		
			
				|  |  | -                calibrationCtcvrScore(items, request);
 | 
	
		
			
				|  |  | +                calibrationCtcvrScore(items, request, reqFeature);
 | 
	
		
			
				|  |  |              } catch (Exception e) {
 | 
	
		
			
				|  |  |                  log.error("calibrationCtcvrScore error", e);
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    protected void calibrationCtcvrScore(List<AdRankItem> items, RankRecommendRequestParam request) {
 | 
	
		
			
				|  |  | -        Map<String, String> userLayer = this.getUserLayer(request.getMid());
 | 
	
		
			
				|  |  | -        String layer = userLayer.getOrDefault("layer", "无曝光");
 | 
	
		
			
				|  |  | -        String clazz = userLayer.getOrDefault("class", "近期未出现");
 | 
	
		
			
				|  |  | -        layer = "已转化".equals(layer) ? "有转化" : layer;
 | 
	
		
			
				|  |  | -        String userLayerClass = buildUserLayerClass(request.getIsFilterUser(), layer, clazz);
 | 
	
		
			
				|  |  | +    protected void calibrationCtcvrScore(List<AdRankItem> items, RankRecommendRequestParam request, Map<String, String> reqFeature) {
 | 
	
		
			
				|  |  | +        String userLayerClass = reqFeature.get("layer") + "-" + reqFeature.get("clazz");
 | 
	
		
			
				|  |  |          String cidLayerClassKey = cidLayerKey.replace("{userLayer}", userLayerClass);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          // 3. 批量查询Redis
 | 
	
	
		
			
				|  | @@ -607,11 +593,6 @@ public abstract class RankStrategyBasic implements RankStrategy {
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    private String buildUserLayerClass(boolean isFilterUser, String layer, String clazz) {
 | 
	
		
			
				|  |  | -        if (Objects.equals(layer, "已转化")) layer = "有转化";
 | 
	
		
			
				|  |  | -        return isFilterUser ? layer + "-炸-" + clazz : layer + "-" + clazz;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      protected AdRankItem creativeCovertRankItem(AdPlatformCreativeDTO dto, RankRecommendRequestParam request, Set<String> noApiAdVerIds) {
 | 
	
		
			
				|  |  |          AdRankItem adRankItem = new AdRankItem();
 | 
	
	
		
			
				|  | @@ -701,33 +682,27 @@ public abstract class RankStrategyBasic implements RankStrategy {
 | 
	
		
			
				|  |  |              return new HashMap<>();
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          try {
 | 
	
		
			
				|  |  | -            return JSON.parseObject(value, new TypeReference<Map<String, String>>() {
 | 
	
		
			
				|  |  | +            Map<String, String> map = JSON.parseObject(value, new TypeReference<Map<String, String>>() {
 | 
	
		
			
				|  |  |              });
 | 
	
		
			
				|  |  | +            if (map.containsKey("layer") && Objects.equals(map.get("layer"), "已转化")) {
 | 
	
		
			
				|  |  | +                map.put("layer", "有转化");
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            return map;
 | 
	
		
			
				|  |  |          } catch (Exception e) {
 | 
	
		
			
				|  |  |              log.error("getUserLayer error. mid: {}, \n", mid, e);
 | 
	
		
			
				|  |  |              return new HashMap<>();
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    protected void calibrationDnnCtcvrScore(List<AdRankItem> adRankItems, String mid, boolean isFilterUser, String modelName) {
 | 
	
		
			
				|  |  | +    protected void calibrationDnnCtcvrScore(List<AdRankItem> adRankItems, String modelName, Map<String, String> reqFeature) {
 | 
	
		
			
				|  |  |          if (StringUtils.isEmpty(modelName)) {
 | 
	
		
			
				|  |  |              return;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | -        // 1. 获取用户分层信息
 | 
	
		
			
				|  |  | -        Map<String, String> userLayer = getUserLayer(mid);
 | 
	
		
			
				|  |  | -        String layer = userLayer.getOrDefault("layer", "无曝光");
 | 
	
		
			
				|  |  | -        String clazz = userLayer.getOrDefault("class", "近期未出现");
 | 
	
		
			
				|  |  | -        if (Objects.equals(layer, "已转化")) {
 | 
	
		
			
				|  |  | -            layer = "有转化";
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -        if (isFilterUser) {
 | 
	
		
			
				|  |  | -            layer += "-炸";
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -        // 2. 构建Key模板
 | 
	
		
			
				|  |  | +        // 构建Key模板
 | 
	
		
			
				|  |  |          String layerKeyTemplate = realLayerCtcvrKey
 | 
	
		
			
				|  |  |                  .replace("{model}", modelName)
 | 
	
		
			
				|  |  | -                .replace("{layer}", layer)
 | 
	
		
			
				|  |  | -                .replace("{class}", clazz);
 | 
	
		
			
				|  |  | +                .replace("{layer}", reqFeature.get("layer"))
 | 
	
		
			
				|  |  | +                .replace("{class}", reqFeature.get("clazz"));
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          String value = adRedisHelper.get(layerKeyTemplate);
 |