丁云鹏 1 rok pred
rodič
commit
16ccb1e1af

+ 12 - 5
abtest-client/src/main/java/com/tzld/piaoquan/abtest/client/ABTestClient.java

@@ -20,21 +20,28 @@ public class ABTestClient {
     @GrpcClient("abtest")
     private GroupServiceGrpc.GroupServiceBlockingStub groupClient;
 
-    public String getGroup(String mid, String uid, int appType, String group) {
+    public GroupInfoProto getGroup(String mid, String uid, int appType, long date, int isFromCard, String chain, Map<String,
+            Integer> group) {
         GetGroupRequest request = GetGroupRequest.newBuilder()
                 .setMid(nullToEmpty(mid))
                 .setUid(nullToEmpty(uid))
                 .setAppType(appType)
-                .setGroup(group)
+                .setIsFromCard(isFromCard)
+                .setGroupInfo(GroupInfoProto.newBuilder()
+                        .setDate(date)
+                        .setChain(nullToEmpty(chain))
+                        .putAllGroup(group == null
+                                ? Collections.emptyMap()
+                                : group))
                 .build();
         GetGroupResponse response = groupClient.getGroup(request);
         if (response == null || !response.hasResult()) {
-            return "";
+            return null;
         }
         if (response.getResult().getCode() != 1) {
-            return "";
+            return null;
         }
-        return response.getGroup();
+        return response.getGroupInfo();
     }
 
     public Map<String, String> getExp(String mid, String uid, int appType, String group) {

+ 228 - 98
abtest-client/src/main/java/com/tzld/piaoquan/abtest/client/model/GetGroupRequest.java

@@ -18,7 +18,6 @@ private static final long serialVersionUID = 0L;
   private GetGroupRequest() {
     mid_ = "";
     uid_ = "";
-    group_ = "";
   }
 
   @java.lang.Override
@@ -68,10 +67,22 @@ private static final long serialVersionUID = 0L;
             appType_ = input.readInt32();
             break;
           }
-          case 34: {
-            java.lang.String s = input.readStringRequireUtf8();
+          case 32: {
+
+            isFromCard_ = input.readInt32();
+            break;
+          }
+          case 42: {
+            com.tzld.piaoquan.abtest.client.model.GroupInfoProto.Builder subBuilder = null;
+            if (groupInfo_ != null) {
+              subBuilder = groupInfo_.toBuilder();
+            }
+            groupInfo_ = input.readMessage(com.tzld.piaoquan.abtest.client.model.GroupInfoProto.parser(), extensionRegistry);
+            if (subBuilder != null) {
+              subBuilder.mergeFrom(groupInfo_);
+              groupInfo_ = subBuilder.buildPartial();
+            }
 
-            group_ = s;
             break;
           }
           default: {
@@ -193,42 +204,45 @@ private static final long serialVersionUID = 0L;
     return appType_;
   }
 
-  public static final int GROUP_FIELD_NUMBER = 4;
-  private volatile java.lang.Object group_;
+  public static final int IS_FROM_CARD_FIELD_NUMBER = 4;
+  private int isFromCard_;
   /**
-   * <code>string group = 4;</code>
-   * @return The group.
+   * <pre>
+   * 1: 来自分享卡片
+   * </pre>
+   *
+   * <code>int32 is_from_card = 4;</code>
+   * @return The isFromCard.
    */
   @java.lang.Override
-  public java.lang.String getGroup() {
-    java.lang.Object ref = group_;
-    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();
-      group_ = s;
-      return s;
-    }
+  public int getIsFromCard() {
+    return isFromCard_;
   }
+
+  public static final int GROUP_INFO_FIELD_NUMBER = 5;
+  private com.tzld.piaoquan.abtest.client.model.GroupInfoProto groupInfo_;
   /**
-   * <code>string group = 4;</code>
-   * @return The bytes for group.
+   * <code>.GroupInfoProto group_info = 5;</code>
+   * @return Whether the groupInfo field is set.
    */
   @java.lang.Override
-  public com.google.protobuf.ByteString
-      getGroupBytes() {
-    java.lang.Object ref = group_;
-    if (ref instanceof java.lang.String) {
-      com.google.protobuf.ByteString b = 
-          com.google.protobuf.ByteString.copyFromUtf8(
-              (java.lang.String) ref);
-      group_ = b;
-      return b;
-    } else {
-      return (com.google.protobuf.ByteString) ref;
-    }
+  public boolean hasGroupInfo() {
+    return groupInfo_ != null;
+  }
+  /**
+   * <code>.GroupInfoProto group_info = 5;</code>
+   * @return The groupInfo.
+   */
+  @java.lang.Override
+  public com.tzld.piaoquan.abtest.client.model.GroupInfoProto getGroupInfo() {
+    return groupInfo_ == null ? com.tzld.piaoquan.abtest.client.model.GroupInfoProto.getDefaultInstance() : groupInfo_;
+  }
+  /**
+   * <code>.GroupInfoProto group_info = 5;</code>
+   */
+  @java.lang.Override
+  public com.tzld.piaoquan.abtest.client.model.GroupInfoProtoOrBuilder getGroupInfoOrBuilder() {
+    return getGroupInfo();
   }
 
   private byte memoizedIsInitialized = -1;
@@ -254,8 +268,11 @@ private static final long serialVersionUID = 0L;
     if (appType_ != 0) {
       output.writeInt32(3, appType_);
     }
-    if (!getGroupBytes().isEmpty()) {
-      com.google.protobuf.GeneratedMessageV3.writeString(output, 4, group_);
+    if (isFromCard_ != 0) {
+      output.writeInt32(4, isFromCard_);
+    }
+    if (groupInfo_ != null) {
+      output.writeMessage(5, getGroupInfo());
     }
     unknownFields.writeTo(output);
   }
@@ -276,8 +293,13 @@ private static final long serialVersionUID = 0L;
       size += com.google.protobuf.CodedOutputStream
         .computeInt32Size(3, appType_);
     }
-    if (!getGroupBytes().isEmpty()) {
-      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, group_);
+    if (isFromCard_ != 0) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt32Size(4, isFromCard_);
+    }
+    if (groupInfo_ != null) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(5, getGroupInfo());
     }
     size += unknownFields.getSerializedSize();
     memoizedSize = size;
@@ -300,8 +322,13 @@ private static final long serialVersionUID = 0L;
         .equals(other.getUid())) return false;
     if (getAppType()
         != other.getAppType()) return false;
-    if (!getGroup()
-        .equals(other.getGroup())) return false;
+    if (getIsFromCard()
+        != other.getIsFromCard()) return false;
+    if (hasGroupInfo() != other.hasGroupInfo()) return false;
+    if (hasGroupInfo()) {
+      if (!getGroupInfo()
+          .equals(other.getGroupInfo())) return false;
+    }
     if (!unknownFields.equals(other.unknownFields)) return false;
     return true;
   }
@@ -319,8 +346,12 @@ private static final long serialVersionUID = 0L;
     hash = (53 * hash) + getUid().hashCode();
     hash = (37 * hash) + APP_TYPE_FIELD_NUMBER;
     hash = (53 * hash) + getAppType();
-    hash = (37 * hash) + GROUP_FIELD_NUMBER;
-    hash = (53 * hash) + getGroup().hashCode();
+    hash = (37 * hash) + IS_FROM_CARD_FIELD_NUMBER;
+    hash = (53 * hash) + getIsFromCard();
+    if (hasGroupInfo()) {
+      hash = (37 * hash) + GROUP_INFO_FIELD_NUMBER;
+      hash = (53 * hash) + getGroupInfo().hashCode();
+    }
     hash = (29 * hash) + unknownFields.hashCode();
     memoizedHashCode = hash;
     return hash;
@@ -460,8 +491,14 @@ private static final long serialVersionUID = 0L;
 
       appType_ = 0;
 
-      group_ = "";
+      isFromCard_ = 0;
 
+      if (groupInfoBuilder_ == null) {
+        groupInfo_ = null;
+      } else {
+        groupInfo_ = null;
+        groupInfoBuilder_ = null;
+      }
       return this;
     }
 
@@ -491,7 +528,12 @@ private static final long serialVersionUID = 0L;
       result.mid_ = mid_;
       result.uid_ = uid_;
       result.appType_ = appType_;
-      result.group_ = group_;
+      result.isFromCard_ = isFromCard_;
+      if (groupInfoBuilder_ == null) {
+        result.groupInfo_ = groupInfo_;
+      } else {
+        result.groupInfo_ = groupInfoBuilder_.build();
+      }
       onBuilt();
       return result;
     }
@@ -551,9 +593,11 @@ private static final long serialVersionUID = 0L;
       if (other.getAppType() != 0) {
         setAppType(other.getAppType());
       }
-      if (!other.getGroup().isEmpty()) {
-        group_ = other.group_;
-        onChanged();
+      if (other.getIsFromCard() != 0) {
+        setIsFromCard(other.getIsFromCard());
+      }
+      if (other.hasGroupInfo()) {
+        mergeGroupInfo(other.getGroupInfo());
       }
       this.mergeUnknownFields(other.unknownFields);
       onChanged();
@@ -767,80 +811,166 @@ private static final long serialVersionUID = 0L;
       return this;
     }
 
-    private java.lang.Object group_ = "";
+    private int isFromCard_ ;
     /**
-     * <code>string group = 4;</code>
-     * @return The group.
+     * <pre>
+     * 1: 来自分享卡片
+     * </pre>
+     *
+     * <code>int32 is_from_card = 4;</code>
+     * @return The isFromCard.
      */
