123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221 |
- package income
- import (
- "context"
- "fmt"
- "sort"
- "time"
- model "go-common/app/admin/main/growup/model/income"
- "go-common/app/admin/main/growup/service"
- "go-common/library/log"
- "go-common/library/xstr"
- )
- // UpWithdraw get up_account infos
- func (s *Service) UpWithdraw(c context.Context, mids []int64, isDeleted, from, limit int) (data []*model.UpWithdrawRes, total int64, err error) {
- query := ""
- if len(mids) != 0 {
- query += fmt.Sprintf("mid in (%s)", xstr.JoinInts(mids))
- }
- total, err = s.UpAccountCount(c, query, isDeleted)
- if err != nil {
- log.Error("s.UpAccountCount error(%v)", err)
- return
- }
- ups, err := s.ListUpAccount(c, query, isDeleted, from, limit)
- if err != nil {
- log.Error("s.ListUpAccount error(%v)", err)
- return
- }
- if len(mids) == 0 {
- for _, up := range ups {
- mids = append(mids, up.MID)
- }
- }
- query = ""
- if len(mids) != 0 {
- query = fmt.Sprintf("mid in (%s)", xstr.JoinInts(mids))
- }
- upWithdraw, err := s.GetUpWithdraw(c, query)
- if err != nil {
- log.Error("s.GetUpWithdraw error(%v)", err)
- return
- }
- withdrawMap := make(map[string]int64)
- for _, w := range upWithdraw {
- key := fmt.Sprintf("%d+%s", w.MID, w.DateVersion)
- withdrawMap[key] = w.WithdrawIncome
- }
- upInfo, err := s.dao.ListUpInfo(c, mids)
- if err != nil {
- log.Error("s.dao.ListUpInfo error(%v)", err)
- return
- }
- sort.Slice(ups, func(i, j int) bool {
- return ups[i].LastWithdrawTime > ups[j].LastWithdrawTime
- })
- data = make([]*model.UpWithdrawRes, 0)
- for _, up := range ups {
- key := fmt.Sprintf("%d+%s", up.MID, up.WithdrawDateVersion)
- data = append(data, &model.UpWithdrawRes{
- MID: up.MID,
- Nickname: upInfo[up.MID],
- WithdrawIncome: fmt.Sprintf("%0.2f", fromYuanToFen(up.TotalWithdrawIncome)),
- UnWithdrawIncome: fmt.Sprintf("%0.2f", fromYuanToFen(up.TotalUnwithdrawIncome)),
- LastWithdrawIncome: fmt.Sprintf("%0.2f", fromYuanToFen(withdrawMap[key])),
- WithdrawDate: up.LastWithdrawTime.Time().Format(_layout),
- MTime: up.MTime,
- })
- }
- return
- }
- // UpWithdrawExport export up withdraw
- func (s *Service) UpWithdrawExport(c context.Context, mids []int64, isDeleted, from, limit int) (res []byte, err error) {
- upWithdraw, _, err := s.UpWithdraw(c, mids, isDeleted, from, limit)
- if err != nil {
- log.Error("s.UpWithdraw error(%v)", err)
- return
- }
- records := formatUpWithdraw(upWithdraw, isDeleted)
- res, err = service.FormatCSV(records)
- if err != nil {
- log.Error("FormatCSV error(%v)")
- }
- return
- }
- // GetUpWithdraw get up_withdraw
- func (s *Service) GetUpWithdraw(c context.Context, query string) (upW []*model.UpIncomeWithdraw, err error) {
- upW = make([]*model.UpIncomeWithdraw, 0)
- var id int64
- limit := 2000
- for {
- var w []*model.UpIncomeWithdraw
- w, err = s.ListUpWithdraw(c, id, query, limit)
- if err != nil {
- return
- }
- upW = append(upW, w...)
- if len(w) < limit {
- break
- }
- id = w[len(w)-1].ID
- }
- return
- }
- // ListUpWithdraw list up_withdraw
- func (s *Service) ListUpWithdraw(c context.Context, id int64, query string, limit int) (upWithdraw []*model.UpIncomeWithdraw, err error) {
- if query != "" {
- query += " AND"
- }
- return s.dao.ListUpWithdraw(c, id, query, limit)
- }
- // UpWithdrawStatis up_withdraw statis
- func (s *Service) UpWithdrawStatis(c context.Context, from, to int64, isDeleted int) (data interface{}, err error) {
- now := time.Now()
- var fromTime, toTime time.Time
- if from == 0 || to == 0 {
- fromTime = time.Date(now.Year()-1, now.Month(), 1, 0, 0, 0, 0, time.Local)
- toTime = time.Date(now.Year(), now.Month(), 1, 0, 0, 0, 0, time.Local)
- } else {
- fromTime = time.Unix(from, 0)
- toTime = time.Unix(to, 0)
- }
- query := fmt.Sprintf("date_version >= '%s' and date_version <= '%s'", fromTime.Format(_layoutMonth), toTime.Format(_layoutMonth))
- upWithdraw, err := s.GetUpWithdraw(c, query)
- if err != nil {
- log.Error("s.GetUpWithdraw error(%v)", err)
- return
- }
- deletedUp, err := s.GetUpAccount(c, "", 1)
- if err != nil {
- log.Error("s.GetUpAccount error(%v)", err)
- return
- }
- deletedUpMap := make(map[int64]struct{})
- for _, up := range deletedUp {
- deletedUpMap[up.MID] = struct{}{}
- }
- data = upWithdrawStatis(upWithdraw, deletedUpMap, isDeleted, fromTime, toTime)
- return
- }
- func upWithdrawStatis(upWithdraw []*model.UpIncomeWithdraw, deletedUp map[int64]struct{}, isDeleted int, startTime, endTime time.Time) interface{} {
- dateCount := make(map[string]int)
- dateIncome := make(map[string]int64)
- for _, up := range upWithdraw {
- _, ok := deletedUp[up.MID]
- if (ok && isDeleted == 1) || (!ok && isDeleted == 0) {
- dateCount[up.DateVersion]++
- dateIncome[up.DateVersion] += up.WithdrawIncome
- }
- }
- incomes, counts, xAxis := []string{}, []int{}, []string{}
- endTime = endTime.AddDate(0, 0, 1)
- for startTime.Before(endTime) {
- key := startTime.Format(_layoutMonth)
- incomes = append(incomes, fmt.Sprintf("%0.2f", fromYuanToFen(dateIncome[key])))
- counts = append(counts, dateCount[key])
- xAxis = append(xAxis, key)
- startTime = startTime.AddDate(0, 1, 0)
- }
- return map[string]interface{}{
- "incomes": incomes,
- "counts": counts,
- "xaxis": xAxis,
- }
- }
- // UpWithdrawDetail get up withdraw by mid
- func (s *Service) UpWithdrawDetail(c context.Context, mid int64) (upWithdraw []*model.UpIncomeWithdraw, err error) {
- query := fmt.Sprintf("mid = %d", mid)
- upWithdraw, err = s.GetUpWithdraw(c, query)
- if err != nil {
- log.Error("s.GetUpWithdraw error(%v)", err)
- return
- }
- if len(upWithdraw) == 0 {
- return
- }
- upInfo, err := s.dao.GetUpInfoNickname(c, []int64{upWithdraw[0].MID})
- if err != nil {
- log.Error("s.dao.GetUpInfoNickname error(%v)", err)
- return
- }
- for _, up := range upWithdraw {
- up.Nickname = upInfo[up.MID]
- up.Income = fmt.Sprintf("%.2f", fromYuanToFen(up.WithdrawIncome))
- }
- return
- }
- // UpWithdrawDetailExport export up withdraw detail
- func (s *Service) UpWithdrawDetailExport(c context.Context, mid int64) (res []byte, err error) {
- upWithdraw, err := s.UpWithdrawDetail(c, mid)
- if err != nil {
- log.Error("s.UpWithdrawDetail error(%v)", err)
- return
- }
- records := formatUpIncomeWithdraw(upWithdraw)
- res, err = service.FormatCSV(records)
- if err != nil {
- log.Error("FormatCSV error(%v)")
- }
- return
- }
|