Files
junhong_cmp_fiber/internal/model/dto/polling_manual_trigger_dto.go
huang 931e140e8e
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 6m35s
feat: 实现 IoT 卡轮询系统(支持千万级卡规模)
实现功能:
- 实名状态检查轮询(可配置间隔)
- 卡流量检查轮询(支持跨月流量追踪)
- 套餐检查与超额自动停机
- 分布式并发控制(Redis 信号量)
- 手动触发轮询(单卡/批量/条件筛选)
- 数据清理配置与执行
- 告警规则与历史记录
- 实时监控统计(队列/性能/并发)

性能优化:
- Redis 缓存卡信息,减少 DB 查询
- Pipeline 批量写入 Redis
- 异步流量记录写入
- 渐进式初始化(10万卡/批)

压测工具(scripts/benchmark/):
- Mock Gateway 模拟上游服务
- 测试卡生成器
- 配置初始化脚本
- 实时监控脚本

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 17:32:44 +08:00

73 lines
4.0 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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:"各队列大小"`
}