Sync: add cloud learning and model updates

This commit is contained in:
2026-04-24 17:48:36 +08:00
parent 3148216d38
commit cc23df1883
8 changed files with 237 additions and 68 deletions

View File

@@ -117,7 +117,7 @@ OrgUnit (组织架构)
| [DATA_MODEL_ORG.md](./DATA_MODEL_ORG.md) | 组织人事org_units, staff, 异动/奖惩/教育/家庭等) | ✅ 完成 |
| [DATA_MODEL_COMPLEX.md](./DATA_MODEL_COMPLEX.md) | 楼盘/区域districts, business_areas, complexes, buildings, room_units, schools 等) | ✅ 完成 |
| [DATA_MODEL_CLIENT.md](./DATA_MODEL_CLIENT.md) | 客源管理clients, requirements, follow_logs, viewings, matches 等) | ✅ 完成 |
| [DATA_MODEL_PROPERTY.md](./DATA_MODEL_PROPERTY.md) | 房源管理properties 及配套 22 张表,含跟进/钥匙/委托/实勘/营销/产证/完成度等) | ✅ 完成 |
| [DATA_MODEL_PROPERTY.md](./DATA_MODEL_PROPERTY.md) | 房源管理properties 及配套 22 张表,含跟进/钥匙/委托/实勘/营销/产证/完成度/标签/收藏/保护/号码方审批等) | ✅ 完成 |
---
@@ -294,6 +294,10 @@ CREATE INDEX idx_domains_primary ON public.domains(tenant_id) WHERE is_primary =
### 3.18 系统设置System Settings
> **归属说明**
> - `lookup_categories` / `lookup_items` / `saved_filters` 为**跨模块**系统表,权威定义在本节。
> - `property_tags` / `property_tag_relations` / `property_favorites` / `property_protections` / `number_holder_approvals` 属房源模块配套表,**权威定义已迁至** [`DATA_MODEL_PROPERTY.md §4.19-§4.22`](./DATA_MODEL_PROPERTY.md),本节不再重复 DDL修复 S1/S2
```sql
-- ============================================================
-- 枚举/选项管理:跟进目的、标签、来源渠道 等运营维护的枚举值
@@ -321,49 +325,7 @@ CREATE INDEX idx_lookup_items_category ON lookup_items(category_id)
WHERE is_active = TRUE;
CREATE UNIQUE INDEX idx_lookup_items_value ON lookup_items(category_id, value);
-- 自定义标签(速销/独家/唯一 等
CREATE TABLE property_tags (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name VARCHAR(50) NOT NULL,
color VARCHAR(7), -- HEX 颜色
is_system BOOLEAN NOT NULL DEFAULT FALSE, -- 系统预置标签不可删除
sort_order INTEGER NOT NULL DEFAULT 0,
is_active BOOLEAN NOT NULL DEFAULT TRUE
);
-- 房源 ↔ 标签 多对多
CREATE TABLE property_tag_relations (
property_id UUID NOT NULL REFERENCES properties(id) ON DELETE CASCADE,
tag_id UUID NOT NULL REFERENCES property_tags(id) ON DELETE CASCADE,
PRIMARY KEY (property_id, tag_id)
);
CREATE INDEX idx_property_tags_property ON property_tag_relations(property_id);
CREATE INDEX idx_property_tags_tag ON property_tag_relations(tag_id);
-- 收藏(经纪人收藏房源)
CREATE TABLE property_favorites (
staff_id UUID NOT NULL REFERENCES staff(id) ON DELETE CASCADE,
property_id UUID NOT NULL REFERENCES properties(id) ON DELETE CASCADE,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
PRIMARY KEY (staff_id, property_id)
);
CREATE INDEX idx_property_favorites_staff ON property_favorites(staff_id);
-- 保护房设置
CREATE TABLE property_protections (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
property_id UUID NOT NULL UNIQUE REFERENCES properties(id) ON DELETE CASCADE,
is_protected BOOLEAN NOT NULL DEFAULT FALSE,
reason TEXT,
start_at TIMESTAMPTZ,
end_at TIMESTAMPTZ,
set_by UUID REFERENCES staff(id) ON DELETE SET NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
-- 筛选方案(保存的搜索条件)
-- 筛选方案(保存的搜索条件,跨模块通用
CREATE TABLE saved_filters (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
staff_id UUID NOT NULL REFERENCES staff(id) ON DELETE CASCADE,
@@ -375,25 +337,18 @@ CREATE TABLE saved_filters (
);
CREATE INDEX idx_saved_filters_staff ON saved_filters(staff_id, module);
-- 号码方修改审批
CREATE TABLE number_holder_approvals (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
property_id UUID NOT NULL REFERENCES properties(id) ON DELETE CASCADE,
contact_id UUID NOT NULL REFERENCES property_contacts(id) ON DELETE CASCADE,
applicant_id UUID NOT NULL REFERENCES staff(id) ON DELETE RESTRICT,
approver_id UUID REFERENCES staff(id) ON DELETE SET NULL,
status VARCHAR(20) NOT NULL DEFAULT 'pending'
CHECK (status IN ('pending','approved','rejected')),
remarks TEXT,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
decided_at TIMESTAMPTZ
);
CREATE INDEX idx_number_holder_approvals_status ON number_holder_approvals(status)
WHERE status = 'pending';
```
**已迁出本节的表**(权威源见子文档):
| 表名 | 权威定义位置 |
|------|-------------|
| `property_tags` | [`DATA_MODEL_PROPERTY.md §4.19`](./DATA_MODEL_PROPERTY.md) |
| `property_tag_relations` | [`DATA_MODEL_PROPERTY.md §4.19`](./DATA_MODEL_PROPERTY.md) |
| `property_favorites` | [`DATA_MODEL_PROPERTY.md §4.20`](./DATA_MODEL_PROPERTY.md) |
| `property_protections` | [`DATA_MODEL_PROPERTY.md §4.21`](./DATA_MODEL_PROPERTY.md) |
| `number_holder_approvals` | [`DATA_MODEL_PROPERTY.md §4.22`](./DATA_MODEL_PROPERTY.md) |
---
## 五、关键索引汇总与查询优化策略

