"""银行账户与定时任务 Revision ID: 20260813_bank_account_scheduled_task Revises: 20260813_bank_api_log Create Date: 2026-08-13 16:00:00.000000 """ from alembic import op import sqlalchemy as sa # revision identifiers, used by Alembic. revision = '20260813_bank_account_scheduled_task' down_revision = '20260813_bank_api_log' branch_labels = None depends_on = None def upgrade(): # 创建银行账户表 op.create_table( 'bank_accounts', sa.Column('id', sa.String(32), primary_key=True), sa.Column('account_name', sa.String(128), nullable=False, comment='账户名称'), sa.Column('bank_name', sa.String(128), nullable=False, comment='开户银行'), sa.Column('account_no', sa.String(64), unique=True, nullable=False, comment='银行账号'), sa.Column('is_active', sa.Boolean, default=True, comment='是否启用'), sa.Column('is_default', sa.Boolean, default=False, comment='是否默认账户'), sa.Column('description', sa.String(256), nullable=True, comment='备注'), sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.func.now(), comment='创建时间'), sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.func.now(), onupdate=sa.func.now(), comment='更新时间'), ) # 创建定时任务表 op.create_table( 'scheduled_tasks', sa.Column('id', sa.String(32), primary_key=True), sa.Column('name', sa.String(128), nullable=False, comment='任务名称'), sa.Column('task_type', sa.String(32), nullable=False, comment='类型: external_api / internal_method'), sa.Column('schedule', sa.String(128), nullable=False, comment='Cron 表达式或间隔秒数'), sa.Column('config', sa.Text, nullable=True, comment='任务配置 JSON'), sa.Column('is_active', sa.Boolean, default=True, comment='是否启用'), sa.Column('last_run_at', sa.String(64), nullable=True, comment='最后执行时间 ISO'), sa.Column('last_status', sa.String(16), nullable=True, comment='最后执行状态'), sa.Column('last_error', sa.Text, nullable=True, comment='最后执行错误信息'), sa.Column('created_by', sa.String(32), nullable=True, comment='创建者管理员 ID'), sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.func.now(), comment='创建时间'), sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.func.now(), onupdate=sa.func.now(), comment='更新时间'), ) # 删除旧的银行接口请求记录表(日志改为文件存储) op.drop_index('ix_bank_api_logs_created_at', table_name='bank_api_logs') op.drop_index('ix_bank_api_logs_admin_id', table_name='bank_api_logs') op.drop_table('bank_api_logs') def downgrade(): # 恢复 bank_api_logs 表 op.create_table( 'bank_api_logs', sa.Column('id', sa.String(32), primary_key=True), sa.Column('request_type', sa.String(32), nullable=False, comment='请求类型'), sa.Column('request_params', sa.Text, nullable=True, comment='请求参数 JSON'), sa.Column('response_data', sa.Text, nullable=True, comment='响应数据 JSON'), sa.Column('status_code', sa.Integer, nullable=True, comment='HTTP 状态码'), sa.Column('is_success', sa.Boolean, default=True, comment='是否成功'), sa.Column('error_msg', sa.Text, nullable=True, comment='错误信息'), sa.Column('admin_id', sa.String(32), nullable=True, comment='操作管理员 ID'), sa.Column('created_at', sa.DateTime(timezone=True), nullable=False), sa.Column('updated_at', sa.DateTime(timezone=True), nullable=False), ) op.create_index('ix_bank_api_logs_admin_id', 'bank_api_logs', ['admin_id']) op.create_index('ix_bank_api_logs_created_at', 'bank_api_logs', ['created_at']) # 删除新表 op.drop_table('scheduled_tasks') op.drop_table('bank_accounts')