# 作废/过期线索的统计口径能否突破「列表可见范围」 Type: grilling Status: resolved Blocked by: ## Question 现有硬约束是「统计口径 = 列表口径」——`countStats` 与 `pageLeads` 复用同一套 `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_limit`**(`ClaimLimitChecker`):`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」那句。