server/laf-cloud/functions/activityConfig/MIGRATION.md
2026-09-24 17:59:52 +08:00

45 lines
3.7 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.

# 两集合迁移说明
迁移目标为 `activityConfigs` 和 `goldMinerPlayerPeriods`。运行代码前应完成已有环境的数据迁移;仅上传新版代码会导致旧配置和未嵌入的资格不可见。
脚本:[migrate.cjs](migrate.cjs),由有数据库权限的维护人员在 **mongosh** 中执行,不是云函数,也不属于客户端接口。脚本默认只读预检,明确 apply=true 才写入,始终不删除旧集合、不修改 users 或 order。
## 迁移范围
| 来源 | 目标 |
| --- | --- |
| goldMinerConfigs / gold_miner_configs | activityConfigs,activityId=goldMiner 的版本记录 |
| goldMinerPeriods / gold_miner_periods | activityConfigs 的 control 记录,保留已冻结配置与停购开关 |
| cloudRiseConfig | activityConfigs,activityId=cloudRise 的版本记录 |
| goldMinerPlayerPeriods / gold_miner_player_periods | goldMinerPlayerPeriods,补齐合并后的字段 |
| goldMinerEntitlements / gold_miner_entitlements | 对应玩家期的 entitlement;未开期的 reserved 资格可以创建轻量玩家期记录 |
| goldMinerRewardGrants / gold_miner_reward_grants | 核对原 tasks 内的 grantId、奖励、发货状态,保持权威记录不变 |
| goldMinerSettlements / gold_miner_settlements | 玩家期的稳定 settlementId 和原展示确认时间 |
| goldMinerJobCursors / gold_miner_job_cursors | 不再使用,无需迁移;待处理记录按业务状态重新扫描 |
脚本保留玩家期 `_id`、grantId、settlementId、原 configSnapshot 和已领取状态。若旧奖励与玩家记录不一致、目标配置冲突或已解锁玩家缺少资格来源,预检直接失败,需要核对数据后再继续,不能用“未领取”覆盖历史已发记录。
百人赛旧配置版本命名为 `legacy:<periodId>`,将旧配置当作已经发布的版本,publishedAt 固定为 startsAt-1(这是兼容旧系统没有发布时间的迁移约定,不是历史审计时间);忽略旧 enabled/status,保留当前时间窗口、奖池和 durationHours,缺省时按原有默认值处理。已有 users.cloudRiseState 不修改。旧的“修改当前期配置”管理方式迁移后停止使用。
## 执行步骤
1. 备份相关集合,安排维护窗口,停止活动写入、支付回调处理和后台定时任务。确保支付平台回调后续能重试恢复。
2. 在 mongosh 中选中正确的目标数据库。修改下面脚本绝对路径,先预检:
```javascript
const { migrate } = require('C:/Users/NK/Desktop/workspace/server/laf-cloud/functions/activityConfig/migrate.cjs');
await migrate(db, { apply: false });
```
3. 预检返回 dryRun=true、记录数量和拟写入条数。核对环境、备份及结果后执行:
```javascript
await migrate(db, { apply: true });
```
4. 在仍然停止写入的维护窗口中重复预检,正常应返回 writes=0;若脚本中途故障,可以在同一窗口内重跑。不得在业务已经恢复、新记录继续变化后把旧集合再次覆盖迁入。
5. 部署公共模块和两个活动的新版函数。分别执行 `/goldMiner/admin`、`/cloudRise/cloudRiseAdmin` 的 setup_indexes;新版索引只建立在公共配置和玩家期集合以及原有业务集合,不创建被移除的集合。
6. 核对每种 activityId 的配置、玩家各期进度、原任务状态、下一期 reserved 资格、补发查询和原订单关联,再恢复入口、回调和每分钟任务。
迁移先完成全部源数据检查,再执行写入;写入阶段不是跨集合事务,因此必须停止并发写入。脚本会读取源集合进行核对,应先在测试库评估数据规模和执行资源。迁移完成前不要删除旧集合;本仓库不提供自动删表操作。