# 工作台与工资统计超时恢复(2026-10-15) ## 原因与范围 前端 `CloudFunctionsService.operations` 的 20 秒超时是截图错误的直接触发条件。线上实际请求仍返回成功:首次并发探测工作台 55.155 秒、工资收益统计 61.766 秒,数据没有消失。 两条路径共同调用工资来源、版本和截止核验。`ReviewRewardIncome` 原视图通过 `jsonb_populate_record(to_jsonb(...))` 逐条重建全部凭据,租户/月筛选不能提前下推;计划显示约 15.6 万条全表记录进入函数扫描。工资来源的高估成本还触发昂贵的 JIT 编译。对限定函数禁用 JIT、直接投影视图字段后,保持原有计薪口径和来源核验。 ## 发布 已在 2026-10-15 14:04:47(北京时间)发布 `scripts/sql/payroll-read-timeout-recovery.sql`: - 仅设置 `xs_payroll_sources`、`xs_payroll_source_version`、`xs_payroll_cutoff_snapshot` 的函数级 `jit=off`;没有修改全局数据库配置。 - 替换 `ReviewRewardIncome` 读取投影,保留所有列、顺序、类型及纠正逻辑。 - 没有更新工资凭据、工资批次、业务记录或网关函数;没有放宽前端超时。 - 正式来源 SQL 定义同步保留函数设置,后续重建函数不会丢失修复。 发布前备份实际线上定义,校验无运行中同步、线上定义未漂移;在同一可重复读事务内对比修改前后的收入投影摘要及来源版本,不一致即回滚。 156,057 条投影的排序摘要前后均为 `08d5547285eae9d3a7c75a0f342ece57`,来源版本前后均为 `10d46191d1e7a53e98ca3a6a72b7d656`。备份与原始验收响应保存在本机私有目录 `/Users/mac/.local/state/xiaoshu/cloud-releases/2026-10-15-admin-recovery/`,不入库。 ## 验证 - 工资完整性、截止核验、复习奖励回归 39 项通过;新增恢复迁移等价与重复执行测试 1 项通过。 - 发布后真实接口:工作台 15.117 秒、工资统计 14.220 秒;工作台指标/提醒及工资明细逐条与发布前一致。 - 10 月工资:28 位老师、219 节有效课次,带课工资 8,380 元、复习工资 1,278 元,总计 9,658 元。 - 本地管理端 `http://127.0.0.1:4300` 连接真实线上接口的浏览器验收:工作台 19.204 秒、工资页 18.165 秒显示真实统计和列表;无 JS 错误、无页面报错。截图保存在上述私有目录。 - 首次浏览器脚本等待了不存在的 `.metric-card` 选择器;修正为实际 `.overview-metrics` 后两个页面通过。 - 页面仍显示原有来源核验待处理提示(763 条差异)。该结算保护与本次读取故障不同,没有跳过核验或擅自发放工资。 这些是故障定位与恢复的小样本,不是交替 10 轮的 p75 性能结论;仍有约 14–19 秒等待,完整性能优化正在独立任务中处理。本次不提交该任务的查询、视图源文件等未完成改动。 ## 回滚 在受控事务中恢复私有 `sql-baseline.json` 的三个 `pg_get_functiondef` 定义,并以 `view.json` 中的原视图定义执行 `CREATE OR REPLACE VIEW`。只回滚定义,不撤销或删除任何凭据、防重约束和历史调整。回滚会重新带来已知超时,应以再次修复查询为优先。 ## 复现 ```sh node --test scripts/tests/payroll-integrity.test.mjs scripts/tests/payroll-cutoff.test.mjs scripts/tests/review-rewards.test.mjs scripts/tests/payroll-read-timeout-recovery.test.mjs ```