Browse Source

Merge branch 'dev_v1.0'

gufengshou1 1 year ago
parent
commit
8cf9c284d7
33 changed files with 625 additions and 284 deletions
  1. 1 1
      ad-engine-commons/pom.xml
  2. 63 14
      ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/base/AdActionFeature.java
  3. 8 8
      ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/base/AdItemBytesFeature.java
  4. 38 0
      ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/base/AdItemFeature.java
  5. 12 19
      ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/base/AdRequestContext.java
  6. 6 11
      ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/base/AdRequestContextBytesFeature.java
  7. 0 1
      ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/base/UserAdBytesFeature.java
  8. 4 4
      ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/base/UserAdFeature.java
  9. 8 40
      ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/enums/VlogAdFeatureGroup.java
  10. 2 0
      ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/score/ScoreParam.java
  11. 0 1
      ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/score/ScorerPipeline.java
  12. 9 1
      ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/score/ScorerUtils.java
  13. 16 17
      ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/score/feature/VlogAdCtrLRFeatureExtractor.java
  14. 2 3
      ad-engine-server/pom.xml
  15. 3 5
      ad-engine-server/src/main/java/com/tzld/piaoquan/ad/engine/server/Application.java
  16. 17 15
      ad-engine-server/src/main/java/com/tzld/piaoquan/ad/engine/server/controller/AdRecommendController.java
  17. 13 1
      ad-engine-server/src/main/java/com/tzld/piaoquan/ad/engine/server/controller/ControllerAspect.java
  18. 8 1
      ad-engine-server/src/main/java/com/tzld/piaoquan/ad/engine/server/controller/PredictController.java
  19. 2 2
      ad-engine-server/src/main/resources/application-dev.yml
  20. 4 0
      ad-engine-server/src/main/resources/application.yml
  21. 2 2
      ad-engine-server/src/main/resources/feeds_score_config_baseline.conf
  22. 1 5
      ad-engine-service/pom.xml
  23. 2 1
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/containner/RoiPredictParamContainer.java
  24. 0 4
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/rank/RankService.java
  25. 96 125
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/FeatureRemoteService.java
  26. 8 0
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/RankService.java
  27. 2 2
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/VlogAdCtrLRScorer.java
  28. 153 0
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/convert/FeatureConvert.java
  29. 28 0
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/convert/RequestConvert.java
  30. 56 0
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/impl/RankServiceImpl.java
  31. 17 0
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/param/MachineInfoParam.java
  32. 14 0
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/param/RankRecommendRequestParam.java
  33. 30 1
      pom.xml

+ 1 - 1
ad-engine-commons/pom.xml

@@ -47,7 +47,7 @@
         <dependency>
             <groupId>com.aliyun.odps</groupId>
             <artifactId>odps-sdk-core</artifactId>
-            <version>0.45.6-public</version>
+            <version>0.28.4-public</version>
         </dependency>
 
         <dependency>

+ 63 - 14
ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/base/AdActionFeature.java

