micro_roadshow.go 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  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. // 活动已发布且已结束
  45. audioCond += ` AND b.publish_status = 1 AND b.active_state = 3`
  46. if keywords != "" {
  47. audioCond += ` AND a.voice_name LIKE ? OR b.label LIKE ?`
  48. audioPars = append(audioPars, keywords, keywords)
  49. }
  50. if audioId > 0 {
  51. audioCond += ` AND a.activity_voice_id = ?`
  52. audioPars = append(audioPars, audioId)
  53. }
  54. audioStartSize := 0
  55. if currentIndex > 1 {
  56. audioStartSize = (currentIndex - 1) * audioPageNum
  57. }
  58. audioTotal, audioList, e = models.GetMicroRoadShowAudioPageList(audioStartSize, audioPageNum, audioCond, audioPars)
  59. }()
  60. // 分页查询视频
  61. go func() {
  62. defer wg.Done()
  63. // 如果筛选条件为指定音频ID则不做视频查询
  64. if audioId > 0 {
  65. return
  66. }
  67. var videoCond string
  68. var videoPars []interface{}
  69. if keywords != "" {
  70. videoCond += ` AND video_name LIKE ?`
  71. videoPars = append(videoPars, keywords)
  72. }
  73. if videoId > 0 {
  74. videoCond += ` AND video_id = ?`
  75. videoPars = append(videoPars, videoId)
  76. }
  77. videoStartSize := 0
  78. if currentIndex > 1 {
  79. videoStartSize = (currentIndex - 1) * videoPageNum
  80. }
  81. videoTotal, videoList, e = models.GetMicroRoadShowVideoPageList(videoStartSize, videoPageNum, videoCond, videoPars)
  82. }()
  83. wg.Wait()
  84. if e != nil {
  85. err = errors.New("获取微路演音视频列表失败, Err: " + e.Error())
  86. return
  87. }
  88. // 按比例组合列表
  89. audioNum := 0
  90. videoNum := 0
  91. audioLen := len(audioList)
  92. videoLen := len(videoList)
  93. for i := 0; i < sliceNum; i++ {
  94. // 音频-每次取对应比例的数据直至取完
  95. for a := 0; a < audioRatio; a++ {
  96. if audioNum < audioLen {
  97. respList = append(respList, audioList[audioNum])
  98. audioNum += 1
  99. }
  100. }
  101. // 视频
  102. for b := 0; b < videoRatio; b++ {
  103. if videoNum < videoLen {
  104. respList = append(respList, videoList[videoNum])
  105. videoNum += 1
  106. }
  107. }
  108. }
  109. total = audioTotal + videoTotal
  110. return
  111. }
  112. // getMicroRoadShowDataRatio 获取微路演列表数据音视频配比
  113. func getMicroRoadShowDataRatio(pageSize int) (audioRatio, videoRatio, audioPageNum, videoPageNum, sliceNum int, err error) {
  114. if pageSize <= 0 {
  115. pageSize = utils.PageSize20
  116. }
  117. key := models.MicroRoadShowListDataRatioConfigKey
  118. config, e := models.GetConfigByCode(key)
  119. if e != nil && e.Error() != utils.ErrNoRow() {
  120. err = errors.New("获取微路演列表数据量配置失败, Err: " + e.Error())
  121. return
  122. }
  123. // 默认音频视频展示比例为4:1
  124. ratio := "4:1"
  125. if config != nil {
  126. ratio = config.ConfigValue
  127. }
  128. ratioArr := strings.Split(ratio, ":")
  129. if len(ratioArr) != 2 {
  130. err = errors.New("微路演列表数据量配比有误")
  131. return
  132. }
  133. audioRatio, e = strconv.Atoi(ratioArr[0])
  134. if e != nil {
  135. err = errors.New("微路演列表数据量配比有误")
  136. return
  137. }
  138. videoRatio, e = strconv.Atoi(ratioArr[1])
  139. if e != nil {
  140. err = errors.New("微路演列表数据量配比有误")
  141. return
  142. }
  143. totalRatio := audioRatio + videoRatio
  144. if totalRatio == 0 {
  145. err = errors.New("微路演列表数据量配比有误")
  146. return
  147. }
  148. // 每比率对应数量(向上取整)
  149. sliceNum = int(math.Ceil(float64(pageSize) / float64(totalRatio)))
  150. audioPageNum = audioRatio * sliceNum
  151. videoPageNum = videoRatio * sliceNum
  152. return
  153. }
  154. // GetMicroRoadShowDefaultImgConfig 获取微路演默认图配置
  155. func GetMicroRoadShowDefaultImgConfig() (audioMap, videoMap map[int]string, err error) {
  156. audioMap = make(map[int]string, 0)
  157. videoMap = make(map[int]string, 0)
  158. key := models.MicroRoadshowDefaultImgKey
  159. conf, e := models.GetConfigByCode(key)
  160. if e != nil {
  161. err = errors.New("获取微路演默认图配置失败, Err: " + e.Error())
  162. return
  163. }
  164. if conf.ConfigValue == "" {
  165. err = errors.New("获取微路演默认图配置有误")
  166. return
  167. }
  168. list := new(models.MicroRoadShowDefaultImgList)
  169. if e = json.Unmarshal([]byte(conf.ConfigValue), &list); e != nil {
  170. err = errors.New("微路演默认图配置配置值解析失败, Err: " + e.Error())
  171. return
  172. }
  173. audioList := list.Audio
  174. for i := range audioList {
  175. audioMap[audioList[i].ChartPermissionId] = audioList[i].ImgUrl
  176. }
  177. videoList := list.Video
  178. for i := range videoList {
  179. videoMap[videoList[i].ChartPermissionId] = videoList[i].ImgUrl
  180. }
  181. return
  182. }
  183. // GetHomeNewestList 获取首页最新列表
  184. func GetHomeNewestList(userId, companyId, startSize, pageSize int, condition string, pars []interface{}) (resp []*models.HomeArticle, total int, err error) {
  185. resp = make([]*models.HomeArticle, 0)
  186. unionList, e := models.GetHomeNewestListUnionList(condition, pars, startSize, pageSize)
  187. if e != nil {
  188. err = errors.New("获取首页最新列表失败")
  189. return
  190. }
  191. unionTotal, e := models.GetHomeNewestListUnionCount(condition, pars)
  192. if e != nil {
  193. err = errors.New("获取首页最新列表总数失败")
  194. return
  195. }
  196. total = unionTotal
  197. // 用户权限
  198. authInfo, permissionArr, e := GetUserRaiPermissionInfo(userId, companyId)
  199. if e != nil {
  200. err = errors.New("获取用户权限失败, Err: " + e.Error())
  201. return
  202. }
  203. // 获取默认图配置
  204. audioMap, videoMap, e := GetMicroRoadShowDefaultImgConfig()
  205. if e != nil {
  206. err = errors.New("获取微路演默认图配置失败, Err: " + e.Error())
  207. return
  208. }
  209. // 此处没有直接使用HomeArticle结构体而是多加了一层, 纯粹是为了方便前端区分纪要和微路演音频=_=!
  210. for _, v := range unionList {
  211. item := new(models.HomeArticle)
  212. item.HomeType = v.HomeType
  213. // 纪要
  214. if item.HomeType == 0 {
  215. item.ArticleId = v.ArticleId
  216. item.Title = v.Title
  217. item.TitleEn = v.TitleEn
  218. item.UpdateFrequency = v.UpdateFrequency
  219. item.CreateDate = v.CreateDate
  220. item.PublishDate = v.PublishDate
  221. item.Body = v.Body
  222. item.BodyHtml = v.BodyHtml
  223. item.Abstract = v.Abstract
  224. item.CategoryName = v.CategoryName
  225. item.SubCategoryName = v.SubCategoryName
  226. item.ExpertBackground = v.ExpertBackground
  227. item.IsResearch = v.IsResearch
  228. item.Pv = v.Pv
  229. item.ImgUrlPc = v.ImgUrlPc
  230. item.CategoryId = v.CategoryId
  231. item.HttpUrl = v.HttpUrl
  232. item.IsNeedJump = v.IsNeedJump
  233. item.Source = v.Source
  234. item.Annotation = v.Annotation
  235. }
  236. // 音频
  237. if v.HomeType == 1 {
  238. ad := new(models.MicroAudioUnionList)
  239. ad.Id = v.Id
  240. ad.AudioTitle = v.AudioTitle
  241. ad.AudioResourceUrl = v.AudioResourceUrl
  242. ad.AudioType = v.AudioType
  243. ad.AudioPublishTime = utils.StrTimeToTime(v.AudioPublishTime).Format(utils.FormatDate)
  244. ad.AudioImgUrl = v.AudioImgUrl
  245. ad.AudioChartPermissionId = v.AudioChartPermissionId
  246. ad.AudioChartPermissionName = v.AudioChartPermissionName
  247. ad.AudioPlaySeconds = v.AudioPlaySeconds
  248. ad.AudioPlaySeconds = v.AudioPlaySeconds
  249. ad.AudioActivityId = v.AudioActivityId
  250. item.MicroAudio = ad
  251. // 默认图
  252. if ad.AudioImgUrl == "" {
  253. if ad.AudioType == 1 {
  254. ad.AudioImgUrl = audioMap[ad.AudioChartPermissionId]
  255. } else {
  256. ad.AudioImgUrl = videoMap[ad.AudioChartPermissionId]
  257. }
  258. }
  259. // 权限
  260. au := new(models.UserPermissionAuthInfo)
  261. au.SellerName = authInfo.SellerName
  262. au.SellerMobile = authInfo.SellerMobile
  263. au.HasPermission = authInfo.HasPermission
  264. if authInfo.HasPermission == 1 {
  265. // 非宏观权限进一步判断是否有权限
  266. if ad.AudioChartPermissionId != utils.HONG_GUAN_ID && !utils.InArrayByStr(permissionArr, ad.AudioChartPermissionName) {
  267. au.HasPermission = 2
  268. }
  269. }
  270. if authInfo.HasPermission == 2 {
  271. if ad.AudioType == 1 {
  272. au.PopupMsg = UserPermissionPopupMsgCallActivity
  273. } else {
  274. au.PopupMsg = UserPermissionPopupMsgCallMicroVideo
  275. }
  276. }
  277. if authInfo.HasPermission == 3 {
  278. if ad.AudioType == 1 {
  279. au.PopupMsg = UserPermissionPopupMsgApplyActivity
  280. } else {
  281. au.PopupMsg = UserPermissionPopupMsgApplyMicroVideo
  282. }
  283. }
  284. ad.AuthInfo = au
  285. }
  286. resp = append(resp, item)
  287. }
  288. return
  289. }