dualrun_shim.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536
  1. package service
  2. import (
  3. "yuansiwei/unified-backend/internal/academic/money"
  4. )
  5. // ---------------------------------------------------------------------------
  6. // dual-run harness 专用出口(AC-15 阶段 1)
  7. // ---------------------------------------------------------------------------
  8. //
  9. // 存在理由:`computeRecordReward` / `distributeAmount` 是**包内私有**,
  10. // 而双跑 harness 位于 `internal/academic/dualrun`,无法直接调用。
  11. //
  12. // 为什么不让 harness 自己再写一份公式:那会变成"用我们自己的第二份实现去校验第一份",
  13. // 一旦两份都错、错法一致,双跑会给出全绿结论——这正是 P0 里反复出现的"自证"陷阱。
  14. // 因此 harness 必须调到**生产代码本体**,这两个函数只做转发,不含任何逻辑。
  15. //
  16. // 约束:**只允许 dualrun 调用**。生产链路请直接用包内私有函数;
  17. // 若将来需要在仓库外暴露课酬计算,应设计正式 API 而不是复用这里。
  18. // ---------------------------------------------------------------------------
  19. // ComputeRecordRewardForDualRun 转发到 computeRecordReward(纯函数,无 DB 依赖)。
  20. //
  21. // 入参:q 命中规则;income 收入(分);studentCount 上课人数;rewardType 结算方式。
  22. // 出参:单节课课酬(分);错误语义与 computeRecordReward 完全一致。
  23. func ComputeRecordRewardForDualRun(q *PayrollQuote, income money.Amount, studentCount int32, rewardType int8) (money.Amount, error) {
  24. return computeRecordReward(q, income, studentCount, rewardType)
  25. }
  26. // DistributeRecordRewardForDualRun 转发到 distributeAmount(纯函数)。
  27. //
  28. // 入参:total 单节课课酬合计;n 参与分摊的人数(= count(type∈{1,2}))。
  29. // 出参:逐行课酬(分),长度 = n,余数补首行。
  30. func DistributeRecordRewardForDualRun(total money.Amount, n int) []money.Amount {
  31. return distributeAmount(total, n)
  32. }