Files
junhong_cmp_fiber/internal/model/dto/polling_priority_dto.go
break 5ed6b39deb
Some checks failed
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Has been cancelled
feat(收口): 补齐 8 月迭代缺口并同步 Spec 与证据链
- 新增六对成对迁移 000232–000237:H5 弹窗类型、退款结算标识与申请人备注、优先轮询事实字段与两个新终态、通道阈值命中留痕、手机号最近解绑人、提现资格校验留痕
- 退款:原因必填与申请人备注、来源支付与渠道流水冻结、线下处理流水号补录审计、按订单查询可选退款方式、企微审批材料补齐且新增字段缺失映射即明确失败
- 优先轮询:人工关闭、有效期到期独立周期任务、失败与过期人工重触发、事实字段与异常重试查询、资产解析端点只读投影
- 通道阈值:命中事实同事务留痕与命中记录查询;员工账单:列表筛选与详情投影;商户池:列表投影与统计周期语义;H5:弹窗类型与类别排序
- 手机号:有效关联数量与最近解绑人、短信验证码失败次数限制;导出:佣金明细十五列与报表序号列
- 时间筛选:三处新增筛选纳入统一严格解析契约,员工账单产生时间参数改名
- 同步 12 份主 Spec 需求、两端点与异步任务证据链,门禁 context-health 与 OpenSpec 校验通过
2026-09-18 15:34:29 +08:00

137 lines
13 KiB
Go
Raw 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"
// 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 表示已合并到既有活动项"`
}