LicenseManger/internal/service/dashboard.go

95 lines
3.2 KiB
Go
Raw Normal View History

2024-11-16 15:59:15 +00:00
package service
import (
"licserver/internal/model"
"time"
"gorm.io/gorm"
)
type DashboardService struct {
db *gorm.DB
}
func NewDashboardService(db *gorm.DB) *DashboardService {
return &DashboardService{db: db}
}
type DashboardStats struct {
TotalDevices int64 `json:"total_devices"` // 设备总数
TotalLicenses int64 `json:"total_licenses"` // 授权码总数
TodayNew int64 `json:"today_new"` // 今日新增
OnlineDevices int64 `json:"online_devices"` // 在线设备
ActiveDevices int64 `json:"active_devices"` // 激活设备
ExpiredDevices int64 `json:"expired_devices"` // 过期设备
DeviceTypes []DeviceTypeStats `json:"device_types"` // 设备类型分布
TrendData []DailyRegistration `json:"trend_data"` // 注册趋势
LicenseStats LicenseStatistics `json:"license_stats"` // 授权码统计
}
type DeviceTypeStats struct {
Type string `json:"type"`
Count int64 `json:"count"`
}
type DailyRegistration struct {
Date string `json:"date"`
Count int64 `json:"count"`
}
type LicenseStatistics struct {
Unused int64 `json:"unused"` // 未使用
Used int64 `json:"used"` // 已使用
Expired int64 `json:"expired"` // 已过期
Revoked int64 `json:"revoked"` // 已撤销
}
func (s *DashboardService) GetDashboardStats() (*DashboardStats, error) {
stats := &DashboardStats{}
// 获取设备总数
s.db.Model(&model.Device{}).Count(&stats.TotalDevices)
// 获取授权码总数
s.db.Model(&model.LicenseCode{}).Count(&stats.TotalLicenses)
// 获取今日新增设备数
today := time.Now().Format("2006-01-02")
s.db.Model(&model.Device{}).Where("DATE(register_time) = ?", today).Count(&stats.TodayNew)
// 获取在线设备数最近30分钟内有活动的设备
thirtyMinutesAgo := time.Now().Add(-30 * time.Minute)
s.db.Model(&model.Device{}).Where("last_active_at > ?", thirtyMinutesAgo).Count(&stats.OnlineDevices)
// 获取激活和过期设备数
s.db.Model(&model.Device{}).Where("status = ?", "active").Count(&stats.ActiveDevices)
s.db.Model(&model.Device{}).Where("status = ?", "expired").Count(&stats.ExpiredDevices)
// 获取设备类型分布
var deviceTypes []DeviceTypeStats
s.db.Model(&model.Device{}).
Select("device_type as type, count(*) as count").
Group("device_type").
Scan(&deviceTypes)
stats.DeviceTypes = deviceTypes
// 获取最近7天的注册趋势
var trendData []DailyRegistration
sevenDaysAgo := time.Now().AddDate(0, 0, -7)
s.db.Model(&model.Device{}).
Select("DATE(register_time) as date, count(*) as count").
Where("register_time >= ?", sevenDaysAgo).
Group("DATE(register_time)").
Order("date ASC").
Scan(&trendData)
stats.TrendData = trendData
// 获取授权码统计
s.db.Model(&model.LicenseCode{}).Where("status = ?", "unused").Count(&stats.LicenseStats.Unused)
s.db.Model(&model.LicenseCode{}).Where("status = ?", "used").Count(&stats.LicenseStats.Used)
s.db.Model(&model.LicenseCode{}).Where("status = ?", "expired").Count(&stats.LicenseStats.Expired)
s.db.Model(&model.LicenseCode{}).Where("status = ?", "revoked").Count(&stats.LicenseStats.Revoked)
return stats, nil
}