server/laf-cloud/百人赛生产发布清单.md
2026-09-24 17:59:52 +08:00

123 lines
12 KiB
Markdown
Raw Permalink 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.

# 百人赛生产发布清单
> 开期规则更新:登录和过关上报不再自动开期。升级已部署旧开期逻辑的环境时,先更新 `login`、`userLevel` 移除调用,再更新 `cloudRise/periods`,然后更新 `cloudRise/index`、`activityConfig/list` 并使用新版客户端。HomeScene 检查解锁门槛、无已开启活动及上期结束超过 12 小时后显式请求开期;首次参与免冷却。此说明替代下文历史检查中的“登录开期”,并不扩展黄金矿工的发布范围。
检查日期:2026-09-23。用户补拉线上代码后,重新以 **`main@8ab07ab`(更新N个复活礼包)** 为基线;检查对象为 `local@03d7b5f` 加本次登录兼容修正。旧基线 `0b9a0b9` 的结论由本次复查更新。未连接生产数据库,未部署、未 push。
## 1. 发布结论
本次只上线百人赛:**新增 8 个云函数/内部模块,更新 1 个已有函数 `login`,准备 3 个集合**。按下表逐个发布 `.ts` 及对应 `.yaml`,不要整仓同步。
新版每日/周任务不在本次发布范围;`login` 继续沿用 main 的旧版四项任务刷新。黄金矿工已从本次必发的 `login`、`activityConfig/list` 移除运行依赖。其他文件中的黄金矿工实现仍保留,不能整目录部署后当作已经全局关闭。
### 更新 main 后发现的差异
新 main 比旧基线修改了 `login` 和 5 个支付函数。发布范围和集合数量不变,但旧 local 的 `login` 缺少线上新增的 `reborn_Gift_2~5` 补单处理,以及所有五档复活礼包支付确认后的 `state=1` 标记。直接覆盖会回退线上行为;本次已将 main 的这两段逻辑补入 local,保留百人赛接入和黄金矿工屏蔽。
5 个支付函数为 `wx/KeFuInfo`、`wx/getOrderReward`、`wx/iosgetPayInfo`、`wx/iosorderPaySig`、`wx/orderPaySig`。新 main 包含五档定价、订单归属/支付状态校验、客户端确认发奖兼容及重复导入清理。它们不在百人赛发布清单内,保持线上新版 main;**不要用当前 local 的支付文件覆盖,否则会回退这些更新**。本次没有合并整条 main 分支,也没有改动这些支付文件。
## 2. 精确函数清单与顺序
下列路径相对 `laf-cloud/functions/`;实际云函数名称以 YAML `name` 为准。
| 顺序 | 云函数名称(同名 .ts + .yaml) | 类型 / HTTP 方法 | 本次作用 |
| --- | --- | --- | --- |
| 1 | `activityConfig/store` | 新增内部模块,`methods: []` | 公共活动配置版本、开关与索引 |
| 1 | `cloudRise/stats` | 新增内部模块,`methods: []` | 关卡统计数据,供对手模拟使用 |
| 1 | `cloudRise/rules` | 新增内部模块,`methods: []` | 三阶段匹配、胜负、超时规则 |
| 1 | `cloudRise/analytics` | 新增内部模块,`methods: []` | 数数埋点与失败重试 |
| 2 | `cloudRise/periods` | 新增内部模块,`methods: []` | 登录建立个人活动期与配置快照 |
| 3 | `cloudRise/index` | 新增玩家接口,POST | 匹配、开局、结算、状态和奖励回执 |
| 4 | `cloudRise/admin` | 新增管理接口,POST | 初始化索引、发布配置;校验 `ADMIN_TOKEN` |
| 4 | `activityConfig/list` | 新增日程接口,GET / POST | 只返回已登录玩家的个人百人赛期 |
| 5 | `login` | 更新已有函数,保持 GET / POST | 登录开期,隐藏完整百人赛存档,屏蔽黄金矿工接入 |
`cloudRise/index`、`activityConfig/list` 与当前客户端实际请求路径一致。不要使用旧文档中的 `cloudRise/cloudRise`、`cloudRise/cloudRiseAdmin` 等名称。
现有依赖 `Utils`、`jungleConfig`、`wucaiMigration` 已与 main 对比,源码无差异,保持线上版本。`userCoin`、`jungleTreasure` 也与 main 完全一致,**无需重复发布**。统计 JSON 已内嵌在 `cloudRise/stats.ts` 中,`data/`、`tools/`、`tests/`、README、配置示例均不是云函数。
新 main 已包含 `login` 的 `miniProgramWelfare` 字段初始化和缺省返回,因此它不再是本次相对线上的增量;福利领取接口仍未包含在本次发布中。
## 3. 集合与索引
首次上线创建以下集合;如已存在则复用,不清空数据。
| 集合 | 数据与写入时机 | 是否需要预填 |
| --- | --- | --- |
| `activityConfigs` | 公共版本配置,百人赛使用 `activityId: "cloudRise"`、`recordType: "version"` | 需要发布一条有效百人赛模板,推荐调用 admin 的 `save` |
| `cloudRiseSamples` | 每个玩家每期最多一条文档,`samples` 数组内最多三个已结算阶段,`_id = runId` | 不需要;空集合可使用内置统计冷启动 |
| `cloudRiseRuns` | 整轮完成、失败、超时后的精简归档,不存对手数组 | 不需要 |
复用已有 `users`:增加 `cloudRisePeriod` 对象、`cloudRiseState` JSON 字符串;奖励余额仍保存在 `coinAmount`,不创建个人期集合、奖励集合或埋点集合。埋点待重试记录保存在活动存档中。已有 `order`、`idcount`、`ab_config` 等仍由原登录逻辑使用,无需为本次新建。
在 `POST /cloudRise/admin` 执行:
```json
{ "action": "setup_indexes", "adminToken": "<ADMIN_TOKEN 的值>" }
```
该操作会调用以下 9 项索引创建;只有返回 `code: 1` 才算完成。
| 集合 | 索引 | 附加约束 |
| --- | --- | --- |
| `users` | `{ taskTime: 1 }` | 匹配资料池查询使用,不是启用每日任务 |
| `users` | `{ onlyId: 1 }` | unique;部分条件 `onlyId: { $type: "number" }` |
| `activityConfigs` | `{ activityId: 1, configVersion: 1 }` | unique;部分条件 `recordType: "version"`;名称 `activity_config_version` |
| `activityConfigs` | `{ activityId: 1, recordType: 1, status: 1, effectiveFrom: -1, publishedAt: -1 }` | 普通索引 |
| `activityConfigs` | `{ activityId: 1, "config.periodId": 1, publishedAt: -1 }` | 普通索引 |
| `cloudRiseSamples` | `{ "samples.stage": 1, "samples.start_level": 1, "samples.success_num": 1 }` | 阶段样本数组 |
| `cloudRiseSamples` | `{ uid: 1, periodId: 1 }` | unique;部分条件 `schemaVersion: 2`;名称 `cloudRiseSamples_uid_period` |
| `cloudRiseRuns` | `{ uid: 1, periodId: 1 }` | 普通索引 |
上线前检查 `users.onlyId` 数字值没有重复,否则唯一索引会失败;不要为使索引通过而直接删除用户。配置、活动状态和样本由服务端维护,不给客户端直写权限。
main 中不存在百人赛模块,按本次首次上线场景无需运行配置迁移、旧样本迁移或历史归档精简。如果生产曾有 main 之外的人工部署记录,应先核对存量再决定,不能直接运行同时处理黄金矿工的 `activityConfig/migrate.cjs`。
**本次不创建 `goldMinerPlayerPeriods`,也不创建任何每日/周任务相关集合。**
## 4. 暂不发布的内容
| 内容 | 本次处理 |
| --- | --- |
| `goldMiner/` 全目录,包括配置、支付、管理、测试期、任务与网页 | 不发布,不设置 `goldMiner/trigger.json` 定时器,不发布黄金矿工配置 |
| `userLevel` | 相对 main 的黄金矿工进度接入不发布;保留线上 main |
| `wx/orderPaySig`、`wx/iosorderPaySig`、`wx/KeFuInfo`、`wx/checkIos`、`wx/payCallBack`、`wx/getPayInfo`、`wx/iosgetPayInfo`、`wx/getOrderReward` | 均不属于百人赛依赖,保持线上 main,避免引入黄金矿工支付分支 |
| `dayTaskInfo`、`getTaskReward`、`dailyTaskService`、`dailyTaskConfig`、`dailyTaskDebug` 及每日/周任务配置 | 不发布、不迁移任务数据;这些源码与 main 无新增差异,不代表仓库内所有 V2 接口源码已关闭 |
| `miniProgramWelfare` | main 之后的独立功能增量,本次不发布 |
| `rechargeStats` 及 `recharge-stats.trigger.json` | main 之后的独立统计增量,本次不发布、不新增定时器 |
本次实际隔离改动:
- `login` 不再静态导入黄金矿工支付模块,不执行黄金矿工查单或补发;遇到该类订单保留原记录并跳过通用商品补发,避免误发或误删。
- `activityConfig/list` 不再导入或查询黄金矿工;测试期开关、黄金矿工配置和历史数据都不能使其在此列表中出现。
- 新版每日/周任务的登录调用原本已注释,继续保持;旧版每日任务仍正常刷新。
上次检查时未提交的 `goldMiner/payment.ts` 测试商品校验、`wx/payCallBack.ts` 的 `pay_test` 分流,已由用户提交为 `03d7b5f`。本次仍不改动,也不纳入发布清单。
## 5. 配置、上线验收与暂停
1. 按函数顺序发布,并在启用百人赛模板前完成集合和索引准备。此活动不需要新增定时任务。
2. 管理密钥实际读取 **`ADMIN_TOKEN`**,不是旧文档中的 `CLOUD_RISE_ADMIN_TOKEN`。复用已有值或在服务端设置,不下发客户端。
3. 保留线上登录变量:`WX_MINIGAME_APP_ID`、`WX_MINIGAME_APP_SECRET`、`IDCOUNT_NAME`,确认计数器记录存在;保留原有 iOS 补单使用的商户配置和私钥。百人赛本身不增加支付依赖。
4. 正式环境 `PAYMENT_APP_ENV` 应为 `production` 或保持未设置的生产默认行为,不用 `test`;正式模板 `durationHours` 必须为正整数小时。现有依赖 `thinkingdata-node` 需支持 `trackFirst/flush/close`,登录继续依赖 `ip2region`。实际生产安装状态需在控制台确认。
5. 对 `cloudRise/admin` 发送 `save`,参考 `functions/cloudRise/cloudRise-config.publish.example.json`:替换 adminToken、configVersion、periodId、startsAt、endsAt,核对正式门槛、时长和三个奖池。示例不是自动发布的生产配置;`startsAt` 必须晚于实际保存时间,版本标识不可覆盖。`enabled: true` 在请求顶层,不放进 config。
6. 模板生效后成功登录才创建个人期。`endsAt` 不会让模板自动停止以后登录的新开期;个人结束时间是登录开期时间加 durationHours。停止新开期时,将最新已生效版本记录的外层 `enabled` 设为 `false`,不要删除模板。已有个人期、挑战和待保存奖励继续有效;这是暂停新开期,不是立即清空所有活动。
7. 匹配资料池按用户确认保留 **超过 2 个自然月未活跃** 的现有规则:`users.onlyId != 当前玩家`、`0 < taskTime < inactiveBefore(now)`。没有符合条件的玩家资料时匹配会失败;`cloudRiseSamples` 可以为空,用户头像昵称资料池不可为空。旧客户端 PRD 中“三个月”的文字应以本次确认为准。
8. 达到门槛的专用账号执行:登录 → 携带 `users.onlyId` 和 token 查 `activityConfig/list` → `cloudRise/index` 的 status → prepare_match → cancel_match → 重新 prepare_match/confirm_match → begin/finish → save_reward → 下一阶段。检查仅有百人赛入口、99 个对手、同一期截止时间不延长、重复奖励上报不重复入账、失败/到期/三阶段完成后列表隐藏、下次登录才重新开期。
9. 检查普通登录和普通订单补发保持正常;确认没有黄金矿工查询、订单创建或定时器被新增。核对样本、归档、金币余额和真实埋点。匿名活动列表为空是预期行为,不能用空请求判断百人赛配置是否正常。
## 6. 本地验证
以下回归覆盖百人赛状态与奖励、并发和重试、配置与索引、数数发送、个人期、活动列表隔离、登录隔离、当前客户端联动,以及本次新增的五档 iOS 复活礼包补单兼容验证:
重新验证结果:**140/140 通过,0 跳过**。新增用例先在修正前复现五档补单失败,再在补齐 main 逻辑后全部通过;同时确认黄金矿工订单不进入旧 iOS 商户补单。
```powershell
node --test --test-reporter=spec laf-cloud/functions/cloudRise/tests/cloud-rise.test.mjs laf-cloud/functions/cloudRise/tests/analytics.test.mjs laf-cloud/functions/activityConfig/tests/list.test.mjs laf-cloud/tests/login-cat-arr.test.mjs laf-cloud/tests/login-wucai-state.test.mjs laf-cloud/tests/login-ios-reborn.test.mjs
node laf-cloud/functions/cloudRise/tools/generate-cloud-rise-stats.mjs --check
```
统计数据与 `stats.ts` 校验通过;9 个发布函数及递归依赖的 TypeScript 语法、YAML 名称和依赖边界检查通过,无黄金矿工或新版每日任务 import。检查中已修正旧管理密钥测试名、统计生成器的旧路径、客户端测试漏加载 apiBaseUrl,以及与现有 2 个月资料池、main 的 users 登录路由不一致的旧断言;未更改这些业务规则。
这些是本地模拟及客户端源码联动测试,不证明生产集合、索引、环境变量或函数已经部署。仍须完成上述生产环境检查和专用账号冒烟。