bilibili-backup/app/admin/main/growup/model/offlineactivity/request.go
2019-04-22 02:59:20 +00:00

360 lines
8.9 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package offlineactivity
import (
"encoding/csv"
"fmt"
"go-common/library/time"
"math"
"strconv"
time2 "time"
)
const (
dateFmt = "20060102"
dateTimeFmt = "20060102_150405"
filenamePre = "活动"
)
func round(num float64) int {
return int(num + math.Copysign(0.5, num))
}
//ToFixed fix float precision
func ToFixed(num float64, precision int) float64 {
output := math.Pow(10, float64(precision))
return float64(round(num*output)) / output // since go 1.9 doesn't have a math.Round function...
}
//ExportArg export arg
type ExportArg struct {
Export string `form:"export"`
}
//ExportFormat export format
func (e *ExportArg) ExportFormat() string {
return e.Export
}
//BonusInfo bonus struct
type BonusInfo struct {
TotalMoney float64 `json:"total_money"`
MemberCount int64 `json:"member_count"`
Mids string `json:"mids"`
MidList []int64 `json:"-"` // 存储转换后的mids
Filename string `json:"filename"` // 如果有文件名,优先使用文件
}
//AddActivityArg add activity arg
type AddActivityArg struct {
Title string `json:"title"`
Link string `json:"link"`
BonusType int8 `json:"bonus_type"`
Memo string `json:"memo"`
BonusList []*BonusInfo `json:"bonus_list"`
Creator string `json:"-"`
}
//PreAddActivityResult result, nothing to return
type PreAddActivityResult struct {
BonusType int8 `json:"bonus_type"`
MemberCount int64 `json:"member_count"`
TotalMoney float64 `json:"total_money"`
}
//AddActivityResult result, nothing to return
type AddActivityResult struct {
}
//PageArg page arg
type PageArg struct {
Page int `form:"page"`
Size int `form:"size"`
}
//CheckPageValidation check the page validte, return limit offset
func (arg *PageArg) CheckPageValidation() (limit, offset int) {
if arg.Page < 1 {
arg.Page = 1
}
if arg.Size > 100 || arg.Size <= 0 {
arg.Size = 10
}
limit = arg.Size
offset = (arg.Page - 1) * limit
return
}
//ToPageResult cast to page result
func (arg *PageArg) ToPageResult(total int) (res PageResult) {
res.TotalCount = total
res.Page = arg.Page
return
}
//PageResult page result
type PageResult struct {
Page int `json:"page"`
TotalCount int `json:"total_count"`
}
//QueryActivityByIDArg arg
type QueryActivityByIDArg struct {
FromDate string `form:"from_date"` // 20180101
ToDate string `form:"to_date"` // 20180102 closed interval [20180101, 20180102]
ID int64 `form:"id"` // activity id, if not 0, FromDate and toDate not used
PageArg
ExportArg
}
//QueryActivityInfo activity info
type QueryActivityInfo struct {
OfflineActivityInfo
CreateTime string `json:"create_time"`
TotalMoney float64 `json:"total_money"`
MemberCount uint32 `json:"member_count"`
PayDate string `json:"pay_date"`
}
//QueryActivityResult result
type QueryActivityResult struct {
Result []*QueryActivityInfo `json:"result"`
PageResult
}
//GetFileName get file name
func (q *QueryActivityResult) GetFileName() string {
return fmt.Sprintf("%s-%s_%s.csv", filenamePre, "按活动", time2.Now().Format(dateTimeFmt))
}
//ToCsv to buffer
func (q *QueryActivityResult) ToCsv(writer *csv.Writer) {
var title = []string{
"添加日期",
"活动id",
"活动标题",
"活动链接",
"支出金额",
"中奖人数",
"付款日期",
"发奖状态"}
writer.Write(title)
if q == nil {
return
}
for _, v := range q.Result {
var record []string
record = append(record,
v.CreateTime,
strconv.Itoa(int(v.ID)),
v.Title,
v.Link,
fmt.Sprintf("%0.2f", v.TotalMoney),
strconv.Itoa(int(v.MemberCount)),
v.PayDate,
StateToString(int(v.State)),
)
writer.Write(record)
}
}
//CopyFromActivityDB copy from db
func (q *QueryActivityInfo) CopyFromActivityDB(v *OfflineActivityInfo) {
q.OfflineActivityInfo = *v
q.CreateTime = v.CTime.Time().Format(dateFmt)
q.PayDate = q.CreateTime
}
//QueryUpBonusByMidArg arg
type QueryUpBonusByMidArg struct {
Mid int64 `form:"mid"` // activity id, if not 0, FromDate and toDate not used
PageArg
ExportArg
}
//UpSummaryBonusInfo bonus for one up info
type UpSummaryBonusInfo struct {
Mid int64 `json:"mid"`
BilledMoney float64 `json:"billed_money"`
UnbilledMoney float64 `json:"unbilled_money"`
LastBillTime string `json:"last_bill_time"` // 20180101 最近结算时间
TmpBillTime time.Time `json:"-"` // 用来计算LastBillTime
TotalBonusMoney float64 `json:"total_bonus_money"` // 所有的中奖金额
ActivityID int64 `json:"activity_id"` // 中奖活动ID
}
//Finish finish it before send back
func (s *UpSummaryBonusInfo) Finish() {
if s.TmpBillTime > 0 {
s.LastBillTime = s.TmpBillTime.Time().Format(dateFmt)
}
s.BilledMoney = ToFixed(s.BilledMoney, 2)
s.UnbilledMoney = ToFixed(s.UnbilledMoney, 2)
s.TotalBonusMoney = ToFixed(s.TotalBonusMoney, 2)
}
//QueryUpBonusByMidResult query result
type QueryUpBonusByMidResult struct {
Result []*UpSummaryBonusInfo `json:"result"`
PageResult
}
//GetFileName get file name
func (q *QueryUpBonusByMidResult) GetFileName() string {
return fmt.Sprintf("%s-%s_%s.csv", filenamePre, "结算记录", time2.Now().Format(dateTimeFmt))
}
//ToCsv to buffer
func (q *QueryUpBonusByMidResult) ToCsv(writer *csv.Writer) {
var title = []string{
"UID",
"已结算",
"未结算",
"最近结算时间"}
writer.Write(title)
if q == nil {
return
}
for _, v := range q.Result {
var record []string
record = append(record,
intFormat(v.Mid),
floatFormat(v.BilledMoney),
floatFormat(v.UnbilledMoney),
v.LastBillTime,
)
writer.Write(record)
}
}
//QueryUpBonusByActivityResult use same result, we define another type, because we need to implement interface again
type QueryUpBonusByActivityResult QueryUpBonusByMidResult
//GetFileName get file name
func (q *QueryUpBonusByActivityResult) GetFileName() string {
return fmt.Sprintf("%s-%s_%s.csv", filenamePre, "详细信息", time2.Now().Format(dateTimeFmt))
}
//ToCsv to buffer
func (q *QueryUpBonusByActivityResult) ToCsv(writer *csv.Writer) {
var title = []string{
"UID",
"中奖活动id",
"中奖金额",
"结算日期",
"结算收入",
"未结算收入"}
writer.Write(title)
if q == nil {
return
}
for _, v := range q.Result {
var record []string
record = append(record,
intFormat(v.Mid),
intFormat(v.ActivityID),
floatFormat(v.TotalBonusMoney),
v.LastBillTime,
floatFormat(v.BilledMoney),
floatFormat(v.UnbilledMoney),
)
writer.Write(record)
}
}
//QueryActvityMonthArg arg
type QueryActvityMonthArg struct {
ExportArg
PageArg
FromDate string `form:"from_date"`
ToDate string `form:"to_date"`
}
//ActivityMonthInfo info
type ActivityMonthInfo struct {
CreateTime string `json:"create_time"`
ActivityCount int64 `json:"activity_count"`
MemberCount uint32 `json:"member_count"`
AverageMoneyMember float64 `json:"average_money_member"`
AverageMoneyActivity float64 `json:"average_money_activity"`
TotalBonusMoneyMonth float64 `json:"total_bonus_money"` // 所有的中奖金额
TotalMoneyAccumulate float64 `json:"total_money_accumulate"`
GenerateDay string `json:"generate_day"` // 生成日期
activityMap map[int64]struct{} // 用来保存活动数
}
//AddBonus 增加bonus信息
func (s *ActivityMonthInfo) AddBonus(v *OfflineActivityBonus) {
s.MemberCount += v.MemberCount
s.TotalBonusMoneyMonth += GetMoneyFromDb(v.TotalMoney)
if s.activityMap == nil {
s.activityMap = make(map[int64]struct{})
}
s.activityMap[v.ActivityID] = struct{}{}
}
//Finish finish
func (s *ActivityMonthInfo) Finish() {
if s.MemberCount > 0 {
s.AverageMoneyMember = ToFixed(s.TotalBonusMoneyMonth/float64(s.MemberCount), 2)
}
s.ActivityCount = int64(len(s.activityMap))
if s.ActivityCount > 0 {
s.AverageMoneyActivity = ToFixed(s.TotalBonusMoneyMonth/float64(s.ActivityCount), 2)
}
}
//QueryActivityMonthResult result
type QueryActivityMonthResult struct {
PageResult
Result []*ActivityMonthInfo `json:"result"`
}
//GetFileName get file name
func (q *QueryActivityMonthResult) GetFileName() string {
return fmt.Sprintf("%s-%s_%s.csv", filenamePre, "按月", time2.Now().Format(dateTimeFmt))
}
func floatFormat(f float64) string {
return strconv.FormatFloat(f, 'f', 2, 64)
}
func intFormat(i int64) string {
return strconv.Itoa(int(i))
}
//ToCsv to csv
func (q *QueryActivityMonthResult) ToCsv(writer *csv.Writer) {
var title = []string{
"月份",
"最新数据截止日期",
"月支出",
"活动数",
"中奖人数",
"人均支出",
"活动均支出",
"累计支出"}
writer.Write(title)
if q == nil {
return
}
for _, v := range q.Result {
var record []string
record = append(record,
v.CreateTime,
v.GenerateDay,
floatFormat(v.TotalBonusMoneyMonth),
intFormat(v.ActivityCount),
intFormat(int64(v.MemberCount)),
floatFormat(v.AverageMoneyMember),
floatFormat(v.AverageMoneyActivity),
floatFormat(v.TotalMoneyAccumulate),
)
writer.Write(record)
}
}