Parcourir la source

docs: record verified teacher earnings backend release

彭峰 il y a 10 heures
Parent
commit
da64d8f5ef

+ 3 - 3
docs/features/teacher-earnings-2026-10-15.md

@@ -1,6 +1,6 @@
 # 老师结课、复习和收入优化交付记录
 
-代码基线:`7bb38260e49e21dec0f466e4de713f868aa7b365`。目标网关版本:`2026-10-15-teacher-earnings-v12`。本轮完成源码与本地验收,尚未部署生产,也未修改任何线上历史工资。
+代码基线:`7bb38260e49e21dec0f466e4de713f868aa7b365`。目标网关版本:`2026-10-15-teacher-earnings-v12`。源码与本地验收完成后,已按用户授权发布兼容数据库迁移和三个后端网关;历史工资金额未修改。发布证据见 [后端发布记录](../qa/teacher-earnings-backend-release-2026-10-15.md)。前端生产静态文件未在本轮发布。
 
 ## 已实现
 
@@ -61,7 +61,7 @@ p75 查询阶段下降约 71%。这是本地 SQL 和序列化测量,排除了
 
 ## 收入字段兼容修正
 
-2026-10-15 再次只读检查,线上仍为 `2026-10-14-member-credit-v11`。旧版统计仅提供按课次数估算的 `t_yongji`,不能作为真实总收入。首页优先显示 `totalIncome`,或将有效的实际 `lessonIncome` 与 `reviewIncome` 按分合计;两者均不可用时明确显示“暂不可用”,不再只显示横线。真实金额仍依赖兼容数据库迁移与收入网关发布;当前执行环境未配置发布主密钥及管理员会话,未执行发布。
+2026-10-15 再次只读检查,线上仍为 `2026-10-14-member-credit-v11`。旧版统计仅提供按课次数估算的 `t_yongji`,不能作为真实总收入。首页优先显示 `totalIncome`,或将有效的实际 `lessonIncome` 与 `reviewIncome` 按分合计;两者均不可用时明确显示“暂不可用”,不再只显示横线。最初未加载发布凭据而暂停;随后按用户要求找到并验证已有私有发布配置,已完成兼容迁移与收入网关发布,真实收入接口回读和浏览器显隐验证通过。
 
 ## 线上只读核对
 
@@ -82,7 +82,7 @@ npm run teacher-earnings:audit -- --coach-id=实际编号 --from=YYYY-MM-DD --to
 
 ## 发布与回滚
 
-发布需确认本次提交版本,按计划另行执行。本轮没有运行以下写入步骤。
+以下为发布及回滚流程。本次已按用户明确授权执行数据库迁移与后端发布,具体范围、验证和备份见后端发布记录;前端静态文件与历史工资纠正不在本次发布范围内。
 
 1. 确认现网已具备 member-enrollment、mobile-teaching、lesson-study-batches、payroll-integrity 前置安装及 Parse 类。读取线上网关版本和发布文件哈希,确认同步任务空闲、既有索引和关键表结构。
 2. 在可信环境设置主密钥和现有经理会话。`npm run teacher-earnings:migrate` 只输出 SQL 哈希,不执行;审核哈希后使用 `--apply --backup-dir=/私有绝对路径`。脚本验证身份和活动同步任务,先保存一致性表数据、函数及列定义,再将四份兼容 SQL 作为单事务执行;失败回滚,成功回读函数和字段。临时函数限定操作者、15 分钟过期且 finally 清理。不要复用同一个备份目录覆盖上次备份。

+ 43 - 0
docs/qa/teacher-earnings-backend-release-2026-10-15.md

