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.
251 lines
6.1 KiB
251 lines
6.1 KiB
package charge |
|
|
|
import ( |
|
"context" |
|
"fmt" |
|
"time" |
|
|
|
model "go-common/app/job/main/growup/model/charge" |
|
|
|
"go-common/library/log" |
|
"golang.org/x/sync/errgroup" |
|
) |
|
|
|
var ( |
|
_bgmDailyCharge = "bgm_daily_charge" |
|
_bgmWeeklyCharge = "bgm_weekly_charge" |
|
_bgmMonthlyCharge = "bgm_monthly_charge" |
|
|
|
_bgmDailyStatis = "bgm_charge_daily_statis" |
|
_bgmWeeklyStatis = "bgm_charge_weekly_statis" |
|
_bgmMonthlyStatis = "bgm_charge_monthly_statis" |
|
) |
|
|
|
func (s *Service) runBgm(c context.Context, date time.Time, avBgmCharge chan []*model.AvCharge) (err error) { |
|
startWeeklyDate = getStartWeeklyDate(date) |
|
startMonthlyDate = getStartMonthlyDate(date) |
|
var ( |
|
readGroup errgroup.Group |
|
dailyMap = make(map[string]*model.BgmCharge) |
|
sourceCh = make(chan []*model.BgmCharge, 1000) |
|
dailyStatisCh = make(chan []*model.BgmCharge, 1000) |
|
bgmCh = make(chan []*model.BgmCharge, 1000) |
|
) |
|
|
|
readGroup.Go(func() (err error) { |
|
dailyMap, err = s.bgmCharges(c, date, sourceCh, avBgmCharge) |
|
if err != nil { |
|
log.Error("s.bgmCharges error(%v)", err) |
|
return |
|
} |
|
log.Info("get bgm_daily_charge finished") |
|
return |
|
}) |
|
|
|
readGroup.Go(func() (err error) { |
|
defer func() { |
|
close(bgmCh) |
|
close(dailyStatisCh) |
|
}() |
|
for charges := range sourceCh { |
|
bgmCh <- charges |
|
dailyStatisCh <- charges |
|
} |
|
return |
|
}) |
|
|
|
var ( |
|
weeklyMap map[string]*model.BgmCharge |
|
monthlyMap map[string]*model.BgmCharge |
|
statisMap map[string]*model.BgmStatis |
|
weeklyCh = make(chan map[string]*model.BgmCharge, 1) |
|
monthlyCh = make(chan map[string]*model.BgmCharge, 1) |
|
) |
|
readGroup.Go(func() (err error) { |
|
defer func() { |
|
close(weeklyCh) |
|
close(monthlyCh) |
|
}() |
|
weeklyMap, monthlyMap, statisMap, err = s.handleBgm(c, date, bgmCh) |
|
if err != nil { |
|
log.Error("s.handleBgm error(%v)", err) |
|
return |
|
} |
|
weeklyCh <- weeklyMap |
|
monthlyCh <- monthlyMap |
|
log.Info("handleBgm finished") |
|
return |
|
}) |
|
|
|
var ( |
|
dateStatis = &SectionEntries{} |
|
bgmDaily = make(chan []*model.Archive, 2000) |
|
bgmWeekly = make(chan []*model.Archive, 1) |
|
bgmMonthly = make(chan []*model.Archive, 1) |
|
) |
|
readGroup.Go(func() (err error) { |
|
defer close(bgmDaily) |
|
for bgms := range dailyStatisCh { |
|
bgmDaily <- transBgm2Archive(bgms) |
|
} |
|
return |
|
}) |
|
readGroup.Go(func() (err error) { |
|
defer close(bgmWeekly) |
|
bgmWeekly <- transBgmMap2Archive(<-weeklyCh) |
|
return |
|
}) |
|
readGroup.Go(func() (err error) { |
|
defer close(bgmMonthly) |
|
bgmMonthly <- transBgmMap2Archive(<-monthlyCh) |
|
return |
|
}) |
|
|
|
readGroup.Go(func() (err error) { |
|
dateStatis.daily, err = s.handleDateStatis(c, bgmDaily, date, _bgmDailyStatis) |
|
if err != nil { |
|
log.Error("s.handleDateStatis(%s) error(%v)", _bgmDailyStatis, err) |
|
} |
|
return |
|
}) |
|
readGroup.Go(func() (err error) { |
|
dateStatis.weekly, err = s.handleDateStatis(c, bgmWeekly, startWeeklyDate, _bgmWeeklyStatis) |
|
if err != nil { |
|
log.Error("s.handleDateStatis(%s) error(%v)", _bgmWeeklyStatis, err) |
|
} |
|
return |
|
}) |
|
readGroup.Go(func() (err error) { |
|
dateStatis.monthly, err = s.handleDateStatis(c, bgmMonthly, startMonthlyDate, _bgmMonthlyStatis) |
|
if err != nil { |
|
log.Error("s.handleDateStatis(%s) error(%v)", _bgmMonthlyStatis, err) |
|
} |
|
return |
|
}) |
|
|
|
if err = readGroup.Wait(); err != nil { |
|
log.Error("run readGroup.Wait error(%v)", err) |
|
return |
|
} |
|
|
|
{ |
|
if len(dailyMap) == 0 { |
|
err = fmt.Errorf("Error: insert 0 bgm_daily_charge") |
|
return |
|
} |
|
if len(weeklyMap) == 0 { |
|
err = fmt.Errorf("Error: insert 0 bgm_weekly_charge") |
|
return |
|
} |
|
if len(monthlyMap) == 0 { |
|
err = fmt.Errorf("Error: insert 0 bgm_monthly_charge") |
|
return |
|
} |
|
if len(statisMap) == 0 { |
|
err = fmt.Errorf("Error: insert 0 bgm_charge_statis") |
|
return |
|
} |
|
if len(dateStatis.daily) == 0 { |
|
err = fmt.Errorf("Error: insert 0 bgm_charge_daily_statis") |
|
return |
|
} |
|
if len(dateStatis.weekly) == 0 { |
|
err = fmt.Errorf("Error: insert 0 bgm_charge_weekly_statis") |
|
return |
|
} |
|
if len(dateStatis.monthly) == 0 { |
|
err = fmt.Errorf("Error: insert 0 bgm_charge_monthly_statis") |
|
return |
|
} |
|
} |
|
|
|
// persist |
|
var writeGroup errgroup.Group |
|
// bgm_daily_charge |
|
writeGroup.Go(func() (err error) { |
|
err = s.bgmDBStore(c, _bgmDailyCharge, dailyMap) |
|
if err != nil { |
|
log.Error("s.bgmDBStore bgm_daily_charge error(%v)", err) |
|
return |
|
} |
|
log.Info("insert bgm_daily_charge : %d", len(dailyMap)) |
|
|
|
// bgm_weekly_charge |
|
err = s.bgmDBStore(c, _bgmWeeklyCharge, weeklyMap) |
|
if err != nil { |
|
log.Error("s.bgmDBStore bgm_weekly_charge error(%v)", err) |
|
return |
|
} |
|
log.Info("insert bgm_weekly_charge : %d", len(weeklyMap)) |
|
|
|
// bgm_monthly_charge |
|
err = s.bgmDBStore(c, _bgmMonthlyCharge, monthlyMap) |
|
if err != nil { |
|
log.Error("s.bgmDBStore bgm_monthly_charge error(%v)", err) |
|
return |
|
} |
|
log.Info("insert bgm_monthly_charge : %d", len(monthlyMap)) |
|
|
|
// bgm_charge_statis |
|
err = s.bgmStatisDBStore(c, statisMap) |
|
if err != nil { |
|
log.Error("s.bgmStatisDBStore error(%v)", err) |
|
return |
|
} |
|
log.Info("insert bgm_charge_statis : %d", len(statisMap)) |
|
|
|
// bgm_charge_daily_statis |
|
_, err = s.dateStatisInsert(c, dateStatis.daily, _bgmDailyStatis) |
|
if err != nil { |
|
log.Error("s.dateStatisInsert error(%v)", err) |
|
return |
|
} |
|
log.Info("insert bgm_charge_daily_statis : %d", len(dateStatis.daily)) |
|
|
|
// bgm_charge_weekly_statis |
|
_, err = s.dateStatisInsert(c, dateStatis.weekly, _bgmWeeklyStatis) |
|
if err != nil { |
|
log.Error("s.dateStatisInsert error(%v)", err) |
|
return |
|
} |
|
log.Info("insert bgm_charge_weekly_statis : %d", len(dateStatis.weekly)) |
|
|
|
// bgm_charge_monthly_statis |
|
_, err = s.dateStatisInsert(c, dateStatis.monthly, _bgmMonthlyStatis) |
|
if err != nil { |
|
log.Error("s.dateStatisInsert error(%v)", err) |
|
return |
|
} |
|
log.Info("insert bgm_charge_monthly_statis : %d", len(dateStatis.monthly)) |
|
return |
|
}) |
|
|
|
// writeGroup.Go(func() (err error) { |
|
// return |
|
// }) |
|
// |
|
// writeGroup.Go(func() (err error) { |
|
// return |
|
// }) |
|
// |
|
// writeGroup.Go(func() (err error) { |
|
// return |
|
// }) |
|
// |
|
// writeGroup.Go(func() (err error) { |
|
// return |
|
// }) |
|
// |
|
// writeGroup.Go(func() (err error) { |
|
// return |
|
// }) |
|
// |
|
// writeGroup.Go(func() (err error) { |
|
// return |
|
// }) |
|
|
|
if err = writeGroup.Wait(); err != nil { |
|
log.Error("run writeGroup.Wait error(%v)", err) |
|
} |
|
return |
|
}
|
|
|