数据库表结构草案.sql
-- 5G 2B MySQL 8 表结构草案。
-- 执行顺序:先执行 backend/src/main/resources/db/migration/V1__core_tables.sql,再执行本文件。
-- 本文件仅用于设计评审和临时库验证,不放入 Flyway 自动执行目录。
SET NAMES utf8mb4;
SET time_zone = '+08:00';
-- V1 未显式声明引擎和排序规则。控制表规模很小,先统一后再建立跨表外键,
-- 避免目标库默认排序规则不同导致升级时外键创建失败。
ALTER TABLE tb_schedule_job ENGINE=InnoDB, CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
ALTER TABLE tb_schedule_instance ENGINE=InnoDB, CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
ALTER TABLE tb_audit_log ENGINE=InnoDB, CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
-- 1. 复用并扩展现有调度、实例和审计表
ALTER TABLE tb_schedule_job
ADD COLUMN schedule_type VARCHAR(16) NOT NULL DEFAULT 'DEPENDENCY' COMMENT '调度类型:CRON、DEPENDENCY、HYBRID',
ADD COLUMN schedule_expression VARCHAR(128) NULL COMMENT 'Cron 表达式;纯依赖任务为空',
ADD COLUMN dependency_join_policy VARCHAR(8) NOT NULL DEFAULT 'ALL' COMMENT '多上游触发策略:ANY 或 ALL',
ADD COLUMN max_retry_count SMALLINT UNSIGNED NOT NULL DEFAULT 3 COMMENT '最大自动重试次数',
ADD COLUMN retry_backoff_seconds INT UNSIGNED NOT NULL DEFAULT 60 COMMENT '重试退避秒数',
ADD COLUMN concurrency_policy VARCHAR(16) NOT NULL DEFAULT 'FORBID' COMMENT '并发策略:FORBID,禁止同任务并行',
ADD COLUMN stop_timeout_seconds INT UNSIGNED NOT NULL DEFAULT 300 COMMENT '协作式停止超时秒数',
ADD COLUMN next_fire_at DATETIME(3) NULL COMMENT '下一次计划触发时间,Asia/Shanghai',
ADD COLUMN description VARCHAR(512) NULL COMMENT '中文业务目的、触发条件和处理原因',
ADD COLUMN updated_by VARCHAR(64) NULL COMMENT '最后修改人标识',
ADD INDEX idx_schedule_job_enabled_next (enabled, next_fire_at),
ADD CONSTRAINT chk_schedule_job_type CHECK (schedule_type IN ('CRON', 'DEPENDENCY', 'HYBRID')),
ADD CONSTRAINT chk_schedule_job_join_policy CHECK (dependency_join_policy IN ('ANY', 'ALL')),
ADD CONSTRAINT chk_schedule_job_concurrency CHECK (concurrency_policy = 'FORBID'),
ADD CONSTRAINT chk_schedule_job_expression CHECK (schedule_type NOT IN ('CRON', 'HYBRID') OR enabled = FALSE OR schedule_expression IS NOT NULL);
ALTER TABLE tb_schedule_instance
ADD COLUMN run_no VARCHAR(64) NULL COMMENT '任务运行号;兼容旧记录可空,新任务必须写入',
ADD COLUMN logical_run_no VARCHAR(64) NULL COMMENT '跨重试不变的逻辑运行号;兼容旧记录先回填',
ADD COLUMN trace_id VARCHAR(64) NULL COMMENT '任务动作链 traceId;兼容旧记录可空,新任务必须写入',
ADD COLUMN trigger_type VARCHAR(16) NOT NULL DEFAULT 'SCHEDULED' COMMENT '触发类型:SCHEDULED、DEPENDENCY、MANUAL、RETRY',
ADD COLUMN attempt_no SMALLINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '同一逻辑运行的尝试序号',
ADD COLUMN retry_of_instance_id BIGINT NULL COMMENT '上一失败尝试实例;首次尝试为空',
ADD COLUMN dependency_group_no VARCHAR(64) NULL COMMENT '本次 ANY/ALL 依赖满足快照组号',
ADD COLUMN next_retry_at DATETIME(3) NULL COMMENT '失败后计划重试时间',
ADD COLUMN requested_by VARCHAR(64) NULL COMMENT '定时为系统,手动触发时为触发请求人',
ADD COLUMN input_cursor VARCHAR(255) NULL COMMENT '输入游标摘要;导入任务记录扫描批次而非最大业务时间',
ADD COLUMN output_cursor VARCHAR(255) NULL COMMENT '成功输出游标摘要,仅成功后推进',
ADD COLUMN affected_cgi_count INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '本次受影响 CGI 数',
ADD COLUMN affected_start_time DATETIME(0) NULL COMMENT '受影响业务时间起点,Asia/Shanghai',
ADD COLUMN affected_end_time DATETIME(0) NULL COMMENT '受影响业务时间终点,Asia/Shanghai',
ADD COLUMN result_count BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '本次有效输出记录数',
ADD COLUMN error_code VARCHAR(64) NULL COMMENT '稳定错误码,不保存 SQL 或内部堆栈',
ADD COLUMN skip_reason VARCHAR(512) NULL COMMENT '失败跳过或依赖未满足的中文原因',
ADD COLUMN stop_requested_at DATETIME(3) NULL COMMENT '协作式停止请求时间',
ADD COLUMN stop_requested_by VARCHAR(64) NULL COMMENT '协作式停止请求人',
ADD COLUMN stop_request_trace_id VARCHAR(64) NULL COMMENT '停止动作独立 traceId',
ADD COLUMN heartbeat_at DATETIME(3) NULL COMMENT '运行中实例最后心跳时间',
ADD COLUMN publish_status VARCHAR(16) NOT NULL DEFAULT 'NONE' COMMENT '发布状态:NONE、STAGED、PUBLISHED、FAILED',
ADD COLUMN created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '实例创建时间',
ADD UNIQUE KEY uk_schedule_instance_run_no (run_no),
ADD INDEX idx_schedule_instance_status_started (status, started_at),
ADD INDEX idx_schedule_instance_trace (trace_id),
ADD CONSTRAINT chk_schedule_instance_trigger CHECK (trigger_type IN ('SCHEDULED', 'DEPENDENCY', 'MANUAL', 'RETRY')),
ADD CONSTRAINT chk_schedule_instance_status CHECK (status IN ('PENDING', 'RUNNING', 'SUCCEEDED', 'FAILED', 'STOPPING', 'STOPPED', 'SKIPPED')),
ADD CONSTRAINT chk_schedule_instance_publish CHECK (publish_status IN ('NONE', 'STAGED', 'PUBLISHED', 'FAILED')),
ADD CONSTRAINT chk_schedule_instance_range CHECK (affected_end_time IS NULL OR affected_start_time IS NULL OR affected_end_time >= affected_start_time);
-- 兼容 V1 可能已有的实例:旧记录生成稳定遗留号;缺失任务先禁用占位,随后任务种子只更新业务语义字段。
UPDATE tb_schedule_instance
SET run_no = COALESCE(run_no, CONCAT('LEGACY-', id)),
logical_run_no = COALESCE(logical_run_no, run_no, CONCAT('LEGACY-', id)),
trace_id = COALESCE(trace_id, CONCAT('LEGACY-', id))
WHERE run_no IS NULL OR logical_run_no IS NULL OR trace_id IS NULL;
INSERT IGNORE INTO tb_schedule_job (job_code, job_name, enabled, schedule_type, dependency_join_policy, description, updated_at)
SELECT DISTINCT i.job_code, CONCAT('遗留任务-', i.job_code), FALSE, 'DEPENDENCY', 'ALL', 'V1 实例引用但任务定义缺失,升级时自动禁用占位,需管理员复核。', CURRENT_TIMESTAMP(3)
FROM tb_schedule_instance i
LEFT JOIN tb_schedule_job j ON j.job_code = i.job_code
WHERE j.job_code IS NULL;
ALTER TABLE tb_schedule_instance
MODIFY COLUMN run_no VARCHAR(64) NOT NULL COMMENT '每次尝试唯一任务运行号',
MODIFY COLUMN logical_run_no VARCHAR(64) NOT NULL COMMENT '跨重试不变的逻辑运行号',
MODIFY COLUMN trace_id VARCHAR(64) NOT NULL COMMENT '任务尝试动作链 traceId',
ADD UNIQUE KEY uk_schedule_instance_logical_attempt (logical_run_no, attempt_no),
ADD INDEX idx_schedule_instance_retry (retry_of_instance_id),
ADD INDEX idx_schedule_instance_retry_time (status, next_retry_at),
ADD CONSTRAINT fk_schedule_instance_job FOREIGN KEY (job_code) REFERENCES tb_schedule_job (job_code),
ADD CONSTRAINT fk_schedule_instance_retry FOREIGN KEY (retry_of_instance_id) REFERENCES tb_schedule_instance (id),
ADD CONSTRAINT chk_schedule_instance_retry CHECK ((attempt_no = 1 AND retry_of_instance_id IS NULL) OR (attempt_no > 1 AND retry_of_instance_id IS NOT NULL)),
ADD CONSTRAINT chk_schedule_instance_stop_request CHECK ((stop_requested_at IS NULL AND stop_requested_by IS NULL AND stop_request_trace_id IS NULL) OR (stop_requested_at IS NOT NULL AND stop_requested_by IS NOT NULL AND stop_request_trace_id IS NOT NULL));
ALTER TABLE tb_audit_log
ADD COLUMN operator_role VARCHAR(64) NULL COMMENT '操作时角色快照',
ADD COLUMN result_reason VARCHAR(512) NULL COMMENT '中文结果原因;不得包含 SQL、内部堆栈或敏感信息',
ADD INDEX idx_audit_log_request_id (request_id),
ADD INDEX idx_audit_log_operator_created (operator_id, created_at),
ADD INDEX idx_audit_log_action_created (action, created_at);
CREATE TABLE tb_schedule_job_dependency (
job_code VARCHAR(64) NOT NULL COMMENT '下游任务编码',
depends_on_job_code VARCHAR(64) NOT NULL COMMENT '上游任务编码',
dependency_condition VARCHAR(16) NOT NULL COMMENT '依赖条件:SUCCESS 或 PUBLISHED',
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '依赖创建时间',
PRIMARY KEY (job_code, depends_on_job_code),
CONSTRAINT fk_job_dependency_job FOREIGN KEY (job_code) REFERENCES tb_schedule_job (job_code),
CONSTRAINT fk_job_dependency_upstream FOREIGN KEY (depends_on_job_code) REFERENCES tb_schedule_job (job_code),
CONSTRAINT chk_job_dependency_condition CHECK (dependency_condition IN ('SUCCESS', 'PUBLISHED')),
CONSTRAINT chk_job_dependency_self CHECK (job_code <> depends_on_job_code)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='七个定时任务的静态 DAG 依赖定义';
CREATE TABLE tb_schedule_run_scope (
instance_id BIGINT NOT NULL COMMENT '调度实例主键',
cgi VARCHAR(64) NOT NULL COMMENT '受影响小区 CGI',
affected_start_time DATETIME(0) NOT NULL COMMENT '该 CGI 受影响业务时间起点',
affected_end_time DATETIME(0) NOT NULL COMMENT '该 CGI 受影响业务时间终点',
affected_key_count INT UNSIGNED NOT NULL COMMENT '该 CGI 受影响幂等键数',
scope_reason VARCHAR(256) NOT NULL COMMENT '迟到、补数、新文件或上游重算等中文原因',
PRIMARY KEY (instance_id, cgi),
INDEX idx_schedule_scope_cgi_time (cgi, affected_start_time, affected_end_time),
CONSTRAINT fk_schedule_scope_instance FOREIGN KEY (instance_id) REFERENCES tb_schedule_instance (id),
CONSTRAINT chk_schedule_scope_range CHECK (affected_end_time >= affected_start_time),
CONSTRAINT chk_schedule_scope_count CHECK (affected_key_count > 0)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='调度实例按 CGI 记录的增量重算范围';
-- 2. 指标数据字典、导入文件/批次、受控原始区和校验错误
CREATE TABLE tb_metric_dictionary_version (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '数据字典版本主键',
version_no VARCHAR(64) NOT NULL COMMENT '数据字典版本号',
status VARCHAR(16) NOT NULL COMMENT '状态:DRAFT、PUBLISHED、SUPERSEDED、DISABLED',
description VARCHAR(512) NOT NULL COMMENT '版本中文说明和适用输入模板',
created_by VARCHAR(64) NOT NULL COMMENT '创建人',
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
published_at DATETIME(3) NULL COMMENT '发布时间',
trace_id VARCHAR(64) NOT NULL COMMENT '发布动作链 traceId',
current_marker TINYINT GENERATED ALWAYS AS (CASE WHEN status = 'PUBLISHED' THEN 1 ELSE NULL END) STORED COMMENT '保证仅一个当前发布版本',
PRIMARY KEY (id),
UNIQUE KEY uk_metric_dictionary_version_no (version_no),
UNIQUE KEY uk_metric_dictionary_current (current_marker),
CONSTRAINT chk_metric_dictionary_status CHECK (status IN ('DRAFT', 'PUBLISHED', 'SUPERSEDED', 'DISABLED')),
CONSTRAINT chk_metric_dictionary_publish CHECK (status <> 'PUBLISHED' OR published_at IS NOT NULL)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='导入校验、单位换算和发布支持状态的数据字典版本';
CREATE TABLE tb_metric_definition (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '指标定义主键',
dictionary_version_id BIGINT UNSIGNED NOT NULL COMMENT '所属数据字典版本',
metric_code VARCHAR(64) NOT NULL COMMENT '稳定指标编码',
metric_name VARCHAR(128) NOT NULL COMMENT '指标中文名',
source_dataset VARCHAR(32) NOT NULL COMMENT '源数据集:PERF、INTERFERENCE、COMPUTED',
source_field_name VARCHAR(128) NOT NULL COMMENT 'CSV 源字段名或计算来源名',
value_kind VARCHAR(16) NOT NULL COMMENT '值类型:RATIO、COUNT、BYTES、DBM、FREQUENCY',
storage_unit VARCHAR(32) NOT NULL COMMENT '数据库存储单位',
display_unit VARCHAR(32) NOT NULL COMMENT '页面展示单位',
display_multiplier DECIMAL(20,10) NOT NULL DEFAULT 1 COMMENT '存储值转展示值的乘数',
storage_scale TINYINT UNSIGNED NOT NULL COMMENT '建议存储小数位数',
display_scale TINYINT UNSIGNED NOT NULL COMMENT '页面展示小数位数',
valid_min DECIMAL(30,10) NULL COMMENT '已确认有效下界;未确认时为空',
valid_max DECIMAL(30,10) NULL COMMENT '已确认有效上界;未确认时为空',
range_status VARCHAR(16) NOT NULL COMMENT '有效范围状态:CONFIRMED、PENDING',
static_direction VARCHAR(8) NOT NULL COMMENT '静态阈值劣化方向:LOW、HIGH、NONE',
dynamic_direction VARCHAR(8) NOT NULL COMMENT '动态基线劣化方向:LOW、HIGH、NONE',
aggregation_rule VARCHAR(16) NOT NULL COMMENT '已确认跨小时聚合:NONE、SUM、MAX',
support_status VARCHAR(16) NOT NULL COMMENT '发布支持:SUPPORTED、RAW_ONLY、UNSUPPORTED',
na_rule VARCHAR(512) NOT NULL COMMENT '空值、非法值和不支持时的中文 N/A 规则',
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '定义创建时间',
PRIMARY KEY (id),
UNIQUE KEY uk_metric_definition_code (dictionary_version_id, metric_code),
UNIQUE KEY uk_metric_definition_source (dictionary_version_id, source_dataset, source_field_name),
UNIQUE KEY uk_metric_definition_id_code (id, metric_code),
CONSTRAINT fk_metric_definition_version FOREIGN KEY (dictionary_version_id) REFERENCES tb_metric_dictionary_version (id),
CONSTRAINT chk_metric_definition_dataset CHECK (source_dataset IN ('PERF', 'INTERFERENCE', 'COMPUTED')),
CONSTRAINT chk_metric_definition_kind CHECK (value_kind IN ('RATIO', 'COUNT', 'BYTES', 'DBM', 'FREQUENCY')),
CONSTRAINT chk_metric_definition_range_status CHECK (range_status IN ('CONFIRMED', 'PENDING')),
CONSTRAINT chk_metric_definition_static_direction CHECK (static_direction IN ('LOW', 'HIGH', 'NONE')),
CONSTRAINT chk_metric_definition_dynamic_direction CHECK (dynamic_direction IN ('LOW', 'HIGH', 'NONE')),
CONSTRAINT chk_metric_definition_aggregation CHECK (aggregation_rule IN ('NONE', 'SUM', 'MAX')),
CONSTRAINT chk_metric_definition_support CHECK (support_status IN ('SUPPORTED', 'RAW_ONLY', 'UNSUPPORTED')),
CONSTRAINT chk_metric_definition_range CHECK (valid_max IS NULL OR valid_min IS NULL OR valid_max >= valid_min)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='逐指标源字段、精度、单位、范围、方向和发布规则';
CREATE TABLE tb_import_batch (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '导入批次主键',
batch_no VARCHAR(64) NOT NULL COMMENT '导入批次号',
dataset_type VARCHAR(32) NOT NULL COMMENT '数据集:PERF 或 INTERFERENCE',
schedule_instance_id BIGINT NULL COMMENT '产生该批次的调度实例',
dictionary_version_id BIGINT UNSIGNED NOT NULL COMMENT '本批次采用的已发布数据字典版本',
status VARCHAR(24) NOT NULL COMMENT '状态:DISCOVERED、VALIDATING、SUCCEEDED、PARTIAL、FAILED、STOPPED',
file_count INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '发现文件数',
total_row_count BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'CSV 数据行总数',
accepted_row_count BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '至少一个有效指标被接受的小时行数',
rejected_row_count BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '因主键或结构错误整行拒绝数',
duplicate_row_count BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '同键同内容重复数',
conflict_row_count BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '同键不同内容冲突数',
invalid_value_count BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '字段级非法值数',
accepted_start_time DATETIME(0) NULL COMMENT '本批接受业务时间起点',
accepted_end_time DATETIME(0) NULL COMMENT '本批接受业务时间终点',
started_at DATETIME(3) NOT NULL COMMENT '导入开始时间',
finished_at DATETIME(3) NULL COMMENT '导入结束时间',
failure_code VARCHAR(64) NULL COMMENT '稳定失败码',
failure_summary VARCHAR(512) NULL COMMENT '中文失败摘要,不含 SQL 或内部堆栈',
trace_id VARCHAR(64) NOT NULL COMMENT '导入动作链 traceId',
PRIMARY KEY (id),
UNIQUE KEY uk_import_batch_no (batch_no),
INDEX idx_import_batch_dataset_started (dataset_type, started_at),
INDEX idx_import_batch_status_started (status, started_at),
INDEX idx_import_batch_trace (trace_id),
CONSTRAINT fk_import_batch_instance FOREIGN KEY (schedule_instance_id) REFERENCES tb_schedule_instance (id),
CONSTRAINT fk_import_batch_dictionary FOREIGN KEY (dictionary_version_id) REFERENCES tb_metric_dictionary_version (id),
CONSTRAINT chk_import_batch_dataset CHECK (dataset_type IN ('PERF', 'INTERFERENCE')),
CONSTRAINT chk_import_batch_status CHECK (status IN ('DISCOVERED', 'VALIDATING', 'SUCCEEDED', 'PARTIAL', 'FAILED', 'STOPPED')),
CONSTRAINT chk_import_batch_range CHECK (accepted_end_time IS NULL OR accepted_start_time IS NULL OR accepted_end_time >= accepted_start_time)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='一次内网扫描和校验产生的性能或干扰导入批次';
CREATE TABLE tb_import_file (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '导入文件主键',
batch_id BIGINT UNSIGNED NOT NULL COMMENT '所属导入批次',
dataset_type VARCHAR(32) NOT NULL COMMENT '文件数据集:PERF 或 INTERFERENCE',
file_name VARCHAR(255) NOT NULL COMMENT '文件名,不保存可暴露内部目录的完整路径',
source_path_sha256 BINARY(32) NOT NULL COMMENT '受控目录相对路径哈希',
file_sha256 BINARY(32) NOT NULL COMMENT '文件内容 SHA-256',
file_size_bytes BIGINT UNSIGNED NOT NULL COMMENT '文件字节数',
template_version VARCHAR(64) NOT NULL COMMENT '识别出的 CSV 模板版本',
duplicate_of_file_id BIGINT UNSIGNED NULL COMMENT '相同内容已成功文件主键;命中后不重复解析',
status VARCHAR(24) NOT NULL COMMENT '状态:DISCOVERED、PARSING、SUCCEEDED、DUPLICATE、FAILED、STOPPED',
total_row_count BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'CSV 数据行数',
accepted_row_count BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '接受行数',
rejected_row_count BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '拒绝行数',
discovered_at DATETIME(3) NOT NULL COMMENT '发现文件时间',
parsed_at DATETIME(3) NULL COMMENT '解析完成时间',
failure_code VARCHAR(64) NULL COMMENT '稳定失败码',
failure_summary VARCHAR(512) NULL COMMENT '中文失败摘要,不含完整文件内容',
trace_id VARCHAR(64) NOT NULL COMMENT '导入动作链 traceId',
PRIMARY KEY (id),
UNIQUE KEY uk_import_file_batch_name (batch_id, file_name),
INDEX idx_import_file_hash (dataset_type, file_sha256, status),
INDEX idx_import_file_discovered (discovered_at),
CONSTRAINT fk_import_file_batch FOREIGN KEY (batch_id) REFERENCES tb_import_batch (id),
CONSTRAINT fk_import_file_duplicate FOREIGN KEY (duplicate_of_file_id) REFERENCES tb_import_file (id),
CONSTRAINT chk_import_file_dataset CHECK (dataset_type IN ('PERF', 'INTERFERENCE')),
CONSTRAINT chk_import_file_status CHECK (status IN ('DISCOVERED', 'PARSING', 'SUCCEEDED', 'DUPLICATE', 'FAILED', …20615 tokens truncated…标、类型和窗口锚点 SHA-256',
owner_id VARCHAR(64) NULL COMMENT '当前责任人',
status VARCHAR(16) NOT NULL COMMENT 'NEW、CLAIMED、PROCESSING、PENDING_VERIFY、CLOSED',
version_no INT UNSIGNED NOT NULL DEFAULT 1 COMMENT '乐观锁版本',
record_status VARCHAR(16) NOT NULL DEFAULT 'STAGED' COMMENT 'STAGED、PUBLISHED、FAILED、VOID',
created_at DATETIME(3) NOT NULL COMMENT '告警记录创建时间',
updated_at DATETIME(3) NOT NULL COMMENT '告警状态最后更新时间',
published_at DATETIME(3) NULL COMMENT '告警原子发布时间',
closed_at DATETIME(3) NULL COMMENT '最终关闭时间',
trace_id VARCHAR(64) NOT NULL COMMENT '告警生成动作链 traceId',
dedupe_current_key BINARY(32) GENERATED ALWAYS AS (CASE WHEN record_status = 'PUBLISHED' THEN dedupe_key ELSE NULL END) STORED COMMENT '仅已发布告警参与去重唯一约束',
PRIMARY KEY (id),
UNIQUE KEY uk_alarm_no (alarm_no),
UNIQUE KEY uk_alarm_generation_dedupe (generation_publish_run_id, dedupe_key),
UNIQUE KEY uk_alarm_dedupe_current (dedupe_current_key),
INDEX idx_alarm_query (status, alarm_level, triggered_at, cgi),
INDEX idx_alarm_metric_time (metric_code, triggered_at),
INDEX idx_alarm_owner_status (owner_id, status, updated_at),
CONSTRAINT fk_alarm_generation_run FOREIGN KEY (generation_publish_run_id) REFERENCES tb_publish_run (id),
CONSTRAINT fk_alarm_metric FOREIGN KEY (metric_definition_id, metric_code) REFERENCES tb_metric_definition (id, metric_code),
CONSTRAINT fk_alarm_metric_eval FOREIGN KEY (metric_evaluation_id, metric_definition_id, metric_code) REFERENCES tb_metric_evaluation_result (id, metric_definition_id, metric_code),
CONSTRAINT fk_alarm_forecast FOREIGN KEY (forecast_result_id, metric_definition_id, metric_code) REFERENCES tb_forecast_result (id, metric_definition_id, metric_code),
CONSTRAINT fk_alarm_threshold FOREIGN KEY (threshold_rule_id, metric_definition_id, metric_code) REFERENCES tb_threshold_rule (id, metric_definition_id, metric_code),
CONSTRAINT fk_alarm_baseline FOREIGN KEY (baseline_result_id, metric_definition_id, metric_code) REFERENCES tb_baseline_result (id, metric_definition_id, metric_code),
CONSTRAINT chk_alarm_type CHECK (alarm_type IN ('STATIC_THRESHOLD', 'DYNAMIC_BASELINE', 'PREDICTION')),
CONSTRAINT chk_alarm_level CHECK (alarm_level IN ('CRITICAL', 'WARNING', 'INFO')),
CONSTRAINT chk_alarm_time CHECK (last_occurrence_at >= first_occurrence_at AND triggered_at = first_occurrence_at),
CONSTRAINT chk_alarm_occurrence CHECK (occurrence_count >= 1),
CONSTRAINT chk_alarm_dedupe_window CHECK (dedupe_window_minutes >= 60 AND MOD(dedupe_window_minutes, 60) = 0),
CONSTRAINT chk_alarm_status CHECK (status IN ('NEW', 'CLAIMED', 'PROCESSING', 'PENDING_VERIFY', 'CLOSED')),
CONSTRAINT chk_alarm_record_status CHECK (record_status IN ('STAGED', 'PUBLISHED', 'FAILED', 'VOID')),
CONSTRAINT chk_alarm_published_at CHECK (record_status <> 'PUBLISHED' OR published_at IS NOT NULL)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='静态、动态和预测告警及固定生命周期当前状态';
CREATE TABLE tb_alarm_evidence (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '告警证据主键',
alarm_id BIGINT UNSIGNED NOT NULL COMMENT '告警主键',
evidence_type VARCHAR(32) NOT NULL COMMENT 'ACTUAL、STATIC_THRESHOLD、BASELINE、FORECAST、CROSS_TABLE、MISSING',
metric_result_id BIGINT UNSIGNED NULL COMMENT '小时实际指标结果',
metric_evaluation_id BIGINT UNSIGNED NULL COMMENT '静态/动态状态结果',
forecast_result_id BIGINT UNSIGNED NULL COMMENT '预测点结果',
evidence_time DATETIME(0) NULL COMMENT '证据对应业务时间',
actual_value DECIMAL(30,10) NULL COMMENT '实际值快照',
threshold_value DECIMAL(30,10) NULL COMMENT '静态阈值快照',
baseline_center_value DECIMAL(30,10) NULL COMMENT '动态中心快照',
baseline_lower_limit DECIMAL(30,10) NULL COMMENT '动态下限快照',
baseline_upper_limit DECIMAL(30,10) NULL COMMENT '动态上限快照',
predicted_value DECIMAL(30,10) NULL COMMENT '预测值快照',
storage_unit VARCHAR(32) NULL COMMENT '数值存储单位',
evidence_status VARCHAR(24) NOT NULL COMMENT 'AVAILABLE 或 MISSING',
evidence_summary VARCHAR(512) NOT NULL COMMENT '中文证据或缺失说明,不包含确认根因',
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '证据快照创建时间',
trace_id VARCHAR(64) NOT NULL COMMENT '告警生成动作链 traceId',
PRIMARY KEY (id),
INDEX idx_alarm_evidence_alarm (alarm_id, evidence_type, evidence_time),
CONSTRAINT fk_alarm_evidence_alarm FOREIGN KEY (alarm_id) REFERENCES tb_alarm (id),
CONSTRAINT fk_alarm_evidence_metric FOREIGN KEY (metric_result_id) REFERENCES tb_metric_publish_result (id),
CONSTRAINT fk_alarm_evidence_evaluation FOREIGN KEY (metric_evaluation_id) REFERENCES tb_metric_evaluation_result (id),
CONSTRAINT fk_alarm_evidence_forecast FOREIGN KEY (forecast_result_id) REFERENCES tb_forecast_result (id),
CONSTRAINT chk_alarm_evidence_type CHECK (evidence_type IN ('ACTUAL', 'STATIC_THRESHOLD', 'BASELINE', 'FORECAST', 'CROSS_TABLE', 'MISSING')),
CONSTRAINT chk_alarm_evidence_status CHECK (evidence_status IN ('AVAILABLE', 'MISSING'))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='告警生成时的实际、阈值、基线、预测、跨表和缺失证据快照';
CREATE TABLE tb_diagnosis_candidate (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '候选诊断主键',
alarm_id BIGINT UNSIGNED NOT NULL COMMENT '告警主键',
generation_publish_run_id BIGINT UNSIGNED NOT NULL COMMENT '候选诊断生成发布运行',
candidate_code VARCHAR(64) NOT NULL COMMENT '候选规则编码',
candidate_title VARCHAR(256) NOT NULL COMMENT '中文候选原因,必须含待核验语义',
candidate_rank SMALLINT UNSIGNED NOT NULL COMMENT '同告警候选稳定顺序',
evidence_summary VARCHAR(1024) NOT NULL COMMENT '支持该候选的中文证据摘要',
missing_evidence VARCHAR(1024) NULL COMMENT '缺失证据及影响',
recommendation VARCHAR(1024) NOT NULL COMMENT '核查建议;参数调整须标记需审批',
requires_approval BOOLEAN NOT NULL DEFAULT FALSE COMMENT '建议是否需要审批',
candidate_status VARCHAR(24) NOT NULL COMMENT 'TO_VERIFY、REJECTED、SUPPORTED',
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '候选生成时间',
trace_id VARCHAR(64) NOT NULL COMMENT '规则动作链 traceId',
PRIMARY KEY (id),
UNIQUE KEY uk_diagnosis_candidate_alarm_code (alarm_id, candidate_code),
UNIQUE KEY uk_diagnosis_candidate_alarm_rank (alarm_id, candidate_rank),
CONSTRAINT fk_diagnosis_candidate_alarm FOREIGN KEY (alarm_id) REFERENCES tb_alarm (id),
CONSTRAINT fk_diagnosis_candidate_run FOREIGN KEY (generation_publish_run_id) REFERENCES tb_publish_run (id),
CONSTRAINT chk_diagnosis_candidate_status CHECK (candidate_status IN ('TO_VERIFY', 'REJECTED', 'SUPPORTED'))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='仅输出待核验候选原因、证据和建议,不保存自动确认根因';
CREATE TABLE tb_alarm_action (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '告警动作主键',
alarm_id BIGINT UNSIGNED NOT NULL COMMENT '告警主键',
action_code VARCHAR(32) NOT NULL COMMENT 'CLAIM、MARK_READ、INVESTIGATE、DISPOSE、REQUEST_CLOSE、CLOSE、REOPEN、VERIFY',
from_status VARCHAR(16) NULL COMMENT '动作前告警状态',
to_status VARCHAR(16) NULL COMMENT '动作后告警状态',
operator_id VARCHAR(64) NOT NULL COMMENT '操作人',
operator_role VARCHAR(64) NOT NULL COMMENT '操作时角色',
action_comment VARCHAR(2000) NULL COMMENT '排查、处置或验证说明',
work_order_ref VARCHAR(128) NULL COMMENT '外部工单引用;不自动创建工单',
verification_result VARCHAR(16) NULL COMMENT '预测或处置验证:HIT、MISS、PASSED、FAILED',
acted_at DATETIME(3) NOT NULL COMMENT '动作时间',
request_id VARCHAR(64) NOT NULL COMMENT '与 X-Trace-Id 相同的请求号',
PRIMARY KEY (id),
UNIQUE KEY uk_alarm_action_idempotent (alarm_id, action_code, request_id),
INDEX idx_alarm_action_timeline (alarm_id, acted_at),
INDEX idx_alarm_action_request (request_id),
CONSTRAINT fk_alarm_action_alarm FOREIGN KEY (alarm_id) REFERENCES tb_alarm (id),
CONSTRAINT chk_alarm_action_code CHECK (action_code IN ('CLAIM', 'MARK_READ', 'INVESTIGATE', 'DISPOSE', 'REQUEST_CLOSE', 'CLOSE', 'REOPEN', 'VERIFY')),
CONSTRAINT chk_alarm_action_from CHECK (from_status IS NULL OR from_status IN ('NEW', 'CLAIMED', 'PROCESSING', 'PENDING_VERIFY', 'CLOSED')),
CONSTRAINT chk_alarm_action_to CHECK (to_status IS NULL OR to_status IN ('NEW', 'CLAIMED', 'PROCESSING', 'PENDING_VERIFY', 'CLOSED')),
CONSTRAINT chk_alarm_action_verify CHECK (verification_result IS NULL OR verification_result IN ('HIT', 'MISS', 'PASSED', 'FAILED'))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='告警认领、排查、处置、验证、关闭和重开的追加式时间线';
CREATE TABLE tb_metric_note (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '指标证据备注主键',
metric_result_id BIGINT UNSIGNED NOT NULL COMMENT '被备注的已发布小时指标',
alarm_id BIGINT UNSIGNED NULL COMMENT '可选关联告警',
author_id VARCHAR(64) NOT NULL COMMENT '备注人',
note_content VARCHAR(2000) NOT NULL COMMENT '人工备注;不得修改源值或算法结论',
created_at DATETIME(3) NOT NULL COMMENT '备注创建时间',
request_id VARCHAR(64) NOT NULL COMMENT '与 X-Trace-Id 相同的请求号',
PRIMARY KEY (id),
UNIQUE KEY uk_metric_note_idempotent (metric_result_id, request_id),
INDEX idx_metric_note_result_time (metric_result_id, created_at),
CONSTRAINT fk_metric_note_result FOREIGN KEY (metric_result_id) REFERENCES tb_metric_publish_result (id),
CONSTRAINT fk_metric_note_alarm FOREIGN KEY (alarm_id) REFERENCES tb_alarm (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='性能/干扰明细的人工备注,不回写事实或发布结论';
CREATE TABLE tb_notification_outbox (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '通知任务主键',
alarm_id BIGINT UNSIGNED NOT NULL COMMENT '通知关联告警',
generation_publish_run_id BIGINT UNSIGNED NOT NULL COMMENT '生成通知的规则发布运行',
channel VARCHAR(16) NOT NULL COMMENT '站内通知渠道 IN_APP;其他渠道不在本期',
recipient_id VARCHAR(64) NOT NULL COMMENT '接收人标识',
payload_summary VARCHAR(512) NOT NULL COMMENT '脱敏中文通知摘要,不含完整证据或敏感信息',
status VARCHAR(16) NOT NULL COMMENT 'PENDING、SENT、FAILED、CANCELLED',
retry_count SMALLINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '发送重试次数',
next_retry_at DATETIME(3) NULL COMMENT '下一次重试时间',
sent_at DATETIME(3) NULL COMMENT '成功发送时间',
failure_summary VARCHAR(512) NULL COMMENT '中文失败摘要,不含内部堆栈',
trace_id VARCHAR(64) NOT NULL COMMENT '告警动作链 traceId',
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '通知任务创建时间',
PRIMARY KEY (id),
UNIQUE KEY uk_notification_alarm_recipient (alarm_id, channel, recipient_id),
INDEX idx_notification_dispatch (status, next_retry_at),
CONSTRAINT fk_notification_alarm FOREIGN KEY (alarm_id) REFERENCES tb_alarm (id),
CONSTRAINT fk_notification_run FOREIGN KEY (generation_publish_run_id) REFERENCES tb_publish_run (id),
CONSTRAINT chk_notification_channel CHECK (channel = 'IN_APP'),
CONSTRAINT chk_notification_status CHECK (status IN ('PENDING', 'SENT', 'FAILED', 'CANCELLED'))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='告警原子发布后生成的站内通知 Outbox';
-- 9. 预置七任务 DAG 和已确认源指标字典
INSERT INTO tb_schedule_job
(job_code, job_name, enabled, schedule_type, schedule_expression, dependency_join_policy, max_retry_count, retry_backoff_seconds, concurrency_policy, stop_timeout_seconds, description, updated_at)
VALUES
('JOB_IMPORT_PERF', '性能 CSV 定时导入', FALSE, 'CRON', NULL, 'ALL', 3, 60, 'FORBID', 300, '扫描受控内网目录,按文件哈希识别新增性能文件并校验小时数据;交付频率和 Cron 未确认前保持禁用。', CURRENT_TIMESTAMP(3)),
('JOB_IMPORT_INTERFERENCE', '干扰 CSV 定时导入', FALSE, 'CRON', NULL, 'ALL', 3, 60, 'FORBID', 300, '扫描受控内网目录,按文件哈希识别新增干扰文件并校验小时数据;交付频率和 Cron 未确认前保持禁用。', CURRENT_TIMESTAMP(3)),
('JOB_METRIC_PUBLISH', '无线指标结果发布', TRUE, 'DEPENDENCY', NULL, 'ANY', 3, 120, 'FORBID', 600, '消费任一成功新导入批次,只重算受影响 CGI 与时间;单表可发布,跨表证据仅在两表同键有效时发布。', CURRENT_TIMESTAMP(3)),
('JOB_BASELINE', '动态基线计算', TRUE, 'DEPENDENCY', NULL, 'ALL', 2, 300, 'FORBID', 1800, '消费已发布指标结果,按 CGI、指标、小时槽计算近 30 日 Median/MAD 或发布样本不足原因。', CURRENT_TIMESTAMP(3)),
('JOB_PREDICTION', '48 小时趋势预测', TRUE, 'DEPENDENCY', NULL, 'ALL', 2, 600, 'FORBID', 3600, '训练 CANDIDATE;生产预测只使用上一次已验证发布模型。无已发布模型时仅发布 NO_PUBLISHED_MODEL,不伪造预测值。', CURRENT_TIMESTAMP(3)),
('JOB_FORECAST_EVALUATION', '预测回测与模型状态更新', TRUE, 'DEPENDENCY', NULL, 'ALL', 2, 600, 'FORBID', 3600, '在离线留出集评估候选模型并逐点留证;仅 PASSED 候选可原子切换为 PUBLISHED,WAPE 分母为零时为 N/A。', CURRENT_TIMESTAMP(3)),
('JOB_RULE_ALARM', '阈值/趋势异常/预测性告警与候选诊断', TRUE, 'DEPENDENCY', NULL, 'ALL', 3, 120, 'FORBID', 1800, '消费上游最后成功发布结果,分别评估静态阈值和动态基线,生成告警、证据、待核验候选诊断和站内通知。', CURRENT_TIMESTAMP(3))
ON DUPLICATE KEY UPDATE
job_name = VALUES(job_name),
enabled = CASE WHEN VALUES(schedule_type) IN ('CRON', 'HYBRID') AND schedule_expression IS NULL THEN FALSE ELSE enabled END,
schedule_type = VALUES(schedule_type),
dependency_join_policy = VALUES(dependency_join_policy),
concurrency_policy = VALUES(concurrency_policy),
description = VALUES(description),
updated_at = VALUES(updated_at);
INSERT INTO tb_schedule_job_dependency (job_code, depends_on_job_code, dependency_condition)
VALUES
('JOB_METRIC_PUBLISH', 'JOB_IMPORT_PERF', 'SUCCESS'),
('JOB_METRIC_PUBLISH', 'JOB_IMPORT_INTERFERENCE', 'SUCCESS'),
('JOB_BASELINE', 'JOB_METRIC_PUBLISH', 'PUBLISHED'),
('JOB_PREDICTION', 'JOB_BASELINE', 'PUBLISHED'),
('JOB_FORECAST_EVALUATION', 'JOB_PREDICTION', 'PUBLISHED'),
('JOB_RULE_ALARM', 'JOB_FORECAST_EVALUATION', 'PUBLISHED')
ON DUPLICATE KEY UPDATE
dependency_condition = VALUES(dependency_condition);
INSERT INTO tb_metric_dictionary_version
(version_no, status, description, created_by, published_at, trace_id)
VALUES
('DICT-CSV-V1', 'PUBLISHED', '性能 28 列、干扰 22 列真实 CSV 映射;频点零值仅原始留痕,比例按 0~1 校验。', 'SYSTEM_DDL', CURRENT_TIMESTAMP(3), 'DDL-DICT-CSV-V1');
SET @metric_dictionary_version_id = LAST_INSERT_ID();
INSERT INTO tb_metric_definition
(dictionary_version_id, metric_code, metric_name, source_dataset, source_field_name, value_kind, storage_unit, display_unit, display_multiplier, storage_scale, display_scale, valid_min, valid_max, range_status, static_direction, dynamic_direction, aggregation_rule, support_status, na_rule)
VALUES
(@metric_dictionary_version_id, 'WIRELESS_ACCESS_RATE', '无线接通率', 'PERF', '无线接通率', 'RATIO', 'ratio', '%', 100, 10, 2, 0, 1, 'CONFIRMED', 'LOW', 'LOW', 'NONE', 'SUPPORTED', '空值或不在 01 时为 N/A;异常原值不截断且不参与发布、基线、预测或告警。'),1 时为 N/A;无分子分母时禁止跨小区或跨时间平均。'),
(@metric_dictionary_version_id, 'WIRELESS_DROP_RATE', '无线掉线率', 'PERF', '无线掉线率(小区级)', 'RATIO', 'ratio', '%', 100, 10, 2, 0, 1, 'CONFIRMED', 'HIGH', 'HIGH', 'NONE', 'SUPPORTED', '空值或不在 0
(@metric_dictionary_version_id, 'RRC_SETUP_SUCCESS_RATE', 'RRC连接建立成功率', 'PERF', 'RRC连接建立成功率', 'RATIO', 'ratio', '%', 100, 10, 2, 0, 1, 'CONFIRMED', 'NONE', 'LOW', 'NONE', 'SUPPORTED', '空值或不在 01 时为 N/A;按低值劣化方向参与动态基线与预测。'),1 时为 N/A;N/A 不参与负荷候选证据。'),
(@metric_dictionary_version_id, 'RRC_CONNECTION_MAX', 'RRC连接最大数', 'PERF', 'RRC连接最大数', 'COUNT', 'count', '个', 1, 6, 0, 0, NULL, 'CONFIRMED', 'HIGH', 'HIGH', 'MAX', 'SUPPORTED', '空值或负值为 N/A;该值是小时最大数,不得标为当前连接总数。'),
(@metric_dictionary_version_id, 'PRB_UL_USAGE_RATE', '上行业务信息PRB占用率', 'PERF', '上行业务信息PRB占用率', 'RATIO', 'ratio', '%', 100, 10, 2, 0, 1, 'CONFIRMED', 'HIGH', 'HIGH', 'NONE', 'SUPPORTED', '空值或不在 0
(@metric_dictionary_version_id, 'PRB_DL_USAGE_RATE', '下行业务信息PRB占用率', 'PERF', '下行业务信息PRB占用率', 'RATIO', 'ratio', '%', 100, 10, 2, 0, 1, 'CONFIRMED', 'HIGH', 'HIGH', 'NONE', 'SUPPORTED', '空值或不在 01 时为 N/A;N/A 不参与负荷候选证据。'),1 时为 N/A;大于 1 的原值保留在原始区但不进入发布。'),
(@metric_dictionary_version_id, 'HANDOVER_SUCCESS_RATE', '切换成功率', 'PERF', '切换成功率', 'RATIO', 'ratio', '%', 100, 10, 2, 0, 1, 'CONFIRMED', 'LOW', 'LOW', 'NONE', 'SUPPORTED', '空值或不在 0
(@metric_dictionary_version_id, 'PDCP_UL_BYTES', '上行PDCP PDU字节数', 'PERF', '小区用户面上行PDCP PDU字节数', 'BYTES', 'byte', 'GB', 0.0000009537, 6, 2, 0, NULL, 'CONFIRMED', 'NONE', 'HIGH', 'SUM', 'SUPPORTED', '空值或负值为 N/A;保留 byte 源值,按旧系统 /1024/1024 展示 GB,并按高值方向参与动态基线与预测。'),
(@metric_dictionary_version_id, 'PDCP_DL_BYTES', '下行PDCP PDU字节数', 'PERF', '小区用户面下行PDCP PDU字节数', 'BYTES', 'byte', 'GB', 0.0000009537, 6, 2, 0, NULL, 'CONFIRMED', 'NONE', 'HIGH', 'SUM', 'SUPPORTED', '空值或负值为 N/A;保留 byte 源值,按旧系统 /1024/1024 展示 GB,并按高值方向参与动态基线与预测。'),
(@metric_dictionary_version_id, 'DL_FREQUENCY', '下行频点', 'INTERFERENCE', '下行频点', 'FREQUENCY', 'source_value', 'N/A', 1, 3, 0, NULL, NULL, 'PENDING', 'NONE', 'NONE', 'NONE', 'RAW_ONLY', '当前文件全部为 0,按 N/A 降级并隐藏频点分析;不把 0 发布为有效频点。'),
(@metric_dictionary_version_id, 'UL_FREQUENCY', '上行频点', 'INTERFERENCE', '上行频点', 'FREQUENCY', 'source_value', 'N/A', 1, 3, 0, NULL, NULL, 'PENDING', 'NONE', 'NONE', 'NONE', 'RAW_ONLY', '当前文件全部为 0,按 N/A 降级并隐藏频点分析;不把 0 发布为有效频点。'),
(@metric_dictionary_version_id, 'MEAN_NOISE_DBM', '平均底噪', 'INTERFERENCE', '平均底噪', 'DBM', 'dBm', 'dBm', 1, 6, 2, NULL, NULL, 'PENDING', 'HIGH', 'HIGH', 'NONE', 'SUPPORTED', '空值或非数值为 N/A;有效范围和跨时空聚合未确认,不能用观测范围代替业务规则。');