Files
order_site/apps/backend/方案A-订单编排与自动兑换设计.md
T
2026-04-08 16:30:42 +08:00

1078 lines
25 KiB
Markdown
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.
# 方案 A:订单编排与自动兑换设计
## 1. 目标
基于现有两个项目:
- 后端 [order-site-backend](/Users/yml/codes/order-site-backend)
- 前端 [order-site-rewrite](/Users/yml/codes/order-site-rewrite)
增加一条面向真实订单的自动化交付链路:
1. 第三方平台通过订单创建成功或支付成功通知,将订单数据推送到我方后端。
2. 后端根据订单和商品信息匹配需要发放的 CDK,并创建交付任务。
3. 后端生成一个面向用户的领取链接,并通过可用渠道发送给用户。
4. 用户打开链接后,通过 QQ 或 WX 完成角色绑定。
5. 后端复用现有 Playwright 自动化能力,自动提交 CDK、执行绑定、生成截图。
6. 前端实时展示绑定状态、兑换状态和最终截图。
该方案采用“订单编排层 + 浏览器自动化执行层”两层结构,不直接把现有浏览器会话工具当作订单系统使用。
## 2. 当前系统现状
### 2.1 后端现状
当前后端主线是浏览器会话兑换工具,而不是订单系统。
- Express 入口在 [src/index.js](/Users/yml/codes/order-site-backend/src/index.js:1)
- 现有路由只覆盖腾讯浏览器会话接口,在 [src/routes/tencent.js](/Users/yml/codes/order-site-backend/src/routes/tencent.js:1)
- 浏览器会话创建、刷新、关闭、兑换都集中在 [src/services/session.js](/Users/yml/codes/order-site-backend/src/services/session.js:80)
- 验证码识别与兑换提交流程在 [src/services/session-redeem.js](/Users/yml/codes/order-site-backend/src/services/session-redeem.js:3)
- 截图、结果 JSON、证明产物生成在 [src/services/session-proof.js](/Users/yml/codes/order-site-backend/src/services/session-proof.js:16)
- OCR 子服务使用 `uv` 启动,在 [src/services/ocr.js](/Users/yml/codes/order-site-backend/src/services/ocr.js:83)
当前系统没有以下关键能力:
- 没有订单表
- 没有 CDK 库存表
- 没有 webhook 接收和签名校验
- 没有任务状态机
- 没有用户领取链接管理
- 没有消息投递模块
- 没有浏览器会话与订单任务的绑定关系
### 2.2 前端现状
当前前端是一个单页腾讯兑换工具。
- 路由只包含 `/tx/browser`,在 [src/router/index.ts](/Users/yml/codes/order-site-rewrite/src/router/index.ts:1)
- 主页面在 [src/views/tx/TencentBrowserView.vue](/Users/yml/codes/order-site-rewrite/src/views/tx/TencentBrowserView.vue:1)
- 页面编排在 [src/composables/useTencentBrowserSessionPage.ts](/Users/yml/codes/order-site-rewrite/src/composables/useTencentBrowserSessionPage.ts:1)
- 状态轮询在 [src/composables/tencent/useTencentBrowserSessionPolling.ts](/Users/yml/codes/order-site-rewrite/src/composables/tencent/useTencentBrowserSessionPolling.ts:1)
- 兑换前角色确认、兑换按钮、结果展示已经具备基础 UI,可复用
当前前端没有以下能力:
- 没有订单领取页
- 没有 token 校验页
- 没有订单详情页
- 没有任务状态驱动的前端展示
- 没有“订单上下文中的浏览器会话”概念
## 3. 总体架构
### 3.1 分层设计
建议分成 4 层:
1. 平台接入层
负责接收订单创建成功、支付成功、售后等通知,完成签名校验和原始数据落库。
2. 订单编排层
负责订单幂等、商品解析、CDK 预占、任务创建、链接生成、状态流转。
3. 浏览器自动化执行层
复用现有腾讯浏览器会话、角色识别、验证码识别、兑换提交、截图生成能力。
4. 用户交互层
用户通过领取链接进入前端页面,完成 QQ/WX 登录、角色确认、查看结果。
### 3.2 核心原则
- 订单与浏览器会话解耦
- CDK 先预占、后核销
- 所有平台通知必须幂等
- 用户访问链接使用 token,不直接使用订单号鉴权
- 浏览器自动化失败必须可重试、可人工接管
- 所有关键节点都要保留审计数据
## 4. 业务流程
### 4.1 主流程
1. 平台发送订单通知到后端 webhook。
2. 后端校验签名,按平台订单号幂等写入 `orders`
3. 根据订单商品、规格、渠道信息生成一个或多个 `delivery_tasks`
4. 系统从 `cdk_inventory` 中为任务预占可用 CDK。
5. 系统生成 `claim_token`,构造领取链接。
6. 系统通过站内消息、短信、客服人工转发或支付成功页展示,把链接给用户。
7. 用户打开链接,前端调用后端校验 token 和任务状态。
8. 用户选择 QQ 或 WX 登录,后端创建浏览器 session,并绑定到 `delivery_task`
9. 用户扫码后,后端识别角色、大区、昵称等信息。
10. 前端展示识别结果,用户确认角色无误。
11. 后端自动执行 CDK 提交、验证码识别、截图生成。
12. 成功后任务进入 `redeemed`CDK 进入 `delivered`
13. 前端展示截图、结果消息、订单号、角色信息。
### 4.2 异常流程
- webhook 重复推送:只更新状态,不重复创建任务
- 商品无法匹配 CDK:任务进入 `manual_review`
- CDK 库存不足:任务进入 `waiting_inventory`
- token 过期:提示用户重新获取领取链接
- 浏览器自动化失败:任务进入 `retry_pending``manual_review`
- 用户长时间未领取:任务进入 `expired`,释放预占 CDK
## 5. 数据模型设计
建议先上 SQLite,跑通后如有并发压力再切 PostgreSQL。当前项目还没有数据库依赖,先用 SQLite 可以把复杂度压低。
### 5.1 `orders`
订单主表。
字段建议:
- `id`
- `platform`
- `platform_order_id`
- `order_status`
- `pay_status`
- `buyer_id`
- `buyer_name`
- `raw_payload_json`
- `created_at`
- `updated_at`
- `paid_at`
约束建议:
- `platform + platform_order_id` 唯一
### 5.2 `order_items`
订单子项表,用于一单多商品。
字段建议:
- `id`
- `order_id`
- `sku_code`
- `sku_name`
- `quantity`
- `spec_json`
- `delivery_mode`
- `created_at`
- `updated_at`
### 5.3 `cdk_inventory`
CDK 库存表。
字段建议:
- `id`
- `batch_no`
- `sku_code`
- `cdk_code`
- `status`
- `reserved_by_task_id`
- `delivered_at`
- `invalid_reason`
- `created_at`
- `updated_at`
状态建议:
- `available`
- `reserved`
- `delivered`
- `invalid`
### 5.4 `delivery_tasks`
交付任务表,是整个方案的核心。
字段建议:
- `id`
- `order_id`
- `order_item_id`
- `platform_order_id`
- `task_no`
- `task_status`
- `login_type`
- `claim_token_id`
- `reserved_cdk_id`
- `browser_session_id`
- `role_id`
- `role_name`
- `area`
- `partition`
- `nickname`
- `result_code`
- `result_message`
- `screenshot_path`
- `artifacts_json`
- `last_error`
- `retry_count`
- `expires_at`
- `claimed_at`
- `redeemed_at`
- `created_at`
- `updated_at`
状态建议:
- `pending_payment`
- `paid`
- `waiting_inventory`
- `cdk_reserved`
- `link_generated`
- `claimed`
- `role_confirmed`
- `redeeming`
- `redeemed`
- `retry_pending`
- `manual_review`
- `expired`
- `closed`
### 5.5 `claim_tokens`
领取链接表。
字段建议:
- `id`
- `task_id`
- `token`
- `status`
- `expired_at`
- `used_at`
- `max_use_count`
- `used_count`
- `created_at`
- `updated_at`
状态建议:
- `active`
- `used`
- `expired`
- `revoked`
### 5.6 `webhook_events`
保留原始通知,便于审计和重放。
字段建议:
- `id`
- `platform`
- `event_type`
- `event_key`
- `signature_valid`
- `headers_json`
- `query_json`
- `body_json`
- `processed`
- `process_error`
- `created_at`
## 6. 后端模块拆分
建议在现有后端上新增以下模块。
### 6.1 路由层
新增路由目录建议:
- `src/routes/webhooks.js`
- `src/routes/orders.js`
- `src/routes/claims.js`
- `src/routes/admin.js`
说明:
- `webhooks.js` 接平台推送
- `orders.js` 给内部系统或管理端查订单和任务
- `claims.js` 给用户领取页调用
- `admin.js` 做手工补单、重试、失效处理
### 6.2 服务层
新增服务建议:
- `src/services/order-service.js`
- `src/services/order-item-service.js`
- `src/services/delivery-task-service.js`
- `src/services/cdk-service.js`
- `src/services/claim-service.js`
- `src/services/webhook-service.js`
- `src/services/message-service.js`
- `src/services/redeem-executor-service.js`
职责划分建议:
- `webhook-service`
负责签名校验、原始通知记录、事件分发
- `order-service`
负责订单幂等写入和状态更新
- `delivery-task-service`
负责任务状态机
- `cdk-service`
负责 CDK 分配、预占、释放、核销
- `claim-service`
负责 token 生成、校验、过期
- `message-service`
负责发链接
- `redeem-executor-service`
负责把任务桥接到现有腾讯浏览器会话执行器
### 6.3 持久化层
建议新增:
- `src/db/`
- `src/repositories/`
推荐目录:
- `src/db/client.js`
- `src/repositories/order-repo.js`
- `src/repositories/task-repo.js`
- `src/repositories/cdk-repo.js`
- `src/repositories/claim-repo.js`
- `src/repositories/webhook-repo.js`
## 7. 对现有浏览器自动化能力的复用方式
现有后端能力不废弃,而是作为执行器继续使用。
### 7.1 可直接复用的能力
- 创建浏览器会话:`createTencentBrowserSession`
- 轮询会话状态:`getTencentBrowserSession``getTencentBrowserSessionSummary`
- 扫码登录后识别角色信息:`session.js` 内已有活动页信息抽取逻辑
- 执行兑换:`redeemTencentBrowserSession`
- 生成截图和结果 JSON`saveRedeemArtifacts`
- OCR worker:继续使用当前 `uv run ocr-worker worker`
### 7.2 需要补的一层包装
不要让订单系统直接操作裸 `sessionId`,应通过 `redeem-executor-service` 管理:
1. 根据 `taskId` 创建浏览器 session
2.`taskId <-> sessionId` 关系落库
3. 用户扫码完成后,把识别到的角色信息同步回任务
4. 用户确认角色后,再触发兑换
5. 兑换完成后,把截图路径和最终结果回写到任务
## 8. API 设计
### 8.1 平台 webhook
`POST /api/v1/webhooks/agiso/trade`
职责:
- 接收订单创建成功通知
- 接收支付成功通知
- 验签
- 幂等入库
- 推进任务状态
### 8.2 用户领取页相关
`GET /api/v1/claim/:token`
返回:
- token 是否有效
- 订单号
- 商品摘要
- 当前任务状态
- 是否已绑定角色
- 是否已有截图
`POST /api/v1/claim/:token/session`
入参:
- `loginType: qq | wx`
职责:
- 校验 token
- 创建腾讯浏览器 session
- 将 session 绑定到任务
- 返回二维码和 session 摘要
`GET /api/v1/claim/:token/session/summary`
职责:
- 轮询当前领取任务下的 session 状态
- 返回角色信息、二维码状态、截图状态
`POST /api/v1/claim/:token/confirm-role`
职责:
- 用户确认当前角色无误
- 把任务推进到 `role_confirmed`
`POST /api/v1/claim/:token/redeem`
职责:
- 后端读取预占 CDK
- 调用执行器自动提交
- 回写结果
`GET /api/v1/claim/:token/screenshot`
职责:
- 返回最终截图
### 8.3 管理后台或内部接口
`POST /api/v1/admin/tasks/:taskId/retry`
`POST /api/v1/admin/tasks/:taskId/release-cdk`
`POST /api/v1/admin/tasks/:taskId/close`
`GET /api/v1/admin/orders/:orderId`
`GET /api/v1/admin/tasks/:taskId`
## 9. 运营后台设计
### 9.1 是否需要后台
需要,而且应作为正式模块纳入方案。
原因:
- 订单通知会重复、失败或延迟,必须能人工排查
- CDK 库存需要日常导入、校验、释放、核销
- 自动化链路不是 100% 成功,必须有失败任务处理入口
- 用户咨询时,需要快速看到订单、任务、角色、截图和错误原因
- 后续一定会出现补发、重试、关闭任务、重新生成链接等运营动作
如果没有后台,系统上线后所有异常都会退化成查数据库、查日志、手改数据,维护成本会快速失控。
### 9.2 更稳的做法
更稳的做法不是把管理页面直接混进用户领取页,而是拆成两套入口:
1. 用户前台
继续服务用户领取、扫码登录、角色确认、结果查看。
2. 运营后台
专门服务订单排查、CDK 管理、任务重试、异常处理。
建议形式:
- 用户前台继续使用 [order-site-rewrite](/Users/yml/codes/order-site-rewrite)
- 运营后台先作为同仓库下独立路由模块实现,例如 `/admin`
- 后端单独提供 `/api/v1/admin/*` 接口
这样做的好处:
- 用户链路和运营链路隔离
- 权限边界更清楚
- 页面状态不会互相污染
- 以后即使单独拆管理后台,也不会影响用户前台
### 9.3 后台第一版目标
第一版后台不追求复杂权限系统和漂亮界面,目标只有一个:
让你能稳定运营这条自动交付链路。
第一版最少应覆盖:
1. 查订单
2. 查交付任务
3. 导入和维护 CDK
4. 查看 webhook 日志
5. 重试失败任务
6. 释放预占 CDK
7. 重新生成领取链接
### 9.4 后台页面模块建议
#### 1. 概览页
展示核心数字:
- 今日订单数
- 已支付待领取数
- 领取中任务数
- 兑换成功数
- 异常任务数
- 库存不足的 SKU 数
这页主要用来让你快速判断系统是否在健康运行。
#### 2. 订单列表页
展示字段建议:
- 订单号
- 平台
- 商品摘要
- 支付状态
- 订单状态
- 创建时间
- 更新时间
- 对应任务数
支持筛选:
- 平台订单号
- 支付状态
- 时间范围
- 商品 SKU
进入详情后可查看:
- 原始订单通知
- 子项列表
- 对应交付任务
#### 3. 交付任务列表页
这是后台最核心的页面。
展示字段建议:
- `task_no`
- 平台订单号
- 商品 SKU
- 当前任务状态
- 预占 CDK
- 登录方式
- 角色名
- 角色 ID
- 浏览器 sessionId
- 重试次数
- 最后错误
- 创建时间
- 更新时间
支持操作:
- 查看详情
- 重新生成链接
- 重试任务
- 释放 CDK
- 关闭任务
- 标记人工处理
#### 4. CDK 管理页
这是第二核心页面。
应支持:
- 单条新增
- 批量导入
- 按 SKU 查看库存
- 查看状态分布
- 查看预占任务
- 手动失效
- 手动释放
展示字段建议:
- `sku_code`
- `batch_no`
- `cdk_code`
- `status`
- `reserved_by_task_id`
- `created_at`
- `updated_at`
导入方式建议至少支持:
- 文本框多行粘贴导入
- CSV 文件导入
导入校验建议:
- 去重
- 空值校验
- SKU 必填
- 批次号可选但建议保留
#### 5. webhook 日志页
展示:
- 平台
- 事件类型
- 平台订单号
- 验签是否通过
- 是否处理成功
- 错误信息
- 到达时间
支持查看:
- headers
- query
- body
- 对应生成的订单和任务
可选操作:
- 手动重放处理
#### 6. 任务详情页
任务详情页建议整合以下信息:
- 订单信息
- 商品和 SKU
- claim token 状态
- 浏览器 session 状态
- 角色识别结果
- 兑换结果
- 截图预览
- 原始错误日志
- 操作按钮
这个页面会成为你处理异常单的主工作台。
### 9.5 后台最小接口集
建议新增后台接口:
#### 订单
- `GET /api/v1/admin/orders`
- `GET /api/v1/admin/orders/:orderId`
#### 任务
- `GET /api/v1/admin/tasks`
- `GET /api/v1/admin/tasks/:taskId`
- `POST /api/v1/admin/tasks/:taskId/retry`
- `POST /api/v1/admin/tasks/:taskId/close`
- `POST /api/v1/admin/tasks/:taskId/release-cdk`
- `POST /api/v1/admin/tasks/:taskId/regenerate-claim-link`
- `POST /api/v1/admin/tasks/:taskId/mark-manual-review`
#### CDK
- `GET /api/v1/admin/cdks`
- `POST /api/v1/admin/cdks`
- `POST /api/v1/admin/cdks/import`
- `POST /api/v1/admin/cdks/:cdkId/invalidate`
- `POST /api/v1/admin/cdks/:cdkId/release`
#### webhook
- `GET /api/v1/admin/webhook-events`
- `GET /api/v1/admin/webhook-events/:eventId`
- `POST /api/v1/admin/webhook-events/:eventId/replay`
#### 概览
- `GET /api/v1/admin/dashboard/summary`
### 9.6 后台权限建议
第一版建议至少分两层:
1. `admin`
可导入 CDK、改任务状态、重试任务、关闭任务、重放 webhook。
2. `operator`
可查订单、查任务、看截图、看日志,但不能做高风险修改。
如果第一版先不做完整账号体系,也至少要做一个最简单的后台鉴权,例如:
- 独立后台口令
- 基础登录态
- 后端校验管理接口访问权限
不要把后台接口直接裸露给公网无鉴权访问。
### 9.7 后台与前台的边界
建议明确边界:
- 前台只处理用户领取和结果查看
- 后台只处理运营和异常处置
前台不要出现:
- 手动改任务状态
- 手动改 CDK
- 看其他订单
后台不要承担:
- 用户扫码登录入口
- 用户领取页展示逻辑
这样职责清晰,后续维护成本最低。
### 9.8 后台的落地顺序
建议放在整体计划的阶段 4 中作为正式内容,但有两个能力应提前做:
1. CDK 导入
2. 任务列表与详情查看
原因:
- 没有 CDK 导入能力,阶段 1 根本跑不顺
- 没有任务查看能力,阶段 2 和阶段 3 出问题时无法排查
因此更合适的执行顺序是:
- 阶段 1 完成订单骨架后,先补一个极简后台
- 阶段 2 和 3 继续完善业务闭环
- 阶段 4 再补全 webhook 重放、统计面板、权限细化
### 9.9 后台最小可行版本
后台 MVP 建议包含:
1. 登录页
2. 概览页
3. 订单列表页
4. 任务列表页
5. 任务详情页
6. CDK 导入页
7. webhook 日志页
这已经足够支撑第一版系统上线和日常运营。
### 9.10 结论
后端侧需要一个管理界面,而且应当作为正式模块设计,不建议临时拼接。
更稳的做法是:
- 用户前台与运营后台分离
- 后台先做最小可行版本
- 优先覆盖查单、查任务、导入 CDK、重试异常
- 后台接口独立鉴权
## 10. 前端设计
### 9.1 路由设计
现有前端只有 `/tx/browser`,建议新增:
- `/claim/:token`
这个页面才是正式业务入口。
`/tx/browser` 保留为内部调试工具页,不作为正式交付页面。
### 9.2 页面结构
建议页面拆成 4 个区域:
1. 订单摘要区
展示订单号、商品名、状态说明
2. 登录绑定区
复用现有二维码卡片能力
3. 角色确认区
复用现有角色展示和确认能力
4. 结果展示区
复用现有截图和结果卡片能力
### 9.3 可复用的前端模块
可以复用:
- [TencentAuthCard.vue](/Users/yml/codes/order-site-rewrite/src/components/tencent/TencentAuthCard.vue:1)
- [TencentRedeemPanel.vue](/Users/yml/codes/order-site-rewrite/src/components/tencent/TencentRedeemPanel.vue:1)
- [TencentResultPanel.vue](/Users/yml/codes/order-site-rewrite/src/components/tencent/TencentResultPanel.vue:1)
- [useTencentBrowserSessionPolling.ts](/Users/yml/codes/order-site-rewrite/src/composables/tencent/useTencentBrowserSessionPolling.ts:1)
- [useTencentBrowserSessionPresentation.ts](/Users/yml/codes/order-site-rewrite/src/composables/tencent/useTencentBrowserSessionPresentation.ts:1)
但需要改造:
- 不再让前端自己输入兑换码
- 不再让前端自己决定是否创建裸 session
- 页面所有操作都基于 `claim token`
### 9.4 前端状态设计
建议页面状态围绕任务状态展开,而不是围绕裸 session:
- `tokenValid`
- `taskStatus`
- `orderSummary`
- `session`
- `activityInfo`
- `roleConfirmed`
- `redeemResult`
- `screenshotUrl`
## 11. 状态机设计
### 10.1 任务状态流转
主状态机建议如下:
1. `pending_payment`
2. `paid`
3. `waiting_inventory`
4. `cdk_reserved`
5. `link_generated`
6. `claimed`
7. `role_confirmed`
8. `redeeming`
9. `redeemed`
异常分支:
- `retry_pending`
- `manual_review`
- `expired`
- `closed`
### 10.2 CDK 状态流转
1. `available`
2. `reserved`
3. `delivered`
异常分支:
- `invalid`
### 10.3 token 状态流转
1. `active`
2. `used`
异常分支:
- `expired`
- `revoked`
## 12. 安全与风控
### 11.1 token 安全
- token 必须使用高熵随机串
- 不要把订单号作为唯一访问凭证
- token 要支持过期
- token 要支持撤销
- token 校验失败不要泄露订单是否存在
### 11.2 webhook 安全
- 验签必须在业务处理前完成
- 保存原始 query、body、headers
- 根据平台订单号和事件类型做幂等
- 对重复通知返回成功,避免平台无限重试
### 11.3 自动化风险
- 登录状态和验证码都可能失败
- 活动页 DOM 变更会导致自动化失效
- 平台风控弹窗可能导致流程卡死
- 必须保留重试和人工兜底入口
## 13. 失败补偿机制
### 12.1 自动重试
可自动重试的场景:
- OCR 识别失败
- 页面刷新失败
- 临时网络超时
- 可恢复的验证码错误
不建议自动无限重试,应限制次数并回写错误。
### 12.2 人工接管
以下场景建议直接转人工:
- 角色识别异常
- 商品和 CDK 映射无法确认
- 自动化连续失败
- CDK 已疑似提交但返回结果不明确
### 12.3 过期处理
- 领取链接超时未使用,任务转 `expired`
- 任务过期后释放 `reserved` 状态的 CDK
- 如已创建浏览器 session,应主动清理
## 14. 技术选型建议
### 13.1 后端
当前后端是 Node.js + Express + Playwright,建议保持不变。
新增建议:
- 数据库先用 SQLite
- 数据访问先用简单 repository 封装
- 后续需要时再引入 ORM
原因:
- 先把主流程跑通
- 当前系统规模小,没必要过早引入太重的基础设施
- 浏览器自动化已经在 Node 侧,订单编排继续留在同一进程更简单
### 13.2 前端
当前前端是 Vue 3 + Element Plus,建议保持不变。
只需要增加:
- claim 页面
- claim 相关 API service
- task 视图模型
### 13.3 Python 相关
当前 Python 仅用于 OCR worker,继续使用 `uv` 管理即可。
如果后续需要:
- 图像增强
- 模板匹配
- 截图后处理
仍然应放在独立 Python 子服务里,并统一通过 `uv` 维护依赖。
## 15. 推荐执行顺序
建议分 4 个阶段实施。
### 阶段 1:后端订单骨架
目标:
- 接 webhook
- 落订单
- 建任务
- 预占 CDK
- 生成领取链接
要做的事:
1. 增加数据库和表结构
2. 实现 webhook 验签和幂等
3. 实现订单、任务、CDK、token 的 repository 和 service
4. 实现任务状态机基础逻辑
5. 实现领取链接生成
阶段产出:
- 支付成功后,系统能自动生成领取任务和领取链接
### 阶段 2:极简后台 + 前端领取页
目标:
- 有基本运营能力
- 用户通过 token 打开页面
- 看见订单信息
- 创建登录 session
- 扫码并确认角色
要做的事:
1. 新增 `/admin` 路由和极简后台骨架
2. 实现订单列表、任务列表、任务详情、CDK 导入
3. 新增 `/claim/:token` 路由
4. 新增 claim 页面和 API service
5. 复用当前二维码、轮询、角色确认组件
6. 页面状态从 `session 驱动` 改成 `task + session 双驱动`
阶段产出:
- 运营能查任务和导入 CDK,用户能进入正式领取页面并完成角色绑定
### 阶段 3:自动兑换闭环
目标:
- 用户确认角色后自动提交 CDK
- 生成截图并前端展示
要做的事:
1. 封装 `redeem-executor-service`
2. 将任务与 session 建立绑定关系
3. 后端从预占 CDK 读取兑换码,不再由前端输入
4. 回写截图路径、业务返回码、错误信息
阶段产出:
- 从订单通知到最终截图形成完整闭环
### 阶段 4:补偿和完整运营能力
目标:
- 可重试
- 可过期释放
- 可人工处理
- 有更完整的后台能力
要做的事:
1. 增加任务重试接口
2. 增加过期清理任务
3. 增加 webhook 重放
4. 增加概览统计和异常筛选
5. 增加后台权限细化
6. 增加关键日志和审计落库
阶段产出:
- 系统具备基本上线可运维性
## 16. 最小可行版本定义
第一版上线目标不建议追求“完全无人值守”,建议定义为:
- 平台支付成功后自动创建领取任务
- 自动预占 CDK
- 自动生成领取链接
- 用户进入页面后自行扫码登录
- 用户确认角色后系统自动提交 CDK
- 成功后展示截图
- 运营可在后台查看订单、任务、库存和 webhook 日志
- 失败后进入重试或人工处理
这是当前代码基础上最稳、最容易落地、售后风险最低的版本。
## 17. 关键决策结论
- 采用方案 A 是合理的
- 不建议直接用订单号做访问凭证
- 不建议前端继续保留“手输 CDK”的正式业务模式
- 不建议一开始就做全自动零确认绑定
- 建议先做订单编排层,再复用现有浏览器自动化执行层
- 建议优先做 SQLite 版本跑通链路
- 建议把 `/tx/browser` 保留为内部调试页,把 `/claim/:token` 做成正式业务入口
- 建议把运营后台作为正式模块纳入,而不是后补工具页
## 18. 下一步落地建议
下一步建议直接进入“阶段 1 实施设计”,输出更细的开发清单:
1. 数据库表结构 SQL
2. 后端目录和文件改造清单
3. API 请求和响应示例
4. 前台 `/claim/:token` 页面状态图
5. 后台 `/admin` 页面结构与接口契约
6. 任务状态机枚举定义
如果继续推进,我建议下一步先把:
- 表结构
- 后端 API 草案
- 前端 `/claim/:token` 页面接口契约
- 后台 `/admin` 核心接口契约
这三部分先定死,然后再开始编码。