فهرست منبع

Merge branch 'feature_gufengshou_20240107_predict_abInfo' into test

gufengshou1 1 سال پیش
والد
کامیت
ce78331d73
33فایلهای تغییر یافته به همراه466 افزوده شده و 116 حذف شده
  1. 0 33
      ad-engine-commons/.gitignore
  2. 2 2
      ad-engine-commons/pom.xml
  3. 32 0
      ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/feign/CommonResponse.java
  4. 51 0
      ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/feign/longvideo/abtest/LongVideoFeign.java
  5. 35 0
      ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/feign/longvideo/abtest/fallback/LongVideoFeignFallbackFactory.java
  6. 42 0
      ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/feign/longvideo/abtest/request/AbTestConfigRequest.java
  7. 10 0
      ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/math/Tuple.java
  8. 6 6
      ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/score/model/ThompsonSamplingModel.java
  9. 29 0
      ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/util/FeatureUtils.java
  10. 2 1
      ad-engine-server/src/main/java/com/tzld/piaoquan/ad/engine/server/Application.java
  11. 1 0
      ad-engine-server/src/main/java/com/tzld/piaoquan/ad/engine/server/controller/AdRecommendController.java
  12. 8 0
      ad-engine-server/src/main/java/com/tzld/piaoquan/ad/engine/server/controller/PredictController.java
  13. 6 1
      ad-engine-server/src/main/resources/application-dev.yml
  14. 6 1
      ad-engine-server/src/main/resources/feeds_score_config_baseline.conf
  15. 0 5
      ad-engine-server/src/main/resources/feeds_score_config_thompson.conf
  16. 31 7
      ad-engine-server/src/main/resources/logback-spring.xml
  17. 1 7
      ad-engine-service/pom.xml
  18. 13 1
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/config/AbConfig.java
  19. 82 0
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/container/AbTestConfigContainer.java
  20. 1 1
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/container/RoiPredictParamContainer.java
  21. 1 1
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/container/ThresholdModelContainer.java
  22. 30 8
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/impl/PredictModelServiceImpl.java
  23. 3 0
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/model/threshold/BasicThresholdPredictModel.java
  24. 1 1
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/model/threshold/RoiThresholdPredictModel.java
  25. 1 2
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/model/threshold/ScoreThresholdPredictModel.java
  26. 3 1
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/FeatureRemoteService.java
  27. 4 2
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/VlogAdCtrLRScorer.java
  28. 1 0
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/VlogAdCvrLRScorer.java
  29. 2 2
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/VlogAdThompsonScorer.java
  30. 6 4
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/VlogMergeEcpmScorer.java
  31. 5 5
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/convert/FeatureConvert.java
  32. 46 25
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/impl/RankServiceImpl.java
  33. 5 0
      pom.xml

+ 0 - 33
ad-engine-commons/.gitignore

@@ -1,33 +0,0 @@
-HELP.md
-target/
-!.mvn/wrapper/maven-wrapper.jar
-!**/src/main/**/target/
-!**/src/test/**/target/
-
-### STS ###
-.apt_generated
-.classpath
-.factorypath
-.project
-.settings
-.springBeans
-.sts4-cache
-
-### IntelliJ IDEA ###
-.idea
-*.iws
-*.iml
-*.ipr
-
-### NetBeans ###
-/nbproject/private/
-/nbbuild/
-/dist/
-/nbdist/
-/.nb-gradle/
-build/
-!**/src/main/**/build/
-!**/src/test/**/build/
-
-### VS Code ###
-.vscode/

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

@@ -10,7 +10,7 @@
     <modelVersion>4.0.0</modelVersion>
 
     <artifactId>ad-engine-commons</artifactId>
-    <version>1.0.3</version>
+    <version>1.1.0</version>
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <maven.compiler.source>1.8</maven.compiler.source>
@@ -25,7 +25,7 @@
         <dependency>
             <groupId>com.tzld.piaoquan</groupId>
             <artifactId>recommend-feature-client</artifactId>
-            <version>1.0.3</version>
+            <version>1.1.15</version>
         </dependency>
         <dependency>
             <groupId>com.tzld.piaoquan</groupId>

+ 32 - 0
ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/feign/CommonResponse.java

@@ -0,0 +1,32 @@
+package com.tzld.piaoquan.ad.engine.commons.feign;
+
+
+import lombok.Data;
+
+/**
+ * Common Response
+ *
+ * @author ehlxr
+ */
+@Data
+public class CommonResponse<T> {
+    /**
+     * 返回状态码,0 表示业务成功
+     */
+    private int code = 0;
+    /**
+     * 返回消息
+     */
+    private String msg = "success";
+    /**
+     * 业务成功时返回数据
+     */
+    private T data;
+    /**
+     * 重定向
+     */
+    private String redirect;
+
+
+
+}

+ 51 - 0
ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/feign/longvideo/abtest/LongVideoFeign.java

@@ -0,0 +1,51 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright © 2021 xrv <xrg@live.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+package com.tzld.piaoquan.ad.engine.commons.feign.longvideo.abtest;
+
+import com.alibaba.fastjson.JSONObject;
+import com.tzld.piaoquan.ad.engine.commons.feign.CommonResponse;
+import com.tzld.piaoquan.ad.engine.commons.feign.longvideo.abtest.fallback.LongVideoFeignFallbackFactory;
+import com.tzld.piaoquan.ad.engine.commons.feign.longvideo.abtest.request.AbTestConfigRequest;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.stereotype.Component;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+/**
+ * @author ehlxr
+ * @since 2022-10-10 11:42.
+ */
+@FeignClient(value = "longvideoapi", url = "${longvideo.feign.url:}",
+        path = "/longvideoapi",fallbackFactory = LongVideoFeignFallbackFactory.class)
+public interface LongVideoFeign {
+    /**
+     * 获取实验信息
+     */
+    @RequestMapping(value = "/openapi/abtest/typeValueConfig", method = RequestMethod.POST)
+    CommonResponse<JSONObject> getAbTestConfig(@RequestBody AbTestConfigRequest request);
+}
+
+

