Эх сурвалжийг харах

docs(release): verify report typography rollout and production PDF exports

彭峰 5 цаг өмнө
parent
commit
25037500a5

+ 3 - 2
docs/qa/word-report-font-size-2026-11-15.json

@@ -1,6 +1,6 @@
 {
   "scope": "three word report variants on admin and mobile export components",
-  "deployed": false,
+  "deployed": true,
   "fontReference": "existing full report Chinese meaning, 18px",
   "wordFontSize": "inherit",
   "worksheetFontSize": "inherit",
@@ -152,5 +152,6 @@
   "independentReviewPassed": true,
   "productionDataAccessed": false,
   "financialCodeChanged": false,
-  "privateEvidenceDirectory": "/Users/mac/.local/state/xiaoshu/qa/2026-11-15-report-fonts"
+  "privateEvidenceDirectory": "/Users/mac/.local/state/xiaoshu/qa/2026-11-15-report-fonts",
+  "releaseRecord": "docs/qa/word-report-font-size-release-2026-11-15.md"
 }

+ 1 - 1
docs/qa/word-report-font-size-2026-11-15.md

@@ -20,4 +20,4 @@
 
 验证样例、临时组件挂载脚本及截图位于`/Users/mac/.local/state/xiaoshu/qa/2026-11-15-report-fonts/`。临时挂载脚本已移出源码,不加入常规测试。没有用截图重写页面,也没有用简化CSS替代真实组件CSS。样例数据仅用于排版验证,不等同于用户指定学员的正式报表或实体打印验收。
 
-**状态:本地修改与验证完成,待另行授权上线;本次不发布网页、不打包APP、不修改云函数或数据库。**
+**后续状态:已按用户追加授权发布到后台及学生/老师共用网页前端。上线验收见 [发布核对记录](word-report-font-size-release-2026-11-15.md)。未打包APP、未修改云函数或数据库。**

+ 333 - 0
docs/qa/word-report-font-size-release-2026-11-15.json

