You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
318 lines
9.8 KiB
318 lines
9.8 KiB
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 |
|
}
|
|
|