+ 35 - 0
ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/feign/longvideo/abtest/fallback/LongVideoFeignFallbackFactory.java

@@ -0,0 +1,35 @@
+package com.tzld.piaoquan.ad.engine.commons.feign.longvideo.abtest.fallback;
+
+import com.alibaba.fastjson.JSONObject;
+import com.tzld.piaoquan.ad.engine.commons.feign.CommonResponse;
+import com.tzld.piaoquan.ad.engine.commons.feign.longvideo.abtest.LongVideoFeign;
+import com.tzld.piaoquan.ad.engine.commons.feign.longvideo.abtest.request.AbTestConfigRequest;
+import org.springframework.cloud.openfeign.FallbackFactory;
+import org.springframework.stereotype.Service;
+import org.springframework.web.bind.annotation.RequestBody;
+
+@Service
+public class LongVideoFeignFallbackFactory implements FallbackFactory<LongVideoFeignFallback> {
+    @Override
+    public LongVideoFeignFallback create(Throwable cause) {
+        return new LongVideoFeignFallback(cause);
+    }
+}
+
+class LongVideoFeignFallback implements LongVideoFeign {
+    private final Throwable th;
+
+    LongVideoFeignFallback(Throwable th) {
+        this.th = th;
+    }
+
+    @Override
+    public CommonResponse<JSONObject> getAbTestConfig(@RequestBody AbTestConfigRequest request) {
+        CommonResponse<JSONObject> response = new CommonResponse<>();
+        response.setMsg(th.getMessage());
+        response.setCode(1002);
+
+
+        return response;
+    }
+}

+ 42 - 0
ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/feign/longvideo/abtest/request/AbTestConfigRequest.java

@@ -0,0 +1,42 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright © 2022 xrv <xrv@live.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+package com.tzld.piaoquan.ad.engine.commons.feign.longvideo.abtest.request;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+import lombok.ToString;
+
+/**
+ * @author ehlxr
+ * @since 2022-10-10 14:02.
+ */
+@ApiModel("获取 AB 实验信息参数")
+@Data
+@ToString
+public class AbTestConfigRequest {
+    private Integer appType;
+    private String typeValue;
+
+}

+ 10 - 0
ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/math/Tuple.java

@@ -0,0 +1,10 @@
+package com.tzld.piaoquan.ad.engine.commons.math;
+
+import lombok.Data;
+
+@Data
+public class Tuple<T> {
+    public T x;
+
+    public T y;
+}

+ 6 - 6
ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/score/model/ThompsonSamplingModel.java

