1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492 |
- package service
- import (
- "encoding/json"
- "errors"
- "fmt"
- "gadmin/config"
- "gadmin/internal/admin/consts"
- "gadmin/internal/admin/data"
- "gadmin/internal/admin/forms"
- "gadmin/internal/gorm/model"
- "gadmin/internal/gorm/query"
- "gadmin/package/gmdata"
- "gadmin/utility"
- "gadmin/utility/player"
- "gadmin/utility/serializer"
- "github.com/gin-gonic/gin"
- "github.com/jinzhu/now"
- "github.com/sirupsen/logrus"
- "github.com/xuri/excelize/v2"
- "math"
- "sync"
- "time"
- )
- var Order = new(sOrder)
- type sOrder struct{}
- func (s *sOrder) List(ctx *gin.Context, req forms.OrderListReq) serializer.Response {
- type OrderLstModel struct {
- model.Order
- NickName string `json:"nickName"`
- PayAtFormat string `json:"pay_at"` // 支付时间
- CreatedAtFormat string `json:"created_at"` // 创建时间
- }
- var (
- c = query.Use(config.DB).PlayerChannel
- o = query.Use(config.DB).Order
- m = o.WithContext(ctx)
- m2 = o.WithContext(ctx).Where(o.Status.Eq(consts.OrderStatusSuccess))
- offset int64 = 0
- models forms.OrderListRes
- lists []OrderLstModel
- )
- if len(req.Time) == 2 {
- m = m.Where(o.CreatedAt.Between(req.Time[0], req.Time[1]))
- m2 = m2.Where(o.CreatedAt.Between(req.Time[0], req.Time[1]))
- }
- if req.Platform > 0 {
- m = m.Where(o.Platform.Eq(req.Platform))
- m2 = m2.Where(o.Platform.Eq(req.Platform))
- }
- if req.PlayerID > 0 {
- m = m.Where(o.PlayerID.Eq(int64(req.PlayerID)))
- m2 = m2.Where(o.PlayerID.Eq(int64(req.PlayerID)))
- }
- if req.GoodsID > 0 {
- m = m.Where(o.GoodsID.Eq(req.GoodsID))
- m2 = m2.Where(o.GoodsID.Eq(req.GoodsID))
- }
- if req.Status > 0 {
- m = m.Where(o.Status.Eq(req.Status))
- m2 = m2.Where(o.Status.Eq(req.Status))
- }
- if req.ServerId > 0 {
- m = m.Where(o.ServerID.Eq(req.ServerId))
- m2 = m2.Where(o.ServerID.Eq(req.ServerId))
- }
- if req.Flag > -1 {
- m = m.Where(o.Flag.Eq(req.Flag))
- m2 = m2.Where(o.Flag.Eq(req.Flag))
- }
- if req.OrderSn != "" {
- m = m.Where(o.OrderSn.Like("%" + req.OrderSn + "%"))
- m2 = m2.Where(o.OrderSn.Like("%" + req.OrderSn + "%"))
- }
- if req.OutTradeNo != "" {
- m = m.Where(o.OutTradeNo.Like("%" + req.OutTradeNo + "%"))
- m2 = m2.Where(o.OutTradeNo.Like("%" + req.OutTradeNo + "%"))
- }
- switch req.ChannelId {
- case consts.ChannelIdNone:
- // 不选择渠道
- case consts.ChannelIdAllAdv, consts.ChannelIdAllWx, consts.ChannelIdAllTT:
- // 所有的广告渠道
- m = m.Where(o.Columns(o.PlayerID).In(c.WithContext(ctx).Select(c.Playerid).Where(c.ChannelID.In(Channel.GetIdsByType(req.ChannelId)...))))
- m2 = m2.Where(o.Columns(o.PlayerID).In(c.WithContext(ctx).Select(c.Playerid).Where(c.ChannelID.In(Channel.GetIdsByType(req.ChannelId)...))))
- default:
- // 指定渠道
- m = m.Where(o.Columns(o.PlayerID).In(c.WithContext(ctx).Select(c.Playerid).Where(c.ChannelID.Eq(req.ChannelId))))
- m2 = m2.Where(o.Columns(o.PlayerID).In(c.WithContext(ctx).Select(c.Playerid).Where(c.ChannelID.Eq(req.ChannelId))))
- }
- m = m.Order(o.CreatedAt.Desc())
- req.Page, req.PerPage, offset = forms.CalculatePage(req.Page, req.PerPage)
- count, err := m.Count()
- if err != nil {
- return serializer.Err(consts.CodeParamErr, "查询出错 count", err)
- }
- // 导出
- if req.IsExport == 1 {
- if err = m.Scan(&lists); err != nil {
- return serializer.Err(consts.CodeParamErr, "查询出错 lists", err)
- }
- f := excelize.NewFile()
- sheetNum := 500
- pageCount := int(math.Ceil(float64(len(lists)) / float64(sheetNum)))
- wg := sync.WaitGroup{}
- wg.Add(pageCount)
- for i := 1; i <= pageCount; i++ {
- sheetName := fmt.Sprintf("Sheet%d", i)
- subList := make([]OrderLstModel, 0)
- if i == pageCount {
- subList = lists[(i-1)*sheetNum:]
- } else {
- subList = lists[(i-1)*sheetNum : i*sheetNum]
- }
- f.NewSheet(sheetName)
- f.SetColWidth(sheetName, "A", "A", 15)
- f.SetColWidth(sheetName, "B", "B", 15)
- f.SetColWidth(sheetName, "C", "C", 15)
- f.SetColWidth(sheetName, "D", "D", 25)
- f.SetColWidth(sheetName, "E", "E", 25)
- f.SetColWidth(sheetName, "F", "F", 30)
- f.SetColWidth(sheetName, "G", "G", 30)
- f.SetColWidth(sheetName, "H", "H", 15)
- f.SetColWidth(sheetName, "I", "I", 15)
- f.SetColWidth(sheetName, "J", "J", 25)
- f.SetColWidth(sheetName, "K", "K", 25)
- // 创建一个工作表
- f.SetCellValue(sheetName, "A1", "序号")
- f.SetCellValue(sheetName, "B1", "下单渠道")
- f.SetCellValue(sheetName, "C1", "玩家ID")
- f.SetCellValue(sheetName, "D1", "玩家昵称")
- f.SetCellValue(sheetName, "E1", "购买商品")
- f.SetCellValue(sheetName, "F1", "订单号")
- f.SetCellValue(sheetName, "G1", "外部订单号")
- f.SetCellValue(sheetName, "H1", "支付金额(元)")
- f.SetCellValue(sheetName, "I1", "支付状态")
- f.SetCellValue(sheetName, "J1", "支付时间")
- f.SetCellValue(sheetName, "K1", "创建时间")
- go func(subList []OrderLstModel) {
- defer wg.Done()
- for i, v := range subList {
- f.SetCellValue(sheetName, fmt.Sprintf("A%d", i+2), v.ID)
- if v.Platform == consts.OrderPlatformAndroid {
- f.SetCellValue(sheetName, fmt.Sprintf("B%d", i+2), "安卓")
- } else {
- f.SetCellValue(sheetName, fmt.Sprintf("B%d", i+2), "苹果")
- }
- f.SetCellValue(sheetName, fmt.Sprintf("C%d", i+2), v.PlayerID)
- user := data.GetUserToSyncMap(v.PlayerID)
- nickName := ""
- if user != nil {
- nickName = user.NickName
- }
- f.SetCellValue(sheetName, fmt.Sprintf("D%d", i+2), nickName)
- f.SetCellValue(sheetName, fmt.Sprintf("E%d", i+2), gmdata.GetGoodLabel(v.GoodsID))
- f.SetCellValue(sheetName, fmt.Sprintf("F%d", i+2), v.OrderSn)
- f.SetCellValue(sheetName, fmt.Sprintf("G%d", i+2), v.OutTradeNo)
- f.SetCellValue(sheetName, fmt.Sprintf("H%d", i+2), utility.Round(v.Money))
- f.SetCellValue(sheetName, fmt.Sprintf("I%d", i+2), consts.GetOrderStatusTag(v.Status))
- payAtFormat, createdAtFormat := "", ""
- if v.PayAt.Unix() > consts.FormsMinInvalidTimestamp {
- payAtFormat = utility.FormatSecond(v.PayAt)
- }
- if v.CreatedAt.Unix() > consts.FormsMinInvalidTimestamp {
- createdAtFormat = utility.FormatSecond(v.CreatedAt)
- }
- f.SetCellValue(sheetName, fmt.Sprintf("J%d", i+2), payAtFormat)
- f.SetCellValue(sheetName, fmt.Sprintf("K%d", i+2), createdAtFormat)
- }
- }(subList)
- }
- wg.Wait()
- // 设置工作簿的默认工作表
- f.SetActiveSheet(0)
- ctx.Header("Content-Type", "application/vnd.ms-excel")
- ctx.Header("Content-Disposition", fmt.Sprintf("attachment;filename=订单记录导出%s.xlsx", time.Now().Format("20060102150405")))
- f.WriteTo(ctx.Writer)
- return serializer.Response{}
- }
- if count > 0 {
- // 列表展示
- if err = m.Limit(int(req.PerPage)).Offset(int(offset)).Scan(&lists); err != nil {
- return serializer.Err(consts.CodeParamErr, "查询出错 lists", err)
- }
- for k, _ := range lists {
- user := data.GetUser(int64(lists[k].PlayerID))
- if user != nil {
- lists[k].NickName = user.NickName
- }
- if lists[k].PayAt.Unix() > consts.FormsMinInvalidTimestamp {
- lists[k].PayAtFormat = utility.FormatSecond(lists[k].PayAt)
- }
- if lists[k].CreatedAt.Unix() > consts.FormsMinInvalidTimestamp {
- lists[k].CreatedAtFormat = utility.FormatSecond(lists[k].CreatedAt)
- }
- }
- // 在存在成功订单时,查询统计
- if req.Status <= consts.OrderStatusNo || req.Status == consts.OrderStatusSuccess {
- // 交易金额
- transactionMoney, err := m2.Select(o.Money.Sum().As("money")).First()
- if err != nil {
- return serializer.Err(consts.CodeParamErr, "查询出错 Money Sum", err)
- }
- models.TransactionMoney = transactionMoney.Money
- // 已支付订单数量
- if models.SuccessfulOrder, err = m2.Count(); err != nil {
- return serializer.Err(consts.CodeParamErr, "查询出错 order Count", err)
- }
- }
- }
- models.List = lists
- models.Page = req.Page
- models.PerPage = req.PerPage
- models.PageCount = (count + req.PerPage - 1) / req.PerPage
- return serializer.Suc(models)
- }
- // SevenStatisticsList 七日付费统计
- func (s *sOrder) SevenStatisticsList(ctx *gin.Context, req forms.OrderSevenStatisticsListReq) serializer.Response {
- type Result struct {
- Date string `json:"date"`
- C1 int64 `json:"c1"`
- M1 float64 `json:"m1"`
- C2 int64 `json:"c2"`
- M2 float64 `json:"m2"`
- C3 int64 `json:"c3"`
- M3 float64 `json:"m3"`
- C4 int64 `json:"c4"`
- M4 float64 `json:"m4"`
- C5 int64 `json:"c5"`
- M5 float64 `json:"m5"`
- C6 int64 `json:"c6"`
- M6 float64 `json:"m6"`
- C7 int64 `json:"c7"`
- M7 float64 `json:"m7"`
- U7 int64 `json:"u7"`
- C30 int64 `json:"c30"`
- M30 float64 `json:"m30"`
- }
- var (
- q = query.Use(config.DB).Order
- m = q.WithContext(ctx).Where(q.Status.Eq(consts.OrderStatusSuccess))
- offset int64 = 0
- models forms.UserAccountListRes
- lists []Result
- )
- req.Page, req.PerPage, offset = forms.CalculatePage(req.Page, req.PerPage)
- if len(req.Time) == 2 {
- m = m.Where(q.CreatedAt.Between(req.Time[0], req.Time[1]))
- }
- if req.ServerId > 0 {
- m = m.Where(q.ServerID.Eq(req.ServerId))
- }
- if req.Flag > -1 {
- m = m.Where(q.Flag.Eq(req.Flag))
- }
- switch req.ChannelId {
- case consts.ChannelIdNone:
- // 不选择渠道
- case consts.ChannelIdAllAdv, consts.ChannelIdAllWx, consts.ChannelIdAllTT:
- // 所有的广告渠道
- m = m.Where(q.ChannelID.In(Channel.GetIdsByType(req.ChannelId)...))
- default:
- // 指定渠道
- m = m.Where(q.ChannelID.Eq(req.ChannelId))
- }
- m = m.Select(q.Date).Order(q.Date.Desc()).Group(q.Date)
- count, err := m.Count()
- if err != nil {
- return serializer.Err(consts.CodeParamErr, "查询出错 count", err)
- }
- if count > 0 {
- if req.IsExport == 1 {
- if err = m.Scan(&lists); err != nil {
- return serializer.Err(consts.CodeParamErr, "查询出错 lists", err)
- }
- } else {
- if err = m.Limit(int(req.PerPage)).Offset(int(offset)).Scan(&lists); err != nil {
- return serializer.Err(consts.CodeParamErr, "查询出错 lists", err)
- }
- }
- }
- stat := func(date time.Time, old time.Time) (count int64, total float64, err error) {
- o1 := now.With(old)
- b1, e1 := o1.BeginningOfDay().Unix(), o1.EndOfDay().Unix() // 当日起始时间戳
- qw := q.WithContext(ctx).Where(q.UserCreatedAt.Gte(int32(b1)), q.UserCreatedAt.Lte(int32(e1)))
- switch req.ChannelId {
- case consts.ChannelIdNone:
- // 不选择渠道
- case consts.ChannelIdAllAdv, consts.ChannelIdAllWx, consts.ChannelIdAllTT:
- // 所有的广告渠道
- qw = qw.Where(q.ChannelID.In(Channel.GetIdsByType(req.ChannelId)...))
- default:
- // 指定渠道
- qw = qw.Where(q.ChannelID.Eq(req.ChannelId))
- }
- if req.Platform > 0 {
- qw = qw.Where(q.Platform.Eq(req.Platform))
- }
- if req.ServerId > 0 {
- qw = qw.Where(q.ServerID.Eq(req.ServerId))
- }
- if req.Flag > -1 {
- qw = qw.Where(q.Flag.Eq(req.Flag))
- }
- var counter forms.CounterF
- err = qw.Select(q.Money.Sum().As("total")).
- Where(q.Status.Eq(consts.OrderStateSuccess), q.Date.Eq(date.Format("2006-01-02"))).Scan(&counter)
- if err != nil {
- return
- }
- total = counter.Total
- count, err = qw.Distinct(q.PlayerID).Where(q.Status.Eq(consts.OrderStateSuccess), q.Date.Eq(date.Format("2006-01-02"))).Count()
- if err != nil {
- return
- }
- return
- }
- stat2 := func(date time.Time, old time.Time) (count int64, total float64, err error) {
- o1 := now.With(old)
- b1, e1 := o1.BeginningOfDay().Unix(), o1.EndOfDay().Unix() // 当日起始时间戳
- qw := q.WithContext(ctx).Where(q.UserCreatedAt.Gte(int32(b1)), q.UserCreatedAt.Lte(int32(e1)))
- switch req.ChannelId {
- case consts.ChannelIdNone:
- // 不选择渠道
- case consts.ChannelIdAllAdv, consts.ChannelIdAllWx, consts.ChannelIdAllTT:
- // 所有的广告渠道
- qw = qw.Where(q.ChannelID.In(Channel.GetIdsByType(req.ChannelId)...))
- default:
- // 指定渠道
- qw = qw.Where(q.ChannelID.Eq(req.ChannelId))
- }
- if req.Platform > 0 {
- qw = qw.Where(q.Platform.Eq(req.Platform))
- }
- if req.ServerId > 0 {
- qw = qw.Where(q.ServerID.Eq(req.ServerId))
- }
- if req.Flag > -1 {
- qw = qw.Where(q.Flag.Eq(req.Flag))
- }
- var counter forms.CounterF
- err = qw.Select(q.Money.Sum().As("total")).
- Where(q.Status.Eq(consts.OrderStateSuccess),
- q.Date.Between(
- old.Format("2006-01-02"),
- date.Format("2006-01-02"),
- ),
- ).
- Scan(&counter)
- if err != nil {
- return
- }
- total = counter.Total
- count, err = qw.Distinct(q.PlayerID).Where(q.Status.Eq(consts.OrderStateSuccess),
- q.Date.Between(
- old.Format("2006-01-02"),
- date.Format("2006-01-02"),
- ),
- ).Count()
- if err != nil {
- return
- }
- return
- }
- if len(lists) > 0 {
- for k, _ := range lists {
- date, _ := now.ParseInLocation(time.Local, lists[k].Date)
- lists[k].Date = date.Format("2006-01-02")
- c1, m1, err := stat(date.AddDate(0, 0, 0), date)
- if err != nil {
- return serializer.Err(consts.CodeParamErr, "查询出错 stat1", err)
- }
- c2, m2, err := stat(date.AddDate(0, 0, 1), date)
- if err != nil {
- return serializer.Err(consts.CodeParamErr, "查询出错 stat2", err)
- }
- c3, m3, err := stat(date.AddDate(0, 0, 2), date)
- if err != nil {
- return serializer.Err(consts.CodeParamErr, "查询出错 stat3", err)
- }
- c4, m4, err := stat(date.AddDate(0, 0, 3), date)
- if err != nil {
- return serializer.Err(consts.CodeParamErr, "查询出错 stat4", err)
- }
- c5, m5, err := stat(date.AddDate(0, 0, 4), date)
- if err != nil {
- return serializer.Err(consts.CodeParamErr, "查询出错 stat5", err)
- }
- c6, m6, err := stat(date.AddDate(0, 0, 5), date)
- if err != nil {
- return serializer.Err(consts.CodeParamErr, "查询出错 stat6", err)
- }
- c7, m7, err := stat(date.AddDate(0, 0, 6), date)
- if err != nil {
- return serializer.Err(consts.CodeParamErr, "查询出错 stat7", err)
- }
- c30, m30, err := stat2(date.AddDate(0, 0, 29), date)
- if err != nil {
- return serializer.Err(consts.CodeParamErr, "查询出错 stat30", err)
- }
- lists[k].C1 = c1
- lists[k].M1 = m1
- lists[k].C2 = c2
- lists[k].M2 = m2
- lists[k].C3 = c3
- lists[k].M3 = m3
- lists[k].C4 = c4
- lists[k].M4 = m4
- lists[k].C5 = c5
- lists[k].M5 = m5
- lists[k].C6 = c6
- lists[k].M6 = m6
- lists[k].C7 = c7
- lists[k].M7 = m7
- lists[k].C30 = c30
- lists[k].M30 = m30
- // 7日唯一人数
- d1 := now.With(date)
- b1, e1 := d1.BeginningOfDay().Unix(), d1.EndOfDay().Unix() // 当日起始时间戳
- qw := q.WithContext(ctx).Where(q.UserCreatedAt.Gte(int32(b1)), q.UserCreatedAt.Lte(int32(e1)))
- switch req.ChannelId {
- case consts.ChannelIdNone:
- // 不选择渠道
- case consts.ChannelIdAllAdv, consts.ChannelIdAllWx, consts.ChannelIdAllTT:
- // 所有的广告渠道
- qw = qw.Where(q.ChannelID.In(Channel.GetIdsByType(req.ChannelId)...))
- default:
- // 指定渠道
- qw = qw.Where(q.ChannelID.Eq(req.ChannelId))
- }
- if req.Platform > 0 {
- qw = qw.Where(q.Platform.Eq(req.Platform))
- }
- if req.ServerId > 0 {
- qw = qw.Where(q.ServerID.Eq(req.ServerId))
- }
- if req.Flag > -1 {
- qw = qw.Where(q.Flag.Eq(req.Flag))
- }
- u7, err := qw.Distinct(q.PlayerID).Where(
- q.Status.Eq(consts.OrderStateSuccess),
- q.Date.Between(date.Format("2006-01-02"), date.AddDate(0, 0, 6).Format("2006-01-02"))).
- Count()
- if err != nil {
- return serializer.Err(consts.CodeParamErr, "查询出错 Count", err)
- }
- lists[k].U7 = u7
- }
- }
- // 导出
- if req.IsExport == 1 {
- f := excelize.NewFile()
- f.SetColWidth("Sheet1", "A", "A", 15)
- f.SetColWidth("Sheet1", "B", "B", 20)
- f.SetColWidth("Sheet1", "C", "C", 20)
- f.SetColWidth("Sheet1", "D", "D", 20)
- f.SetColWidth("Sheet1", "E", "E", 20)
- f.SetColWidth("Sheet1", "F", "F", 20)
- f.SetColWidth("Sheet1", "G", "G", 20)
- f.SetColWidth("Sheet1", "H", "H", 20)
- f.SetColWidth("Sheet1", "I", "I", 20)
- f.SetColWidth("Sheet1", "J", "J", 20)
- f.SetColWidth("Sheet1", "K", "K", 20)
- f.SetColWidth("Sheet1", "L", "L", 20)
- f.SetColWidth("Sheet1", "M", "M", 20)
- f.SetColWidth("Sheet1", "N", "N", 20)
- f.SetColWidth("Sheet1", "O", "O", 20)
- f.SetColWidth("Sheet1", "P", "P", 15)
- f.SetColWidth("Sheet1", "Q", "Q", 15)
- f.SetColWidth("Sheet1", "R", "R", 15)
- // 创建一个工作表
- f.SetCellValue("Sheet1", "A1", "日期")
- f.SetCellValue("Sheet1", "B1", "当天注册付费人数")
- f.SetCellValue("Sheet1", "C1", "当天付费金额(元)")
- f.SetCellValue("Sheet1", "D1", "第2日注册付费人数")
- f.SetCellValue("Sheet1", "E1", "第2日付费金额(元)")
- f.SetCellValue("Sheet1", "F1", "第3日注册付费人数")
- f.SetCellValue("Sheet1", "G1", "第3日付费金额(元)")
- f.SetCellValue("Sheet1", "H1", "第4日注册付费人数")
- f.SetCellValue("Sheet1", "I1", "第4日付费金额(元)")
- f.SetCellValue("Sheet1", "J1", "第5日注册付费人数")
- f.SetCellValue("Sheet1", "K1", "第5日付费金额(元)")
- f.SetCellValue("Sheet1", "L1", "第6日注册付费人数")
- f.SetCellValue("Sheet1", "M1", "第6日付费金额(元)")
- f.SetCellValue("Sheet1", "N1", "第7日注册付费人数")
- f.SetCellValue("Sheet1", "O1", "第7日付费金额(元)")
- f.SetCellValue("Sheet1", "P1", "7日内人数")
- f.SetCellValue("Sheet1", "Q1", "30日内人数")
- f.SetCellValue("Sheet1", "R1", "30日内金额(元)")
- for i, v := range lists {
- f.SetCellValue("Sheet1", fmt.Sprintf("A%d", i+2), v.Date)
- f.SetCellValue("Sheet1", fmt.Sprintf("B%d", i+2), v.C1)
- f.SetCellValue("Sheet1", fmt.Sprintf("C%d", i+2), v.M1)
- f.SetCellValue("Sheet1", fmt.Sprintf("D%d", i+2), v.C2)
- f.SetCellValue("Sheet1", fmt.Sprintf("E%d", i+2), v.M2)
- f.SetCellValue("Sheet1", fmt.Sprintf("F%d", i+2), v.C3)
- f.SetCellValue("Sheet1", fmt.Sprintf("G%d", i+2), v.M3)
- f.SetCellValue("Sheet1", fmt.Sprintf("H%d", i+2), v.C4)
- f.SetCellValue("Sheet1", fmt.Sprintf("I%d", i+2), v.M4)
- f.SetCellValue("Sheet1", fmt.Sprintf("J%d", i+2), v.C5)
- f.SetCellValue("Sheet1", fmt.Sprintf("K%d", i+2), v.M5)
- f.SetCellValue("Sheet1", fmt.Sprintf("L%d", i+2), v.C6)
- f.SetCellValue("Sheet1", fmt.Sprintf("M%d", i+2), v.M6)
- f.SetCellValue("Sheet1", fmt.Sprintf("N%d", i+2), v.C7)
- f.SetCellValue("Sheet1", fmt.Sprintf("O%d", i+2), v.M7)
- f.SetCellValue("Sheet1", fmt.Sprintf("P%d", i+2), v.U7)
- f.SetCellValue("Sheet1", fmt.Sprintf("Q%d", i+2), v.C30)
- f.SetCellValue("Sheet1", fmt.Sprintf("R%d", i+2), v.M30)
- }
- // 设置工作簿的默认工作表
- f.SetActiveSheet(1)
- ctx.Header("Content-Type", "application/vnd.ms-excel")
- ctx.Header("Content-Disposition", fmt.Sprintf("attachment;filename=新注册玩家付费统计导出%s.xlsx", time.Now().Format("20060102150405")))
- f.WriteTo(ctx.Writer)
- return serializer.Response{}
- }
- models.List = lists
- models.Page = req.Page
- models.PerPage = req.PerPage
- models.PageCount = (count + req.PerPage - 1) / req.PerPage
- return serializer.Suc(models)
- }
- func (s *sOrder) DailyStatisticsList(ctx *gin.Context, req forms.OrderDailyStatisticsListReq) serializer.Response {
- type Result struct {
- Date string `json:"date"`
- TotalRecharge float64 `json:"totalRecharge"`
- IosRecharge float64 `json:"iosRecharge"`
- AndroidRecharge float64 `json:"androidRecharge"`
- Players int `json:"players"`
- ARPU string `json:"arpu"`
- NewPlayers int64 `json:"newPlayers"`
- NewTotalRecharge float64 `json:"newTotalRecharge"`
- NewARPU string `json:"newArpu"`
- }
- var (
- c = query.Use(config.DB).PlayerChannel
- q = query.Use(config.DB).Order
- m = q.WithContext(ctx).Where(q.Status.Eq(consts.OrderStatusSuccess))
- offset int64 = 0
- models forms.UserAccountListRes
- lists []Result
- )
- statNew := func(date time.Time, old time.Time) (count int64, total float64, err error) {
- o1 := now.With(old)
- b1, e1 := o1.BeginningOfDay().Unix(), o1.EndOfDay().Unix() // 当日起始时间戳
- qw := q.WithContext(ctx).Where(q.UserCreatedAt.Gte(int32(b1)), q.UserCreatedAt.Lte(int32(e1)))
- switch req.ChannelId {
- case consts.ChannelIdNone:
- // 不选择渠道
- case consts.ChannelIdAllAdv, consts.ChannelIdAllWx, consts.ChannelIdAllTT:
- // 所有的广告渠道
- qw = qw.Where(q.ChannelID.In(Channel.GetIdsByType(req.ChannelId)...))
- default:
- // 指定渠道
- qw = qw.Where(q.ChannelID.Eq(req.ChannelId))
- }
- if req.ServerId > 0 {
- qw = qw.Where(q.ServerID.Eq(req.ServerId))
- }
- if req.Flag > -1 {
- qw = qw.Where(q.Flag.Eq(req.Flag))
- }
- var counter forms.CounterF
- err = qw.Select(q.Money.Sum().As("total")).
- Where(q.Status.Eq(consts.OrderStateSuccess), q.Date.Eq(date.Format("2006-01-02"))).Scan(&counter)
- if err != nil {
- return
- }
- total = counter.Total
- count, err = qw.Distinct(q.PlayerID).Where(q.Status.Eq(consts.OrderStateSuccess), q.Date.Eq(date.Format("2006-01-02"))).Group(q.PlayerID).Count()
- if err != nil {
- return
- }
- return
- }
- req.Page, req.PerPage, offset = forms.CalculatePage(req.Page, req.PerPage)
- if len(req.Time) == 2 {
- m = m.Where(q.CreatedAt.Between(req.Time[0], req.Time[1]))
- }
- if req.ServerId > 0 {
- m = m.Where(q.ServerID.Eq(req.ServerId))
- }
- if req.Flag > -1 {
- m = m.Where(q.Flag.Eq(req.Flag))
- }
- switch req.ChannelId {
- case consts.ChannelIdNone:
- // 不选择渠道
- case consts.ChannelIdAllAdv, consts.ChannelIdAllWx, consts.ChannelIdAllTT:
- // 所有的广告渠道
- m = m.Where(q.Columns(q.PlayerID).In(c.WithContext(ctx).Select(c.Playerid).Where(c.ChannelID.In(Channel.GetIdsByType(req.ChannelId)...))))
- default:
- // 指定渠道
- m = m.Where(q.Columns(q.PlayerID).In(c.WithContext(ctx).Select(c.Playerid).Where(c.ChannelID.Eq(req.ChannelId))))
- }
- m = m.Select(q.Date).Order(q.Date.Desc()).Group(q.Date)
- count, err := m.Count()
- if err != nil {
- return serializer.Err(consts.CodeParamErr, "查询出错 count", err)
- }
- if count > 0 {
- if req.IsExport == 1 {
- if err = m.Scan(&lists); err != nil {
- return serializer.Err(consts.CodeParamErr, "查询出错 lists", err)
- }
- } else {
- if err = m.Limit(int(req.PerPage)).Offset(int(offset)).Scan(&lists); err != nil {
- return serializer.Err(consts.CodeParamErr, "查询出错 lists", err)
- }
- }
- }
- if len(lists) > 0 {
- for k, _ := range lists {
- date, _ := now.ParseInLocation(time.Local, lists[k].Date)
- lists[k].Date = date.Format("2006-01-02")
- qw := q.WithContext(ctx)
- qw2 := q.WithContext(ctx)
- switch req.ChannelId {
- case consts.ChannelIdNone:
- // 不选择渠道
- case consts.ChannelIdAllAdv, consts.ChannelIdAllWx, consts.ChannelIdAllTT:
- // 所有的广告渠道
- qw = qw.Where(q.Columns(q.PlayerID).In(c.WithContext(ctx).Select(c.Playerid).Where(c.ChannelID.In(Channel.GetIdsByType(req.ChannelId)...))))
- qw2 = qw2.Where(q.Columns(q.PlayerID).In(c.WithContext(ctx).Select(c.Playerid).Where(c.ChannelID.In(Channel.GetIdsByType(req.ChannelId)...))))
- default:
- // 指定渠道
- qw = qw.Where(q.Columns(q.PlayerID).In(c.WithContext(ctx).Select(c.Playerid).Where(c.ChannelID.Eq(req.ChannelId))))
- qw2 = qw2.Where(q.Columns(q.PlayerID).In(c.WithContext(ctx).Select(c.Playerid).Where(c.ChannelID.Eq(req.ChannelId))))
- }
- if req.ServerId > 0 {
- qw = qw.Where(q.ServerID.Eq(req.ServerId))
- qw2 = qw2.Where(q.ServerID.Eq(req.ServerId))
- }
- if req.Flag > -1 {
- qw = qw.Where(q.Flag.Eq(req.Flag))
- qw2 = qw2.Where(q.Flag.Eq(req.Flag))
- }
- var counter forms.CounterF
- if err = qw.Select(q.Money.Sum().As("total")).Where(q.Status.Eq(consts.OrderStateSuccess), q.Date.Eq(lists[k].Date)).Scan(&counter); err != nil {
- return serializer.Err(consts.CodeParamErr, "查询出错 Money Sum", err)
- }
- lists[k].TotalRecharge = counter.Total
- playerCount, err := qw.Distinct(q.PlayerID).Where(q.Status.Eq(consts.OrderStateSuccess), q.Date.Eq(lists[k].Date)).Count()
- if err != nil {
- return serializer.Response{}
- }
- lists[k].Players = int(playerCount)
- if playerCount == 0 {
- playerCount = 1
- }
- var iosCounter forms.CounterF
- if err = qw2.Select(q.Money.Sum().As("total")).Where(q.Status.Eq(consts.OrderStateSuccess), q.Platform.Eq(consts.OrderPlatformIos), q.Date.Eq(lists[k].Date)).Scan(&iosCounter); err != nil {
- return serializer.Err(consts.CodeParamErr, "查询出错 OrderPlatformIos Sum", err)
- }
- lists[k].IosRecharge = iosCounter.Total
- lists[k].AndroidRecharge = counter.Total - iosCounter.Total
- lists[k].ARPU = utility.Round(lists[k].TotalRecharge / float64(playerCount))
- // 统计新增
- lists[k].NewPlayers, lists[k].NewTotalRecharge, err = statNew(date, date)
- if err != nil {
- return serializer.Err(consts.CodeParamErr, "查询出错 statNew ", err)
- }
- if lists[k].NewTotalRecharge > 0 && lists[k].NewPlayers > 0 {
- lists[k].NewARPU = utility.Round(lists[k].NewTotalRecharge / float64(lists[k].NewPlayers))
- }
- }
- }
- // 导出
- if req.IsExport == 1 {
- //if err = m.Scan(&lists); err != nil {
- // return serializer.Err(consts.CodeParamErr, "查询出错 lists", err)
- //}
- f := excelize.NewFile()
- f.SetColWidth("Sheet1", "A", "A", 15)
- f.SetColWidth("Sheet1", "B", "B", 20)
- f.SetColWidth("Sheet1", "C", "C", 20)
- f.SetColWidth("Sheet1", "D", "D", 20)
- f.SetColWidth("Sheet1", "E", "E", 20)
- f.SetColWidth("Sheet1", "F", "F", 20)
- f.SetColWidth("Sheet1", "G", "G", 20)
- f.SetColWidth("Sheet1", "H", "H", 20)
- f.SetColWidth("Sheet1", "I", "I", 20)
- // 创建一个工作表
- f.SetCellValue("Sheet1", "A1", "日期")
- f.SetCellValue("Sheet1", "B1", "总充值")
- f.SetCellValue("Sheet1", "C1", "安卓充值")
- f.SetCellValue("Sheet1", "D1", "苹果充值")
- f.SetCellValue("Sheet1", "E1", "付费人数")
- f.SetCellValue("Sheet1", "F1", "ARPU")
- f.SetCellValue("Sheet1", "G1", "日新增充值")
- f.SetCellValue("Sheet1", "H1", "日新增人数")
- f.SetCellValue("Sheet1", "I1", "日新增ARPU")
- for i, v := range lists {
- f.SetCellValue("Sheet1", fmt.Sprintf("A%d", i+2), v.Date)
- f.SetCellValue("Sheet1", fmt.Sprintf("B%d", i+2), v.TotalRecharge)
- f.SetCellValue("Sheet1", fmt.Sprintf("C%d", i+2), v.AndroidRecharge)
- f.SetCellValue("Sheet1", fmt.Sprintf("D%d", i+2), v.IosRecharge)
- f.SetCellValue("Sheet1", fmt.Sprintf("E%d", i+2), v.Players)
- f.SetCellValue("Sheet1", fmt.Sprintf("F%d", i+2), v.ARPU)
- f.SetCellValue("Sheet1", fmt.Sprintf("G%d", i+2), v.NewTotalRecharge)
- f.SetCellValue("Sheet1", fmt.Sprintf("H%d", i+2), v.NewPlayers)
- f.SetCellValue("Sheet1", fmt.Sprintf("I%d", i+2), v.NewARPU)
- }
- // 设置工作簿的默认工作表
- f.SetActiveSheet(1)
- ctx.Header("Content-Type", "application/vnd.ms-excel")
- ctx.Header("Content-Disposition", fmt.Sprintf("attachment;filename=每日订单统计导出%s.xlsx", time.Now().Format("20060102150405")))
- f.WriteTo(ctx.Writer)
- return serializer.Response{}
- }
- models.List = lists
- models.Page = req.Page
- models.PerPage = req.PerPage
- models.PageCount = (count + req.PerPage - 1) / req.PerPage
- return serializer.Suc(models)
- }
- func (s *sOrder) RechargeRankingIOS(ctx *gin.Context, req forms.RechargeRankingReq) serializer.Response {
- var (
- sql = "SELECT `playerid`,sum(total) as t FROM `wxpay_iosorder` WHERE `state` = 1 and total > 0 GROUP BY `playerid` ORDER BY t DESC LIMIT 100"
- models forms.ListRes
- )
- type Result struct {
- ID int64 `json:"id"`
- Playerid int64 `json:"playerid"`
- T int64 `json:"total"`
- NickName string `json:"nickName"`
- }
- var result []Result
- if len(req.Time) == 2 {
- sql = fmt.Sprintf("SELECT `playerid`,sum(total) as t "+
- "FROM `wxpay_iosorder` "+
- "WHERE `state` = 1 and total > 0 and `create_time` BETWEEN '%v' AND '%v' GROUP BY `playerid` ORDER BY t DESC LIMIT 100", req.Time[0], req.Time[1])
- }
- config.GDB1.Raw(sql).Scan(&result)
- for i := 0; i < len(result); i++ {
- result[i].ID = int64(i + 1)
- result[i].T = result[i].T / 100
- user := data.GetUser(result[i].Playerid)
- if user != nil {
- result[i].NickName = user.NickName
- }
- }
- // 计算分页
- req.Page, req.PerPage, _ = forms.CalculatePage(req.Page, req.PerPage)
- models.List = result
- models.Page = req.Page
- models.PerPage = req.PerPage
- models.PageCount = 1 //(int64(len(result)) + req.PerPage - 1) / req.PerPage
- return serializer.Suc(models)
- }
- func (s *sOrder) RechargeRankingAndroid(ctx *gin.Context, req forms.RechargeRankingReq) serializer.Response {
- var (
- sql = " SELECT `wxpay_order`.`playerid`,sum((`virtualpayorder`.`balance`-`virtualpayorder`.`payedBalance`)) as t FROM `wxpay_order` LEFT JOIN `virtualpayorder` AS `virtualpayorder` ON `wxpay_order`.`orderId` = `virtualpayorder`.`billNo` WHERE `wxpay_order`.`state` = 1 and (`virtualpayorder`.`balance`-`virtualpayorder`.`payedBalance`) > 0 GROUP BY `wxpay_order`.`playerid` ORDER BY t DESC LIMIT 100"
- models forms.ListRes
- )
- type Result struct {
- ID int64 `json:"id"`
- Playerid int64 `json:"playerid"`
- T int64 `json:"total"`
- NickName string `json:"nickName"`
- }
- var result []Result
- if len(req.Time) == 2 {
- sql = fmt.Sprintf("SELECT `wxpay_order`.`playerid`,sum((`virtualpayorder`.`balance`-`virtualpayorder`.`payedBalance`)) as t "+
- "FROM `wxpay_order` LEFT JOIN `virtualpayorder` AS `virtualpayorder` ON `wxpay_order`.`orderId` = `virtualpayorder`.`billNo` "+
- "WHERE `wxpay_order`.`state` = 1 and (`virtualpayorder`.`balance`-`virtualpayorder`.`payedBalance`) > 0 "+
- "and `wxpay_order`.`create_time` BETWEEN '%v' AND '%v' "+
- "GROUP BY `wxpay_order`.`playerid` ORDER BY t DESC LIMIT 100", req.Time[0], req.Time[1])
- }
- config.GDB1.Raw(sql).Scan(&result)
- for i := 0; i < len(result); i++ {
- result[i].ID = int64(i + 1)
- result[i].T = result[i].T / 100
- user := data.GetUser(result[i].Playerid)
- if user != nil {
- result[i].NickName = user.NickName
- }
- }
- req.Page, req.PerPage, _ = forms.CalculatePage(req.Page, req.PerPage)
- models.List = result
- models.Page = req.Page
- models.PerPage = req.PerPage
- models.PageCount = 1
- return serializer.Suc(models)
- }
- func (s *sOrder) RechargeRanking(ctx *gin.Context, req forms.RechargeRankingReq) serializer.Response {
- type RankingModels struct {
- Ranking int32 `json:"ranking"`
- Total float64 `json:"total"`
- PlayerID int64 `json:"player_id"`
- NickName string `json:"nickName"`
- Platform int32 `json:"platform"`
- LastLogin string `json:"lastLogin"`
- LastLoginValue int64 `json:"lastLoginValue"`
- LastLoginTag string `json:"lastLoginTag"`
- LastRecharge string `json:"lastRecharge"`
- LastRechargeValue int64 `json:"lastRechargeValue"`
- LastRechargeTag string `json:"lastRechargeTag"`
- Diamond int32 `json:"diamond"`
- Level int32 `json:"level"`
- MaxPass string `json:"maxPass"`
- MaxPassValue int32 `json:"maxPassValue"`
- }
- var (
- models forms.ListRes
- offset int64 = 0
- list []RankingModels
- count int64 = 0
- err error
- )
- formatTime := func(t int64) (string, string) {
- n := time.Now().Unix()
- var ys int64 = 31536000
- var ds int64 = 86400
- var hs int64 = 3600
- var ms int64 = 60
- var ss int64 = 1
- var rs string
- var tag = "success"
- d := n - t
- switch {
- case d > ys:
- tag = "error"
- rs = fmt.Sprintf("%d年前", int(d/ys))
- case d > ds:
- if int(d/ds) > 6 {
- tag = "warning"
- } else {
- tag = "info"
- }
- rs = fmt.Sprintf("%d天前", int(d/ds))
- case d > hs:
- rs = fmt.Sprintf("%d小时前", int(d/hs))
- case d > ms:
- rs = fmt.Sprintf("%d分钟前", int(d/ms))
- case d > ss:
- rs = fmt.Sprintf("%d秒前", int(d/ss))
- default:
- rs = "刚刚"
- }
- return rs, tag
- }
- getPlayerMaterial := func(playerId int64) (diamond int32, maxPassName string, maxPassValue int32, err error) {
- type Pass struct {
- Id int `json:"id"`
- Count int `json:"count"`
- Difficulty int `json:"difficulty"`
- Pass bool `json:"pass"`
- IsActivity bool `json:"isActivity"`
- }
- DB, err := player.GetDBByUserId(int64(playerId))
- if err != nil {
- return 0, "", 0, err
- }
- var (
- models1 *model.PlayerMaterial
- q = query.Use(config.GDBGroup[DB]).PlayerMaterial
- m = q.WithContext(ctx).Select(q.Diamond, q.PassRoom).Where(q.Playerid.Eq(int64(playerId)))
- pass []*Pass
- maxPass int
- )
- if err = m.Scan(&models1); err != nil {
- return
- }
- if models1 == nil {
- return 0, "", 0, nil
- }
- if err = json.Unmarshal([]byte(models1.PassRoom), &pass); err != nil {
- return 0, "", 0, err
- }
- if len(pass) > 0 {
- for _, p := range pass {
- if p.Id < 100 && p.Id > maxPass {
- maxPass = p.Id
- }
- }
- }
- ca := gmdata.GetChapterById(int32(maxPass))
- if ca != nil {
- maxPassName = ca.Name
- maxPassValue = int32(ca.Uid)
- }
- return models1.Diamond, maxPassName, maxPassValue, nil
- }
- getLoginTime := func(playerId int64) (l int32, s, t string, v int64, err error) {
- DB, err := player.GetDBByUserId(int64(playerId))
- if err != nil {
- return
- }
- var (
- models1 *model.PlayerAttr
- q = query.Use(config.GDBGroup[DB]).PlayerAttr
- m = q.WithContext(ctx).Select(q.Lastlogintick, q.Level).Where(q.Playerid.Eq(int64(playerId)))
- )
- if err = m.Scan(&models1); err != nil {
- return
- }
- if models1 == nil {
- return 0, "", "default", 0, nil
- }
- s, t = formatTime(models1.Lastlogintick)
- l = models1.Level
- v = models1.Lastlogintick
- return
- }
- getRechargeTime := func(playerId int64) (s, t string, v int64, err error) {
- var (
- models1 *model.Order
- q = query.Use(config.DB).Order
- m = q.WithContext(ctx).Select(q.CreatedAt).Where(q.PlayerID.Eq(playerId))
- )
- if err = m.Order(q.CreatedAt.Desc()).Scan(&models1); err != nil {
- return
- }
- if models1 == nil {
- return "", "default", 0, nil
- }
- s, t = formatTime(models1.CreatedAt.Unix())
- v = models1.CreatedAt.Unix()
- return
- }
- req.Page, req.PerPage, offset = forms.CalculatePage(req.Page, req.PerPage)
- mod := config.DB.Model(&model.Order{}).
- Select("SUM(`money`) AS `total`,`player_id`,`platform`").
- Where("money > ? and status = ? ", 0, consts.OrderStatusSuccess).
- Group("player_id")
- if len(req.Time) == 2 {
- mod = mod.Where("created_at BETWEEN ? AND ?", req.Time[0], req.Time[1])
- }
- if req.Platform > 0 {
- mod = mod.Where("platform = ?", req.Platform)
- }
- if req.ServerId > 0 {
- mod = mod.Where("server_id = ?", req.ServerId)
- }
- mod.Count(&count)
- if count > 0 {
- mod.Limit(int(req.PerPage)).Offset(int(offset)).Order("total desc").Find(&list)
- }
- if len(list) > 0 {
- for k, _ := range list {
- list[k].Ranking = int32(offset + int64(k) + 1)
- user := data.GetUser(int64(list[k].PlayerID))
- if user != nil {
- list[k].NickName = user.NickName
- }
- list[k].Diamond, list[k].MaxPass, list[k].MaxPassValue, err = getPlayerMaterial(list[k].PlayerID)
- if err != nil {
- logrus.Warnf("查询出错 getPlayerMaterial:%+v", err)
- }
- list[k].Level, list[k].LastLogin, list[k].LastLoginTag, list[k].LastLoginValue, err = getLoginTime(list[k].PlayerID)
- if err != nil {
- logrus.Warnf("查询出错 getLoginTime:%+v", err)
- }
- list[k].LastRecharge, list[k].LastRechargeTag, list[k].LastRechargeValue, err = getRechargeTime(int64(list[k].PlayerID))
- if err != nil {
- logrus.Warnf("查询出错 getRechargeTime:%+v", err)
- }
- }
- }
- models.List = list
- models.Page = req.Page
- models.PerPage = req.PerPage
- models.PageCount = (count + req.PerPage - 1) / req.PerPage
- return serializer.Suc(models)
- }
- func (s *sOrder) UserStatistics(ctx *gin.Context, req forms.OrderUserStatisticsReq) serializer.Response {
- type Counter struct {
- Total float64 `json:"total"`
- }
- type Counter2 struct {
- Total int64 `json:"total"`
- }
- DB, err := player.GetDBByUserId(req.Playerid)
- if err != nil {
- return serializer.Err(consts.CodeParamErr, "GetDBByUserId err", err)
- }
- var (
- androidQuery = query.Use(config.GDBGroup[DB]).WxpayOrder
- iosQuery = query.Use(config.GDBGroup[DB]).PayOrderIos
- orderQuery = query.Use(config.DB).Order
- changedQuery = query.Use(config.DB).ChangedLog
- models forms.OrderUserStatisticsRes
- rechargeAmountCounter Counter
- )
- models.Playerid = req.Playerid
- models.OrderPlatform = consts.OrderPlatformAndroid
- err = orderQuery.WithContext(ctx).Select(orderQuery.Money.Sum().As("total")).Where(orderQuery.PlayerID.Eq(req.Playerid), orderQuery.Status.Eq(consts.OrderStateSuccess)).Scan(&rechargeAmountCounter)
- if err != nil {
- return serializer.Err(
- consts.CodeParamErr,
- "查询出错 RechargeAmount count",
- err,
- )
- }
- models.RechargeAmount = rechargeAmountCounter.Total
- models.RechargeCount, err = androidQuery.WithContext(ctx).Where(androidQuery.Playerid.Eq(req.Playerid), androidQuery.State.Eq(consts.OrderStateSuccess)).Count()
- if err != nil {
- return serializer.Err(
- consts.CodeParamErr,
- "查询出错 androidQuery count",
- err,
- )
- }
- if models.RechargeCount == 0 {
- models.RechargeCount, err = iosQuery.WithContext(ctx).Where(iosQuery.PlayerID.Eq(req.Playerid), iosQuery.State.Eq(consts.OrderStateSuccess), iosQuery.TradeState.Eq("SUCESS")).Count()
- if err != nil {
- return serializer.Err(
- consts.CodeParamErr,
- "查询出错 iosQuery count",
- err,
- )
- }
- if models.RechargeCount > 0 {
- models.OrderPlatform = consts.OrderPlatformIos
- }
- }
- if models.RechargeCount > 0 {
- if models.OrderPlatform == consts.OrderPlatformAndroid {
- models.RechargeDiamondCount, err = androidQuery.WithContext(ctx).
- Where(androidQuery.Playerid.Eq(req.Playerid), androidQuery.State.Eq(consts.OrderStateSuccess), androidQuery.GoodsID.In(config.DiamondGoodIds...)).
- Count()
- if err != nil {
- return serializer.Err(
- consts.CodeParamErr,
- "查询出错 androidQuery RechargeDiamondCount count",
- err,
- )
- }
- first, err := androidQuery.WithContext(ctx).
- Select(androidQuery.CreateTime).
- Where(androidQuery.Playerid.Eq(req.Playerid), androidQuery.State.Eq(consts.OrderStateSuccess)).
- First()
- if err != nil {
- return serializer.Err(
- consts.CodeParamErr,
- "查询出错 androidQuery First count",
- err,
- )
- }
- models.FirstChargeAt = first.CreateTime.Unix()
- last, err := androidQuery.WithContext(ctx).
- Select(androidQuery.CreateTime).
- Where(androidQuery.Playerid.Eq(req.Playerid), androidQuery.State.Eq(consts.OrderStateSuccess)).
- Last()
- if err != nil {
- return serializer.Err(
- consts.CodeParamErr,
- "查询出错 androidQuery last count",
- err,
- )
- }
- models.LastChargeAt = last.CreateTime.Unix()
- } else {
- models.RechargeDiamondCount, err = iosQuery.WithContext(ctx).
- Where(iosQuery.PlayerID.Eq(req.Playerid), iosQuery.TradeState.Eq("SUCESS"), iosQuery.State.Eq(consts.OrderStateSuccess), iosQuery.GoodsID.In(config.DiamondGoodIds...)).
- Count()
- if err != nil {
- return serializer.Err(
- consts.CodeParamErr,
- "查询出错 iosQuery RechargeDiamondCount count",
- err,
- )
- }
- first, err := iosQuery.WithContext(ctx).
- Select(iosQuery.CreateTime).
- Where(iosQuery.PlayerID.Eq(req.Playerid), iosQuery.State.Eq(consts.OrderStateSuccess)).
- First()
- if err != nil {
- return serializer.Err(
- consts.CodeParamErr,
- "查询出错 iosQuery First count",
- err,
- )
- }
- models.FirstChargeAt = first.CreateTime.Unix()
- last, err := iosQuery.WithContext(ctx).
- Select(iosQuery.CreateTime).
- Where(iosQuery.PlayerID.Eq(req.Playerid), iosQuery.State.Eq(consts.OrderStateSuccess), iosQuery.TradeState.Eq("SUCESS")).
- Last()
- if err != nil {
- return serializer.Err(
- consts.CodeParamErr,
- "查询出错 iosQuery last count",
- err,
- )
- }
- models.LastChargeAt = last.CreateTime.Unix()
- }
- }
- // 消费金币
- var consumptionCoinCountCounter Counter2
- err = changedQuery.WithContext(ctx).
- Select(changedQuery.Coin.Sum().As("total")).
- Where(changedQuery.UserID.Eq(req.Playerid), changedQuery.Coin.Lt(0)).
- Scan(&consumptionCoinCountCounter)
- if err != nil {
- return serializer.Err(
- consts.CodeParamErr,
- "查询出错 ConsumptionCoinCount count",
- err,
- )
- }
- models.ConsumptionCoinCount = consumptionCoinCountCounter.Total * -1
- // 消费钻石
- var ConsumptionDiamondCountCounter Counter2
- err = changedQuery.WithContext(ctx).
- Select(changedQuery.Diamond.Sum().As("total")).
- Where(changedQuery.UserID.Eq(req.Playerid), changedQuery.Diamond.Lt(0)).
- Scan(&ConsumptionDiamondCountCounter)
- if err != nil {
- return serializer.Err(
- consts.CodeParamErr,
- "查询出错 ConsumptionDiamondCount count",
- err,
- )
- }
- models.ConsumptionDiamondCount = ConsumptionDiamondCountCounter.Total * -1
- return serializer.Suc(models)
- }
- func (s *sOrder) AbnormalList(ctx *gin.Context, req forms.AbnormalOrderListReq) serializer.Response {
- type AbnormalOrderListModel struct {
- model.WxpayOrder
- NickName string `json:"nickName"`
- GoodsName string `json:"goodsName"`
- Money int64 `json:"money"`
- ServerId int `json:"serverId"`
- }
- var (
- offset int64 = 0
- models forms.ListRes
- result []AbnormalOrderListModel
- )
- req.Page, req.PerPage, offset = forms.CalculatePage(req.Page, req.PerPage)
- //result
- models.List = result
- models.Page = req.Page
- models.PerPage = req.PerPage
- o := query.Use(config.GDBGroup[int(req.ServerId)]).WxpayOrder
- m := o.WithContext(ctx)
- if len(req.Time) == 2 {
- m = m.Where(o.CreateTime.Between(req.Time[0], req.Time[1]))
- } else {
- nowTime := time.Now()
- threeDaysAgo := time.Date(nowTime.Year(), nowTime.Month(), nowTime.Day()-3, 0, 0, 0, 0, time.Local)
- m = m.Where(o.CreateTime.Between(threeDaysAgo, time.Now()))
- }
- if req.PlayerID > 0 {
- m = m.Where(o.Playerid.Eq(req.PlayerID))
- }
- if req.GoodsID > 0 {
- m = m.Where(o.GoodsID.Eq(req.GoodsID))
- }
- if req.OrderID != "" {
- m = m.Where(o.OrderID.Like("%" + req.OrderID + "%"))
- }
- //只获取异常订单
- m = m.Where(o.State.Neq(1)).Where(o.State.Neq(3)).Order(o.CreateTime.Desc())
- count, err := m.Count()
- if err != nil {
- return serializer.Err(consts.CodeParamErr, "查询出错 count", err)
- }
- if count == 0 {
- return serializer.Suc(models)
- }
- if req.IsExport != 1 {
- m = m.Limit(int(req.PerPage)).Offset(int(offset))
- }
- // 列表展示
- if err = m.Scan(&result); err != nil {
- return serializer.Err(consts.CodeParamErr, "查询出错 lists", err)
- }
- playerIds := make([]int64, len(result))
- for i, item := range result {
- playerIds[i] = item.Playerid
- }
- users := data.GetUsers(playerIds, int(req.ServerId))
- uMap := make(map[int64]*model.PlayerAttr, len(users))
- for _, user := range users {
- uMap[user.ID] = user
- }
- //读取shop.json获取商品信息
- shopGoods := gmdata.GetShopGoods()
- for i, item := range result {
- if _, ok := shopGoods[int64(item.GoodsID)]; ok {
- result[i].Money = shopGoods[int64(item.GoodsID)].Cost[0].Count
- result[i].GoodsName = shopGoods[int64(item.GoodsID)].Name
- } else {
- result[i].Money = 0
- result[i].GoodsName = string(item.GoodsID)
- }
- if user, ok := uMap[item.Playerid]; ok {
- result[i].NickName = user.NickName
- }
- result[i].ServerId = int(req.ServerId)
- }
- // 导出
- if req.IsExport == 1 && len(result) != 0 {
- f := excelize.NewFile()
- f.SetColWidth("Sheet1", "A", "A", 15)
- f.SetColWidth("Sheet1", "B", "B", 15)
- f.SetColWidth("Sheet1", "C", "C", 15)
- f.SetColWidth("Sheet1", "D", "D", 25)
- f.SetColWidth("Sheet1", "E", "E", 25)
- f.SetColWidth("Sheet1", "F", "F", 30)
- f.SetColWidth("Sheet1", "G", "G", 30)
- f.SetColWidth("Sheet1", "H", "H", 15)
- f.SetColWidth("Sheet1", "J", "J", 15)
- f.SetColWidth("Sheet1", "K", "K", 25)
- f.SetColWidth("Sheet1", "L", "L", 25)
- // 创建一个工作表
- f.SetCellValue("Sheet1", "A1", "序号")
- f.SetCellValue("Sheet1", "B1", "下单渠道")
- f.SetCellValue("Sheet1", "C1", "玩家ID")
- f.SetCellValue("Sheet1", "D1", "玩家昵称")
- f.SetCellValue("Sheet1", "E1", "购买商品")
- f.SetCellValue("Sheet1", "F1", "订单号")
- f.SetCellValue("Sheet1", "G1", "外部订单号")
- f.SetCellValue("Sheet1", "H1", "支付金额(元)")
- f.SetCellValue("Sheet1", "J1", "支付状态")
- f.SetCellValue("Sheet1", "K1", "支付时间")
- f.SetCellValue("Sheet1", "L1", "创建时间")
- for i, v := range result {
- f.SetCellValue("Sheet1", fmt.Sprintf("A%d", i+2), v.ID)
- if v.Platform == consts.OrderPlatformAndroid {
- f.SetCellValue("Sheet1", fmt.Sprintf("B%d", i+2), "安卓")
- } else {
- f.SetCellValue("Sheet1", fmt.Sprintf("B%d", i+2), "苹果")
- }
- f.SetCellValue("Sheet1", fmt.Sprintf("C%d", i+2), v.Playerid)
- f.SetCellValue("Sheet1", fmt.Sprintf("D%d", i+2), v.NickName)
- f.SetCellValue("Sheet1", fmt.Sprintf("E%d", i+2), gmdata.GetGoodLabel(v.GoodsID))
- f.SetCellValue("Sheet1", fmt.Sprintf("F%d", i+2), v.OrderID)
- f.SetCellValue("Sheet1", fmt.Sprintf("H%d", i+2), v.GoodsName) //商品名
- f.SetCellValue("Sheet1", fmt.Sprintf("H%d", i+2), utility.Round(float64(v.Money))) //商品价格
- f.SetCellValue("Sheet1", fmt.Sprintf("J%d", i+2), consts.GetOrderStatusTag(v.State))
- f.SetCellValue("Sheet1", fmt.Sprintf("L%d", i+2), v.CreateTime.Format("2006-01-02 15:04:05"))
- }
- // 设置工作簿的默认工作表
- f.SetActiveSheet(1)
- ctx.Header("Content-Type", "application/vnd.ms-excel")
- ctx.Header("Content-Disposition", fmt.Sprintf("attachment;filename=订单记录导出%s.xlsx", time.Now().Format("20060102150405")))
- f.WriteTo(ctx.Writer)
- return serializer.Response{}
- }
- models.List = result
- models.PageCount = (count + req.PerPage - 1) / req.PerPage
- return serializer.Suc(models)
- }
- func (s *sOrder) AbnormalReissue(ctx *gin.Context, req forms.AbnormalOrderReissueReq) serializer.Response {
- var (
- o = query.Use(config.GDBGroup[req.ServerId]).WxpayOrder
- m = o.WithContext(ctx)
- )
- //查询订单
- order, err := m.Where(o.OrderID.Eq(req.OrderId)).First()
- if err != nil {
- return serializer.Err(consts.CodeParamErr, "查询出错 order", err)
- }
- //是否已经补发
- if order.State == 1 {
- return serializer.Suc(nil)
- }
- // 更新
- if _, err = m.Where(o.OrderID.Eq(order.OrderID)).Update(o.State, 8); err != nil {
- return serializer.Err(consts.CodeNoRightErr, "更新出错 order", err)
- }
- //redis新增mdsWaitPayment:玩家id
- rdsClient := config.RedisGroup[req.ServerId]
- if rdsClient == nil {
- return serializer.Err(consts.CodeParamErr, "redis不存在", errors.New("redis不存在"))
- }
- rdsClient.HSet(fmt.Sprintf("mdsWaitPayment:%d", order.Playerid), order.OrderID, order.CreateTime.Unix())
- return serializer.Suc(nil)
- }
|