-    public java.lang.String getGroup() {
-      java.lang.Object ref = group_;
-      if (!(ref instanceof java.lang.String)) {
-        com.google.protobuf.ByteString bs =
-            (com.google.protobuf.ByteString) ref;
-        java.lang.String s = bs.toStringUtf8();
-        group_ = s;
-        return s;
+    @java.lang.Override
+    public int getIsFromCard() {
+      return isFromCard_;
+    }
+    /**
+     * <pre>
+     * 1: 来自分享卡片
+     * </pre>
+     *
+     * <code>int32 is_from_card = 4;</code>
+     * @param value The isFromCard to set.
+     * @return This builder for chaining.
+     */
+    public Builder setIsFromCard(int value) {
+      
+      isFromCard_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * 1: 来自分享卡片
+     * </pre>
+     *
+     * <code>int32 is_from_card = 4;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearIsFromCard() {
+      
+      isFromCard_ = 0;
+      onChanged();
+      return this;
+    }
+
+    private com.tzld.piaoquan.abtest.client.model.GroupInfoProto groupInfo_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.tzld.piaoquan.abtest.client.model.GroupInfoProto, com.tzld.piaoquan.abtest.client.model.GroupInfoProto.Builder, com.tzld.piaoquan.abtest.client.model.GroupInfoProtoOrBuilder> groupInfoBuilder_;
+    /**
+     * <code>.GroupInfoProto group_info = 5;</code>
+     * @return Whether the groupInfo field is set.
+     */
+    public boolean hasGroupInfo() {
+      return groupInfoBuilder_ != null || groupInfo_ != null;
+    }
+    /**
+     * <code>.GroupInfoProto group_info = 5;</code>
+     * @return The groupInfo.
+     */
+    public com.tzld.piaoquan.abtest.client.model.GroupInfoProto getGroupInfo() {
+      if (groupInfoBuilder_ == null) {
+        return groupInfo_ == null ? com.tzld.piaoquan.abtest.client.model.GroupInfoProto.getDefaultInstance() : groupInfo_;
       } else {
-        return (java.lang.String) ref;
+        return groupInfoBuilder_.getMessage();
       }
     }
     /**
-     * <code>string group = 4;</code>
-     * @return The bytes for group.
+     * <code>.GroupInfoProto group_info = 5;</code>
      */
-    public com.google.protobuf.ByteString
-        getGroupBytes() {
-      java.lang.Object ref = group_;
-      if (ref instanceof String) {
-        com.google.protobuf.ByteString b = 
-            com.google.protobuf.ByteString.copyFromUtf8(
-                (java.lang.String) ref);
-        group_ = b;
-        return b;
+    public Builder setGroupInfo(com.tzld.piaoquan.abtest.client.model.GroupInfoProto value) {
+      if (groupInfoBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        groupInfo_ = value;
+        onChanged();
       } else {
-        return (com.google.protobuf.ByteString) ref;
+        groupInfoBuilder_.setMessage(value);
       }
+
+      return this;
     }
     /**
-     * <code>string group = 4;</code>
-     * @param value The group to set.
-     * @return This builder for chaining.
+     * <code>.GroupInfoProto group_info = 5;</code>
      */
-    public Builder setGroup(
-        java.lang.String value) {
-      if (value == null) {
-    throw new NullPointerException();
-  }
-  
-      group_ = value;
-      onChanged();
+    public Builder setGroupInfo(
+        com.tzld.piaoquan.abtest.client.model.GroupInfoProto.Builder builderForValue) {
+      if (groupInfoBuilder_ == null) {
+        groupInfo_ = builderForValue.build();
+        onChanged();
+      } else {
+        groupInfoBuilder_.setMessage(builderForValue.build());
+      }
+
       return this;
     }
     /**
-     * <code>string group = 4;</code>
-     * @return This builder for chaining.
+     * <code>.GroupInfoProto group_info = 5;</code>
      */
-    public Builder clearGroup() {
-      
-      group_ = getDefaultInstance().getGroup();
-      onChanged();
+    public Builder mergeGroupInfo(com.tzld.piaoquan.abtest.client.model.GroupInfoProto value) {
+      if (groupInfoBuilder_ == null) {
+        if (groupInfo_ != null) {
+          groupInfo_ =
+            com.tzld.piaoquan.abtest.client.model.GroupInfoProto.newBuilder(groupInfo_).mergeFrom(value).buildPartial();
+        } else {
+          groupInfo_ = value;
+        }
+        onChanged();
+      } else {
+        groupInfoBuilder_.mergeFrom(value);
+      }
+
       return this;
     }
     /**
-     * <code>string group = 4;</code>
-     * @param value The bytes for group to set.
-     * @return This builder for chaining.
+     * <code>.GroupInfoProto group_info = 5;</code>
      */
-    public Builder setGroupBytes(
-        com.google.protobuf.ByteString value) {
-      if (value == null) {
-    throw new NullPointerException();
-  }
-  checkByteStringIsUtf8(value);
+    public Builder clearGroupInfo() {
+      if (groupInfoBuilder_ == null) {
+        groupInfo_ = null;
+        onChanged();
+      } else {
+        groupInfo_ = null;
+        groupInfoBuilder_ = null;
+      }
+
+      return this;
+    }
+    /**
+     * <code>.GroupInfoProto group_info = 5;</code>
+     */
+    public com.tzld.piaoquan.abtest.client.model.GroupInfoProto.Builder getGroupInfoBuilder() {
       
-      group_ = value;
       onChanged();
-      return this;
+      return getGroupInfoFieldBuilder().getBuilder();
+    }
+    /**
+     * <code>.GroupInfoProto group_info = 5;</code>
+     */
+    public com.tzld.piaoquan.abtest.client.model.GroupInfoProtoOrBuilder getGroupInfoOrBuilder() {
+      if (groupInfoBuilder_ != null) {
+        return groupInfoBuilder_.getMessageOrBuilder();
+      } else {
+        return groupInfo_ == null ?
+            com.tzld.piaoquan.abtest.client.model.GroupInfoProto.getDefaultInstance() : groupInfo_;
+      }
+    }
+    /**
+     * <code>.GroupInfoProto group_info = 5;</code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.tzld.piaoquan.abtest.client.model.GroupInfoProto, com.tzld.piaoquan.abtest.client.model.GroupInfoProto.Builder, com.tzld.piaoquan.abtest.client.model.GroupInfoProtoOrBuilder> 
+        getGroupInfoFieldBuilder() {
+      if (groupInfoBuilder_ == null) {
+        groupInfoBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            com.tzld.piaoquan.abtest.client.model.GroupInfoProto, com.tzld.piaoquan.abtest.client.model.GroupInfoProto.Builder, com.tzld.piaoquan.abtest.client.model.GroupInfoProtoOrBuilder>(
+                getGroupInfo(),
+                getParentForChildren(),
+                isClean());
+        groupInfo_ = null;
+      }
+      return groupInfoBuilder_;
     }
     @java.lang.Override
     public final Builder setUnknownFields(

+ 20 - 7
abtest-client/src/main/java/com/tzld/piaoquan/abtest/client/model/GetGroupRequestOrBuilder.java

@@ -38,14 +38,27 @@ public interface GetGroupRequestOrBuilder extends
   int getAppType();
 
   /**
-   * <code>string group = 4;</code>
-   * @return The group.
+   * <pre>
+   * 1: 来自分享卡片
+   * </pre>
+   *
+   * <code>int32 is_from_card = 4;</code>
+   * @return The isFromCard.
    */
-  java.lang.String getGroup();
+  int getIsFromCard();
+
   /**
-   * <code>string group = 4;</code>
-   * @return The bytes for group.
+   * <code>.GroupInfoProto group_info = 5;</code>
+   * @return Whether the groupInfo field is set.
    */
-  com.google.protobuf.ByteString
-      getGroupBytes();
+  boolean hasGroupInfo();
+  /**
+   * <code>.GroupInfoProto group_info = 5;</code>
+   * @return The groupInfo.
+   */
+  com.tzld.piaoquan.abtest.client.model.GroupInfoProto getGroupInfo();
+  /**
+   * <code>.GroupInfoProto group_info = 5;</code>
+   */
+  com.tzld.piaoquan.abtest.client.model.GroupInfoProtoOrBuilder getGroupInfoOrBuilder();
 }

+ 229 - 98
abtest-client/src/main/java/com/tzld/piaoquan/abtest/client/model/GetGroupResponse.java

@@ -16,7 +16,6 @@ private static final long serialVersionUID = 0L;
     super(builder);
   }
   private GetGroupResponse() {
-    group_ = "";
   }
 
   @java.lang.Override
@@ -62,10 +61,22 @@ private static final long serialVersionUID = 0L;
 
             break;
           }
-          case 18: {
-            java.lang.String s = input.readStringRequireUtf8();
+          case 16: {
+
+            date_ = input.readInt64();
+            break;
+          }
+          case 42: {
+            com.tzld.piaoquan.abtest.client.model.GroupInfoProto.Builder subBuilder = null;
+            if (groupInfo_ != null) {
+              subBuilder = groupInfo_.toBuilder();
+            }
+            groupInfo_ = input.readMessage(com.tzld.piaoquan.abtest.client.model.GroupInfoProto.parser(), extensionRegistry);
+            if (subBuilder != null) {
+              subBuilder.mergeFrom(groupInfo_);
+              groupInfo_ = subBuilder.buildPartial();
+            }
 
-            group_ = s;
             break;
           }
           default: {
@@ -126,42 +137,45 @@ private static final long serialVersionUID = 0L;
     return getResult();
   }
 
-  public static final int GROUP_FIELD_NUMBER = 2;
-  private volatile java.lang.Object group_;
+  public static final int DATE_FIELD_NUMBER = 2;
+  private long date_;
   /**
-   * <code>string group = 2;</code>
-   * @return The group.
+   * <pre>
+   * 分组生成时间
+   * </pre>
+   *
+   * <code>int64 date = 2;</code>
+   * @return The date.
    */
   @java.lang.Override
-  public java.lang.String getGroup() {
-    java.lang.Object ref = group_;
-    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();
-      group_ = s;
-      return s;
-    }
+  public long getDate() {
+    return date_;
   }
+
+  public static final int GROUP_INFO_FIELD_NUMBER = 5;
+  private com.tzld.piaoquan.abtest.client.model.GroupInfoProto groupInfo_;
   /**
-   * <code>string group = 2;</code>
-   * @return The bytes for group.
+   * <code>.GroupInfoProto group_info = 5;</code>
+   * @return Whether the groupInfo field is set.
    */
   @java.lang.Override
-  public com.google.protobuf.ByteString
-      getGroupBytes() {
-    java.lang.Object ref = group_;
-    if (ref instanceof java.lang.String) {
-      com.google.protobuf.ByteString b = 
-          com.google.protobuf.ByteString.copyFromUtf8(
-              (java.lang.String) ref);
-      group_ = b;
-      return b;
-    } else {
-      return (com.google.protobuf.ByteString) ref;
-    }
+  public boolean hasGroupInfo() {
+    return groupInfo_ != null;
+  }
+  /**
+   * <code>.GroupInfoProto group_info = 5;</code>
+   * @return The groupInfo.
+   */
+  @java.lang.Override
+  public com.tzld.piaoquan.abtest.client.model.GroupInfoProto getGroupInfo() {
+    return groupInfo_ == null ? com.tzld.piaoquan.abtest.client.model.GroupInfoProto.getDefaultInstance() : groupInfo_;
+  }
+  /**
+   * <code>.GroupInfoProto group_info = 5;</code>
+   */
+  @java.lang.Override
+  public com.tzld.piaoquan.abtest.client.model.GroupInfoProtoOrBuilder getGroupInfoOrBuilder() {
+    return getGroupInfo();
   }
 
   private byte memoizedIsInitialized = -1;
@@ -181,8 +195,11 @@ private static final long serialVersionUID = 0L;
     if (result_ != null) {
       output.writeMessage(1, getResult());
     }
-    if (!getGroupBytes().isEmpty()) {
-      com.google.protobuf.GeneratedMessageV3.writeString(output, 2, group_);
+    if (date_ != 0L) {
+      output.writeInt64(2, date_);
+    }
+    if (groupInfo_ != null) {
+      output.writeMessage(5, getGroupInfo());
     }
     unknownFields.writeTo(output);
   }
@@ -197,8 +214,13 @@ private static final long serialVersionUID = 0L;
       size += com.google.protobuf.CodedOutputStream
         .computeMessageSize(1, getResult());
     }
-    if (!getGroupBytes().isEmpty()) {
-      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, group_);
+    if (date_ != 0L) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt64Size(2, date_);
+    }
+    if (groupInfo_ != null) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(5, getGroupInfo());
     }
     size += unknownFields.getSerializedSize();
     memoizedSize = size;
@@ -220,8 +242,13 @@ private static final long serialVersionUID = 0L;
       if (!getResult()
           .equals(other.getResult())) return false;
     }
-    if (!getGroup()
-        .equals(other.getGroup())) return false;
+    if (getDate()
+        != other.getDate()) return false;
+    if (hasGroupInfo() != other.hasGroupInfo()) return false;
+    if (hasGroupInfo()) {
+      if (!getGroupInfo()
+          .equals(other.getGroupInfo())) return false;
+    }
     if (!unknownFields.equals(other.unknownFields)) return false;
     return true;
   }
@@ -237,8 +264,13 @@ private static final long serialVersionUID = 0L;
       hash = (37 * hash) + RESULT_FIELD_NUMBER;
       hash = (53 * hash) + getResult().hashCode();
     }
-    hash = (37 * hash) + GROUP_FIELD_NUMBER;
-    hash = (53 * hash) + getGroup().hashCode();
+    hash = (37 * hash) + DATE_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        getDate());
+    if (hasGroupInfo()) {
+      hash = (37 * hash) + GROUP_INFO_FIELD_NUMBER;
+      hash = (53 * hash) + getGroupInfo().hashCode();
+    }
     hash = (29 * hash) + unknownFields.hashCode();
     memoizedHashCode = hash;
     return hash;
