package dto import "time" // EnqueuePriorityPollingRequest 是人工优先入队请求。 // 一次优先需求覆盖该卡的**全部**纳入轮询任务类型,因此不接受按任务类型入队。 type EnqueuePriorityPollingRequest struct { CardID uint `json:"card_id" validate:"required" description:"卡ID"` Reason string `json:"reason" validate:"required,min=1,max=500" description:"人工加急原因(必填,最长500字符)"` } // EnqueuePriorityPollingResponse 是人工优先入队结果(资产级:一次入队对应多个任务类型的项)。 type EnqueuePriorityPollingResponse struct { CardID uint `json:"card_id" description:"卡ID"` TaskTypes []string `json:"task_types" description:"本次覆盖的轮询任务类型集合:polling:realname-实名检查 polling:carddata-流量检查 polling:package-套餐检查 polling:card_status-卡状态检查"` TaskTypeNames []string `json:"task_type_names" description:"轮询任务类型名称集合,与 task_types 一一对应"` CreatedCount int `json:"created_count" description:"本次新建的优先项数"` MergedCount int `json:"merged_count" description:"本次合并到既有活动项的项数"` Items []EnqueuePriorityPollingItemView `json:"items" description:"逐任务类型的优先项结果"` } // EnqueuePriorityPollingItemView 是单个任务类型的入队结果。 type EnqueuePriorityPollingItemView struct { ItemID uint `json:"item_id" description:"优先轮询项ID"` TaskType string `json:"task_type" description:"轮询任务类型"` TaskTypeName string `json:"task_type_name" description:"轮询任务类型名称"` Status string `json:"status" description:"状态:pending-待执行 processing-执行中 completed-已完成 failed-失败出队 closed-已关闭 expired-已过期"` StatusName string `json:"status_name" description:"状态名称"` TriggerCount int `json:"trigger_count" description:"累计触发次数(同一卡同一任务类型的后续触发合并计数)"` LastTriggeredAt time.Time `json:"last_triggered_at" description:"最近触发时间"` Created bool `json:"created" description:"是否新建活动项:false 表示已合并到既有活动项"` } // PriorityPollingItemListRequest 是优先轮询项列表查询请求。 // 时间范围按入队时间(created_at)取闭区间,复用统一时间筛选参数与语义。 type PriorityPollingItemListRequest struct { Page int `json:"page" query:"page" validate:"omitempty,min=1" minimum:"1" description:"页码,默认1"` PageSize int `json:"page_size" query:"page_size" validate:"omitempty,min=1,max=100" minimum:"1" maximum:"100" description:"每页条数,默认20,最大100"` CardID *uint `json:"card_id" query:"card_id" validate:"omitempty" description:"按卡ID筛选"` TaskType *string `json:"task_type" query:"task_type" validate:"omitempty,oneof=polling:realname polling:carddata polling:package polling:card_status" enum:"polling:realname,polling:carddata,polling:package,polling:card_status" description:"按轮询任务类型筛选:polling:realname-实名检查 polling:carddata-流量检查 polling:package-套餐检查 polling:card_status-卡状态检查"` Status *string `json:"status" query:"status" validate:"omitempty,oneof=pending processing completed failed closed expired" enum:"pending,processing,completed,failed,closed,expired" description:"按状态筛选:pending-待执行 processing-执行中 completed-已完成 failed-失败出队 closed-已关闭 expired-已过期"` TriggerType *string `json:"trigger_type" query:"trigger_type" validate:"omitempty,oneof=purchase_activated renewal_activated queue_activated addon_activated no_valid_package manual_trigger" enum:"purchase_activated,renewal_activated,queue_activated,addon_activated,no_valid_package,manual_trigger" description:"按触发类型筛选:purchase_activated-主套餐购买后立即生效 renewal_activated-续购套餐生效 queue_activated-排队主套餐顺延生效 addon_activated-加油包生效 no_valid_package-资产无有效套餐 manual_trigger-人工入队"` StartTime string `json:"start_time" query:"start_time" description:"入队时间起始(带时区的 RFC3339 秒级时间,闭区间含该时刻,如 2026-09-01T00:00:00+08:00)"` EndTime string `json:"end_time" query:"end_time" description:"入队时间结束(格式与 start_time 一致,闭区间含该时刻);开始晚于结束被拒绝"` AbnormalOnly *bool `json:"abnormal_only" query:"abnormal_only" description:"「异常与重试」视图:仅返回失败终态、已过期、尝试次数达到上限或存在失败原因的优先项;与其他筛选取与关系"` } // PriorityPollingItemResponse 是优先轮询项的读侧投影。 // 不含优先级分级:本能力不提供 P0/P1/P2 分级字段。 type PriorityPollingItemResponse struct { ID uint `json:"id" description:"优先轮询项ID"` CardID uint `json:"card_id" description:"卡ID"` ICCID string `json:"iccid,omitempty" description:"卡ICCID(卡已不存在时为空)"` AssetType string `json:"asset_type" description:"资产类型:iot_card-物联网卡 device-设备(入队时按设备—卡绑定冻结,独立卡为卡自身)"` AssetID *uint `json:"asset_id" description:"资产ID(与 asset_type 共同构成资产身份);历史行未回填时为 null"` DeviceNo string `json:"device_no,omitempty" description:"设备号快照(资产绑定设备时的设备虚拟号,独立卡为空)"` TaskType string `json:"task_type" description:"轮询任务类型"` TaskTypeName string `json:"task_type_name" description:"轮询任务类型名称"` Status string `json:"status" description:"状态:pending-待执行 processing-执行中 completed-已完成 failed-失败出队 closed-已关闭 expired-已过期"` StatusName string `json:"status_name" description:"状态名称"` TriggerType string `json:"trigger_type" description:"首次触发类型:purchase_activated renewal_activated queue_activated addon_activated no_valid_package manual_trigger"` TriggerTypeName string `json:"trigger_type_name" description:"首次触发类型名称"` TriggerTypes string `json:"trigger_types" description:"触发来源集合(去重后的全部触发类型,英文逗号分隔)"` TriggerCount int `json:"trigger_count" description:"累计触发次数"` LastTriggeredAt time.Time `json:"last_triggered_at" description:"最近触发时间"` SourceOrderID *uint `json:"source_order_id,omitempty" description:"来源订单ID"` SourcePackageUse *uint `json:"source_package_usage_id,omitempty" description:"来源套餐使用记录ID"` AttemptCount int `json:"attempt_count" description:"真实发起执行的次数"` AttemptLimit int `json:"attempt_limit" description:"最大尝试次数(固定常量,只读;达到后记录失败终态并出队)"` ClaimedAt *time.Time `json:"claimed_at,omitempty" description:"最近认领时间"` StartedAt *time.Time `json:"started_at,omitempty" description:"最近一次执行开始时间(未发起执行时为 null)"` FinishedAt *time.Time `json:"finished_at,omitempty" description:"最近一次执行结束时间(未发起执行时为 null)"` DurationMS int64 `json:"duration_ms" description:"最近一次执行耗时(毫秒);执行开始或结束时间缺失时为 0"` NextRunAt *time.Time `json:"next_run_at" description:"下一次计划执行时间;未排期为 null(读侧不据此判定已过期)"` PriorityEffectiveFrom *time.Time `json:"priority_effective_from" description:"有效期起算时间(入队时间,只读);历史终态行为 null"` DequeuedAt *time.Time `json:"dequeued_at" description:"出队时间(任一终态写入);仍在队列中时为 null"` ManualReason string `json:"manual_reason,omitempty" description:"人工入队原因"` ManualOperator uint `json:"manual_operator_id,omitempty" description:"人工入队操作者账号ID"` ManualOperatorNm string `json:"manual_operator_name,omitempty" description:"人工入队操作者名称"` ShopIDSnapshot *uint `json:"shop_id_snapshot,omitempty" description:"触发时冻结的卡所属店铺ID,平台卡为空"` AgentShopID *uint `json:"agent_shop_id_snapshot,omitempty" description:"代理归属:卡所属店铺的直接上级代理店铺ID,一级代理与平台卡为空"` Result string `json:"result" description:"执行结果:success-成功 failed-失败,未出结果时为空"` ResultName string `json:"result_name" description:"执行结果名称"` FailureReason string `json:"failure_reason,omitempty" description:"可安全展示的最近一次失败原因"` IntegrationLogID string `json:"integration_log_id,omitempty" description:"最近一次上游交互的集成交互日志标识(不含凭证与响应原文)"` CreatedAt time.Time `json:"created_at" description:"入队时间(创建时间)"` UpdatedAt time.Time `json:"updated_at" description:"最近更新时间"` } // PriorityPollingItemListResponse 是优先轮询项列表响应。 type PriorityPollingItemListResponse struct { List []*PriorityPollingItemResponse `json:"items" description:"优先轮询项列表"` Total int64 `json:"total" description:"总条数"` Page int `json:"page" description:"页码"` // 与 pkg/response.PaginationData 一致:响应侧字段名为 size,请求侧仍用 page_size。 PageSize int `json:"size" description:"每页条数"` } // ClosePriorityPollingItemRequest 是人工关闭优先轮询项请求。 type ClosePriorityPollingItemRequest struct { Reason string `json:"reason" validate:"required,min=1,max=500" description:"人工关闭原因(必填,最长500字符,写入审计)"` } // ClosePriorityPollingItemResponse 是人工关闭优先轮询项结果。 type ClosePriorityPollingItemResponse struct { ItemID uint `json:"item_id" description:"优先轮询项ID"` CardID uint `json:"card_id" description:"卡ID"` TaskType string `json:"task_type" description:"轮询任务类型"` TaskTypeName string `json:"task_type_name" description:"轮询任务类型名称"` Status string `json:"status" description:"关闭后的状态:closed-已关闭"` StatusName string `json:"status_name" description:"状态名称"` DequeuedAt time.Time `json:"dequeued_at" description:"出队时间"` Reason string `json:"reason" description:"本次人工关闭原因"` } // RetriggerPriorityPollingItemRequest 是失败或已过期优先项的人工重触发请求。 type RetriggerPriorityPollingItemRequest struct { Reason string `json:"reason" validate:"required,min=1,max=500" description:"人工重触发原因(必填,最长500字符,写入审计)"` } // RetriggerPriorityPollingItemResponse 是人工重触发结果。 // attempt_count 恒为 0:重触发为该卡该任务类型建立新的活动项,尝试次数从零开始。 type RetriggerPriorityPollingItemResponse struct { SourceItemID uint `json:"source_item_id" description:"被重触发的原终态优先轮询项ID"` CardID uint `json:"card_id" description:"卡ID"` TaskType string `json:"task_type" description:"轮询任务类型"` TaskTypeName string `json:"task_type_name" description:"轮询任务类型名称"` ItemID uint `json:"item_id" description:"新建或合并到的活动优先轮询项ID"` Status string `json:"status" description:"活动项状态:pending-待执行 processing-执行中"` StatusName string `json:"status_name" description:"状态名称"` AttemptCount int `json:"attempt_count" description:"当前尝试次数(新活动项恒为 0)"` TriggerCount int `json:"trigger_count" description:"累计触发次数"` LastTriggeredAt time.Time `json:"last_triggered_at" description:"最近触发时间"` Reason string `json:"reason" description:"本次人工重触发原因"` Created bool `json:"created" description:"是否新建活动项:false 表示已合并到既有活动项"` }