123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195 |
- package services
- import (
- "encoding/json"
- "errors"
- "hongze/hongze_cygx/models"
- "hongze/hongze_cygx/utils"
- "math"
- "strconv"
- "strings"
- "sync"
- )
- // GetMicroRoadShowPageList 获取微路演列表
- func GetMicroRoadShowPageList(pageSize, currentIndex, audioId, videoId int, keywords string) (respList []*models.MicroRoadShowPageList, total int, err error) {
- var e error
- // 根据每页数据量获取音视频配比
- audioRatio, videoRatio, audioPageNum, videoPageNum, sliceNum, e := getMicroRoadShowDataRatio(pageSize)
- if e != nil {
- err = errors.New("获取微路演列表数据音视频配比失败, Err: " + e.Error())
- return
- }
- audioTotal := 0
- videoTotal := 0
- audioList := make([]*models.MicroRoadShowPageList, 0)
- videoList := make([]*models.MicroRoadShowPageList, 0)
- if keywords != "" {
- keywords = "%" + keywords + "%"
- }
- // 查询指定音频/视频时, 调整比例为1方便后面组合数据
- if audioId > 0 || videoId > 0 {
- audioRatio = 1
- videoRatio = 1
- }
- wg := sync.WaitGroup{}
- wg.Add(2)
- // 分页查询音频
- go func() {
- defer wg.Done()
- // 如果筛选条件为指定视频ID则不做音频查询
- if videoId > 0 {
- return
- }
- var audioCond string
- var audioPars []interface{}
- if keywords != "" {
- audioCond += ` AND a.voice_name LIKE ? OR b.label LIKE ?`
- audioPars = append(audioPars, keywords, keywords)
- }
- if audioId > 0 {
- audioCond += ` AND a.activity_voice_id = ?`
- audioPars = append(audioPars, audioId)
- }
- audioStartSize := 0
- if currentIndex > 1 {
- audioStartSize = (currentIndex - 1) * audioPageNum
- }
- audioTotal, audioList, e = models.GetMicroRoadShowAudioPageList(audioStartSize, audioPageNum, audioCond, audioPars)
- }()
- // 分页查询视频
- go func() {
- defer wg.Done()
- // 如果筛选条件为指定音频ID则不做视频查询
- if audioId > 0 {
- return
- }
- var videoCond string
- var videoPars []interface{}
- if keywords != "" {
- videoCond += ` AND video_name LIKE ?`
- videoPars = append(videoPars, keywords)
- }
- if videoId > 0 {
- videoCond += ` AND video_id = ?`
- videoPars = append(videoPars, videoId)
- }
- videoStartSize := 0
- if currentIndex > 1 {
- videoStartSize = (currentIndex - 1) * videoPageNum
- }
- videoTotal, videoList, e = models.GetMicroRoadShowVideoPageList(videoStartSize, audioPageNum, videoCond, videoPars)
- }()
- wg.Wait()
- if e != nil {
- err = errors.New("获取微路演音视频列表失败, Err: " + e.Error())
- return
- }
- // 按比例组合列表
- audioLen := len(audioList)
- videoLen := len(videoList)
- for i := 0; i < sliceNum; i++ {
- // 音频
- a := i * audioRatio // 0 4 8 12
- oa := a + audioRatio // 4 8 12 16
- if oa <= audioLen {
- for k1 := a; k1 < oa; k1++ {
- respList = append(respList, audioList[k1])
- }
- }
- // 视频
- b := i * videoRatio // 0 1 2 3
- ob := b + videoRatio // 1 2 3 4
- if ob <= videoLen {
- for k2 := b; k2 < ob; k2++ {
- respList = append(respList, videoList[k2])
- }
- }
- }
- total = audioTotal + videoTotal
- return
- }
- // getMicroRoadShowDataRatio 获取微路演列表数据音视频配比
- func getMicroRoadShowDataRatio(pageSize int) (audioRatio, videoRatio, audioPageNum, videoPageNum, sliceNum int, err error) {
- if pageSize <= 0 {
- pageSize = utils.PageSize20
- }
- key := models.MicroRoadShowListDataRatioConfigKey
- config, e := models.GetConfigByCode(key)
- if e != nil && e.Error() != utils.ErrNoRow() {
- err = errors.New("获取微路演列表数据量配置失败, Err: " + e.Error())
- return
- }
- // 默认音频视频展示比例为4:1
- ratio := "4:1"
- if config != nil {
- ratio = config.ConfigValue
- }
- ratioArr := strings.Split(ratio, ":")
- if len(ratioArr) != 2 {
- err = errors.New("微路演列表数据量配比有误")
- return
- }
- audioRatio, e = strconv.Atoi(ratioArr[0])
- if e != nil {
- err = errors.New("微路演列表数据量配比有误")
- return
- }
- videoRatio, e = strconv.Atoi(ratioArr[1])
- if e != nil {
- err = errors.New("微路演列表数据量配比有误")
- return
- }
- totalRatio := audioRatio + videoRatio
- if totalRatio == 0 {
- err = errors.New("微路演列表数据量配比有误")
- return
- }
- // 每比率对应数量(向上取整)
- sliceNum = int(math.Ceil(float64(pageSize) / float64(totalRatio)))
- audioPageNum = audioRatio * sliceNum
- videoPageNum = videoRatio * sliceNum
- return
- }
- // GetMicroRoadShowDefaultImgConfig 获取微路演默认图配置
- func GetMicroRoadShowDefaultImgConfig() (audioMap, videoMap map[int]string, err error) {
- audioMap = make(map[int]string, 0)
- videoMap = make(map[int]string, 0)
- key := models.MicroRoadshowDefaultImgKey
- conf, e := models.GetConfigByCode(key)
- if e != nil {
- err = errors.New("获取微路演默认图配置失败, Err: " + e.Error())
- return
- }
- if conf.ConfigValue == "" {
- err = errors.New("获取微路演默认图配置有误")
- return
- }
- list := new(models.MicroRoadShowDefaultImgList)
- if e = json.Unmarshal([]byte(conf.ConfigValue), &list); e != nil {
- err = errors.New("微路演默认图配置配置值解析失败, Err: " + e.Error())
- return
- }
- audioList := list.Audio
- for i := range audioList {
- audioMap[audioList[i].ChartPermissionId] = audioList[i].ImgUrl
- }
- videoList := list.Video
- for i := range videoList {
- videoMap[videoList[i].ChartPermissionId] = videoList[i].ImgUrl
- }
- return
- }
|