# 线索规则(crm-rule) 线索公海池的配置域:公海池实体(归属部门 + 省/市/区)、人员(负责人 / 协作人 / 成员)、领取规则、超时回收 / 失效 / 领取上限配置。依赖方向单向 `crm-rule → (crm-auth / crm-dict)`,**不得反向依赖 `crm-lead`**——公海池不知道线索存在。公海池表复用 `lead` 数据范围模块(决策 [K])。 ## Language **公海池**: 线索的归集容器与规则载体,`crm-rule` 的核心聚合根,存于 `lead_pool`。定义一个部门下线索的领取规则(回收天数 / 失效天数 / 持有上限 / 每日领取上限)与人员编制。**一部门一池**,`UNIQUE(dept_id)`;池名全局 `UNIQUE`。 _Avoid_: 线索池、公海、资源池、pool(英文单说) **归属部门**: 公海池所属的部门节点,`dept_id`,是「一部门一池」的唯一键。同时冗余 `team_dept_id`(团队 = 部门树上级节点)。归属部门决定池及池内线索的数据范围天花板。 _Avoid_: 所属部门、部门、团队部门 **负责市场**: 公海池覆盖的行政区划,多值——省份多值表 + 市/区多值表两张关联表。存国标 code(`varchar(12)`,支持前缀 LIKE 祖先查询,对齐 `sys_region`)。同一部门的多个市场取并集在**同一个**池里(一部门一池),不拆多池。 _Avoid_: 覆盖区域、地区、辖区 **负责人**: 公海池的主管理人,池-人绑定表中 `role=OWNER`。被设为负责人会落一条池维度的行级授权(`resource_type=pool`),使其能越过部门天花板看到池内线索。**负责人身份不授予池配置写权**(决策 [E])——改池配置走功能权限 × 数据范围。 _Avoid_: 池主、管理员、owner(owner 在 crm-lead 是领取人) **协作人**: 公海池的协助管理人,池-人绑定表中 `role=COLLAB`。与负责人一样落池维度行级授权(只读,越过部门天花板看池内线索)。移出协作人名单那一刻即失效,授权行硬删(决策 [PRD-3])。 _Avoid_: 协助人、副负责人、collaborator **成员**: 有资格领取该池线索的销售集合。**动态推导、不落表**——成员 = 归属部门的部门子树内全部用户,按组织架构实时算。不是池-人绑定表里的行(绑定表只存 OWNER / COLLAB)。 _Avoid_: 池成员表、领取人白名单、参与者 **回收天数**: 池配置字段 `recycle_days`,喂给线索的回收计时 N。DB DEFAULT = 7。 _Avoid_: 超时天数、N、recycle **失效天数**: 池配置字段 `expire_days`,喂给线索的失效计时 M。DB DEFAULT = 180。 _Avoid_: 有效期、M、expire **持有上限**: 池配置字段 `hold_limit`,单个销售在本池最多同时持有的线索数。只算「已领取 + 跟进中」,不含已转商机 / 过期失效 / 作废。DB DEFAULT = 200。 _Avoid_: 最大持有、上限、hold **每日领取上限**: 池配置字段 `daily_claim_limit`,单个销售每个自然日(`DATE(op_time) = CURRENT_DATE`)在本池最多领取的线索数。DB DEFAULT = 10。 _Avoid_: 日领取限、领取限额、daily limit **池删除保护**: 公海池软删;但**池下有非终态线索时禁止删除**(非终态 = 未分发 / 待领取 / 已领取 / 跟进中)。防止孤儿线索。 _Avoid_: 级联删除、强制删除 **池占用查询端口**: 公海池删除守卫的跨模块出站契约 `PoolLeadOccupationPort`(crm-rule 定义,crm-lead 实现,ADR-0025)。方法 `hasActiveLeads(poolId)` 返回 boolean——true=池下有非终态线索(禁止删除)。与 `OpportunityCreationPort`(crm-lead 定义等商机实现)方向相反的同型 outbound port;crm-rule 通过 `ObjectProvider` 可选注入,port 未实现时 fail-safe 拒删。 _Avoid_: 占用检查服务、lead 查询接口(要点是「crm-rule 声明契约、crm-lead 实现、依赖倒置不破坏方向」) **池批量删除**: `deletePoolBatch` 一行委派 crm-base `BatchRunner.run(ids, self::deletePool, PoolBatchFailItem::bizOf, PoolBatchFailItem::unknownOf)`(ADR-0028)——非原子、逐条经 self 代理走独立事务、部分成功;失败项 `PoolBatchFailItem`(poolId + `PoolBatchFailReason` + message)与 code→reason 翻译、兜底文案(「删除失败」)由本域自持(ADR-0023 D5)。曾内联的同构编排(与 crm-lead 旧 runBatch 逐字重复)已删除——批量编排协议的家在 crm-base。 _Avoid_: 批量删除服务、池批处理(要点是「编排委派 BatchRunner + 失败语义留在域内」)