go-common/app/job/main/growup/service/creative_budget.go
2019-04-22 18:49:16 +08:00

161 lines
4.3 KiB
Go

package service
import (
"context"
"fmt"
"time"
"go-common/app/job/main/growup/model"
"go-common/library/log"
)
// CreativeBudget creative budget
func (s *Service) CreativeBudget(c context.Context, date time.Time) (err error) {
defer func() {
GetTaskService().SetTaskStatus(c, TaskBudget, date.Format("2006-01-02"), err)
}()
err = GetTaskService().TaskReady(c, date.Format("2006-01-02"), TaskCreativeIncome)
if err != nil {
return
}
ups, err := s.GetUpIncome(c, "up_income", date.Format(_layout))
if err != nil {
log.Error("s.GetUpIncome(up_income) error(%v)", err)
return
}
if len(ups) == 0 {
err = fmt.Errorf("get 0 record from up_income")
return
}
log.Info("daily ups(%d)", len(ups))
monthStart := time.Date(date.Year(), date.Month(), 1, 0, 0, 0, 0, time.Local)
monthUps, err := s.GetUpIncome(c, "up_income_monthly", monthStart.Format(_layout))
if err != nil {
log.Error("s.GetUpIncome(up_income_monthly) error(%v)", err)
return
}
if len(monthUps) == 0 {
err = fmt.Errorf("get 0 record from up_income_monthly")
return
}
log.Info("monthly ups(%d)", len(ups))
preTotalExpense, err := s.dao.GetTotalExpenseByDate(c, date.AddDate(0, 0, -1).Format(_layout))
if err != nil {
log.Error("s.dao.GetTotalExpenseByDate error(%v)", err)
return
}
log.Info("CreativeBudget ready date ok(%s)", date.Format(_layout))
avDaily, cmDaily, bgmDaily := calCreativebudget(ups, date, preTotalExpense)
avMonthly, cmMonthly, bgmMonthly := calCreativebudget(monthUps, date, preTotalExpense)
avMonthly.TotalExpense = avDaily.TotalExpense
cmMonthly.TotalExpense = cmDaily.TotalExpense
bgmMonthly.TotalExpense = bgmDaily.TotalExpense
// insert
if avDaily.Expense > 0 {
_, err = s.dao.InsertDailyExpense(c, avDaily)
if err != nil {
log.Error("s.dao.InsertDailyExpense error(%v)", err)
return
}
_, err = s.dao.InsertMonthlyExpense(c, avMonthly)
if err != nil {
log.Error("s.dao.InsertMonthlyExpense error(%v)", err)
return
}
}
if cmDaily.Expense > 0 {
_, err = s.dao.InsertDailyExpense(c, cmDaily)
if err != nil {
log.Error("s.dao.InsertDailyExpense error(%v)", err)
return
}
_, err = s.dao.InsertMonthlyExpense(c, cmMonthly)
if err != nil {
log.Error("s.dao.InsertMonthlyExpense error(%v)", err)
return
}
}
if bgmDaily.Expense > 0 {
_, err = s.dao.InsertDailyExpense(c, bgmDaily)
if err != nil {
log.Error("s.dao.InsertDailyExpense error(%v)", err)
return
}
_, err = s.dao.InsertMonthlyExpense(c, bgmMonthly)
if err != nil {
log.Error("s.dao.InsertMonthlyExpense error(%v)", err)
}
}
return
}
func calCreativebudget(ups []*model.UpIncome, date time.Time, preTotalExpense map[int64]int64) (avBudget, cmBudget, bgmBudget *model.BudgetExpense) {
avBudget, cmBudget, bgmBudget = &model.BudgetExpense{}, &model.BudgetExpense{}, &model.BudgetExpense{}
var (
avExpense, cmExpense, bgmExpense int64
avCount, cmCount, bgmCount int64
upAvCount, upCmCount, upBgmCount int64
)
for _, up := range ups {
if up.AvIncome > 0 {
avCount += up.AvCount
upAvCount++
}
// add up fix adjust to av
avExpense += up.Income - up.ColumnIncome - up.BgmIncome // TODO up.AvIncome
if up.ColumnIncome > 0 {
cmExpense += up.ColumnIncome
cmCount += up.ColumnCount
upCmCount++
}
if up.BgmIncome > 0 {
bgmExpense += up.BgmIncome
bgmCount += up.BgmCount
upBgmCount++
}
}
if avCount > 0 && upAvCount > 0 {
avBudget = &model.BudgetExpense{
Expense: avExpense,
AvCount: avCount,
UpCount: upAvCount,
UpAvgExpense: avExpense / upAvCount,
AvAvgExpense: avExpense / avCount,
Date: date,
TotalExpense: preTotalExpense[0] + avExpense,
CType: 0,
}
}
if cmCount > 0 && upCmCount > 0 {
cmBudget = &model.BudgetExpense{
Expense: cmExpense,
AvCount: cmCount,
UpCount: upCmCount,
UpAvgExpense: cmExpense / upCmCount,
AvAvgExpense: cmExpense / cmCount,
Date: date,
TotalExpense: preTotalExpense[2] + cmExpense,
CType: 2,
}
}
if bgmCount > 0 && upBgmCount > 0 {
bgmBudget = &model.BudgetExpense{
Expense: bgmExpense,
AvCount: bgmCount,
UpCount: upBgmCount,
UpAvgExpense: bgmExpense / upBgmCount,
AvAvgExpense: bgmExpense / bgmCount,
Date: date,
TotalExpense: preTotalExpense[3] + bgmExpense,
CType: 3,
}
}
return
}