95 lines
3.2 KiB
Go
95 lines
3.2 KiB
Go
|
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
|
|||
|
}
|