You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
82 lines
2.0 KiB
82 lines
2.0 KiB
package account |
|
|
|
import ( |
|
"context" |
|
"sync" |
|
|
|
"github.com/pkg/errors" |
|
|
|
"go-common/app/admin/main/credit/conf" |
|
creditMDL "go-common/app/admin/main/credit/model" |
|
blocked "go-common/app/admin/main/credit/model/blocked" |
|
accgrpc "go-common/app/service/main/account/api" |
|
"go-common/library/log" |
|
"go-common/library/sync/errgroup" |
|
) |
|
|
|
// Dao is account dao. |
|
type Dao struct { |
|
// grpc |
|
accountClient accgrpc.AccountClient |
|
} |
|
|
|
// New is initial for account . |
|
func New(c *conf.Config) (d *Dao) { |
|
d = &Dao{} |
|
var err error |
|
if d.accountClient, err = accgrpc.NewClient(c.AccClient); err != nil { |
|
panic(errors.WithMessage(err, "Failed to dial account service")) |
|
} |
|
return |
|
} |
|
|
|
// RPCInfo rpc info get by muti mid . |
|
func (d *Dao) RPCInfo(c context.Context, mid int64) (res *accgrpc.InfoReply, err error) { |
|
arg := &accgrpc.MidReq{Mid: mid} |
|
if res, err = d.accountClient.Info3(c, arg); err != nil { |
|
log.Error("d.accountClient.Info3 error(%v)", err) |
|
} |
|
return |
|
} |
|
|
|
// RPCInfos rpc info get by muti mid . |
|
func (d *Dao) RPCInfos(c context.Context, mids []int64) (res map[int64]*accgrpc.Info, err error) { |
|
var ( |
|
g errgroup.Group |
|
l sync.RWMutex |
|
args *accgrpc.MidsReq |
|
accRes *accgrpc.InfosReply |
|
) |
|
mids = creditMDL.ArrayUnique(mids) |
|
total := len(mids) |
|
pageNum := total / blocked.AccMaxPageSize |
|
if total%blocked.AccMaxPageSize != 0 { |
|
pageNum++ |
|
} |
|
res = make(map[int64]*accgrpc.Info, total) |
|
for i := 0; i < pageNum; i++ { |
|
start := i * blocked.AccMaxPageSize |
|
end := (i + 1) * blocked.AccMaxPageSize |
|
if end > total { |
|
end = total |
|
} |
|
g.Go(func() (err error) { |
|
args = &accgrpc.MidsReq{Mids: mids[start:end]} |
|
if accRes, err = d.accountClient.Infos3(c, args); err != nil { |
|
log.Error("d.accountClient.Infos3(%+v) error(%v)", mids[start:end], err) |
|
err = nil |
|
return |
|
} |
|
for mid, info := range accRes.Infos { |
|
l.Lock() |
|
res[mid] = info |
|
l.Unlock() |
|
} |
|
return |
|
}) |
|
} |
|
if err = g.Wait(); err != nil { |
|
log.Error("g.Wait error(%v)", err) |
|
} |
|
return |
|
}
|
|
|