"""create advisor_service_request (客户申报 → 投顾受理) 新增一张表:客户在「我的投顾方案」页主动申报,投顾在工作台受理/驳回。 表内**新列全部可空或有业务默认**,不改动任何既有表,因此与基线完全兼容。 ⚠️ 本表的 `id` 是 `AUTO_INCREMENT`:既有 `fin_*` 表缺自增(`20260914_baseline_auto_increment` 那次修复之后才补齐),新表直接按现代写法建,不再重复那个坑。 幂等:先查 `information_schema` 再建表 —— 本仓库的 alembic 版本指针与实际结构 历史上就对不上(指针停在 `20260911_adv_profile_tags`),该表可能已被 DDL 手工建过; 无条件 `CREATE TABLE` 会在这种环境直接失败。 """ from sqlalchemy import text from alembic import op revision = "20260916_advisor_service_request" down_revision = "20260914_baseline_auto_increment" branch_labels = None depends_on = None CREATE_TABLE = """ CREATE TABLE `advisor_service_request` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `request_no` VARCHAR(32) NOT NULL, `customer_id` BIGINT UNSIGNED NOT NULL, `amount_wan` DECIMAL(14,2) NOT NULL, `horizon` VARCHAR(16) NOT NULL, `risk_preference` VARCHAR(16) NOT NULL, `note` VARCHAR(500) NULL, `status` VARCHAR(24) NOT NULL, `handled_by` BIGINT UNSIGNED NULL, `handled_at` DATETIME NULL, `advisor_note` VARCHAR(500) NULL, `result_content_id` BIGINT UNSIGNED NULL, `created_at` DATETIME NOT NULL, `updated_at` DATETIME NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_advisor_service_request_no` (`request_no`), KEY `idx_advisor_service_request_customer` (`customer_id`, `status`), KEY `idx_advisor_service_request_advisor` (`status`, `created_at`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='客户主动申报的投顾服务申请单' """ def _exists() -> bool: bind = op.get_bind() return bool( bind.execute( text( "SELECT COUNT(*) FROM information_schema.TABLES " "WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'advisor_service_request'" ) ).scalar() ) def upgrade() -> None: if _exists(): return op.execute(CREATE_TABLE) def downgrade() -> None: # 表里是客户主动提交的申请,**不做自动删表**:需要回退请人工确认后执行。 raise RuntimeError("advisor_service_request must not be dropped automatically")