# 邀请活动后台交接

已复用 Payload 3.90.2 增加 `referral-campaign` global：默认关闭，管理员编辑／保存版本草稿，再点击“发布邀请活动”。页面隐藏独立的Payload文档发布按钮，仅保留正式活动发布入口，避免误以为保存文档已改变用户规则。只读运营人员可查看，不能编辑或发布。没有启用线上活动。

## 表单与发布

活动 UUID 和 core 实际支持的11项规则均可配置：不同集数、有效观看秒数、短集比例、最高倍速、完成窗口、奖励播放次数、奖励有效期、每日／每月邀请上限、奖励余额上限及审核方式。没有预填“3集”“10次”等奖励建议值。规则范围在表单中辅助填写；交叉约束和当前基础 App 额度可达性继续由已有 `publishReferralCampaign` 统一校验。

保存草稿或 Payload 文档版本不会修改 core 活动。`POST /api/globals/referral-campaign/publish` 只接受操作编号和发布说明；服务端重新读取当前管理员角色，活动参数取已保存的草稿。请求内的 authority、actor 或 input 不能取得发布权限。

## 结果与权限边界

- 发布优先读取 `referral_command` 的原 request，严格匹配 `campaign_published`、实际管理员和说明。响应丢失后草稿发生变化，仍返回首次收据。
- 并发请求在读取草稿后先后提交，发生 `operation_mismatch` 时只恢复同一操作已经记录的请求，不重新发布另一版本。
- 按管理员和站点使用独立的邀请 `sessionStorage` 命名空间保存结果未定的 UUID／说明；刷新后可显式重试。额度的待恢复记录不受影响。
- 401／403 保留原操作，确定的400／409清除；角色撤销立即拒绝发布。数据库校验暂时失败返回503，不泄露内部错误。
- 未保存表单不能发布；旧页面或旧账号的迟到成功不能确认或清除新账号的操作。畸形200、无效规则回执和无效JSON不能被显示为成功。
- 关闭活动的有效收据包含 `enabled:false`、空活动UUID和空规则；旧政策版本继续保留，既有邀请承诺仍由 core 处理。

[后台接口独立复审](dramivio-invitation-admin-review.md)补充6组真实PG/Payload验证，通过实际注销会话、撤权、跨站请求、原请求恢复和并发发布检查；未发现可实证P1/P2。

## 验证与文件

2026-10-03 全后台 **27/27** 测试通过（包含既有16项、新增11项），差异格式检查通过。新增测试包括9个实际 PostgreSQL／Payload REST场景，以及控件渲染和恢复输入校验；覆盖默认关闭、草稿隔离、实际权限、跨站请求拒绝、首份收据重放、并发恢复、规则错误、撤权、命令身份不匹配、数据库中断恢复和关闭收据。

独立子 Agent 执行 **25个真实 React DOM／Chrome／Payload ModifiedContext 场景**，没有剩余可实证阻塞问题；认证与HTTP使用本地协议模型。此证据不替代生产 Next 后台的真实浏览器联调，主 Agent 已通过实际Next生产构建、官方迁移、真实PG/Chrome15项联调，其中邀请6项，覆盖默认关闭、规则发布、未保存拦截、失联/畸形回执刷新恢复及关闭保旧版本。

迁移由 Payload 官方 `createMigration` 生成，`20261003_071050_referral_campaign.js` 与 schema snapshot 均保留，已在独立 RAM PostgreSQL 执行；官方 `generateImportMap` 已生成新控件注册。没有 schema push，没有连接生产数据库，没有启动新线上服务。

修改范围：`services/admin/src/config.mjs` 新global和发布wrapper，新增 `src/referral-policy.mjs`、`src/components/PublishReferral.jsx`、`tests/referral-policy.test.mjs`，官方迁移／index／importMap，以及后台README。既有额度控件与 platform 领域代码没有修改。

本轮只接邀请配置与发布。资格证据签发、安装认证、发奖作业、人工审核及申诉结案界面仍需分别接入；选择“低风险自动审核”不代表这些运行能力已经上线。
