← 返回文档中心

评级与分层

供应商评级体系

从响应速度、价格竞争力、库存准确率、取消率等多个维度对供应商进行综合评分。评分每日计算,影响查价排序权重和供应商在平台的可见性。

数据模型

CREATE TABLE supplier_rating (
    id                      SERIAL PRIMARY KEY,
    supplier_id             BIGINT NOT NULL REFERENCES suppliers(id),
    period                  VARCHAR(7) NOT NULL,       -- 评分周期,如 2024-01
    score_overall           DECIMAL(4, 2) NOT NULL,    -- 综合评分 0-100
    score_response_time     DECIMAL(4, 2),
    score_price             DECIMAL(4, 2),
    score_inventory_accuracy DECIMAL(4, 2),
    score_cancel_rate       DECIMAL(4, 2),
    calc_details            JSONB,                     -- 各指标原始值和计算过程
    created_at              TIMESTAMPTZ DEFAULT NOW()
);

CREATE UNIQUE INDEX idx_sr_supplier_period ON supplier_rating (supplier_id, period);

接口设计

GET  /api/admin/suppliers/{id}/ratings        # 供应商历史评分
GET  /api/admin/suppliers/rankings            # 供应商排名
POST /api/admin/suppliers/{id}/recalculate    # 手动重算评分

业务逻辑

每日定时任务计算前一日的供应商各项指标:响应时间取 P95 延迟的倒数归一化、价格竞争力取报价低于市场均价的比例、库存准确率取订单确认失败率的反面、取消率取供应商主动取消订单占比。各项加权求和得到 score_overall,查价引擎排序时作为权重因子。


代理商分层权益

根据代理商月交易量自动分为不同等级(如青铜、白银、黄金、铂金),不同等级享受不同的价格折扣、库存优先级、结算周期和客服支持级别。

数据模型

CREATE TABLE agent_tier (
    id                  SERIAL PRIMARY KEY,
    tier_name           VARCHAR(32) NOT NULL UNIQUE, -- bronze / silver / gold / platinum
    min_monthly_volume  INT NOT NULL,                -- 最低月交易单数
    price_discount_pct  DECIMAL(4, 2) DEFAULT 0,     -- 价格折扣百分比
    inventory_priority  SMALLINT DEFAULT 0,          -- 库存优先级,越高越优先
    settlement_days     INT DEFAULT 30,              -- 结算天数
    support_level       VARCHAR(16) DEFAULT 'standard',
    benefits            JSONB,                       -- 其他权益描述
    created_at          TIMESTAMPTZ DEFAULT NOW()
);

-- agents 表新增字段
ALTER TABLE agents ADD COLUMN tier_id BIGINT REFERENCES agent_tier(id);
ALTER TABLE agents ADD COLUMN tier_evaluated_at TIMESTAMPTZ;

接口设计

GET  /api/admin/agents/{id}/tier               # 查看代理商等级
PUT  /api/admin/agents/{id}/tier               # 手动调整等级
GET  /api/admin/agent-tiers                    # 等级配置列表
PUT  /api/admin/agent-tiers/{id}               # 更新等级配置

业务逻辑

每月 1 日自动评估上月交易量,匹配对应 agent_tier 并更新代理商的 tier_id。查价时,根据代理商等级应用 price_discount_pct 折扣;库存查询时,高等级代理商享有 inventory_priority 加成(在高并发场景下优先分配)。


消息通知中心

统一管理平台内的各类通知,包括订单状态变更、库存预警、价格变动、对账提醒等。支持邮件、Webhook 和站内信三种投递渠道。

数据模型

CREATE TABLE notification (
    id           SERIAL PRIMARY KEY,
    party_type   VARCHAR(16) NOT NULL,          -- agent / supplier / admin
    party_id     BIGINT NOT NULL,
    type         VARCHAR(32) NOT NULL,          -- order_status / inventory_alert / price_change / ...
    title        VARCHAR(256) NOT NULL,
    content      JSONB NOT NULL,                 -- 通知内容,结构因 type 而异
    channel      VARCHAR(16) NOT NULL,           -- email / webhook / in_app
    status       VARCHAR(16) DEFAULT 'pending',  -- pending / sent / failed
    sent_at      TIMESTAMPTZ,
    created_at   TIMESTAMPTZ DEFAULT NOW()
);

CREATE INDEX idx_notif_party ON notification (party_type, party_id, status, created_at DESC);

接口设计

GET  /api/notifications                        # 当前用户通知列表(分页)
PUT  /api/notifications/{id}/read              # 标记已读
POST /api/notifications/subscribe              # 订阅通知类型和渠道
GET  /api/admin/notifications/templates        # 通知模板管理

业务逻辑

采用事件驱动架构,各业务模块通过消息队列(如 RabbitMQ)发布事件,通知中心消费事件后根据 party_type 和订阅配置,生成对应渠道的通知记录。邮件和站内信由通知中心直接投递,Webhook 通过 HTTP 调用外部接口。


审计日志

记录所有关键业务操作(创建、更新、删除)的完整审计信息,包括操作人、操作时间、请求来源等,满足合规和安全审计需求。

数据模型

CREATE TABLE audit_log (
    id           BIGSERIAL PRIMARY KEY,
    operator_type VARCHAR(16) NOT NULL,         -- admin / agent / supplier / system
    operator_id  BIGINT,
    action       VARCHAR(32) NOT NULL,          -- create / update / delete / login / ...
    entity_type  VARCHAR(32) NOT NULL,          -- hotel / order / supplier / ...
    entity_id    BIGINT,
    detail       JSONB,                          -- 变更详情,如 {"before": {...}, "after": {...}}
    ip           VARCHAR(45),
    user_agent   VARCHAR(256),
    created_at   TIMESTAMPTZ DEFAULT NOW()
);

CREATE INDEX idx_audit_entity ON audit_log (entity_type, entity_id, created_at DESC);
CREATE INDEX idx_audit_operator ON audit_log (operator_type, operator_id, created_at DESC);

接口设计

GET  /api/admin/audit-logs                    # 审计日志查询(支持多维筛选 + 分页)
GET  /api/admin/audit-logs/{id}               # 审计日志详情
GET  /api/admin/audit-logs/export             # 导出审计日志(CSV)

业务逻辑

通过 AOP 切面或中间件拦截所有写操作(POST/PUT/DELETE),自动提取操作人信息、请求 IP、变更前后数据等,写入 audit_log 表。只读查询和敏感信息(如密码)不记录在 detail 中。日志保留周期默认 180 天。