ソースを参照

feat:权益中台

zhangxinlei1996 2 年 前
コミット
9639ee8efb

+ 6 - 1
README.md

@@ -1,2 +1,7 @@
 权限校验中台
-go-zero
+go-zero
+
+用户/企业中台
+$ goctl rpc protoc powerCheck.proto --go_out=. --go-grpc_out=. --zrpc_out=.
+
+$ goctl api go -api userCenter.api -dir .

+ 91 - 0
entity/power.go

@@ -0,0 +1,91 @@
+package entity
+
+const (
+	//用于判断新老用户的时间戳
+	IsNewFreeTimeCell = 1637830020
+	//企业分配的产品
+	ProductType_vip    = "VIP订阅"
+	ProductType_member = "大会员"
+
+	PowerCacheDb           = "other"
+	PowerCacheEntPortKey   = "free_ent_portrait_%s"
+	PowerCacheBuyerPortKey = "free_buyer_portrait_%s"
+	PowerCacheFileKey      = "free_article_attach_%s"
+	PowerCachePortraitKey  = "free_portrait_%s_%s"
+)
+
+//免费权益相关
+type Free struct {
+	IsFree        bool  //是否是免费用户
+	FreeHasKey    bool  //免费用户是否有关键词
+	FreeEntPort   int64 //免费用户可查看企业画像次数
+	FreeBuyerPort int64 //免费用户可查看采购单位画像次数
+	FreeFile      int64 //免费用户可以进行附件下载次数
+	IsUpgrade     bool  //是否是新免费用户
+}
+
+//超级订阅相关
+type Vip struct {
+	Status          int64 //超级订阅状态
+	StartTime       int64 //超级订阅开始时间戳
+	EndTime         int64 //超级订阅结束时间戳
+	Upgrade         int64 //是否是升级版超级订阅;0否 1是
+	Areacount       int64 //购买省份数量; -1全部
+	Buyerclasscount int64 //购买采购单位数量; -1全部
+	MaxKeyLength    int64 //最大关键词数量限制
+	PowerType       int64 //超级订阅权益类型;0无 1个人 2企业
+	VipPower        int64 //是否分配了超级订阅;0:否 1:是
+	FileNum         int64 //超级订阅用户附件下载包的剩余次数
+}
+
+//大会员相关
+type Member struct {
+	Status          int64   //大会员状态
+	StartTime       int64   //开始时间戳
+	EndTime         int64   //结束时间戳
+	MemberName      string  //大会员版本名称
+	MemberPowerList []int64 //大会员权益数组
+	IsMemberTrial   int64   //是否是大会员试用;0否 1是
+	PowerType       int64   //大会员权益类型;0无 1个人 2企业
+	MemberPower     int64   //是否分配了大会员;0:否 1:是
+	IsSubCount      int64   //是否是子账号 0否 1是
+	MaxKeyLength    int64   //最大关键词数量限制
+	EntNum          int64   //企业情报监控 企业中标动态数量
+	ProNum          int64   //项目进度监控数量
+	DailyNum        int64   //结构化数据(单日限量包数量)
+	Customers       int64   //潜在客户数量
+	Pid             string  //主帐号id
+	Used            bool    //是否使用过大会员初始化
+}
+
+//商机管理相关
+type Entniche struct {
+	Status      int64 //商机管理相关
+	StartTime   int64 //开始时间戳
+	EndTime     int64 //结束时间戳
+	PowerSource int64 //商机管理权限开通来源;1:赠送的商机管理服务
+	IsEntPower  int64 //是否分配权限;0:未分配,1:已分配
+	IsNew       int64 //是否是新版商机管理 0不是 1是
+}
+
+//企业相关
+type Ent struct {
+	Name                string //企业名称
+	EntRoleId           int64  //商机管理角色:1:企业管理员;2:部门管理员
+	EntAuthStatus       int64  //企业是否认证 -1 未通过,0 未认证,1 已认证
+	EntAuthReason       string //认证不通过原因
+	EntSubscribe        int64  //是否有企业订阅权限;0:否 1:是
+	EntSubscribeManager int64  //是否有企业订阅管理权限;0:否 1:是
+	DeptSubscribe       int64  //各部门是否可以自行订阅;0:否 1:是
+	PrivateGD           bool   //广东移动DICT 用户,用于查看画像
+	BuyVip              int64  //是否购买超级订阅
+	BuyMember           int64  //是否购买大会员
+}
+
+type Power struct {
+	Vip      *Vip
+	Member   *Member
+	Entniche *Entniche
+	Ent      *Ent
+	Free     *Free
+}

+ 20 - 1
rpc/go.mod → go.mod

