瀏覽代碼

微路演视频音频排序

xingzai 2 年之前
父節點
當前提交
16e809385e
共有 3 個文件被更改,包括 266 次插入9 次删除
  1. 1 1
      controllers/micro_roadshow.go
  2. 73 8
      models/micro_roadshow.go
  3. 192 0
      services/micro_roadshow.go

+ 1 - 1
controllers/micro_roadshow.go

@@ -53,7 +53,7 @@ func (this *MicroRoadShowController) List() {
 	}
 
 	// 微路演列表
-	list, total, e := services.GetMicroRoadShowPageList(pageSize, currentIndex, audioId, videoId, activityVideoId, keywords)
+	list, total, e := services.GetMicroRoadShowPageListV8(pageSize, currentIndex, audioId, videoId, activityVideoId, keywords)
 	if e != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取微路演列表失败, Err: " + e.Error()

+ 73 - 8
models/micro_roadshow.go

@@ -51,14 +51,34 @@ func GetMicroRoadShowAudioPageList(startSize, pageSize int, condition string, pa
 	}
 	sql += ` ORDER BY publish_time DESC`
 
+	//totalSql := `SELECT COUNT(1) total FROM (` + sql + `) z `
+	//err = o.Raw(totalSql, pars).QueryRow(&total)
+	//if err != nil {
+	//	return
+	//}
+
+	sql += ` LIMIT ?,?`
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&list)
+	return
+}
+
+// GetMicroRoadShowAudioTotal 获取微路演音频数量
+func GetMicroRoadShowAudioTotal(condition string, pars []interface{}) (total int, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT
+				a.activity_id
+			FROM
+				cygx_activity_voice AS a
+			JOIN cygx_activity AS b ON a.activity_id = b.activity_id
+			WHERE 1 = 1 `
+	if condition != `` {
+		sql += condition
+	}
 	totalSql := `SELECT COUNT(1) total FROM (` + sql + `) z `
 	err = o.Raw(totalSql, pars).QueryRow(&total)
 	if err != nil {
 		return
 	}
-
-	sql += ` LIMIT ?,?`
-	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&list)
 	return
 }
 
@@ -102,17 +122,62 @@ func GetMicroRoadShowVideoPageList(startSize, pageSize int, condition string, pa
 		sql += conditionAct
 	}
 	sql += ` ORDER BY publish_time DESC`
-	totalSql := `SELECT COUNT(1) total FROM (` + sql + `) z `
-	err = o.Raw(totalSql, pars, parsAct).QueryRow(&total)
-	if err != nil {
-		return
-	}
+	//totalSql := `SELECT COUNT(1) total FROM (` + sql + `) z `
+	//err = o.Raw(totalSql, pars, parsAct).QueryRow(&total)
+	//if err != nil {
+	//	return
+	//}
 
 	sql += ` LIMIT ?,?`
 	_, err = o.Raw(sql, pars, parsAct, startSize, pageSize).QueryRows(&list)
 	return
 }
 
+// GetMicroRoadShowVideoTotal 获取微路演视频总量
+func GetMicroRoadShowVideoTotal(condition string, pars []interface{}, conditionAct string, parsAct []interface{}) (total int, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT
+			video_id AS id,
+			video_name AS title,
+			video_url AS resource_url,
+			2 AS type,
+			publish_date AS publish_time,
+			chart_permission_id,
+			chart_permission_name,
+			video_duration AS play_seconds,
+			img_url AS background_img,
+			"" as  activity_id
+		FROM
+			cygx_micro_roadshow_video 
+		WHERE
+			publish_status = 1 `
+	if condition != `` {
+		sql += condition
+	}
+	sql += ` UNION ALL
+		SELECT
+			video_id AS id,
+			video_name AS title,
+			video_url AS resource_url,
+			2 AS type,
+		art.activity_time as publish_time,
+			art.chart_permission_id,
+			art.chart_permission_name,
+			"",
+			"",
+			v.activity_id
+		FROM
+			cygx_activity_video as v
+			INNER JOIN cygx_activity as art on art.activity_id = v.activity_id WHERE 1= 1  `
+	if conditionAct != `` {
+		sql += conditionAct
+	}
+	sql += ` ORDER BY publish_time DESC`
+	totalSql := `SELECT COUNT(1) total FROM (` + sql + `) z `
+	err = o.Raw(totalSql, pars, parsAct).QueryRow(&total)
+	return
+}
+
 type AddVideoHistoryReq struct {
 	VideoId     int `description:"视频ID"`
 	PlaySeconds int `description:"播放时长"`

+ 192 - 0
services/micro_roadshow.go

@@ -351,3 +351,195 @@ func GetHomeNewestList(userId, companyId, startSize, pageSize int, condition str
 	}
 	return
 }
