소스 검색

Merge branch 'main' into test

# Conflicts:
#	recommend-feature-client/pom.xml
#	recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/domain/ad/base/AdActionFeature.java
#	recommend-feature-service/pom.xml
sunxy 1 년 전
부모
커밋
c4a59eed49
29개의 변경된 파일12731개의 추가작업 그리고 157개의 파일을 삭제
  1. 1 1
      recommend-feature-client/pom.xml
  2. 39 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/client/FeatureClient.java
  3. 0 2
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/domain/ad/base/AdActionFeature.java
  4. 33 76
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/domain/ad/base/AdItemBytesFeature.java
  5. 26 24
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/domain/ad/base/UserAdBytesFeature.java
  6. 105 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/domain/video/base/AlgRecsysUserInfo.java
  7. 82 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/domain/video/base/AlgRecsysVideoInfo.java
  8. 68 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/domain/video/base/UserFeatureInfo.java
  9. 80 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/domain/video/base/VideoFeatureInfo.java
  10. 152 26
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/Feature.java
  11. 142 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/FeatureService.java
  12. 148 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/FeatureServiceGrpc.java
  13. 3821 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetUserFeatureInfo.java
  14. 325 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetUserFeatureInfoOrBuilder.java
  15. 614 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetUserFeatureInfoRequest.java
  16. 34 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetUserFeatureInfoRequestOrBuilder.java
  17. 958 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetUserFeatureInfoResponse.java
  18. 48 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetUserFeatureInfoResponseOrBuilder.java
  19. 3532 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetVideoFeatureInfo.java
  20. 309 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetVideoFeatureInfoOrBuilder.java
  21. 599 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetVideoFeatureInfoRequest.java
  22. 26 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetVideoFeatureInfoRequestOrBuilder.java
  23. 958 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetVideoFeatureInfoResponse.java
  24. 48 0
      recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetVideoFeatureInfoResponseOrBuilder.java
  25. 142 19
      recommend-feature-client/src/main/proto/com/tzld/piaoquan/recommend/feature/feature.proto
  26. 1 1
      recommend-feature-service/pom.xml
  27. 37 8
      recommend-feature-service/src/main/java/com/tzld/piaoquan/recommend/feature/grpcservice/FeatureGrpcService.java
  28. 277 0
      recommend-feature-service/src/main/java/com/tzld/piaoquan/recommend/feature/service/UserAndVideoFeatureConverter.java
  29. 126 0
      recommend-feature-service/src/main/java/com/tzld/piaoquan/recommend/feature/service/UserAndVideoFeatureService.java

+ 1 - 1
recommend-feature-client/pom.xml

@@ -10,7 +10,7 @@
     <modelVersion>4.0.0</modelVersion>
 
     <artifactId>recommend-feature-client</artifactId>
-    <version>1.1.5</version>
+    <version>1.1.16</version>
 
     <dependencies>
         <dependency>

+ 39 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/client/FeatureClient.java

@@ -122,4 +122,43 @@ public class FeatureClient {
                 ? response.getAdItemFeatureList()
                 : Collections.emptyList();
     }
+
+    public List<GetUserFeatureInfo> getUserFeatureInfo(List<String> mids) {
+        GetUserFeatureInfoRequest request = GetUserFeatureInfoRequest.newBuilder()
+                .addAllMids(mids)
+                .build();
+        GetUserFeatureInfoResponse response = client.getUserFeatureInfo(request);
+        if (response == null || !response.hasResult()) {
+            log.info("getUserFeatureInfo grpc error");
+            return null;
+        }
+        if (response.getResult().getCode() != 1) {
+            log.info("getUserFeatureInfo grpc code={}, msg={}", response.getResult().getCode(),
+                    response.getResult().getMessage());
+            return null;
+        }
+        return response.getUserFeatureInfoCount() > 0
+                ? response.getUserFeatureInfoList()
+                : Collections.emptyList();
+    }
+
+    public List<GetVideoFeatureInfo> getVideoFeatureInfo(List<Long> videoIds) {
+        GetVideoFeatureInfoRequest request = GetVideoFeatureInfoRequest.newBuilder()
+                .addAllVideoIds(videoIds)
+                .build();
+        GetVideoFeatureInfoResponse response = client.getVideoFeatureInfo(request);
+        if (response == null || !response.hasResult()) {
+            log.info("getVideoFeatureInfo grpc error");
+            return null;
+        }
+        if (response.getResult().getCode() != 1) {
+            log.info("getVideoFeatureInfo grpc code={}, msg={}", response.getResult().getCode(),
+                    response.getResult().getMessage());
+            return null;
+        }
+        return response.getVideoFeatureInfoList().size() > 0
+                ? response.getVideoFeatureInfoList()
+                : Collections.emptyList();
+    }
+
 }

+ 0 - 2
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/domain/ad/base/AdActionFeature.java

@@ -61,11 +61,9 @@ public class AdActionFeature {
 
 
 
-
     public static void main(String args[]){
 
         AdActionFeature adActionFeature  = new AdActionFeature();
-        // adActionFeature.setOriginAdView("3861");
         System.out.println(String.valueOf(adActionFeature.getAdView()));
     }
 

+ 33 - 76
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/domain/ad/base/AdItemBytesFeature.java

@@ -10,20 +10,12 @@ public class AdItemBytesFeature {
 
     private final byte[] adId;
 
-    //private final byte[] adCode;
-
     private final byte[] advertiserId;
 
-    //private final byte[] advertiserCode;
-
     private final byte[] campaignId;
 
-    //private final byte[] campaignCode;
-
     private final byte[] creative;
 
-    //private final byte[] creativeCode;
-
     // adid 维度,也就是planid
     private Map<String, byte[]> day1_cnt_features;
     // 3天内统计量
@@ -54,127 +46,92 @@ public class AdItemBytesFeature {
     private Map<String, byte[]> advertiser_month3_cnt_features;
 
 
+    private static void addAdActionFeature(Map<String, byte[]>  dayCntMap, AdActionFeature adActionFeature ){
+
+        dayCntMap.put("view", String.valueOf(ceilLog(adActionFeature.getAdView())).getBytes());
+        dayCntMap.put("click", String.valueOf(ceilLog(adActionFeature.getAdClick())).getBytes());
+        dayCntMap.put("conversion", String.valueOf(ceilLog(adActionFeature.getAdConversion())).getBytes());
+        dayCntMap.put("ctr", String.valueOf(bucketRatioFeature(adActionFeature.getCtr())).getBytes());
+        dayCntMap.put("cvr", String.valueOf(bucketRatioFeature(adActionFeature.getCvr())).getBytes());
+    }
+
+    private static double ceilLog(Double key) {
+        return Math.ceil(Math.log(key + 1));
+    }
+
+    private static double bucketRatioFeature(Double key) {
+        long bucket = Math.round(Math.log((key + 1) * 50));
+        if (bucket > 50)
+            bucket = 50;
+        return (double) bucket;
+    }
+
 
 
     public AdItemBytesFeature(AdItemFeature feature) {
 
         adId = feature.getAdId().getBytes();
-        // adCode = feature.getAdCode().getBytes();
         advertiserId = feature.getAdvertiserId().getBytes();
-        //advertiserCode = feature.getAdvertiserCode().getBytes();
         campaignId = feature.getCampaignId().getBytes();
-        //campaignCode = feature.getCampaignCode().getBytes();
         creative = feature.getCreativeId().getBytes();
-        // creativeCode = feature.getCreativeCode().getBytes();
 
 
         // adid 维度  planid
         // 1 day statistic
         day1_cnt_features = new HashMap<String, byte[]>();
-        day1_cnt_features.put("view", String.valueOf(feature.getDay1_cnt_features().getAdView()).getBytes());
-        day1_cnt_features.put("click", String.valueOf(feature.getDay1_cnt_features().getAdClick()).getBytes());
-        day1_cnt_features.put("conversion", String.valueOf(feature.getDay1_cnt_features().getAdConversion()).getBytes());
-        day1_cnt_features.put("ctr", String.valueOf(feature.getDay1_cnt_features().getCtr()).getBytes());
-        day1_cnt_features.put("cvr", String.valueOf(feature.getDay1_cnt_features().getCvr()).getBytes());
+        addAdActionFeature(day1_cnt_features, feature.getDay1_cnt_features());
 
         // 3 day statistic
         day3_cnt_features = new HashMap<String, byte[]>();
-        day3_cnt_features.put("view", String.valueOf(feature.getDay3_cnt_features().getAdView()).getBytes());
-        day3_cnt_features.put("click", String.valueOf(feature.getDay3_cnt_features().getAdClick()).getBytes());
-        day3_cnt_features.put("conversion", String.valueOf(feature.getDay3_cnt_features().getAdConversion()).getBytes());
-        day3_cnt_features.put("ctr", String.valueOf(feature.getDay3_cnt_features().getCtr()).getBytes());
-        day3_cnt_features.put("cvr", String.valueOf(feature.getDay3_cnt_features().getCvr()).getBytes());
+        addAdActionFeature(day3_cnt_features, feature.getDay3_cnt_features());
 
         // 7 day statistic
         day7_cnt_features = new HashMap<String, byte[]>();
-        day7_cnt_features.put("view", String.valueOf(feature.getDay7_cnt_features().getAdView()).getBytes());
-        day7_cnt_features.put("click", String.valueOf(feature.getDay7_cnt_features().getAdClick()).getBytes());
-        day7_cnt_features.put("conversion", String.valueOf(feature.getDay7_cnt_features().getAdConversion()).getBytes());
-        day7_cnt_features.put("ctr", String.valueOf(feature.getDay7_cnt_features().getCtr()).getBytes());
-        day7_cnt_features.put("cvr", String.valueOf(feature.getDay7_cnt_features().getCvr()).getBytes());
+        addAdActionFeature(day7_cnt_features, feature.getDay7_cnt_features());
 
         // 3 month statisic
         month3_cnt_features = new HashMap<String, byte[]>();
-        month3_cnt_features.put("view", String.valueOf(feature.getMonth3_cnt_features().getAdView()).getBytes());
-        month3_cnt_features.put("click", String.valueOf(feature.getMonth3_cnt_features().getAdClick()).getBytes());
-        month3_cnt_features.put("conversion", String.valueOf(feature.getMonth3_cnt_features().getAdConversion()).getBytes());
-        month3_cnt_features.put("ctr", String.valueOf(feature.getMonth3_cnt_features().getCtr()).getBytes());
-        month3_cnt_features.put("cvr", String.valueOf(feature.getMonth3_cnt_features().getCvr()).getBytes());
+        addAdActionFeature(month3_cnt_features, feature.getMonth3_cnt_features());
 
 
         // creative 维度  creativeid
         // 1 day statistic
         creative_day1_cnt_features = new HashMap<String, byte[]>();
-        creative_day1_cnt_features.put("view", String.valueOf(feature.getCreative_1day_cnt_features().getAdView()).getBytes());
-        creative_day1_cnt_features.put("click", String.valueOf(feature.getCreative_1day_cnt_features().getAdClick()).getBytes());
-        creative_day1_cnt_features.put("conversion", String.valueOf(feature.getCreative_1day_cnt_features().getAdConversion()).getBytes());
-        creative_day1_cnt_features.put("ctr", String.valueOf(feature.getCreative_1day_cnt_features().getCtr()).getBytes());
-        creative_day1_cnt_features.put("cvr", String.valueOf(feature.getCreative_1day_cnt_features().getCvr()).getBytes());
+        addAdActionFeature(creative_day1_cnt_features, feature.getCreative_1day_cnt_features());
 
         // 3 day statistic
         creative_day3_cnt_features = new HashMap<String, byte[]>();
-        creative_day3_cnt_features.put("view", String.valueOf(feature.getCreative_3day_cnt_features().getAdView()).getBytes());
-        creative_day3_cnt_features.put("click", String.valueOf(feature.getCreative_3day_cnt_features().getAdClick()).getBytes());
-        creative_day3_cnt_features.put("conversion", String.valueOf(feature.getCreative_3day_cnt_features().getAdConversion()).getBytes());
-        creative_day3_cnt_features.put("ctr", String.valueOf(feature.getCreative_3day_cnt_features().getCtr()).getBytes());
-        creative_day3_cnt_features.put("cvr", String.valueOf(feature.getCreative_3day_cnt_features().getCvr()).getBytes());
+        addAdActionFeature(creative_day3_cnt_features, feature.getCreative_3day_cnt_features());
+
 
         // 7 day statistic
         creative_day7_cnt_features = new HashMap<String, byte[]>();
-        creative_day7_cnt_features.put("view", String.valueOf(feature.getCreative_7day_cnt_features().getAdView()).getBytes());
-        creative_day7_cnt_features.put("click", String.valueOf(feature.getCreative_7day_cnt_features().getAdClick()).getBytes());
-        creative_day7_cnt_features.put("conversion", String.valueOf(feature.getCreative_7day_cnt_features().getAdConversion()).getBytes());
-        creative_day7_cnt_features.put("ctr", String.valueOf(feature.getCreative_7day_cnt_features().getCtr()).getBytes());
-        creative_day7_cnt_features.put("cvr", String.valueOf(feature.getCreative_7day_cnt_features().getCvr()).getBytes());
+        addAdActionFeature(creative_day7_cnt_features, feature.getCreative_7day_cnt_features());
 
 
         // 3 month statisic
         creative_month3_cnt_features = new HashMap<String, byte[]>();
-        creative_month3_cnt_features.put("view", String.valueOf(feature.getCreative_3month_cnt_features().getAdView()).getBytes());
-        creative_month3_cnt_features.put("click", String.valueOf(feature.getCreative_3month_cnt_features().getAdClick()).getBytes());
-        creative_month3_cnt_features.put("conversion", String.valueOf(feature.getCreative_3month_cnt_features().getAdConversion()).getBytes());
-        creative_month3_cnt_features.put("ctr", String.valueOf(feature.getCreative_3month_cnt_features().getCtr()).getBytes());
-        creative_month3_cnt_features.put("cvr", String.valueOf(feature.getCreative_3month_cnt_features().getCvr()).getBytes());
-
+        addAdActionFeature(creative_month3_cnt_features, feature.getCreative_3month_cnt_features());
 
 
         // advertiser 维度  planid
         // 1 day statistic
         advertiser_day1_cnt_features = new HashMap<String, byte[]>();
-        advertiser_day1_cnt_features.put("view", String.valueOf(feature.getAdvertiser_1day_cnt_features().getAdView()).getBytes());
-        advertiser_day1_cnt_features.put("click", String.valueOf(feature.getAdvertiser_1day_cnt_features().getAdClick()).getBytes());
-        advertiser_day1_cnt_features.put("conversion", String.valueOf(feature.getAdvertiser_1day_cnt_features().getAdConversion()).getBytes());
-        advertiser_day1_cnt_features.put("ctr", String.valueOf(feature.getAdvertiser_1day_cnt_features().getCtr()).getBytes());
-        advertiser_day1_cnt_features.put("cvr", String.valueOf(feature.getAdvertiser_1day_cnt_features().getCvr()).getBytes());
+        addAdActionFeature(advertiser_day1_cnt_features, feature.getAdvertiser_1day_cnt_features());
 
 
         // 3 day statistic
         advertiser_day3_cnt_features = new HashMap<String, byte[]>();
-        advertiser_day3_cnt_features.put("view", String.valueOf(feature.getAdvertiser_3day_cnt_features().getAdView()).getBytes());
-        advertiser_day3_cnt_features.put("click", String.valueOf(feature.getAdvertiser_3day_cnt_features().getAdClick()).getBytes());
-        advertiser_day3_cnt_features.put("conversion", String.valueOf(feature.getAdvertiser_3day_cnt_features().getAdConversion()).getBytes());
-        advertiser_day3_cnt_features.put("ctr", String.valueOf(feature.getAdvertiser_3day_cnt_features().getCtr()).getBytes());
-        advertiser_day3_cnt_features.put("cvr", String.valueOf(feature.getAdvertiser_3day_cnt_features().getCvr()).getBytes());
+        addAdActionFeature(advertiser_day3_cnt_features, feature.getAdvertiser_3day_cnt_features());
 
 
         // 7 day statistic
         advertiser_day7_cnt_features = new HashMap<String, byte[]>();
-        advertiser_day7_cnt_features.put("view", String.valueOf(feature.getAdvertiser_7day_cnt_features().getAdView()).getBytes());
-        advertiser_day7_cnt_features.put("click", String.valueOf(feature.getAdvertiser_7day_cnt_features().getAdClick()).getBytes());
-        advertiser_day7_cnt_features.put("conversion", String.valueOf(feature.getAdvertiser_7day_cnt_features().getAdConversion()).getBytes());
-        advertiser_day7_cnt_features.put("ctr", String.valueOf(feature.getAdvertiser_7day_cnt_features().getCtr()).getBytes());
-        advertiser_day7_cnt_features.put("cvr", String.valueOf(feature.getAdvertiser_7day_cnt_features().getCvr()).getBytes());
-
+        addAdActionFeature(advertiser_day7_cnt_features, feature.getAdvertiser_7day_cnt_features());
 
         // 3 month statisic
         advertiser_month3_cnt_features = new HashMap<String, byte[]>();
-        advertiser_month3_cnt_features.put("view", String.valueOf(feature.getAdvertiser_3month_cnt_features().getAdView()).getBytes());
-        advertiser_month3_cnt_features.put("click", String.valueOf(feature.getAdvertiser_3month_cnt_features().getAdClick()).getBytes());
-        advertiser_month3_cnt_features.put("conversion", String.valueOf(feature.getAdvertiser_3month_cnt_features().getAdConversion()).getBytes());
-        advertiser_month3_cnt_features.put("ctr", String.valueOf(feature.getAdvertiser_3month_cnt_features().getCtr()).getBytes());
-        advertiser_month3_cnt_features.put("cvr", String.valueOf(feature.getAdvertiser_3month_cnt_features().getCvr()).getBytes());
-
-
+        addAdActionFeature(advertiser_month3_cnt_features, feature.getAdvertiser_3month_cnt_features());
 
 
 

+ 26 - 24
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/domain/ad/base/UserAdBytesFeature.java

@@ -19,46 +19,48 @@ public class UserAdBytesFeature {
     // 3个月统计量
     private Map<String, byte[]> month3_cnt_features;
 
+    private static void addAdActionFeature(Map<String, byte[]>  dayCntMap, AdActionFeature adActionFeature ){
+
+        dayCntMap.put("view", String.valueOf(ceilLog(adActionFeature.getAdView())).getBytes());
+        dayCntMap.put("click", String.valueOf(ceilLog(adActionFeature.getAdClick())).getBytes());
+        dayCntMap.put("conversion", String.valueOf(ceilLog(adActionFeature.getAdConversion())).getBytes());
+        dayCntMap.put("ctr", String.valueOf(bucketRatioFeature(adActionFeature.getCtr())).getBytes());
+        dayCntMap.put("cvr", String.valueOf(bucketRatioFeature(adActionFeature.getCvr())).getBytes());
+    }
+
+    private static double ceilLog(Double key) {
+        return Math.ceil(Math.log(key + 1));
+    }
+
+    private static double bucketRatioFeature(Double key) {
+        long bucket = Math.round(Math.log((key + 1) * 50));
+        if (bucket > 50)
+            bucket = 50;
+        return (double) bucket;
+    }
+
+
+
 
     public UserAdBytesFeature(UserAdFeature feature) {
         this.mid = feature.getMid().getBytes();
 
-
         // 1 day statistic
         day1_cnt_features = new HashMap<String, byte[]>();
-        day1_cnt_features.put("view", String.valueOf(feature.getDay1_cnt_features().getAdView()).getBytes());
-        day1_cnt_features.put("click", String.valueOf(feature.getDay1_cnt_features().getAdClick()).getBytes());
-        day1_cnt_features.put("conversion", String.valueOf(feature.getDay1_cnt_features().getAdConversion()).getBytes());
-        day1_cnt_features.put("ctr", String.valueOf(feature.getDay1_cnt_features().getCtr()).getBytes());
-        day1_cnt_features.put("cvr", String.valueOf(feature.getDay1_cnt_features().getCvr()).getBytes());
-
-
+        addAdActionFeature(day1_cnt_features, feature.getDay1_cnt_features());
 
         // 3 day statistic
         day3_cnt_features = new HashMap<String, byte[]>();
-        day3_cnt_features.put("view", String.valueOf(feature.getDay3_cnt_features().getAdView()).getBytes());
-        day3_cnt_features.put("click", String.valueOf(feature.getDay3_cnt_features().getAdClick()).getBytes());
-        day3_cnt_features.put("conversion", String.valueOf(feature.getDay3_cnt_features().getAdConversion()).getBytes());
-        day3_cnt_features.put("ctr", String.valueOf(feature.getDay3_cnt_features().getCtr()).getBytes());
-        day3_cnt_features.put("cvr", String.valueOf(feature.getDay3_cnt_features().getCvr()).getBytes());
-
+        addAdActionFeature(day3_cnt_features, feature.getDay3_cnt_features());
 
         // 7 day statistic
         day7_cnt_features = new HashMap<String, byte[]>();
-        day7_cnt_features.put("view", String.valueOf(feature.getDay7_cnt_features().getAdView()).getBytes());
-        day7_cnt_features.put("click", String.valueOf(feature.getDay7_cnt_features().getAdClick()).getBytes());
-        day7_cnt_features.put("conversion", String.valueOf(feature.getDay7_cnt_features().getAdConversion()).getBytes());
-        day7_cnt_features.put("ctr", String.valueOf(feature.getDay7_cnt_features().getCtr()).getBytes());
-        day7_cnt_features.put("cvr", String.valueOf(feature.getDay7_cnt_features().getCvr()).getBytes());
+        addAdActionFeature(day7_cnt_features, feature.getDay7_cnt_features());
 
 
         // 3 month statisic
         month3_cnt_features = new HashMap<String, byte[]>();
-        month3_cnt_features.put("view", String.valueOf(feature.getMonth3_cnt_features().getAdView()).getBytes());
-        month3_cnt_features.put("click", String.valueOf(feature.getMonth3_cnt_features().getAdClick()).getBytes());
-        month3_cnt_features.put("conversion", String.valueOf(feature.getMonth3_cnt_features().getAdConversion()).getBytes());
-        month3_cnt_features.put("ctr", String.valueOf(feature.getMonth3_cnt_features().getCtr()).getBytes());
-        month3_cnt_features.put("cvr", String.valueOf(feature.getMonth3_cnt_features().getCvr()).getBytes());
+        addAdActionFeature(month3_cnt_features, feature.getMonth3_cnt_features());
 
     }
 }

+ 105 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/domain/video/base/AlgRecsysUserInfo.java

@@ -0,0 +1,105 @@
+package com.tzld.piaoquan.recommend.feature.domain.video.base;
+
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * 用户特征
+ *
+ * @author sunxy
+ */
+@Data
+public class AlgRecsysUserInfo {
+    private Long uid;
+    private String mids; // 设备唯一标识
+    private String nickName; // 微信昵称
+    private String longvideoNickName; // 小程序昵称
+    private String gender; // 性别
+    private String userType; // 用户身份
+    private String phoneNumber; // 联系方式
+    private LocalDateTime gmtCreate; // 创建时间
+    private Long gmtCreateTimestamp; // 创建时间戳
+    private String tags; // 用户内容标签
+    private String categoryName; // 场景
+    private String isvip; // 是否开通vip
+    private String isreward; // 是否开通赞赏
+    private String isad; // 是否开通广告
+    private String isgood; // 是否开通商品权限
+    private String firstUpDatetime; // 首次上传时间
+    private String lastUpDatetime; // 最后一次上传时间
+    private String nextToLastUpDatetime; // 倒数第二次上传时间
+    private Long videos; // 上传视频数
+    private Long todayVideos; // 今日上传视频数
+    private Long idols; // 关注的人数
+    private Long fans; // 粉丝数
+    private Long playCount; // 累计播放人数
+    private Long playCountTotal; // 累计播放次数
+    private Double totalReward; // 赞赏总金额
+    private Double currentdayReward; // 当日赞赏金额
+    private Long rewardPerson; // 赞赏人数
+    private Long totalRewardTimes; // 赞赏次数
+    private Long rewardVideos; // 赞赏视频数
+    private Long totalPrice; // 付费总金额
+    private Long currentdayPrice; // 当日付费金额
+    private Long totalPriceTimes; // 付费次数
+    private Long totalPricePerson; // 付费人数
+    private Long totalPriceVideos; // 付费视频数
+    private String cgrainUserType; // 粗粒度身份
+    private String identityTagname; // 用户身份标签
+    private String operationTags; // 用户运营标签
+    private Long identityTagId; // 用户身份标签号
+    private LocalDateTime identityCreateTime; // 用户身份标签创建时间
+    private String country; // 国家
+    private String province; // 省份
+    private String city; // 市
+    private String u1dayExpCnt;
+    private String u1dayClickCnt;
+    private String u1dayShareCnt;
+    private String u1dayReturnCnt;
+    private String uCtr1day;
+    private String uStr1day;
+    private String uRov1day;
+    private String uRos1day;
+    private String u3dayExpCnt;
+    private String u3dayClickCnt;
+    private String u3dayShareCnt;
+    private String u3dayReturnCnt;
+    private String uCtr3day;
+    private String uStr3day;
+    private String uRov3day;
+    private String uRos3day;
+    private String u7dayExpCnt;
+    private String u7dayClickCnt;
+    private String u7dayShareCnt;
+    private String u7dayReturnCnt;
+    private String uCtr7day;
+    private String uStr7day;
+    private String uRov7day;
+    private String uRos7day;
+    private String u3monthExpCnt;
+    private String u3monthClickCnt;
+    private String u3monthShareCnt;
+    private String u3monthReturnCnt;
+    private String uCtr3month;
+    private String uStr3month;
+    private String uRov3month;
+    private String uRos3month;
+    private String uCycleBucket7days;
+    private String uCycleBucket30days;
+    private String uShareBucket30days;
+    private String machineinfoBrand;
+    private String machineinfoModel;
+    private String machineinfoPlatform;
+    private String machineinfoSdkversion;
+    private String machineinfoSystem;
+    private String machineinfoWechatversion;
+    private String u1monthExpCnt;
+    private String u1monthClickCnt;
+    private String u1monthShareCnt;
+    private String u1monthReturnCnt;
+    private String uCtr1month;
+    private String uStr1month;
+    private String uRov1month;
+    private String uRos1month;
+}

+ 82 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/domain/video/base/AlgRecsysVideoInfo.java

@@ -0,0 +1,82 @@
+package com.tzld.piaoquan.recommend.feature.domain.video.base;
+
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+public class AlgRecsysVideoInfo {
+
+    private Long videoid; // 视频id
+    private String title; // 视频标题
+    private String distrubuteTitle; // 视频分发标题
+    private String videoCategory; // 视频种类
+    private String tagName; // 视频一级标签
+    private LocalDateTime gmtCreate; // 上传时间
+    private String tags; // 视频内容标签
+    private Long uid; // 生产者id
+    private String videoEdit; // 视频审核状态
+    private String videoDataStat; // 视频的数据状态
+    private String videoRecommend; // 视频可搜状态
+    private String isImg; // 视频分发封面
+    private Double existenceDays; // 发布距今天数
+    private String videoUrl; // 后台视频链接
+    private Long totalTime; // 视频时长
+    private Long playCount; // 播放人数
+    private Long playCountTotal; // 播放次数
+    private Double totalReward; // 赞赏总金额
+    private Double currentdayReward; // 当日赞赏金额
+    private Long totalRewardTimes; // 赞赏次数
+    private Long rewardPerson; // 赞赏人数
+    private Long totalPrice; // 付费总金额
+    private Long currentdayPrice; // 当日付费金额
+    private Long totalPriceTimes; // 付费次数
+    private Long totalPricePerson; // 付费人数
+    private String appRecommendStatus; // app推荐状态
+    private String charge; // 收费状态
+    private String isPwd; // 是否加密
+    private Long width; // 视频宽度
+    private Long height; // 视频高度
+    private String tagName2; // 二级标签
+    private String tagName3; // 三级标签
+    private String ifCreate; // 是否为创作视频
+    private String ifChange; // 是否再创作
+    private Long appType; // 发布端
+    private String descr; // 视频简介
+    private String videoType; // 视频创作类型
+    private String ifInYouthcommunity; // 是否进入青年社区
+    private String ifInAgedcommunity; // 是否进入老年社区
+    private String topicName; // 话题名称
+    private String i1dayExpCnt;
+    private String i1dayClickCnt;
+    private String i1dayShareCnt;
+    private String i1dayReturnCnt;
+    private String iCtr1day;
+    private String iStr1day;
+    private String iRov1day;
+    private String iRos1day;
+    private String i3dayExpCnt;
+    private String i3dayClickCnt;
+    private String i3dayShareCnt;
+    private String i3dayReturnCnt;
+    private String iCtr3day;
+    private String iStr3day;
+    private String iRov3day;
+    private String iRos3day;
+    private String i7dayExpCnt;
+    private String i7dayClickCnt;
+    private String i7dayShareCnt;
+    private String i7dayReturnCnt;
+    private String iCtr7day;
+    private String iStr7day;
+    private String iRov7day;
+    private String iRos7day;
+    private String i3monthExpCnt;
+    private String i3monthClickCnt;
+    private String i3monthShareCnt;
+    private String i3monthReturnCnt;
+    private String iCtr3month;
+    private String iStr3month;
+    private String iRov3month;
+    private String iRos3month;
+}

+ 68 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/domain/video/base/UserFeatureInfo.java

@@ -0,0 +1,68 @@
+package com.tzld.piaoquan.recommend.feature.domain.video.base;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author sunxy
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class UserFeatureInfo {
+    private String mid;
+    private String machineinfoBrand;
+    private String machineinfoModel;
+    private String machineinfoSystem;
+    private String machineinfoPlatform;
+    private String gender; // 性别
+    private String country; // 国家
+    private String province; // 省份
+    private String city; // 市
+    /*
+    过去一小时
+    */
+    private Long u1hourExpCnt;
+    private Long u1hourClickCnt;
+    private Long u1hourShareCnt;
+    private Long u1hourReturnCnt;
+    private Double uCtr1hour;
+    private Double uStr1hour;
+    private Double uRov1hour;
+    private Double uRos1hour;
+    /*
+    今天
+     */
+    private Long uTodayExpCnt;
+    private Long uTodayClickCnt;
+    private Long uTodayShareCnt;
+    private Long uTodayReturnCnt;
+    private Double uCtrToday;
+    private Double uStrToday;
+    private Double uRovToday;
+    private Double uRosToday;
+    /*
+    过去一天
+     */
+    private Long u1dayExpCnt;
+    private Long u1dayClickCnt;
+    private Long u1dayShareCnt;
+    private Long u1dayReturnCnt;
+    private Double uCtr1day;
+    private Double uStr1day;
+    private Double uRov1day;
+    private Double uRos1day;
+    /*
+    过去三天
+     */
+    private Long u3dayExpCnt;
+    private Long u3dayClickCnt;
+    private Long u3dayShareCnt;
+    private Long u3dayReturnCnt;
+    private Double uCtr3day;
+    private Double uStr3day;
+    private Double uRov3day;
+    private Double uRos3day;
+
+}

+ 80 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/domain/video/base/VideoFeatureInfo.java

@@ -0,0 +1,80 @@
+package com.tzld.piaoquan.recommend.feature.domain.video.base;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author sunxy
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class VideoFeatureInfo {
+
+    private Long videoId;
+    private Long playCountTotal;
+    private Integer totalTime;
+    private String gmtCreate;
+    /**
+     * 上传者
+     */
+    private Long uid;
+    /**
+     * 过去十五分钟
+     */
+    private Long i15minExpCnt;
+    private Long i15minClickCnt;
+    private Long i15minShareCnt;
+    private Long i15minReturnCnt;
+    private Double iCtr15min;
+    private Double iStr15min;
+    private Double iRov15min;
+    private Double iRos15min;
+    /**
+     * 过去一小时
+     */
+    private Long i1hourExpCnt;
+    private Long i1hourClickCnt;
+    private Long i1hourShareCnt;
+    private Long i1hourReturnCnt;
+    private Double iCtr1hour;
+    private Double iStr1hour;
+    private Double iRov1hour;
+    private Double iRos1hour;
+    /**
+     * 今天
+     */
+    private Long iTodayExpCnt;
+    private Long iTodayClickCnt;
+    private Long iTodayShareCnt;
+    private Long iTodayReturnCnt;
+    private Double iCtrToday;
+    private Double iStrToday;
+    private Double iRovToday;
+    private Double iRosToday;
+    /*
+    过去一天
+     */
+    private Long i1dayExpCnt;
+    private Long i1dayClickCnt;
+    private Long i1dayShareCnt;
+    private Long i1dayReturnCnt;
+    private Double iCtr1day;
+    private Double iStr1day;
+    private Double iRov1day;
+    private Double iRos1day;
+    /*
+    过去三天
+     */
+    private Long i3dayExpCnt;
+    private Long i3dayClickCnt;
+    private Long i3dayShareCnt;
+    private Long i3dayReturnCnt;
+    private Double iCtr3day;
+    private Double iStr3day;
+    private Double iRov3day;
+    private Double iRos3day;
+
+
+}

+ 152 - 26
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/Feature.java

@@ -84,6 +84,36 @@ public final class Feature {
   static final 
     com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
       internal_static_AdItemFeatureProto_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_GetUserFeatureInfoRequest_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_GetUserFeatureInfoRequest_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_GetUserFeatureInfo_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_GetUserFeatureInfo_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_GetUserFeatureInfoResponse_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_GetUserFeatureInfoResponse_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_GetVideoFeatureInfoRequest_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_GetVideoFeatureInfoRequest_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_GetVideoFeatureInfo_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_GetVideoFeatureInfo_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_GetVideoFeatureInfoResponse_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_GetVideoFeatureInfoResponse_fieldAccessorTable;
   static final com.google.protobuf.Descriptors.Descriptor
     internal_static_GetAdItemFeatureRequest_descriptor;
   static final 
@@ -181,28 +211,88 @@ public final class Feature {
       "\022 \001(\0132\025.AdActionFeatureProto\022;\n\034advertis" +
       "er_7day_cnt_features\030\023 \001(\0132\025.AdActionFea" +
       "tureProto\022=\n\036advertiser_3month_cnt_featu" +
-      "res\030\024 \001(\0132\025.AdActionFeatureProto\"(\n\027GetA" +
-      "dItemFeatureRequest\022\r\n\005ad_id\030\001 \001(\t\"a\n\030Ge" +
-      "tAdItemFeatureResponse\022\027\n\006result\030\001 \001(\0132\007" +
-      ".Result\022,\n\017ad_item_feature\030\002 \001(\0132\023.AdIte" +
-      "mFeatureProto\"+\n\032GetAllAdItemFeatureRequ" +
-      "est\022\r\n\005ad_id\030\001 \003(\t\"d\n\033GetAllAdItemFeatur" +
-      "eResponse\022\027\n\006result\030\001 \001(\0132\007.Result\022,\n\017ad" +
-      "_item_feature\030\002 \003(\0132\023.AdItemFeatureProto" +
-      "2\314\003\n\016FeatureService\022G\n\020GetUserAdFeature\022" +
-      "\030.GetUserAdFeatureRequest\032\031.GetUserAdFea" +
-      "tureResponse\022G\n\020GetAdItemFeature\022\030.GetAd" +
-      "ItemFeatureRequest\032\031.GetAdItemFeatureRes" +
-      "ponse\022P\n\023GetAllAdItemFeature\022\033.GetAllAdI" +
-      "temFeatureRequest\032\034.GetAllAdItemFeatureR" +
-      "esponse\022A\n\016GetUserFeature\022\026.GetUserFeatu" +
-      "reRequest\032\027.GetUserFeatureResponse\022D\n\017Ge" +
-      "tVideoFeature\022\027.GetVideoFeatureRequest\032\030" +
-      ".GetVideoFeatureResponse\022M\n\022GetAllVideoF" +
-      "eature\022\032.GetAllVideoFeatureRequest\032\033.Get" +
-      "AllVideoFeatureResponseB8\n1com.tzld.piao" +
-      "quan.recommend.feature.model.featureP\001\210\001" +
-      "\001b\006proto3"
+      "res\030\024 \001(\0132\025.AdActionFeatureProto\")\n\031GetU" +
+      "serFeatureInfoRequest\022\014\n\004mids\030\001 \003(\t\"\246\007\n\022" +
+      "GetUserFeatureInfo\022\026\n\016u1hour_exp_cnt\030\001 \001" +
+      "(\003\022\030\n\020u1hour_click_cnt\030\002 \001(\003\022\030\n\020u1hour_s" +
+      "hare_cnt\030\003 \001(\003\022\031\n\021u1hour_return_cnt\030\004 \001(" +
+      "\003\022\022\n\nu_ctr1hour\030\005 \001(\001\022\022\n\nu_str1hour\030\006 \001(" +
+      "\001\022\022\n\nu_rov1hour\030\007 \001(\001\022\022\n\nu_ros1hour\030\010 \001(" +
+      "\001\022\027\n\017u_today_exp_cnt\030\t \001(\003\022\031\n\021u_today_cl" +
+      "ick_cnt\030\n \001(\003\022\031\n\021u_today_share_cnt\030\013 \001(\003" +
+      "\022\032\n\022u_today_return_cnt\030\014 \001(\003\022\023\n\013u_ctr_to" +
+      "day\030\r \001(\001\022\023\n\013u_str_today\030\016 \001(\001\022\023\n\013u_rov_" +
+      "today\030\017 \001(\001\022\023\n\013u_ros_today\030\020 \001(\001\022\025\n\ru1da" +
+      "y_exp_cnt\030\021 \001(\003\022\027\n\017u1day_click_cnt\030\022 \001(\003" +
+      "\022\027\n\017u1day_share_cnt\030\023 \001(\003\022\030\n\020u1day_retur" +
+      "n_cnt\030\024 \001(\003\022\021\n\tu_ctr1day\030\025 \001(\001\022\021\n\tu_str1" +
+      "day\030\026 \001(\001\022\021\n\tu_rov1day\030\027 \001(\001\022\021\n\tu_ros1da" +
+      "y\030\030 \001(\001\022\025\n\ru3day_exp_cnt\030\031 \001(\003\022\027\n\017u3day_" +
+      "click_cnt\030\032 \001(\003\022\027\n\017u3day_share_cnt\030\033 \001(\003" +
+      "\022\030\n\020u3day_return_cnt\030\034 \001(\003\022\021\n\tu_ctr3day\030" +
+      "\035 \001(\001\022\021\n\tu_str3day\030\036 \001(\001\022\021\n\tu_rov3day\030\037 " +
+      "\001(\001\022\021\n\tu_ros3day\030  \001(\001\022\013\n\003mid\030! \001(\t\022\031\n\021m" +
+      "achineinfo_brand\030\" \001(\t\022\031\n\021machineinfo_mo" +
+      "del\030# \001(\t\022\032\n\022machineinfo_system\030$ \001(\t\022\034\n" +
+      "\024machineinfo_platform\030% \001(\t\022\016\n\006gender\030& " +
+      "\001(\t\022\017\n\007country\030\' \001(\t\022\020\n\010province\030( \001(\t\022\014" +
+      "\n\004city\030) \001(\t\"e\n\032GetUserFeatureInfoRespon" +
+      "se\022\027\n\006result\030\001 \001(\0132\007.Result\022.\n\021user_feat" +
+      "ure_info\030\002 \003(\0132\023.GetUserFeatureInfo\".\n\032G" +
+      "etVideoFeatureInfoRequest\022\020\n\010videoIds\030\001 " +
+      "\003(\003\"\201\010\n\023GetVideoFeatureInfo\022\020\n\010video_id\030" +
+      "\001 \001(\003\022\030\n\020play_count_total\030\002 \001(\003\022\022\n\ntotal" +
+      "_time\030\003 \001(\005\022\022\n\ngmt_create\030\004 \001(\t\022\013\n\003uid\030\005" +
+      " \001(\003\022\026\n\016i15min_exp_cnt\030\006 \001(\003\022\030\n\020i15min_c" +
+      "lick_cnt\030\007 \001(\003\022\030\n\020i15min_share_cnt\030\010 \001(\003" +
+      "\022\031\n\021i15min_return_cnt\030\t \001(\003\022\022\n\ni_ctr15mi" +
+      "n\030\n \001(\001\022\022\n\ni_str15min\030\013 \001(\001\022\022\n\ni_rov15mi" +
+      "n\030\014 \001(\001\022\022\n\ni_ros15min\030\r \001(\001\022\026\n\016i1hour_ex" +
+      "p_cnt\030\016 \001(\003\022\030\n\020i1hour_click_cnt\030\017 \001(\003\022\030\n" +
+      "\020i1hour_share_cnt\030\020 \001(\003\022\031\n\021i1hour_return" +
+      "_cnt\030\021 \001(\003\022\022\n\ni_ctr1hour\030\022 \001(\001\022\022\n\ni_str1" +
+      "hour\030\023 \001(\001\022\022\n\ni_rov1hour\030\024 \001(\001\022\022\n\ni_ros1" +
+      "hour\030\025 \001(\001\022\027\n\017i_today_exp_cnt\030\026 \001(\003\022\031\n\021i" +
+      "_today_click_cnt\030\027 \001(\003\022\031\n\021i_today_share_" +
+      "cnt\030\030 \001(\003\022\032\n\022i_today_return_cnt\030\031 \001(\003\022\023\n" +
+      "\013i_ctr_today\030\032 \001(\001\022\023\n\013i_str_today\030\033 \001(\001\022" +
+      "\023\n\013i_rov_today\030\034 \001(\001\022\023\n\013i_ros_today\030\035 \001(" +
+      "\001\022\025\n\ri1day_exp_cnt\030\036 \001(\003\022\027\n\017i1day_click_" +
+      "cnt\030\037 \001(\003\022\027\n\017i1day_share_cnt\030  \001(\003\022\030\n\020i1" +
+      "day_return_cnt\030! \001(\003\022\021\n\ti_ctr1day\030\" \001(\001\022" +
+      "\021\n\ti_str1day\030# \001(\001\022\021\n\ti_rov1day\030$ \001(\001\022\021\n" +
+      "\ti_ros1day\030% \001(\001\022\025\n\ri3day_exp_cnt\030& \001(\003\022" +
+      "\027\n\017i3day_click_cnt\030\' \001(\003\022\027\n\017i3day_share_" +
+      "cnt\030( \001(\003\022\030\n\020i3day_return_cnt\030) \001(\003\022\021\n\ti" +
+      "_ctr3day\030* \001(\001\022\021\n\ti_str3day\030+ \001(\001\022\021\n\ti_r" +
+      "ov3day\030, \001(\001\022\021\n\ti_ros3day\030- \001(\001\"h\n\033GetVi" +
+      "deoFeatureInfoResponse\022\027\n\006result\030\001 \001(\0132\007" +
+      ".Result\0220\n\022video_feature_info\030\002 \003(\0132\024.Ge" +
+      "tVideoFeatureInfo\"(\n\027GetAdItemFeatureReq" +
+      "uest\022\r\n\005ad_id\030\001 \001(\t\"a\n\030GetAdItemFeatureR" +
+      "esponse\022\027\n\006result\030\001 \001(\0132\007.Result\022,\n\017ad_i" +
+      "tem_feature\030\002 \001(\0132\023.AdItemFeatureProto\"+" +
+      "\n\032GetAllAdItemFeatureRequest\022\r\n\005ad_id\030\001 " +
+      "\003(\t\"d\n\033GetAllAdItemFeatureResponse\022\027\n\006re" +
+      "sult\030\001 \001(\0132\007.Result\022,\n\017ad_item_feature\030\002" +
+      " \003(\0132\023.AdItemFeatureProto2\355\004\n\016FeatureSer" +
+      "vice\022G\n\020GetUserAdFeature\022\030.GetUserAdFeat" +
+      "ureRequest\032\031.GetUserAdFeatureResponse\022G\n" +
+      "\020GetAdItemFeature\022\030.GetAdItemFeatureRequ" +
+      "est\032\031.GetAdItemFeatureResponse\022P\n\023GetAll" +
+      "AdItemFeature\022\033.GetAllAdItemFeatureReque" +
+      "st\032\034.GetAllAdItemFeatureResponse\022A\n\016GetU" +
+      "serFeature\022\026.GetUserFeatureRequest\032\027.Get" +
+      "UserFeatureResponse\022D\n\017GetVideoFeature\022\027" +
+      ".GetVideoFeatureRequest\032\030.GetVideoFeatur" +
+      "eResponse\022M\n\022GetAllVideoFeature\022\032.GetAll" +
+      "VideoFeatureRequest\032\033.GetAllVideoFeature" +
+      "Response\022M\n\022GetUserFeatureInfo\022\032.GetUser" +
+      "FeatureInfoRequest\032\033.GetUserFeatureInfoR" +
+      "esponse\022P\n\023GetVideoFeatureInfo\022\033.GetVide" +
+      "oFeatureInfoRequest\032\034.GetVideoFeatureInf" +
+      "oResponseB8\n1com.tzld.piaoquan.recommend" +
+      ".feature.model.featureP\001\210\001\001b\006proto3"
     };
     descriptor = com.google.protobuf.Descriptors.FileDescriptor
       .internalBuildGeneratedFileFrom(descriptorData,
@@ -294,26 +384,62 @@ public final class Feature {
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_AdItemFeatureProto_descriptor,
         new java.lang.String[] { "AdId", "AdCode", "AdvertiserId", "AdvertiserCode", "CampaignId", "CampaignCode", "CreativeId", "CreativeCode", "Day1CntFeatures", "Day3CntFeatures", "Day7CntFeatures", "Month3CntFeatures", "Creative1DayCntFeatures", "Creative3DayCntFeatures", "Creative7DayCntFeatures", "Creative3MonthCntFeatures", "Advertiser1DayCntFeatures", "Advertiser3DayCntFeatures", "Advertiser7DayCntFeatures", "Advertiser3MonthCntFeatures", });
-    internal_static_GetAdItemFeatureRequest_descriptor =
+    internal_static_GetUserFeatureInfoRequest_descriptor =
       getDescriptor().getMessageTypes().get(14);
+    internal_static_GetUserFeatureInfoRequest_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_GetUserFeatureInfoRequest_descriptor,
+        new java.lang.String[] { "Mids", });
+    internal_static_GetUserFeatureInfo_descriptor =
+      getDescriptor().getMessageTypes().get(15);
+    internal_static_GetUserFeatureInfo_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_GetUserFeatureInfo_descriptor,
+        new java.lang.String[] { "U1HourExpCnt", "U1HourClickCnt", "U1HourShareCnt", "U1HourReturnCnt", "UCtr1Hour", "UStr1Hour", "URov1Hour", "URos1Hour", "UTodayExpCnt", "UTodayClickCnt", "UTodayShareCnt", "UTodayReturnCnt", "UCtrToday", "UStrToday", "URovToday", "URosToday", "U1DayExpCnt", "U1DayClickCnt", "U1DayShareCnt", "U1DayReturnCnt", "UCtr1Day", "UStr1Day", "URov1Day", "URos1Day", "U3DayExpCnt", "U3DayClickCnt", "U3DayShareCnt", "U3DayReturnCnt", "UCtr3Day", "UStr3Day", "URov3Day", "URos3Day", "Mid", "MachineinfoBrand", "MachineinfoModel", "MachineinfoSystem", "MachineinfoPlatform", "Gender", "Country", "Province", "City", });
+    internal_static_GetUserFeatureInfoResponse_descriptor =
+      getDescriptor().getMessageTypes().get(16);
+    internal_static_GetUserFeatureInfoResponse_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_GetUserFeatureInfoResponse_descriptor,
+        new java.lang.String[] { "Result", "UserFeatureInfo", });
+    internal_static_GetVideoFeatureInfoRequest_descriptor =
+      getDescriptor().getMessageTypes().get(17);
+    internal_static_GetVideoFeatureInfoRequest_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_GetVideoFeatureInfoRequest_descriptor,
+        new java.lang.String[] { "VideoIds", });
+    internal_static_GetVideoFeatureInfo_descriptor =
+      getDescriptor().getMessageTypes().get(18);
+    internal_static_GetVideoFeatureInfo_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_GetVideoFeatureInfo_descriptor,
+        new java.lang.String[] { "VideoId", "PlayCountTotal", "TotalTime", "GmtCreate", "Uid", "I15MinExpCnt", "I15MinClickCnt", "I15MinShareCnt", "I15MinReturnCnt", "ICtr15Min", "IStr15Min", "IRov15Min", "IRos15Min", "I1HourExpCnt", "I1HourClickCnt", "I1HourShareCnt", "I1HourReturnCnt", "ICtr1Hour", "IStr1Hour", "IRov1Hour", "IRos1Hour", "ITodayExpCnt", "ITodayClickCnt", "ITodayShareCnt", "ITodayReturnCnt", "ICtrToday", "IStrToday", "IRovToday", "IRosToday", "I1DayExpCnt", "I1DayClickCnt", "I1DayShareCnt", "I1DayReturnCnt", "ICtr1Day", "IStr1Day", "IRov1Day", "IRos1Day", "I3DayExpCnt", "I3DayClickCnt", "I3DayShareCnt", "I3DayReturnCnt", "ICtr3Day", "IStr3Day", "IRov3Day", "IRos3Day", });
+    internal_static_GetVideoFeatureInfoResponse_descriptor =
+      getDescriptor().getMessageTypes().get(19);
+    internal_static_GetVideoFeatureInfoResponse_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_GetVideoFeatureInfoResponse_descriptor,
+        new java.lang.String[] { "Result", "VideoFeatureInfo", });
+    internal_static_GetAdItemFeatureRequest_descriptor =
+      getDescriptor().getMessageTypes().get(20);
     internal_static_GetAdItemFeatureRequest_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_GetAdItemFeatureRequest_descriptor,
         new java.lang.String[] { "AdId", });
     internal_static_GetAdItemFeatureResponse_descriptor =
-      getDescriptor().getMessageTypes().get(15);
+      getDescriptor().getMessageTypes().get(21);
     internal_static_GetAdItemFeatureResponse_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_GetAdItemFeatureResponse_descriptor,
         new java.lang.String[] { "Result", "AdItemFeature", });
     internal_static_GetAllAdItemFeatureRequest_descriptor =
-      getDescriptor().getMessageTypes().get(16);
+      getDescriptor().getMessageTypes().get(22);
     internal_static_GetAllAdItemFeatureRequest_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_GetAllAdItemFeatureRequest_descriptor,
         new java.lang.String[] { "AdId", });
     internal_static_GetAllAdItemFeatureResponse_descriptor =
-      getDescriptor().getMessageTypes().get(17);
+      getDescriptor().getMessageTypes().get(23);
     internal_static_GetAllAdItemFeatureResponse_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_GetAllAdItemFeatureResponse_descriptor,

+ 142 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/FeatureService.java

@@ -59,6 +59,22 @@ public  abstract class FeatureService
         com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest request,
         com.google.protobuf.RpcCallback<com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse> done);
 
+    /**
+     * <code>rpc GetUserFeatureInfo(.GetUserFeatureInfoRequest) returns (.GetUserFeatureInfoResponse);</code>
+     */
+    public abstract void getUserFeatureInfo(
+        com.google.protobuf.RpcController controller,
+        com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest request,
+        com.google.protobuf.RpcCallback<com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse> done);
+
+    /**
+     * <code>rpc GetVideoFeatureInfo(.GetVideoFeatureInfoRequest) returns (.GetVideoFeatureInfoResponse);</code>
+     */
+    public abstract void getVideoFeatureInfo(
+        com.google.protobuf.RpcController controller,
+        com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest request,
+        com.google.protobuf.RpcCallback<com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse> done);
+
   }
 
   public static com.google.protobuf.Service newReflectiveService(
@@ -112,6 +128,22 @@ public  abstract class FeatureService
         impl.getAllVideoFeature(controller, request, done);
       }
 
+      @java.lang.Override
+      public  void getUserFeatureInfo(
+          com.google.protobuf.RpcController controller,
+          com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest request,
+          com.google.protobuf.RpcCallback<com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse> done) {
+        impl.getUserFeatureInfo(controller, request, done);
+      }
+
+      @java.lang.Override
+      public  void getVideoFeatureInfo(
+          com.google.protobuf.RpcController controller,
+          com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest request,
+          com.google.protobuf.RpcCallback<com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse> done) {
+        impl.getVideoFeatureInfo(controller, request, done);
+      }
+
     };
   }
 
@@ -146,6 +178,10 @@ public  abstract class FeatureService
             return impl.getVideoFeature(controller, (com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureRequest)request);
           case 5:
             return impl.getAllVideoFeature(controller, (com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest)request);
+          case 6:
+            return impl.getUserFeatureInfo(controller, (com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest)request);
+          case 7:
+            return impl.getVideoFeatureInfo(controller, (com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest)request);
           default:
             throw new java.lang.AssertionError("Can't get here.");
         }
@@ -172,6 +208,10 @@ public  abstract class FeatureService
             return com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureRequest.getDefaultInstance();
           case 5:
             return com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest.getDefaultInstance();
+          case 6:
+            return com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest.getDefaultInstance();
+          case 7:
+            return com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest.getDefaultInstance();
           default:
             throw new java.lang.AssertionError("Can't get here.");
         }
@@ -198,6 +238,10 @@ public  abstract class FeatureService
             return com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureResponse.getDefaultInstance();
           case 5:
             return com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse.getDefaultInstance();
+          case 6:
+            return com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse.getDefaultInstance();
+          case 7:
+            return com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse.getDefaultInstance();
           default:
             throw new java.lang.AssertionError("Can't get here.");
         }
@@ -254,6 +298,22 @@ public  abstract class FeatureService
       com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest request,
       com.google.protobuf.RpcCallback<com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse> done);
 
+  /**
+   * <code>rpc GetUserFeatureInfo(.GetUserFeatureInfoRequest) returns (.GetUserFeatureInfoResponse);</code>
+   */
+  public abstract void getUserFeatureInfo(
+      com.google.protobuf.RpcController controller,
+      com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest request,
+      com.google.protobuf.RpcCallback<com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse> done);
+
+  /**
+   * <code>rpc GetVideoFeatureInfo(.GetVideoFeatureInfoRequest) returns (.GetVideoFeatureInfoResponse);</code>
+   */
+  public abstract void getVideoFeatureInfo(
+      com.google.protobuf.RpcController controller,
+      com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest request,
+      com.google.protobuf.RpcCallback<com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse> done);
+
   public static final
       com.google.protobuf.Descriptors.ServiceDescriptor
       getDescriptor() {
@@ -306,6 +366,16 @@ public  abstract class FeatureService
           com.google.protobuf.RpcUtil.<com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse>specializeCallback(
             done));
         return;
+      case 6:
+        this.getUserFeatureInfo(controller, (com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest)request,
+          com.google.protobuf.RpcUtil.<com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse>specializeCallback(
+            done));
+        return;
+      case 7:
+        this.getVideoFeatureInfo(controller, (com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest)request,
+          com.google.protobuf.RpcUtil.<com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse>specializeCallback(
+            done));
+        return;
       default:
         throw new java.lang.AssertionError("Can't get here.");
     }
@@ -332,6 +402,10 @@ public  abstract class FeatureService
         return com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureRequest.getDefaultInstance();
       case 5:
         return com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest.getDefaultInstance();
+      case 6:
+        return com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest.getDefaultInstance();
+      case 7:
+        return com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest.getDefaultInstance();
       default:
         throw new java.lang.AssertionError("Can't get here.");
     }
@@ -358,6 +432,10 @@ public  abstract class FeatureService
         return com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureResponse.getDefaultInstance();
       case 5:
         return com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse.getDefaultInstance();
+      case 6:
+        return com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse.getDefaultInstance();
+      case 7:
+        return com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse.getDefaultInstance();
       default:
         throw new java.lang.AssertionError("Can't get here.");
     }
@@ -468,6 +546,36 @@ public  abstract class FeatureService
           com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse.class,
           com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse.getDefaultInstance()));
     }
+
+    public  void getUserFeatureInfo(
+        com.google.protobuf.RpcController controller,
+        com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest request,
+        com.google.protobuf.RpcCallback<com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse> done) {
+      channel.callMethod(
+        getDescriptor().getMethods().get(6),
+        controller,
+        request,
+        com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse.getDefaultInstance(),
+        com.google.protobuf.RpcUtil.generalizeCallback(
+          done,
+          com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse.class,
+          com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse.getDefaultInstance()));
+    }
+
+    public  void getVideoFeatureInfo(
+        com.google.protobuf.RpcController controller,
+        com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest request,
+        com.google.protobuf.RpcCallback<com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse> done) {
+      channel.callMethod(
+        getDescriptor().getMethods().get(7),
+        controller,
+        request,
+        com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse.getDefaultInstance(),
+        com.google.protobuf.RpcUtil.generalizeCallback(
+          done,
+          com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse.class,
+          com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse.getDefaultInstance()));
+    }
   }
 
   public static BlockingInterface newBlockingStub(
@@ -505,6 +613,16 @@ public  abstract class FeatureService
         com.google.protobuf.RpcController controller,
         com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest request)
         throws com.google.protobuf.ServiceException;
+
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse getUserFeatureInfo(
+        com.google.protobuf.RpcController controller,
+        com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest request)
+        throws com.google.protobuf.ServiceException;
+
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse getVideoFeatureInfo(
+        com.google.protobuf.RpcController controller,
+        com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest request)
+        throws com.google.protobuf.ServiceException;
   }
 
   private static final class BlockingStub implements BlockingInterface {
@@ -585,6 +703,30 @@ public  abstract class FeatureService
         com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse.getDefaultInstance());
     }
 
+
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse getUserFeatureInfo(
+        com.google.protobuf.RpcController controller,
+        com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest request)
+        throws com.google.protobuf.ServiceException {
+      return (com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse) channel.callBlockingMethod(
+        getDescriptor().getMethods().get(6),
+        controller,
+        request,
+        com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse.getDefaultInstance());
+    }
+
+
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse getVideoFeatureInfo(
+        com.google.protobuf.RpcController controller,
+        com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest request)
+        throws com.google.protobuf.ServiceException {
+      return (com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse) channel.callBlockingMethod(
+        getDescriptor().getMethods().get(7),
+        controller,
+        request,
+        com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse.getDefaultInstance());
+    }
+
   }
 
   // @@protoc_insertion_point(class_scope:FeatureService)

+ 148 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/FeatureServiceGrpc.java

@@ -213,6 +213,68 @@ public final class FeatureServiceGrpc {
     return getGetAllVideoFeatureMethod;
   }
 
+  private static volatile io.grpc.MethodDescriptor<com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest,
+      com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse> getGetUserFeatureInfoMethod;
+
+  @io.grpc.stub.annotations.RpcMethod(
+      fullMethodName = SERVICE_NAME + '/' + "GetUserFeatureInfo",
+      requestType = com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest.class,
+      responseType = com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse.class,
+      methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
+  public static io.grpc.MethodDescriptor<com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest,
+      com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse> getGetUserFeatureInfoMethod() {
+    io.grpc.MethodDescriptor<com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest, com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse> getGetUserFeatureInfoMethod;
+    if ((getGetUserFeatureInfoMethod = FeatureServiceGrpc.getGetUserFeatureInfoMethod) == null) {
+      synchronized (FeatureServiceGrpc.class) {
+        if ((getGetUserFeatureInfoMethod = FeatureServiceGrpc.getGetUserFeatureInfoMethod) == null) {
+          FeatureServiceGrpc.getGetUserFeatureInfoMethod = getGetUserFeatureInfoMethod =
+              io.grpc.MethodDescriptor.<com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest, com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse>newBuilder()
+              .setType(io.grpc.MethodDescriptor.MethodType.UNARY)
+              .setFullMethodName(generateFullMethodName(SERVICE_NAME, "GetUserFeatureInfo"))
+              .setSampledToLocalTracing(true)
+              .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest.getDefaultInstance()))
+              .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse.getDefaultInstance()))
+              .setSchemaDescriptor(new FeatureServiceMethodDescriptorSupplier("GetUserFeatureInfo"))
+              .build();
+        }
+      }
+    }
+    return getGetUserFeatureInfoMethod;
+  }
+
+  private static volatile io.grpc.MethodDescriptor<com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest,
+      com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse> getGetVideoFeatureInfoMethod;
+
+  @io.grpc.stub.annotations.RpcMethod(
+      fullMethodName = SERVICE_NAME + '/' + "GetVideoFeatureInfo",
+      requestType = com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest.class,
+      responseType = com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse.class,
+      methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
+  public static io.grpc.MethodDescriptor<com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest,
+      com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse> getGetVideoFeatureInfoMethod() {
+    io.grpc.MethodDescriptor<com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest, com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse> getGetVideoFeatureInfoMethod;
+    if ((getGetVideoFeatureInfoMethod = FeatureServiceGrpc.getGetVideoFeatureInfoMethod) == null) {
+      synchronized (FeatureServiceGrpc.class) {
+        if ((getGetVideoFeatureInfoMethod = FeatureServiceGrpc.getGetVideoFeatureInfoMethod) == null) {
+          FeatureServiceGrpc.getGetVideoFeatureInfoMethod = getGetVideoFeatureInfoMethod =
+              io.grpc.MethodDescriptor.<com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest, com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse>newBuilder()
+              .setType(io.grpc.MethodDescriptor.MethodType.UNARY)
+              .setFullMethodName(generateFullMethodName(SERVICE_NAME, "GetVideoFeatureInfo"))
+              .setSampledToLocalTracing(true)
+              .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest.getDefaultInstance()))
+              .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse.getDefaultInstance()))
+              .setSchemaDescriptor(new FeatureServiceMethodDescriptorSupplier("GetVideoFeatureInfo"))
+              .build();
+        }
+      }
+    }
+    return getGetVideoFeatureInfoMethod;
+  }
+
   /**
    * Creates a new async stub that supports all call types for the service
    */
@@ -303,6 +365,20 @@ public final class FeatureServiceGrpc {
       asyncUnimplementedUnaryCall(getGetAllVideoFeatureMethod(), responseObserver);
     }
 
+    /**
+     */
+    public void getUserFeatureInfo(com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest request,
+        io.grpc.stub.StreamObserver<com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse> responseObserver) {
+      asyncUnimplementedUnaryCall(getGetUserFeatureInfoMethod(), responseObserver);
+    }
+
+    /**
+     */
+    public void getVideoFeatureInfo(com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest request,
+        io.grpc.stub.StreamObserver<com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse> responseObserver) {
+      asyncUnimplementedUnaryCall(getGetVideoFeatureInfoMethod(), responseObserver);
+    }
+
     @java.lang.Override public final io.grpc.ServerServiceDefinition bindService() {
       return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor())
           .addMethod(
@@ -347,6 +423,20 @@ public final class FeatureServiceGrpc {
                 com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest,
                 com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse>(
                   this, METHODID_GET_ALL_VIDEO_FEATURE)))
+          .addMethod(
+            getGetUserFeatureInfoMethod(),
+            asyncUnaryCall(
+              new MethodHandlers<
+                com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest,
+                com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse>(
+                  this, METHODID_GET_USER_FEATURE_INFO)))
+          .addMethod(
+            getGetVideoFeatureInfoMethod(),
+            asyncUnaryCall(
+              new MethodHandlers<
+                com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest,
+                com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse>(
+                  this, METHODID_GET_VIDEO_FEATURE_INFO)))
           .build();
     }
   }
@@ -412,6 +502,22 @@ public final class FeatureServiceGrpc {
       asyncUnaryCall(
           getChannel().newCall(getGetAllVideoFeatureMethod(), getCallOptions()), request, responseObserver);
     }
+
+    /**
+     */
+    public void getUserFeatureInfo(com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest request,
+        io.grpc.stub.StreamObserver<com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse> responseObserver) {
+      asyncUnaryCall(
+          getChannel().newCall(getGetUserFeatureInfoMethod(), getCallOptions()), request, responseObserver);
+    }
+
+    /**
+     */
+    public void getVideoFeatureInfo(com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest request,
+        io.grpc.stub.StreamObserver<com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse> responseObserver) {
+      asyncUnaryCall(
+          getChannel().newCall(getGetVideoFeatureInfoMethod(), getCallOptions()), request, responseObserver);
+    }
   }
 
   /**
@@ -469,6 +575,20 @@ public final class FeatureServiceGrpc {
       return blockingUnaryCall(
           getChannel(), getGetAllVideoFeatureMethod(), getCallOptions(), request);
     }
+
+    /**
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse getUserFeatureInfo(com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest request) {
+      return blockingUnaryCall(
+          getChannel(), getGetUserFeatureInfoMethod(), getCallOptions(), request);
+    }
+
+    /**
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse getVideoFeatureInfo(com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest request) {
+      return blockingUnaryCall(
+          getChannel(), getGetVideoFeatureInfoMethod(), getCallOptions(), request);
+    }
   }
 
   /**
@@ -532,6 +652,22 @@ public final class FeatureServiceGrpc {
       return futureUnaryCall(
           getChannel().newCall(getGetAllVideoFeatureMethod(), getCallOptions()), request);
     }
+
+    /**
+     */
+    public com.google.common.util.concurrent.ListenableFuture<com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse> getUserFeatureInfo(
+        com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest request) {
+      return futureUnaryCall(
+          getChannel().newCall(getGetUserFeatureInfoMethod(), getCallOptions()), request);
+    }
+
+    /**
+     */
+    public com.google.common.util.concurrent.ListenableFuture<com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse> getVideoFeatureInfo(
+        com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest request) {
+      return futureUnaryCall(
+          getChannel().newCall(getGetVideoFeatureInfoMethod(), getCallOptions()), request);
+    }
   }
 
   private static final int METHODID_GET_USER_AD_FEATURE = 0;
@@ -540,6 +676,8 @@ public final class FeatureServiceGrpc {
   private static final int METHODID_GET_USER_FEATURE = 3;
   private static final int METHODID_GET_VIDEO_FEATURE = 4;
   private static final int METHODID_GET_ALL_VIDEO_FEATURE = 5;
+  private static final int METHODID_GET_USER_FEATURE_INFO = 6;
+  private static final int METHODID_GET_VIDEO_FEATURE_INFO = 7;
 
   private static final class MethodHandlers<Req, Resp> implements
       io.grpc.stub.ServerCalls.UnaryMethod<Req, Resp>,
@@ -582,6 +720,14 @@ public final class FeatureServiceGrpc {
           serviceImpl.getAllVideoFeature((com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest) request,
               (io.grpc.stub.StreamObserver<com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse>) responseObserver);
           break;
+        case METHODID_GET_USER_FEATURE_INFO:
+          serviceImpl.getUserFeatureInfo((com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest) request,
+              (io.grpc.stub.StreamObserver<com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse>) responseObserver);
+          break;
+        case METHODID_GET_VIDEO_FEATURE_INFO:
+          serviceImpl.getVideoFeatureInfo((com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest) request,
+              (io.grpc.stub.StreamObserver<com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse>) responseObserver);
+          break;
         default:
           throw new AssertionError();
       }
@@ -649,6 +795,8 @@ public final class FeatureServiceGrpc {
               .addMethod(getGetUserFeatureMethod())
               .addMethod(getGetVideoFeatureMethod())
               .addMethod(getGetAllVideoFeatureMethod())
+              .addMethod(getGetUserFeatureInfoMethod())
+              .addMethod(getGetVideoFeatureInfoMethod())
               .build();
         }
       }

+ 3821 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetUserFeatureInfo.java

@@ -0,0 +1,3821 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: com/tzld/piaoquan/recommend/feature/feature.proto
+
+package com.tzld.piaoquan.recommend.feature.model.feature;
+
+/**
+ * Protobuf type {@code GetUserFeatureInfo}
+ */
+public final class GetUserFeatureInfo extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:GetUserFeatureInfo)
+    GetUserFeatureInfoOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use GetUserFeatureInfo.newBuilder() to construct.
+  private GetUserFeatureInfo(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private GetUserFeatureInfo() {
+    mid_ = "";
+    machineinfoBrand_ = "";
+    machineinfoModel_ = "";
+    machineinfoSystem_ = "";
+    machineinfoPlatform_ = "";
+    gender_ = "";
+    country_ = "";
+    province_ = "";
+    city_ = "";
+  }
+
+  @java.lang.Override
+  @SuppressWarnings({"unused"})
+  protected java.lang.Object newInstance(
+      UnusedPrivateParameter unused) {
+    return new GetUserFeatureInfo();
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private GetUserFeatureInfo(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    this();
+    if (extensionRegistry == null) {
+      throw new java.lang.NullPointerException();
+    }
+    com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+        com.google.protobuf.UnknownFieldSet.newBuilder();
+    try {
+      boolean done = false;
+      while (!done) {
+        int tag = input.readTag();
+        switch (tag) {
+          case 0:
+            done = true;
+            break;
+          case 8: {
+
+            u1HourExpCnt_ = input.readInt64();
+            break;
+          }
+          case 16: {
+
+            u1HourClickCnt_ = input.readInt64();
+            break;
+          }
+          case 24: {
+
+            u1HourShareCnt_ = input.readInt64();
+            break;
+          }
+          case 32: {
+
+            u1HourReturnCnt_ = input.readInt64();
+            break;
+          }
+          case 41: {
+
+            uCtr1Hour_ = input.readDouble();
+            break;
+          }
+          case 49: {
+
+            uStr1Hour_ = input.readDouble();
+            break;
+          }
+          case 57: {
+
+            uRov1Hour_ = input.readDouble();
+            break;
+          }
+          case 65: {
+
+            uRos1Hour_ = input.readDouble();
+            break;
+          }
+          case 72: {
+
+            uTodayExpCnt_ = input.readInt64();
+            break;
+          }
+          case 80: {
+
+            uTodayClickCnt_ = input.readInt64();
+            break;
+          }
+          case 88: {
+
+            uTodayShareCnt_ = input.readInt64();
+            break;
+          }
+          case 96: {
+
+            uTodayReturnCnt_ = input.readInt64();
+            break;
+          }
+          case 105: {
+
+            uCtrToday_ = input.readDouble();
+            break;
+          }
+          case 113: {
+
+            uStrToday_ = input.readDouble();
+            break;
+          }
+          case 121: {
+
+            uRovToday_ = input.readDouble();
+            break;
+          }
+          case 129: {
+
+            uRosToday_ = input.readDouble();
+            break;
+          }
+          case 136: {
+
+            u1DayExpCnt_ = input.readInt64();
+            break;
+          }
+          case 144: {
+
+            u1DayClickCnt_ = input.readInt64();
+            break;
+          }
+          case 152: {
+
+            u1DayShareCnt_ = input.readInt64();
+            break;
+          }
+          case 160: {
+
+            u1DayReturnCnt_ = input.readInt64();
+            break;
+          }
+          case 169: {
+
+            uCtr1Day_ = input.readDouble();
+            break;
+          }
+          case 177: {
+
+            uStr1Day_ = input.readDouble();
+            break;
+          }
+          case 185: {
+
+            uRov1Day_ = input.readDouble();
+            break;
+          }
+          case 193: {
+
+            uRos1Day_ = input.readDouble();
+            break;
+          }
+          case 200: {
+
+            u3DayExpCnt_ = input.readInt64();
+            break;
+          }
+          case 208: {
+
+            u3DayClickCnt_ = input.readInt64();
+            break;
+          }
+          case 216: {
+
+            u3DayShareCnt_ = input.readInt64();
+            break;
+          }
+          case 224: {
+
+            u3DayReturnCnt_ = input.readInt64();
+            break;
+          }
+          case 233: {
+
+            uCtr3Day_ = input.readDouble();
+            break;
+          }
+          case 241: {
+
+            uStr3Day_ = input.readDouble();
+            break;
+          }
+          case 249: {
+
+            uRov3Day_ = input.readDouble();
+            break;
+          }
+          case 257: {
+
+            uRos3Day_ = input.readDouble();
+            break;
+          }
+          case 266: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            mid_ = s;
+            break;
+          }
+          case 274: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            machineinfoBrand_ = s;
+            break;
+          }
+          case 282: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            machineinfoModel_ = s;
+            break;
+          }
+          case 290: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            machineinfoSystem_ = s;
+            break;
+          }
+          case 298: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            machineinfoPlatform_ = s;
+            break;
+          }
+          case 306: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            gender_ = s;
+            break;
+          }
+          case 314: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            country_ = s;
+            break;
+          }
+          case 322: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            province_ = s;
+            break;
+          }
+          case 330: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            city_ = s;
+            break;
+          }
+          default: {
+            if (!parseUnknownField(
+                input, unknownFields, extensionRegistry, tag)) {
+              done = true;
+            }
+            break;
+          }
+        }
+      }
+    } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+      throw e.setUnfinishedMessage(this);
+    } catch (java.io.IOException e) {
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
+    } finally {
+      this.unknownFields = unknownFields.build();
+      makeExtensionsImmutable();
+    }
+  }
+  public static final com.google.protobuf.Descriptors.Descriptor
+      getDescriptor() {
+    return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetUserFeatureInfo_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetUserFeatureInfo_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo.class, com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo.Builder.class);
+  }
+
+  public static final int U1HOUR_EXP_CNT_FIELD_NUMBER = 1;
+  private long u1HourExpCnt_;
+  /**
+   * <pre>
+   *过去一小时
+   * </pre>
+   *
+   * <code>int64 u1hour_exp_cnt = 1;</code>
+   * @return The u1hourExpCnt.
+   */
+  @java.lang.Override
+  public long getU1HourExpCnt() {
+    return u1HourExpCnt_;
+  }
+
+  public static final int U1HOUR_CLICK_CNT_FIELD_NUMBER = 2;
+  private long u1HourClickCnt_;
+  /**
+   * <code>int64 u1hour_click_cnt = 2;</code>
+   * @return The u1hourClickCnt.
+   */
+  @java.lang.Override
+  public long getU1HourClickCnt() {
+    return u1HourClickCnt_;
+  }
+
+  public static final int U1HOUR_SHARE_CNT_FIELD_NUMBER = 3;
+  private long u1HourShareCnt_;
+  /**
+   * <code>int64 u1hour_share_cnt = 3;</code>
+   * @return The u1hourShareCnt.
+   */
+  @java.lang.Override
+  public long getU1HourShareCnt() {
+    return u1HourShareCnt_;
+  }
+
+  public static final int U1HOUR_RETURN_CNT_FIELD_NUMBER = 4;
+  private long u1HourReturnCnt_;
+  /**
+   * <code>int64 u1hour_return_cnt = 4;</code>
+   * @return The u1hourReturnCnt.
+   */
+  @java.lang.Override
+  public long getU1HourReturnCnt() {
+    return u1HourReturnCnt_;
+  }
+
+  public static final int U_CTR1HOUR_FIELD_NUMBER = 5;
+  private double uCtr1Hour_;
+  /**
+   * <code>double u_ctr1hour = 5;</code>
+   * @return The uCtr1hour.
+   */
+  @java.lang.Override
+  public double getUCtr1Hour() {
+    return uCtr1Hour_;
+  }
+
+  public static final int U_STR1HOUR_FIELD_NUMBER = 6;
+  private double uStr1Hour_;
+  /**
+   * <code>double u_str1hour = 6;</code>
+   * @return The uStr1hour.
+   */
+  @java.lang.Override
+  public double getUStr1Hour() {
+    return uStr1Hour_;
+  }
+
+  public static final int U_ROV1HOUR_FIELD_NUMBER = 7;
+  private double uRov1Hour_;
+  /**
+   * <code>double u_rov1hour = 7;</code>
+   * @return The uRov1hour.
+   */
+  @java.lang.Override
+  public double getURov1Hour() {
+    return uRov1Hour_;
+  }
+
+  public static final int U_ROS1HOUR_FIELD_NUMBER = 8;
+  private double uRos1Hour_;
+  /**
+   * <code>double u_ros1hour = 8;</code>
+   * @return The uRos1hour.
+   */
+  @java.lang.Override
+  public double getURos1Hour() {
+    return uRos1Hour_;
+  }
+
+  public static final int U_TODAY_EXP_CNT_FIELD_NUMBER = 9;
+  private long uTodayExpCnt_;
+  /**
+   * <pre>
+   *今天
+   * </pre>
+   *
+   * <code>int64 u_today_exp_cnt = 9;</code>
+   * @return The uTodayExpCnt.
+   */
+  @java.lang.Override
+  public long getUTodayExpCnt() {
+    return uTodayExpCnt_;
+  }
+
+  public static final int U_TODAY_CLICK_CNT_FIELD_NUMBER = 10;
+  private long uTodayClickCnt_;
+  /**
+   * <code>int64 u_today_click_cnt = 10;</code>
+   * @return The uTodayClickCnt.
+   */
+  @java.lang.Override
+  public long getUTodayClickCnt() {
+    return uTodayClickCnt_;
+  }
+
+  public static final int U_TODAY_SHARE_CNT_FIELD_NUMBER = 11;
+  private long uTodayShareCnt_;
+  /**
+   * <code>int64 u_today_share_cnt = 11;</code>
+   * @return The uTodayShareCnt.
+   */
+  @java.lang.Override
+  public long getUTodayShareCnt() {
+    return uTodayShareCnt_;
+  }
+
+  public static final int U_TODAY_RETURN_CNT_FIELD_NUMBER = 12;
+  private long uTodayReturnCnt_;
+  /**
+   * <code>int64 u_today_return_cnt = 12;</code>
+   * @return The uTodayReturnCnt.
+   */
+  @java.lang.Override
+  public long getUTodayReturnCnt() {
+    return uTodayReturnCnt_;
+  }
+
+  public static final int U_CTR_TODAY_FIELD_NUMBER = 13;
+  private double uCtrToday_;
+  /**
+   * <code>double u_ctr_today = 13;</code>
+   * @return The uCtrToday.
+   */
+  @java.lang.Override
+  public double getUCtrToday() {
+    return uCtrToday_;
+  }
+
+  public static final int U_STR_TODAY_FIELD_NUMBER = 14;
+  private double uStrToday_;
+  /**
+   * <code>double u_str_today = 14;</code>
+   * @return The uStrToday.
+   */
+  @java.lang.Override
+  public double getUStrToday() {
+    return uStrToday_;
+  }
+
+  public static final int U_ROV_TODAY_FIELD_NUMBER = 15;
+  private double uRovToday_;
+  /**
+   * <code>double u_rov_today = 15;</code>
+   * @return The uRovToday.
+   */
+  @java.lang.Override
+  public double getURovToday() {
+    return uRovToday_;
+  }
+
+  public static final int U_ROS_TODAY_FIELD_NUMBER = 16;
+  private double uRosToday_;
+  /**
+   * <code>double u_ros_today = 16;</code>
+   * @return The uRosToday.
+   */
+  @java.lang.Override
+  public double getURosToday() {
+    return uRosToday_;
+  }
+
+  public static final int U1DAY_EXP_CNT_FIELD_NUMBER = 17;
+  private long u1DayExpCnt_;
+  /**
+   * <pre>
+   *过去一天
+   * </pre>
+   *
+   * <code>int64 u1day_exp_cnt = 17;</code>
+   * @return The u1dayExpCnt.
+   */
+  @java.lang.Override
+  public long getU1DayExpCnt() {
+    return u1DayExpCnt_;
+  }
+
+  public static final int U1DAY_CLICK_CNT_FIELD_NUMBER = 18;
+  private long u1DayClickCnt_;
+  /**
+   * <code>int64 u1day_click_cnt = 18;</code>
+   * @return The u1dayClickCnt.
+   */
+  @java.lang.Override
+  public long getU1DayClickCnt() {
+    return u1DayClickCnt_;
+  }
+
+  public static final int U1DAY_SHARE_CNT_FIELD_NUMBER = 19;
+  private long u1DayShareCnt_;
+  /**
+   * <code>int64 u1day_share_cnt = 19;</code>
+   * @return The u1dayShareCnt.
+   */
+  @java.lang.Override
+  public long getU1DayShareCnt() {
+    return u1DayShareCnt_;
+  }
+
+  public static final int U1DAY_RETURN_CNT_FIELD_NUMBER = 20;
+  private long u1DayReturnCnt_;
+  /**
+   * <code>int64 u1day_return_cnt = 20;</code>
+   * @return The u1dayReturnCnt.
+   */
+  @java.lang.Override
+  public long getU1DayReturnCnt() {
+    return u1DayReturnCnt_;
+  }
+
+  public static final int U_CTR1DAY_FIELD_NUMBER = 21;
+  private double uCtr1Day_;
+  /**
+   * <code>double u_ctr1day = 21;</code>
+   * @return The uCtr1day.
+   */
+  @java.lang.Override
+  public double getUCtr1Day() {
+    return uCtr1Day_;
+  }
+
+  public static final int U_STR1DAY_FIELD_NUMBER = 22;
+  private double uStr1Day_;
+  /**
+   * <code>double u_str1day = 22;</code>
+   * @return The uStr1day.
+   */
+  @java.lang.Override
+  public double getUStr1Day() {
+    return uStr1Day_;
+  }
+
+  public static final int U_ROV1DAY_FIELD_NUMBER = 23;
+  private double uRov1Day_;
+  /**
+   * <code>double u_rov1day = 23;</code>
+   * @return The uRov1day.
+   */
+  @java.lang.Override
+  public double getURov1Day() {
+    return uRov1Day_;
+  }
+
+  public static final int U_ROS1DAY_FIELD_NUMBER = 24;
+  private double uRos1Day_;
+  /**
+   * <code>double u_ros1day = 24;</code>
+   * @return The uRos1day.
+   */
+  @java.lang.Override
+  public double getURos1Day() {
+    return uRos1Day_;
+  }
+
+  public static final int U3DAY_EXP_CNT_FIELD_NUMBER = 25;
+  private long u3DayExpCnt_;
+  /**
+   * <pre>
+   *过去三天
+   * </pre>
+   *
+   * <code>int64 u3day_exp_cnt = 25;</code>
+   * @return The u3dayExpCnt.
+   */
+  @java.lang.Override
+  public long getU3DayExpCnt() {
+    return u3DayExpCnt_;
+  }
+
+  public static final int U3DAY_CLICK_CNT_FIELD_NUMBER = 26;
+  private long u3DayClickCnt_;
+  /**
+   * <code>int64 u3day_click_cnt = 26;</code>
+   * @return The u3dayClickCnt.
+   */
+  @java.lang.Override
+  public long getU3DayClickCnt() {
+    return u3DayClickCnt_;
+  }
+
+  public static final int U3DAY_SHARE_CNT_FIELD_NUMBER = 27;
+  private long u3DayShareCnt_;
+  /**
+   * <code>int64 u3day_share_cnt = 27;</code>
+   * @return The u3dayShareCnt.
+   */
+  @java.lang.Override
+  public long getU3DayShareCnt() {
+    return u3DayShareCnt_;
+  }
+
+  public static final int U3DAY_RETURN_CNT_FIELD_NUMBER = 28;
+  private long u3DayReturnCnt_;
+  /**
+   * <code>int64 u3day_return_cnt = 28;</code>
+   * @return The u3dayReturnCnt.
+   */
+  @java.lang.Override
+  public long getU3DayReturnCnt() {
+    return u3DayReturnCnt_;
+  }
+
+  public static final int U_CTR3DAY_FIELD_NUMBER = 29;
+  private double uCtr3Day_;
+  /**
+   * <code>double u_ctr3day = 29;</code>
+   * @return The uCtr3day.
+   */
+  @java.lang.Override
+  public double getUCtr3Day() {
+    return uCtr3Day_;
+  }
+
+  public static final int U_STR3DAY_FIELD_NUMBER = 30;
+  private double uStr3Day_;
+  /**
+   * <code>double u_str3day = 30;</code>
+   * @return The uStr3day.
+   */
+  @java.lang.Override
+  public double getUStr3Day() {
+    return uStr3Day_;
+  }
+
+  public static final int U_ROV3DAY_FIELD_NUMBER = 31;
+  private double uRov3Day_;
+  /**
+   * <code>double u_rov3day = 31;</code>
+   * @return The uRov3day.
+   */
+  @java.lang.Override
+  public double getURov3Day() {
+    return uRov3Day_;
+  }
+
+  public static final int U_ROS3DAY_FIELD_NUMBER = 32;
+  private double uRos3Day_;
+  /**
+   * <code>double u_ros3day = 32;</code>
+   * @return The uRos3day.
+   */
+  @java.lang.Override
+  public double getURos3Day() {
+    return uRos3Day_;
+  }
+
+  public static final int MID_FIELD_NUMBER = 33;
+  private volatile java.lang.Object mid_;
+  /**
+   * <code>string mid = 33;</code>
+   * @return The mid.
+   */
+  @java.lang.Override
+  public java.lang.String getMid() {
+    java.lang.Object ref = mid_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      mid_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string mid = 33;</code>
+   * @return The bytes for mid.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getMidBytes() {
+    java.lang.Object ref = mid_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      mid_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int MACHINEINFO_BRAND_FIELD_NUMBER = 34;
+  private volatile java.lang.Object machineinfoBrand_;
+  /**
+   * <code>string machineinfo_brand = 34;</code>
+   * @return The machineinfoBrand.
+   */
+  @java.lang.Override
+  public java.lang.String getMachineinfoBrand() {
+    java.lang.Object ref = machineinfoBrand_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      machineinfoBrand_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string machineinfo_brand = 34;</code>
+   * @return The bytes for machineinfoBrand.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getMachineinfoBrandBytes() {
+    java.lang.Object ref = machineinfoBrand_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      machineinfoBrand_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int MACHINEINFO_MODEL_FIELD_NUMBER = 35;
+  private volatile java.lang.Object machineinfoModel_;
+  /**
+   * <code>string machineinfo_model = 35;</code>
+   * @return The machineinfoModel.
+   */
+  @java.lang.Override
+  public java.lang.String getMachineinfoModel() {
+    java.lang.Object ref = machineinfoModel_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      machineinfoModel_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string machineinfo_model = 35;</code>
+   * @return The bytes for machineinfoModel.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getMachineinfoModelBytes() {
+    java.lang.Object ref = machineinfoModel_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      machineinfoModel_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int MACHINEINFO_SYSTEM_FIELD_NUMBER = 36;
+  private volatile java.lang.Object machineinfoSystem_;
+  /**
+   * <code>string machineinfo_system = 36;</code>
+   * @return The machineinfoSystem.
+   */
+  @java.lang.Override
+  public java.lang.String getMachineinfoSystem() {
+    java.lang.Object ref = machineinfoSystem_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      machineinfoSystem_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string machineinfo_system = 36;</code>
+   * @return The bytes for machineinfoSystem.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getMachineinfoSystemBytes() {
+    java.lang.Object ref = machineinfoSystem_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      machineinfoSystem_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int MACHINEINFO_PLATFORM_FIELD_NUMBER = 37;
+  private volatile java.lang.Object machineinfoPlatform_;
+  /**
+   * <code>string machineinfo_platform = 37;</code>
+   * @return The machineinfoPlatform.
+   */
+  @java.lang.Override
+  public java.lang.String getMachineinfoPlatform() {
+    java.lang.Object ref = machineinfoPlatform_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      machineinfoPlatform_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string machineinfo_platform = 37;</code>
+   * @return The bytes for machineinfoPlatform.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getMachineinfoPlatformBytes() {
+    java.lang.Object ref = machineinfoPlatform_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      machineinfoPlatform_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int GENDER_FIELD_NUMBER = 38;
+  private volatile java.lang.Object gender_;
+  /**
+   * <code>string gender = 38;</code>
+   * @return The gender.
+   */
+  @java.lang.Override
+  public java.lang.String getGender() {
+    java.lang.Object ref = gender_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      gender_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string gender = 38;</code>
+   * @return The bytes for gender.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getGenderBytes() {
+    java.lang.Object ref = gender_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      gender_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int COUNTRY_FIELD_NUMBER = 39;
+  private volatile java.lang.Object country_;
+  /**
+   * <code>string country = 39;</code>
+   * @return The country.
+   */
+  @java.lang.Override
+  public java.lang.String getCountry() {
+    java.lang.Object ref = country_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      country_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string country = 39;</code>
+   * @return The bytes for country.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getCountryBytes() {
+    java.lang.Object ref = country_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      country_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int PROVINCE_FIELD_NUMBER = 40;
+  private volatile java.lang.Object province_;
+  /**
+   * <code>string province = 40;</code>
+   * @return The province.
+   */
+  @java.lang.Override
+  public java.lang.String getProvince() {
+    java.lang.Object ref = province_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      province_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string province = 40;</code>
+   * @return The bytes for province.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getProvinceBytes() {
+    java.lang.Object ref = province_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      province_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int CITY_FIELD_NUMBER = 41;
+  private volatile java.lang.Object city_;
+  /**
+   * <code>string city = 41;</code>
+   * @return The city.
+   */
+  @java.lang.Override
+  public java.lang.String getCity() {
+    java.lang.Object ref = city_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      city_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string city = 41;</code>
+   * @return The bytes for city.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getCityBytes() {
+    java.lang.Object ref = city_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      city_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  private byte memoizedIsInitialized = -1;
+  @java.lang.Override
+  public final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
+  }
+
+  @java.lang.Override
+  public void writeTo(com.google.protobuf.CodedOutputStream output)
+                      throws java.io.IOException {
+    if (u1HourExpCnt_ != 0L) {
+      output.writeInt64(1, u1HourExpCnt_);
+    }
+    if (u1HourClickCnt_ != 0L) {
+      output.writeInt64(2, u1HourClickCnt_);
+    }
+    if (u1HourShareCnt_ != 0L) {
+      output.writeInt64(3, u1HourShareCnt_);
+    }
+    if (u1HourReturnCnt_ != 0L) {
+      output.writeInt64(4, u1HourReturnCnt_);
+    }
+    if (uCtr1Hour_ != 0D) {
+      output.writeDouble(5, uCtr1Hour_);
+    }
+    if (uStr1Hour_ != 0D) {
+      output.writeDouble(6, uStr1Hour_);
+    }
+    if (uRov1Hour_ != 0D) {
+      output.writeDouble(7, uRov1Hour_);
+    }
+    if (uRos1Hour_ != 0D) {
+      output.writeDouble(8, uRos1Hour_);
+    }
+    if (uTodayExpCnt_ != 0L) {
+      output.writeInt64(9, uTodayExpCnt_);
+    }
+    if (uTodayClickCnt_ != 0L) {
+      output.writeInt64(10, uTodayClickCnt_);
+    }
+    if (uTodayShareCnt_ != 0L) {
+      output.writeInt64(11, uTodayShareCnt_);
+    }
+    if (uTodayReturnCnt_ != 0L) {
+      output.writeInt64(12, uTodayReturnCnt_);
+    }
+    if (uCtrToday_ != 0D) {
+      output.writeDouble(13, uCtrToday_);
+    }
+    if (uStrToday_ != 0D) {
+      output.writeDouble(14, uStrToday_);
+    }
+    if (uRovToday_ != 0D) {
+      output.writeDouble(15, uRovToday_);
+    }
+    if (uRosToday_ != 0D) {
+      output.writeDouble(16, uRosToday_);
+    }
+    if (u1DayExpCnt_ != 0L) {
+      output.writeInt64(17, u1DayExpCnt_);
+    }
+    if (u1DayClickCnt_ != 0L) {
+      output.writeInt64(18, u1DayClickCnt_);
+    }
+    if (u1DayShareCnt_ != 0L) {
+      output.writeInt64(19, u1DayShareCnt_);
+    }
+    if (u1DayReturnCnt_ != 0L) {
+      output.writeInt64(20, u1DayReturnCnt_);
+    }
+    if (uCtr1Day_ != 0D) {
+      output.writeDouble(21, uCtr1Day_);
+    }
+    if (uStr1Day_ != 0D) {
+      output.writeDouble(22, uStr1Day_);
+    }
+    if (uRov1Day_ != 0D) {
+      output.writeDouble(23, uRov1Day_);
+    }
+    if (uRos1Day_ != 0D) {
+      output.writeDouble(24, uRos1Day_);
+    }
+    if (u3DayExpCnt_ != 0L) {
+      output.writeInt64(25, u3DayExpCnt_);
+    }
+    if (u3DayClickCnt_ != 0L) {
+      output.writeInt64(26, u3DayClickCnt_);
+    }
+    if (u3DayShareCnt_ != 0L) {
+      output.writeInt64(27, u3DayShareCnt_);
+    }
+    if (u3DayReturnCnt_ != 0L) {
+      output.writeInt64(28, u3DayReturnCnt_);
+    }
+    if (uCtr3Day_ != 0D) {
+      output.writeDouble(29, uCtr3Day_);
+    }
+    if (uStr3Day_ != 0D) {
+      output.writeDouble(30, uStr3Day_);
+    }
+    if (uRov3Day_ != 0D) {
+      output.writeDouble(31, uRov3Day_);
+    }
+    if (uRos3Day_ != 0D) {
+      output.writeDouble(32, uRos3Day_);
+    }
+    if (!getMidBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 33, mid_);
+    }
+    if (!getMachineinfoBrandBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 34, machineinfoBrand_);
+    }
+    if (!getMachineinfoModelBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 35, machineinfoModel_);
+    }
+    if (!getMachineinfoSystemBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 36, machineinfoSystem_);
+    }
+    if (!getMachineinfoPlatformBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 37, machineinfoPlatform_);
+    }
+    if (!getGenderBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 38, gender_);
+    }
+    if (!getCountryBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 39, country_);
+    }
+    if (!getProvinceBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 40, province_);
+    }
+    if (!getCityBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 41, city_);
+    }
+    unknownFields.writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    if (u1HourExpCnt_ != 0L) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt64Size(1, u1HourExpCnt_);
+    }
+    if (u1HourClickCnt_ != 0L) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt64Size(2, u1HourClickCnt_);
+    }
+    if (u1HourShareCnt_ != 0L) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt64Size(3, u1HourShareCnt_);
+    }
+    if (u1HourReturnCnt_ != 0L) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt64Size(4, u1HourReturnCnt_);
+    }
+    if (uCtr1Hour_ != 0D) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeDoubleSize(5, uCtr1Hour_);
+    }
+    if (uStr1Hour_ != 0D) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeDoubleSize(6, uStr1Hour_);
+    }
+    if (uRov1Hour_ != 0D) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeDoubleSize(7, uRov1Hour_);
+    }
+    if (uRos1Hour_ != 0D) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeDoubleSize(8, uRos1Hour_);
+    }
+    if (uTodayExpCnt_ != 0L) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt64Size(9, uTodayExpCnt_);
+    }
+    if (uTodayClickCnt_ != 0L) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt64Size(10, uTodayClickCnt_);
+    }
+    if (uTodayShareCnt_ != 0L) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt64Size(11, uTodayShareCnt_);
+    }
+    if (uTodayReturnCnt_ != 0L) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt64Size(12, uTodayReturnCnt_);
+    }
+    if (uCtrToday_ != 0D) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeDoubleSize(13, uCtrToday_);
+    }
+    if (uStrToday_ != 0D) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeDoubleSize(14, uStrToday_);
+    }
+    if (uRovToday_ != 0D) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeDoubleSize(15, uRovToday_);
+    }
+    if (uRosToday_ != 0D) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeDoubleSize(16, uRosToday_);
+    }
+    if (u1DayExpCnt_ != 0L) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt64Size(17, u1DayExpCnt_);
+    }
+    if (u1DayClickCnt_ != 0L) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt64Size(18, u1DayClickCnt_);
+    }
+    if (u1DayShareCnt_ != 0L) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt64Size(19, u1DayShareCnt_);
+    }
+    if (u1DayReturnCnt_ != 0L) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt64Size(20, u1DayReturnCnt_);
+    }
+    if (uCtr1Day_ != 0D) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeDoubleSize(21, uCtr1Day_);
+    }
+    if (uStr1Day_ != 0D) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeDoubleSize(22, uStr1Day_);
+    }
+    if (uRov1Day_ != 0D) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeDoubleSize(23, uRov1Day_);
+    }
+    if (uRos1Day_ != 0D) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeDoubleSize(24, uRos1Day_);
+    }
+    if (u3DayExpCnt_ != 0L) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt64Size(25, u3DayExpCnt_);
+    }
+    if (u3DayClickCnt_ != 0L) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt64Size(26, u3DayClickCnt_);
+    }
+    if (u3DayShareCnt_ != 0L) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt64Size(27, u3DayShareCnt_);
+    }
+    if (u3DayReturnCnt_ != 0L) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt64Size(28, u3DayReturnCnt_);
+    }
+    if (uCtr3Day_ != 0D) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeDoubleSize(29, uCtr3Day_);
+    }
+    if (uStr3Day_ != 0D) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeDoubleSize(30, uStr3Day_);
+    }
+    if (uRov3Day_ != 0D) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeDoubleSize(31, uRov3Day_);
+    }
+    if (uRos3Day_ != 0D) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeDoubleSize(32, uRos3Day_);
+    }
+    if (!getMidBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(33, mid_);
+    }
+    if (!getMachineinfoBrandBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(34, machineinfoBrand_);
+    }
+    if (!getMachineinfoModelBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(35, machineinfoModel_);
+    }
+    if (!getMachineinfoSystemBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(36, machineinfoSystem_);
+    }
+    if (!getMachineinfoPlatformBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(37, machineinfoPlatform_);
+    }
+    if (!getGenderBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(38, gender_);
+    }
+    if (!getCountryBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(39, country_);
+    }
+    if (!getProvinceBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(40, province_);
+    }
+    if (!getCityBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(41, city_);
+    }
+    size += unknownFields.getSerializedSize();
+    memoizedSize = size;
+    return size;
+  }
+
+  @java.lang.Override
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+     return true;
+    }
+    if (!(obj instanceof com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo)) {
+      return super.equals(obj);
+    }
+    com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo other = (com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo) obj;
+
+    if (getU1HourExpCnt()
+        != other.getU1HourExpCnt()) return false;
+    if (getU1HourClickCnt()
+        != other.getU1HourClickCnt()) return false;
+    if (getU1HourShareCnt()
+        != other.getU1HourShareCnt()) return false;
+    if (getU1HourReturnCnt()
+        != other.getU1HourReturnCnt()) return false;
+    if (java.lang.Double.doubleToLongBits(getUCtr1Hour())
+        != java.lang.Double.doubleToLongBits(
+            other.getUCtr1Hour())) return false;
+    if (java.lang.Double.doubleToLongBits(getUStr1Hour())
+        != java.lang.Double.doubleToLongBits(
+            other.getUStr1Hour())) return false;
+    if (java.lang.Double.doubleToLongBits(getURov1Hour())
+        != java.lang.Double.doubleToLongBits(
+            other.getURov1Hour())) return false;
+    if (java.lang.Double.doubleToLongBits(getURos1Hour())
+        != java.lang.Double.doubleToLongBits(
+            other.getURos1Hour())) return false;
+    if (getUTodayExpCnt()
+        != other.getUTodayExpCnt()) return false;
+    if (getUTodayClickCnt()
+        != other.getUTodayClickCnt()) return false;
+    if (getUTodayShareCnt()
+        != other.getUTodayShareCnt()) return false;
+    if (getUTodayReturnCnt()
+        != other.getUTodayReturnCnt()) return false;
+    if (java.lang.Double.doubleToLongBits(getUCtrToday())
+        != java.lang.Double.doubleToLongBits(
+            other.getUCtrToday())) return false;
+    if (java.lang.Double.doubleToLongBits(getUStrToday())
+        != java.lang.Double.doubleToLongBits(
+            other.getUStrToday())) return false;
+    if (java.lang.Double.doubleToLongBits(getURovToday())
+        != java.lang.Double.doubleToLongBits(
+            other.getURovToday())) return false;
+    if (java.lang.Double.doubleToLongBits(getURosToday())
+        != java.lang.Double.doubleToLongBits(
+            other.getURosToday())) return false;
+    if (getU1DayExpCnt()
+        != other.getU1DayExpCnt()) return false;
+    if (getU1DayClickCnt()
+        != other.getU1DayClickCnt()) return false;
+    if (getU1DayShareCnt()
+        != other.getU1DayShareCnt()) return false;
+    if (getU1DayReturnCnt()
+        != other.getU1DayReturnCnt()) return false;
+    if (java.lang.Double.doubleToLongBits(getUCtr1Day())
+        != java.lang.Double.doubleToLongBits(
+            other.getUCtr1Day())) return false;
+    if (java.lang.Double.doubleToLongBits(getUStr1Day())
+        != java.lang.Double.doubleToLongBits(
+            other.getUStr1Day())) return false;
+    if (java.lang.Double.doubleToLongBits(getURov1Day())
+        != java.lang.Double.doubleToLongBits(
+            other.getURov1Day())) return false;
+    if (java.lang.Double.doubleToLongBits(getURos1Day())
+        != java.lang.Double.doubleToLongBits(
+            other.getURos1Day())) return false;
+    if (getU3DayExpCnt()
+        != other.getU3DayExpCnt()) return false;
+    if (getU3DayClickCnt()
+        != other.getU3DayClickCnt()) return false;
+    if (getU3DayShareCnt()
+        != other.getU3DayShareCnt()) return false;
+    if (getU3DayReturnCnt()
+        != other.getU3DayReturnCnt()) return false;
+    if (java.lang.Double.doubleToLongBits(getUCtr3Day())
+        != java.lang.Double.doubleToLongBits(
+            other.getUCtr3Day())) return false;
+    if (java.lang.Double.doubleToLongBits(getUStr3Day())
+        != java.lang.Double.doubleToLongBits(
+            other.getUStr3Day())) return false;
+    if (java.lang.Double.doubleToLongBits(getURov3Day())
+        != java.lang.Double.doubleToLongBits(
+            other.getURov3Day())) return false;
+    if (java.lang.Double.doubleToLongBits(getURos3Day())
+        != java.lang.Double.doubleToLongBits(
+            other.getURos3Day())) return false;
+    if (!getMid()
+        .equals(other.getMid())) return false;
+    if (!getMachineinfoBrand()
+        .equals(other.getMachineinfoBrand())) return false;
+    if (!getMachineinfoModel()
+        .equals(other.getMachineinfoModel())) return false;
+    if (!getMachineinfoSystem()
+        .equals(other.getMachineinfoSystem())) return false;
+    if (!getMachineinfoPlatform()
+        .equals(other.getMachineinfoPlatform())) return false;
+    if (!getGender()
+        .equals(other.getGender())) return false;
+    if (!getCountry()
+        .equals(other.getCountry())) return false;
+    if (!getProvince()
+        .equals(other.getProvince())) return false;
+    if (!getCity()
+        .equals(other.getCity())) return false;
+    if (!unknownFields.equals(other.unknownFields)) return false;
+    return true;
+  }
+
+  @java.lang.Override
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
+    }
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    hash = (37 * hash) + U1HOUR_EXP_CNT_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        getU1HourExpCnt());
+    hash = (37 * hash) + U1HOUR_CLICK_CNT_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        getU1HourClickCnt());
+    hash = (37 * hash) + U1HOUR_SHARE_CNT_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        getU1HourShareCnt());
+    hash = (37 * hash) + U1HOUR_RETURN_CNT_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        getU1HourReturnCnt());
+    hash = (37 * hash) + U_CTR1HOUR_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        java.lang.Double.doubleToLongBits(getUCtr1Hour()));
+    hash = (37 * hash) + U_STR1HOUR_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        java.lang.Double.doubleToLongBits(getUStr1Hour()));
+    hash = (37 * hash) + U_ROV1HOUR_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        java.lang.Double.doubleToLongBits(getURov1Hour()));
+    hash = (37 * hash) + U_ROS1HOUR_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        java.lang.Double.doubleToLongBits(getURos1Hour()));
+    hash = (37 * hash) + U_TODAY_EXP_CNT_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        getUTodayExpCnt());
+    hash = (37 * hash) + U_TODAY_CLICK_CNT_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        getUTodayClickCnt());
+    hash = (37 * hash) + U_TODAY_SHARE_CNT_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        getUTodayShareCnt());
+    hash = (37 * hash) + U_TODAY_RETURN_CNT_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        getUTodayReturnCnt());
+    hash = (37 * hash) + U_CTR_TODAY_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        java.lang.Double.doubleToLongBits(getUCtrToday()));
+    hash = (37 * hash) + U_STR_TODAY_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        java.lang.Double.doubleToLongBits(getUStrToday()));
+    hash = (37 * hash) + U_ROV_TODAY_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        java.lang.Double.doubleToLongBits(getURovToday()));
+    hash = (37 * hash) + U_ROS_TODAY_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        java.lang.Double.doubleToLongBits(getURosToday()));
+    hash = (37 * hash) + U1DAY_EXP_CNT_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        getU1DayExpCnt());
+    hash = (37 * hash) + U1DAY_CLICK_CNT_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        getU1DayClickCnt());
+    hash = (37 * hash) + U1DAY_SHARE_CNT_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        getU1DayShareCnt());
+    hash = (37 * hash) + U1DAY_RETURN_CNT_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        getU1DayReturnCnt());
+    hash = (37 * hash) + U_CTR1DAY_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        java.lang.Double.doubleToLongBits(getUCtr1Day()));
+    hash = (37 * hash) + U_STR1DAY_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        java.lang.Double.doubleToLongBits(getUStr1Day()));
+    hash = (37 * hash) + U_ROV1DAY_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        java.lang.Double.doubleToLongBits(getURov1Day()));
+    hash = (37 * hash) + U_ROS1DAY_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        java.lang.Double.doubleToLongBits(getURos1Day()));
+    hash = (37 * hash) + U3DAY_EXP_CNT_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        getU3DayExpCnt());
+    hash = (37 * hash) + U3DAY_CLICK_CNT_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        getU3DayClickCnt());
+    hash = (37 * hash) + U3DAY_SHARE_CNT_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        getU3DayShareCnt());
+    hash = (37 * hash) + U3DAY_RETURN_CNT_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        getU3DayReturnCnt());
+    hash = (37 * hash) + U_CTR3DAY_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        java.lang.Double.doubleToLongBits(getUCtr3Day()));
+    hash = (37 * hash) + U_STR3DAY_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        java.lang.Double.doubleToLongBits(getUStr3Day()));
+    hash = (37 * hash) + U_ROV3DAY_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        java.lang.Double.doubleToLongBits(getURov3Day()));
+    hash = (37 * hash) + U_ROS3DAY_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        java.lang.Double.doubleToLongBits(getURos3Day()));
+    hash = (37 * hash) + MID_FIELD_NUMBER;
+    hash = (53 * hash) + getMid().hashCode();
+    hash = (37 * hash) + MACHINEINFO_BRAND_FIELD_NUMBER;
+    hash = (53 * hash) + getMachineinfoBrand().hashCode();
+    hash = (37 * hash) + MACHINEINFO_MODEL_FIELD_NUMBER;
+    hash = (53 * hash) + getMachineinfoModel().hashCode();
+    hash = (37 * hash) + MACHINEINFO_SYSTEM_FIELD_NUMBER;
+    hash = (53 * hash) + getMachineinfoSystem().hashCode();
+    hash = (37 * hash) + MACHINEINFO_PLATFORM_FIELD_NUMBER;
+    hash = (53 * hash) + getMachineinfoPlatform().hashCode();
+    hash = (37 * hash) + GENDER_FIELD_NUMBER;
+    hash = (53 * hash) + getGender().hashCode();
+    hash = (37 * hash) + COUNTRY_FIELD_NUMBER;
+    hash = (53 * hash) + getCountry().hashCode();
+    hash = (37 * hash) + PROVINCE_FIELD_NUMBER;
+    hash = (53 * hash) + getProvince().hashCode();
+    hash = (37 * hash) + CITY_FIELD_NUMBER;
+    hash = (53 * hash) + getCity().hashCode();
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo parseFrom(
+      java.nio.ByteBuffer data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo parseFrom(
+      com.google.protobuf.ByteString data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo parseFrom(
+      byte[] data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo parseFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo parseFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo parseDelimitedFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo parseDelimitedFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo parseFrom(
+      com.google.protobuf.CodedInputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo parseFrom(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+
+  @java.lang.Override
+  public Builder newBuilderForType() { return newBuilder(); }
+  public static Builder newBuilder() {
+    return DEFAULT_INSTANCE.toBuilder();
+  }
+  public static Builder newBuilder(com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo prototype) {
+    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+  }
+  @java.lang.Override
+  public Builder toBuilder() {
+    return this == DEFAULT_INSTANCE
+        ? new Builder() : new Builder().mergeFrom(this);
+  }
+
+  @java.lang.Override
+  protected Builder newBuilderForType(
+      com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
+  }
+  /**
+   * Protobuf type {@code GetUserFeatureInfo}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:GetUserFeatureInfo)
+      com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetUserFeatureInfo_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetUserFeatureInfo_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo.class, com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo.Builder.class);
+    }
+
+    // Construct using com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo.newBuilder()
+    private Builder() {
+      maybeForceBuilderInitialization();
+    }
+
+    private Builder(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+      maybeForceBuilderInitialization();
+    }
+    private void maybeForceBuilderInitialization() {
+      if (com.google.protobuf.GeneratedMessageV3
+              .alwaysUseFieldBuilders) {
+      }
+    }
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      u1HourExpCnt_ = 0L;
+
+      u1HourClickCnt_ = 0L;
+
+      u1HourShareCnt_ = 0L;
+
+      u1HourReturnCnt_ = 0L;
+
+      uCtr1Hour_ = 0D;
+
+      uStr1Hour_ = 0D;
+
+      uRov1Hour_ = 0D;
+
+      uRos1Hour_ = 0D;
+
+      uTodayExpCnt_ = 0L;
+
+      uTodayClickCnt_ = 0L;
+
+      uTodayShareCnt_ = 0L;
+
+      uTodayReturnCnt_ = 0L;
+
+      uCtrToday_ = 0D;
+
+      uStrToday_ = 0D;
+
+      uRovToday_ = 0D;
+
+      uRosToday_ = 0D;
+
+      u1DayExpCnt_ = 0L;
+
+      u1DayClickCnt_ = 0L;
+
+      u1DayShareCnt_ = 0L;
+
+      u1DayReturnCnt_ = 0L;
+
+      uCtr1Day_ = 0D;
+
+      uStr1Day_ = 0D;
+
+      uRov1Day_ = 0D;
+
+      uRos1Day_ = 0D;
+
+      u3DayExpCnt_ = 0L;
+
+      u3DayClickCnt_ = 0L;
+
+      u3DayShareCnt_ = 0L;
+
+      u3DayReturnCnt_ = 0L;
+
+      uCtr3Day_ = 0D;
+
+      uStr3Day_ = 0D;
+
+      uRov3Day_ = 0D;
+
+      uRos3Day_ = 0D;
+
+      mid_ = "";
+
+      machineinfoBrand_ = "";
+
+      machineinfoModel_ = "";
+
+      machineinfoSystem_ = "";
+
+      machineinfoPlatform_ = "";
+
+      gender_ = "";
+
+      country_ = "";
+
+      province_ = "";
+
+      city_ = "";
+
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetUserFeatureInfo_descriptor;
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo getDefaultInstanceForType() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo build() {
+      com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo buildPartial() {
+      com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo result = new com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo(this);
+      result.u1HourExpCnt_ = u1HourExpCnt_;
+      result.u1HourClickCnt_ = u1HourClickCnt_;
+      result.u1HourShareCnt_ = u1HourShareCnt_;
+      result.u1HourReturnCnt_ = u1HourReturnCnt_;
+      result.uCtr1Hour_ = uCtr1Hour_;
+      result.uStr1Hour_ = uStr1Hour_;
+      result.uRov1Hour_ = uRov1Hour_;
+      result.uRos1Hour_ = uRos1Hour_;
+      result.uTodayExpCnt_ = uTodayExpCnt_;
+      result.uTodayClickCnt_ = uTodayClickCnt_;
+      result.uTodayShareCnt_ = uTodayShareCnt_;
+      result.uTodayReturnCnt_ = uTodayReturnCnt_;
+      result.uCtrToday_ = uCtrToday_;
+      result.uStrToday_ = uStrToday_;
+      result.uRovToday_ = uRovToday_;
+      result.uRosToday_ = uRosToday_;
+      result.u1DayExpCnt_ = u1DayExpCnt_;
+      result.u1DayClickCnt_ = u1DayClickCnt_;
+      result.u1DayShareCnt_ = u1DayShareCnt_;
+      result.u1DayReturnCnt_ = u1DayReturnCnt_;
+      result.uCtr1Day_ = uCtr1Day_;
+      result.uStr1Day_ = uStr1Day_;
+      result.uRov1Day_ = uRov1Day_;
+      result.uRos1Day_ = uRos1Day_;
+      result.u3DayExpCnt_ = u3DayExpCnt_;
+      result.u3DayClickCnt_ = u3DayClickCnt_;
+      result.u3DayShareCnt_ = u3DayShareCnt_;
+      result.u3DayReturnCnt_ = u3DayReturnCnt_;
+      result.uCtr3Day_ = uCtr3Day_;
+      result.uStr3Day_ = uStr3Day_;
+      result.uRov3Day_ = uRov3Day_;
+      result.uRos3Day_ = uRos3Day_;
+      result.mid_ = mid_;
+      result.machineinfoBrand_ = machineinfoBrand_;
+      result.machineinfoModel_ = machineinfoModel_;
+      result.machineinfoSystem_ = machineinfoSystem_;
+      result.machineinfoPlatform_ = machineinfoPlatform_;
+      result.gender_ = gender_;
+      result.country_ = country_;
+      result.province_ = province_;
+      result.city_ = city_;
+      onBuilt();
+      return result;
+    }
+
+    @java.lang.Override
+    public Builder clone() {
+      return super.clone();
+    }
+    @java.lang.Override
+    public Builder setField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.setField(field, value);
+    }
+    @java.lang.Override
+    public Builder clearField(
+        com.google.protobuf.Descriptors.FieldDescriptor field) {
+      return super.clearField(field);
+    }
+    @java.lang.Override
+    public Builder clearOneof(
+        com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+      return super.clearOneof(oneof);
+    }
+    @java.lang.Override
+    public Builder setRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        int index, java.lang.Object value) {
+      return super.setRepeatedField(field, index, value);
+    }
+    @java.lang.Override
+    public Builder addRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.addRepeatedField(field, value);
+    }
+    @java.lang.Override
+    public Builder mergeFrom(com.google.protobuf.Message other) {
+      if (other instanceof com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo) {
+        return mergeFrom((com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo other) {
+      if (other == com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo.getDefaultInstance()) return this;
+      if (other.getU1HourExpCnt() != 0L) {
+        setU1HourExpCnt(other.getU1HourExpCnt());
+      }
+      if (other.getU1HourClickCnt() != 0L) {
+        setU1HourClickCnt(other.getU1HourClickCnt());
+      }
+      if (other.getU1HourShareCnt() != 0L) {
+        setU1HourShareCnt(other.getU1HourShareCnt());
+      }
+      if (other.getU1HourReturnCnt() != 0L) {
+        setU1HourReturnCnt(other.getU1HourReturnCnt());
+      }
+      if (other.getUCtr1Hour() != 0D) {
+        setUCtr1Hour(other.getUCtr1Hour());
+      }
+      if (other.getUStr1Hour() != 0D) {
+        setUStr1Hour(other.getUStr1Hour());
+      }
+      if (other.getURov1Hour() != 0D) {
+        setURov1Hour(other.getURov1Hour());
+      }
+      if (other.getURos1Hour() != 0D) {
+        setURos1Hour(other.getURos1Hour());
+      }
+      if (other.getUTodayExpCnt() != 0L) {
+        setUTodayExpCnt(other.getUTodayExpCnt());
+      }
+      if (other.getUTodayClickCnt() != 0L) {
+        setUTodayClickCnt(other.getUTodayClickCnt());
+      }
+      if (other.getUTodayShareCnt() != 0L) {
+        setUTodayShareCnt(other.getUTodayShareCnt());
+      }
+      if (other.getUTodayReturnCnt() != 0L) {
+        setUTodayReturnCnt(other.getUTodayReturnCnt());
+      }
+      if (other.getUCtrToday() != 0D) {
+        setUCtrToday(other.getUCtrToday());
+      }
+      if (other.getUStrToday() != 0D) {
+        setUStrToday(other.getUStrToday());
+      }
+      if (other.getURovToday() != 0D) {
+        setURovToday(other.getURovToday());
+      }
+      if (other.getURosToday() != 0D) {
+        setURosToday(other.getURosToday());
+      }
+      if (other.getU1DayExpCnt() != 0L) {
+        setU1DayExpCnt(other.getU1DayExpCnt());
+      }
+      if (other.getU1DayClickCnt() != 0L) {
+        setU1DayClickCnt(other.getU1DayClickCnt());
+      }
+      if (other.getU1DayShareCnt() != 0L) {
+        setU1DayShareCnt(other.getU1DayShareCnt());
+      }
+      if (other.getU1DayReturnCnt() != 0L) {
+        setU1DayReturnCnt(other.getU1DayReturnCnt());
+      }
+      if (other.getUCtr1Day() != 0D) {
+        setUCtr1Day(other.getUCtr1Day());
+      }
+      if (other.getUStr1Day() != 0D) {
+        setUStr1Day(other.getUStr1Day());
+      }
+      if (other.getURov1Day() != 0D) {
+        setURov1Day(other.getURov1Day());
+      }
+      if (other.getURos1Day() != 0D) {
+        setURos1Day(other.getURos1Day());
+      }
+      if (other.getU3DayExpCnt() != 0L) {
+        setU3DayExpCnt(other.getU3DayExpCnt());
+      }
+      if (other.getU3DayClickCnt() != 0L) {
+        setU3DayClickCnt(other.getU3DayClickCnt());
+      }
+      if (other.getU3DayShareCnt() != 0L) {
+        setU3DayShareCnt(other.getU3DayShareCnt());
+      }
+      if (other.getU3DayReturnCnt() != 0L) {
+        setU3DayReturnCnt(other.getU3DayReturnCnt());
+      }
+      if (other.getUCtr3Day() != 0D) {
+        setUCtr3Day(other.getUCtr3Day());
+      }
+      if (other.getUStr3Day() != 0D) {
+        setUStr3Day(other.getUStr3Day());
+      }
+      if (other.getURov3Day() != 0D) {
+        setURov3Day(other.getURov3Day());
+      }
+      if (other.getURos3Day() != 0D) {
+        setURos3Day(other.getURos3Day());
+      }
+      if (!other.getMid().isEmpty()) {
+        mid_ = other.mid_;
+        onChanged();
+      }
+      if (!other.getMachineinfoBrand().isEmpty()) {
+        machineinfoBrand_ = other.machineinfoBrand_;
+        onChanged();
+      }
+      if (!other.getMachineinfoModel().isEmpty()) {
+        machineinfoModel_ = other.machineinfoModel_;
+        onChanged();
+      }
+      if (!other.getMachineinfoSystem().isEmpty()) {
+        machineinfoSystem_ = other.machineinfoSystem_;
+        onChanged();
+      }
+      if (!other.getMachineinfoPlatform().isEmpty()) {
+        machineinfoPlatform_ = other.machineinfoPlatform_;
+        onChanged();
+      }
+      if (!other.getGender().isEmpty()) {
+        gender_ = other.gender_;
+        onChanged();
+      }
+      if (!other.getCountry().isEmpty()) {
+        country_ = other.country_;
+        onChanged();
+      }
+      if (!other.getProvince().isEmpty()) {
+        province_ = other.province_;
+        onChanged();
+      }
+      if (!other.getCity().isEmpty()) {
+        city_ = other.city_;
+        onChanged();
+      }
+      this.mergeUnknownFields(other.unknownFields);
+      onChanged();
+      return this;
+    }
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo) e.getUnfinishedMessage();
+        throw e.unwrapIOException();
+      } finally {
+        if (parsedMessage != null) {
+          mergeFrom(parsedMessage);
+        }
+      }
+      return this;
+    }
+
+    private long u1HourExpCnt_ ;
+    /**
+     * <pre>
+     *过去一小时
+     * </pre>
+     *
+     * <code>int64 u1hour_exp_cnt = 1;</code>
+     * @return The u1hourExpCnt.
+     */
+    @java.lang.Override
+    public long getU1HourExpCnt() {
+      return u1HourExpCnt_;
+    }
+    /**
+     * <pre>
+     *过去一小时
+     * </pre>
+     *
+     * <code>int64 u1hour_exp_cnt = 1;</code>
+     * @param value The u1hourExpCnt to set.
+     * @return This builder for chaining.
+     */
+    public Builder setU1HourExpCnt(long value) {
+      
+      u1HourExpCnt_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     *过去一小时
+     * </pre>
+     *
+     * <code>int64 u1hour_exp_cnt = 1;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearU1HourExpCnt() {
+      
+      u1HourExpCnt_ = 0L;
+      onChanged();
+      return this;
+    }
+
+    private long u1HourClickCnt_ ;
+    /**
+     * <code>int64 u1hour_click_cnt = 2;</code>
+     * @return The u1hourClickCnt.
+     */
+    @java.lang.Override
+    public long getU1HourClickCnt() {
+      return u1HourClickCnt_;
+    }
+    /**
+     * <code>int64 u1hour_click_cnt = 2;</code>
+     * @param value The u1hourClickCnt to set.
+     * @return This builder for chaining.
+     */
+    public Builder setU1HourClickCnt(long value) {
+      
+      u1HourClickCnt_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>int64 u1hour_click_cnt = 2;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearU1HourClickCnt() {
+      
+      u1HourClickCnt_ = 0L;
+      onChanged();
+      return this;
+    }
+
+    private long u1HourShareCnt_ ;
+    /**
+     * <code>int64 u1hour_share_cnt = 3;</code>
+     * @return The u1hourShareCnt.
+     */
+    @java.lang.Override
+    public long getU1HourShareCnt() {
+      return u1HourShareCnt_;
+    }
+    /**
+     * <code>int64 u1hour_share_cnt = 3;</code>
+     * @param value The u1hourShareCnt to set.
+     * @return This builder for chaining.
+     */
+    public Builder setU1HourShareCnt(long value) {
+      
+      u1HourShareCnt_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>int64 u1hour_share_cnt = 3;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearU1HourShareCnt() {
+      
+      u1HourShareCnt_ = 0L;
+      onChanged();
+      return this;
+    }
+
+    private long u1HourReturnCnt_ ;
+    /**
+     * <code>int64 u1hour_return_cnt = 4;</code>
+     * @return The u1hourReturnCnt.
+     */
+    @java.lang.Override
+    public long getU1HourReturnCnt() {
+      return u1HourReturnCnt_;
+    }
+    /**
+     * <code>int64 u1hour_return_cnt = 4;</code>
+     * @param value The u1hourReturnCnt to set.
+     * @return This builder for chaining.
+     */
+    public Builder setU1HourReturnCnt(long value) {
+      
+      u1HourReturnCnt_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>int64 u1hour_return_cnt = 4;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearU1HourReturnCnt() {
+      
+      u1HourReturnCnt_ = 0L;
+      onChanged();
+      return this;
+    }
+
+    private double uCtr1Hour_ ;
+    /**
+     * <code>double u_ctr1hour = 5;</code>
+     * @return The uCtr1hour.
+     */
+    @java.lang.Override
+    public double getUCtr1Hour() {
+      return uCtr1Hour_;
+    }
+    /**
+     * <code>double u_ctr1hour = 5;</code>
+     * @param value The uCtr1hour to set.
+     * @return This builder for chaining.
+     */
+    public Builder setUCtr1Hour(double value) {
+      
+      uCtr1Hour_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>double u_ctr1hour = 5;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearUCtr1Hour() {
+      
+      uCtr1Hour_ = 0D;
+      onChanged();
+      return this;
+    }
+
+    private double uStr1Hour_ ;
+    /**
+     * <code>double u_str1hour = 6;</code>
+     * @return The uStr1hour.
+     */
+    @java.lang.Override
+    public double getUStr1Hour() {
+      return uStr1Hour_;
+    }
+    /**
+     * <code>double u_str1hour = 6;</code>
+     * @param value The uStr1hour to set.
+     * @return This builder for chaining.
+     */
+    public Builder setUStr1Hour(double value) {
+      
+      uStr1Hour_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>double u_str1hour = 6;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearUStr1Hour() {
+      
+      uStr1Hour_ = 0D;
+      onChanged();
+      return this;
+    }
+
+    private double uRov1Hour_ ;
+    /**
+     * <code>double u_rov1hour = 7;</code>
+     * @return The uRov1hour.
+     */
+    @java.lang.Override
+    public double getURov1Hour() {
+      return uRov1Hour_;
+    }
+    /**
+     * <code>double u_rov1hour = 7;</code>
+     * @param value The uRov1hour to set.
+     * @return This builder for chaining.
+     */
+    public Builder setURov1Hour(double value) {
+      
+      uRov1Hour_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>double u_rov1hour = 7;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearURov1Hour() {
+      
+      uRov1Hour_ = 0D;
+      onChanged();
+      return this;
+    }
+
+    private double uRos1Hour_ ;
+    /**
+     * <code>double u_ros1hour = 8;</code>
+     * @return The uRos1hour.
+     */
+    @java.lang.Override
+    public double getURos1Hour() {
+      return uRos1Hour_;
+    }
+    /**
+     * <code>double u_ros1hour = 8;</code>
+     * @param value The uRos1hour to set.
+     * @return This builder for chaining.
+     */
+    public Builder setURos1Hour(double value) {
+      
+      uRos1Hour_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>double u_ros1hour = 8;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearURos1Hour() {
+      
+      uRos1Hour_ = 0D;
+      onChanged();
+      return this;
+    }
+
+    private long uTodayExpCnt_ ;
+    /**
+     * <pre>
+     *今天
+     * </pre>
+     *
+     * <code>int64 u_today_exp_cnt = 9;</code>
+     * @return The uTodayExpCnt.
+     */
+    @java.lang.Override
+    public long getUTodayExpCnt() {
+      return uTodayExpCnt_;
+    }
+    /**
+     * <pre>
+     *今天
+     * </pre>
+     *
+     * <code>int64 u_today_exp_cnt = 9;</code>
+     * @param value The uTodayExpCnt to set.
+     * @return This builder for chaining.
+     */
+    public Builder setUTodayExpCnt(long value) {
+      
+      uTodayExpCnt_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     *今天
+     * </pre>
+     *
+     * <code>int64 u_today_exp_cnt = 9;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearUTodayExpCnt() {
+      
+      uTodayExpCnt_ = 0L;
+      onChanged();
+      return this;
+    }
+
+    private long uTodayClickCnt_ ;
+    /**
+     * <code>int64 u_today_click_cnt = 10;</code>
+     * @return The uTodayClickCnt.
+     */
+    @java.lang.Override
+    public long getUTodayClickCnt() {
+      return uTodayClickCnt_;
+    }
+    /**
+     * <code>int64 u_today_click_cnt = 10;</code>
+     * @param value The uTodayClickCnt to set.
+     * @return This builder for chaining.
+     */
+    public Builder setUTodayClickCnt(long value) {
+      
+      uTodayClickCnt_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>int64 u_today_click_cnt = 10;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearUTodayClickCnt() {
+      
+      uTodayClickCnt_ = 0L;
+      onChanged();
+      return this;
+    }
+
+    private long uTodayShareCnt_ ;
+    /**
+     * <code>int64 u_today_share_cnt = 11;</code>
+     * @return The uTodayShareCnt.
+     */
+    @java.lang.Override
+    public long getUTodayShareCnt() {
+      return uTodayShareCnt_;
+    }
+    /**
+     * <code>int64 u_today_share_cnt = 11;</code>
+     * @param value The uTodayShareCnt to set.
+     * @return This builder for chaining.
+     */
+    public Builder setUTodayShareCnt(long value) {
+      
+      uTodayShareCnt_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>int64 u_today_share_cnt = 11;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearUTodayShareCnt() {
+      
+      uTodayShareCnt_ = 0L;
+      onChanged();
+      return this;
+    }
+
+    private long uTodayReturnCnt_ ;
+    /**
+     * <code>int64 u_today_return_cnt = 12;</code>
+     * @return The uTodayReturnCnt.
+     */
+    @java.lang.Override
+    public long getUTodayReturnCnt() {
+      return uTodayReturnCnt_;
+    }
+    /**
+     * <code>int64 u_today_return_cnt = 12;</code>
+     * @param value The uTodayReturnCnt to set.
+     * @return This builder for chaining.
+     */
+    public Builder setUTodayReturnCnt(long value) {
+      
+      uTodayReturnCnt_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>int64 u_today_return_cnt = 12;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearUTodayReturnCnt() {
+      
+      uTodayReturnCnt_ = 0L;
+      onChanged();
+      return this;
+    }
+
+    private double uCtrToday_ ;
+    /**
+     * <code>double u_ctr_today = 13;</code>
+     * @return The uCtrToday.
+     */
+    @java.lang.Override
+    public double getUCtrToday() {
+      return uCtrToday_;
+    }
+    /**
+     * <code>double u_ctr_today = 13;</code>
+     * @param value The uCtrToday to set.
+     * @return This builder for chaining.
+     */
+    public Builder setUCtrToday(double value) {
+      
+      uCtrToday_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>double u_ctr_today = 13;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearUCtrToday() {
+      
+      uCtrToday_ = 0D;
+      onChanged();
+      return this;
+    }
+
+    private double uStrToday_ ;
+    /**
+     * <code>double u_str_today = 14;</code>
+     * @return The uStrToday.
+     */
+    @java.lang.Override
+    public double getUStrToday() {
+      return uStrToday_;
+    }
+    /**
+     * <code>double u_str_today = 14;</code>
+     * @param value The uStrToday to set.
+     * @return This builder for chaining.
+     */
+    public Builder setUStrToday(double value) {
+      
+      uStrToday_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>double u_str_today = 14;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearUStrToday() {
+      
+      uStrToday_ = 0D;
+      onChanged();
+      return this;
+    }
+
+    private double uRovToday_ ;
+    /**
+     * <code>double u_rov_today = 15;</code>
+     * @return The uRovToday.
+     */
+    @java.lang.Override
+    public double getURovToday() {
+      return uRovToday_;
+    }
+    /**
+     * <code>double u_rov_today = 15;</code>
+     * @param value The uRovToday to set.
+     * @return This builder for chaining.
+     */
+    public Builder setURovToday(double value) {
+      
+      uRovToday_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>double u_rov_today = 15;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearURovToday() {
+      
+      uRovToday_ = 0D;
+      onChanged();
+      return this;
+    }
+
+    private double uRosToday_ ;
+    /**
+     * <code>double u_ros_today = 16;</code>
+     * @return The uRosToday.
+     */
+    @java.lang.Override
+    public double getURosToday() {
+      return uRosToday_;
+    }
+    /**
+     * <code>double u_ros_today = 16;</code>
+     * @param value The uRosToday to set.
+     * @return This builder for chaining.
+     */
+    public Builder setURosToday(double value) {
+      
+      uRosToday_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>double u_ros_today = 16;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearURosToday() {
+      
+      uRosToday_ = 0D;
+      onChanged();
+      return this;
+    }
+
+    private long u1DayExpCnt_ ;
+    /**
+     * <pre>
+     *过去一天
+     * </pre>
+     *
+     * <code>int64 u1day_exp_cnt = 17;</code>
+     * @return The u1dayExpCnt.
+     */
+    @java.lang.Override
+    public long getU1DayExpCnt() {
+      return u1DayExpCnt_;
+    }
+    /**
+     * <pre>
+     *过去一天
+     * </pre>
+     *
+     * <code>int64 u1day_exp_cnt = 17;</code>
+     * @param value The u1dayExpCnt to set.
+     * @return This builder for chaining.
+     */
+    public Builder setU1DayExpCnt(long value) {
+      
+      u1DayExpCnt_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     *过去一天
+     * </pre>
+     *
+     * <code>int64 u1day_exp_cnt = 17;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearU1DayExpCnt() {
+      
+      u1DayExpCnt_ = 0L;
+      onChanged();
+      return this;
+    }
+
+    private long u1DayClickCnt_ ;
+    /**
+     * <code>int64 u1day_click_cnt = 18;</code>
+     * @return The u1dayClickCnt.
+     */
+    @java.lang.Override
+    public long getU1DayClickCnt() {
+      return u1DayClickCnt_;
+    }
+    /**
+     * <code>int64 u1day_click_cnt = 18;</code>
+     * @param value The u1dayClickCnt to set.
+     * @return This builder for chaining.
+     */
+    public Builder setU1DayClickCnt(long value) {
+      
+      u1DayClickCnt_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>int64 u1day_click_cnt = 18;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearU1DayClickCnt() {
+      
+      u1DayClickCnt_ = 0L;
+      onChanged();
+      return this;
+    }
+
+    private long u1DayShareCnt_ ;
+    /**
+     * <code>int64 u1day_share_cnt = 19;</code>
+     * @return The u1dayShareCnt.
+     */
+    @java.lang.Override
+    public long getU1DayShareCnt() {
+      return u1DayShareCnt_;
+    }
+    /**
+     * <code>int64 u1day_share_cnt = 19;</code>
+     * @param value The u1dayShareCnt to set.
+     * @return This builder for chaining.
+     */
+    public Builder setU1DayShareCnt(long value) {
+      
+      u1DayShareCnt_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>int64 u1day_share_cnt = 19;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearU1DayShareCnt() {
+      
+      u1DayShareCnt_ = 0L;
+      onChanged();
+      return this;
+    }
+
+    private long u1DayReturnCnt_ ;
+    /**
+     * <code>int64 u1day_return_cnt = 20;</code>
+     * @return The u1dayReturnCnt.
+     */
+    @java.lang.Override
+    public long getU1DayReturnCnt() {
+      return u1DayReturnCnt_;
+    }
+    /**
+     * <code>int64 u1day_return_cnt = 20;</code>
+     * @param value The u1dayReturnCnt to set.
+     * @return This builder for chaining.
+     */
+    public Builder setU1DayReturnCnt(long value) {
+      
+      u1DayReturnCnt_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>int64 u1day_return_cnt = 20;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearU1DayReturnCnt() {
+      
+      u1DayReturnCnt_ = 0L;
+      onChanged();
+      return this;
+    }
+
+    private double uCtr1Day_ ;
+    /**
+     * <code>double u_ctr1day = 21;</code>
+     * @return The uCtr1day.
+     */
+    @java.lang.Override
+    public double getUCtr1Day() {
+      return uCtr1Day_;
+    }
+    /**
+     * <code>double u_ctr1day = 21;</code>
+     * @param value The uCtr1day to set.
+     * @return This builder for chaining.
+     */
+    public Builder setUCtr1Day(double value) {
+      
+      uCtr1Day_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>double u_ctr1day = 21;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearUCtr1Day() {
+      
+      uCtr1Day_ = 0D;
+      onChanged();
+      return this;
+    }
+
+    private double uStr1Day_ ;
+    /**
+     * <code>double u_str1day = 22;</code>
+     * @return The uStr1day.
+     */
+    @java.lang.Override
+    public double getUStr1Day() {
+      return uStr1Day_;
+    }
+    /**
+     * <code>double u_str1day = 22;</code>
+     * @param value The uStr1day to set.
+     * @return This builder for chaining.
+     */
+    public Builder setUStr1Day(double value) {
+      
+      uStr1Day_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>double u_str1day = 22;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearUStr1Day() {
+      
+      uStr1Day_ = 0D;
+      onChanged();
+      return this;
+    }
+
+    private double uRov1Day_ ;
+    /**
+     * <code>double u_rov1day = 23;</code>
+     * @return The uRov1day.
+     */
+    @java.lang.Override
+    public double getURov1Day() {
+      return uRov1Day_;
+    }
+    /**
+     * <code>double u_rov1day = 23;</code>
+     * @param value The uRov1day to set.
+     * @return This builder for chaining.
+     */
+    public Builder setURov1Day(double value) {
+      
+      uRov1Day_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>double u_rov1day = 23;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearURov1Day() {
+      
+      uRov1Day_ = 0D;
+      onChanged();
+      return this;
+    }
+
+    private double uRos1Day_ ;
+    /**
+     * <code>double u_ros1day = 24;</code>
+     * @return The uRos1day.
+     */
+    @java.lang.Override
+    public double getURos1Day() {
+      return uRos1Day_;
+    }
+    /**
+     * <code>double u_ros1day = 24;</code>
+     * @param value The uRos1day to set.
+     * @return This builder for chaining.
+     */
+    public Builder setURos1Day(double value) {
+      
+      uRos1Day_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>double u_ros1day = 24;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearURos1Day() {
+      
+      uRos1Day_ = 0D;
+      onChanged();
+      return this;
+    }
+
+    private long u3DayExpCnt_ ;
+    /**
+     * <pre>
+     *过去三天
+     * </pre>
+     *
+     * <code>int64 u3day_exp_cnt = 25;</code>
+     * @return The u3dayExpCnt.
+     */
+    @java.lang.Override
+    public long getU3DayExpCnt() {
+      return u3DayExpCnt_;
+    }
+    /**
+     * <pre>
+     *过去三天
+     * </pre>
+     *
+     * <code>int64 u3day_exp_cnt = 25;</code>
+     * @param value The u3dayExpCnt to set.
+     * @return This builder for chaining.
+     */
+    public Builder setU3DayExpCnt(long value) {
+      
+      u3DayExpCnt_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     *过去三天
+     * </pre>
+     *
+     * <code>int64 u3day_exp_cnt = 25;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearU3DayExpCnt() {
+      
+      u3DayExpCnt_ = 0L;
+      onChanged();
+      return this;
+    }
+
+    private long u3DayClickCnt_ ;
+    /**
+     * <code>int64 u3day_click_cnt = 26;</code>
+     * @return The u3dayClickCnt.
+     */
+    @java.lang.Override
+    public long getU3DayClickCnt() {
+      return u3DayClickCnt_;
+    }
+    /**
+     * <code>int64 u3day_click_cnt = 26;</code>
+     * @param value The u3dayClickCnt to set.
+     * @return This builder for chaining.
+     */
+    public Builder setU3DayClickCnt(long value) {
+      
+      u3DayClickCnt_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>int64 u3day_click_cnt = 26;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearU3DayClickCnt() {
+      
+      u3DayClickCnt_ = 0L;
+      onChanged();
+      return this;
+    }
+
+    private long u3DayShareCnt_ ;
+    /**
+     * <code>int64 u3day_share_cnt = 27;</code>
+     * @return The u3dayShareCnt.
+     */
+    @java.lang.Override
+    public long getU3DayShareCnt() {
+      return u3DayShareCnt_;
+    }
+    /**
+     * <code>int64 u3day_share_cnt = 27;</code>
+     * @param value The u3dayShareCnt to set.
+     * @return This builder for chaining.
+     */
+    public Builder setU3DayShareCnt(long value) {
+      
+      u3DayShareCnt_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>int64 u3day_share_cnt = 27;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearU3DayShareCnt() {
+      
+      u3DayShareCnt_ = 0L;
+      onChanged();
+      return this;
+    }
+
+    private long u3DayReturnCnt_ ;
+    /**
+     * <code>int64 u3day_return_cnt = 28;</code>
+     * @return The u3dayReturnCnt.
+     */
+    @java.lang.Override
+    public long getU3DayReturnCnt() {
+      return u3DayReturnCnt_;
+    }
+    /**
+     * <code>int64 u3day_return_cnt = 28;</code>
+     * @param value The u3dayReturnCnt to set.
+     * @return This builder for chaining.
+     */
+    public Builder setU3DayReturnCnt(long value) {
+      
+      u3DayReturnCnt_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>int64 u3day_return_cnt = 28;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearU3DayReturnCnt() {
+      
+      u3DayReturnCnt_ = 0L;
+      onChanged();
+      return this;
+    }
+
+    private double uCtr3Day_ ;
+    /**
+     * <code>double u_ctr3day = 29;</code>
+     * @return The uCtr3day.
+     */
+    @java.lang.Override
+    public double getUCtr3Day() {
+      return uCtr3Day_;
+    }
+    /**
+     * <code>double u_ctr3day = 29;</code>
+     * @param value The uCtr3day to set.
+     * @return This builder for chaining.
+     */
+    public Builder setUCtr3Day(double value) {
+      
+      uCtr3Day_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>double u_ctr3day = 29;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearUCtr3Day() {
+      
+      uCtr3Day_ = 0D;
+      onChanged();
+      return this;
+    }
+
+    private double uStr3Day_ ;
+    /**
+     * <code>double u_str3day = 30;</code>
+     * @return The uStr3day.
+     */
+    @java.lang.Override
+    public double getUStr3Day() {
+      return uStr3Day_;
+    }
+    /**
+     * <code>double u_str3day = 30;</code>
+     * @param value The uStr3day to set.
+     * @return This builder for chaining.
+     */
+    public Builder setUStr3Day(double value) {
+      
+      uStr3Day_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>double u_str3day = 30;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearUStr3Day() {
+      
+      uStr3Day_ = 0D;
+      onChanged();
+      return this;
+    }
+
+    private double uRov3Day_ ;
+    /**
+     * <code>double u_rov3day = 31;</code>
+     * @return The uRov3day.
+     */
+    @java.lang.Override
+    public double getURov3Day() {
+      return uRov3Day_;
+    }
+    /**
+     * <code>double u_rov3day = 31;</code>
+     * @param value The uRov3day to set.
+     * @return This builder for chaining.
+     */
+    public Builder setURov3Day(double value) {
+      
+      uRov3Day_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>double u_rov3day = 31;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearURov3Day() {
+      
+      uRov3Day_ = 0D;
+      onChanged();
+      return this;
+    }
+
+    private double uRos3Day_ ;
+    /**
+     * <code>double u_ros3day = 32;</code>
+     * @return The uRos3day.
+     */
+    @java.lang.Override
+    public double getURos3Day() {
+      return uRos3Day_;
+    }
+    /**
+     * <code>double u_ros3day = 32;</code>
+     * @param value The uRos3day to set.
+     * @return This builder for chaining.
+     */
+    public Builder setURos3Day(double value) {
+      
+      uRos3Day_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>double u_ros3day = 32;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearURos3Day() {
+      
+      uRos3Day_ = 0D;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object mid_ = "";
+    /**
+     * <code>string mid = 33;</code>
+     * @return The mid.
+     */
+    public java.lang.String getMid() {
+      java.lang.Object ref = mid_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        mid_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string mid = 33;</code>
+     * @return The bytes for mid.
+     */
+    public com.google.protobuf.ByteString
+        getMidBytes() {
+      java.lang.Object ref = mid_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        mid_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string mid = 33;</code>
+     * @param value The mid to set.
+     * @return This builder for chaining.
+     */
+    public Builder setMid(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      mid_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string mid = 33;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearMid() {
+      
+      mid_ = getDefaultInstance().getMid();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string mid = 33;</code>
+     * @param value The bytes for mid to set.
+     * @return This builder for chaining.
+     */
+    public Builder setMidBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      mid_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object machineinfoBrand_ = "";
+    /**
+     * <code>string machineinfo_brand = 34;</code>
+     * @return The machineinfoBrand.
+     */
+    public java.lang.String getMachineinfoBrand() {
+      java.lang.Object ref = machineinfoBrand_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        machineinfoBrand_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string machineinfo_brand = 34;</code>
+     * @return The bytes for machineinfoBrand.
+     */
+    public com.google.protobuf.ByteString
+        getMachineinfoBrandBytes() {
+      java.lang.Object ref = machineinfoBrand_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        machineinfoBrand_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string machineinfo_brand = 34;</code>
+     * @param value The machineinfoBrand to set.
+     * @return This builder for chaining.
+     */
+    public Builder setMachineinfoBrand(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      machineinfoBrand_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string machineinfo_brand = 34;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearMachineinfoBrand() {
+      
+      machineinfoBrand_ = getDefaultInstance().getMachineinfoBrand();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string machineinfo_brand = 34;</code>
+     * @param value The bytes for machineinfoBrand to set.
+     * @return This builder for chaining.
+     */
+    public Builder setMachineinfoBrandBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      machineinfoBrand_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object machineinfoModel_ = "";
+    /**
+     * <code>string machineinfo_model = 35;</code>
+     * @return The machineinfoModel.
+     */
+    public java.lang.String getMachineinfoModel() {
+      java.lang.Object ref = machineinfoModel_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        machineinfoModel_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string machineinfo_model = 35;</code>
+     * @return The bytes for machineinfoModel.
+     */
+    public com.google.protobuf.ByteString
+        getMachineinfoModelBytes() {
+      java.lang.Object ref = machineinfoModel_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        machineinfoModel_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string machineinfo_model = 35;</code>
+     * @param value The machineinfoModel to set.
+     * @return This builder for chaining.
+     */
+    public Builder setMachineinfoModel(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      machineinfoModel_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string machineinfo_model = 35;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearMachineinfoModel() {
+      
+      machineinfoModel_ = getDefaultInstance().getMachineinfoModel();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string machineinfo_model = 35;</code>
+     * @param value The bytes for machineinfoModel to set.
+     * @return This builder for chaining.
+     */
+    public Builder setMachineinfoModelBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      machineinfoModel_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object machineinfoSystem_ = "";
+    /**
+     * <code>string machineinfo_system = 36;</code>
+     * @return The machineinfoSystem.
+     */
+    public java.lang.String getMachineinfoSystem() {
+      java.lang.Object ref = machineinfoSystem_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        machineinfoSystem_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string machineinfo_system = 36;</code>
+     * @return The bytes for machineinfoSystem.
+     */
+    public com.google.protobuf.ByteString
+        getMachineinfoSystemBytes() {
+      java.lang.Object ref = machineinfoSystem_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        machineinfoSystem_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string machineinfo_system = 36;</code>
+     * @param value The machineinfoSystem to set.
+     * @return This builder for chaining.
+     */
+    public Builder setMachineinfoSystem(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      machineinfoSystem_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string machineinfo_system = 36;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearMachineinfoSystem() {
+      
+      machineinfoSystem_ = getDefaultInstance().getMachineinfoSystem();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string machineinfo_system = 36;</code>
+     * @param value The bytes for machineinfoSystem to set.
+     * @return This builder for chaining.
+     */
+    public Builder setMachineinfoSystemBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      machineinfoSystem_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object machineinfoPlatform_ = "";
+    /**
+     * <code>string machineinfo_platform = 37;</code>
+     * @return The machineinfoPlatform.
+     */
+    public java.lang.String getMachineinfoPlatform() {
+      java.lang.Object ref = machineinfoPlatform_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        machineinfoPlatform_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string machineinfo_platform = 37;</code>
+     * @return The bytes for machineinfoPlatform.
+     */
+    public com.google.protobuf.ByteString
+        getMachineinfoPlatformBytes() {
+      java.lang.Object ref = machineinfoPlatform_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        machineinfoPlatform_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string machineinfo_platform = 37;</code>
+     * @param value The machineinfoPlatform to set.
+     * @return This builder for chaining.
+     */
+    public Builder setMachineinfoPlatform(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      machineinfoPlatform_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string machineinfo_platform = 37;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearMachineinfoPlatform() {
+      
+      machineinfoPlatform_ = getDefaultInstance().getMachineinfoPlatform();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string machineinfo_platform = 37;</code>
+     * @param value The bytes for machineinfoPlatform to set.
+     * @return This builder for chaining.
+     */
+    public Builder setMachineinfoPlatformBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      machineinfoPlatform_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object gender_ = "";
+    /**
+     * <code>string gender = 38;</code>
+     * @return The gender.
+     */
+    public java.lang.String getGender() {
+      java.lang.Object ref = gender_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        gender_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string gender = 38;</code>
+     * @return The bytes for gender.
+     */
+    public com.google.protobuf.ByteString
+        getGenderBytes() {
+      java.lang.Object ref = gender_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        gender_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string gender = 38;</code>
+     * @param value The gender to set.
+     * @return This builder for chaining.
+     */
+    public Builder setGender(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      gender_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string gender = 38;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearGender() {
+      
+      gender_ = getDefaultInstance().getGender();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string gender = 38;</code>
+     * @param value The bytes for gender to set.
+     * @return This builder for chaining.
+     */
+    public Builder setGenderBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      gender_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object country_ = "";
+    /**
+     * <code>string country = 39;</code>
+     * @return The country.
+     */
+    public java.lang.String getCountry() {
+      java.lang.Object ref = country_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        country_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string country = 39;</code>
+     * @return The bytes for country.
+     */
+    public com.google.protobuf.ByteString
+        getCountryBytes() {
+      java.lang.Object ref = country_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        country_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string country = 39;</code>
+     * @param value The country to set.
+     * @return This builder for chaining.
+     */
+    public Builder setCountry(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      country_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string country = 39;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearCountry() {
+      
+      country_ = getDefaultInstance().getCountry();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string country = 39;</code>
+     * @param value The bytes for country to set.
+     * @return This builder for chaining.
+     */
+    public Builder setCountryBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      country_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object province_ = "";
+    /**
+     * <code>string province = 40;</code>
+     * @return The province.
+     */
+    public java.lang.String getProvince() {
+      java.lang.Object ref = province_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        province_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string province = 40;</code>
+     * @return The bytes for province.
+     */
+    public com.google.protobuf.ByteString
+        getProvinceBytes() {
+      java.lang.Object ref = province_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        province_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string province = 40;</code>
+     * @param value The province to set.
+     * @return This builder for chaining.
+     */
+    public Builder setProvince(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      province_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string province = 40;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearProvince() {
+      
+      province_ = getDefaultInstance().getProvince();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string province = 40;</code>
+     * @param value The bytes for province to set.
+     * @return This builder for chaining.
+     */
+    public Builder setProvinceBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      province_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object city_ = "";
+    /**
+     * <code>string city = 41;</code>
+     * @return The city.
+     */
+    public java.lang.String getCity() {
+      java.lang.Object ref = city_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        city_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string city = 41;</code>
+     * @return The bytes for city.
+     */
+    public com.google.protobuf.ByteString
+        getCityBytes() {
+      java.lang.Object ref = city_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        city_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string city = 41;</code>
+     * @param value The city to set.
+     * @return This builder for chaining.
+     */
+    public Builder setCity(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      city_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string city = 41;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearCity() {
+      
+      city_ = getDefaultInstance().getCity();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string city = 41;</code>
+     * @param value The bytes for city to set.
+     * @return This builder for chaining.
+     */
+    public Builder setCityBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      city_ = value;
+      onChanged();
+      return this;
+    }
+    @java.lang.Override
+    public final Builder setUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.setUnknownFields(unknownFields);
+    }
+
+    @java.lang.Override
+    public final Builder mergeUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.mergeUnknownFields(unknownFields);
+    }
+
+
+    // @@protoc_insertion_point(builder_scope:GetUserFeatureInfo)
+  }
+
+  // @@protoc_insertion_point(class_scope:GetUserFeatureInfo)
+  private static final com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo();
+  }
+
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<GetUserFeatureInfo>
+      PARSER = new com.google.protobuf.AbstractParser<GetUserFeatureInfo>() {
+    @java.lang.Override
+    public GetUserFeatureInfo parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new GetUserFeatureInfo(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<GetUserFeatureInfo> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<GetUserFeatureInfo> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+

+ 325 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetUserFeatureInfoOrBuilder.java

@@ -0,0 +1,325 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: com/tzld/piaoquan/recommend/feature/feature.proto
+
+package com.tzld.piaoquan.recommend.feature.model.feature;
+
+public interface GetUserFeatureInfoOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:GetUserFeatureInfo)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <pre>
+   *过去一小时
+   * </pre>
+   *
+   * <code>int64 u1hour_exp_cnt = 1;</code>
+   * @return The u1hourExpCnt.
+   */
+  long getU1HourExpCnt();
+
+  /**
+   * <code>int64 u1hour_click_cnt = 2;</code>
+   * @return The u1hourClickCnt.
+   */
+  long getU1HourClickCnt();
+
+  /**
+   * <code>int64 u1hour_share_cnt = 3;</code>
+   * @return The u1hourShareCnt.
+   */
+  long getU1HourShareCnt();
+
+  /**
+   * <code>int64 u1hour_return_cnt = 4;</code>
+   * @return The u1hourReturnCnt.
+   */
+  long getU1HourReturnCnt();
+
+  /**
+   * <code>double u_ctr1hour = 5;</code>
+   * @return The uCtr1hour.
+   */
+  double getUCtr1Hour();
+
+  /**
+   * <code>double u_str1hour = 6;</code>
+   * @return The uStr1hour.
+   */
+  double getUStr1Hour();
+
+  /**
+   * <code>double u_rov1hour = 7;</code>
+   * @return The uRov1hour.
+   */
+  double getURov1Hour();
+
+  /**
+   * <code>double u_ros1hour = 8;</code>
+   * @return The uRos1hour.
+   */
+  double getURos1Hour();
+
+  /**
+   * <pre>
+   *今天
+   * </pre>
+   *
+   * <code>int64 u_today_exp_cnt = 9;</code>
+   * @return The uTodayExpCnt.
+   */
+  long getUTodayExpCnt();
+
+  /**
+   * <code>int64 u_today_click_cnt = 10;</code>
+   * @return The uTodayClickCnt.
+   */
+  long getUTodayClickCnt();
+
+  /**
+   * <code>int64 u_today_share_cnt = 11;</code>
+   * @return The uTodayShareCnt.
+   */
+  long getUTodayShareCnt();
+
+  /**
+   * <code>int64 u_today_return_cnt = 12;</code>
+   * @return The uTodayReturnCnt.
+   */
+  long getUTodayReturnCnt();
+
+  /**
+   * <code>double u_ctr_today = 13;</code>
+   * @return The uCtrToday.
+   */
+  double getUCtrToday();
+
+  /**
+   * <code>double u_str_today = 14;</code>
+   * @return The uStrToday.
+   */
+  double getUStrToday();
+
+  /**
+   * <code>double u_rov_today = 15;</code>
+   * @return The uRovToday.
+   */
+  double getURovToday();
+
+  /**
+   * <code>double u_ros_today = 16;</code>
+   * @return The uRosToday.
+   */
+  double getURosToday();
+
+  /**
+   * <pre>
+   *过去一天
+   * </pre>
+   *
+   * <code>int64 u1day_exp_cnt = 17;</code>
+   * @return The u1dayExpCnt.
+   */
+  long getU1DayExpCnt();
+
+  /**
+   * <code>int64 u1day_click_cnt = 18;</code>
+   * @return The u1dayClickCnt.
+   */
+  long getU1DayClickCnt();
+
+  /**
+   * <code>int64 u1day_share_cnt = 19;</code>
+   * @return The u1dayShareCnt.
+   */
+  long getU1DayShareCnt();
+
+  /**
+   * <code>int64 u1day_return_cnt = 20;</code>
+   * @return The u1dayReturnCnt.
+   */
+  long getU1DayReturnCnt();
+
+  /**
+   * <code>double u_ctr1day = 21;</code>
+   * @return The uCtr1day.
+   */
+  double getUCtr1Day();
+
+  /**
+   * <code>double u_str1day = 22;</code>
+   * @return The uStr1day.
+   */
+  double getUStr1Day();
+
+  /**
+   * <code>double u_rov1day = 23;</code>
+   * @return The uRov1day.
+   */
+  double getURov1Day();
+
+  /**
+   * <code>double u_ros1day = 24;</code>
+   * @return The uRos1day.
+   */
+  double getURos1Day();
+
+  /**
+   * <pre>
+   *过去三天
+   * </pre>
+   *
+   * <code>int64 u3day_exp_cnt = 25;</code>
+   * @return The u3dayExpCnt.
+   */
+  long getU3DayExpCnt();
+
+  /**
+   * <code>int64 u3day_click_cnt = 26;</code>
+   * @return The u3dayClickCnt.
+   */
+  long getU3DayClickCnt();
+
+  /**
+   * <code>int64 u3day_share_cnt = 27;</code>
+   * @return The u3dayShareCnt.
+   */
+  long getU3DayShareCnt();
+
+  /**
+   * <code>int64 u3day_return_cnt = 28;</code>
+   * @return The u3dayReturnCnt.
+   */
+  long getU3DayReturnCnt();
+
+  /**
+   * <code>double u_ctr3day = 29;</code>
+   * @return The uCtr3day.
+   */
+  double getUCtr3Day();
+
+  /**
+   * <code>double u_str3day = 30;</code>
+   * @return The uStr3day.
+   */
+  double getUStr3Day();
+
+  /**
+   * <code>double u_rov3day = 31;</code>
+   * @return The uRov3day.
+   */
+  double getURov3Day();
+
+  /**
+   * <code>double u_ros3day = 32;</code>
+   * @return The uRos3day.
+   */
+  double getURos3Day();
+
+  /**
+   * <code>string mid = 33;</code>
+   * @return The mid.
+   */
+  java.lang.String getMid();
+  /**
+   * <code>string mid = 33;</code>
+   * @return The bytes for mid.
+   */
+  com.google.protobuf.ByteString
+      getMidBytes();
+
+  /**
+   * <code>string machineinfo_brand = 34;</code>
+   * @return The machineinfoBrand.
+   */
+  java.lang.String getMachineinfoBrand();
+  /**
+   * <code>string machineinfo_brand = 34;</code>
+   * @return The bytes for machineinfoBrand.
+   */
+  com.google.protobuf.ByteString
+      getMachineinfoBrandBytes();
+
+  /**
+   * <code>string machineinfo_model = 35;</code>
+   * @return The machineinfoModel.
+   */
+  java.lang.String getMachineinfoModel();
+  /**
+   * <code>string machineinfo_model = 35;</code>
+   * @return The bytes for machineinfoModel.
+   */
+  com.google.protobuf.ByteString
+      getMachineinfoModelBytes();
+
+  /**
+   * <code>string machineinfo_system = 36;</code>
+   * @return The machineinfoSystem.
+   */
+  java.lang.String getMachineinfoSystem();
+  /**
+   * <code>string machineinfo_system = 36;</code>
+   * @return The bytes for machineinfoSystem.
+   */
+  com.google.protobuf.ByteString
+      getMachineinfoSystemBytes();
+
+  /**
+   * <code>string machineinfo_platform = 37;</code>
+   * @return The machineinfoPlatform.
+   */
+  java.lang.String getMachineinfoPlatform();
+  /**
+   * <code>string machineinfo_platform = 37;</code>
+   * @return The bytes for machineinfoPlatform.
+   */
+  com.google.protobuf.ByteString
+      getMachineinfoPlatformBytes();
+
+  /**
+   * <code>string gender = 38;</code>
+   * @return The gender.
+   */
+  java.lang.String getGender();
+  /**
+   * <code>string gender = 38;</code>
+   * @return The bytes for gender.
+   */
+  com.google.protobuf.ByteString
+      getGenderBytes();
+
+  /**
+   * <code>string country = 39;</code>
+   * @return The country.
+   */
+  java.lang.String getCountry();
+  /**
+   * <code>string country = 39;</code>
+   * @return The bytes for country.
+   */
+  com.google.protobuf.ByteString
+      getCountryBytes();
+
+  /**
+   * <code>string province = 40;</code>
+   * @return The province.
+   */
+  java.lang.String getProvince();
+  /**
+   * <code>string province = 40;</code>
+   * @return The bytes for province.
+   */
+  com.google.protobuf.ByteString
+      getProvinceBytes();
+
+  /**
+   * <code>string city = 41;</code>
+   * @return The city.
+   */
+  java.lang.String getCity();
+  /**
+   * <code>string city = 41;</code>
+   * @return The bytes for city.
+   */
+  com.google.protobuf.ByteString
+      getCityBytes();
+}

+ 614 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetUserFeatureInfoRequest.java

@@ -0,0 +1,614 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: com/tzld/piaoquan/recommend/feature/feature.proto
+
+package com.tzld.piaoquan.recommend.feature.model.feature;
+
+/**
+ * Protobuf type {@code GetUserFeatureInfoRequest}
+ */
+public final class GetUserFeatureInfoRequest extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:GetUserFeatureInfoRequest)
+    GetUserFeatureInfoRequestOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use GetUserFeatureInfoRequest.newBuilder() to construct.
+  private GetUserFeatureInfoRequest(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private GetUserFeatureInfoRequest() {
+    mids_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+  }
+
+  @java.lang.Override
+  @SuppressWarnings({"unused"})
+  protected java.lang.Object newInstance(
+      UnusedPrivateParameter unused) {
+    return new GetUserFeatureInfoRequest();
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private GetUserFeatureInfoRequest(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    this();
+    if (extensionRegistry == null) {
+      throw new java.lang.NullPointerException();
+    }
+    int mutable_bitField0_ = 0;
+    com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+        com.google.protobuf.UnknownFieldSet.newBuilder();
+    try {
+      boolean done = false;
+      while (!done) {
+        int tag = input.readTag();
+        switch (tag) {
+          case 0:
+            done = true;
+            break;
+          case 10: {
+            java.lang.String s = input.readStringRequireUtf8();
+            if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+              mids_ = new com.google.protobuf.LazyStringArrayList();
+              mutable_bitField0_ |= 0x00000001;
+            }
+            mids_.add(s);
+            break;
+          }
+          default: {
+            if (!parseUnknownField(
+                input, unknownFields, extensionRegistry, tag)) {
+              done = true;
+            }
+            break;
+          }
+        }
+      }
+    } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+      throw e.setUnfinishedMessage(this);
+    } catch (java.io.IOException e) {
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
+    } finally {
+      if (((mutable_bitField0_ & 0x00000001) != 0)) {
+        mids_ = mids_.getUnmodifiableView();
+      }
+      this.unknownFields = unknownFields.build();
+      makeExtensionsImmutable();
+    }
+  }
+  public static final com.google.protobuf.Descriptors.Descriptor
+      getDescriptor() {
+    return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetUserFeatureInfoRequest_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetUserFeatureInfoRequest_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest.class, com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest.Builder.class);
+  }
+
+  public static final int MIDS_FIELD_NUMBER = 1;
+  private com.google.protobuf.LazyStringList mids_;
+  /**
+   * <code>repeated string mids = 1;</code>
+   * @return A list containing the mids.
+   */
+  public com.google.protobuf.ProtocolStringList
+      getMidsList() {
+    return mids_;
+  }
+  /**
+   * <code>repeated string mids = 1;</code>
+   * @return The count of mids.
+   */
+  public int getMidsCount() {
+    return mids_.size();
+  }
+  /**
+   * <code>repeated string mids = 1;</code>
+   * @param index The index of the element to return.
+   * @return The mids at the given index.
+   */
+  public java.lang.String getMids(int index) {
+    return mids_.get(index);
+  }
+  /**
+   * <code>repeated string mids = 1;</code>
+   * @param index The index of the value to return.
+   * @return The bytes of the mids at the given index.
+   */
+  public com.google.protobuf.ByteString
+      getMidsBytes(int index) {
+    return mids_.getByteString(index);
+  }
+
+  private byte memoizedIsInitialized = -1;
+  @java.lang.Override
+  public final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
+  }
+
+  @java.lang.Override
+  public void writeTo(com.google.protobuf.CodedOutputStream output)
+                      throws java.io.IOException {
+    for (int i = 0; i < mids_.size(); i++) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 1, mids_.getRaw(i));
+    }
+    unknownFields.writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    {
+      int dataSize = 0;
+      for (int i = 0; i < mids_.size(); i++) {
+        dataSize += computeStringSizeNoTag(mids_.getRaw(i));
+      }
+      size += dataSize;
+      size += 1 * getMidsList().size();
+    }
+    size += unknownFields.getSerializedSize();
+    memoizedSize = size;
+    return size;
+  }
+
+  @java.lang.Override
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+     return true;
+    }
+    if (!(obj instanceof com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest)) {
+      return super.equals(obj);
+    }
+    com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest other = (com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest) obj;
+
+    if (!getMidsList()
+        .equals(other.getMidsList())) return false;
+    if (!unknownFields.equals(other.unknownFields)) return false;
+    return true;
+  }
+
+  @java.lang.Override
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
+    }
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    if (getMidsCount() > 0) {
+      hash = (37 * hash) + MIDS_FIELD_NUMBER;
+      hash = (53 * hash) + getMidsList().hashCode();
+    }
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest parseFrom(
+      java.nio.ByteBuffer data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest parseFrom(
+      com.google.protobuf.ByteString data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest parseFrom(
+      byte[] data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest parseFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest parseFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest parseDelimitedFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest parseDelimitedFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest parseFrom(
+      com.google.protobuf.CodedInputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest parseFrom(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+
+  @java.lang.Override
+  public Builder newBuilderForType() { return newBuilder(); }
+  public static Builder newBuilder() {
+    return DEFAULT_INSTANCE.toBuilder();
+  }
+  public static Builder newBuilder(com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest prototype) {
+    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+  }
+  @java.lang.Override
+  public Builder toBuilder() {
+    return this == DEFAULT_INSTANCE
+        ? new Builder() : new Builder().mergeFrom(this);
+  }
+
+  @java.lang.Override
+  protected Builder newBuilderForType(
+      com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
+  }
+  /**
+   * Protobuf type {@code GetUserFeatureInfoRequest}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:GetUserFeatureInfoRequest)
+      com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequestOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetUserFeatureInfoRequest_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetUserFeatureInfoRequest_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest.class, com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest.Builder.class);
+    }
+
+    // Construct using com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest.newBuilder()
+    private Builder() {
+      maybeForceBuilderInitialization();
+    }
+
+    private Builder(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+      maybeForceBuilderInitialization();
+    }
+    private void maybeForceBuilderInitialization() {
+      if (com.google.protobuf.GeneratedMessageV3
+              .alwaysUseFieldBuilders) {
+      }
+    }
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      mids_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+      bitField0_ = (bitField0_ & ~0x00000001);
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetUserFeatureInfoRequest_descriptor;
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest getDefaultInstanceForType() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest build() {
+      com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest buildPartial() {
+      com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest result = new com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest(this);
+      int from_bitField0_ = bitField0_;
+      if (((bitField0_ & 0x00000001) != 0)) {
+        mids_ = mids_.getUnmodifiableView();
+        bitField0_ = (bitField0_ & ~0x00000001);
+      }
+      result.mids_ = mids_;
+      onBuilt();
+      return result;
+    }
+
+    @java.lang.Override
+    public Builder clone() {
+      return super.clone();
+    }
+    @java.lang.Override
+    public Builder setField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.setField(field, value);
+    }
+    @java.lang.Override
+    public Builder clearField(
+        com.google.protobuf.Descriptors.FieldDescriptor field) {
+      return super.clearField(field);
+    }
+    @java.lang.Override
+    public Builder clearOneof(
+        com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+      return super.clearOneof(oneof);
+    }
+    @java.lang.Override
+    public Builder setRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        int index, java.lang.Object value) {
+      return super.setRepeatedField(field, index, value);
+    }
+    @java.lang.Override
+    public Builder addRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.addRepeatedField(field, value);
+    }
+    @java.lang.Override
+    public Builder mergeFrom(com.google.protobuf.Message other) {
+      if (other instanceof com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest) {
+        return mergeFrom((com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest other) {
+      if (other == com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest.getDefaultInstance()) return this;
+      if (!other.mids_.isEmpty()) {
+        if (mids_.isEmpty()) {
+          mids_ = other.mids_;
+          bitField0_ = (bitField0_ & ~0x00000001);
+        } else {
+          ensureMidsIsMutable();
+          mids_.addAll(other.mids_);
+        }
+        onChanged();
+      }
+      this.mergeUnknownFields(other.unknownFields);
+      onChanged();
+      return this;
+    }
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest) e.getUnfinishedMessage();
+        throw e.unwrapIOException();
+      } finally {
+        if (parsedMessage != null) {
+          mergeFrom(parsedMessage);
+        }
+      }
+      return this;
+    }
+    private int bitField0_;
+
+    private com.google.protobuf.LazyStringList mids_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+    private void ensureMidsIsMutable() {
+      if (!((bitField0_ & 0x00000001) != 0)) {
+        mids_ = new com.google.protobuf.LazyStringArrayList(mids_);
+        bitField0_ |= 0x00000001;
+       }
+    }
+    /**
+     * <code>repeated string mids = 1;</code>
+     * @return A list containing the mids.
+     */
+    public com.google.protobuf.ProtocolStringList
+        getMidsList() {
+      return mids_.getUnmodifiableView();
+    }
+    /**
+     * <code>repeated string mids = 1;</code>
+     * @return The count of mids.
+     */
+    public int getMidsCount() {
+      return mids_.size();
+    }
+    /**
+     * <code>repeated string mids = 1;</code>
+     * @param index The index of the element to return.
+     * @return The mids at the given index.
+     */
+    public java.lang.String getMids(int index) {
+      return mids_.get(index);
+    }
+    /**
+     * <code>repeated string mids = 1;</code>
+     * @param index The index of the value to return.
+     * @return The bytes of the mids at the given index.
+     */
+    public com.google.protobuf.ByteString
+        getMidsBytes(int index) {
+      return mids_.getByteString(index);
+    }
+    /**
+     * <code>repeated string mids = 1;</code>
+     * @param index The index to set the value at.
+     * @param value The mids to set.
+     * @return This builder for chaining.
+     */
+    public Builder setMids(
+        int index, java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  ensureMidsIsMutable();
+      mids_.set(index, value);
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>repeated string mids = 1;</code>
+     * @param value The mids to add.
+     * @return This builder for chaining.
+     */
+    public Builder addMids(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  ensureMidsIsMutable();
+      mids_.add(value);
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>repeated string mids = 1;</code>
+     * @param values The mids to add.
+     * @return This builder for chaining.
+     */
+    public Builder addAllMids(
+        java.lang.Iterable<java.lang.String> values) {
+      ensureMidsIsMutable();
+      com.google.protobuf.AbstractMessageLite.Builder.addAll(
+          values, mids_);
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>repeated string mids = 1;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearMids() {
+      mids_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+      bitField0_ = (bitField0_ & ~0x00000001);
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>repeated string mids = 1;</code>
+     * @param value The bytes of the mids to add.
+     * @return This builder for chaining.
+     */
+    public Builder addMidsBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      ensureMidsIsMutable();
+      mids_.add(value);
+      onChanged();
+      return this;
+    }
+    @java.lang.Override
+    public final Builder setUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.setUnknownFields(unknownFields);
+    }
+
+    @java.lang.Override
+    public final Builder mergeUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.mergeUnknownFields(unknownFields);
+    }
+
+
+    // @@protoc_insertion_point(builder_scope:GetUserFeatureInfoRequest)
+  }
+
+  // @@protoc_insertion_point(class_scope:GetUserFeatureInfoRequest)
+  private static final com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest();
+  }
+
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<GetUserFeatureInfoRequest>
+      PARSER = new com.google.protobuf.AbstractParser<GetUserFeatureInfoRequest>() {
+    @java.lang.Override
+    public GetUserFeatureInfoRequest parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new GetUserFeatureInfoRequest(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<GetUserFeatureInfoRequest> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<GetUserFeatureInfoRequest> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoRequest getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+

+ 34 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetUserFeatureInfoRequestOrBuilder.java

@@ -0,0 +1,34 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: com/tzld/piaoquan/recommend/feature/feature.proto
+
+package com.tzld.piaoquan.recommend.feature.model.feature;
+
+public interface GetUserFeatureInfoRequestOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:GetUserFeatureInfoRequest)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <code>repeated string mids = 1;</code>
+   * @return A list containing the mids.
+   */
+  java.util.List<java.lang.String>
+      getMidsList();
+  /**
+   * <code>repeated string mids = 1;</code>
+   * @return The count of mids.
+   */
+  int getMidsCount();
+  /**
+   * <code>repeated string mids = 1;</code>
+   * @param index The index of the element to return.
+   * @return The mids at the given index.
+   */
+  java.lang.String getMids(int index);
+  /**
+   * <code>repeated string mids = 1;</code>
+   * @param index The index of the value to return.
+   * @return The bytes of the mids at the given index.
+   */
+  com.google.protobuf.ByteString
+      getMidsBytes(int index);
+}

+ 958 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetUserFeatureInfoResponse.java

@@ -0,0 +1,958 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: com/tzld/piaoquan/recommend/feature/feature.proto
+
+package com.tzld.piaoquan.recommend.feature.model.feature;
+
+/**
+ * Protobuf type {@code GetUserFeatureInfoResponse}
+ */
+public final class GetUserFeatureInfoResponse extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:GetUserFeatureInfoResponse)
+    GetUserFeatureInfoResponseOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use GetUserFeatureInfoResponse.newBuilder() to construct.
+  private GetUserFeatureInfoResponse(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private GetUserFeatureInfoResponse() {
+    userFeatureInfo_ = java.util.Collections.emptyList();
+  }
+
+  @java.lang.Override
+  @SuppressWarnings({"unused"})
+  protected java.lang.Object newInstance(
+      UnusedPrivateParameter unused) {
+    return new GetUserFeatureInfoResponse();
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private GetUserFeatureInfoResponse(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    this();
+    if (extensionRegistry == null) {
+      throw new java.lang.NullPointerException();
+    }
+    int mutable_bitField0_ = 0;
+    com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+        com.google.protobuf.UnknownFieldSet.newBuilder();
+    try {
+      boolean done = false;
+      while (!done) {
+        int tag = input.readTag();
+        switch (tag) {
+          case 0:
+            done = true;
+            break;
+          case 10: {
+            com.tzld.piaoquan.recommend.feature.model.common.Result.Builder subBuilder = null;
+            if (result_ != null) {
+              subBuilder = result_.toBuilder();
+            }
+            result_ = input.readMessage(com.tzld.piaoquan.recommend.feature.model.common.Result.parser(), extensionRegistry);
+            if (subBuilder != null) {
+              subBuilder.mergeFrom(result_);
+              result_ = subBuilder.buildPartial();
+            }
+
+            break;
+          }
+          case 18: {
+            if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+              userFeatureInfo_ = new java.util.ArrayList<com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo>();
+              mutable_bitField0_ |= 0x00000001;
+            }
+            userFeatureInfo_.add(
+                input.readMessage(com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo.parser(), extensionRegistry));
+            break;
+          }
+          default: {
+            if (!parseUnknownField(
+                input, unknownFields, extensionRegistry, tag)) {
+              done = true;
+            }
+            break;
+          }
+        }
+      }
+    } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+      throw e.setUnfinishedMessage(this);
+    } catch (java.io.IOException e) {
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
+    } finally {
+      if (((mutable_bitField0_ & 0x00000001) != 0)) {
+        userFeatureInfo_ = java.util.Collections.unmodifiableList(userFeatureInfo_);
+      }
+      this.unknownFields = unknownFields.build();
+      makeExtensionsImmutable();
+    }
+  }
+  public static final com.google.protobuf.Descriptors.Descriptor
+      getDescriptor() {
+    return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetUserFeatureInfoResponse_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetUserFeatureInfoResponse_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse.class, com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse.Builder.class);
+  }
+
+  public static final int RESULT_FIELD_NUMBER = 1;
+  private com.tzld.piaoquan.recommend.feature.model.common.Result result_;
+  /**
+   * <code>.Result result = 1;</code>
+   * @return Whether the result field is set.
+   */
+  @java.lang.Override
+  public boolean hasResult() {
+    return result_ != null;
+  }
+  /**
+   * <code>.Result result = 1;</code>
+   * @return The result.
+   */
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.common.Result getResult() {
+    return result_ == null ? com.tzld.piaoquan.recommend.feature.model.common.Result.getDefaultInstance() : result_;
+  }
+  /**
+   * <code>.Result result = 1;</code>
+   */
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.common.ResultOrBuilder getResultOrBuilder() {
+    return getResult();
+  }
+
+  public static final int USER_FEATURE_INFO_FIELD_NUMBER = 2;
+  private java.util.List<com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo> userFeatureInfo_;
+  /**
+   * <code>repeated .GetUserFeatureInfo user_feature_info = 2;</code>
+   */
+  @java.lang.Override
+  public java.util.List<com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo> getUserFeatureInfoList() {
+    return userFeatureInfo_;
+  }
+  /**
+   * <code>repeated .GetUserFeatureInfo user_feature_info = 2;</code>
+   */
+  @java.lang.Override
+  public java.util.List<? extends com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoOrBuilder> 
+      getUserFeatureInfoOrBuilderList() {
+    return userFeatureInfo_;
+  }
+  /**
+   * <code>repeated .GetUserFeatureInfo user_feature_info = 2;</code>
+   */
+  @java.lang.Override
+  public int getUserFeatureInfoCount() {
+    return userFeatureInfo_.size();
+  }
+  /**
+   * <code>repeated .GetUserFeatureInfo user_feature_info = 2;</code>
+   */
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo getUserFeatureInfo(int index) {
+    return userFeatureInfo_.get(index);
+  }
+  /**
+   * <code>repeated .GetUserFeatureInfo user_feature_info = 2;</code>
+   */
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoOrBuilder getUserFeatureInfoOrBuilder(
+      int index) {
+    return userFeatureInfo_.get(index);
+  }
+
+  private byte memoizedIsInitialized = -1;
+  @java.lang.Override
+  public final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
+  }
+
+  @java.lang.Override
+  public void writeTo(com.google.protobuf.CodedOutputStream output)
+                      throws java.io.IOException {
+    if (result_ != null) {
+      output.writeMessage(1, getResult());
+    }
+    for (int i = 0; i < userFeatureInfo_.size(); i++) {
+      output.writeMessage(2, userFeatureInfo_.get(i));
+    }
+    unknownFields.writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    if (result_ != null) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(1, getResult());
+    }
+    for (int i = 0; i < userFeatureInfo_.size(); i++) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(2, userFeatureInfo_.get(i));
+    }
+    size += unknownFields.getSerializedSize();
+    memoizedSize = size;
+    return size;
+  }
+
+  @java.lang.Override
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+     return true;
+    }
+    if (!(obj instanceof com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse)) {
+      return super.equals(obj);
+    }
+    com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse other = (com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse) obj;
+
+    if (hasResult() != other.hasResult()) return false;
+    if (hasResult()) {
+      if (!getResult()
+          .equals(other.getResult())) return false;
+    }
+    if (!getUserFeatureInfoList()
+        .equals(other.getUserFeatureInfoList())) return false;
+    if (!unknownFields.equals(other.unknownFields)) return false;
+    return true;
+  }
+
+  @java.lang.Override
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
+    }
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    if (hasResult()) {
+      hash = (37 * hash) + RESULT_FIELD_NUMBER;
+      hash = (53 * hash) + getResult().hashCode();
+    }
+    if (getUserFeatureInfoCount() > 0) {
+      hash = (37 * hash) + USER_FEATURE_INFO_FIELD_NUMBER;
+      hash = (53 * hash) + getUserFeatureInfoList().hashCode();
+    }
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse parseFrom(
+      java.nio.ByteBuffer data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse parseFrom(
+      com.google.protobuf.ByteString data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse parseFrom(
+      byte[] data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse parseFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse parseFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse parseDelimitedFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse parseDelimitedFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse parseFrom(
+      com.google.protobuf.CodedInputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse parseFrom(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+
+  @java.lang.Override
+  public Builder newBuilderForType() { return newBuilder(); }
+  public static Builder newBuilder() {
+    return DEFAULT_INSTANCE.toBuilder();
+  }
+  public static Builder newBuilder(com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse prototype) {
+    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+  }
+  @java.lang.Override
+  public Builder toBuilder() {
+    return this == DEFAULT_INSTANCE
+        ? new Builder() : new Builder().mergeFrom(this);
+  }
+
+  @java.lang.Override
+  protected Builder newBuilderForType(
+      com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
+  }
+  /**
+   * Protobuf type {@code GetUserFeatureInfoResponse}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:GetUserFeatureInfoResponse)
+      com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponseOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetUserFeatureInfoResponse_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetUserFeatureInfoResponse_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse.class, com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse.Builder.class);
+    }
+
+    // Construct using com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse.newBuilder()
+    private Builder() {
+      maybeForceBuilderInitialization();
+    }
+
+    private Builder(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+      maybeForceBuilderInitialization();
+    }
+    private void maybeForceBuilderInitialization() {
+      if (com.google.protobuf.GeneratedMessageV3
+              .alwaysUseFieldBuilders) {
+        getUserFeatureInfoFieldBuilder();
+      }
+    }
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      if (resultBuilder_ == null) {
+        result_ = null;
+      } else {
+        result_ = null;
+        resultBuilder_ = null;
+      }
+      if (userFeatureInfoBuilder_ == null) {
+        userFeatureInfo_ = java.util.Collections.emptyList();
+        bitField0_ = (bitField0_ & ~0x00000001);
+      } else {
+        userFeatureInfoBuilder_.clear();
+      }
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetUserFeatureInfoResponse_descriptor;
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse getDefaultInstanceForType() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse build() {
+      com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse buildPartial() {
+      com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse result = new com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse(this);
+      int from_bitField0_ = bitField0_;
+      if (resultBuilder_ == null) {
+        result.result_ = result_;
+      } else {
+        result.result_ = resultBuilder_.build();
+      }
+      if (userFeatureInfoBuilder_ == null) {
+        if (((bitField0_ & 0x00000001) != 0)) {
+          userFeatureInfo_ = java.util.Collections.unmodifiableList(userFeatureInfo_);
+          bitField0_ = (bitField0_ & ~0x00000001);
+        }
+        result.userFeatureInfo_ = userFeatureInfo_;
+      } else {
+        result.userFeatureInfo_ = userFeatureInfoBuilder_.build();
+      }
+      onBuilt();
+      return result;
+    }
+
+    @java.lang.Override
+    public Builder clone() {
+      return super.clone();
+    }
+    @java.lang.Override
+    public Builder setField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.setField(field, value);
+    }
+    @java.lang.Override
+    public Builder clearField(
+        com.google.protobuf.Descriptors.FieldDescriptor field) {
+      return super.clearField(field);
+    }
+    @java.lang.Override
+    public Builder clearOneof(
+        com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+      return super.clearOneof(oneof);
+    }
+    @java.lang.Override
+    public Builder setRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        int index, java.lang.Object value) {
+      return super.setRepeatedField(field, index, value);
+    }
+    @java.lang.Override
+    public Builder addRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.addRepeatedField(field, value);
+    }
+    @java.lang.Override
+    public Builder mergeFrom(com.google.protobuf.Message other) {
+      if (other instanceof com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse) {
+        return mergeFrom((com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse other) {
+      if (other == com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse.getDefaultInstance()) return this;
+      if (other.hasResult()) {
+        mergeResult(other.getResult());
+      }
+      if (userFeatureInfoBuilder_ == null) {
+        if (!other.userFeatureInfo_.isEmpty()) {
+          if (userFeatureInfo_.isEmpty()) {
+            userFeatureInfo_ = other.userFeatureInfo_;
+            bitField0_ = (bitField0_ & ~0x00000001);
+          } else {
+            ensureUserFeatureInfoIsMutable();
+            userFeatureInfo_.addAll(other.userFeatureInfo_);
+          }
+          onChanged();
+        }
+      } else {
+        if (!other.userFeatureInfo_.isEmpty()) {
+          if (userFeatureInfoBuilder_.isEmpty()) {
+            userFeatureInfoBuilder_.dispose();
+            userFeatureInfoBuilder_ = null;
+            userFeatureInfo_ = other.userFeatureInfo_;
+            bitField0_ = (bitField0_ & ~0x00000001);
+            userFeatureInfoBuilder_ = 
+              com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
+                 getUserFeatureInfoFieldBuilder() : null;
+          } else {
+            userFeatureInfoBuilder_.addAllMessages(other.userFeatureInfo_);
+          }
+        }
+      }
+      this.mergeUnknownFields(other.unknownFields);
+      onChanged();
+      return this;
+    }
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse) e.getUnfinishedMessage();
+        throw e.unwrapIOException();
+      } finally {
+        if (parsedMessage != null) {
+          mergeFrom(parsedMessage);
+        }
+      }
+      return this;
+    }
+    private int bitField0_;
+
+    private com.tzld.piaoquan.recommend.feature.model.common.Result result_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.tzld.piaoquan.recommend.feature.model.common.Result, com.tzld.piaoquan.recommend.feature.model.common.Result.Builder, com.tzld.piaoquan.recommend.feature.model.common.ResultOrBuilder> resultBuilder_;
+    /**
+     * <code>.Result result = 1;</code>
+     * @return Whether the result field is set.
+     */
+    public boolean hasResult() {
+      return resultBuilder_ != null || result_ != null;
+    }
+    /**
+     * <code>.Result result = 1;</code>
+     * @return The result.
+     */
+    public com.tzld.piaoquan.recommend.feature.model.common.Result getResult() {
+      if (resultBuilder_ == null) {
+        return result_ == null ? com.tzld.piaoquan.recommend.feature.model.common.Result.getDefaultInstance() : result_;
+      } else {
+        return resultBuilder_.getMessage();
+      }
+    }
+    /**
+     * <code>.Result result = 1;</code>
+     */
+    public Builder setResult(com.tzld.piaoquan.recommend.feature.model.common.Result value) {
+      if (resultBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        result_ = value;
+        onChanged();
+      } else {
+        resultBuilder_.setMessage(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.Result result = 1;</code>
+     */
+    public Builder setResult(
+        com.tzld.piaoquan.recommend.feature.model.common.Result.Builder builderForValue) {
+      if (resultBuilder_ == null) {
+        result_ = builderForValue.build();
+        onChanged();
+      } else {
+        resultBuilder_.setMessage(builderForValue.build());
+      }
+
+      return this;
+    }
+    /**
+     * <code>.Result result = 1;</code>
+     */
+    public Builder mergeResult(com.tzld.piaoquan.recommend.feature.model.common.Result value) {
+      if (resultBuilder_ == null) {
+        if (result_ != null) {
+          result_ =
+            com.tzld.piaoquan.recommend.feature.model.common.Result.newBuilder(result_).mergeFrom(value).buildPartial();
+        } else {
+          result_ = value;
+        }
+        onChanged();
+      } else {
+        resultBuilder_.mergeFrom(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.Result result = 1;</code>
+     */
+    public Builder clearResult() {
+      if (resultBuilder_ == null) {
+        result_ = null;
+        onChanged();
+      } else {
+        result_ = null;
+        resultBuilder_ = null;
+      }
+
+      return this;
+    }
+    /**
+     * <code>.Result result = 1;</code>
+     */
+    public com.tzld.piaoquan.recommend.feature.model.common.Result.Builder getResultBuilder() {
+      
+      onChanged();
+      return getResultFieldBuilder().getBuilder();
+    }
+    /**
+     * <code>.Result result = 1;</code>
+     */
+    public com.tzld.piaoquan.recommend.feature.model.common.ResultOrBuilder getResultOrBuilder() {
+      if (resultBuilder_ != null) {
+        return resultBuilder_.getMessageOrBuilder();
+      } else {
+        return result_ == null ?
+            com.tzld.piaoquan.recommend.feature.model.common.Result.getDefaultInstance() : result_;
+      }
+    }
+    /**
+     * <code>.Result result = 1;</code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.tzld.piaoquan.recommend.feature.model.common.Result, com.tzld.piaoquan.recommend.feature.model.common.Result.Builder, com.tzld.piaoquan.recommend.feature.model.common.ResultOrBuilder> 
+        getResultFieldBuilder() {
+      if (resultBuilder_ == null) {
+        resultBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            com.tzld.piaoquan.recommend.feature.model.common.Result, com.tzld.piaoquan.recommend.feature.model.common.Result.Builder, com.tzld.piaoquan.recommend.feature.model.common.ResultOrBuilder>(
+                getResult(),
+                getParentForChildren(),
+                isClean());
+        result_ = null;
+      }
+      return resultBuilder_;
+    }
+
+    private java.util.List<com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo> userFeatureInfo_ =
+      java.util.Collections.emptyList();
+    private void ensureUserFeatureInfoIsMutable() {
+      if (!((bitField0_ & 0x00000001) != 0)) {
+        userFeatureInfo_ = new java.util.ArrayList<com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo>(userFeatureInfo_);
+        bitField0_ |= 0x00000001;
+       }
+    }
+
+    private com.google.protobuf.RepeatedFieldBuilderV3<
+        com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo, com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo.Builder, com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoOrBuilder> userFeatureInfoBuilder_;
+
+    /**
+     * <code>repeated .GetUserFeatureInfo user_feature_info = 2;</code>
+     */
+    public java.util.List<com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo> getUserFeatureInfoList() {
+      if (userFeatureInfoBuilder_ == null) {
+        return java.util.Collections.unmodifiableList(userFeatureInfo_);
+      } else {
+        return userFeatureInfoBuilder_.getMessageList();
+      }
+    }
+    /**
+     * <code>repeated .GetUserFeatureInfo user_feature_info = 2;</code>
+     */
+    public int getUserFeatureInfoCount() {
+      if (userFeatureInfoBuilder_ == null) {
+        return userFeatureInfo_.size();
+      } else {
+        return userFeatureInfoBuilder_.getCount();
+      }
+    }
+    /**
+     * <code>repeated .GetUserFeatureInfo user_feature_info = 2;</code>
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo getUserFeatureInfo(int index) {
+      if (userFeatureInfoBuilder_ == null) {
+        return userFeatureInfo_.get(index);
+      } else {
+        return userFeatureInfoBuilder_.getMessage(index);
+      }
+    }
+    /**
+     * <code>repeated .GetUserFeatureInfo user_feature_info = 2;</code>
+     */
+    public Builder setUserFeatureInfo(
+        int index, com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo value) {
+      if (userFeatureInfoBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureUserFeatureInfoIsMutable();
+        userFeatureInfo_.set(index, value);
+        onChanged();
+      } else {
+        userFeatureInfoBuilder_.setMessage(index, value);
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .GetUserFeatureInfo user_feature_info = 2;</code>
+     */
+    public Builder setUserFeatureInfo(
+        int index, com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo.Builder builderForValue) {
+      if (userFeatureInfoBuilder_ == null) {
+        ensureUserFeatureInfoIsMutable();
+        userFeatureInfo_.set(index, builderForValue.build());
+        onChanged();
+      } else {
+        userFeatureInfoBuilder_.setMessage(index, builderForValue.build());
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .GetUserFeatureInfo user_feature_info = 2;</code>
+     */
+    public Builder addUserFeatureInfo(com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo value) {
+      if (userFeatureInfoBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureUserFeatureInfoIsMutable();
+        userFeatureInfo_.add(value);
+        onChanged();
+      } else {
+        userFeatureInfoBuilder_.addMessage(value);
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .GetUserFeatureInfo user_feature_info = 2;</code>
+     */
+    public Builder addUserFeatureInfo(
+        int index, com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo value) {
+      if (userFeatureInfoBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureUserFeatureInfoIsMutable();
+        userFeatureInfo_.add(index, value);
+        onChanged();
+      } else {
+        userFeatureInfoBuilder_.addMessage(index, value);
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .GetUserFeatureInfo user_feature_info = 2;</code>
+     */
+    public Builder addUserFeatureInfo(
+        com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo.Builder builderForValue) {
+      if (userFeatureInfoBuilder_ == null) {
+        ensureUserFeatureInfoIsMutable();
+        userFeatureInfo_.add(builderForValue.build());
+        onChanged();
+      } else {
+        userFeatureInfoBuilder_.addMessage(builderForValue.build());
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .GetUserFeatureInfo user_feature_info = 2;</code>
+     */
+    public Builder addUserFeatureInfo(
+        int index, com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo.Builder builderForValue) {
+      if (userFeatureInfoBuilder_ == null) {
+        ensureUserFeatureInfoIsMutable();
+        userFeatureInfo_.add(index, builderForValue.build());
+        onChanged();
+      } else {
+        userFeatureInfoBuilder_.addMessage(index, builderForValue.build());
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .GetUserFeatureInfo user_feature_info = 2;</code>
+     */
+    public Builder addAllUserFeatureInfo(
+        java.lang.Iterable<? extends com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo> values) {
+      if (userFeatureInfoBuilder_ == null) {
+        ensureUserFeatureInfoIsMutable();
+        com.google.protobuf.AbstractMessageLite.Builder.addAll(
+            values, userFeatureInfo_);
+        onChanged();
+      } else {
+        userFeatureInfoBuilder_.addAllMessages(values);
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .GetUserFeatureInfo user_feature_info = 2;</code>
+     */
+    public Builder clearUserFeatureInfo() {
+      if (userFeatureInfoBuilder_ == null) {
+        userFeatureInfo_ = java.util.Collections.emptyList();
+        bitField0_ = (bitField0_ & ~0x00000001);
+        onChanged();
+      } else {
+        userFeatureInfoBuilder_.clear();
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .GetUserFeatureInfo user_feature_info = 2;</code>
+     */
+    public Builder removeUserFeatureInfo(int index) {
+      if (userFeatureInfoBuilder_ == null) {
+        ensureUserFeatureInfoIsMutable();
+        userFeatureInfo_.remove(index);
+        onChanged();
+      } else {
+        userFeatureInfoBuilder_.remove(index);
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .GetUserFeatureInfo user_feature_info = 2;</code>
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo.Builder getUserFeatureInfoBuilder(
+        int index) {
+      return getUserFeatureInfoFieldBuilder().getBuilder(index);
+    }
+    /**
+     * <code>repeated .GetUserFeatureInfo user_feature_info = 2;</code>
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoOrBuilder getUserFeatureInfoOrBuilder(
+        int index) {
+      if (userFeatureInfoBuilder_ == null) {
+        return userFeatureInfo_.get(index);  } else {
+        return userFeatureInfoBuilder_.getMessageOrBuilder(index);
+      }
+    }
+    /**
+     * <code>repeated .GetUserFeatureInfo user_feature_info = 2;</code>
+     */
+    public java.util.List<? extends com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoOrBuilder> 
+         getUserFeatureInfoOrBuilderList() {
+      if (userFeatureInfoBuilder_ != null) {
+        return userFeatureInfoBuilder_.getMessageOrBuilderList();
+      } else {
+        return java.util.Collections.unmodifiableList(userFeatureInfo_);
+      }
+    }
+    /**
+     * <code>repeated .GetUserFeatureInfo user_feature_info = 2;</code>
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo.Builder addUserFeatureInfoBuilder() {
+      return getUserFeatureInfoFieldBuilder().addBuilder(
+          com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo.getDefaultInstance());
+    }
+    /**
+     * <code>repeated .GetUserFeatureInfo user_feature_info = 2;</code>
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo.Builder addUserFeatureInfoBuilder(
+        int index) {
+      return getUserFeatureInfoFieldBuilder().addBuilder(
+          index, com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo.getDefaultInstance());
+    }
+    /**
+     * <code>repeated .GetUserFeatureInfo user_feature_info = 2;</code>
+     */
+    public java.util.List<com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo.Builder> 
+         getUserFeatureInfoBuilderList() {
+      return getUserFeatureInfoFieldBuilder().getBuilderList();
+    }
+    private com.google.protobuf.RepeatedFieldBuilderV3<
+        com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo, com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo.Builder, com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoOrBuilder> 
+        getUserFeatureInfoFieldBuilder() {
+      if (userFeatureInfoBuilder_ == null) {
+        userFeatureInfoBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+            com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo, com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo.Builder, com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoOrBuilder>(
+                userFeatureInfo_,
+                ((bitField0_ & 0x00000001) != 0),
+                getParentForChildren(),
+                isClean());
+        userFeatureInfo_ = null;
+      }
+      return userFeatureInfoBuilder_;
+    }
+    @java.lang.Override
+    public final Builder setUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.setUnknownFields(unknownFields);
+    }
+
+    @java.lang.Override
+    public final Builder mergeUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.mergeUnknownFields(unknownFields);
+    }
+
+
+    // @@protoc_insertion_point(builder_scope:GetUserFeatureInfoResponse)
+  }
+
+  // @@protoc_insertion_point(class_scope:GetUserFeatureInfoResponse)
+  private static final com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse();
+  }
+
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<GetUserFeatureInfoResponse>
+      PARSER = new com.google.protobuf.AbstractParser<GetUserFeatureInfoResponse>() {
+    @java.lang.Override
+    public GetUserFeatureInfoResponse parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new GetUserFeatureInfoResponse(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<GetUserFeatureInfoResponse> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<GetUserFeatureInfoResponse> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoResponse getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+

+ 48 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetUserFeatureInfoResponseOrBuilder.java

@@ -0,0 +1,48 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: com/tzld/piaoquan/recommend/feature/feature.proto
+
+package com.tzld.piaoquan.recommend.feature.model.feature;
+
+public interface GetUserFeatureInfoResponseOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:GetUserFeatureInfoResponse)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <code>.Result result = 1;</code>
+   * @return Whether the result field is set.
+   */
+  boolean hasResult();
+  /**
+   * <code>.Result result = 1;</code>
+   * @return The result.
+   */
+  com.tzld.piaoquan.recommend.feature.model.common.Result getResult();
+  /**
+   * <code>.Result result = 1;</code>
+   */
+  com.tzld.piaoquan.recommend.feature.model.common.ResultOrBuilder getResultOrBuilder();
+
+  /**
+   * <code>repeated .GetUserFeatureInfo user_feature_info = 2;</code>
+   */
+  java.util.List<com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo> 
+      getUserFeatureInfoList();
+  /**
+   * <code>repeated .GetUserFeatureInfo user_feature_info = 2;</code>
+   */
+  com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo getUserFeatureInfo(int index);
+  /**
+   * <code>repeated .GetUserFeatureInfo user_feature_info = 2;</code>
+   */
+  int getUserFeatureInfoCount();
+  /**
+   * <code>repeated .GetUserFeatureInfo user_feature_info = 2;</code>
+   */
+  java.util.List<? extends com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoOrBuilder> 
+      getUserFeatureInfoOrBuilderList();
+  /**
+   * <code>repeated .GetUserFeatureInfo user_feature_info = 2;</code>
+   */
+  com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfoOrBuilder getUserFeatureInfoOrBuilder(
+      int index);
+}

+ 3532 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetVideoFeatureInfo.java

@@ -0,0 +1,3532 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: com/tzld/piaoquan/recommend/feature/feature.proto
+
+package com.tzld.piaoquan.recommend.feature.model.feature;
+
+/**
+ * Protobuf type {@code GetVideoFeatureInfo}
+ */
+public final class GetVideoFeatureInfo extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:GetVideoFeatureInfo)
+    GetVideoFeatureInfoOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use GetVideoFeatureInfo.newBuilder() to construct.
+  private GetVideoFeatureInfo(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private GetVideoFeatureInfo() {
+    gmtCreate_ = "";
+  }
+
+  @java.lang.Override
+  @SuppressWarnings({"unused"})
+  protected java.lang.Object newInstance(
+      UnusedPrivateParameter unused) {
+    return new GetVideoFeatureInfo();
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private GetVideoFeatureInfo(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    this();
+    if (extensionRegistry == null) {
+      throw new java.lang.NullPointerException();
+    }
+    com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+        com.google.protobuf.UnknownFieldSet.newBuilder();
+    try {
+      boolean done = false;
+      while (!done) {
+        int tag = input.readTag();
+        switch (tag) {
+          case 0:
+            done = true;
+            break;
+          case 8: {
+
+            videoId_ = input.readInt64();
+            break;
+          }
+          case 16: {
+
+            playCountTotal_ = input.readInt64();
+            break;
+          }
+          case 24: {
+
+            totalTime_ = input.readInt32();
+            break;
+          }
+          case 34: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            gmtCreate_ = s;
+            break;
+          }
+          case 40: {
+
+            uid_ = input.readInt64();
+            break;
+          }
+          case 48: {
+
+            i15MinExpCnt_ = input.readInt64();
+            break;
+          }
+          case 56: {
+
+            i15MinClickCnt_ = input.readInt64();
+            break;
+          }
+          case 64: {
+
+            i15MinShareCnt_ = input.readInt64();
+            break;
+          }
+          case 72: {
+
+            i15MinReturnCnt_ = input.readInt64();
+            break;
+          }
+          case 81: {
+
+            iCtr15Min_ = input.readDouble();
+            break;
+          }
+          case 89: {
+
+            iStr15Min_ = input.readDouble();
+            break;
+          }
+          case 97: {
+
+            iRov15Min_ = input.readDouble();
+            break;
+          }
+          case 105: {
+
+            iRos15Min_ = input.readDouble();
+            break;
+          }
+          case 112: {
+
+            i1HourExpCnt_ = input.readInt64();
+            break;
+          }
+          case 120: {
+
+            i1HourClickCnt_ = input.readInt64();
+            break;
+          }
+          case 128: {
+
+            i1HourShareCnt_ = input.readInt64();
+            break;
+          }
+          case 136: {
+
+            i1HourReturnCnt_ = input.readInt64();
+            break;
+          }
+          case 145: {
+
+            iCtr1Hour_ = input.readDouble();
+            break;
+          }
+          case 153: {
+
+            iStr1Hour_ = input.readDouble();
+            break;
+          }
+          case 161: {
+
+            iRov1Hour_ = input.readDouble();
+            break;
+          }
+          case 169: {
+
+            iRos1Hour_ = input.readDouble();
+            break;
+          }
+          case 176: {
+
+            iTodayExpCnt_ = input.readInt64();
+            break;
+          }
+          case 184: {
+
+            iTodayClickCnt_ = input.readInt64();
+            break;
+          }
+          case 192: {
+
+            iTodayShareCnt_ = input.readInt64();
+            break;
+          }
+          case 200: {
+
+            iTodayReturnCnt_ = input.readInt64();
+            break;
+          }
+          case 209: {
+
+            iCtrToday_ = input.readDouble();
+            break;
+          }
+          case 217: {
+
+            iStrToday_ = input.readDouble();
+            break;
+          }
+          case 225: {
+
+            iRovToday_ = input.readDouble();
+            break;
+          }
+          case 233: {
+
+            iRosToday_ = input.readDouble();
+            break;
+          }
+          case 240: {
+
+            i1DayExpCnt_ = input.readInt64();
+            break;
+          }
+          case 248: {
+
+            i1DayClickCnt_ = input.readInt64();
+            break;
+          }
+          case 256: {
+
+            i1DayShareCnt_ = input.readInt64();
+            break;
+          }
+          case 264: {
+
+            i1DayReturnCnt_ = input.readInt64();
+            break;
+          }
+          case 273: {
+
+            iCtr1Day_ = input.readDouble();
+            break;
+          }
+          case 281: {
+
+            iStr1Day_ = input.readDouble();
+            break;
+          }
+          case 289: {
+
+            iRov1Day_ = input.readDouble();
+            break;
+          }
+          case 297: {
+
+            iRos1Day_ = input.readDouble();
+            break;
+          }
+          case 304: {
+
+            i3DayExpCnt_ = input.readInt64();
+            break;
+          }
+          case 312: {
+
+            i3DayClickCnt_ = input.readInt64();
+            break;
+          }
+          case 320: {
+
+            i3DayShareCnt_ = input.readInt64();
+            break;
+          }
+          case 328: {
+
+            i3DayReturnCnt_ = input.readInt64();
+            break;
+          }
+          case 337: {
+
+            iCtr3Day_ = input.readDouble();
+            break;
+          }
+          case 345: {
+
+            iStr3Day_ = input.readDouble();
+            break;
+          }
+          case 353: {
+
+            iRov3Day_ = input.readDouble();
+            break;
+          }
+          case 361: {
+
+            iRos3Day_ = input.readDouble();
+            break;
+          }
+          default: {
+            if (!parseUnknownField(
+                input, unknownFields, extensionRegistry, tag)) {
+              done = true;
+            }
+            break;
+          }
+        }
+      }
+    } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+      throw e.setUnfinishedMessage(this);
+    } catch (java.io.IOException e) {
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
+    } finally {
+      this.unknownFields = unknownFields.build();
+      makeExtensionsImmutable();
+    }
+  }
+  public static final com.google.protobuf.Descriptors.Descriptor
+      getDescriptor() {
+    return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetVideoFeatureInfo_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetVideoFeatureInfo_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo.class, com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo.Builder.class);
+  }
+
+  public static final int VIDEO_ID_FIELD_NUMBER = 1;
+  private long videoId_;
+  /**
+   * <code>int64 video_id = 1;</code>
+   * @return The videoId.
+   */
+  @java.lang.Override
+  public long getVideoId() {
+    return videoId_;
+  }
+
+  public static final int PLAY_COUNT_TOTAL_FIELD_NUMBER = 2;
+  private long playCountTotal_;
+  /**
+   * <code>int64 play_count_total = 2;</code>
+   * @return The playCountTotal.
+   */
+  @java.lang.Override
+  public long getPlayCountTotal() {
+    return playCountTotal_;
+  }
+
+  public static final int TOTAL_TIME_FIELD_NUMBER = 3;
+  private int totalTime_;
+  /**
+   * <code>int32 total_time = 3;</code>
+   * @return The totalTime.
+   */
+  @java.lang.Override
+  public int getTotalTime() {
+    return totalTime_;
+  }
+
+  public static final int GMT_CREATE_FIELD_NUMBER = 4;
+  private volatile java.lang.Object gmtCreate_;
+  /**
+   * <code>string gmt_create = 4;</code>
+   * @return The gmtCreate.
+   */
+  @java.lang.Override
+  public java.lang.String getGmtCreate() {
+    java.lang.Object ref = gmtCreate_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      gmtCreate_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string gmt_create = 4;</code>
+   * @return The bytes for gmtCreate.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getGmtCreateBytes() {
+    java.lang.Object ref = gmtCreate_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      gmtCreate_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int UID_FIELD_NUMBER = 5;
+  private long uid_;
+  /**
+   * <pre>
+   * 上传者
+   * </pre>
+   *
+   * <code>int64 uid = 5;</code>
+   * @return The uid.
+   */
+  @java.lang.Override
+  public long getUid() {
+    return uid_;
+  }
+
+  public static final int I15MIN_EXP_CNT_FIELD_NUMBER = 6;
+  private long i15MinExpCnt_;
+  /**
+   * <pre>
+   * 过去十五分钟
+   * </pre>
+   *
+   * <code>int64 i15min_exp_cnt = 6;</code>
+   * @return The i15minExpCnt.
+   */
+  @java.lang.Override
+  public long getI15MinExpCnt() {
+    return i15MinExpCnt_;
+  }
+
+  public static final int I15MIN_CLICK_CNT_FIELD_NUMBER = 7;
+  private long i15MinClickCnt_;
+  /**
+   * <code>int64 i15min_click_cnt = 7;</code>
+   * @return The i15minClickCnt.
+   */
+  @java.lang.Override
+  public long getI15MinClickCnt() {
+    return i15MinClickCnt_;
+  }
+
+  public static final int I15MIN_SHARE_CNT_FIELD_NUMBER = 8;
+  private long i15MinShareCnt_;
+  /**
+   * <code>int64 i15min_share_cnt = 8;</code>
+   * @return The i15minShareCnt.
+   */
+  @java.lang.Override
+  public long getI15MinShareCnt() {
+    return i15MinShareCnt_;
+  }
+
+  public static final int I15MIN_RETURN_CNT_FIELD_NUMBER = 9;
+  private long i15MinReturnCnt_;
+  /**
+   * <code>int64 i15min_return_cnt = 9;</code>
+   * @return The i15minReturnCnt.
+   */
+  @java.lang.Override
+  public long getI15MinReturnCnt() {
+    return i15MinReturnCnt_;
+  }
+
+  public static final int I_CTR15MIN_FIELD_NUMBER = 10;
+  private double iCtr15Min_;
+  /**
+   * <code>double i_ctr15min = 10;</code>
+   * @return The iCtr15min.
+   */
+  @java.lang.Override
+  public double getICtr15Min() {
+    return iCtr15Min_;
+  }
+
+  public static final int I_STR15MIN_FIELD_NUMBER = 11;
+  private double iStr15Min_;
+  /**
+   * <code>double i_str15min = 11;</code>
+   * @return The iStr15min.
+   */
+  @java.lang.Override
+  public double getIStr15Min() {
+    return iStr15Min_;
+  }
+
+  public static final int I_ROV15MIN_FIELD_NUMBER = 12;
+  private double iRov15Min_;
+  /**
+   * <code>double i_rov15min = 12;</code>
+   * @return The iRov15min.
+   */
+  @java.lang.Override
+  public double getIRov15Min() {
+    return iRov15Min_;
+  }
+
+  public static final int I_ROS15MIN_FIELD_NUMBER = 13;
+  private double iRos15Min_;
+  /**
+   * <code>double i_ros15min = 13;</code>
+   * @return The iRos15min.
+   */
+  @java.lang.Override
+  public double getIRos15Min() {
+    return iRos15Min_;
+  }
+
+  public static final int I1HOUR_EXP_CNT_FIELD_NUMBER = 14;
+  private long i1HourExpCnt_;
+  /**
+   * <pre>
+   * 过去一小时
+   * </pre>
+   *
+   * <code>int64 i1hour_exp_cnt = 14;</code>
+   * @return The i1hourExpCnt.
+   */
+  @java.lang.Override
+  public long getI1HourExpCnt() {
+    return i1HourExpCnt_;
+  }
+
+  public static final int I1HOUR_CLICK_CNT_FIELD_NUMBER = 15;
+  private long i1HourClickCnt_;
+  /**
+   * <code>int64 i1hour_click_cnt = 15;</code>
+   * @return The i1hourClickCnt.
+   */
+  @java.lang.Override
+  public long getI1HourClickCnt() {
+    return i1HourClickCnt_;
+  }
+
+  public static final int I1HOUR_SHARE_CNT_FIELD_NUMBER = 16;
+  private long i1HourShareCnt_;
+  /**
+   * <code>int64 i1hour_share_cnt = 16;</code>
+   * @return The i1hourShareCnt.
+   */
+  @java.lang.Override
+  public long getI1HourShareCnt() {
+    return i1HourShareCnt_;
+  }
+
+  public static final int I1HOUR_RETURN_CNT_FIELD_NUMBER = 17;
+  private long i1HourReturnCnt_;
+  /**
+   * <code>int64 i1hour_return_cnt = 17;</code>
+   * @return The i1hourReturnCnt.
+   */
+  @java.lang.Override
+  public long getI1HourReturnCnt() {
+    return i1HourReturnCnt_;
+  }
+
+  public static final int I_CTR1HOUR_FIELD_NUMBER = 18;
+  private double iCtr1Hour_;
+  /**
+   * <code>double i_ctr1hour = 18;</code>
+   * @return The iCtr1hour.
+   */
+  @java.lang.Override
+  public double getICtr1Hour() {
+    return iCtr1Hour_;
+  }
+
+  public static final int I_STR1HOUR_FIELD_NUMBER = 19;
+  private double iStr1Hour_;
+  /**
+   * <code>double i_str1hour = 19;</code>
+   * @return The iStr1hour.
+   */
+  @java.lang.Override
+  public double getIStr1Hour() {
+    return iStr1Hour_;
+  }
+
+  public static final int I_ROV1HOUR_FIELD_NUMBER = 20;
+  private double iRov1Hour_;
+  /**
+   * <code>double i_rov1hour = 20;</code>
+   * @return The iRov1hour.
+   */
+  @java.lang.Override
+  public double getIRov1Hour() {
+    return iRov1Hour_;
+  }
+
+  public static final int I_ROS1HOUR_FIELD_NUMBER = 21;
+  private double iRos1Hour_;
+  /**
+   * <code>double i_ros1hour = 21;</code>
+   * @return The iRos1hour.
+   */
+  @java.lang.Override
+  public double getIRos1Hour() {
+    return iRos1Hour_;
+  }
+
+  public static final int I_TODAY_EXP_CNT_FIELD_NUMBER = 22;
+  private long iTodayExpCnt_;
+  /**
+   * <pre>
+   * 今天
+   * </pre>
+   *
+   * <code>int64 i_today_exp_cnt = 22;</code>
+   * @return The iTodayExpCnt.
+   */
+  @java.lang.Override
+  public long getITodayExpCnt() {
+    return iTodayExpCnt_;
+  }
+
+  public static final int I_TODAY_CLICK_CNT_FIELD_NUMBER = 23;
+  private long iTodayClickCnt_;
+  /**
+   * <code>int64 i_today_click_cnt = 23;</code>
+   * @return The iTodayClickCnt.
+   */
+  @java.lang.Override
+  public long getITodayClickCnt() {
+    return iTodayClickCnt_;
+  }
+
+  public static final int I_TODAY_SHARE_CNT_FIELD_NUMBER = 24;
+  private long iTodayShareCnt_;
+  /**
+   * <code>int64 i_today_share_cnt = 24;</code>
+   * @return The iTodayShareCnt.
+   */
+  @java.lang.Override
+  public long getITodayShareCnt() {
+    return iTodayShareCnt_;
+  }
+
+  public static final int I_TODAY_RETURN_CNT_FIELD_NUMBER = 25;
+  private long iTodayReturnCnt_;
+  /**
+   * <code>int64 i_today_return_cnt = 25;</code>
+   * @return The iTodayReturnCnt.
+   */
+  @java.lang.Override
+  public long getITodayReturnCnt() {
+    return iTodayReturnCnt_;
+  }
+
+  public static final int I_CTR_TODAY_FIELD_NUMBER = 26;
+  private double iCtrToday_;
+  /**
+   * <code>double i_ctr_today = 26;</code>
+   * @return The iCtrToday.
+   */
+  @java.lang.Override
+  public double getICtrToday() {
+    return iCtrToday_;
+  }
+
+  public static final int I_STR_TODAY_FIELD_NUMBER = 27;
+  private double iStrToday_;
+  /**
+   * <code>double i_str_today = 27;</code>
+   * @return The iStrToday.
+   */
+  @java.lang.Override
+  public double getIStrToday() {
+    return iStrToday_;
+  }
+
+  public static final int I_ROV_TODAY_FIELD_NUMBER = 28;
+  private double iRovToday_;
+  /**
+   * <code>double i_rov_today = 28;</code>
+   * @return The iRovToday.
+   */
+  @java.lang.Override
+  public double getIRovToday() {
+    return iRovToday_;
+  }
+
+  public static final int I_ROS_TODAY_FIELD_NUMBER = 29;
+  private double iRosToday_;
+  /**
+   * <code>double i_ros_today = 29;</code>
+   * @return The iRosToday.
+   */
+  @java.lang.Override
+  public double getIRosToday() {
+    return iRosToday_;
+  }
+
+  public static final int I1DAY_EXP_CNT_FIELD_NUMBER = 30;
+  private long i1DayExpCnt_;
+  /**
+   * <pre>
+   * 过去一天
+   * </pre>
+   *
+   * <code>int64 i1day_exp_cnt = 30;</code>
+   * @return The i1dayExpCnt.
+   */
+  @java.lang.Override
+  public long getI1DayExpCnt() {
+    return i1DayExpCnt_;
+  }
+
+  public static final int I1DAY_CLICK_CNT_FIELD_NUMBER = 31;
+  private long i1DayClickCnt_;
+  /**
+   * <code>int64 i1day_click_cnt = 31;</code>
+   * @return The i1dayClickCnt.
+   */
+  @java.lang.Override
+  public long getI1DayClickCnt() {
+    return i1DayClickCnt_;
+  }
+
+  public static final int I1DAY_SHARE_CNT_FIELD_NUMBER = 32;
+  private long i1DayShareCnt_;
+  /**
+   * <code>int64 i1day_share_cnt = 32;</code>
+   * @return The i1dayShareCnt.
+   */
+  @java.lang.Override
+  public long getI1DayShareCnt() {
+    return i1DayShareCnt_;
+  }
+
+  public static final int I1DAY_RETURN_CNT_FIELD_NUMBER = 33;
+  private long i1DayReturnCnt_;
+  /**
+   * <code>int64 i1day_return_cnt = 33;</code>
+   * @return The i1dayReturnCnt.
+   */
+  @java.lang.Override
+  public long getI1DayReturnCnt() {
+    return i1DayReturnCnt_;
+  }
+
+  public static final int I_CTR1DAY_FIELD_NUMBER = 34;
+  private double iCtr1Day_;
+  /**
+   * <code>double i_ctr1day = 34;</code>
+   * @return The iCtr1day.
+   */
+  @java.lang.Override
+  public double getICtr1Day() {
+    return iCtr1Day_;
+  }
+
+  public static final int I_STR1DAY_FIELD_NUMBER = 35;
+  private double iStr1Day_;
+  /**
+   * <code>double i_str1day = 35;</code>
+   * @return The iStr1day.
+   */
+  @java.lang.Override
+  public double getIStr1Day() {
+    return iStr1Day_;
+  }
+
+  public static final int I_ROV1DAY_FIELD_NUMBER = 36;
+  private double iRov1Day_;
+  /**
+   * <code>double i_rov1day = 36;</code>
+   * @return The iRov1day.
+   */
+  @java.lang.Override
+  public double getIRov1Day() {
+    return iRov1Day_;
+  }
+
+  public static final int I_ROS1DAY_FIELD_NUMBER = 37;
+  private double iRos1Day_;
+  /**
+   * <code>double i_ros1day = 37;</code>
+   * @return The iRos1day.
+   */
+  @java.lang.Override
+  public double getIRos1Day() {
+    return iRos1Day_;
+  }
+
+  public static final int I3DAY_EXP_CNT_FIELD_NUMBER = 38;
+  private long i3DayExpCnt_;
+  /**
+   * <pre>
+   * 过去三天
+   * </pre>
+   *
+   * <code>int64 i3day_exp_cnt = 38;</code>
+   * @return The i3dayExpCnt.
+   */
+  @java.lang.Override
+  public long getI3DayExpCnt() {
+    return i3DayExpCnt_;
+  }
+
+  public static final int I3DAY_CLICK_CNT_FIELD_NUMBER = 39;
+  private long i3DayClickCnt_;
+  /**
+   * <code>int64 i3day_click_cnt = 39;</code>
+   * @return The i3dayClickCnt.
+   */
+  @java.lang.Override
+  public long getI3DayClickCnt() {
+    return i3DayClickCnt_;
+  }
+
+  public static final int I3DAY_SHARE_CNT_FIELD_NUMBER = 40;
+  private long i3DayShareCnt_;
+  /**
+   * <code>int64 i3day_share_cnt = 40;</code>
+   * @return The i3dayShareCnt.
+   */
+  @java.lang.Override
+  public long getI3DayShareCnt() {
+    return i3DayShareCnt_;
+  }
+
+  public static final int I3DAY_RETURN_CNT_FIELD_NUMBER = 41;
+  private long i3DayReturnCnt_;
+  /**
+   * <code>int64 i3day_return_cnt = 41;</code>
+   * @return The i3dayReturnCnt.
+   */
+  @java.lang.Override
+  public long getI3DayReturnCnt() {
+    return i3DayReturnCnt_;
+  }
+
+  public static final int I_CTR3DAY_FIELD_NUMBER = 42;
+  private double iCtr3Day_;
+  /**
+   * <code>double i_ctr3day = 42;</code>
+   * @return The iCtr3day.
+   */
+  @java.lang.Override
+  public double getICtr3Day() {
+    return iCtr3Day_;
+  }
+
+  public static final int I_STR3DAY_FIELD_NUMBER = 43;
+  private double iStr3Day_;
+  /**
+   * <code>double i_str3day = 43;</code>
+   * @return The iStr3day.
+   */
+  @java.lang.Override
+  public double getIStr3Day() {
+    return iStr3Day_;
+  }
+
+  public static final int I_ROV3DAY_FIELD_NUMBER = 44;
+  private double iRov3Day_;
+  /**
+   * <code>double i_rov3day = 44;</code>
+   * @return The iRov3day.
+   */
+  @java.lang.Override
+  public double getIRov3Day() {
+    return iRov3Day_;
+  }
+
+  public static final int I_ROS3DAY_FIELD_NUMBER = 45;
+  private double iRos3Day_;
+  /**
+   * <code>double i_ros3day = 45;</code>
+   * @return The iRos3day.
+   */
+  @java.lang.Override
+  public double getIRos3Day() {
+    return iRos3Day_;
+  }
+
+  private byte memoizedIsInitialized = -1;
+  @java.lang.Override
+  public final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
+  }
+
+  @java.lang.Override
+  public void writeTo(com.google.protobuf.CodedOutputStream output)
+                      throws java.io.IOException {
+    if (videoId_ != 0L) {
+      output.writeInt64(1, videoId_);
+    }
+    if (playCountTotal_ != 0L) {
+      output.writeInt64(2, playCountTotal_);
+    }
+    if (totalTime_ != 0) {
+      output.writeInt32(3, totalTime_);
+    }
+    if (!getGmtCreateBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 4, gmtCreate_);
+    }
+    if (uid_ != 0L) {
+      output.writeInt64(5, uid_);
+    }
+    if (i15MinExpCnt_ != 0L) {
+      output.writeInt64(6, i15MinExpCnt_);
+    }
+    if (i15MinClickCnt_ != 0L) {
+      output.writeInt64(7, i15MinClickCnt_);
+    }
+    if (i15MinShareCnt_ != 0L) {
+      output.writeInt64(8, i15MinShareCnt_);
+    }
+    if (i15MinReturnCnt_ != 0L) {
+      output.writeInt64(9, i15MinReturnCnt_);
+    }
+    if (iCtr15Min_ != 0D) {
+      output.writeDouble(10, iCtr15Min_);
+    }
+    if (iStr15Min_ != 0D) {
+      output.writeDouble(11, iStr15Min_);
+    }
+    if (iRov15Min_ != 0D) {
+      output.writeDouble(12, iRov15Min_);
+    }
+    if (iRos15Min_ != 0D) {
+      output.writeDouble(13, iRos15Min_);
+    }
+    if (i1HourExpCnt_ != 0L) {
+      output.writeInt64(14, i1HourExpCnt_);
+    }
+    if (i1HourClickCnt_ != 0L) {
+      output.writeInt64(15, i1HourClickCnt_);
+    }
+    if (i1HourShareCnt_ != 0L) {
+      output.writeInt64(16, i1HourShareCnt_);
+    }
+    if (i1HourReturnCnt_ != 0L) {
+      output.writeInt64(17, i1HourReturnCnt_);
+    }
+    if (iCtr1Hour_ != 0D) {
+      output.writeDouble(18, iCtr1Hour_);
+    }
+    if (iStr1Hour_ != 0D) {
+      output.writeDouble(19, iStr1Hour_);
+    }
+    if (iRov1Hour_ != 0D) {
+      output.writeDouble(20, iRov1Hour_);
+    }
+    if (iRos1Hour_ != 0D) {
+      output.writeDouble(21, iRos1Hour_);
+    }
+    if (iTodayExpCnt_ != 0L) {
+      output.writeInt64(22, iTodayExpCnt_);
+    }
+    if (iTodayClickCnt_ != 0L) {
+      output.writeInt64(23, iTodayClickCnt_);
+    }
+    if (iTodayShareCnt_ != 0L) {
+      output.writeInt64(24, iTodayShareCnt_);
+    }
+    if (iTodayReturnCnt_ != 0L) {
+      output.writeInt64(25, iTodayReturnCnt_);
+    }
+    if (iCtrToday_ != 0D) {
+      output.writeDouble(26, iCtrToday_);
+    }
+    if (iStrToday_ != 0D) {
+      output.writeDouble(27, iStrToday_);
+    }
+    if (iRovToday_ != 0D) {
+      output.writeDouble(28, iRovToday_);
+    }
+    if (iRosToday_ != 0D) {
+      output.writeDouble(29, iRosToday_);
+    }
+    if (i1DayExpCnt_ != 0L) {
+      output.writeInt64(30, i1DayExpCnt_);
+    }
+    if (i1DayClickCnt_ != 0L) {
+      output.writeInt64(31, i1DayClickCnt_);
+    }
+    if (i1DayShareCnt_ != 0L) {
+      output.writeInt64(32, i1DayShareCnt_);
+    }
+    if (i1DayReturnCnt_ != 0L) {
+      output.writeInt64(33, i1DayReturnCnt_);
+    }
+    if (iCtr1Day_ != 0D) {
+      output.writeDouble(34, iCtr1Day_);
+    }
+    if (iStr1Day_ != 0D) {
+      output.writeDouble(35, iStr1Day_);
+    }
+    if (iRov1Day_ != 0D) {
+      output.writeDouble(36, iRov1Day_);
+    }
+    if (iRos1Day_ != 0D) {
+      output.writeDouble(37, iRos1Day_);
+    }
+    if (i3DayExpCnt_ != 0L) {
+      output.writeInt64(38, i3DayExpCnt_);
+    }
+    if (i3DayClickCnt_ != 0L) {
+      output.writeInt64(39, i3DayClickCnt_);
+    }
+    if (i3DayShareCnt_ != 0L) {
+      output.writeInt64(40, i3DayShareCnt_);
+    }
+    if (i3DayReturnCnt_ != 0L) {
+      output.writeInt64(41, i3DayReturnCnt_);
+    }
+    if (iCtr3Day_ != 0D) {
+      output.writeDouble(42, iCtr3Day_);
+    }
+    if (iStr3Day_ != 0D) {
+      output.writeDouble(43, iStr3Day_);
+    }
+    if (iRov3Day_ != 0D) {
+      output.writeDouble(44, iRov3Day_);
+    }
+    if (iRos3Day_ != 0D) {
+      output.writeDouble(45, iRos3Day_);
+    }
+    unknownFields.writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    if (videoId_ != 0L) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt64Size(1, videoId_);
+    }
+    if (playCountTotal_ != 0L) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt64Size(2, playCountTotal_);
+    }
+    if (totalTime_ != 0) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt32Size(3, totalTime_);
+    }
+    if (!getGmtCreateBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, gmtCreate_);
+    }
+    if (uid_ != 0L) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt64Size(5, uid_);
+    }
+    if (i15MinExpCnt_ != 0L) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt64Size(6, i15MinExpCnt_);
+    }
+    if (i15MinClickCnt_ != 0L) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt64Size(7, i15MinClickCnt_);
+    }
+    if (i15MinShareCnt_ != 0L) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt64Size(8, i15MinShareCnt_);
+    }
+    if (i15MinReturnCnt_ != 0L) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt64Size(9, i15MinReturnCnt_);
+    }
+    if (iCtr15Min_ != 0D) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeDoubleSize(10, iCtr15Min_);
+    }
+    if (iStr15Min_ != 0D) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeDoubleSize(11, iStr15Min_);
+    }
+    if (iRov15Min_ != 0D) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeDoubleSize(12, iRov15Min_);
+    }
+    if (iRos15Min_ != 0D) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeDoubleSize(13, iRos15Min_);
+    }
+    if (i1HourExpCnt_ != 0L) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt64Size(14, i1HourExpCnt_);
+    }
+    if (i1HourClickCnt_ != 0L) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt64Size(15, i1HourClickCnt_);
+    }
+    if (i1HourShareCnt_ != 0L) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt64Size(16, i1HourShareCnt_);
+    }
+    if (i1HourReturnCnt_ != 0L) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt64Size(17, i1HourReturnCnt_);
+    }
+    if (iCtr1Hour_ != 0D) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeDoubleSize(18, iCtr1Hour_);
+    }
+    if (iStr1Hour_ != 0D) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeDoubleSize(19, iStr1Hour_);
+    }
+    if (iRov1Hour_ != 0D) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeDoubleSize(20, iRov1Hour_);
+    }
+    if (iRos1Hour_ != 0D) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeDoubleSize(21, iRos1Hour_);
+    }
+    if (iTodayExpCnt_ != 0L) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt64Size(22, iTodayExpCnt_);
+    }
+    if (iTodayClickCnt_ != 0L) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt64Size(23, iTodayClickCnt_);
+    }
+    if (iTodayShareCnt_ != 0L) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt64Size(24, iTodayShareCnt_);
+    }
+    if (iTodayReturnCnt_ != 0L) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt64Size(25, iTodayReturnCnt_);
+    }
+    if (iCtrToday_ != 0D) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeDoubleSize(26, iCtrToday_);
+    }
+    if (iStrToday_ != 0D) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeDoubleSize(27, iStrToday_);
+    }
+    if (iRovToday_ != 0D) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeDoubleSize(28, iRovToday_);
+    }
+    if (iRosToday_ != 0D) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeDoubleSize(29, iRosToday_);
+    }
+    if (i1DayExpCnt_ != 0L) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt64Size(30, i1DayExpCnt_);
+    }
+    if (i1DayClickCnt_ != 0L) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt64Size(31, i1DayClickCnt_);
+    }
+    if (i1DayShareCnt_ != 0L) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt64Size(32, i1DayShareCnt_);
+    }
+    if (i1DayReturnCnt_ != 0L) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt64Size(33, i1DayReturnCnt_);
+    }
+    if (iCtr1Day_ != 0D) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeDoubleSize(34, iCtr1Day_);
+    }
+    if (iStr1Day_ != 0D) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeDoubleSize(35, iStr1Day_);
+    }
+    if (iRov1Day_ != 0D) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeDoubleSize(36, iRov1Day_);
+    }
+    if (iRos1Day_ != 0D) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeDoubleSize(37, iRos1Day_);
+    }
+    if (i3DayExpCnt_ != 0L) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt64Size(38, i3DayExpCnt_);
+    }
+    if (i3DayClickCnt_ != 0L) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt64Size(39, i3DayClickCnt_);
+    }
+    if (i3DayShareCnt_ != 0L) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt64Size(40, i3DayShareCnt_);
+    }
+    if (i3DayReturnCnt_ != 0L) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt64Size(41, i3DayReturnCnt_);
+    }
+    if (iCtr3Day_ != 0D) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeDoubleSize(42, iCtr3Day_);
+    }
+    if (iStr3Day_ != 0D) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeDoubleSize(43, iStr3Day_);
+    }
+    if (iRov3Day_ != 0D) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeDoubleSize(44, iRov3Day_);
+    }
+    if (iRos3Day_ != 0D) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeDoubleSize(45, iRos3Day_);
+    }
+    size += unknownFields.getSerializedSize();
+    memoizedSize = size;
+    return size;
+  }
+
+  @java.lang.Override
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+     return true;
+    }
+    if (!(obj instanceof com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo)) {
+      return super.equals(obj);
+    }
+    com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo other = (com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo) obj;
+
+    if (getVideoId()
+        != other.getVideoId()) return false;
+    if (getPlayCountTotal()
+        != other.getPlayCountTotal()) return false;
+    if (getTotalTime()
+        != other.getTotalTime()) return false;
+    if (!getGmtCreate()
+        .equals(other.getGmtCreate())) return false;
+    if (getUid()
+        != other.getUid()) return false;
+    if (getI15MinExpCnt()
+        != other.getI15MinExpCnt()) return false;
+    if (getI15MinClickCnt()
+        != other.getI15MinClickCnt()) return false;
+    if (getI15MinShareCnt()
+        != other.getI15MinShareCnt()) return false;
+    if (getI15MinReturnCnt()
+        != other.getI15MinReturnCnt()) return false;
+    if (java.lang.Double.doubleToLongBits(getICtr15Min())
+        != java.lang.Double.doubleToLongBits(
+            other.getICtr15Min())) return false;
+    if (java.lang.Double.doubleToLongBits(getIStr15Min())
+        != java.lang.Double.doubleToLongBits(
+            other.getIStr15Min())) return false;
+    if (java.lang.Double.doubleToLongBits(getIRov15Min())
+        != java.lang.Double.doubleToLongBits(
+            other.getIRov15Min())) return false;
+    if (java.lang.Double.doubleToLongBits(getIRos15Min())
+        != java.lang.Double.doubleToLongBits(
+            other.getIRos15Min())) return false;
+    if (getI1HourExpCnt()
+        != other.getI1HourExpCnt()) return false;
+    if (getI1HourClickCnt()
+        != other.getI1HourClickCnt()) return false;
+    if (getI1HourShareCnt()
+        != other.getI1HourShareCnt()) return false;
+    if (getI1HourReturnCnt()
+        != other.getI1HourReturnCnt()) return false;
+    if (java.lang.Double.doubleToLongBits(getICtr1Hour())
+        != java.lang.Double.doubleToLongBits(
+            other.getICtr1Hour())) return false;
+    if (java.lang.Double.doubleToLongBits(getIStr1Hour())
+        != java.lang.Double.doubleToLongBits(
+            other.getIStr1Hour())) return false;
+    if (java.lang.Double.doubleToLongBits(getIRov1Hour())
+        != java.lang.Double.doubleToLongBits(
+            other.getIRov1Hour())) return false;
+    if (java.lang.Double.doubleToLongBits(getIRos1Hour())
+        != java.lang.Double.doubleToLongBits(
+            other.getIRos1Hour())) return false;
+    if (getITodayExpCnt()
+        != other.getITodayExpCnt()) return false;
+    if (getITodayClickCnt()
+        != other.getITodayClickCnt()) return false;
+    if (getITodayShareCnt()
+        != other.getITodayShareCnt()) return false;
+    if (getITodayReturnCnt()
+        != other.getITodayReturnCnt()) return false;
+    if (java.lang.Double.doubleToLongBits(getICtrToday())
+        != java.lang.Double.doubleToLongBits(
+            other.getICtrToday())) return false;
+    if (java.lang.Double.doubleToLongBits(getIStrToday())
+        != java.lang.Double.doubleToLongBits(
+            other.getIStrToday())) return false;
+    if (java.lang.Double.doubleToLongBits(getIRovToday())
+        != java.lang.Double.doubleToLongBits(
+            other.getIRovToday())) return false;
+    if (java.lang.Double.doubleToLongBits(getIRosToday())
+        != java.lang.Double.doubleToLongBits(
+            other.getIRosToday())) return false;
+    if (getI1DayExpCnt()
+        != other.getI1DayExpCnt()) return false;
+    if (getI1DayClickCnt()
+        != other.getI1DayClickCnt()) return false;
+    if (getI1DayShareCnt()
+        != other.getI1DayShareCnt()) return false;
+    if (getI1DayReturnCnt()
+        != other.getI1DayReturnCnt()) return false;
+    if (java.lang.Double.doubleToLongBits(getICtr1Day())
+        != java.lang.Double.doubleToLongBits(
+            other.getICtr1Day())) return false;
+    if (java.lang.Double.doubleToLongBits(getIStr1Day())
+        != java.lang.Double.doubleToLongBits(
+            other.getIStr1Day())) return false;
+    if (java.lang.Double.doubleToLongBits(getIRov1Day())
+        != java.lang.Double.doubleToLongBits(
+            other.getIRov1Day())) return false;
+    if (java.lang.Double.doubleToLongBits(getIRos1Day())
+        != java.lang.Double.doubleToLongBits(
+            other.getIRos1Day())) return false;
+    if (getI3DayExpCnt()
+        != other.getI3DayExpCnt()) return false;
+    if (getI3DayClickCnt()
+        != other.getI3DayClickCnt()) return false;
+    if (getI3DayShareCnt()
+        != other.getI3DayShareCnt()) return false;
+    if (getI3DayReturnCnt()
+        != other.getI3DayReturnCnt()) return false;
+    if (java.lang.Double.doubleToLongBits(getICtr3Day())
+        != java.lang.Double.doubleToLongBits(
+            other.getICtr3Day())) return false;
+    if (java.lang.Double.doubleToLongBits(getIStr3Day())
+        != java.lang.Double.doubleToLongBits(
+            other.getIStr3Day())) return false;
+    if (java.lang.Double.doubleToLongBits(getIRov3Day())
+        != java.lang.Double.doubleToLongBits(
+            other.getIRov3Day())) return false;
+    if (java.lang.Double.doubleToLongBits(getIRos3Day())
+        != java.lang.Double.doubleToLongBits(
+            other.getIRos3Day())) return false;
+    if (!unknownFields.equals(other.unknownFields)) return false;
+    return true;
+  }
+
+  @java.lang.Override
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
+    }
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    hash = (37 * hash) + VIDEO_ID_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        getVideoId());
+    hash = (37 * hash) + PLAY_COUNT_TOTAL_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        getPlayCountTotal());
+    hash = (37 * hash) + TOTAL_TIME_FIELD_NUMBER;
+    hash = (53 * hash) + getTotalTime();
+    hash = (37 * hash) + GMT_CREATE_FIELD_NUMBER;
+    hash = (53 * hash) + getGmtCreate().hashCode();
+    hash = (37 * hash) + UID_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        getUid());
+    hash = (37 * hash) + I15MIN_EXP_CNT_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        getI15MinExpCnt());
+    hash = (37 * hash) + I15MIN_CLICK_CNT_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        getI15MinClickCnt());
+    hash = (37 * hash) + I15MIN_SHARE_CNT_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        getI15MinShareCnt());
+    hash = (37 * hash) + I15MIN_RETURN_CNT_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        getI15MinReturnCnt());
+    hash = (37 * hash) + I_CTR15MIN_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        java.lang.Double.doubleToLongBits(getICtr15Min()));
+    hash = (37 * hash) + I_STR15MIN_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        java.lang.Double.doubleToLongBits(getIStr15Min()));
+    hash = (37 * hash) + I_ROV15MIN_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        java.lang.Double.doubleToLongBits(getIRov15Min()));
+    hash = (37 * hash) + I_ROS15MIN_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        java.lang.Double.doubleToLongBits(getIRos15Min()));
+    hash = (37 * hash) + I1HOUR_EXP_CNT_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        getI1HourExpCnt());
+    hash = (37 * hash) + I1HOUR_CLICK_CNT_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        getI1HourClickCnt());
+    hash = (37 * hash) + I1HOUR_SHARE_CNT_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        getI1HourShareCnt());
+    hash = (37 * hash) + I1HOUR_RETURN_CNT_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        getI1HourReturnCnt());
+    hash = (37 * hash) + I_CTR1HOUR_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        java.lang.Double.doubleToLongBits(getICtr1Hour()));
+    hash = (37 * hash) + I_STR1HOUR_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        java.lang.Double.doubleToLongBits(getIStr1Hour()));
+    hash = (37 * hash) + I_ROV1HOUR_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        java.lang.Double.doubleToLongBits(getIRov1Hour()));
+    hash = (37 * hash) + I_ROS1HOUR_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        java.lang.Double.doubleToLongBits(getIRos1Hour()));
+    hash = (37 * hash) + I_TODAY_EXP_CNT_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        getITodayExpCnt());
+    hash = (37 * hash) + I_TODAY_CLICK_CNT_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        getITodayClickCnt());
+    hash = (37 * hash) + I_TODAY_SHARE_CNT_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        getITodayShareCnt());
+    hash = (37 * hash) + I_TODAY_RETURN_CNT_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        getITodayReturnCnt());
+    hash = (37 * hash) + I_CTR_TODAY_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        java.lang.Double.doubleToLongBits(getICtrToday()));
+    hash = (37 * hash) + I_STR_TODAY_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        java.lang.Double.doubleToLongBits(getIStrToday()));
+    hash = (37 * hash) + I_ROV_TODAY_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        java.lang.Double.doubleToLongBits(getIRovToday()));
+    hash = (37 * hash) + I_ROS_TODAY_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        java.lang.Double.doubleToLongBits(getIRosToday()));
+    hash = (37 * hash) + I1DAY_EXP_CNT_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        getI1DayExpCnt());
+    hash = (37 * hash) + I1DAY_CLICK_CNT_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        getI1DayClickCnt());
+    hash = (37 * hash) + I1DAY_SHARE_CNT_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        getI1DayShareCnt());
+    hash = (37 * hash) + I1DAY_RETURN_CNT_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        getI1DayReturnCnt());
+    hash = (37 * hash) + I_CTR1DAY_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        java.lang.Double.doubleToLongBits(getICtr1Day()));
+    hash = (37 * hash) + I_STR1DAY_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        java.lang.Double.doubleToLongBits(getIStr1Day()));
+    hash = (37 * hash) + I_ROV1DAY_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        java.lang.Double.doubleToLongBits(getIRov1Day()));
+    hash = (37 * hash) + I_ROS1DAY_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        java.lang.Double.doubleToLongBits(getIRos1Day()));
+    hash = (37 * hash) + I3DAY_EXP_CNT_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        getI3DayExpCnt());
+    hash = (37 * hash) + I3DAY_CLICK_CNT_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        getI3DayClickCnt());
+    hash = (37 * hash) + I3DAY_SHARE_CNT_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        getI3DayShareCnt());
+    hash = (37 * hash) + I3DAY_RETURN_CNT_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        getI3DayReturnCnt());
+    hash = (37 * hash) + I_CTR3DAY_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        java.lang.Double.doubleToLongBits(getICtr3Day()));
+    hash = (37 * hash) + I_STR3DAY_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        java.lang.Double.doubleToLongBits(getIStr3Day()));
+    hash = (37 * hash) + I_ROV3DAY_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        java.lang.Double.doubleToLongBits(getIRov3Day()));
+    hash = (37 * hash) + I_ROS3DAY_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        java.lang.Double.doubleToLongBits(getIRos3Day()));
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo parseFrom(
+      java.nio.ByteBuffer data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo parseFrom(
+      com.google.protobuf.ByteString data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo parseFrom(
+      byte[] data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo parseFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo parseFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo parseDelimitedFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo parseDelimitedFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo parseFrom(
+      com.google.protobuf.CodedInputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo parseFrom(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+
+  @java.lang.Override
+  public Builder newBuilderForType() { return newBuilder(); }
+  public static Builder newBuilder() {
+    return DEFAULT_INSTANCE.toBuilder();
+  }
+  public static Builder newBuilder(com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo prototype) {
+    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+  }
+  @java.lang.Override
+  public Builder toBuilder() {
+    return this == DEFAULT_INSTANCE
+        ? new Builder() : new Builder().mergeFrom(this);
+  }
+
+  @java.lang.Override
+  protected Builder newBuilderForType(
+      com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
+  }
+  /**
+   * Protobuf type {@code GetVideoFeatureInfo}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:GetVideoFeatureInfo)
+      com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetVideoFeatureInfo_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetVideoFeatureInfo_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo.class, com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo.Builder.class);
+    }
+
+    // Construct using com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo.newBuilder()
+    private Builder() {
+      maybeForceBuilderInitialization();
+    }
+
+    private Builder(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+      maybeForceBuilderInitialization();
+    }
+    private void maybeForceBuilderInitialization() {
+      if (com.google.protobuf.GeneratedMessageV3
+              .alwaysUseFieldBuilders) {
+      }
+    }
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      videoId_ = 0L;
+
+      playCountTotal_ = 0L;
+
+      totalTime_ = 0;
+
+      gmtCreate_ = "";
+
+      uid_ = 0L;
+
+      i15MinExpCnt_ = 0L;
+
+      i15MinClickCnt_ = 0L;
+
+      i15MinShareCnt_ = 0L;
+
+      i15MinReturnCnt_ = 0L;
+
+      iCtr15Min_ = 0D;
+
+      iStr15Min_ = 0D;
+
+      iRov15Min_ = 0D;
+
+      iRos15Min_ = 0D;
+
+      i1HourExpCnt_ = 0L;
+
+      i1HourClickCnt_ = 0L;
+
+      i1HourShareCnt_ = 0L;
+
+      i1HourReturnCnt_ = 0L;
+
+      iCtr1Hour_ = 0D;
+
+      iStr1Hour_ = 0D;
+
+      iRov1Hour_ = 0D;
+
+      iRos1Hour_ = 0D;
+
+      iTodayExpCnt_ = 0L;
+
+      iTodayClickCnt_ = 0L;
+
+      iTodayShareCnt_ = 0L;
+
+      iTodayReturnCnt_ = 0L;
+
+      iCtrToday_ = 0D;
+
+      iStrToday_ = 0D;
+
+      iRovToday_ = 0D;
+
+      iRosToday_ = 0D;
+
+      i1DayExpCnt_ = 0L;
+
+      i1DayClickCnt_ = 0L;
+
+      i1DayShareCnt_ = 0L;
+
+      i1DayReturnCnt_ = 0L;
+
+      iCtr1Day_ = 0D;
+
+      iStr1Day_ = 0D;
+
+      iRov1Day_ = 0D;
+
+      iRos1Day_ = 0D;
+
+      i3DayExpCnt_ = 0L;
+
+      i3DayClickCnt_ = 0L;
+
+      i3DayShareCnt_ = 0L;
+
+      i3DayReturnCnt_ = 0L;
+
+      iCtr3Day_ = 0D;
+
+      iStr3Day_ = 0D;
+
+      iRov3Day_ = 0D;
+
+      iRos3Day_ = 0D;
+
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetVideoFeatureInfo_descriptor;
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo getDefaultInstanceForType() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo build() {
+      com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo buildPartial() {
+      com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo result = new com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo(this);
+      result.videoId_ = videoId_;
+      result.playCountTotal_ = playCountTotal_;
+      result.totalTime_ = totalTime_;
+      result.gmtCreate_ = gmtCreate_;
+      result.uid_ = uid_;
+      result.i15MinExpCnt_ = i15MinExpCnt_;
+      result.i15MinClickCnt_ = i15MinClickCnt_;
+      result.i15MinShareCnt_ = i15MinShareCnt_;
+      result.i15MinReturnCnt_ = i15MinReturnCnt_;
+      result.iCtr15Min_ = iCtr15Min_;
+      result.iStr15Min_ = iStr15Min_;
+      result.iRov15Min_ = iRov15Min_;
+      result.iRos15Min_ = iRos15Min_;
+      result.i1HourExpCnt_ = i1HourExpCnt_;
+      result.i1HourClickCnt_ = i1HourClickCnt_;
+      result.i1HourShareCnt_ = i1HourShareCnt_;
+      result.i1HourReturnCnt_ = i1HourReturnCnt_;
+      result.iCtr1Hour_ = iCtr1Hour_;
+      result.iStr1Hour_ = iStr1Hour_;
+      result.iRov1Hour_ = iRov1Hour_;
+      result.iRos1Hour_ = iRos1Hour_;
+      result.iTodayExpCnt_ = iTodayExpCnt_;
+      result.iTodayClickCnt_ = iTodayClickCnt_;
+      result.iTodayShareCnt_ = iTodayShareCnt_;
+      result.iTodayReturnCnt_ = iTodayReturnCnt_;
+      result.iCtrToday_ = iCtrToday_;
+      result.iStrToday_ = iStrToday_;
+      result.iRovToday_ = iRovToday_;
+      result.iRosToday_ = iRosToday_;
+      result.i1DayExpCnt_ = i1DayExpCnt_;
+      result.i1DayClickCnt_ = i1DayClickCnt_;
+      result.i1DayShareCnt_ = i1DayShareCnt_;
+      result.i1DayReturnCnt_ = i1DayReturnCnt_;
+      result.iCtr1Day_ = iCtr1Day_;
+      result.iStr1Day_ = iStr1Day_;
+      result.iRov1Day_ = iRov1Day_;
+      result.iRos1Day_ = iRos1Day_;
+      result.i3DayExpCnt_ = i3DayExpCnt_;
+      result.i3DayClickCnt_ = i3DayClickCnt_;
+      result.i3DayShareCnt_ = i3DayShareCnt_;
+      result.i3DayReturnCnt_ = i3DayReturnCnt_;
+      result.iCtr3Day_ = iCtr3Day_;
+      result.iStr3Day_ = iStr3Day_;
+      result.iRov3Day_ = iRov3Day_;
+      result.iRos3Day_ = iRos3Day_;
+      onBuilt();
+      return result;
+    }
+
+    @java.lang.Override
+    public Builder clone() {
+      return super.clone();
+    }
+    @java.lang.Override
+    public Builder setField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.setField(field, value);
+    }
+    @java.lang.Override
+    public Builder clearField(
+        com.google.protobuf.Descriptors.FieldDescriptor field) {
+      return super.clearField(field);
+    }
+    @java.lang.Override
+    public Builder clearOneof(
+        com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+      return super.clearOneof(oneof);
+    }
+    @java.lang.Override
+    public Builder setRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        int index, java.lang.Object value) {
+      return super.setRepeatedField(field, index, value);
+    }
+    @java.lang.Override
+    public Builder addRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.addRepeatedField(field, value);
+    }
+    @java.lang.Override
+    public Builder mergeFrom(com.google.protobuf.Message other) {
+      if (other instanceof com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo) {
+        return mergeFrom((com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo other) {
+      if (other == com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo.getDefaultInstance()) return this;
+      if (other.getVideoId() != 0L) {
+        setVideoId(other.getVideoId());
+      }
+      if (other.getPlayCountTotal() != 0L) {
+        setPlayCountTotal(other.getPlayCountTotal());
+      }
+      if (other.getTotalTime() != 0) {
+        setTotalTime(other.getTotalTime());
+      }
+      if (!other.getGmtCreate().isEmpty()) {
+        gmtCreate_ = other.gmtCreate_;
+        onChanged();
+      }
+      if (other.getUid() != 0L) {
+        setUid(other.getUid());
+      }
+      if (other.getI15MinExpCnt() != 0L) {
+        setI15MinExpCnt(other.getI15MinExpCnt());
+      }
+      if (other.getI15MinClickCnt() != 0L) {
+        setI15MinClickCnt(other.getI15MinClickCnt());
+      }
+      if (other.getI15MinShareCnt() != 0L) {
+        setI15MinShareCnt(other.getI15MinShareCnt());
+      }
+      if (other.getI15MinReturnCnt() != 0L) {
+        setI15MinReturnCnt(other.getI15MinReturnCnt());
+      }
+      if (other.getICtr15Min() != 0D) {
+        setICtr15Min(other.getICtr15Min());
+      }
+      if (other.getIStr15Min() != 0D) {
+        setIStr15Min(other.getIStr15Min());
+      }
+      if (other.getIRov15Min() != 0D) {
+        setIRov15Min(other.getIRov15Min());
+      }
+      if (other.getIRos15Min() != 0D) {
+        setIRos15Min(other.getIRos15Min());
+      }
+      if (other.getI1HourExpCnt() != 0L) {
+        setI1HourExpCnt(other.getI1HourExpCnt());
+      }
+      if (other.getI1HourClickCnt() != 0L) {
+        setI1HourClickCnt(other.getI1HourClickCnt());
+      }
+      if (other.getI1HourShareCnt() != 0L) {
+        setI1HourShareCnt(other.getI1HourShareCnt());
+      }
+      if (other.getI1HourReturnCnt() != 0L) {
+        setI1HourReturnCnt(other.getI1HourReturnCnt());
+      }
+      if (other.getICtr1Hour() != 0D) {
+        setICtr1Hour(other.getICtr1Hour());
+      }
+      if (other.getIStr1Hour() != 0D) {
+        setIStr1Hour(other.getIStr1Hour());
+      }
+      if (other.getIRov1Hour() != 0D) {
+        setIRov1Hour(other.getIRov1Hour());
+      }
+      if (other.getIRos1Hour() != 0D) {
+        setIRos1Hour(other.getIRos1Hour());
+      }
+      if (other.getITodayExpCnt() != 0L) {
+        setITodayExpCnt(other.getITodayExpCnt());
+      }
+      if (other.getITodayClickCnt() != 0L) {
+        setITodayClickCnt(other.getITodayClickCnt());
+      }
+      if (other.getITodayShareCnt() != 0L) {
+        setITodayShareCnt(other.getITodayShareCnt());
+      }
+      if (other.getITodayReturnCnt() != 0L) {
+        setITodayReturnCnt(other.getITodayReturnCnt());
+      }
+      if (other.getICtrToday() != 0D) {
+        setICtrToday(other.getICtrToday());
+      }
+      if (other.getIStrToday() != 0D) {
+        setIStrToday(other.getIStrToday());
+      }
+      if (other.getIRovToday() != 0D) {
+        setIRovToday(other.getIRovToday());
+      }
+      if (other.getIRosToday() != 0D) {
+        setIRosToday(other.getIRosToday());
+      }
+      if (other.getI1DayExpCnt() != 0L) {
+        setI1DayExpCnt(other.getI1DayExpCnt());
+      }
+      if (other.getI1DayClickCnt() != 0L) {
+        setI1DayClickCnt(other.getI1DayClickCnt());
+      }
+      if (other.getI1DayShareCnt() != 0L) {
+        setI1DayShareCnt(other.getI1DayShareCnt());
+      }
+      if (other.getI1DayReturnCnt() != 0L) {
+        setI1DayReturnCnt(other.getI1DayReturnCnt());
+      }
+      if (other.getICtr1Day() != 0D) {
+        setICtr1Day(other.getICtr1Day());
+      }
+      if (other.getIStr1Day() != 0D) {
+        setIStr1Day(other.getIStr1Day());
+      }
+      if (other.getIRov1Day() != 0D) {
+        setIRov1Day(other.getIRov1Day());
+      }
+      if (other.getIRos1Day() != 0D) {
+        setIRos1Day(other.getIRos1Day());
+      }
+      if (other.getI3DayExpCnt() != 0L) {
+        setI3DayExpCnt(other.getI3DayExpCnt());
+      }
+      if (other.getI3DayClickCnt() != 0L) {
+        setI3DayClickCnt(other.getI3DayClickCnt());
+      }
+      if (other.getI3DayShareCnt() != 0L) {
+        setI3DayShareCnt(other.getI3DayShareCnt());
+      }
+      if (other.getI3DayReturnCnt() != 0L) {
+        setI3DayReturnCnt(other.getI3DayReturnCnt());
+      }
+      if (other.getICtr3Day() != 0D) {
+        setICtr3Day(other.getICtr3Day());
+      }
+      if (other.getIStr3Day() != 0D) {
+        setIStr3Day(other.getIStr3Day());
+      }
+      if (other.getIRov3Day() != 0D) {
+        setIRov3Day(other.getIRov3Day());
+      }
+      if (other.getIRos3Day() != 0D) {
+        setIRos3Day(other.getIRos3Day());
+      }
+      this.mergeUnknownFields(other.unknownFields);
+      onChanged();
+      return this;
+    }
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo) e.getUnfinishedMessage();
+        throw e.unwrapIOException();
+      } finally {
+        if (parsedMessage != null) {
+          mergeFrom(parsedMessage);
+        }
+      }
+      return this;
+    }
+
+    private long videoId_ ;
+    /**
+     * <code>int64 video_id = 1;</code>
+     * @return The videoId.
+     */
+    @java.lang.Override
+    public long getVideoId() {
+      return videoId_;
+    }
+    /**
+     * <code>int64 video_id = 1;</code>
+     * @param value The videoId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setVideoId(long value) {
+      
+      videoId_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>int64 video_id = 1;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearVideoId() {
+      
+      videoId_ = 0L;
+      onChanged();
+      return this;
+    }
+
+    private long playCountTotal_ ;
+    /**
+     * <code>int64 play_count_total = 2;</code>
+     * @return The playCountTotal.
+     */
+    @java.lang.Override
+    public long getPlayCountTotal() {
+      return playCountTotal_;
+    }
+    /**
+     * <code>int64 play_count_total = 2;</code>
+     * @param value The playCountTotal to set.
+     * @return This builder for chaining.
+     */
+    public Builder setPlayCountTotal(long value) {
+      
+      playCountTotal_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>int64 play_count_total = 2;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearPlayCountTotal() {
+      
+      playCountTotal_ = 0L;
+      onChanged();
+      return this;
+    }
+
+    private int totalTime_ ;
+    /**
+     * <code>int32 total_time = 3;</code>
+     * @return The totalTime.
+     */
+    @java.lang.Override
+    public int getTotalTime() {
+      return totalTime_;
+    }
+    /**
+     * <code>int32 total_time = 3;</code>
+     * @param value The totalTime to set.
+     * @return This builder for chaining.
+     */
+    public Builder setTotalTime(int value) {
+      
+      totalTime_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>int32 total_time = 3;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearTotalTime() {
+      
+      totalTime_ = 0;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object gmtCreate_ = "";
+    /**
+     * <code>string gmt_create = 4;</code>
+     * @return The gmtCreate.
+     */
+    public java.lang.String getGmtCreate() {
+      java.lang.Object ref = gmtCreate_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        gmtCreate_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string gmt_create = 4;</code>
+     * @return The bytes for gmtCreate.
+     */
+    public com.google.protobuf.ByteString
+        getGmtCreateBytes() {
+      java.lang.Object ref = gmtCreate_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        gmtCreate_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string gmt_create = 4;</code>
+     * @param value The gmtCreate to set.
+     * @return This builder for chaining.
+     */
+    public Builder setGmtCreate(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      gmtCreate_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string gmt_create = 4;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearGmtCreate() {
+      
+      gmtCreate_ = getDefaultInstance().getGmtCreate();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string gmt_create = 4;</code>
+     * @param value The bytes for gmtCreate to set.
+     * @return This builder for chaining.
+     */
+    public Builder setGmtCreateBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      gmtCreate_ = value;
+      onChanged();
+      return this;
+    }
+
+    private long uid_ ;
+    /**
+     * <pre>
+     * 上传者
+     * </pre>
+     *
+     * <code>int64 uid = 5;</code>
+     * @return The uid.
+     */
+    @java.lang.Override
+    public long getUid() {
+      return uid_;
+    }
+    /**
+     * <pre>
+     * 上传者
+     * </pre>
+     *
+     * <code>int64 uid = 5;</code>
+     * @param value The uid to set.
+     * @return This builder for chaining.
+     */
+    public Builder setUid(long value) {
+      
+      uid_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * 上传者
+     * </pre>
+     *
+     * <code>int64 uid = 5;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearUid() {
+      
+      uid_ = 0L;
+      onChanged();
+      return this;
+    }
+
+    private long i15MinExpCnt_ ;
+    /**
+     * <pre>
+     * 过去十五分钟
+     * </pre>
+     *
+     * <code>int64 i15min_exp_cnt = 6;</code>
+     * @return The i15minExpCnt.
+     */
+    @java.lang.Override
+    public long getI15MinExpCnt() {
+      return i15MinExpCnt_;
+    }
+    /**
+     * <pre>
+     * 过去十五分钟
+     * </pre>
+     *
+     * <code>int64 i15min_exp_cnt = 6;</code>
+     * @param value The i15minExpCnt to set.
+     * @return This builder for chaining.
+     */
+    public Builder setI15MinExpCnt(long value) {
+      
+      i15MinExpCnt_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * 过去十五分钟
+     * </pre>
+     *
+     * <code>int64 i15min_exp_cnt = 6;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearI15MinExpCnt() {
+      
+      i15MinExpCnt_ = 0L;
+      onChanged();
+      return this;
+    }
+
+    private long i15MinClickCnt_ ;
+    /**
+     * <code>int64 i15min_click_cnt = 7;</code>
+     * @return The i15minClickCnt.
+     */
+    @java.lang.Override
+    public long getI15MinClickCnt() {
+      return i15MinClickCnt_;
+    }
+    /**
+     * <code>int64 i15min_click_cnt = 7;</code>
+     * @param value The i15minClickCnt to set.
+     * @return This builder for chaining.
+     */
+    public Builder setI15MinClickCnt(long value) {
+      
+      i15MinClickCnt_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>int64 i15min_click_cnt = 7;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearI15MinClickCnt() {
+      
+      i15MinClickCnt_ = 0L;
+      onChanged();
+      return this;
+    }
+
+    private long i15MinShareCnt_ ;
+    /**
+     * <code>int64 i15min_share_cnt = 8;</code>
+     * @return The i15minShareCnt.
+     */
+    @java.lang.Override
+    public long getI15MinShareCnt() {
+      return i15MinShareCnt_;
+    }
+    /**
+     * <code>int64 i15min_share_cnt = 8;</code>
+     * @param value The i15minShareCnt to set.
+     * @return This builder for chaining.
+     */
+    public Builder setI15MinShareCnt(long value) {
+      
+      i15MinShareCnt_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>int64 i15min_share_cnt = 8;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearI15MinShareCnt() {
+      
+      i15MinShareCnt_ = 0L;
+      onChanged();
+      return this;
+    }
+
+    private long i15MinReturnCnt_ ;
+    /**
+     * <code>int64 i15min_return_cnt = 9;</code>
+     * @return The i15minReturnCnt.
+     */
+    @java.lang.Override
+    public long getI15MinReturnCnt() {
+      return i15MinReturnCnt_;
+    }
+    /**
+     * <code>int64 i15min_return_cnt = 9;</code>
+     * @param value The i15minReturnCnt to set.
+     * @return This builder for chaining.
+     */
+    public Builder setI15MinReturnCnt(long value) {
+      
+      i15MinReturnCnt_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>int64 i15min_return_cnt = 9;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearI15MinReturnCnt() {
+      
+      i15MinReturnCnt_ = 0L;
+      onChanged();
+      return this;
+    }
+
+    private double iCtr15Min_ ;
+    /**
+     * <code>double i_ctr15min = 10;</code>
+     * @return The iCtr15min.
+     */
+    @java.lang.Override
+    public double getICtr15Min() {
+      return iCtr15Min_;
+    }
+    /**
+     * <code>double i_ctr15min = 10;</code>
+     * @param value The iCtr15min to set.
+     * @return This builder for chaining.
+     */
+    public Builder setICtr15Min(double value) {
+      
+      iCtr15Min_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>double i_ctr15min = 10;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearICtr15Min() {
+      
+      iCtr15Min_ = 0D;
+      onChanged();
+      return this;
+    }
+
+    private double iStr15Min_ ;
+    /**
+     * <code>double i_str15min = 11;</code>
+     * @return The iStr15min.
+     */
+    @java.lang.Override
+    public double getIStr15Min() {
+      return iStr15Min_;
+    }
+    /**
+     * <code>double i_str15min = 11;</code>
+     * @param value The iStr15min to set.
+     * @return This builder for chaining.
+     */
+    public Builder setIStr15Min(double value) {
+      
+      iStr15Min_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>double i_str15min = 11;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearIStr15Min() {
+      
+      iStr15Min_ = 0D;
+      onChanged();
+      return this;
+    }
+
+    private double iRov15Min_ ;
+    /**
+     * <code>double i_rov15min = 12;</code>
+     * @return The iRov15min.
+     */
+    @java.lang.Override
+    public double getIRov15Min() {
+      return iRov15Min_;
+    }
+    /**
+     * <code>double i_rov15min = 12;</code>
+     * @param value The iRov15min to set.
+     * @return This builder for chaining.
+     */
+    public Builder setIRov15Min(double value) {
+      
+      iRov15Min_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>double i_rov15min = 12;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearIRov15Min() {
+      
+      iRov15Min_ = 0D;
+      onChanged();
+      return this;
+    }
+
+    private double iRos15Min_ ;
+    /**
+     * <code>double i_ros15min = 13;</code>
+     * @return The iRos15min.
+     */
+    @java.lang.Override
+    public double getIRos15Min() {
+      return iRos15Min_;
+    }
+    /**
+     * <code>double i_ros15min = 13;</code>
+     * @param value The iRos15min to set.
+     * @return This builder for chaining.
+     */
+    public Builder setIRos15Min(double value) {
+      
+      iRos15Min_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>double i_ros15min = 13;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearIRos15Min() {
+      
+      iRos15Min_ = 0D;
+      onChanged();
+      return this;
+    }
+
+    private long i1HourExpCnt_ ;
+    /**
+     * <pre>
+     * 过去一小时
+     * </pre>
+     *
+     * <code>int64 i1hour_exp_cnt = 14;</code>
+     * @return The i1hourExpCnt.
+     */
+    @java.lang.Override
+    public long getI1HourExpCnt() {
+      return i1HourExpCnt_;
+    }
+    /**
+     * <pre>
+     * 过去一小时
+     * </pre>
+     *
+     * <code>int64 i1hour_exp_cnt = 14;</code>
+     * @param value The i1hourExpCnt to set.
+     * @return This builder for chaining.
+     */
+    public Builder setI1HourExpCnt(long value) {
+      
+      i1HourExpCnt_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * 过去一小时
+     * </pre>
+     *
+     * <code>int64 i1hour_exp_cnt = 14;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearI1HourExpCnt() {
+      
+      i1HourExpCnt_ = 0L;
+      onChanged();
+      return this;
+    }
+
+    private long i1HourClickCnt_ ;
+    /**
+     * <code>int64 i1hour_click_cnt = 15;</code>
+     * @return The i1hourClickCnt.
+     */
+    @java.lang.Override
+    public long getI1HourClickCnt() {
+      return i1HourClickCnt_;
+    }
+    /**
+     * <code>int64 i1hour_click_cnt = 15;</code>
+     * @param value The i1hourClickCnt to set.
+     * @return This builder for chaining.
+     */
+    public Builder setI1HourClickCnt(long value) {
+      
+      i1HourClickCnt_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>int64 i1hour_click_cnt = 15;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearI1HourClickCnt() {
+      
+      i1HourClickCnt_ = 0L;
+      onChanged();
+      return this;
+    }
+
+    private long i1HourShareCnt_ ;
+    /**
+     * <code>int64 i1hour_share_cnt = 16;</code>
+     * @return The i1hourShareCnt.
+     */
+    @java.lang.Override
+    public long getI1HourShareCnt() {
+      return i1HourShareCnt_;
+    }
+    /**
+     * <code>int64 i1hour_share_cnt = 16;</code>
+     * @param value The i1hourShareCnt to set.
+     * @return This builder for chaining.
+     */
+    public Builder setI1HourShareCnt(long value) {
+      
+      i1HourShareCnt_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>int64 i1hour_share_cnt = 16;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearI1HourShareCnt() {
+      
+      i1HourShareCnt_ = 0L;
+      onChanged();
+      return this;
+    }
+
+    private long i1HourReturnCnt_ ;
+    /**
+     * <code>int64 i1hour_return_cnt = 17;</code>
+     * @return The i1hourReturnCnt.
+     */
+    @java.lang.Override
+    public long getI1HourReturnCnt() {
+      return i1HourReturnCnt_;
+    }
+    /**
+     * <code>int64 i1hour_return_cnt = 17;</code>
+     * @param value The i1hourReturnCnt to set.
+     * @return This builder for chaining.
+     */
+    public Builder setI1HourReturnCnt(long value) {
+      
+      i1HourReturnCnt_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>int64 i1hour_return_cnt = 17;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearI1HourReturnCnt() {
+      
+      i1HourReturnCnt_ = 0L;
+      onChanged();
+      return this;
+    }
+
+    private double iCtr1Hour_ ;
+    /**
+     * <code>double i_ctr1hour = 18;</code>
+     * @return The iCtr1hour.
+     */
+    @java.lang.Override
+    public double getICtr1Hour() {
+      return iCtr1Hour_;
+    }
+    /**
+     * <code>double i_ctr1hour = 18;</code>
+     * @param value The iCtr1hour to set.
+     * @return This builder for chaining.
+     */
+    public Builder setICtr1Hour(double value) {
+      
+      iCtr1Hour_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>double i_ctr1hour = 18;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearICtr1Hour() {
+      
+      iCtr1Hour_ = 0D;
+      onChanged();
+      return this;
+    }
+
+    private double iStr1Hour_ ;
+    /**
+     * <code>double i_str1hour = 19;</code>
+     * @return The iStr1hour.
+     */
+    @java.lang.Override
+    public double getIStr1Hour() {
+      return iStr1Hour_;
+    }
+    /**
+     * <code>double i_str1hour = 19;</code>
+     * @param value The iStr1hour to set.
+     * @return This builder for chaining.
+     */
+    public Builder setIStr1Hour(double value) {
+      
+      iStr1Hour_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>double i_str1hour = 19;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearIStr1Hour() {
+      
+      iStr1Hour_ = 0D;
+      onChanged();
+      return this;
+    }
+
+    private double iRov1Hour_ ;
+    /**
+     * <code>double i_rov1hour = 20;</code>
+     * @return The iRov1hour.
+     */
+    @java.lang.Override
+    public double getIRov1Hour() {
+      return iRov1Hour_;
+    }
+    /**
+     * <code>double i_rov1hour = 20;</code>
+     * @param value The iRov1hour to set.
+     * @return This builder for chaining.
+     */
+    public Builder setIRov1Hour(double value) {
+      
+      iRov1Hour_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>double i_rov1hour = 20;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearIRov1Hour() {
+      
+      iRov1Hour_ = 0D;
+      onChanged();
+      return this;
+    }
+
+    private double iRos1Hour_ ;
+    /**
+     * <code>double i_ros1hour = 21;</code>
+     * @return The iRos1hour.
+     */
+    @java.lang.Override
+    public double getIRos1Hour() {
+      return iRos1Hour_;
+    }
+    /**
+     * <code>double i_ros1hour = 21;</code>
+     * @param value The iRos1hour to set.
+     * @return This builder for chaining.
+     */
+    public Builder setIRos1Hour(double value) {
+      
+      iRos1Hour_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>double i_ros1hour = 21;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearIRos1Hour() {
+      
+      iRos1Hour_ = 0D;
+      onChanged();
+      return this;
+    }
+
+    private long iTodayExpCnt_ ;
+    /**
+     * <pre>
+     * 今天
+     * </pre>
+     *
+     * <code>int64 i_today_exp_cnt = 22;</code>
+     * @return The iTodayExpCnt.
+     */
+    @java.lang.Override
+    public long getITodayExpCnt() {
+      return iTodayExpCnt_;
+    }
+    /**
+     * <pre>
+     * 今天
+     * </pre>
+     *
+     * <code>int64 i_today_exp_cnt = 22;</code>
+     * @param value The iTodayExpCnt to set.
+     * @return This builder for chaining.
+     */
+    public Builder setITodayExpCnt(long value) {
+      
+      iTodayExpCnt_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * 今天
+     * </pre>
+     *
+     * <code>int64 i_today_exp_cnt = 22;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearITodayExpCnt() {
+      
+      iTodayExpCnt_ = 0L;
+      onChanged();
+      return this;
+    }
+
+    private long iTodayClickCnt_ ;
+    /**
+     * <code>int64 i_today_click_cnt = 23;</code>
+     * @return The iTodayClickCnt.
+     */
+    @java.lang.Override
+    public long getITodayClickCnt() {
+      return iTodayClickCnt_;
+    }
+    /**
+     * <code>int64 i_today_click_cnt = 23;</code>
+     * @param value The iTodayClickCnt to set.
+     * @return This builder for chaining.
+     */
+    public Builder setITodayClickCnt(long value) {
+      
+      iTodayClickCnt_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>int64 i_today_click_cnt = 23;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearITodayClickCnt() {
+      
+      iTodayClickCnt_ = 0L;
+      onChanged();
+      return this;
+    }
+
+    private long iTodayShareCnt_ ;
+    /**
+     * <code>int64 i_today_share_cnt = 24;</code>
+     * @return The iTodayShareCnt.
+     */
+    @java.lang.Override
+    public long getITodayShareCnt() {
+      return iTodayShareCnt_;
+    }
+    /**
+     * <code>int64 i_today_share_cnt = 24;</code>
+     * @param value The iTodayShareCnt to set.
+     * @return This builder for chaining.
+     */
+    public Builder setITodayShareCnt(long value) {
+      
+      iTodayShareCnt_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>int64 i_today_share_cnt = 24;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearITodayShareCnt() {
+      
+      iTodayShareCnt_ = 0L;
+      onChanged();
+      return this;
+    }
+
+    private long iTodayReturnCnt_ ;
+    /**
+     * <code>int64 i_today_return_cnt = 25;</code>
+     * @return The iTodayReturnCnt.
+     */
+    @java.lang.Override
+    public long getITodayReturnCnt() {
+      return iTodayReturnCnt_;
+    }
+    /**
+     * <code>int64 i_today_return_cnt = 25;</code>
+     * @param value The iTodayReturnCnt to set.
+     * @return This builder for chaining.
+     */
+    public Builder setITodayReturnCnt(long value) {
+      
+      iTodayReturnCnt_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>int64 i_today_return_cnt = 25;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearITodayReturnCnt() {
+      
+      iTodayReturnCnt_ = 0L;
+      onChanged();
+      return this;
+    }
+
+    private double iCtrToday_ ;
+    /**
+     * <code>double i_ctr_today = 26;</code>
+     * @return The iCtrToday.
+     */
+    @java.lang.Override
+    public double getICtrToday() {
+      return iCtrToday_;
+    }
+    /**
+     * <code>double i_ctr_today = 26;</code>
+     * @param value The iCtrToday to set.
+     * @return This builder for chaining.
+     */
+    public Builder setICtrToday(double value) {
+      
+      iCtrToday_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>double i_ctr_today = 26;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearICtrToday() {
+      
+      iCtrToday_ = 0D;
+      onChanged();
+      return this;
+    }
+
+    private double iStrToday_ ;
+    /**
+     * <code>double i_str_today = 27;</code>
+     * @return The iStrToday.
+     */
+    @java.lang.Override
+    public double getIStrToday() {
+      return iStrToday_;
+    }
+    /**
+     * <code>double i_str_today = 27;</code>
+     * @param value The iStrToday to set.
+     * @return This builder for chaining.
+     */
+    public Builder setIStrToday(double value) {
+      
+      iStrToday_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>double i_str_today = 27;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearIStrToday() {
+      
+      iStrToday_ = 0D;
+      onChanged();
+      return this;
+    }
+
+    private double iRovToday_ ;
+    /**
+     * <code>double i_rov_today = 28;</code>
+     * @return The iRovToday.
+     */
+    @java.lang.Override
+    public double getIRovToday() {
+      return iRovToday_;
+    }
+    /**
+     * <code>double i_rov_today = 28;</code>
+     * @param value The iRovToday to set.
+     * @return This builder for chaining.
+     */
+    public Builder setIRovToday(double value) {
+      
+      iRovToday_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>double i_rov_today = 28;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearIRovToday() {
+      
+      iRovToday_ = 0D;
+      onChanged();
+      return this;
+    }
+
+    private double iRosToday_ ;
+    /**
+     * <code>double i_ros_today = 29;</code>
+     * @return The iRosToday.
+     */
+    @java.lang.Override
+    public double getIRosToday() {
+      return iRosToday_;
+    }
+    /**
+     * <code>double i_ros_today = 29;</code>
+     * @param value The iRosToday to set.
+     * @return This builder for chaining.
+     */
+    public Builder setIRosToday(double value) {
+      
+      iRosToday_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>double i_ros_today = 29;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearIRosToday() {
+      
+      iRosToday_ = 0D;
+      onChanged();
+      return this;
+    }
+
+    private long i1DayExpCnt_ ;
+    /**
+     * <pre>
+     * 过去一天
+     * </pre>
+     *
+     * <code>int64 i1day_exp_cnt = 30;</code>
+     * @return The i1dayExpCnt.
+     */
+    @java.lang.Override
+    public long getI1DayExpCnt() {
+      return i1DayExpCnt_;
+    }
+    /**
+     * <pre>
+     * 过去一天
+     * </pre>
+     *
+     * <code>int64 i1day_exp_cnt = 30;</code>
+     * @param value The i1dayExpCnt to set.
+     * @return This builder for chaining.
+     */
+    public Builder setI1DayExpCnt(long value) {
+      
+      i1DayExpCnt_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * 过去一天
+     * </pre>
+     *
+     * <code>int64 i1day_exp_cnt = 30;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearI1DayExpCnt() {
+      
+      i1DayExpCnt_ = 0L;
+      onChanged();
+      return this;
+    }
+
+    private long i1DayClickCnt_ ;
+    /**
+     * <code>int64 i1day_click_cnt = 31;</code>
+     * @return The i1dayClickCnt.
+     */
+    @java.lang.Override
+    public long getI1DayClickCnt() {
+      return i1DayClickCnt_;
+    }
+    /**
+     * <code>int64 i1day_click_cnt = 31;</code>
+     * @param value The i1dayClickCnt to set.
+     * @return This builder for chaining.
+     */
+    public Builder setI1DayClickCnt(long value) {
+      
+      i1DayClickCnt_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>int64 i1day_click_cnt = 31;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearI1DayClickCnt() {
+      
+      i1DayClickCnt_ = 0L;
+      onChanged();
+      return this;
+    }
+
+    private long i1DayShareCnt_ ;
+    /**
+     * <code>int64 i1day_share_cnt = 32;</code>
+     * @return The i1dayShareCnt.
+     */
+    @java.lang.Override
+    public long getI1DayShareCnt() {
+      return i1DayShareCnt_;
+    }
+    /**
+     * <code>int64 i1day_share_cnt = 32;</code>
+     * @param value The i1dayShareCnt to set.
+     * @return This builder for chaining.
+     */
+    public Builder setI1DayShareCnt(long value) {
+      
+      i1DayShareCnt_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>int64 i1day_share_cnt = 32;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearI1DayShareCnt() {
+      
+      i1DayShareCnt_ = 0L;
+      onChanged();
+      return this;
+    }
+
+    private long i1DayReturnCnt_ ;
+    /**
+     * <code>int64 i1day_return_cnt = 33;</code>
+     * @return The i1dayReturnCnt.
+     */
+    @java.lang.Override
+    public long getI1DayReturnCnt() {
+      return i1DayReturnCnt_;
+    }
+    /**
+     * <code>int64 i1day_return_cnt = 33;</code>
+     * @param value The i1dayReturnCnt to set.
+     * @return This builder for chaining.
+     */
+    public Builder setI1DayReturnCnt(long value) {
+      
+      i1DayReturnCnt_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>int64 i1day_return_cnt = 33;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearI1DayReturnCnt() {
+      
+      i1DayReturnCnt_ = 0L;
+      onChanged();
+      return this;
+    }
+
+    private double iCtr1Day_ ;
+    /**
+     * <code>double i_ctr1day = 34;</code>
+     * @return The iCtr1day.
+     */
+    @java.lang.Override
+    public double getICtr1Day() {
+      return iCtr1Day_;
+    }
+    /**
+     * <code>double i_ctr1day = 34;</code>
+     * @param value The iCtr1day to set.
+     * @return This builder for chaining.
+     */
+    public Builder setICtr1Day(double value) {
+      
+      iCtr1Day_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>double i_ctr1day = 34;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearICtr1Day() {
+      
+      iCtr1Day_ = 0D;
+      onChanged();
+      return this;
+    }
+
+    private double iStr1Day_ ;
+    /**
+     * <code>double i_str1day = 35;</code>
+     * @return The iStr1day.
+     */
+    @java.lang.Override
+    public double getIStr1Day() {
+      return iStr1Day_;
+    }
+    /**
+     * <code>double i_str1day = 35;</code>
+     * @param value The iStr1day to set.
+     * @return This builder for chaining.
+     */
+    public Builder setIStr1Day(double value) {
+      
+      iStr1Day_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>double i_str1day = 35;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearIStr1Day() {
+      
+      iStr1Day_ = 0D;
+      onChanged();
+      return this;
+    }
+
+    private double iRov1Day_ ;
+    /**
+     * <code>double i_rov1day = 36;</code>
+     * @return The iRov1day.
+     */
+    @java.lang.Override
+    public double getIRov1Day() {
+      return iRov1Day_;
+    }
+    /**
+     * <code>double i_rov1day = 36;</code>
+     * @param value The iRov1day to set.
+     * @return This builder for chaining.
+     */
+    public Builder setIRov1Day(double value) {
+      
+      iRov1Day_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>double i_rov1day = 36;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearIRov1Day() {
+      
+      iRov1Day_ = 0D;
+      onChanged();
+      return this;
+    }
+
+    private double iRos1Day_ ;
+    /**
+     * <code>double i_ros1day = 37;</code>
+     * @return The iRos1day.
+     */
+    @java.lang.Override
+    public double getIRos1Day() {
+      return iRos1Day_;
+    }
+    /**
+     * <code>double i_ros1day = 37;</code>
+     * @param value The iRos1day to set.
+     * @return This builder for chaining.
+     */
+    public Builder setIRos1Day(double value) {
+      
+      iRos1Day_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>double i_ros1day = 37;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearIRos1Day() {
+      
+      iRos1Day_ = 0D;
+      onChanged();
+      return this;
+    }
+
+    private long i3DayExpCnt_ ;
+    /**
+     * <pre>
+     * 过去三天
+     * </pre>
+     *
+     * <code>int64 i3day_exp_cnt = 38;</code>
+     * @return The i3dayExpCnt.
+     */
+    @java.lang.Override
+    public long getI3DayExpCnt() {
+      return i3DayExpCnt_;
+    }
+    /**
+     * <pre>
+     * 过去三天
+     * </pre>
+     *
+     * <code>int64 i3day_exp_cnt = 38;</code>
+     * @param value The i3dayExpCnt to set.
+     * @return This builder for chaining.
+     */
+    public Builder setI3DayExpCnt(long value) {
+      
+      i3DayExpCnt_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * 过去三天
+     * </pre>
+     *
+     * <code>int64 i3day_exp_cnt = 38;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearI3DayExpCnt() {
+      
+      i3DayExpCnt_ = 0L;
+      onChanged();
+      return this;
+    }
+
+    private long i3DayClickCnt_ ;
+    /**
+     * <code>int64 i3day_click_cnt = 39;</code>
+     * @return The i3dayClickCnt.
+     */
+    @java.lang.Override
+    public long getI3DayClickCnt() {
+      return i3DayClickCnt_;
+    }
+    /**
+     * <code>int64 i3day_click_cnt = 39;</code>
+     * @param value The i3dayClickCnt to set.
+     * @return This builder for chaining.
+     */
+    public Builder setI3DayClickCnt(long value) {
+      
+      i3DayClickCnt_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>int64 i3day_click_cnt = 39;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearI3DayClickCnt() {
+      
+      i3DayClickCnt_ = 0L;
+      onChanged();
+      return this;
+    }
+
+    private long i3DayShareCnt_ ;
+    /**
+     * <code>int64 i3day_share_cnt = 40;</code>
+     * @return The i3dayShareCnt.
+     */
+    @java.lang.Override
+    public long getI3DayShareCnt() {
+      return i3DayShareCnt_;
+    }
+    /**
+     * <code>int64 i3day_share_cnt = 40;</code>
+     * @param value The i3dayShareCnt to set.
+     * @return This builder for chaining.
+     */
+    public Builder setI3DayShareCnt(long value) {
+      
+      i3DayShareCnt_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>int64 i3day_share_cnt = 40;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearI3DayShareCnt() {
+      
+      i3DayShareCnt_ = 0L;
+      onChanged();
+      return this;
+    }
+
+    private long i3DayReturnCnt_ ;
+    /**
+     * <code>int64 i3day_return_cnt = 41;</code>
+     * @return The i3dayReturnCnt.
+     */
+    @java.lang.Override
+    public long getI3DayReturnCnt() {
+      return i3DayReturnCnt_;
+    }
+    /**
+     * <code>int64 i3day_return_cnt = 41;</code>
+     * @param value The i3dayReturnCnt to set.
+     * @return This builder for chaining.
+     */
+    public Builder setI3DayReturnCnt(long value) {
+      
+      i3DayReturnCnt_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>int64 i3day_return_cnt = 41;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearI3DayReturnCnt() {
+      
+      i3DayReturnCnt_ = 0L;
+      onChanged();
+      return this;
+    }
+
+    private double iCtr3Day_ ;
+    /**
+     * <code>double i_ctr3day = 42;</code>
+     * @return The iCtr3day.
+     */
+    @java.lang.Override
+    public double getICtr3Day() {
+      return iCtr3Day_;
+    }
+    /**
+     * <code>double i_ctr3day = 42;</code>
+     * @param value The iCtr3day to set.
+     * @return This builder for chaining.
+     */
+    public Builder setICtr3Day(double value) {
+      
+      iCtr3Day_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>double i_ctr3day = 42;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearICtr3Day() {
+      
+      iCtr3Day_ = 0D;
+      onChanged();
+      return this;
+    }
+
+    private double iStr3Day_ ;
+    /**
+     * <code>double i_str3day = 43;</code>
+     * @return The iStr3day.
+     */
+    @java.lang.Override
+    public double getIStr3Day() {
+      return iStr3Day_;
+    }
+    /**
+     * <code>double i_str3day = 43;</code>
+     * @param value The iStr3day to set.
+     * @return This builder for chaining.
+     */
+    public Builder setIStr3Day(double value) {
+      
+      iStr3Day_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>double i_str3day = 43;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearIStr3Day() {
+      
+      iStr3Day_ = 0D;
+      onChanged();
+      return this;
+    }
+
+    private double iRov3Day_ ;
+    /**
+     * <code>double i_rov3day = 44;</code>
+     * @return The iRov3day.
+     */
+    @java.lang.Override
+    public double getIRov3Day() {
+      return iRov3Day_;
+    }
+    /**
+     * <code>double i_rov3day = 44;</code>
+     * @param value The iRov3day to set.
+     * @return This builder for chaining.
+     */
+    public Builder setIRov3Day(double value) {
+      
+      iRov3Day_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>double i_rov3day = 44;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearIRov3Day() {
+      
+      iRov3Day_ = 0D;
+      onChanged();
+      return this;
+    }
+
+    private double iRos3Day_ ;
+    /**
+     * <code>double i_ros3day = 45;</code>
+     * @return The iRos3day.
+     */
+    @java.lang.Override
+    public double getIRos3Day() {
+      return iRos3Day_;
+    }
+    /**
+     * <code>double i_ros3day = 45;</code>
+     * @param value The iRos3day to set.
+     * @return This builder for chaining.
+     */
+    public Builder setIRos3Day(double value) {
+      
+      iRos3Day_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>double i_ros3day = 45;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearIRos3Day() {
+      
+      iRos3Day_ = 0D;
+      onChanged();
+      return this;
+    }
+    @java.lang.Override
+    public final Builder setUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.setUnknownFields(unknownFields);
+    }
+
+    @java.lang.Override
+    public final Builder mergeUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.mergeUnknownFields(unknownFields);
+    }
+
+
+    // @@protoc_insertion_point(builder_scope:GetVideoFeatureInfo)
+  }
+
+  // @@protoc_insertion_point(class_scope:GetVideoFeatureInfo)
+  private static final com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo();
+  }
+
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<GetVideoFeatureInfo>
+      PARSER = new com.google.protobuf.AbstractParser<GetVideoFeatureInfo>() {
+    @java.lang.Override
+    public GetVideoFeatureInfo parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new GetVideoFeatureInfo(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<GetVideoFeatureInfo> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<GetVideoFeatureInfo> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+

+ 309 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetVideoFeatureInfoOrBuilder.java

@@ -0,0 +1,309 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: com/tzld/piaoquan/recommend/feature/feature.proto
+
+package com.tzld.piaoquan.recommend.feature.model.feature;
+
+public interface GetVideoFeatureInfoOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:GetVideoFeatureInfo)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <code>int64 video_id = 1;</code>
+   * @return The videoId.
+   */
+  long getVideoId();
+
+  /**
+   * <code>int64 play_count_total = 2;</code>
+   * @return The playCountTotal.
+   */
+  long getPlayCountTotal();
+
+  /**
+   * <code>int32 total_time = 3;</code>
+   * @return The totalTime.
+   */
+  int getTotalTime();
+
+  /**
+   * <code>string gmt_create = 4;</code>
+   * @return The gmtCreate.
+   */
+  java.lang.String getGmtCreate();
+  /**
+   * <code>string gmt_create = 4;</code>
+   * @return The bytes for gmtCreate.
+   */
+  com.google.protobuf.ByteString
+      getGmtCreateBytes();
+
+  /**
+   * <pre>
+   * 上传者
+   * </pre>
+   *
+   * <code>int64 uid = 5;</code>
+   * @return The uid.
+   */
+  long getUid();
+
+  /**
+   * <pre>
+   * 过去十五分钟
+   * </pre>
+   *
+   * <code>int64 i15min_exp_cnt = 6;</code>
+   * @return The i15minExpCnt.
+   */
+  long getI15MinExpCnt();
+
+  /**
+   * <code>int64 i15min_click_cnt = 7;</code>
+   * @return The i15minClickCnt.
+   */
+  long getI15MinClickCnt();
+
+  /**
+   * <code>int64 i15min_share_cnt = 8;</code>
+   * @return The i15minShareCnt.
+   */
+  long getI15MinShareCnt();
+
+  /**
+   * <code>int64 i15min_return_cnt = 9;</code>
+   * @return The i15minReturnCnt.
+   */
+  long getI15MinReturnCnt();
+
+  /**
+   * <code>double i_ctr15min = 10;</code>
+   * @return The iCtr15min.
+   */
+  double getICtr15Min();
+
+  /**
+   * <code>double i_str15min = 11;</code>
+   * @return The iStr15min.
+   */
+  double getIStr15Min();
+
+  /**
+   * <code>double i_rov15min = 12;</code>
+   * @return The iRov15min.
+   */
+  double getIRov15Min();
+
+  /**
+   * <code>double i_ros15min = 13;</code>
+   * @return The iRos15min.
+   */
+  double getIRos15Min();
+
+  /**
+   * <pre>
+   * 过去一小时
+   * </pre>
+   *
+   * <code>int64 i1hour_exp_cnt = 14;</code>
+   * @return The i1hourExpCnt.
+   */
+  long getI1HourExpCnt();
+
+  /**
+   * <code>int64 i1hour_click_cnt = 15;</code>
+   * @return The i1hourClickCnt.
+   */
+  long getI1HourClickCnt();
+
+  /**
+   * <code>int64 i1hour_share_cnt = 16;</code>
+   * @return The i1hourShareCnt.
+   */
+  long getI1HourShareCnt();
+
+  /**
+   * <code>int64 i1hour_return_cnt = 17;</code>
+   * @return The i1hourReturnCnt.
+   */
+  long getI1HourReturnCnt();
+
+  /**
+   * <code>double i_ctr1hour = 18;</code>
+   * @return The iCtr1hour.
+   */
+  double getICtr1Hour();
+
+  /**
+   * <code>double i_str1hour = 19;</code>
+   * @return The iStr1hour.
+   */
+  double getIStr1Hour();
+
+  /**
+   * <code>double i_rov1hour = 20;</code>
+   * @return The iRov1hour.
+   */
+  double getIRov1Hour();
+
+  /**
+   * <code>double i_ros1hour = 21;</code>
+   * @return The iRos1hour.
+   */
+  double getIRos1Hour();
+
+  /**
+   * <pre>
+   * 今天
+   * </pre>
+   *
+   * <code>int64 i_today_exp_cnt = 22;</code>
+   * @return The iTodayExpCnt.
+   */
+  long getITodayExpCnt();
+
+  /**
+   * <code>int64 i_today_click_cnt = 23;</code>
+   * @return The iTodayClickCnt.
+   */
+  long getITodayClickCnt();
+
+  /**
+   * <code>int64 i_today_share_cnt = 24;</code>
+   * @return The iTodayShareCnt.
+   */
+  long getITodayShareCnt();
+
+  /**
+   * <code>int64 i_today_return_cnt = 25;</code>
+   * @return The iTodayReturnCnt.
+   */
+  long getITodayReturnCnt();
+
+  /**
+   * <code>double i_ctr_today = 26;</code>
+   * @return The iCtrToday.
+   */
+  double getICtrToday();
+
+  /**
+   * <code>double i_str_today = 27;</code>
+   * @return The iStrToday.
+   */
+  double getIStrToday();
+
+  /**
+   * <code>double i_rov_today = 28;</code>
+   * @return The iRovToday.
+   */
+  double getIRovToday();
+
+  /**
+   * <code>double i_ros_today = 29;</code>
+   * @return The iRosToday.
+   */
+  double getIRosToday();
+
+  /**
+   * <pre>
+   * 过去一天
+   * </pre>
+   *
+   * <code>int64 i1day_exp_cnt = 30;</code>
+   * @return The i1dayExpCnt.
+   */
+  long getI1DayExpCnt();
+
+  /**
+   * <code>int64 i1day_click_cnt = 31;</code>
+   * @return The i1dayClickCnt.
+   */
+  long getI1DayClickCnt();
+
+  /**
+   * <code>int64 i1day_share_cnt = 32;</code>
+   * @return The i1dayShareCnt.
+   */
+  long getI1DayShareCnt();
+
+  /**
+   * <code>int64 i1day_return_cnt = 33;</code>
+   * @return The i1dayReturnCnt.
+   */
+  long getI1DayReturnCnt();
+
+  /**
+   * <code>double i_ctr1day = 34;</code>
+   * @return The iCtr1day.
+   */
+  double getICtr1Day();
+
+  /**
+   * <code>double i_str1day = 35;</code>
+   * @return The iStr1day.
+   */
+  double getIStr1Day();
+
+  /**
+   * <code>double i_rov1day = 36;</code>
+   * @return The iRov1day.
+   */
+  double getIRov1Day();
+
+  /**
+   * <code>double i_ros1day = 37;</code>
+   * @return The iRos1day.
+   */
+  double getIRos1Day();
+
+  /**
+   * <pre>
+   * 过去三天
+   * </pre>
+   *
+   * <code>int64 i3day_exp_cnt = 38;</code>
+   * @return The i3dayExpCnt.
+   */
+  long getI3DayExpCnt();
+
+  /**
+   * <code>int64 i3day_click_cnt = 39;</code>
+   * @return The i3dayClickCnt.
+   */
+  long getI3DayClickCnt();
+
+  /**
+   * <code>int64 i3day_share_cnt = 40;</code>
+   * @return The i3dayShareCnt.
+   */
+  long getI3DayShareCnt();
+
+  /**
+   * <code>int64 i3day_return_cnt = 41;</code>
+   * @return The i3dayReturnCnt.
+   */
+  long getI3DayReturnCnt();
+
+  /**
+   * <code>double i_ctr3day = 42;</code>
+   * @return The iCtr3day.
+   */
+  double getICtr3Day();
+
+  /**
+   * <code>double i_str3day = 43;</code>
+   * @return The iStr3day.
+   */
+  double getIStr3Day();
+
+  /**
+   * <code>double i_rov3day = 44;</code>
+   * @return The iRov3day.
+   */
+  double getIRov3Day();
+
+  /**
+   * <code>double i_ros3day = 45;</code>
+   * @return The iRos3day.
+   */
+  double getIRos3Day();
+}

+ 599 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetVideoFeatureInfoRequest.java

@@ -0,0 +1,599 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: com/tzld/piaoquan/recommend/feature/feature.proto
+
+package com.tzld.piaoquan.recommend.feature.model.feature;
+
+/**
+ * Protobuf type {@code GetVideoFeatureInfoRequest}
+ */
+public final class GetVideoFeatureInfoRequest extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:GetVideoFeatureInfoRequest)
+    GetVideoFeatureInfoRequestOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use GetVideoFeatureInfoRequest.newBuilder() to construct.
+  private GetVideoFeatureInfoRequest(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private GetVideoFeatureInfoRequest() {
+    videoIds_ = emptyLongList();
+  }
+
+  @java.lang.Override
+  @SuppressWarnings({"unused"})
+  protected java.lang.Object newInstance(
+      UnusedPrivateParameter unused) {
+    return new GetVideoFeatureInfoRequest();
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private GetVideoFeatureInfoRequest(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    this();
+    if (extensionRegistry == null) {
+      throw new java.lang.NullPointerException();
+    }
+    int mutable_bitField0_ = 0;
+    com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+        com.google.protobuf.UnknownFieldSet.newBuilder();
+    try {
+      boolean done = false;
+      while (!done) {
+        int tag = input.readTag();
+        switch (tag) {
+          case 0:
+            done = true;
+            break;
+          case 8: {
+            if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+              videoIds_ = newLongList();
+              mutable_bitField0_ |= 0x00000001;
+            }
+            videoIds_.addLong(input.readInt64());
+            break;
+          }
+          case 10: {
+            int length = input.readRawVarint32();
+            int limit = input.pushLimit(length);
+            if (!((mutable_bitField0_ & 0x00000001) != 0) && input.getBytesUntilLimit() > 0) {
+              videoIds_ = newLongList();
+              mutable_bitField0_ |= 0x00000001;
+            }
+            while (input.getBytesUntilLimit() > 0) {
+              videoIds_.addLong(input.readInt64());
+            }
+            input.popLimit(limit);
+            break;
+          }
+          default: {
+            if (!parseUnknownField(
+                input, unknownFields, extensionRegistry, tag)) {
+              done = true;
+            }
+            break;
+          }
+        }
+      }
+    } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+      throw e.setUnfinishedMessage(this);
+    } catch (java.io.IOException e) {
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
+    } finally {
+      if (((mutable_bitField0_ & 0x00000001) != 0)) {
+        videoIds_.makeImmutable(); // C
+      }
+      this.unknownFields = unknownFields.build();
+      makeExtensionsImmutable();
+    }
+  }
+  public static final com.google.protobuf.Descriptors.Descriptor
+      getDescriptor() {
+    return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetVideoFeatureInfoRequest_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetVideoFeatureInfoRequest_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest.class, com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest.Builder.class);
+  }
+
+  public static final int VIDEOIDS_FIELD_NUMBER = 1;
+  private com.google.protobuf.Internal.LongList videoIds_;
+  /**
+   * <code>repeated int64 videoIds = 1;</code>
+   * @return A list containing the videoIds.
+   */
+  @java.lang.Override
+  public java.util.List<java.lang.Long>
+      getVideoIdsList() {
+    return videoIds_;
+  }
+  /**
+   * <code>repeated int64 videoIds = 1;</code>
+   * @return The count of videoIds.
+   */
+  public int getVideoIdsCount() {
+    return videoIds_.size();
+  }
+  /**
+   * <code>repeated int64 videoIds = 1;</code>
+   * @param index The index of the element to return.
+   * @return The videoIds at the given index.
+   */
+  public long getVideoIds(int index) {
+    return videoIds_.getLong(index);
+  }
+  private int videoIdsMemoizedSerializedSize = -1;
+
+  private byte memoizedIsInitialized = -1;
+  @java.lang.Override
+  public final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
+  }
+
+  @java.lang.Override
+  public void writeTo(com.google.protobuf.CodedOutputStream output)
+                      throws java.io.IOException {
+    getSerializedSize();
+    if (getVideoIdsList().size() > 0) {
+      output.writeUInt32NoTag(10);
+      output.writeUInt32NoTag(videoIdsMemoizedSerializedSize);
+    }
+    for (int i = 0; i < videoIds_.size(); i++) {
+      output.writeInt64NoTag(videoIds_.getLong(i));
+    }
+    unknownFields.writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    {
+      int dataSize = 0;
+      for (int i = 0; i < videoIds_.size(); i++) {
+        dataSize += com.google.protobuf.CodedOutputStream
+          .computeInt64SizeNoTag(videoIds_.getLong(i));
+      }
+      size += dataSize;
+      if (!getVideoIdsList().isEmpty()) {
+        size += 1;
+        size += com.google.protobuf.CodedOutputStream
+            .computeInt32SizeNoTag(dataSize);
+      }
+      videoIdsMemoizedSerializedSize = dataSize;
+    }
+    size += unknownFields.getSerializedSize();
+    memoizedSize = size;
+    return size;
+  }
+
+  @java.lang.Override
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+     return true;
+    }
+    if (!(obj instanceof com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest)) {
+      return super.equals(obj);
+    }
+    com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest other = (com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest) obj;
+
+    if (!getVideoIdsList()
+        .equals(other.getVideoIdsList())) return false;
+    if (!unknownFields.equals(other.unknownFields)) return false;
+    return true;
+  }
+
+  @java.lang.Override
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
+    }
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    if (getVideoIdsCount() > 0) {
+      hash = (37 * hash) + VIDEOIDS_FIELD_NUMBER;
+      hash = (53 * hash) + getVideoIdsList().hashCode();
+    }
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest parseFrom(
+      java.nio.ByteBuffer data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest parseFrom(
+      com.google.protobuf.ByteString data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest parseFrom(
+      byte[] data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest parseFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest parseFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest parseDelimitedFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest parseDelimitedFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest parseFrom(
+      com.google.protobuf.CodedInputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest parseFrom(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+
+  @java.lang.Override
+  public Builder newBuilderForType() { return newBuilder(); }
+  public static Builder newBuilder() {
+    return DEFAULT_INSTANCE.toBuilder();
+  }
+  public static Builder newBuilder(com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest prototype) {
+    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+  }
+  @java.lang.Override
+  public Builder toBuilder() {
+    return this == DEFAULT_INSTANCE
+        ? new Builder() : new Builder().mergeFrom(this);
+  }
+
+  @java.lang.Override
+  protected Builder newBuilderForType(
+      com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
+  }
+  /**
+   * Protobuf type {@code GetVideoFeatureInfoRequest}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:GetVideoFeatureInfoRequest)
+      com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequestOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetVideoFeatureInfoRequest_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetVideoFeatureInfoRequest_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest.class, com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest.Builder.class);
+    }
+
+    // Construct using com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest.newBuilder()
+    private Builder() {
+      maybeForceBuilderInitialization();
+    }
+
+    private Builder(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+      maybeForceBuilderInitialization();
+    }
+    private void maybeForceBuilderInitialization() {
+      if (com.google.protobuf.GeneratedMessageV3
+              .alwaysUseFieldBuilders) {
+      }
+    }
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      videoIds_ = emptyLongList();
+      bitField0_ = (bitField0_ & ~0x00000001);
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetVideoFeatureInfoRequest_descriptor;
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest getDefaultInstanceForType() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest build() {
+      com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest buildPartial() {
+      com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest result = new com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest(this);
+      int from_bitField0_ = bitField0_;
+      if (((bitField0_ & 0x00000001) != 0)) {
+        videoIds_.makeImmutable();
+        bitField0_ = (bitField0_ & ~0x00000001);
+      }
+      result.videoIds_ = videoIds_;
+      onBuilt();
+      return result;
+    }
+
+    @java.lang.Override
+    public Builder clone() {
+      return super.clone();
+    }
+    @java.lang.Override
+    public Builder setField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.setField(field, value);
+    }
+    @java.lang.Override
+    public Builder clearField(
+        com.google.protobuf.Descriptors.FieldDescriptor field) {
+      return super.clearField(field);
+    }
+    @java.lang.Override
+    public Builder clearOneof(
+        com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+      return super.clearOneof(oneof);
+    }
+    @java.lang.Override
+    public Builder setRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        int index, java.lang.Object value) {
+      return super.setRepeatedField(field, index, value);
+    }
+    @java.lang.Override
+    public Builder addRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.addRepeatedField(field, value);
+    }
+    @java.lang.Override
+    public Builder mergeFrom(com.google.protobuf.Message other) {
+      if (other instanceof com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest) {
+        return mergeFrom((com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest other) {
+      if (other == com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest.getDefaultInstance()) return this;
+      if (!other.videoIds_.isEmpty()) {
+        if (videoIds_.isEmpty()) {
+          videoIds_ = other.videoIds_;
+          bitField0_ = (bitField0_ & ~0x00000001);
+        } else {
+          ensureVideoIdsIsMutable();
+          videoIds_.addAll(other.videoIds_);
+        }
+        onChanged();
+      }
+      this.mergeUnknownFields(other.unknownFields);
+      onChanged();
+      return this;
+    }
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest) e.getUnfinishedMessage();
+        throw e.unwrapIOException();
+      } finally {
+        if (parsedMessage != null) {
+          mergeFrom(parsedMessage);
+        }
+      }
+      return this;
+    }
+    private int bitField0_;
+
+    private com.google.protobuf.Internal.LongList videoIds_ = emptyLongList();
+    private void ensureVideoIdsIsMutable() {
+      if (!((bitField0_ & 0x00000001) != 0)) {
+        videoIds_ = mutableCopy(videoIds_);
+        bitField0_ |= 0x00000001;
+       }
+    }
+    /**
+     * <code>repeated int64 videoIds = 1;</code>
+     * @return A list containing the videoIds.
+     */
+    public java.util.List<java.lang.Long>
+        getVideoIdsList() {
+      return ((bitField0_ & 0x00000001) != 0) ?
+               java.util.Collections.unmodifiableList(videoIds_) : videoIds_;
+    }
+    /**
+     * <code>repeated int64 videoIds = 1;</code>
+     * @return The count of videoIds.
+     */
+    public int getVideoIdsCount() {
+      return videoIds_.size();
+    }
+    /**
+     * <code>repeated int64 videoIds = 1;</code>
+     * @param index The index of the element to return.
+     * @return The videoIds at the given index.
+     */
+    public long getVideoIds(int index) {
+      return videoIds_.getLong(index);
+    }
+    /**
+     * <code>repeated int64 videoIds = 1;</code>
+     * @param index The index to set the value at.
+     * @param value The videoIds to set.
+     * @return This builder for chaining.
+     */
+    public Builder setVideoIds(
+        int index, long value) {
+      ensureVideoIdsIsMutable();
+      videoIds_.setLong(index, value);
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>repeated int64 videoIds = 1;</code>
+     * @param value The videoIds to add.
+     * @return This builder for chaining.
+     */
+    public Builder addVideoIds(long value) {
+      ensureVideoIdsIsMutable();
+      videoIds_.addLong(value);
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>repeated int64 videoIds = 1;</code>
+     * @param values The videoIds to add.
+     * @return This builder for chaining.
+     */
+    public Builder addAllVideoIds(
+        java.lang.Iterable<? extends java.lang.Long> values) {
+      ensureVideoIdsIsMutable();
+      com.google.protobuf.AbstractMessageLite.Builder.addAll(
+          values, videoIds_);
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>repeated int64 videoIds = 1;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearVideoIds() {
+      videoIds_ = emptyLongList();
+      bitField0_ = (bitField0_ & ~0x00000001);
+      onChanged();
+      return this;
+    }
+    @java.lang.Override
+    public final Builder setUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.setUnknownFields(unknownFields);
+    }
+
+    @java.lang.Override
+    public final Builder mergeUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.mergeUnknownFields(unknownFields);
+    }
+
+
+    // @@protoc_insertion_point(builder_scope:GetVideoFeatureInfoRequest)
+  }
+
+  // @@protoc_insertion_point(class_scope:GetVideoFeatureInfoRequest)
+  private static final com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest();
+  }
+
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<GetVideoFeatureInfoRequest>
+      PARSER = new com.google.protobuf.AbstractParser<GetVideoFeatureInfoRequest>() {
+    @java.lang.Override
+    public GetVideoFeatureInfoRequest parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new GetVideoFeatureInfoRequest(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<GetVideoFeatureInfoRequest> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<GetVideoFeatureInfoRequest> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoRequest getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+

+ 26 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetVideoFeatureInfoRequestOrBuilder.java

@@ -0,0 +1,26 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: com/tzld/piaoquan/recommend/feature/feature.proto
+
+package com.tzld.piaoquan.recommend.feature.model.feature;
+
+public interface GetVideoFeatureInfoRequestOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:GetVideoFeatureInfoRequest)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <code>repeated int64 videoIds = 1;</code>
+   * @return A list containing the videoIds.
+   */
+  java.util.List<java.lang.Long> getVideoIdsList();
+  /**
+   * <code>repeated int64 videoIds = 1;</code>
+   * @return The count of videoIds.
+   */
+  int getVideoIdsCount();
+  /**
+   * <code>repeated int64 videoIds = 1;</code>
+   * @param index The index of the element to return.
+   * @return The videoIds at the given index.
+   */
+  long getVideoIds(int index);
+}

+ 958 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetVideoFeatureInfoResponse.java

@@ -0,0 +1,958 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: com/tzld/piaoquan/recommend/feature/feature.proto
+
+package com.tzld.piaoquan.recommend.feature.model.feature;
+
+/**
+ * Protobuf type {@code GetVideoFeatureInfoResponse}
+ */
+public final class GetVideoFeatureInfoResponse extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:GetVideoFeatureInfoResponse)
+    GetVideoFeatureInfoResponseOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use GetVideoFeatureInfoResponse.newBuilder() to construct.
+  private GetVideoFeatureInfoResponse(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private GetVideoFeatureInfoResponse() {
+    videoFeatureInfo_ = java.util.Collections.emptyList();
+  }
+
+  @java.lang.Override
+  @SuppressWarnings({"unused"})
+  protected java.lang.Object newInstance(
+      UnusedPrivateParameter unused) {
+    return new GetVideoFeatureInfoResponse();
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private GetVideoFeatureInfoResponse(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    this();
+    if (extensionRegistry == null) {
+      throw new java.lang.NullPointerException();
+    }
+    int mutable_bitField0_ = 0;
+    com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+        com.google.protobuf.UnknownFieldSet.newBuilder();
+    try {
+      boolean done = false;
+      while (!done) {
+        int tag = input.readTag();
+        switch (tag) {
+          case 0:
+            done = true;
+            break;
+          case 10: {
+            com.tzld.piaoquan.recommend.feature.model.common.Result.Builder subBuilder = null;
+            if (result_ != null) {
+              subBuilder = result_.toBuilder();
+            }
+            result_ = input.readMessage(com.tzld.piaoquan.recommend.feature.model.common.Result.parser(), extensionRegistry);
+            if (subBuilder != null) {
+              subBuilder.mergeFrom(result_);
+              result_ = subBuilder.buildPartial();
+            }
+
+            break;
+          }
+          case 18: {
+            if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+              videoFeatureInfo_ = new java.util.ArrayList<com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo>();
+              mutable_bitField0_ |= 0x00000001;
+            }
+            videoFeatureInfo_.add(
+                input.readMessage(com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo.parser(), extensionRegistry));
+            break;
+          }
+          default: {
+            if (!parseUnknownField(
+                input, unknownFields, extensionRegistry, tag)) {
+              done = true;
+            }
+            break;
+          }
+        }
+      }
+    } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+      throw e.setUnfinishedMessage(this);
+    } catch (java.io.IOException e) {
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
+    } finally {
+      if (((mutable_bitField0_ & 0x00000001) != 0)) {
+        videoFeatureInfo_ = java.util.Collections.unmodifiableList(videoFeatureInfo_);
+      }
+      this.unknownFields = unknownFields.build();
+      makeExtensionsImmutable();
+    }
+  }
+  public static final com.google.protobuf.Descriptors.Descriptor
+      getDescriptor() {
+    return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetVideoFeatureInfoResponse_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetVideoFeatureInfoResponse_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse.class, com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse.Builder.class);
+  }
+
+  public static final int RESULT_FIELD_NUMBER = 1;
+  private com.tzld.piaoquan.recommend.feature.model.common.Result result_;
+  /**
+   * <code>.Result result = 1;</code>
+   * @return Whether the result field is set.
+   */
+  @java.lang.Override
+  public boolean hasResult() {
+    return result_ != null;
+  }
+  /**
+   * <code>.Result result = 1;</code>
+   * @return The result.
+   */
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.common.Result getResult() {
+    return result_ == null ? com.tzld.piaoquan.recommend.feature.model.common.Result.getDefaultInstance() : result_;
+  }
+  /**
+   * <code>.Result result = 1;</code>
+   */
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.common.ResultOrBuilder getResultOrBuilder() {
+    return getResult();
+  }
+
+  public static final int VIDEO_FEATURE_INFO_FIELD_NUMBER = 2;
+  private java.util.List<com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo> videoFeatureInfo_;
+  /**
+   * <code>repeated .GetVideoFeatureInfo video_feature_info = 2;</code>
+   */
+  @java.lang.Override
+  public java.util.List<com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo> getVideoFeatureInfoList() {
+    return videoFeatureInfo_;
+  }
+  /**
+   * <code>repeated .GetVideoFeatureInfo video_feature_info = 2;</code>
+   */
+  @java.lang.Override
+  public java.util.List<? extends com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoOrBuilder> 
+      getVideoFeatureInfoOrBuilderList() {
+    return videoFeatureInfo_;
+  }
+  /**
+   * <code>repeated .GetVideoFeatureInfo video_feature_info = 2;</code>
+   */
+  @java.lang.Override
+  public int getVideoFeatureInfoCount() {
+    return videoFeatureInfo_.size();
+  }
+  /**
+   * <code>repeated .GetVideoFeatureInfo video_feature_info = 2;</code>
+   */
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo getVideoFeatureInfo(int index) {
+    return videoFeatureInfo_.get(index);
+  }
+  /**
+   * <code>repeated .GetVideoFeatureInfo video_feature_info = 2;</code>
+   */
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoOrBuilder getVideoFeatureInfoOrBuilder(
+      int index) {
+    return videoFeatureInfo_.get(index);
+  }
+
+  private byte memoizedIsInitialized = -1;
+  @java.lang.Override
+  public final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
+  }
+
+  @java.lang.Override
+  public void writeTo(com.google.protobuf.CodedOutputStream output)
+                      throws java.io.IOException {
+    if (result_ != null) {
+      output.writeMessage(1, getResult());
+    }
+    for (int i = 0; i < videoFeatureInfo_.size(); i++) {
+      output.writeMessage(2, videoFeatureInfo_.get(i));
+    }
+    unknownFields.writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    if (result_ != null) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(1, getResult());
+    }
+    for (int i = 0; i < videoFeatureInfo_.size(); i++) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(2, videoFeatureInfo_.get(i));
+    }
+    size += unknownFields.getSerializedSize();
+    memoizedSize = size;
+    return size;
+  }
+
+  @java.lang.Override
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+     return true;
+    }
+    if (!(obj instanceof com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse)) {
+      return super.equals(obj);
+    }
+    com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse other = (com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse) obj;
+
+    if (hasResult() != other.hasResult()) return false;
+    if (hasResult()) {
+      if (!getResult()
+          .equals(other.getResult())) return false;
+    }
+    if (!getVideoFeatureInfoList()
+        .equals(other.getVideoFeatureInfoList())) return false;
+    if (!unknownFields.equals(other.unknownFields)) return false;
+    return true;
+  }
+
+  @java.lang.Override
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
+    }
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    if (hasResult()) {
+      hash = (37 * hash) + RESULT_FIELD_NUMBER;
+      hash = (53 * hash) + getResult().hashCode();
+    }
+    if (getVideoFeatureInfoCount() > 0) {
+      hash = (37 * hash) + VIDEO_FEATURE_INFO_FIELD_NUMBER;
+      hash = (53 * hash) + getVideoFeatureInfoList().hashCode();
+    }
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse parseFrom(
+      java.nio.ByteBuffer data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse parseFrom(
+      com.google.protobuf.ByteString data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse parseFrom(
+      byte[] data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse parseFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse parseFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse parseDelimitedFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse parseDelimitedFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse parseFrom(
+      com.google.protobuf.CodedInputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse parseFrom(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+
+  @java.lang.Override
+  public Builder newBuilderForType() { return newBuilder(); }
+  public static Builder newBuilder() {
+    return DEFAULT_INSTANCE.toBuilder();
+  }
+  public static Builder newBuilder(com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse prototype) {
+    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+  }
+  @java.lang.Override
+  public Builder toBuilder() {
+    return this == DEFAULT_INSTANCE
+        ? new Builder() : new Builder().mergeFrom(this);
+  }
+
+  @java.lang.Override
+  protected Builder newBuilderForType(
+      com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
+  }
+  /**
+   * Protobuf type {@code GetVideoFeatureInfoResponse}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:GetVideoFeatureInfoResponse)
+      com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponseOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetVideoFeatureInfoResponse_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetVideoFeatureInfoResponse_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse.class, com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse.Builder.class);
+    }
+
+    // Construct using com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse.newBuilder()
+    private Builder() {
+      maybeForceBuilderInitialization();
+    }
+
+    private Builder(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+      maybeForceBuilderInitialization();
+    }
+    private void maybeForceBuilderInitialization() {
+      if (com.google.protobuf.GeneratedMessageV3
+              .alwaysUseFieldBuilders) {
+        getVideoFeatureInfoFieldBuilder();
+      }
+    }
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      if (resultBuilder_ == null) {
+        result_ = null;
+      } else {
+        result_ = null;
+        resultBuilder_ = null;
+      }
+      if (videoFeatureInfoBuilder_ == null) {
+        videoFeatureInfo_ = java.util.Collections.emptyList();
+        bitField0_ = (bitField0_ & ~0x00000001);
+      } else {
+        videoFeatureInfoBuilder_.clear();
+      }
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetVideoFeatureInfoResponse_descriptor;
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse getDefaultInstanceForType() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse build() {
+      com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse buildPartial() {
+      com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse result = new com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse(this);
+      int from_bitField0_ = bitField0_;
+      if (resultBuilder_ == null) {
+        result.result_ = result_;
+      } else {
+        result.result_ = resultBuilder_.build();
+      }
+      if (videoFeatureInfoBuilder_ == null) {
+        if (((bitField0_ & 0x00000001) != 0)) {
+          videoFeatureInfo_ = java.util.Collections.unmodifiableList(videoFeatureInfo_);
+          bitField0_ = (bitField0_ & ~0x00000001);
+        }
+        result.videoFeatureInfo_ = videoFeatureInfo_;
+      } else {
+        result.videoFeatureInfo_ = videoFeatureInfoBuilder_.build();
+      }
+      onBuilt();
+      return result;
+    }
+
+    @java.lang.Override
+    public Builder clone() {
+      return super.clone();
+    }
+    @java.lang.Override
+    public Builder setField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.setField(field, value);
+    }
+    @java.lang.Override
+    public Builder clearField(
+        com.google.protobuf.Descriptors.FieldDescriptor field) {
+      return super.clearField(field);
+    }
+    @java.lang.Override
+    public Builder clearOneof(
+        com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+      return super.clearOneof(oneof);
+    }
+    @java.lang.Override
+    public Builder setRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        int index, java.lang.Object value) {
+      return super.setRepeatedField(field, index, value);
+    }
+    @java.lang.Override
+    public Builder addRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.addRepeatedField(field, value);
+    }
+    @java.lang.Override
+    public Builder mergeFrom(com.google.protobuf.Message other) {
+      if (other instanceof com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse) {
+        return mergeFrom((com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse other) {
+      if (other == com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse.getDefaultInstance()) return this;
+      if (other.hasResult()) {
+        mergeResult(other.getResult());
+      }
+      if (videoFeatureInfoBuilder_ == null) {
+        if (!other.videoFeatureInfo_.isEmpty()) {
+          if (videoFeatureInfo_.isEmpty()) {
+            videoFeatureInfo_ = other.videoFeatureInfo_;
+            bitField0_ = (bitField0_ & ~0x00000001);
+          } else {
+            ensureVideoFeatureInfoIsMutable();
+            videoFeatureInfo_.addAll(other.videoFeatureInfo_);
+          }
+          onChanged();
+        }
+      } else {
+        if (!other.videoFeatureInfo_.isEmpty()) {
+          if (videoFeatureInfoBuilder_.isEmpty()) {
+            videoFeatureInfoBuilder_.dispose();
+            videoFeatureInfoBuilder_ = null;
+            videoFeatureInfo_ = other.videoFeatureInfo_;
+            bitField0_ = (bitField0_ & ~0x00000001);
+            videoFeatureInfoBuilder_ = 
+              com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
+                 getVideoFeatureInfoFieldBuilder() : null;
+          } else {
+            videoFeatureInfoBuilder_.addAllMessages(other.videoFeatureInfo_);
+          }
+        }
+      }
+      this.mergeUnknownFields(other.unknownFields);
+      onChanged();
+      return this;
+    }
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse) e.getUnfinishedMessage();
+        throw e.unwrapIOException();
+      } finally {
+        if (parsedMessage != null) {
+          mergeFrom(parsedMessage);
+        }
+      }
+      return this;
+    }
+    private int bitField0_;
+
+    private com.tzld.piaoquan.recommend.feature.model.common.Result result_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.tzld.piaoquan.recommend.feature.model.common.Result, com.tzld.piaoquan.recommend.feature.model.common.Result.Builder, com.tzld.piaoquan.recommend.feature.model.common.ResultOrBuilder> resultBuilder_;
+    /**
+     * <code>.Result result = 1;</code>
+     * @return Whether the result field is set.
+     */
+    public boolean hasResult() {
+      return resultBuilder_ != null || result_ != null;
+    }
+    /**
+     * <code>.Result result = 1;</code>
+     * @return The result.
+     */
+    public com.tzld.piaoquan.recommend.feature.model.common.Result getResult() {
+      if (resultBuilder_ == null) {
+        return result_ == null ? com.tzld.piaoquan.recommend.feature.model.common.Result.getDefaultInstance() : result_;
+      } else {
+        return resultBuilder_.getMessage();
+      }
+    }
+    /**
+     * <code>.Result result = 1;</code>
+     */
+    public Builder setResult(com.tzld.piaoquan.recommend.feature.model.common.Result value) {
+      if (resultBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        result_ = value;
+        onChanged();
+      } else {
+        resultBuilder_.setMessage(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.Result result = 1;</code>
+     */
+    public Builder setResult(
+        com.tzld.piaoquan.recommend.feature.model.common.Result.Builder builderForValue) {
+      if (resultBuilder_ == null) {
+        result_ = builderForValue.build();
+        onChanged();
+      } else {
+        resultBuilder_.setMessage(builderForValue.build());
+      }
+
+      return this;
+    }
+    /**
+     * <code>.Result result = 1;</code>
+     */
+    public Builder mergeResult(com.tzld.piaoquan.recommend.feature.model.common.Result value) {
+      if (resultBuilder_ == null) {
+        if (result_ != null) {
+          result_ =
+            com.tzld.piaoquan.recommend.feature.model.common.Result.newBuilder(result_).mergeFrom(value).buildPartial();
+        } else {
+          result_ = value;
+        }
+        onChanged();
+      } else {
+        resultBuilder_.mergeFrom(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.Result result = 1;</code>
+     */
+    public Builder clearResult() {
+      if (resultBuilder_ == null) {
+        result_ = null;
+        onChanged();
+      } else {
+        result_ = null;
+        resultBuilder_ = null;
+      }
+
+      return this;
+    }
+    /**
+     * <code>.Result result = 1;</code>
+     */
+    public com.tzld.piaoquan.recommend.feature.model.common.Result.Builder getResultBuilder() {
+      
+      onChanged();
+      return getResultFieldBuilder().getBuilder();
+    }
+    /**
+     * <code>.Result result = 1;</code>
+     */
+    public com.tzld.piaoquan.recommend.feature.model.common.ResultOrBuilder getResultOrBuilder() {
+      if (resultBuilder_ != null) {
+        return resultBuilder_.getMessageOrBuilder();
+      } else {
+        return result_ == null ?
+            com.tzld.piaoquan.recommend.feature.model.common.Result.getDefaultInstance() : result_;
+      }
+    }
+    /**
+     * <code>.Result result = 1;</code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.tzld.piaoquan.recommend.feature.model.common.Result, com.tzld.piaoquan.recommend.feature.model.common.Result.Builder, com.tzld.piaoquan.recommend.feature.model.common.ResultOrBuilder> 
+        getResultFieldBuilder() {
+      if (resultBuilder_ == null) {
+        resultBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            com.tzld.piaoquan.recommend.feature.model.common.Result, com.tzld.piaoquan.recommend.feature.model.common.Result.Builder, com.tzld.piaoquan.recommend.feature.model.common.ResultOrBuilder>(
+                getResult(),
+                getParentForChildren(),
+                isClean());
+        result_ = null;
+      }
+      return resultBuilder_;
+    }
+
+    private java.util.List<com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo> videoFeatureInfo_ =
+      java.util.Collections.emptyList();
+    private void ensureVideoFeatureInfoIsMutable() {
+      if (!((bitField0_ & 0x00000001) != 0)) {
+        videoFeatureInfo_ = new java.util.ArrayList<com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo>(videoFeatureInfo_);
+        bitField0_ |= 0x00000001;
+       }
+    }
+
+    private com.google.protobuf.RepeatedFieldBuilderV3<
+        com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo, com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo.Builder, com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoOrBuilder> videoFeatureInfoBuilder_;
+
+    /**
+     * <code>repeated .GetVideoFeatureInfo video_feature_info = 2;</code>
+     */
+    public java.util.List<com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo> getVideoFeatureInfoList() {
+      if (videoFeatureInfoBuilder_ == null) {
+        return java.util.Collections.unmodifiableList(videoFeatureInfo_);
+      } else {
+        return videoFeatureInfoBuilder_.getMessageList();
+      }
+    }
+    /**
+     * <code>repeated .GetVideoFeatureInfo video_feature_info = 2;</code>
+     */
+    public int getVideoFeatureInfoCount() {
+      if (videoFeatureInfoBuilder_ == null) {
+        return videoFeatureInfo_.size();
+      } else {
+        return videoFeatureInfoBuilder_.getCount();
+      }
+    }
+    /**
+     * <code>repeated .GetVideoFeatureInfo video_feature_info = 2;</code>
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo getVideoFeatureInfo(int index) {
+      if (videoFeatureInfoBuilder_ == null) {
+        return videoFeatureInfo_.get(index);
+      } else {
+        return videoFeatureInfoBuilder_.getMessage(index);
+      }
+    }
+    /**
+     * <code>repeated .GetVideoFeatureInfo video_feature_info = 2;</code>
+     */
+    public Builder setVideoFeatureInfo(
+        int index, com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo value) {
+      if (videoFeatureInfoBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureVideoFeatureInfoIsMutable();
+        videoFeatureInfo_.set(index, value);
+        onChanged();
+      } else {
+        videoFeatureInfoBuilder_.setMessage(index, value);
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .GetVideoFeatureInfo video_feature_info = 2;</code>
+     */
+    public Builder setVideoFeatureInfo(
+        int index, com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo.Builder builderForValue) {
+      if (videoFeatureInfoBuilder_ == null) {
+        ensureVideoFeatureInfoIsMutable();
+        videoFeatureInfo_.set(index, builderForValue.build());
+        onChanged();
+      } else {
+        videoFeatureInfoBuilder_.setMessage(index, builderForValue.build());
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .GetVideoFeatureInfo video_feature_info = 2;</code>
+     */
+    public Builder addVideoFeatureInfo(com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo value) {
+      if (videoFeatureInfoBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureVideoFeatureInfoIsMutable();
+        videoFeatureInfo_.add(value);
+        onChanged();
+      } else {
+        videoFeatureInfoBuilder_.addMessage(value);
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .GetVideoFeatureInfo video_feature_info = 2;</code>
+     */
+    public Builder addVideoFeatureInfo(
+        int index, com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo value) {
+      if (videoFeatureInfoBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureVideoFeatureInfoIsMutable();
+        videoFeatureInfo_.add(index, value);
+        onChanged();
+      } else {
+        videoFeatureInfoBuilder_.addMessage(index, value);
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .GetVideoFeatureInfo video_feature_info = 2;</code>
+     */
+    public Builder addVideoFeatureInfo(
+        com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo.Builder builderForValue) {
+      if (videoFeatureInfoBuilder_ == null) {
+        ensureVideoFeatureInfoIsMutable();
+        videoFeatureInfo_.add(builderForValue.build());
+        onChanged();
+      } else {
+        videoFeatureInfoBuilder_.addMessage(builderForValue.build());
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .GetVideoFeatureInfo video_feature_info = 2;</code>
+     */
+    public Builder addVideoFeatureInfo(
+        int index, com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo.Builder builderForValue) {
+      if (videoFeatureInfoBuilder_ == null) {
+        ensureVideoFeatureInfoIsMutable();
+        videoFeatureInfo_.add(index, builderForValue.build());
+        onChanged();
+      } else {
+        videoFeatureInfoBuilder_.addMessage(index, builderForValue.build());
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .GetVideoFeatureInfo video_feature_info = 2;</code>
+     */
+    public Builder addAllVideoFeatureInfo(
+        java.lang.Iterable<? extends com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo> values) {
+      if (videoFeatureInfoBuilder_ == null) {
+        ensureVideoFeatureInfoIsMutable();
+        com.google.protobuf.AbstractMessageLite.Builder.addAll(
+            values, videoFeatureInfo_);
+        onChanged();
+      } else {
+        videoFeatureInfoBuilder_.addAllMessages(values);
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .GetVideoFeatureInfo video_feature_info = 2;</code>
+     */
+    public Builder clearVideoFeatureInfo() {
+      if (videoFeatureInfoBuilder_ == null) {
+        videoFeatureInfo_ = java.util.Collections.emptyList();
+        bitField0_ = (bitField0_ & ~0x00000001);
+        onChanged();
+      } else {
+        videoFeatureInfoBuilder_.clear();
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .GetVideoFeatureInfo video_feature_info = 2;</code>
+     */
+    public Builder removeVideoFeatureInfo(int index) {
+      if (videoFeatureInfoBuilder_ == null) {
+        ensureVideoFeatureInfoIsMutable();
+        videoFeatureInfo_.remove(index);
+        onChanged();
+      } else {
+        videoFeatureInfoBuilder_.remove(index);
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .GetVideoFeatureInfo video_feature_info = 2;</code>
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo.Builder getVideoFeatureInfoBuilder(
+        int index) {
+      return getVideoFeatureInfoFieldBuilder().getBuilder(index);
+    }
+    /**
+     * <code>repeated .GetVideoFeatureInfo video_feature_info = 2;</code>
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoOrBuilder getVideoFeatureInfoOrBuilder(
+        int index) {
+      if (videoFeatureInfoBuilder_ == null) {
+        return videoFeatureInfo_.get(index);  } else {
+        return videoFeatureInfoBuilder_.getMessageOrBuilder(index);
+      }
+    }
+    /**
+     * <code>repeated .GetVideoFeatureInfo video_feature_info = 2;</code>
+     */
+    public java.util.List<? extends com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoOrBuilder> 
+         getVideoFeatureInfoOrBuilderList() {
+      if (videoFeatureInfoBuilder_ != null) {
+        return videoFeatureInfoBuilder_.getMessageOrBuilderList();
+      } else {
+        return java.util.Collections.unmodifiableList(videoFeatureInfo_);
+      }
+    }
+    /**
+     * <code>repeated .GetVideoFeatureInfo video_feature_info = 2;</code>
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo.Builder addVideoFeatureInfoBuilder() {
+      return getVideoFeatureInfoFieldBuilder().addBuilder(
+          com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo.getDefaultInstance());
+    }
+    /**
+     * <code>repeated .GetVideoFeatureInfo video_feature_info = 2;</code>
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo.Builder addVideoFeatureInfoBuilder(
+        int index) {
+      return getVideoFeatureInfoFieldBuilder().addBuilder(
+          index, com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo.getDefaultInstance());
+    }
+    /**
+     * <code>repeated .GetVideoFeatureInfo video_feature_info = 2;</code>
+     */
+    public java.util.List<com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo.Builder> 
+         getVideoFeatureInfoBuilderList() {
+      return getVideoFeatureInfoFieldBuilder().getBuilderList();
+    }
+    private com.google.protobuf.RepeatedFieldBuilderV3<
+        com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo, com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo.Builder, com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoOrBuilder> 
+        getVideoFeatureInfoFieldBuilder() {
+      if (videoFeatureInfoBuilder_ == null) {
+        videoFeatureInfoBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+            com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo, com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo.Builder, com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoOrBuilder>(
+                videoFeatureInfo_,
+                ((bitField0_ & 0x00000001) != 0),
+                getParentForChildren(),
+                isClean());
+        videoFeatureInfo_ = null;
+      }
+      return videoFeatureInfoBuilder_;
+    }
+    @java.lang.Override
+    public final Builder setUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.setUnknownFields(unknownFields);
+    }
+
+    @java.lang.Override
+    public final Builder mergeUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.mergeUnknownFields(unknownFields);
+    }
+
+
+    // @@protoc_insertion_point(builder_scope:GetVideoFeatureInfoResponse)
+  }
+
+  // @@protoc_insertion_point(class_scope:GetVideoFeatureInfoResponse)
+  private static final com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse();
+  }
+
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<GetVideoFeatureInfoResponse>
+      PARSER = new com.google.protobuf.AbstractParser<GetVideoFeatureInfoResponse>() {
+    @java.lang.Override
+    public GetVideoFeatureInfoResponse parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new GetVideoFeatureInfoResponse(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<GetVideoFeatureInfoResponse> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<GetVideoFeatureInfoResponse> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoResponse getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+

+ 48 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetVideoFeatureInfoResponseOrBuilder.java

@@ -0,0 +1,48 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: com/tzld/piaoquan/recommend/feature/feature.proto
+
+package com.tzld.piaoquan.recommend.feature.model.feature;
+
+public interface GetVideoFeatureInfoResponseOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:GetVideoFeatureInfoResponse)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <code>.Result result = 1;</code>
+   * @return Whether the result field is set.
+   */
+  boolean hasResult();
+  /**
+   * <code>.Result result = 1;</code>
+   * @return The result.
+   */
+  com.tzld.piaoquan.recommend.feature.model.common.Result getResult();
+  /**
+   * <code>.Result result = 1;</code>
+   */
+  com.tzld.piaoquan.recommend.feature.model.common.ResultOrBuilder getResultOrBuilder();
+
+  /**
+   * <code>repeated .GetVideoFeatureInfo video_feature_info = 2;</code>
+   */
+  java.util.List<com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo> 
+      getVideoFeatureInfoList();
+  /**
+   * <code>repeated .GetVideoFeatureInfo video_feature_info = 2;</code>
+   */
+  com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo getVideoFeatureInfo(int index);
+  /**
+   * <code>repeated .GetVideoFeatureInfo video_feature_info = 2;</code>
+   */
+  int getVideoFeatureInfoCount();
+  /**
+   * <code>repeated .GetVideoFeatureInfo video_feature_info = 2;</code>
+   */
+  java.util.List<? extends com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoOrBuilder> 
+      getVideoFeatureInfoOrBuilderList();
+  /**
+   * <code>repeated .GetVideoFeatureInfo video_feature_info = 2;</code>
+   */
+  com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfoOrBuilder getVideoFeatureInfoOrBuilder(
+      int index);
+}

+ 142 - 19
recommend-feature-client/src/main/proto/com/tzld/piaoquan/recommend/feature/feature.proto

@@ -102,27 +102,149 @@ message GetUserAdFeatureResponse {
 message AdItemFeatureProto {
     string adId = 1;
     string adCode = 2;
-    string advertiserId = 3;
-    string advertiserCode = 4;
-    string campaignId = 5;
-    string campaignCode = 6;
-    string creativeId = 7;
-    string creativeCode = 8;
-    AdActionFeatureProto day1_cnt_features = 9;
-    AdActionFeatureProto day3_cnt_features = 10;
-    AdActionFeatureProto day7_cnt_features = 11;
-    AdActionFeatureProto month3_cnt_features = 12;
-    AdActionFeatureProto creative_1day_cnt_features = 13;
-    AdActionFeatureProto creative_3day_cnt_features = 14;
-    AdActionFeatureProto creative_7day_cnt_features = 15;
-    AdActionFeatureProto creative_3month_cnt_features = 16;
-    AdActionFeatureProto advertiser_1day_cnt_features = 17;
-    AdActionFeatureProto advertiser_3day_cnt_features = 18;
-    AdActionFeatureProto advertiser_7day_cnt_features = 19;
-    AdActionFeatureProto advertiser_3month_cnt_features = 20;
+  string advertiserId = 3;
+  string advertiserCode = 4;
+  string campaignId = 5;
+  string campaignCode = 6;
+  string creativeId = 7;
+  string creativeCode = 8;
+  AdActionFeatureProto day1_cnt_features = 9;
+  AdActionFeatureProto day3_cnt_features = 10;
+  AdActionFeatureProto day7_cnt_features = 11;
+  AdActionFeatureProto month3_cnt_features = 12;
+  AdActionFeatureProto creative_1day_cnt_features = 13;
+  AdActionFeatureProto creative_3day_cnt_features = 14;
+  AdActionFeatureProto creative_7day_cnt_features = 15;
+  AdActionFeatureProto creative_3month_cnt_features = 16;
+  AdActionFeatureProto advertiser_1day_cnt_features = 17;
+  AdActionFeatureProto advertiser_3day_cnt_features = 18;
+  AdActionFeatureProto advertiser_7day_cnt_features = 19;
+  AdActionFeatureProto advertiser_3month_cnt_features = 20;
 }
 
 
+message GetUserFeatureInfoRequest {
+  repeated string mids = 1;
+}
+
+message GetUserFeatureInfo {
+  /*
+  过去一小时
+  */
+  int64 u1hour_exp_cnt = 1;
+  int64 u1hour_click_cnt = 2;
+  int64 u1hour_share_cnt = 3;
+  int64 u1hour_return_cnt = 4;
+  double u_ctr1hour = 5;
+  double u_str1hour = 6;
+  double u_rov1hour = 7;
+  double u_ros1hour = 8;
+  /*
+  今天
+   */
+  int64 u_today_exp_cnt = 9;
+  int64 u_today_click_cnt = 10;
+  int64 u_today_share_cnt = 11;
+  int64 u_today_return_cnt = 12;
+  double u_ctr_today = 13;
+  double u_str_today = 14;
+  double u_rov_today = 15;
+  double u_ros_today = 16;
+  /*
+  过去一天
+   */
+  int64 u1day_exp_cnt = 17;
+  int64 u1day_click_cnt = 18;
+  int64 u1day_share_cnt = 19;
+  int64 u1day_return_cnt = 20;
+  double u_ctr1day = 21;
+  double u_str1day = 22;
+  double u_rov1day = 23;
+  double u_ros1day = 24;
+  /*
+  过去三天
+   */
+  int64 u3day_exp_cnt = 25;
+  int64 u3day_click_cnt = 26;
+  int64 u3day_share_cnt = 27;
+  int64 u3day_return_cnt = 28;
+  double u_ctr3day = 29;
+  double u_str3day = 30;
+  double u_rov3day = 31;
+  double u_ros3day = 32;
+
+  string mid = 33;
+  string machineinfo_brand = 34;
+  string machineinfo_model = 35;
+  string machineinfo_system = 36;
+  string machineinfo_platform = 37;
+  string gender = 38;
+  string country = 39;
+  string province = 40;
+  string city = 41;
+}
+
+message GetUserFeatureInfoResponse {
+  Result result = 1;
+  repeated GetUserFeatureInfo user_feature_info = 2;
+}
+
+message GetVideoFeatureInfoRequest {
+  repeated int64 videoIds = 1;
+}
+
+message GetVideoFeatureInfo {
+  int64 video_id = 1;
+  int64 play_count_total = 2;
+  int32 total_time = 3;
+  string gmt_create = 4;
+  int64 uid = 5;  // 上传者
+  int64 i15min_exp_cnt = 6;  // 过去十五分钟
+  int64 i15min_click_cnt = 7;
+  int64 i15min_share_cnt = 8;
+  int64 i15min_return_cnt = 9;
+  double i_ctr15min = 10;
+  double i_str15min = 11;
+  double i_rov15min = 12;
+  double i_ros15min = 13;
+  int64 i1hour_exp_cnt = 14;  // 过去一小时
+  int64 i1hour_click_cnt = 15;
+  int64 i1hour_share_cnt = 16;
+  int64 i1hour_return_cnt = 17;
+  double i_ctr1hour = 18;
+  double i_str1hour = 19;
+  double i_rov1hour = 20;
+  double i_ros1hour = 21;
+  int64 i_today_exp_cnt = 22;  // 今天
+  int64 i_today_click_cnt = 23;
+  int64 i_today_share_cnt = 24;
+  int64 i_today_return_cnt = 25;
+  double i_ctr_today = 26;
+  double i_str_today = 27;
+  double i_rov_today = 28;
+  double i_ros_today = 29;
+  int64 i1day_exp_cnt = 30;  // 过去一天
+  int64 i1day_click_cnt = 31;
+  int64 i1day_share_cnt = 32;
+  int64 i1day_return_cnt = 33;
+  double i_ctr1day = 34;
+  double i_str1day = 35;
+  double i_rov1day = 36;
+  double i_ros1day = 37;
+  int64 i3day_exp_cnt = 38;  // 过去三天
+  int64 i3day_click_cnt = 39;
+  int64 i3day_share_cnt = 40;
+  int64 i3day_return_cnt = 41;
+  double i_ctr3day = 42;
+  double i_str3day = 43;
+  double i_rov3day = 44;
+  double i_ros3day = 45;
+}
+
+message GetVideoFeatureInfoResponse {
+  Result result = 1;
+  repeated GetVideoFeatureInfo video_feature_info = 2;
+}
 
 message GetAdItemFeatureRequest {
   string ad_id = 1;
@@ -149,5 +271,6 @@ service FeatureService {
   rpc GetUserFeature (GetUserFeatureRequest) returns (GetUserFeatureResponse);
   rpc GetVideoFeature (GetVideoFeatureRequest) returns (GetVideoFeatureResponse);
   rpc GetAllVideoFeature (GetAllVideoFeatureRequest) returns (GetAllVideoFeatureResponse);
-
+  rpc GetUserFeatureInfo (GetUserFeatureInfoRequest) returns (GetUserFeatureInfoResponse);
+  rpc GetVideoFeatureInfo (GetVideoFeatureInfoRequest) returns (GetVideoFeatureInfoResponse);
 }

+ 1 - 1
recommend-feature-service/pom.xml

@@ -91,7 +91,7 @@
         <dependency>
             <groupId>com.tzld.piaoquan</groupId>
             <artifactId>recommend-feature-client</artifactId>
-            <version>1.1.5</version>
+            <version>1.1.16</version>
         </dependency>
         <dependency>
             <groupId>com.google.protobuf</groupId>

+ 37 - 8
recommend-feature-service/src/main/java/com/tzld/piaoquan/recommend/feature/grpcservice/FeatureGrpcService.java

@@ -1,16 +1,16 @@
 package com.tzld.piaoquan.recommend.feature.grpcservice;
 
 import com.tzld.piaoquan.recommend.feature.client.ProtobufUtils;
+import com.tzld.piaoquan.recommend.feature.model.common.Result;
 import com.tzld.piaoquan.recommend.feature.model.feature.*;
-import com.tzld.piaoquan.recommend.feature.service.AdItemFeatureService;
-import com.tzld.piaoquan.recommend.feature.service.UserAdFeatureService;
-import com.tzld.piaoquan.recommend.feature.service.UserFeatureService;
-import com.tzld.piaoquan.recommend.feature.service.VideoFeatureService;
+import com.tzld.piaoquan.recommend.feature.service.*;
 import io.grpc.stub.StreamObserver;
 import lombok.extern.slf4j.Slf4j;
 import net.devh.boot.grpc.server.service.GrpcService;
 import org.springframework.beans.factory.annotation.Autowired;
 
+import java.util.List;
+
 /**
  * @author dyp
  */
@@ -28,12 +28,14 @@ public class FeatureGrpcService extends FeatureServiceGrpc.FeatureServiceImplBas
     @Autowired
     private UserAdFeatureService userAdFeatureService;
 
+    @Autowired
+    private UserAndVideoFeatureService userAndVideoFeatureService;
 
     @Override
     public void getUserFeature(GetUserFeatureRequest request, StreamObserver<GetUserFeatureResponse> responseObserver) {
-        log.info("FeatureGrpcService getUserFeature request={}", ProtobufUtils.toJson(request));
+        log.info("FeatureGrpcService queryUserFeature request={}", ProtobufUtils.toJson(request));
         GetUserFeatureResponse response = userFeatureService.getUserFeature(request);
-        log.info("FeatureGrpcService getUserFeature response={}", ProtobufUtils.toJson(response));
+        log.info("FeatureGrpcService queryUserFeature response={}", ProtobufUtils.toJson(response));
         responseObserver.onNext(response);
         responseObserver.onCompleted();
     }
@@ -41,9 +43,9 @@ public class FeatureGrpcService extends FeatureServiceGrpc.FeatureServiceImplBas
     @Override
     public void getVideoFeature(GetVideoFeatureRequest request,
                                 StreamObserver<GetVideoFeatureResponse> responseObserver) {
-        log.info("FeatureGrpcService getVideoFeature request={}", ProtobufUtils.toJson(request));
+        log.info("FeatureGrpcService queryVideoFeature request={}", ProtobufUtils.toJson(request));
         GetVideoFeatureResponse response = videoFeatureService.getVideoFeature(request);
-        log.info("FeatureGrpcService getVideoFeature response={}", ProtobufUtils.toJson(response));
+        log.info("FeatureGrpcService queryVideoFeature response={}", ProtobufUtils.toJson(response));
         responseObserver.onNext(response);
         responseObserver.onCompleted();
     }
@@ -87,4 +89,31 @@ public class FeatureGrpcService extends FeatureServiceGrpc.FeatureServiceImplBas
         responseObserver.onNext(response);
         responseObserver.onCompleted();
     }
+
+    @Override
+    public void getUserFeatureInfo(GetUserFeatureInfoRequest request, StreamObserver<GetUserFeatureInfoResponse> responseObserver) {
+        log.info("FeatureGrpcService getUserFeatureInfo request={}", ProtobufUtils.toJson(request));
+        List<GetUserFeatureInfo> getUserFeatureInfoList = userAndVideoFeatureService.queryUserFeature(request.getMidsList());
+        GetUserFeatureInfoResponse response = GetUserFeatureInfoResponse.newBuilder()
+                .setResult(Result.newBuilder().setCode(1))
+                .addAllUserFeatureInfo(getUserFeatureInfoList)
+                .build();
+        log.info("FeatureGrpcService getUserFeatureInfo response={}", ProtobufUtils.toJson(response));
+        responseObserver.onNext(response);
+        responseObserver.onCompleted();
+
+    }
+
+    @Override
+    public void getVideoFeatureInfo(GetVideoFeatureInfoRequest request, StreamObserver<GetVideoFeatureInfoResponse> responseObserver) {
+        log.info("FeatureGrpcService getVideoFeatureInfo request={}", ProtobufUtils.toJson(request));
+        List<GetVideoFeatureInfo> getVideoFeatureInfoList = userAndVideoFeatureService.queryVideoFeature(request.getVideoIdsList());
+        GetVideoFeatureInfoResponse response = GetVideoFeatureInfoResponse.newBuilder()
+                .setResult(Result.newBuilder().setCode(1))
+                .addAllVideoFeatureInfo(getVideoFeatureInfoList)
+                .build();
+        log.info("FeatureGrpcService getVideoFeatureInfo response={}", ProtobufUtils.toJson(response));
+        responseObserver.onNext(response);
+        responseObserver.onCompleted();
+    }
 }

+ 277 - 0
recommend-feature-service/src/main/java/com/tzld/piaoquan/recommend/feature/service/UserAndVideoFeatureConverter.java

@@ -0,0 +1,277 @@
+package com.tzld.piaoquan.recommend.feature.service;
+
+
+import com.alibaba.fastjson.JSONObject;
+import com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo;
+import com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo;
+
+/**
+ * @author sunxy
+ */
+public class UserAndVideoFeatureConverter {
+
+    public static GetUserFeatureInfo convertUserFeatureInfoToProto(JSONObject jsonObject) {
+        if (jsonObject == null) {
+            return null;
+        }
+        GetUserFeatureInfo.Builder builder = GetUserFeatureInfo.newBuilder();
+        if (jsonObject.containsKey("u1hour_exp_cnt")) {
+            builder.setU1HourExpCnt(jsonObject.getLong("u1hour_exp_cnt"));
+        }
+        if (jsonObject.containsKey("u1hour_click_cnt")) {
+            builder.setU1HourClickCnt(jsonObject.getLong("u1hour_click_cnt"));
+        }
+        if (jsonObject.containsKey("u1hour_share_cnt")) {
+            builder.setU1HourShareCnt(jsonObject.getLong("u1hour_share_cnt"));
+        }
+        if (jsonObject.containsKey("u1hour_return_cnt")) {
+            builder.setU1HourReturnCnt(jsonObject.getLong("u1hour_return_cnt"));
+        }
+        if (jsonObject.containsKey("u_ctr1hour")) {
+            builder.setUCtr1Hour(jsonObject.getDouble("u_ctr1hour"));
+        }
+        if (jsonObject.containsKey("u_str1hour")) {
+            builder.setUStr1Hour(jsonObject.getDouble("u_str1hour"));
+        }
+        if (jsonObject.containsKey("u_rov1hour")) {
+            builder.setURov1Hour(jsonObject.getDouble("u_rov1hour"));
+        }
+        if (jsonObject.containsKey("u_ros1hour")) {
+            builder.setURos1Hour(jsonObject.getDouble("u_ros1hour"));
+        }
+        if (jsonObject.containsKey("u_today_exp_cnt")) {
+            builder.setUTodayExpCnt(jsonObject.getLong("u_today_exp_cnt"));
+        }
+        if (jsonObject.containsKey("u_today_click_cnt")) {
+            builder.setUTodayClickCnt(jsonObject.getLong("u_today_click_cnt"));
+        }
+        if (jsonObject.containsKey("u_today_share_cnt")) {
+            builder.setUTodayShareCnt(jsonObject.getLong("u_today_share_cnt"));
+        }
+        if (jsonObject.containsKey("u_today_return_cnt")) {
+            builder.setUTodayReturnCnt(jsonObject.getLong("u_today_return_cnt"));
+        }
+        if (jsonObject.containsKey("u_ctr_today")) {
+            builder.setUCtrToday(jsonObject.getDouble("u_ctr_today"));
+        }
+        if (jsonObject.containsKey("u_str_today")) {
+            builder.setUStrToday(jsonObject.getDouble("u_str_today"));
+        }
+        if (jsonObject.containsKey("u_rov_today")) {
+            builder.setURovToday(jsonObject.getDouble("u_rov_today"));
+        }
+        if (jsonObject.containsKey("u_ros_today")) {
+            builder.setURosToday(jsonObject.getDouble("u_ros_today"));
+        }
+        if (jsonObject.containsKey("u1day_exp_cnt")) {
+            builder.setU1DayExpCnt(jsonObject.getLong("u1day_exp_cnt"));
+        }
+        if (jsonObject.containsKey("u1day_click_cnt")) {
+            builder.setU1DayClickCnt(jsonObject.getLong("u1day_click_cnt"));
+        }
+        if (jsonObject.containsKey("u1day_share_cnt")) {
+            builder.setU1DayShareCnt(jsonObject.getLong("u1day_share_cnt"));
+        }
+        if (jsonObject.containsKey("u1day_return_cnt")) {
+            builder.setU1DayReturnCnt(jsonObject.getLong("u1day_return_cnt"));
+        }
+        if (jsonObject.containsKey("u_ctr1day")) {
+            builder.setUCtr1Day(jsonObject.getDouble("u_ctr1day"));
+        }
+        if (jsonObject.containsKey("u_str1day")) {
+            builder.setUStr1Day(jsonObject.getDouble("u_str1day"));
+        }
+        if (jsonObject.containsKey("u_rov1day")) {
+            builder.setURov1Day(jsonObject.getDouble("u_rov1day"));
+        }
+        if (jsonObject.containsKey("u_ros1day")) {
+            builder.setURos1Day(jsonObject.getDouble("u_ros1day"));
+        }
+        if (jsonObject.containsKey("u3day_exp_cnt")) {
+            builder.setU3DayExpCnt(jsonObject.getLong("u3day_exp_cnt"));
+        }
+        if (jsonObject.containsKey("u3day_click_cnt")) {
+            builder.setU3DayClickCnt(jsonObject.getLong("u3day_click_cnt"));
+        }
+        if (jsonObject.containsKey("u3day_share_cnt")) {
+            builder.setU3DayShareCnt(jsonObject.getLong("u3day_share_cnt"));
+        }
+        if (jsonObject.containsKey("u3day_return_cnt")) {
+            builder.setU3DayReturnCnt(jsonObject.getLong("u3day_return_cnt"));
+        }
+        if (jsonObject.containsKey("u_ctr3day")) {
+            builder.setUCtr3Day(jsonObject.getDouble("u_ctr3day"));
+        }
+        if (jsonObject.containsKey("u_str3day")) {
+            builder.setUStr3Day(jsonObject.getDouble("u_str3day"));
+        }
+        if (jsonObject.containsKey("u_rov3day")) {
+            builder.setURov3Day(jsonObject.getDouble("u_rov3day"));
+        }
+        if (jsonObject.containsKey("u_ros3day")) {
+            builder.setURos3Day(jsonObject.getDouble("u_ros3day"));
+        }
+        if (jsonObject.containsKey("mid")) {
+            builder.setMid(jsonObject.getString("mid"));
+        }
+        if (jsonObject.containsKey("machineinfo_brand")) {
+            builder.setMachineinfoBrand(jsonObject.getString("machineinfo_brand"));
+        }
+        if (jsonObject.containsKey("machineinfo_model")) {
+            builder.setMachineinfoModel(jsonObject.getString("machineinfo_model"));
+        }
+        if (jsonObject.containsKey("machineinfo_system")) {
+            builder.setMachineinfoSystem(jsonObject.getString("machineinfo_system"));
+        }
+        if (jsonObject.containsKey("machineinfo_platform")) {
+            builder.setMachineinfoPlatform(jsonObject.getString("machineinfo_platform"));
+        }
+
+        return builder.build();
+    }
+
+    public static GetVideoFeatureInfo convertVideoFeatureInfoToProtoVideo(JSONObject jsonObject) {
+        if (jsonObject == null) {
+            return null;
+        }
+        GetVideoFeatureInfo.Builder builder = GetVideoFeatureInfo.newBuilder();
+        if (jsonObject.containsKey("video_id")) {
+            builder.setVideoId(jsonObject.getLong("video_id"));
+        }
+        if (jsonObject.containsKey("play_count_total")) {
+            builder.setPlayCountTotal(jsonObject.getLong("play_count_total"));
+        }
+        if (jsonObject.containsKey("total_time")) {
+            builder.setTotalTime(jsonObject.getInteger("total_time"));
+        }
+        if (jsonObject.containsKey("gmt_create")) {
+            builder.setGmtCreate(jsonObject.getString("gmt_create"));
+        }
+        if (jsonObject.containsKey("uid")) {
+            builder.setUid(jsonObject.getLong("uid"));
+        }
+        if (jsonObject.containsKey("i15min_exp_cnt")) {
+            builder.setI15MinExpCnt(jsonObject.getLong("i15min_exp_cnt"));
+        }
+        if (jsonObject.containsKey("i15min_click_cnt")) {
+            builder.setI15MinClickCnt(jsonObject.getLong("i15min_click_cnt"));
+        }
+        if (jsonObject.containsKey("i15min_share_cnt")) {
+            builder.setI15MinShareCnt(jsonObject.getLong("i15min_share_cnt"));
+        }
+        if (jsonObject.containsKey("i15min_return_cnt")) {
+            builder.setI15MinReturnCnt(jsonObject.getLong("i15min_return_cnt"));
+        }
+        if (jsonObject.containsKey("i_ctr15min")) {
+            builder.setICtr15Min(jsonObject.getDouble("i_ctr15min"));
+        }
+        if (jsonObject.containsKey("i_str15min")) {
+            builder.setIStr15Min(jsonObject.getDouble("i_str15min"));
+        }
+        if (jsonObject.containsKey("i_rov15min")) {
+            builder.setIRov15Min(jsonObject.getDouble("i_rov15min"));
+        }
+        if (jsonObject.containsKey("i_ros15min")) {
+            builder.setIRos15Min(jsonObject.getDouble("i_ros15min"));
+        }
+        if (jsonObject.containsKey("i1hour_exp_cnt")) {
+            builder.setI1HourExpCnt(jsonObject.getLong("i1hour_exp_cnt"));
+        }
+        if (jsonObject.containsKey("i1hour_click_cnt")) {
+            builder.setI1HourClickCnt(jsonObject.getLong("i1hour_click_cnt"));
+        }
+        if (jsonObject.containsKey("i1hour_share_cnt")) {
+            builder.setI1HourShareCnt(jsonObject.getLong("i1hour_share_cnt"));
+        }
+        if (jsonObject.containsKey("i1hour_return_cnt")) {
+            builder.setI1HourReturnCnt(jsonObject.getLong("i1hour_return_cnt"));
+        }
+        if (jsonObject.containsKey("i_ctr1hour")) {
+            builder.setICtr1Hour(jsonObject.getDouble("i_ctr1hour"));
+        }
+        if (jsonObject.containsKey("i_str1hour")) {
+            builder.setIStr1Hour(jsonObject.getDouble("i_str1hour"));
+        }
+        if (jsonObject.containsKey("i_rov1hour")) {
+            builder.setIRov1Hour(jsonObject.getDouble("i_rov1hour"));
+        }
+        if (jsonObject.containsKey("i_ros1hour")) {
+            builder.setIRos1Hour(jsonObject.getDouble("i_ros1hour"));
+        }
+        if (jsonObject.containsKey("i_today_exp_cnt")) {
+            builder.setITodayExpCnt(jsonObject.getLong("i_today_exp_cnt"));
+        }
+        if (jsonObject.containsKey("i_today_click_cnt")) {
+            builder.setITodayClickCnt(jsonObject.getLong("i_today_click_cnt"));
+        }
+        if (jsonObject.containsKey("i_today_share_cnt")) {
+            builder.setITodayShareCnt(jsonObject.getLong("i_today_share_cnt"));
+        }
+        if (jsonObject.containsKey("i_today_return_cnt")) {
+            builder.setITodayReturnCnt(jsonObject.getLong("i_today_return_cnt"));
+        }
+        if (jsonObject.containsKey("i_ctr_today")) {
+            builder.setICtrToday(jsonObject.getDouble("i_ctr_today"));
+        }
+        if (jsonObject.containsKey("i_str_today")) {
+            builder.setIStrToday(jsonObject.getDouble("i_str_today"));
+        }
+        if (jsonObject.containsKey("i_rov_today")) {
+            builder.setIRovToday(jsonObject.getDouble("i_rov_today"));
+        }
+        if (jsonObject.containsKey("i_ros_today")) {
+            builder.setIRosToday(jsonObject.getDouble("i_ros_today"));
+        }
+        if (jsonObject.containsKey("i1day_exp_cnt")) {
+            builder.setI1DayExpCnt(jsonObject.getLong("i1day_exp_cnt"));
+        }
+        if (jsonObject.containsKey("i1day_click_cnt")) {
+            builder.setI1DayClickCnt(jsonObject.getLong("i1day_click_cnt"));
+        }
+        if (jsonObject.containsKey("i1day_share_cnt")) {
+            builder.setI1DayShareCnt(jsonObject.getLong("i1day_share_cnt"));
+        }
+        if (jsonObject.containsKey("i1day_return_cnt")) {
+            builder.setI1DayReturnCnt(jsonObject.getLong("i1day_return_cnt"));
+        }
+        if (jsonObject.containsKey("i_ctr1day")) {
+            builder.setICtr1Day(jsonObject.getDouble("i_ctr1day"));
+        }
+        if (jsonObject.containsKey("i_str1day")) {
+            builder.setIStr1Day(jsonObject.getDouble("i_str1day"));
+        }
+        if (jsonObject.containsKey("i_rov1day")) {
+            builder.setIRov1Day(jsonObject.getDouble("i_rov1day"));
+        }
+        if (jsonObject.containsKey("i_ros1day")) {
+            builder.setIRos1Day(jsonObject.getDouble("i_ros1day"));
+        }
+        if (jsonObject.containsKey("i3day_exp_cnt")) {
+            builder.setI3DayExpCnt(jsonObject.getLong("i3day_exp_cnt"));
+        }
+        if (jsonObject.containsKey("i3day_click_cnt")) {
+            builder.setI3DayClickCnt(jsonObject.getLong("i3day_click_cnt"));
+        }
+        if (jsonObject.containsKey("i3day_share_cnt")) {
+            builder.setI3DayShareCnt(jsonObject.getLong("i3day_share_cnt"));
+        }
+        if (jsonObject.containsKey("i3day_return_cnt")) {
+            builder.setI3DayReturnCnt(jsonObject.getLong("i3day_return_cnt"));
+        }
+        if (jsonObject.containsKey("i_ctr3day")) {
+            builder.setICtr3Day(jsonObject.getDouble("i_ctr3day"));
+        }
+        if (jsonObject.containsKey("i_str3day")) {
+            builder.setIStr3Day(jsonObject.getDouble("i_str3day"));
+        }
+        if (jsonObject.containsKey("i_rov3day")) {
+            builder.setIRov3Day(jsonObject.getDouble("i_rov3day"));
+        }
+        if (jsonObject.containsKey("i_ros3day")) {
+            builder.setIRos3Day(jsonObject.getDouble("i_ros3day"));
+        }
+
+        return builder.build();
+    }
+
+}

+ 126 - 0
recommend-feature-service/src/main/java/com/tzld/piaoquan/recommend/feature/service/UserAndVideoFeatureService.java

@@ -0,0 +1,126 @@
+package com.tzld.piaoquan.recommend.feature.service;
+
+import com.alibaba.fastjson.JSONObject;
+import com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureInfo;
+import com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureInfo;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.*;
+import java.util.stream.Collectors;
+
+/**
+ * @author sunxy
+ */
+@Service
+public class UserAndVideoFeatureService {
+
+    ExecutorService executorService = new ThreadPoolExecutor(16, 16, 0L,
+            TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>());
+
+    private final static Logger log = LoggerFactory.getLogger(UserAndVideoFeatureService.class);
+    private final static String USER_FEATURE_KEY = "recommend.feature.user.recsys.info.{mid}";
+
+    private final static String VIDEO_FEATURE_KEY = "recommend.feature.video.recsys.info.{videoId}";
+
+    @Resource(name = "redisTemplate")
+    private RedisTemplate<String, Object> redisTemplate;
+
+    public List<GetUserFeatureInfo> queryUserFeature(List<String> mids) {
+        if (CollectionUtils.isEmpty(mids)) {
+            return Collections.emptyList();
+        }
+        // 一次读取不能超过 2000 条
+        if (mids.size() > 2000) {
+            mids = mids.subList(0, 2000);
+        }
+        // 批量读取 Redis
+        List<String> keys = mids.stream().map(mid -> USER_FEATURE_KEY.replace("{mid}", mid)).collect(Collectors.toList());
+        List<Object> resultObjList = redisTemplate.opsForValue().multiGet(keys);
+        if (CollectionUtils.isEmpty(resultObjList)) {
+            return Collections.emptyList();
+        }
+        List<GetUserFeatureInfo> result = Collections.synchronizedList(new ArrayList<>(resultObjList.size()));
+        // 提交 Callable 任务
+        List<Callable<Void>> callableList = new ArrayList<>(resultObjList.size());
+        for (Object resultObj : resultObjList) {
+            callableList.add(() -> {
+                String resultJsonStr = (String) resultObj;
+                try {
+                    JSONObject resultJson = JSONObject.parseObject(resultJsonStr);
+                    if (resultJson == null) {
+                        return null;
+                    }
+                    // convertToProto
+                    GetUserFeatureInfo getUserFeatureInfo = UserAndVideoFeatureConverter.convertUserFeatureInfoToProto(resultJson);
+                    result.add(getUserFeatureInfo);
+                } catch (Exception e) {
+                    log.error("queryUserFeature error, resultJson:{}", resultJsonStr, e);
+                }
+                return null;
+            });
+        }
+
+        // 并发执行字段转换操作
+        try {
+            executorService.invokeAll(callableList);
+        } catch (InterruptedException e) {
+            log.error("queryUserFeature error, mids:{}", mids, e);
+        }
+
+        return result;
+    }
+
+    public List<GetVideoFeatureInfo> queryVideoFeature(List<Long> videoIds) {
+        if (CollectionUtils.isEmpty(videoIds)) {
+            return Collections.emptyList();
+        }
+        // 一次读取不能超过 2000 条
+        if (videoIds.size() > 2000) {
+            videoIds = videoIds.subList(0, 2000);
+        }
+        // 批量读取 Redis
+        List<String> keys = videoIds.stream().map(videoId -> VIDEO_FEATURE_KEY.replace("{videoId}", String.valueOf(videoId))).collect(Collectors.toList());
+        List<Object> resultObjList = redisTemplate.opsForValue().multiGet(keys);
+        if (CollectionUtils.isEmpty(resultObjList)) {
+            return Collections.emptyList();
+        }
+        // 提交 Callable 任务
+        List<GetVideoFeatureInfo> result = Collections.synchronizedList(new ArrayList<>(resultObjList.size()));
+        List<Callable<Void>> callableList = new ArrayList<>(resultObjList.size());
+        for (Object resultObj : resultObjList) {
+            callableList.add(() -> {
+                String resultJsonStr = (String) resultObj;
+                try {
+                    JSONObject resultJson = JSONObject.parseObject(resultJsonStr);
+                    if (resultJson == null) {
+                        return null;
+                    }
+                    // convertToProto
+                    GetVideoFeatureInfo getVideoFeatureInfo = UserAndVideoFeatureConverter.convertVideoFeatureInfoToProtoVideo(resultJson);
+                    result.add(getVideoFeatureInfo);
+                } catch (Exception e) {
+                    log.error("queryVideoFeature error, resultJson:{}", resultJsonStr, e);
+                }
+                return null;
+            });
+        }
+
+        // 并发执行字段转换操作
+        try {
+            executorService.invokeAll(callableList);
+        } catch (InterruptedException e) {
+            log.error("queryVideoFeature error, videoIds:{}", videoIds, e);
+        }
+
+        return result;
+    }
+
+}