Explorar el Código

dev 1.0 with rank

gufengshou1 hace 1 año
padre
commit
452bd3224b
Se han modificado 23 ficheros con 312 adiciones y 55 borrados
  1. 1 1
      ad-engine-commons/pom.xml
  2. 5 5
      ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/base/AdActionFeature.java
  3. 10 10
      ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/base/AdRequestContext.java
  4. 4 4
      ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/base/UserAdFeature.java
  5. 1 4
      ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/score/ScoreParam.java
  6. 9 1
      ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/score/ScorerUtils.java
  7. 186 0
      ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/score/VlogAdCtrLRScorer.java
  8. 2 3
      ad-engine-server/pom.xml
  9. 2 0
      ad-engine-server/src/main/java/com/tzld/piaoquan/ad/engine/server/Application.java
  10. 15 5
      ad-engine-server/src/main/java/com/tzld/piaoquan/ad/engine/server/controller/AdRecommendController.java
  11. 1 1
      ad-engine-server/src/main/java/com/tzld/piaoquan/ad/engine/server/controller/ControllerAspect.java
  12. 3 1
      ad-engine-server/src/main/java/com/tzld/piaoquan/ad/engine/server/controller/PredictController.java
  13. 4 0
      ad-engine-server/src/main/resources/application.yml
  14. 1 1
      ad-engine-server/src/main/resources/feeds_score_config_baseline.conf
  15. 2 1
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/containner/RoiPredictParamContainer.java
  16. 3 2
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/FeatureRemoteService.java
  17. 5 1
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/RankService.java
  18. 4 1
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/convert/FeatureConvert.java
  19. 12 3
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/convert/RequestConvert.java
  20. 18 8
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/impl/RankServiceImpl.java
  21. 17 0
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/param/MachineInfoParam.java
  22. 3 3
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/param/RankRecommendRequestParam.java
  23. 4 0
      pom.xml

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

@@ -10,7 +10,7 @@
     <modelVersion>4.0.0</modelVersion>
 
     <artifactId>ad-engine-commons</artifactId>
-    <version>1.0.0</version>
+    <version>1.0.0.release</version>
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <maven.compiler.source>1.8</maven.compiler.source>

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

@@ -4,12 +4,12 @@ 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 + 1));

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