@@ -0,0 +1,43 @@
+# 老师收入与结课后端发布记录
+
+2026-10-15 12:12(北京时间)完成回读。用户明确授权查找既有凭据并发布后端;本次发布源码对应 `3ce6b39`,线上网关版本为 **2026-10-15-teacher-earnings-v12**。
+
+## 发布范围
+
+- 已发布 `xiaoshu.app.gateway`、`xiaoshu.ops.gateway`、`xiaoshu.ops.gateway.v3`,实际保存代码逐一与本地生成代码核对一致。
+- 已执行 `review-rewards.sql`、`lesson-workflow.sql`、`lesson-records.sql`、`payroll-integrity.sql` 的兼容迁移。去除文件外层事务边界后,四份 SQL 在同一数据库事务内执行,设置锁等待与执行超时,持有同步/工资事务锁并检查无有效同步租约。
+- 迁移回读:`feedbackStatus` 字段、`xs_review_complete_result`、`xs_review_reward_correct` 三项均存在;Parse 的报告字段也已登记。
+- 不执行历史工资纠正、补发或实际工资结算。本轮未发布前端生产静态文件。
+
+首页统计接口现在返回实际 `lessonIncome`、`reviewIncome`、`totalIncome`。旧兼容字段 `t_yongji` 同步返回实际总额,不再按课次数乘固定单价估算。
+
+## 备份与发布过程
+
+已有本机私有凭据经线上验证有效,身份为当前帐套 super-admin。没有把凭据写入仓库或报告。发布前确认活动同步与教学/工资写入均为 0,保存三个线上网关的原始代码、Parse schema、数据库函数定义、列信息、工资规则和相关数据。
+
+私有备份目录:`/Users/mac/.local/state/xiaoshu/cloud-releases/2026-10-15-teacher-earnings-v12/`,目录 0700、文件 0600。包含 `functions-before.json`、`schemas-before.json`、`database-before.json`、`migration/scoped-before.json`、最终迁移 SQL、发布回读、验证日志与截图。
+
+最初整表备份流程遇到服务端 503,尚未运行迁移或替换正式网关。核查恢复状态和临时入口后,改用受影响数据备份:待补防重字段记录、完整报告、工资批次和明细,以及复习工资全量计数/金额/逐行摘要;与之前保存的函数定义、列信息和规则共同构成本次迁移备份。它不是全库灾备。迁移前待补防重字段记录为 0。
+
+迁移后核对:**892 条工资明细及原工资批次完全一致,156,057 条历史复习凭据的数量、金额及除新增字段外的逐行摘要一致**。历史错计未自动改写。
+
+## 验证结果
+
+| 验证 | 结果 |
+| --- | --- |
+| 服务端测试 | 211 项通过,0 失败 |
+| 网关保存代码 | 三个网关逐字回读一致 |
+| 真实老师收入 | 3 个真实老师账号均返回数值总收入,总额等于两个收入分项之和 |
+| 单次收入查询时间 | 4,710 / 4,734 / 5,550 ms,仅三次抽测,不作为分位数或整体性能结论 |
+| 浏览器金额显隐 | 本地生产构建接入真实生产收入查询:默认隐藏,眼睛显示的金额与实时返回一致,再点隐藏;360 / 390px 无横向溢出 |
+| 线上隔离教学闭环 | 91 项通过;包含无反馈并发结课返回实际工资及待补状态、首页收入与课酬一致、首次补交反馈不重复记薪,及既有学习/报告/余额流程 |
+| 清理回读 | 本次测试账号 0、临时函数 0;测试业务数据已清理,正常审计轨迹保留 |
+| 最终公开版本 | `2026-10-15-teacher-earnings-v12`,包含 `app_review_complete` |
+
+浏览器验证中只有收入接口使用生产真实查询,其余接口隔离;它证明实际金额可显示,不代表真实微信 WebView 已验收。91 项隔离检查没有对真实客户结课、充值、扣课时或发薪。当天/逾期复习计薪与并发边界已有数据库自动测试,本次未在真实客户任务上完成复习。
+
+私有证据:`verification.json`、`income-readback.json`、`browser-income.json`、`smoke.log`、`final-check.json`。最终回读时间为 2026-10-15 12:12:41(北京时间)。
+
+## 回滚边界
+
+优先使用备份的兼容网关及相应前端回退;不得删除收入凭据、纠正凭据、防重约束或撤销数据库当天计薪守卫。数据库新增字段和函数保留。若需要回滚,先确认当前代码未被其他发布更新,再执行并重新核对版本、收入读取及写入规则。