@@ -378,8 +410,14 @@ private static final long serialVersionUID = 0L;
         result_ = null;
         resultBuilder_ = null;
       }
-      group_ = "";
+      date_ = 0L;
 
+      if (groupInfoBuilder_ == null) {
+        groupInfo_ = null;
+      } else {
+        groupInfo_ = null;
+        groupInfoBuilder_ = null;
+      }
       return this;
     }
 
@@ -411,7 +449,12 @@ private static final long serialVersionUID = 0L;
       } else {
         result.result_ = resultBuilder_.build();
       }
-      result.group_ = group_;
+      result.date_ = date_;
+      if (groupInfoBuilder_ == null) {
+        result.groupInfo_ = groupInfo_;
+      } else {
+        result.groupInfo_ = groupInfoBuilder_.build();
+      }
       onBuilt();
       return result;
     }
@@ -463,9 +506,11 @@ private static final long serialVersionUID = 0L;
       if (other.hasResult()) {
         mergeResult(other.getResult());
       }
-      if (!other.getGroup().isEmpty()) {
-        group_ = other.group_;
-        onChanged();
+      if (other.getDate() != 0L) {
+        setDate(other.getDate());
+      }
+      if (other.hasGroupInfo()) {
+        mergeGroupInfo(other.getGroupInfo());
       }
       this.mergeUnknownFields(other.unknownFields);
       onChanged();
@@ -615,80 +660,166 @@ private static final long serialVersionUID = 0L;
       return resultBuilder_;
     }
 
