diff --git a/app/conf/app.yaml b/app/conf/app.yaml index 0e5510f..27d59cc 100644 --- a/app/conf/app.yaml +++ b/app/conf/app.yaml @@ -29,6 +29,7 @@ listenAddr: "25119" origDomain: "https://yuan.bbaazz.me/" trustedProxies: "" bucketVideoAddressV2: "http://139.162.22.207:24996" +versionUrl: "http://139.162.47.194:8089" transactionUrl: "https://bill.ruishengces.com" newPayCenter: appName: "" diff --git a/app/service/configser/announcement.go b/app/service/configser/announcement.go index 9829514..fd35bfd 100644 --- a/app/service/configser/announcement.go +++ b/app/service/configser/announcement.go @@ -1,92 +1,130 @@ package configser import ( + "encoding/json" + "fmt" + "net/http" + "sort" "strconv" + "strings" "videoweb/app/api/proto" "videoweb/app/appg" "videoweb/pub/adcenter" + "videoweb/pub/common/httputil" "videoweb/pub/common/log" "videoweb/pub/common/netutil" "videoweb/pub/storage/proxy" ) -// UpdateAdvitiseDataFromJt 从广告中心拉取福利页广告 -func UpdateAdvitiseDataFromJt() { - config := GetConfigInfo() - var resp proto.AdvitiseData - jtAds, err := adcenter.JtAdvertiseThreeServer(appg.Conf.AdCenter.ApiDomain, appg.Conf.AdCenter.MerchantCode, appg.Conf.AdCenter.AppCode, appg.Conf.AdCenter.AesKey) +// 广告中心应用ID(本站专用) +const advertiseAppId int32 = 12 + +// advertiseInfo 广告中心 /api/stat/advitise/v2/get 的广告条目 +type advertiseInfo struct { + Id int64 `json:"id"` // 广告id + Title string `json:"title"` // 广告标题 + CoverImg string `json:"coverImg"` // 封面 + LocId int32 `json:"locId"` // 位置id + JumpType int32 `json:"jumpType"` // 跳转方式 + Link string `json:"link"` // 链接地址 + Sort int64 `json:"sort"` // 排序 + Tags string `json:"tags"` // 标签 + Remark string `json:"remark"` // 备注描述 +} + +type advertiseReq struct { + AppId int32 `json:"appId"` +} + +type advertiseRes struct { + AdvertiseList []advertiseInfo `json:"advertiseList"` +} + +// fetchAdvertiseList 请求广告中心 /api/stat/advitise/v2/get +func fetchAdvertiseList() (*advertiseRes, error) { + versionUrl := strings.TrimRight(strings.TrimSpace(appg.Conf.VersionUrl), "/") + if versionUrl == "" { + return nil, fmt.Errorf("versionUrl 未配置") + } + url := versionUrl + "/api/stat/advitise/v2/get" + body, _ := json.Marshal(advertiseReq{AppId: advertiseAppId}) + var resp advertiseRes + code, err := httputil.Client().POSTJsonWithJResp(&resp, url, map[string]string{"Content-Type": "application/json"}, body) if err != nil { - log.Error("JtAdvertiseThreeServer error occur", log.E(err)) + return nil, err + } + if code != http.StatusOK { + return nil, fmt.Errorf("response status %d", code) + } + return &resp, nil +} + +// UpdateAdvitiseDataFromJt 从广告中心拉取广告并更新内存缓存,列表为空时重试一次 +func UpdateAdvitiseDataFromJt() { + resp, err := fetchAdvertiseList() + if err != nil { + log.Error("UpdateAdvitiseDataFromJt fetchAdvertiseList fail", log.E(err)) return } - adMap := make(map[string]adcenter.AdCacheInfo) - for _, loc := range jtAds { - pos, err := strconv.Atoi(loc.AdvertiseLocationCode) + if len(resp.AdvertiseList) == 0 { + resp, err = fetchAdvertiseList() if err != nil { - log.Error("广告位置代码错误,必须为数字", log.Any("code", loc.AdvertiseLocationCode)) - continue - } - //if pos < 100001 { - // continue - //} - ads := make([]proxy.AdvitiseInfo, 0) - for _, ad := range loc.AdDetailInfoList { - //extra := ad.GetExtraData() - ads = append(ads, proxy.AdvitiseInfo{ - Id: ad.AdvertiseCode, - Location: int64(pos), - Title: ad.AdvertiseName, - Images: netutil.MergeURL(config.ImgCdn, ad.GetCoverLsj()), - Link: ad.GetRealLink(), - }) - adMap[ad.AdvertiseCode] = adcenter.AdCacheInfo{ - AdvertiseCode: ad.AdvertiseCode, - CustomerCode: ad.CustomerCode, - AdvertiseName: ad.AdvertiseName, - AdvertiseUrl: ad.AdvertiseUrl, - AdvertiseIcon: ad.AdvertiseIcon, - AdvertiseType: ad.AdvertiseType, - AdMode: ad.AdMode, - AppCode: ad.AppCode, - LocationType: ad.LocationType, - AdvertiseDesc: ad.AdvertiseDesc, - PageType: ad.PageType, - StartTimeStamp: ad.StartTimeStamp, - EndTimeStamp: ad.EndTimeStamp, - Sort: ad.Sort, - AdExtData: ad.AdExtData, - DeptCode: loc.DeptCode, - MerchantCode: loc.MerchantCode, - AdvertiseLocationCode: loc.AdvertiseLocationCode, - AdvertiseLocationName: loc.AdvertiseLocationName, - DisplayMode: loc.DisplayMode, - AdvertiseHeight: loc.AdvertiseHeight, - AdvertiseWidth: loc.AdvertiseWidth, - MaterialType: loc.MaterialType, - AdLimit: loc.AdLimit, - } - } - switch pos { - case 1: //弹窗 - resp.DialogList = ads - case 2: // 应用 - - resp.NineGridList = ads - case 3: // 横幅 - resp.DetailbannerList = ads - - case 12: - resp.AList = ads - case 13: - resp.BList = ads + log.Error("UpdateAdvitiseDataFromJt fetchAdvertiseList retry fail", log.E(err)) + return } } + list := resp.AdvertiseList + sort.SliceStable(list, func(i, j int) bool { + if list[i].LocId != list[j].LocId { + return list[i].LocId < list[j].LocId + } + return list[i].Sort < list[j].Sort + }) + + config := GetConfigInfo() + data := proto.AdvitiseData{} + adMap := make(map[string]adcenter.AdCacheInfo, len(list)) + + for _, v := range list { + pos := int64(v.LocId) + info := proxy.AdvitiseInfo{ + Id: strconv.FormatInt(v.Id, 10), + Location: pos, + Title: v.Title, + Images: netutil.MergeURL(config.ImgCdn, strings.TrimLeft(v.CoverImg, "/")), + Link: strings.ReplaceAll(v.Link, "inner://yinseinner/", "yinseinner://"), + } + switch pos { + case 1: + data.DialogList = append(data.DialogList, info) + case 2: + data.NineGridList = append(data.NineGridList, info) + case 3: + data.DetailbannerList = append(data.DetailbannerList, info) + case 12: + data.AList = append(data.AList, info) + case 13: + data.BList = append(data.BList, info) + } + adMap[info.Id] = adcenter.AdCacheInfo{ + AdvertiseCode: info.Id, + AdvertiseName: v.Title, + AdvertiseUrl: v.Link, + AdvertiseIcon: v.CoverImg, + AdvertiseDesc: v.Remark, + Sort: int(v.Sort), + AdvertiseLocationCode: strconv.FormatInt(pos, 10), + AdvertiseLocationName: v.Title, + } + } + CacheMgr.Lock.Lock() defer CacheMgr.Lock.Unlock() - CacheMgr.Advitise = resp + CacheMgr.Advitise = data CacheMgr.AdvitiseMap = adMap } +// GetAdvertiseLocation 按广告ID反查广告详情 func GetAdvertiseLocation(adverId string) (res adcenter.AdCacheInfo) { CacheMgr.Lock.RLock() defer CacheMgr.Lock.RUnlock()