+
+// GetMicroRoadShowPageList 获取微路演列表添加活动视频 更新与8.1版本
+func GetMicroRoadShowPageListV8(pageSize, currentIndex, audioId, videoId, activityVideoId 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
+	}
+
+	audioPageNumSet := audioPageNum
+	videoPageNumSet := videoPageNum
+	audioTotal := 0
+	audioStartSize := 0
+	videoTotal := 0
+	videoStartSize := 0
+	audioList := make([]*models.MicroRoadShowPageList, 0)
+	videoList := make([]*models.MicroRoadShowPageList, 0)
+	if keywords != "" {
+		keywords = "%" + keywords + "%"
+	}
+	// 查询指定音频/视频时, 调整比例为1方便后面组合数据
+	if audioId > 0 || videoId > 0 || activityVideoId > 0 {
+		audioRatio = 1
+		videoRatio = 1
+	}
+
+	//音频的查询
+	var audioCond string
+	var audioPars []interface{}
+	// 如果筛选条件为指定视频ID则不做音频查询
+	if videoId > 0 || activityVideoId > 0 {
+		audioCond = ""
+	} else {
+		// 活动已发布且已结束
+		audioCond += ` AND b.publish_status = 1 AND b.active_state = 3`
+		//活动音频,设置有效时间为30天,失效后该活动就不再支持音频回放。有效期起始时间为活动的开始时间
+		endTime := time.Now().AddDate(0, 0, -30).Format("2006-01-02 15:04:05")
+		audioCond += ` AND b.activity_time > ? `
+		audioPars = append(audioPars, endTime)
+		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)
+		}
+		if currentIndex > 1 {
+			audioStartSize = (currentIndex - 1) * audioPageNum
+		}
+	}
+
+	//视频的处理
+	var videoCond string
+	var videoCondAct string
+	var videoPars []interface{}
+	var videoParsAct []interface{}
+	if audioId > 0 {
+		videoCond = ""
+	} else {
+		if keywords != "" {
+			videoCond += ` AND video_name LIKE ?`
+			videoPars = append(videoPars, keywords)
+			videoCondAct += ` AND video_name LIKE ?`
+			videoParsAct = append(videoParsAct, keywords)
+		}
+		if videoId > 0 {
+			videoCond += ` AND video_id = ?`
+			videoPars = append(videoPars, videoId)
+		}
+		if activityVideoId > 0 {
+			videoCondAct += ` AND video_id = ?`
+			videoParsAct = append(videoParsAct, activityVideoId)
+		}
+
+		//如果传了路演的或者活动的视频ID只查询一个
+		if videoId > 0 {
+			videoCondAct += ` AND video_id = 0 `
+		}
+		if activityVideoId > 0 {
+			videoCond += ` AND video_id = 0 `
+		}
+
+		endTime := time.Now().AddDate(0, 0, -30).Format("2006-01-02 15:04:05")
+		videoCondAct += ` AND art.activity_time > ? `
+		videoParsAct = append(videoParsAct, endTime)
+		videoCond += ` AND publish_status = 1`
+		if currentIndex > 1 {
+			videoStartSize = (currentIndex - 1) * videoPageNum
+		}
+	}
+
+	if audioCond != "" {
+		audioTotal, e = models.GetMicroRoadShowAudioTotal(audioCond, audioPars)
+		if e != nil {
+			err = errors.New("获取微路演音频数量失败, Err: " + e.Error())
+			return
+		}
+	}
+	if videoCond != "" {
+		videoTotal, e = models.GetMicroRoadShowVideoTotal(videoCond, videoPars, videoCondAct, videoParsAct)
+		if e != nil {
+			err = errors.New("获取微路演音频数量失败, Err: " + e.Error())
+			return
+		}
+	}
+	//如果音频数量不够,处理视频的分页
+	if currentIndex*audioPageNumSet > audioTotal {
+		if audioTotal-(currentIndex-1)*audioPageNumSet > 0 {
+			videoPageNum = pageSize - (audioTotal - (currentIndex-1)*audioRatio)
+		} else {
+			videoPageNum = pageSize
+			videoStartSize = pageSize*(currentIndex-1) - audioTotal
+		}
+	}
+
+	//如果视频数量不够,处理音频的分页
+	if currentIndex*videoPageNumSet > videoTotal {
+		if videoTotal-(currentIndex-1)*videoPageNumSet > 0 {
+			audioPageNum = pageSize - (videoTotal - (currentIndex-1)*videoPageNumSet)
+		} else {
+			audioPageNum = pageSize
+			audioStartSize = pageSize*(currentIndex-1) - videoTotal
+		}
+	}
+
+	wg := sync.WaitGroup{}
+	wg.Add(2)
+	// 分页查询音频
+	go func() {
+		defer wg.Done()
+		_, audioList, e = models.GetMicroRoadShowAudioPageList(audioStartSize, audioPageNum, audioCond, audioPars)
+	}()
+
+	// 分页查询视频
+	go func() {
+		defer wg.Done()
+		// 如果筛选条件为指定音频ID则不做视频查询
+		_, videoList, e = models.GetMicroRoadShowVideoPageList(videoStartSize, videoPageNum, videoCond, videoPars, videoCondAct, videoParsAct)
+	}()
+	wg.Wait()
+
+	if e != nil {
+		err = errors.New("获取微路演音视频列表失败, Err: " + e.Error())
+		return
+	}
+
+	// 按比例组合列表
+	audioNum := 0
+	videoNum := 0
+	audioLen := len(audioList)
+	videoLen := len(videoList)
+	for i := 0; i < sliceNum; i++ {
+		// 音频-每次取对应比例的数据直至取完
+		for a := 0; a < audioRatio; a++ {
+			if audioNum >= audioLen {
+				break
+			}
+			respList = append(respList, audioList[audioNum])
+			audioNum += 1
+		}
+		// 视频
+		for b := 0; b < videoRatio; b++ {
+			if videoNum >= videoLen {
+				break
+			}
+			respList = append(respList, videoList[videoNum])
+			videoNum += 1
+		}
+	}
+
+	//如果视频的数量不够,那么空缺的部分用音频来补位
+	if len(audioList) > pageSize-videoPageNumSet {
+		for k, v := range audioList {
+			if k >= pageSize-videoPageNumSet {
+				respList = append(respList, v)
+			}
+		}
+	}
+	//如果音频的数量不够,那么空缺的部分用视频来补位
+	if len(videoList) > pageSize-audioPageNumSet {
+		for k, v := range videoList {
+			if k >= pageSize-audioPageNumSet {
+				respList = append(respList, v)
+			}
+		}
+	}
+	total = audioTotal + videoTotal
+	return
+}