254 lines
7.6 KiB
Go
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), ¶m)
|
|
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
|
|
}
|