feat(收口): 补齐 8 月迭代缺口并同步 Spec 与证据链
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:
2026-09-18 15:34:29 +08:00
parent 5e78809b93
commit 5ed6b39deb
142 changed files with 7878 additions and 964 deletions

View File

@@ -8,8 +8,8 @@ import (
"github.com/break/junhong_cmp_fiber/pkg/openapi"
)
// registerPollingPriorityRoutes 注册卡轮询优先队列的人工入与只读查询路由。
// 仅挂在既有后台认证中间件组下,不新增认证边界。
// 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"
@@ -18,6 +18,7 @@ func registerPollingPriorityRoutes(router fiber.Router, handler *admin.PriorityP
Summary: "人工优先入队",
Description: "为该卡的全部纳入轮询任务类型(实名/流量/套餐/卡状态)建立或合并优先轮询项。" +
"同一卡同一任务类型至多一条活动项,重复入队合并触发次数与来源集合;原因必填。" +
"入队时冻结资产类型与资产 ID、设备号、店铺与代理归属并以入队时间作为有效期起算时间。" +
"不受既有人工触发的每日次数上限与 24 小时去重约束;不修改调度优先级,也不绕过既有并发上限。",
Tags: []string{"轮询管理-优先队列"},
Input: new(dto.EnqueuePriorityPollingRequest),
@@ -27,17 +28,48 @@ func registerPollingPriorityRoutes(router fiber.Router, handler *admin.PriorityP
// 字面量路径必须先于 /:id 注册,保证路径按字面量优先匹配。
Register(group, doc, groupPath, "GET", "", handler.ListPriorityItems, RouteSpec{
Summary: "查询优先轮询项列表",
Description: "分页查询卡轮询优先项,按创建时间倒序,支持卡、任务类型、状态触发类型筛选。" +
"数据范围按卡所属店铺快照下推:代理只能看到自身及下级店铺资产,平台卡不可见。",
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: "查询单条卡轮询优先项。越权与不存在返回同一响应,不产生可枚举差异。" +
"不提供优先级分级、有效期与人工重触发入口。",
Description: "查询单条卡轮询优先项,字段与列表一致:资产标识、设备号、店铺与代理归属、任务类型、" +
"触发类型与来源、触发与尝试次数、最大尝试次数、最近与下一次执行时间、执行起止与耗时、" +
"入队与出队时间、执行结果与失败原因、集成交互日志标识,以及只读的有效期起算时间。" +
"不提供优先级分级;有效期到期由独立周期任务处理,人工关闭与人工重触发为独立受权限控制的写入口," +
"查询不会隐式触发二者。越权与不存在返回同一响应,不产生可枚举差异。",
Tags: []string{"轮询管理-优先队列"},
Input: new(dto.IDReq),
Output: new(dto.PriorityPollingItemResponse),