assignment-expiry.scheduler.ts
6.61 KB
-
feat: 批次归因走账本 + 到期可统计 + 批次人话名 · 9eeb29b9
主管四问引出的一组修复。 1) 归因失血(不报错的真 bug) followup_plans.assignment_id 会被下一次分配覆盖 —— 一条单退回/到期回池后 被后面的批次挑走,旧批次就少一个人。批次跑得越久缩得越厉害。 实测 c02e1b80 分过 9 条,重分后 planned 显示 0。与 supersededAt 那坑同构。 ⇒ plan_event_logs 加 assignment_id(不建明细表:账本本来就是明细, 缺的只是"属于哪一批"这个维度;该表自己写着"要按它筛就该立柱")。 四个写入点全覆盖;claim 刻意不写(自认领捞的是池子,plan 上那个 id 是陈迹)。 ⇒ planned/agents/released/expired 走账本,inHand/done 走当前状态。 ⇒ 补 progress.reassigned 让穷尽性重新成立(不补则主管一对数就少人)。 ⇒ 老批次回落到 followup_plans 现算;到期数无源可落,只能给 0。 2) 到期终于能统计 到期事件一直在账本里(auto_release + assignment_expired),但任何接口都没报, 全被 backToPool 一桶吞掉。而到期与退回主管的下一步动作相反: 退回多=分配策略不对,到期多=派多了/时效太紧。现在分开报,note 也分开说。 3) overdue 加 snoozed 守卫 回收器刻意跳过"约了下次回访"的单,于是它们永远超期;而 progress 已把它算作 suppressed(已处理)。不加守卫,同一条单「已处理」和「超期」同时成立 —— 主管看到「薛玫 超期 3」以为她压单,实际她打了电话约好了下次。 4) 批次人话名 label(服务端唯一生成) 「8/3 23:35 · 牙周治疗 · 窗口内 · 9 人 · 2 位客服」。没有列表页时这是主管 指认一批的唯一抓手。做这个才发现 temperature 一直没进 criteria 快照 —— 它参与圈人却没随确认单下发,导致批次说不清"当时按哪个温度圈的"。已补。 顺带修一个潜伏编译错误:assignmentExpiresAt 加进 FollowupPlanSchema 时漏了 serializePlan(19bd658f)。当时没报错是因为 packages/types/dist 是旧的。 实测(真库):新批次 9 人 → 撤销 → 同一批人重分 → 旧批次 planned 仍是 9 (旧实现下是 0)、五桶+重分 0+0+0+9=9;退回 1 条、到期 2 条(等回收器真扫) 分别落账,详情读出「客服主动退回 1 条、到期没人动 2 条」。 1005 tests,两个 tsc + next build 干净。luoqi committed