You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

3.8 KiB

作废/过期线索的统计口径能否突破「列表可见范围」

Type: grilling Status: resolved Blocked by:

Question

现有硬约束是「统计口径 = 列表口径」——countStatspageLeads 复用同一套 applyViewFilters。但新需求要 我的线索 / 我的关注 统计「线索作废(7)」,而 CONTEXT 明确:作废时清空 owner_user_id。于是:

  • MY_LEAD 视图过滤 = owner_user_id = 当前用户 → 作废线索没有 owner,列表里根本看不到,按现有口径统计恒为 0。
  • 过期失效(6) 保留领取人,无此问题。

需要决策:

  1. 我的线索 的「线索作废」到底数什么?
    • (a) 现有列表口径,恒 0(等于不做,需求作废);
    • (b) 用「历史归属」维度——曾被我领取过、现已作废的线索(需要一个不同于 owner 的归属来源,如 lead_history 或某冗余字段);
    • (c) 改作废语义,作废时保留 owner(与 CONTEXT 决策冲突,需评估回收/激活流程影响)。
  2. 一旦某张卡片的口径突破了列表可见范围,「统计口径 = 列表口径」这条硬约束是否整体放弃?还是仅对作废这一张卡片开特例?
  3. 我的关注 视图(id IN lead_follow)不看 owner,作废线索若还在关注表里就可见——它的作废口径与 我的线索 是否一致?

这是全图的根决策,DTO 字段形态、每视图口径表、前端契约都等它。

Answer

结论(在路线上 resolve,非踢出 scope):作废态改为「保留 owner_user_id」;名额与可转商机目录不受影响。用户选 (i)——把这个状态机小改纳入本图,目的地随之扩容。

核实到的事实(代码 + CONTEXT + PRD 三方一致的现状):

  • LeadTransitionImpl#applyFeedback(line 211):反馈=无效自动作废时清空 owner_user_id(置 null);原持有人只留在 lead_history VOID 记录 detail。释放(86)/ 超时回收(268)也清 owner,但那是「退回公海」场景,非作废。
  • 作废态可被管理员重新分配给新销售(边 #15,作废自环,写入新 owner)。
  • PRD §3.4(2026-08-13 定稿)+ 边 #14 + grill G1 明文:「作废清 owner」。

用户诉求经逐层澄清(第 2/4/5 问)收敛为一个精准的语义解耦,而非「重构归属语义」:

  • 作废后线索归属仍属当前销售(不清 owner)→ 销售能在「我的线索」看到、回看自己作废的线索;
  • 作废线索不占持有上限名额

关键核实(推翻了「牵动四条链路」的初判):

  • 持有上限 hold_limitClaimLimitChecker):COUNT WHERE owner=? AND pool=? AND status IN (3,4) —— 只数已领取/跟进中,靠 status 排除作废,不靠 owner=null。→ 作废保留 owner 不会占名额。
  • 每日领取上限:按 claim_time,与 owner 空否无关。
  • 可转商机目录ConvertibleLeadCatalogPort):owner=? AND status IN (3,4),同样按 status 卡,作废自动排除。
  • 结论:清 owner 对「名额/可转商机」是多余的(它们本就用 status 精确排除作废);清 owner 唯一真正的副作用就是让作废线索从「我的线索」消失 —— 而那正是不想要的。

决定(用户选 i):作废分支保留 owner_user_id,在本图内做掉。目的地扩为「作废保留 owner 的状态机小改 + stats 改版 spec」。

残留待核实(graduate 为新 ticket 04):作废保留 owner 后,(a) 回收 N / 激活恢复读 owner 是否出错;(b) @DataScope 是否因作废 owner=me 改变别的视图权限判定;(c) 边 #15「作废自环换 owner」逻辑是否仍自洽;(d) PRD §3.4 / CONTEXT 需改「进入时清空 owner」那句。