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.
118 lines
2.4 KiB
118 lines
2.4 KiB
package service |
|
|
|
import ( |
|
"context" |
|
"encoding/json" |
|
|
|
"go-common/app/interface/main/dm2/model" |
|
"go-common/library/ecode" |
|
"go-common/library/log" |
|
) |
|
|
|
func (s *Service) subject(c context.Context, tp int32, oid int64) (sub *model.Subject, err error) { |
|
var ( |
|
cache = true |
|
bs []byte |
|
ok bool |
|
) |
|
if bs, ok = s.localCache[keySubject(tp, oid)]; ok { |
|
sub = &model.Subject{} |
|
if err = json.Unmarshal(bs, &sub); err == nil { |
|
return |
|
} |
|
} |
|
if sub, err = s.dao.SubjectCache(c, tp, oid); err != nil { |
|
err = nil |
|
cache = false |
|
} |
|
if sub == nil { |
|
if sub, err = s.dao.Subject(c, tp, oid); err != nil { |
|
return |
|
} |
|
if sub == nil { |
|
sub = &model.Subject{ |
|
Type: tp, |
|
Oid: oid, |
|
} |
|
} |
|
if cache { |
|
s.cache.Do(c, func(ctx context.Context) { |
|
s.dao.AddSubjectCache(ctx, sub) |
|
}) |
|
} |
|
} |
|
if sub.ID == 0 { |
|
err = ecode.NothingFound |
|
return |
|
} |
|
return |
|
} |
|
|
|
func (s *Service) subjects(c context.Context, tp int32, oids []int64) (res map[int64]*model.Subject, err error) { |
|
var ( |
|
cache = true |
|
missed []int64 |
|
missedCache map[int64]*model.Subject |
|
hitedCache map[int64]*model.Subject |
|
) |
|
res = make(map[int64]*model.Subject, len(oids)) |
|
if hitedCache, missed, err = s.dao.SubjectsCache(c, tp, oids); err != nil { |
|
cache = false |
|
} |
|
if len(hitedCache) == 0 { |
|
missed = oids |
|
} |
|
if len(missed) > 0 { |
|
if missedCache, err = s.dao.Subjects(c, tp, missed); err != nil { |
|
return |
|
} |
|
for _, oid := range missed { |
|
sub, ok := missedCache[oid] |
|
if ok { |
|
res[sub.Oid] = sub |
|
} else { |
|
sub = &model.Subject{ |
|
Type: tp, |
|
Oid: oid, |
|
} |
|
} |
|
if cache { |
|
s.cache.Do(c, func(ctx context.Context) { |
|
s.dao.AddSubjectCache(ctx, sub) |
|
}) |
|
} |
|
} |
|
} |
|
for _, hit := range hitedCache { |
|
if hit.ID > 0 { |
|
res[hit.Oid] = hit |
|
} |
|
} |
|
return |
|
} |
|
|
|
// SubjectInfos get dm subject info by oids. |
|
func (s *Service) SubjectInfos(c context.Context, tp int32, plat int8, oids []int64) (res map[int64]*model.SubjectInfo, err error) { |
|
subs, err := s.subjects(c, tp, oids) |
|
if err != nil { |
|
log.Error("s.subjects(%v) error(%v)", oids, err) |
|
return |
|
} |
|
res = make(map[int64]*model.SubjectInfo, len(oids)) |
|
for _, sub := range subs { |
|
subInfo := new(model.SubjectInfo) |
|
if sub.Count > sub.Maxlimit { |
|
subInfo.Count = sub.ACount |
|
} else { |
|
subInfo.Count = sub.Count |
|
} |
|
if s.isRealname(c, sub.Pid, sub.Oid) { |
|
subInfo.Realname = true |
|
} |
|
if sub.State == model.SubStateClosed { |
|
subInfo.Closed = true |
|
} |
|
res[sub.Oid] = subInfo |
|
} |
|
return |
|
}
|
|
|