CREATE TABLE `financial_disclosures` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `public_id` CHAR(36) NOT NULL, `client_request_id` CHAR(36) NOT NULL, `request_fingerprint` CHAR(64) NOT NULL, `title` VARCHAR(200) NOT NULL, `summary` VARCHAR(500) NULL, `rich_text` MEDIUMTEXT NOT NULL, `status` ENUM('DRAFT','PUBLISHED','ARCHIVED') NOT NULL DEFAULT 'DRAFT', `is_pinned` BOOLEAN NOT NULL DEFAULT false, `sort_order` INTEGER NOT NULL DEFAULT 0, `revision` INTEGER UNSIGNED NOT NULL DEFAULT 1, `published_at` DATETIME(3) NULL, `created_by` BIGINT UNSIGNED NOT NULL, `updated_by` BIGINT UNSIGNED NOT NULL, `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `updated_at` DATETIME(3) NOT NULL, UNIQUE INDEX `financial_disclosures_public_id_key` (`public_id`), UNIQUE INDEX `financial_disclosures_creator_request_key` (`created_by`, `client_request_id`), INDEX `financial_disclosures_public_list_idx` (`status`, `is_pinned`, `sort_order`, `published_at`), INDEX `financial_disclosures_updated_at_idx` (`updated_at`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE TABLE `financial_disclosure_status_history` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `financial_disclosure_id` BIGINT UNSIGNED NOT NULL, `request_id` CHAR(36) NOT NULL, `request_fingerprint` CHAR(64) NOT NULL, `from_status` ENUM('DRAFT','PUBLISHED','ARCHIVED') NULL, `to_status` ENUM('DRAFT','PUBLISHED','ARCHIVED') NOT NULL, `operator_user_id` BIGINT UNSIGNED NOT NULL, `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), UNIQUE INDEX `financial_disclosure_status_history_request_id_key` (`request_id`), INDEX `financial_disclosure_history_document_idx` (`financial_disclosure_id`, `created_at`), INDEX `financial_disclosure_history_operator_idx` (`operator_user_id`, `created_at`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ALTER TABLE `financial_disclosures` ADD CONSTRAINT `financial_disclosures_created_by_fkey` FOREIGN KEY (`created_by`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE; ALTER TABLE `financial_disclosures` ADD CONSTRAINT `financial_disclosures_updated_by_fkey` FOREIGN KEY (`updated_by`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE; ALTER TABLE `financial_disclosure_status_history` ADD CONSTRAINT `financial_disclosure_history_document_fkey` FOREIGN KEY (`financial_disclosure_id`) REFERENCES `financial_disclosures` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE; ALTER TABLE `financial_disclosure_status_history` ADD CONSTRAINT `financial_disclosure_history_operator_fkey` FOREIGN KEY (`operator_user_id`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE; INSERT INTO `permissions` (`code`, `name`, `description`) VALUES ('financial_disclosures:read', '查看财务公开', '查看财务公开草稿与发布状态'), ('financial_disclosures:manage', '管理财务公开', '创建和编辑财务公开文档'), ('financial_disclosures:publish', '发布财务公开', '发布和归档财务公开文档'); INSERT INTO `role_permissions` (`role_id`, `permission_id`) SELECT r.id, p.id FROM `roles` r CROSS JOIN `permissions` p WHERE r.code IN ('ADMIN','SUPER_ADMIN') AND p.code IN ('financial_disclosures:read','financial_disclosures:manage','financial_disclosures:publish');