Files
junhong_cmp_fiber/internal/routes/polling_priority.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

79 lines
5.1 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 routes
import (
"github.com/gofiber/fiber/v2"
"github.com/break/junhong_cmp_fiber/internal/handler/admin"
"github.com/break/junhong_cmp_fiber/internal/model/dto"
"github.com/break/junhong_cmp_fiber/pkg/openapi"
)
// registerPollingPriorityRoutes 注册卡轮询优先队列的人工入口(入队、关闭、重触发)与只读查询路由。
// 仅挂在既有后台认证中间件组下,不新增认证边界;权限在用例内按账号与数据范围判定。
func registerPollingPriorityRoutes(router fiber.Router, handler *admin.PriorityPollingHandler, doc *openapi.Generator, basePath string) {
group := router.Group("/polling-priority-items")
groupPath := basePath + "/polling-priority-items"
Register(group, doc, groupPath, "POST", "", handler.Enqueue, RouteSpec{
Summary: "人工优先入队",
Description: "为该卡的全部纳入轮询任务类型(实名/流量/套餐/卡状态)建立或合并优先轮询项。" +
"同一卡同一任务类型至多一条活动项,重复入队合并触发次数与来源集合;原因必填。" +
"入队时冻结资产类型与资产 ID、设备号、店铺与代理归属并以入队时间作为有效期起算时间。" +
"不受既有人工触发的每日次数上限与 24 小时去重约束;不修改调度优先级,也不绕过既有并发上限。",
Tags: []string{"轮询管理-优先队列"},
Input: new(dto.EnqueuePriorityPollingRequest),
Output: new(dto.EnqueuePriorityPollingResponse),
Auth: true,
})
// 字面量路径必须先于 /:id 注册,保证路径按字面量优先匹配。
Register(group, doc, groupPath, "GET", "", handler.ListPriorityItems, RouteSpec{
Summary: "查询优先轮询项列表",
Description: "分页查询卡轮询优先项,按创建时间倒序,支持卡、任务类型、状态、触发类型、" +
"入队时间范围start_time/end_time带时区的 RFC3339 秒级时间,闭区间含两端)与「异常与重试」视图筛选" +
"(失败终态、已过期、尝试次数达到上限或存在失败原因)。" +
"返回资产标识、设备号、店铺与代理归属、触发与尝试次数、最大尝试次数、最近与下一次执行时间、" +
"执行起止与耗时、入队与出队时间、执行结果与失败原因、集成交互日志标识。" +
"不提供优先级分级;查询不触发关闭或重触发。数据范围按卡所属店铺快照下推:" +
"代理只能看到自身及下级店铺资产,平台卡不可见。",
Tags: []string{"轮询管理-优先队列"},
Input: new(dto.PriorityPollingItemListRequest),
Output: new(dto.PriorityPollingItemListResponse),
Auth: true,
})
// 参数路由的子路径必须先于 /:id 注册,避免同段匹配歧义。
Register(group, doc, groupPath, "POST", "/:id/close", handler.Close, RouteSpec{
Summary: "人工关闭优先轮询项",
Description: "仅超级管理员与平台账号。仅允许关闭待执行或执行中的优先项:原因必填并写入审计(操作者、时间与原因)," +
"未完成项转已关闭终态并出队,不再发起任何上游调用,既有执行结果与失败原因一律保留。" +
"越权与不存在返回同一错误。",
Tags: []string{"轮询管理-优先队列"},
Input: new(dto.IDReq),
Body: new(dto.ClosePriorityPollingItemRequest),
Output: new(dto.ClosePriorityPollingItemResponse),
Auth: true,
})
Register(group, doc, groupPath, "POST", "/:id/retrigger", handler.Retrigger, RouteSpec{
Summary: "人工重触发优先轮询项",
Description: "权限与人工入队一致(超级管理员、平台账号与数据范围内的代理账号),仅允许对失败出队或已过期的项重触发。" +
"复用人工入队入口为该卡**该任务类型**建立新的活动项(尝试次数从零开始),原因必填并与操作者一同写入审计。" +
"不绕过活动项唯一键代表的并发上限、停复机持锁拒绝与任务类型范围;越权与不存在返回同一错误。",
Tags: []string{"轮询管理-优先队列"},
Input: new(dto.IDReq),
Body: new(dto.RetriggerPriorityPollingItemRequest),
Output: new(dto.RetriggerPriorityPollingItemResponse),
Auth: true,
})
Register(group, doc, groupPath, "GET", "/:id", handler.GetPriorityItem, RouteSpec{
Summary: "查询优先轮询项详情",
Description: "查询单条卡轮询优先项,字段与列表一致:资产标识、设备号、店铺与代理归属、任务类型、" +
"触发类型与来源、触发与尝试次数、最大尝试次数、最近与下一次执行时间、执行起止与耗时、" +
"入队与出队时间、执行结果与失败原因、集成交互日志标识,以及只读的有效期起算时间。" +
"不提供优先级分级;有效期到期由独立周期任务处理,人工关闭与人工重触发为独立受权限控制的写入口," +
"查询不会隐式触发二者。越权与不存在返回同一响应,不产生可枚举差异。",
Tags: []string{"轮询管理-优先队列"},
Input: new(dto.IDReq),
Output: new(dto.PriorityPollingItemResponse),
Auth: true,
})
}