You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
260 lines
6.0 KiB
260 lines
6.0 KiB
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 |
|
}
|
|
|