合入家庭共享与设备消息能力

This commit is contained in:
stu2not
2026-05-26 17:12:51 +08:00
parent 555a2ddc16
commit 050bc17f79
40 changed files with 3072 additions and 165 deletions

View File

@@ -130,6 +130,21 @@ CREATE TABLE IF NOT EXISTS `device_auth` (
INDEX `idx_batch_id` (`batch_id` ASC)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS `device_imei_mapping` (
`id` INT NOT NULL AUTO_INCREMENT,
`imei` VARCHAR(64) NOT NULL,
`device_id` VARCHAR(64) NOT NULL,
`serial_number` VARCHAR(64) NOT NULL,
`status` VARCHAR(32) NOT NULL DEFAULT 'pending',
`activated_at` DATETIME NULL,
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE INDEX `imei_UNIQUE` (`imei` ASC),
UNIQUE INDEX `device_id_UNIQUE` (`device_id` ASC),
INDEX `idx_device_imei_mapping_status` (`status` ASC)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS `device_firmware_update` (
`id` INT NOT NULL AUTO_INCREMENT,
`device_id` VARCHAR(64) NOT NULL,
@@ -257,6 +272,63 @@ CREATE TABLE IF NOT EXISTS `device_bindings` (
ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS `device_family_members` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`device_id` VARCHAR(64) NOT NULL,
`user_id` BIGINT NOT NULL,
`role` TINYINT NOT NULL DEFAULT 2 COMMENT '1=owner,2=member',
`status` TINYINT NOT NULL DEFAULT 1,
`invited_by_user_id` BIGINT NULL,
`joined_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`removed_at` DATETIME NULL,
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
CONSTRAINT `uq_device_family_member` UNIQUE (`device_id`, `user_id`),
KEY `idx_device_family_members_device_status` (`device_id`, `status`),
KEY `idx_device_family_members_user_status` (`user_id`, `status`),
KEY `idx_device_family_members_invited_by` (`invited_by_user_id`),
CONSTRAINT `fk_device_family_members_device`
FOREIGN KEY (`device_id`)
REFERENCES `device_auth` (`device_id`),
CONSTRAINT `fk_device_family_members_user`
FOREIGN KEY (`user_id`)
REFERENCES `parents` (`user_id`),
CONSTRAINT `fk_device_family_members_invited_by`
FOREIGN KEY (`invited_by_user_id`)
REFERENCES `parents` (`user_id`)
ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS `device_family_invitations` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`invite_token` CHAR(36) NOT NULL,
`device_id` VARCHAR(64) NOT NULL,
`owner_user_id` BIGINT NOT NULL,
`status` TINYINT NOT NULL DEFAULT 1 COMMENT '1=pending,2=accepted,3=expired,4=cancelled',
`expires_at` DATETIME NOT NULL,
`accepted_by_user_id` BIGINT NULL,
`accepted_at` DATETIME NULL,
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uq_device_family_invite_token` (`invite_token`),
KEY `idx_device_family_invites_device_status` (`device_id`, `status`),
KEY `idx_device_family_invites_owner_status` (`owner_user_id`, `status`),
KEY `idx_device_family_invites_expires_at` (`expires_at`),
KEY `idx_device_family_invites_accepted_by` (`accepted_by_user_id`),
CONSTRAINT `fk_device_family_invites_device`
FOREIGN KEY (`device_id`)
REFERENCES `device_auth` (`device_id`),
CONSTRAINT `fk_device_family_invites_owner`
FOREIGN KEY (`owner_user_id`)
REFERENCES `parents` (`user_id`),
CONSTRAINT `fk_device_family_invites_accepted_by`
FOREIGN KEY (`accepted_by_user_id`)
REFERENCES `parents` (`user_id`)
ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS `device_bind_sessions` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`bind_token` CHAR(36) NOT NULL,
@@ -349,11 +421,16 @@ CREATE TABLE IF NOT EXISTS `device_settings` (
`setting_id` BIGINT NOT NULL AUTO_INCREMENT,
`device_id` VARCHAR(64) NOT NULL,
`sleep_mode` TINYINT NOT NULL DEFAULT 0,
`manual_sleep_mode` TINYINT NOT NULL DEFAULT 0,
`schedule_suppressed_until` DATETIME NULL,
`disable_time_start` TIME NULL,
`disable_time_end` TIME NULL,
`timezone` VARCHAR(32) NOT NULL DEFAULT 'Asia/Shanghai',
`volume` TINYINT UNSIGNED NULL,
`brightness` TINYINT UNSIGNED NULL,
`power` TINYINT UNSIGNED NULL,
`signal` TINYINT UNSIGNED NULL,
`version` VARCHAR(64) NULL,
`disable_weekdays` VARCHAR(32) NULL,
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
@@ -364,6 +441,20 @@ CREATE TABLE IF NOT EXISTS `device_settings` (
REFERENCES `device_auth` (`device_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Device alarm events are reported by the device side through MQTT msg_id=010.
CREATE TABLE IF NOT EXISTS `device_alarm_events` (
`alarm_id` BIGINT NOT NULL AUTO_INCREMENT,
`device_id` VARCHAR(64) NOT NULL,
`owner_user_id` BIGINT NULL,
`child_id` BIGINT NULL,
`source_msg_id` VARCHAR(8) NOT NULL DEFAULT '010',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`alarm_id`),
KEY `idx_device_alarm_device_created` (`device_id`, `created_at`),
KEY `idx_device_alarm_owner_created` (`owner_user_id`, `created_at`),
KEY `idx_device_alarm_child_created` (`child_id`, `created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS `im_conversations` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`conversation_type` TINYINT UNSIGNED NOT NULL,
@@ -423,6 +514,29 @@ CREATE TABLE IF NOT EXISTS `im_messages` (
ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Persistent unread voice-message index for device NFC owner-card playback.
-- Audio content is still stored by im_messages/media_file_key; this table only stores delivery state.
CREATE TABLE IF NOT EXISTS `device_pending_voice_messages` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`target_device_id` VARCHAR(64) NOT NULL,
`sender_device_id` VARCHAR(64) NULL,
`im_message_id` BIGINT NOT NULL,
`media_file_key` VARCHAR(255) NOT NULL,
`audio_url` VARCHAR(512) NULL,
`source` VARCHAR(32) NOT NULL DEFAULT 'unknown',
`status` VARCHAR(32) NOT NULL DEFAULT 'pending',
`delivery_count` INT NOT NULL DEFAULT 0,
`delivered_at` DATETIME NULL,
`listened_at` DATETIME NULL,
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uq_device_pending_voice_target_msg` (`target_device_id`, `im_message_id`),
KEY `idx_device_pending_voice_target_status_created` (`target_device_id`, `status`, `created_at`),
KEY `idx_device_pending_voice_sender` (`sender_device_id`),
KEY `idx_device_pending_voice_im_message` (`im_message_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS `child_location_current` (
`child_id` BIGINT NOT NULL,
`device_id` VARCHAR(64) NOT NULL,