123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227 |
- package income
- import (
- "context"
- "fmt"
- "sort"
- "strconv"
- "time"
- "go-common/app/admin/main/growup/dao/resource"
- model "go-common/app/admin/main/growup/model/income"
- "go-common/library/log"
- )
- // ArchiveChargeStatis av_charge statis
- func (s *Service) ArchiveChargeStatis(c context.Context, categoryID []int64, typ, groupType int, fromTime, toTime int64) (data interface{}, err error) {
- table := setChargeTableByGroup(typ, groupType)
- from := getDateByGroup(groupType, time.Unix(fromTime, 0))
- to := getDateByGroup(groupType, time.Unix(toTime, 0))
- query := formatArchiveQuery(categoryID, from, to)
- archives, err := s.GetArchiveChargeStatis(c, table, query)
- if err != nil {
- log.Error("s.GetArchiveChargeStatis error(%v)", err)
- return
- }
- data = archiveChargeStatis(archives, from, to, groupType)
- return
- }
- func archiveChargeStatis(archs []*model.ArchiveChargeStatis, from, to time.Time, groupType int) interface{} {
- avsMap := make(map[string]*model.ArchiveChargeStatis)
- ctgyMap := make(map[string]bool)
- for _, arch := range archs {
- date := formatDateByGroup(arch.CDate.Time(), groupType)
- ctgykey := date + strconv.FormatInt(arch.CategroyID, 10)
- if val, ok := avsMap[date]; ok {
- val.Avs += arch.Avs
- if !ctgyMap[ctgykey] {
- val.Charge += arch.Charge
- ctgyMap[ctgykey] = true
- }
- } else {
- avsMap[date] = &model.ArchiveChargeStatis{
- Avs: arch.Avs,
- Charge: arch.Charge,
- }
- ctgyMap[ctgykey] = true
- }
- }
- charge, counts, xAxis := []string{}, []int64{}, []string{}
- // get result by date
- to = to.AddDate(0, 0, 1)
- for from.Before(to) {
- dateStr := formatDateByGroup(from, groupType)
- xAxis = append(xAxis, dateStr)
- if val, ok := avsMap[dateStr]; ok {
- charge = append(charge, fmt.Sprintf("%.2f", float64(val.Charge)/float64(100)))
- counts = append(counts, val.Avs)
- } else {
- charge = append(charge, "0")
- counts = append(counts, int64(0))
- }
- from = addDayByGroup(groupType, from)
- }
- return map[string]interface{}{
- "counts": counts,
- "charges": charge,
- "xaxis": xAxis,
- }
- }
- // ArchiveChargeSection get av_charge section
- func (s *Service) ArchiveChargeSection(c context.Context, categoryID []int64, typ, groupType int, fromTime, toTime int64) (data interface{}, err error) {
- table := setChargeTableByGroup(typ, groupType)
- from := getDateByGroup(groupType, time.Unix(fromTime, 0))
- to := getDateByGroup(groupType, time.Unix(toTime, 0))
- query := formatArchiveQuery(categoryID, from, to)
- archives, err := s.GetArchiveChargeStatis(c, table, query)
- if err != nil {
- log.Error("s.GetArchiveChargeStatis error(%v)", err)
- return
- }
- data = archiveChargeSection(archives, from, to, groupType)
- return
- }
- func archiveChargeSection(archs []*model.ArchiveChargeStatis, from, to time.Time, groupType int) interface{} {
- ret := make([]map[string]interface{}, 0)
- avsMap := make(map[string][]int64)
- for _, arch := range archs {
- date := formatDateByGroup(arch.CDate.Time(), groupType)
- if val, ok := avsMap[date]; ok {
- val[arch.MoneySection] += arch.Avs
- } else {
- avsMap[date] = make([]int64, 12)
- avsMap[date][arch.MoneySection] = arch.Avs
- ret = append(ret, map[string]interface{}{
- "date_format": date,
- "sections": avsMap[date],
- })
- }
- }
- return ret
- }
- // ArchiveChargeDetail archive charge details
- func (s *Service) ArchiveChargeDetail(c context.Context, aid int64, typ int) (archives []*model.ArchiveCharge, err error) {
- switch typ {
- case _video:
- archives, err = s.GetAvCharges(c, aid)
- case _column:
- archives, err = s.dao.GetColumnCharges(c, aid)
- case _bgm:
- archives, err = s.dao.GetBgmCharges(c, aid)
- default:
- err = fmt.Errorf("type error")
- }
- if err != nil {
- log.Error("s.GetArchives(%d) error(%v)", typ, err)
- return
- }
- err = s.archiveChargeDetail(c, archives, aid, typ)
- return
- }
- func (s *Service) archiveChargeDetail(c context.Context, archs []*model.ArchiveCharge, aid int64, typ int) (err error) {
- if len(archs) == 0 {
- return
- }
- // get up nickname
- nickname, err := resource.NameByMID(c, archs[0].MID)
- if err != nil {
- return
- }
- var table, query string
- switch typ {
- case _video:
- table, query = "av_charge_statis", fmt.Sprintf("av_id = %d", aid)
- case _column:
- table, query = "column_charge_statis", fmt.Sprintf("aid = %d", aid)
- case _bgm:
- table, query = "bgm_charge_statis", fmt.Sprintf("sid = %d", aid)
- }
- totalCharge, err := s.dao.GetTotalCharge(c, table, query)
- if err != nil {
- log.Error("s.GetTotalCharge error(%v)", err)
- return
- }
- sort.Slice(archs, func(i, j int) bool {
- return archs[i].Date > archs[j].Date
- })
- for _, arch := range archs {
- arch.TotalCharge = totalCharge
- arch.Nickname = nickname
- totalCharge -= arch.Charge
- }
- return
- }
- // BgmChargeDetail bgm charge detail
- func (s *Service) BgmChargeDetail(c context.Context, sid int64) (archives []*model.ArchiveCharge, err error) {
- archives = make([]*model.ArchiveCharge, 0)
- bgms, err := s.dao.GetBgmCharges(c, sid)
- if err != nil {
- log.Error("s.dao.GetBgmCharges error(%v)", err)
- return
- }
- avIDs := make(map[int64]struct{})
- for _, bgm := range bgms {
- avIDs[bgm.AvID] = struct{}{}
- }
- for avID := range avIDs {
- var avs []*model.ArchiveCharge
- avs, err = s.ArchiveChargeDetail(c, avID, _video)
- if err != nil {
- log.Error("s.ArchiveChargeDetail error(%v)", err)
- return
- }
- archives = append(archives, avs...)
- }
- return
- }
- // UpRatio up charge ratio
- func (s *Service) UpRatio(c context.Context, from, limit int64) (map[int64]int64, error) {
- return s.dao.UpRatio(c, from, limit)
- }
- // GetAvCharges get av charge by av id
- func (s *Service) GetAvCharges(c context.Context, avID int64) (avs []*model.ArchiveCharge, err error) {
- avs = make([]*model.ArchiveCharge, 0)
- for i := 1; i <= 12; i++ {
- var av []*model.ArchiveCharge
- av, err = s.dao.GetAvDailyCharge(c, i, avID)
- if err != nil {
- return
- }
- avs = append(avs, av...)
- }
- return
- }
- // GetArchiveChargeStatis get archive charge date statis
- func (s *Service) GetArchiveChargeStatis(c context.Context, table, query string) (archs []*model.ArchiveChargeStatis, err error) {
- offset, size := 0, 2000
- for {
- var arch []*model.ArchiveChargeStatis
- arch, err = s.dao.GetArchiveChargeStatis(c, table, query, offset, size)
- if err != nil {
- return
- }
- archs = append(archs, arch...)
- if len(arch) < size {
- break
- }
- offset += len(arch)
- }
- return
- }
|