feat(收口): 补齐 8 月迭代缺口并同步 Spec 与证据链
Some checks failed
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Has been cancelled
Some checks failed
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Has been cancelled
- 新增六对成对迁移 000232–000237:H5 弹窗类型、退款结算标识与申请人备注、优先轮询事实字段与两个新终态、通道阈值命中留痕、手机号最近解绑人、提现资格校验留痕 - 退款:原因必填与申请人备注、来源支付与渠道流水冻结、线下处理流水号补录审计、按订单查询可选退款方式、企微审批材料补齐且新增字段缺失映射即明确失败 - 优先轮询:人工关闭、有效期到期独立周期任务、失败与过期人工重触发、事实字段与异常重试查询、资产解析端点只读投影 - 通道阈值:命中事实同事务留痕与命中记录查询;员工账单:列表筛选与详情投影;商户池:列表投影与统计周期语义;H5:弹窗类型与类别排序 - 手机号:有效关联数量与最近解绑人、短信验证码失败次数限制;导出:佣金明细十五列与报表序号列 - 时间筛选:三处新增筛选纳入统一严格解析契约,员工账单产生时间参数改名 - 同步 12 份主 Spec 需求、两端点与异步任务证据链,门禁 context-health 与 OpenSpec 校验通过
This commit is contained in:
@@ -24,7 +24,7 @@ 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-失败出队"`
|
||||
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:"最近触发时间"`
|
||||
@@ -32,42 +32,59 @@ type EnqueuePriorityPollingItemView struct {
|
||||
}
|
||||
|
||||
// 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" enum:"pending,processing,completed,failed" description:"按状态筛选:pending-待执行 processing-执行中 completed-已完成 failed-失败出队"`
|
||||
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-人工入队"`
|
||||
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(卡已不存在时为空)"`
|
||||
TaskType string `json:"task_type" description:"轮询任务类型"`
|
||||
TaskTypeName string `json:"task_type_name" description:"轮询任务类型名称"`
|
||||
Status string `json:"status" description:"状态:pending-待执行 processing-执行中 completed-已完成 failed-失败出队"`
|
||||
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:"真实发起执行的次数(上限3次)"`
|
||||
ClaimedAt *time.Time `json:"claimed_at,omitempty" description:"最近认领时间"`
|
||||
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,平台卡为空"`
|
||||
Result string `json:"result" description:"执行结果:success-成功 failed-失败,未出结果时为空"`
|
||||
ResultName string `json:"result_name" description:"执行结果名称"`
|
||||
FailureReason string `json:"failure_reason,omitempty" description:"可安全展示的失败原因"`
|
||||
CreatedAt time.Time `json:"created_at" description:"创建时间"`
|
||||
UpdatedAt time.Time `json:"updated_at" description:"最近更新时间"`
|
||||
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 是优先轮询项列表响应。
|
||||
@@ -78,3 +95,42 @@ type PriorityPollingItemListResponse struct {
|
||||
// 与 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 表示已合并到既有活动项"`
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user