micro_roadshow.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431
  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, activityVideoId 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 || activityVideoId > 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 || activityVideoId > 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 videoCondAct string
  74. var videoPars []interface{}
  75. var videoParsAct []interface{}
  76. if keywords != "" {
  77. videoCond += ` AND video_name LIKE ?`
  78. videoPars = append(videoPars, keywords)
  79. videoCondAct += ` AND video_name LIKE ?`
  80. videoParsAct = append(videoParsAct, keywords)
  81. }
  82. if videoId > 0 {
  83. videoCond += ` AND video_id = ?`
  84. videoPars = append(videoPars, videoId)
  85. }
  86. if activityVideoId > 0 {
  87. videoCondAct += ` AND video_id = ?`
  88. videoParsAct = append(videoParsAct, activityVideoId)
  89. }
  90. //如果传了路演的或者活动的视频ID只查询一个
  91. if videoId > 0 {
  92. videoCondAct += ` AND video_id = 0 `
  93. }
  94. if activityVideoId > 0 {
  95. videoCond += ` AND video_id = 0 `
  96. }
  97. endTime := time.Now().AddDate(0, 0, -30).Format("2006-01-02 15:04:05")
  98. videoCondAct += ` AND art.activity_time > ? `
  99. videoParsAct = append(videoParsAct, endTime)
  100. videoCond += ` AND publish_status = 1`
  101. videoStartSize := 0
  102. if currentIndex > 1 {
  103. videoStartSize = (currentIndex - 1) * videoPageNum
  104. }
  105. videoTotal, videoList, e = models.GetMicroRoadShowVideoPageList(videoStartSize, videoPageNum, videoCond, videoPars, videoCondAct, videoParsAct)
  106. }()
  107. wg.Wait()
  108. if e != nil {
  109. err = errors.New("获取微路演音视频列表失败, Err: " + e.Error())
  110. return
  111. }
  112. // 按比例组合列表
  113. audioNum := 0
  114. videoNum := 0
  115. audioLen := len(audioList)
  116. videoLen := len(videoList)
  117. for i := 0; i < sliceNum; i++ {
  118. // 音频-每次取对应比例的数据直至取完
  119. for a := 0; a < audioRatio; a++ {
  120. if audioNum >= audioLen {
  121. break
  122. }
  123. respList = append(respList, audioList[audioNum])
  124. audioNum += 1
  125. }
  126. // 视频
  127. for b := 0; b < videoRatio; b++ {
  128. if videoNum >= videoLen {
  129. break
  130. }
  131. respList = append(respList, videoList[videoNum])
  132. videoNum += 1
  133. }
  134. }
  135. total = audioTotal + videoTotal
  136. return
  137. }
  138. // getMicroRoadShowDataRatio 获取微路演列表数据音视频配比
  139. func getMicroRoadShowDataRatio(pageSize int) (audioRatio, videoRatio, audioPageNum, videoPageNum, sliceNum int, err error) {
  140. if pageSize <= 0 {
  141. pageSize = utils.PageSize20
  142. }
  143. key := models.MicroRoadShowListDataRatioConfigKey
  144. config, e := models.GetConfigByCode(key)
  145. if e != nil && e.Error() != utils.ErrNoRow() {
  146. err = errors.New("获取微路演列表数据量配置失败, Err: " + e.Error())
  147. return
  148. }
  149. // 默认音频视频展示比例为4:1
  150. ratio := "4:1"
  151. if config != nil {
  152. ratio = config.ConfigValue
  153. }
  154. ratioArr := strings.Split(ratio, ":")
  155. if len(ratioArr) != 2 {
  156. err = errors.New("微路演列表数据量配比有误")
  157. return
  158. }
  159. audioRatio, e = strconv.Atoi(ratioArr[0])
  160. if e != nil {
  161. err = errors.New("微路演列表数据量配比有误")
  162. return
  163. }
  164. videoRatio, e = strconv.Atoi(ratioArr[1])
  165. if e != nil {
  166. err = errors.New("微路演列表数据量配比有误")
  167. return
  168. }
  169. totalRatio := audioRatio + videoRatio
  170. if totalRatio == 0 {
  171. err = errors.New("微路演列表数据量配比有误")
  172. return
  173. }
  174. // 每比率对应数量(向上取整)
  175. sliceNum = int(math.Ceil(float64(pageSize) / float64(totalRatio)))
  176. audioPageNum = audioRatio * sliceNum
  177. videoPageNum = videoRatio * sliceNum
  178. return
  179. }
  180. // GetMicroRoadShowDefaultImgConfig 获取微路演默认图/分享图配置
  181. func GetMicroRoadShowDefaultImgConfig() (audioMap, videoMap, audioShareMap, videoShareMap map[int]string, err error) {
  182. audioMap = make(map[int]string, 0)
  183. videoMap = make(map[int]string, 0)
  184. audioShareMap = make(map[int]string, 0)
  185. videoShareMap = make(map[int]string, 0)
  186. key := models.MicroRoadshowDefaultImgKey
  187. conf, e := models.GetConfigByCode(key)
  188. if e != nil {
  189. err = errors.New("获取微路演默认图配置失败, Err: " + e.Error())
  190. return
  191. }
  192. if conf.ConfigValue == "" {
  193. err = errors.New("获取微路演默认图配置有误")
  194. return
  195. }
  196. list := new(models.MicroRoadShowDefaultImgList)
  197. if e = json.Unmarshal([]byte(conf.ConfigValue), &list); e != nil {
  198. err = errors.New("微路演默认图配置配置值解析失败, Err: " + e.Error())
  199. return
  200. }
  201. audioList := list.Audio
  202. for i := range audioList {
  203. audioMap[audioList[i].ChartPermissionId] = audioList[i].ImgUrl
  204. audioShareMap[audioList[i].ChartPermissionId] = audioList[i].ShareImg
  205. }
  206. videoList := list.Video
  207. for i := range videoList {
  208. videoMap[videoList[i].ChartPermissionId] = videoList[i].ImgUrl
  209. videoShareMap[videoList[i].ChartPermissionId] = videoList[i].ShareImg
  210. }
  211. return
  212. }
  213. // GetHomeNewestList 获取首页最新列表
  214. func GetHomeNewestList(userId, companyId, startSize, pageSize int, condition string, pars []interface{}) (resp []*models.HomeArticle, total int, err error) {
  215. resp = make([]*models.HomeArticle, 0)
  216. unionList, e := models.GetHomeNewestListUnionList(condition, pars, startSize, pageSize)
  217. if e != nil {
  218. err = errors.New("获取首页最新列表失败")
  219. return
  220. }
  221. unionTotal, e := models.GetHomeNewestListUnionCount(condition, pars)
  222. if e != nil {
  223. err = errors.New("获取首页最新列表总数失败")
  224. return
  225. }
  226. total = unionTotal
  227. // 用户权限
  228. authInfo, permissionArr, e := GetUserRaiPermissionInfo(userId, companyId)
  229. if e != nil {
  230. err = errors.New("获取用户权限失败, Err: " + e.Error())
  231. return
  232. }
  233. // 获取默认图配置
  234. audioMap, videoMap, audioShareMap, videoShareMap, e := GetMicroRoadShowDefaultImgConfig()
  235. if e != nil {
  236. err = errors.New("获取微路演默认图配置失败, Err: " + e.Error())
  237. return
  238. }
  239. // 此处没有直接使用HomeArticle结构体而是多加了一层, 纯粹是为了方便前端区分纪要和微路演音频=_=!
  240. for _, v := range unionList {
  241. item := new(models.HomeArticle)
  242. item.HomeType = v.HomeType
  243. // 纪要
  244. if item.HomeType == 0 {
  245. item.ArticleId = v.ArticleId
  246. item.Title = v.Title
  247. item.TitleEn = v.TitleEn
  248. item.UpdateFrequency = v.UpdateFrequency
  249. item.CreateDate = v.CreateDate
  250. item.PublishDate = v.PublishDate
  251. item.Body = v.Body
  252. item.BodyHtml = v.BodyHtml
  253. item.Abstract = v.Abstract
  254. item.CategoryName = v.CategoryName
  255. item.SubCategoryName = v.SubCategoryName
  256. item.ExpertBackground = v.ExpertBackground
  257. item.IsResearch = v.IsResearch
  258. item.Pv = v.Pv
  259. item.ImgUrlPc = v.ImgUrlPc
  260. item.CategoryId = v.CategoryId
  261. item.HttpUrl = v.HttpUrl
  262. item.IsNeedJump = v.IsNeedJump
  263. item.Source = v.Source
  264. item.Annotation = v.Annotation
  265. }
  266. // 音频
  267. if v.HomeType == 1 {
  268. ad := new(models.MicroAudioUnionList)
  269. ad.Id = v.Id
  270. ad.AudioTitle = v.AudioTitle
  271. ad.AudioResourceUrl = v.AudioResourceUrl
  272. ad.AudioType = v.AudioType
  273. ad.AudioPublishTime = utils.StrTimeToTime(v.AudioPublishTime).Format(utils.FormatDate)
  274. ad.AudioImgUrl = v.AudioImgUrl
  275. ad.AudioChartPermissionId = v.AudioChartPermissionId
  276. ad.AudioChartPermissionName = v.AudioChartPermissionName
  277. ad.AudioPlaySeconds = v.AudioPlaySeconds
  278. ad.AudioPlaySeconds = v.AudioPlaySeconds
  279. ad.AudioActivityId = v.AudioActivityId
  280. item.MicroAudio = ad
  281. // 默认图
  282. if ad.AudioImgUrl == "" {
  283. if ad.AudioType == 1 {
  284. ad.AudioImgUrl = audioMap[ad.AudioChartPermissionId]
  285. } else {
  286. ad.AudioImgUrl = videoMap[ad.AudioChartPermissionId]
  287. }
  288. }
  289. // 分享图
  290. if ad.AudioType == 1 {
  291. ad.AudioShareImg = audioShareMap[ad.AudioChartPermissionId]
  292. } else {
  293. ad.AudioShareImg = videoShareMap[ad.AudioChartPermissionId]
  294. }
  295. // 权限
  296. au := new(models.UserPermissionAuthInfo)
  297. au.SellerName = authInfo.SellerName
  298. au.SellerMobile = authInfo.SellerMobile
  299. au.HasPermission = authInfo.HasPermission
  300. au.OperationMode = authInfo.OperationMode
  301. if au.HasPermission == 1 {
  302. // 非宏观权限进一步判断是否有权限
  303. if ad.AudioChartPermissionId != utils.HONG_GUAN_ID && !utils.InArrayByStr(permissionArr, ad.AudioChartPermissionName) {
  304. au.HasPermission = 2
  305. }
  306. }
  307. // 无权限的弹框提示
  308. if au.HasPermission != 1 {
  309. if au.OperationMode == UserPermissionOperationModeCall {
  310. if ad.AudioType == 1 {
  311. au.PopupMsg = UserPermissionPopupMsgCallActivity
  312. } else {
  313. au.PopupMsg = UserPermissionPopupMsgCallMicroVideo
  314. }
  315. } else {
  316. if ad.AudioType == 1 {
  317. au.PopupMsg = UserPermissionPopupMsgApplyActivity
  318. } else {
  319. au.PopupMsg = UserPermissionPopupMsgApplyMicroVideo
  320. }
  321. }
  322. }
  323. ad.AuthInfo = au
  324. }
  325. resp = append(resp, item)
  326. }
  327. return
  328. }
  329. // GetMicroRoadShowPageList 获取微路演列表添加活动视频 更新与8.1版本
  330. func GetMicroRoadShowPageListV8(pageSize, currentIndex, audioId, videoId, activityVideoId int, keywords string) (respList []*models.MicroRoadShowPageList, total int, err error) {
  331. var e error
  332. // 根据每页数据量获取音视频配比
  333. startSize := utils.StartIndex(currentIndex, pageSize)
  334. videoList := make([]*models.MicroRoadShowPageList, 0)
  335. if keywords != "" {
  336. keywords = "%" + keywords + "%"
  337. }
  338. //音频的查询
  339. var audioCond string
  340. var audioPars []interface{}
  341. // 如果筛选条件为指定视频ID则不做音频查询
  342. if videoId > 0 || activityVideoId > 0 {
  343. audioCond = ""
  344. } else {
  345. // 活动已发布且已结束
  346. audioCond += ` AND b.publish_status = 1 AND b.active_state = 3`
  347. //活动音频,设置有效时间为30天,失效后该活动就不再支持音频回放。有效期起始时间为活动的开始时间
  348. endTime := time.Now().AddDate(0, 0, -30).Format("2006-01-02 15:04:05")
  349. audioCond += ` AND b.activity_time > ? `
  350. audioPars = append(audioPars, endTime)
  351. if keywords != "" {
  352. audioCond += ` AND a.voice_name LIKE ? OR b.label LIKE ?`
  353. audioPars = append(audioPars, keywords, keywords)
  354. }
  355. if audioId > 0 {
  356. audioCond += ` AND a.activity_voice_id = ?`
  357. audioPars = append(audioPars, audioId)
  358. }
  359. }
  360. //视频的处理
  361. var videoCond string
  362. var videoCondAct string
  363. var videoPars []interface{}
  364. var videoParsAct []interface{}
  365. if audioId > 0 {
  366. videoCond = ""
  367. } else {
  368. if keywords != "" {
  369. videoCond += ` AND video_name LIKE ?`
  370. videoPars = append(videoPars, keywords)
  371. videoCondAct += ` AND video_name LIKE ?`
  372. videoParsAct = append(videoParsAct, keywords)
  373. }
  374. if videoId > 0 {
  375. videoCond += ` AND video_id = ?`
  376. videoPars = append(videoPars, videoId)
  377. }
  378. if activityVideoId > 0 {
  379. videoCondAct += ` AND video_id = ?`
  380. videoParsAct = append(videoParsAct, activityVideoId)
  381. }
  382. //如果传了路演的或者活动的视频ID只查询一个
  383. if videoId > 0 {
  384. videoCondAct += ` AND video_id = 0 `
  385. }
  386. if activityVideoId > 0 {
  387. videoCond += ` AND video_id = 0 `
  388. }
  389. if videoId == 0 {
  390. endTime := time.Now().AddDate(0, 0, -30).Format("2006-01-02 15:04:05")
  391. videoCondAct += ` AND art.activity_time > ? `
  392. videoParsAct = append(videoParsAct, endTime)
  393. }
  394. videoCond += ` AND publish_status = 1`
  395. }
  396. total, videoList, e = models.GetMicroRoadShowVideoPageListV8(startSize, pageSize, videoCond, videoPars, videoCondAct, videoParsAct, audioCond, audioPars, audioId, videoId, activityVideoId)
  397. if e != nil {
  398. err = errors.New("获取微路演音视频列表失败, Err: " + e.Error())
  399. return
  400. }
  401. respList = videoList
  402. return
  403. }