@@ -0,0 +1,333 @@
+{
+  "released": true,
+  "sourceCommit": "b8fe8b13111f86a97e479d6c7525f9a599617231",
+  "scope": "word report typography only, admin and shared teacher/student web frontend",
+  "sourcePlan": {
+    "admin": {
+      "base": "0c206db7d528749cb5b27a0f4fe81a54d3305f07",
+      "carry": [
+        "projects/xiaoshu-admin/src/app/cloud-functions.service.ts",
+        "projects/xiaoshu-admin/src/app/cloud-functions.service.spec.ts",
+        "projects/xiaoshu-admin/src/app/components/member-credit-account.component.ts",
+        "projects/xiaoshu-admin/src/app/components/member-enrollment.component.spec.ts"
+      ],
+      "patch": [
+        "projects/xiaoshu-admin/src/app/pages/operations-learning-reports.component.html",
+        "projects/xiaoshu-admin/src/app/pages/operations-learning-reports.component.scss"
+      ]
+    },
+    "mobile": {
+      "base": "86786f6cf2fc8ced0eb671695df2ea86aaa52126",
+      "carry": [],
+      "patch": [
+        "projects/xiaoshu-mobile/src/app/features/appointment/lesson-report-pdf.component.html",
+        "projects/xiaoshu-mobile/src/app/features/appointment/lesson-report-pdf.component.scss"
+      ]
+    }
+  },
+  "publicVerification": [
+    {
+      "role": "admin",
+      "releaseId": "admin-report-fonts-b8fe8b13111f-20261115T100515250Z",
+      "commit": "b8fe8b13111f86a97e479d6c7525f9a599617231",
+      "filesVerified": 96,
+      "routes": [
+        "admin/members",
+        "admin/learning-reports",
+        "admin/login",
+        "admin/payroll"
+      ]
+    },
+    {
+      "role": "mobile",
+      "releaseId": "mobile-report-fonts-b8fe8b13111f-20261115T100518307Z",
+      "commit": "b8fe8b13111f86a97e479d6c7525f9a599617231",
+      "filesVerified": 105,
+      "routes": [
+        "pages/home/index",
+        "pages/shop/baobiao",
+        "pages/his/his",
+        "pages/companion/index",
+        "pages/stu/stu_abc"
+      ]
+    }
+  ],
+  "cdn": [
+    {
+      "id": "8200436222",
+      "status": "task_done",
+      "processing": 0,
+      "succeed": 1,
+      "failed": 0,
+      "total": 1
+    },
+    {
+      "id": "8200444998",
+      "status": "task_done",
+      "processing": 0,
+      "succeed": 1,
+      "failed": 0,
+      "total": 1
+    }
+  ],
+  "browserVerification": {
+    "checkedAt": "2026-11-15T10:10:04.950Z",
+    "results": [
+      {
+        "role": "admin",
+        "measures": [
+          {
+            "variant": "full",
+            "tableFont": "18px",
+            "promptFont": "18px",
+            "promptWeight": "700",
+            "meaningFont": "18px",
+            "rows": 36,
+            "overflow": 0,
+            "breakInside": "avoid"
+          },
+          {
+            "variant": "english",
+            "tableFont": "18px",
+            "promptFont": "18px",
+            "promptWeight": "600",
+            "meaningFont": null,
+            "rows": 18,
+            "overflow": 0,
+            "breakInside": "avoid"
+          },
+          {
+            "variant": "chinese",
+            "tableFont": "18px",
+            "promptFont": "18px",
+            "promptWeight": "400",
+            "meaningFont": null,
+            "rows": 18,
+            "overflow": 0,
+            "breakInside": "avoid"
+          }
+        ],
+        "pdfs": 3,
+        "errors": [],
+        "blocked": [],
+        "operations": [
+          "ops/learning-reports/list",
+          "ops/live/versions",
+          "ops/learning-reports/detail",
+          "ops/learning-reports/export",
+          "ops/learning-reports/export",
+          "ops/learning-reports/export"
+        ]
+      },
+      {
+        "role": "teacher",
+        "measures": [
+          {
+            "variant": "full",
+            "tableFont": "18px",
+            "promptFont": "18px",
+            "promptWeight": "700",
+            "meaningFont": "18px",
+            "rows": 30,
+            "overflow": 0,
+            "breakInside": "avoid"
+          },
+          {
+            "variant": "english",
+            "tableFont": "18px",
+            "promptFont": "18px",
+            "promptWeight": "600",
+            "meaningFont": null,
+            "rows": 15,
+            "overflow": 0,
+            "breakInside": "avoid"
+          },
+          {
+            "variant": "chinese",
+            "tableFont": "18px",
+            "promptFont": "18px",
+            "promptWeight": "400",
+            "meaningFont": null,
+            "rows": 15,
+            "overflow": 0,
+            "breakInside": "avoid"
+          }
+        ],
+        "pdfs": 3,
+        "errors": [],
+        "blocked": [],
+        "operations": [
+          "app_lesson_report",
+          "app_lesson_study",
+          "app_lesson_report",
+          "e_record_detail"
+        ]
+      },
+      {
+        "role": "student",
+        "reportReadable": true,
+        "pdfDownloadAvailable": false,
+        "permissionUnchanged": true,
+        "errors": [],
+        "blocked": [],
+        "operations": [
+          "app_lesson_report",
+          "app_lesson_study"
+        ]
+      }
+    ],
+    "financialWritesSent": 0
+  },
+  "pdfVerification": {
+    "files": [
+      {
+        "id": "admin-chinese",
+        "pages": 2,
+        "bytes": 692985
+      },
+      {
+        "id": "admin-english",
+        "pages": 2,
+        "bytes": 423725
+      },
+      {
+        "id": "admin-full",
+        "pages": 3,
+        "bytes": 1181363
+      },
+      {
+        "id": "teacher-chinese",
+        "pages": 2,
+        "bytes": 538338
+      },
+      {
+        "id": "teacher-english",
+        "pages": 2,
+        "bytes": 396035
+      },
+      {
+        "id": "teacher-full",
+        "pages": 3,
+        "bytes": 1132657
+      }
+    ],
+    "renderedPages": 14,
+    "nonblankPages": 14,
+    "pageChecks": [
+      {
+        "page": "admin-chinese-page-1.png",
+        "inkRatio": 0.07039406779661017
+      },
+      {
+        "page": "admin-chinese-page-2.png",
+        "inkRatio": 0.043022598870056494
+      },
+      {
+        "page": "admin-english-page-1.png",
+        "inkRatio": 0.05175847457627119
+      },
+      {
+        "page": "admin-english-page-2.png",
+        "inkRatio": 0.020155367231638417
+      },
+      {
+        "page": "admin-full-page-1.png",
+        "inkRatio": 0.06384180790960452
+      },
+      {
+        "page": "admin-full-page-2.png",
+        "inkRatio": 0.07460310734463277
+      },
+      {
+        "page": "admin-full-page-3.png",
+        "inkRatio": 0.05331779661016949
+      },
+      {
+        "page": "teacher-chinese-page-1.png",
+        "inkRatio": 0.06855508474576272
+      },
+      {
+        "page": "teacher-chinese-page-2.png",
+        "inkRatio": 0.0213135593220339
+      },
+      {
+        "page": "teacher-english-page-1.png",
+        "inkRatio": 0.0557316384180791
+      },
+      {
+        "page": "teacher-english-page-2.png",
+        "inkRatio": 0.0148545197740113
+      },
+      {
+        "page": "teacher-full-page-1.png",
+        "inkRatio": 0.06476694915254237
+      },
+      {
+        "page": "teacher-full-page-2.png",
+        "inkRatio": 0.07252259887005649
+      },
+      {
+        "page": "teacher-full-page-3.png",
+        "inkRatio": 0.037063559322033895
+      }
+    ]
+  },
+  "financialVerification": {
+    "beforeAt": "2026-11-15T10:01:21.021Z",
+    "afterAt": "2026-11-15T10:10:40.459Z",
+    "studentBalances": {
+      "Purse": 5,
+      "UserExp": 0,
+      "UserPoint": 4.5,
+      "SilverCoin": 2
+    },
+    "storeBalances": {
+      "Purse": 4101,
+      "UserExp": 779,
+      "UserPoint": 3384,
+      "SilverCoin": 2784
+    },
+    "studentAndStoreUnchanged": true,
+    "creditOperations": 5,
+    "associatedTransactions": 31,
+    "reservations": 6,
+    "ledgerDigestsUnchanged": true,
+    "financialFunctionsUnchanged": true,
+    "profileUnchanged": true,
+    "recoveryReceiptsUnchanged": true
+  },
+  "finalReadback": {
+    "checkedAt": "2026-11-15T10:11:10.132Z",
+    "gateways": [
+      {
+        "path": "xiaoshu/ops/gateway",
+        "sha256": "e3b6500d30f319ffd11e787abae59fe795c9fe97b6e6a8c51d7031df64ab828c",
+        "updatedAt": "2026-11-15T09:32:27.359Z"
+      },
+      {
+        "path": "xiaoshu/ops/gateway-v3",
+        "sha256": "a72a7d180f7a645adfc805d74a3942a0f50285d4ef6aef34301fb220e86c29f8",
+        "updatedAt": "2026-11-15T09:32:27.359Z"
+      },
+      {
+        "path": "xiaoshu/app/gateway",
+        "sha256": "08c15a454075e7ccf27657b238469fd18fc83b6aa7860d960bd76bfeccc59323",
+        "updatedAt": "2026-11-15T05:37:48.842Z"
+      }
+    ],
+    "gatewaysUnchanged": true,
+    "reportWordsAndResultsUnchanged": true
+  },
+  "tests": {
+    "admin": 14,
+    "mobile": 12,
+    "failed": 0
+  },
+  "bothProductionBuildsPassed": true,
+  "independentReleaseReviewPassed": true,
+  "backendDeployed": false,
+  "databaseMigrationRun": false,
+  "appPackageCreated": false,
+  "studentPdfDownloadPermissionChanged": false,
+  "privateEvidenceDirectory": "/Users/mac/.local/state/xiaoshu/qa/2026-11-15-report-fonts-release"
+}

