micro_roadshow.go 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. package services
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "hongze/hongze_cygx/models"
  6. "hongze/hongze_cygx/utils"
  7. "math"
  8. "strconv"
  9. "strings"
  10. "sync"
  11. )
  12. // GetMicroRoadShowPageList 获取微路演列表
  13. func GetMicroRoadShowPageList(pageSize, currentIndex, audioId, videoId int, keywords string) (respList []*models.MicroRoadShowPageList, total int, err error) {
  14. var e error
  15. // 根据每页数据量获取音视频配比
  16. audioRatio, videoRatio, audioPageNum, videoPageNum, sliceNum, e := getMicroRoadShowDataRatio(pageSize)
  17. if e != nil {
  18. err = errors.New("获取微路演列表数据音视频配比失败, Err: " + e.Error())
  19. return
  20. }
  21. audioTotal := 0
  22. videoTotal := 0
  23. audioList := make([]*models.MicroRoadShowPageList, 0)
  24. videoList := make([]*models.MicroRoadShowPageList, 0)
  25. if keywords != "" {
  26. keywords = "%" + keywords + "%"
  27. }
  28. // 查询指定音频/视频时, 调整比例为1方便后面组合数据
  29. if audioId > 0 || videoId > 0 {
  30. audioRatio = 1
  31. videoRatio = 1
  32. }
  33. wg := sync.WaitGroup{}
  34. wg.Add(2)
  35. // 分页查询音频
  36. go func() {
  37. defer wg.Done()
  38. // 如果筛选条件为指定视频ID则不做音频查询
  39. if videoId > 0 {
  40. return
  41. }
  42. var audioCond string
  43. var audioPars []interface{}
  44. if keywords != "" {
  45. audioCond += ` AND a.voice_name LIKE ? OR b.label LIKE ?`
  46. audioPars = append(audioPars, keywords, keywords)
  47. }
  48. if audioId > 0 {
  49. audioCond += ` AND a.activity_voice_id = ?`
  50. audioPars = append(audioPars, audioId)
  51. }
  52. audioStartSize := 0
  53. if currentIndex > 1 {
  54. audioStartSize = (currentIndex - 1) * audioPageNum
  55. }
  56. audioTotal, audioList, e = models.GetMicroRoadShowAudioPageList(audioStartSize, audioPageNum, audioCond, audioPars)
  57. }()
  58. // 分页查询视频
  59. go func() {
  60. defer wg.Done()
  61. // 如果筛选条件为指定音频ID则不做视频查询
  62. if audioId > 0 {
  63. return
  64. }
  65. var videoCond string
  66. var videoPars []interface{}
  67. if keywords != "" {
  68. videoCond += ` AND video_name LIKE ?`
  69. videoPars = append(videoPars, keywords)
  70. }
  71. if videoId > 0 {
  72. videoCond += ` AND video_id = ?`
  73. videoPars = append(videoPars, videoId)
  74. }
  75. videoStartSize := 0
  76. if currentIndex > 1 {
  77. videoStartSize = (currentIndex - 1) * videoPageNum
  78. }
  79. videoTotal, videoList, e = models.GetMicroRoadShowVideoPageList(videoStartSize, audioPageNum, videoCond, videoPars)
  80. }()
  81. wg.Wait()
  82. if e != nil {
  83. err = errors.New("获取微路演音视频列表失败, Err: " + e.Error())
  84. return
  85. }
  86. // 按比例组合列表
  87. audioLen := len(audioList)
  88. videoLen := len(videoList)
  89. for i := 0; i < sliceNum; i++ {
  90. // 音频
  91. a := i * audioRatio // 0 4 8 12
  92. oa := a + audioRatio // 4 8 12 16
  93. if oa <= audioLen {
  94. for k1 := a; k1 < oa; k1++ {
  95. respList = append(respList, audioList[k1])
  96. }
  97. }
  98. // 视频
  99. b := i * videoRatio // 0 1 2 3
  100. ob := b + videoRatio // 1 2 3 4
  101. if ob <= videoLen {
  102. for k2 := b; k2 < ob; k2++ {
  103. respList = append(respList, videoList[k2])
  104. }
  105. }
  106. }
  107. total = audioTotal + videoTotal
  108. return
  109. }
  110. // getMicroRoadShowDataRatio 获取微路演列表数据音视频配比
  111. func getMicroRoadShowDataRatio(pageSize int) (audioRatio, videoRatio, audioPageNum, videoPageNum, sliceNum int, err error) {
  112. if pageSize <= 0 {
  113. pageSize = utils.PageSize20
  114. }
  115. key := models.MicroRoadShowListDataRatioConfigKey
  116. config, e := models.GetConfigByCode(key)
  117. if e != nil && e.Error() != utils.ErrNoRow() {
  118. err = errors.New("获取微路演列表数据量配置失败, Err: " + e.Error())
  119. return
  120. }
  121. // 默认音频视频展示比例为4:1
  122. ratio := "4:1"
  123. if config != nil {
  124. ratio = config.ConfigValue
  125. }
  126. ratioArr := strings.Split(ratio, ":")
  127. if len(ratioArr) != 2 {
  128. err = errors.New("微路演列表数据量配比有误")
  129. return
  130. }
  131. audioRatio, e = strconv.Atoi(ratioArr[0])
  132. if e != nil {
  133. err = errors.New("微路演列表数据量配比有误")
  134. return
  135. }
  136. videoRatio, e = strconv.Atoi(ratioArr[1])
  137. if e != nil {
  138. err = errors.New("微路演列表数据量配比有误")
  139. return
  140. }
  141. totalRatio := audioRatio + videoRatio
  142. if totalRatio == 0 {
  143. err = errors.New("微路演列表数据量配比有误")
  144. return
  145. }
  146. // 每比率对应数量(向上取整)
  147. sliceNum = int(math.Ceil(float64(pageSize) / float64(totalRatio)))
  148. audioPageNum = audioRatio * sliceNum
  149. videoPageNum = videoRatio * sliceNum
  150. return
  151. }
  152. // GetMicroRoadShowDefaultImgConfig 获取微路演默认图配置
  153. func GetMicroRoadShowDefaultImgConfig() (audioMap, videoMap map[int]string, err error) {
  154. audioMap = make(map[int]string, 0)
  155. videoMap = make(map[int]string, 0)
  156. key := models.MicroRoadshowDefaultImgKey
  157. conf, e := models.GetConfigByCode(key)
  158. if e != nil {
  159. err = errors.New("获取微路演默认图配置失败, Err: " + e.Error())
  160. return
  161. }
  162. if conf.ConfigValue == "" {
  163. err = errors.New("获取微路演默认图配置有误")
  164. return
  165. }
  166. list := new(models.MicroRoadShowDefaultImgList)
  167. if e = json.Unmarshal([]byte(conf.ConfigValue), &list); e != nil {
  168. err = errors.New("微路演默认图配置配置值解析失败, Err: " + e.Error())
  169. return
  170. }
  171. audioList := list.Audio
  172. for i := range audioList {
  173. audioMap[audioList[i].ChartPermissionId] = audioList[i].ImgUrl
  174. }
  175. videoList := list.Video
  176. for i := range videoList {
  177. videoMap[videoList[i].ChartPermissionId] = videoList[i].ImgUrl
  178. }
  179. return
  180. }