From 75b9e25e680705ea0d5cc4eb73f74aff6d2bb14a Mon Sep 17 00:00:00 2001 From: weishen Date: Fri, 24 Apr 2026 14:49:34 +0800 Subject: [PATCH] Sync: expand data model and gitops notes --- Project/fonrey/DATA_MODEL/DATA_MODEL.md | 415 ++++--------- .../fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md | 574 ++++++++++++++++++ .../fonrey/DATA_MODEL/DATA_MODEL_COMPLEX.md | 547 +++++++++++++++++ Project/fonrey/DATA_MODEL/DATA_MODEL_ORG.md | 341 +++++++++++ .../fonrey/DATA_MODEL/diagram/fonrey-er.svg | 574 ++++++++++++++++++ .../DATA_MODEL/diagram/fonrey-er@2x.png | Bin 0 -> 889452 bytes wiki/concepts/GitOps.md | 54 +- wiki/index.md | 6 +- wiki/log.md | 35 ++ wiki/overview.md | 8 +- ...ic-3-deploy-and-maintain-infrastructure.md | 62 ++ .../ctp-topic-33-an-introduction-to-gitops.md | 62 ++ ...flow-and-the-demand-process-20240416-16.md | 58 ++ 13 files changed, 2418 insertions(+), 318 deletions(-) create mode 100644 Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md create mode 100644 Project/fonrey/DATA_MODEL/DATA_MODEL_COMPLEX.md create mode 100644 Project/fonrey/DATA_MODEL/DATA_MODEL_ORG.md create mode 100644 Project/fonrey/DATA_MODEL/diagram/fonrey-er.svg create mode 100644 Project/fonrey/DATA_MODEL/diagram/fonrey-er@2x.png create mode 100644 wiki/sources/ctp-topic-3-deploy-and-maintain-infrastructure.md create mode 100644 wiki/sources/ctp-topic-33-an-introduction-to-gitops.md create mode 100644 wiki/sources/public-cloud-learning-sessions-ollie-workflow-and-the-demand-process-20240416-16.md diff --git a/Project/fonrey/DATA_MODEL/DATA_MODEL.md b/Project/fonrey/DATA_MODEL/DATA_MODEL.md index 3739517b..35e324a6 100644 --- a/Project/fonrey/DATA_MODEL/DATA_MODEL.md +++ b/Project/fonrey/DATA_MODEL/DATA_MODEL.md @@ -70,7 +70,59 @@ --- -## 二、公共 Schema(Shared / Public) +## 二、领域概览(Domain Overview) + +本节用业务语言描述系统的核心领域对象及其关系,作为各子模块数据模型的导读。 + +### 核心领域对象 + +| 领域对象 | 表/子文档 | 业务说明 | +|----------|-----------|----------| +| **Tenant(租户)** | `public.tenants` | 每家房产经纪公司对应一个租户,数据完全隔离(Schema-per-Tenant) | +| **OrgUnit(组织架构)** | `org_units` → [DATA_MODEL_ORG.md](./DATA_MODEL_ORG.md) | 树形组织架构(总部/区域/城市/大区/分公司/门店/团队/虚拟团队),物化路径存储,支持权限继承 | +| **Staff(员工)** | `staff` → [DATA_MODEL_ORG.md](./DATA_MODEL_ORG.md) | 经纪人/店长/经理,绑定组织节点,手机号加密存储,与账号(登录)分离 | +| **District(城区)** | `districts` → [DATA_MODEL_COMPLEX.md](./DATA_MODEL_COMPLEX.md) | 行政区划,如「静安区」,是区域体系的顶层节点 | +| **BusinessArea(商圈)** | `business_areas` → [DATA_MODEL_COMPLEX.md](./DATA_MODEL_COMPLEX.md) | 商圈/板块,从属于城区,一个楼盘可归属多个商圈 | +| **School(学校)** | `schools` → [DATA_MODEL_COMPLEX.md](./DATA_MODEL_COMPLEX.md) | 对口学校数据库,是买家购房决策的核心参考,与楼盘多对多关联 | +| **Complex(楼盘/小区)** | `complexes` → [DATA_MODEL_COMPLEX.md](./DATA_MODEL_COMPLEX.md) | 房源录入的基础底座,维护楼盘标准名称/坐标/锁定状态/别名等 | +| **Building(楼栋/单元)** | `buildings` → [DATA_MODEL_COMPLEX.md](./DATA_MODEL_COMPLEX.md) | 楼盘下的物理楼栋,区分标准结构与非标结构 | +| **RoomUnit(房号)** | `room_units` → [DATA_MODEL_COMPLEX.md](./DATA_MODEL_COMPLEX.md) | 楼层+房间号,房源定位的最细粒度 | +| **Property(房源)** | `properties` → §3.3 | 系统核心表,每套二手房源的完整档案,支持出售/出租/出售兼出租三态 | +| **Client(客源)** | `clients` → [DATA_MODEL_CLIENT.md](./DATA_MODEL_CLIENT.md) | 买家/租客档案,分私客/公客/成交客,含活跃度评分与自动公客转换机制 | +| **Viewing(带看)** | `client_viewings` → [DATA_MODEL_CLIENT.md](./DATA_MODEL_CLIENT.md) | 经纪人带客户看房的完整记录 | +| **Match(配对)** | `client_property_matches` → [DATA_MODEL_CLIENT.md](./DATA_MODEL_CLIENT.md) | 系统/人工推荐的客源↔房源配对 | + +### 领域关系快速导航 + +``` +District (城区) + └─ BusinessArea (商圈) + └─ Complex (楼盘) ─── School (对口学校) + ├─ Building (楼栋) + │ └─ RoomUnit (房号) + └─ Property (房源) + ├─ PropertyContact (联系人/委托方) + ├─ FollowLog (跟进日志) + ├─ Viewing (带看记录) ──── Client (客源) + └─ Match (配对记录) ──────┘ + +OrgUnit (组织架构) + └─ Staff (员工/经纪人) ─── Property / Client / Viewing / Match +``` + +### 子文档索引 + +| 子文档 | 覆盖模块 | 状态 | +|--------|----------|------| +| [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 等) | ✅ 完成 | +| 本文档 §3.3–§3.16 | 房源核心(properties 及配套 12 张表)、系统设置 | ✅ 完成 | + +--- + +## 三、公共 Schema(Shared / Public) + ```sql -- ============================================================ @@ -107,7 +159,7 @@ CREATE INDEX idx_domains_primary ON public.domains(tenant_id) WHERE is_primary = --- -## 三、租户 Schema(Tenant Schema) +## 四、租户 Schema(Tenant Schema) 以下所有表均在每个租户的独立 Schema 内创建。 @@ -115,190 +167,56 @@ CREATE INDEX idx_domains_primary ON public.domains(tenant_id) WHERE is_primary = ### 3.1 组织人事模块(Organization & HR) -```sql --- ============================================================ --- 组织架构:公司 → 区域 → 门店 → 组 --- ============================================================ +> **详细模型** → 见 [`DATA_MODEL_ORG.md`](./DATA_MODEL_ORG.md) +> 该文件为权威定义,包含完整字段、枚举、查询模式和禁止操作。 --- 组织节点表(树形结构,支持无限层级) -CREATE TABLE org_units ( - id UUID PRIMARY KEY DEFAULT gen_random_uuid(), - name VARCHAR(100) NOT NULL, - type VARCHAR(20) NOT NULL - CHECK (type IN ('company','region','store','group')), - parent_id UUID REFERENCES org_units(id) ON DELETE RESTRICT, - path TEXT NOT NULL, -- 物化路径:/root_id/parent_id/self_id/ - depth SMALLINT NOT NULL DEFAULT 0, - sort_order INTEGER NOT NULL DEFAULT 0, - is_active BOOLEAN NOT NULL DEFAULT TRUE, - created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), - updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), - deleted_at TIMESTAMPTZ -); +**核心表概览**(开发时以 DATA_MODEL_ORG.md 为准): -CREATE INDEX idx_org_units_parent ON org_units(parent_id) WHERE deleted_at IS NULL; -CREATE INDEX idx_org_units_path ON org_units USING gist(path gist_trgm_ops); --- 注:gist_trgm_ops 需要 pg_trgm 扩展,用于路径前缀查询 +| 表名 | 说明 | +|------|------| +| `org_units` | 组织树节点(公司/事业部/大区/区域/片区/门店/店组/职能),物化路径树 | +| `staff` | 员工主表,含加密手机号、角色、在职状态、Django auth 绑定 | +| `staff_personal_info` | 员工个人信息扩展(证件、学历、婚育等,1:1) | +| `staff_transfer_logs` | 人事异动不可变审计日志(入职/调动/离职/复职等) | +| `staff_reward_punish` | 奖惩记录 | +| `staff_work_experiences` | 工作经历 | +| `staff_educations` | 教育经历 | +| `staff_trainings` | 培训经历 | +| `staff_family_members` | 家庭成员 | +| `staff_accounts` | 第三方平台账号绑定(58安居客/中国网络经纪人等) | --- 员工表 -CREATE TABLE staff ( - id UUID PRIMARY KEY DEFAULT gen_random_uuid(), - org_unit_id UUID NOT NULL REFERENCES org_units(id) ON DELETE RESTRICT, - name VARCHAR(50) NOT NULL, - phone_hash VARCHAR(64), -- SHA-256 哈希,用于唯一性校验 - phone_enc BYTEA, -- AES-256-GCM 加密后的手机号 - email VARCHAR(255), - role VARCHAR(30) NOT NULL - CHECK (role IN ('agent','store_manager','admin','operator','system')), - job_title VARCHAR(100), -- 职务描述 - avatar_key TEXT, -- R2/S3 存储路径 - is_active BOOLEAN NOT NULL DEFAULT TRUE, - joined_at DATE, - left_at DATE, - created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), - updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), - deleted_at TIMESTAMPTZ, - - -- 关联 Django auth user(用于登录认证) - user_id INTEGER UNIQUE -- FK to django auth_user -); - -CREATE INDEX idx_staff_org ON staff(org_unit_id) WHERE deleted_at IS NULL; -CREATE INDEX idx_staff_role ON staff(role) WHERE deleted_at IS NULL; -CREATE UNIQUE INDEX idx_staff_phone_hash ON staff(phone_hash) WHERE deleted_at IS NULL; -``` +**关键约束提示**: +- `staff.phone_enc` AES-256-GCM 加密,`staff.phone_hash` SHA-256 用于唯一索引 +- `staff_transfer_logs` **无 deleted_at**,不可删除 +- `org_units` 路径查询:`WHERE path LIKE '/root/{target_id}/%'` +- 员工离职:`status = 'resigned'` + `deleted_at` 软删除,记录永久保留 --- ### 3.2 区域与楼盘模块(Region & Complex Management) -```sql --- ============================================================ --- 行政区 → 商圈 → 楼盘/小区 → 楼栋 --- 注:楼盘数据是房源录入的基础底座,数据质量直接影响房源录入效率 --- ============================================================ +> **详细模型** → 见 [`DATA_MODEL_COMPLEX.md`](./DATA_MODEL_COMPLEX.md) +> 本节仅作概览,开发时以 DATA_MODEL_COMPLEX.md 为权威定义。 --- 城市/行政区 -CREATE TABLE districts ( - id UUID PRIMARY KEY DEFAULT gen_random_uuid(), - name VARCHAR(50) NOT NULL, - city VARCHAR(50) NOT NULL DEFAULT '', - sort_order INTEGER NOT NULL DEFAULT 0, - is_active BOOLEAN NOT NULL DEFAULT TRUE -); +**核心表概览**(开发时以 DATA_MODEL_COMPLEX.md 为准): --- 商圈/板块 -CREATE TABLE business_areas ( - id UUID PRIMARY KEY DEFAULT gen_random_uuid(), - district_id UUID NOT NULL REFERENCES districts(id) ON DELETE RESTRICT, - name VARCHAR(100) NOT NULL, - sort_order INTEGER NOT NULL DEFAULT 0, - is_active BOOLEAN NOT NULL DEFAULT TRUE -); - -CREATE INDEX idx_business_areas_district ON business_areas(district_id); - --- 地铁线路 -CREATE TABLE metro_lines ( - id UUID PRIMARY KEY DEFAULT gen_random_uuid(), - name VARCHAR(50) NOT NULL, - color VARCHAR(7) -- 线路颜色 HEX -); - --- 地铁站 -CREATE TABLE metro_stations ( - id UUID PRIMARY KEY DEFAULT gen_random_uuid(), - metro_line_id UUID NOT NULL REFERENCES metro_lines(id) ON DELETE CASCADE, - name VARCHAR(50) NOT NULL, - sort_order INTEGER NOT NULL DEFAULT 0 -); - --- 学校 -CREATE TABLE schools ( - id UUID PRIMARY KEY DEFAULT gen_random_uuid(), - district_id UUID REFERENCES districts(id) ON DELETE SET NULL, - name VARCHAR(100) NOT NULL, - type VARCHAR(20) -- 小学/初中/高中/九年一贯制 等 -); - -CREATE INDEX idx_schools_district ON schools(district_id); - --- 楼盘/小区(核心基础表) -CREATE TABLE complexes ( - id UUID PRIMARY KEY DEFAULT gen_random_uuid(), - name VARCHAR(200) NOT NULL, - alias VARCHAR(200), -- 别名/曾用名 - district_id UUID REFERENCES districts(id) ON DELETE SET NULL, - business_area_id UUID REFERENCES business_areas(id) ON DELETE SET NULL, - address VARCHAR(500), - latitude NUMERIC(10,7), - longitude NUMERIC(10,7), - - -- 楼盘物理属性 - developer VARCHAR(200), -- 开发商 - property_company VARCHAR(200), -- 物业公司 - property_fee NUMERIC(8,2), -- 物业费 元/㎡/月 - green_rate NUMERIC(5,2), -- 绿化率 % - plot_ratio NUMERIC(5,2), -- 容积率 - built_year SMALLINT, -- 竣工年份 - ownership_years VARCHAR(20), -- 产权年限枚举 - - -- 配套信息 - has_elevator BOOLEAN, - parking_info TEXT, -- 车位情况描述 - - -- 全文检索向量(定期更新) - search_vector TSVECTOR, - - is_active BOOLEAN NOT NULL DEFAULT TRUE, - created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), - updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), - deleted_at TIMESTAMPTZ, - created_by UUID REFERENCES staff(id) ON DELETE SET NULL -); - -CREATE INDEX idx_complexes_district ON complexes(district_id) WHERE deleted_at IS NULL; -CREATE INDEX idx_complexes_name_trgm ON complexes USING gin(name gin_trgm_ops); -CREATE INDEX idx_complexes_search ON complexes USING gin(search_vector); -CREATE INDEX idx_complexes_geo ON complexes(latitude, longitude) WHERE deleted_at IS NULL; - --- 楼盘与商圈多对多(一个楼盘可跨多个商圈) -CREATE TABLE complex_business_areas ( - complex_id UUID NOT NULL REFERENCES complexes(id) ON DELETE CASCADE, - business_area_id UUID NOT NULL REFERENCES business_areas(id) ON DELETE CASCADE, - PRIMARY KEY (complex_id, business_area_id) -); - --- 楼盘与学校关联 -CREATE TABLE complex_schools ( - complex_id UUID NOT NULL REFERENCES complexes(id) ON DELETE CASCADE, - school_id UUID NOT NULL REFERENCES schools(id) ON DELETE CASCADE, - school_zone VARCHAR(50), -- 学区情况:对口/参考等 - PRIMARY KEY (complex_id, school_id) -); - --- 楼盘与地铁站关联 -CREATE TABLE complex_metro_stations ( - complex_id UUID NOT NULL REFERENCES complexes(id) ON DELETE CASCADE, - station_id UUID NOT NULL REFERENCES metro_stations(id) ON DELETE CASCADE, - distance_meters INTEGER, -- 步行距离(米) - PRIMARY KEY (complex_id, station_id) -); - --- 楼栋 -CREATE TABLE buildings ( - id UUID PRIMARY KEY DEFAULT gen_random_uuid(), - complex_id UUID NOT NULL REFERENCES complexes(id) ON DELETE CASCADE, - name VARCHAR(50) NOT NULL, -- 楼栋名,如"1号楼" - total_floors SMALLINT NOT NULL, - has_elevator BOOLEAN, - building_type VARCHAR(30), -- 楼型:板楼/塔楼/板塔结合 - is_active BOOLEAN NOT NULL DEFAULT TRUE, - created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() -); - -CREATE INDEX idx_buildings_complex ON buildings(complex_id); -``` +| 表名 | 说明 | 关键字段 | +|------|------|----------| +| `districts` | 城区/行政区 | `city`, `name`, `short_name`, `sort_order` | +| `business_areas` | 商圈/板块(从属于城区) | `district_id`, `name`, `latitude`, `longitude` | +| `metro_lines` | 地铁线路 | `city`, `name`, `color` | +| `metro_stations` | 地铁站点 | `metro_line_id`, `name`, `latitude`, `longitude` | +| `schools` | 学校(对口学区) | `district_id`, `name`, `type`, `nature`, `level` | +| `complexes` | 楼盘/小区(房源底座) | `name`, `district_id`, `address`, `latitude/longitude`, `lock_*`, `search_vector` | +| `complex_aliases` | 楼盘别名(含系统别名/用户自定义别名) | `complex_id`, `alias`, `is_system` | +| `complex_business_areas` | 楼盘↔商圈多对多(含主商圈标识) | `complex_id`, `business_area_id`, `is_primary` | +| `complex_schools` | 楼盘↔学校关联(含学区类型) | `complex_id`, `school_id`, `zone_type` | +| `complex_metro_stations` | 楼盘↔地铁站关联(含步行距离) | `complex_id`, `station_id`, `distance_meters` | +| `buildings` | 楼栋/单元 | `complex_id`, `name`, `is_standard`, `total_floors` | +| `room_units` | 房号/结构单元(楼层+房间号) | `building_id`, `floor`, `room_no`, `is_standard` | +| `complex_photos` | 楼盘照片(楼盘图/户型图/VR) | `complex_id`, `category`, `file_key`, `is_cover` | +| `complex_attachments` | 楼盘附件 | `complex_id`, `file_key`, `file_name` | +| `complex_price_trends` | 楼盘价格走势(月度) | `complex_id`, `record_month`, `avg_unit_price` | --- @@ -1066,123 +984,30 @@ CREATE TABLE property_completeness ( ### 3.17 客源管理(Client Management) -```sql --- ============================================================ --- 客源:私客为核心,公客/成交客为后续版本 --- ============================================================ +> **详细模型** → 见 [`DATA_MODEL_CLIENT.md`](./DATA_MODEL_CLIENT.md) +> 该文件为权威定义,包含完整字段、枚举、状态机、查询模式和禁止操作。 -CREATE TABLE clients ( - id UUID PRIMARY KEY DEFAULT gen_random_uuid(), +**核心表概览**(开发时以 DATA_MODEL_CLIENT.md 为准): - client_type VARCHAR(20) NOT NULL DEFAULT 'private' - CHECK (client_type IN ('private','public','transacted')), - status VARCHAR(20) NOT NULL DEFAULT 'active' - CHECK (status IN ('active','converted_public', - 'transacted','invalid')), +| 表名 | 说明 | +|------|------| +| `clients` | 客源主表(私客/公客/成交客),含加密手机号哈希、活跃度、归属人 | +| `client_contacts` | 联系人(1:N),手机号加密+哈希,支持多联系人 | +| `client_requirements` | 需求信息(可多类型:二手/新房/租房),含预算/面积/商圈/朝向等偏好 | +| `client_follow_logs` | 跟进日志(高写入频率,5种类型,敏感查看类型不可删) | +| `client_follow_log_attachments` | 跟进附件(图片/录音,最大20MB) | +| `client_viewings` | 带看/预约记录(1:N,含陪看人/合作带看人) | +| `client_property_matches` | 智能配房结果(录客配房/系统配房,匹配度评分) | +| `client_status_logs` | 状态变更不可变审计日志(改状态/改等级/转公/转成交/转无效等) | +| `client_favorite_folders` | 私客收藏夹(经纪人自定义分组) | +| `client_folder_items` | 收藏夹与客源的多对多关联 | +| `client_school_preferences` | 意向学校(拆表,支持精确查询) | - name VARCHAR(50) NOT NULL, - gender VARCHAR(10) - CHECK (gender IN ('male','female','unknown')), - - -- 手机号加密存储 - phone_enc BYTEA NOT NULL, - phone_hash VARCHAR(64) NOT NULL, - phone2_enc BYTEA, - phone2_hash VARCHAR(64), - - -- 购房需求 - purpose VARCHAR(10) NOT NULL - CHECK (purpose IN ('buy','rent')), - budget_min NUMERIC(12,2), - budget_max NUMERIC(12,2), - area_min NUMERIC(8,2), - area_max NUMERIC(8,2), - bedroom_needs SMALLINT[], -- 可接受的卧室数量数组 - - -- 意向区域(存 district/business_area ID 数组) - district_ids UUID[], - business_area_ids UUID[], - - -- 活跃度分层(由系统计算) - activity_level VARCHAR(10) - CHECK (activity_level IN ('hot','warm','cold','frozen')), - last_active_at TIMESTAMPTZ, - - -- 负责经纪人 - agent_id UUID REFERENCES staff(id) ON DELETE SET NULL, - org_unit_id UUID REFERENCES org_units(id) ON DELETE SET NULL, - - source VARCHAR(50), - remarks TEXT, - - created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), - updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), - deleted_at TIMESTAMPTZ, - created_by UUID REFERENCES staff(id) ON DELETE SET NULL -); - -CREATE INDEX idx_clients_agent ON clients(agent_id) WHERE deleted_at IS NULL; -CREATE INDEX idx_clients_phone_hash ON clients(phone_hash) WHERE deleted_at IS NULL; -CREATE INDEX idx_clients_status ON clients(status, client_type) WHERE deleted_at IS NULL; -CREATE INDEX idx_clients_activity ON clients(activity_level, last_active_at DESC) - WHERE deleted_at IS NULL; - --- 客源跟进日志(复用结构,单独表避免与房源日志混合) -CREATE TABLE client_follow_logs ( - id UUID PRIMARY KEY DEFAULT gen_random_uuid(), - client_id UUID NOT NULL REFERENCES clients(id) ON DELETE CASCADE, - purpose VARCHAR(50), - content TEXT, - log_tag VARCHAR(50), - is_public BOOLEAN NOT NULL DEFAULT TRUE, - operator_id UUID REFERENCES staff(id) ON DELETE SET NULL, - operator_snapshot JSONB, - created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), - deleted_at TIMESTAMPTZ -); - -CREATE INDEX idx_client_logs_client ON client_follow_logs(client_id, created_at DESC) - WHERE deleted_at IS NULL; - --- 智能配房记录(客源 ↔ 房源 匹配) -CREATE TABLE client_property_matches ( - id UUID PRIMARY KEY DEFAULT gen_random_uuid(), - client_id UUID NOT NULL REFERENCES clients(id) ON DELETE CASCADE, - property_id UUID NOT NULL REFERENCES properties(id) ON DELETE CASCADE, - match_score NUMERIC(5,2), -- 匹配度评分 - match_reason JSONB, -- 匹配原因详情 - status VARCHAR(20) NOT NULL DEFAULT 'suggested' - CHECK (status IN ('suggested','shared','viewing','rejected')), - created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), - created_by UUID REFERENCES staff(id) ON DELETE SET NULL -); - -CREATE UNIQUE INDEX idx_client_property_match - ON client_property_matches(client_id, property_id); - --- 带看记录 -CREATE TABLE viewings ( - id UUID PRIMARY KEY DEFAULT gen_random_uuid(), - property_id UUID NOT NULL REFERENCES properties(id) ON DELETE RESTRICT, - client_id UUID NOT NULL REFERENCES clients(id) ON DELETE RESTRICT, - agent_id UUID REFERENCES staff(id) ON DELETE SET NULL, - - viewing_type VARCHAR(20) NOT NULL DEFAULT 'first' - CHECK (viewing_type IN ('first','revisit','empty','interview')), - -- first=带看, revisit=复看, empty=空看, interview=面访 - - scheduled_at TIMESTAMPTZ, - completed_at TIMESTAMPTZ, - result VARCHAR(20) - CHECK (result IN ('interested','not_interested', - 'negotiating','cancelled')), - remarks TEXT, - created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() -); - -CREATE INDEX idx_viewings_property ON viewings(property_id); -CREATE INDEX idx_viewings_client ON viewings(client_id); -``` +**关键约束提示**: +- `client_contacts.phone_hash` 是重复客源检测的唯一依据,录入前必须查重 +- `client_status_logs` **无 deleted_at**,不可删除 +- 私客超时(配置天数内无跟进)→ Celery 自动转公(`transfer_to_public_type = 'auto'`) +- 活跃度 `activity_level` 由 Celery 每日凌晨批量计算,不实时更新 --- @@ -1290,7 +1115,7 @@ CREATE INDEX idx_number_holder_approvals_status ON number_holder_approvals(statu --- -## 四、关键索引汇总与查询优化策略 +## 五、关键索引汇总与查询优化策略 ### 4.1 房源列表页核心查询分析 @@ -1372,7 +1197,7 @@ CREATE TRIGGER trg_update_last_followed --- -## 五、Redis 缓存策略 +## 六、Redis 缓存策略 ### 5.1 缓存 Key 规范 @@ -1422,7 +1247,7 @@ CREATE TRIGGER trg_update_last_followed --- -## 六、Django Model 层设计要点 +## 七、Django Model 层设计要点 ### 6.1 抽象基类 @@ -1500,7 +1325,7 @@ class PropertyManager(ActiveManager): --- -## 七、数据量与性能预测 +## 八、数据量与性能预测 | 表名 | 预估行数 | 增长速度 | 分区策略 | |------|---------|---------|---------| @@ -1514,7 +1339,7 @@ class PropertyManager(ActiveManager): --- -## 八、必须在开发启动前明确的数据架构决策 +## 九、必须在开发启动前明确的数据架构决策 | 决策项 | 推荐方案 | 风险 | |-------|---------|------| diff --git a/Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md b/Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md new file mode 100644 index 00000000..baab0cb4 --- /dev/null +++ b/Project/fonrey/DATA_MODEL/DATA_MODEL_CLIENT.md @@ -0,0 +1,574 @@ +# Fonrey — 客源管理数据模型(DATA_MODEL_CLIENT) + +> **所属系统**: Fonrey 房产经纪管理系统 +> **版本**: v1.0 +> **日期**: 2026-04-24 +> **关联模块**: `apps/client/` — 私客、公客、成交客、跟进记录、带看、智能配房 + +--- + +## 一、领域概览(Domain Overview) + +### 核心概念 + +- **Client(客源)**:有购房/租房意向或历史成交记录的客户。核心实体,与房源(Property)是系统业务闭环的两端。 +- **客源类型**: + - **私客(private)**:经纪人独占跟进的意向客户,是本期核心。 + - **公客(public)**:私客超时未跟进或手动转公后,进入全公司共享客源池。 + - **成交客(transacted)**:已完成购房/租房成交的客户,用于复购/转介绍跟进。 +- **ClientContact(联系人)**:一个客源可有多个联系人,每个联系人有独立手机号。手机号加密存储,用于重复检测(「私客与成交客重复」)。 +- **ClientRequirement(需求信息)**:购房/租房的详细偏好。一个客源可同时有「二手」「新房」「租房」三种需求类型(分别对应独立的需求记录)。 +- **ClientFollowLog(跟进日志)**:经纪人与客户每次沟通的书面记录,是客源活跃度计算的数据来源。 +- **Viewing(带看记录)**:与 Property 模块共享此表,记录经纪人带客户看房的过程。见主 DATA_MODEL.md 3.17 节。 +- **ClientPropertyMatch(智能配房)**:系统按需求自动匹配的房源列表,分「录客配房」和「系统配房」两种来源。 +- **ClientFavoriteFolder(收藏夹)**:经纪人自定义的客源分组收藏夹。 + +### 关键业务规则 + +1. **私客手机号唯一性**:录入联系人手机号时,系统通过 `phone_hash` 检测是否与现有私客/成交客/公客重复,并在列表顶部提示重复数量。 +2. **活跃度计算**:系统根据「最后跟进日期」自动计算客源活跃度,分为:新配偶(新建)/ 7日活跃 / 30日活跃 / 90日活跃 / 即将过期 / 无效。具体阈值由运营配置。 +3. **私客自动转公规则**:超过配置天数(如 30 天)无跟进记录,系统自动将私客标记为公客(`transfer_to_public_type = 'auto'`)。 +4. **状态机**:客源状态有严格流转规则(见第四章),不可跳过转台。 +5. **跟进目的枚举**:由 `lookup_items` 表维护,运营可配置,当前已知 23 项(见 Story 8)。 +6. **号码查看审计**:查看联系人明文号码需记录 `client_follow_logs`(`log_type = 'sensitive_view'`),不可删除。 +7. **需求类型独立存储**:同一客源可同时有「二手购房」「租房」两类需求,分别存储在独立需求记录中,由 `client_requirements.requirement_type` 区分。 + +--- + +## 二、实体关系 + +``` +Client (客源主表) + │ + ├── 1:N ── ClientContact (联系人,多个号码) + ├── 1:N ── ClientRequirement (需求信息,可多类型) + ├── 1:N ── ClientFollowLog (跟进日志,高写入频率) + ├── 1:N ── ClientViewing (带看预约) + ├── 1:N ── ClientPropertyMatch (智能配房结果) + ├── 1:1 ── ClientActivityCache (活跃度缓存,异步计算) + ├── N:M ── ClientFavoriteFolder (通过 client_folder_items 关联) + └── 1:N ── ClientStatusLog (状态变更日志,不可删) + +ClientFavoriteFolder + └── 1:N ── ClientFolderItem (收藏夹中的客源) + +Staff (员工) + ├── first_recorder_id → Client (首录人) + └── owner_id → Client (归属人) +``` + +--- + +## 三、Schema 定义 + +### 3.1 clients — 客源主表 + +| 字段 | 类型 | 约束 | 业务说明 | +|------|------|------|----------| +| id | UUID | PK | | +| client_no | VARCHAR(30) | UNIQUE, NOT NULL | 系统生成的客源编号,格式由运营配置(如 KY20260424001) | +| client_type | VARCHAR(20) | NOT NULL DEFAULT 'private' | `private`=私客 / `public`=公客 / `transacted`=成交客 | +| status | VARCHAR(20) | NOT NULL DEFAULT 'buying' | 见下方枚举 | +| grade | VARCHAR(5) | NOT NULL DEFAULT 'C' | `A_urgent`=A急迫 / `A` / `B`=较强 / `C`=一般 / `D`=较弱 / `E`=暂不关注 | +| property_usage | VARCHAR(30) | NOT NULL DEFAULT 'residential' | `residential`=住宅 / `villa`=别墅 / `commercial_residential`=商住 / `shop`=商铺 / `office`=写字楼 / `other`=其他 | +| buying_purpose | VARCHAR(20)[] | | 购房目的多选:`rigid`=刚需 / `investment`=投资 / `school_district`=学区 / `upgrade`=改善 / `commercial`=商用 / `other`=其他 | +| payment_method | VARCHAR(30) | | `full`=全额 / `mortgage`=商业贷款 / `mortgage_fund`=商贷+公积金 / `fund`=公积金 | +| properties_owned | VARCHAR(20) | | `none`=无 / `local_none`=本地无外地有 / `local_has`=本地有 | +| has_loan_record | BOOLEAN | | 有无贷款记录 | +| id_type | VARCHAR(20) | | 证件类型:`id_card` / `passport` / `hk_macao` / `other` | +| id_number_enc | BYTEA | | 证件号码(AES 加密) | +| source | VARCHAR(50) | | 客户来源(lookup_items 维护) | +| remarks | TEXT | | 备注,最多200字 | +| is_starred | BOOLEAN | NOT NULL DEFAULT FALSE | 是否收藏(快速标记,详细收藏夹用 client_folder_items) | +| is_pinned | BOOLEAN | NOT NULL DEFAULT FALSE | 是否置顶(列表顶部置顶) | +| is_big_value | BOOLEAN | NOT NULL DEFAULT FALSE | 是否大价值客户(影响筛选展示) | +| is_protected | BOOLEAN | NOT NULL DEFAULT FALSE | 是否保护客(影响转公逻辑) | +| prefers_new_house | BOOLEAN | | 偏好新房(用于筛选) | +| transfer_to_public_type | VARCHAR(20) | | 转公客方式:`manual`=手动转公 / `auto`=自动转公(超时) / `marketing_jump`=营销客跳公 / `resource_public`=资料客素公 | +| transferred_public_at | TIMESTAMPTZ | | 进入公客池时间 | +| invalid_reason | VARCHAR(30) | | 无效原因:`invalid_phone`=号码无效 / `peer_agent`=同行 / `ad`=广告推销 / `no_intent`=无意向 / `other` | +| invalidated_at | TIMESTAMPTZ | | 标记无效时间 | +| transacted_at | DATE | | 成交日期 | +| transacted_property_id | UUID | FK→properties, SET NULL | 成交关联的房源 | +| transacted_price | NUMERIC(12,2) | | 成交价格(万元) | +| transacted_type | VARCHAR(20) | | 成交类型:`bought`=我购 / `rented`=我租 | +| transacted_property_type | VARCHAR(20) | | 成交房源类型:`second_hand`=二手 / `new_house`=新房 | +| first_recorder_id | UUID | FK→staff, SET NULL | 首录人 | +| owner_id | UUID | FK→staff, SET NULL | 归属人(私客独占跟进人) | +| org_unit_id | UUID | FK→org_units, SET NULL | 归属部门(冗余,加速筛选) | +| activity_level | VARCHAR(20) | | `new_matched`=新配偶 / `active_7d` / `active_30d` / `active_90d` / `expiring` / `frozen` / `invalid`(异步计算)| +| last_active_at | TIMESTAMPTZ | | 最后有效跟进时间(触发器维护) | +| last_follow_at | TIMESTAMPTZ | | 最后跟进时间(冗余,列表排序用) | +| commission_date | DATE | | 委托日期 | +| entrust_count | SMALLINT | NOT NULL DEFAULT 1 | 委托次数(成交后再委托则累加) | +| created_at | TIMESTAMPTZ | NOT NULL DEFAULT NOW() | | +| updated_at | TIMESTAMPTZ | NOT NULL DEFAULT NOW() | | +| deleted_at | TIMESTAMPTZ | | 软删除 | +| created_by | UUID | FK→staff, SET NULL | | +| updated_by | UUID | FK→staff, SET NULL | | + +**关键索引**: +```sql +CREATE UNIQUE INDEX idx_clients_client_no ON clients(client_no) WHERE deleted_at IS NULL; +CREATE INDEX idx_clients_type_status ON clients(client_type, status) WHERE deleted_at IS NULL; +CREATE INDEX idx_clients_owner ON clients(owner_id) WHERE deleted_at IS NULL; +CREATE INDEX idx_clients_org_unit ON clients(org_unit_id) WHERE deleted_at IS NULL; +CREATE INDEX idx_clients_activity ON clients(activity_level, last_active_at DESC) WHERE deleted_at IS NULL; +CREATE INDEX idx_clients_grade ON clients(grade) WHERE deleted_at IS NULL; +CREATE INDEX idx_clients_transferred_at ON clients(transferred_public_at DESC) WHERE client_type = 'public'; +CREATE INDEX idx_clients_last_follow ON clients(last_follow_at DESC NULLS LAST) WHERE deleted_at IS NULL; +``` + +--- + +### 3.2 client_contacts — 联系人表 + +| 字段 | 类型 | 约束 | 业务说明 | +|------|------|------|----------| +| id | UUID | PK | | +| client_id | UUID | NOT NULL, FK→clients, CASCADE | | +| sort_order | SMALLINT | NOT NULL DEFAULT 0 | 联系人1为主联系人(sort_order=0) | +| name | VARCHAR(50) | NOT NULL | 联系人姓名 | +| gender | VARCHAR(10) | NOT NULL DEFAULT 'male' | `male`=先生 / `female`=女士 | +| phone_enc | BYTEA | NOT NULL | AES-256-GCM 加密手机号(电话1) | +| phone_hash | VARCHAR(64) | NOT NULL | SHA-256 哈希(重复检测) | +| phone_country_code | VARCHAR(10) | NOT NULL DEFAULT '+86' | 国际区号 | +| phone_is_invalid | BOOLEAN | NOT NULL DEFAULT FALSE | 是否被标记为无效号码 | +| phone2_enc | BYTEA | | 备用电话2 | +| phone2_hash | VARCHAR(64) | | | +| wechat | VARCHAR(100) | | 微信号 | +| qq | VARCHAR(20) | | QQ号 | +| remarks | VARCHAR(200) | | 联系人备注,最多200字 | +| created_at | TIMESTAMPTZ | NOT NULL DEFAULT NOW() | | +| updated_at | TIMESTAMPTZ | NOT NULL DEFAULT NOW() | | +| deleted_at | TIMESTAMPTZ | | 软删除(不影响客源本身) | +| created_by | UUID | FK→staff, SET NULL | | + +**关键索引**: +```sql +-- 关键:手机号哈希全局唯一索引(用于重复客源检测) +CREATE INDEX idx_client_contacts_phone_hash ON client_contacts(phone_hash) WHERE deleted_at IS NULL; +CREATE INDEX idx_client_contacts_phone2_hash ON client_contacts(phone2_hash) WHERE phone2_hash IS NOT NULL AND deleted_at IS NULL; +CREATE INDEX idx_client_contacts_client ON client_contacts(client_id) WHERE deleted_at IS NULL; +``` + +**业务注意**: +- `sort_order = 0` 的联系人为主联系人,姓名用于客源姓名显示 +- 手机号标记无效(`phone_is_invalid = TRUE`)时,不影响记录存在,但该号码不再参与重复检测 +- 联系人软删除后客源仍保留,但若所有联系人均被删则客源实际上无有效号码 + +--- + +### 3.3 client_requirements — 需求信息表 + +一个客源可同时有多类需求(二手购房、新房、租房),每类需求独立一条记录。 + +| 字段 | 类型 | 约束 | 业务说明 | +|------|------|------|----------| +| id | UUID | PK | | +| client_id | UUID | NOT NULL, FK→clients, CASCADE | | +| requirement_type | VARCHAR(20) | NOT NULL | `second_hand`=二手 / `new_house`=新房 / `rental`=租房 | +| is_primary | BOOLEAN | NOT NULL DEFAULT TRUE | 是否为主需求(用于列表展示) | +| budget_min | NUMERIC(12,2) | | 最低预算(万元/元,依据需求类型) | +| budget_max | NUMERIC(12,2) | | 最高预算 | +| area_min | NUMERIC(8,2) | | 最小面积(㎡) | +| area_max | NUMERIC(8,2) | | 最大面积 | +| bedroom_counts | SMALLINT[] | | 可接受卧室数:如 [2,3](多选) | +| floor_preferences | VARCHAR(20)[] | | 楼层偏好多选:`no_first`=不要一层 / `low`=低楼层 / `mid`=中楼层 / `high`=高楼层 / `no_top`=不要顶层 | +| orientations | VARCHAR(10)[] | | 朝向多选:`east`/`south`/`west`/`north` | +| decorations | VARCHAR(10)[] | | 装修偏好多选(枚举同 properties.decoration) | +| building_age_ranges | VARCHAR(20)[] | | 楼龄多选:`within_5y`/`5_10y`/`10_15y`/`15_20y`/`over_20y` | +| intent_district_ids | UUID[] | | 意向行政区 ID 数组 | +| intent_business_area_ids | UUID[] | | 意向商圈 ID 数组 | +| intent_complex_names | TEXT | | 意向小区(文本,逗号分隔,最多500字) | +| transportation | VARCHAR(50) | | 交通要求(最多50字) | +| intent_school_names | TEXT | | 意向学校(文本,逗号分隔) | +| school_enrollment_date | DATE | | 入学时间(月份精度,取该月1日存储) | +| traffic_preference | TEXT | | 交通备注 | +| requirement_notes | VARCHAR(200) | | 需求备注(最多200字) | +| created_at | TIMESTAMPTZ | NOT NULL DEFAULT NOW() | | +| updated_at | TIMESTAMPTZ | NOT NULL DEFAULT NOW() | | + +**关键索引**: +```sql +CREATE INDEX idx_client_requirements_client ON client_requirements(client_id); +CREATE INDEX idx_client_requirements_type ON client_requirements(requirement_type, client_id); +-- 智能配房时按预算/面积范围查询 +CREATE INDEX idx_client_requirements_budget ON client_requirements(budget_min, budget_max); +CREATE INDEX idx_client_requirements_area ON client_requirements(area_min, area_max); +``` + +--- + +### 3.4 client_follow_logs — 客源跟进日志 + +> 与 `follow_logs`(房源跟进)结构类似,独立存储以避免跨模块混淆。 + +| 字段 | 类型 | 约束 | 业务说明 | +|------|------|------|----------| +| id | UUID | PK | | +| client_id | UUID | NOT NULL, FK→clients, CASCADE | | +| log_type | VARCHAR(30) | NOT NULL | 见下方枚举 | +| purpose | VARCHAR(50) | | 跟进目的(lookup_items 维护,23项) | +| content | TEXT | | 跟进内容(最少6字,最多500字) | +| log_tag | VARCHAR(50) | | 跟进标签:`has_recording`=有录音 / `has_photo`=有图片 / `not_satisfied`=对房源不满意 / `still_considering`=还在考虑 / `ready_to_deposit`=可交定金 | +| change_detail | JSONB | | 修改跟进专用,格式:`{"field": "grade", "old": "C", "new": "B", "label": "等级"}` | +| is_public | BOOLEAN | NOT NULL DEFAULT TRUE | FALSE=仅本人及上级可见 | +| is_deletable | BOOLEAN | NOT NULL DEFAULT TRUE | 敏感信息查看类型为 FALSE,不可删除 | +| operator_id | UUID | FK→staff, SET NULL | 操作人 | +| operator_snapshot | JSONB | | `{name, store_group, role}`(防止人员调动后显示异常) | +| created_at | TIMESTAMPTZ | NOT NULL DEFAULT NOW() | | +| deleted_at | TIMESTAMPTZ | | 仅 is_deletable=TRUE 时可软删 | + +**log_type 枚举**: +``` +written = 写入跟进(经纪人主动写) +modified = 修改跟进(字段变更自动生成) +sensitive_view= 敏感信息查看(查看号码等,不可删) +other = 其他跟进(系统自动:新增私客/状态变更等) +system = 系统日志 +``` + +**关键索引**: +```sql +CREATE INDEX idx_client_follow_logs_client_time ON client_follow_logs(client_id, created_at DESC) WHERE deleted_at IS NULL; +CREATE INDEX idx_client_follow_logs_type ON client_follow_logs(client_id, log_type, created_at DESC) WHERE deleted_at IS NULL; +CREATE INDEX idx_client_follow_logs_operator ON client_follow_logs(operator_id, created_at DESC) WHERE deleted_at IS NULL; +-- 不可删记录(合规审计) +CREATE INDEX idx_client_follow_sensitive ON client_follow_logs(client_id, created_at DESC) WHERE log_type = 'sensitive_view'; +``` + +--- + +### 3.5 client_follow_log_attachments — 跟进附件 + +| 字段 | 类型 | 约束 | 业务说明 | +|------|------|------|----------| +| id | UUID | PK | | +| follow_log_id | UUID | NOT NULL, FK→client_follow_logs, CASCADE | | +| file_key | TEXT | NOT NULL | R2/S3 存储路径 | +| file_name | VARCHAR(255) | NOT NULL | | +| file_size | INTEGER | NOT NULL | bytes,最大 20MB | +| file_type | VARCHAR(10) | CHECK | `bmp`/`jpg`/`png`/`gif` | +| has_location | BOOLEAN | NOT NULL DEFAULT FALSE | 是否含 GPS 位置信息 | +| sort_order | SMALLINT | NOT NULL DEFAULT 0 | | +| created_at | TIMESTAMPTZ | NOT NULL DEFAULT NOW() | | + +--- + +### 3.6 client_viewings — 带看记录(客源侧视图) + +| 字段 | 类型 | 约束 | 业务说明 | +|------|------|------|----------| +| id | UUID | PK | | +| client_id | UUID | NOT NULL, FK→clients, RESTRICT | | +| property_id | UUID | NOT NULL, FK→properties, RESTRICT | | +| viewing_type | VARCHAR(20) | NOT NULL DEFAULT 'viewing' | `appointment`=预约 / `viewing`=带看 / `revisit`=复看 / `empty`=空看 | +| agent_id | UUID | FK→staff, SET NULL | 主带看经纪人 | +| companion_ids | UUID[] | | 陪看人员 ID 数组(最多5人) | +| cooperator_ids | UUID[] | | 合作带看人 ID 数组(最多5人) | +| scheduled_at | TIMESTAMPTZ | | 预约时间 | +| viewing_start_at | TIMESTAMPTZ | | 实际带看开始时间 | +| viewing_end_at | TIMESTAMPTZ | | 结束时间 | +| situation | TEXT | | 带看情况(必填,≥6字) | +| client_intent | VARCHAR(20) | | 客户意向:`interested`=感兴趣 / `not_interested`=不感兴趣 / `negotiating`=谈判中 / `cancelled`=取消 | +| viewing_progress | SMALLINT | | 带看进度(1=一看,2=二看...,冗余字段,触发器维护) | +| created_at | TIMESTAMPTZ | NOT NULL DEFAULT NOW() | | +| deleted_at | TIMESTAMPTZ | | | +| created_by | UUID | FK→staff, SET NULL | | + +**关键索引**: +```sql +CREATE INDEX idx_client_viewings_client ON client_viewings(client_id, viewing_start_at DESC) WHERE deleted_at IS NULL; +CREATE INDEX idx_client_viewings_property ON client_viewings(property_id) WHERE deleted_at IS NULL; +CREATE INDEX idx_client_viewings_agent ON client_viewings(agent_id) WHERE deleted_at IS NULL; +``` + +--- + +### 3.7 client_property_matches — 智能配房 + +| 字段 | 类型 | 约束 | 业务说明 | +|------|------|------|----------| +| id | UUID | PK | | +| client_id | UUID | NOT NULL, FK→clients, CASCADE | | +| property_id | UUID | NOT NULL, FK→properties, CASCADE | | +| match_source | VARCHAR(20) | NOT NULL DEFAULT 'recorded' | `recorded`=录客配房(基于录入需求) / `system`=系统配房(算法推荐) | +| match_group | VARCHAR(30) | | 分组:`quality_layout`=优质户型 / `price_reduced`=降价 / `hot`=热门 / `newly_listed`=新上 | +| match_score | NUMERIC(5,2) | | 匹配度评分(0-100) | +| match_reasons | JSONB | | 匹配原因详情,格式:`[{"key": "budget", "match": true}, ...]` | +| status | VARCHAR(20) | NOT NULL DEFAULT 'suggested' | `suggested`=待推送 / `shared`=已分享 / `rejected`=已反馈不合适 / `viewed`=客户已查看 | +| shared_at | TIMESTAMPTZ | | 分享时间 | +| feedback | VARCHAR(50) | | 反馈原因(lookup_items 维护) | +| calculated_at | TIMESTAMPTZ | NOT NULL DEFAULT NOW() | 配房计算时间 | +| created_by | UUID | FK→staff, SET NULL | | + +**关键索引**: +```sql +CREATE UNIQUE INDEX idx_client_matches_pair ON client_property_matches(client_id, property_id); +CREATE INDEX idx_client_matches_client ON client_property_matches(client_id, match_source, match_group); +CREATE INDEX idx_client_matches_status ON client_property_matches(client_id, status) WHERE status != 'rejected'; +``` + +--- + +### 3.8 client_status_logs — 状态变更日志(不可删) + +| 字段 | 类型 | 约束 | 业务说明 | +|------|------|------|----------| +| id | UUID | PK | | +| client_id | UUID | NOT NULL, FK→clients, RESTRICT | | +| change_type | VARCHAR(30) | NOT NULL | `status_change`=改状态 / `grade_change`=改等级 / `to_public`=转公客 / `to_transacted`=转成交 / `to_invalid`=转无效 / `owner_change`=改归属人 / `source_change`=改来源 | +| old_value | JSONB | | 变更前快照,格式:`{"status": "buying", "label": "求购"}` | +| new_value | JSONB | | 变更后快照 | +| reason | TEXT | | 变更理由(改状态必填,最多200字) | +| operator_id | UUID | NOT NULL, FK→staff, RESTRICT | | +| operated_at | TIMESTAMPTZ | NOT NULL DEFAULT NOW() | | +| ⚠️ 无 deleted_at | — | — | 此表记录**不可删除** | + +**关键索引**: +```sql +CREATE INDEX idx_client_status_logs_client ON client_status_logs(client_id, operated_at DESC); +CREATE INDEX idx_client_status_logs_type ON client_status_logs(change_type, operated_at DESC); +``` + +--- + +### 3.9 client_favorite_folders — 私客收藏夹 + +| 字段 | 类型 | 约束 | 业务说明 | +|------|------|------|----------| +| id | UUID | PK | | +| staff_id | UUID | NOT NULL, FK→staff, CASCADE | 收藏夹所属经纪人 | +| name | VARCHAR(10) | NOT NULL | 收藏夹名称,最多10字 | +| is_default | BOOLEAN | NOT NULL DEFAULT FALSE | 系统默认收藏夹 | +| sort_order | INTEGER | NOT NULL DEFAULT 0 | | +| created_at | TIMESTAMPTZ | NOT NULL DEFAULT NOW() | | +| deleted_at | TIMESTAMPTZ | | | + +```sql +CREATE INDEX idx_favorite_folders_staff ON client_favorite_folders(staff_id) WHERE deleted_at IS NULL; +-- 每个经纪人只能有一个默认收藏夹 +CREATE UNIQUE INDEX idx_favorite_folders_default ON client_favorite_folders(staff_id) WHERE is_default = TRUE AND deleted_at IS NULL; +``` + +--- + +### 3.10 client_folder_items — 收藏夹中的客源 + +| 字段 | 类型 | 约束 | 业务说明 | +|------|------|------|----------| +| folder_id | UUID | NOT NULL, FK→client_favorite_folders, CASCADE | | +| client_id | UUID | NOT NULL, FK→clients, CASCADE | | +| added_at | TIMESTAMPTZ | NOT NULL DEFAULT NOW() | | +| PRIMARY KEY | (folder_id, client_id) | | | + +```sql +CREATE INDEX idx_folder_items_client ON client_folder_items(client_id); +``` + +--- + +### 3.11 client_school_preferences — 意向学校(多对多) + +> 单独拆表便于学校搜索,避免文本字段模糊查询。 + +| 字段 | 类型 | 约束 | 业务说明 | +|------|------|------|----------| +| id | UUID | PK | | +| requirement_id | UUID | NOT NULL, FK→client_requirements, CASCADE | | +| school_id | UUID | FK→schools, SET NULL | 从学校表选择,允许为 NULL(自由输入) | +| school_name | VARCHAR(100) | NOT NULL | 学校名称(当 school_id 为 NULL 时为手动输入) | +| created_at | TIMESTAMPTZ | NOT NULL DEFAULT NOW() | | + +```sql +CREATE INDEX idx_school_prefs_requirement ON client_school_preferences(requirement_id); +``` + +--- + +## 四、枚举常量 + +### clients.status(客源状态) + +``` +buying = 求购(私客活跃态) +renting = 求租(私客活跃态) +buy_or_rent = 租购(私客活跃态) +suspended = 暂缓(暂时无需求,不计入活跃统计) +bought = 已购(成交客:我购) +rented_done = 已租(成交客:我租) +public = 公客(已转入公客池) +invalid = 无效(号码无效/无意向等) +``` + +**状态流转规则**: +``` +buying/renting/buy_or_rent + → suspended (改状态操作,可逆) + → public (手动转公 or 超时自动转公,不可逆) + → bought/rented_done (转成交,不可逆) + → invalid (转无效,需经理审批后可恢复) +``` + +### clients.grade(等级) + +``` +A_urgent = A(急迫) +A = A +B = B(较强) +C = C(一般,默认值) +D = D(较弱) +E = E(暂不关注) +``` + +### client_status_logs.change_type(变更类型) + +``` +status_change = 改状态(含改等级时同时改状态的情况) +grade_change = 改等级 +to_public = 转公客(manual=手动 or auto=自动) +to_transacted = 转成交(记录成交信息) +to_invalid = 转无效(含无效原因) +owner_change = 改归属人 +source_change = 改来源 +merge = 合并客源(被合并的记录保留日志) +``` + +### clients.activity_level(活跃度分层,系统计算) + +| 值 | 含义 | 触发条件(示例,以运营配置为准) | +|----|------|------| +| `new_matched` | 新配偶 | 录入后 3 天内 | +| `active_7d` | 7日活跃 | 最后跟进在 7 天内 | +| `active_30d` | 30日活跃 | 最后跟进在 30 天内 | +| `active_90d` | 90日活跃 | 最后跟进在 90 天内 | +| `expiring` | 即将过期 | 距自动转公还有 N 天 | +| `frozen` | 冻结(暂缓) | status = suspended | +| `invalid` | 无效 | status = invalid | + +--- + +## 五、查询模式 + +### 5.1 私客列表页(求购 Tab)核心查询 + +```sql +-- 典型:当前经纪人名下 + 求购状态 + 等级筛选 + 按最后跟进排序 +SELECT c.id, c.status, c.grade, c.activity_level, + c.last_follow_at, c.commission_date, c.buying_purpose, + cc.name AS contact_name, -- JOIN 主联系人 + s.name AS owner_name, ou.name AS org_unit_name, + COUNT(cpm.id) AS match_count -- 智能配房数量 +FROM clients c +JOIN client_contacts cc ON cc.client_id = c.id AND cc.sort_order = 0 AND cc.deleted_at IS NULL +JOIN staff s ON s.id = c.owner_id +JOIN org_units ou ON ou.id = c.org_unit_id +LEFT JOIN client_property_matches cpm ON cpm.client_id = c.id AND cpm.status != 'rejected' +WHERE c.client_type = 'private' + AND c.owner_id = :current_staff_id -- 与我相关 + AND c.status IN ('buying', 'buy_or_rent') + AND c.deleted_at IS NULL +GROUP BY c.id, cc.name, s.name, ou.name +ORDER BY c.last_follow_at DESC NULLS LAST +LIMIT 20 OFFSET :offset; +``` + +### 5.2 重复客源检测(录入/编辑时触发) + +```sql +-- 手机号哈希碰撞检测(私客、成交客、公客三池同时检查) +SELECT c.id, c.client_type, c.status, c.client_no, + cc.name AS contact_name +FROM client_contacts cc +JOIN clients c ON cc.client_id = c.id +WHERE cc.phone_hash = :new_phone_hash + AND cc.deleted_at IS NULL + AND c.deleted_at IS NULL + AND c.status != 'invalid'; +``` + +### 5.3 活跃度批量更新(Celery 定时任务,每日凌晨执行) + +```sql +-- 更新活跃度(以7日活跃为例) +UPDATE clients +SET activity_level = 'active_7d', + updated_at = NOW() +WHERE client_type = 'private' + AND status NOT IN ('invalid', 'public', 'bought', 'rented_done') + AND last_follow_at >= NOW() - INTERVAL '7 days' + AND deleted_at IS NULL; +``` + +### 5.4 私客自动转公(超时无跟进,Celery 定时任务) + +```sql +-- 查询应自动转公的私客(阈值由运营配置,假设30天) +SELECT id FROM clients +WHERE client_type = 'private' + AND status IN ('buying', 'renting', 'buy_or_rent') + AND last_follow_at < NOW() - INTERVAL '30 days' + AND is_protected = FALSE + AND deleted_at IS NULL; +-- 后续在 Application 层批量更新 client_type='public', transfer_to_public_type='auto' +``` + +--- + +## 六、触发器 + +### 6.1 last_follow_at 自动维护 + +```sql +-- 每次写入跟进日志时,自动更新 clients.last_follow_at +CREATE OR REPLACE FUNCTION update_client_last_follow() +RETURNS TRIGGER AS $$ +BEGIN + IF NEW.log_type = 'written' THEN + UPDATE clients + SET last_follow_at = NEW.created_at, + last_active_at = NEW.created_at, + updated_at = NOW() + WHERE id = NEW.client_id; + END IF; + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +CREATE TRIGGER trg_client_last_follow + AFTER INSERT ON client_follow_logs + FOR EACH ROW EXECUTE FUNCTION update_client_last_follow(); +``` + +### 6.2 viewing_progress 自动维护 + +```sql +-- 每次新增带看记录时,自动更新 clients 的带看进度冗余字段 +CREATE OR REPLACE FUNCTION update_client_viewing_progress() +RETURNS TRIGGER AS $$ +BEGIN + UPDATE clients + SET updated_at = NOW() + WHERE id = NEW.client_id; + -- Application 层根据 COUNT(viewings) 计算具体进度 + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +CREATE TRIGGER trg_client_viewing_progress + AFTER INSERT ON client_viewings + FOR EACH ROW EXECUTE FUNCTION update_client_viewing_progress(); +``` + +--- + +## 七、禁止操作 + +- ❌ **严禁硬删除 clients 记录**:无效/转公客/成交客均通过 status 和 soft delete 处理,历史跟进/带看依赖外键 +- ❌ **严禁删除 client_status_logs**:状态变更为不可变审计日志 +- ❌ **严禁删除 log_type='sensitive_view' 的跟进记录**:必须通过 `is_deletable=FALSE` 约束在应用层拦截 +- ❌ **严禁明文存储联系人手机号**:必须走 `EncryptedPhoneField`,`phone_hash` 用于索引和重复检测 +- ❌ **严禁跳过状态机流转**:如私客不可直接跳过「求购」变为「无效」而不生成 status log +- ❌ **严禁在没有 `client_type` 过滤的情况下查询客源列表**:私客/公客/成交客数据量均较大,必须按类型隔离查询 +- ❌ **严禁查询 clients 时不带 `deleted_at IS NULL`**:软删除过滤必须存在 diff --git a/Project/fonrey/DATA_MODEL/DATA_MODEL_COMPLEX.md b/Project/fonrey/DATA_MODEL/DATA_MODEL_COMPLEX.md new file mode 100644 index 00000000..0f0f06cc --- /dev/null +++ b/Project/fonrey/DATA_MODEL/DATA_MODEL_COMPLEX.md @@ -0,0 +1,547 @@ +# Fonrey — 楼盘与区域数据模型(DATA_MODEL_COMPLEX) + +> **所属系统**: Fonrey 房产经纪管理系统 +> **版本**: v1.0 +> **日期**: 2026-04-24 +> **关联模块**: `apps/complex/` — 楼盘/小区、楼栋、结构(楼层+房号)、区域、学校 + +--- + +## 一、领域概览(Domain Overview) + +### 核心概念 + +- **Complex(楼盘/小区)**:房源录入的基础底座。每套房源必须归属于某一楼盘。楼盘数据由运营/数据管理员集中维护,质量直接影响房源录入效率和搜索精度。 +- **Building(楼栋/单元)**:楼盘下的物理楼栋,是组织房源位置的第二级。一个楼盘可有多个楼栋(如「1号楼」「2栋2单元」)。 +- **RoomUnit(房号/结构单元)**:楼栋内特定楼层的某个房间标识,是房源定位的最细粒度。支持「标准结构」(经运营标准化)和「非标结构」(未归一化)两类。 +- **District(城区/行政区)**:行政区划,如静安区、闵行区。 +- **BusinessArea(商圈/板块)**:商圈是区域内的细分市场区域,如「南京西路商圈」,一个楼盘可跨多个商圈。 +- **School(学校)**:楼盘对口学校,是买家购房决策的核心关注点。一个楼盘可关联多所学校,一所学校可对口多个楼盘。 +- **MetroLine / MetroStation(地铁线路/站点)**:楼盘与最近地铁站的距离关系,用于通勤筛选。 + +### 关键业务规则 + +1. **楼盘名称不可在编辑页修改**:楼盘名称(`name`)变更须通过「合并楼盘」或「申请流程」处理,防止经纪人随意改名造成数据混乱。 +2. **数据锁定机制**:楼盘有 4 类锁(楼栋锁/房号锁/信息锁/标准房号锁),锁定后对应数据只有管理员可解锁修改。 +3. **非标结构处理**:未与标准结构关联的房号为「非标」,系统记录非标数量,引导运营逐步消除。 +4. **搜索依赖全文检索**:楼盘名称、别名、地址需维护 `search_vector`(`tsvector`)以支持模糊搜索和联想补全。 +5. **地理坐标优先级**:楼盘坐标是区域聚合展示(地图找房)的核心数据,完整度目标 ≥ 90%。 +6. **学校关联影响房源**:从楼盘详情删除对口学校,会级联删除该楼盘下所有房源的对应学区标注。 + +--- + +## 二、实体关系 + +``` +District (城区/行政区) + └── 1:N ── BusinessArea (商圈/板块) + └── N:M ── Complex (through complex_business_areas) + +Complex (楼盘) + ├── N:M ── BusinessArea (through complex_business_areas) + ├── N:M ── School (through complex_schools) + ├── N:M ── MetroStation (through complex_metro_stations, 附带距离) + ├── 1:N ── Building (楼栋/单元) + │ └── 1:N ── RoomUnit (楼层+房号) + ├── 1:N ── ComplexPhoto (楼盘照片:楼盘图/户型图/VR) + ├── 1:N ── ComplexAttachment(附件) + ├── 1:N ── ComplexPriceTrend(价格走势,月度) + └── 1:N ── ComplexAlias (别名) + +MetroLine (地铁线路) + └── 1:N ── MetroStation (站点) +``` + +--- + +## 三、Schema 定义 + +### 3.1 districts — 城区/行政区 + +| 字段 | 类型 | 约束 | 业务说明 | +|------|------|------|----------| +| id | UUID | PK | | +| city | VARCHAR(50) | NOT NULL | 所属城市(支持多城市扩展,如「上海」「北京」) | +| name | VARCHAR(50) | NOT NULL | 行政区名称,如「静安区」 | +| short_name | VARCHAR(20) | | 简称,如「静安」 | +| sort_order | INTEGER | NOT NULL DEFAULT 0 | 列表展示排序 | +| is_active | BOOLEAN | NOT NULL DEFAULT TRUE | FALSE=已停用(不在筛选项中展示) | +| created_at | TIMESTAMPTZ | NOT NULL DEFAULT NOW() | | +| updated_at | TIMESTAMPTZ | NOT NULL DEFAULT NOW() | | + +```sql +CREATE UNIQUE INDEX idx_districts_city_name ON districts(city, name) WHERE is_active = TRUE; +``` + +--- + +### 3.2 business_areas — 商圈/板块 + +| 字段 | 类型 | 约束 | 业务说明 | +|------|------|------|----------| +| id | UUID | PK | | +| district_id | UUID | NOT NULL, FK→districts, RESTRICT | 所属城区 | +| name | VARCHAR(100) | NOT NULL | 商圈名称 | +| sort_order | INTEGER | NOT NULL DEFAULT 0 | | +| latitude | NUMERIC(10,7) | | 商圈中心坐标(纬度) | +| longitude | NUMERIC(10,7) | | 商圈中心坐标(经度) | +| is_active | BOOLEAN | NOT NULL DEFAULT TRUE | | +| created_at | TIMESTAMPTZ | NOT NULL DEFAULT NOW() | | +| updated_at | TIMESTAMPTZ | NOT NULL DEFAULT NOW() | | + +```sql +CREATE INDEX idx_business_areas_district ON business_areas(district_id) WHERE is_active = TRUE; +CREATE UNIQUE INDEX idx_business_areas_name ON business_areas(district_id, name); +``` + +--- + +### 3.3 metro_lines — 地铁线路 + +| 字段 | 类型 | 约束 | 业务说明 | +|------|------|------|----------| +| id | UUID | PK | | +| city | VARCHAR(50) | NOT NULL | 所属城市 | +| name | VARCHAR(50) | NOT NULL | 线路名,如「1号线」 | +| color | VARCHAR(7) | | 线路颜色 HEX(如 `#E3002B`) | +| sort_order | INTEGER | NOT NULL DEFAULT 0 | | +| is_active | BOOLEAN | NOT NULL DEFAULT TRUE | | + +--- + +### 3.4 metro_stations — 地铁站点 + +| 字段 | 类型 | 约束 | 业务说明 | +|------|------|------|----------| +| id | UUID | PK | | +| metro_line_id | UUID | NOT NULL, FK→metro_lines, CASCADE | 所属线路 | +| name | VARCHAR(50) | NOT NULL | 站名 | +| latitude | NUMERIC(10,7) | | 站点坐标 | +| longitude | NUMERIC(10,7) | | | +| sort_order | INTEGER | NOT NULL DEFAULT 0 | 沿线排序 | +| is_active | BOOLEAN | NOT NULL DEFAULT TRUE | | + +```sql +CREATE INDEX idx_metro_stations_line ON metro_stations(metro_line_id) WHERE is_active = TRUE; +``` + +--- + +### 3.5 schools — 学校 + +| 字段 | 类型 | 约束 | 业务说明 | +|------|------|------|----------| +| id | UUID | PK | | +| district_id | UUID | FK→districts, SET NULL | 所属城区 | +| name | VARCHAR(100) | NOT NULL | 学校名称 | +| type | VARCHAR(20) | | 学校类型:`primary`=小学 / `middle`=初中 / `high`=高中 / `k9`=九年一贯制 / `k12`=十二年一贯制 | +| nature | VARCHAR(20) | | 学校性质:`public`=公立 / `private`=私立 / `international`=国际学校 | +| level | VARCHAR(20) | | 学校等级:`normal`=普通 / `key`=重点 / `top`=名校 | +| is_active | BOOLEAN | NOT NULL DEFAULT TRUE | | +| created_at | TIMESTAMPTZ | NOT NULL DEFAULT NOW() | | +| updated_at | TIMESTAMPTZ | NOT NULL DEFAULT NOW() | | + +```sql +CREATE INDEX idx_schools_district ON schools(district_id) WHERE is_active = TRUE; +CREATE INDEX idx_schools_name_trgm ON schools USING gin(name gin_trgm_ops); +``` + +--- + +### 3.6 complexes — 楼盘/小区(核心基础表) + +| 字段 | 类型 | 约束 | 业务说明 | +|------|------|------|----------| +| id | UUID | PK | | +| name | VARCHAR(200) | NOT NULL | 标准楼盘名称,**不可在编辑页修改**(需走合并/申请流程) | +| district_id | UUID | FK→districts, SET NULL | 所属城区 | +| address | VARCHAR(500) | | 详细地址(不可在编辑页修改,需走纠错流程) | +| address_summary | VARCHAR(100) | | 概要地址(如「海波路1000弄」,可编辑) | +| latitude | NUMERIC(10,7) | | 楼盘坐标(纬度),完整度目标 ≥ 90% | +| longitude | NUMERIC(10,7) | | | +| **物业属性** | | | | +| property_usage_types | VARCHAR(20)[] | | 物业类型多选:`residential`/`villa`/`commercial_residential`/`commercial`/`office`/`other` | +| building_structure | VARCHAR(30) | | 楼栋结构枚举(运营维护):`unit_room`=单元-房号 / `other`=其他 | +| building_type | VARCHAR(20) | | 建筑类型:`slab`=板楼 / `tower`=塔楼 / `slab_tower`=板塔结合 | +| land_use_years | VARCHAR(30) | | 土地使用年限,如「70年」 | +| built_year | SMALLINT | | 竣工年份(可多选,存最早竣工年) | +| built_years | SMALLINT[] | | 竣工年份多值(楼盘分期竣工) | +| ownership_category | VARCHAR(30)[] | | 权属类别多选(运营维护枚举) | +| total_units | INTEGER | | 单元总数 | +| total_households | INTEGER | | 总户数 | +| **建设信息** | | | | +| total_floor_area | NUMERIC(12,2) | | 小区总建筑面积(m²) | +| plot_area | NUMERIC(12,2) | | 小区占地面积(m²) | +| plot_ratio | NUMERIC(5,2) | | 容积率 | +| green_rate | NUMERIC(5,2) | | 绿化率(%) | +| developer | VARCHAR(200) | | 开发商 | +| **物业信息** | | | | +| property_company | VARCHAR(200) | | 物业公司 | +| property_fee | NUMERIC(8,2) | | 物业费(元/m²/月) | +| property_phone | VARCHAR(30) | | 物业电话 | +| **停车** | | | | +| parking_total | INTEGER | | 车位总数 | +| parking_underground | INTEGER | | 地下车位数 | +| parking_ratio | VARCHAR(20) | | 停车位配比,如「100:63」 | +| **配套** | | | | +| water_type | VARCHAR(10) | | `civil`=民水 / `commercial`=商水 | +| electricity_type | VARCHAR(10) | | `civil`=民电 / `commercial`=商电 | +| has_central_heating | BOOLEAN | | 是否统一供暖 | +| has_gas | BOOLEAN | | 是否有燃气 | +| remarks | TEXT | | 备注 | +| **锁定状态** | | | | +| lock_building | BOOLEAN | NOT NULL DEFAULT FALSE | 楼栋锁(锁定后不可增删楼栋) | +| lock_room | BOOLEAN | NOT NULL DEFAULT FALSE | 房号锁 | +| lock_info | BOOLEAN | NOT NULL DEFAULT FALSE | 信息锁(锁定后基本信息只读) | +| lock_standard_room | BOOLEAN | NOT NULL DEFAULT FALSE | 标准房号锁 | +| **全文检索** | | | | +| search_vector | TSVECTOR | | 由触发器自动维护(name + alias + address) | +| **状态** | | | | +| is_active | BOOLEAN | NOT NULL DEFAULT TRUE | FALSE=已停用楼盘 | +| created_at | TIMESTAMPTZ | NOT NULL DEFAULT NOW() | | +| updated_at | TIMESTAMPTZ | NOT NULL DEFAULT NOW() | | +| deleted_at | TIMESTAMPTZ | | 软删除 | +| created_by | UUID | FK→staff, SET NULL | | +| updated_by | UUID | FK→staff, SET NULL | | + +**关键索引**: +```sql +CREATE INDEX idx_complexes_district ON complexes(district_id) WHERE deleted_at IS NULL; +CREATE INDEX idx_complexes_name_trgm ON complexes USING gin(name gin_trgm_ops); -- 模糊搜索 +CREATE INDEX idx_complexes_search ON complexes USING gin(search_vector); -- 全文搜索 +CREATE INDEX idx_complexes_geo ON complexes(latitude, longitude) WHERE deleted_at IS NULL AND latitude IS NOT NULL; +CREATE INDEX idx_complexes_active ON complexes(is_active) WHERE deleted_at IS NULL; +``` + +--- + +### 3.7 complex_aliases — 楼盘别名 + +| 字段 | 类型 | 约束 | 业务说明 | +|------|------|------|----------| +| id | UUID | PK | | +| complex_id | UUID | NOT NULL, FK→complexes, CASCADE | | +| alias | VARCHAR(200) | NOT NULL | 别名(最多20字/条,多别名多行存储) | +| is_system | BOOLEAN | NOT NULL DEFAULT FALSE | TRUE=系统/标准别名(只读),FALSE=用户自定义 | +| created_at | TIMESTAMPTZ | NOT NULL DEFAULT NOW() | | +| created_by | UUID | FK→staff, SET NULL | | + +```sql +CREATE INDEX idx_complex_aliases_complex ON complex_aliases(complex_id); +CREATE INDEX idx_complex_aliases_alias_trgm ON complex_aliases USING gin(alias gin_trgm_ops); +``` + +--- + +### 3.8 complex_business_areas — 楼盘与商圈多对多 + +| 字段 | 类型 | 约束 | 业务说明 | +|------|------|------|----------| +| complex_id | UUID | NOT NULL, FK→complexes, CASCADE | | +| business_area_id | UUID | NOT NULL, FK→business_areas, CASCADE | | +| is_primary | BOOLEAN | NOT NULL DEFAULT FALSE | 主商圈(唯一)用于列表显示 | +| PRIMARY KEY | (complex_id, business_area_id) | | | + +```sql +-- 主商圈只能有一个 +CREATE UNIQUE INDEX idx_complex_biz_area_primary ON complex_business_areas(complex_id) WHERE is_primary = TRUE; +``` + +--- + +### 3.9 complex_schools — 楼盘与学校关联 + +| 字段 | 类型 | 约束 | 业务说明 | +|------|------|------|----------| +| complex_id | UUID | NOT NULL, FK→complexes, CASCADE | | +| school_id | UUID | NOT NULL, FK→schools, CASCADE | | +| zone_type | VARCHAR(30) | | 学区类型:`guaranteed`=对口 / `reference`=参考 / `lottery`=摇号 | +| PRIMARY KEY | (complex_id, school_id) | | | + +```sql +CREATE INDEX idx_complex_schools_school ON complex_schools(school_id); +``` + +**业务注意**:删除此关联记录时,需同步清理对应房源的学区标注(Application 层事务处理) + +--- + +### 3.10 complex_metro_stations — 楼盘与地铁站关联 + +| 字段 | 类型 | 约束 | 业务说明 | +|------|------|------|----------| +| complex_id | UUID | NOT NULL, FK→complexes, CASCADE | | +| station_id | UUID | NOT NULL, FK→metro_stations, CASCADE | | +| distance_meters | INTEGER | | 步行距离(米) | +| PRIMARY KEY | (complex_id, station_id) | | | + +```sql +CREATE INDEX idx_complex_metro_complex ON complex_metro_stations(complex_id); +CREATE INDEX idx_complex_metro_station ON complex_metro_stations(station_id); +``` + +--- + +### 3.11 buildings — 楼栋/单元 + +| 字段 | 类型 | 约束 | 业务说明 | +|------|------|------|----------| +| id | UUID | PK | | +| complex_id | UUID | NOT NULL, FK→complexes, CASCADE | | +| name | VARCHAR(50) | NOT NULL | 楼栋名,如「1号楼」「A栋2单元」 | +| is_standard | BOOLEAN | NOT NULL DEFAULT FALSE | TRUE=标准结构(经运营核准) | +| property_usage_type | VARCHAR(20) | | 物业类型(可与楼盘不同,如商住楼盘内有纯商铺楼栋) | +| built_year | SMALLINT | | 竣工年份 | +| total_floors | SMALLINT | | 总层数 | +| land_use_years | VARCHAR(30) | | 土地使用年限 | +| has_elevator | BOOLEAN | | 是否有电梯 | +| school_id | UUID | FK→schools, SET NULL | 关联对口学校(楼栋级别的学区差异) | +| is_active | BOOLEAN | NOT NULL DEFAULT TRUE | | +| created_at | TIMESTAMPTZ | NOT NULL DEFAULT NOW() | | +| updated_at | TIMESTAMPTZ | NOT NULL DEFAULT NOW() | | +| created_by | UUID | FK→staff, SET NULL | | + +```sql +CREATE INDEX idx_buildings_complex ON buildings(complex_id) WHERE is_active = TRUE; +CREATE UNIQUE INDEX idx_buildings_name ON buildings(complex_id, name) WHERE is_active = TRUE; +``` + +--- + +### 3.12 room_units — 房号/结构单元(楼层+房间号) + +| 字段 | 类型 | 约束 | 业务说明 | +|------|------|------|----------| +| id | UUID | PK | | +| building_id | UUID | NOT NULL, FK→buildings, CASCADE | | +| floor | SMALLINT | NOT NULL | 楼层(实际层数,地下为负数) | +| floor_name | VARCHAR(20) | | 楼层名称展示,如「1层」「B1层」 | +| room_no | VARCHAR(30) | NOT NULL | 房号,如「01」「101」 | +| display_no | VARCHAR(50) | | 展示用完整房号,如「3-1-101」 | +| is_standard | BOOLEAN | NOT NULL DEFAULT FALSE | TRUE=已归一化为标准结构 | +| is_active | BOOLEAN | NOT NULL DEFAULT TRUE | FALSE=已拆除/不存在 | +| created_at | TIMESTAMPTZ | NOT NULL DEFAULT NOW() | | +| updated_at | TIMESTAMPTZ | NOT NULL DEFAULT NOW() | | + +```sql +CREATE INDEX idx_room_units_building ON room_units(building_id) WHERE is_active = TRUE; +CREATE UNIQUE INDEX idx_room_units_unique ON room_units(building_id, floor, room_no) WHERE is_active = TRUE; +``` + +--- + +### 3.13 complex_photos — 楼盘照片 + +| 字段 | 类型 | 约束 | 业务说明 | +|------|------|------|----------| +| id | UUID | PK | | +| complex_id | UUID | NOT NULL, FK→complexes, CASCADE | | +| category | VARCHAR(20) | NOT NULL | `complex`=楼盘图 / `layout`=户型图 / `vr`=VR全景 / `other`=其他 | +| file_key | TEXT | NOT NULL | R2/S3 路径 | +| thumbnail_key | TEXT | | 缩略图路径 | +| file_name | VARCHAR(255) | | | +| file_size | INTEGER | | bytes | +| width | INTEGER | | | +| height | INTEGER | | | +| is_cover | BOOLEAN | NOT NULL DEFAULT FALSE | 楼盘封面图 | +| sort_order | SMALLINT | NOT NULL DEFAULT 0 | | +| created_at | TIMESTAMPTZ | NOT NULL DEFAULT NOW() | | +| created_by | UUID | FK→staff, SET NULL | | + +```sql +CREATE INDEX idx_complex_photos_complex ON complex_photos(complex_id); +CREATE INDEX idx_complex_photos_category ON complex_photos(complex_id, category); +CREATE UNIQUE INDEX idx_complex_photos_cover ON complex_photos(complex_id) WHERE is_cover = TRUE; +``` + +--- + +### 3.14 complex_attachments — 楼盘附件 + +| 字段 | 类型 | 约束 | 业务说明 | +|------|------|------|----------| +| id | UUID | PK | | +| complex_id | UUID | NOT NULL, FK→complexes, CASCADE | | +| file_key | TEXT | NOT NULL | | +| file_name | VARCHAR(255) | NOT NULL | | +| file_size | INTEGER | | | +| file_type | VARCHAR(50) | | MIME type | +| sort_order | SMALLINT | NOT NULL DEFAULT 0 | | +| created_at | TIMESTAMPTZ | NOT NULL DEFAULT NOW() | | +| created_by | UUID | FK→staff, SET NULL | | + +--- + +### 3.15 complex_price_trends — 楼盘价格走势(月度) + +| 字段 | 类型 | 约束 | 业务说明 | +|------|------|------|----------| +| id | UUID | PK | | +| complex_id | UUID | NOT NULL, FK→complexes, CASCADE | | +| record_month | DATE | NOT NULL | 月份(统一存为该月1日,如 2026-04-01) | +| avg_sale_price | NUMERIC(12,2) | | 月均售价(万元/套) | +| avg_unit_price | NUMERIC(10,2) | | 月均单价(元/m²) | +| transaction_count | INTEGER | | 成交套数 | +| listing_count | INTEGER | | 当月挂牌套数 | +| created_at | TIMESTAMPTZ | NOT NULL DEFAULT NOW() | | + +```sql +CREATE UNIQUE INDEX idx_complex_price_trend_month ON complex_price_trends(complex_id, record_month); +CREATE INDEX idx_complex_price_trend_complex ON complex_price_trends(complex_id, record_month DESC); +``` + +--- + +## 四、枚举常量 + +### complexes.building_type(建筑类型) + +``` +slab = 板楼 +tower = 塔楼 +slab_tower = 板塔结合 +``` + +### complexes.water_type / electricity_type + +``` +civil = 民水/民电(住宅水电费率) +commercial = 商水/商电(商业水电费率,费用较高,影响买家决策) +``` + +### complex_schools.zone_type(学区类型) + +``` +guaranteed = 对口(直升) +reference = 参考(可能入读) +lottery = 摇号(通过摇号入学) +``` + +### buildings.is_standard / room_units.is_standard + +``` +TRUE = 已标准化(楼栋/房号已经运营核准,可用于精准房源定位) +FALSE = 非标(用户自输入,未核准,存在歧义风险) +``` + +--- + +## 五、查询模式 + +### 5.1 楼盘名称联想搜索(录入房源时的自动补全) + +```sql +-- 使用全文检索向量,支持中文分词近似匹配 +SELECT id, name, address_summary, district_id +FROM complexes +WHERE search_vector @@ plainto_tsquery('simple', :keyword) + OR name ILIKE :keyword_prefix -- 前缀精确匹配优先 + AND deleted_at IS NULL + AND is_active = TRUE +ORDER BY + ts_rank(search_vector, plainto_tsquery('simple', :keyword)) DESC, + name +LIMIT 20; +``` + +### 5.2 楼盘列表(含房源数量统计) + +```sql +SELECT + c.id, c.name, c.address, c.latitude, c.longitude, + d.name AS district_name, + ba.name AS primary_business_area, + COUNT(DISTINCT b.id) AS building_count, + COUNT(DISTINCT p.id) FILTER (WHERE p.status IN ('for_sale','for_sale_rent')) AS sale_count, + COUNT(DISTINCT p.id) FILTER (WHERE p.status IN ('for_rent','for_sale_rent')) AS rent_count +FROM complexes c +LEFT JOIN districts d ON d.id = c.district_id +LEFT JOIN complex_business_areas cba ON cba.complex_id = c.id AND cba.is_primary = TRUE +LEFT JOIN business_areas ba ON ba.id = cba.business_area_id +LEFT JOIN buildings b ON b.complex_id = c.id AND b.is_active = TRUE +LEFT JOIN properties p ON p.complex_id = c.id AND p.deleted_at IS NULL +WHERE c.deleted_at IS NULL + AND c.district_id = ANY(:district_ids) -- 区域筛选 +GROUP BY c.id, d.name, ba.name +ORDER BY c.name +LIMIT 20 OFFSET :offset; +``` + +### 5.3 查询楼盘下的楼层-房号矩阵(结构管理) + +```sql +-- 选中单元后,加载楼层×房号矩阵 +SELECT + ru.floor, + ru.floor_name, + ru.room_no, + ru.display_no, + ru.is_standard, + p.id AS property_id, -- 如果该房号已有房源,关联显示 + p.status AS property_status +FROM room_units ru +LEFT JOIN properties p ON p.building_id = ru.building_id + AND p.room_no = ru.room_no + AND p.floor = ru.floor + AND p.deleted_at IS NULL +WHERE ru.building_id = :building_id + AND ru.is_active = TRUE +ORDER BY ru.floor DESC, ru.room_no; +``` + +--- + +## 六、触发器 + +### 6.1 楼盘全文检索向量(含别名) + +```sql +CREATE OR REPLACE FUNCTION update_complex_search_vector() +RETURNS TRIGGER AS $$ +BEGIN + NEW.search_vector := + setweight(to_tsvector('simple', COALESCE(NEW.name, '')), 'A') || + setweight(to_tsvector('simple', COALESCE(NEW.address_summary, '')), 'B') || + setweight(to_tsvector('simple', COALESCE(NEW.address, '')), 'C'); + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +CREATE TRIGGER trg_complex_search_vector + BEFORE INSERT OR UPDATE OF name, address_summary, address + ON complexes + FOR EACH ROW EXECUTE FUNCTION update_complex_search_vector(); + +-- 别名变更时同步更新楼盘 search_vector +CREATE OR REPLACE FUNCTION update_complex_search_on_alias() +RETURNS TRIGGER AS $$ +BEGIN + UPDATE complexes + SET search_vector = ( + setweight(to_tsvector('simple', COALESCE(name, '')), 'A') || + setweight(to_tsvector('simple', + COALESCE((SELECT string_agg(alias, ' ') FROM complex_aliases WHERE complex_id = complexes.id), '')), 'B') || + setweight(to_tsvector('simple', COALESCE(address_summary, '')), 'C') || + setweight(to_tsvector('simple', COALESCE(address, '')), 'D') + ), + updated_at = NOW() + WHERE id = COALESCE(NEW.complex_id, OLD.complex_id); + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +CREATE TRIGGER trg_complex_alias_search + AFTER INSERT OR UPDATE OR DELETE ON complex_aliases + FOR EACH ROW EXECUTE FUNCTION update_complex_search_on_alias(); +``` + +--- + +## 七、禁止操作 + +- ❌ **严禁直接修改 complexes.name**:楼盘名称变更必须走「楼盘合并」流程或「管理员申请」,通过 Application 层拦截任何直接 UPDATE `name` 字段的操作 +- ❌ **严禁硬删除 complexes 记录**:有房源关联的楼盘不可删除(`RESTRICT` 外键),已有房源的楼盘软删除后房源仍可正常访问 +- ❌ **严禁删除 complex_schools 关联而不清理房源学区标注**:必须在同一事务中清理对应 `property.school_ids` 数据 +- ❌ **严禁在楼盘坐标为 NULL 时将其用于地图聚合**:坐标为空时不参与地图展示,过滤条件:`WHERE latitude IS NOT NULL` +- ❌ **严禁在 lock_info=TRUE 时绕过 Application 层直接修改楼盘信息字段**:锁定状态必须在服务层检查,不依赖数据库约束 +- ❌ **严禁在没有 deleted_at IS NULL 过滤的情况下查询 complexes**:楼盘软删除过滤必须存在 diff --git a/Project/fonrey/DATA_MODEL/DATA_MODEL_ORG.md b/Project/fonrey/DATA_MODEL/DATA_MODEL_ORG.md new file mode 100644 index 00000000..8219a4b6 --- /dev/null +++ b/Project/fonrey/DATA_MODEL/DATA_MODEL_ORG.md @@ -0,0 +1,341 @@ +# Fonrey — 组织人事数据模型(DATA_MODEL_ORG) + +> **所属系统**: Fonrey 房产经纪管理系统 +> **版本**: v1.0 +> **日期**: 2026-04-24 +> **关联模块**: `apps/org/` — 组织架构、员工档案、人事异动、账号体系 + +--- + +## 一、领域概览(Domain Overview) + +### 核心概念 + +- **OrgUnit(组织节点)**:公司组织树的节点,类型涵盖事业部 / 大区 / 区域 / 片区 / 门店 / 店组 / 职能。所有业务数据(房源、客源)最终归属到门店或店组级节点。 +- **Staff(员工)**:系统的核心操作人员,与 Django `auth_user` 绑定登录账号,与 `org_units` 绑定岗位归属。员工的组织归属直接影响数据可见范围。 +- **StaffTransferLog(人事异动记录)**:记录员工从入职到离职的全生命周期状态变化。每次异动(入职/调动/离职/复职)自动生成一条不可删除的日志。 +- **StaffAccount(账号信息)**:员工的多平台登录账号体系,包括 Fonrey 主账号 / 58安居客 / 中国网络经纪人等。 + +### 关键业务规则 + +1. **组织层级约束**:店组级部门 **必须** 挂在门店下;经纪人/店管的所属部门 **只能** 是门店或店组。 +2. **经纪人定义**:职务类别为「置业顾问」的员工即为经纪人,受业务规则特殊约束。 +3. **人员异动强制日志**:入职、调动、离职、复职等操作均自动生成 `staff_transfer_logs` 记录,不可删除。 +4. **账号与员工联动**:员工离职后,对应的 `auth_user.is_active` 设为 `False`,不可登录;复职后由管理员手动恢复。 +5. **手机号敏感字段**:员工手机号 AES-256-GCM 加密存储,SHA-256 哈希用于唯一性校验,通讯录展示脱敏格式。 +6. **数据归属继承**:员工调动时,名下房源/客源默认跟随员工到新部门;离职时可选择转移给指定账号。 + +--- + +## 二、实体关系 + +``` +OrgUnit (树形自引用,物化路径) + │ + ├── 1:N ── Staff (员工归属一个部门) + │ │ + │ ├── 1:1 ── auth_user (Django 登录账号) + │ ├── 1:N ── StaffTransferLog (人事异动记录) + │ ├── 1:N ── StaffRewardPunish (奖惩记录) + │ ├── 1:N ── StaffAccount (第三方账号绑定) + │ └── 1:N ── StaffRemark (管理员备注) + │ + └── 1:1 ── OrgUnit.parent_id (自引用) +``` + +--- + +## 三、Schema 定义 + +### 3.1 org_units — 组织节点表 + +| 字段 | 类型 | 约束 | 业务说明 | +|------|------|------|----------| +| id | UUID | PK | | +| name | VARCHAR(100) | NOT NULL | 部门/组织名称 | +| type | VARCHAR(20) | NOT NULL, CHECK | 枚举:`company` / `division`(事业部) / `region`(大区) / `area`(区域) / `district`(片区) / `store`(门店) / `group`(店组) / `functional`(职能) | +| parent_id | UUID | FK→self, RESTRICT | 父节点,根节点为 NULL | +| path | TEXT | NOT NULL | 物化路径:`/root_id/.../self_id/`,用于子树查询 | +| depth | SMALLINT | NOT NULL DEFAULT 0 | 节点深度(根=0),最大支持 8 层 | +| sort_order | INTEGER | NOT NULL DEFAULT 0 | 同级排序 | +| attribute | VARCHAR(10) | | 直营/加盟,枚举:`direct` / `franchise` | +| address_city | VARCHAR(50) | | 部门所在城市 | +| address_district | VARCHAR(50) | | 部门所在县区 | +| address_detail | VARCHAR(200) | | 详细地址 | +| latitude | NUMERIC(10,7) | | 坐标(部门定位针) | +| longitude | NUMERIC(10,7) | | 坐标 | +| manager_id | UUID | FK→staff.id, SET NULL | 部门负责人(循环依赖,Application 层维护) | +| established_at | DATE | | 成立时间 | +| phone | VARCHAR(30) | | 部门联系电话 | +| ext_start | INTEGER | | 分机号范围:起始 | +| ext_end | INTEGER | | 分机号范围:结束 | +| is_active | BOOLEAN | NOT NULL DEFAULT TRUE | FALSE = 已关闭部门,仍可在筛选中显示 | +| created_at | TIMESTAMPTZ | NOT NULL DEFAULT NOW() | | +| updated_at | TIMESTAMPTZ | NOT NULL DEFAULT NOW() | | +| deleted_at | TIMESTAMPTZ | | 软删除 | + +**关键索引**: +```sql +CREATE INDEX idx_org_units_parent ON org_units(parent_id) WHERE deleted_at IS NULL; +CREATE INDEX idx_org_units_path_prefix ON org_units(path text_pattern_ops); -- 路径前缀查询 +CREATE INDEX idx_org_units_type ON org_units(type) WHERE deleted_at IS NULL AND is_active = TRUE; +``` + +**业务注意**: +- 查询某部门及所有下级:`WHERE path LIKE '/root_id/{target_id}/%'` +- 店组(`group`)的 `parent_id` 必须指向一个 `store` 节点,新增前需校验 + +--- + +### 3.2 staff — 员工表 + +| 字段 | 类型 | 约束 | 业务说明 | +|------|------|------|----------| +| id | UUID | PK | | +| org_unit_id | UUID | NOT NULL, FK→org_units | 当前所属组织节点(门店或店组) | +| user_id | INTEGER | UNIQUE, FK→auth_user | Django auth 登录账号 ID | +| name | VARCHAR(50) | NOT NULL | 真实姓名 | +| nickname | VARCHAR(50) | | 昵称(通讯录/显示名) | +| employee_no | VARCHAR(30) | UNIQUE | 员工工号,系统自动生成或手动录入 | +| role | VARCHAR(30) | NOT NULL, CHECK | 系统角色枚举:`agent`(经纪人) / `store_manager` / `area_manager` / `admin` / `operator` / `system` | +| job_title | VARCHAR(100) | | 职务名称,如「高级业务员」 | +| job_category | VARCHAR(50) | | 职务类别,如「置业顾问」(经纪人判定字段) | +| job_level | SMALLINT | | 职级(数字) | +| supervisor_id | UUID | FK→staff.id, SET NULL | 直属上级 | +| status | VARCHAR(20) | NOT NULL DEFAULT 'active' | `active`(在职) / `probation`(试用) / `resigned`(离职) / `frozen`(冻结) | +| phone_enc | BYTEA | | AES-256-GCM 加密手机号 | +| phone_hash | VARCHAR(64) | | SHA-256 哈希,用于唯一性索引 | +| phone_hide | BOOLEAN | NOT NULL DEFAULT FALSE | 通讯录是否隐藏手机号 | +| email | VARCHAR(255) | | 邮箱 | +| extension | VARCHAR(20) | | 分机号 | +| avatar_key | TEXT | | R2/S3 头像路径 | +| is_active | BOOLEAN | NOT NULL DEFAULT TRUE | FALSE 时账号不可登录(联动 auth_user.is_active) | +| is_system_admin | BOOLEAN | NOT NULL DEFAULT FALSE | 是否为系统管理员(影响权限上限) | +| first_joined_at | DATE | | 首次入职日期(计算工龄起点) | +| rejoined_at | DATE | | 最近复职日期 | +| resigned_at | DATE | | 最近离职日期 | +| joined_count | SMALLINT | NOT NULL DEFAULT 1 | 累计入职次数 | +| industry_exp_years | SMALLINT | | 行业经验(年) | +| mentor_id | UUID | FK→staff.id, SET NULL | 师傅(带教员工) | +| business_type | VARCHAR(50) | | 业务类型 | +| bank_name | VARCHAR(100) | | 银行名称 | +| bank_account | VARCHAR(50) | | 银行卡号(内部财务用) | +| partner_no | VARCHAR(50) | | 联号 | +| recruit_by_id | UUID | FK→staff.id, SET NULL | 招聘人 | +| recruit_source | VARCHAR(50) | | 招聘来源 | +| referrer_id | UUID | FK→staff.id, SET NULL | 转介人 | +| created_at | TIMESTAMPTZ | NOT NULL DEFAULT NOW() | | +| updated_at | TIMESTAMPTZ | NOT NULL DEFAULT NOW() | | +| deleted_at | TIMESTAMPTZ | | 软删除(离职员工仍保留记录) | + +**关键索引**: +```sql +CREATE UNIQUE INDEX idx_staff_employee_no ON staff(employee_no) WHERE deleted_at IS NULL; +CREATE UNIQUE INDEX idx_staff_phone_hash ON staff(phone_hash) WHERE deleted_at IS NULL; +CREATE INDEX idx_staff_org_unit ON staff(org_unit_id) WHERE deleted_at IS NULL; +CREATE INDEX idx_staff_supervisor ON staff(supervisor_id) WHERE deleted_at IS NULL; +CREATE INDEX idx_staff_status ON staff(status) WHERE deleted_at IS NULL; +``` + +**业务注意**: +- `is_active = FALSE` 时对应 `auth_user.is_active` 同步设为 False,通过 Django signal 实现 +- 离职员工(`status = 'resigned'`)不可硬删除,保留档案以便房源/客源历史关联查询 +- 经纪人判定:`job_category = '置业顾问'`,部分权限逻辑基于此字段 + +--- + +### 3.3 staff_personal_info — 员工个人信息扩展表 + +| 字段 | 类型 | 约束 | 业务说明 | +|------|------|------|----------| +| id | UUID | PK | | +| staff_id | UUID | UNIQUE, NOT NULL, FK→staff | 1:1 关系 | +| gender | VARCHAR(10) | | `male` / `female` / `unknown` | +| id_type | VARCHAR(20) | | 证件类型:`id_card`(身份证) / `passport` / `other` | +| id_number_enc | BYTEA | | 证件号码(AES 加密) | +| id_number_hash | VARCHAR(64) | | SHA-256 哈希(实名认证比对用) | +| id_verified | BOOLEAN | NOT NULL DEFAULT FALSE | 是否实名认证通过 | +| id_verified_at | TIMESTAMPTZ | | 认证时间 | +| birthdate | DATE | | 出生日期 | +| native_place | VARCHAR(100) | | 籍贯 | +| domicile_type | VARCHAR(20) | | 户籍性质 | +| marital_status | VARCHAR(20) | | 婚姻状况 | +| political_status | VARCHAR(20) | | 政治面貌 | +| has_children | BOOLEAN | | 有无子女 | +| education_level | VARCHAR(20) | | 最高学历 | +| ethnicity | VARCHAR(20) | | 民族 | +| domicile_address | VARCHAR(200) | | 户口所在地 | +| residence_address | VARCHAR(200) | | 居住地址 | +| work_start_date | DATE | | 参加工作时间 | +| emergency_contact | VARCHAR(50) | | 紧急联系人 | +| emergency_phone_enc | BYTEA | | 紧急联系人电话(加密) | +| updated_at | TIMESTAMPTZ | NOT NULL DEFAULT NOW() | | +| updated_by | UUID | FK→staff.id, SET NULL | | + +--- + +### 3.4 staff_transfer_logs — 人事异动记录 + +| 字段 | 类型 | 约束 | 业务说明 | +|------|------|------|----------| +| id | UUID | PK | | +| staff_id | UUID | NOT NULL, FK→staff, RESTRICT | 被操作员工 | +| transfer_type | VARCHAR(30) | NOT NULL, CHECK | 枚举见下方 | +| old_value | JSONB | | 变动前的值快照,格式:`{"field": "org_unit_id", "value": "...", "label": "门店A"}` | +| new_value | JSONB | | 变动后的值快照 | +| transfer_date | DATE | NOT NULL | 异动生效日期(可以是过去日期) | +| remarks | VARCHAR(50) | | 备注(最多50字) | +| operator_id | UUID | NOT NULL, FK→staff, RESTRICT | 操作人 | +| operated_at | TIMESTAMPTZ | NOT NULL DEFAULT NOW() | 系统操作时间 | +| created_at | TIMESTAMPTZ | NOT NULL DEFAULT NOW() | | +| ⚠️ 无 deleted_at | — | — | 异动记录**不可删除** | + +**transfer_type 枚举**: +``` +onboard = 入职 +transfer = 调动(含平调/晋升/降职) +resign = 离职 +rejoin = 复职 +supervisor_change = 上级变动 +role_change = 角色变更 +freeze = 账号冻结 +unfreeze = 账号恢复 +``` + +**关键索引**: +```sql +CREATE INDEX idx_transfer_logs_staff ON staff_transfer_logs(staff_id, transfer_date DESC); +CREATE INDEX idx_transfer_logs_type ON staff_transfer_logs(transfer_type, operated_at DESC); +CREATE INDEX idx_transfer_logs_operator ON staff_transfer_logs(operator_id); +``` + +--- + +### 3.5 staff_reward_punish — 奖惩记录 + +| 字段 | 类型 | 约束 | 业务说明 | +|------|------|------|----------| +| id | UUID | PK | | +| staff_id | UUID | NOT NULL, FK→staff | | +| rp_date | DATE | NOT NULL | 奖惩日期 | +| category | VARCHAR(50) | NOT NULL | 奖惩类别(枚举由 lookup 表维护) | +| name | VARCHAR(100) | NOT NULL | 奖惩名称(与类别联动) | +| remarks | TEXT | | 备注 | +| created_at | TIMESTAMPTZ | NOT NULL DEFAULT NOW() | | +| created_by | UUID | FK→staff.id, SET NULL | | +| updated_at | TIMESTAMPTZ | NOT NULL DEFAULT NOW() | | +| deleted_at | TIMESTAMPTZ | | 软删除 | + +--- + +### 3.6 staff_work_experiences / staff_educations / staff_trainings / staff_family_members + +这四张表结构类似,均为 1:N 附属于 `staff`,存储员工档案中「工作经历」「教育经历」「培训经历」「家庭主要成员」信息。详见下方汇总: + +| 表名 | 关键字段 | +|------|---------| +| `staff_work_experiences` | staff_id, company, job_title, start_date, end_date, reason, reference_name, reference_phone | +| `staff_educations` | staff_id, stage, school, major, start_date, end_date, enrollment_status, degree | +| `staff_trainings` | staff_id, training_name, training_date, certificate | +| `staff_family_members` | staff_id, relation(称谓), name, birthdate, occupation, work_unit, phone_enc | + +--- + +### 3.7 staff_accounts — 员工第三方账号绑定 + +| 字段 | 类型 | 约束 | 业务说明 | +|------|------|------|----------| +| id | UUID | PK | | +| staff_id | UUID | NOT NULL, FK→staff | | +| platform | VARCHAR(30) | NOT NULL, CHECK | `fonrey`(主账号) / `58anjuke` / `cnreic`(中国网络经纪人) / `wechat_mp`(微信公众号) | +| account_no | VARCHAR(100) | | 账号/手机号 | +| is_real_name_match | BOOLEAN | | 实名信息一致性(中国网络经纪人专用) | +| is_bound | BOOLEAN | NOT NULL DEFAULT FALSE | 是否已绑定 | +| bound_at | TIMESTAMPTZ | | 绑定时间 | +| created_at | TIMESTAMPTZ | NOT NULL DEFAULT NOW() | | + +--- + +## 四、枚举常量 + +### Staff.role(系统角色) + +| 值 | 含义 | 数据可见范围默认 | +|----|------|----------------| +| `agent` | 一线经纪人 | 本人/本组 | +| `store_manager` | 店长 | 本门店 | +| `area_manager` | 区域经理 | 本区域 | +| `admin` | 系统管理员 | 全公司 | +| `operator` | 运营/行政 | 全公司(只读为主) | +| `system` | 系统账号(定时任务用) | — | + +### Staff.status(员工状态) + +``` +active = 正式在职 +probation = 试用期 +resigned = 已离职(不可删除,保留档案) +frozen = 账号冻结(在职但无法登录) +``` + +### OrgUnit.type(组织类型) + +``` +company = 公司根节点(每个租户唯一) +division = 事业部 +region = 大区 +area = 区域 +district = 片区 +store = 门店(经纪人最小归属单位) +group = 店组(门店下的业务小组) +functional = 职能部门(行政/财务等) +``` + +--- + +## 五、查询模式 + +### 5.1 查询某部门及所有下级的在职员工 + +```sql +-- 利用物化路径高效查询子树 +SELECT s.* +FROM staff s +JOIN org_units ou ON s.org_unit_id = ou.id +WHERE ou.path LIKE '/root_id/{target_org_unit_id}/%' + OR ou.id = '{target_org_unit_id}' + AND s.deleted_at IS NULL + AND s.status != 'resigned'; +``` + +### 5.2 查询员工完整异动历史 + +```sql +SELECT stl.*, + s.name as operator_name, + ou.name as operator_org +FROM staff_transfer_logs stl +JOIN staff s ON stl.operator_id = s.id +JOIN org_units ou ON s.org_unit_id = ou.id +WHERE stl.staff_id = :staff_id +ORDER BY stl.transfer_date DESC, stl.operated_at DESC; +``` + +### 5.3 获取员工的直接上下级链 + +```sql +-- 直属上级 +SELECT supervisor.* FROM staff +JOIN staff supervisor ON staff.supervisor_id = supervisor.id +WHERE staff.id = :staff_id AND supervisor.deleted_at IS NULL; +``` + +--- + +## 六、禁止操作 + +- ❌ **严禁硬删除 staff 记录**:离职员工需通过 `deleted_at + status = 'resigned'` 软删除,历史房源/跟进日志依赖 `staff.id` 外键 +- ❌ **严禁删除 staff_transfer_logs**:异动记录为不可变审计日志 +- ❌ **严禁直接修改 staff.user_id**:账号绑定关系变更需走专门的账号管理流程 +- ❌ **严禁绕过组织层级约束**:店组不在门店下的数据操作需在 Application 层校验并拒绝 +- ❌ **严禁明文存储员工手机号和证件号**:必须走 `EncryptedPhoneField` / `EncryptedIDField` diff --git a/Project/fonrey/DATA_MODEL/diagram/fonrey-er.svg b/Project/fonrey/DATA_MODEL/diagram/fonrey-er.svg new file mode 100644 index 00000000..f4c33402 --- /dev/null +++ b/Project/fonrey/DATA_MODEL/diagram/fonrey-er.svg @@ -0,0 +1,574 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +ORG / HR + + + +REGION & COMPLEX + + + +PROPERTY + + + +CLIENT + + + + + + + +1:N + + + +created_by + + + +agent_id + + + +1:N + + + +1:N + + + +N:M + + + +N:M + + + +1:N + + + +1:N + + + +1:N + + + +1:N + + + +1:N + + + +1:N + + + +1:N + + + +1:N + + + +1:N + + + +1:1 + + + +1:N + + + +1:N + + + +1:N + + + +1:N + + + +1:N + + + +1:N + + + +1:N + + + +N:M + + + +1:N + + + +1:N + + + + + + + + + +org_units +PK id: uuid +parent_id: uuid (FK→self) +type: varchar(20) +name, path, depth +is_active: bool + + + + + +staff +PK id: uuid +FK org_unit_id +name: varchar(50) +phone_enc: text (AES) +phone_hash: varchar(64) +user_id: uuid (FK→auth) +is_active, deleted_at + + + + + + + + + +districts +PK id: uuid +city: varchar(50) +name: varchar(50) +short_name: varchar(20) +sort_order, is_active + + + + + +business_areas +PK id: uuid +FK district_id +name: varchar(100) +latitude, longitude +sort_order, is_active + + + + + +schools +PK id: uuid +FK district_id +name: varchar(100) +type: primary/middle/high +nature: public/private +level: normal/key/top + + + + + +complexes +PK id: uuid +name: varchar(200) [不可直接修改] +FK district_id +address, address_summary +latitude, longitude +lock_building/room/info: bool +property_usage_types: varchar[] +search_vector: tsvector +developer, property_company +deleted_at, created_by +... + + + + +complex_business_areas (N:M) · is_primary + + + + +complex_schools · zone_type + + + + + +buildings +PK id: uuid +FK complex_id +name: varchar(50) +is_standard: bool +total_floors: smallint +has_elevator: bool +built_year: smallint +property_usage_type +is_active, created_at +FK school_id + + + + + +room_units +PK id: uuid +FK building_id +floor: smallint +floor_name: varchar(20) +room_no: varchar(30) +display_no: varchar(50) +is_standard: bool +is_active + + + + + +complex_price_trends +PK id: uuid +FK complex_id +record_month: date +avg_unit_price: numeric(10,2) +avg_sale_price: numeric(12,2) +transaction_count: int +listing_count: int + + + + + +metro_lines +PK id: uuid +city: varchar(50) +name: varchar(50) +color: varchar(7) [HEX] + + + + + +metro_stations +PK id: uuid +FK metro_line_id +name: varchar(50) +latitude, longitude +sort_order + + + + +complex_metro_stations · distance_meters + + + + + + + + + +properties +PK id: uuid +FK complex_id FK building_id +FK room_unit_id FK agent_id +listing_type: sale/rent/both +status: varchar(20) +sale_price: numeric(12,2) +rent_price: numeric(10,2) +floor, total_floors +area: numeric(8,2) [m²] +bedroom, living, bathroom +orientation, decoration +search_vector: tsvector +is_exclusive: bool +completeness_score: int +deleted_at, created_by +... +[89,000+ rows · partitioned by status] +UNIQUE (complex_id, building_id, floor, room_no) + + + + + +property_contacts +PK id: uuid +FK property_id +name: varchar(50) +phone_enc: text (AES) +phone_hash: varchar(64) +role: owner/agent/tenant +is_primary: bool + + + + + +property_photos +PK id: uuid +FK property_id +category: listing/vr/layout +file_key: text (R2/S3) +is_cover: bool +sort_order: smallint +width, height, file_size + + + + + +property_inspections +PK id: uuid +FK property_id FK staff_id +inspected_at: timestamptz +status: pending/done +notes: text +attachments: jsonb + + + + + +property_follow_logs +PK id: uuid +FK property_id FK staff_id +log_type: call/visit/note... +content: text +sensitive_view: bool [不可删] +created_at, created_by +⚠ NO DELETE (audit log) + + + + + +property_keys +PK id: uuid +FK property_id FK holder_id +key_no: varchar(50) +status: held/returned +taken_at, returned_at + + + + + +property_commissions +PK id: uuid +FK property_id +commission_type: exclusive/open +rate: numeric(5,4) +start_date, end_date +signed_at, document_key + + + + + +property_marketing +PK id: uuid [1:1 property] +FK property_id (UNIQUE) +title: varchar(200) +highlights: text[] +published_at, platforms: jsonb + + + + + +listing_histories +PK id: uuid +FK property_id +listed_at, delisted_at +list_price: numeric(12,2) +reason: varchar(50) + + + +1:N + + + + + + + + + +clients +PK id: uuid +FK agent_id (staff) +client_type: private/public/closed +status: active/inactive/converted +name: varchar(50) +phone_enc: text (AES) +phone_hash: varchar(64) +activity_level: 1-5 (Celery daily) +is_protected: bool [防止转公客] +transfer_to_public_type: auto/manual +source: varchar(30) +deleted_at, created_by +... +[私客/公客/成交客 三态状态机] + + + + + +client_requirements +PK id: uuid +FK client_id +req_type: second_hand/new/rent +district_ids: uuid[] +price_min/max: numeric +area_min/max, bedrooms +school_ids: uuid[] + + + + + +client_follow_logs +PK id: uuid +FK client_id +log_type +content: text +created_at +⚠ NO DELETE + + + + + +client_viewings +PK id: uuid +FK client_id +FK property_id +FK agent_id (staff) +viewed_at: timestamptz +feedback: text +rating: smallint +status: planned/done/cancelled + + + + + +client_property_matches +PK id: uuid +FK client_id +FK property_id +match_type: system/manual +score: numeric(5,2) +status: pending/sent/viewed +created_at + + + + + + +LEGEND + + + +ORG / HR + + + +REGION & COMPLEX + + + +PROPERTY + + + +CLIENT + + + +Foreign Key (FK) + + +Soft reference / optional FK + + +Join table (N:M) + +PK Primary Key +⚠ NO DELETE = append-only audit log + + + + +Fonrey 房产经纪管理系统 — Entity Relationship Diagram · v1.0 · 2026-04-24 · Schema-per-Tenant (django-tenants) + + diff --git a/Project/fonrey/DATA_MODEL/diagram/fonrey-er@2x.png b/Project/fonrey/DATA_MODEL/diagram/fonrey-er@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a5eaf886d1d1c0c850a3ebf7a7000fcd83250781 GIT binary patch literal 889452 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 z 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©p2~ikIN;rT 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