new
This commit is contained in:
412
internal/application/statistics/commands_queries.go
Normal file
412
internal/application/statistics/commands_queries.go
Normal file
@@ -0,0 +1,412 @@
|
||||
package statistics
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
)
|
||||
|
||||
// ================ 命令对象 ================
|
||||
|
||||
// CreateMetricCommand 创建指标命令
|
||||
type CreateMetricCommand struct {
|
||||
MetricType string `json:"metric_type" validate:"required" comment:"指标类型"`
|
||||
MetricName string `json:"metric_name" validate:"required" comment:"指标名称"`
|
||||
Dimension string `json:"dimension" comment:"统计维度"`
|
||||
Value float64 `json:"value" validate:"min=0" comment:"指标值"`
|
||||
Metadata string `json:"metadata" comment:"额外维度信息"`
|
||||
Date time.Time `json:"date" validate:"required" comment:"统计日期"`
|
||||
}
|
||||
|
||||
// UpdateMetricCommand 更新指标命令
|
||||
type UpdateMetricCommand struct {
|
||||
ID string `json:"id" validate:"required" comment:"指标ID"`
|
||||
Value float64 `json:"value" validate:"min=0" comment:"新指标值"`
|
||||
}
|
||||
|
||||
// DeleteMetricCommand 删除指标命令
|
||||
type DeleteMetricCommand struct {
|
||||
ID string `json:"id" validate:"required" comment:"指标ID"`
|
||||
}
|
||||
|
||||
// GenerateReportCommand 生成报告命令
|
||||
type GenerateReportCommand struct {
|
||||
ReportType string `json:"report_type" validate:"required" comment:"报告类型"`
|
||||
Title string `json:"title" validate:"required" comment:"报告标题"`
|
||||
Period string `json:"period" validate:"required" comment:"统计周期"`
|
||||
UserRole string `json:"user_role" validate:"required" comment:"用户角色"`
|
||||
StartDate time.Time `json:"start_date" comment:"开始日期"`
|
||||
EndDate time.Time `json:"end_date" comment:"结束日期"`
|
||||
Filters map[string]interface{} `json:"filters" comment:"过滤条件"`
|
||||
GeneratedBy string `json:"generated_by" validate:"required" comment:"生成者ID"`
|
||||
}
|
||||
|
||||
// CreateDashboardCommand 创建仪表板命令
|
||||
type CreateDashboardCommand struct {
|
||||
Name string `json:"name" validate:"required" comment:"仪表板名称"`
|
||||
Description string `json:"description" comment:"仪表板描述"`
|
||||
UserRole string `json:"user_role" validate:"required" comment:"用户角色"`
|
||||
Layout string `json:"layout" comment:"布局配置"`
|
||||
Widgets string `json:"widgets" comment:"组件配置"`
|
||||
Settings string `json:"settings" comment:"设置配置"`
|
||||
RefreshInterval int `json:"refresh_interval" validate:"min=30" comment:"刷新间隔(秒)"`
|
||||
AccessLevel string `json:"access_level" comment:"访问级别"`
|
||||
CreatedBy string `json:"created_by" validate:"required" comment:"创建者ID"`
|
||||
}
|
||||
|
||||
// UpdateDashboardCommand 更新仪表板命令
|
||||
type UpdateDashboardCommand struct {
|
||||
ID string `json:"id" validate:"required" comment:"仪表板ID"`
|
||||
Name string `json:"name" comment:"仪表板名称"`
|
||||
Description string `json:"description" comment:"仪表板描述"`
|
||||
Layout string `json:"layout" comment:"布局配置"`
|
||||
Widgets string `json:"widgets" comment:"组件配置"`
|
||||
Settings string `json:"settings" comment:"设置配置"`
|
||||
RefreshInterval int `json:"refresh_interval" validate:"min=30" comment:"刷新间隔(秒)"`
|
||||
AccessLevel string `json:"access_level" comment:"访问级别"`
|
||||
UpdatedBy string `json:"updated_by" validate:"required" comment:"更新者ID"`
|
||||
}
|
||||
|
||||
// SetDefaultDashboardCommand 设置默认仪表板命令
|
||||
type SetDefaultDashboardCommand struct {
|
||||
DashboardID string `json:"dashboard_id" validate:"required" comment:"仪表板ID"`
|
||||
UserRole string `json:"user_role" validate:"required" comment:"用户角色"`
|
||||
UpdatedBy string `json:"updated_by" validate:"required" comment:"更新者ID"`
|
||||
}
|
||||
|
||||
// ActivateDashboardCommand 激活仪表板命令
|
||||
type ActivateDashboardCommand struct {
|
||||
DashboardID string `json:"dashboard_id" validate:"required" comment:"仪表板ID"`
|
||||
ActivatedBy string `json:"activated_by" validate:"required" comment:"激活者ID"`
|
||||
}
|
||||
|
||||
// DeactivateDashboardCommand 停用仪表板命令
|
||||
type DeactivateDashboardCommand struct {
|
||||
DashboardID string `json:"dashboard_id" validate:"required" comment:"仪表板ID"`
|
||||
DeactivatedBy string `json:"deactivated_by" validate:"required" comment:"停用者ID"`
|
||||
}
|
||||
|
||||
// DeleteDashboardCommand 删除仪表板命令
|
||||
type DeleteDashboardCommand struct {
|
||||
DashboardID string `json:"dashboard_id" validate:"required" comment:"仪表板ID"`
|
||||
DeletedBy string `json:"deleted_by" validate:"required" comment:"删除者ID"`
|
||||
}
|
||||
|
||||
// ExportDataCommand 导出数据命令
|
||||
type ExportDataCommand struct {
|
||||
Format string `json:"format" validate:"required" comment:"导出格式"`
|
||||
MetricType string `json:"metric_type" validate:"required" comment:"指标类型"`
|
||||
StartDate time.Time `json:"start_date" validate:"required" comment:"开始日期"`
|
||||
EndDate time.Time `json:"end_date" validate:"required" comment:"结束日期"`
|
||||
Dimension string `json:"dimension" comment:"统计维度"`
|
||||
GroupBy string `json:"group_by" comment:"分组维度"`
|
||||
Filters map[string]interface{} `json:"filters" comment:"过滤条件"`
|
||||
Columns []string `json:"columns" comment:"导出列"`
|
||||
IncludeCharts bool `json:"include_charts" comment:"是否包含图表"`
|
||||
ExportedBy string `json:"exported_by" validate:"required" comment:"导出者ID"`
|
||||
}
|
||||
|
||||
// TriggerAggregationCommand 触发数据聚合命令
|
||||
type TriggerAggregationCommand struct {
|
||||
MetricType string `json:"metric_type" validate:"required" comment:"指标类型"`
|
||||
Period string `json:"period" validate:"required" comment:"聚合周期"`
|
||||
StartDate time.Time `json:"start_date" comment:"开始日期"`
|
||||
EndDate time.Time `json:"end_date" comment:"结束日期"`
|
||||
Force bool `json:"force" comment:"是否强制重新聚合"`
|
||||
TriggeredBy string `json:"triggered_by" validate:"required" comment:"触发者ID"`
|
||||
}
|
||||
|
||||
// Validate 验证触发聚合命令
|
||||
func (c *TriggerAggregationCommand) Validate() error {
|
||||
if c.MetricType == "" {
|
||||
return fmt.Errorf("指标类型不能为空")
|
||||
}
|
||||
if c.Period == "" {
|
||||
return fmt.Errorf("聚合周期不能为空")
|
||||
}
|
||||
if c.TriggeredBy == "" {
|
||||
return fmt.Errorf("触发者ID不能为空")
|
||||
}
|
||||
// 验证周期类型
|
||||
validPeriods := []string{"hourly", "daily", "weekly", "monthly"}
|
||||
isValidPeriod := false
|
||||
for _, period := range validPeriods {
|
||||
if c.Period == period {
|
||||
isValidPeriod = true
|
||||
break
|
||||
}
|
||||
}
|
||||
if !isValidPeriod {
|
||||
return fmt.Errorf("不支持的聚合周期: %s", c.Period)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// ================ 查询对象 ================
|
||||
|
||||
// GetMetricsQuery 获取指标查询
|
||||
type GetMetricsQuery struct {
|
||||
MetricType string `json:"metric_type" form:"metric_type" comment:"指标类型"`
|
||||
MetricName string `json:"metric_name" form:"metric_name" comment:"指标名称"`
|
||||
Dimension string `json:"dimension" form:"dimension" comment:"统计维度"`
|
||||
StartDate time.Time `json:"start_date" form:"start_date" comment:"开始日期"`
|
||||
EndDate time.Time `json:"end_date" form:"end_date" comment:"结束日期"`
|
||||
Limit int `json:"limit" form:"limit" comment:"限制数量"`
|
||||
Offset int `json:"offset" form:"offset" comment:"偏移量"`
|
||||
SortBy string `json:"sort_by" form:"sort_by" comment:"排序字段"`
|
||||
SortOrder string `json:"sort_order" form:"sort_order" comment:"排序顺序"`
|
||||
}
|
||||
|
||||
// GetRealtimeMetricsQuery 获取实时指标查询
|
||||
type GetRealtimeMetricsQuery struct {
|
||||
MetricType string `json:"metric_type" form:"metric_type" validate:"required" comment:"指标类型"`
|
||||
TimeRange string `json:"time_range" form:"time_range" comment:"时间范围"`
|
||||
Dimension string `json:"dimension" form:"dimension" comment:"统计维度"`
|
||||
}
|
||||
|
||||
// GetHistoricalMetricsQuery 获取历史指标查询
|
||||
type GetHistoricalMetricsQuery struct {
|
||||
MetricType string `json:"metric_type" form:"metric_type" validate:"required" comment:"指标类型"`
|
||||
MetricName string `json:"metric_name" form:"metric_name" comment:"指标名称"`
|
||||
Dimension string `json:"dimension" form:"dimension" comment:"统计维度"`
|
||||
StartDate time.Time `json:"start_date" form:"start_date" validate:"required" comment:"开始日期"`
|
||||
EndDate time.Time `json:"end_date" form:"end_date" validate:"required" comment:"结束日期"`
|
||||
Period string `json:"period" form:"period" comment:"统计周期"`
|
||||
Limit int `json:"limit" form:"limit" comment:"限制数量"`
|
||||
Offset int `json:"offset" form:"offset" comment:"偏移量"`
|
||||
AggregateBy string `json:"aggregate_by" form:"aggregate_by" comment:"聚合维度"`
|
||||
GroupBy string `json:"group_by" form:"group_by" comment:"分组维度"`
|
||||
}
|
||||
|
||||
// GetDashboardDataQuery 获取仪表板数据查询
|
||||
type GetDashboardDataQuery struct {
|
||||
UserRole string `json:"user_role" form:"user_role" validate:"required" comment:"用户角色"`
|
||||
Period string `json:"period" form:"period" comment:"统计周期"`
|
||||
StartDate time.Time `json:"start_date" form:"start_date" comment:"开始日期"`
|
||||
EndDate time.Time `json:"end_date" form:"end_date" comment:"结束日期"`
|
||||
MetricTypes []string `json:"metric_types" form:"metric_types" comment:"指标类型列表"`
|
||||
Dimensions []string `json:"dimensions" form:"dimensions" comment:"统计维度列表"`
|
||||
}
|
||||
|
||||
// GetReportsQuery 获取报告查询
|
||||
type GetReportsQuery struct {
|
||||
ReportType string `json:"report_type" form:"report_type" comment:"报告类型"`
|
||||
UserRole string `json:"user_role" form:"user_role" comment:"用户角色"`
|
||||
Status string `json:"status" form:"status" comment:"报告状态"`
|
||||
Period string `json:"period" form:"period" comment:"统计周期"`
|
||||
StartDate time.Time `json:"start_date" form:"start_date" comment:"开始日期"`
|
||||
EndDate time.Time `json:"end_date" form:"end_date" comment:"结束日期"`
|
||||
Limit int `json:"limit" form:"limit" comment:"限制数量"`
|
||||
Offset int `json:"offset" form:"offset" comment:"偏移量"`
|
||||
SortBy string `json:"sort_by" form:"sort_by" comment:"排序字段"`
|
||||
SortOrder string `json:"sort_order" form:"sort_order" comment:"排序顺序"`
|
||||
GeneratedBy string `json:"generated_by" form:"generated_by" comment:"生成者ID"`
|
||||
}
|
||||
|
||||
// GetDashboardsQuery 获取仪表板查询
|
||||
type GetDashboardsQuery struct {
|
||||
UserRole string `json:"user_role" form:"user_role" comment:"用户角色"`
|
||||
IsDefault *bool `json:"is_default" form:"is_default" comment:"是否默认"`
|
||||
IsActive *bool `json:"is_active" form:"is_active" comment:"是否激活"`
|
||||
AccessLevel string `json:"access_level" form:"access_level" comment:"访问级别"`
|
||||
CreatedBy string `json:"created_by" form:"created_by" comment:"创建者ID"`
|
||||
Name string `json:"name" form:"name" comment:"仪表板名称"`
|
||||
Limit int `json:"limit" form:"limit" comment:"限制数量"`
|
||||
Offset int `json:"offset" form:"offset" comment:"偏移量"`
|
||||
SortBy string `json:"sort_by" form:"sort_by" comment:"排序字段"`
|
||||
SortOrder string `json:"sort_order" form:"sort_order" comment:"排序顺序"`
|
||||
}
|
||||
|
||||
// GetReportQuery 获取单个报告查询
|
||||
type GetReportQuery struct {
|
||||
ReportID string `json:"report_id" form:"report_id" validate:"required" comment:"报告ID"`
|
||||
}
|
||||
|
||||
// GetDashboardQuery 获取单个仪表板查询
|
||||
type GetDashboardQuery struct {
|
||||
DashboardID string `json:"dashboard_id" form:"dashboard_id" validate:"required" comment:"仪表板ID"`
|
||||
}
|
||||
|
||||
// GetMetricQuery 获取单个指标查询
|
||||
type GetMetricQuery struct {
|
||||
MetricID string `json:"metric_id" form:"metric_id" validate:"required" comment:"指标ID"`
|
||||
}
|
||||
|
||||
// CalculateGrowthRateQuery 计算增长率查询
|
||||
type CalculateGrowthRateQuery struct {
|
||||
MetricType string `json:"metric_type" form:"metric_type" validate:"required" comment:"指标类型"`
|
||||
MetricName string `json:"metric_name" form:"metric_name" validate:"required" comment:"指标名称"`
|
||||
CurrentPeriod time.Time `json:"current_period" form:"current_period" validate:"required" comment:"当前周期"`
|
||||
PreviousPeriod time.Time `json:"previous_period" form:"previous_period" validate:"required" comment:"上一周期"`
|
||||
}
|
||||
|
||||
// CalculateTrendQuery 计算趋势查询
|
||||
type CalculateTrendQuery struct {
|
||||
MetricType string `json:"metric_type" form:"metric_type" validate:"required" comment:"指标类型"`
|
||||
MetricName string `json:"metric_name" form:"metric_name" validate:"required" comment:"指标名称"`
|
||||
StartDate time.Time `json:"start_date" form:"start_date" validate:"required" comment:"开始日期"`
|
||||
EndDate time.Time `json:"end_date" form:"end_date" validate:"required" comment:"结束日期"`
|
||||
}
|
||||
|
||||
// CalculateCorrelationQuery 计算相关性查询
|
||||
type CalculateCorrelationQuery struct {
|
||||
MetricType1 string `json:"metric_type1" form:"metric_type1" validate:"required" comment:"指标类型1"`
|
||||
MetricName1 string `json:"metric_name1" form:"metric_name1" validate:"required" comment:"指标名称1"`
|
||||
MetricType2 string `json:"metric_type2" form:"metric_type2" validate:"required" comment:"指标类型2"`
|
||||
MetricName2 string `json:"metric_name2" form:"metric_name2" validate:"required" comment:"指标名称2"`
|
||||
StartDate time.Time `json:"start_date" form:"start_date" validate:"required" comment:"开始日期"`
|
||||
EndDate time.Time `json:"end_date" form:"end_date" validate:"required" comment:"结束日期"`
|
||||
}
|
||||
|
||||
// CalculateMovingAverageQuery 计算移动平均查询
|
||||
type CalculateMovingAverageQuery struct {
|
||||
MetricType string `json:"metric_type" form:"metric_type" validate:"required" comment:"指标类型"`
|
||||
MetricName string `json:"metric_name" form:"metric_name" validate:"required" comment:"指标名称"`
|
||||
StartDate time.Time `json:"start_date" form:"start_date" validate:"required" comment:"开始日期"`
|
||||
EndDate time.Time `json:"end_date" form:"end_date" validate:"required" comment:"结束日期"`
|
||||
WindowSize int `json:"window_size" form:"window_size" validate:"min=1" comment:"窗口大小"`
|
||||
}
|
||||
|
||||
// CalculateSeasonalityQuery 计算季节性查询
|
||||
type CalculateSeasonalityQuery struct {
|
||||
MetricType string `json:"metric_type" form:"metric_type" validate:"required" comment:"指标类型"`
|
||||
MetricName string `json:"metric_name" form:"metric_name" validate:"required" comment:"指标名称"`
|
||||
StartDate time.Time `json:"start_date" form:"start_date" validate:"required" comment:"开始日期"`
|
||||
EndDate time.Time `json:"end_date" form:"end_date" validate:"required" comment:"结束日期"`
|
||||
}
|
||||
|
||||
// ================ 响应对象 ================
|
||||
|
||||
// CommandResponse 命令响应
|
||||
type CommandResponse struct {
|
||||
Success bool `json:"success" comment:"是否成功"`
|
||||
Message string `json:"message" comment:"响应消息"`
|
||||
Data interface{} `json:"data" comment:"响应数据"`
|
||||
Error string `json:"error,omitempty" comment:"错误信息"`
|
||||
}
|
||||
|
||||
// QueryResponse 查询响应
|
||||
type QueryResponse struct {
|
||||
Success bool `json:"success" comment:"是否成功"`
|
||||
Message string `json:"message" comment:"响应消息"`
|
||||
Data interface{} `json:"data" comment:"响应数据"`
|
||||
Meta map[string]interface{} `json:"meta" comment:"元数据"`
|
||||
Error string `json:"error,omitempty" comment:"错误信息"`
|
||||
}
|
||||
|
||||
// ListResponse 列表响应
|
||||
type ListResponse struct {
|
||||
Success bool `json:"success" comment:"是否成功"`
|
||||
Message string `json:"message" comment:"响应消息"`
|
||||
Data ListDataDTO `json:"data" comment:"数据列表"`
|
||||
Meta map[string]interface{} `json:"meta" comment:"元数据"`
|
||||
Error string `json:"error,omitempty" comment:"错误信息"`
|
||||
}
|
||||
|
||||
// ListDataDTO 列表数据DTO
|
||||
type ListDataDTO struct {
|
||||
Total int64 `json:"total" comment:"总数"`
|
||||
Page int `json:"page" comment:"页码"`
|
||||
Size int `json:"size" comment:"每页数量"`
|
||||
Items []interface{} `json:"items" comment:"数据列表"`
|
||||
}
|
||||
|
||||
// ================ 验证方法 ================
|
||||
|
||||
// Validate 验证创建指标命令
|
||||
func (c *CreateMetricCommand) Validate() error {
|
||||
if c.MetricType == "" {
|
||||
return fmt.Errorf("指标类型不能为空")
|
||||
}
|
||||
if c.MetricName == "" {
|
||||
return fmt.Errorf("指标名称不能为空")
|
||||
}
|
||||
if c.Value < 0 {
|
||||
return fmt.Errorf("指标值不能为负数")
|
||||
}
|
||||
if c.Date.IsZero() {
|
||||
return fmt.Errorf("统计日期不能为空")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Validate 验证更新指标命令
|
||||
func (c *UpdateMetricCommand) Validate() error {
|
||||
if c.ID == "" {
|
||||
return fmt.Errorf("指标ID不能为空")
|
||||
}
|
||||
if c.Value < 0 {
|
||||
return fmt.Errorf("指标值不能为负数")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Validate 验证生成报告命令
|
||||
func (c *GenerateReportCommand) Validate() error {
|
||||
if c.ReportType == "" {
|
||||
return fmt.Errorf("报告类型不能为空")
|
||||
}
|
||||
if c.Title == "" {
|
||||
return fmt.Errorf("报告标题不能为空")
|
||||
}
|
||||
if c.Period == "" {
|
||||
return fmt.Errorf("统计周期不能为空")
|
||||
}
|
||||
if c.UserRole == "" {
|
||||
return fmt.Errorf("用户角色不能为空")
|
||||
}
|
||||
if c.GeneratedBy == "" {
|
||||
return fmt.Errorf("生成者ID不能为空")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Validate 验证创建仪表板命令
|
||||
func (c *CreateDashboardCommand) Validate() error {
|
||||
if c.Name == "" {
|
||||
return fmt.Errorf("仪表板名称不能为空")
|
||||
}
|
||||
if c.UserRole == "" {
|
||||
return fmt.Errorf("用户角色不能为空")
|
||||
}
|
||||
if c.CreatedBy == "" {
|
||||
return fmt.Errorf("创建者ID不能为空")
|
||||
}
|
||||
if c.RefreshInterval < 30 {
|
||||
return fmt.Errorf("刷新间隔不能少于30秒")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Validate 验证更新仪表板命令
|
||||
func (c *UpdateDashboardCommand) Validate() error {
|
||||
if c.ID == "" {
|
||||
return fmt.Errorf("仪表板ID不能为空")
|
||||
}
|
||||
if c.UpdatedBy == "" {
|
||||
return fmt.Errorf("更新者ID不能为空")
|
||||
}
|
||||
if c.RefreshInterval < 30 {
|
||||
return fmt.Errorf("刷新间隔不能少于30秒")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Validate 验证导出数据命令
|
||||
func (c *ExportDataCommand) Validate() error {
|
||||
if c.Format == "" {
|
||||
return fmt.Errorf("导出格式不能为空")
|
||||
}
|
||||
if c.MetricType == "" {
|
||||
return fmt.Errorf("指标类型不能为空")
|
||||
}
|
||||
if c.StartDate.IsZero() || c.EndDate.IsZero() {
|
||||
return fmt.Errorf("开始日期和结束日期不能为空")
|
||||
}
|
||||
if c.StartDate.After(c.EndDate) {
|
||||
return fmt.Errorf("开始日期不能晚于结束日期")
|
||||
}
|
||||
if c.ExportedBy == "" {
|
||||
return fmt.Errorf("导出者ID不能为空")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user