319 lines
9.8 KiB
Go
319 lines
9.8 KiB
Go
package income
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"strconv"
|
|
"strings"
|
|
"time"
|
|
|
|
model "go-common/app/job/main/growup/model/income"
|
|
|
|
"go-common/library/log"
|
|
xtime "go-common/library/time"
|
|
)
|
|
|
|
var (
|
|
_upIncomeWeekly = "up_income_weekly"
|
|
_upIncomeMonthly = "up_income_monthly"
|
|
)
|
|
|
|
func (s *UpIncomeSvr) handleUpIncomeWeeklyAndMonthly(
|
|
c context.Context,
|
|
date time.Time,
|
|
upAvStatisCh chan map[int64]*model.UpArchStatis,
|
|
upCmStatisCh chan map[int64]*model.UpArchStatis,
|
|
upBgmStatisCh chan map[int64]*model.UpArchStatis,
|
|
upSliceCh chan []*model.UpIncome) (weeklyMap, monthlyMap map[int64]*model.UpIncome, err error) {
|
|
weeklyMap, monthlyMap, err = s.GetUpIncomeWeeklyAndMonthly(c, date)
|
|
if err != nil {
|
|
log.Error("s.GetUpIncomeWeeklyAndMonthly error(%v)", err)
|
|
return
|
|
}
|
|
upAvStatis := <-upAvStatisCh
|
|
upCmStatis := <-upCmStatisCh
|
|
upBgmStatis := <-upBgmStatisCh
|
|
s.calUpIncomeWeeklyAndMonthly(weeklyMap, monthlyMap, upAvStatis, upCmStatis, upBgmStatis, upSliceCh)
|
|
return
|
|
}
|
|
|
|
// GetUpIncomeWeeklyAndMonthly get up_income_weekly and up_income_monthly
|
|
func (s *UpIncomeSvr) GetUpIncomeWeeklyAndMonthly(c context.Context, date time.Time) (weeklyMap map[int64]*model.UpIncome, monthlyMap map[int64]*model.UpIncome, err error) {
|
|
upIncomeWeekly, err := s.GetUpIncomeTable(c, startWeeklyDate, _upIncomeWeekly)
|
|
if err != nil {
|
|
log.Error("s.GetUpIncomeTable error(%v)", err)
|
|
return
|
|
}
|
|
|
|
upIncomeMonthly, err := s.GetUpIncomeTable(c, startMonthlyDate, _upIncomeMonthly)
|
|
if err != nil {
|
|
log.Error("s.GetUpIncomeTable error(%v)", err)
|
|
return
|
|
}
|
|
|
|
weeklyMap = make(map[int64]*model.UpIncome)
|
|
monthlyMap = make(map[int64]*model.UpIncome)
|
|
for _, weeklyIncome := range upIncomeWeekly {
|
|
weeklyMap[weeklyIncome.MID] = weeklyIncome
|
|
}
|
|
|
|
for _, monthlyIncome := range upIncomeMonthly {
|
|
monthlyMap[monthlyIncome.MID] = monthlyIncome
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// GetUpIncomeTable get up income table
|
|
func (s *UpIncomeSvr) GetUpIncomeTable(c context.Context, date time.Time, table string) (upIncomes []*model.UpIncome, err error) {
|
|
var id int64
|
|
for {
|
|
upIncome, err1 := s.dao.GetUpIncomeTable(c, table, date.Format(_layout), id, _limitSize)
|
|
if err1 != nil {
|
|
err = err1
|
|
return
|
|
}
|
|
upIncomes = append(upIncomes, upIncome...)
|
|
if len(upIncome) < _limitSize {
|
|
break
|
|
}
|
|
id = upIncome[len(upIncome)-1].ID
|
|
}
|
|
return
|
|
}
|
|
|
|
func (s *UpIncomeSvr) calUpIncomeWeeklyAndMonthly(weeklyMap, monthlyMap map[int64]*model.UpIncome,
|
|
upAvStatis, upCmStatis, upBgmStatis map[int64]*model.UpArchStatis, upSliceCh chan []*model.UpIncome) {
|
|
for upIncome := range upSliceCh {
|
|
s.calUpIncome(upIncome, weeklyMap, monthlyMap, upAvStatis, upCmStatis, upBgmStatis)
|
|
}
|
|
}
|
|
|
|
func (s *UpIncomeSvr) calUpIncome(upIncome []*model.UpIncome, weeklyMap, monthlyMap map[int64]*model.UpIncome,
|
|
upAvStatis, upCmStatis, upBgmStatis map[int64]*model.UpArchStatis) {
|
|
var weeklyAvCount, monthlyAvCount int
|
|
var weeklyCmCount, monthlyCmCount int
|
|
var weeklyBgmCount, monthlyBgmCount int
|
|
for _, income := range upIncome {
|
|
weeklyAvCount, monthlyAvCount = 0, 0
|
|
weeklyCmCount, monthlyCmCount = 0, 0
|
|
weeklyBgmCount, monthlyBgmCount = 0, 0
|
|
if statis, ok := upAvStatis[income.MID]; ok {
|
|
weeklyAvCount = len(strings.Split(statis.WeeklyAIDs, ","))
|
|
monthlyAvCount = len(strings.Split(statis.MonthlyAIDs, ","))
|
|
}
|
|
|
|
if statis, ok := upCmStatis[income.MID]; ok {
|
|
weeklyCmCount = len(strings.Split(statis.WeeklyAIDs, ","))
|
|
monthlyCmCount = len(strings.Split(statis.MonthlyAIDs, ","))
|
|
}
|
|
|
|
if statis, ok := upBgmStatis[income.MID]; ok {
|
|
weeklyBgmCount = len(strings.Split(statis.WeeklyAIDs, ","))
|
|
monthlyBgmCount = len(strings.Split(statis.MonthlyAIDs, ","))
|
|
}
|
|
|
|
if weeklyIncome, ok := weeklyMap[income.MID]; ok {
|
|
updateUpIncome(weeklyIncome, income, weeklyAvCount, weeklyCmCount, weeklyBgmCount)
|
|
} else {
|
|
weeklyMap[income.MID] = addUpIncome(income, startWeeklyDate, weeklyAvCount, weeklyCmCount, weeklyBgmCount)
|
|
}
|
|
|
|
if weeklyIncome, ok := monthlyMap[income.MID]; ok {
|
|
updateUpIncome(weeklyIncome, income, monthlyAvCount, monthlyCmCount, monthlyBgmCount)
|
|
} else {
|
|
monthlyMap[income.MID] = addUpIncome(income, startMonthlyDate, monthlyAvCount, monthlyCmCount, monthlyBgmCount)
|
|
}
|
|
}
|
|
}
|
|
|
|
func addUpIncome(daily *model.UpIncome, fixDate time.Time, avCount, cmCount, bgmCount int) *model.UpIncome {
|
|
return &model.UpIncome{
|
|
MID: daily.MID,
|
|
AvCount: int64(avCount),
|
|
PlayCount: daily.PlayCount,
|
|
AvIncome: daily.AvIncome,
|
|
AvBaseIncome: daily.AvBaseIncome,
|
|
AvTax: daily.AvTax,
|
|
AvTotalIncome: daily.AvTotalIncome,
|
|
|
|
ColumnCount: int64(cmCount),
|
|
ColumnIncome: daily.ColumnIncome,
|
|
ColumnBaseIncome: daily.ColumnBaseIncome,
|
|
ColumnTax: daily.ColumnTax,
|
|
ColumnTotalIncome: daily.ColumnTotalIncome,
|
|
|
|
BgmCount: int64(bgmCount),
|
|
BgmIncome: daily.BgmIncome,
|
|
BgmBaseIncome: daily.BgmBaseIncome,
|
|
BgmTax: daily.BgmTax,
|
|
BgmTotalIncome: daily.BgmTotalIncome,
|
|
|
|
AudioIncome: daily.AudioIncome,
|
|
|
|
TaxMoney: daily.TaxMoney,
|
|
Income: daily.Income,
|
|
BaseIncome: daily.BaseIncome,
|
|
TotalIncome: daily.TotalIncome,
|
|
Date: xtime.Time(fixDate.Unix()),
|
|
DBState: _dbInsert,
|
|
}
|
|
}
|
|
|
|
func updateUpIncome(origin, daily *model.UpIncome, avCount, cmCount, bgmCount int) {
|
|
origin.AvCount = int64(avCount)
|
|
origin.PlayCount += daily.PlayCount
|
|
origin.AvIncome += daily.AvIncome
|
|
origin.AvBaseIncome += daily.AvBaseIncome
|
|
origin.AvTax += daily.AvTax
|
|
origin.AvTotalIncome = daily.AvTotalIncome
|
|
|
|
origin.ColumnCount = int64(cmCount)
|
|
origin.ColumnIncome += daily.ColumnIncome
|
|
origin.ColumnBaseIncome += daily.ColumnBaseIncome
|
|
origin.ColumnTax += daily.ColumnTax
|
|
origin.ColumnTotalIncome = daily.ColumnTotalIncome
|
|
|
|
origin.BgmCount = int64(bgmCount)
|
|
origin.BgmIncome += daily.BgmIncome
|
|
origin.BgmBaseIncome += daily.BgmBaseIncome
|
|
origin.BgmTax += daily.BgmTax
|
|
origin.BgmTotalIncome = daily.BgmTotalIncome
|
|
|
|
origin.AudioIncome += daily.AudioIncome
|
|
|
|
origin.TaxMoney += daily.TaxMoney
|
|
origin.Income += daily.Income
|
|
origin.BaseIncome += daily.BaseIncome
|
|
origin.TotalIncome = daily.TotalIncome
|
|
origin.DBState = _dbUpdate
|
|
}
|
|
|
|
// UpIncomeDBStore insert up_income
|
|
func (s *UpIncomeSvr) UpIncomeDBStore(c context.Context, weeklyMap, monthlyMap map[int64]*model.UpIncome) (err error) {
|
|
err = s.UpIncomeDBStoreBatch(c, _upIncomeWeekly, weeklyMap)
|
|
if err != nil {
|
|
log.Error("s.UpIncomeDBStoreBatch up_income_weekly error(%v)", err)
|
|
return
|
|
}
|
|
|
|
err = s.UpIncomeDBStoreBatch(c, _upIncomeMonthly, monthlyMap)
|
|
if err != nil {
|
|
log.Error("s.UpIncomeDBStoreBatch up_income_monthly error(%v)", err)
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
// UpIncomeDBStoreBatch up income db batch store
|
|
func (s *UpIncomeSvr) UpIncomeDBStoreBatch(c context.Context, table string, upIncomeMap map[int64]*model.UpIncome) error {
|
|
insert, update := make([]*model.UpIncome, batchSize), make([]*model.UpIncome, batchSize)
|
|
insertIndex, updateIndex := 0, 0
|
|
for _, income := range upIncomeMap {
|
|
if income.DBState == _dbInsert {
|
|
insert[insertIndex] = income
|
|
insertIndex++
|
|
} else if income.DBState == _dbUpdate {
|
|
update[updateIndex] = income
|
|
updateIndex++
|
|
}
|
|
|
|
if insertIndex >= batchSize {
|
|
_, err := s.upIncomeBatchInsert(c, table, insert[:insertIndex])
|
|
if err != nil {
|
|
log.Error("s.upIncomeBatchInsert error(%v)", err)
|
|
return err
|
|
}
|
|
insertIndex = 0
|
|
}
|
|
|
|
if updateIndex >= batchSize {
|
|
_, err := s.upIncomeBatchInsert(c, table, update[:updateIndex])
|
|
if err != nil {
|
|
log.Error("s.upIncomeBatchInsert error(%v)", err)
|
|
return err
|
|
}
|
|
updateIndex = 0
|
|
}
|
|
}
|
|
|
|
if insertIndex > 0 {
|
|
_, err := s.upIncomeBatchInsert(c, table, insert[:insertIndex])
|
|
if err != nil {
|
|
log.Error("s.upIncomeBatchInsert error(%v)", err)
|
|
return err
|
|
}
|
|
}
|
|
|
|
if updateIndex > 0 {
|
|
_, err := s.upIncomeBatchInsert(c, table, update[:updateIndex])
|
|
if err != nil {
|
|
log.Error("s.upIncomeBatchInsert error(%v)", err)
|
|
return err
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (s *UpIncomeSvr) upIncomeBatchInsert(c context.Context, table string, us []*model.UpIncome) (rows int64, err error) {
|
|
var buf bytes.Buffer
|
|
for _, u := range us {
|
|
buf.WriteString("(")
|
|
buf.WriteString(strconv.FormatInt(u.MID, 10))
|
|
buf.WriteByte(',')
|
|
buf.WriteString(strconv.FormatInt(u.AvCount, 10))
|
|
buf.WriteByte(',')
|
|
buf.WriteString(strconv.FormatInt(u.PlayCount, 10))
|
|
buf.WriteByte(',')
|
|
buf.WriteString(strconv.FormatInt(u.AvIncome, 10))
|
|
buf.WriteByte(',')
|
|
buf.WriteString(strconv.FormatInt(u.AudioIncome, 10))
|
|
buf.WriteByte(',')
|
|
buf.WriteString(strconv.FormatInt(u.ColumnCount, 10))
|
|
buf.WriteByte(',')
|
|
buf.WriteString(strconv.FormatInt(u.ColumnIncome, 10))
|
|
buf.WriteByte(',')
|
|
buf.WriteString(strconv.FormatInt(u.BgmCount, 10))
|
|
buf.WriteByte(',')
|
|
buf.WriteString(strconv.FormatInt(u.BgmIncome, 10))
|
|
buf.WriteByte(',')
|
|
buf.WriteString(strconv.FormatInt(u.TaxMoney, 10))
|
|
buf.WriteByte(',')
|
|
buf.WriteString(strconv.FormatInt(u.Income, 10))
|
|
buf.WriteByte(',')
|
|
buf.WriteString(strconv.FormatInt(u.TotalIncome, 10))
|
|
buf.WriteByte(',')
|
|
buf.WriteString(strconv.FormatInt(u.AvBaseIncome, 10))
|
|
buf.WriteByte(',')
|
|
buf.WriteString(strconv.FormatInt(u.AvTax, 10))
|
|
buf.WriteByte(',')
|
|
buf.WriteString(strconv.FormatInt(u.ColumnBaseIncome, 10))
|
|
buf.WriteByte(',')
|
|
buf.WriteString(strconv.FormatInt(u.ColumnTax, 10))
|
|
buf.WriteByte(',')
|
|
buf.WriteString(strconv.FormatInt(u.BgmBaseIncome, 10))
|
|
buf.WriteByte(',')
|
|
buf.WriteString(strconv.FormatInt(u.BgmTax, 10))
|
|
buf.WriteByte(',')
|
|
buf.WriteString("'" + u.Date.Time().Format(_layout) + "'")
|
|
buf.WriteByte(',')
|
|
buf.WriteString(strconv.FormatInt(u.BaseIncome, 10))
|
|
buf.WriteByte(',')
|
|
buf.WriteString(strconv.FormatInt(u.AvTotalIncome, 10))
|
|
buf.WriteByte(',')
|
|
buf.WriteString(strconv.FormatInt(u.ColumnTotalIncome, 10))
|
|
buf.WriteByte(',')
|
|
buf.WriteString(strconv.FormatInt(u.BgmTotalIncome, 10))
|
|
buf.WriteString(")")
|
|
buf.WriteByte(',')
|
|
}
|
|
if buf.Len() > 0 {
|
|
buf.Truncate(buf.Len() - 1)
|
|
}
|
|
values := buf.String()
|
|
buf.Reset()
|
|
rows, err = s.dao.InsertUpIncomeTable(c, table, values)
|
|
return
|
|
}
|