# 月卡周期与器械课后评价联合发布 2026-10-18 按用户授权提交工作目录代码,执行两个需求的生产数据库迁移、服务端发布与质量核验。 ## 代码与构建 - 代码提交:`a3d58fa`(`feat: add monthly card periods and apparatus lesson feedback`)。包含月卡独立周期、提前启用、预约周期校验,以及 M、R、TT、Chair、ARC、SC、LB 选填课后评价。 - 完整服务端测试:34 个套件、545 项全部通过。shared/server 构建、小程序类型检查和微信小程序生产构建通过;`git diff --check` 通过。 - `pnpm lint` 因现有环境未安装脚本引用的 ESLint 无法执行;未因此修改项目依赖。 - 发布包 SHA-256:`7e3f6fe47409957c83f326684cb549336d7be75c0ae646827748ac9e682e8efd`,上传前后校验一致。 ## 迁移与服务切换 - 继续使用 `/usr/local/web/mp-pilates-server`、`/usr/local/web/mp-pilates-shared` 和 PM2 `mp-pilates-server`,沿用 Node 22.16.0、Prisma 5.22.0 及现有依赖、环境配置和支付证书。 - 发布前将器械评价迁移中的 PostgreSQL `JSONB` 改为 MySQL `JSON NULL`;两条迁移均已在生产库临时表上预演。 - 成功应用 `20261018090000_scheduled_membership_periods` 和 `20261018100000_lesson_apparatus_notes`。全部 15 个迁移完成,`prisma migrate status` 确认数据库为最新状态;另有一条旧迁移的历史回滚记录,未作修改。 - 月卡状态只在数据库枚举末尾追加 `SCHEDULED`;器械字段新增为可空 JSON。旧记录不重建,不批量清零或修改历史权益。 - 短暂停服后记录数据摘要、迁移、同步 server/shared、重新生成原生 Prisma Client 并重启服务。内网及公网 HTTPS 健康检查均为 200,PM2 在线且未发生异常重启;本次启动后进程错误日志未增长。运行目录与已校验发布包逐文件比较一致。 ## 数据与线上验证 - 切换前后按 ID 排序比较原始字段摘要:20 条会员卡、4 条教练笔记、7 条体测、155 条预约、203 条购卡订单、3 条商品订单、58 个用户和 6 个卡类型均保持一致;`.env` 摘要一致。新字段在 4 条旧笔记中均为 NULL。 - 58 项线上及真实 MySQL 检查通过,包括会员权益读取、原有评价内容与共享状态、私密评价隔离、匿名/会员/管理员权限、提前启用显式确认、周期归属、空评价与非法器械参数拦截。 - 隔离的可回滚集成事务验证:月卡 6 次与新购 10 次独立保存、连续购买排期、旧余额留存、余次未用完时拒绝提前启用、用完后完整周期提前生效与后续顺延、过期月卡可用余次为 0、次卡仍累加为 16 次、七项器械及单项无整体评价存取、私密/共享可见性。 - 所有集成测试写入均在事务中主动回滚,并核对未留下测试用户、卡类型、会员卡或评价。未发起真实支付、通知或修改真实会员权益。 ## 备份与回退 备份及核验资料仅存于生产服务器受限目录 `/usr/local/web/releases/combined-20261018-1792309575767/`: - `database-before.sql.gz`:完整数据库逻辑备份,gzip 完整性检查通过。 - `previous-build.tgz`、`prisma-client-before/`:切换前 server/shared、schema、迁移和 Prisma Client。 - `preflight.json`、`data-baseline-at-switch.json`、`data-verification.json`:迁移预演、原始数据摘要及逐表比较结果。 - `smoke-verification.json`、`health-after.json`:线上与回滚事务检查、健康检查结果,不保存访问令牌。 - `release.tgz`、`stage-clean/`、迁移和启动日志:本次运行文件及执行记录。 需要应用回退时,应停止服务并同时恢复旧 server/shared 和原 Prisma Client,再核对新增周期状态的读取兼容性;新增字段和枚举值应保留,不能删除上线后产生的新周期或器械评价。完整数据库恢复仅用于灾难恢复,不能覆盖上线后新增的真实业务数据。 本次完成数据库迁移和服务端发布,未上传或发布微信小程序。已发布的旧小程序不能自动获得新界面和新的本地续卡预览计算;需发布当前小程序构建,才能使用完整的独立周期展示、提前启用入口和器械评价编辑界面。微信真机键盘、支付和交互验收仍需在新版小程序中完成。