优先级: P0(核心基础模块)
开发周期: 2 周
解决多供应商的酒店/房型数据与平台标准数据之间的映射问题。这是 B2B2B 平台最核心的难点之一——不同供应商对同一酒店有不同编码、不同名称、不同房型描述。
| 功能 | 描述 |
|---|---|
| 自动匹配 | 基于多维度特征(名称相似度、坐标距离、地址、电话、星级)自动匹配 |
| 人工审核 | 低置信度匹配进入人工审核队列 |
| 批量匹配 | 支持新供应商接入时批量匹配历史数据 |
| 匹配置信度 | 输出 0-100 的匹配置信度分数,自动通过阈值可配置 |
| 反向映射 | 支持从平台酒店反查各供应商对应编码 |
| 匹配日志 | 记录匹配过程和变更历史,便于问题排查 |
| 房型匹配 | 酒店匹配后,自动/半自动匹配房型(床型、面积、人数等) |
综合匹配置信度 = W1 × 名称相似度 + W2 × 坐标距离分 + W3 × 地址相似度 + W4 × 星级匹配 + W5 × 链品牌匹配
名称相似度: Levenshtein Distance + Jaro-Winkler
坐标距离分: Haversine 公式,< 500m 得满分,> 5km 得 0 分
地址相似度: 去除标点空格后的编辑距离
星级匹配: 精确匹配 100%,差 1 级 50%,差 2 级 0%
默认权重: W1=0.35, W2=0.30, W3=0.15, W4=0.10, W5=0.10
通过阈值: >= 85 分自动匹配,60-85 人工审核,< 60 标记为不匹配
-- 匹配规则表
CREATE TABLE match_rules (
id SERIAL PRIMARY KEY,
supplier_code VARCHAR(32) NOT NULL,
rule_type VARCHAR(32) NOT NULL, -- hotel/room_type
field_name VARCHAR(64) NOT NULL, -- name/lat_lng/address/star
algorithm VARCHAR(64) NOT NULL, -- levenshtein/haversine/exact/regex
weight DECIMAL(3, 2) NOT NULL, -- 权重 0.00-1.00
threshold DECIMAL(5, 2), -- 单字段阈值
params JSONB, -- 算法参数
priority SMALLINT DEFAULT 0,
enabled BOOLEAN DEFAULT true,
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- 匹配任务表
CREATE TABLE match_tasks (
id BIGSERIAL PRIMARY KEY,
task_type VARCHAR(32) NOT NULL, -- hotel/room_type
supplier_code VARCHAR(32) NOT NULL,
total_count INT DEFAULT 0,
matched_count INT DEFAULT 0,
pending_count INT DEFAULT 0,
failed_count INT DEFAULT 0,
status VARCHAR(20) DEFAULT 'pending', -- pending/running/completed/failed
started_at TIMESTAMPTZ,
completed_at TIMESTAMPTZ,
created_by VARCHAR(64),
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- 匹配历史表(审计)
CREATE TABLE match_history (
id BIGSERIAL PRIMARY KEY,
task_id BIGINT REFERENCES match_tasks(id),
supplier_code VARCHAR(32),
match_type VARCHAR(32), -- hotel/room_type
supplier_id VARCHAR(64) NOT NULL,
platform_id BIGINT, -- 匹配到的平台ID
confidence DECIMAL(5, 2),
match_method VARCHAR(32), -- auto/manual/unmatched
old_platform_id BIGINT, -- 变更前的映射(如重新匹配)
details JSONB, -- 各维度得分明细
operator VARCHAR(64), -- 操作人(auto/manual)
created_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE INDEX idx_match_history_task ON match_history (task_id);
CREATE INDEX idx_match_history_supplier ON match_history (supplier_code);
# 匹配操作 API
POST /api/v1/match/hotels # 触发酒店匹配任务
POST /api/v1/match/room-types # 触发房型匹配任务
GET /api/v1/match/tasks # 匹配任务列表
GET /api/v1/match/tasks/:id # 匹配任务详情+进度
GET /api/v1/match/pending # 待人工审核的匹配列表
POST /api/v1/match/pending/:id/confirm # 确认匹配
POST /api/v1/match/pending/:id/reject # 拒绝匹配
# 映射查询 API
GET /api/v1/mappings/hotel?supplier=XXX&supplier_hotel_id=YYY
GET /api/v1/mappings/hotel/:platform_hotel_id/suppliers # 反向查映射
GET /api/v1/mappings/room-type?supplier=XXX&supplier_room_code=YYY
| 关联模块 | 关系 |
|---|---|
| 酒店基库 | 读写标准酒店/房型数据 |
| 查价引擎 | 提供供应商编码 → 平台编码的映射 |
| 管理后台 | 人工审核界面 |
| 库存管理 | 通过映射关系同步各供应商库存 |