144 lines
3.0 KiB
Go
144 lines
3.0 KiB
Go
package income
|
||
|
||
import (
|
||
"bytes"
|
||
"context"
|
||
"fmt"
|
||
"strconv"
|
||
"strings"
|
||
"time"
|
||
|
||
model "go-common/app/job/main/growup/model/income"
|
||
task "go-common/app/job/main/growup/service"
|
||
|
||
"go-common/library/log"
|
||
)
|
||
|
||
// BGMs map[avid][]*model.BGM,
|
||
func (s *Service) BGMs(c context.Context, limit int64) (bm map[int64][]*model.BGM, err error) {
|
||
var id int64
|
||
bm = make(map[int64][]*model.BGM)
|
||
for {
|
||
var bs []*model.BGM
|
||
bs, id, err = s.dao.GetBGM(c, id, limit)
|
||
if err != nil {
|
||
return
|
||
}
|
||
if len(bs) == 0 {
|
||
break
|
||
}
|
||
for _, b := range bs {
|
||
if _, ok := bm[b.AID]; ok {
|
||
bm[b.AID] = append(bm[b.AID], b)
|
||
} else {
|
||
bm[b.AID] = []*model.BGM{b}
|
||
}
|
||
}
|
||
}
|
||
return
|
||
}
|
||
|
||
func (s *Service) batchInsertBGMs(c context.Context, bs []*model.BGM) (err error) {
|
||
var (
|
||
buff = make([]*model.BGM, 2000)
|
||
buffEnd = 0
|
||
)
|
||
for _, b := range bs {
|
||
buff[buffEnd] = b
|
||
buffEnd++
|
||
if buffEnd >= 2000 {
|
||
values := bgmValues(buff[:buffEnd])
|
||
buffEnd = 0
|
||
_, err = s.dao.InsertBGM(c, values)
|
||
if err != nil {
|
||
return
|
||
}
|
||
}
|
||
}
|
||
if buffEnd > 0 {
|
||
values := bgmValues(buff[:buffEnd])
|
||
buffEnd = 0
|
||
_, err = s.dao.InsertBGM(c, values)
|
||
}
|
||
return
|
||
}
|
||
|
||
func bgmValues(bs []*model.BGM) (values string) {
|
||
var buf bytes.Buffer
|
||
for _, b := range bs {
|
||
buf.WriteString("(")
|
||
buf.WriteString(strconv.FormatInt(b.MID, 10))
|
||
buf.WriteByte(',')
|
||
buf.WriteString(strconv.FormatInt(b.SID, 10))
|
||
buf.WriteByte(',')
|
||
buf.WriteString(strconv.FormatInt(b.AID, 10))
|
||
buf.WriteByte(',')
|
||
buf.WriteString(strconv.FormatInt(b.CID, 10))
|
||
buf.WriteByte(',')
|
||
buf.WriteString("'" + b.JoinAt + "'")
|
||
buf.WriteByte(',')
|
||
buf.WriteString("\"" + strings.Replace(b.Title, "\"", "\\\"", -1) + "\"")
|
||
buf.WriteString(")")
|
||
buf.WriteByte(',')
|
||
}
|
||
if buf.Len() > 0 {
|
||
buf.Truncate(buf.Len() - 1)
|
||
}
|
||
values = buf.String()
|
||
buf.Reset()
|
||
return
|
||
}
|
||
|
||
const query = "{\"select\": [],\"page\": {\"skip\": %d,\"limit\": %d}}"
|
||
|
||
func (s *Service) getBGM(c context.Context) (bgms []*model.BGM, err error) {
|
||
from, limit := 0, 1000
|
||
var info []*model.BGM
|
||
for {
|
||
info, err = s.dp.SendBGMRequest(c, fmt.Sprintf(query, from, limit))
|
||
if err != nil {
|
||
log.Error("s.getBGM error(%v)", err)
|
||
return
|
||
}
|
||
if len(info) == 0 {
|
||
break
|
||
}
|
||
bgms = append(bgms, info...)
|
||
from += len(info)
|
||
time.Sleep(15 * time.Second) // 数据平台限流,api 10s内只能请求一次
|
||
}
|
||
log.Info("get bgm data total (%d) rows", from)
|
||
return
|
||
}
|
||
|
||
// SyncBgmInfo sync bgm info from data platform
|
||
func (s *Service) SyncBgmInfo(c context.Context) (err error) {
|
||
defer func() {
|
||
task.GetTaskService().SetTaskStatus(c, task.TaskBgmSync, time.Now().AddDate(0, 0, -1).Format(_layout), err)
|
||
}()
|
||
err = s.delBGM(c)
|
||
if err != nil {
|
||
return
|
||
}
|
||
bgms, err := s.getBGM(c)
|
||
if err != nil {
|
||
return
|
||
}
|
||
return s.batchInsertBGMs(c, bgms)
|
||
}
|
||
|
||
func (s *Service) delBGM(c context.Context) (err error) {
|
||
var limit int64 = 2000
|
||
for {
|
||
var rows int64
|
||
rows, err = s.dao.DelBGM(c, limit)
|
||
if err != nil {
|
||
return
|
||
}
|
||
if rows < limit {
|
||
break
|
||
}
|
||
}
|
||
return
|
||
}
|