@@ -4,30 +4,79 @@ import lombok.Data;
 
 @Data
 public class AdActionFeature {
-    private double adView;
-    private double adClick;
-    private double adConversion;
+    private double adView=0d;
+    private double adClick=0d;
+    private double adConversion=0d;
 
-    private double ctr;
-    private double cvr;
+    private double ctr=0d;
+    private double cvr=0d;
 
     private double ceilLog(Double key) {
-        return Math.ceil(Math.log(key));
+        return Math.ceil(Math.log(key + 1));
     }
 
     private double bucketRatioFeature(Double key) {
-        long bucket = Math.round(Math.log(key * 100));
-        if (bucket > 100)
-            bucket = 100;
+        long bucket = Math.round(Math.log((key + 1) * 50));
+        if (bucket > 50)
+            bucket = 50;
         return (double) bucket;
     }
 
 
+    public void setOriginAdView(Object key) {
+        if (key == null) {
+            this.adView = 0.0;
+        } else {
+            String formateKey = key.toString().replace("\\N", "0");
+            this.adView = Double.valueOf(formateKey);
+        }
+    }
+
+    public void setOriginAdClick(Object key) {
+        if (key == null) {
+            this.adClick = 0.0;
+        } else {
+            String formateKey = key.toString().replace("\\N", "0");
+            this.adClick = Double.valueOf(formateKey);
+        }
+    }
+
+    public void setOriginAdConversion(Object key) {
+        if (key == null) {
+            this.adConversion = 0.0;
+        } else {
+            String formateKey = key.toString().replace("\\N", "0");
+            this.adConversion = Double.valueOf(formateKey);
+        }
+    }
+
+    // redis中保存原始值  server段统一处理
+    public void setOriginCtr(Object key) {
+        if (key == null) {
+            this.ctr = 0.0;
+        } else {
+            String formateKey = key.toString().replace("\\N", "0");
+            this.ctr = Double.valueOf(formateKey);
+        }
+    }
+
+    public void setOriginCvr(Object key) {
+        if (key == null) {
+            this.cvr = 0.0;
+        } else {
+            String formateKey = key.toString().replace("\\N", "0");
+            this.cvr = Double.valueOf(formateKey);
+        }
+    }
+
+
+
+
     public void setAdView(Object key) {
         if (key == null) {
             this.adView = 0.0;
         } else {
-            String formateKey = key.toString().replace("\\N", "-1");
+            String formateKey = key.toString().replace("\\N", "0");
             this.adView = ceilLog(Double.valueOf(formateKey));
         }
     }
@@ -36,7 +85,7 @@ public class AdActionFeature {
         if (key == null) {
             this.adClick = 0.0;
         } else {
-            String formateKey = key.toString().replace("\\N", "-1");
+            String formateKey = key.toString().replace("\\N", "0");
             this.adClick = ceilLog(Double.valueOf(formateKey));
         }
     }
@@ -45,7 +94,7 @@ public class AdActionFeature {
         if (key == null) {
             this.adConversion = 0.0;
         } else {
-            String formateKey = key.toString().replace("\\N", "-1");
+            String formateKey = key.toString().replace("\\N", "0");
             this.adConversion = ceilLog(Double.valueOf(formateKey));
         }
     }
@@ -54,7 +103,7 @@ public class AdActionFeature {
         if (key == null) {
             this.ctr = 0.0;
         } else {
-            String formateKey = key.toString().replace("\\N", "-1");
+            String formateKey = key.toString().replace("\\N", "0");
             this.ctr = bucketRatioFeature(Double.valueOf(formateKey));
         }
     }
@@ -63,7 +112,7 @@ public class AdActionFeature {
         if (key == null) {
             this.cvr = 0.0;
         } else {
-            String formateKey = key.toString().replace("\\N", "-1");
+            String formateKey = key.toString().replace("\\N", "0");
             this.cvr = bucketRatioFeature(Double.valueOf(formateKey));
         }
     }

+ 8 - 8
ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/base/AdItemBytesFeature.java

@@ -10,19 +10,19 @@ public class AdItemBytesFeature {
 
     private final byte[] adId;
 
-    private final byte[] adCode;
+    //private final byte[] adCode;
 
     private final byte[] advertiserId;
 
-    private final byte[] advertiserCode;
+    //private final byte[] advertiserCode;
 
     private final byte[] campaignId;
 
-    private final byte[] campaignCode;
+    //private final byte[] campaignCode;
 
     private final byte[] creative;
 
-    private final byte[] creativeCode;
+    //private final byte[] creativeCode;
 
 
     private Map<String, byte[]> day1_cnt_features;
@@ -37,13 +37,13 @@ public class AdItemBytesFeature {
     public AdItemBytesFeature(AdItemFeature feature) {
 
         adId = feature.getAdId().getBytes();
-        adCode = feature.getAdCode().getBytes();
+        // adCode = feature.getAdCode().getBytes();
         advertiserId = feature.getAdvertiserId().getBytes();
-        advertiserCode = feature.getAdvertiserCode().getBytes();
+        //advertiserCode = feature.getAdvertiserCode().getBytes();
         campaignId = feature.getCampaignId().getBytes();
-        campaignCode = feature.getCampaignCode().getBytes();
+        //campaignCode = feature.getCampaignCode().getBytes();
         creative = feature.getCreativeId().getBytes();
-        creativeCode = feature.getCreativeCode().getBytes();
+        // creativeCode = feature.getCreativeCode().getBytes();
 
 
 

+ 38 - 0
ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/base/AdItemFeature.java

@@ -25,6 +25,7 @@ public class AdItemFeature {
     @Setter
     @NotNull
     private String advertiserCode = "0";
+
     @Setter
     @NotNull
     private String campaignId = "0";
@@ -53,6 +54,43 @@ public class AdItemFeature {
     private AdActionFeature month3_cnt_features;
 
 
+
+    public void setAdId(String key){
+        if(key == null){
+            this.adId = "0";
+        } else {
+            this.adId = key;
+        }
+    }
+
+
+    public void setAdvertiserId(String key){
+        if(key == null){
+            this.advertiserId = "0";
+        } else {
+            this.advertiserId = key;
+        }
+    }
+
+    public void setCampaignId(String key){
+        if(key == null){
+            this.campaignId = "0";
+        } else {
+            this.campaignId = key;
+        }
+    }
+
+
+    public void setCreativeId(String key){
+        if(key == null){
+            this.creativeId = "0";
+        } else {
+            this.creativeId = key;
+        }
+    }
+
+
+
     public void setDay1_cnt_features(AdActionFeature feature) {
         this.day1_cnt_features = feature;
     }

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

@@ -9,23 +9,22 @@ import lombok.NoArgsConstructor;
 public class AdRequestContext {
 
     // 机型等信息
-    private String apptype;
-    private String machineinfoBrand;
-    private String machineinfoModel;
-    private String machineinfoSdkversion;
-    private String machineinfoSystem;
-    private String machineinfoWechatversion;
+    private String apptype="-1";
+    private String machineinfoBrand="-1";
+    private String machineinfoModel="-1";
+    private String machineinfoSdkversion="-1";
+    private String machineinfoWechatversion="-1";
 
     // 时间等信息
-    private String day;
-    private String week;
-    private String hour;
-    private String region;
-    private String city;
+    private String day="-1";
+    private String week="-1";
+    private String hour="-1";
+    private String region="-1";
+    private String city="-1";
 
     // video信息
-    private String headVideoId;
-    private String PageSource;
+//    private String headVideoId;
+//    private String PageSource;
 
     // position 信息
     private String ownAdPositionId;
@@ -65,12 +64,6 @@ public class AdRequestContext {
     }
 
 
-    public void setMachineinfo_system(String machineinfo_system) {
-        this.machineinfoSystem = machineinfo_system;
-        if (machineinfo_system == null)
-            this.machineinfoSystem = "-1";
-    }
-
 
     public void setHour(String hour) {
         this.hour = hour;

+ 6 - 11
ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/base/AdRequestContextBytesFeature.java

@@ -9,7 +9,6 @@ public class AdRequestContextBytesFeature {
     private final byte[] machineinfo_brand;
     private final byte[] machineinfo_model;
     private final byte[] machineinfo_sdkversion;
-    private final byte[] machineinfo_system;
     private final byte[] machineinfo_wechatversion;
 
     // 时间等信息
@@ -20,11 +19,11 @@ public class AdRequestContextBytesFeature {
     private final byte[] city;
 
     // position 等信息
-    private final byte[] headVideoId;
-    private final byte[] pageSource;
+    // private final byte[] headVideoId;
+    // private final byte[] pageSource;
 
     // position 信息
-    private final byte[] ownAdPositionId;
+    // private final byte[] ownAdPositionId;
 
 
     public AdRequestContextBytesFeature(AdRequestContext requestContext) {
@@ -32,7 +31,6 @@ public class AdRequestContextBytesFeature {
         machineinfo_brand = requestContext.getMachineinfoBrand().getBytes();
         machineinfo_model = requestContext.getMachineinfoModel().getBytes();
         machineinfo_sdkversion = requestContext.getMachineinfoSdkversion().getBytes();
-        machineinfo_system = requestContext.getMachineinfoSystem().getBytes();
         machineinfo_wechatversion = requestContext.getMachineinfoWechatversion().getBytes();
 
         day = requestContext.getDay().getBytes();
@@ -41,12 +39,9 @@ public class AdRequestContextBytesFeature {
         region = requestContext.getRegion().getBytes();
         city = requestContext.getCity().getBytes();
 
-
-        headVideoId = requestContext.getHeadVideoId().getBytes();
-        pageSource = requestContext.getPageSource().getBytes();
-        ownAdPositionId = requestContext.getOwnAdPositionId().getBytes();
-
-
+        // headVideoId = requestContext.getHeadVideoId().getBytes();
+        // pageSource = requestContext.getPageSource().getBytes();
+        // ownAdPositionId = requestContext.getOwnAdPositionId().getBytes();
     }
 
 

+ 0 - 1
ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/base/UserAdBytesFeature.java

@@ -108,7 +108,6 @@ public class UserAdBytesFeature {
         this.city = feature.getCity().getBytes();
 
 
-        this.day1_cnt_features = new HashMap<String, byte[]>();
 
         // 1 day statistic
         day1_cnt_features = new HashMap<String, byte[]>();

+ 4 - 4
ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/base/UserAdFeature.java

@@ -67,13 +67,13 @@ public class UserAdFeature {
 
 
     // 当天统计量信息
-    private AdActionFeature day1_cnt_features;
+    private AdActionFeature day1_cnt_features=new AdActionFeature();
     // 3天内统计量
-    private AdActionFeature day3_cnt_features;
+    private AdActionFeature day3_cnt_features=new AdActionFeature();
     // 7天内统计量
-    private AdActionFeature day7_cnt_features;
+    private AdActionFeature day7_cnt_features=new AdActionFeature();
     // 3个月统计量
-    private AdActionFeature month3_cnt_features;
+    private AdActionFeature month3_cnt_features=new AdActionFeature();
 
 
     public void setDay1_cnt_features(AdActionFeature key) {

+ 8 - 40
ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/enums/VlogAdFeatureGroup.java

@@ -27,76 +27,44 @@ public enum VlogAdFeatureGroup {
 
     USER_1DAY_EXP,
     USER_1DAY_CLICK,
-    USER_1DAY_SHARE,
-    USER_1DAY_RETURN,
     USER_1DAY_CTR,
-    USER_1DAY_STR,
-    USER_1DAY_ROV,
-    USER_1DAY_ROS,
+    USER_1DAY_CVR,
 
     USER_3DAY_EXP,
     USER_3DAY_CLICK,
-    USER_3DAY_SHARE,
-    USER_3DAY_RETURN,
     USER_3DAY_CTR,
-    USER_3DAY_STR,
-    USER_3DAY_ROV,
-    USER_3DAY_ROS,
+    USER_3DAY_CVR,
 
     USER_7DAY_EXP,
     USER_7DAY_CLICK,
-    USER_7DAY_SHARE,
-    USER_7DAY_RETURN,
     USER_7DAY_CTR,
-    USER_7DAY_STR,
-    USER_7DAY_ROV,
-    USER_7DAY_ROS,
+    USER_7DAY_CVR,
 
     USER_3MONTH_EXP,
     USER_3MONTH_CLICK,
-    USER_3MONTH_SHARE,
-    USER_3MONTH_RETURN,
     USER_3MONTH_CTR,
-    USER_3MONTH_STR,
-    USER_3MONTH_ROV,
-    USER_3MONTH_ROS,
+    USER_3MONTH_CVR,
 
 
     ITEM_1DAY_EXP,
     ITEM_1DAY_CLICK,
-    ITEM_1DAY_SHARE,
-    ITEM_1DAY_RETURN,
     ITEM_1DAY_CTR,
-    ITEM_1DAY_STR,
-    ITEM_1DAY_ROV,
-    ITEM_1DAY_ROS,
+    ITEM_1DAY_CVR,
 
     ITEM_3DAY_EXP,
     ITEM_3DAY_CLICK,
-    ITEM_3DAY_SHARE,
-    ITEM_3DAY_RETURN,
     ITEM_3DAY_CTR,
-    ITEM_3DAY_STR,
-    ITEM_3DAY_ROV,
-    ITEM_3DAY_ROS,
+    ITEM_3DAY_CVR,
 
     ITEM_7DAY_EXP,
     ITEM_7DAY_CLICK,
-    ITEM_7DAY_SHARE,
-    ITEM_7DAY_RETURN,
     ITEM_7DAY_CTR,
-    ITEM_7DAY_STR,
-    ITEM_7DAY_ROV,
-    ITEM_7DAY_ROS,
+    ITEM_7DAY_CVR,
 
     ITEM_3MONTH_EXP,
     ITEM_3MONTH_CLICK,
-    ITEM_3MONTH_SHARE,
-    ITEM_3MONTH_RETURN,
     ITEM_3MONTH_CTR,
-    ITEM_3MONTH_STR,
-    ITEM_3MONTH_ROV,
-    ITEM_3MONTH_ROS,
+    ITEM_3MONTH_CVR,
 
 
     ;

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

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

+ 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) {
 

+ 9 - 1
ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/score/ScorerUtils.java

@@ -6,10 +6,12 @@ import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.exception.ExceptionUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.core.SpringProperties;
 
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import java.util.Properties;
 import java.util.concurrent.ConcurrentHashMap;
 
 
@@ -27,7 +29,7 @@ public final class ScorerUtils {
     }
 
     private ScorerUtils() {
-        // init(BASE_CONF);
+//         init(BASE_CONF);
     }
 
     public static void init(String configFile) {
@@ -71,6 +73,7 @@ public final class ScorerUtils {
         if (scorerPipelineCache.containsKey(configFile)) {
             return scorerPipelineCache.get(configFile);
         }
+
         ScorerConfig scorerConfig = new ScorerConfig();
         scorerConfig.load(configFile);
         List<AbstractScorer> scorers = ScorerUtils.constructScorers(scorerConfig);
@@ -143,4 +146,9 @@ public final class ScorerUtils {
         }
         return scorers;
     }
+
+
+    public static void main(String[] args){
+        ScorerUtils.init(BASE_CONF);
+    }
 }

+ 16 - 17
ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/score/feature/VlogAdCtrLRFeatureExtractor.java

@@ -26,7 +26,6 @@ public class VlogAdCtrLRFeatureExtractor extends LRBytesFeatureExtractorBase {
         makeFea(VlogAdFeatureGroup.MACHINEINFO_BRAND, requestContextBytes.getMachineinfo_brand());
         makeFea(VlogAdFeatureGroup.MACHINEINFO_MODEL, requestContextBytes.getMachineinfo_model());
         makeFea(VlogAdFeatureGroup.MACHINEINFO_SDKVERSION, requestContextBytes.getMachineinfo_sdkversion());
-        makeFea(VlogAdFeatureGroup.MACHINEINFO_SYSTEM, requestContextBytes.getMachineinfo_system());
         makeFea(VlogAdFeatureGroup.MACHINEINFO_WECHATVERSION, requestContextBytes.getMachineinfo_brand());
 
         makeFea(VlogAdFeatureGroup.DAY, requestContextBytes.getWeek());
@@ -41,26 +40,26 @@ public class VlogAdCtrLRFeatureExtractor extends LRBytesFeatureExtractorBase {
         // 1day features
         makeFea(VlogAdFeatureGroup.USER_1DAY_EXP, userAdBytesFeature.getDay1_cnt_features().get("view"));
         makeFea(VlogAdFeatureGroup.USER_1DAY_CLICK, userAdBytesFeature.getDay1_cnt_features().get("click"));
-        makeFea(VlogAdFeatureGroup.USER_1DAY_SHARE, userAdBytesFeature.getDay1_cnt_features().get("ctr"));
-        makeFea(VlogAdFeatureGroup.USER_1DAY_RETURN, userAdBytesFeature.getDay1_cnt_features().get("cvr"));
+        makeFea(VlogAdFeatureGroup.USER_1DAY_CTR, userAdBytesFeature.getDay1_cnt_features().get("ctr"));
+        makeFea(VlogAdFeatureGroup.USER_1DAY_CVR, userAdBytesFeature.getDay1_cnt_features().get("cvr"));
 
         // 3day features
         makeFea(VlogAdFeatureGroup.USER_3DAY_EXP, userAdBytesFeature.getDay3_cnt_features().get("view"));
         makeFea(VlogAdFeatureGroup.USER_3DAY_CLICK, userAdBytesFeature.getDay3_cnt_features().get("click"));
-        makeFea(VlogAdFeatureGroup.USER_3DAY_SHARE, userAdBytesFeature.getDay3_cnt_features().get("ctr"));
-        makeFea(VlogAdFeatureGroup.USER_3DAY_RETURN, userAdBytesFeature.getDay3_cnt_features().get("cvr"));
+        makeFea(VlogAdFeatureGroup.USER_3DAY_CTR, userAdBytesFeature.getDay3_cnt_features().get("ctr"));
+        makeFea(VlogAdFeatureGroup.USER_3DAY_CVR, userAdBytesFeature.getDay3_cnt_features().get("cvr"));
 
         // 7day features
         makeFea(VlogAdFeatureGroup.USER_7DAY_EXP, userAdBytesFeature.getDay7_cnt_features().get("view"));
         makeFea(VlogAdFeatureGroup.USER_7DAY_CLICK, userAdBytesFeature.getDay7_cnt_features().get("click"));
-        makeFea(VlogAdFeatureGroup.USER_7DAY_SHARE, userAdBytesFeature.getDay7_cnt_features().get("ctr"));
-        makeFea(VlogAdFeatureGroup.USER_7DAY_RETURN, userAdBytesFeature.getDay7_cnt_features().get("cvr"));
+        makeFea(VlogAdFeatureGroup.USER_7DAY_CTR, userAdBytesFeature.getDay7_cnt_features().get("ctr"));
+        makeFea(VlogAdFeatureGroup.USER_7DAY_CVR, userAdBytesFeature.getDay7_cnt_features().get("cvr"));
 
         // 3month features
         makeFea(VlogAdFeatureGroup.USER_3MONTH_EXP, userAdBytesFeature.getMonth3_cnt_features().get("view"));
         makeFea(VlogAdFeatureGroup.USER_3MONTH_CLICK, userAdBytesFeature.getMonth3_cnt_features().get("click"));
-        makeFea(VlogAdFeatureGroup.USER_3MONTH_SHARE, userAdBytesFeature.getMonth3_cnt_features().get("ctr"));
-        makeFea(VlogAdFeatureGroup.USER_3MONTH_RETURN, userAdBytesFeature.getMonth3_cnt_features().get("cvr"));
+        makeFea(VlogAdFeatureGroup.USER_3MONTH_CTR, userAdBytesFeature.getMonth3_cnt_features().get("ctr"));
+        makeFea(VlogAdFeatureGroup.USER_3MONTH_CVR, userAdBytesFeature.getMonth3_cnt_features().get("cvr"));
 
 
     }
@@ -78,28 +77,28 @@ public class VlogAdCtrLRFeatureExtractor extends LRBytesFeatureExtractorBase {
         // 1day features
         makeFea(VlogAdFeatureGroup.ITEM_1DAY_EXP, item.getDay1_cnt_features().get("view"));
         makeFea(VlogAdFeatureGroup.ITEM_1DAY_CLICK, item.getDay1_cnt_features().get("click"));
-        makeFea(VlogAdFeatureGroup.ITEM_1DAY_SHARE, item.getDay1_cnt_features().get("ctr"));
-        makeFea(VlogAdFeatureGroup.ITEM_1DAY_RETURN, item.getDay1_cnt_features().get("cvr"));
+        makeFea(VlogAdFeatureGroup.ITEM_1DAY_CTR, item.getDay1_cnt_features().get("ctr"));
+        makeFea(VlogAdFeatureGroup.ITEM_1DAY_CVR, item.getDay1_cnt_features().get("cvr"));
 
         // 3day features
         makeFea(VlogAdFeatureGroup.ITEM_3DAY_EXP, item.getDay1_cnt_features().get("view"));
         makeFea(VlogAdFeatureGroup.ITEM_3DAY_CLICK, item.getDay1_cnt_features().get("click"));
-        makeFea(VlogAdFeatureGroup.ITEM_3DAY_SHARE, item.getDay1_cnt_features().get("ctr"));
-        makeFea(VlogAdFeatureGroup.ITEM_3DAY_RETURN, item.getDay1_cnt_features().get("cvr"));
+        makeFea(VlogAdFeatureGroup.ITEM_3DAY_CTR, item.getDay1_cnt_features().get("ctr"));
+        makeFea(VlogAdFeatureGroup.ITEM_3DAY_CVR, item.getDay1_cnt_features().get("cvr"));
 
 
         // 7day features
         makeFea(VlogAdFeatureGroup.ITEM_7DAY_EXP, item.getDay1_cnt_features().get("view"));
         makeFea(VlogAdFeatureGroup.ITEM_7DAY_CLICK, item.getDay1_cnt_features().get("click"));
-        makeFea(VlogAdFeatureGroup.ITEM_7DAY_SHARE, item.getDay1_cnt_features().get("ctr"));
-        makeFea(VlogAdFeatureGroup.ITEM_7DAY_RETURN, item.getDay1_cnt_features().get("cvr"));
+        makeFea(VlogAdFeatureGroup.ITEM_7DAY_CTR, item.getDay1_cnt_features().get("ctr"));
+        makeFea(VlogAdFeatureGroup.ITEM_7DAY_CVR, item.getDay1_cnt_features().get("cvr"));
 
 
         // 3month features
         makeFea(VlogAdFeatureGroup.ITEM_3MONTH_EXP, item.getMonth3_cnt_features().get("view"));
         makeFea(VlogAdFeatureGroup.ITEM_3MONTH_CLICK, item.getMonth3_cnt_features().get("click"));
-        makeFea(VlogAdFeatureGroup.ITEM_3MONTH_SHARE, item.getMonth3_cnt_features().get("ctr"));
-        makeFea(VlogAdFeatureGroup.ITEM_3MONTH_RETURN, item.getMonth3_cnt_features().get("cvr"));
+        makeFea(VlogAdFeatureGroup.ITEM_3MONTH_CTR, item.getMonth3_cnt_features().get("ctr"));
+        makeFea(VlogAdFeatureGroup.ITEM_3MONTH_CVR, item.getMonth3_cnt_features().get("cvr"));
 
     }
 

+ 2 - 3
ad-engine-server/pom.xml

@@ -18,8 +18,6 @@
             <version>1.0.0</version>
         </dependency>
 
-
-
     </dependencies>
     <build>
         <!-- 固定包名 避免随着版本变动 -->
@@ -31,9 +29,10 @@
                     <include>**/*.yml</include>
                     <include>**/*.yaml</include>
                     <include>**/*.xml</include>
+                    <include>**/*.conf</include>
                     <include>**/*.properties</include>
                 </includes>
-                <filtering>false</filtering>
+                <filtering>true</filtering>
             </resource>
         </resources>
         <plugins>

+ 3 - 5
ad-engine-server/src/main/java/com/tzld/piaoquan/ad/engine/server/Application.java

@@ -1,6 +1,7 @@
 package com.tzld.piaoquan.ad.engine.server;
 
 import com.ctrip.framework.apollo.spring.annotation.EnableApolloConfig;
+import com.tzld.piaoquan.ad.engine.commons.score.ScorerUtils;
 import com.tzld.piaoquan.recommend.feature.client.FeatureClient;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
@@ -18,7 +19,7 @@ import org.springframework.scheduling.annotation.EnableScheduling;
  */
 @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class,SecurityAutoConfiguration.class})
 @ComponentScan({
-        "com.tzld.piaoquan.ad.engine.*"
+        "com.tzld.piaoquan.ad.engine.*","com.tzld.piaoquan.recommend.feature.*"
 })
 @EnableEurekaClient
 @EnableAspectJAutoProxy
@@ -28,10 +29,7 @@ import org.springframework.scheduling.annotation.EnableScheduling;
 public class Application {
     public static void main(String[] args) {
         SpringApplication.run(Application.class, args);
+        ScorerUtils.warmUp();
     }
 
-//    @Bean
-//    public FeatureClient featureClient() {
-//        return new FeatureClient();
-//    }
 }

+ 17 - 15
ad-engine-server/src/main/java/com/tzld/piaoquan/ad/engine/server/controller/AdRecommendController.java

@@ -1,33 +1,35 @@
 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.RankRecommendRequestParam;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 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
 @RequestMapping("/recommend")
 public class AdRecommendController {
 
+    private final static Logger log = LoggerFactory.getLogger(AdRecommendController.class);
+    @Autowired
+    RankService rankService;
 
-//    @Autowired
-//    VlogAdCtrLRScorer scorer;
-
-    @RequestMapping("/base/ctr/top")
-    public Map<String,Object> adPredictByAbTestModel(final ScoreParam param,
-                                                     final UserAdFeature userFeature,
-                                                     final List<AdRankItem> rankItems){
-//        scorer.scoring(param,userFeature,rankItems).get(0);
-        return new HashMap<>();
+    @RequestMapping("/top1/basic")
+    public Map<String,Object> adRecommendTop1Basic(@RequestBody RankRecommendRequestParam request){
+        Long adId= rankService.adItemRank(request);
+        HashMap map =new HashMap();
+        map.put("code","0");
+        map.put("msg","success");
+        HashMap contentMap=new HashMap<>();
+        contentMap.put("adId",adId);
+        map.put("content",contentMap);
+        return map;
     }
 
 }

+ 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.*(..))")
+    public void excludePointcut(){
+
+    }
+
+
+    @Around("logPointcut() && !excludePointcut()")
     public Object around(ProceedingJoinPoint pjp) throws Throwable {
         TraceUtils.setMDC();
         String className = pjp.getTarget().getClass().getSimpleName();

+ 8 - 1
ad-engine-server/src/main/java/com/tzld/piaoquan/ad/engine/server/controller/PredictController.java

@@ -16,10 +16,17 @@ import java.util.*;
 @RequestMapping("/predict")
 public class PredictController {
 
+    private final static Logger log = LoggerFactory.getLogger(PredictController.class);
+
     @Autowired
     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){
 

+ 2 - 2
ad-engine-server/src/main/resources/application-dev.yml

@@ -43,8 +43,8 @@ spring:
     password: Wqsd@2019
     timeout: 1000
   redis-algorithm:
-#    hostName: r-bp1ps6my7lzg8rdhwx682.redis.rds.aliyuncs.com
-    hostName: r-bp1fogs2mflr1ybfot.redis.rds.aliyuncs.com
+    hostName: r-bp1ps6my7lzg8rdhwx682.redis.rds.aliyuncs.com
+#    hostName: r-bp1fogs2mflr1ybfot.redis.rds.aliyuncs.com
     port: 6379
     password: Wqsd@2019
     timeout: 1000

+ 4 - 0
ad-engine-server/src/main/resources/application.yml

@@ -120,3 +120,7 @@ xxl:
       logpath: ${datalog}/xxl-job/
       logretentiondays: 30
       port: 9999
+grpc:
+  client:
+    recommend-feature:
+      negotiationType: PLAINTEXT

+ 2 - 2
ad-engine-server/src/main/resources/feeds_score_config_baseline.conf

@@ -1,7 +1,7 @@
 scorer-config = {
   related-score-config = {
-    scorer-name = "com.tzld.piaoquan.recommend.server.service.score.VlogShareLRScorer"
+    scorer-name = "com.tzld.piaoquan.ad.engine.service.score.VlogAdCtrLRScorer"
     scorer-priority = 99
-    model-path = "model/model_new.txt"
+    model-path = "ad_ctr_model/model_ad_ctr.txt"
   }
 }

+ 1 - 5
ad-engine-service/pom.xml

@@ -23,11 +23,7 @@
             <artifactId>ad-engine-commons</artifactId>
             <version>1.0.0</version>
         </dependency>
-        <dependency>
-            <groupId>com.google.protobuf</groupId>
-            <artifactId>protobuf-java</artifactId>
-            <version>3.12.0</version>
-        </dependency>
+
         <dependency>
             <groupId>com.tzld.piaoquan</groupId>
             <artifactId>recommend-feature-client</artifactId>

+ 2 - 1
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/containner/RoiPredictParamContainer.java

@@ -19,7 +19,8 @@ public class RoiPredictParamContainer {
     Double adRoi;
     @PostConstruct
     private void initParams(){
-
+        refreshAdArpu();
+        refreshAdRoi();
     }
 
     private void refreshAdArpu(){

+ 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 {
-}

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

@@ -1,125 +1,96 @@
-//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.LinkedList;
+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;
+    }
+
+
+}

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

@@ -0,0 +1,8 @@
+package com.tzld.piaoquan.ad.engine.service.score;
+
+import com.tzld.piaoquan.ad.engine.service.score.param.RankRecommendRequestParam;
+
+public interface RankService {
+
+    Long adItemRank( RankRecommendRequestParam request);
+}

+ 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});
     }
 }

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

@@ -0,0 +1,153 @@
+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());
+            userAdFeature.setDay1_cnt_features(convertToJava(userAdFeatureProto.getDay1CntFeatures()));
+            userAdFeature.setDay3_cnt_features(convertToJava(userAdFeatureProto.getDay3CntFeatures()));
+            userAdFeature.setDay7_cnt_features(convertToJava(userAdFeatureProto.getDay7CntFeatures()));
+            userAdFeature.setMonth3_cnt_features(convertToJava(userAdFeatureProto.getMonth3CntFeatures()));
+            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.setDay1_cnt_features(convertToJava(adItemFeatureProto.getDay1CntFeatures()));
+        adItemFeature.setDay3_cnt_features(convertToJava(adItemFeatureProto.getDay3CntFeatures()));
+        adItemFeature.setDay7_cnt_features(convertToJava(adItemFeatureProto.getDay7CntFeatures()));
+        adItemFeature.setMonth3_cnt_features(convertToJava(adItemFeatureProto.getMonth3CntFeatures()));
+        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();
+    }
+}

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

@@ -0,0 +1,28 @@
+package com.tzld.piaoquan.ad.engine.service.score.convert;
+
+import com.tzld.piaoquan.ad.engine.commons.base.AdRequestContext;
+import com.tzld.piaoquan.ad.engine.commons.score.ScoreParam;
+import com.tzld.piaoquan.ad.engine.service.score.param.RankRecommendRequestParam;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+
+public class RequestConvert {
+
+    public static ScoreParam requestConvert(RankRecommendRequestParam request){
+        AdRequestContext context=new AdRequestContext();
+        context.setApptype(request.getAppType().toString());
+        context.setMachineinfoBrand(request.getMachineInfo().getBrand());
+        context.setMachineinfoModel(request.getMachineInfo().getModel());
+        context.setMachineinfoSdkversion(request.getMachineInfo().getSdkVersion());
+        context.setMachineinfoWchatversion(request.getMachineInfo().getWeChatVersion());
+        LocalDateTime date=LocalDateTime.now();
+        context.setHour(date.getHour()+"");
+        context.setDay(date.format(DateTimeFormatter.ofPattern("yyyyMMdd")));
+        context.setWeek(date.getDayOfWeek().getValue()+"");
+        ScoreParam scoreParam=new ScoreParam();
+        scoreParam.setRequestContext(context);
+        return scoreParam;
+    }
+
+}

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

@@ -0,0 +1,56 @@
+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.RankService;
+import com.tzld.piaoquan.ad.engine.service.score.convert.RequestConvert;
+import com.tzld.piaoquan.ad.engine.service.score.param.RankRecommendRequestParam;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.*;
+
+@Service
+public class RankServiceImpl implements RankService {
+
+    private final static Logger log = LoggerFactory.getLogger(RankServiceImpl.class);
+
+    @Autowired
+    FeatureRemoteService featureRemoteService;
+
+    public Long adItemRank( RankRecommendRequestParam request){
+
+        ScoreParam param= RequestConvert.requestConvert(request);
+        UserAdFeature userAdFeature=featureRemoteService.getUserAdFeature(request.getMid());
+        if(userAdFeature==null){
+            userAdFeature=new UserAdFeature();
+        }
+        List<AdRankItem> rankItems=featureRemoteService.
+                getAllAdFeatureList(
+                        CommonCollectionUtils.toList(request.getAdIdList(),id->id.toString())
+                );
+        //兜底方案
+        if(rankItems==null|| rankItems.size()==0){
+            AdRankItem adRankItem=new AdRankItem();
+            adRankItem.setAdId(request.getAdIdList().get(0));
+            rankItems=new ArrayList<>();
+            rankItems.add(adRankItem);
+        }
+        List<AdRankItem> rankResult = ScorerUtils
+                .getScorerPipeline(
+                        ScorerUtils.BASE_CONF)
+                .scoring(param, userAdFeature, rankItems);
+        if (!CollectionUtils.isEmpty(rankResult)) {
+           return rankResult.get(0).getAdId();
+        }else {
+            return null;
+        }
+    }
+}

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

@@ -0,0 +1,17 @@
+package com.tzld.piaoquan.ad.engine.service.score.param;
+
+import lombok.Data;
+
+@Data
+public class MachineInfoParam {
+
+    String sdkVersion;
+
+    String brand;
+
+    String model;
+    String weChatVersion;
+
+
+
+}

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

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

+ 30 - 1
pom.xml

@@ -125,6 +125,10 @@
                     <artifactId>aliyun-log</artifactId>
                     <groupId>com.aliyun.openservices</groupId>
                 </exclusion>
+                <exclusion>
+                    <artifactId>protobuf-java</artifactId>
+                    <groupId>com.google.protobuf</groupId>
+                </exclusion>
             </exclusions>
         </dependency>
 
@@ -132,6 +136,12 @@
             <groupId>com.aliyun.openservices</groupId>
             <artifactId>aliyun-log-logback-appender</artifactId>
             <version>0.1.18</version>
+            <exclusions>
+                <exclusion>
+                    <artifactId>protobuf-java</artifactId>
+                    <groupId>com.google.protobuf</groupId>
+                </exclusion>
+            </exclusions>
         </dependency>
 
         <dependency>
@@ -209,6 +219,10 @@
             <artifactId>commons-external</artifactId>
             <version>1.0-SNAPSHOT</version>
             <exclusions>
+                <exclusion>
+                    <groupId>com.aliyun.oss</groupId>
+                    <artifactId>aliyun-sdk-oss</artifactId>
+                </exclusion>
                 <exclusion>
                     <artifactId>jedis</artifactId>
                     <groupId>redis.clients</groupId>
@@ -282,7 +296,22 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-security</artifactId>
         </dependency>
-
+        <dependency>
+            <groupId>com.google.protobuf</groupId>
+            <artifactId>protobuf-java</artifactId>
+            <version>3.12.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.protobuf</groupId>
+            <artifactId>protobuf-java-util</artifactId>
+            <version>3.6.0</version>
+            <exclusions>
+                <exclusion>
+                    <artifactId>protobuf-java</artifactId>
+                    <groupId>com.google.protobuf</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
         <!--easyexcel-->
     </dependencies>