feat: 实现 IoT 卡轮询系统(支持千万级卡规模)
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 6m35s
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 6m35s
实现功能: - 实名状态检查轮询(可配置间隔) - 卡流量检查轮询(支持跨月流量追踪) - 套餐检查与超额自动停机 - 分布式并发控制(Redis 信号量) - 手动触发轮询(单卡/批量/条件筛选) - 数据清理配置与执行 - 告警规则与历史记录 - 实时监控统计(队列/性能/并发) 性能优化: - Redis 缓存卡信息,减少 DB 查询 - Pipeline 批量写入 Redis - 异步流量记录写入 - 渐进式初始化(10万卡/批) 压测工具(scripts/benchmark/): - Mock Gateway 模拟上游服务 - 测试卡生成器 - 配置初始化脚本 - 实时监控脚本 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -38,9 +38,15 @@ type StandaloneIotCardResponse struct {
|
||||
ActivatedAt *time.Time `json:"activated_at,omitempty" description:"激活时间"`
|
||||
ActivationStatus int `json:"activation_status" description:"激活状态 (0:未激活, 1:已激活)"`
|
||||
RealNameStatus int `json:"real_name_status" description:"实名状态 (0:未实名, 1:已实名)"`
|
||||
NetworkStatus int `json:"network_status" description:"网络状态 (0:停机, 1:开机)"`
|
||||
DataUsageMB int64 `json:"data_usage_mb" description:"累计流量使用(MB)"`
|
||||
SeriesID *uint `json:"series_id,omitempty" description:"套餐系列ID"`
|
||||
NetworkStatus int `json:"network_status" description:"网络状态 (0:停机, 1:开机)"`
|
||||
DataUsageMB int64 `json:"data_usage_mb" description:"累计流量使用(MB)"`
|
||||
CurrentMonthUsageMB float64 `json:"current_month_usage_mb" description:"本月已用流量(MB)"`
|
||||
CurrentMonthStartDate *time.Time `json:"current_month_start_date,omitempty" description:"本月开始日期"`
|
||||
LastMonthTotalMB float64 `json:"last_month_total_mb" description:"上月流量总量(MB)"`
|
||||
LastDataCheckAt *time.Time `json:"last_data_check_at,omitempty" description:"最后流量检查时间"`
|
||||
LastRealNameCheckAt *time.Time `json:"last_real_name_check_at,omitempty" description:"最后实名检查时间"`
|
||||
EnablePolling bool `json:"enable_polling" description:"是否参与轮询"`
|
||||
SeriesID *uint `json:"series_id,omitempty" description:"套餐系列ID"`
|
||||
SeriesName string `json:"series_name,omitempty" description:"套餐系列名称"`
|
||||
FirstCommissionPaid bool `json:"first_commission_paid" description:"一次性佣金是否已发放"`
|
||||
AccumulatedRecharge int64 `json:"accumulated_recharge" description:"累计充值金额(分)"`
|
||||
|
||||
84
internal/model/dto/polling_alert_dto.go
Normal file
84
internal/model/dto/polling_alert_dto.go
Normal file
@@ -0,0 +1,84 @@
|
||||
package dto
|
||||
|
||||
import "time"
|
||||
|
||||
// CreatePollingAlertRuleReq 创建告警规则请求
|
||||
type CreatePollingAlertRuleReq struct {
|
||||
RuleName string `json:"rule_name" validate:"required,max=100" description:"规则名称"`
|
||||
TaskType string `json:"task_type" validate:"required" description:"任务类型 (polling:realname/polling:carddata/polling:package)"`
|
||||
MetricType string `json:"metric_type" validate:"required" description:"指标类型 (queue_size/success_rate/avg_duration/concurrency)"`
|
||||
Operator string `json:"operator" validate:"omitempty,oneof=> >= < <= ==" description:"比较运算符,默认 >"`
|
||||
Threshold float64 `json:"threshold" validate:"required" description:"阈值"`
|
||||
AlertLevel string `json:"alert_level" validate:"required,oneof=warning critical" description:"告警级别 (warning/critical)"`
|
||||
CooldownMinutes int `json:"cooldown_minutes" validate:"omitempty,min=0,max=1440" description:"冷却时间(分钟),默认5分钟"`
|
||||
NotifyChannels string `json:"notify_channels" validate:"omitempty" description:"通知渠道(JSON格式)"`
|
||||
}
|
||||
|
||||
// UpdatePollingAlertRuleReq 更新告警规则请求(Body 部分)
|
||||
type UpdatePollingAlertRuleReq struct {
|
||||
RuleName *string `json:"rule_name" validate:"omitempty,max=100" description:"规则名称"`
|
||||
Threshold *float64 `json:"threshold" validate:"omitempty" description:"阈值"`
|
||||
AlertLevel *string `json:"alert_level" validate:"omitempty,oneof=warning critical" description:"告警级别"`
|
||||
Status *int `json:"status" validate:"omitempty,oneof=0 1" description:"状态 (0:禁用, 1:启用)"`
|
||||
CooldownMinutes *int `json:"cooldown_minutes" validate:"omitempty,min=0,max=1440" description:"冷却时间(分钟)"`
|
||||
NotifyChannels *string `json:"notify_channels" validate:"omitempty" description:"通知渠道"`
|
||||
}
|
||||
|
||||
// UpdatePollingAlertRuleParams 更新告警规则参数(包含路径参数和 Body)
|
||||
type UpdatePollingAlertRuleParams struct {
|
||||
IDReq
|
||||
UpdatePollingAlertRuleReq
|
||||
}
|
||||
|
||||
// PollingAlertRuleResp 告警规则响应
|
||||
type PollingAlertRuleResp struct {
|
||||
ID uint `json:"id" description:"规则ID"`
|
||||
RuleName string `json:"rule_name" description:"规则名称"`
|
||||
TaskType string `json:"task_type" description:"任务类型"`
|
||||
TaskTypeName string `json:"task_type_name" description:"任务类型名称"`
|
||||
MetricType string `json:"metric_type" description:"指标类型"`
|
||||
MetricTypeName string `json:"metric_type_name" description:"指标类型名称"`
|
||||
Operator string `json:"operator" description:"比较运算符"`
|
||||
Threshold float64 `json:"threshold" description:"阈值"`
|
||||
AlertLevel string `json:"alert_level" description:"告警级别"`
|
||||
Status int `json:"status" description:"状态 (0:禁用, 1:启用)"`
|
||||
CooldownMinutes int `json:"cooldown_minutes" description:"冷却时间(分钟)"`
|
||||
NotifyChannels string `json:"notify_channels" description:"通知渠道"`
|
||||
CreatedAt time.Time `json:"created_at" description:"创建时间"`
|
||||
UpdatedAt time.Time `json:"updated_at" description:"更新时间"`
|
||||
}
|
||||
|
||||
// PollingAlertRuleListResp 告警规则列表响应
|
||||
type PollingAlertRuleListResp struct {
|
||||
Items []*PollingAlertRuleResp `json:"items" description:"告警规则列表"`
|
||||
}
|
||||
|
||||
// PollingAlertHistoryResp 告警历史响应
|
||||
type PollingAlertHistoryResp struct {
|
||||
ID uint `json:"id" description:"历史ID"`
|
||||
RuleID uint `json:"rule_id" description:"规则ID"`
|
||||
RuleName string `json:"rule_name" description:"规则名称"`
|
||||
TaskType string `json:"task_type" description:"任务类型"`
|
||||
MetricType string `json:"metric_type" description:"指标类型"`
|
||||
AlertLevel string `json:"alert_level" description:"告警级别"`
|
||||
Threshold float64 `json:"threshold" description:"阈值"`
|
||||
CurrentValue float64 `json:"current_value" description:"触发时的值"`
|
||||
Message string `json:"message" description:"告警消息"`
|
||||
CreatedAt time.Time `json:"created_at" description:"触发时间"`
|
||||
}
|
||||
|
||||
// PollingAlertHistoryListResp 告警历史列表响应
|
||||
type PollingAlertHistoryListResp struct {
|
||||
Items []*PollingAlertHistoryResp `json:"items" description:"告警历史列表"`
|
||||
Total int64 `json:"total" description:"总数"`
|
||||
Page int `json:"page" description:"当前页"`
|
||||
PageSize int `json:"page_size" description:"每页数量"`
|
||||
TotalPages int `json:"total_pages" description:"总页数"`
|
||||
}
|
||||
|
||||
// ListPollingAlertHistoryReq 查询告警历史请求
|
||||
type ListPollingAlertHistoryReq struct {
|
||||
RuleID *uint `json:"rule_id" query:"rule_id" description:"规则ID"`
|
||||
Page int `json:"page" query:"page" validate:"omitempty,min=1" description:"页码"`
|
||||
PageSize int `json:"page_size" query:"page_size" validate:"omitempty,min=1,max=100" description:"每页数量"`
|
||||
}
|
||||
103
internal/model/dto/polling_cleanup_dto.go
Normal file
103
internal/model/dto/polling_cleanup_dto.go
Normal file
@@ -0,0 +1,103 @@
|
||||
package dto
|
||||
|
||||
import "time"
|
||||
|
||||
// CreateDataCleanupConfigReq 创建数据清理配置请求
|
||||
type CreateDataCleanupConfigReq struct {
|
||||
TargetTable string `json:"table_name" validate:"required,max=100" description:"表名"`
|
||||
RetentionDays int `json:"retention_days" validate:"required,min=7" description:"保留天数,最少7天"`
|
||||
BatchSize int `json:"batch_size" validate:"omitempty,min=1000,max=100000" description:"每批删除条数,默认10000"`
|
||||
Description string `json:"description" validate:"omitempty,max=500" description:"配置说明"`
|
||||
}
|
||||
|
||||
// UpdateDataCleanupConfigReq 更新数据清理配置请求(Body 部分)
|
||||
type UpdateDataCleanupConfigReq struct {
|
||||
RetentionDays *int `json:"retention_days" validate:"omitempty,min=7" description:"保留天数"`
|
||||
BatchSize *int `json:"batch_size" validate:"omitempty,min=1000,max=100000" description:"每批删除条数"`
|
||||
Enabled *int `json:"enabled" validate:"omitempty,oneof=0 1" description:"是否启用:0-禁用,1-启用"`
|
||||
Description *string `json:"description" validate:"omitempty,max=500" description:"配置说明"`
|
||||
}
|
||||
|
||||
// UpdateDataCleanupConfigParams 更新数据清理配置参数(包含路径参数和 Body)
|
||||
type UpdateDataCleanupConfigParams struct {
|
||||
IDReq
|
||||
UpdateDataCleanupConfigReq
|
||||
}
|
||||
|
||||
// DataCleanupConfigResp 数据清理配置响应
|
||||
type DataCleanupConfigResp struct {
|
||||
ID uint `json:"id" description:"配置ID"`
|
||||
TargetTable string `json:"table_name" description:"表名"`
|
||||
RetentionDays int `json:"retention_days" description:"保留天数"`
|
||||
BatchSize int `json:"batch_size" description:"每批删除条数"`
|
||||
Enabled int `json:"enabled" description:"是否启用:0-禁用,1-启用"`
|
||||
Description string `json:"description" description:"配置说明"`
|
||||
CreatedAt time.Time `json:"created_at" description:"创建时间"`
|
||||
UpdatedAt time.Time `json:"updated_at" description:"更新时间"`
|
||||
UpdatedBy *uint `json:"updated_by,omitempty" description:"更新人ID"`
|
||||
}
|
||||
|
||||
// DataCleanupConfigListResp 数据清理配置列表响应
|
||||
type DataCleanupConfigListResp struct {
|
||||
Items []*DataCleanupConfigResp `json:"items" description:"配置列表"`
|
||||
}
|
||||
|
||||
// DataCleanupLogResp 数据清理日志响应
|
||||
type DataCleanupLogResp struct {
|
||||
ID uint `json:"id" description:"日志ID"`
|
||||
TargetTable string `json:"table_name" description:"表名"`
|
||||
CleanupType string `json:"cleanup_type" description:"清理类型:scheduled/manual"`
|
||||
RetentionDays int `json:"retention_days" description:"保留天数"`
|
||||
DeletedCount int64 `json:"deleted_count" description:"删除记录数"`
|
||||
DurationMs int64 `json:"duration_ms" description:"执行耗时(毫秒)"`
|
||||
Status string `json:"status" description:"状态:success/failed/running"`
|
||||
ErrorMessage string `json:"error_message,omitempty" description:"错误信息"`
|
||||
StartedAt time.Time `json:"started_at" description:"开始时间"`
|
||||
CompletedAt *time.Time `json:"completed_at,omitempty" description:"完成时间"`
|
||||
TriggeredBy *uint `json:"triggered_by,omitempty" description:"触发人ID"`
|
||||
}
|
||||
|
||||
// DataCleanupLogListResp 数据清理日志列表响应
|
||||
type DataCleanupLogListResp struct {
|
||||
Items []*DataCleanupLogResp `json:"items" description:"日志列表"`
|
||||
Total int64 `json:"total" description:"总数"`
|
||||
Page int `json:"page" description:"当前页"`
|
||||
PageSize int `json:"page_size" description:"每页数量"`
|
||||
TotalPages int `json:"total_pages" description:"总页数"`
|
||||
}
|
||||
|
||||
// ListDataCleanupLogReq 查询数据清理日志请求
|
||||
type ListDataCleanupLogReq struct {
|
||||
TableName string `json:"table_name" query:"table_name" description:"表名筛选"`
|
||||
Page int `json:"page" query:"page" validate:"omitempty,min=1" description:"页码"`
|
||||
PageSize int `json:"page_size" query:"page_size" validate:"omitempty,min=1,max=100" description:"每页数量"`
|
||||
}
|
||||
|
||||
// DataCleanupPreviewResp 数据清理预览响应
|
||||
type DataCleanupPreviewResp struct {
|
||||
Items []*DataCleanupPreviewItem `json:"items" description:"预览列表"`
|
||||
}
|
||||
|
||||
// DataCleanupPreviewItem 数据清理预览项
|
||||
type DataCleanupPreviewItem struct {
|
||||
TableName string `json:"table_name" description:"表名"`
|
||||
RetentionDays int `json:"retention_days" description:"保留天数"`
|
||||
RecordCount int64 `json:"record_count" description:"待清理记录数"`
|
||||
Description string `json:"description" description:"配置说明"`
|
||||
}
|
||||
|
||||
// DataCleanupProgressResp 数据清理进度响应
|
||||
type DataCleanupProgressResp struct {
|
||||
IsRunning bool `json:"is_running" description:"是否正在运行"`
|
||||
CurrentTable string `json:"current_table,omitempty" description:"当前清理的表"`
|
||||
TotalTables int `json:"total_tables" description:"总表数"`
|
||||
ProcessedTables int `json:"processed_tables" description:"已处理表数"`
|
||||
TotalDeleted int64 `json:"total_deleted" description:"已删除记录数"`
|
||||
StartedAt *time.Time `json:"started_at,omitempty" description:"开始时间"`
|
||||
LastLog *DataCleanupLogResp `json:"last_log,omitempty" description:"最近一条清理日志"`
|
||||
}
|
||||
|
||||
// TriggerDataCleanupReq 手动触发数据清理请求
|
||||
type TriggerDataCleanupReq struct {
|
||||
TableName string `json:"table_name" validate:"omitempty,max=100" description:"表名,为空则清理所有"`
|
||||
}
|
||||
32
internal/model/dto/polling_concurrency_dto.go
Normal file
32
internal/model/dto/polling_concurrency_dto.go
Normal file
@@ -0,0 +1,32 @@
|
||||
package dto
|
||||
|
||||
// GetPollingConcurrencyReq 获取指定任务类型的并发配置请求
|
||||
type GetPollingConcurrencyReq struct {
|
||||
TaskType string `path:"task_type" description:"任务类型" required:"true"`
|
||||
}
|
||||
|
||||
// UpdatePollingConcurrencyReq 更新轮询并发配置请求
|
||||
type UpdatePollingConcurrencyReq struct {
|
||||
TaskType string `path:"task_type" description:"任务类型" required:"true"`
|
||||
MaxConcurrency int `json:"max_concurrency" validate:"required,min=1,max=1000" description:"最大并发数(1-1000)"`
|
||||
}
|
||||
|
||||
// PollingConcurrencyResp 轮询并发配置响应
|
||||
type PollingConcurrencyResp struct {
|
||||
TaskType string `json:"task_type" description:"任务类型"`
|
||||
TaskTypeName string `json:"task_type_name" description:"任务类型名称"`
|
||||
MaxConcurrency int `json:"max_concurrency" description:"最大并发数"`
|
||||
Current int64 `json:"current" description:"当前并发数"`
|
||||
Available int64 `json:"available" description:"可用并发数"`
|
||||
Utilization float64 `json:"utilization" description:"使用率(百分比)"`
|
||||
}
|
||||
|
||||
// PollingConcurrencyListResp 轮询并发配置列表响应
|
||||
type PollingConcurrencyListResp struct {
|
||||
Items []*PollingConcurrencyResp `json:"items" description:"并发配置列表"`
|
||||
}
|
||||
|
||||
// ResetPollingConcurrencyReq 重置轮询并发计数请求
|
||||
type ResetPollingConcurrencyReq struct {
|
||||
TaskType string `json:"task_type" validate:"required" description:"任务类型"`
|
||||
}
|
||||
81
internal/model/dto/polling_config_dto.go
Normal file
81
internal/model/dto/polling_config_dto.go
Normal file
@@ -0,0 +1,81 @@
|
||||
package dto
|
||||
|
||||
// CreatePollingConfigRequest 创建轮询配置请求
|
||||
type CreatePollingConfigRequest struct {
|
||||
ConfigName string `json:"config_name" validate:"required,min=1,max=100" required:"true" minLength:"1" maxLength:"100" description:"配置名称"`
|
||||
CardCondition string `json:"card_condition" validate:"omitempty,oneof=not_real_name real_name activated suspended" description:"卡状态条件 (not_real_name:未实名, real_name:已实名, activated:已激活, suspended:已停用)"`
|
||||
CardCategory string `json:"card_category" validate:"omitempty,oneof=normal industry" description:"卡业务类型 (normal:普通卡, industry:行业卡)"`
|
||||
CarrierID *uint `json:"carrier_id" validate:"omitempty" description:"运营商ID(可选,精确匹配)"`
|
||||
Priority int `json:"priority" validate:"required,min=1,max=1000" required:"true" minimum:"1" maximum:"1000" description:"优先级(数字越小优先级越高)"`
|
||||
RealnameCheckInterval *int `json:"realname_check_interval" validate:"omitempty,min=30" minimum:"30" description:"实名检查间隔(秒),NULL表示不检查,最小30秒"`
|
||||
CarddataCheckInterval *int `json:"carddata_check_interval" validate:"omitempty,min=60" minimum:"60" description:"流量检查间隔(秒),NULL表示不检查,最小60秒"`
|
||||
PackageCheckInterval *int `json:"package_check_interval" validate:"omitempty,min=60" minimum:"60" description:"套餐检查间隔(秒),NULL表示不检查,最小60秒"`
|
||||
Description string `json:"description" validate:"omitempty,max=500" maxLength:"500" description:"配置说明"`
|
||||
}
|
||||
|
||||
// UpdatePollingConfigRequest 更新轮询配置请求
|
||||
type UpdatePollingConfigRequest struct {
|
||||
ConfigName *string `json:"config_name" validate:"omitempty,min=1,max=100" minLength:"1" maxLength:"100" description:"配置名称"`
|
||||
CardCondition *string `json:"card_condition" validate:"omitempty,oneof=not_real_name real_name activated suspended" description:"卡状态条件 (not_real_name:未实名, real_name:已实名, activated:已激活, suspended:已停用)"`
|
||||
CardCategory *string `json:"card_category" validate:"omitempty,oneof=normal industry" description:"卡业务类型 (normal:普通卡, industry:行业卡)"`
|
||||
CarrierID *uint `json:"carrier_id" validate:"omitempty" description:"运营商ID(可选,精确匹配)"`
|
||||
Priority *int `json:"priority" validate:"omitempty,min=1,max=1000" minimum:"1" maximum:"1000" description:"优先级(数字越小优先级越高)"`
|
||||
RealnameCheckInterval *int `json:"realname_check_interval" validate:"omitempty,min=30" minimum:"30" description:"实名检查间隔(秒),NULL表示不检查,最小30秒"`
|
||||
CarddataCheckInterval *int `json:"carddata_check_interval" validate:"omitempty,min=60" minimum:"60" description:"流量检查间隔(秒),NULL表示不检查,最小60秒"`
|
||||
PackageCheckInterval *int `json:"package_check_interval" validate:"omitempty,min=60" minimum:"60" description:"套餐检查间隔(秒),NULL表示不检查,最小60秒"`
|
||||
Description *string `json:"description" validate:"omitempty,max=500" maxLength:"500" description:"配置说明"`
|
||||
}
|
||||
|
||||
// PollingConfigListRequest 轮询配置列表请求
|
||||
type PollingConfigListRequest struct {
|
||||
Page int `json:"page" query:"page" validate:"omitempty,min=1" minimum:"1" description:"页码"`
|
||||
PageSize int `json:"page_size" query:"page_size" validate:"omitempty,min=1,max=100" minimum:"1" maximum:"100" description:"每页数量"`
|
||||
Status *int16 `json:"status" query:"status" validate:"omitempty,oneof=0 1" description:"状态 (1:启用, 0:禁用)"`
|
||||
CardCondition *string `json:"card_condition" query:"card_condition" validate:"omitempty,oneof=not_real_name real_name activated suspended" description:"卡状态条件"`
|
||||
CardCategory *string `json:"card_category" query:"card_category" validate:"omitempty,oneof=normal industry" description:"卡业务类型"`
|
||||
CarrierID *uint `json:"carrier_id" query:"carrier_id" validate:"omitempty" description:"运营商ID"`
|
||||
ConfigName *string `json:"config_name" query:"config_name" validate:"omitempty,max=100" maxLength:"100" description:"配置名称(模糊搜索)"`
|
||||
}
|
||||
|
||||
// UpdatePollingConfigStatusRequest 更新轮询配置状态请求
|
||||
type UpdatePollingConfigStatusRequest struct {
|
||||
Status int16 `json:"status" validate:"required,oneof=0 1" required:"true" description:"状态 (1:启用, 0:禁用)"`
|
||||
}
|
||||
|
||||
// PollingConfigResponse 轮询配置响应
|
||||
type PollingConfigResponse struct {
|
||||
ID uint `json:"id" description:"配置ID"`
|
||||
ConfigName string `json:"config_name" description:"配置名称"`
|
||||
CardCondition string `json:"card_condition" description:"卡状态条件 (not_real_name:未实名, real_name:已实名, activated:已激活, suspended:已停用)"`
|
||||
CardCategory string `json:"card_category" description:"卡业务类型 (normal:普通卡, industry:行业卡)"`
|
||||
CarrierID *uint `json:"carrier_id" description:"运营商ID"`
|
||||
Priority int `json:"priority" description:"优先级(数字越小优先级越高)"`
|
||||
RealnameCheckInterval *int `json:"realname_check_interval" description:"实名检查间隔(秒),NULL表示不检查"`
|
||||
CarddataCheckInterval *int `json:"carddata_check_interval" description:"流量检查间隔(秒),NULL表示不检查"`
|
||||
PackageCheckInterval *int `json:"package_check_interval" description:"套餐检查间隔(秒),NULL表示不检查"`
|
||||
Status int16 `json:"status" description:"状态 (1:启用, 0:禁用)"`
|
||||
Description string `json:"description" description:"配置说明"`
|
||||
CreatedAt string `json:"created_at" description:"创建时间"`
|
||||
UpdatedAt string `json:"updated_at" description:"更新时间"`
|
||||
}
|
||||
|
||||
// UpdatePollingConfigParams 更新轮询配置参数
|
||||
type UpdatePollingConfigParams struct {
|
||||
IDReq
|
||||
UpdatePollingConfigRequest
|
||||
}
|
||||
|
||||
// UpdatePollingConfigStatusParams 更新轮询配置状态参数
|
||||
type UpdatePollingConfigStatusParams struct {
|
||||
IDReq
|
||||
UpdatePollingConfigStatusRequest
|
||||
}
|
||||
|
||||
// PollingConfigPageResult 轮询配置分页结果
|
||||
type PollingConfigPageResult struct {
|
||||
List []*PollingConfigResponse `json:"list" description:"配置列表"`
|
||||
Total int64 `json:"total" description:"总数"`
|
||||
Page int `json:"page" description:"当前页"`
|
||||
PageSize int `json:"page_size" description:"每页数量"`
|
||||
TotalPages int `json:"total_pages" description:"总页数"`
|
||||
}
|
||||
72
internal/model/dto/polling_manual_trigger_dto.go
Normal file
72
internal/model/dto/polling_manual_trigger_dto.go
Normal file
@@ -0,0 +1,72 @@
|
||||
package dto
|
||||
|
||||
import "time"
|
||||
|
||||
// TriggerSingleReq 单卡手动触发请求
|
||||
type TriggerSingleReq struct {
|
||||
CardID uint `json:"card_id" validate:"required" description:"卡ID"`
|
||||
TaskType string `json:"task_type" validate:"required,oneof=polling:realname polling:carddata polling:package" description:"任务类型"`
|
||||
}
|
||||
|
||||
// TriggerBatchReq 批量手动触发请求
|
||||
type TriggerBatchReq struct {
|
||||
CardIDs []uint `json:"card_ids" validate:"required,min=1,max=1000" description:"卡ID列表,最多1000个"`
|
||||
TaskType string `json:"task_type" validate:"required,oneof=polling:realname polling:carddata polling:package" description:"任务类型"`
|
||||
}
|
||||
|
||||
// TriggerByConditionReq 条件筛选触发请求
|
||||
type TriggerByConditionReq struct {
|
||||
TaskType string `json:"task_type" validate:"required,oneof=polling:realname polling:carddata polling:package" description:"任务类型"`
|
||||
CardStatus string `json:"card_status" validate:"omitempty" description:"卡状态筛选"`
|
||||
CarrierCode string `json:"carrier_code" validate:"omitempty" description:"运营商代码筛选"`
|
||||
CardType string `json:"card_type" validate:"omitempty" description:"卡类型筛选"`
|
||||
ShopID *uint `json:"shop_id" validate:"omitempty" description:"店铺ID筛选"`
|
||||
PackageIDs []uint `json:"package_ids" validate:"omitempty" description:"套餐ID列表筛选"`
|
||||
EnablePolling *bool `json:"enable_polling" validate:"omitempty" description:"是否启用轮询筛选"`
|
||||
Limit int `json:"limit" validate:"omitempty,min=1,max=1000" description:"限制数量,最多1000"`
|
||||
}
|
||||
|
||||
// CancelTriggerReq 取消触发请求
|
||||
type CancelTriggerReq struct {
|
||||
TriggerID uint `json:"trigger_id" validate:"required" description:"触发任务ID"`
|
||||
}
|
||||
|
||||
// ManualTriggerLogResp 手动触发日志响应
|
||||
type ManualTriggerLogResp struct {
|
||||
ID uint `json:"id" description:"日志ID"`
|
||||
TaskType string `json:"task_type" description:"任务类型"`
|
||||
TaskTypeName string `json:"task_type_name" description:"任务类型名称"`
|
||||
TriggerType string `json:"trigger_type" description:"触发类型:single/batch/by_condition"`
|
||||
TriggerTypeName string `json:"trigger_type_name" description:"触发类型名称"`
|
||||
TotalCount int `json:"total_count" description:"总卡数"`
|
||||
ProcessedCount int `json:"processed_count" description:"已处理数"`
|
||||
SuccessCount int `json:"success_count" description:"成功数"`
|
||||
FailedCount int `json:"failed_count" description:"失败数"`
|
||||
Status string `json:"status" description:"状态:pending/processing/completed/cancelled"`
|
||||
StatusName string `json:"status_name" description:"状态名称"`
|
||||
TriggeredBy uint `json:"triggered_by" description:"触发人ID"`
|
||||
TriggeredAt time.Time `json:"triggered_at" description:"触发时间"`
|
||||
CompletedAt *time.Time `json:"completed_at,omitempty" description:"完成时间"`
|
||||
}
|
||||
|
||||
// ManualTriggerLogListResp 手动触发日志列表响应
|
||||
type ManualTriggerLogListResp struct {
|
||||
Items []*ManualTriggerLogResp `json:"items" description:"日志列表"`
|
||||
Total int64 `json:"total" description:"总数"`
|
||||
Page int `json:"page" description:"当前页"`
|
||||
PageSize int `json:"page_size" description:"每页数量"`
|
||||
TotalPages int `json:"total_pages" description:"总页数"`
|
||||
}
|
||||
|
||||
// ListManualTriggerLogReq 查询手动触发日志请求
|
||||
type ListManualTriggerLogReq struct {
|
||||
TaskType string `json:"task_type" query:"task_type" description:"任务类型筛选"`
|
||||
Page int `json:"page" query:"page" validate:"omitempty,min=1" description:"页码"`
|
||||
PageSize int `json:"page_size" query:"page_size" validate:"omitempty,min=1,max=100" description:"每页数量"`
|
||||
}
|
||||
|
||||
// ManualTriggerStatusResp 手动触发状态响应
|
||||
type ManualTriggerStatusResp struct {
|
||||
RunningTasks []*ManualTriggerLogResp `json:"running_tasks" description:"正在运行的任务"`
|
||||
QueueSizes map[string]int64 `json:"queue_sizes" description:"各队列大小"`
|
||||
}
|
||||
55
internal/model/dto/polling_monitoring_dto.go
Normal file
55
internal/model/dto/polling_monitoring_dto.go
Normal file
@@ -0,0 +1,55 @@
|
||||
package dto
|
||||
|
||||
import "time"
|
||||
|
||||
// PollingOverviewResp 轮询总览响应
|
||||
type PollingOverviewResp struct {
|
||||
TotalCards int64 `json:"total_cards" description:"总卡数"`
|
||||
InitializedCards int64 `json:"initialized_cards" description:"已初始化卡数"`
|
||||
InitProgress float64 `json:"init_progress" description:"初始化进度(0-100)"`
|
||||
IsInitializing bool `json:"is_initializing" description:"是否正在初始化"`
|
||||
RealnameQueueSize int64 `json:"realname_queue_size" description:"实名检查队列大小"`
|
||||
CarddataQueueSize int64 `json:"carddata_queue_size" description:"流量检查队列大小"`
|
||||
PackageQueueSize int64 `json:"package_queue_size" description:"套餐检查队列大小"`
|
||||
}
|
||||
|
||||
// PollingQueueStatusResp 队列状态响应
|
||||
type PollingQueueStatusResp struct {
|
||||
TaskType string `json:"task_type" description:"任务类型"`
|
||||
TaskTypeName string `json:"task_type_name" description:"任务类型名称"`
|
||||
QueueSize int64 `json:"queue_size" description:"队列大小"`
|
||||
ManualPending int64 `json:"manual_pending" description:"手动触发待处理数"`
|
||||
DueCount int64 `json:"due_count" description:"到期待处理数"`
|
||||
AvgWaitTime float64 `json:"avg_wait_time_s" description:"平均等待时间(秒)"`
|
||||
}
|
||||
|
||||
// PollingQueueStatusListResp 队列状态列表响应
|
||||
type PollingQueueStatusListResp struct {
|
||||
Items []*PollingQueueStatusResp `json:"items" description:"队列状态列表"`
|
||||
}
|
||||
|
||||
// PollingTaskStatsResp 任务统计响应
|
||||
type PollingTaskStatsResp struct {
|
||||
TaskType string `json:"task_type" description:"任务类型"`
|
||||
TaskTypeName string `json:"task_type_name" description:"任务类型名称"`
|
||||
SuccessCount1h int64 `json:"success_count_1h" description:"1小时成功数"`
|
||||
FailureCount1h int64 `json:"failure_count_1h" description:"1小时失败数"`
|
||||
TotalCount1h int64 `json:"total_count_1h" description:"1小时总数"`
|
||||
SuccessRate float64 `json:"success_rate" description:"成功率(0-100)"`
|
||||
AvgDurationMs float64 `json:"avg_duration_ms" description:"平均耗时(毫秒)"`
|
||||
}
|
||||
|
||||
// PollingTaskStatsListResp 任务统计列表响应
|
||||
type PollingTaskStatsListResp struct {
|
||||
Items []*PollingTaskStatsResp `json:"items" description:"任务统计列表"`
|
||||
}
|
||||
|
||||
// PollingInitProgressResp 初始化进度响应
|
||||
type PollingInitProgressResp struct {
|
||||
TotalCards int64 `json:"total_cards" description:"总卡数"`
|
||||
InitializedCards int64 `json:"initialized_cards" description:"已初始化卡数"`
|
||||
Progress float64 `json:"progress" description:"进度百分比(0-100)"`
|
||||
IsComplete bool `json:"is_complete" description:"是否完成"`
|
||||
StartedAt time.Time `json:"started_at" description:"开始时间"`
|
||||
EstimatedETA string `json:"estimated_eta" description:"预计完成时间"`
|
||||
}
|
||||
Reference in New Issue
Block a user