@@ -9,18 +9,18 @@ import lombok.NoArgsConstructor;
 public class AdRequestContext {
 
     // 机型等信息
-    private String apptype;
-    private String machineinfoBrand;
-    private String machineinfoModel;
-    private String machineinfoSdkversion;
-    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;

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

+ 1 - 4
ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/score/ScoreParam.java

@@ -10,8 +10,5 @@ import lombok.Data;
 public class ScoreParam {
     private AdRequestContext requestContext;
 
-    public ScoreParam(){
-
-    }
-
 }
+

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

+ 186 - 0
ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/score/VlogAdCtrLRScorer.java

@@ -0,0 +1,186 @@
+package com.tzld.piaoquan.ad.engine.commons.score;
+
+
+import com.tzld.piaoquan.ad.engine.commons.base.*;
+import com.tzld.piaoquan.ad.engine.commons.score.feature.VlogAdCtrLRFeatureExtractor;
+import com.tzld.piaoquan.ad.engine.commons.score.model.LRModel;
+import com.tzld.piaoquan.recommend.server.gen.recommend.LRSamples;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang.exception.ExceptionUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.*;
+
+
+//@Service
+public class VlogAdCtrLRScorer extends BaseLRModelScorer {
+
+    private final static int CORE_POOL_SIZE = 64;
+
+    private static final int LOCAL_TIME_OUT = 150;
+    private final static Logger LOGGER = LoggerFactory.getLogger(VlogAdCtrLRScorer.class);
+    private static final ExecutorService executorService = Executors.newFixedThreadPool(128);
+    private static final double defaultUserCtrGroupNumber = 10.0;
+    private static final int enterFeedsScoreRatio = 10;
+    private static final int enterFeedsScoreNum = 20;
+
+
+    public VlogAdCtrLRScorer(ScorerConfigInfo configInfo) {
+        super(configInfo);
+    }
+
+
+    @Override
+    public List<AdRankItem> scoring(final ScoreParam param,
+                                    final UserAdFeature userFeature,
+                                    final List<AdRankItem> rankItems) {
+
+        if (userFeature == null || CollectionUtils.isEmpty(rankItems)) {
+            return rankItems;
+        }
+
+        long startTime = System.currentTimeMillis();
+        LRModel model = (LRModel) this.getModel();
+        LOGGER.debug("model size: [{}]", model.getModelSize());
+
+        List<AdRankItem> result = rankItems;
+        result = rankByJava(rankItems, param.getRequestContext(), userFeature);
+
+        LOGGER.debug("ctr ranker time java items size={}, time={} ", result != null ? result.size() : 0,
+                System.currentTimeMillis() - startTime);
+
+        return result;
+    }
+
+    private List<AdRankItem> rankByJava(final List<AdRankItem> items,
+                                      final AdRequestContext requestContext,
+                                      final UserAdFeature user) {
+        long startTime = System.currentTimeMillis();
+        LRModel model = (LRModel) this.getModel();
+        LOGGER.debug("model size: [{}]", model.getModelSize());
+
+        // userAdBytes
+        UserAdBytesFeature userInfoBytes = null;
+        userInfoBytes = new UserAdBytesFeature(user);
+
+        // 所有都参与打分,按照ctr排序
+        multipleCtrScore(items, userInfoBytes, requestContext, model);
+
+        // debug log
+        if (LOGGER.isDebugEnabled()) {
+            for (int i = 0; i < items.size(); i++) {
+                LOGGER.debug("before enter feeds model predict ctr score [{}] [{}]", items.get(i), items.get(i));
+            }
+        }
+
+        Collections.sort(items);
+
+        LOGGER.debug("ctr ranker java execute time: [{}]", System.currentTimeMillis() - startTime);
+        LOGGER.debug("[ctr ranker time java] items size={}, cost={} ", items != null ? items.size() : 0,
+                System.currentTimeMillis() - startTime);
+        return items;
+    }
+
+
+    /**
+     * 计算 predict ctr
+     */
+    public double calcScore(final LRModel lrModel,
+                            final AdRankItem item,
+                            final UserAdBytesFeature userInfoBytes,
+                            final AdRequestContext requestContext) {
+
+        LRSamples lrSamples = null;
+        VlogAdCtrLRFeatureExtractor bytesFeatureExtractor;
+        bytesFeatureExtractor = new VlogAdCtrLRFeatureExtractor();
+
+        try {
+            AdItemBytesFeature newsInfoBytes = new AdItemBytesFeature(item.getItemFeature());
+            lrSamples = bytesFeatureExtractor.single(userInfoBytes, newsInfoBytes,
+                    new AdRequestContextBytesFeature(requestContext));
+        } catch (Exception e) {
+            LOGGER.error("extract feature error for imei={}, doc={}, [{}]", new Object[]{new String(userInfoBytes.getMid()), item.getAdId(),
+                    ExceptionUtils.getFullStackTrace(e)});
+        }
+
+
+        double pro = 0.0;
+        if (lrSamples != null && lrSamples.getFeaturesList() != null) {
+            try {
+                pro = lrModel.score(lrSamples);
+            } catch (Exception e) {
+                LOGGER.error("score error for doc={} exception={}", new Object[]{
+                        item.getAdId(), ExceptionUtils.getFullStackTrace(e)});
+            }
+            // 增加实时特征后打开在线存储日志逻辑
+            //
+            // CtrSamples.Builder samples =  com.tzld.piaoquan.recommend.server.gen.recommend.CtrSamples.newBuilder();
+            // samples.setLr_samples(lrSamples);
+            // item.setSamples(samples);
+            //
+        }
+        item.setScore(pro);
+        return pro;
+    }
+
+
+    /**
+     * 并行打分
+     *
+     * @param items
+     * @param userInfoBytes
+     * @param requestContext
+     * @param model
+     */
+    private void multipleCtrScore(final List<AdRankItem> items,
+                                  final UserAdBytesFeature userInfoBytes,
+                                  final AdRequestContext requestContext,
+                                  final LRModel model) {
+
+        List<Callable<Object>> calls = new ArrayList<Callable<Object>>();
+        for (int index = 0; index < items.size(); index++) {
+            final int fIndex = index;
+            items.get(fIndex).setScore(0.0);   //原始分为 cube中的粗打分,如果超时,为原始值存在问题, 需要置0
+            calls.add(new Callable<Object>() {
+                @Override
+                public Object call() throws Exception {
+                    try {
+                        calcScore(model, items.get(fIndex), userInfoBytes, requestContext);
+                    } catch (Exception e) {
+                        LOGGER.error("ctr exception: [{}] [{}]", items.get(fIndex).adId, ExceptionUtils.getFullStackTrace(e));
+                    }
+                    return new Object();
+                }
+            });
+        }
+
+        List<Future<Object>> futures = null;
+        try {
+            futures = executorService.invokeAll(calls, LOCAL_TIME_OUT, TimeUnit.MILLISECONDS);
+        } catch (InterruptedException e) {
+            LOGGER.error("execute invoke fail: {}", ExceptionUtils.getFullStackTrace(e));
+        }
+
+        //等待所有请求的结果返回, 超时也返回
+        int cancel = 0;
+        if (futures != null) {
+            for (Future<Object> future : futures) {
+                try {
+                    if (!future.isDone() || future.isCancelled() || future.get() == null) {
+                        cancel++;
+                    }
+                } catch (InterruptedException e) {
+                    LOGGER.error("InterruptedException {},{}", ExceptionUtils.getFullStackTrace(e));
+                } catch (ExecutionException e) {
+                    LOGGER.error("ExecutionException {},{}", requestContext.getApptype(),
+                            ExceptionUtils.getFullStackTrace(e));
+                }
+            }
+        }
+        LOGGER.debug("Ctr Score {}, Total: {}, Cancel: {}", new Object[]{requestContext.getApptype(), items.size(), cancel});
+    }
+}

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

+ 2 - 0
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;
@@ -28,6 +29,7 @@ import org.springframework.scheduling.annotation.EnableScheduling;
 public class Application {
     public static void main(String[] args) {
         SpringApplication.run(Application.class, args);
+        ScorerUtils.warmUp();
     }
 
 }

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

@@ -1,8 +1,11 @@
 package com.tzld.piaoquan.ad.engine.server.controller;
 
 import com.tzld.piaoquan.ad.engine.service.score.RankService;
-import com.tzld.piaoquan.ad.engine.service.score.param.RankRecommendParamRequest;
+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;
 
@@ -13,14 +16,21 @@ import java.util.Map;
 @RequestMapping("/recommend")
 public class AdRecommendController {
 
-
+    private final static Logger log = LoggerFactory.getLogger(AdRecommendController.class);
     @Autowired
     RankService rankService;
 
-    @RequestMapping("/base/ctr/top")
-    public Map<String,Object> adPredictByAbTestModel(RankRecommendParamRequest requst){
+    @RequestMapping("/top1/basic")
+    public Map<String,Object> adRecommendTop1Basic(@RequestBody RankRecommendRequestParam request){
+        Long adId= rankService.adItemRank(request);
 //        scorer.scoring(param,userFeature,rankItems).get(0);
-        return new HashMap<>();
+        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;
     }
 
 }

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

@@ -26,7 +26,7 @@ public class ControllerAspect {
 
     }
 
-    @Pointcut("execution(* com.tzld.piaoquan.ad.engine.server.controller.HealthController.java.*(..))")
+    @Pointcut("execution(* com.tzld.piaoquan.ad.engine.server.controller.HealthController.*(..))")
     public void excludePointcut(){
 
     }

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

@@ -16,9 +16,11 @@ 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

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

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

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

@@ -1,6 +1,6 @@
 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"
   }

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

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

@@ -16,6 +16,7 @@ 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;
 
@@ -66,7 +67,7 @@ public class FeatureRemoteService {
         if (CollectionUtils.isEmpty(adIdList)) {
             return Collections.emptyMap();
         }
-        List<AdItemFeatureProto> protoList = client.getALLAdItemFeature(adIdList);
+        List<AdItemFeatureProto> protoList = client.getAllAdItemFeature(adIdList);
         return CommonCollectionUtils.toMap(protoList, p -> NumberUtils.toLong(p.getAdId(), 0L), this::convert);
     }
 
@@ -74,7 +75,7 @@ public class FeatureRemoteService {
         if (CollectionUtils.isEmpty(adIdList)) {
             return Collections.emptyList();
         }
-        List<AdItemFeatureProto> protoList = client.getALLAdItemFeature(adIdList);
+        List<AdItemFeatureProto> protoList = client.getAllAdItemFeature(adIdList);
         return CommonCollectionUtils.toList(protoList, p -> convert(p));
     }
 

+ 5 - 1
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/RankService.java

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

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

@@ -123,7 +123,10 @@ public class FeatureConvert {
         adItemFeature.setCampaignId(adItemFeatureProto.getCampaignId());
         adItemFeature.setCampaignCode(adItemFeatureProto.getCampaignCode());
         adItemFeature.setCreativeId(adItemFeatureProto.getCreativeId());
-        adItemFeature.setCreativeCode(adItemFeatureProto.getCreativeCode());
+        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;
     }
 

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

@@ -1,11 +1,20 @@
 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.RankRecommendParamRequest;
+import com.tzld.piaoquan.ad.engine.service.score.param.RankRecommendRequestParam;
 
 public class RequestConvert {
 
-    public static ScoreParam requestConvert(RankRecommendParamRequest request){
-        return  new ScoreParam();
+    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());
+        ScoreParam scoreParam=new ScoreParam();
+        scoreParam.setRequestContext(context);
+        return scoreParam;
     }
 }

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

@@ -6,32 +6,42 @@ 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.RankRecommendParamRequest;
+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.context.ApplicationContext;
 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;
+import java.util.*;
 
 @Service
-public class RankServiceImpl {
+public class RankServiceImpl implements RankService {
+
+    private final static Logger log = LoggerFactory.getLogger(RankServiceImpl.class);
+    @Autowired
+    ApplicationContext applicationContext;
 
     @Autowired
     FeatureRemoteService featureRemoteService;
 
-    public Long adItemRank( RankRecommendParamRequest request){
+    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())
                 );
-        List<AdRankItem> rankResult = ScorerUtils.getScorerPipeline(ScorerUtils.BASE_CONF)
+        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()));

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

+ 3 - 3
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/param/RankRecommendParamRequest.java → ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/param/RankRecommendRequestParam.java

@@ -1,13 +1,13 @@
 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;
+public class RankRecommendRequestParam {
+     MachineInfoParam machineInfo;
+     Long appType;
      String mid;
      List<Long> adIdList;
 

+ 4 - 0
pom.xml

@@ -219,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>