Sfoglia il codice sorgente

docs: record legacy appointment deletion reconciliation

彭峰 6 ore fa
parent
commit
41f15544bf
1 ha cambiato i file con 39 aggiunte e 0 eliminazioni
  1. 39 0
      docs/qa/legacy-appointment-deletions-2026-11-02.md

+ 39 - 0
docs/qa/legacy-appointment-deletions-2026-11-02.md

@@ -0,0 +1,39 @@
+# 旧系统删除预约同步修复(2026-11-02)
+
+## 原因与规则
+
+直接同步原来只遍历旧系统仍在列表内的编号,并执行新增或字段更新。旧系统移除的预约不在列表中,因而从未进入同步计划,新系统原有预约会继续显示。
+
+本次增加独立的、仅超级管理员可调用的 `xiaoshu/sync/appointment-deletions-v1`。不修改原夜间同步的复习归属、奖励或财务规则。
+
+- 完整获取并校验旧系统 Model 54 预约编号及分页,服务端保存核对快照。空目录、缺页、重复编号或过期快照不作为删除证据。
+- 在新系统中仅查找来源明确的旧预约,逐批用旧系统实际支持的 `ids` 参数回查,并用一条已知存在的编号验证接口正常。旧接口错误不等于课程已删除,错误及不完整结果一律停止取消。
+- 对确认缺失且新系统未修改、未开始的旧预约,将 `CommonModel.status` 标为 `-2`。保留预约附表及原有业务字段,不物理删除课程、上课记录或财务数据。
+- 新系统新建或修改、课时预留、上课及计薪凭据、并发写入均受到保护;不能自动取消的情况写入 `LegacySyncConflict`,不覆盖新数据。
+- 使用同一教学写入锁,在事务内重新检查版本;结果和取消前状态写入 `LegacyDirectBatch`。响应丢失后的重试复用批次结果。
+
+`run-nightly-direct-sync.mjs` 在预约数据对账后自动执行删除核对,将取消及保留冲突纳入报告。已核验现有 LaunchAgent 指向此脚本,每天北京时间 23:00 执行。保留原复习同步能力标识,未更改 `settlementReady`。
+
+## 发布与本次补同步
+
+代码提交:`800d130`,已推送 `main`。新增网关已发布,原直接同步网关仅增加能力标识,线上原有代码保持。
+
+旧系统完整目录为 31,799 条、32 页。本次发现 358 条旧系统已移除、新系统仍发布的旧预约:
+
+| 结果 | 数量 | 处理 |
+| --- | --- | --- |
+| 可安全取消 | 51 | 已补同步为取消状态 |
+| 新系统排课、预留、上课或计薪凭据 | 207 | 保留并记录冲突 |
+| 新系统已有修改 | 100 | 保留并记录冲突 |
+
+本次执行编号:`bcd3a57c-6286-4be3-a403-33c2dbdafbb9`。数据库回读:51 条取消记录全部为 `status=-2`,仍处于正常发布状态的数量为 0;预约附表上课状态没有变化。其余 307 条不会因旧系统删除而自动覆盖新系统数据,仍需按冲突原因核对。
+
+## 验证及证据
+
+31 项相关测试通过,包括直接同步、旧复习拉取、删除确认、分页与接口失败、正向验证、恢复编号、并发修改、已完成课程、课时预留、批次重放和夜间任务接入。合并时保留了另一组复习同步修复;没有发布无关前端改动。
+
+线上新网关和能力标识回读通过。已验证旧接口 `content_list + modelId=54 + ids` 对存在编号返回对应课程、对不存在编号返回空集合;旧 `content_get` 的报错不参与删除判断。
+
+本机受限发布目录:`~/.local/state/xiaoshu/cloud-releases/2026-11-02-appointment-deletions/`,保存网关基线、部署计划、预览报告、执行报告及最终回读;原始业务数据与凭据不进入仓库。
+
+手动核对默认预览:`node scripts/reconcile-legacy-appointment-deletions.mjs`;需要执行时显式加 `--apply`,使用受保护环境中的同步管理员凭据。自动夜间任务使用已经授权的取消同步规则。