admin_backend/model/log.go
2025-04-02 10:52:51 +08:00

254 lines
7.6 KiB
Go

package model
import (
util "backend/util"
"encoding/json"
"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 string `json:"StartTime"`
EndTime string `json:"EndTime"`
ItemId int `json:"ItemId"`
}
type ResAsset struct {
Total int `json:"total"`
Data []*ResAssetDetail `json:"data"`
Sum int `json:"sum"` // 总和
NSum int `json:"nsum"` // 负数和
PSum int `json:"psum"` // 正数和
}
type ResEvent struct {
Total int `json:"total"`
Data []*Event `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:"Param"`
Timestamp int `db:"Timestamp"`
}
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) {
AppId, _ := util.ParseUid(m.Uid)
AppConfig, err := util.GetAppConfig(AppId)
if err != nil {
return nil, err
}
StartTime, err := util.ParseTimeToTimestamp(m.StartTime, AppConfig.Tz)
if err != nil {
return nil, err
}
EndTime, err := util.ParseTimeToTimestamp(m.EndTime, AppConfig.Tz)
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 := []*Event{}
value := make([]interface{}, 0)
totalValue := make([]interface{}, 0)
Sql := "SELECT * FROM log_event WHERE Uid = ? and `Event` = 'asset_change' and Timestamp >= ? and Timestamp <= ? "
TotalSql := "SELECT COUNT(*) FROM log_event WHERE Uid = ? and `Event` = 'asset_change' and Timestamp >= ? and Timestamp <= ? "
totalValue = append(totalValue, m.Uid, StartTime, EndTime)
value = append(value, m.Uid, StartTime, EndTime)
if m.ItemId != 0 {
Sql += "and Param like ? "
value = append(value, fmt.Sprintf("%%\"item_id\":%d%%", m.ItemId))
TotalSql += "and Param like ? "
totalValue = append(totalValue, fmt.Sprintf("%%\"item_id\":%d%%", m.ItemId))
}
if m.EventParam != "" {
Sql += "and Param like ? "
value = append(value, fmt.Sprintf("%%\"change_type\":\"%s\"%%", m.EventParam))
TotalSql += "and Param like ? "
totalValue = append(totalValue, fmt.Sprintf("%%\"change_type\":\"%s\"%%", m.EventParam))
}
value = append(value, (m.CurrentPage-1)*m.PageSize, m.PageSize)
Sql += "ORDER BY Timestamp DESC LIMIT ?, ?"
err = Db.Select(&assets, Sql, value...)
if err != nil {
return nil, fmt.Errorf("failed to get asset list: %v", err)
}
var total int
err = Db.QueryRow(TotalSql, totalValue...).Scan(&total)
if err != nil {
return nil, fmt.Errorf("failed to get asset count: %v", err)
}
resData := []*ResAssetDetail{}
Sum := 0
NSum := 0
PSum := 0
for _, asset := range assets {
param := map[string]interface{}{}
err := json.Unmarshal([]byte(asset.Param), &param)
if err != nil {
continue
}
Sum += util.Int(param["change_num"])
if param["change_type"].(string) == "gain" {
PSum += util.Int(param["change_num"])
} else {
NSum += util.Int(param["change_num"])
}
resData = append(resData, &ResAssetDetail{
Uid: asset.Uid,
ChangeType: param["change_type"].(string),
ChangeNum: util.Int(param["change_num"]),
ChangeAfter: util.Int(param["change_after"]),
ItemId: util.Int(param["item_id"]),
Timestamp: asset.Timestamp,
})
}
return &ResAsset{
Total: total,
Data: resData,
Sum: Sum,
NSum: NSum,
PSum: PSum,
}, nil
}
func (m *Log) Event() (*ResEvent, error) {
AppId, _ := util.ParseUid(m.Uid)
AppConfig, err := util.GetAppConfig(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")
}
StartTime, err := util.ParseTimeToTimestamp(m.StartTime, AppConfig.Tz)
if err != nil {
return nil, err
}
EndTime, err := util.ParseTimeToTimestamp(m.EndTime, AppConfig.Tz)
if err != nil {
return nil, err
}
assets := []*Event{}
Sql := "SELECT * FROM log_event WHERE Uid = ? and `Event` != 'asset_change' and Timestamp >= ? and Timestamp <= ? "
Value := make([]interface{}, 0)
Value = append(Value, m.Uid, StartTime, EndTime)
if m.EventParam != "" {
Sql += "and `Event` = ? "
Value = append(Value, m.EventParam)
}
Sql += "ORDER BY Timestamp DESC LIMIT ?, ?"
Value = append(Value, (m.CurrentPage-1)*m.PageSize, m.PageSize)
err = Db.Select(&assets, Sql, Value...)
// if m.EventParam != "" {
// err = Db.Select(&assets, "SELECT * FROM log_event WHERE Uid = ? and `Event` = ? ORDER BY Timestamp DESC LIMIT ?, ?", m.Uid, m.EventParam, (m.CurrentPage-1)*m.PageSize, m.PageSize)
// } else {
// err = Db.Select(&assets, "SELECT * FROM log_event WHERE Uid = ? and `Event` != 'asset_change' ORDER BY Timestamp DESC LIMIT ?, ?", m.Uid, (m.CurrentPage-1)*m.PageSize, m.PageSize)
// }
if err != nil {
return nil, fmt.Errorf("failed to get event list: %v", err)
}
var total int
totalSql := "SELECT COUNT(*) FROM log_event WHERE Uid = ? and `Event` != 'asset_change' and Timestamp >= ? and Timestamp <= ? "
totalValue := make([]interface{}, 0)
totalValue = append(totalValue, m.Uid, StartTime, EndTime)
if m.EventParam != "" {
totalSql += "and `Event` = ? "
totalValue = append(totalValue, m.EventParam)
}
err = Db.QueryRow(totalSql, totalValue...).Scan(&total)
//err = Db.QueryRow("SELECT COUNT(*) FROM log_event WHERE Uid = ? and `Event` != 'asset_change'", m.Uid).Scan(&total)
if err != nil {
return nil, fmt.Errorf("failed to get event count: %v", err)
}
for _, asset := range assets {
asset.Label = asset.Event
}
return &ResEvent{
Total: total,
Data: assets,
}, nil
}
func (m *Log) Order() (*ResOrder, error) {
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 := []*Order{}
if m.Uid == 0 {
err = Db.Select(&assets, "SELECT * FROM log_order ORDER BY Timestamp DESC LIMIT ?, ?", (m.CurrentPage-1)*m.PageSize, m.PageSize)
} else {
err = Db.Select(&assets, "SELECT * FROM log_order WHERE Uid = ? ORDER BY Timestamp 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
if m.Uid == 0 {
err = Db.QueryRow("SELECT COUNT(*) FROM log_order").Scan(&total)
} else {
err = Db.QueryRow("SELECT COUNT(*) FROM log_order WHERE Uid = ? ", m.Uid).Scan(&total)
}
if err != nil {
return nil, fmt.Errorf("failed to get asset count: %v", err)
}
return &ResOrder{
Total: total,
Data: assets,
}, nil
}