View File

@@ -1,8 +1,8 @@
# PRD: 权限管理模块
**状态**: Draft
**作者**: 产品经理
**最后更新**: 2026-04-24v1.0 初稿,基于产品截图分析
**版本**: 1.0
**最后更新**: 2026-04-24v1.1 锁定多角色合并规则 = 并集/最宽松
**版本**: 1.1
**所属系统**: Fonrey 房产经纪管理系统
**关联模块**: 组织人事管理、房源管理、客源管理、系统设置
@@ -516,12 +516,12 @@ Fonrey 采用 **RBAC基于角色的访问控制+ 个人权限叠加** 的
|------|--------|------|----------|
| 权限变更实时生效的一致性问题 | 中 | 高 | 角色/个人权限变更后主动清除 Redis 中该员工权限缓存,强制下次请求重新加载 |
| 权限项数量巨大14+ 模块,数百个权限项)导致编辑页性能问题 | 中 | 中 | 左侧导航按模块懒加载权限数据,避免一次性加载全部权限项 |
| 多角色冲突规则不清晰 | | | 明确规则:同一员工多角色时取权限并集(最宽松原则),在 PRD 评审时确认 |
| 多角色合并规则(已锁定 v1.1 | - | - | **规则**:同一员工多角色取**并集(最宽松原则)**。BOOLEAN→ORSCOPE→MAXself<store<zone<area<region<division<companyINTEGER限额类→MAX`0` 视为无上限。详见 `DATA_MODEL_PERMISSION.md` |
| 角色删除影响已分配员工 | 低 | 高 | 删除角色前校验是否有员工仍使用该角色,有则阻止删除并提示转移员工角色 |
### 待确认开放问题
- [ ] **多角色权限合并规则**:当员工被分配了多个角色时,权限取并集(最宽松)还是交集(最严格)?当前截图显示支持多角色,需明确合并策略 — Owner: 产品负责人 — Deadline: 开发启动前
- [x] ~~**多角色权限合并规则**:当员工被分配了多个角色时,权限取并集(最宽松)还是交集(最严格)?~~ **已确认v1.12026-04-24**:取**并集/最宽松**。BOOLEAN=ORSCOPE=MAXINTEGER=MAX`0`=∞)。权威实现见 `DATA_MODEL_PERMISSION.md` 附录 E `PermissionChecker` 伪代码。
- [ ] **个人权限与角色权限冲突优先级**:个人定制权限是否始终覆盖角色权限,还是支持「继承角色 + 仅扩展」模式?— Owner: 产品负责人 — Deadline: 开发启动前
- [ ] **权限操作日志**:是否需要记录管理员对权限的变更记录(谁、何时、将哪个权限从什么改成什么)?截图中「修改日志」入口存在,需确认日志颗粒度 — Owner: 产品负责人 — Deadline: 开发启动前
- [ ] **角色类别的完整枚举值**:当前已知「置业顾问 / 店管 / 总经」,需确认完整的角色类别列表及各类别允许的权限上限 — Owner: 产品负责人 — Deadline: 开发启动前