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
|
||
}
|