瀏覽代碼

dev 1.0 with rank

gufengshou1 1 年之前
父節點
當前提交
c720d506a4
共有 14 個文件被更改,包括 346 次插入147 次删除
  1. 2 2
      ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/base/AdRequestContext.java
  2. 5 0
      ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/score/ScoreParam.java
  3. 0 1
      ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/score/ScorerPipeline.java
  4. 5 12
      ad-engine-server/src/main/java/com/tzld/piaoquan/ad/engine/server/controller/AdRecommendController.java
  5. 13 1
      ad-engine-server/src/main/java/com/tzld/piaoquan/ad/engine/server/controller/ControllerAspect.java
  6. 5 0
      ad-engine-server/src/main/java/com/tzld/piaoquan/ad/engine/server/controller/PredictController.java
  7. 0 4
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/rank/RankService.java
  8. 95 125
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/FeatureRemoteService.java
  9. 4 0
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/RankService.java
  10. 2 2
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/VlogAdCtrLRScorer.java
  11. 146 0
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/convert/FeatureConvert.java
  12. 11 0
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/convert/RequestConvert.java
  13. 44 0
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/impl/RankServiceImpl.java
  14. 14 0
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/param/RankRecommendParamRequest.java

+ 2 - 2
ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/base/AdRequestContext.java

@@ -23,8 +23,8 @@ public class AdRequestContext {
     private String city;
 
     // video信息
-    private String headVideoId;
-    private String PageSource;
+//    private String headVideoId;
+//    private String PageSource;
 
     // position 信息
     private String ownAdPositionId;

+ 5 - 0
ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/score/ScoreParam.java

@@ -9,4 +9,9 @@ import lombok.Data;
 @Data
 public class ScoreParam {
     private AdRequestContext requestContext;
+
+    public ScoreParam(){
+
+    }
+
 }

+ 0 - 1
ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/score/ScorerPipeline.java

@@ -34,7 +34,6 @@ public class ScorerPipeline {
      * @return
      */
     public List<AdRankItem> scoring(final ScoreParam param,
-                                    final UserVideoFeature userVideoFeature,
                                     final UserAdFeature userAdFeature,
                                     final List<AdRankItem> rankItems) {
 

+ 5 - 12
ad-engine-server/src/main/java/com/tzld/piaoquan/ad/engine/server/controller/AdRecommendController.java

@@ -1,17 +1,12 @@
 package com.tzld.piaoquan.ad.engine.server.controller;
 
-import com.tzld.piaoquan.ad.engine.commons.base.AdRankItem;
-import com.tzld.piaoquan.ad.engine.commons.base.UserAdFeature;
-import com.tzld.piaoquan.ad.engine.commons.score.ScoreParam;
-import com.tzld.piaoquan.ad.engine.service.predict.param.request.ThresholdPredictModelRequestParam;
-import com.tzld.piaoquan.ad.engine.service.score.VlogAdCtrLRScorer;
+import com.tzld.piaoquan.ad.engine.service.score.RankService;
+import com.tzld.piaoquan.ad.engine.service.score.param.RankRecommendParamRequest;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 
 @RestController
@@ -19,13 +14,11 @@ import java.util.Map;
 public class AdRecommendController {
 
 
-//    @Autowired
-//    VlogAdCtrLRScorer scorer;
+    @Autowired
+    RankService rankService;
 
     @RequestMapping("/base/ctr/top")
-    public Map<String,Object> adPredictByAbTestModel(final ScoreParam param,
-                                                     final UserAdFeature userFeature,
-                                                     final List<AdRankItem> rankItems){
+    public Map<String,Object> adPredictByAbTestModel(RankRecommendParamRequest requst){
 //        scorer.scoring(param,userFeature,rankItems).get(0);
         return new HashMap<>();
     }

+ 13 - 1
ad-engine-server/src/main/java/com/tzld/piaoquan/ad/engine/server/controller/ControllerAspect.java

@@ -7,6 +7,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.aspectj.lang.ProceedingJoinPoint;
 import org.aspectj.lang.annotation.Around;
 import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
 import org.aspectj.lang.reflect.MethodSignature;
 import org.springframework.stereotype.Component;
 
@@ -20,7 +21,18 @@ import java.util.concurrent.TimeUnit;
 @Slf4j
 public class ControllerAspect {
 
-    @Around("execution(* com.tzld.piaoquan.ad.engine.server.controller.*Controller.*(..))")
+    @Pointcut("execution(* com.tzld.piaoquan.ad.engine.server.controller.*Controller.*(..))")
+    public void logPointcut(){
+
+    }
+
+    @Pointcut("execution(* com.tzld.piaoquan.ad.engine.server.controller.HealthController.java.*(..))")
+    public void excludePointcut(){
+
+    }
+
+
+    @Around("logPointcut() && !excludePointcut()")
     public Object around(ProceedingJoinPoint pjp) throws Throwable {
         TraceUtils.setMDC();
         String className = pjp.getTarget().getClass().getSimpleName();

+ 5 - 0
ad-engine-server/src/main/java/com/tzld/piaoquan/ad/engine/server/controller/PredictController.java

@@ -20,6 +20,11 @@ public class PredictController {
     PredictModelService predictModelService;
     private final static Logger log = LoggerFactory.getLogger(PredictController.class);
 
+    /**
+     * 没有统一封装response
+     * @param param
+     * @return
+     */
     @RequestMapping("/ab/model")
     public Map<String,Object> adPredictByAbTestModel(@RequestBody ThresholdPredictModelRequestParam param){
 

+ 0 - 4
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/rank/RankService.java

@@ -1,4 +0,0 @@
-package com.tzld.piaoquan.ad.engine.service.rank;
-
-public interface RankService {
-}

+ 95 - 125
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/FeatureRemoteService.java

@@ -1,125 +1,95 @@
-//package com.tzld.piaoquan.ad.engine.service.score;
-//
-//import com.tzld.piaoquan.ad.engine.commons.base.AdActionFeature;
-//import com.tzld.piaoquan.ad.engine.commons.base.UserAdFeature;
-//import com.tzld.piaoquan.recommend.feature.client.FeatureClient;
-//import com.tzld.piaoquan.recommend.feature.model.feature.UserActionFeatureProto;
-//import com.tzld.piaoquan.recommend.feature.model.feature.UserFeatureProto;
-//import com.tzld.piaoquan.recommend.feature.model.feature.VideoFeatureProto;
-//import lombok.extern.slf4j.Slf4j;
-//import org.apache.commons.lang.StringUtils;
-//import org.apache.commons.lang.math.NumberUtils;
-//import org.springframework.beans.factory.annotation.Autowired;
-//import org.springframework.stereotype.Component;
-//import org.springframework.util.CollectionUtils;
-//
-//import java.util.Collections;
-//import java.util.List;
-//import java.util.Map;
-//
-//
-///**
-// * @author dyp
-// */
-//@Component
-//@Slf4j
-//public class FeatureRemoteService {
-//
-//    @Autowired
-//    private FeatureClient client;
-//
-//    // 有性能问题再增加localCache
-//    public UserAdFeature getUserFeature(String uid) {
-//        if (StringUtils.isBlank(uid)) {
-//            return null;
-//        }
-//        UserFeatureProto proto = client.getUserFeature(uid);
-//        UserAdFeature adFeature=convert(proto);
-//
-//        return convert(proto);
-//    }
-//
-//    private UserAdFeature convert(UserFeatureProto proto) {
-//        if (proto == null) {
-//            return null;
-//        }
-//        UserAdFeature feature = new UserAdFeature();
-//        //todo
-//        feature.setUser_type(proto.getUid());
-//        if (proto.hasDay1CntFeature()) {
-//            feature.setDay1_cnt_features(convert(proto.getDay1CntFeature()));
-//        }
-//        if (proto.hasDay3CntFeature()) {
-//            feature.setDay3_cnt_features(convert(proto.getDay3CntFeature()));
-//        }
-//        if (proto.hasDay7CntFeature()) {
-//            feature.setDay7_cnt_features(convert(proto.getDay7CntFeature()));
-//        }
-//        if (proto.hasMonth3CntFeature()) {
-//            feature.setMonth3_cnt_features(convert(proto.getMonth3CntFeature()));
-//        }
-//
-//
-//        return feature;
-//    }
-//
-//    private AdActionFeature convert(UserActionFeatureProto proto) {
-//        AdActionFeature feature = new AdActionFeature();
-//        feature.setAdView(proto.get());
-//        feature.setCtr(proto.getCtr());
-//        feature.setExp_cnt(proto.getExpCnt());
-//        feature.setReturn_cnt(proto.getReturnCnt());
-//        feature.setRov(proto.getRov());
-//        feature.setShare_cnt(proto.getShareCnt());
-//        feature.setStr(proto.getStr());
-//        return feature;
-//    }
-//
-//    public ItemFeature getVideoFeature(Long videoId) {
-//        if (videoId == null) {
-//            return null;
-//        }
-//        VideoFeatureProto proto = client.getVideoFeature(videoId);
-//        return convert(proto);
-//    }
-//
-//    public Map<Long, ItemFeature> getVideoFeatureMap(List<Long> videoIds) {
-//        if (CollectionUtils.isEmpty(videoIds)) {
-//            return Collections.emptyMap();
-//        }
-//        List<VideoFeatureProto> protoList = client.getAllVideoFeature(videoIds);
-//        return CommonCollectionUtils.toMap(protoList, p -> NumberUtils.toLong(p.getVideoId(), 0L), this::convert);
-//    }
-//
-//
-//    private ItemFeature convert(VideoFeatureProto proto) {
-//        if (proto == null) {
-//            return null;
-//        }
-//        ItemFeature feature = new ItemFeature();
-//
-//        feature.setPlayLength(proto.getPlayLength());
-//        feature.setTags(proto.getTags());
-//        feature.setTotalTime(proto.getTotalTime());
-//        feature.setUpId(proto.getUpId());
-//        feature.setVideoId(proto.getVideoId());
-//        feature.setDaysSinceUpload(proto.getDaysSinceUpload());
-//
-//
-//        if (proto.hasVideoDay1CntFeature()) {
-//            feature.setDay1_cnt_features(convert(proto.getVideoDay1CntFeature()));
-//        }
-//        if (proto.hasVideoDay3CntFeature()) {
-//            feature.setDay3_cnt_features(convert(proto.getVideoDay3CntFeature()));
-//        }
-//        if (proto.hasVideoDay7CntFeature()) {
-//            feature.setDay7_cnt_features(convert(proto.getVideoDay7CntFeature()));
-//        }
-//        if (proto.hasVideoMonth3CntFeature()) {
-//            feature.setMonth3_cnt_features(convert(proto.getVideoMonth3CntFeature()));
-//        }
-//        return feature;
-//    }
-//
-//
-//}
+package com.tzld.piaoquan.ad.engine.service.score;
+
+import com.tzld.piaoquan.ad.engine.commons.base.AdActionFeature;
+import com.tzld.piaoquan.ad.engine.commons.base.AdRankItem;
+import com.tzld.piaoquan.ad.engine.commons.base.UserAdFeature;
+import com.tzld.piaoquan.ad.engine.commons.util.CommonCollectionUtils;
+import com.tzld.piaoquan.ad.engine.service.score.convert.FeatureConvert;
+import com.tzld.piaoquan.recommend.feature.client.FeatureClient;
+import com.tzld.piaoquan.recommend.feature.model.feature.*;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang.math.NumberUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * @author dyp
+ */
+
+@Slf4j
+@Service
+public class FeatureRemoteService {
+
+    @Autowired
+    private FeatureClient client;
+
+    // 有性能问题再增加localCache
+    public UserAdFeature getUserAdFeature(String mid) {
+        if (StringUtils.isBlank(mid)) {
+            return null;
+        }
+        UserAdFeatureProto proto = client.getUserAdFeature(mid);
+        UserAdFeature adFeature=convert(proto);
+
+        return adFeature;
+    }
+
+    private UserAdFeature convert(UserAdFeatureProto proto) {
+        if (proto == null) {
+            return null;
+        }
+
+        return FeatureConvert.convertToJava(proto);
+    }
+
+    private AdActionFeature convert(AdActionFeatureProto proto) {
+        return FeatureConvert.convertToJava(proto);
+    }
+
+    public AdRankItem getAdFeature(Long adId) {
+        if (adId == null) {
+            return null;
+        }
+        AdItemFeatureProto proto = client.getAdItemFeature(adId.toString());
+        return convert(proto);
+    }
+
+    public Map<Long, AdRankItem> getAdFeatureMap(List<String> adIdList) {
+        if (CollectionUtils.isEmpty(adIdList)) {
+            return Collections.emptyMap();
+        }
+        List<AdItemFeatureProto> protoList = client.getALLAdItemFeature(adIdList);
+        return CommonCollectionUtils.toMap(protoList, p -> NumberUtils.toLong(p.getAdId(), 0L), this::convert);
+    }
+
+    public List<AdRankItem> getAllAdFeatureList(List<String> adIdList) {
+        if (CollectionUtils.isEmpty(adIdList)) {
+            return Collections.emptyList();
+        }
+        List<AdItemFeatureProto> protoList = client.getALLAdItemFeature(adIdList);
+        return CommonCollectionUtils.toList(protoList, p -> convert(p));
+    }
+
+
+    private AdRankItem convert(AdItemFeatureProto proto) {
+        if (proto == null) {
+            return null;
+        }
+        AdRankItem feature = new AdRankItem();
+
+        feature.setAdId(Long.parseLong(proto.getAdId()));
+        feature.setItemFeature(FeatureConvert.convertToJava(proto));
+
+        return feature;
+    }
+
+
+}

+ 4 - 0
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/RankService.java

@@ -0,0 +1,4 @@
+package com.tzld.piaoquan.ad.engine.service.score;
+
+public class RankService {
+}

+ 2 - 2
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/VlogAdCtrLRScorer.java

@@ -179,11 +179,11 @@ public class VlogAdCtrLRScorer extends BaseLRModelScorer {
                 } catch (InterruptedException e) {
                     LOGGER.error("InterruptedException {},{}", ExceptionUtils.getFullStackTrace(e));
                 } catch (ExecutionException e) {
-                    LOGGER.error("ExecutionException {},{}", requestContext.getHeadVideoId(),
+                    LOGGER.error("ExecutionException {},{}", requestContext.getApptype(),
                             ExceptionUtils.getFullStackTrace(e));
                 }
             }
         }
-        LOGGER.debug("Ctr Score {}, Total: {}, Cancel: {}", new Object[]{requestContext.getHeadVideoId(), items.size(), cancel});
+        LOGGER.debug("Ctr Score {}, Total: {}, Cancel: {}", new Object[]{requestContext.getApptype(), items.size(), cancel});
     }
 }

+ 146 - 0
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/convert/FeatureConvert.java

@@ -0,0 +1,146 @@
+package com.tzld.piaoquan.ad.engine.service.score.convert;
+
+import com.tzld.piaoquan.ad.engine.commons.base.AdActionFeature;
+import com.tzld.piaoquan.ad.engine.commons.base.AdItemFeature;
+import com.tzld.piaoquan.ad.engine.commons.base.UserAdFeature;
+import com.tzld.piaoquan.recommend.feature.model.feature.*;
+
+/**
+ * @author dyp
+ */
+public class FeatureConvert {
+
+    public static UserAdFeatureProto convertToProto(UserAdFeature userAdFeature) {
+        UserAdFeatureProto.Builder builder = UserAdFeatureProto.newBuilder();
+        builder.setMid(userAdFeature.getMid());
+        builder.setGender(userAdFeature.getGender());
+        builder.setUserType(userAdFeature.getUser_type());
+        builder.setGmtCreate(userAdFeature.getGmt_create());
+        builder.setTags(userAdFeature.getTags());
+        builder.setCategoryName(userAdFeature.getCategory_name());
+        builder.setIsvip(userAdFeature.getIsvip());
+        builder.setIsreward(userAdFeature.getIsreward());
+        builder.setIsad(userAdFeature.getIsad());
+        builder.setIsgood(userAdFeature.getIsgood());
+        builder.setFirstUpDatetime(userAdFeature.getFirst_up_datetime());
+        builder.setLastUpDatetime(userAdFeature.getLast_up_datetime());
+        builder.setNextToLastUpDatetime(userAdFeature.getNext_to_last_up_datetime());
+        builder.setVideos(userAdFeature.getVideos());
+        builder.setIdols(userAdFeature.getIdols());
+        builder.setFans(userAdFeature.getFans());
+        builder.setPlayCount(userAdFeature.getPlay_count());
+        builder.setPlayCountTotal(userAdFeature.getPlay_count_total());
+        builder.setTotalReward(userAdFeature.getTotal_reward());
+        builder.setCurrentdayReward(userAdFeature.getCurrentday_reward());
+        builder.setRewardPerson(userAdFeature.getReward_person());
+        builder.setTotalRewardTimes(userAdFeature.getTotal_reward_times());
+        builder.setRewardVideos(userAdFeature.getReward_videos());
+        builder.setTotalPrice(userAdFeature.getTotal_price());
+        builder.setCurrentdayPrice(userAdFeature.getCurrentday_price());
+        builder.setTotalPriceTimes(userAdFeature.getTotal_price_times());
+        builder.setTotalPricePerson(userAdFeature.getTotal_price_person());
+        builder.setTotalPriceVideos(userAdFeature.getTotal_price_videos());
+        builder.setCgrainUserType(userAdFeature.getCgrain_user_type());
+        builder.setIdentityTagname(userAdFeature.getIdentity_tagname());
+        builder.setOperationTags(userAdFeature.getOperation_tags());
+        builder.setIdentityTagId(userAdFeature.getIdentity_tag_id());
+        builder.setIdentityCreateTime(userAdFeature.getIdentity_create_time());
+        builder.setCountry(userAdFeature.getCountry());
+        builder.setProvince(userAdFeature.getProvince());
+        builder.setCity(userAdFeature.getCity());
+
+        builder.setDay1CntFeatures(convertToProto(userAdFeature.getDay1_cnt_features()));
+        builder.setDay3CntFeatures(convertToProto(userAdFeature.getDay3_cnt_features()));
+        builder.setDay7CntFeatures(convertToProto(userAdFeature.getDay7_cnt_features()));
+        builder.setMonth3CntFeatures(convertToProto(userAdFeature.getMonth3_cnt_features()));
+
+        return builder.build();
+    }
+
+    public static UserAdFeature convertToJava(UserAdFeatureProto userAdFeatureProto){
+            UserAdFeature userAdFeature = new UserAdFeature();
+            userAdFeature.setMid(userAdFeatureProto.getMid());
+            userAdFeature.setGender(userAdFeatureProto.getGender());
+            userAdFeature.setUser_type(userAdFeatureProto.getUserType());
+            userAdFeature.setGmt_create(userAdFeatureProto.getGmtCreate());
+            userAdFeature.setTags(userAdFeatureProto.getTags());
+            userAdFeature.setCategory_name(userAdFeatureProto.getCategoryName());
+            userAdFeature.setIsvip(userAdFeatureProto.getIsvip());
+            userAdFeature.setIsreward(userAdFeatureProto.getIsreward());
+            userAdFeature.setIsad(userAdFeatureProto.getIsad());
+            userAdFeature.setIsgood(userAdFeatureProto.getIsgood());
+            userAdFeature.setFirst_up_datetime(userAdFeatureProto.getFirstUpDatetime());
+            userAdFeature.setLast_up_datetime(userAdFeatureProto.getLastUpDatetime());
+            userAdFeature.setNext_to_last_up_datetime(userAdFeatureProto.getNextToLastUpDatetime());
+            userAdFeature.setVideos(userAdFeatureProto.getVideos());
+            userAdFeature.setIdols(userAdFeatureProto.getIdols());
+            userAdFeature.setFans(userAdFeatureProto.getFans());
+            userAdFeature.setPlay_count(userAdFeatureProto.getPlayCount());
+            userAdFeature.setPlay_count_total(userAdFeatureProto.getPlayCountTotal());
+            userAdFeature.setTotal_reward(userAdFeatureProto.getTotalReward());
+            userAdFeature.setCurrentday_reward(userAdFeatureProto.getCurrentdayReward());
+            userAdFeature.setReward_person(userAdFeatureProto.getRewardPerson());
+            userAdFeature.setTotal_price_times(userAdFeatureProto.getTotalRewardTimes());
+            userAdFeature.setReward_videos(userAdFeatureProto.getRewardVideos());
+            userAdFeature.setTotal_price(userAdFeatureProto.getTotalPrice());
+            userAdFeature.setCurrentday_price(userAdFeatureProto.getCurrentdayPrice());
+            userAdFeature.setTotal_price_times(userAdFeatureProto.getTotalPriceTimes());
+            userAdFeature.setTotal_price_person(userAdFeatureProto.getTotalPricePerson());
+            userAdFeature.setTotal_price_videos(userAdFeatureProto.getTotalPriceVideos());
+            userAdFeature.setCgrain_user_type(userAdFeatureProto.getCgrainUserType());
+            userAdFeature.setIdentity_tagname(userAdFeatureProto.getIdentityTagname());
+            userAdFeature.setOperation_tags(userAdFeatureProto.getOperationTags());
+            userAdFeature.setIdentity_tag_id(userAdFeatureProto.getIdentityTagId());
+            userAdFeature.setIdentity_create_time(userAdFeatureProto.getIdentityCreateTime());
+            return userAdFeature;
+    }
+
+    public static AdActionFeatureProto convertToProto(AdActionFeature adActionFeature) {
+        AdActionFeatureProto.Builder builder = AdActionFeatureProto.newBuilder();
+        builder.setAdView(adActionFeature.getAdView());
+        builder.setAdClick(adActionFeature.getAdClick());
+        builder.setAdConversion(adActionFeature.getAdConversion());
+        builder.setCtr(adActionFeature.getCtr());
+        builder.setCvr(adActionFeature.getCvr());
+        return builder.build();
+    }
+    public static AdActionFeature convertToJava(AdActionFeatureProto adActionFeatureProto) {
+        AdActionFeature adActionFeature = new AdActionFeature();
+        adActionFeature.setAdView(adActionFeatureProto.getAdView());
+        adActionFeature.setAdClick(adActionFeatureProto.getAdClick());
+        adActionFeature.setAdConversion(adActionFeatureProto.getAdConversion());
+        adActionFeature.setCtr(adActionFeatureProto.getCtr());
+        adActionFeature.setCvr(adActionFeatureProto.getCvr());
+        return adActionFeature;
+    }
+
+    public static AdItemFeature convertToJava(AdItemFeatureProto adItemFeatureProto) {
+        AdItemFeature adItemFeature = new AdItemFeature();
+        adItemFeature.setAdId(adItemFeatureProto.getAdId());
+        adItemFeature.setAdCode(adItemFeatureProto.getAdCode());
+        adItemFeature.setAdvertiserId(adItemFeatureProto.getAdvertiserId());
+        adItemFeature.setAdvertiserCode(adItemFeatureProto.getAdvertiserCode());
+        adItemFeature.setCampaignId(adItemFeatureProto.getCampaignId());
+        adItemFeature.setCampaignCode(adItemFeatureProto.getCampaignCode());
+        adItemFeature.setCreativeId(adItemFeatureProto.getCreativeId());
+        adItemFeature.setCreativeCode(adItemFeatureProto.getCreativeCode());
+        return adItemFeature;
+    }
+
+    public static AdItemFeatureProto convertToProto(AdItemFeature adItemFeature) {
+        AdItemFeatureProto.Builder builder = AdItemFeatureProto.newBuilder();
+        builder.setAdId(adItemFeature.getAdId());
+        builder.setAdCode(adItemFeature.getAdCode());
+        builder.setAdvertiserId(adItemFeature.getAdvertiserId());
+        builder.setAdvertiserCode(adItemFeature.getAdvertiserCode());
+        builder.setCampaignId(adItemFeature.getCampaignId());
+        builder.setCampaignCode(adItemFeature.getCampaignCode());
+        builder.setCreativeId(adItemFeature.getCreativeId());
+        builder.setCreativeCode(adItemFeature.getCreativeCode());
+        builder.setDay1CntFeatures(convertToProto(adItemFeature.getDay1_cnt_features()));
+        builder.setDay3CntFeatures(convertToProto(adItemFeature.getDay3_cnt_features()));
+        builder.setDay7CntFeatures(convertToProto(adItemFeature.getDay7_cnt_features()));
+        builder.setMonth3CntFeatures(convertToProto(adItemFeature.getMonth3_cnt_features()));
+        return builder.build();
+    }
+}

+ 11 - 0
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/convert/RequestConvert.java

@@ -0,0 +1,11 @@
+package com.tzld.piaoquan.ad.engine.service.score.convert;
+
+import com.tzld.piaoquan.ad.engine.commons.score.ScoreParam;
+import com.tzld.piaoquan.ad.engine.service.score.param.RankRecommendParamRequest;
+
+public class RequestConvert {
+
+    public static ScoreParam requestConvert(RankRecommendParamRequest request){
+        return  new ScoreParam();
+    }
+}

+ 44 - 0
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/impl/RankServiceImpl.java

@@ -0,0 +1,44 @@
+package com.tzld.piaoquan.ad.engine.service.score.impl;
+
+import com.tzld.piaoquan.ad.engine.commons.base.AdRankItem;
+import com.tzld.piaoquan.ad.engine.commons.base.UserAdFeature;
+import com.tzld.piaoquan.ad.engine.commons.score.ScoreParam;
+import com.tzld.piaoquan.ad.engine.commons.score.ScorerUtils;
+import com.tzld.piaoquan.ad.engine.commons.util.CommonCollectionUtils;
+import com.tzld.piaoquan.ad.engine.service.score.FeatureRemoteService;
+import com.tzld.piaoquan.ad.engine.service.score.convert.RequestConvert;
+import com.tzld.piaoquan.ad.engine.service.score.param.RankRecommendParamRequest;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+@Service
+public class RankServiceImpl {
+
+    @Autowired
+    FeatureRemoteService featureRemoteService;
+
+    public Long adItemRank( RankRecommendParamRequest request){
+
+        ScoreParam param= RequestConvert.requestConvert(request);
+        UserAdFeature userAdFeature=featureRemoteService.getUserAdFeature(request.getMid());
+        List<AdRankItem> rankItems=featureRemoteService.
+                getAllAdFeatureList(
+                        CommonCollectionUtils.toList(request.getAdIdList(),id->id.toString())
+                );
+        List<AdRankItem> rankResult = ScorerUtils.getScorerPipeline(ScorerUtils.BASE_CONF)
+//                .scoring(convert(param), userFeature, rankItems);
+                .scoring(param, userAdFeature, rankItems);
+//        Collections.sort(rankResult, Comparator.comparingDouble(ad -> -ad.getScore()));
+        if (!CollectionUtils.isEmpty(rankResult)) {
+           return rankResult.get(0).getAdId();
+        }else {
+            return null;
+        }
+    }
+}

+ 14 - 0
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/param/RankRecommendParamRequest.java

@@ -0,0 +1,14 @@
+package com.tzld.piaoquan.ad.engine.service.score.param;
+
+import com.tzld.piaoquan.ad.engine.commons.score.ScoreParam;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class RankRecommendParamRequest {
+     ScoreParam param;
+     String mid;
+     List<Long> adIdList;
+
+}