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.
109 lines
2.1 KiB
109 lines
2.1 KiB
package operation |
|
|
|
import ( |
|
"context" |
|
"strconv" |
|
"time" |
|
|
|
"go-common/app/interface/main/web-show/conf" |
|
"go-common/app/interface/main/web-show/dao/operation" |
|
opdml "go-common/app/interface/main/web-show/model/operation" |
|
arcrpc "go-common/app/service/main/archive/api/gorpc" |
|
"go-common/library/log" |
|
) |
|
|
|
const ( |
|
_rankCacheLen = 20 |
|
) |
|
|
|
// Service struct |
|
type Service struct { |
|
dao *operation.Dao |
|
arcRPC *arcrpc.Service2 |
|
cache map[string]map[int][]*opdml.Operation |
|
} |
|
|
|
// New init |
|
func New(c *conf.Config) (s *Service) { |
|
s = &Service{ |
|
cache: make(map[string]map[int][]*opdml.Operation, len(opdml.Types)), |
|
} |
|
s.arcRPC = arcrpc.New2(c.RPCClient2.Archive) |
|
s.dao = operation.New(c) |
|
|
|
s.reload() |
|
go s.loadproc() |
|
return |
|
} |
|
|
|
// Notice return notice info |
|
func (s *Service) operation(tp string, rank, num int) (res map[string][]*opdml.Operation) { |
|
res = make(map[string][]*opdml.Operation) |
|
tmp, ok := s.cache[tp] |
|
if ok { |
|
if rank != 0 { |
|
if ns := tmp[rank]; ns != nil { |
|
if len(ns) < num || num < 0 { |
|
num = len(ns) |
|
} |
|
ns = ns[:num] |
|
res[strconv.FormatInt(int64(rank), 10)] = ns |
|
} |
|
} else { |
|
for rk, ns := range tmp { |
|
if ns != nil { |
|
if len(ns) < num || num < 0 { |
|
num = len(ns) |
|
} |
|
ns = ns[:num] |
|
res[strconv.FormatInt(int64(rk), 10)] = ns |
|
} |
|
} |
|
} |
|
|
|
} |
|
return |
|
} |
|
|
|
// reload Service |
|
func (s *Service) reload() { |
|
var ( |
|
tmpT = make(map[string]map[int][]*opdml.Operation) |
|
) |
|
ops, err := s.dao.Operation(context.Background()) |
|
if err != nil { |
|
log.Error("s.reloadNotice error(%v)", err) |
|
return |
|
} |
|
for _, op := range ops { |
|
tmp, ok := tmpT[op.Type] |
|
if !ok { |
|
tmp = make(map[int][]*opdml.Operation) |
|
} |
|
if len(tmp) > _rankCacheLen { |
|
continue |
|
} |
|
tmp[op.Rank] = append(tmp[op.Rank], op) |
|
tmpT[op.Type] = tmp |
|
} |
|
s.cache = tmpT |
|
} |
|
|
|
// loadproc Service |
|
func (s *Service) loadproc() { |
|
for { |
|
s.reload() |
|
time.Sleep(time.Duration(conf.Conf.Reload.Notice)) |
|
} |
|
} |
|
|
|
// Close Service |
|
func (s *Service) Close() { |
|
s.dao.Close() |
|
} |
|
|
|
// Ping Service |
|
func (s *Service) Ping(c context.Context) (err error) { |
|
err = s.dao.Ping(c) |
|
return |
|
}
|
|
|