payroll-integrity.md 5.8 KB

工资结算事务与核对修复

计薪和接口

payroll-integrity.js 在运营网关最后加载,覆盖旧工资实现而保留原接口路径。旧系统上课接口只保留作独立核对用途,不再替代新库计薪来源。

  • xs_payroll_sources 读取 LessonRecord,关联预约和 CommonModel;LessonRecordFact 只补充新库没有的标准课次。作废记录不能因历史投影重新进入计薪。
  • 工资优先取完课快照、再取预约快照,零元有效;无快照的历史记录才按上课日期选择规则。工资月份、规则日期、导出日期采用北京时间。
  • 来源版本覆盖课次、分类映射、新旧工资规则。创建、重算、审核提交时重新检查版本;当前草稿参与重算,其他批次占用的来源排除。来源失效的既有课次保留异常,不能静默丢失。
  • xs_payroll_command 在帐套事务锁下执行创建、重算、审核、调整、排除与发放登记。请求编号、批次版本、明细、金额汇总与 SysLog 审计同事务处理。网络重试返回原结果。
  • 普通课次和抗遗忘凭据均有数据库有效计薪唯一约束;已审核和已发放批次锁定。异常未处理不能审核;发放方式与凭证编号必填。
  • 调整金额校验到分,固定老师、门店与结算月份,采用独立老师列表;无当月收入的老师也可以选择。
  • 工资规则同日修订新增不可变版本;旧课型单价兼容接口也不再覆盖旧行。新版本不修改预约或完课快照。
  • 经理可财务写入;员工、审计员只读;未知运营角色拒绝访问。财务写入失败或审计失败整体回滚。

页面与其他业务

  • 当月收入与批次结算应发分别展示,结算卡显示人工调整及补结金额。老师收入明细遵循当月收入口径,打开批次后展示该批次结算明细,导出沿用当前口径。
  • 导出统一门店、搜索、老师筛选范围,计薪、异常、已排除记录分表并附金额核对。排除原因可查看;金额不含已排除明细。
  • 抗遗忘导出使用固定创建时间边界和 objectId 游标,客户端验证总数及去重。首次完成 1 元、历史任务不自动补发等规则保持。
  • 工资批次完整分页;查询及明细响应有顺序保护;重置保留月份,清空门店、搜索、老师与抗遗忘记录类型。部分接口失败时显示具体区域,并说明保留旧结果。
  • 数据来源显示“新数据库”及北京时间,不再把新库结果标为缓存。历史课次的门店名称按保存的门店编号解析。
  • 历史预约预览为纯查询;补建使用账户事务锁并再次核对预约版本、规则与余额,预约、预留、审计原子写入。
  • 复习课课时退差额接入账户流水事务,扣除已退金额、同预约只退一次,预览展示已处理状态。
  • 课程映射新增“按学员核对语法写作”入口,逐预约确认小学/中学/高中及证据。保留此前 79 条确认结果,通用“阅读写作”不能全局映射为单一学段。旧预约状态清理不重做。

安装与发布

  1. 先安装 member-enrollment.sql、review-rewards.sql。
  2. 设置服务端 XIAOSHU_MASTER_KEY、XIAOSHU_COMPANY_ID 和私有 XIAOSHU_PAYROLL_REPORT_DIR;执行 npm run payroll:integrity:migrate -- --apply。
  3. 迁移先备份现有批次、明细、规则;数据库约束发现历史重复时整体失败,不能删除已结算数据来通过安装。
  4. node scripts/deploy-payroll-integrity.mjs 只补丁发布现有运营 V1、V3 和管理身份网关,保留其他任务的共享函数修改。发布前备份、检查 updatedAt,发布后核对源码 SHA-256。完整云函数部署同样会加载此模块。
  5. 发布管理端构建。后端上线不等于公网静态前端已发布。

PayrollCommand 和 PayrollReconciliation 是服务端内部事务表,不通过浏览器暴露直接写入入口。迁移脚本产生的真实业务清单和函数备份保存在私有目录,不提交 Git。

2026-09-09 验证结果

  • 工资事务回归 16 项通过;抗遗忘、课程映射和账户相关回归 39 项通过。
  • 管理端 186 项、移动端 92 项测试通过;两个生产构建和 11 个云函数定义校验通过。构建保留既有体积及 CommonJS 优化警告。
  • 生产数据库迁移完成,三个网关补丁部署后源码核对一致。
  • 线上读取 18,797 条标准完课来源:旧事实投影缺失 118 条,UTC 与北京时间月份不同 6 条。它们是待核对的来源差异,不等于应补发工资。
  • 迁移前真实工资批次和明细均为 0,因此不存在本次自动改写已审核或已发放工资单的情况;也没有自动补发历史抗遗忘工资。
  • 九月统计及导出均为 4 条课酬、90 元;抗遗忘列表含 78 条历史记录和 1 条异常,本月可计薪金额 0。课程/规则、老师列表、按学员映射、预留与退差额预览均返回成功。
  • 审计员读取成功、创建工资被 403 拒绝;未知角色读取被 403 拒绝。
  • 生产数据库回滚测试覆盖创建重试、调整重试、跨批次课次防重、异常审核拒绝、审核锁定、50 元发放登记及事务审计。全部测试写入已回滚,没有实际转账。
  • 独立 HTTP 请求并发验证覆盖同一调整请求只入账一次、过期版本拒绝、两个批次竞争同课次仅一个成功。隔离测试数据和临时访问均已清理。

本轮未进行真实老师工资审批或真实付款;独立连接的“双人同时审核同一批次”未作生产写入演练,审核锁定和异常拒绝有数据库回归与生产回滚测试证据。公网前端托管配置及凭据未找到,当前只确认本地管理端运行、构建可发布;不宣称公网前端已上线。