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.

97 lines
7.1 KiB

4 weeks ago
# 公海池(线索池)实体与归属建模
Type: grilling
Status: resolved
Blocked by: 02
<!-- 05 已 resolved,解除阻塞;02 也已 resolved,本 ticket 已入前沿 -->
## 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(实体建模范围内)。