213 lines
5.7 KiB
Go
213 lines
5.7 KiB
Go
package model
|
||
|
||
import (
|
||
"backend/Type"
|
||
util "backend/util"
|
||
"fmt"
|
||
)
|
||
|
||
type Log struct {
|
||
Uid int `json:"Id"`
|
||
PageSize int `json:"PageSize"`
|
||
CurrentPage int `json:"CurrentPage"`
|
||
AppId int `json:"AppId"`
|
||
EventParam string `json:"Event"`
|
||
StartTime int64 `json:"StartTime"`
|
||
EndTime int64 `json:"EndTime"`
|
||
ItemId int `json:"ItemId"`
|
||
}
|
||
|
||
type ResAsset struct {
|
||
Total int `json:"total"`
|
||
Data []*Type.AssetData `json:"data"`
|
||
Sum int `json:"sum"` // 总和
|
||
NSum int `json:"nsum"` // 负数和
|
||
PSum int `json:"psum"` // 正数和
|
||
}
|
||
|
||
type ResEvent struct {
|
||
Total int `json:"total"`
|
||
Data []*Type.EventData `json:"data"`
|
||
}
|
||
|
||
type ResOrder struct {
|
||
Total int `json:"total"`
|
||
Data []*Order `json:"data"`
|
||
}
|
||
|
||
type Order struct {
|
||
Id int `db:"id"`
|
||
Uid int `db:"Uid"`
|
||
AppId int `db:"AppId"`
|
||
ServerId int `db:"ServerId"`
|
||
OrderId string `db:"OrderId"`
|
||
Price float64 `db:"Price"`
|
||
PayChannelOrderId string `db:"PayChannelOrderId"`
|
||
ProductId int `db:"ProductId"`
|
||
CreateTime int `db:"CreateTime"`
|
||
PayTime int `db:"PayTime"`
|
||
PayType int `db:"PayType"`
|
||
Param string `db:"PayChannelExtra"`
|
||
PayStatus int `db:"PayStatus"`
|
||
CreateTimeStr string
|
||
PayTimeStr string
|
||
}
|
||
|
||
type ResAssetDetail struct {
|
||
Uid int `json:"Uid"`
|
||
ChangeType string `json:"change_type"`
|
||
ChangeNum int `json:"change_num"`
|
||
ChangeAfter int `json:"change_after"`
|
||
ItemId int `json:"item_id"`
|
||
Timestamp int `json:"timestamp"`
|
||
}
|
||
|
||
type Event struct {
|
||
Id int `db:"id"`
|
||
Uid int `db:"Uid"`
|
||
AppId int `db:"AppId"`
|
||
ServerId int `db:"ServerId"`
|
||
Event string `db:"Event"`
|
||
Label string
|
||
Param string `db:"Param"`
|
||
Timestamp int `db:"Timestamp"`
|
||
}
|
||
|
||
func (m *Log) Asset() (*ResAsset, error) {
|
||
resutl, total, err := util.SearchAssetByUid(m.AppId, m.Uid, (m.CurrentPage-1)*m.PageSize, m.CurrentPage*m.PageSize, m.StartTime, m.EndTime, m.ItemId, m.EventParam)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
Sum := 0
|
||
NSum := 0
|
||
PSum := 0
|
||
for _, asset := range resutl {
|
||
Sum += asset.ChangeNum
|
||
if asset.ChangeType == "gain" {
|
||
PSum += asset.ChangeNum
|
||
} else {
|
||
NSum += asset.ChangeNum
|
||
}
|
||
asset.ItemName = util.GetItemName(asset.ItemId)
|
||
|
||
}
|
||
return &ResAsset{
|
||
Total: int(total),
|
||
Data: resutl,
|
||
Sum: Sum,
|
||
NSum: NSum,
|
||
PSum: PSum,
|
||
}, nil
|
||
}
|
||
|
||
func (m *Log) Event() (*ResEvent, error) {
|
||
event, total, err := util.SearchEventByUid(m.AppId, m.Uid, (m.CurrentPage-1)*m.PageSize, m.PageSize, m.StartTime, m.EndTime, m.EventParam)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
return &ResEvent{
|
||
Total: int(total),
|
||
Data: event,
|
||
}, nil
|
||
}
|
||
|
||
func (m *Log) Order() (*ResOrder, error) {
|
||
m.AppId = m.Uid / 100000000
|
||
AppConfig, err := util.GetAppConfig(m.AppId)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
Db := util.MPool.GetMysqlDB(AppConfig, 1)
|
||
defer Db.Close()
|
||
if Db == nil {
|
||
return nil, fmt.Errorf("failed to get mysql database")
|
||
}
|
||
assets := []*Order{}
|
||
err = Db.Select(&assets, "SELECT `id`, `Uid`, `ProductId`, `Price`, `PayTime`, `PayStatus`, `PayChannelOrderId`, `OrderId`, `PayChannelExtra` FROM t_player_charge WHERE Uid = ? and PayTime > 0 ORDER BY PayTime DESC LIMIT ?, ?", m.Uid, (m.CurrentPage-1)*m.PageSize, m.PageSize)
|
||
|
||
if err != nil {
|
||
return nil, fmt.Errorf("failed to get asset list: %v", err)
|
||
}
|
||
var total int
|
||
err = Db.QueryRow("SELECT COUNT(*) FROM t_player_charge WHERE Uid = ? and PayTime > 0 ", m.Uid).Scan(&total)
|
||
for _, asset := range assets {
|
||
asset.CreateTimeStr = util.TimestampToDateTime(int64(asset.CreateTime), AppConfig.Tz)
|
||
asset.PayTimeStr = util.TimestampToDateTime(int64(asset.PayTime), AppConfig.Tz)
|
||
}
|
||
if err != nil {
|
||
return nil, fmt.Errorf("failed to get asset count: %v", err)
|
||
}
|
||
return &ResOrder{
|
||
Total: total,
|
||
Data: assets,
|
||
}, nil
|
||
}
|
||
|
||
type ResHeat struct {
|
||
Date string `json:"date"`
|
||
Value int `json:"value"`
|
||
}
|
||
|
||
func (m *Log) Heat() ([]*ResHeat, error) {
|
||
m.AppId = m.Uid / 100000000
|
||
AppConfig, err := util.GetAppConfig(m.AppId)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
Db := util.MPool.GetTopicDB(AppConfig.Topic)
|
||
defer Db.Close()
|
||
if Db == nil {
|
||
return nil, fmt.Errorf("failed to get mysql database")
|
||
}
|
||
assets := []*ResHeat{}
|
||
year := util.Year()
|
||
startDate := fmt.Sprintf("%d-01-01T00:00:00Z", year)
|
||
endDate := fmt.Sprintf("%d-12-31T23:59:59Z", year)
|
||
startTimestamp, err := util.ParseTimeToTimestamp(startDate, AppConfig.Tz)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
endTimestamp, err := util.ParseTimeToTimestamp(endDate, AppConfig.Tz)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
|
||
// 使用一次查询获取整年的数据,然后在Go中按日期分组
|
||
type LogRecord struct {
|
||
Timestamp int64 `db:"Timestamp"`
|
||
}
|
||
|
||
var records []LogRecord
|
||
simpleSQL := "SELECT Timestamp FROM log_event WHERE Uid= ? And Timestamp >= ? AND Timestamp <= ? AND Timestamp IS NOT NULL AND Timestamp > 0 "
|
||
err = Db.Select(&records, simpleSQL, m.Uid, startTimestamp, endTimestamp)
|
||
if err != nil {
|
||
return nil, fmt.Errorf("failed to get log records: %v", err)
|
||
}
|
||
|
||
// 在Go中按日期分组统计
|
||
dateCountMap := make(map[string]int)
|
||
for _, record := range records {
|
||
date := util.TimestampToDate(record.Timestamp, AppConfig.Tz)
|
||
if date != "" {
|
||
dateCountMap[date]++
|
||
}
|
||
}
|
||
|
||
// 生成完整的日期范围,包括没有数据的日期
|
||
for i := startTimestamp; i <= endTimestamp; i += 24 * 3600 {
|
||
date := util.TimestampToDate(i, AppConfig.Tz)
|
||
if date == "" {
|
||
continue // 跳过无效的日期
|
||
}
|
||
|
||
count := dateCountMap[date] // 如果没有数据,默认为0
|
||
|
||
assets = append(assets, &ResHeat{
|
||
Date: date,
|
||
Value: count,
|
||
})
|
||
}
|
||
|
||
return assets, nil
|
||
}
|