优先级: P1(安全模块)
开发周期: 1.5 周
保护平台免受价格异常、恶意流量、信用透支等风险,确保平台运营安全。
| 功能 | 描述 |
|---|---|
| 价格异常检测 | 检测异常低价/高价,防止价格错误导致平台亏损 |
| 异常流量检测 | 检测异常高频请求、疑似爬虫、DDoS |
| 信用额度管理 | 实时追踪代理商信用额度使用,超额时拦截下单 |
| 请求频率限制 | 按 IP/代理商/API Key 多维度限流 |
| 黑名单/白名单 | IP 黑名单、代理商黑名单、白名单 |
| 风险告警 | 实时告警通知(Slack/Email/钉钉) |
| 风险评分 | 对代理商/请求计算风险评分,高风险请求增加验证 |
价格异常:
- 售价低于采购价: 硬拦截
- 售价低于历史平均价 50%: 告警 + 人工确认
- 售价高于市场平均价 200%: 告警
- 同一酒店同一日期价格波动 > 30%: 告警
流量异常:
- 单 IP 每分钟查价 > 100 次: 限流
- 单代理商每分钟查价 > 500 次: 限流
- 单 IP 下单失败 > 10 次/小时: 拦截
- 新注册代理商首日下单 > 50 笔: 人工审核
信用额度:
- 未结算订单金额 + 待付款 > 信用额度: 拦截下单
- 逾期未付款: 降低信用额度 + 限制下单
- 信用额度使用率 > 90%: 告警
-- 风控规则表
CREATE TABLE risk_rules (
id SERIAL PRIMARY KEY,
rule_name VARCHAR(128) NOT NULL,
rule_type VARCHAR(32) NOT NULL, -- price_anomaly/traffic/credit/blacklist
condition JSONB NOT NULL, # 规则条件配置
action VARCHAR(32) NOT NULL, -- block/alert/log/verify
severity VARCHAR(16) DEFAULT 'medium', -- low/medium/high/critical
enabled BOOLEAN DEFAULT true,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
-- 风控事件日志表
CREATE TABLE risk_events (
id BIGSERIAL PRIMARY KEY,
event_type VARCHAR(32) NOT NULL,
rule_id INT REFERENCES risk_rules(id),
agent_code VARCHAR(32),
ip_address VARCHAR(45),
request_path VARCHAR(256),
detail JSONB, # 详细信息
action_taken VARCHAR(32), # block/alert/passed
created_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE INDEX idx_risk_events_type ON risk_events (event_type, created_at DESC);
CREATE INDEX idx_risk_events_agent ON risk_events (agent_code);
-- IP 黑名单表
CREATE TABLE ip_blacklist (
id SERIAL PRIMARY KEY,
ip_address VARCHAR(45) NOT NULL UNIQUE,
reason VARCHAR(255),
blocked_by VARCHAR(64),
expires_at TIMESTAMPTZ, # 空=永久
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- 风险告警记录表
CREATE TABLE risk_alerts (
id BIGSERIAL PRIMARY KEY,
alert_type VARCHAR(64) NOT NULL,
severity VARCHAR(16) NOT NULL,
title VARCHAR(255) NOT NULL,
detail JSONB,
status VARCHAR(20) DEFAULT 'open', -- open/acknowledged/resolved
acknowledged_by VARCHAR(64),
resolved_at TIMESTAMPTZ,
created_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE INDEX idx_risk_alerts_status ON risk_alerts (status, created_at DESC);
-- 信用额度变更记录
-- NOTE: 此表已统一到 sales-management.md 的 credit_ledger 表,风控模块通过调用 CreditService 接口访问
-- 保留此处仅为 API 兼容性参考
CREATE TABLE credit_log (
id BIGSERIAL PRIMARY KEY,
agent_code VARCHAR(32) NOT NULL,
change_type VARCHAR(32) NOT NULL, -- order_hold/order_release/settlement/adjust
amount DECIMAL(12, 2) NOT NULL, # 正=增加使用,负=释放
balance_before DECIMAL(12, 2),
balance_after DECIMAL(12, 2),
reference_no VARCHAR(64), # 关联订单号或结算单号
created_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE INDEX idx_credit_log_agent ON credit_log (agent_code, created_at DESC);
# 风控内部 API (被其他模块调用)
POST /api/v1/risk/check-price # 价格风控检查
# 请求: { "net_price": 100, "gross_price": 80, "hotel_id": 123 }
# 响应: { "passed": false, "reason": "售价低于采购价", "severity": "high" }
POST /api/v1/risk/check-credit # 信用额度检查
# 请求: { "agent_code": "AGT-001", "amount": 5000 }
# 响应: { "passed": true, "remaining_credit": 15000, "usage_rate": 0.25 }
POST /api/v1/risk/check-traffic # 流量风控检查
# 请求: { "ip": "1.2.3.4", "agent_code": "AGT-001", "endpoint": "/prices/search" }
# 响应: { "passed": true, "remaining_quota": 450 }
POST /api/v1/risk/hold-credit # 冻结信用额度
POST /api/v1/risk/release-credit # 释放信用额度
# 风控管理 API (管理后台)
GET /api/v1/risk/rules # 风控规则列表
POST /api/v1/risk/rules # 创建规则
PUT /api/v1/risk/rules/:id # 更新规则
GET /api/v1/risk/events # 风控事件列表
GET /api/v1/risk/alerts # 告警列表
PUT /api/v1/risk/alerts/:id/acknowledge # 确认告警
GET /api/v1/risk/blacklist # 黑名单管理
POST /api/v1/risk/blacklist # 添加黑名单
| 关联模块 | 关系 |
|---|---|
| API 网关 | 流量限流、IP 黑名单检查 |
| 查价引擎 | 价格风控检查 |
| 订单管理 | 下单前信用额度检查 |
| 结算管理 | 结算完成后释放信用额度 |
| 管理后台 | 风控规则配置、事件查看、告警管理 |