package translationser import ( "context" "sync" "videoweb/app/api/proto" "videoweb/pub/common/log" "videoweb/pub/common/netutil" "videoweb/pub/models/cfg" "videoweb/pub/models/translationcategorymod" "videoweb/pub/models/translationmod" "videoweb/pub/pubdef" "github.com/robfig/cron/v3" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo/options" ) var ( CacheMgr CacheInfo // skdCron *cron.Cron ) type CacheInfo struct { Lock sync.RWMutex // 读写锁 TranslationData proto.AppTranslationInfo // 导航信息缓存 BottomTranslationData proto.AppTranslationInfo // 底部导航信息缓存 TranslationMap map[int64]proto.TranslationInfo } func init() { skdCron = cron.New(cron.WithSeconds()) // 秒级定时任务 CacheMgr.TranslationData = proto.AppTranslationInfo{} CacheMgr.BottomTranslationData = proto.AppTranslationInfo{} CacheMgr.TranslationMap = make(map[int64]proto.TranslationInfo) } func Start() { ctx := context.Background() UpdateTranslationInfo(ctx) _, _ = skdCron.AddFunc("0 */5 * * * ?", func() { UpdateTranslationInfo(ctx) }) skdCron.Start() } func UpdateTranslationInfo(ctx context.Context) { filter := bson.M{cfg.FN.SysCfg.Id: 1} sysCfg, _ := cfg.FindOneSysCfg(context.Background(), filter) if sysCfg == nil { return } translation := proto.AppTranslationInfo{} bottomTranslation := proto.AppTranslationInfo{} wg := &sync.WaitGroup{} wg.Add(2) var translationCategoryList translationcategorymod.TranslationCategoryList var translationList translationmod.TranslationInfoList go func() { defer wg.Done() categoryFilter := bson.M{ translationcategorymod.FN.TranslationCategory.Status: true, } categoryOpt := &options.FindOptions{} categoryOpt.SetLimit(1000).SetSort(bson.M{translationcategorymod.FN.TranslationCategory.Rank: -1}) translationCategoryList, _ = translationcategorymod.FindManyTranslationCategorys(ctx, categoryFilter, categoryOpt) }() go func() { defer wg.Done() translationFilter := bson.M{ translationmod.FN.TranslationInfo.Status: true, } translationOpt := &options.FindOptions{} translationOpt.SetLimit(1000).SetSort(bson.M{translationmod.FN.TranslationInfo.Rank: -1}) translationList, _ = translationmod.FindManyTranslationInfos(ctx, translationFilter, translationOpt) }() wg.Wait() tempTranslationMap := make(map[int64]proto.TranslationInfo) for _, categoryInfo := range translationCategoryList { categoryTemp := proto.TranslationCategory{ ID: categoryInfo.Id, Name: categoryInfo.Name, Icon: netutil.MergeURL(sysCfg.ImgAppCdn, categoryInfo.Icon), TranslationList: make([]proto.TranslationInfo, 0), CategoryType: categoryInfo.CategoryType, SeoInfo: categoryInfo.SeoInfo, } if categoryTemp.CategoryType == pubdef.TranslationTypeUrl { categoryTemp.UrlValue = categoryInfo.UrlValue } else if categoryInfo.CategoryType == pubdef.TranslationTypeSub { for _, translationInfo := range translationList { if categoryInfo.Id == translationInfo.TransCategoryId { translationTmp := proto.TranslationInfo{ Name: translationInfo.Name, } if translationInfo.IsFriendAds { translationTmp.IsFriendAds = true // 友链广告 获取的时候添加 // TODO:顶部暂不支持 。 continue } else { translationTmp.UrlValue = translationInfo.Link } if translationTmp.UrlValue == "" { continue } tempTranslationMap[translationInfo.Id] = translationTmp categoryTemp.TranslationList = append(categoryTemp.TranslationList, translationTmp) } } } else if categoryInfo.CategoryType == pubdef.TranslationTypeBottom { for _, translationInfo := range translationList { if categoryInfo.Id == translationInfo.TransCategoryId { translationTmp := proto.TranslationInfo{ Name: translationInfo.Name, } if translationInfo.IsFriendAds { translationTmp.IsFriendAds = true // 友链广告 获取的时候添加 } else { translationTmp.UrlValue = translationInfo.Link } tempTranslationMap[translationInfo.Id] = translationTmp categoryTemp.TranslationList = append(categoryTemp.TranslationList, translationTmp) } } bottomTranslation.CategoryList = append(bottomTranslation.CategoryList, categoryTemp) continue } else { continue } translation.CategoryList = append(translation.CategoryList, categoryTemp) } log.Info("", log.Any("categoryInfo.Name", translation.CategoryList)) CacheMgr.Lock.Lock() defer CacheMgr.Lock.Unlock() CacheMgr.TranslationData = translation CacheMgr.BottomTranslationData = bottomTranslation CacheMgr.TranslationMap = tempTranslationMap } func GetTranslationData() proto.AppTranslationInfo { CacheMgr.Lock.RLock() defer CacheMgr.Lock.RUnlock() log.Info("GetTranslationData", log.Any("TranslationData", CacheMgr.TranslationData)) return CacheMgr.TranslationData } func GetTranslationBottomList() proto.AppTranslationInfo { CacheMgr.Lock.RLock() defer CacheMgr.Lock.RUnlock() return CacheMgr.BottomTranslationData } func GetTranslationInfo(id int64) *proto.TranslationInfo { CacheMgr.Lock.RLock() defer CacheMgr.Lock.RUnlock() if v, ok := CacheMgr.TranslationMap[id]; ok { return &v } return nil }