admin_backend/util/statistics.go
2025-02-14 14:51:19 +08:00

106 lines
3.0 KiB
Go

package util
import (
"fmt"
"log"
"time"
)
var loc *time.Location // 时区
func init() {
loc, _ = time.LoadLocation("Europe/London")
}
func ScheduleDailyTask() {
Statistics()
for {
now := time.Now().In(loc)
next := now.AddDate(0, 0, 1).Truncate(24 * time.Hour)
duration := next.Sub(now) + 3600*time.Second // 每天凌晨1点执行
time.Sleep(duration)
// 执行统计函数
Statistics()
}
}
func Statistics() {
log.Println("start statistics")
for i := 0; i <= 30; i++ {
remain(-i)
}
log.Println("end statistics")
}
func remain(Day int) {
AppConfig, err := GetAppConfig(3)
now := ZeroTimestampByTz(AppConfig.Tz) + int64(Day)*86400
Date := time.Unix(now, 0).In(loc).Format("2006-01-02")
SecondRemain, _ := DayRemain(now, 1) // 计算次留
ThirdRemain, _ := DayRemain(now, 2) // 计算三留
SeventhRemain, _ := DayRemain(now, 6) // 计算七留
FourteenthRemain, _ := DayRemain(now, 13) // 计算14留
ThirtiethRemain, _ := DayRemain(now, 29) // 计算30留
Register, _ := DayRemain(now, 0) // 计算注册
if err != nil {
return
}
Db := MPool.GetTopicDB(AppConfig.Topic)
if Db == nil {
return
}
defer Db.Close()
_, err = Db.Exec("INSERT INTO `remain` (`Date`, `SecondRemain`, `ThirdRemain`, `SeventhRemain`, `FourteenthRemain`, `ThirtiethRemain`, `Register`) VALUES (?, ?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE SecondRemain = ?, ThirdRemain = ?, SeventhRemain = ?, FourteenthRemain = ?, ThirtiethRemain = ?, Register = ?", Date, SecondRemain, ThirdRemain, SeventhRemain, FourteenthRemain, ThirtiethRemain, Register, SecondRemain, ThirdRemain, SeventhRemain, FourteenthRemain, ThirtiethRemain, Register)
if err != nil {
log.Printf("failed to insert data: %v", err)
}
}
func DayRemain(now int64, Day int) (int, error) {
AppConfig, err := GetAppConfig(3)
if err != nil {
return 0, err
}
LogDb := MPool.GetTopicDB(AppConfig.Topic)
if LogDb == nil {
return 0, fmt.Errorf("failed to get mysql database")
}
Timestamp := now + int64(Day)*86400
// log.Print("secondRemain:", Timestamp)
if err != nil {
log.Fatalf("failed to get db: %v", err)
}
defer LogDb.Close()
type data struct {
Uid int `db:"Uid"`
}
dataList := []data{}
err = LogDb.Select(&dataList, "SELECT Uid FROM log_login WHERE Event = 'register' and Timestamp >= ? and Timestamp <= ?", now, now+86399)
if err != nil {
log.Fatalf("failed to select data: %v", err)
}
if Day == 0 {
return len(dataList), nil
}
if len(dataList) == 0 {
return 0, nil
}
UidStr := ""
for _, v := range dataList {
UidStr += fmt.Sprintf("%d,", v.Uid)
}
if len(UidStr) > 0 {
UidStr = UidStr[:len(UidStr)-1]
}
DataList2 := []data{}
Sql := fmt.Sprintf("SELECT `Uid` FROM `log_login` WHERE `Event` = 'Login_log' and `Uid` in ( %s ) and Timestamp >= ? and Timestamp <= ? group by `Uid`", UidStr)
err = LogDb.Select(&DataList2, Sql, Timestamp, Timestamp+86399)
if err != nil {
log.Fatalf("failed to select data: %v", err)
}
if len(UidStr) < len(DataList2) {
log.Printf("UidStr:%d, DataList2:%d", len(UidStr), len(DataList2))
}
return len(DataList2), nil
}