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.
221 lines
6.3 KiB
221 lines
6.3 KiB
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 |
|
}
|
|
|