123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357 |
- package service
- import (
- "context"
- "fmt"
- "sync"
- "time"
- "go-common/app/admin/main/dm/model"
- accountApi "go-common/app/service/main/account/api"
- "go-common/app/service/main/archive/api"
- archiveMdl "go-common/app/service/main/archive/model/archive"
- "go-common/library/ecode"
- "go-common/library/log"
- "go-common/library/sync/errgroup"
- )
- const (
- _workFlowSubtitleBid = 14
- )
- // SubtitleLanList .
- func (s *Service) SubtitleLanList(c context.Context) (res map[int64]string, err error) {
- var (
- sLans []*model.SubtitleLan
- )
- if sLans, err = s.dao.SubtitleLans(c); err != nil {
- return
- }
- res = make(map[int64]string)
- for _, sLan := range sLans {
- res[sLan.Code] = sLan.DocZh
- }
- return
- }
- // WorkFlowEditSubtitle .
- func (s *Service) WorkFlowEditSubtitle(c context.Context, arg *model.WorkFlowSubtitleArg) (err error) {
- var (
- argEdit *model.EditSubtitleArg
- status model.SubtitleStatus
- )
- if arg == nil || arg.Object == nil || len(arg.Object.Ids) == 0 || len(arg.Targets) == 0 {
- err = ecode.RequestErr
- return
- }
- switch arg.Object.DisposeMode {
- case model.WorkFlowSubtitleDisposeManagerBack:
- status = model.SubtitleStatusManagerBack
- case model.WorkFlowSubtitleDisposeManagerDelete:
- status = model.SubtitleStatusManagerRemove
- default:
- return
- }
- for _, target := range arg.Targets {
- if target == nil {
- continue
- }
- argEdit = &model.EditSubtitleArg{
- Oid: target.Oid,
- SubtileID: target.Eid,
- Status: uint8(status),
- }
- // 容错
- if argEdit.Oid == 0 {
- continue
- }
- if err = s.editSubtitle(c, argEdit, false); err != nil {
- log.Error("s.EditSubtitle(arg:%+v),error(%v)", argEdit, err)
- err = nil // ignore error
- return
- }
- }
- return
- }
- // EditSubtitle .
- func (s *Service) EditSubtitle(c context.Context, arg *model.EditSubtitleArg) (err error) {
- return s.editSubtitle(c, arg, true)
- }
- func (s *Service) editSubtitle(c context.Context, arg *model.EditSubtitleArg, removeWorkFlow bool) (err error) {
- // 更新表
- var (
- subtitle *model.Subtitle
- argStatus = model.SubtitleStatus(arg.Status)
- subtitleLans model.SubtitleLans
- sLans []*model.SubtitleLan
- err1 error
- lanDoc string
- archiveInfo *api.Arc
- archiveName string
- )
- if subtitle, err = s.dao.GetSubtitle(c, arg.Oid, arg.SubtileID); err != nil {
- log.Error("params(oid:%v,subtitleID:%v),error(%v)", arg.Oid, arg.SubtileID, err)
- return
- }
- if subtitle == nil {
- err = ecode.NothingFound
- return
- }
- if argStatus == subtitle.Status {
- err = ecode.SubtitleStatusUnValid
- return
- }
- if subtitle.Status != model.SubtitleStatusPublish && argStatus != model.SubtitleStatusPublish {
- arg.NotifyUpper = false
- }
- switch argStatus {
- case model.SubtitleStatusDraft, model.SubtitleStatusToAudit,
- model.SubtitleStatusAuditBack, model.SubtitleStatusRemove,
- model.SubtitleStatusPublish, model.SubtitleStatusManagerBack,
- model.SubtitleStatusManagerRemove:
- default:
- err = ecode.SubtitleStatusUnValid
- return
- }
- if err = s.changeSubtitleStatus(c, subtitle, argStatus); err != nil {
- log.Error("params(subtitle:%+v,status:%v),error(%v)", subtitle, arg.Status, err)
- return
- }
- if arg.NotifyAuthor || arg.NotifyUpper {
- if sLans, err1 = s.dao.SubtitleLans(c); err1 == nil {
- subtitleLans = model.SubtitleLans(sLans)
- }
- _, lanDoc = subtitleLans.GetByID(int64(subtitle.Lan))
- if archiveInfo, err1 = s.arcRPC.Archive3(c, &archiveMdl.ArgAid2{
- Aid: subtitle.Aid,
- }); err1 != nil {
- log.Error("s.arcRPC.Archive3(aid:%v),error(%v)", subtitle.Aid, err1)
- err1 = nil
- } else {
- archiveName = archiveInfo.Title
- }
- }
- if arg.NotifyAuthor {
- argUser := &model.NotifySubtitleUser{
- Mid: subtitle.Mid,
- Aid: subtitle.Aid,
- Oid: subtitle.Oid,
- SubtitleID: subtitle.ID,
- ArchiveName: archiveName,
- LanDoc: lanDoc,
- Status: model.StatusContent[uint8(subtitle.Status)],
- }
- if err1 = s.dao.SendMsgToSubtitleUser(c, argUser); err1 != nil {
- log.Error("SendMsgToSubtitleUser(argUser:%+v),error(%v)", argUser, err1)
- err1 = nil
- }
- }
- if arg.NotifyUpper {
- var (
- accountInfo *accountApi.InfoReply
- authorName string
- )
- if accountInfo, err1 = s.accountRPC.Info3(c, &accountApi.MidReq{
- Mid: subtitle.Mid,
- }); err1 != nil {
- log.Error("s.accRPC.Info3(mid:%v),error(%v)", subtitle.Mid, err1)
- err1 = nil
- } else {
- authorName = accountInfo.GetInfo().GetName()
- }
- argUp := &model.NotifySubtitleUp{
- Mid: subtitle.UpMid,
- AuthorID: subtitle.Mid,
- AuthorName: authorName,
- Aid: subtitle.Aid,
- Oid: subtitle.Oid,
- SubtitleID: subtitle.ID,
- ArchiveName: archiveName,
- LanDoc: lanDoc,
- Status: model.StatusContent[uint8(subtitle.Status)],
- }
- if err1 = s.dao.SendMsgToSubtitleUp(c, argUp); err1 != nil {
- log.Error("SendMsgToSubtitleUp(argUp:%+v),error(%v)", argUp, err1)
- err1 = nil
- }
- }
- if removeWorkFlow && (argStatus == model.SubtitleStatusRemove || argStatus == model.SubtitleStatusManagerRemove) {
- if err1 := s.dao.WorkFlowAppealDelete(c, _workFlowSubtitleBid, subtitle.Oid, subtitle.ID); err1 != nil {
- log.Error("s.dao.WorkFlowAppealDelete(oid:%v,subtitleID:%v),error(%v)", subtitle.Oid, subtitle.ID, err1)
- return
- }
- }
- return
- }
- // TODO 确认状态扭转
- func (s *Service) changeSubtitleStatus(c context.Context, subtitle *model.Subtitle, status model.SubtitleStatus) (err error) {
- var (
- sc *model.SubtitleContext
- hasDraft bool
- )
- sc = &model.SubtitleContext{}
- sc.Build(subtitle.Status, status)
- subtitle.PubTime = time.Now().Unix()
- if sc.CheckHasDraft {
- if hasDraft, err = s.CheckHasDraft(c, subtitle); err != nil {
- log.Error("params(subtitle:%+v),error(%v)", subtitle, err)
- return
- }
- if hasDraft {
- err = ecode.SubtitleAlreadyHasDraft
- return
- }
- subtitle.PubTime = 0
- }
- subtitle.Status = status
- if sc.RebuildPub {
- if err = s.RebuildSubtitle(c, subtitle); err != nil {
- log.Error("RebuildSubtitle.params(subtitle:%+v),error(%v)", subtitle, err)
- return
- }
- } else {
- if err = s.dao.UpdateSubtitle(c, subtitle); err != nil {
- log.Error("UpdateSubtitle.params(subtitle:%+v),error(%v)", subtitle, err)
- return
- }
- }
- if sc.DraftCache {
- s.dao.DelSubtitleDraftCache(c, subtitle.Oid, subtitle.Type, subtitle.Mid, subtitle.Lan)
- }
- if sc.SubtitleCache {
- s.dao.DelSubtitleCache(c, subtitle.Oid, subtitle.ID)
- }
- if sc.RebuildPub {
- s.dao.DelVideoSubtitleCache(c, subtitle.Oid, subtitle.Type)
- }
- return
- }
- // SubtitleList .
- func (s *Service) SubtitleList(c context.Context, arg *model.SubtitleArg) (res *model.SubtitleList, err error) {
- var (
- searchResult *model.SearchSubtitleResult
- oidSubtitleIds map[int64][]int64
- eg errgroup.Group
- lock sync.Mutex
- subtitleMap map[string]*model.Subtitle
- searchSubtitles []*model.SearchSubtitle
- searchSubtitle *model.SearchSubtitle
- subtitle *model.Subtitle
- ok bool
- aids []int64
- aidMap map[int64]struct{}
- archives map[int64]*api.Arc
- archive *api.Arc
- archiveVideo *api.Page
- subtitleLans model.SubtitleLans
- searchArg *model.SubtitleSearchArg
- )
- if arg.Ps > 100 {
- err = ecode.RequestErr
- return
- }
- key := func(oid, subtitleID int64) string {
- return fmt.Sprintf("%d_%d", oid, subtitleID)
- }
- if sLans, err1 := s.dao.SubtitleLans(c); err1 == nil {
- subtitleLans = model.SubtitleLans(sLans)
- }
- lanCode := subtitleLans.GetByLan(arg.Lan)
- searchArg = &model.SubtitleSearchArg{
- Aid: arg.Aid,
- Oid: arg.Oid,
- Mid: arg.Mid,
- UpperMid: arg.UpperMid,
- Status: arg.Status,
- Lan: uint8(lanCode),
- Ps: arg.Ps,
- Pn: arg.Pn,
- }
- if searchResult, err = s.dao.SearchSubtitle(c, searchArg); err != nil {
- log.Error("params(arg:%+v).error(%v)", arg, err)
- return
- }
- if searchResult == nil || len(searchResult.Result) == 0 {
- err = ecode.NothingFound
- return
- }
- oidSubtitleIds = make(map[int64][]int64)
- subtitleMap = make(map[string]*model.Subtitle)
- aidMap = make(map[int64]struct{})
- for _, r := range searchResult.Result {
- oidSubtitleIds[r.Oid] = append(oidSubtitleIds[r.Oid], r.ID)
- }
- for oid, subtitleIds := range oidSubtitleIds {
- tempOid := oid
- tempSubtitleIds := subtitleIds
- eg.Go(func() (err error) {
- var subtitles []*model.Subtitle
- if subtitles, err = s.dao.GetSubtitles(context.Background(), tempOid, tempSubtitleIds); err != nil {
- log.Error("params(oid:%v,subtitleIds:%+v).error(%v)", tempOid, tempSubtitleIds, err)
- return
- }
- for _, subtitle := range subtitles {
- lock.Lock()
- aidMap[subtitle.Aid] = struct{}{}
- subtitleMap[key(subtitle.Oid, subtitle.ID)] = subtitle
- lock.Unlock()
- }
- return
- })
- }
- if err = eg.Wait(); err != nil {
- return
- }
- for aid := range aidMap {
- aids = append(aids, aid)
- }
- if archives, err = s.arcRPC.Archives3(c, &archiveMdl.ArgAids2{
- Aids: aids,
- }); err != nil {
- log.Error("prams(aid:%v),error(%v)", aids, err)
- archives = make(map[int64]*api.Arc)
- err = nil
- }
- searchSubtitles = make([]*model.SearchSubtitle, 0, len(searchResult.Result))
- for _, r := range searchResult.Result {
- if subtitle, ok = subtitleMap[key(r.Oid, r.ID)]; !ok {
- continue
- }
- lan, lanDoc := subtitleLans.GetByID(int64(subtitle.Lan))
- searchSubtitle = &model.SearchSubtitle{
- ID: subtitle.ID,
- Oid: subtitle.Oid,
- Aid: subtitle.Aid,
- AuthorID: subtitle.Mid,
- Status: uint8(subtitle.Status),
- Lan: lan,
- LanDoc: lanDoc,
- IsSign: subtitle.IsSign,
- IsLock: subtitle.IsLock,
- Mtime: subtitle.Mtime,
- SubtitleURL: subtitle.SubtitleURL,
- }
- if archive, ok = archives[subtitle.Aid]; ok {
- searchSubtitle.ArchiveName = archive.Title
- }
- if archiveVideo, err = s.arcRPC.Video3(c, &archiveMdl.ArgVideo2{
- Aid: subtitle.Aid,
- Cid: subtitle.Oid,
- }); err != nil {
- log.Error("params(aid:%v,oid:%v) error(%v)", subtitle.Aid, subtitle.Oid, err)
- err = nil
- } else {
- searchSubtitle.VideoName = archiveVideo.Part
- }
- searchSubtitles = append(searchSubtitles, searchSubtitle)
- }
- res = &model.SubtitleList{
- Page: searchResult.Page,
- }
- res.Subtitles = searchSubtitles
- return
- }
|