123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359 |
- 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)
- }
- }
|