Skip to content

feat(accounts): 支持调度定时打开与关闭 - #516

Merged
ranxi2001 merged 2 commits into
productionfrom
feat/account-schedulable-timer
Oct 21, 2026
Merged

ranxi2001 merged 2 commits into
productionfrom
feat/account-schedulable-timer

Conversation

@ranxi2001

Copy link
Copy Markdown
Owner

feat(accounts): 支持允许调度的一次性定时打开与关闭

解决的问题与行为变化

账号管理原来只能立即切换允许调度。现在在原开关上方增加「定时打开」「定时关闭」:支持服务端接受保存后 8h/自填小时分钟,或指定 IANA 时区的日期与 HH:mm。日期留空会先展示下一次具体日期、时间与 UTC 偏移,确认后保存为一次性计划,DST 不存在/重复时刻拒绝。桌面与移动端共享入口、待执行日期/时区/倒计时、编辑取消、结果及中英文案。

每账号各保留一个打开和关闭计划,同动作版本替换,相反动作不能同瞬间。管理员立即切换前明确警告,并在后端同事务取消所有 pending;自动质量/cooldown 不冒充管理员意图。任务持久化 UTC + 原始时区,复用账号到期后台生命周期、账号快照及 scheduler outbox。

30 秒轮询而非秒级保证;关闭允许恢复后补执行,打开超过 15 分钟跳过。执行仅更新 schedulable,保留 disabled/到期/配额/限流/质量/IP ACL 等硬门槛,不动余额/账本/结算/支付。账号锁 + SKIP LOCKED + 版本复核 + 同账号时间顺序将计划取消/编辑/手动切换与执行串行化;状态、审计、outbox 同事务,数据库可写时最多三次执行尝试。

关联记录与来源

复现与验收

  1. 隔离管理页面选择账号,展开定时打开,选择 8 小时后,预览/保存后重载,待执行 UTC/当地时刻、时区和倒计时仍存在。
  2. 选择定时关闭、Asia/Shanghai、只填 08:00,核对并确认下一次的具体日期。允许与打开形成时段,拒绝同瞬间。验证过去明确日期、非法时区和 DST gap/fold。
  3. 编辑相同动作替换版本,另一个动作保留;取消单项;立即开关确认后两项 pending 全部取消。模拟执行与编辑/取消/手动关闭争用,旧版本不覆盖新意图。
  4. 模拟离线恢复、禁用/到期/软硬删除;过期打开跳过、关闭补执行;outbox 失败回滚并有限重试,记录操作者、计划时间、实际时间、状态和原因。

实际验证

检查 结果与边界
Go 核心 + 独立管理员 timer HTTP 子包 通过:Go 1.27.3,GOMAXPROCS=1 / 600 MiB / -p 1 / 数据盘缓存;核心含 PostgreSQL fixture 共 25 个顶层测试,HTTP 5 个顶层测试。
PostgreSQL fixture 通过:专用临时容器、每测试唯一 schema;8 worker、重启、取消/编辑真实竞争、顺序、失败重试、软硬删/禁用/到期、UTC+8、安全财务哨兵。未运行应用迁移或生产数据。
后台生命周期 通过:生产 expiry/provider 源文件的文件级隔离测试;不代表完整 service 包编译。
前端 新组件 6、立即/批量警告 3、locale 完整性 3、原账号页回归 5,分别通过;指定文件 ESLint 通过。
浏览器 真实 DataTable + 新组件 mock harness,桌面/375px 移动端无横向溢出,预览确认、保存、中英文通过;有前后截图,非完整应用 E2E。
RED 时间/SQL/组件空实现的断言失败证据及执行后开关校准 RED→GREEN 已留存。
diff/gofmt 通过,提交后工作树干净。
完整 vue-tsc 未通过:完整及一次缩小 include 的尝试均因共享类型依赖图触及 Node heap 中止,已停止重复;没有冒称通过。
全量 Go / 完整 frontend build / race / Wire 未运行:避免争用 #513/#515 大编译;后续 CI/父助手复核。
实际迁移、Redis 传播、完整路由中间件链 未运行;验证到最小 SQL fixtures、独立 HTTP、事务通知 hook 边界,仍需后续集成。

详细命令和日志在本地 /data/development/artifacts/sub2api-account-schedulable-timer-verification.md;截图为 artifacts 下 sub2api-account-timer-{desktop,mobile}-{before,after}.png,正式 PR 应由维护者上传附件,本正文不将本地路径冒充可公开链接。

兼容性与运行影响

  • 新增管理员 list/preview/save/cancel 四类 API,旧立即开关协议保留,但手动意图会取消 pending。新 API 明确拒绝观察员/普通用户,审计不含凭据,错误固定原因码不返数据库原文。
  • 新增不可变 forward-only 295_account_schedulable_timers.sql,只增加表/部分索引,不改 accounts schema、Ent 或 Wire。默认最长 366 天;所有实例可统一配置 ACCOUNT_SCHEDULABLE_TIMER_MAX_DAYS=1..3660。
  • 旧二进制忽略计划表,既不执行也不取消计划。回退前必须取消 pending 并停新 worker,保留审计,防止将来再升级执行旧计划;本轮未运行真实迁移或二进制回退。
  • 每轮有界 50 项,pending 时间索引和账号主键锁,不全表扫描账号。界面按可见账号每 30 秒刷新当前两项及最近 20 条记录;本轮没有容量/性能提升声明。
  • 没有生产访问、SSH、付费模型、支付或发送消息,没有合并/发布/部署。

文档与用户可见变化

新增 docs/account-schedulable-timers.md:时间语义、执行恢复、事务/多实例、API、配置、审计和回退限制。页面保留原立即开关;中英新增时间计划与警告文案。

Agent 使用声明

  • Agent 名称与参与范围:Codex,分析、实现、测试、文档、PR 正文;无子 Agent。
  • 模型名称:GPT-6(会话仅明确此名称,具体部署模型 ID 未公开)。
  • 推理强度:未知(运行上下文未公开配置,不推测具体档位)。

@ranxi2001
ranxi2001 marked this pull request as ready for review October 21, 2026 18:14
@ranxi2001
ranxi2001 merged commit 91020c1 into production Oct 21, 2026
18 checks passed
@ranxi2001 ranxi2001 mentioned this pull request Oct 21, 2026
6 tasks done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant