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.
160 lines
4.3 KiB
160 lines
4.3 KiB
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 |
|
}
|
|
|