micro_roadshow.go 9.7 KB

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