-    private java.lang.Object group_ = "";
+    private long date_ ;
+    /**
+     * <pre>
+     * 分组生成时间
+     * </pre>
+     *
+     * <code>int64 date = 2;</code>
+     * @return The date.
+     */
+    @java.lang.Override
+    public long getDate() {
+      return date_;
+    }
+    /**
+     * <pre>
+     * 分组生成时间
+     * </pre>
+     *
+     * <code>int64 date = 2;</code>
+     * @param value The date to set.
+     * @return This builder for chaining.
+     */
+    public Builder setDate(long value) {
+      
+      date_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * 分组生成时间
+     * </pre>
+     *
+     * <code>int64 date = 2;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearDate() {
+      
+      date_ = 0L;
+      onChanged();
+      return this;
+    }
+
+    private com.tzld.piaoquan.abtest.client.model.GroupInfoProto groupInfo_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.tzld.piaoquan.abtest.client.model.GroupInfoProto, com.tzld.piaoquan.abtest.client.model.GroupInfoProto.Builder, com.tzld.piaoquan.abtest.client.model.GroupInfoProtoOrBuilder> groupInfoBuilder_;
     /**
-     * <code>string group = 2;</code>
-     * @return The group.
+     * <code>.GroupInfoProto group_info = 5;</code>
+     * @return Whether the groupInfo field is set.
      */
-    public java.lang.String getGroup() {
-      java.lang.Object ref = group_;
-      if (!(ref instanceof java.lang.String)) {
-        com.google.protobuf.ByteString bs =
-            (com.google.protobuf.ByteString) ref;
-        java.lang.String s = bs.toStringUtf8();
-        group_ = s;
-        return s;
+    public boolean hasGroupInfo() {
+      return groupInfoBuilder_ != null || groupInfo_ != null;
+    }
+    /**
+     * <code>.GroupInfoProto group_info = 5;</code>
+     * @return The groupInfo.
+     */
+    public com.tzld.piaoquan.abtest.client.model.GroupInfoProto getGroupInfo() {
+      if (groupInfoBuilder_ == null) {
+        return groupInfo_ == null ? com.tzld.piaoquan.abtest.client.model.GroupInfoProto.getDefaultInstance() : groupInfo_;
       } else {
-        return (java.lang.String) ref;
+        return groupInfoBuilder_.getMessage();
       }
     }
     /**
-     * <code>string group = 2;</code>
-     * @return The bytes for group.
+     * <code>.GroupInfoProto group_info = 5;</code>
      */
-    public com.google.protobuf.ByteString
-        getGroupBytes() {
-      java.lang.Object ref = group_;
-      if (ref instanceof String) {
-        com.google.protobuf.ByteString b = 
-            com.google.protobuf.ByteString.copyFromUtf8(
-                (java.lang.String) ref);
-        group_ = b;
-        return b;
+    public Builder setGroupInfo(com.tzld.piaoquan.abtest.client.model.GroupInfoProto value) {
+      if (groupInfoBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        groupInfo_ = value;
+        onChanged();
       } else {
-        return (com.google.protobuf.ByteString) ref;
+        groupInfoBuilder_.setMessage(value);
       }
+
+      return this;
     }
     /**
-     * <code>string group = 2;</code>
-     * @param value The group to set.
-     * @return This builder for chaining.
+     * <code>.GroupInfoProto group_info = 5;</code>
      */
-    public Builder setGroup(
-        java.lang.String value) {
-      if (value == null) {
-    throw new NullPointerException();
-  }
-  
-      group_ = value;
-      onChanged();
+    public Builder setGroupInfo(
+        com.tzld.piaoquan.abtest.client.model.GroupInfoProto.Builder builderForValue) {
+      if (groupInfoBuilder_ == null) {
+        groupInfo_ = builderForValue.build();
+        onChanged();
+      } else {
+        groupInfoBuilder_.setMessage(builderForValue.build());
+      }
+
       return this;
     }
     /**
-     * <code>string group = 2;</code>
-     * @return This builder for chaining.
+     * <code>.GroupInfoProto group_info = 5;</code>
      */
-    public Builder clearGroup() {
-      
-      group_ = getDefaultInstance().getGroup();
-      onChanged();
+    public Builder mergeGroupInfo(com.tzld.piaoquan.abtest.client.model.GroupInfoProto value) {
+      if (groupInfoBuilder_ == null) {
+        if (groupInfo_ != null) {
+          groupInfo_ =
+            com.tzld.piaoquan.abtest.client.model.GroupInfoProto.newBuilder(groupInfo_).mergeFrom(value).buildPartial();
+        } else {
+          groupInfo_ = value;
+        }
+        onChanged();
+      } else {
+        groupInfoBuilder_.mergeFrom(value);
+      }
+
       return this;
     }
     /**
-     * <code>string group = 2;</code>
-     * @param value The bytes for group to set.
-     * @return This builder for chaining.
+     * <code>.GroupInfoProto group_info = 5;</code>
      */
-    public Builder setGroupBytes(
-        com.google.protobuf.ByteString value) {
-      if (value == null) {
-    throw new NullPointerException();
-  }
-  checkByteStringIsUtf8(value);
+    public Builder clearGroupInfo() {
+      if (groupInfoBuilder_ == null) {
+        groupInfo_ = null;
+        onChanged();
+      } else {
+        groupInfo_ = null;
+        groupInfoBuilder_ = null;
+      }
+
+      return this;
+    }
+    /**
+     * <code>.GroupInfoProto group_info = 5;</code>
+     */
+    public com.tzld.piaoquan.abtest.client.model.GroupInfoProto.Builder getGroupInfoBuilder() {
       
-      group_ = value;
       onChanged();
-      return this;
+      return getGroupInfoFieldBuilder().getBuilder();
+    }
+    /**
+     * <code>.GroupInfoProto group_info = 5;</code>
+     */
+    public com.tzld.piaoquan.abtest.client.model.GroupInfoProtoOrBuilder getGroupInfoOrBuilder() {
+      if (groupInfoBuilder_ != null) {
+        return groupInfoBuilder_.getMessageOrBuilder();
+      } else {
+        return groupInfo_ == null ?
+            com.tzld.piaoquan.abtest.client.model.GroupInfoProto.getDefaultInstance() : groupInfo_;
+      }
+    }
+    /**
+     * <code>.GroupInfoProto group_info = 5;</code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.tzld.piaoquan.abtest.client.model.GroupInfoProto, com.tzld.piaoquan.abtest.client.model.GroupInfoProto.Builder, com.tzld.piaoquan.abtest.client.model.GroupInfoProtoOrBuilder> 
+        getGroupInfoFieldBuilder() {
+      if (groupInfoBuilder_ == null) {
+        groupInfoBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            com.tzld.piaoquan.abtest.client.model.GroupInfoProto, com.tzld.piaoquan.abtest.client.model.GroupInfoProto.Builder, com.tzld.piaoquan.abtest.client.model.GroupInfoProtoOrBuilder>(
+                getGroupInfo(),
+                getParentForChildren(),
+                isClean());
+        groupInfo_ = null;
+      }
+      return groupInfoBuilder_;
     }
     @java.lang.Override
     public final Builder setUnknownFields(

+ 20 - 7
abtest-client/src/main/java/com/tzld/piaoquan/abtest/client/model/GetGroupResponseOrBuilder.java

@@ -23,14 +23,27 @@ public interface GetGroupResponseOrBuilder extends
   com.tzld.piaoquan.abtest.client.model.ResultOrBuilder getResultOrBuilder();
 
   /**
-   * <code>string group = 2;</code>
-   * @return The group.
+   * <pre>
+   * 分组生成时间
+   * </pre>
+   *
+   * <code>int64 date = 2;</code>
+   * @return The date.
    */
-  java.lang.String getGroup();
+  long getDate();
+
+  /**
+   * <code>.GroupInfoProto group_info = 5;</code>
+   * @return Whether the groupInfo field is set.
+   */
+  boolean hasGroupInfo();
+  /**
+   * <code>.GroupInfoProto group_info = 5;</code>
+   * @return The groupInfo.
+   */
+  com.tzld.piaoquan.abtest.client.model.GroupInfoProto getGroupInfo();
   /**
-   * <code>string group = 2;</code>
-   * @return The bytes for group.
+   * <code>.GroupInfoProto group_info = 5;</code>
    */
-  com.google.protobuf.ByteString
-      getGroupBytes();
+  com.tzld.piaoquan.abtest.client.model.GroupInfoProtoOrBuilder getGroupInfoOrBuilder();
 }

+ 37 - 10
abtest-client/src/main/java/com/tzld/piaoquan/abtest/client/model/Group.java

@@ -19,6 +19,16 @@ public final class Group {
   static final 
     com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
       internal_static_GetGroupRequest_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_GroupInfoProto_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_GroupInfoProto_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_GroupInfoProto_GroupEntry_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_GroupInfoProto_GroupEntry_fieldAccessorTable;
   static final com.google.protobuf.Descriptors.Descriptor
     internal_static_GetGroupResponse_descriptor;
   static final 
@@ -34,14 +44,19 @@ public final class Group {
   static {
     java.lang.String[] descriptorData = {
       "\n$com/tzld/piaoquan/abtest/group.proto\032%" +
-      "com/tzld/piaoquan/abtest/common.proto\"L\n" +
+      "com/tzld/piaoquan/abtest/common.proto\"x\n" +
       "\017GetGroupRequest\022\013\n\003mid\030\001 \001(\t\022\013\n\003uid\030\002 \001" +
-      "(\t\022\020\n\010app_type\030\003 \001(\005\022\r\n\005group\030\004 \001(\t\":\n\020G" +
-      "etGroupResponse\022\027\n\006result\030\001 \001(\0132\007.Result" +
-      "\022\r\n\005group\030\002 \001(\t2?\n\014GroupService\022/\n\010getGr" +
-      "oup\022\020.GetGroupRequest\032\021.GetGroupResponse" +
-      "B,\n%com.tzld.piaoquan.abtest.client.mode" +
-      "lP\001\210\001\001b\006proto3"
+      "(\t\022\020\n\010app_type\030\003 \001(\005\022\024\n\014is_from_card\030\004 \001" +
+      "(\005\022#\n\ngroup_info\030\005 \001(\0132\017.GroupInfoProto\"" +
+      "\206\001\n\016GroupInfoProto\022\014\n\004date\030\001 \001(\003\022\r\n\005chai" +
+      "n\030\002 \001(\t\022)\n\005group\030\003 \003(\0132\032.GroupInfoProto." +
+      "GroupEntry\032,\n\nGroupEntry\022\013\n\003key\030\001 \001(\t\022\r\n" +
+      "\005value\030\002 \001(\005:\0028\001\"^\n\020GetGroupResponse\022\027\n\006" +
+      "result\030\001 \001(\0132\007.Result\022\014\n\004date\030\002 \001(\003\022#\n\ng" +
+      "roup_info\030\005 \001(\0132\017.GroupInfoProto2?\n\014Grou" +
+      "pService\022/\n\010getGroup\022\020.GetGroupRequest\032\021" +
+      ".GetGroupResponseB,\n%com.tzld.piaoquan.a" +
+      "btest.client.modelP\001\210\001\001b\006proto3"
     };
     descriptor = com.google.protobuf.Descriptors.FileDescriptor
       .internalBuildGeneratedFileFrom(descriptorData,
@@ -53,13 +68,25 @@ public final class Group {
     internal_static_GetGroupRequest_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_GetGroupRequest_descriptor,
-        new java.lang.String[] { "Mid", "Uid", "AppType", "Group", });
-    internal_static_GetGroupResponse_descriptor =
+        new java.lang.String[] { "Mid", "Uid", "AppType", "IsFromCard", "GroupInfo", });
+    internal_static_GroupInfoProto_descriptor =
       getDescriptor().getMessageTypes().get(1);
+    internal_static_GroupInfoProto_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_GroupInfoProto_descriptor,
+        new java.lang.String[] { "Date", "Chain", "Group", });
+    internal_static_GroupInfoProto_GroupEntry_descriptor =
+      internal_static_GroupInfoProto_descriptor.getNestedTypes().get(0);
+    internal_static_GroupInfoProto_GroupEntry_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_GroupInfoProto_GroupEntry_descriptor,
+        new java.lang.String[] { "Key", "Value", });
+    internal_static_GetGroupResponse_descriptor =
+      getDescriptor().getMessageTypes().get(2);
     internal_static_GetGroupResponse_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_GetGroupResponse_descriptor,
-        new java.lang.String[] { "Result", "Group", });
+        new java.lang.String[] { "Result", "Date", "GroupInfo", });
     com.tzld.piaoquan.abtest.client.model.Common.getDescriptor();
   }
 

+ 924 - 0
abtest-client/src/main/java/com/tzld/piaoquan/abtest/client/model/GroupInfoProto.java

@@ -0,0 +1,924 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: com/tzld/piaoquan/abtest/group.proto
+
+package com.tzld.piaoquan.abtest.client.model;
+
+/**
+ * Protobuf type {@code GroupInfoProto}
+ */
+public final class GroupInfoProto extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:GroupInfoProto)
+    GroupInfoProtoOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use GroupInfoProto.newBuilder() to construct.
+  private GroupInfoProto(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private GroupInfoProto() {
+    chain_ = "";
+  }
+
+  @java.lang.Override
+  @SuppressWarnings({"unused"})
+  protected java.lang.Object newInstance(
+      UnusedPrivateParameter unused) {
+    return new GroupInfoProto();
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private GroupInfoProto(
+      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: {
+
+            date_ = input.readInt64();
+            break;
+          }
+          case 18: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            chain_ = s;
+            break;
+          }
+          case 26: {
+            if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+              group_ = com.google.protobuf.MapField.newMapField(
+                  GroupDefaultEntryHolder.defaultEntry);
+              mutable_bitField0_ |= 0x00000001;
+            }
+            com.google.protobuf.MapEntry<java.lang.String, java.lang.Integer>
+            group__ = input.readMessage(
+                GroupDefaultEntryHolder.defaultEntry.getParserForType(), extensionRegistry);
+            group_.getMutableMap().put(
+                group__.getKey(), group__.getValue());
+            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.abtest.client.model.Group.internal_static_GroupInfoProto_descriptor;
+  }
+
+  @SuppressWarnings({"rawtypes"})
+  @java.lang.Override
+  protected com.google.protobuf.MapField internalGetMapField(
+      int number) {
+    switch (number) {
+      case 3:
+        return internalGetGroup();
+      default:
+        throw new RuntimeException(
+            "Invalid map field number: " + number);
+    }
+  }
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return com.tzld.piaoquan.abtest.client.model.Group.internal_static_GroupInfoProto_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            com.tzld.piaoquan.abtest.client.model.GroupInfoProto.class, com.tzld.piaoquan.abtest.client.model.GroupInfoProto.Builder.class);
+  }
+
+  public static final int DATE_FIELD_NUMBER = 1;
+  private long date_;
+  /**
+   * <pre>
+   * 分组生成时间
+   * </pre>
+   *
+   * <code>int64 date = 1;</code>
+   * @return The date.
+   */
+  @java.lang.Override
+  public long getDate() {
+    return date_;
+  }
+
+  public static final int CHAIN_FIELD_NUMBER = 2;
+  private volatile java.lang.Object chain_;
+  /**
+   * <code>string chain = 2;</code>
+   * @return The chain.
+   */
+  @java.lang.Override
+  public java.lang.String getChain() {
+    java.lang.Object ref = chain_;
+    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();
+      chain_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string chain = 2;</code>
+   * @return The bytes for chain.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getChainBytes() {
+    java.lang.Object ref = chain_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      chain_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int GROUP_FIELD_NUMBER = 3;
+  private static final class GroupDefaultEntryHolder {
+    static final com.google.protobuf.MapEntry<
+        java.lang.String, java.lang.Integer> defaultEntry =
+            com.google.protobuf.MapEntry
+            .<java.lang.String, java.lang.Integer>newDefaultInstance(
+                com.tzld.piaoquan.abtest.client.model.Group.internal_static_GroupInfoProto_GroupEntry_descriptor, 
+                com.google.protobuf.WireFormat.FieldType.STRING,
+                "",
+                com.google.protobuf.WireFormat.FieldType.INT32,
+                0);
+  }
+  private com.google.protobuf.MapField<
+      java.lang.String, java.lang.Integer> group_;
+  private com.google.protobuf.MapField<java.lang.String, java.lang.Integer>
+  internalGetGroup() {
+    if (group_ == null) {
+      return com.google.protobuf.MapField.emptyMapField(
+          GroupDefaultEntryHolder.defaultEntry);
+    }
+    return group_;
+  }
+
+  public int getGroupCount() {
+    return internalGetGroup().getMap().size();
+  }
+  /**
+   * <code>map&lt;string, int32&gt; group = 3;</code>
+   */
+
+  @java.lang.Override
+  public boolean containsGroup(
+      java.lang.String key) {
+    if (key == null) { throw new java.lang.NullPointerException(); }
+    return internalGetGroup().getMap().containsKey(key);
+  }
+  /**
+   * Use {@link #getGroupMap()} instead.
+   */
+  @java.lang.Override
+  @java.lang.Deprecated
+  public java.util.Map<java.lang.String, java.lang.Integer> getGroup() {
+    return getGroupMap();
+  }
+  /**
+   * <code>map&lt;string, int32&gt; group = 3;</code>
+   */
+  @java.lang.Override
+
+  public java.util.Map<java.lang.String, java.lang.Integer> getGroupMap() {
+    return internalGetGroup().getMap();
+  }
+  /**
+   * <code>map&lt;string, int32&gt; group = 3;</code>
+   */
+  @java.lang.Override
+
+  public int getGroupOrDefault(
+      java.lang.String key,
+      int defaultValue) {
+    if (key == null) { throw new java.lang.NullPointerException(); }
+    java.util.Map<java.lang.String, java.lang.Integer> map =
+        internalGetGroup().getMap();
+    return map.containsKey(key) ? map.get(key) : defaultValue;
+  }
+  /**
+   * <code>map&lt;string, int32&gt; group = 3;</code>
+   */
+  @java.lang.Override
+
+  public int getGroupOrThrow(
+      java.lang.String key) {
+    if (key == null) { throw new java.lang.NullPointerException(); }
+    java.util.Map<java.lang.String, java.lang.Integer> map =
+        internalGetGroup().getMap();
+    if (!map.containsKey(key)) {
+      throw new java.lang.IllegalArgumentException();
+    }
+    return map.get(key);
+  }
+
+  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 (date_ != 0L) {
+      output.writeInt64(1, date_);
+    }
+    if (!getChainBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 2, chain_);
+    }
+    com.google.protobuf.GeneratedMessageV3
+      .serializeStringMapTo(
+        output,
+        internalGetGroup(),
+        GroupDefaultEntryHolder.defaultEntry,
+        3);
+    unknownFields.writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    if (date_ != 0L) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt64Size(1, date_);
+    }
+    if (!getChainBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, chain_);
+    }
+    for (java.util.Map.Entry<java.lang.String, java.lang.Integer> entry
+         : internalGetGroup().getMap().entrySet()) {
+      com.google.protobuf.MapEntry<java.lang.String, java.lang.Integer>
+      group__ = GroupDefaultEntryHolder.defaultEntry.newBuilderForType()
+          .setKey(entry.getKey())
+          .setValue(entry.getValue())
+          .build();
+      size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(3, group__);
+    }
+    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.abtest.client.model.GroupInfoProto)) {
+      return super.equals(obj);
+    }
+    com.tzld.piaoquan.abtest.client.model.GroupInfoProto other = (com.tzld.piaoquan.abtest.client.model.GroupInfoProto) obj;
+
+    if (getDate()
+        != other.getDate()) return false;
+    if (!getChain()
+        .equals(other.getChain())) return false;
+    if (!internalGetGroup().equals(
+        other.internalGetGroup())) 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) + DATE_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        getDate());
+    hash = (37 * hash) + CHAIN_FIELD_NUMBER;
+    hash = (53 * hash) + getChain().hashCode();
+    if (!internalGetGroup().getMap().isEmpty()) {
+      hash = (37 * hash) + GROUP_FIELD_NUMBER;
+      hash = (53 * hash) + internalGetGroup().hashCode();
+    }
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static com.tzld.piaoquan.abtest.client.model.GroupInfoProto parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.abtest.client.model.GroupInfoProto 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.abtest.client.model.GroupInfoProto parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.abtest.client.model.GroupInfoProto 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.abtest.client.model.GroupInfoProto parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.abtest.client.model.GroupInfoProto parseFrom(
+      byte[] data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.abtest.client.model.GroupInfoProto parseFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.tzld.piaoquan.abtest.client.model.GroupInfoProto 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.abtest.client.model.GroupInfoProto parseDelimitedFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input);
+  }
+  public static com.tzld.piaoquan.abtest.client.model.GroupInfoProto 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.abtest.client.model.GroupInfoProto parseFrom(
+      com.google.protobuf.CodedInputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.tzld.piaoquan.abtest.client.model.GroupInfoProto 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.abtest.client.model.GroupInfoProto 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 GroupInfoProto}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:GroupInfoProto)
+      com.tzld.piaoquan.abtest.client.model.GroupInfoProtoOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.tzld.piaoquan.abtest.client.model.Group.internal_static_GroupInfoProto_descriptor;
+    }
+
+    @SuppressWarnings({"rawtypes"})
+    protected com.google.protobuf.MapField internalGetMapField(
+        int number) {
+      switch (number) {
+        case 3:
+          return internalGetGroup();
+        default:
+          throw new RuntimeException(
+              "Invalid map field number: " + number);
+      }
+    }
+    @SuppressWarnings({"rawtypes"})
+    protected com.google.protobuf.MapField internalGetMutableMapField(
+        int number) {
+      switch (number) {
+        case 3:
+          return internalGetMutableGroup();
+        default:
+          throw new RuntimeException(
+              "Invalid map field number: " + number);
+      }
+    }
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.tzld.piaoquan.abtest.client.model.Group.internal_static_GroupInfoProto_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.tzld.piaoquan.abtest.client.model.GroupInfoProto.class, com.tzld.piaoquan.abtest.client.model.GroupInfoProto.Builder.class);
+    }
+
+    // Construct using com.tzld.piaoquan.abtest.client.model.GroupInfoProto.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();
+      date_ = 0L;
+
+      chain_ = "";
+
+      internalGetMutableGroup().clear();
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return com.tzld.piaoquan.abtest.client.model.Group.internal_static_GroupInfoProto_descriptor;
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.abtest.client.model.GroupInfoProto getDefaultInstanceForType() {
+      return com.tzld.piaoquan.abtest.client.model.GroupInfoProto.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.abtest.client.model.GroupInfoProto build() {
+      com.tzld.piaoquan.abtest.client.model.GroupInfoProto result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.abtest.client.model.GroupInfoProto buildPartial() {
+      com.tzld.piaoquan.abtest.client.model.GroupInfoProto result = new com.tzld.piaoquan.abtest.client.model.GroupInfoProto(this);
+      int from_bitField0_ = bitField0_;
+      result.date_ = date_;
+      result.chain_ = chain_;
+      result.group_ = internalGetGroup();
+      result.group_.makeImmutable();
+      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.abtest.client.model.GroupInfoProto) {
+        return mergeFrom((com.tzld.piaoquan.abtest.client.model.GroupInfoProto)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(com.tzld.piaoquan.abtest.client.model.GroupInfoProto other) {
+      if (other == com.tzld.piaoquan.abtest.client.model.GroupInfoProto.getDefaultInstance()) return this;
+      if (other.getDate() != 0L) {
+        setDate(other.getDate());
+      }
+      if (!other.getChain().isEmpty()) {
+        chain_ = other.chain_;
+        onChanged();
+      }
+      internalGetMutableGroup().mergeFrom(
+          other.internalGetGroup());
+      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.abtest.client.model.GroupInfoProto parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (com.tzld.piaoquan.abtest.client.model.GroupInfoProto) e.getUnfinishedMessage();
+        throw e.unwrapIOException();
+      } finally {
+        if (parsedMessage != null) {
+          mergeFrom(parsedMessage);
+        }
+      }
+      return this;
+    }
+    private int bitField0_;
+
+    private long date_ ;
+    /**
+     * <pre>
+     * 分组生成时间
+     * </pre>
+     *
+     * <code>int64 date = 1;</code>
+     * @return The date.
+     */
+    @java.lang.Override
+    public long getDate() {
+      return date_;
+    }
+    /**
+     * <pre>
+     * 分组生成时间
+     * </pre>
+     *
+     * <code>int64 date = 1;</code>
+     * @param value The date to set.
+     * @return This builder for chaining.
+     */
+    public Builder setDate(long value) {
+      
+      date_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * 分组生成时间
+     * </pre>
+     *
+     * <code>int64 date = 1;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearDate() {
+      
+      date_ = 0L;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object chain_ = "";
+    /**
+     * <code>string chain = 2;</code>
+     * @return The chain.
+     */
+    public java.lang.String getChain() {
+      java.lang.Object ref = chain_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        chain_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string chain = 2;</code>
+     * @return The bytes for chain.
+     */
+    public com.google.protobuf.ByteString
+        getChainBytes() {
+      java.lang.Object ref = chain_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        chain_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string chain = 2;</code>
+     * @param value The chain to set.
+     * @return This builder for chaining.
+     */
+    public Builder setChain(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      chain_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string chain = 2;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearChain() {
+      
+      chain_ = getDefaultInstance().getChain();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string chain = 2;</code>
+     * @param value The bytes for chain to set.
+     * @return This builder for chaining.
+     */
+    public Builder setChainBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      chain_ = value;
+      onChanged();
+      return this;
+    }
+
+    private com.google.protobuf.MapField<
+        java.lang.String, java.lang.Integer> group_;
+    private com.google.protobuf.MapField<java.lang.String, java.lang.Integer>
+    internalGetGroup() {
+      if (group_ == null) {
+        return com.google.protobuf.MapField.emptyMapField(
+            GroupDefaultEntryHolder.defaultEntry);
+      }
+      return group_;
+    }
+    private com.google.protobuf.MapField<java.lang.String, java.lang.Integer>
+    internalGetMutableGroup() {
+      onChanged();;
+      if (group_ == null) {
+        group_ = com.google.protobuf.MapField.newMapField(
+            GroupDefaultEntryHolder.defaultEntry);
+      }
+      if (!group_.isMutable()) {
+        group_ = group_.copy();
+      }
+      return group_;
+    }
+
+    public int getGroupCount() {
+      return internalGetGroup().getMap().size();
+    }
+    /**
+     * <code>map&lt;string, int32&gt; group = 3;</code>
+     */
+
+    @java.lang.Override
+    public boolean containsGroup(
+        java.lang.String key) {
+      if (key == null) { throw new java.lang.NullPointerException(); }
+      return internalGetGroup().getMap().containsKey(key);
+    }
+    /**
+     * Use {@link #getGroupMap()} instead.
+     */
+    @java.lang.Override
+    @java.lang.Deprecated
+    public java.util.Map<java.lang.String, java.lang.Integer> getGroup() {
+      return getGroupMap();
+    }
+    /**
+     * <code>map&lt;string, int32&gt; group = 3;</code>
+     */
+    @java.lang.Override
+
+    public java.util.Map<java.lang.String, java.lang.Integer> getGroupMap() {
+      return internalGetGroup().getMap();
+    }
+    /**
+     * <code>map&lt;string, int32&gt; group = 3;</code>
+     */
+    @java.lang.Override
+
+    public int getGroupOrDefault(
+        java.lang.String key,
+        int defaultValue) {
+      if (key == null) { throw new java.lang.NullPointerException(); }
+      java.util.Map<java.lang.String, java.lang.Integer> map =
+          internalGetGroup().getMap();
+      return map.containsKey(key) ? map.get(key) : defaultValue;
+    }
+    /**
+     * <code>map&lt;string, int32&gt; group = 3;</code>
+     */
+    @java.lang.Override
+
+    public int getGroupOrThrow(
+        java.lang.String key) {
+      if (key == null) { throw new java.lang.NullPointerException(); }
+      java.util.Map<java.lang.String, java.lang.Integer> map =
+          internalGetGroup().getMap();
+      if (!map.containsKey(key)) {
+        throw new java.lang.IllegalArgumentException();
+      }
+      return map.get(key);
+    }
+
+    public Builder clearGroup() {
+      internalGetMutableGroup().getMutableMap()
+          .clear();
+      return this;
+    }
+    /**
+     * <code>map&lt;string, int32&gt; group = 3;</code>
+     */
+
+    public Builder removeGroup(
+        java.lang.String key) {
+      if (key == null) { throw new java.lang.NullPointerException(); }
+      internalGetMutableGroup().getMutableMap()
+          .remove(key);
+      return this;
+    }
+    /**
+     * Use alternate mutation accessors instead.
+     */
+    @java.lang.Deprecated
+    public java.util.Map<java.lang.String, java.lang.Integer>
+    getMutableGroup() {
+      return internalGetMutableGroup().getMutableMap();
+    }
+    /**
+     * <code>map&lt;string, int32&gt; group = 3;</code>
+     */
+    public Builder putGroup(
+        java.lang.String key,
+        int value) {
+      if (key == null) { throw new java.lang.NullPointerException(); }
+      
+      internalGetMutableGroup().getMutableMap()
+          .put(key, value);
+      return this;
+    }
+    /**
+     * <code>map&lt;string, int32&gt; group = 3;</code>
+     */
+
+    public Builder putAllGroup(
+        java.util.Map<java.lang.String, java.lang.Integer> values) {
+      internalGetMutableGroup().getMutableMap()
+          .putAll(values);
+      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:GroupInfoProto)
+  }
+
+  // @@protoc_insertion_point(class_scope:GroupInfoProto)
+  private static final com.tzld.piaoquan.abtest.client.model.GroupInfoProto DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new com.tzld.piaoquan.abtest.client.model.GroupInfoProto();
+  }
+
+  public static com.tzld.piaoquan.abtest.client.model.GroupInfoProto getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<GroupInfoProto>
+      PARSER = new com.google.protobuf.AbstractParser<GroupInfoProto>() {
+    @java.lang.Override
+    public GroupInfoProto parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new GroupInfoProto(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<GroupInfoProto> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<GroupInfoProto> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.tzld.piaoquan.abtest.client.model.GroupInfoProto getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+

+ 65 - 0
abtest-client/src/main/java/com/tzld/piaoquan/abtest/client/model/GroupInfoProtoOrBuilder.java

@@ -0,0 +1,65 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: com/tzld/piaoquan/abtest/group.proto
+
+package com.tzld.piaoquan.abtest.client.model;
+
+public interface GroupInfoProtoOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:GroupInfoProto)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <pre>
+   * 分组生成时间
+   * </pre>
+   *
+   * <code>int64 date = 1;</code>
+   * @return The date.
+   */
+  long getDate();
+
+  /**
+   * <code>string chain = 2;</code>
+   * @return The chain.
+   */
+  java.lang.String getChain();
+  /**
+   * <code>string chain = 2;</code>
+   * @return The bytes for chain.
+   */
+  com.google.protobuf.ByteString
+      getChainBytes();
+
+  /**
+   * <code>map&lt;string, int32&gt; group = 3;</code>
+   */
+  int getGroupCount();
+  /**
+   * <code>map&lt;string, int32&gt; group = 3;</code>
+   */
+  boolean containsGroup(
+      java.lang.String key);
+  /**
+   * Use {@link #getGroupMap()} instead.
+   */
+  @java.lang.Deprecated
+  java.util.Map<java.lang.String, java.lang.Integer>
+  getGroup();
+  /**
+   * <code>map&lt;string, int32&gt; group = 3;</code>
+   */
+  java.util.Map<java.lang.String, java.lang.Integer>
+  getGroupMap();
+  /**
+   * <code>map&lt;string, int32&gt; group = 3;</code>
+   */
+
+  int getGroupOrDefault(
+      java.lang.String key,
+      int defaultValue);
+  /**
+   * <code>map&lt;string, int32&gt; group = 3;</code>
+   */
+
+  int getGroupOrThrow(
+      java.lang.String key);
+}

+ 0 - 237
abtest-client/src/main/java/com/tzld/piaoquan/abtest/client/model/ModelService.java

@@ -1,237 +0,0 @@
-// Generated by the protocol buffer compiler.  DO NOT EDIT!
-// source: com/tzld/piaoquan/abtest/group.proto
-
-package com.tzld.piaoquan.abtest.client.model;
-
-/**
- * Protobuf service {@code ModelService}
- */
-public  abstract class ModelService
-    implements com.google.protobuf.Service {
-  protected ModelService() {}
-
-  public interface Interface {
-    /**
-     * <code>rpc getGroup(.GetGroupRequest) returns (.GetGroupResponse);</code>
-     */
-    public abstract void getGroup(
-        com.google.protobuf.RpcController controller,
-        com.tzld.piaoquan.abtest.client.model.GetGroupRequest request,
-        com.google.protobuf.RpcCallback<com.tzld.piaoquan.abtest.client.model.GetGroupResponse> done);
-
-  }
-
-  public static com.google.protobuf.Service newReflectiveService(
-      final Interface impl) {
-    return new ModelService() {
-      @java.lang.Override
-      public  void getGroup(
-          com.google.protobuf.RpcController controller,
-          com.tzld.piaoquan.abtest.client.model.GetGroupRequest request,
-          com.google.protobuf.RpcCallback<com.tzld.piaoquan.abtest.client.model.GetGroupResponse> done) {
-        impl.getGroup(controller, request, done);
-      }
-
-    };
-  }
-
-  public static com.google.protobuf.BlockingService
-      newReflectiveBlockingService(final BlockingInterface impl) {
-    return new com.google.protobuf.BlockingService() {
-      public final com.google.protobuf.Descriptors.ServiceDescriptor
-          getDescriptorForType() {
-        return getDescriptor();
-      }
-
-      public final com.google.protobuf.Message callBlockingMethod(
-          com.google.protobuf.Descriptors.MethodDescriptor method,
-          com.google.protobuf.RpcController controller,
-          com.google.protobuf.Message request)
-          throws com.google.protobuf.ServiceException {
-        if (method.getService() != getDescriptor()) {
-          throw new java.lang.IllegalArgumentException(
-            "Service.callBlockingMethod() given method descriptor for " +
-            "wrong service type.");
-        }
-        switch(method.getIndex()) {
-          case 0:
-            return impl.getGroup(controller, (com.tzld.piaoquan.abtest.client.model.GetGroupRequest)request);
-          default:
-            throw new java.lang.AssertionError("Can't get here.");
-        }
-      }
-
-      public final com.google.protobuf.Message
-          getRequestPrototype(
-          com.google.protobuf.Descriptors.MethodDescriptor method) {
-        if (method.getService() != getDescriptor()) {
-          throw new java.lang.IllegalArgumentException(
-            "Service.getRequestPrototype() given method " +
-            "descriptor for wrong service type.");
-        }
-        switch(method.getIndex()) {
-          case 0:
-            return com.tzld.piaoquan.abtest.client.model.GetGroupRequest.getDefaultInstance();
-          default:
-            throw new java.lang.AssertionError("Can't get here.");
-        }
-      }
-
-      public final com.google.protobuf.Message
-          getResponsePrototype(
-          com.google.protobuf.Descriptors.MethodDescriptor method) {
-        if (method.getService() != getDescriptor()) {
-          throw new java.lang.IllegalArgumentException(
-            "Service.getResponsePrototype() given method " +
-            "descriptor for wrong service type.");
-        }
-        switch(method.getIndex()) {
-          case 0:
-            return com.tzld.piaoquan.abtest.client.model.GetGroupResponse.getDefaultInstance();
-          default:
-            throw new java.lang.AssertionError("Can't get here.");
-        }
-      }
-
-    };
-  }
-
-  /**
-   * <code>rpc getGroup(.GetGroupRequest) returns (.GetGroupResponse);</code>
-   */
-  public abstract void getGroup(
-      com.google.protobuf.RpcController controller,
-      com.tzld.piaoquan.abtest.client.model.GetGroupRequest request,
-      com.google.protobuf.RpcCallback<com.tzld.piaoquan.abtest.client.model.GetGroupResponse> done);
-
-  public static final
-      com.google.protobuf.Descriptors.ServiceDescriptor
-      getDescriptor() {
-    return com.tzld.piaoquan.abtest.client.model.Group.getDescriptor().getServices().get(0);
-  }
-  public final com.google.protobuf.Descriptors.ServiceDescriptor
-      getDescriptorForType() {
-    return getDescriptor();
-  }
-
-  public final void callMethod(
-      com.google.protobuf.Descriptors.MethodDescriptor method,
-      com.google.protobuf.RpcController controller,
-      com.google.protobuf.Message request,
-      com.google.protobuf.RpcCallback<
-        com.google.protobuf.Message> done) {
-    if (method.getService() != getDescriptor()) {
-      throw new java.lang.IllegalArgumentException(
-        "Service.callMethod() given method descriptor for wrong " +
-        "service type.");
-    }
-    switch(method.getIndex()) {
-      case 0:
-        this.getGroup(controller, (com.tzld.piaoquan.abtest.client.model.GetGroupRequest)request,
-          com.google.protobuf.RpcUtil.<com.tzld.piaoquan.abtest.client.model.GetGroupResponse>specializeCallback(
-            done));
-        return;
-      default:
-        throw new java.lang.AssertionError("Can't get here.");
-    }
-  }
-
-  public final com.google.protobuf.Message
-      getRequestPrototype(
-      com.google.protobuf.Descriptors.MethodDescriptor method) {
-    if (method.getService() != getDescriptor()) {
-      throw new java.lang.IllegalArgumentException(
-        "Service.getRequestPrototype() given method " +
-        "descriptor for wrong service type.");
-    }
-    switch(method.getIndex()) {
-      case 0:
-        return com.tzld.piaoquan.abtest.client.model.GetGroupRequest.getDefaultInstance();
-      default:
-        throw new java.lang.AssertionError("Can't get here.");
-    }
-  }
-
-  public final com.google.protobuf.Message
-      getResponsePrototype(
-      com.google.protobuf.Descriptors.MethodDescriptor method) {
-    if (method.getService() != getDescriptor()) {
-      throw new java.lang.IllegalArgumentException(
-        "Service.getResponsePrototype() given method " +
-        "descriptor for wrong service type.");
-    }
-    switch(method.getIndex()) {
-      case 0:
-        return com.tzld.piaoquan.abtest.client.model.GetGroupResponse.getDefaultInstance();
-      default:
-        throw new java.lang.AssertionError("Can't get here.");
-    }
-  }
-
-  public static Stub newStub(
-      com.google.protobuf.RpcChannel channel) {
-    return new Stub(channel);
-  }
-
-  public static final class Stub extends com.tzld.piaoquan.abtest.client.model.ModelService implements Interface {
-    private Stub(com.google.protobuf.RpcChannel channel) {
-      this.channel = channel;
-    }
-
-    private final com.google.protobuf.RpcChannel channel;
-
-    public com.google.protobuf.RpcChannel getChannel() {
-      return channel;
-    }
-
-    public  void getGroup(
-        com.google.protobuf.RpcController controller,
-        com.tzld.piaoquan.abtest.client.model.GetGroupRequest request,
-        com.google.protobuf.RpcCallback<com.tzld.piaoquan.abtest.client.model.GetGroupResponse> done) {
-      channel.callMethod(
-        getDescriptor().getMethods().get(0),
-        controller,
-        request,
-        com.tzld.piaoquan.abtest.client.model.GetGroupResponse.getDefaultInstance(),
-        com.google.protobuf.RpcUtil.generalizeCallback(
-          done,
-          com.tzld.piaoquan.abtest.client.model.GetGroupResponse.class,
-          com.tzld.piaoquan.abtest.client.model.GetGroupResponse.getDefaultInstance()));
-    }
-  }
-
-  public static BlockingInterface newBlockingStub(
-      com.google.protobuf.BlockingRpcChannel channel) {
-    return new BlockingStub(channel);
-  }
-
-  public interface BlockingInterface {
-    public com.tzld.piaoquan.abtest.client.model.GetGroupResponse getGroup(
-        com.google.protobuf.RpcController controller,
-        com.tzld.piaoquan.abtest.client.model.GetGroupRequest request)
-        throws com.google.protobuf.ServiceException;
-  }
-
-  private static final class BlockingStub implements BlockingInterface {
-    private BlockingStub(com.google.protobuf.BlockingRpcChannel channel) {
-      this.channel = channel;
-    }
-
-    private final com.google.protobuf.BlockingRpcChannel channel;
-
-    public com.tzld.piaoquan.abtest.client.model.GetGroupResponse getGroup(
-        com.google.protobuf.RpcController controller,
-        com.tzld.piaoquan.abtest.client.model.GetGroupRequest request)
-        throws com.google.protobuf.ServiceException {
-      return (com.tzld.piaoquan.abtest.client.model.GetGroupResponse) channel.callBlockingMethod(
-        getDescriptor().getMethods().get(0),
-        controller,
-        request,
-        com.tzld.piaoquan.abtest.client.model.GetGroupResponse.getDefaultInstance());
-    }
-
-  }
-
-  // @@protoc_insertion_point(class_scope:ModelService)
-}
-

+ 0 - 288
abtest-client/src/main/java/com/tzld/piaoquan/abtest/client/model/ModelServiceGrpc.java

@@ -1,288 +0,0 @@
-package com.tzld.piaoquan.abtest.client.model;
-
-import static io.grpc.MethodDescriptor.generateFullMethodName;
-import static io.grpc.stub.ClientCalls.asyncBidiStreamingCall;
-import static io.grpc.stub.ClientCalls.asyncClientStreamingCall;
-import static io.grpc.stub.ClientCalls.asyncServerStreamingCall;
-import static io.grpc.stub.ClientCalls.asyncUnaryCall;
-import static io.grpc.stub.ClientCalls.blockingServerStreamingCall;
-import static io.grpc.stub.ClientCalls.blockingUnaryCall;
-import static io.grpc.stub.ClientCalls.futureUnaryCall;
-import static io.grpc.stub.ServerCalls.asyncBidiStreamingCall;
-import static io.grpc.stub.ServerCalls.asyncClientStreamingCall;
-import static io.grpc.stub.ServerCalls.asyncServerStreamingCall;
-import static io.grpc.stub.ServerCalls.asyncUnaryCall;
-import static io.grpc.stub.ServerCalls.asyncUnimplementedStreamingCall;
-import static io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall;
-
-/**
- */
-@javax.annotation.Generated(
-    value = "by gRPC proto compiler (version 1.34.1)",
-    comments = "Source: com/tzld/piaoquan/abtest/group.proto")
-public final class ModelServiceGrpc {
-
-  private ModelServiceGrpc() {}
-
-  public static final String SERVICE_NAME = "ModelService";
-
-  // Static method descriptors that strictly reflect the proto.
-  private static volatile io.grpc.MethodDescriptor<com.tzld.piaoquan.abtest.client.model.GetGroupRequest,
-      com.tzld.piaoquan.abtest.client.model.GetGroupResponse> getGetGroupMethod;
-
-  @io.grpc.stub.annotations.RpcMethod(
-      fullMethodName = SERVICE_NAME + '/' + "getGroup",
-      requestType = com.tzld.piaoquan.abtest.client.model.GetGroupRequest.class,
-      responseType = com.tzld.piaoquan.abtest.client.model.GetGroupResponse.class,
-      methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
-  public static io.grpc.MethodDescriptor<com.tzld.piaoquan.abtest.client.model.GetGroupRequest,
-      com.tzld.piaoquan.abtest.client.model.GetGroupResponse> getGetGroupMethod() {
-    io.grpc.MethodDescriptor<com.tzld.piaoquan.abtest.client.model.GetGroupRequest, com.tzld.piaoquan.abtest.client.model.GetGroupResponse> getGetGroupMethod;
-    if ((getGetGroupMethod = ModelServiceGrpc.getGetGroupMethod) == null) {
-      synchronized (ModelServiceGrpc.class) {
-        if ((getGetGroupMethod = ModelServiceGrpc.getGetGroupMethod) == null) {
-          ModelServiceGrpc.getGetGroupMethod = getGetGroupMethod =
-              io.grpc.MethodDescriptor.<com.tzld.piaoquan.abtest.client.model.GetGroupRequest, com.tzld.piaoquan.abtest.client.model.GetGroupResponse>newBuilder()
-              .setType(io.grpc.MethodDescriptor.MethodType.UNARY)
-              .setFullMethodName(generateFullMethodName(SERVICE_NAME, "getGroup"))
-              .setSampledToLocalTracing(true)
-              .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
-                  com.tzld.piaoquan.abtest.client.model.GetGroupRequest.getDefaultInstance()))
-              .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
-                  com.tzld.piaoquan.abtest.client.model.GetGroupResponse.getDefaultInstance()))
-              .setSchemaDescriptor(new ModelServiceMethodDescriptorSupplier("getGroup"))
-              .build();
-        }
-      }
-    }
-    return getGetGroupMethod;
-  }
-
-  /**
-   * Creates a new async stub that supports all call types for the service
-   */
-  public static ModelServiceStub newStub(io.grpc.Channel channel) {
-    io.grpc.stub.AbstractStub.StubFactory<ModelServiceStub> factory =
-      new io.grpc.stub.AbstractStub.StubFactory<ModelServiceStub>() {
-        @java.lang.Override
-        public ModelServiceStub newStub(io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
-          return new ModelServiceStub(channel, callOptions);
-        }
-      };
-    return ModelServiceStub.newStub(factory, channel);
-  }
-
-  /**
-   * Creates a new blocking-style stub that supports unary and streaming output calls on the service
-   */
-  public static ModelServiceBlockingStub newBlockingStub(
-      io.grpc.Channel channel) {
-    io.grpc.stub.AbstractStub.StubFactory<ModelServiceBlockingStub> factory =
-      new io.grpc.stub.AbstractStub.StubFactory<ModelServiceBlockingStub>() {
-        @java.lang.Override
-        public ModelServiceBlockingStub newStub(io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
-          return new ModelServiceBlockingStub(channel, callOptions);
-        }
-      };
-    return ModelServiceBlockingStub.newStub(factory, channel);
-  }
-
-  /**
-   * Creates a new ListenableFuture-style stub that supports unary calls on the service
-   */
-  public static ModelServiceFutureStub newFutureStub(
-      io.grpc.Channel channel) {
-    io.grpc.stub.AbstractStub.StubFactory<ModelServiceFutureStub> factory =
-      new io.grpc.stub.AbstractStub.StubFactory<ModelServiceFutureStub>() {
-        @java.lang.Override
-        public ModelServiceFutureStub newStub(io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
-          return new ModelServiceFutureStub(channel, callOptions);
-        }
-      };
-    return ModelServiceFutureStub.newStub(factory, channel);
-  }
-
-  /**
-   */
-  public static abstract class ModelServiceImplBase implements io.grpc.BindableService {
-
-    /**
-     */
-    public void getGroup(com.tzld.piaoquan.abtest.client.model.GetGroupRequest request,
-        io.grpc.stub.StreamObserver<com.tzld.piaoquan.abtest.client.model.GetGroupResponse> responseObserver) {
-      asyncUnimplementedUnaryCall(getGetGroupMethod(), responseObserver);
-    }
-
-    @java.lang.Override public final io.grpc.ServerServiceDefinition bindService() {
-      return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor())
-          .addMethod(
-            getGetGroupMethod(),
-            asyncUnaryCall(
-              new MethodHandlers<
-                com.tzld.piaoquan.abtest.client.model.GetGroupRequest,
-                com.tzld.piaoquan.abtest.client.model.GetGroupResponse>(
-                  this, METHODID_GET_GROUP)))
-          .build();
-    }
-  }
-
-  /**
-   */
-  public static final class ModelServiceStub extends io.grpc.stub.AbstractAsyncStub<ModelServiceStub> {
-    private ModelServiceStub(
-        io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
-      super(channel, callOptions);
-    }
-
-    @java.lang.Override
-    protected ModelServiceStub build(
-        io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
-      return new ModelServiceStub(channel, callOptions);
-    }
-
-    /**
-     */
-    public void getGroup(com.tzld.piaoquan.abtest.client.model.GetGroupRequest request,
-        io.grpc.stub.StreamObserver<com.tzld.piaoquan.abtest.client.model.GetGroupResponse> responseObserver) {
-      asyncUnaryCall(
-          getChannel().newCall(getGetGroupMethod(), getCallOptions()), request, responseObserver);
-    }
-  }
-
-  /**
-   */
-  public static final class ModelServiceBlockingStub extends io.grpc.stub.AbstractBlockingStub<ModelServiceBlockingStub> {
-    private ModelServiceBlockingStub(
-        io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
-      super(channel, callOptions);
-    }
-
-    @java.lang.Override
-    protected ModelServiceBlockingStub build(
-        io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
-      return new ModelServiceBlockingStub(channel, callOptions);
-    }
-
-    /**
-     */
-    public com.tzld.piaoquan.abtest.client.model.GetGroupResponse getGroup(com.tzld.piaoquan.abtest.client.model.GetGroupRequest request) {
-      return blockingUnaryCall(
-          getChannel(), getGetGroupMethod(), getCallOptions(), request);
-    }
-  }
-
-  /**
-   */
-  public static final class ModelServiceFutureStub extends io.grpc.stub.AbstractFutureStub<ModelServiceFutureStub> {
-    private ModelServiceFutureStub(
-        io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
-      super(channel, callOptions);
-    }
-
-    @java.lang.Override
-    protected ModelServiceFutureStub build(
-        io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
-      return new ModelServiceFutureStub(channel, callOptions);
-    }
-
-    /**
-     */
-    public com.google.common.util.concurrent.ListenableFuture<com.tzld.piaoquan.abtest.client.model.GetGroupResponse> getGroup(
-        com.tzld.piaoquan.abtest.client.model.GetGroupRequest request) {
-      return futureUnaryCall(
-          getChannel().newCall(getGetGroupMethod(), getCallOptions()), request);
-    }
-  }
-
-  private static final int METHODID_GET_GROUP = 0;
-
-  private static final class MethodHandlers<Req, Resp> implements
-      io.grpc.stub.ServerCalls.UnaryMethod<Req, Resp>,
-      io.grpc.stub.ServerCalls.ServerStreamingMethod<Req, Resp>,
-      io.grpc.stub.ServerCalls.ClientStreamingMethod<Req, Resp>,
-      io.grpc.stub.ServerCalls.BidiStreamingMethod<Req, Resp> {
-    private final ModelServiceImplBase serviceImpl;
-    private final int methodId;
-
-    MethodHandlers(ModelServiceImplBase serviceImpl, int methodId) {
-      this.serviceImpl = serviceImpl;
-      this.methodId = methodId;
-    }
-
-    @java.lang.Override
-    @java.lang.SuppressWarnings("unchecked")
-    public void invoke(Req request, io.grpc.stub.StreamObserver<Resp> responseObserver) {
-      switch (methodId) {
-        case METHODID_GET_GROUP:
-          serviceImpl.getGroup((com.tzld.piaoquan.abtest.client.model.GetGroupRequest) request,
-              (io.grpc.stub.StreamObserver<com.tzld.piaoquan.abtest.client.model.GetGroupResponse>) responseObserver);
-          break;
-        default:
-          throw new AssertionError();
-      }
-    }
-
-    @java.lang.Override
-    @java.lang.SuppressWarnings("unchecked")
-    public io.grpc.stub.StreamObserver<Req> invoke(
-        io.grpc.stub.StreamObserver<Resp> responseObserver) {
-      switch (methodId) {
-        default:
-          throw new AssertionError();
-      }
-    }
-  }
-
-  private static abstract class ModelServiceBaseDescriptorSupplier
-      implements io.grpc.protobuf.ProtoFileDescriptorSupplier, io.grpc.protobuf.ProtoServiceDescriptorSupplier {
-    ModelServiceBaseDescriptorSupplier() {}
-
-    @java.lang.Override
-    public com.google.protobuf.Descriptors.FileDescriptor getFileDescriptor() {
-      return com.tzld.piaoquan.abtest.client.model.Group.getDescriptor();
-    }
-
-    @java.lang.Override
-    public com.google.protobuf.Descriptors.ServiceDescriptor getServiceDescriptor() {
-      return getFileDescriptor().findServiceByName("ModelService");
-    }
-  }
-
-  private static final class ModelServiceFileDescriptorSupplier
-      extends ModelServiceBaseDescriptorSupplier {
-    ModelServiceFileDescriptorSupplier() {}
-  }
-
-  private static final class ModelServiceMethodDescriptorSupplier
-      extends ModelServiceBaseDescriptorSupplier
-      implements io.grpc.protobuf.ProtoMethodDescriptorSupplier {
-    private final String methodName;
-
-    ModelServiceMethodDescriptorSupplier(String methodName) {
-      this.methodName = methodName;
-    }
-
-    @java.lang.Override
-    public com.google.protobuf.Descriptors.MethodDescriptor getMethodDescriptor() {
-      return getServiceDescriptor().findMethodByName(methodName);
-    }
-  }
-
-  private static volatile io.grpc.ServiceDescriptor serviceDescriptor;
-
-  public static io.grpc.ServiceDescriptor getServiceDescriptor() {
-    io.grpc.ServiceDescriptor result = serviceDescriptor;
-    if (result == null) {
-      synchronized (ModelServiceGrpc.class) {
-        result = serviceDescriptor;
-        if (result == null) {
-          serviceDescriptor = result = io.grpc.ServiceDescriptor.newBuilder(SERVICE_NAME)
-              .setSchemaDescriptor(new ModelServiceFileDescriptorSupplier())
-              .addMethod(getGetGroupMethod())
-              .build();
-        }
-      }
-    }
-    return result;
-  }
-}

+ 10 - 2
abtest-client/src/main/proto/com/tzld/piaoquan/abtest/group.proto

@@ -10,12 +10,20 @@ message GetGroupRequest {
   string mid = 1;
   string uid = 2;
   int32 app_type = 3;
-  string group = 4;
+  int32 is_from_card = 4; // 1: 来自分享卡片
+  GroupInfoProto group_info = 5;
+}
+
+message GroupInfoProto {
+  int64 date = 1; // 分组生成时间
+  string chain = 2;
+  map<string, int32> group = 3;
 }
 
 message GetGroupResponse {
   Result result = 1;
-  string group = 2;
+  int64 date = 2; // 分组生成时间
+  GroupInfoProto group_info = 5;
 }
 
 service GroupService {

+ 27 - 36
abtest-service/src/main/java/com/tzld/piaoquan/abtest/service/GroupService.java

@@ -1,19 +1,16 @@
 package com.tzld.piaoquan.abtest.service;
 
 import com.ctrip.framework.apollo.spring.annotation.ApolloJsonValue;
-import com.google.common.base.Strings;
-import com.google.common.reflect.TypeToken;
 import com.tzld.piaoquan.abtest.client.model.GetGroupRequest;
 import com.tzld.piaoquan.abtest.client.model.GetGroupResponse;
+import com.tzld.piaoquan.abtest.client.model.GroupInfoProto;
 import com.tzld.piaoquan.abtest.client.model.Result;
 import com.tzld.piaoquan.abtest.model.ExpConfig;
 import com.tzld.piaoquan.abtest.util.CommonCollectionUtils;
-import com.tzld.piaoquan.abtest.util.JSONUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.MapUtils;
 import org.apache.commons.lang.RandomStringUtils;
-import org.apache.commons.lang.math.NumberUtils;
 import org.apache.commons.lang3.RandomUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
@@ -37,10 +34,6 @@ public class GroupService {
     @ApolloJsonValue("${new.exp,config.v2:[]}")
     private List<ExpConfig> expConfigs;
 
-    private final String exp_param_date = "date";
-    private final String exp_param_group = "group";
-    private final String exp_param_isFromCard = "isFromCard";
-    private final String exp_param_chain = "chain";
 
     private final String scene_open = "open";
     private final String scene_daily_share_return = "daily_share_return";
@@ -56,19 +49,22 @@ public class GroupService {
             List<ExpConfig.Layer> layers = layerMap.get(String.valueOf(request.getAppType()));
 
             if (CollectionUtils.isEmpty(layers)) {
-                return GetGroupResponse.newBuilder()
-                        .setResult(Result.newBuilder().setCode(1))
-                        .setGroup(Strings.nullToEmpty(request.getGroup()))
-                        .build();
+                GetGroupResponse.Builder builder = GetGroupResponse.newBuilder();
+                builder.setResult(Result.newBuilder().setCode(1));
+                if (request.hasGroupInfo()) {
+                    builder.setGroupInfo(request.getGroupInfo());
+                }
+                return builder.build();
             }
 
             //TODO 1. 确定场景 主动打开、当日分享、历史分享
             String scene = "";
-            Map<String, String> expMap = JSONUtils.fromJson(request.getGroup(), new TypeToken<Map<String, String>>() {
-            }, Collections.emptyMap());
-            long time = NumberUtils.toLong(expMap.get(exp_param_date), 0);
-            String isFromCard = expMap.getOrDefault(exp_param_isFromCard, "0");
-            if (org.apache.commons.lang.StringUtils.equals(isFromCard, "1")) {
+            long time = request.hasGroupInfo()
+                    ? request.getGroupInfo().getDate()
+                    : 0;
+            int isFromCard = request.getIsFromCard();
+
+            if (isFromCard == 1) {
                 if (isToday(time)) {
                     // 当日分享
                     scene = scene_daily_share_return;
@@ -84,11 +80,10 @@ public class GroupService {
             log.info("ExperimentInterceptor scene {}", scene);
 
             //TODO 2. 根据场景 确定策略并分组
-            Map<String, Object> groupMap = new HashMap<>();
-            Map<String, String> oldGroupMap = org.apache.commons.lang.StringUtils.equals(expMap.get(exp_param_group), "ab100")
-                    ? Collections.emptyMap()
-                    : JSONUtils.fromJson(expMap.get(exp_param_group), new TypeToken<Map<String, String>>() {
-            }, Collections.emptyMap());
+            Map<String, Integer> oldGroupMap = request.hasGroupInfo()
+                    ? request.getGroupInfo().getGroupMap()
+                    : Collections.emptyMap();
+            Map<String, Integer> groupMap = new HashMap<>();
             for (ExpConfig.Layer layer : layers) {
                 int bucketNum = layer.getBucketNum() <= 0 ? 100 : layer.getBucketNum();
                 Map<String, String> groupRule = layer.getGroupRule();
@@ -105,44 +100,40 @@ public class GroupService {
 
                         case "inherit":
                             groupMap.put(layer.getLayerId(), oldGroupMap.getOrDefault(layer.getLayerId(),
-                                    RandomUtils.nextInt(0, bucketNum) + ""));
+                                    RandomUtils.nextInt(0, bucketNum)));
                             break;
                         case "random_once":
                             if (!isToday(time)) {
                                 groupMap.put(layer.getLayerId(), RandomUtils.nextInt(0, bucketNum));
                             } else {
                                 groupMap.put(layer.getLayerId(), oldGroupMap.getOrDefault(layer.getLayerId(),
-                                        RandomUtils.nextInt(0, bucketNum) + ""));
+                                        RandomUtils.nextInt(0, bucketNum)));
                             }
                             break;
                         case "random_every":
                         default:
-                            groupMap.put(layer.getLayerId(), RandomUtils.nextInt(0, bucketNum) + "");
+                            groupMap.put(layer.getLayerId(), RandomUtils.nextInt(0, bucketNum));
                             break;
                     }
                 }
             }
 
-            // 3. 写入header
-            Map<String, Object> map = new HashMap<>();
-            map.put(exp_param_date, System.currentTimeMillis());
-            map.put(exp_param_group, JSONUtils.toJson(groupMap));
-            map.put(exp_param_isFromCard, isFromCard);
-            map.put(exp_param_chain, org.apache.commons.lang.StringUtils.equals(isFromCard, "1")
-                    ? expMap.get(exp_param_chain)
-                    : genChainId());
-
             return GetGroupResponse.newBuilder()
                     .setResult(Result.newBuilder().setCode(1))
-                    .setGroup(JSONUtils.toJson(map))
+                    .setGroupInfo(GroupInfoProto.newBuilder()
+                            .setDate(System.currentTimeMillis())
+                            .setChain("")
+                            .putAllGroup(groupMap))
                     .build();
 
-        } catch (Exception e) {
+        } catch (
+                Exception e) {
             log.error("get group error", e);
             return GetGroupResponse.newBuilder()
                     .setResult(Result.newBuilder().setCode(0).setMessage("get group error"))
                     .build();
         }
+
     }