review-pay-policy-2026-10-20.md 4.3 KB

复习工资按课时时长与实际完成身份计薪

2026-10-20,用户确认:30 分钟课对应复习工资 0.50 元/条,60 分钟课对应 1.00 元/条;学生账号自行完成复习不产生老师工资。仍需计划当天首次完成;逾期补做、重复提交不增加工资。

实现

  • scripts/sql/review-pay-policy.sql 在既有 review-rewards、lesson-records、payroll-integrity 迁移之后执行。发布时只应用本次增量,保存现网函数、视图、约束、相关工资及来源课次备份。
  • 使用服务端认证的账号识别实际完成者,学生本人优先识别为自习;会员即使保留历史分组 3 也不能被当作老师计薪。按现有任务行锁核对转交关系,保存 completedBy、completionRole、durationMinutes、rateVersion 快照。学生完成写入零元 self_study 凭据,仍保存复习进度;老师随后重试不能补记工资。
  • 时长沿学习记录关联至同一学员的唯一来源预约,优先读取排课时长快照;仅在缺失快照时使用已知旧课型 1→30、2/3→60。来源缺失、冲突或不支持的时长不能默认按 60 分钟计薪。
  • 历史导入仍只生成零元待核对凭据。管理员人工确认时按可验证课时时长计薪,并保留确认身份。既有原始收入凭据不改写。
  • 新增独立、不可改写的 ReviewRewardRateCorrection 保存历史 30 分钟工资差额;现有 ReviewRewardIncome 统一提供净收入,老师端、后台和工资入账都消费该净额。原有逾期纠正可以继续冲销剩余 0.50 元,不能重复扣除原 1 元。
  • 时长批量纠正仅允许明确选中的、未进入工资单的凭据;如出现工资单归属或来源变化,整笔事务拒绝,不自动修改已审核或已发放工资。

检查

  • 新增数据库回归 7 项:0.5/1 元、学生自习、身份与租户限制、幂等、日期边界、缺失来源、历史确认、差额纠正、工资净额、二次纠正和增量重跑。
  • 既有复习、转交、工资完整性及老师收入测试共 49 项通过。
  • 移动端页面集成 43 项、后台复习工资组件 6 项通过;双端生产构建通过,云函数定义静态校验通过。
  • 修改历史金额已获用户明确授权;2026-10-20 只读基线包含 179 条来源为 30 分钟且尚未进入工资单的 1 元凭据,计划差额 -89.50 元。旧完成记录没有保存实际完成账号,身份不明部分保留待核对,不能据此认定为学生自习或直接扣到零。

本机受保护的审计、备份及发布证据目录:/Users/mac/.local/state/xiaoshu/cloud-releases/2026-10-20-review-pay/。

生产发布与回读结果

  • 实现提交 f04326a58199a78e51f8eee7f8e3c9fdc3859215 已推送。执行前同步租约为空,6 个将被替换的现网 SQL 函数体与仓库基线相符;应用后逐函数体回读一致。
  • 使用生产数据库事务回滚验证:老师完成 30/60 分钟来源课次分别得到 0.50/1.00 元;学生完成均得到零元 self_study,老师随后重试仍为零;实际完成身份及时长快照正确。测试数据全部回滚。
  • 179 条历史 30 分钟凭据通过独立调整合计 -89.50 元,净额均为 0.50 元。全部 1,289 条原始已计薪凭据及既有工资单/明细回读未变。原已计薪总额 1,289.00 元,纠正后 1,199.50 元;后台真实接口确认汇总与半元明细一致。
  • 实际完成身份未记录的旧凭据另存为受保护清单 history-review-identity-pending.json,只标记待核对,不假定均为学生自习。时长纠正与身份核对分开留证。
  • 三个现网网关仅替换 reviewRewardPage 函数,保留其余现网定义差异,发布后 SHA-256 回读一致。
  • 移动端发布 mobile-f04326a58199-20261020T023454Z,106 个公网文件 SHA-256 与发布包一致,6 个无版本参数深路由通过;CDN 7933560586 已完成。
  • 管理端发布 admin-f04326a58199-20261020T023454Z,95 个公网文件及 4 个深路由通过;CDN 7933568042 已完成。
  • 手机/微信 WebView 的真人交互尚未实测;本次证据包括浏览器集成测试、生产数据库回滚验证、真实只读接口及公网资源校验。
  • 仅提交本次 11 个任务文件;既有 docs/migration/ 未跟踪历史记录和 perf/bench/__pycache__/ 保留在本地,未纳入提交。