123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492 |
- package academy
- import (
- "context"
- "sort"
- "time"
- "go-common/app/interface/main/creative/model/academy"
- "go-common/app/interface/main/creative/model/newcomer"
- "go-common/app/service/main/archive/api"
- "go-common/library/ecode"
- "go-common/library/log"
- "go-common/library/sync/errgroup"
- xtime "go-common/library/time"
- )
- // Occupations get occ.
- func (s *Service) Occupations(c context.Context) (res []*academy.Occupation, err error) {
- res = s.OccCache
- res = make([]*academy.Occupation, 0, len(res))
- for _, v := range s.OccCache {
- if v.ID == 7 || v.ID == s.NewbCourseID { //7-废弃 NewbCourseID-新人专区
- continue
- }
- res = append(res, v)
- }
- return
- }
- // NewbCourse get new up course.
- func (s *Service) NewbCourse(c context.Context) (res []*academy.NewbCourseList, err error) {
- var (
- skids []int64
- pids = []int64{}
- sids = []int64{}
- tcs *academy.ArcList
- skMap map[int64]string
- aids []int64
- )
- skMap = make(map[int64]string)
- for _, v := range s.SkillCache {
- if v.OID == s.NewbCourseID {
- skids = append(skids, v.ID)
- skMap[v.ID] = v.Name
- }
- }
- tcs, err = s.ThemeCourse(c, pids, skids, sids, 1, 20, true)
- if err != nil {
- log.Error("NewbCourse s.ThemeCourse pids(%+v)|skids(%+v)|sids(%+v)|error(%v)", pids, skids, sids, err)
- return
- }
- if len(tcs.Items) == 0 {
- return
- }
- // add tags
- for _, v := range tcs.Items {
- aids = append(aids, v.AID)
- }
- tags, err := s.getTags(c, aids)
- if err != nil {
- log.Error("NewbCourse s.getTags err(%v)", err)
- return
- }
- s.setTags(tcs.Items, tags)
- newbCourseMap := make(map[int64][]*academy.ArcMeta)
- for _, v := range tcs.Items {
- if v == nil || v.Skill == nil {
- continue
- }
- newbCourseMap[v.Skill.SkID] = append(newbCourseMap[v.Skill.SkID], v)
- }
- res = make([]*academy.NewbCourseList, 0)
- for _, id := range skids {
- l := &academy.NewbCourseList{}
- if v, ok := newbCourseMap[id]; ok {
- l.Items = v
- }
- if sname, ok := skMap[id]; ok {
- l.Title = sname
- l.TID = id
- }
- res = append(res, l)
- }
- return
- }
- // ThemeCourse get theme course.
- func (s *Service) ThemeCourse(c context.Context, pids, skids, sids []int64, pn, ps int, isnew bool) (res *academy.ArcList, err error) {
- var (
- skas []*academy.SkillArc
- aids []int64
- pidMap map[int64]int64
- skidMap map[int64]int64
- sidMap map[int64]int64
- total int
- )
- res = &academy.ArcList{
- Items: []*academy.ArcMeta{},
- Page: &academy.ArchivePage{
- Pn: pn,
- Ps: ps,
- },
- }
- if !isnew && len(pids) == 0 { //如果不是新人课程,并且不传职业课程id则默认全部
- for _, v := range s.OccCache {
- pids = append(pids, v.ID)
- }
- }
- if !isnew { //不是新人课程,则去掉新人课程
- for i := 0; i < len(pids); i++ {
- if pids[i] == s.NewbCourseID {
- pids = append(pids[:i], pids[i+1:]...)
- i--
- }
- }
- }
- if skas, err = s.aca.SkillArcs(c, pids, skids, sids, (pn-1)*ps, ps); err != nil {
- log.Error("s.aca.SkillArcs pid(%+v)|skid(%+v)|sid(%+v)|error(%v)", pids, skids, sids, err)
- return
- }
- if len(skas) == 0 {
- log.Error("s.aca.SkillArcs has no data")
- return
- }
- pidMap = make(map[int64]int64)
- skidMap = make(map[int64]int64)
- sidMap = make(map[int64]int64)
- for _, v := range skas {
- aids = append(aids, v.AID)
- pidMap[v.AID] = v.PID
- skidMap[v.AID] = v.SkID
- sidMap[v.AID] = v.SID
- }
- if total, err = s.aca.SkillArcCount(c, pids, skids, sids); err != nil {
- log.Error("s.aca.SkillArcCount pids(%+v)|skids(%+v)|sids(%+v)|error(%v)", pids, skids, sids, err)
- return
- }
- res.Page.Total = total
- var (
- g, _ = errgroup.WithContext(c)
- arcInfo map[int64]*api.Arc
- as map[int64]*api.Stat
- )
- g.Go(func() error {
- arcInfo, err = s.arc.Archives(c, aids, "")
- if err != nil {
- log.Error("s.arc.Archives aids(%+v)|error(%v)", aids, err)
- }
- return err
- })
- g.Go(func() error {
- as, err = s.arc.Stats(c, aids, "")
- if err != nil {
- log.Error("s.arc.Stats aids(%+v)|error(%v)", aids, err)
- }
- return err
- })
- if g.Wait() != nil {
- log.Error("s.aca.ThemeCourse g.Wait() error(%v)", err)
- return
- }
- items := make([]*academy.ArcMeta, 0, len(aids))
- for _, aid := range aids {
- v, ok := arcInfo[aid]
- if !ok || v == nil {
- log.Error("ThemeCourse bind ArcInfo aid(%d) error", aid)
- return
- }
- a := &academy.ArcMeta{
- AID: aid,
- Cover: v.Pic,
- Title: v.Title,
- Type: v.TypeName,
- MID: v.Author.Mid,
- Duration: v.Duration,
- Skill: &academy.SkillArc{},
- Business: 1, //技能树只有视频
- }
- if st, ok := as[aid]; ok {
- a.ArcStat = st
- } else {
- a.ArcStat = &api.Stat{}
- }
- if pid, ok := pidMap[aid]; ok {
- a.Skill.PID = pid
- }
- if skid, ok := skidMap[aid]; ok {
- a.Skill.SkID = skid
- }
- if sid, ok := sidMap[aid]; ok {
- a.Skill.SID = sid
- }
- items = append(items, a)
- }
- res.Items = items
- return
- }
- // ViewPlay view play archive by aid & mid & business.
- func (s *Service) ViewPlay(c context.Context, mid, aid int64, bus int8) (play *academy.Play, err error) {
- p := &academy.Play{
- MID: mid,
- AID: aid,
- Business: bus,
- }
- play, err = s.aca.Play(c, p)
- if err != nil {
- log.Error("ViewPlay s.aca.Play error(%v)", err)
- }
- return
- }
- // PlayAdd add play archive by aid & mid.
- func (s *Service) PlayAdd(c context.Context, mid, aid int64, bus, watch int8) (id int64, err error) {
- py := &academy.Play{
- MID: mid,
- AID: aid,
- Business: bus,
- Watch: watch,
- CTime: xtime.Time(time.Now().Unix()),
- MTime: xtime.Time(time.Now().Unix()),
- }
- if id, err = s.aca.PlayAdd(c, py); err != nil {
- log.Error("s.aca.PlayAdd error(%v)", err)
- return
- }
- s.p.TaskPub(mid, newcomer.MsgForAcademyFavVideo, newcomer.MsgFinishedCount)
- return
- }
- // PlayDel del play archive by aid & mid & business.
- func (s *Service) PlayDel(c context.Context, mid, aid int64, bus int8) (id int64, err error) {
- p := &academy.Play{
- MID: mid,
- AID: aid,
- Business: bus,
- }
- play, err := s.aca.Play(c, p)
- if err != nil {
- log.Error("PlayDel s.aca.Play error(%v)", err)
- return
- }
- if play == nil {
- err = ecode.NothingFound
- return
- }
- if id, err = s.aca.PlayDel(c, p); err != nil {
- log.Error("s.aca.PlayDel error(%v)", err)
- }
- return
- }
- // PlayList get play list.
- func (s *Service) PlayList(c context.Context, mid int64, pn, ps int) (res *academy.ArcList, err error) {
- var (
- pls []*academy.Play
- total int
- aids, cids []int64
- playMap map[int64]*academy.Play
- )
- res = &academy.ArcList{
- Items: []*academy.ArcMeta{},
- Page: &academy.ArchivePage{
- Pn: pn,
- Ps: ps,
- },
- }
- if pls, err = s.aca.Plays(c, mid, (pn-1)*ps, ps); err != nil {
- log.Error("s.aca.Plays mid(%d)|error(%v)", mid, err)
- return
- }
- if len(pls) == 0 {
- log.Error("s.aca.Plays has no mid(%d)", mid)
- return
- }
- playMap = make(map[int64]*academy.Play)
- for _, v := range pls {
- if v.Business == 1 {
- aids = append(aids, v.AID)
- } else if v.Business == 2 {
- cids = append(cids, v.AID)
- }
- playMap[v.AID] = v
- }
- if total, err = s.aca.PlayCount(c, mid); err != nil {
- log.Error("s.aca.PlayCount error(%v)", err)
- return
- }
- res.Page.Total = total
- var (
- arcs []*academy.ArcMeta
- arts []*academy.ArcMeta
- g, _ = errgroup.WithContext(c)
- )
- g.Go(func() error {
- arcs, err = s.getArcInfo(c, aids, playMap)
- return err
- })
- g.Go(func() error {
- arts, err = s.getArtInfo(c, cids, playMap)
- return err
- })
- if g.Wait() != nil {
- log.Error("s.PlayList g.Wait() error(%v)", err)
- return
- }
- tItems := make([]*academy.ArcMeta, 0, len(arcs)+len(arts))
- tItems = append(tItems, arcs...)
- tItems = append(tItems, arts...)
- sort.Slice(tItems, func(i, j int) bool { //按播放时间倒序
- return tItems[i].PlayTime > tItems[j].PlayTime
- })
- unReadItems := make([]*academy.ArcMeta, 0)
- readItems := make([]*academy.ArcMeta, 0)
- for _, v := range tItems {
- if v.Watch == 1 {
- unReadItems = append(unReadItems, v)
- } else if v.Watch == 2 {
- readItems = append(readItems, v)
- }
- }
- res.Items = append(res.Items, unReadItems...) //未观看最先展示
- res.Items = append(res.Items, readItems...)
- return
- }
- func (s *Service) getArcInfo(c context.Context, aids []int64, playMap map[int64]*academy.Play) (items []*academy.ArcMeta, err error) {
- arcs, err := s.arc.Archives(c, aids, "")
- if err != nil {
- log.Error("s.arc.Archives aids(%+v)|error(%v)", aids, err)
- return
- }
- items = make([]*academy.ArcMeta, 0, len(aids))
- for _, aid := range aids {
- v, ok := arcs[aid]
- if !ok || v == nil {
- log.Error("PlayList bind ArcInfo aid(%d) error", aid)
- return
- }
- a := &academy.ArcMeta{
- AID: aid,
- Cover: v.Pic,
- Title: v.Title,
- Type: v.TypeName,
- MID: v.Author.Mid,
- Duration: v.Duration,
- }
- if p, ok := playMap[aid]; ok {
- a.PlayTime = p.MTime
- a.Watch = p.Watch
- a.Business = p.Business
- }
- items = append(items, a)
- }
- return
- }
- func (s *Service) getArtInfo(c context.Context, cids []int64, playMap map[int64]*academy.Play) (items []*academy.ArcMeta, err error) {
- arts, err := s.art.ArticleMetas(c, cids, "")
- if err != nil {
- log.Error("s.arc.ArticleMetas cids(%+v) error(%v)", cids, err)
- return
- }
- items = make([]*academy.ArcMeta, 0, len(cids))
- for _, cid := range cids {
- v, ok := arts[cid]
- if !ok || v == nil {
- log.Error("PlayList bind ArtInfo cid(%d) error", cid)
- return
- }
- a := &academy.ArcMeta{
- AID: cid,
- Title: v.Title,
- MID: v.Author.Mid,
- }
- if v.Category != nil {
- a.Type = v.Category.Name
- }
- if len(v.ImageURLs) > 0 {
- a.Cover = v.ImageURLs[0]
- }
- if p, ok := playMap[cid]; ok {
- a.PlayTime = p.MTime
- a.Watch = p.Watch
- a.Business = p.Business
- }
- items = append(items, a)
- }
- return
- }
- // ProfessionSkill get theme course.
- func (s *Service) ProfessionSkill(c context.Context, pids, skids, sids []int64, pn, ps int, isnew bool) (res []*academy.NewbCourseList, err error) {
- var (
- tcs *academy.ArcList
- skMap map[int64]string
- aids []int64
- )
- // 取消分页,默认最大获取100条
- tcs, err = s.ThemeCourse(c, pids, skids, sids, 1, 100, false)
- if err != nil {
- log.Error("ProfessionSkill s.ThemeCourse pids(%+v)|skids(%+v)|sids(%+v)|error(%v)", pids, skids, sids, err)
- return
- }
- if len(tcs.Items) == 0 {
- return
- }
- skMap = make(map[int64]string)
- for _, v := range s.SkillCache {
- skids = append(skids, v.ID)
- skMap[v.ID] = v.Name
- }
- // add tags
- for _, v := range tcs.Items {
- if v == nil {
- continue
- }
- aids = append(aids, v.AID)
- }
- tags, err := s.getTags(c, aids)
- if err != nil {
- log.Error("ProfessionSkill s.getTags err(%v)", err)
- return
- }
- s.setTags(tcs.Items, tags)
- newbCourseMap := make(map[int64][]*academy.ArcMeta)
- for _, v := range tcs.Items {
- if v == nil || v.Skill == nil {
- continue
- }
- newbCourseMap[v.Skill.SkID] = append(newbCourseMap[v.Skill.SkID], v)
- }
- res = make([]*academy.NewbCourseList, 0)
- for _, id := range skids {
- l := &academy.NewbCourseList{}
- if v, ok := newbCourseMap[id]; ok {
- l.Items = v
- }
- if sname, ok := skMap[id]; ok {
- l.Title = sname
- l.TID = id
- }
- if len(l.Items) == 0 {
- continue
- }
- res = append(res, l)
- }
- return
- }
- // Keywords get keywords.
- func (s *Service) Keywords(c context.Context) (res []interface{}) {
- res = s.KWsCache
- return
- }
|