@@ -1,8 +1,10 @@
-module rpc
+module bp.jydev.jianyu360.cn/BaseService/powerCheckCenter
 
 go 1.19
 
 require (
+	app.yhyue.com/moapp/jybase v0.0.0-20221229065928-e4ba75127ac9
+	github.com/go-sql-driver/mysql v1.7.0
 	github.com/zeromicro/go-zero v1.4.3
 	google.golang.org/grpc v1.51.0
 	google.golang.org/protobuf v1.28.1
@@ -15,36 +17,49 @@ require (
 	github.com/coreos/go-semver v0.3.0 // indirect
 	github.com/coreos/go-systemd/v22 v22.3.2 // indirect
 	github.com/davecgh/go-spew v1.1.1 // indirect
+	github.com/dchest/captcha v0.0.0-20200903113550-03f5f0333e1f // indirect
 	github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
 	github.com/fatih/color v1.13.0 // indirect
 	github.com/felixge/fgprof v0.9.3 // indirect
+	github.com/garyburd/redigo v1.6.2 // indirect
 	github.com/go-logr/logr v1.2.3 // indirect
 	github.com/go-logr/stdr v1.2.2 // indirect
 	github.com/go-redis/redis/v8 v8.11.5 // indirect
 	github.com/gogo/protobuf v1.3.2 // indirect
 	github.com/golang/mock v1.6.0 // indirect
 	github.com/golang/protobuf v1.5.2 // indirect
+	github.com/golang/snappy v0.0.4 // indirect
 	github.com/google/go-cmp v0.5.9 // indirect
 	github.com/google/gofuzz v1.2.0 // indirect
 	github.com/google/pprof v0.0.0-20211214055906-6f57359322fd // indirect
 	github.com/googleapis/gnostic v0.5.5 // indirect
 	github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 // indirect
+	github.com/jinzhu/inflection v1.0.0 // indirect
+	github.com/jinzhu/now v1.1.1 // indirect
 	github.com/json-iterator/go v1.1.12 // indirect
+	github.com/klauspost/compress v1.13.6 // indirect
 	github.com/mattn/go-colorable v0.1.9 // indirect
 	github.com/mattn/go-isatty v0.0.14 // indirect
 	github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect
 	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
 	github.com/modern-go/reflect2 v1.0.2 // indirect
+	github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe // indirect
 	github.com/openzipkin/zipkin-go v0.4.0 // indirect
 	github.com/pelletier/go-toml/v2 v2.0.6 // indirect
+	github.com/pkg/errors v0.9.1 // indirect
 	github.com/prometheus/client_golang v1.13.0 // indirect
 	github.com/prometheus/client_model v0.2.0 // indirect
 	github.com/prometheus/common v0.37.0 // indirect
 	github.com/prometheus/procfs v0.8.0 // indirect
 	github.com/spaolacci/murmur3 v1.1.0 // indirect
+	github.com/xdg-go/pbkdf2 v1.0.0 // indirect
+	github.com/xdg-go/scram v1.1.1 // indirect
+	github.com/xdg-go/stringprep v1.0.3 // indirect
+	github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect
 	go.etcd.io/etcd/api/v3 v3.5.5 // indirect
 	go.etcd.io/etcd/client/pkg/v3 v3.5.5 // indirect
 	go.etcd.io/etcd/client/v3 v3.5.5 // indirect
+	go.mongodb.org/mongo-driver v1.11.1 // indirect
 	go.opentelemetry.io/otel v1.10.0 // indirect
 	go.opentelemetry.io/otel/exporters/jaeger v1.10.0 // indirect
 	go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.10.0 // indirect
@@ -58,8 +73,10 @@ require (
 	go.uber.org/automaxprocs v1.5.1 // indirect
 	go.uber.org/multierr v1.8.0 // indirect
 	go.uber.org/zap v1.21.0 // indirect
+	golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d // indirect
 	golang.org/x/net v0.0.0-20221014081412-f15817d10f9b // indirect
 	golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783 // indirect
+	golang.org/x/sync v0.1.0 // indirect
 	golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10 // indirect
 	golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect
 	golang.org/x/text v0.4.0 // indirect
@@ -69,6 +86,8 @@ require (
 	gopkg.in/inf.v0 v0.9.1 // indirect
 	gopkg.in/yaml.v2 v2.4.0 // indirect
 	gopkg.in/yaml.v3 v3.0.1 // indirect
+	gorm.io/driver/mysql v1.0.5 // indirect
+	gorm.io/gorm v1.21.3 // indirect
 	k8s.io/api v0.22.9 // indirect
 	k8s.io/apimachinery v0.22.9 // indirect
 	k8s.io/client-go v0.22.9 // indirect

+ 78 - 0
rpc/go.sum → go.sum

@@ -1,3 +1,6 @@
+app.yhyue.com/moapp/esv1 v0.0.0-20220414031211-3da4123e648d/go.mod h1:91/lSD/hS+ckMVP3WdidRzDhC60lLMdyce9QHy0cSMA=
+app.yhyue.com/moapp/jybase v0.0.0-20221229065928-e4ba75127ac9 h1:oEtIsT9iO6EcKzvv0Tbq7CckuGfj9F1lExywviJJUp0=
+app.yhyue.com/moapp/jybase v0.0.0-20221229065928-e4ba75127ac9/go.mod h1:efAeRPDpJ13JuNODuqtfLlKQSQgCbnUcwGPzhFU5krY=
 cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
 cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
 cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
@@ -371,6 +374,7 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03
 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
 github.com/ClickHouse/clickhouse-go v1.5.4/go.mod h1:EaI/sW7Azgz9UATzd5ZdZHRUhHgv5+JMS9NSr2smCJI=
 github.com/ClickHouse/clickhouse-go/v2 v2.0.14/go.mod h1:iq2DUGgpA4BBki2CVwrF8x43zqBjdgHtbexkFkh5a6M=
+github.com/ClickHouse/clickhouse-go/v2 v2.2.0/go.mod h1:8f2XZUi7XoeU+uPIytSi1cvx8fmJxi7vIgqpvYTF1+o=
 github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
 github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
 github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
@@ -386,10 +390,12 @@ github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRF
 github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
 github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a h1:HbKu58rmZpUGpz5+4FfNmIU+FmZg2P3Xaj2v2bfNWmk=
 github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a/go.mod h1:SGnFV6hVsYE877CKEZ6tDNTjaSXYUk6QqoIK6PrAtcc=
+github.com/alicebob/miniredis/v2 v2.22.0/go.mod h1:XNqvJdQJv5mSuVMc0ynneafpnL/zv52acZ6kqeS0t88=
 github.com/alicebob/miniredis/v2 v2.23.1 h1:jR6wZggBxwWygeXcdNyguCOCIjPsZyNUNlAkTx2fu0U=
 github.com/alicebob/miniredis/v2 v2.23.1/go.mod h1:84TWKZlxYkfgMucPBf5SOQBYJceZeQRFIaQgNMiCX6Q=
 github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
 github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
+github.com/aws/aws-sdk-go v1.35.20/go.mod h1:tlPOdRjfxPBpNIwqDj61rmsnA85v9jc0Ps9+muhnW+k=
 github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
 github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
 github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
@@ -422,14 +428,18 @@ github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmf
 github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
 github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI=
 github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
+github.com/coscms/tagfast v0.0.0-20150925144250-2b69b2496250/go.mod h1:zX8vynptAghuV/KG8BOZlDeo4DsTKWfBQ154RWlkay0=
 github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
 github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/dchest/captcha v0.0.0-20200903113550-03f5f0333e1f h1:q/DpyjJjZs94bziQ7YkBmIlpqbVP7yw179rnzoNVX1M=
+github.com/dchest/captcha v0.0.0-20200903113550-03f5f0333e1f/go.mod h1:QGrK8vMWWHQYQ3QU9bw9Y9OPNfxccGzfb41qjvVeXtY=
 github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
 github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
 github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=
+github.com/donnie4w/go-logger v0.0.0-20170827050443-4740c51383f4/go.mod h1:L7S4x0R7vv3xoOhGuyAJyCO2MYzWOpccM4Isn8jIUgY=
 github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
 github.com/eapache/go-resiliency v1.2.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs=
 github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU=
@@ -459,6 +469,8 @@ github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMo
 github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
 github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
 github.com/fullstorydev/grpcurl v1.8.7/go.mod h1:pVtM4qe3CMoLaIzYS8uvTuDj2jVYmXqMUkZeijnXp/E=
+github.com/garyburd/redigo v1.6.2 h1:yE/pwKCrbLpLpQICzYTeZ7JsTA/C53wFTJHaEtRqniM=
+github.com/garyburd/redigo v1.6.2/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY=
 github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
 github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q=
 github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
@@ -481,12 +493,16 @@ github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbV
 github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
 github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
 github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM=
+github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
 github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
 github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8=
 github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
 github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI=
 github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo=
 github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
+github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
+github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
+github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=
 github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
 github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
 github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
@@ -494,6 +510,7 @@ github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5x
 github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
 github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
 github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
+github.com/golang-jwt/jwt/v4 v4.4.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
 github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
 github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
 github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ=
@@ -532,6 +549,7 @@ github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw
 github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
 github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
 github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
@@ -614,6 +632,7 @@ github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542/go.mod h1:Ow0tF8D4Kplb
 github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
 github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
 github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/howeyc/fsnotify v0.9.0/go.mod h1:41HzSPxBGeFRQKEEwgh49TRw/nKBsYZ2cF1OzPjSJsA=
 github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
 github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
 github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
@@ -631,7 +650,14 @@ github.com/jhump/goprotoc v0.5.0/go.mod h1:VrbvcYrQOrTi3i0Vf+m+oqQWk9l72mjkJCYo7
 github.com/jhump/protoreflect v1.11.0/go.mod h1:U7aMIjN0NWq9swDP7xDdoMfRHb35uiuTd3Z9nFXJf5E=
 github.com/jhump/protoreflect v1.12.0/go.mod h1:JytZfP5d0r8pVNLZvai7U/MCuTWITgrI4tTg7puQFKI=
 github.com/jhump/protoreflect v1.14.0/go.mod h1:JytZfP5d0r8pVNLZvai7U/MCuTWITgrI4tTg7puQFKI=
+github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
+github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
+github.com/jinzhu/now v1.1.1 h1:g39TucaRWyV3dwDO++eEc6qf8TVIQ/Da48WmqjZ3i7E=
+github.com/jinzhu/now v1.1.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
+github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
+github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
 github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks=
+github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
 github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
 github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
 github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
@@ -642,8 +668,10 @@ github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1
 github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
 github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
 github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
+github.com/justinas/alice v1.2.0/go.mod h1:fN5HRH/reO/zrUflLfTN43t3vXvKzvZIENsNEe7i7qA=
 github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
 github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc=
 github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
 github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
@@ -657,9 +685,12 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
 github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
 github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
 github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
+github.com/lib/pq v1.10.6/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
 github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
 github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
+github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
+github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
 github.com/mattn/go-colorable v0.1.9 h1:sqDoxXbdeALODt0DAeJCVp38ps9ZogZEAXjus69YV3U=
 github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
 github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
@@ -681,6 +712,7 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN
 github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
 github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
 github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
+github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe h1:iruDEfMl2E6fbMZ9s0scYfZQ84/6SPL6zC8ACM2oIL0=
 github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
 github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
 github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
@@ -692,6 +724,8 @@ github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI
 github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
 github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
 github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
+github.com/olivere/elastic v6.2.37+incompatible/go.mod h1:J+q1zQJTgAz9woqsbVRqGeB5G1iqDKVBWLNSYW8yfJ8=
+github.com/olivere/elastic/v7 v7.0.22/go.mod h1:VDexNy9NjmtAkrjNoI7tImv7FR4tf5zUA3ickqu5Pc8=
 github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
@@ -707,16 +741,20 @@ github.com/onsi/gomega v1.16.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAl
 github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
 github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE=
 github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs=
+github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
 github.com/openzipkin/zipkin-go v0.4.0 h1:CtfRrOVZtbDj8rt1WXjklw0kqqJQwICrCKmlfUuBUUw=
 github.com/openzipkin/zipkin-go v0.4.0/go.mod h1:4c3sLeE8xjNqehmF5RpAFLPLJxXscc0R4l6Zg0P1tTQ=
 github.com/paulmach/orb v0.5.0/go.mod h1:FWRlTgl88VI1RBx/MkrwWDRhQ96ctqMCh8boXhmqB/A=
+github.com/paulmach/orb v0.7.1/go.mod h1:FWRlTgl88VI1RBx/MkrwWDRhQ96ctqMCh8boXhmqB/A=
 github.com/paulmach/protoscan v0.2.1/go.mod h1:SpcSwydNLrxUGSDvXvO0P7g7AuhJ7lcKfDlhJCDw2gY=
+github.com/pelletier/go-toml/v2 v2.0.2/go.mod h1:MovirKjgVRESsAvNZlAjtFwV867yGuwRkXbG66OzopI=
 github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU=
 github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek=
 github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
 github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
 github.com/pierrec/lz4 v2.6.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
 github.com/pierrec/lz4/v4 v4.1.14/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
+github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
 github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
@@ -731,6 +769,7 @@ github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP
 github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
 github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
 github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=
+github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=
 github.com/prometheus/client_golang v1.13.0 h1:b71QUfeo5M8gq2+evJdTPfZhYMAU0uKPkyPJ7TPsloU=
 github.com/prometheus/client_golang v1.13.0/go.mod h1:vTeo+zgvILHsnnj/39Ou/1fPN5nJFOEMgftOUOmlvYQ=
 github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
@@ -766,6 +805,9 @@ github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPx
 github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
 github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
 github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
+github.com/smartystreets/assertions v1.1.1/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo=
+github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h1:SnhjPscd9TpLiy1LpzGSKh3bXCfxxXuqd9xmQJy3slM=
+github.com/smartystreets/gunit v1.4.2/go.mod h1:ZjM1ozSIMJlAz/ay4SG8PeKF00ckUp+zMHZXV9/bvak=
 github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
 github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI=
 github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
@@ -786,18 +828,25 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5
 github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=
+github.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
 github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
 github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
 github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
+github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4=
 github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
 github.com/tklauser/go-sysconf v0.3.10/go.mod h1:C8XykCvCb+Gn0oNCWPIlcb0RuglQTYaQ2hGm7jmxEFk=
 github.com/tklauser/numcpus v0.4.0/go.mod h1:1+UI3pD8NW14VMwdgJNJ1ESk2UnwhAnz5hMwiKKqXCQ=
 github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI=
+github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c=
 github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
 github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs=
+github.com/xdg-go/scram v1.1.1 h1:VOMT+81stJgXW3CpHyqHN3AXDYIMsx56mEFrB37Mb/E=
 github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g=
 github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM=
+github.com/xdg-go/stringprep v1.0.3 h1:kdwGpVNwPFtjs98xCGkHjQtGKh86rDcRZN17QEMCOIs=
 github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8=
+github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA=
 github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
 github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
@@ -805,16 +854,24 @@ github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de
 github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
 github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
+github.com/yuin/gopher-lua v0.0.0-20210529063254-f4c35e4016d9/go.mod h1:E1AXubJBdNmFERAOucpDIxNzeGfLzg0mYh+UfMWdChA=
 github.com/yuin/gopher-lua v0.0.0-20220504180219-658193537a64 h1:5mLPGnFdSsevFRFc9q3yYbBkB6tsm4aCwwQV/j1JQAQ=
 github.com/yuin/gopher-lua v0.0.0-20220504180219-658193537a64/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw=
+github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
+github.com/zeromicro/go-zero v1.3.5/go.mod h1:wh4o794b7Ul3W0k35Pw9nc3iB4O0OpaQTMQz/PJc1bc=
 github.com/zeromicro/go-zero v1.4.3 h1:sTQ++6fxQHJnpGCN7h2CUrhWmbvhBqEgE75cJl635SM=
 github.com/zeromicro/go-zero v1.4.3/go.mod h1:UmDjuW7LHd9j7+nnnPBcXF0HLNmjJw6OjHPTlSp7X7Y=
+go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A=
 go.etcd.io/etcd/api/v3 v3.5.5 h1:BX4JIbQ7hl7+jL+g+2j5UAr0o1bctCm6/Ct+ArBGkf0=
 go.etcd.io/etcd/api/v3 v3.5.5/go.mod h1:KFtNaxGDw4Yx/BA4iPPwevUTAuqcsPxzyX8PHydchN8=
+go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=
 go.etcd.io/etcd/client/pkg/v3 v3.5.5 h1:9S0JUVvmrVl7wCF39iTQthdaaNIiAaQbmK75ogO6GU8=
 go.etcd.io/etcd/client/pkg/v3 v3.5.5/go.mod h1:ggrwbk069qxpKPq8/FKkQ3Xq9y39kbFR4LnKszpRXeQ=
+go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY=
 go.etcd.io/etcd/client/v3 v3.5.5 h1:q++2WTJbUgpQu4B6hCuT7VkdwaTP7Qz6Daak3WzbrlI=
 go.etcd.io/etcd/client/v3 v3.5.5/go.mod h1:aApjR4WGlSumpnJ2kloS75h6aHUmAyaPLjHMxpc7E7c=
+go.mongodb.org/mongo-driver v1.9.1/go.mod h1:0sQWfOeY63QTntERDJJ/0SuKK0T1uVSgKCuAROlKEPY=
+go.mongodb.org/mongo-driver v1.11.1 h1:QP0znIRTuL0jf1oBQoAoM0C6ZJfBK4kx0Uumtv1A7w8=
 go.mongodb.org/mongo-driver v1.11.1/go.mod h1:s7p5vEtfbeR1gYi6pnj3c3/urpbLv2T5Sfd6Rp2HBB8=
 go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
 go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
@@ -824,8 +881,10 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
 go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
 go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
 go.opentelemetry.io/otel v1.7.0/go.mod h1:5BdUoMIz5WEs0vt0CUEMtSSaTSHBBVwrhnz7+nrD5xk=
+go.opentelemetry.io/otel v1.8.0/go.mod h1:2pkj+iMj0o03Y+cW6/m8Y4WkRdYN3AvCXCnzRMp9yvM=
 go.opentelemetry.io/otel v1.10.0 h1:Y7DTJMR6zs1xkS/upamJYk0SxxN4C9AqRd77jmZnyY4=
 go.opentelemetry.io/otel v1.10.0/go.mod h1:NbvWjCthWHKBEUMpf0/v8ZRZlni86PpGFEMA9pnQSnQ=
+go.opentelemetry.io/otel/exporters/jaeger v1.8.0/go.mod h1:GbWg+ng88rDtx+id26C34QLqw2erqJeAjsCx9AFeHfE=
 go.opentelemetry.io/otel/exporters/jaeger v1.10.0 h1:7W3aVVjEYayu/GOqOVF4mbTvnCuxF1wWu3eRxFGQXvw=
 go.opentelemetry.io/otel/exporters/jaeger v1.10.0/go.mod h1:n9IGyx0fgyXXZ/i0foLHNxtET9CzXHzZeKCucvRBFgA=
 go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.10.0 h1:TaB+1rQhddO1sF71MpZOZAuSPW1klK2M8XxfrBMfK7Y=
@@ -834,11 +893,14 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.10.0 h1:pDDYmo0QadUPal5fwXo
 go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.10.0/go.mod h1:Krqnjl22jUJ0HgMzw5eveuCvFDXY4nSYb4F8t5gdrag=
 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.10.0 h1:KtiUEhQmj/Pa874bVYKGNVdq8NPKiacPbaRRtgXi+t4=
 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.10.0/go.mod h1:OfUCyyIiDvNXHWpcWgbF+MWvqPZiNa3YDEnivcnYsV0=
+go.opentelemetry.io/otel/exporters/zipkin v1.8.0/go.mod h1:0uYAyCuGT67MFV9Z/Mmx93wGuugHw0FbxMc74fs3LNo=
 go.opentelemetry.io/otel/exporters/zipkin v1.10.0 h1:HcPAFsFpEBKF+G5NIOA+gBsxifd3Ej+wb+KsdBLa15E=
 go.opentelemetry.io/otel/exporters/zipkin v1.10.0/go.mod h1:HdfvgwcOoCB0+zzrTHycW6btjK0zNpkz2oTGO815SCI=
+go.opentelemetry.io/otel/sdk v1.8.0/go.mod h1:uPSfc+yfDH2StDM/Rm35WE8gXSNdvCg023J6HeGNO0c=
 go.opentelemetry.io/otel/sdk v1.10.0 h1:jZ6K7sVn04kk/3DNUdJ4mqRlGDiXAVuIG+MMENpTNdY=
 go.opentelemetry.io/otel/sdk v1.10.0/go.mod h1:vO06iKzD5baltJz1zarxMCNHFpUlUiOy4s65ECtn6kE=
 go.opentelemetry.io/otel/trace v1.7.0/go.mod h1:fzLSB9nqR2eXzxPXb2JW9IKE+ScyXA48yyE4TNvoHqU=
+go.opentelemetry.io/otel/trace v1.8.0/go.mod h1:0Bt3PXY8w+3pheS3hQUt+wow8b1ojPaTBoTCh2zIFI4=
 go.opentelemetry.io/otel/trace v1.10.0 h1:npQMbR8o7mum8uF95yFbOEJffhs1sbCOfDh8zAJiH5E=
 go.opentelemetry.io/otel/trace v1.10.0/go.mod h1:Sij3YYczqAdz+EhmGhE6TpTxUO5/F/AzrK+kxfGqySM=
 go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
@@ -867,9 +929,11 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U
 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
 golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
 golang.org/x/crypto v0.0.0-20210920023735-84f357641f63/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d h1:sK3txAijHtOK88l68nt020reeT1ZdKLIYetKl95FzVY=
 golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
@@ -957,6 +1021,7 @@ golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su
 golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
 golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
 golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
+golang.org/x/net v0.0.0-20220531201128-c960675eff93/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
 golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
 golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
 golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
@@ -1005,6 +1070,7 @@ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJ
 golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
 golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -1021,6 +1087,7 @@ golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -1113,6 +1180,7 @@ golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxb
 golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20220411224347-583f2d630306/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
 golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
@@ -1124,6 +1192,7 @@ golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3
 golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
 golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
 golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
@@ -1314,6 +1383,7 @@ google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP
 google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=
 google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=
 google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=
+google.golang.org/genproto v0.0.0-20220602131408-e326c6e8e9c8/go.mod h1:yKyY4AMRwFiC8yMMNaMi+RkCnjZJt9LoWuvhXjMs+To=
 google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA=
 google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA=
 google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA=
@@ -1399,6 +1469,7 @@ google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqw
 google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=
 google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
 gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
+gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
@@ -1408,6 +1479,7 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EV
 gopkg.in/cheggaaa/pb.v1 v1.0.28/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
 gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
 gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
+gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df/go.mod h1:LRQQ+SO6ZHR7tOkpBDuZnXENFzX8qRjMDMyPD6BRkCw=
 gopkg.in/h2non/gock.v1 v1.1.2 h1:jBbHXgGBK/AoPVfJh5x4r/WxIrElvbLel8TCZkkZJoY=
 gopkg.in/h2non/gock.v1 v1.1.2/go.mod h1:n7UGz/ckNChHiK05rDoiC4MYSunEC/lyaUm2WWaDva0=
 gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
@@ -1428,6 +1500,10 @@ gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C
 gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gorm.io/driver/mysql v1.0.5 h1:WAAmvLK2rG0tCOqrf5XcLi2QUwugd4rcVJ/W3aoon9o=
+gorm.io/driver/mysql v1.0.5/go.mod h1:N1OIhHAIhx5SunkMGqWbGFVeh4yTNWKmMo1GOAsohLI=
+gorm.io/gorm v1.21.3 h1:qDFi55ZOsjZTwk5eN+uhAmHi8GysJ/qCTichM/yO7ME=
+gorm.io/gorm v1.21.3/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw=
 honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
@@ -1444,10 +1520,12 @@ k8s.io/client-go v0.22.9/go.mod h1:IoH7exYnoH/zgvHOuVxh2c4yJepcCBt72FzCTisOc4k=
 k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
 k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE=
 k8s.io/klog/v2 v2.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec=
+k8s.io/klog/v2 v2.40.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
 k8s.io/klog/v2 v2.80.1 h1:atnLQ121W371wYYFawwYx1aEY2eUfs4l3J72wtgAwV4=
 k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
 k8s.io/kube-openapi v0.0.0-20211109043538-20434351676c/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw=
 k8s.io/utils v0.0.0-20211116205334-6203023598ed/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
+k8s.io/utils v0.0.0-20220706174534-f6158b442e7c/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
 k8s.io/utils v0.0.0-20221108210102-8e77b1f39fe2 h1:GfD9OzL11kvZN5iArC6oTS7RTj7oJOIfnislxYlqTj8=
 k8s.io/utils v0.0.0-20221108210102-8e77b1f39fe2/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
 rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=

+ 3 - 1
rpc/etc/powercheck.yaml

@@ -23,4 +23,6 @@ Mongo:
   Main:
     dbName: qfw
     size: 50
-    address: 192.168.3.206:27080
+    address: 192.168.3.206:27080
+RedisAddrees:
+  - other=192.168.3.206:1712

+ 6 - 2
rpc/init/init.go

@@ -3,16 +3,16 @@ package init
 import (
 	"flag"
 	"log"
+	"strings"
 
 	"app.yhyue.com/moapp/jybase/mongodb"
 	"app.yhyue.com/moapp/jybase/mysql"
+	"app.yhyue.com/moapp/jybase/redis"
 	"bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/entity"
 	"bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/rpc/internal/config"
 	_ "github.com/go-sql-driver/mysql"
 	"github.com/zeromicro/go-zero/core/conf"
-	"github.com/zeromicro/go-zero/core/discov"
 	"github.com/zeromicro/go-zero/core/logx"
-	"github.com/zeromicro/go-zero/zrpc"
 )
 
 var logFile = flag.String("lf", "etc/log.yaml", "the config file")
@@ -74,4 +74,8 @@ func init() {
 		}
 		entity.MgoJy.InitPool()
 	}
+	//
+	log.Println("初始化 redis")
+	redis.InitRedisBySize(strings.Join(C.RedisAddrees, ","), 100, 30, 300)
+
 }

+ 10 - 1
rpc/internal/config/config.go

@@ -1,7 +1,16 @@
 package config
 
-import "github.com/zeromicro/go-zero/zrpc"
+import (
+	"bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/entity"
+	"github.com/zeromicro/go-zero/zrpc"
+)
 
 type Config struct {
 	zrpc.RpcServerConf
+	MysqlMain     entity.MysqlMainStruct
+	BaseMysqlMain entity.MysqlMainStruct
+	Mongo         struct {
+		Main *entity.MongoStruct
+	}
+	RedisAddrees []string
 }

+ 66 - 3
rpc/internal/logic/checklogic.go

@@ -3,8 +3,10 @@ package logic
 import (
 	"context"
 
-	"rpc/internal/svc"
-	"rpc/pb"
+	"bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/entity"
+	"bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/rpc/internal/svc"
+	"bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/rpc/pb"
+	"bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/service"
 
 	"github.com/zeromicro/go-zero/core/logx"
 )
@@ -26,6 +28,67 @@ func NewCheckLogic(ctx context.Context, svcCtx *svc.ServiceContext) *CheckLogic
 // 用户权限判断
 func (l *CheckLogic) Check(in *pb.CheckReq) (*pb.CheckResp, error) {
 	// todo: add your logic here and delete this line
-
+	resp := &pb.CheckResp{}
+	power := service.NewPower(&entity.Conn{
+		Mysql:     entity.Mysql,
+		BaseMysql: entity.BaseMysql,
+		MgoJy:     entity.MgoJy,
+	})
+	data := power.Power(in.Userid, in.BaseUserId, in.AccountId, in.EntId)
+	if data == nil {
+		resp.ErrorMsg = "暂无数据"
+		resp.ErrorCode = -1
+	} else {
+		resp.Ent = &pb.Ent{
+			Name:                data.Ent.Name,
+			EntRoleId:           data.Ent.EntRoleId,
+			EntAuthStatus:       data.Ent.EntAuthStatus,
+			EntAuthReason:       data.Ent.EntAuthReason,
+			EntSubscribe:        data.Ent.EntSubscribe,
+			EntSubscribeManager: data.Ent.EntSubscribeManager,
+			PowerSource:         data.Entniche.PowerSource,
+			DeptSubscribe:       data.Ent.DeptSubscribe,
+			BuyVip:              data.Ent.BuyVip,
+			BuyMember:           data.Ent.BuyMember,
+		}
+		resp.Vip = &pb.Vip{
+			Status:          data.Vip.Status,
+			StartTime:       data.Vip.StartTime,
+			EndTime:         data.Vip.EndTime,
+			Upgrade:         data.Vip.Upgrade,
+			Areacount:       data.Vip.Areacount,
+			Buyerclasscount: data.Vip.Buyerclasscount,
+			MaxKeyLength:    data.Vip.MaxKeyLength,
+			PowerType:       data.Vip.PowerType,
+			VipPower:        data.Vip.VipPower,
+			FileNum:         data.Vip.FileNum,
+		}
+		resp.Member = &pb.Member{
+			Status:          data.Member.Status,
+			StartTime:       data.Member.StartTime,
+			EndTime:         data.Member.EndTime,
+			MemberName:      data.Member.MemberName,
+			MemberPowerList: data.Member.MemberPowerList,
+			IsMemberTrial:   data.Member.IsMemberTrial,
+			PowerType:       data.Member.PowerType,
+			MemberPower:     data.Member.MemberPower,
+			IsSubCount:      data.Member.IsSubCount,
+			MaxKeyLength:    data.Member.MaxKeyLength,
+			EntNum:          data.Member.EntNum,
+			ProNum:          data.Member.ProNum,
+			DailyNum:        data.Member.DailyNum,
+			Customers:       data.Member.Customers,
+			Pid:             data.Member.Pid,
+			Used:            data.Member.Used,
+		}
+		resp.Entniche = &pb.Entniche{
+			Status:      data.Entniche.Status,
+			StartTime:   data.Entniche.StartTime,
+			EndTime:     data.Entniche.EndTime,
+			PowerSource: data.Entniche.PowerSource,
+			IsEntPower:  data.Entniche.IsEntPower,
+			IsNew:       data.Entniche.IsNew,
+		}
+	}
 	return &pb.CheckResp{}, nil
 }

+ 3 - 3
rpc/internal/server/powercheckserver.go

@@ -6,9 +6,9 @@ package server
 import (
 	"context"
 
-	"rpc/internal/logic"
-	"rpc/internal/svc"
-	"rpc/pb"
+	"bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/rpc/internal/logic"
+	"bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/rpc/internal/svc"
+	"bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/rpc/pb"
 )
 
 type PowerCheckServer struct {

+ 1 - 1
rpc/internal/svc/servicecontext.go

@@ -1,6 +1,6 @@
 package svc
 
-import "rpc/internal/config"
+import "bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/rpc/internal/config"
 
 type ServiceContext struct {
 	Config config.Config

+ 191 - 96
rpc/pb/powerCheck.pb.go

@@ -90,9 +90,10 @@ type CheckReq struct {
 	unknownFields protoimpl.UnknownFields
 
 	Appid      string `protobuf:"bytes,1,opt,name=appid,proto3" json:"appid,omitempty"`
-	Userid     string `protobuf:"bytes,2,opt,name=userid,proto3" json:"userid,omitempty"`                              //mongodb用户id
-	BaseUserId int64  `protobuf:"varint,3,opt,name=base_user_id,json=baseUserId,proto3" json:"base_user_id,omitempty"` //base_user用户id
-	AccountId  int64  `protobuf:"varint,4,opt,name=account_id,json=accountId,proto3" json:"account_id,omitempty"`      //账户id
+	Userid     string `protobuf:"bytes,2,opt,name=userid,proto3" json:"userid,omitempty"`          //mongodb用户id
+	BaseUserId int64  `protobuf:"varint,3,opt,name=baseUserId,proto3" json:"baseUserId,omitempty"` //base_user用户id
+	AccountId  int64  `protobuf:"varint,4,opt,name=accountId,proto3" json:"accountId,omitempty"`   //账户id
+	EntId      int64  `protobuf:"varint,5,opt,name=entId,proto3" json:"entId,omitempty"`           //
 }
 
 func (x *CheckReq) Reset() {
@@ -155,6 +156,13 @@ func (x *CheckReq) GetAccountId() int64 {
 	return 0
 }
 
+func (x *CheckReq) GetEntId() int64 {
+	if x != nil {
+		return x.EntId
+	}
+	return 0
+}
+
 type CheckResp struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -386,6 +394,12 @@ type Member struct {
 	MemberPower     int64   `protobuf:"varint,8,opt,name=memberPower,proto3" json:"memberPower,omitempty"`                //是否分配了大会员;0:否 1:是
 	IsSubCount      int64   `protobuf:"varint,9,opt,name=isSubCount,proto3" json:"isSubCount,omitempty"`                  //是否是子账号 0否 1是
 	MaxKeyLength    int64   `protobuf:"varint,10,opt,name=maxKeyLength,proto3" json:"maxKeyLength,omitempty"`             //最大关键词数量限制
+	EntNum          int64   `protobuf:"varint,11,opt,name=entNum,proto3" json:"entNum,omitempty"`                         //企业情报监控 企业中标动态数量
+	ProNum          int64   `protobuf:"varint,12,opt,name=proNum,proto3" json:"proNum,omitempty"`                         //项目进度监控数量
+	DailyNum        int64   `protobuf:"varint,13,opt,name=dailyNum,proto3" json:"dailyNum,omitempty"`                     //结构化数据(单日限量包数量)
+	Customers       int64   `protobuf:"varint,14,opt,name=customers,proto3" json:"customers,omitempty"`                   //潜在客户数量
+	Pid             string  `protobuf:"bytes,15,opt,name=pid,proto3" json:"pid,omitempty"`                                //主帐号id
+	Used            bool    `protobuf:"varint,16,opt,name=used,proto3" json:"used,omitempty"`                             //是否使用过大会员初始化
 }
 
 func (x *Member) Reset() {
@@ -490,6 +504,48 @@ func (x *Member) GetMaxKeyLength() int64 {
 	return 0
 }
 
+func (x *Member) GetEntNum() int64 {
+	if x != nil {
+		return x.EntNum
+	}
+	return 0
+}
+
+func (x *Member) GetProNum() int64 {
+	if x != nil {
+		return x.ProNum
+	}
+	return 0
+}
+
+func (x *Member) GetDailyNum() int64 {
+	if x != nil {
+		return x.DailyNum
+	}
+	return 0
+}
+
+func (x *Member) GetCustomers() int64 {
+	if x != nil {
+		return x.Customers
+	}
+	return 0
+}
+
+func (x *Member) GetPid() string {
+	if x != nil {
+		return x.Pid
+	}
+	return ""
+}
+
+func (x *Member) GetUsed() bool {
+	if x != nil {
+		return x.Used
+	}
+	return false
+}
+
 //商机管理相关
 type Entniche struct {
 	state         protoimpl.MessageState
@@ -501,6 +557,7 @@ type Entniche struct {
 	EndTime     int64 `protobuf:"varint,3,opt,name=endTime,proto3" json:"endTime,omitempty"`         //结束时间戳
 	PowerSource int64 `protobuf:"varint,4,opt,name=powerSource,proto3" json:"powerSource,omitempty"` //商机管理权限开通来源;1:赠送的商机管理服务
 	IsEntPower  int64 `protobuf:"varint,5,opt,name=isEntPower,proto3" json:"isEntPower,omitempty"`   //是否分配权限;0:未分配,1:已分配
+	IsNew       int64 `protobuf:"varint,6,opt,name=isNew,proto3" json:"isNew,omitempty"`             //是否是新版商机管理 0不是 1是
 }
 
 func (x *Entniche) Reset() {
@@ -570,6 +627,13 @@ func (x *Entniche) GetIsEntPower() int64 {
 	return 0
 }
 
+func (x *Entniche) GetIsNew() int64 {
+	if x != nil {
+		return x.IsNew
+	}
+	return 0
+}
+
 //企业相关
 type Ent struct {
 	state         protoimpl.MessageState
@@ -585,6 +649,8 @@ type Ent struct {
 	PowerSource         int64  `protobuf:"varint,7,opt,name=powerSource,proto3" json:"powerSource,omitempty"`                 //商机管理权限开通来源;1:赠送的商机管理服务
 	DeptSubscribe       int64  `protobuf:"varint,8,opt,name=deptSubscribe,proto3" json:"deptSubscribe,omitempty"`             //各部门是否可以自行订阅;0:否 1:是
 	PrivateGD           bool   `protobuf:"varint,9,opt,name=privateGD,proto3" json:"privateGD,omitempty"`                     //广东移动DICT 用户,用于查看画像
+	BuyVip              int64  `protobuf:"varint,10,opt,name=buyVip,proto3" json:"buyVip,omitempty"`                          //是否购买超级订阅
+	BuyMember           int64  `protobuf:"varint,11,opt,name=buyMember,proto3" json:"buyMember,omitempty"`                    //是否购买大会员
 }
 
 func (x *Ent) Reset() {
@@ -682,6 +748,20 @@ func (x *Ent) GetPrivateGD() bool {
 	return false
 }
 
+func (x *Ent) GetBuyVip() int64 {
+	if x != nil {
+		return x.BuyVip
+	}
+	return 0
+}
+
+func (x *Ent) GetBuyMember() int64 {
+	if x != nil {
+		return x.BuyMember
+	}
+	return 0
+}
+
 //免费权益相关
 type Free struct {
 	state         protoimpl.MessageState
@@ -771,99 +851,114 @@ var file_powerCheck_proto_rawDesc = []byte{
 	0x72, 0x72, 0x6f, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x72, 0x72, 0x6f, 0x72,
 	0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x65, 0x72, 0x72,
 	0x6f, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73,
-	0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x79,
-	0x0a, 0x08, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x70,
-	0x70, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x70, 0x70, 0x69, 0x64,
-	0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0c, 0x62, 0x61, 0x73, 0x65,
-	0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a,
-	0x62, 0x61, 0x73, 0x65, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63,
-	0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09,
-	0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x22, 0xda, 0x01, 0x0a, 0x09, 0x43, 0x68,
-	0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72,
-	0x5f, 0x6d, 0x73, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x72, 0x72, 0x6f,
-	0x72, 0x4d, 0x73, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x63, 0x6f,
-	0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x43,
-	0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x03, 0x76, 0x69, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,
-	0x32, 0x04, 0x2e, 0x56, 0x69, 0x70, 0x52, 0x03, 0x76, 0x69, 0x70, 0x12, 0x1f, 0x0a, 0x06, 0x6d,
-	0x65, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x07, 0x2e, 0x4d, 0x65,
-	0x6d, 0x62, 0x65, 0x72, 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x25, 0x0a, 0x08,
-	0x65, 0x6e, 0x74, 0x6e, 0x69, 0x63, 0x68, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x09,
-	0x2e, 0x45, 0x6e, 0x74, 0x6e, 0x69, 0x63, 0x68, 0x65, 0x52, 0x08, 0x65, 0x6e, 0x74, 0x6e, 0x69,
-	0x63, 0x68, 0x65, 0x12, 0x16, 0x0a, 0x03, 0x65, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b,
-	0x32, 0x04, 0x2e, 0x45, 0x6e, 0x74, 0x52, 0x03, 0x65, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x04, 0x66,
-	0x72, 0x65, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x05, 0x2e, 0x46, 0x72, 0x65, 0x65,
-	0x52, 0x04, 0x66, 0x72, 0x65, 0x65, 0x22, 0xaf, 0x02, 0x0a, 0x03, 0x56, 0x69, 0x70, 0x12, 0x16,
-	0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06,
-	0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54,
-	0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74,
-	0x54, 0x69, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x18,
-	0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x18,
-	0x0a, 0x07, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52,
-	0x07, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x65, 0x61,
-	0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x61, 0x72, 0x65,
-	0x61, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x62, 0x75, 0x79, 0x65, 0x72, 0x63,
-	0x6c, 0x61, 0x73, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52,
-	0x0f, 0x62, 0x75, 0x79, 0x65, 0x72, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74,
-	0x12, 0x22, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68,
-	0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, 0x65,
-	0x6e, 0x67, 0x74, 0x68, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x54, 0x79, 0x70,
-	0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x54, 0x79,
-	0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x76, 0x69, 0x70, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x18, 0x09,
-	0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x76, 0x69, 0x70, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x12, 0x18,
-	0x0a, 0x07, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x75, 0x6d, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52,
-	0x07, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x75, 0x6d, 0x22, 0xcc, 0x02, 0x0a, 0x06, 0x4d, 0x65, 0x6d,
-	0x62, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20,
-	0x01, 0x28, 0x03, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x73,
-	0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09,
-	0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x64,
-	0x54, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54,
-	0x69, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x4e, 0x61, 0x6d,
-	0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x4e,
-	0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x50, 0x6f, 0x77,
-	0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x05, 0x20, 0x03, 0x28, 0x03, 0x52, 0x0f, 0x6d, 0x65,
-	0x6d, 0x62, 0x65, 0x72, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x24, 0x0a,
-	0x0d, 0x69, 0x73, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x54, 0x72, 0x69, 0x61, 0x6c, 0x18, 0x06,
-	0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x69, 0x73, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x54, 0x72,
-	0x69, 0x61, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65,
-	0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x54, 0x79, 0x70,
-	0x65, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x50, 0x6f, 0x77, 0x65, 0x72,
-	0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x50, 0x6f,
-	0x77, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x73, 0x53, 0x75, 0x62, 0x43, 0x6f, 0x75, 0x6e,
-	0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x69, 0x73, 0x53, 0x75, 0x62, 0x43, 0x6f,
-	0x75, 0x6e, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, 0x65, 0x6e,
-	0x67, 0x74, 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x4b, 0x65,
-	0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x22, 0x9c, 0x01, 0x0a, 0x08, 0x45, 0x6e, 0x74, 0x6e,
-	0x69, 0x63, 0x68, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01,
-	0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x0a, 0x09,
-	0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52,
-	0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e,
-	0x64, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x65, 0x6e, 0x64,
-	0x54, 0x69, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x53, 0x6f, 0x75,
-	0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x70, 0x6f, 0x77, 0x65, 0x72,
-	0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x73, 0x45, 0x6e, 0x74, 0x50,
-	0x6f, 0x77, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x69, 0x73, 0x45, 0x6e,
-	0x74, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x22, 0xbf, 0x02, 0x0a, 0x03, 0x45, 0x6e, 0x74, 0x12, 0x12,
-	0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61,
-	0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x64, 0x18,
-	0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x64,
-	0x12, 0x24, 0x0a, 0x0d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75,
-	0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x74, 0x68,
-	0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x74,
-	0x68, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65,
-	0x6e, 0x74, 0x41, 0x75, 0x74, 0x68, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c,
-	0x65, 0x6e, 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x18, 0x05, 0x20, 0x01,
-	0x28, 0x03, 0x52, 0x0c, 0x65, 0x6e, 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65,
-	0x12, 0x30, 0x0a, 0x13, 0x65, 0x6e, 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65,
-	0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x65,
-	0x6e, 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x61, 0x6e, 0x61, 0x67,
-	0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x53, 0x6f, 0x75, 0x72, 0x63,
-	0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x53, 0x6f,
-	0x75, 0x72, 0x63, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x64, 0x65, 0x70, 0x74, 0x53, 0x75, 0x62, 0x73,
-	0x63, 0x72, 0x69, 0x62, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x64, 0x65, 0x70,
-	0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72,
-	0x69, 0x76, 0x61, 0x74, 0x65, 0x47, 0x44, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x70,
-	0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x47, 0x44, 0x22, 0xa2, 0x01, 0x0a, 0x04, 0x46, 0x72, 0x65,
+	0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x8c,
+	0x01, 0x0a, 0x08, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x12, 0x14, 0x0a, 0x05, 0x61,
+	0x70, 0x70, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x70, 0x70, 0x69,
+	0x64, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x69, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x62, 0x61, 0x73,
+	0x65, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x62,
+	0x61, 0x73, 0x65, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x63, 0x63,
+	0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x61, 0x63,
+	0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x74, 0x49, 0x64,
+	0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0xda, 0x01,
+	0x0a, 0x09, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x12, 0x1b, 0x0a, 0x09, 0x65,
+	0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08,
+	0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x72, 0x72, 0x6f,
+	0x72, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x65, 0x72,
+	0x72, 0x6f, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x03, 0x76, 0x69, 0x70, 0x18, 0x03,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x04, 0x2e, 0x56, 0x69, 0x70, 0x52, 0x03, 0x76, 0x69, 0x70, 0x12,
+	0x1f, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x07, 0x2e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72,
+	0x12, 0x25, 0x0a, 0x08, 0x65, 0x6e, 0x74, 0x6e, 0x69, 0x63, 0x68, 0x65, 0x18, 0x05, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x09, 0x2e, 0x45, 0x6e, 0x74, 0x6e, 0x69, 0x63, 0x68, 0x65, 0x52, 0x08, 0x65,
+	0x6e, 0x74, 0x6e, 0x69, 0x63, 0x68, 0x65, 0x12, 0x16, 0x0a, 0x03, 0x65, 0x6e, 0x74, 0x18, 0x06,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x04, 0x2e, 0x45, 0x6e, 0x74, 0x52, 0x03, 0x65, 0x6e, 0x74, 0x12,
+	0x19, 0x0a, 0x04, 0x66, 0x72, 0x65, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x05, 0x2e,
+	0x46, 0x72, 0x65, 0x65, 0x52, 0x04, 0x66, 0x72, 0x65, 0x65, 0x22, 0xaf, 0x02, 0x0a, 0x03, 0x56,
+	0x69, 0x70, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x03, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x74,
+	0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73,
+	0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x64, 0x54,
+	0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69,
+	0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x18, 0x04, 0x20,
+	0x01, 0x28, 0x03, 0x52, 0x07, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09,
+	0x61, 0x72, 0x65, 0x61, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52,
+	0x09, 0x61, 0x72, 0x65, 0x61, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x62, 0x75,
+	0x79, 0x65, 0x72, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20,
+	0x01, 0x28, 0x03, 0x52, 0x0f, 0x62, 0x75, 0x79, 0x65, 0x72, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x63,
+	0x6f, 0x75, 0x6e, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, 0x65,
+	0x6e, 0x67, 0x74, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x4b,
+	0x65, 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x6f, 0x77, 0x65,
+	0x72, 0x54, 0x79, 0x70, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x70, 0x6f, 0x77,
+	0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x76, 0x69, 0x70, 0x50, 0x6f, 0x77,
+	0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x76, 0x69, 0x70, 0x50, 0x6f, 0x77,
+	0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x75, 0x6d, 0x18, 0x0a, 0x20,
+	0x01, 0x28, 0x03, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x75, 0x6d, 0x22, 0xdc, 0x03, 0x0a,
+	0x06, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75,
+	0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12,
+	0x1c, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x18, 0x0a,
+	0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07,
+	0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x6d, 0x65, 0x6d, 0x62, 0x65,
+	0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x65, 0x6d,
+	0x62, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x6d, 0x65, 0x6d, 0x62, 0x65,
+	0x72, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x05, 0x20, 0x03, 0x28, 0x03,
+	0x52, 0x0f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x4c, 0x69, 0x73,
+	0x74, 0x12, 0x24, 0x0a, 0x0d, 0x69, 0x73, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x54, 0x72, 0x69,
+	0x61, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x69, 0x73, 0x4d, 0x65, 0x6d, 0x62,
+	0x65, 0x72, 0x54, 0x72, 0x69, 0x61, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x6f, 0x77, 0x65, 0x72,
+	0x54, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x70, 0x6f, 0x77, 0x65,
+	0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x50,
+	0x6f, 0x77, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x6d, 0x65, 0x6d, 0x62,
+	0x65, 0x72, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x73, 0x53, 0x75, 0x62,
+	0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x69, 0x73, 0x53,
+	0x75, 0x62, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x4b, 0x65,
+	0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6d,
+	0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x65,
+	0x6e, 0x74, 0x4e, 0x75, 0x6d, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x65, 0x6e, 0x74,
+	0x4e, 0x75, 0x6d, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x72, 0x6f, 0x4e, 0x75, 0x6d, 0x18, 0x0c, 0x20,
+	0x01, 0x28, 0x03, 0x52, 0x06, 0x70, 0x72, 0x6f, 0x4e, 0x75, 0x6d, 0x12, 0x1a, 0x0a, 0x08, 0x64,
+	0x61, 0x69, 0x6c, 0x79, 0x4e, 0x75, 0x6d, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x64,
+	0x61, 0x69, 0x6c, 0x79, 0x4e, 0x75, 0x6d, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x75, 0x73, 0x74, 0x6f,
+	0x6d, 0x65, 0x72, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x75, 0x73, 0x74,
+	0x6f, 0x6d, 0x65, 0x72, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x0f, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x64, 0x18,
+	0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x75, 0x73, 0x65, 0x64, 0x22, 0xb2, 0x01, 0x0a, 0x08,
+	0x45, 0x6e, 0x74, 0x6e, 0x69, 0x63, 0x68, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74,
+	0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73,
+	0x12, 0x1c, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x18,
+	0x0a, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52,
+	0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x6f, 0x77, 0x65,
+	0x72, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x70,
+	0x6f, 0x77, 0x65, 0x72, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x73,
+	0x45, 0x6e, 0x74, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a,
+	0x69, 0x73, 0x45, 0x6e, 0x74, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x73,
+	0x4e, 0x65, 0x77, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x69, 0x73, 0x4e, 0x65, 0x77,
+	0x22, 0xf5, 0x02, 0x0a, 0x03, 0x45, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09,
+	0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52,
+	0x09, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x65, 0x6e,
+	0x74, 0x41, 0x75, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28,
+	0x03, 0x52, 0x0d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
+	0x12, 0x24, 0x0a, 0x0d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x74, 0x68, 0x52, 0x65, 0x61, 0x73, 0x6f,
+	0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x74, 0x68,
+	0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x65, 0x6e, 0x74, 0x53, 0x75, 0x62,
+	0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x65, 0x6e,
+	0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x30, 0x0a, 0x13, 0x65, 0x6e,
+	0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65,
+	0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x65, 0x6e, 0x74, 0x53, 0x75, 0x62, 0x73,
+	0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b,
+	0x70, 0x6f, 0x77, 0x65, 0x72, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28,
+	0x03, 0x52, 0x0b, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x24,
+	0x0a, 0x0d, 0x64, 0x65, 0x70, 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x18,
+	0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x64, 0x65, 0x70, 0x74, 0x53, 0x75, 0x62, 0x73, 0x63,
+	0x72, 0x69, 0x62, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x47,
+	0x44, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65,
+	0x47, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x79, 0x56, 0x69, 0x70, 0x18, 0x0a, 0x20, 0x01,
+	0x28, 0x03, 0x52, 0x06, 0x62, 0x75, 0x79, 0x56, 0x69, 0x70, 0x12, 0x1c, 0x0a, 0x09, 0x62, 0x75,
+	0x79, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x62,
+	0x75, 0x79, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x22, 0xa2, 0x01, 0x0a, 0x04, 0x46, 0x72, 0x65,
 	0x65, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x73, 0x46, 0x72, 0x65, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
 	0x08, 0x52, 0x06, 0x69, 0x73, 0x46, 0x72, 0x65, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x66, 0x72, 0x65,
 	0x65, 0x48, 0x61, 0x73, 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x66,

+ 13 - 2
rpc/powerCheck.proto

@@ -13,9 +13,11 @@ message Resp {
 message CheckReq{
 	string appid =1;
 	string userid =2; //mongodb用户id
-	int64 base_user_id =3;//base_user用户id
-	int64 account_id =4;//账户id
+	int64 baseUserId =3;//base_user用户id
+	int64 accountId =4;//账户id
+	int64 entId =5;//
 }
+
 message CheckResp {
     string error_msg = 1;
     int64 error_code = 2;
@@ -52,6 +54,12 @@ message Member {
     int64 memberPower = 8; //是否分配了大会员;0:否 1:是
 	int64 isSubCount =9;//是否是子账号 0否 1是
 	int64 maxKeyLength = 10;//最大关键词数量限制
+	int64 entNum = 11;//企业情报监控 企业中标动态数量     
+	int64	proNum =12;//项目进度监控数量
+	int64 dailyNum =13;//结构化数据(单日限量包数量)
+	int64 customers =14;//潜在客户数量
+	string pid  =15;  //主帐号id
+	bool used  =16; //是否使用过大会员初始化   
 }
 
 //商机管理相关
@@ -61,6 +69,7 @@ message Entniche {
 	int64 endTime = 3; //结束时间戳
 	int64 powerSource=4; //商机管理权限开通来源;1:赠送的商机管理服务
 	int64 isEntPower=5; //是否分配权限;0:未分配,1:已分配
+	int64 isNew=6;        //是否是新版商机管理 0不是 1是
 }
 
 //企业相关
@@ -74,6 +83,8 @@ message Ent {
     int64 powerSource = 7; //商机管理权限开通来源;1:赠送的商机管理服务
     int64 deptSubscribe = 8; //各部门是否可以自行订阅;0:否 1:是
     bool privateGD = 9; //广东移动DICT 用户,用于查看画像
+	int64 buyVip=10;  //是否购买超级订阅
+	int64 buyMember =11; //是否购买大会员
 }
 
 //免费权益相关

+ 7 - 9
rpc/powercheck.go

@@ -4,13 +4,11 @@ import (
 	"flag"
 	"fmt"
 
-	"rpc/internal/config"
-	"rpc/internal/server"
-	"rpc/internal/svc"
-	"rpc/pb"
+	"bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/rpc/internal/server"
+	"bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/rpc/internal/svc"
+	"bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/rpc/pb"
 
 	IC "bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/rpc/init"
-	"github.com/zeromicro/go-zero/core/conf"
 	"github.com/zeromicro/go-zero/core/service"
 	"github.com/zeromicro/go-zero/zrpc"
 	"google.golang.org/grpc"
@@ -20,18 +18,18 @@ import (
 func main() {
 	flag.Parse()
 
-	ctx := svc.NewServiceContext(c)
+	ctx := svc.NewServiceContext(IC.C)
 	svr := server.NewPowerCheckServer(ctx)
 
-	s := zrpc.MustNewServer(c.RpcServerConf, func(grpcServer *grpc.Server) {
+	s := zrpc.MustNewServer(IC.C.RpcServerConf, func(grpcServer *grpc.Server) {
 		pb.RegisterPowerCheckServer(grpcServer, svr)
 
-		if c.Mode == service.DevMode || c.Mode == service.TestMode {
+		if IC.C.Mode == service.DevMode || IC.C.Mode == service.TestMode {
 			reflection.Register(grpcServer)
 		}
 	})
 	defer s.Stop()
 
-	fmt.Printf("Starting rpc server at %s...\n", c.ListenOn)
+	fmt.Printf("Starting rpc server at %s...\n", IC.C.ListenOn)
 	s.Start()
 }

+ 1 - 1
rpc/powercheck/powercheck.go

@@ -6,7 +6,7 @@ package powercheck
 import (
 	"context"
 
-	"rpc/pb"
+	"bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/rpc/pb"
 
 	"github.com/zeromicro/go-zero/zrpc"
 	"google.golang.org/grpc"

+ 55 - 0
service/coverage

@@ -0,0 +1,55 @@
+mode: set
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/service/power.go:21.48,25.2 1 1
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/service/power.go:28.98,32.42 2 1
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/service/power.go:212.2,212.12 1 0
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/service/power.go:32.42,80.23 26 1
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/service/power.go:83.3,83.123 1 1
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/service/power.go:87.3,87.166 1 1
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/service/power.go:90.3,90.39 1 1
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/service/power.go:94.3,94.139 1 1
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/service/power.go:97.3,100.51 3 1
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/service/power.go:125.3,126.18 2 1
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/service/power.go:199.3,210.4 6 1
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/service/power.go:80.23,82.4 1 0
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/service/power.go:83.123,86.4 2 0
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/service/power.go:87.166,89.4 1 1
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/service/power.go:90.39,92.4 1 0
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/service/power.go:94.139,96.4 1 0
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/service/power.go:100.51,102.38 2 0
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/service/power.go:119.4,122.39 4 0
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/service/power.go:102.38,106.24 4 0
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/service/power.go:106.24,108.6 1 0
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/service/power.go:108.11,108.68 1 0
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/service/power.go:108.68,110.26 2 0
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/service/power.go:110.26,112.7 1 0
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/service/power.go:113.11,113.50 1 0
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/service/power.go:113.50,115.6 1 0
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/service/power.go:115.11,115.30 1 0
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/service/power.go:115.30,117.6 1 0
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/service/power.go:126.18,131.49 2 1
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/service/power.go:142.4,144.89 2 1
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/service/power.go:148.4,149.35 2 1
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/service/power.go:131.49,132.35 1 0
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/service/power.go:132.35,134.64 2 0
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/service/power.go:134.64,136.7 1 0
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/service/power.go:136.12,136.74 1 0
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/service/power.go:136.74,138.7 1 0
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/service/power.go:144.89,146.5 1 0
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/service/power.go:149.35,150.28 1 1
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/service/power.go:196.5,196.110 1 1
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/service/power.go:150.28,151.37 1 1
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/service/power.go:154.6,169.45 13 1
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/service/power.go:180.6,180.128 1 1
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/service/power.go:184.6,184.107 1 1
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/service/power.go:188.6,188.50 1 1
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/service/power.go:151.37,152.15 1 0
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/service/power.go:169.45,170.34 1 0
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/service/power.go:170.34,172.69 2 0
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/service/power.go:172.69,174.9 1 0
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/service/power.go:174.14,174.73 1 0
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/service/power.go:174.73,176.9 1 0
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/service/power.go:180.128,182.7 1 1
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/service/power.go:184.107,186.7 1 0
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/service/power.go:188.50,189.105 1 1
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/service/power.go:189.105,191.8 1 1
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/service/power.go:217.52,221.2 1 1

+ 324 - 0
service/coverage.html

@@ -0,0 +1,324 @@
+
+<!DOCTYPE html>
+<html>
+	<head>
+		<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+		<title>service: Go Coverage Report</title>
+		<style>
+			body {
+				background: black;
+				color: rgb(80, 80, 80);
+			}
+			body, pre, #legend span {
+				font-family: Menlo, monospace;
+				font-weight: bold;
+			}
+			#topbar {
+				background: black;
+				position: fixed;
+				top: 0; left: 0; right: 0;
+				height: 42px;
+				border-bottom: 1px solid rgb(80, 80, 80);
+			}
+			#content {
+				margin-top: 50px;
+			}
+			#nav, #legend {
+				float: left;
+				margin-left: 10px;
+			}
+			#legend {
+				margin-top: 12px;
+			}
+			#nav {
+				margin-top: 10px;
+			}
+			#legend span {
+				margin: 0 5px;
+			}
+			.cov0 { color: rgb(192, 0, 0) }
+.cov1 { color: rgb(128, 128, 128) }
+.cov2 { color: rgb(116, 140, 131) }
+.cov3 { color: rgb(104, 152, 134) }
+.cov4 { color: rgb(92, 164, 137) }
+.cov5 { color: rgb(80, 176, 140) }
+.cov6 { color: rgb(68, 188, 143) }
+.cov7 { color: rgb(56, 200, 146) }
+.cov8 { color: rgb(44, 212, 149) }
+.cov9 { color: rgb(32, 224, 152) }
+.cov10 { color: rgb(20, 236, 155) }
+
+		</style>
+	</head>
+	<body>
+		<div id="topbar">
+			<div id="nav">
+				<select id="files">
+				
+				<option value="file0">bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/service/power.go (64.9%)</option>
+				
+				</select>
+			</div>
+			<div id="legend">
+				<span>not tracked</span>
+			
+				<span class="cov0">not covered</span>
+				<span class="cov8">covered</span>
+			
+			</div>
+		</div>
+		<div id="content">
+		
+		<pre class="file" id="file0" style="display: none">package service
+
+import (
+        "fmt"
+        "log"
+        "strings"
+        "time"
+
+        "app.yhyue.com/moapp/jybase/common"
+        "app.yhyue.com/moapp/jybase/date"
+        "app.yhyue.com/moapp/jybase/redis"
+        "bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/entity"
+)
+
+//权益
+type PowerService struct {
+        *entity.Conn
+}
+
+//
+func NewPower(conn *entity.Conn) *PowerService <span class="cov8" title="1">{
+        return &amp;PowerService{
+                conn,
+        }
+}</span>
+
+//权益相关 userid用户mongodbid baseUserId
+func (this *PowerService) Power(userid string, baseUserId, accountId, entId int64) *entity.Power <span class="cov8" title="1">{
+        //获取权益
+        //大会员状态
+        data, ok := this.Conn.MgoJy.FindById("user", userid, `{"l_vip_starttime":1,"l_vip_endtime":1,"s_phone":1,"s_m_phone":1,i_member_status":1,"i_member_give":1,"s_member_mainid":1,"i_member_sub_status":1,"i_member_trial":1,"i_vip_status":1,"o_vipjy":1,"o_jy":1,"l_registedate":1,"s_myemail":1,"base_user_id":1}`)
+        if ok &amp;&amp; *data != nil &amp;&amp; len(*data) &gt; 0 </span><span class="cov8" title="1">{
+
+                ent := &amp;entity.Ent{}
+                entniche := &amp;entity.Entniche{}
+                vip := &amp;entity.Vip{}
+                member := &amp;entity.Member{}
+                registeDate := common.Int64All((*data)["l_registedate"]) //注册时间
+                //VIP
+                vipStatus := common.Int64All((*data)["i_vip_status"])
+                vipStartTime := common.Int64All((*data)["l_vip_starttime"])
+                vipEndTime := common.Int64All((*data)["l_vip_endtime"])
+                ovipjy := common.ObjToMap((*data)["o_vipjy"])
+                oBuyset := common.ObjToMap((*ovipjy)["o_buyset"])
+                upgrade := common.Int64All((*oBuyset)["oBuyset"])
+                areacount := common.Int64All((*oBuyset)["areacount"])
+                buyerclasscount := common.Int64All((*oBuyset)["buyerclasscount"])
+                vip = &amp;entity.Vip{
+                        Status:          vipStatus,
+                        StartTime:       vipStartTime,
+                        EndTime:         vipEndTime,
+                        Upgrade:         upgrade,
+                        Areacount:       areacount,
+                        Buyerclasscount: buyerclasscount,
+                        MaxKeyLength:    300,
+                        PowerType:       common.Int64All(common.If(vipStatus &gt; 0, 1, 0)),
+                        //TODO 附件下载次数
+                }
+                //免费相关
+                free := &amp;entity.Free{}
+                o_jy, _ := (*data)["o_jy"].(map[string]interface{})
+                a_key, _ := o_jy["a_key"].([]interface{})
+                free.FreeHasKey = len(a_key) &gt; 0
+                //免费用户可查看企业画像次数//免费用户可查看采购单位画像次数//免费用户可以进行附件下载次数
+                freeEntPort, freeBuyerPort, freeFile := FreeExperience(userid)
+                free.FreeEntPort, free.FreeBuyerPort, free.FreeFile = int64(freeEntPort), int64(freeBuyerPort), int64(freeFile)
+                //
+                //子账号被启用
+                i_member_sub_status := common.IntAllDef((*data)["i_member_sub_status"], 0)
+
+                memberStatus := common.Int64All((*data)["i_member_status"])
+                memberStarttime := common.Int64All((*data)["i_member_starttime"])
+                memberEndtime := common.Int64All((*data)["i_member_endtime"])
+                member = &amp;entity.Member{
+                        Status:       memberStatus,
+                        StartTime:    memberStarttime,
+                        EndTime:      memberEndtime,
+                        MaxKeyLength: 300, //最大关键词数量限制
+                }
+                if memberStatus &gt; 0 </span><span class="cov0" title="0">{
+                        member.MemberPower = 1 //是否分配了大会员;0:否 1:是
+                }</span>
+                <span class="cov8" title="1">if (*data)["s_member_mainid"] != nil &amp;&amp; common.ObjToString((*data)["s_member_mainid"]) != "" &amp;&amp; i_member_sub_status &gt; 0 </span><span class="cov0" title="0">{
+                        member.Pid = common.ObjToString((*data)["s_member_mainid"])
+                        member.IsSubCount = 1
+                }</span>
+                <span class="cov8" title="1">if (member.Pid != "" &amp;&amp; common.IntAllDef((*data)["i_member_sub_status"], 0) == 1) || this.Conn.MgoJy.Count("member", map[string]interface{}{"userid": userid}) &gt; 0 </span><span class="cov8" title="1">{
+                        member.Used = true
+                }</span>
+                <span class="cov8" title="1">if (*data)["i_member_trial"] != nil </span><span class="cov0" title="0">{
+                        member.IsMemberTrial = 1
+                }</span>
+                //获取大会员版本名称 //TODO 自定义有问题
+                <span class="cov8" title="1">if combo := this.Conn.Mysql.SelectBySql(`select s_name from bigmember_combo where id=?`, memberStatus); combo != nil &amp;&amp; len(*combo) &gt; 0 </span><span class="cov0" title="0">{
+                        member.MemberName = common.ObjToString((*combo)[0]["s_name"])
+                }</span>
+                <span class="cov8" title="1">memberServiceMap := map[int64]bool{}
+                //获取大会员相关操作
+                serviceList := this.Conn.Mysql.Find("bigmember_service_user", map[string]interface{}{"s_userid": userid, "i_status": 0}, "DISTINCT(s_serviceid),i_frequency", "", -1, -1)
+                if serviceList != nil &amp;&amp; len(*serviceList) != 0 </span><span class="cov0" title="0">{
+                        pCount, eCount, dailyNum, customers := 0, 0, 0, 10
+                        for _, item := range *serviceList </span><span class="cov0" title="0">{
+                                serviceid := common.Int64All(item["s_serviceid"])
+                                memberServiceMap[serviceid] = true
+                                member.MemberPowerList = append(member.MemberPowerList, serviceid)
+                                if serviceid == 14 </span><span class="cov0" title="0">{ //项目数量
+                                        pCount = common.IntAll(item["i_frequency"])
+                                }</span> else<span class="cov0" title="0"> if serviceid == 4 || serviceid == 12 || serviceid == 13 </span><span class="cov0" title="0">{ //企业情报监控 企业中标动态
+                                        tEcount := common.IntAll(item["i_frequency"])
+                                        if tEcount &gt; eCount </span><span class="cov0" title="0">{
+                                                eCount = tEcount
+                                        }</span>
+                                } else<span class="cov0" title="0"> if serviceid == 17 || serviceid == 18 </span><span class="cov0" title="0">{ //每日数据包
+                                        dailyNum = common.IntAll(item["i_frequency"])
+                                }</span> else<span class="cov0" title="0"> if serviceid == 7 </span><span class="cov0" title="0">{ //潜在客户 关注客户
+                                        customers = common.IntAll(item["i_frequency"])
+                                }</span>
+                        }
+                        <span class="cov0" title="0">member.EntNum = int64(eCount)
+                        member.ProNum = int64(pCount)
+                        member.DailyNum = int64(dailyNum)
+                        member.Customers = int64(customers)</span>
+                }
+                //
+                <span class="cov8" title="1">phone, _ := common.If((*data)["s_phone"] != nil, (*data)["s_phone"], (*data)["s_m_phone"]).(string)
+                if phone != "" </span><span class="cov8" title="1">{
+                        //用于判断是否含有企业主体的超级订阅、大会员服务
+                        epowerData := this.Conn.Mysql.SelectBySql(`SELECT c.product_type FROM entniche_user a INNER JOIN entniche_power b 
+                                                                                         INNER JOIN entniche_wait_empower c 
+                                                                                         ON a.id =b.ent_user_id  AND c.id = b.wait_empower_id WHERE a.phone =? AND c.end_time &gt;?`, phone, time.Now().Format(date.Date_Full_Layout))
+                        if epowerData != nil &amp;&amp; len(*epowerData) &gt; 0 </span><span class="cov0" title="0">{
+                                for _, v := range *epowerData </span><span class="cov0" title="0">{
+                                        product_type := common.ObjToString(v["product_type"])
+                                        if strings.Contains(product_type, entity.ProductType_vip) </span><span class="cov0" title="0">{
+                                                vip.PowerType = 2
+                                        }</span> else<span class="cov0" title="0"> if strings.Contains(product_type, entity.ProductType_member) </span><span class="cov0" title="0">{
+                                                member.PowerType = 2
+                                        }</span>
+                                }
+                        }
+                        //免费用户画像和附件下载权限
+                        <span class="cov8" title="1">o_jy := common.ObjToMap((*data)["o_jy"])
+                        //IsNewFreeTimeCell dev3.6.4版本之前发了个紧急版本处理老用户订阅问题,i_newfree字段必须用户选择地区才能生成,不能作为判断是否是新用户得唯一标识,在此版本添加了常量:IsNewFreeTimeCell作为判断标准;--ws
+                        if common.IntAll((*o_jy)["i_newfree"]) &gt; 0 || entity.IsNewFreeTimeCell &lt; registeDate </span><span class="cov0" title="0">{
+                                free.IsUpgrade = true //新免费用户
+                        }</span>
+                        //查询是否是商机管理付费用户
+                        <span class="cov8" title="1">res := this.Conn.Mysql.SelectBySql(`SELECT i. STATUS AS status, i.isNew, i.power_source, r.role_id, u.power, i.name,i.id,i.startdate,i.enddate,i.auth_status,i.auth_reason,i.dept_subscribe FROM (entniche_user u LEFT JOIN entniche_user_role r ON r.user_id = u.id ) LEFT JOIN entniche_info i ON u.ent_id = i.id WHERE u.phone = ? and i.id = ? ORDER BY i. STATUS DESC, i.auth_status DESC`, phone, entId)
+                        if res != nil &amp;&amp; len(*res) &gt; 0 </span><span class="cov8" title="1">{
+                                for _, v := range *res </span><span class="cov8" title="1">{
+                                        if common.IntAll(v["id"]) == 0 </span><span class="cov0" title="0">{
+                                                continue</span>
+                                        }
+                                        <span class="cov8" title="1">entniche.IsNew = common.Int64All(v["isNew"])
+                                        entniche.Status = common.Int64All(v["status"])
+                                        entniche.IsEntPower = common.Int64All(v["power"])
+                                        entniche.PowerSource = common.Int64All(v["power_source"])
+                                        entniche.StartTime = common.Int64All(v["startdate"])
+                                        entniche.EndTime = common.Int64All(v["enddate"])
+
+                                        //
+                                        ent.Name = common.ObjToString((*res)[0]["name"])
+                                        ent.EntRoleId = common.Int64All(v["role_id"])
+                                        ent.EntAuthStatus = common.Int64All(v["auth_status"])
+                                        ent.EntAuthReason = common.ObjToString(v["auth_reason"])
+                                        ent.DeptSubscribe = common.Int64All(v["dept_subscribe"])
+                                        //判断企业是否购买企业版相关
+                                        eweData := this.Conn.Mysql.SelectBySql(`select * from entniche_wait_empower where ent_id=? and end_time&gt;?`, entId, time.Now().Format(date.Date_Full_Layout))
+                                        if eweData != nil &amp;&amp; len(*eweData) &gt; 0 </span><span class="cov0" title="0">{
+                                                for _, v := range *eweData </span><span class="cov0" title="0">{
+                                                        product_type := common.ObjToString(v["product_type"])
+                                                        if strings.Contains(product_type, entity.ProductType_member) </span><span class="cov0" title="0">{
+                                                                ent.BuyMember = 1
+                                                        }</span> else<span class="cov0" title="0"> if strings.Contains(product_type, entity.ProductType_vip) </span><span class="cov0" title="0">{
+                                                                ent.BuyVip = 1
+                                                        }</span>
+                                                }
+                                        }
+                                        //企业管理员
+                                        <span class="cov8" title="1">if ent.EntRoleId == 1 &amp;&amp; ((ent.BuyMember == 1 || ent.BuyVip == 1) || (entniche.Status == 1 &amp;&amp; entniche.PowerSource == 0)) </span><span class="cov8" title="1">{
+                                                ent.EntSubscribeManager = 1
+                                        }</span>
+                                        //部门管理员
+                                        <span class="cov8" title="1">if ent.EntRoleId == 2 &amp;&amp; entniche.Status == 1 &amp;&amp; entniche.PowerSource == 0 &amp;&amp; ent.DeptSubscribe == 1 </span><span class="cov0" title="0">{
+                                                ent.EntSubscribeManager = 1
+                                        }</span>
+                                        //
+                                        <span class="cov8" title="1">if ent.EntRoleId == 1 || ent.EntRoleId == 2 </span><span class="cov8" title="1">{
+                                                if (ent.BuyMember == 1 || ent.BuyVip == 1) || (entniche.Status == 1 &amp;&amp; entniche.PowerSource == 0) </span><span class="cov8" title="1">{
+                                                        ent.EntSubscribe = 1
+                                                }</span>
+                                        }
+                                }
+
+                                //广东移动DICT 用户
+                                <span class="cov8" title="1">ent.PrivateGD = this.Conn.Mysql.CountBySql(`select count(1) from privatedata where phone = ?`, phone) &gt; 0</span>
+                        }
+                }
+                <span class="cov8" title="1">log.Println("vip:", vip)
+                log.Println("member:", member)
+                log.Println("free:", free)
+                log.Println("ent:", ent)
+                log.Println("entniche:", entniche)
+                return &amp;entity.Power{
+                        Vip:      vip,
+                        Member:   member,
+                        Free:     free,
+                        Ent:      ent,
+                        Entniche: entniche,
+                }</span>
+        }
+        <span class="cov0" title="0">return nil</span>
+}
+
+//免费用户体验会员功能权限
+//免费用户在企业画像/采购单位画像/附件下载留资 留资成功后用户才有功能使用次数
+func FreeExperience(userId string) (int, int, int) <span class="cov8" title="1">{
+        return redis.GetInt(entity.PowerCacheDb, fmt.Sprintf(entity.PowerCacheEntPortKey, userId)),
+                redis.GetInt(entity.PowerCacheDb, fmt.Sprintf(entity.PowerCacheBuyerPortKey, userId)),
+                redis.GetInt(entity.PowerCacheDb, fmt.Sprintf(entity.PowerCacheFileKey, userId))
+}</span>
+</pre>
+		
+		</div>
+	</body>
+	<script>
+	(function() {
+		var files = document.getElementById('files');
+		var visible;
+		files.addEventListener('change', onChange, false);
+		function select(part) {
+			if (visible)
+				visible.style.display = 'none';
+			visible = document.getElementById(part);
+			if (!visible)
+				return;
+			files.value = part;
+			visible.style.display = 'block';
+			location.hash = part;
+		}
+		function onChange() {
+			select(files.value);
+			window.scrollTo(0, 0);
+		}
+		if (location.hash != "") {
+			select(location.hash.substr(1));
+		}
+		if (!visible) {
+			select("file0");
+		}
+	})();
+	</script>
+</html>

+ 213 - 9
service/power.go

@@ -1,17 +1,221 @@
 package service
 
-//画像
-type PortraitService struct {
+import (
+	"fmt"
+	"log"
+	"strings"
+	"time"
+
+	"app.yhyue.com/moapp/jybase/common"
+	"app.yhyue.com/moapp/jybase/date"
+	"app.yhyue.com/moapp/jybase/redis"
+	"bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/entity"
+)
+
+//权益
+type PowerService struct {
 	*entity.Conn
 }
 
-var ClearHtml = regexp.MustCompile("<[^>]*>")
-
-// @description   	生成结构体
-// @param     		conn 数据库实例
-// @return    		Portrait 画像实例
-func NewPortrait(conn *entity.Conn) *PortraitService {
-	return &PortraitService{
+//
+func NewPower(conn *entity.Conn) *PowerService {
+	return &PowerService{
 		conn,
 	}
 }
+
+//权益相关 userid用户mongodbid baseUserId
+func (this *PowerService) Power(userid string, baseUserId, accountId, entId int64) *entity.Power {
+	//获取权益
+	//大会员状态
+	data, ok := this.Conn.MgoJy.FindById("user", userid, `{"l_vip_starttime":1,"l_vip_endtime":1,"s_phone":1,"s_m_phone":1,i_member_status":1,"i_member_give":1,"s_member_mainid":1,"i_member_sub_status":1,"i_member_trial":1,"i_vip_status":1,"o_vipjy":1,"o_jy":1,"l_registedate":1,"s_myemail":1,"base_user_id":1}`)
+	if ok && *data != nil && len(*data) > 0 {
+
+		ent := &entity.Ent{}
+		entniche := &entity.Entniche{}
+		vip := &entity.Vip{}
+		member := &entity.Member{}
+		registeDate := common.Int64All((*data)["l_registedate"]) //注册时间
+		//VIP
+		vipStatus := common.Int64All((*data)["i_vip_status"])
+		vipStartTime := common.Int64All((*data)["l_vip_starttime"])
+		vipEndTime := common.Int64All((*data)["l_vip_endtime"])
+		ovipjy := common.ObjToMap((*data)["o_vipjy"])
+		oBuyset := common.ObjToMap((*ovipjy)["o_buyset"])
+		upgrade := common.Int64All((*oBuyset)["oBuyset"])
+		areacount := common.Int64All((*oBuyset)["areacount"])
+		buyerclasscount := common.Int64All((*oBuyset)["buyerclasscount"])
+		vip = &entity.Vip{
+			Status:          vipStatus,
+			StartTime:       vipStartTime,
+			EndTime:         vipEndTime,
+			Upgrade:         upgrade,
+			Areacount:       areacount,
+			Buyerclasscount: buyerclasscount,
+			MaxKeyLength:    300,
+			PowerType:       common.Int64All(common.If(vipStatus > 0, 1, 0)),
+			//TODO 附件下载次数
+		}
+		//免费相关
+		free := &entity.Free{}
+		o_jy, _ := (*data)["o_jy"].(map[string]interface{})
+		a_key, _ := o_jy["a_key"].([]interface{})
+		free.FreeHasKey = len(a_key) > 0
+		//免费用户可查看企业画像次数//免费用户可查看采购单位画像次数//免费用户可以进行附件下载次数
+		freeEntPort, freeBuyerPort, freeFile := FreeExperience(userid)
+		free.FreeEntPort, free.FreeBuyerPort, free.FreeFile = int64(freeEntPort), int64(freeBuyerPort), int64(freeFile)
+		//
+		//子账号被启用
+		i_member_sub_status := common.IntAllDef((*data)["i_member_sub_status"], 0)
+
+		memberStatus := common.Int64All((*data)["i_member_status"])
+		memberStarttime := common.Int64All((*data)["i_member_starttime"])
+		memberEndtime := common.Int64All((*data)["i_member_endtime"])
+		member = &entity.Member{
+			Status:       memberStatus,
+			StartTime:    memberStarttime,
+			EndTime:      memberEndtime,
+			MaxKeyLength: 300, //最大关键词数量限制
+		}
+		if memberStatus > 0 {
+			member.MemberPower = 1 //是否分配了大会员;0:否 1:是
+		}
+		if (*data)["s_member_mainid"] != nil && common.ObjToString((*data)["s_member_mainid"]) != "" && i_member_sub_status > 0 {
+			member.Pid = common.ObjToString((*data)["s_member_mainid"])
+			member.IsSubCount = 1
+		}
+		if (member.Pid != "" && common.IntAllDef((*data)["i_member_sub_status"], 0) == 1) || this.Conn.MgoJy.Count("member", map[string]interface{}{"userid": userid}) > 0 {
+			member.Used = true
+		}
+		if (*data)["i_member_trial"] != nil {
+			member.IsMemberTrial = 1
+		}
+		//获取大会员版本名称 //TODO 自定义有问题
+		if combo := this.Conn.Mysql.SelectBySql(`select s_name from bigmember_combo where id=?`, memberStatus); combo != nil && len(*combo) > 0 {
+			member.MemberName = common.ObjToString((*combo)[0]["s_name"])
+		}
+		memberServiceMap := map[int64]bool{}
+		//获取大会员相关操作
+		serviceList := this.Conn.Mysql.Find("bigmember_service_user", map[string]interface{}{"s_userid": userid, "i_status": 0}, "DISTINCT(s_serviceid),i_frequency", "", -1, -1)
+		if serviceList != nil && len(*serviceList) != 0 {
+			pCount, eCount, dailyNum, customers := 0, 0, 0, 10
+			for _, item := range *serviceList {
+				serviceid := common.Int64All(item["s_serviceid"])
+				memberServiceMap[serviceid] = true
+				member.MemberPowerList = append(member.MemberPowerList, serviceid)
+				if serviceid == 14 { //项目数量
+					pCount = common.IntAll(item["i_frequency"])
+				} else if serviceid == 4 || serviceid == 12 || serviceid == 13 { //企业情报监控 企业中标动态
+					tEcount := common.IntAll(item["i_frequency"])
+					if tEcount > eCount {
+						eCount = tEcount
+					}
+				} else if serviceid == 17 || serviceid == 18 { //每日数据包
+					dailyNum = common.IntAll(item["i_frequency"])
+				} else if serviceid == 7 { //潜在客户 关注客户
+					customers = common.IntAll(item["i_frequency"])
+				}
+			}
+			member.EntNum = int64(eCount)
+			member.ProNum = int64(pCount)
+			member.DailyNum = int64(dailyNum)
+			member.Customers = int64(customers)
+		}
+		//
+		phone, _ := common.If((*data)["s_phone"] != nil, (*data)["s_phone"], (*data)["s_m_phone"]).(string)
+		if phone != "" {
+			//用于判断是否含有企业主体的超级订阅、大会员服务
+			epowerData := this.Conn.Mysql.SelectBySql(`SELECT c.product_type FROM entniche_user a INNER JOIN entniche_power b 
+		 									INNER JOIN entniche_wait_empower c 
+		 									ON a.id =b.ent_user_id  AND c.id = b.wait_empower_id WHERE a.phone =? AND c.end_time >?`, phone, time.Now().Format(date.Date_Full_Layout))
+			if epowerData != nil && len(*epowerData) > 0 {
+				for _, v := range *epowerData {
+					product_type := common.ObjToString(v["product_type"])
+					if strings.Contains(product_type, entity.ProductType_vip) {
+						vip.PowerType = 2
+					} else if strings.Contains(product_type, entity.ProductType_member) {
+						member.PowerType = 2
+					}
+				}
+			}
+			//免费用户画像和附件下载权限
+			o_jy := common.ObjToMap((*data)["o_jy"])
+			//IsNewFreeTimeCell dev3.6.4版本之前发了个紧急版本处理老用户订阅问题,i_newfree字段必须用户选择地区才能生成,不能作为判断是否是新用户得唯一标识,在此版本添加了常量:IsNewFreeTimeCell作为判断标准;--ws
+			if common.IntAll((*o_jy)["i_newfree"]) > 0 || entity.IsNewFreeTimeCell < registeDate {
+				free.IsUpgrade = true //新免费用户
+			}
+			//查询是否是商机管理付费用户
+			res := this.Conn.Mysql.SelectBySql(`SELECT i. STATUS AS status, i.isNew, i.power_source, r.role_id, u.power, i.name,i.id,i.startdate,i.enddate,i.auth_status,i.auth_reason,i.dept_subscribe FROM (entniche_user u LEFT JOIN entniche_user_role r ON r.user_id = u.id ) LEFT JOIN entniche_info i ON u.ent_id = i.id WHERE u.phone = ? and i.id = ? ORDER BY i. STATUS DESC, i.auth_status DESC`, phone, entId)
+			if res != nil && len(*res) > 0 {
+				for _, v := range *res {
+					if common.IntAll(v["id"]) == 0 {
+						continue
+					}
+					entniche.IsNew = common.Int64All(v["isNew"])
+					entniche.Status = common.Int64All(v["status"])
+					entniche.IsEntPower = common.Int64All(v["power"])
+					entniche.PowerSource = common.Int64All(v["power_source"])
+					entniche.StartTime = common.Int64All(v["startdate"])
+					entniche.EndTime = common.Int64All(v["enddate"])
+
+					//
+					ent.Name = common.ObjToString((*res)[0]["name"])
+					ent.EntRoleId = common.Int64All(v["role_id"])
+					ent.EntAuthStatus = common.Int64All(v["auth_status"])
+					ent.EntAuthReason = common.ObjToString(v["auth_reason"])
+					ent.DeptSubscribe = common.Int64All(v["dept_subscribe"])
+					//判断企业是否购买企业版相关
+					eweData := this.Conn.Mysql.SelectBySql(`select * from entniche_wait_empower where ent_id=? and end_time>?`, entId, time.Now().Format(date.Date_Full_Layout))
+					if eweData != nil && len(*eweData) > 0 {
+						for _, v := range *eweData {
+							product_type := common.ObjToString(v["product_type"])
+							if strings.Contains(product_type, entity.ProductType_member) {
+								ent.BuyMember = 1
+							} else if strings.Contains(product_type, entity.ProductType_vip) {
+								ent.BuyVip = 1
+							}
+						}
+					}
+					//企业管理员
+					if ent.EntRoleId == 1 && ((ent.BuyMember == 1 || ent.BuyVip == 1) || (entniche.Status == 1 && entniche.PowerSource == 0)) {
+						ent.EntSubscribeManager = 1
+					}
+					//部门管理员
+					if ent.EntRoleId == 2 && entniche.Status == 1 && entniche.PowerSource == 0 && ent.DeptSubscribe == 1 {
+						ent.EntSubscribeManager = 1
+					}
+					//
+					if ent.EntRoleId == 1 || ent.EntRoleId == 2 {
+						if (ent.BuyMember == 1 || ent.BuyVip == 1) || (entniche.Status == 1 && entniche.PowerSource == 0) {
+							ent.EntSubscribe = 1
+						}
+					}
+				}
+
+				//广东移动DICT 用户
+				ent.PrivateGD = this.Conn.Mysql.CountBySql(`select count(1) from privatedata where phone = ?`, phone) > 0
+			}
+		}
+		log.Println("vip:", vip)
+		log.Println("member:", member)
+		log.Println("free:", free)
+		log.Println("ent:", ent)
+		log.Println("entniche:", entniche)
+		return &entity.Power{
+			Vip:      vip,
+			Member:   member,
+			Free:     free,
+			Ent:      ent,
+			Entniche: entniche,
+		}
+	}
+	return nil
+}
+
+//免费用户体验会员功能权限
+//免费用户在企业画像/采购单位画像/附件下载留资 留资成功后用户才有功能使用次数
+func FreeExperience(userId string) (int, int, int) {
+	return redis.GetInt(entity.PowerCacheDb, fmt.Sprintf(entity.PowerCacheEntPortKey, userId)),
+		redis.GetInt(entity.PowerCacheDb, fmt.Sprintf(entity.PowerCacheBuyerPortKey, userId)),
+		redis.GetInt(entity.PowerCacheDb, fmt.Sprintf(entity.PowerCacheFileKey, userId))
+}

+ 116 - 0
service/power_test.go

@@ -0,0 +1,116 @@
+package service
+
+import (
+	"log"
+	"reflect"
+	"testing"
+
+	"app.yhyue.com/moapp/jybase/mongodb"
+	"app.yhyue.com/moapp/jybase/mysql"
+	"app.yhyue.com/moapp/jybase/redis"
+	"bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/entity"
+)
+
+var MyConn *entity.Conn // 显式初始化数据库
+
+func init() {
+	InitDb() // 显式初始化数据库
+}
+
+var NewPowerService PowerService
+
+func InitDb() *entity.Conn {
+	//医疗机构配置
+	MysqlConn := &mysql.Mysql{
+		Address:      "192.168.3.11:3366",
+		UserName:     "root",
+		PassWord:     "Topnet123",
+		DBName:       "jianyu",
+		MaxOpenConns: 5,
+		MaxIdleConns: 5,
+	}
+	MysqlConn.Init()
+	//基本信息配置
+	BaseMysqlConn := &mysql.Mysql{
+		Address:      "192.168.3.217:4000",
+		UserName:     "root",
+		PassWord:     "=PDT49#80Z!RVv52_z",
+		DBName:       "base_service",
+		MaxOpenConns: 5,
+		MaxIdleConns: 5,
+	}
+	BaseMysqlConn.Init()
+
+	//mongo初始化
+	MgoJy := &mongodb.MongodbSim{
+		MongodbAddr: "192.168.3.206:27080",
+		Size:        50,
+		DbName:      "qfw",
+	}
+	MgoJy.InitPool()
+
+	MyConn := entity.Conn{
+		Mysql:     MysqlConn,
+		BaseMysql: BaseMysqlConn,
+		MgoJy:     MgoJy,
+	}
+
+	redis.InitRedisBySize("other=192.168.3.206:1712", 100, 30, 300)
+
+	log.Println("初始化成功。。")
+	NewPowerService = *NewPower(&MyConn)
+	return &MyConn
+}
+
+func TestNewPower(t *testing.T) {
+	type args struct {
+		conn *entity.Conn
+	}
+	tests := []struct {
+		name string
+		args args
+		want *PowerService
+	}{
+		// TODO: Add test cases.
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			if got := NewPower(tt.args.conn); !reflect.DeepEqual(got, tt.want) {
+				t.Errorf("NewPower() = %v, want %v", got, tt.want)
+			}
+		})
+	}
+}
+
+func TestPowerService_Power(t *testing.T) {
+	type fields struct {
+		Conn *entity.Conn
+	}
+	type args struct {
+		userid     string
+		baseUserId int64
+		accountId  int64
+	}
+
+	tests := []struct {
+		name   string
+		fields fields
+		args   args
+		want   *entity.Power
+	}{
+		// TODO: Add test cases.
+		{
+			args: args{},
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			this := &PowerService{
+				Conn: NewPowerService.Conn,
+			}
+			if got := this.Power("6103bb722abfa5f4d81bb1d1", 69871, 0, 15051); !reflect.DeepEqual(got, tt.want) {
+				t.Errorf("Power() = %v, want %v", got, tt.want)
+			}
+		})
+	}
+}