123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260 |
- package service
- import (
- "fmt"
- "context"
- "go-common/app/admin/main/tv/model"
- "go-common/library/ecode"
- "go-common/library/log"
- bm "go-common/library/net/http/blademaster"
- "go-common/library/xstr"
- )
- const (
- _arcOnline = 1
- _arcOffline = 2
- )
- // typeBubbleSort sort type
- func typeBubbleSort(pTypes []model.UgcType) (pSortTypes []model.UgcType) {
- flag := true
- for i := 0; i < len(pTypes)-1; i++ {
- flag = true
- for j := 0; j < len(pTypes)-i-1; j++ {
- if pTypes[j].ID > pTypes[j+1].ID {
- pTypes[j], pTypes[j+1] = pTypes[j+1], pTypes[j]
- flag = false
- }
- }
- if flag {
- break
- }
- }
- pSortTypes = pTypes
- return
- }
- func (s *Service) existArcTps(passed bool) (existTypes map[int32]int, err error) {
- var (
- arcs []*model.Archive
- db = s.DB.Where("deleted = ?", 0)
- )
- if passed {
- db = db.Where("result = ?", 1)
- }
- existTypes = make(map[int32]int)
- if err = db.Select("DISTINCT(typeid)").Find(&arcs).Error; err != nil {
- log.Error("DistinctType Error %v", err)
- return
- }
- for _, v := range arcs {
- existTypes[v.TypeID] = 1
- }
- return
- }
- //arcTp return archive type list
- func (s *Service) arcTp(passed bool) (pTypes []model.UgcType, err error) {
- var (
- cTypeList = make(map[int32][]model.UgcCType)
- oriPTypes []model.UgcType
- existTypes map[int32]int
- )
- typeList := s.ArcTypes
- if existTypes, err = s.existArcTps(passed); err != nil {
- return
- }
- //make parent and child node sperate
- for _, v := range typeList {
- if v.Pid == 0 {
- oriPTypes = append(oriPTypes, model.UgcType{
- ID: v.ID,
- Name: v.Name,
- })
- } else {
- cType := model.UgcCType{
- Pid: v.Pid,
- ID: v.ID,
- Name: v.Name,
- }
- if _, ok := existTypes[v.ID]; ok {
- cTypeList[v.Pid] = append(cTypeList[v.Pid], cType)
- }
- }
- }
- for _, v := range oriPTypes {
- if cValue, ok := cTypeList[v.ID]; ok {
- v.Children = cValue
- pTypes = append(pTypes, v)
- }
- }
- pTypes = typeBubbleSort(pTypes)
- return
- }
- func (s *Service) loadTps() {
- var (
- data = &model.AvailTps{}
- err error
- )
- if data.AllTps, err = s.arcTp(false); err != nil {
- log.Error("loadTps Passed Err %v", err)
- return
- }
- if data.PassedTps, err = s.arcTp(true); err != nil {
- log.Error("loadTps All Err %v", err)
- return
- }
- if len(data.AllTps) > 0 || len(data.PassedTps) > 0 {
- s.avaiTps = data
- }
- }
- // GetTps get cms used types data
- func (s *Service) GetTps(c context.Context, passed bool) (data []model.UgcType, err error) {
- if s.avaiTps == nil {
- err = ecode.ServiceUnavailable
- return
- }
- if passed {
- data = s.avaiTps.PassedTps
- } else {
- data = s.avaiTps.AllTps
- }
- return
- }
- //GetArchivePid get archive pid with child id
- func (s *Service) GetArchivePid(id int32) (pid int32) {
- if value, ok := s.ArcTypes[id]; ok {
- pid = value.Pid
- return
- }
- return 0
- }
- func (s *Service) midTreat(param *model.ArcListParam) (mids []int64) {
- if param.Mid != 0 {
- return []int64{param.Mid}
- }
- if param.UpName != "" {
- var data []*model.Upper
- if err := s.DB.Where("ori_name LIKE ?", "%"+param.UpName+"%").Where("deleted = 0").Find(&data).Error; err != nil {
- log.Error("ArchiveList MidTreat UpName %s, Err %v", param.UpName, err)
- return
- }
- if len(data) > 0 {
- for _, v := range data {
- mids = append(mids, v.MID)
- }
- }
- }
- return
- }
- // ArchiveList is used for getting archive list
- func (s *Service) ArchiveList(c *bm.Context, param *model.ArcListParam) (pager *model.ArcPager, err error) {
- var (
- archives []*model.ArcDB
- reqES = new(model.ReqArcES)
- data *model.EsUgcResult
- aids []int64
- mids []int64
- upsInfo map[int64]string
- )
- reqES.FromArcListParam(param, s.typeidsTreat(param.Typeid, param.Pid))
- reqES.Mids = s.midTreat(param)
- pager = new(model.ArcPager)
- if data, err = s.dao.ArcES(c, reqES); err != nil {
- log.Error("ArchiveList Req %v, Err %v", param, err)
- return
- }
- pager.Page = data.Page
- if len(data.Result) == 0 {
- return
- }
- for _, v := range data.Result {
- aids = append(aids, v.AID)
- mids = append(mids, v.MID)
- }
- if err = s.DB.Order("mtime " + reqES.MtimeSort()).Where(fmt.Sprintf("aid IN (%s)", xstr.JoinInts(aids))).Find(&archives).Error; err != nil {
- log.Error("s.ArchiveList Find archives error(%v)", err)
- return
- }
- if upsInfo, err = s.pickUps(mids); err != nil {
- return
- }
- for _, v := range archives {
- item := v.ToList(s.GetArchivePid(v.TypeID))
- if name, ok := upsInfo[v.MID]; ok {
- item.UpName = name
- }
- pager.Items = append(pager.Items, item)
- }
- return
- }
- func (s *Service) pickUps(mids []int64) (res map[int64]string, err error) {
- if len(mids) == 0 {
- return
- }
- var resSlice []*model.CmsUpper
- res = make(map[int64]string, len(mids))
- if err = s.DB.Where(fmt.Sprintf("mid IN (%s)", xstr.JoinInts(mids))).Where("deleted = 0").Find(&resSlice).Error; err != nil {
- log.Error("pickUps Mids %v, Err %v", mids, err)
- return
- }
- for _, v := range resSlice {
- res[v.MID] = v.OriName
- }
- return
- }
- // ArcAction is used for online ugc archive
- func (s *Service) ArcAction(ids []int64, action int) (err error) {
- var (
- w = map[string]interface{}{"deleted": 0, "result": 1}
- tx = s.DB.Model(&model.Archive{}).Begin()
- actValid int
- )
- if action == _arcOnline {
- actValid = 1
- } else if action == _arcOffline {
- actValid = 0
- } else {
- return ecode.TvDangbeiWrongType
- }
- for _, v := range ids {
- arch := model.Archive{}
- if errDB := tx.Where(w).Where("id=?", v).First(&arch).Error; errDB != nil {
- err = fmt.Errorf("找不到id为%v的数据", v)
- log.Error("s.ArcAction First error(%v)", err)
- tx.Rollback()
- return
- }
- if errDB := tx.Where("id=?", v).
- Update("valid", actValid).Error; errDB != nil {
- err = errDB
- log.Error("s.ArcAction Update error(%v)", err)
- tx.Rollback()
- return
- }
- }
- tx.Commit()
- return
- }
- // ArcUpdate is used for update ugc archive
- func (s *Service) ArcUpdate(id int64, cover string, content string, title string) (err error) {
- up := map[string]interface{}{
- "cover": cover,
- "content": content,
- "title": title,
- }
- if err = s.DB.Model(&model.Archive{}).Where("id=?", id).Update(up).Error; err != nil {
- log.Error("s.ArcUpdate Update error(%v)", err)
- return
- }
- return
- }
|