-- 支付中台最新总 DDL
-- 说明：
-- 1. 本文件汇总当前最新表结构，作为后续 Navicat 调整和代码对齐的参考基线。
-- 2. 当前以 `ma_merchant` 为商户主体和后台登录主体，登录口径是 `merchant_no + password_hash`。
-- 3. `ma_merchant_api_credential` 仅用于开放接口签名与兼容层，不参与商户后台登录。
-- 4. 已删除 `channel_code` 业务编码，所有关联一律使用主键 `id`。
-- 5. 路由链路采用：商户分组 -> 轮询组 -> 支付通道。
-- 6. `ma_merchant_policy` 当前仅保留预留表结构，不作为正式后台能力暴露。
-- 7. 所有状态、模式、类型类字段统一使用 `tinyint`，语义映射请见 `app/common/constant`。
-- 8. `ext_json` 使用分区结构保存轻量运行上下文；`_protocol_version` 可放顶层便于查询，通知/回调/重试/原始报文进入专门日志表。
-- 9. `ma_pay_order` 不再保留 `request_method` 这类 HTTP 快照字段。

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

CREATE TABLE IF NOT EXISTS `ma_payment_type` (
  `id` int unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `code` varchar(32) NOT NULL DEFAULT '' COMMENT '支付方式编码',
  `name` varchar(50) NOT NULL DEFAULT '' COMMENT '支付方式名称',
  `icon` varchar(255) NOT NULL DEFAULT '' COMMENT '图标',
  `sort_no` int NOT NULL DEFAULT 0 COMMENT '排序',
  `status` tinyint NOT NULL DEFAULT 1 COMMENT '状态：0-禁用，1-启用',
  `remark` varchar(500) NOT NULL DEFAULT '' COMMENT '备注',
  `created_at` datetime DEFAULT NULL COMMENT '创建时间',
  `updated_at` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_code` (`code`),
  KEY `idx_status_sort` (`status`, `sort_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='支付方式字典表';

CREATE TABLE IF NOT EXISTS `ma_merchant_group` (
  `id` int unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `group_name` varchar(100) NOT NULL DEFAULT '' COMMENT '商户分组名称',
  `status` tinyint NOT NULL DEFAULT 1 COMMENT '状态：0-禁用,1-启用',
  `remark` varchar(500) NOT NULL DEFAULT '' COMMENT '备注',
  `created_at` datetime DEFAULT NULL COMMENT '创建时间',
  `updated_at` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_group_name` (`group_name`),
  KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商户分组表';

CREATE TABLE IF NOT EXISTS `ma_merchant` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `merchant_no` varchar(32) NOT NULL DEFAULT '' COMMENT '商户号（唯一，对外标识，同时作为后台登录账号）',
  `password_hash` varchar(255) NOT NULL DEFAULT '' COMMENT '商户后台登录密码哈希',
  `merchant_name` varchar(100) NOT NULL DEFAULT '' COMMENT '商户名称',
  `merchant_short_name` varchar(60) NOT NULL DEFAULT '' COMMENT '商户简称',
  `merchant_type` tinyint NOT NULL DEFAULT 0 COMMENT '商户类型：0-个人，1-企业，2-其他',
  `group_id` int unsigned NOT NULL DEFAULT 0 COMMENT '商户分组ID',
  `risk_level` tinyint NOT NULL DEFAULT 0 COMMENT '风控等级：0-低，1-中，2-高',
  `contact_name` varchar(50) NOT NULL DEFAULT '' COMMENT '联系人姓名',
  `contact_phone` varchar(20) NOT NULL DEFAULT '' COMMENT '联系人手机号',
  `contact_email` varchar(100) NOT NULL DEFAULT '' COMMENT '联系人邮箱',
  `settlement_account_name` varchar(100) NOT NULL DEFAULT '' COMMENT '结算账户名',
  `settlement_account_no` varchar(100) NOT NULL DEFAULT '' COMMENT '结算账户号',
  `settlement_bank_name` varchar(100) NOT NULL DEFAULT '' COMMENT '结算银行名称',
  `settlement_bank_branch` varchar(100) NOT NULL DEFAULT '' COMMENT '结算支行名称',
  `status` tinyint NOT NULL DEFAULT 1 COMMENT '状态：0-禁用, 1-启用',
  `pay_status` tinyint NOT NULL DEFAULT 1 COMMENT '支付开关：0-关闭,1-开启',
  `settle_status` tinyint NOT NULL DEFAULT 1 COMMENT '结算开关：0-关闭,1-开启',
  `settle_type` tinyint NOT NULL DEFAULT 4 COMMENT '结算类型：1-支付宝,2-微信,3-QQ,4-银行卡',
  `last_login_at` datetime DEFAULT NULL COMMENT '最后登录时间',
  `last_login_ip` varchar(45) NOT NULL DEFAULT '' COMMENT '最后登录IP',
  `password_updated_at` datetime DEFAULT NULL COMMENT '密码更新时间',
  `remark` varchar(500) NOT NULL DEFAULT '' COMMENT '备注',
  `created_at` datetime DEFAULT NULL COMMENT '创建时间',
  `updated_at` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_merchant_no` (`merchant_no`),
  KEY `idx_group_id` (`group_id`),
  KEY `idx_contact_phone` (`contact_phone`),
  KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商户表';

CREATE TABLE IF NOT EXISTS `ma_payment_plugin` (
  `code` varchar(32) NOT NULL DEFAULT '' COMMENT '插件编码',
  `name` varchar(50) NOT NULL DEFAULT '' COMMENT '插件名称',
  `class_name` varchar(255) NOT NULL DEFAULT '' COMMENT '插件类名',
  `config_schema` json DEFAULT NULL COMMENT '插件配置Schema(JSON)',
  `pay_types` json DEFAULT NULL COMMENT '支持的支付方式编码(JSON)',
  `transfer_types` json DEFAULT NULL COMMENT '支持的转账方式编码(JSON)',
  `version` varchar(20) NOT NULL DEFAULT '' COMMENT '版本',
  `author` varchar(50) NOT NULL DEFAULT '' COMMENT '作者',
  `link` varchar(255) NOT NULL DEFAULT '' COMMENT '链接',
  `allow_merchant` tinyint NOT NULL DEFAULT 0 COMMENT '是否允许商户端自助使用：0-否,1-是',
  `status` tinyint NOT NULL DEFAULT 1 COMMENT '状态：0-禁用, 1-启用',
  `remark` varchar(500) NOT NULL DEFAULT '' COMMENT '备注',
  `created_at` datetime DEFAULT NULL COMMENT '创建时间',
  `updated_at` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`code`),
  KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='支付插件注册表';

CREATE TABLE IF NOT EXISTS `ma_payment_plugin_conf` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `merchant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '所属商户ID，0表示平台配置',
  `plugin_code` varchar(32) NOT NULL DEFAULT '' COMMENT '插件编码',
  `config` json DEFAULT NULL COMMENT '插件初始化配置',
  `settlement_cycle_type` tinyint unsigned NOT NULL DEFAULT 1 COMMENT '结算周期类型：0-D0,1-D1,2-D7,3-T1,4-OTHER',
  `settlement_cutoff_time` varchar(8) NOT NULL DEFAULT '23:59:59' COMMENT '结算截止时间',
  `remark` varchar(500) NOT NULL DEFAULT '' COMMENT '备注',
  `created_at` datetime DEFAULT NULL COMMENT '创建时间',
  `updated_at` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_plugin_code` (`plugin_code`),
  KEY `idx_merchant_plugin` (`merchant_id`, `plugin_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='支付插件API配置表';

CREATE TABLE IF NOT EXISTS `ma_payment_channel` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `merchant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '所属商户ID，0表示平台通道',
  `name` varchar(100) NOT NULL DEFAULT '' COMMENT '通道名称',
  `split_rate_bp` int unsigned NOT NULL DEFAULT 10000 COMMENT '分成比例（bp）',
  `cost_rate_bp` int unsigned NOT NULL DEFAULT 0 COMMENT '通道成本（bp）',
  `channel_mode` tinyint NOT NULL DEFAULT 0 COMMENT '通道模式：0-代收，1-自收',
  `pay_type_id` int unsigned NOT NULL DEFAULT 0 COMMENT '支付方式ID',
  `plugin_code` varchar(32) NOT NULL DEFAULT '' COMMENT '支付插件编码',
  `api_config_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT 'API配置ID，关联插件配置表主键ID',
  `daily_limit_amount` bigint unsigned NOT NULL DEFAULT 0 COMMENT '单日限额（分，0表示不限制）',
  `daily_limit_count` int unsigned NOT NULL DEFAULT 0 COMMENT '单日限笔（0表示不限制）',
  `min_amount` bigint unsigned NOT NULL DEFAULT 0 COMMENT '单笔最小金额（分）',
  `max_amount` bigint unsigned NOT NULL DEFAULT 0 COMMENT '单笔最大金额（分）',
  `remark` varchar(500) NOT NULL DEFAULT '' COMMENT '备注',
  `status` tinyint NOT NULL DEFAULT 1 COMMENT '状态：0-禁用,1-启用',
  `sort_no` int NOT NULL DEFAULT 0 COMMENT '排序，越小优先级越高',
  `created_at` datetime DEFAULT NULL COMMENT '创建时间',
  `updated_at` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_name` (`name`),
  KEY `idx_merchant_id_status` (`merchant_id`, `status`),
  KEY `idx_pay_type_id_status` (`pay_type_id`, `status`),
  KEY `idx_plugin_code_status` (`plugin_code`, `status`),
  KEY `idx_channel_mode_status` (`channel_mode`, `status`),
  KEY `idx_sort_no` (`sort_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='支付通道表';

CREATE TABLE IF NOT EXISTS `ma_payment_poll_group` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `group_name` varchar(100) NOT NULL DEFAULT '' COMMENT '轮询组名称',
  `pay_type_id` int unsigned NOT NULL DEFAULT 0 COMMENT '支付方式ID',
  `route_mode` tinyint NOT NULL DEFAULT 0 COMMENT '路由模式：0-顺序依次轮询,1-权重随机轮询,2-默认启用通道',
  `status` tinyint NOT NULL DEFAULT 1 COMMENT '状态：0-禁用,1-启用',
  `remark` varchar(500) NOT NULL DEFAULT '' COMMENT '备注',
  `created_at` datetime DEFAULT NULL COMMENT '创建时间',
  `updated_at` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_group_name` (`group_name`),
  KEY `idx_pay_type_status` (`pay_type_id`, `status`),
  KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='支付轮询组表';

CREATE TABLE IF NOT EXISTS `ma_payment_poll_group_channel` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `poll_group_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '轮询组ID',
  `channel_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '支付通道ID',
  `sort_no` int NOT NULL DEFAULT 0 COMMENT '排序，越小优先级越高',
  `weight` int NOT NULL DEFAULT 100 COMMENT '权重',
  `is_default` tinyint NOT NULL DEFAULT 0 COMMENT '是否默认通道：0-否,1-是',
  `status` tinyint NOT NULL DEFAULT 1 COMMENT '状态：0-禁用,1-启用',
  `remark` varchar(500) NOT NULL DEFAULT '' COMMENT '备注',
  `created_at` datetime DEFAULT NULL COMMENT '创建时间',
  `updated_at` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_poll_group_channel` (`poll_group_id`, `channel_id`),
  KEY `idx_poll_group_status_sort` (`poll_group_id`, `status`, `sort_no`),
  KEY `idx_channel_status` (`channel_id`, `status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='支付轮询组-通道编排表';

CREATE TABLE IF NOT EXISTS `ma_payment_poll_group_bind` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `merchant_group_id` int unsigned NOT NULL DEFAULT 0 COMMENT '商户分组ID',
  `pay_type_id` int unsigned NOT NULL DEFAULT 0 COMMENT '支付方式ID',
  `poll_group_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '轮询组ID',
  `status` tinyint NOT NULL DEFAULT 1 COMMENT '状态：0-禁用,1-启用',
  `remark` varchar(500) NOT NULL DEFAULT '' COMMENT '备注',
  `created_at` datetime DEFAULT NULL COMMENT '创建时间',
  `updated_at` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_group_pay_type` (`merchant_group_id`, `pay_type_id`),
  KEY `idx_poll_group_status` (`poll_group_id`, `status`),
  KEY `idx_group_status` (`merchant_group_id`, `status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商户分组-轮询组绑定表';

CREATE TABLE IF NOT EXISTS `ma_merchant_policy` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `merchant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '商户ID（唯一）',
  `settlement_cycle_override` tinyint unsigned NOT NULL DEFAULT 1 COMMENT '结算周期覆盖：0-D0,1-D1,2-D7,3-T1,4-OTHER',
  `auto_payout` tinyint NOT NULL DEFAULT 0 COMMENT '是否自动入账/自动处理：0-否,1-是',
  `min_settlement_amount` bigint unsigned NOT NULL DEFAULT 0 COMMENT '最小结算金额（分）',
  `retry_policy_json` json DEFAULT NULL COMMENT '失败重试策略(JSON)',
  `route_policy_json` json DEFAULT NULL COMMENT '路由策略(JSON)',
  `fee_rule_override_json` json DEFAULT NULL COMMENT '费率/计费覆盖策略(JSON)',
  `risk_policy_json` json DEFAULT NULL COMMENT '风控策略(JSON)',
  `remark` varchar(500) NOT NULL DEFAULT '' COMMENT '备注',
  `created_at` datetime DEFAULT NULL COMMENT '创建时间',
  `updated_at` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_merchant_id` (`merchant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商户策略预留表';

CREATE TABLE IF NOT EXISTS `ma_biz_order` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `biz_no` varchar(32) NOT NULL DEFAULT '' COMMENT '业务订单号',
  `trace_no` varchar(32) NOT NULL DEFAULT '' COMMENT '统一追踪号',
  `merchant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '商户ID',
  `merchant_order_no` varchar(64) NOT NULL DEFAULT '' COMMENT '商户订单号（幂等）',
  `subject` varchar(255) NOT NULL DEFAULT '' COMMENT '订单标题',
  `body` varchar(500) NOT NULL DEFAULT '' COMMENT '订单描述',
  `notify_url` varchar(255) NOT NULL DEFAULT '' COMMENT '异步通知地址',
  `return_url` varchar(255) NOT NULL DEFAULT '' COMMENT '同步返回地址',
  `client_ip` varchar(45) NOT NULL DEFAULT '' COMMENT '客户端IP',
  `device` varchar(32) NOT NULL DEFAULT '' COMMENT '设备类型',
  `order_amount` bigint unsigned NOT NULL DEFAULT 0 COMMENT '订单金额（分）',
  `paid_amount` bigint unsigned NOT NULL DEFAULT 0 COMMENT '已支付金额（分）',
  `refund_amount` bigint unsigned NOT NULL DEFAULT 0 COMMENT '已退款金额（分）',
  `status` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '状态：0-待创建,1-支付中,2-成功,3-失败,4-关闭,5-超时',
  `active_pay_no` varchar(32) DEFAULT NULL COMMENT '当前正在支付的支付单号',
  `attempt_count` int unsigned NOT NULL DEFAULT 0 COMMENT '支付尝试次数',
  `expire_at` datetime DEFAULT NULL COMMENT '过期时间',
  `paid_at` datetime DEFAULT NULL COMMENT '支付成功时间',
  `closed_at` datetime DEFAULT NULL COMMENT '关闭时间',
  `failed_at` datetime DEFAULT NULL COMMENT '失败时间',
  `timeout_at` datetime DEFAULT NULL COMMENT '超时时间',
  `ext_json` json DEFAULT NULL COMMENT '商户扩展字段(JSON)',
  `created_at` datetime DEFAULT NULL COMMENT '创建时间',
  `updated_at` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_merchant_order` (`merchant_id`, `merchant_order_no`),
  UNIQUE KEY `uk_biz_no` (`biz_no`),
  KEY `idx_trace_no` (`trace_no`),
  KEY `idx_merchant_status_created` (`merchant_id`, `status`, `created_at`),
  KEY `idx_active_pay_no` (`active_pay_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='业务订单表';

CREATE TABLE IF NOT EXISTS `ma_pay_order` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `pay_no` varchar(32) NOT NULL DEFAULT '' COMMENT '支付单号',
  `biz_no` varchar(32) NOT NULL DEFAULT '' COMMENT '业务订单号',
  `trace_no` varchar(32) NOT NULL DEFAULT '' COMMENT '统一追踪号',
  `merchant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '商户ID',
  `merchant_group_id` int unsigned NOT NULL DEFAULT 0 COMMENT '商户分组ID快照',
  `poll_group_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '轮询组ID快照',
  `attempt_no` int unsigned NOT NULL DEFAULT 1 COMMENT '支付尝试序号',
  `channel_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '支付通道ID',
  `pay_type_id` int unsigned NOT NULL DEFAULT 0 COMMENT '支付方式ID',
  `plugin_code` varchar(32) NOT NULL DEFAULT '' COMMENT '支付插件编码',
  `channel_type` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '通道类型：0-平台代收,1-商户自有',
  `channel_mode` tinyint NOT NULL DEFAULT 0 COMMENT '通道模式：0-代收，1-自收',
  `pay_amount` bigint unsigned NOT NULL DEFAULT 0 COMMENT '支付金额（分）',
  `notify_url` varchar(255) NOT NULL DEFAULT '' COMMENT '异步通知地址',
  `return_url` varchar(255) NOT NULL DEFAULT '' COMMENT '跳转通知地址',
  `client_ip` varchar(45) NOT NULL DEFAULT '' COMMENT '客户端 IP',
  `device` varchar(32) NOT NULL DEFAULT '' COMMENT '设备类型',
  `fee_rate_bp_snapshot` int unsigned NOT NULL DEFAULT 0 COMMENT '费率bp快照',
  `split_rate_bp_snapshot` int unsigned NOT NULL DEFAULT 10000 COMMENT '分成比例bp快照',
  `fee_estimated_amount` bigint unsigned NOT NULL DEFAULT 0 COMMENT '预估手续费（分）',
  `fee_actual_amount` bigint unsigned NOT NULL DEFAULT 0 COMMENT '实际手续费（分）',
  `status` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '状态：0-待创建,1-支付中,2-成功,3-失败,4-关闭,5-超时',
  `fee_status` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '手续费状态：0-无,1-冻结,2-已扣,3-已释放',
  `settlement_status` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '清算状态：0-无,1-待清算,2-已清算,3-已冲正',
  `channel_request_no` varchar(64) NOT NULL DEFAULT '' COMMENT '渠道请求号（幂等）',
  `channel_order_no` varchar(64) DEFAULT NULL COMMENT '渠道订单号',
  `channel_trade_no` varchar(64) DEFAULT NULL COMMENT '渠道交易号',
  `channel_error_code` varchar(64) NOT NULL DEFAULT '' COMMENT '渠道错误码',
  `channel_error_msg` varchar(255) NOT NULL DEFAULT '' COMMENT '渠道错误信息',
  `request_at` datetime DEFAULT NULL COMMENT '请求时间',
  `paid_at` datetime DEFAULT NULL COMMENT '支付成功时间',
  `expire_at` datetime DEFAULT NULL COMMENT '过期时间',
  `closed_at` datetime DEFAULT NULL COMMENT '关闭时间',
  `failed_at` datetime DEFAULT NULL COMMENT '失败时间',
  `timeout_at` datetime DEFAULT NULL COMMENT '超时时间',
  `callback_status` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '回调处理状态：0-未回调,1-成功,2-失败',
  `callback_times` int unsigned NOT NULL DEFAULT 0 COMMENT '回调次数',
  `ext_json` json DEFAULT NULL COMMENT '商户扩展字段(JSON)',
  `created_at` datetime DEFAULT NULL COMMENT '创建时间',
  `updated_at` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_pay_no` (`pay_no`),
  UNIQUE KEY `uk_biz_attempt` (`biz_no`, `attempt_no`),
  UNIQUE KEY `uk_channel_request_no` (`merchant_id`, `channel_request_no`),
  KEY `idx_trace_no` (`trace_no`),
  KEY `idx_merchant_status_created` (`merchant_id`, `status`, `created_at`),
  KEY `idx_channel_trade_no` (`channel_trade_no`),
  KEY `idx_channel_id_status` (`channel_id`, `status`),
  KEY `idx_poll_group_id` (`poll_group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='支付单表';

CREATE TABLE IF NOT EXISTS `ma_refund_order` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `refund_no` varchar(32) NOT NULL DEFAULT '' COMMENT '退款单号',
  `merchant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '商户ID',
  `merchant_group_id` int unsigned NOT NULL DEFAULT 0 COMMENT '商户分组ID快照',
  `biz_no` varchar(32) NOT NULL DEFAULT '' COMMENT '业务订单号',
  `trace_no` varchar(32) NOT NULL DEFAULT '' COMMENT '统一追踪号',
  `pay_no` varchar(32) NOT NULL DEFAULT '' COMMENT '支付单号',
  `merchant_refund_no` varchar(64) NOT NULL DEFAULT '' COMMENT '商户退款号（幂等）',
  `channel_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '支付通道ID',
  `refund_amount` bigint unsigned NOT NULL DEFAULT 0 COMMENT '退款金额（分）',
  `fee_reverse_amount` bigint unsigned NOT NULL DEFAULT 0 COMMENT '手续费冲回金额（分）',
  `status` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '状态：0-待创建,1-处理中,2-成功,3-失败,4-关闭',
  `channel_request_no` varchar(64) NOT NULL DEFAULT '' COMMENT '渠道退款请求号（幂等）',
  `channel_refund_no` varchar(64) DEFAULT NULL COMMENT '渠道退款号',
  `reason` varchar(255) NOT NULL DEFAULT '' COMMENT '退款原因',
  `request_at` datetime DEFAULT NULL COMMENT '申请时间',
  `processing_at` datetime DEFAULT NULL COMMENT '处理时间',
  `succeeded_at` datetime DEFAULT NULL COMMENT '成功时间',
  `failed_at` datetime DEFAULT NULL COMMENT '失败时间',
  `retry_count` int unsigned NOT NULL DEFAULT 0 COMMENT '重试次数',
  `last_error` varchar(255) NOT NULL DEFAULT '' COMMENT '最近错误信息',
  `ext_json` json DEFAULT NULL COMMENT '商户扩展字段(JSON)',
  `created_at` datetime DEFAULT NULL COMMENT '创建时间',
  `updated_at` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_refund_no` (`refund_no`),
  UNIQUE KEY `uk_merchant_refund_no` (`merchant_id`, `merchant_refund_no`),
  UNIQUE KEY `uk_channel_request_no` (`merchant_id`, `channel_request_no`),
  KEY `idx_trace_no` (`trace_no`),
  KEY `idx_biz_status_created` (`biz_no`, `status`, `created_at`),
  KEY `idx_merchant_status_created` (`merchant_id`, `status`, `created_at`),
  KEY `idx_pay_no` (`pay_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='退款单表';

CREATE TABLE IF NOT EXISTS `ma_transfer_order` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `biz_no` varchar(32) NOT NULL DEFAULT '' COMMENT '业务号',
  `trace_no` varchar(32) NOT NULL DEFAULT '' COMMENT '统一追踪号',
  `merchant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '商户ID',
  `merchant_group_id` int unsigned NOT NULL DEFAULT 0 COMMENT '商户分组ID快照',
  `out_biz_no` varchar(64) NOT NULL DEFAULT '' COMMENT '商户转账单号',
  `type` varchar(32) NOT NULL DEFAULT '' COMMENT '转账类型',
  `account` varchar(100) NOT NULL DEFAULT '' COMMENT '收款账号',
  `name` varchar(100) NOT NULL DEFAULT '' COMMENT '收款姓名',
  `amount` bigint unsigned NOT NULL DEFAULT 0 COMMENT '转账金额（分）',
  `cost_amount` bigint unsigned NOT NULL DEFAULT 0 COMMENT '手续费（分）',
  `remark` varchar(255) NOT NULL DEFAULT '' COMMENT '备注',
  `bookid` varchar(64) NOT NULL DEFAULT '' COMMENT '书签ID',
  `channel_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '通道ID',
  `channel_request_no` varchar(64) NOT NULL DEFAULT '' COMMENT '渠道请求号',
  `channel_order_no` varchar(64) DEFAULT NULL COMMENT '渠道订单号',
  `channel_trade_no` varchar(64) DEFAULT NULL COMMENT '渠道交易号',
  `channel_error_code` varchar(64) NOT NULL DEFAULT '' COMMENT '渠道错误码',
  `channel_error_msg` varchar(255) NOT NULL DEFAULT '' COMMENT '渠道错误信息',
  `status` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '状态：0-待处理,1-成功,2-失败',
  `request_at` datetime DEFAULT NULL COMMENT '请求时间',
  `processing_at` datetime DEFAULT NULL COMMENT '处理中时间',
  `succeeded_at` datetime DEFAULT NULL COMMENT '成功时间',
  `failed_at` datetime DEFAULT NULL COMMENT '失败时间',
  `ext_json` json DEFAULT NULL COMMENT '商户扩展字段(JSON)',
  `created_at` datetime DEFAULT NULL COMMENT '创建时间',
  `updated_at` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_biz_no` (`biz_no`),
  UNIQUE KEY `uk_merchant_channel_request_no` (`merchant_id`, `channel_request_no`),
  UNIQUE KEY `uk_merchant_out_biz_no` (`merchant_id`, `out_biz_no`),
  KEY `idx_trace_no` (`trace_no`),
  KEY `idx_merchant_status_created` (`merchant_id`, `status`, `created_at`),
  KEY `idx_channel_trade_no` (`channel_trade_no`),
  KEY `idx_channel_id_status` (`channel_id`, `status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='转账单表';

CREATE TABLE IF NOT EXISTS `ma_merchant_account` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `merchant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '商户ID（唯一）',
  `available_balance` bigint unsigned NOT NULL DEFAULT 0 COMMENT '可提现余额（分）',
  `frozen_balance` bigint unsigned NOT NULL DEFAULT 0 COMMENT '冻结余额（分）',
  `created_at` datetime DEFAULT NULL COMMENT '创建时间',
  `updated_at` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_merchant_id` (`merchant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商户余额账户表';

CREATE TABLE IF NOT EXISTS `ma_merchant_account_ledger` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `ledger_no` varchar(32) NOT NULL DEFAULT '' COMMENT '流水号',
  `merchant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '商户ID',
  `biz_type` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '业务类型：0-支付冻结,1-支付扣费,2-支付释放,3-清算入账,4-退款冲正,5-人工调整',
  `biz_no` varchar(32) NOT NULL DEFAULT '' COMMENT '业务单号',
  `trace_no` varchar(32) NOT NULL DEFAULT '' COMMENT '统一追踪号',
  `event_type` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '事件类型：0-创建,1-成功,2-失败,3-冲正',
  `direction` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '方向：0-入账,1-出账',
  `amount` bigint unsigned NOT NULL DEFAULT 0 COMMENT '变动金额（分）',
  `available_before` bigint unsigned NOT NULL DEFAULT 0 COMMENT '变动前可用余额（分）',
  `available_after` bigint unsigned NOT NULL DEFAULT 0 COMMENT '变动后可用余额（分）',
  `frozen_before` bigint unsigned NOT NULL DEFAULT 0 COMMENT '变动前冻结余额（分）',
  `frozen_after` bigint unsigned NOT NULL DEFAULT 0 COMMENT '变动后冻结余额（分）',
  `idempotency_key` varchar(100) NOT NULL DEFAULT '' COMMENT '幂等键',
  `remark` varchar(255) NOT NULL DEFAULT '' COMMENT '备注',
  `ext_json` json DEFAULT NULL COMMENT '账务扩展字段(JSON)',
  `created_at` datetime DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_idempotency_key` (`idempotency_key`),
  KEY `idx_trace_no` (`trace_no`),
  KEY `idx_merchant_biz` (`merchant_id`, `biz_type`, `biz_no`),
  KEY `idx_merchant_created` (`merchant_id`, `created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商户余额流水表';

CREATE TABLE IF NOT EXISTS `ma_settlement_order` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `settle_no` varchar(32) NOT NULL DEFAULT '' COMMENT '清算单号',
  `trace_no` varchar(32) NOT NULL DEFAULT '' COMMENT '统一追踪号',
  `merchant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '商户ID',
  `merchant_group_id` int unsigned NOT NULL DEFAULT 0 COMMENT '商户分组ID快照',
  `channel_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '支付通道ID',
  `cycle_type` tinyint unsigned NOT NULL DEFAULT 1 COMMENT '周期类型：0-D0,1-D1,2-D7,3-T1,4-OTHER',
  `cycle_key` varchar(32) NOT NULL DEFAULT '' COMMENT '周期标识，如日期或批次号',
  `status` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '状态：0-待处理,1-处理中,2-成功,3-失败,4-已冲正',
  `gross_amount` bigint unsigned NOT NULL DEFAULT 0 COMMENT '清算前总额（分）',
  `fee_amount` bigint unsigned NOT NULL DEFAULT 0 COMMENT '手续费总额（分）',
  `refund_amount` bigint unsigned NOT NULL DEFAULT 0 COMMENT '退款本金（分）',
  `fee_reverse_amount` bigint unsigned NOT NULL DEFAULT 0 COMMENT '手续费冲回金额（分）',
  `net_amount` bigint unsigned NOT NULL DEFAULT 0 COMMENT '净额（分）',
  `accounted_amount` bigint unsigned NOT NULL DEFAULT 0 COMMENT '实际入账金额（分）',
  `generated_at` datetime DEFAULT NULL COMMENT '生成时间',
  `accounted_at` datetime DEFAULT NULL COMMENT '入账时间',
  `completed_at` datetime DEFAULT NULL COMMENT '完成时间',
  `failed_at` datetime DEFAULT NULL COMMENT '失败时间',
  `fail_reason` varchar(255) NOT NULL DEFAULT '' COMMENT '失败原因',
  `ext_json` json DEFAULT NULL COMMENT '清算扩展字段(JSON)',
  `created_at` datetime DEFAULT NULL COMMENT '创建时间',
  `updated_at` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_cycle` (`merchant_id`, `channel_id`, `cycle_type`, `cycle_key`),
  UNIQUE KEY `uk_settle_no` (`settle_no`),
  KEY `idx_trace_no` (`trace_no`),
  KEY `idx_merchant_status_created` (`merchant_id`, `status`, `created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='清算单表';

CREATE TABLE IF NOT EXISTS `ma_settlement_item` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `settle_no` varchar(32) NOT NULL DEFAULT '' COMMENT '清算单号',
  `merchant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '商户ID',
  `merchant_group_id` int unsigned NOT NULL DEFAULT 0 COMMENT '商户分组ID快照',
  `channel_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '支付通道ID',
  `pay_no` varchar(32) NOT NULL DEFAULT '' COMMENT '支付单号',
  `refund_no` varchar(32) DEFAULT NULL COMMENT '退款单号',
  `pay_amount` bigint unsigned NOT NULL DEFAULT 0 COMMENT '支付金额（分）',
  `fee_amount` bigint unsigned NOT NULL DEFAULT 0 COMMENT '手续费金额（分）',
  `refund_amount` bigint unsigned NOT NULL DEFAULT 0 COMMENT '退款本金（分）',
  `fee_reverse_amount` bigint unsigned NOT NULL DEFAULT 0 COMMENT '手续费冲回金额（分）',
  `net_amount` bigint unsigned NOT NULL DEFAULT 0 COMMENT '净额（分）',
  `item_status` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '明细状态：0-待处理,1-成功,2-失败',
  `created_at` datetime DEFAULT NULL COMMENT '创建时间',
  `updated_at` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_settle_pay` (`settle_no`, `pay_no`),
  KEY `idx_pay_no` (`pay_no`),
  KEY `idx_channel_id` (`channel_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='清算明细表';

CREATE TABLE IF NOT EXISTS `ma_channel_notify_log` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `notify_no` varchar(32) NOT NULL DEFAULT '' COMMENT '通知日志号',
  `channel_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '通道ID',
  `notify_type` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '通知类型：0-异步通知,1-查单',
  `biz_no` varchar(32) NOT NULL DEFAULT '' COMMENT '业务单号',
  `pay_no` varchar(32) DEFAULT NULL COMMENT '支付单号',
  `channel_request_no` varchar(64) DEFAULT NULL COMMENT '渠道请求号',
  `channel_trade_no` varchar(64) DEFAULT NULL COMMENT '渠道交易号',
  `raw_payload` longtext COMMENT '原始报文',
  `verify_status` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '验签状态：0-未知,1-成功,2-失败',
  `process_status` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '处理状态：0-待处理,1-成功,2-失败',
  `retry_count` int unsigned NOT NULL DEFAULT 0 COMMENT '重试次数',
  `next_retry_at` datetime DEFAULT NULL COMMENT '下次重试时间',
  `last_error` varchar(255) NOT NULL DEFAULT '' COMMENT '最近错误信息',
  `created_at` datetime DEFAULT NULL COMMENT '创建时间',
  `updated_at` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_notify_no` (`notify_no`),
  UNIQUE KEY `uk_channel_notify` (`channel_id`, `notify_type`, `biz_no`),
  KEY `idx_pay_status` (`pay_no`, `process_status`),
  KEY `idx_trade_no` (`channel_trade_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='通道通知日志表';

CREATE TABLE IF NOT EXISTS `ma_pay_callback_log` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `pay_no` varchar(32) NOT NULL DEFAULT '' COMMENT '支付单号',
  `channel_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '通道ID',
  `callback_type` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '回调类型：0-异步通知,1-同步返回',
  `request_data` longtext COMMENT '请求原始数据（完整回调参数）',
  `verify_status` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '验签状态：0-未知,1-成功,2-失败',
  `process_status` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '处理状态：0-待处理,1-成功,2-失败',
  `process_result` longtext COMMENT '处理结果（JSON或文本）',
  `created_at` datetime DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`),
  KEY `idx_pay_created` (`pay_no`, `created_at`),
  KEY `idx_channel_created` (`channel_id`, `created_at`),
  KEY `idx_callback_type` (`callback_type`),
  KEY `idx_verify_status` (`verify_status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='支付回调日志表';

CREATE TABLE IF NOT EXISTS `ma_channel_daily_stat` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `merchant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '商户ID',
  `merchant_group_id` int unsigned NOT NULL DEFAULT 0 COMMENT '商户分组ID快照',
  `channel_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '支付通道ID',
  `stat_date` date NOT NULL COMMENT '统计日期',
  `pay_success_count` int unsigned NOT NULL DEFAULT 0 COMMENT '支付成功笔数',
  `pay_fail_count` int unsigned NOT NULL DEFAULT 0 COMMENT '支付失败笔数',
  `pay_amount` bigint unsigned NOT NULL DEFAULT 0 COMMENT '支付成功金额（分）',
  `refund_count` int unsigned NOT NULL DEFAULT 0 COMMENT '退款笔数',
  `refund_amount` bigint unsigned NOT NULL DEFAULT 0 COMMENT '退款金额（分）',
  `avg_latency_ms` int unsigned NOT NULL DEFAULT 0 COMMENT '平均耗时（毫秒）',
  `success_rate_bp` int unsigned NOT NULL DEFAULT 0 COMMENT '成功率（bp）',
  `health_score` int NOT NULL DEFAULT 0 COMMENT '健康度评分',
  `created_at` datetime DEFAULT NULL COMMENT '创建时间',
  `updated_at` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_channel_stat_date` (`channel_id`, `stat_date`),
  KEY `idx_merchant_date` (`merchant_id`, `stat_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='通道日统计表';

CREATE TABLE IF NOT EXISTS `ma_notify_task` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `notify_no` varchar(32) NOT NULL DEFAULT '' COMMENT '通知任务号',
  `merchant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '商户ID',
  `merchant_group_id` int unsigned NOT NULL DEFAULT 0 COMMENT '商户分组ID快照',
  `biz_no` varchar(32) NOT NULL DEFAULT '' COMMENT '业务单号',
  `pay_no` varchar(32) NOT NULL DEFAULT '' COMMENT '支付单号',
  `notify_url` varchar(255) NOT NULL DEFAULT '' COMMENT '通知地址',
  `notify_data` longtext COMMENT '通知内容',
  `status` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '状态：0-待通知,1-成功,2-失败',
  `retry_count` int unsigned NOT NULL DEFAULT 0 COMMENT '重试次数',
  `next_retry_at` datetime DEFAULT NULL COMMENT '下次重试时间',
  `last_notify_at` datetime DEFAULT NULL COMMENT '最后通知时间',
  `last_response` longtext COMMENT '最后响应内容',
  `created_at` datetime DEFAULT NULL COMMENT '创建时间',
  `updated_at` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_notify_no` (`notify_no`),
  UNIQUE KEY `uk_pay_no` (`pay_no`),
  KEY `idx_status_retry` (`status`, `next_retry_at`),
  KEY `idx_merchant_group` (`merchant_id`, `merchant_group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商户通知任务表';

CREATE TABLE IF NOT EXISTS `ma_system_config` (
  `config_key` varchar(100) NOT NULL COMMENT '配置项键名',
  `config_value` longtext COMMENT '配置项值',
  `group_code` varchar(50) NOT NULL DEFAULT '' COMMENT '配置分组',
  `created_at` datetime DEFAULT NULL COMMENT '创建时间',
  `updated_at` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`config_key`),
  KEY `idx_group_code` (`group_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统配置表';

CREATE TABLE IF NOT EXISTS `ma_file_asset` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '文件ID',
  `scene` tinyint unsigned NOT NULL DEFAULT 4 COMMENT '文件场景：1-图片,2-证书,3-文本,4-其他',
  `source_type` tinyint unsigned NOT NULL DEFAULT 1 COMMENT '来源类型：1-上传,2-远程导入',
  `visibility` tinyint unsigned NOT NULL DEFAULT 2 COMMENT '可见性：1-公开,2-私有',
  `storage_engine` tinyint unsigned NOT NULL DEFAULT 1 COMMENT '存储引擎：1-本地,2-阿里云OSS,3-腾讯云COS,4-远程引用',
  `original_name` varchar(255) NOT NULL DEFAULT '' COMMENT '原始文件名',
  `file_name` varchar(255) NOT NULL DEFAULT '' COMMENT '存储文件名',
  `file_ext` varchar(32) NOT NULL DEFAULT '' COMMENT '文件扩展名',
  `mime_type` varchar(128) NOT NULL DEFAULT '' COMMENT '文件 MIME 类型',
  `size` bigint unsigned NOT NULL DEFAULT 0 COMMENT '文件大小，单位字节',
  `md5` char(32) NOT NULL DEFAULT '' COMMENT '文件 MD5',
  `object_key` varchar(512) NOT NULL DEFAULT '' COMMENT '对象存储键或站点相对路径，如 storage/uploads/...',
  `url` varchar(1024) NOT NULL DEFAULT '' COMMENT '默认访问地址',
  `source_url` varchar(1024) NOT NULL DEFAULT '' COMMENT '远程来源地址',
  `created_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '创建人ID',
  `created_by_name` varchar(50) NOT NULL DEFAULT '' COMMENT '创建人名称',
  `remark` varchar(255) NOT NULL DEFAULT '' COMMENT '备注',
  `created_at` datetime DEFAULT NULL COMMENT '创建时间',
  `updated_at` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_object_key` (`object_key`),
  KEY `idx_scene` (`scene`),
  KEY `idx_source_type` (`source_type`),
  KEY `idx_visibility` (`visibility`),
  KEY `idx_storage_engine` (`storage_engine`),
  KEY `idx_created_by` (`created_by`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='文件表';

CREATE TABLE IF NOT EXISTS `ma_admin_user` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '管理员ID',
  `username` varchar(32) NOT NULL DEFAULT '' COMMENT '登录用户名',
  `password_hash` varchar(255) NOT NULL DEFAULT '' COMMENT '密码哈希',
  `real_name` varchar(50) NOT NULL DEFAULT '' COMMENT '真实姓名',
  `mobile` varchar(20) NOT NULL DEFAULT '' COMMENT '手机号',
  `email` varchar(100) NOT NULL DEFAULT '' COMMENT '邮箱',
  `is_super` tinyint NOT NULL DEFAULT 0 COMMENT '是否超级管理员',
  `status` tinyint NOT NULL DEFAULT 1 COMMENT '状态：0-禁用,1-启用',
  `last_login_at` datetime DEFAULT NULL COMMENT '最后登录时间',
  `last_login_ip` varchar(45) NOT NULL DEFAULT '' COMMENT '最后登录IP',
  `remark` varchar(500) NOT NULL DEFAULT '' COMMENT '备注',
  `created_at` datetime DEFAULT NULL COMMENT '创建时间',
  `updated_at` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_username` (`username`),
  KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='管理员用户表';

CREATE TABLE IF NOT EXISTS `ma_merchant_api_credential` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `merchant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '商户ID',
  `api_key` varchar(128) NOT NULL DEFAULT '' COMMENT '商户 API 凭证值（V1 MD5 签名使用）',
  `merchant_public_key` text DEFAULT NULL COMMENT '商户 RSA 公钥（V2 验签使用）',
  `sign_type` tinyint NOT NULL DEFAULT 0 COMMENT '签名类型：0-MD5（V1）',
  `status` tinyint NOT NULL DEFAULT 1 COMMENT '状态：0-禁用,1-启用',
  `last_used_at` datetime DEFAULT NULL COMMENT '最后使用时间',
  `created_at` datetime DEFAULT NULL COMMENT '创建时间',
  `updated_at` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_merchant_id` (`merchant_id`),
  KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商户API凭证表';

SET FOREIGN_KEY_CHECKS = 1;
