123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418 |
- package dao
- import (
- "context"
- "fmt"
- "strconv"
- "strings"
- "time"
- "go-common/app/interface/main/dm2/model"
- "go-common/library/database/elastic"
- "go-common/library/log"
- "go-common/library/xstr"
- )
- var (
- _dataTimeFormat = "2006-01-02 15:03:04"
- _subtitleFields = []string{"oid", "id"}
- _dmRecentFields = []string{"attr", "color", "ctime", "fontsize", "id", "mid", "mode", "msg", "mtime", "oid", "pool", "progress", "state", "type", "pid"}
- )
- func hisDateIndex(month string) string {
- return "dm_date_" + strings.Replace(month, "-", "_", -1)
- }
- // SearchDMHisIndex get dm date index by oid from search.
- func (d *Dao) SearchDMHisIndex(c context.Context, tp int32, oid int64, month string) (dates []string, err error) {
- var (
- pn, ps = 1, 31
- res model.SearchHistoryIdxResult
- )
- req := d.elastic.NewRequest("dm_date")
- req.Fields("date").WhereEq("oid", oid)
- req.Index(hisDateIndex(month)).Pn(pn).Ps(ps).Order("date", "asc")
- if err = req.Scan(c, &res); err != nil {
- log.Error("elastic search(%s) error(%v)", req.Params(), err)
- return
- }
- for _, v := range res.Result {
- dates = append(dates, v.Date)
- }
- return
- }
- // SearchDMHistory get history dmid from search.
- // 搜索定制api,改动需要沟通
- func (d *Dao) SearchDMHistory(c context.Context, tp int32, oid, ctimeTo int64, pn, ps int) (dmids []int64, err error) {
- var (
- res model.SearchHistoryResult
- end = time.Unix(ctimeTo, 0).Format("2006-01-02 15:04:05")
- )
- req := d.elastic.NewRequest("dm_history")
- req.Index(fmt.Sprintf("dm_search_%03d", oid%_indexSharding))
- req.Fields("id").WhereEq("oid", oid).WhereIn("state", []int64{0, 2, 6})
- req.WhereRange("ctime", nil, end, elastic.RangeScopeLcRc)
- req.Pn(pn).Ps(ps).Order("ctime", "desc")
- if err = req.Scan(c, &res); err != nil {
- log.Error("elastic search(%s) error(%v)", req.Params(), err)
- return
- }
- for _, v := range res.Result {
- dmids = append(dmids, v.ID)
- }
- return
- }
- // SearchDM 搜索弹幕
- func (d *Dao) SearchDM(c context.Context, p *model.SearchDMParams) (res *model.SearchDMData, err error) {
- req := d.elastic.NewRequest("dm_search")
- req.Fields("id").Index(fmt.Sprintf("dm_search_%03d", p.Oid%_indexSharding)).WhereEq("oidstr", p.Oid)
- if p.Mids != "" {
- mids, _ := xstr.SplitInts(p.Mids)
- req.WhereIn("mid", mids)
- }
- if p.State != "" {
- states, _ := xstr.SplitInts(p.State)
- req.WhereIn("state", states)
- }
- if p.Mode != "" {
- modes, _ := xstr.SplitInts(p.Mode)
- req.WhereIn("mode", modes)
- }
- if p.Pool != "" {
- pools, _ := xstr.SplitInts(p.Pool)
- req.WhereIn("pool", pools)
- }
- if p.Attrs != "" {
- attrs, _ := xstr.SplitInts(p.Attrs)
- req.WhereIn("attr_format", attrs)
- }
- req.WhereEq("type", p.Type)
- switch {
- case p.ProgressFrom != model.CondIntNil && p.ProgressTo != model.CondIntNil:
- req.WhereRange("progress_long", p.ProgressFrom, p.ProgressTo, elastic.RangeScopeLcRc)
- case p.ProgressFrom != model.CondIntNil:
- req.WhereRange("progress_long", p.ProgressFrom, nil, elastic.RangeScopeLcRc)
- case p.ProgressTo != model.CondIntNil:
- req.WhereRange("progress_long", nil, p.ProgressTo, elastic.RangeScopeLcRc)
- }
- req.WhereRange("ctime", p.CtimeFrom, p.CtimeTo, elastic.RangeScopeLcRc)
- if p.Keyword != "" {
- req.WhereLike([]string{"msg"}, []string{p.Keyword}, true, elastic.LikeLevelHigh)
- req.OrderScoreFirst(true)
- }
- if p.Order == "progress" {
- p.Order = "progress_long"
- }
- req.Order(p.Order, p.Sort)
- req.Pn(int(p.Pn)).Ps(int(p.Ps))
- res = &model.SearchDMData{}
- if err = req.Scan(c, &res); err != nil {
- log.Error("search params(%s), error(%v)", req.Params(), err)
- }
- return
- }
- // UptSearchDMState update dm search state
- func (d *Dao) UptSearchDMState(c context.Context, dmids []int64, oid int64, state, tp int32) (err error) {
- upt := d.elastic.NewUpdate("dm_search")
- for _, dmid := range dmids {
- data := &model.UptSearchDMState{
- ID: dmid,
- Oid: oid,
- State: state,
- Type: tp,
- Mtime: time.Now().Format("2006-01-02 15:04:05"),
- }
- upt.AddData(fmt.Sprintf("dm_search_%03d", oid%_indexSharding), data)
- }
- if err = upt.Do(c); err != nil {
- log.Error("update.Do() params(%s) error(%v)", upt.Params(), err)
- }
- return
- }
- // UptSearchDMPool update dm search pool
- func (d *Dao) UptSearchDMPool(c context.Context, dmids []int64, oid int64, pool, tp int32) (err error) {
- upt := d.elastic.NewUpdate("dm_search")
- for _, dmid := range dmids {
- data := &model.UptSearchDMPool{
- ID: dmid,
- Oid: oid,
- Pool: pool,
- Type: tp,
- Mtime: time.Now().Format("2006-01-02 15:04:05"),
- }
- upt.AddData(fmt.Sprintf("dm_search_%03d", oid%_indexSharding), data)
- }
- if err = upt.Do(c); err != nil {
- log.Error("update.Do() params(%s) error(%v)", upt.Params(), err)
- }
- return
- }
- // UptSearchDMAttr update dm search attr
- func (d *Dao) UptSearchDMAttr(c context.Context, dmids []int64, oid int64, attr, tp int32) (err error) {
- var bits []int64
- for k, v := range strconv.FormatInt(int64(attr), 2) {
- if v == 49 {
- bits = append(bits, int64(k+1))
- }
- }
- upt := d.elastic.NewUpdate("dm_search")
- for _, dmid := range dmids {
- data := &model.UptSearchDMAttr{
- ID: dmid,
- Oid: oid,
- Attr: attr,
- AttrFormat: bits,
- Type: tp,
- Mtime: time.Now().Format("2006-01-02 15:04:05"),
- }
- upt.AddData(fmt.Sprintf("dm_search_%03d", oid%_indexSharding), data)
- }
- if err = upt.Do(c); err != nil {
- log.Error("update.Do() params(%s) error(%v)", upt.Params(), err)
- }
- return
- }
- // SearchSubtitles .
- func (d *Dao) SearchSubtitles(c context.Context, page, size int32, mid int64, upMids []int64, aid, oid int64, tp int32, status []int64) (res *model.SearchSubtitleResult, err error) {
- var (
- req *elastic.Request
- fields []string
- )
- fields = _subtitleFields
- req = d.elastic.NewRequest("dm_subtitle").Index("subtitle").Fields(fields...).Pn(int(page)).Ps(int(size))
- if mid > 0 {
- req.WhereEq("mid", mid)
- }
- if aid > 0 {
- req.WhereEq("aid", aid)
- }
- if oid > 0 {
- req.WhereEq("oid", oid)
- req.WhereEq("type", tp)
- }
- switch {
- case len(upMids) > 0 && len(status) > 0:
- cmbs := &elastic.Combo{}
- cmbu := &elastic.Combo{}
- var (
- statusInf []interface{}
- upMidsInf []interface{}
- )
- for _, s := range status {
- statusInf = append(statusInf, s)
- }
- for _, s := range upMids {
- upMidsInf = append(upMidsInf, s)
- }
- cmbs.ComboIn([]map[string][]interface{}{
- {"status": statusInf},
- })
- cmbu.ComboIn([]map[string][]interface{}{
- {"up_mid": upMidsInf},
- })
- req = req.WhereCombo(cmbs.MinIn(1).MinAll(1), cmbu.MinIn(1).MinAll(1))
- case len(upMids) > 0:
- req.WhereIn("up_mid", upMids)
- case len(status) > 0:
- req.WhereIn("status", status)
- }
- req.Order("mtime", "desc")
- if err = req.Scan(c, &res); err != nil {
- log.Error("elastic search(%s) error(%v)", req.Params(), err)
- return
- }
- return
- }
- // CountSubtitles .
- func (d *Dao) CountSubtitles(c context.Context, mid int64, upMids []int64, aid, oid int64, tp int32) (countSubtitle *model.CountSubtitleResult, err error) {
- var (
- req *elastic.Request
- fields []string
- res map[string]interface{}
- _searchStatus = []string{
- fmt.Sprint(model.SubtitleStatusDraft),
- fmt.Sprint(model.SubtitleStatusToAudit),
- fmt.Sprint(model.SubtitleStatusAuditBack),
- fmt.Sprint(model.SubtitleStatusPublish),
- fmt.Sprint(model.SubtitleStatusCheckToAudit),
- fmt.Sprint(model.SubtitleStatusCheckPublish),
- fmt.Sprint(model.SubtitleStatusManagerBack),
- }
- result map[string]interface{}
- groupStatus []interface{}
- itemStatus map[string]interface{}
- ok bool
- )
- req = d.elastic.NewRequest("dm_subtitle").Index("subtitle").Fields(fields...).Pn(0).Ps(0)
- if mid > 0 {
- req.WhereEq("mid", mid)
- }
- if aid > 0 {
- req.WhereEq("aid", aid)
- }
- if oid > 0 {
- req.WhereEq("oid", oid)
- req.WhereEq("type", tp)
- }
- if len(upMids) > 0 {
- req.WhereIn("up_mid", upMids)
- }
- req = req.GroupBy(elastic.EnhancedModeGroupBy, "status", nil).WhereIn("status", _searchStatus)
- if err = req.Scan(c, &res); err != nil {
- log.Error("elastic search(%s) error(%v)", req.Params(), err)
- return
- }
- countSubtitle = &model.CountSubtitleResult{}
- if result, ok = res["result"].(map[string]interface{}); !ok {
- return
- }
- if groupStatus, ok = result["group_by_status"].([]interface{}); !ok {
- return
- }
- for _, item := range groupStatus {
- if itemStatus, ok = item.(map[string]interface{}); ok {
- docCount, _ := itemStatus["doc_count"].(float64)
- switch itemStatus["key"] {
- case fmt.Sprint(model.SubtitleStatusDraft):
- countSubtitle.Draft += int64(docCount)
- case fmt.Sprint(model.SubtitleStatusToAudit):
- countSubtitle.ToAudit += int64(docCount)
- case fmt.Sprint(model.SubtitleStatusAuditBack):
- countSubtitle.AuditBack += int64(docCount)
- case fmt.Sprint(model.SubtitleStatusPublish):
- countSubtitle.Publish += int64(docCount)
- case fmt.Sprint(model.SubtitleStatusCheckToAudit):
- countSubtitle.ToAudit += int64(docCount)
- case fmt.Sprint(model.SubtitleStatusCheckPublish):
- countSubtitle.Publish += int64(docCount)
- case fmt.Sprint(model.SubtitleStatusManagerBack):
- countSubtitle.AuditBack += int64(docCount)
- }
- }
- }
- return
- }
- // UptSearchRecentState .
- func (d *Dao) UptSearchRecentState(c context.Context, dmids []int64, oid int64, state, tp int32) (err error) {
- upt := d.elastic.NewUpdate("dm_home")
- year, month, _ := time.Now().Date()
- yearPre, monthPre, _ := time.Now().AddDate(0, -1, 0).Date()
- for _, dmid := range dmids {
- data := &model.UptSearchDMState{
- ID: dmid,
- Oid: oid,
- State: state,
- Type: tp,
- Mtime: time.Now().Format("2006-01-02 15:04:05"),
- }
- upt.AddData(fmt.Sprintf("dm_home_%v",
- fmt.Sprintf("%d_%02d", yearPre, int(monthPre)),
- ), data)
- upt.AddData(fmt.Sprintf("dm_home_%v",
- fmt.Sprintf("%d_%02d", year, int(month)),
- ), data)
- }
- if err = upt.Do(c); err != nil {
- log.Error("update.Do() params(%s) error(%v)", upt.Params(), err)
- }
- return
- }
- // UptSearchRecentAttr .
- func (d *Dao) UptSearchRecentAttr(c context.Context, dmids []int64, oid int64, attr, tp int32) (err error) {
- var bits []int64
- for k, v := range strconv.FormatInt(int64(attr), 2) {
- if v == 49 {
- bits = append(bits, int64(k+1))
- }
- }
- upt := d.elastic.NewUpdate("dm_home")
- year, month, _ := time.Now().Date()
- yearPre, monthPre, _ := time.Now().AddDate(0, -1, 0).Date()
- for _, dmid := range dmids {
- data := &model.UptSearchDMAttr{
- ID: dmid,
- Oid: oid,
- Attr: attr,
- AttrFormat: bits,
- Type: tp,
- Mtime: time.Now().Format("2006-01-02 15:04:05"),
- }
- upt.AddData(fmt.Sprintf("dm_home_%v",
- fmt.Sprintf("%d_%02d", yearPre, int(monthPre)),
- ), data)
- upt.AddData(fmt.Sprintf("dm_home_%v",
- fmt.Sprintf("%d_%02d", year, int(month)),
- ), data)
- }
- if err = upt.Do(c); err != nil {
- log.Error("update.Do() params(%s) error(%v)", upt.Params(), err)
- }
- return
- }
- // UptSearchRecentPool .
- func (d *Dao) UptSearchRecentPool(c context.Context, dmids []int64, oid int64, pool, tp int32) (err error) {
- upt := d.elastic.NewUpdate("dm_home")
- year, month, _ := time.Now().Date()
- yearPre, monthPre, _ := time.Now().AddDate(0, -1, 0).Date()
- for _, dmid := range dmids {
- data := &model.UptSearchDMPool{
- ID: dmid,
- Oid: oid,
- Pool: pool,
- Type: tp,
- Mtime: time.Now().Format("2006-01-02 15:04:05"),
- }
- upt.AddData(fmt.Sprintf("dm_home_%v",
- fmt.Sprintf("%d_%02d", yearPre, int(monthPre)),
- ), data)
- upt.AddData(fmt.Sprintf("dm_home_%v",
- fmt.Sprintf("%d_%02d", year, int(month)),
- ), data)
- }
- if err = upt.Do(c); err != nil {
- log.Error("update.Do() params(%s) error(%v)", upt.Params(), err)
- }
- return
- }
- // SearhcDmRecent .
- func (d *Dao) SearhcDmRecent(c context.Context, param *model.SearchRecentDMParam) (res *model.SearchRecentDMResult, err error) {
- var (
- req *elastic.Request
- )
- year, month, _ := time.Now().Date()
- yearPre, monthPre, _ := time.Now().AddDate(0, -1, 0).Date()
- req = d.elastic.NewRequest("dm_home").Index(fmt.Sprintf("dm_home_%v,dm_home_%v",
- fmt.Sprintf("%d_%02d", year, int(month)),
- fmt.Sprintf("%d_%02d", yearPre, int(monthPre)),
- )).Fields(_dmRecentFields...).Pn(param.Pn).Ps(param.Ps)
- if param.Type > 0 {
- req.WhereEq("type", param.Type)
- }
- if param.UpMid > 0 {
- req.WhereEq("o_mid", param.UpMid)
- }
- if len(param.States) > 0 {
- req.WhereIn("state", param.States)
- }
- req.WhereRange("ctime", time.Now().Local().AddDate(0, 0, -30).Format(_dataTimeFormat), time.Now().Local().Format(_dataTimeFormat), elastic.RangeScopeLcRo)
- req.Order(param.Field, param.Sort)
- res = &model.SearchRecentDMResult{}
- if err = req.Scan(c, &res); err != nil {
- log.Error("search params(%s), error(%v)", req.Params(), err)
- }
- return
- }
|