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, }) }