-- ============================================================================= -- 域 3:语音域(11 张)+ §10 补遗 T-17 apt_sip_reg_status(1 张)= 12 张 -- 来源:公寓端/03 表 3-5;docs/10 表 5-3(PK/UK/IDX/关键字段)、表 5-4(MySQL 类型适配); -- 公寓端/00 表 0-6~0-8(endpoint / session / recording 逐列)、表 0-9(T-17 逐列); -- CR-02 表 3-40(T-17 关键约束:只追加、无 update_time) -- 约束:分机号不可原地改号(改号返回 40906);sync_state 仅 4 值 + CHECK; -- 录音只存引用与校验和,不落二进制;表上不建外键。 -- ============================================================================= -- 23 分机台账 CREATE TABLE IF NOT EXISTS apt_sip_endpoint ( id BIGINT NOT NULL AUTO_INCREMENT, gyid VARCHAR(32) NOT NULL, endpoint_id VARCHAR(64) NOT NULL, extension VARCHAR(8) NOT NULL COMMENT '分机号 char(8),入库统一大写', room_id VARCHAR(64) NULL, display_name VARCHAR(64) NULL, config_version BIGINT NOT NULL DEFAULT 1 COMMENT '分机配置版本(区别于 state_version/biz_version)', sync_state VARCHAR(20) NOT NULL DEFAULT 'PENDING' COMMENT '仅 PENDING/SYNCED/FAILED/DRIFT', enabled TINYINT NOT NULL DEFAULT 1, last_qualify_at DATETIME(3) NULL, deleted TINYINT NOT NULL DEFAULT 0, create_time DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), update_time DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), PRIMARY KEY (id), UNIQUE KEY uk_endpoint_gyid_id (gyid, endpoint_id), UNIQUE KEY uk_endpoint_gyid_ext (gyid, extension), KEY idx_endpoint_gyid_sync (gyid, sync_state), CONSTRAINT ck_endpoint_sync CHECK (sync_state IN ('PENDING','SYNCED','FAILED','DRIFT')) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='SIP 分机台账(先库后 Asterisk + 异步收敛)'; -- 24 分机-房间绑定 CREATE TABLE IF NOT EXISTS apt_sip_binding ( id BIGINT NOT NULL AUTO_INCREMENT, gyid VARCHAR(32) NOT NULL, binding_id VARCHAR(64) NOT NULL, endpoint_id VARCHAR(64) NOT NULL, room_id VARCHAR(64) NOT NULL, effective_from DATETIME(3) NOT NULL, effective_to DATETIME(3) NULL, state VARCHAR(20) NOT NULL DEFAULT 'ACTIVE', deleted TINYINT NOT NULL DEFAULT 0, create_time DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), update_time DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), PRIMARY KEY (id), UNIQUE KEY uk_binding_gyid_id (gyid, binding_id), KEY idx_binding_gyid_room (gyid, room_id, state) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='分机绑定 [推断]'; -- 25 中继 CREATE TABLE IF NOT EXISTS apt_trunk ( id BIGINT NOT NULL AUTO_INCREMENT, gyid VARCHAR(32) NOT NULL, trunk_id VARCHAR(64) NOT NULL, trunk_name VARCHAR(64) NULL, host_ref VARCHAR(128) NULL COMMENT '只存引用,不落内网地址', state VARCHAR(20) NOT NULL DEFAULT 'ACTIVE', config_version BIGINT NOT NULL DEFAULT 1, deleted TINYINT NOT NULL DEFAULT 0, create_time DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), update_time DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), PRIMARY KEY (id), UNIQUE KEY uk_trunk_gyid_id (gyid, trunk_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='中继 [推断]'; -- 26 通话会话 CREATE TABLE IF NOT EXISTS apt_call_session ( id BIGINT NOT NULL AUTO_INCREMENT, gyid VARCHAR(32) NOT NULL, session_id VARCHAR(64) NOT NULL, jcid VARCHAR(64) NULL, endpoint_id VARCHAR(64) NULL, conf_no VARCHAR(64) NULL COMMENT '单 Conf-01 兼容值,不加唯一约束', call_mode VARCHAR(20) NOT NULL DEFAULT 'SIP', call_state VARCHAR(20) NOT NULL DEFAULT 'INIT', started_at DATETIME(3) NULL, answered_at DATETIME(3) NULL, ended_at DATETIME(3) NULL, hangup_cause VARCHAR(64) NULL, biz_version BIGINT NOT NULL DEFAULT 1, deleted TINYINT NOT NULL DEFAULT 0, create_time DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), update_time DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), PRIMARY KEY (id), UNIQUE KEY uk_callsession_gyid_id (gyid, session_id), KEY idx_callsession_gyid_jcid (gyid, jcid), KEY idx_callsession_gyid_state (gyid, call_state, started_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='通话会话(ConfbridgeJoin 判接通)'; -- 27 AMI 事件(只追加,明细不上报) CREATE TABLE IF NOT EXISTS apt_call_event ( id BIGINT NOT NULL AUTO_INCREMENT, gyid VARCHAR(32) NOT NULL, event_seq BIGINT NOT NULL COMMENT '同会话单调', event_id VARCHAR(64) NOT NULL, session_id VARCHAR(64) NULL, event_type VARCHAR(32) NOT NULL, event_payload JSON NULL, occurred_at DATETIME(3) NOT NULL, create_time DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), PRIMARY KEY (id), UNIQUE KEY uk_callevent_gyid_id (gyid, event_id), UNIQUE KEY uk_callevent_gyid_seq (gyid, session_id, event_seq), KEY idx_callevent_gyid_time (gyid, occurred_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='AMI 事件(只追加)[推断]'; -- 28 AMI 事件归档(只读) CREATE TABLE IF NOT EXISTS apt_call_event_his ( id BIGINT NOT NULL AUTO_INCREMENT, gyid VARCHAR(32) NOT NULL, event_id VARCHAR(64) NOT NULL, event_seq BIGINT NOT NULL, session_id VARCHAR(64) NULL, event_type VARCHAR(32) NULL, event_payload JSON NULL, occurred_at DATETIME(3) NULL, archived_at DATETIME(3) NULL, create_time DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), PRIMARY KEY (id), UNIQUE KEY uk_calleventhis_gyid_id (gyid, event_id), KEY idx_calleventhis_gyid_date (gyid, archived_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='AMI 事件归档 [推断]'; -- 29 录音索引(只存引用,PURGED 返回 41001) CREATE TABLE IF NOT EXISTS apt_recording ( id BIGINT NOT NULL AUTO_INCREMENT, gyid VARCHAR(32) NOT NULL, recording_id VARCHAR(64) NOT NULL, session_id VARCHAR(64) NULL, file_ref VARCHAR(512) NULL COMMENT '签名地址引用,不落二进制', checksum VARCHAR(128) NULL, duration_ms BIGINT NULL, state VARCHAR(20) NOT NULL DEFAULT 'RECORDING' COMMENT 'RECORDING/AVAILABLE/MISSING/PURGED', expire_at DATETIME(3) NULL, deleted TINYINT NOT NULL DEFAULT 0, create_time DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), update_time DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), PRIMARY KEY (id), UNIQUE KEY uk_recording_gyid_id (gyid, recording_id), KEY idx_recording_gyid_session (gyid, session_id), CONSTRAINT ck_recording_state CHECK (state IN ('RECORDING','AVAILABLE','MISSING','PURGED')) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='录音索引(§12:录音不出公寓)'; -- 30 TTS 播报记录 CREATE TABLE IF NOT EXISTS apt_tts_utterance ( id BIGINT NOT NULL AUTO_INCREMENT, gyid VARCHAR(32) NOT NULL, utterance_id VARCHAR(64) NOT NULL, text_ref VARCHAR(256) NULL, audio_ref VARCHAR(512) NULL, state VARCHAR(20) NOT NULL DEFAULT 'PENDING', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), PRIMARY KEY (id), UNIQUE KEY uk_tts_gyid_id (gyid, utterance_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='TTS 播报 [推断]'; -- 31 Asterisk 配置版本 CREATE TABLE IF NOT EXISTS apt_ast_config_version ( id BIGINT NOT NULL AUTO_INCREMENT, gyid VARCHAR(32) NOT NULL, version_id VARCHAR(64) NOT NULL, config_type VARCHAR(32) NOT NULL, config_version BIGINT NOT NULL DEFAULT 1, checksum VARCHAR(128) NULL, applied_at DATETIME(3) NULL, state VARCHAR(20) NOT NULL DEFAULT 'DRAFT', create_time DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), PRIMARY KEY (id), UNIQUE KEY uk_astcfg_gyid_ver (gyid, version_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='Asterisk 配置版本 [推断]'; -- 32 配置漂移对账 CREATE TABLE IF NOT EXISTS apt_ast_drift ( id BIGINT NOT NULL AUTO_INCREMENT, gyid VARCHAR(32) NOT NULL, drift_id VARCHAR(64) NOT NULL, endpoint_id VARCHAR(64) NULL, drift_type VARCHAR(32) NOT NULL, expected_ref VARCHAR(256) NULL, actual_ref VARCHAR(256) NULL, detected_at DATETIME(3) NOT NULL, resolved_at DATETIME(3) NULL, state VARCHAR(20) NOT NULL DEFAULT 'OPEN', create_time DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), PRIMARY KEY (id), UNIQUE KEY uk_astdrift_gyid_id (gyid, drift_id), KEY idx_astdrift_gyid_state (gyid, state, detected_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='配置漂移 [推断]'; -- 33 AMI 会话 CREATE TABLE IF NOT EXISTS apt_ast_ami_session ( id BIGINT NOT NULL AUTO_INCREMENT, gyid VARCHAR(32) NOT NULL, ami_session_id VARCHAR(64) NOT NULL, connected_at DATETIME(3) NULL, disconnected_at DATETIME(3) NULL, reconnect_count INT NOT NULL DEFAULT 0, state VARCHAR(20) NOT NULL DEFAULT 'DOWN', create_time DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), PRIMARY KEY (id), UNIQUE KEY uk_amisession_gyid_id (gyid, ami_session_id), KEY idx_amisession_gyid_state (gyid, state, connected_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='AMI 会话 [推断]'; -- 34 T-17 分机注册状态流水(CR-02 §10 补遗 / 公寓端/00 表 0-9) -- 只追加、无 update_time;event_seq 同分机单调;恢复只追加不清空 CREATE TABLE IF NOT EXISTS apt_sip_reg_status ( id BIGINT NOT NULL AUTO_INCREMENT COMMENT '代理主键', gyid VARCHAR(32) NOT NULL, endpoint_id VARCHAR(64) NOT NULL, event_seq BIGINT NOT NULL COMMENT '同分机单调递增', state VARCHAR(20) NOT NULL COMMENT 'REGISTERED/UNREGISTERED/UNREACHABLE/UNKNOWN', prev_state VARCHAR(20) NULL, source VARCHAR(20) NOT NULL COMMENT 'AMI_EVENT/QUALIFY/PROBE/MANUAL/RECONCILE', alarm_id VARCHAR(64) NULL COMMENT '关联 apt_device_alarm', alarm_event_key VARCHAR(128) NULL COMMENT 'hash(gyid,endpoint_id,SIP_OFFLINE,offline_since)', offline_since DATETIME(3) NULL, occurred_at DATETIME(3) NOT NULL, biz_version BIGINT NOT NULL DEFAULT 1, create_time DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), PRIMARY KEY (id), UNIQUE KEY uk_sipreg_gyid_seq (gyid, endpoint_id, event_seq), KEY idx_sipreg_gyid_state_time (gyid, state, occurred_at), KEY idx_sipreg_gyid_ep_time (gyid, endpoint_id, occurred_at), CONSTRAINT ck_sipreg_state CHECK (state IN ('REGISTERED','UNREGISTERED','UNREACHABLE','UNKNOWN')), CONSTRAINT ck_sipreg_source CHECK (source IN ('AMI_EVENT','QUALIFY','PROBE','MANUAL','RECONCILE')) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='T-17 分机注册状态流水(只追加)';