+ 65 - 0
docs/qa/word-report-font-size-release-2026-11-15.md

@@ -0,0 +1,65 @@
+# 三种单词报表字号生产发布及实际PDF验收
+
+2026-11-15,用户明确授权“把这次报表字号调整上线,后台和学生、老师端都同步,上线后再检查一下三种报表的预览和PDF”。候选代码b8fe8b13111f86a97e479d6c7525f9a599617231。
+
+## 已发布范围
+
+| 前端 | 版本 | 公网资源校验 | CDN任务 |
+|---|---|---:|---|
+| 管理后台 | admin-report-fonts-b8fe8b13111f-20261115T100515250Z | 96/96 | 8200436222,完成,失败0 |
+| 学生/老师共用H5 | mobile-report-fonts-b8fe8b13111f-20261115T100518307Z | 105/105 | 8200444998,完成,失败0 |
+
+- 管理端以上次真实发布的0c206db基线和4个a152延续文件隔离构建,仅新增本批报表HTML/SCSS两个文件;不包含其他未授权的课程栏时长等改动。
+- H5以当前学生首页统计版本86786f6为基线,仅变更lesson-report-pdf的HTML/SCSS两个文件。学生和老师使用同一网页发布包。
+- 独立审查逐文件验证源代码归档、覆盖文件与build-commit匹配。两端14项/12项报表测试和生产构建通过。
+- 两端同名资源的变化仅有index.html。先上传并核验新哈希资源,再切manifest/index,保留旧资源。源站与公网清单一致,9个深层入口及201个文件SHA-256一致,两次CDN刷新完成。
+- 不部署云函数、不运行数据库迁移、不重新执行任何课时恢复脚本;没有创建APP安装包。
+
+## 上线后的实际用户路径
+
+使用已存在且有效的真实会话,没有新登录或重置密码。所有验收云函数调用由白名单保护,禁止充值、扣回、开课、结课、反馈编辑等写入,仅允许报告读取/导出所需操作。
+
+| 路径 | 验收 |
+|---|---|
+| 后台截图对应的36词报表,编号839154386044433 | 完整/英文填中文/中文填英文三个预览切换后测量,实际分别下载3份PDF |
+| 真实老师的已完成课程,30词 | 默认选择3种格式,点击“下载3份PDF”,一次产生3个独立真实PDF文件;采集导出时真实打印DOM |
+| 同一课程的所属学生,390px视口 | 课堂报告及学习记录成功加载,无错误;仍没有独立PDF下载入口,原权限保持 |
+
+学生端原本只有课堂报告查看入口,三种PDF由老师或后台生成;本次没有扩大下载权限。所谓“学生/老师同步”指共用网页前端发布和报表文件样式同步,不宣称学生独立下载了三份文件,也不等于实体手机或微信WebView实机测试。
+
+三种报表的真实浏览器计算样式:
+
+| 变体 | 中文基准/正文 | 英文或题目 | 题目字重 |
+|---|---:|---:|---:|
+| 完整报表 | 18px | 18px | 英文保留700 |
+| 英文填中文 | 18px | 18px | 英文保留600 |
+| 中文填英文 | 18px | 18px | 中文400,不加粗 |
+
+六组实际打印DOM均无单元格水平溢出,保留break-inside:avoid。浏览器脚本异常0、被阻止的写请求0。第一次验收脚本在切换后过早读取DOM,出现一个变体延迟的测量;补充等待实际变体class完成并断言变体名后重跑验收,三种变体均准确通过。此为验收脚本时序修正,产品代码没有追加修改。
+
+## 实际下载文件核验
+
+不是使用本地样例替代上线验收。6份文件均从新公网前端的实际下载按钮生成:
+
+| 文件 | 页数 |
+|---|---:|
+| 后台完整报表 | 3 |
+| 后台英文填中文 | 2 |
+| 后台中文填英文 | 2 |
+| 老师完整报表 | 3 |
+| 老师英文填中文 | 2 |
+| 老师中文填英文 | 2 |
+
+全部14页经pdftoppm渲染,检查首页及续页的中英文大小、中文字重、长释义换行、表格边界、分页和尾页;没有发现溢出、文字截断或空白尾页。两个真实课程分别包含36词与30词。老师端保留三份独立PDF及未自动下载时的逐份保存链接。
+
+## 数据与费用回读
+
+- 两条运营网关与app/gateway的完整源码和updatedAt均与发布前相同。
+- 截图报表的36个单词、学习结果、学员/老师/预约关联及学习统计与发布前一致。
+- 田柏文1712及南昌总店73的发布前后只读快照完全一致:学员余额30分钟5、60分钟2、体验0、陪练4.5;门店库存分别4101、2784、779、3384。
+- 5笔会员业务单、31条相关交易、6条预留记录逐项一致;原更正回执仍仅两笔;四类课时表行数/摘要一致,四个课时业务SQL函数定义摘要一致。
+- 没有重复增减课时、库存或费用。
+
+原始会话、源站/函数备份、PDF、截图、原始账本及条件回滚入口仅保存在`/Users/mac/.local/state/xiaoshu/qa/2026-11-15-report-fonts-release/`。含真实学生资料的文件不进入Git。回滚按admin/mobile参数选择正确域名和存储桶,先检查当前候选入口,避免覆盖后续发布。
+
+**本批已上线,完成上述真实浏览器与PDF验收。** Git只同步本次发布记录;旧docs/migration、perf/local等未跟踪文件未纳入。