@@ -30,7 +30,7 @@ public class ThompsonSamplingModel extends Model {
 
     private static final int alpha = 6;
     private static final int beta_click = 100;
-    private static final int beta_conversion = 1000;
+    private static final int beta_conversion = 100;
 
     public ThompsonSamplingModel() {
         //配置不同环境的hdfs conf
@@ -44,9 +44,9 @@ public class ThompsonSamplingModel extends Model {
 
     public void putFeature(Map<Long, AdActionFeature> model, Long key, Double expose, Double click, Double conversation) {
         AdActionFeature adActionFeature = new AdActionFeature();
-        adActionFeature.setOriginAdView(expose);
-        adActionFeature.setOriginAdClick(click);
-        adActionFeature.setOriginAdConversion(conversation);
+        adActionFeature.setAdView(expose);
+        adActionFeature.setAdClick(click);
+        adActionFeature.setAdConversion(conversation);
         model.put(key, adActionFeature);
     }
 
@@ -91,8 +91,8 @@ public class ThompsonSamplingModel extends Model {
             score = this.betaSampler(alpha_ctr, beta_ctr);
         }
         if (ctrOrCVR.equals("cvr")){
-            int alpha_cvr = (int) adActionFeature.getAdClick() + this.alpha ;
-            int beta_cvr = this.beta_conversion + (int)adActionFeature.getAdView() - (int)adActionFeature.getAdConversion();
+            int alpha_cvr = (int) adActionFeature.getAdConversion() + this.alpha ;
+            int beta_cvr = this.beta_conversion + (int)adActionFeature.getAdClick() - (int)adActionFeature.getAdConversion();
             score = this.betaSampler(alpha_cvr, beta_cvr);
         }
         return score;

+ 29 - 0
ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/util/FeatureUtils.java

@@ -0,0 +1,29 @@
+package com.tzld.piaoquan.ad.engine.commons.util;
+
+
+import com.tzld.piaoquan.recommend.feature.model.sample.BaseFeature;
+import com.tzld.piaoquan.recommend.feature.model.sample.GroupedFeature;
+import com.tzld.piaoquan.recommend.feature.model.sample.LRSamples;
+
+import java.util.ArrayList;
+
+public class FeatureUtils {
+
+
+    public static String parseSamplesToString2(LRSamples lrSamples) {
+        ArrayList<String> featureList = new ArrayList<String>();
+        for (int i = 0; i < lrSamples.getFeaturesCount(); i++) {
+            GroupedFeature groupedFeature = lrSamples.getFeatures(i);
+            if (groupedFeature != null && groupedFeature.getFeaturesCount() != 0) {
+                for (int j = 0; j < groupedFeature.getFeaturesCount(); j++) {
+                    BaseFeature baseFeature = groupedFeature.getFeatures(j);
+                    if (baseFeature != null) {
+                        featureList.add(baseFeature.getIdentifier() + ":1");
+                    }
+                }
+            }
+        }
+        return String.join("\t", featureList);
+    }
+
+}

+ 2 - 1
ad-engine-server/src/main/java/com/tzld/piaoquan/ad/engine/server/Application.java

@@ -7,6 +7,7 @@ import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
 import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
 import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
 import org.springframework.cloud.openfeign.EnableFeignClients;
 import org.springframework.context.annotation.Bean;
@@ -25,7 +26,7 @@ import org.springframework.scheduling.annotation.EnableScheduling;
 @EnableAspectJAutoProxy
 @EnableScheduling
 @EnableApolloConfig
-@EnableFeignClients
+@EnableFeignClients("com.tzld.piaoquan.ad.engine.*")
 public class Application {
     public static void main(String[] args) {
         SpringApplication.run(Application.class, args);

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

@@ -30,6 +30,7 @@ public class AdRecommendController {
         AdRankItem rankResult = rankService.adItemRank(request);
         HashMap map =new HashMap();
         map.put("code","0");
+        //
         map.put("msg","success");
         HashMap contentMap=new HashMap<>();
         contentMap.put("adId", rankResult.getAdId());

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

@@ -1,6 +1,7 @@
 package com.tzld.piaoquan.ad.engine.server.controller;
 
 import com.tzld.piaoquan.ad.engine.service.predict.PredictModelService;
+import com.tzld.piaoquan.ad.engine.service.predict.container.AbTestConfigContainer;
 import com.tzld.piaoquan.ad.engine.service.predict.param.request.RoiPredictModelRequestParam;
 import com.tzld.piaoquan.ad.engine.service.predict.param.request.ThresholdPredictModelRequestParam;
 import org.slf4j.Logger;
@@ -21,6 +22,8 @@ public class PredictController {
     @Autowired
     PredictModelService predictModelService;
 
+    @Autowired
+    AbTestConfigContainer adTestConfigContainer;
 
     /**
      * 没有统一封装response
@@ -39,4 +42,9 @@ public class PredictController {
         return predictModelService.adRecommendPredictByRoiModel(param);
     }
 
+    @RequestMapping("/test")
+    public void test(Integer appType,String typeValue){
+        adTestConfigContainer.initMap(appType,typeValue);
+    }
+
 }

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

@@ -166,4 +166,9 @@ oss:
       TemplateId: 2a5bf5963c9347df8eaddf662fbaf357
       PipelineId: abe6a0b9b9334858913eb416974485d2
       Location: oss-cn-hangzhou
-      bucket: art-pubbucket
+      bucket: art-pubbucket
+ad:
+  abtest:
+    time:
+      plan:
+        code:555

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

@@ -9,9 +9,14 @@ scorer-config = {
       scorer-priority = 98
       model-path = "ad_cvr_model/model_ad_cvr.txt"
   }
+    tf-ctr-score-config = {
+      scorer-name = "com.tzld.piaoquan.ad.engine.service.score.VlogAdThompsonScorer"
+      scorer-priority = 97
+      model-path = "ad_thompson_model/model_ad_thompson.txt"
+    }
   lr-ecpm-merge-config = {
       scorer-name = "com.tzld.piaoquan.ad.engine.service.score.VlogMergeEcpmScorer"
-      scorer-priority = 97
+      scorer-priority = 1
   }
 
 }

+ 0 - 5
ad-engine-server/src/main/resources/feeds_score_config_thompson.conf

@@ -1,9 +1,4 @@
 scorer-config = {
-  tf-ctr-score-config = {
-    scorer-name = "com.tzld.piaoquan.ad.engine.service.score.VlogAdThompsonScorer"
-    scorer-priority = 99
-    model-path = "ad_thompson_model/model_ad_thompson.txt"
-  }
 
   tf-ecpm-merge-config = {
         scorer-name = "com.tzld.piaoquan.ad.engine.service.score.VlogMergeEcpmScorer"

+ 31 - 7
ad-engine-server/src/main/resources/logback-spring.xml

@@ -31,6 +31,7 @@
     <!--<property name="CONSOLE_LOG_PATTERN"-->
     <!--          value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr([%X{√logTraceId}]){magenta} %clr(-&#45;&#45;){faint} %clr([%15.15t]){faint} %clr(at %class.%method){cyan} \\(%file:%line\\) %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>-->
 
+
     <!--输出到控制台-->
     <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
         <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
@@ -43,7 +44,10 @@
             <charset>UTF-8</charset>
         </encoder>
     </appender>
-
+    <appender name="ASYNC_CONSOLE" class="ch.qos.logback.classic.AsyncAppender">
+        <appender-ref ref="CONSOLE" />
+        <queueSize>10000</queueSize> <!-- 队列大小,可以根据需要调整 -->
+    </appender>
     <!--输出到文件-->
     <!-- 时间滚动输出 level为 DEBUG 日志 -->
     <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
@@ -71,7 +75,10 @@
             <onMismatch>DENY</onMismatch>
         </filter>
     </appender>
-
+    <appender name="ASYNC_DEBUG_FILE" class="ch.qos.logback.classic.AsyncAppender">
+        <appender-ref ref="DEBUG_FILE" />
+        <queueSize>1000</queueSize> <!-- 队列大小,可以根据需要调整 -->
+    </appender>
     <!-- 时间滚动输出 level为 INFO 日志 -->
     <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
         <!-- 正在记录的日志文件的路径及文件名 -->
@@ -98,6 +105,10 @@
             <onMismatch>DENY</onMismatch>
         </filter>
     </appender>
+    <appender name="ASYNC_INFO_FILE" class="ch.qos.logback.classic.AsyncAppender">
+        <appender-ref ref="INFO_FILE" />
+        <queueSize>10000</queueSize> <!-- 队列大小,可以根据需要调整 -->
+    </appender>
 
     <!-- 时间滚动输出 level为 WARN 日志 -->
     <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
@@ -124,6 +135,10 @@
             <onMismatch>DENY</onMismatch>
         </filter>
     </appender>
+    <appender name="ASYNC_WARN_FILE" class="ch.qos.logback.classic.AsyncAppender">
+        <appender-ref ref="WARN_FILE" />
+        <queueSize>3000</queueSize> <!-- 队列大小,可以根据需要调整 -->
+    </appender>
 
     <!-- 时间滚动输出 level为 ERROR 日志 -->
     <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
@@ -150,6 +165,10 @@
             <onMismatch>DENY</onMismatch>
         </filter>
     </appender>
+    <appender name="ASYNC_ERROR_FILE" class="ch.qos.logback.classic.AsyncAppender">
+        <appender-ref ref="ERROR_FILE" />
+        <queueSize>3000</queueSize> <!-- 队列大小,可以根据需要调整 -->
+    </appender>
 
     <appender name="ALIYUN_LOG_INFO" class="com.aliyun.openservices.log.logback.LoghubAppender">
         <endpoint>${ALIYUN_LOG_ENDPOINT}</endpoint>
@@ -265,11 +284,16 @@
         可以包含零个或多个元素,标识这个appender将会添加到这个logger。
     -->
     <root level="info">
-        <appender-ref ref="CONSOLE"/>
-        <appender-ref ref="DEBUG_FILE"/>
-        <appender-ref ref="INFO_FILE"/>
-        <appender-ref ref="WARN_FILE"/>
-        <appender-ref ref="ERROR_FILE"/>
+<!--        <appender-ref ref="CONSOLE"/>-->
+<!--        <appender-ref ref="DEBUG_FILE"/>-->
+<!--        <appender-ref ref="INFO_FILE"/>-->
+<!--        <appender-ref ref="WARN_FILE"/>-->
+<!--        <appender-ref ref="ERROR_FILE"/>-->
+            <appender-ref ref="ASYNC_CONSOLE"/>
+            <appender-ref ref="ASYNC_DEBUG_FILE"/>
+            <appender-ref ref="ASYNC_INFO_FILE"/>
+            <appender-ref ref="ASYNC_WARN_FILE"/>
+            <appender-ref ref="ASYNC_ERROR_FILE"/>
         <appender-ref ref="ALIYUN_LOG_INFO"/>
         <appender-ref ref="ALIYUN_LOG_ERROR"/>
     </root>

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

@@ -23,13 +23,7 @@
         <dependency>
             <groupId>com.tzld.piaoquan</groupId>
             <artifactId>ad-engine-commons</artifactId>
-            <version>1.0.3</version>
-        </dependency>
-
-        <dependency>
-            <groupId>com.tzld.piaoquan</groupId>
-            <artifactId>recommend-feature-client</artifactId>
-            <version>1.0.6</version>
+            <version>1.1.0</version>
         </dependency>
 
     </dependencies>

+ 13 - 1
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/config/AbConfig.java

@@ -561,6 +561,18 @@ public class AbConfig {
                 "            \"threshold_mix_func\": \"add\",\n" +
                 "            \"mix_param\": {\"share_weight\": 0.2, \"out_weight\": 0.8}\n" +
                 "        }, " +
+
+                "       \"243-i\": {\n" +
+                "            \"threshold_mix_func\": \"model\"," +
+                "            \"model_key\": \"ad_out_v1\"," +
+                "            \"video\": {\"data\": \"videos0out\"}," +
+                "            \"user\": {\"data\": \"user0out\", \"rule\": \"rule2\"}," +
+                "            \"group_class_key\": \"class1\"," +
+                "            \"no_ad_mid_group_list\": [\"class1\"]," +
+                "            \"care_model_status_param\": 1,\n" +
+                "            \"care_model_ab_mid_group\": [\"mean_group\"]\n" +
+                "        },"+
+
                 "        \"243-h\": {\n" +
                 "            \"share\": {\"video\": {\"data\": \"videos3\"}, \"user\": {\"data\": \"user3\", \"rule\": \"rule2\"}},\n" +
                 "            \"out\": {\"video\": {\"data\": \"videos3out\"}, \"user\": {\"data\": \"user3out\", \"rule\": \"rule2\"}},\n" +
@@ -612,7 +624,7 @@ public class AbConfig {
                 "            \"care_model_status_param\": 1,\n" +
                 "            \"care_model_ab_mid_group\": [\"mean_group\"],\n" +
                 "            \"threshold_mix_func\": \"multiply\",\n" +
-                "        },  " +
+                "        }  " +
                 "    }";
         HashMap<String,Map<String,Object>> abConfigMap=JSONObject.parseObject(configStr,HashMap.class);
         return abConfigMap;

+ 82 - 0
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/container/AbTestConfigContainer.java

@@ -0,0 +1,82 @@
+package com.tzld.piaoquan.ad.engine.service.predict.container;
+
+import com.alibaba.fastjson.JSONObject;
+import com.tzld.piaoquan.ad.engine.commons.feign.CommonResponse;
+import com.tzld.piaoquan.ad.engine.commons.feign.longvideo.abtest.LongVideoFeign;
+import com.tzld.piaoquan.ad.engine.commons.feign.longvideo.abtest.request.AbTestConfigRequest;
+import com.tzld.piaoquan.ad.engine.commons.math.Tuple;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+import java.util.*;
+
+@Component
+public class AbTestConfigContainer {
+    @Autowired
+    LongVideoFeign longVideoFeign;
+    @Value("${ad.abtest.time.plan.code:555}")
+    String adTestCode;
+
+
+    Map<String,List<Tuple<Integer>>> adTimePlanMap=new HashMap<>();
+    @PostConstruct
+    public void initContainer(){
+        Timer timer = new Timer();
+
+        timer.schedule(new TimerTask() {
+            @Override
+            public void run() {
+                try {
+                    initMap(null,"ab_test002");
+                }catch (Exception e){
+                    e.printStackTrace();
+                }
+            }
+        }, 0, 1000*30);
+    }
+
+
+    public void initMap(Integer appType,String typeValue){
+        AbTestConfigRequest request=new  AbTestConfigRequest();
+        request.setAppType(0);
+        request.setTypeValue(typeValue);
+        CommonResponse<JSONObject> response=longVideoFeign.getAbTestConfig(request);
+        JSONObject object=response.getData();
+        for(Map.Entry<String,Object> entry:object.getInnerMap().entrySet()){
+            for(Map<String,Object> map:(List<Map>)entry.getValue()){
+                if(adTestCode.equals(map.get("abExpCode").toString())){
+                    adTimePlanMap=JSONObject.parseObject(map.get("configValue").toString(),Map.class);
+                    break;
+                }
+            }
+        }
+
+    }
+
+    public Boolean containsCode(String code){
+        return adTimePlanMap.keySet().contains(code);
+    }
+
+    public Boolean inWithoutAdTime(String code,Integer hourOfDay){
+        Boolean flag=false;
+        for(Tuple<Integer> tuple:adTimePlanMap.getOrDefault(code,new ArrayList<>())){
+            if(tuple.getX()<=hourOfDay&&hourOfDay<tuple.getY()){
+                return true;
+            }
+        }
+        return flag;
+    }
+
+
+
+    public static void main(String[] args){
+        Map<String, Tuple<Integer>> map =new HashMap<>();
+        Tuple<Integer> t=new Tuple<>();
+        t.setX(1);
+        t.setY(2);
+        map.put("sk",t);
+        System.out.println(JSONObject.toJSONString(map));
+    }
+}

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

@@ -1,4 +1,4 @@
-package com.tzld.piaoquan.ad.engine.service.predict.containner;
+package com.tzld.piaoquan.ad.engine.service.predict.container;
 
 import com.tzld.piaoquan.ad.engine.commons.redis.AlgorithmRedisHelper;
 import com.tzld.piaoquan.ad.engine.service.predict.constant.RuleRedisKeyConst;

+ 1 - 1
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/containner/ThresholdModelContainer.java → ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/container/ThresholdModelContainer.java

@@ -1,4 +1,4 @@
-package com.tzld.piaoquan.ad.engine.service.predict.containner;
+package com.tzld.piaoquan.ad.engine.service.predict.container;
 
 import com.tzld.piaoquan.ad.engine.service.predict.model.threshold.ThresholdPredictModel;
 import org.springframework.beans.factory.annotation.Autowired;

+ 30 - 8
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/impl/PredictModelServiceImpl.java

@@ -1,6 +1,7 @@
 package com.tzld.piaoquan.ad.engine.service.predict.impl;
 
 import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.tzld.piaoquan.ad.engine.commons.enums.AppTypeEnum;
 import com.tzld.piaoquan.ad.engine.commons.redis.AlgorithmRedisHelper;
 import com.tzld.piaoquan.ad.engine.commons.util.DateUtils;
@@ -8,7 +9,8 @@ import com.tzld.piaoquan.ad.engine.service.predict.config.RoiModelConfig;
 import com.tzld.piaoquan.ad.engine.service.predict.constant.RuleRedisKeyConst;
 import com.tzld.piaoquan.ad.engine.service.predict.PredictModelService;
 import com.tzld.piaoquan.ad.engine.service.predict.config.AbConfig;
-import com.tzld.piaoquan.ad.engine.service.predict.containner.ThresholdModelContainer;
+import com.tzld.piaoquan.ad.engine.service.predict.container.AbTestConfigContainer;
+import com.tzld.piaoquan.ad.engine.service.predict.container.ThresholdModelContainer;
 import com.tzld.piaoquan.ad.engine.service.predict.param.RoiThresholdPredictModelParam;
 import com.tzld.piaoquan.ad.engine.service.predict.param.RuleParamHelper;
 import com.tzld.piaoquan.ad.engine.service.predict.param.ThresholdPredictModelParam;
@@ -28,7 +30,7 @@ public class PredictModelServiceImpl implements PredictModelService {
     private String adOwnExperimentTier;
 
     @Autowired
-    RuleParamHelper paramHelper;
+    private AbTestConfigContainer container;
 
     @Autowired
     AlgorithmRedisHelper redisHelper;
@@ -40,17 +42,28 @@ public class PredictModelServiceImpl implements PredictModelService {
     RoiModelConfig roiModelConfig;
 
     public  Map<String,Object> adPredict(ThresholdPredictModelRequestParam requestParam){
-        //0-8不出广告
+
+        JSONObject object=requestParam.getAbExpInfo();
+        //先判断是否开启实验 和是否不出广告时间 而后判断默认0-8
         Map<String,Object> result=new HashMap<>();
         int hourOfDay= DateUtils.getCurrentHour();
-        if(hourOfDay<8&&hourOfDay>=0){
+        if(container.containsCode(requestParam.getAbTestCode())
+                &&
+                container.inWithoutAdTime(requestParam.getAbTestCode(),hourOfDay)){
+            result.put("ad_predict", 1);
+            result.put("no_ad_strategy","no_ad_time");
+            return result;
+        }else  if(hourOfDay<8&&hourOfDay>=0){
             result.put("ad_predict", 1);
             result.put("no_ad_strategy","no_ad_time");
             return result;
         }
 
+
+
         String[] abParamArr=abConfig.getAbParams(requestParam.getAbTestCode(),requestParam.getAbExpInfo());
         if(abParamArr==null){
+            result.put("msg","abConfig_error");
             return result;
         }
         String abtestId=abParamArr[0];
@@ -59,8 +72,13 @@ public class PredictModelServiceImpl implements PredictModelService {
         HashMap<String,Map<String,Object>> abConfigMap=abConfig.getAbConfigMap();
         Map<String,Object> abtestParam=abConfigMap.getOrDefault(abtestId+"-"+abTestConfigTag,null);
         if(abtestParam==null){
+            result.put("msg","abConfig_error");
             return result;
         }
+        //市-中文
+        requestParam.setRegion(requestParam.getRegion().replace("省",""));
+        requestParam.setCity(requestParam.getCity().replace("市",""));
+
 
         // Determine the group to which mid belongs
         String groupClassKey = (String) abtestParam.get("group_class_key");
@@ -70,8 +88,8 @@ public class PredictModelServiceImpl implements PredictModelService {
             midGroup = "mean_group";
         }
 
-        String[] noAdMidGroupList=new String[0];
-        noAdMidGroupList=((JSONArray) abtestParam.get("no_ad_mid_group_list")).toArray(noAdMidGroupList);
+        String[] noAdMidGroupList=(String[]) ((JSONArray) abtestParam.get("no_ad_mid_group_list")).toArray();
+
         boolean inNoAdGroup = false;
         for (String group : noAdMidGroupList) {
             if (group.equals(midGroup)) {
@@ -88,6 +106,10 @@ public class PredictModelServiceImpl implements PredictModelService {
             return result;
         }
 
+        String[] noAdGroupWithVideoMapping=(String[]) ((JSONArray) abtestParam.get("no_ad_mid_group_list")).toArray();
+
+
+
         //设置信息
         ThresholdPredictModelParam modelParam=ThresholdPredictModelParam.builder()
                 .build();
@@ -97,7 +119,7 @@ public class PredictModelServiceImpl implements PredictModelService {
         modelParam.setAbTestConfigTag(abTestConfigTag);
         modelParam.setAbtestParam(abtestParam);
         modelParam.setMidGroup(midGroup);
-        Object thresholdMixFunc=abtestParam.getOrDefault("threshold_mix_func","default");
+        Object thresholdMixFunc=abtestParam.getOrDefault("threshold_mix_func","basic");
         result= ThresholdModelContainer.
                 getThresholdPredictModel(thresholdMixFunc.toString())
                 .predict(modelParam);
@@ -106,7 +128,7 @@ public class PredictModelServiceImpl implements PredictModelService {
     }
 
     public Map<String,Object> adRecommendPredictByRoiModel(RoiPredictModelRequestParam requestParam){
-        //0-8不出广告
+
         Map<String,Object> result=new HashMap<>();
         int hourOfDay= DateUtils.getCurrentHour();
         if(hourOfDay<8&&hourOfDay>=0){

+ 3 - 0
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/model/threshold/BasicThresholdPredictModel.java

@@ -29,6 +29,9 @@ public class BasicThresholdPredictModel extends ThresholdPredictModel{
     }
 
     public Map<String, Object> predictWithRateProcess(ThresholdPredictModelParam modelParam,String midGroup){
+
+
+
 //        Double groupShareRate=paramHelper.getGroupShareRate(modelParam.getAbtestParam(),modelParam.getDate(),midGroup);
         Double groupShareRate=paramHelper.getGroupShareRateForBasic(modelParam.getAbtestParam(),modelParam.getDate(),midGroup);
 //        Double videoShareRate=paramHelper.getVideoShareRate(modelParam.getAbtestParam(),modelParam.getDate(),modelParam.getVideoId());

+ 1 - 1
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/model/threshold/RoiThresholdPredictModel.java

@@ -4,7 +4,7 @@ import com.tzld.piaoquan.ad.engine.commons.enums.AppTypeEnum;
 import com.tzld.piaoquan.ad.engine.commons.redis.AlgorithmRedisHelper;
 import com.tzld.piaoquan.ad.engine.service.predict.config.RoiModelConfig;
 import com.tzld.piaoquan.ad.engine.service.predict.constant.RuleRedisKeyConst;
-import com.tzld.piaoquan.ad.engine.service.predict.containner.RoiPredictParamContainer;
+import com.tzld.piaoquan.ad.engine.service.predict.container.RoiPredictParamContainer;
 import com.tzld.piaoquan.ad.engine.service.predict.param.RoiThresholdPredictModelParam;
 import com.tzld.piaoquan.ad.engine.service.predict.param.RuleParamHelper;
 import com.tzld.piaoquan.ad.engine.service.predict.param.ThresholdPredictModelParam;

+ 1 - 2
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/model/threshold/ScoreThresholdPredictModel.java

@@ -4,14 +4,13 @@ import com.alibaba.fastjson.JSONObject;
 import com.tzld.piaoquan.ad.engine.commons.redis.AlgorithmRedisHelper;
 import com.tzld.piaoquan.ad.engine.service.predict.config.AdOutV1OnlineWeightConfig;
 import com.tzld.piaoquan.ad.engine.service.predict.constant.RuleRedisKeyConst;
-import com.tzld.piaoquan.ad.engine.service.predict.containner.ThresholdModelContainer;
+import com.tzld.piaoquan.ad.engine.service.predict.container.ThresholdModelContainer;
 import com.tzld.piaoquan.ad.engine.service.predict.param.RuleParamHelper;
 import com.tzld.piaoquan.ad.engine.service.predict.param.ThresholdPredictModelParam;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
-import javax.annotation.PostConstruct;
 import java.text.SimpleDateFormat;
 import java.util.*;
 

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

@@ -1,5 +1,7 @@
 package com.tzld.piaoquan.ad.engine.service.score;
 
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.tzld.piaoquan.recommend.feature.domain.ad.base.AdActionFeature;
 import com.tzld.piaoquan.recommend.feature.domain.ad.base.AdRankItem;
 import com.tzld.piaoquan.recommend.feature.domain.ad.base.UserAdFeature;
@@ -88,7 +90,7 @@ public class FeatureRemoteService {
 
         feature.setAdId(Long.parseLong(proto.getAdId()));
         feature.setItemFeature(FeatureConvert.convertToJava(proto));
-        System.out.println(feature);
+
         return feature;
     }
 

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

@@ -1,6 +1,7 @@
 package com.tzld.piaoquan.ad.engine.service.score;
 
 
+import com.tzld.piaoquan.ad.engine.commons.util.FeatureUtils;
 import com.tzld.piaoquan.recommend.feature.domain.ad.base.*;
 import com.tzld.piaoquan.recommend.feature.domain.ad.feature.VlogAdCtrLRFeatureExtractor;
 import com.tzld.piaoquan.recommend.feature.model.sample.LRSamples;
@@ -121,8 +122,9 @@ public class VlogAdCtrLRScorer extends BaseLRModelScorer {
             }
         }
         lrSamples.toBuilder().setPredictCtr(pro);
-        //
-//        System.out.println("svc=lrSamplePrint  lrSamples="+lrSamples.toString());
+        // online 特征落盘
+        String lrSamplesString = FeatureUtils.parseSamplesToString2(lrSamples);
+        item.setLrSampleString(lrSamplesString);
         item.setCtr(pro);
         return pro;
     }

+ 1 - 0
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/VlogAdCvrLRScorer.java

@@ -118,6 +118,7 @@ public class VlogAdCvrLRScorer extends BaseLRModelScorer {
                         item.getAdId(), ExceptionUtils.getFullStackTrace(e)});
             }
         }
+//        lrSamples.toBuilder().setPredictCtr(pro);
         item.setCvr(pro);
         return pro;
     }

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

@@ -96,8 +96,8 @@ public class VlogAdThompsonScorer extends BaseThompsonSamplingScorer {
             LOGGER.error("score error for doc={} exception={}", new Object[]{
                     item.getAdId(), ExceptionUtils.getFullStackTrace(e)});
         }
-        item.setCtr(pctr);
-        item.setCvr(pcvr);
+        item.setTf_ctr(pctr);
+        item.setTf_cvr(pcvr);
         item.setEcpm1(ecpm);
         item.setScore(ecpm);
         return ecpm;

+ 6 - 4
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/VlogMergeEcpmScorer.java

@@ -41,15 +41,17 @@ public class VlogMergeEcpmScorer extends BaseLRModelScorer {
 
 
     public List<AdRankItem> mergetEcpm(List<AdRankItem> items) {
-        long startTime = System.currentTimeMillis();
+
 
         for (AdRankItem item : items) {
             try {
+                boolean isTfType=item.getItemFeature().getCreative_7day_cnt_features().getAdView()<7;
                 double cpa = item.getCpa();
                 double bid1 = item.getBid1();
                 double bid2 = item.getBid2();
-                double pctr = item.getCtr();
-                double pcvr = item.getCvr();
+                double pctr = isTfType?item.getTf_ctr():item.getCtr();
+                double pcvr = isTfType?item.getTf_cvr():item.getCvr();
+                item.setScore_type( isTfType?1:0);
                 //todo
                 double ecpm = cpa * bid1 * bid2 * pcvr * pctr * 1000d;
 //                double ecpm = cpa * bid1 * bid2 * pcvr * pctr;
@@ -59,7 +61,7 @@ public class VlogMergeEcpmScorer extends BaseLRModelScorer {
                 LOGGER.error("merge Ecpm Score: {} error", "");
                 item.setCtr(0.0);
             }
-            LOGGER.debug("merge Ecpm ranker , score: {}->{}", "");
+            LOGGER.debug("merge Ecpm ranker , score: {}->{}", item.getScore());
         }
         Collections.sort(items);
         return items;

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

@@ -48,11 +48,11 @@ public class FeatureConvert {
 
     public static AdActionFeature convertToJava(AdActionFeatureProto adActionFeatureProto) {
         AdActionFeature adActionFeature = new AdActionFeature();
-        adActionFeature.setOriginAdView(adActionFeatureProto.getAdView());
-        adActionFeature.setOriginAdClick(adActionFeatureProto.getAdClick());
-        adActionFeature.setOriginAdConversion(adActionFeatureProto.getAdConversion());
-        adActionFeature.setOriginCtr(adActionFeatureProto.getCtr());
-        adActionFeature.setOriginCvr(adActionFeatureProto.getCvr());
+        adActionFeature.setAdView(adActionFeatureProto.getAdView());
+        adActionFeature.setAdClick(adActionFeatureProto.getAdClick());
+        adActionFeature.setAdConversion(adActionFeatureProto.getAdConversion());
+        adActionFeature.setCtr(adActionFeatureProto.getCtr());
+        adActionFeature.setCvr(adActionFeatureProto.getCvr());
         return adActionFeature;
     }
 

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

@@ -15,7 +15,6 @@ 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.joda.time.LocalTime;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
@@ -23,9 +22,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
-import java.time.DayOfWeek;
-import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -33,7 +31,8 @@ import java.util.stream.Collectors;
 public class RankServiceImpl implements RankService {
 
     private final static Logger log = LoggerFactory.getLogger(RankServiceImpl.class);
-
+    DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyyMMdd");
+    DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("yyyyMMdd HH:mm:ss");
     @Autowired
     FeatureRemoteService featureRemoteService;
 
@@ -41,13 +40,15 @@ public class RankServiceImpl implements RankService {
     RankServiceThompsonImpl rankServiceThompson;
 
     public AdRankItem adItemRank(RankRecommendRequestParam request){
-
         ScoreParam param= RequestConvert.requestConvert(request);
         LocalDateTime currentTime = LocalDateTime.now();
         int currentHour = currentTime.getHour();
         int dayOfWeek = currentTime.getDayOfWeek().getValue();
         param.getRequestContext().setHour(currentHour+"");
         param.getRequestContext().setWeek(dayOfWeek+"");
+        param.getRequestContext().setRegion(request.getRegion().replace("省",""));
+        param.getRequestContext().setCity(request.getCity().replace("市",""));
+        param.getRequestContext().setDay(currentTime.format(dateFormatter));
 
         UserAdFeature userAdFeature=featureRemoteService.getUserAdFeature(request.getMid());
         if(userAdFeature==null){
@@ -57,33 +58,36 @@ public class RankServiceImpl implements RankService {
                 getAllAdFeatureList(
                         CommonCollectionUtils.toList(request.getAdIdList(),id->id.toString())
                 );
-        //不判空
-        for(AdRankItem item:rankItems){
-            item.setBid1(1d);
-            item.setBid2(1d);
-            item.setCpa(75d);
-        }
-
-        //兜底方案
-        List<AdRankItem> rankResult;
+        //避免recommend-feature出问题
         if(rankItems==null|| rankItems.size()==0){
             rankItems=new LinkedList<>();
             for(Long adId:request.getAdIdList()){
                 AdRankItem item=new AdRankItem();
-                item.setBid1(1d);
-                item.setBid2(1d);
-                item.setCpa(75d);
                 item.setAdId(adId);
                 item.setItemFeature(new AdItemFeature());
                 rankItems.add(item);
             }
-            rankResult=rankServiceThompson.rank(param, userAdFeature, rankItems,null);
-        }else {
-
-            rankResult=rank(param, userAdFeature, rankItems,ScorerUtils.BASE_CONF);
         }
-        log.info("svc=adItemRank rankResult={}", JSONObject.toJSONString(rankResult));
+        for(AdRankItem item:rankItems){
+            item.setBid1(1d);
+            item.setBid2(1d);
+            item.setCpa(75d);
+        }
+
+        //兜底方案
+        List<AdRankItem> rankResult=rank(param, userAdFeature, rankItems,ScorerUtils.BASE_CONF);
+
         if (!CollectionUtils.isEmpty(rankResult)) {
+//            log.info("svc=adItemRank request={} rankResult={} dataTime={}", JSONObject.toJSONString(request),JSONObject.toJSONString(rankResult),currentTime.format(timeFormatter));
+            JSONObject object=new JSONObject();
+            object.put("mid",request.getMid());
+            object.put("adid",rankResult.get(0).getAdId());
+            object.put("type",rankResult.get(0).getScore_type());
+            object.put("pctr",rankResult.get(0).getCtr());
+            object.put("pcvr",rankResult.get(0).getCvr());
+            object.put("lrsamples",rankResult.get(0).getLrSampleString());
+            object.put("dataTime",currentTime.format(timeFormatter));
+            log.info("svc=adItemRank {}", JSONObject.toJSONString(object));
             return rankResult.get(0);
         }else {
             //空返回值
@@ -95,6 +99,16 @@ public class RankServiceImpl implements RankService {
     public AdPlatformBidCreativeDTO adBidRank(BidRankRecommendRequestParam request) {
 
         ScoreParam param= RequestConvert.requestConvert(request);
+
+        LocalDateTime currentTime = LocalDateTime.now();
+        int currentHour = currentTime.getHour();
+        int dayOfWeek = currentTime.getDayOfWeek().getValue();
+        param.getRequestContext().setHour(currentHour+"");
+        param.getRequestContext().setWeek(dayOfWeek+"");
+        param.getRequestContext().setRegion(request.getRegion().replace("省",""));
+        param.getRequestContext().setCity(request.getCity().replace("市",""));
+        param.getRequestContext().setDay(currentTime.format(dateFormatter));
+
         UserAdFeature userAdFeature=featureRemoteService.getUserAdFeature(request.getMid());
         if(userAdFeature==null){
             userAdFeature=new UserAdFeature();
@@ -119,8 +133,6 @@ public class RankServiceImpl implements RankService {
                 e.printStackTrace();
             }
         }
-        log.info("svc=adItemRank  param={}  userAdFeature={}  rankItems={}",
-                JSONObject.toJSONString(param),JSONObject.toJSONString(userAdFeature),JSONObject.toJSONString(rankItems));
         List<AdRankItem> rankResult;
         if(rankItems==null|| rankItems.size()==0){
             rankItems=new LinkedList<>();
@@ -137,7 +149,6 @@ public class RankServiceImpl implements RankService {
         }else {
             rankResult=rank(param, userAdFeature, rankItems,ScorerUtils.BASE_CONF);
         }
-        log.info("svc=adBidRank rankResult={}", JSONObject.toJSONString(rankResult));
 
         AdRankItem topItem=rankResult.get(0);
 
@@ -155,6 +166,16 @@ public class RankServiceImpl implements RankService {
         }else {
             result.setEcpm2(rankResult.get(1).getEcpm1());
         }
+        JSONObject object=new JSONObject();
+        object.put("mid",request.getMid());
+        object.put("adid",result.getCreativeId());
+        object.put("type",topItem.getScore_type());
+        object.put("pctr",topItem.getCtr());
+        object.put("pcvr",topItem.getCvr());
+        object.put("lrsamples",topItem.getLrSampleString());
+        object.put("dataTime",currentTime.format(timeFormatter));
+        log.info("svc=adBidRank {}", JSONObject.toJSONString(object));
+
         return result;
     }
 

+ 5 - 0
pom.xml

@@ -312,6 +312,11 @@
                 </exclusion>
             </exclusions>
         </dependency>
+
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-openfeign</artifactId>
+        </dependency>
         <!--easyexcel-->
     </dependencies>