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.
 
 
 
 
 

7.1 KiB

公海池(线索池)实体与归属建模

Type: grilling Status: resolved Blocked by: 02

Question

定义 crm-rule 里公海池(线索池)实体的字段与归属模型,作为 crm-rule 的地基。已定:公海池实体归 crm-rule;归属 = 部门树节点(复用 SysDept,团队=上级节点)+ 省/市/区范围;crm-rule 不反向依赖 crm-lead

需在本 ticket 定清:

  1. 实体字段全集(来自 A7-3-1 列表 + 双 Tab 表单):公海池名称(全局唯一)、归属部门(SysDept.id)、省份、负责市场(多城市/区)、部门负责人(1 人)、部门协作人(多人)、部门成员(多人,线索领取人名单)、领取规则(枚举:成员可见可领取+管理员可分配 / 仅管理员可分配)、超时回收天数、线索失效时长、个人每日领取上限、个人持有上限。
  2. 归属维度与数据隔离如何挂钩:公海池的"团队/部门"用 SysDept 哪一层?数据可见范围(部门负责人只见本部门池、超管全见)如何用既有 DataScopeEnum 表达?"负责市场省市区"是否参与数据隔离,还是仅限制线索归属市场范围?
  3. 人员绑定形态:负责人/协作人/成员存 AuthUser.id 列表还是关联表?成员名单与"谁能领取本池线索"的关系。
  4. 唯一性与约束:池名全局唯一;一个部门可挂几个池;省市区可否跨池重叠。
  5. 依赖 02(行政区划)和 05(数据隔离落地)的产出,按其结论定省市区字段与隔离表达。

产出:公海池实体字段表 + 归属/隔离映射说明,写入 ## Answer;术语进 crm-rule/CONTEXT.md

Decisions(grill 定稿)

前置地基(已定,复用)

  • [04-1] 行政区划数据源 = 新建 sys_region(省→市→区三级,见 ticket 02)。
  • [04-2=2a] 销售"够得着哪些池" = 按部门归属算(我属 A 部门 → 能看 A 部门的池)。成员名单不参与可见性判定。
  • [04-3] 领取规则二档语义:
    • 成员可见/可领取、管理员可分配:销售可自主领取 + 管理员/负责人/协作人可分配。
    • 管理员可分配:销售不能自主领取,只能由管理员/负责人/协作人分配下发。
    • "可分配"执行者 = 管理员 + 池负责人 + 池协作人。
  • [人员级联约束] 新增池时:先选销售部门 → 选部门负责人(须在该部门内)→ 部门协作人(须在负责人组织架构下子树内)。
  • [部门成员] = 池归属部门下全部人动态推导、不落表、仅前端回显;部门后续新增的人自动纳入。
  • [挂起] "分配权来源(角色 vs 池级绑定)" + 整个数据可见性/行级授权方向 → 随 ticket 05 挂起等产品确认 PRD。

字段建模决策

  • [Q6=b] 团队 = 冗余列 team_dept_id(团队部门节点 id);应用层校验其 = dept_id 沿 SysDept.ancestors 上溯到团队层的节点。读快。
  • [Q7=A2] 省份 + 城市分两张关联表:
    • lead_pool_province(pool_id, province_region_id) —— 多省,指向 sys_region level=1。
    • lead_pool_region(pool_id, city_region_id) —— 多市/区,指向 sys_region level=2/3。
    • 约束:city 必须属于本池某个 province(应用层校验)。前端天然分层、无感知。
  • [Q8] 负责市场用 sys_region.id,省市联动约束,市/区均可选(见 Q7 关联表)。
  • [Q9=b] 人员绑定用关联表 lead_pool_member(pool_id, user_id, role_type);role_type=OWNER/COLLABORATOR;(pool_id, role_type=OWNER) 唯一(1 池 1 负责人)。成员(MEMBER)不入表(动态推导)。
  • [Q10=a] 时效/上限字段全 int,DB 默认值:超时回收 N=7、失效 M=180、个人持有上限=200、每日领取上限=10(0=无限制)。校验:N/M≥1、持有≥1、每日≥0。
  • [Q11] 池名 UNIQUE(pool_name) 全局唯一;软删(BaseEntity 逻辑删除);service 校验"池下有非终态线索禁止删除"。
  • [Q12=B1] 一部门一池UNIQUE(dept_id)。原型江苏全域公海池 1/2/3 是错误示例数据,需 UX 修订(合并为 1 池,负责市场取并集)。

Answer

一、lead_pool 主表(crm-rule)

lead_pool
├─ id             bigint PK
├─ pool_name      varchar(100) NOT NULL   UNIQUE          -- 全局唯一
├─ dept_id        bigint       NOT NULL   UNIQUE          -- 归属销售部门(SysDept.id),一部门一池
├─ team_dept_id   bigint       NOT NULL                   -- 归属团队(冗余,= dept_id 上溯团队层节点)
├─ claim_rule     tinyint      NOT NULL DEFAULT 1         -- 1=成员可领+管理员分配, 2=仅管理员分配
├─ recycle_days   int          NOT NULL DEFAULT 7         -- 超时回收 N (≥1)
├─ expire_days    int          NOT NULL DEFAULT 180       -- 线索失效 M (≥1)
├─ daily_claim_limit int       NOT NULL DEFAULT 10        -- 每日领取上限 (≥0, 0=无限)
├─ hold_limit     int          NOT NULL DEFAULT 200       -- 个人持有上限 (≥1)
└─ (BaseEntity: create_by/create_time/update_by/update_time/deleted 逻辑删除)

二、关联表

lead_pool_province(id, pool_id, province_region_id)    -- 多省, region level=1
  UNIQUE(pool_id, province_region_id)

lead_pool_region(id, pool_id, city_region_id)          -- 多市/区, region level=2/3
  UNIQUE(pool_id, city_region_id)
  约束: city_region_id 所属省 ∈ 本池 province(应用层校验)

lead_pool_member(id, pool_id, user_id, role_type)      -- 池-人绑定
  role_type: OWNER(1人) / COLLABORATOR(多人)
  UNIQUE(pool_id, role_type=OWNER)  -- 1 池 1 负责人(应用层或部分唯一索引保证)
  注: MEMBER 不入表, 由 dept_id → SysDept 子树成员动态推导

三、归属与可见性映射(部分随 05 挂起)

  • 团队/部门归属 = team_dept_id / dept_id,均指向 SysDept 节点。
  • 可见性(04-2=2a):销售看本部门的池(一部门一池 → 恰好 1 个);部门负责人看本部门池;超管看全部。具体隔离表达随 05 挂起(三机制 PRD 待产品确认)。
  • 负责市场省市区:仅限制线索归属市场范围,不参与数据隔离(隔离只按部门)。

四、依赖 crm-auth(消费既存)

  • SysDept(dept_id/team_dept_id/ancestors 上溯)、AuthUser(负责人/协作人 user_id)。
  • crm-rule → crm-auth 单向;crm-rule 不反向依赖 crm-lead(池不知线索存在)。

五、原型待 UX 修订

  • 江苏全域公海池 1/2/3(a7-3-1 列表)= 一部门多池错误示例,需合并为 1 池。

六、CONTEXT 登记

  • crm-rule/CONTEXT.md:公海池实体术语 + 归属维度 + 一部门一池约束 + 成员动态推导。
  • CONTEXT-MAP.md:crm-rule = 业务规则(当前仅线索规则=公海池配置)。

Status

本 ticket 实体字段建模部分已定稿可交付;仅"分配权来源/行级授权"随 05 挂起(不影响实体字段与关联表结构)。→ resolved(实体建模范围内)。