Files
pay-bridge/backend/configs/migrations/002_extensions.sql
2026-03-13 15:51:59 +08:00

224 lines
12 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- pay-bridge 扩展功能表
-- 分润、服务费、收款匹配、商户进件、微信通知、对账
USE pay_bridge;
-- 分润配置
CREATE TABLE IF NOT EXISTS `profit_sharing_config` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`app_id` VARCHAR(32) NOT NULL COMMENT '应用ID',
`channel_code` VARCHAR(32) NOT NULL COMMENT '渠道编码',
`receiver_merchant_id` VARCHAR(64) NOT NULL COMMENT '收款商户ID渠道侧',
`max_sharing_ratio` DECIMAL(5,4) NOT NULL DEFAULT 0.3000 COMMENT '最大分润比例如0.3=30%',
`auto_sharing` TINYINT NOT NULL DEFAULT 0 COMMENT '1=支付后自动分润',
`status` TINYINT NOT NULL DEFAULT 1,
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updated_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
PRIMARY KEY (`id`),
UNIQUE KEY `uk_app_channel` (`app_id`, `channel_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='分润配置';
-- 分润订单
CREATE TABLE IF NOT EXISTS `profit_sharing_order` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`sharing_no` VARCHAR(32) NOT NULL COMMENT 'pay-bridge分润单号',
`trade_no` VARCHAR(32) NOT NULL COMMENT '关联交易号',
`app_id` VARCHAR(32) NOT NULL,
`channel_code` VARCHAR(32) NOT NULL,
`channel_sharing_no` VARCHAR(64) DEFAULT NULL COMMENT '渠道分润单号',
`amount` BIGINT NOT NULL COMMENT '分润金额(分)',
`status` VARCHAR(20) NOT NULL DEFAULT 'PENDING',
`fail_reason` VARCHAR(256) DEFAULT NULL,
`finished_at` DATETIME(3) DEFAULT NULL,
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updated_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
PRIMARY KEY (`id`),
UNIQUE KEY `uk_sharing_no` (`sharing_no`),
UNIQUE KEY `uk_trade_no` (`trade_no`),
KEY `idx_app_status` (`app_id`, `status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='分润订单';
-- 分润流水
CREATE TABLE IF NOT EXISTS `profit_sharing_log` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`sharing_no` VARCHAR(32) NOT NULL,
`trade_no` VARCHAR(32) NOT NULL,
`action` VARCHAR(20) NOT NULL COMMENT 'SPLIT/ROLLBACK',
`amount` BIGINT NOT NULL,
`remark` VARCHAR(256) DEFAULT NULL,
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
PRIMARY KEY (`id`),
KEY `idx_sharing_no` (`sharing_no`),
KEY `idx_trade_no` (`trade_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='分润流水';
-- 服务费配置
CREATE TABLE IF NOT EXISTS `service_fee_config` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`app_id` VARCHAR(32) NOT NULL COMMENT '应用ID',
`pay_method_group` VARCHAR(32) NOT NULL COMMENT '支付方式分组WECHAT/ALIPAY/BANK',
`fee_type` VARCHAR(20) NOT NULL DEFAULT 'PERCENTAGE' COMMENT 'PERCENTAGE/FIXED',
`fee_rate` DECIMAL(6,5) NOT NULL DEFAULT 0 COMMENT '费率如0.006=0.6%',
`fee_fixed` BIGINT NOT NULL DEFAULT 0 COMMENT '固定费用(分)',
`min_fee` BIGINT NOT NULL DEFAULT 0 COMMENT '最低费用(分)',
`max_fee` BIGINT NOT NULL DEFAULT 0 COMMENT '最高费用0=不限',
`receiver_merchant_id` VARCHAR(64) NOT NULL COMMENT '收款商户ID',
`channel_code` VARCHAR(32) NOT NULL,
`status` TINYINT NOT NULL DEFAULT 1,
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updated_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
PRIMARY KEY (`id`),
UNIQUE KEY `uk_app_method_group` (`app_id`, `pay_method_group`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='服务费配置';
-- 服务费流水
CREATE TABLE IF NOT EXISTS `service_fee_log` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`trade_no` VARCHAR(32) NOT NULL,
`app_id` VARCHAR(32) NOT NULL,
`action` VARCHAR(20) NOT NULL COMMENT 'CHARGE/ROLLBACK',
`fee_amount` BIGINT NOT NULL,
`remark` VARCHAR(256) DEFAULT NULL,
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
PRIMARY KEY (`id`),
UNIQUE KEY `uk_trade_action` (`trade_no`, `action`),
KEY `idx_app` (`app_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='服务费流水';
-- 子商户收款账户(固定账户收款)
CREATE TABLE IF NOT EXISTS `sub_merchant_account` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`app_id` VARCHAR(32) NOT NULL,
`sub_merchant_id` VARCHAR(64) NOT NULL,
`channel_code` VARCHAR(32) NOT NULL,
`account_type` VARCHAR(20) NOT NULL COMMENT 'BANK_CARD',
`account_no` VARCHAR(64) NOT NULL COMMENT '脱敏账号后4位',
`account_no_enc` TEXT DEFAULT NULL COMMENT 'AES加密完整账号',
`account_name` VARCHAR(128) NOT NULL COMMENT '账户名称',
`bank_name` VARCHAR(64) DEFAULT NULL,
`status` TINYINT NOT NULL DEFAULT 1,
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updated_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
PRIMARY KEY (`id`),
KEY `idx_app_merchant` (`app_id`, `sub_merchant_id`),
KEY `idx_account_no` (`account_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='子商户收款账户';
-- 收款匹配日志
CREATE TABLE IF NOT EXISTS `payment_match_log` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`account_id` BIGINT UNSIGNED NOT NULL COMMENT '关联账户ID',
`trade_no` VARCHAR(32) DEFAULT NULL COMMENT '匹配到的交易号',
`incoming_amount` BIGINT NOT NULL COMMENT '入账金额(分)',
`incoming_remark` VARCHAR(256) DEFAULT NULL COMMENT '转账备注',
`payer_name` VARCHAR(128) DEFAULT NULL COMMENT '付款方名称',
`channel_bill_no` VARCHAR(64) NOT NULL COMMENT '渠道流水号',
`match_status` VARCHAR(20) NOT NULL DEFAULT 'PENDING_MANUAL',
`name_diff` TINYINT NOT NULL DEFAULT 0 COMMENT '1=名称不一致',
`match_time` DATETIME(3) DEFAULT NULL,
`operator` VARCHAR(64) DEFAULT NULL COMMENT '人工操作者',
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updated_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
PRIMARY KEY (`id`),
UNIQUE KEY `uk_channel_bill_no` (`channel_bill_no`),
KEY `idx_account_status` (`account_id`, `match_status`),
KEY `idx_trade_no` (`trade_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='收款匹配日志';
-- 商户信息
CREATE TABLE IF NOT EXISTS `merchant` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`merchant_id` VARCHAR(32) NOT NULL COMMENT '商户ID',
`merchant_name` VARCHAR(128) NOT NULL COMMENT '商户名称',
`license_no` VARCHAR(64) DEFAULT NULL COMMENT '营业执照号',
`legal_person` VARCHAR(64) DEFAULT NULL COMMENT '法人姓名',
`bank_account` VARCHAR(64) DEFAULT NULL COMMENT '银行账号(脱敏)',
`channel_merchant_id` VARCHAR(64) DEFAULT NULL COMMENT '渠道商户ID',
`status` VARCHAR(20) NOT NULL DEFAULT 'PENDING',
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updated_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
PRIMARY KEY (`id`),
UNIQUE KEY `uk_merchant_id` (`merchant_id`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商户信息';
-- 商户进件申请
CREATE TABLE IF NOT EXISTS `merchant_application` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`application_id` VARCHAR(32) NOT NULL COMMENT '申请ID',
`merchant_id` VARCHAR(32) NOT NULL COMMENT '商户ID',
`channel_code` VARCHAR(32) NOT NULL,
`submit_data` JSON DEFAULT NULL COMMENT '提交的进件数据',
`audit_status` VARCHAR(20) NOT NULL DEFAULT 'SUBMITTING',
`reject_reason` VARCHAR(512) DEFAULT NULL,
`submitted_at` DATETIME(3) DEFAULT NULL,
`audited_at` DATETIME(3) DEFAULT NULL,
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updated_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
PRIMARY KEY (`id`),
UNIQUE KEY `uk_application_id` (`application_id`),
KEY `idx_merchant_id` (`merchant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商户进件申请';
-- 微信公众号绑定
CREATE TABLE IF NOT EXISTS `wechat_binding` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`app_id` VARCHAR(32) NOT NULL COMMENT '平台应用ID',
`wx_app_id` VARCHAR(32) NOT NULL COMMENT '微信公众号/小程序AppID',
`wx_secret` TEXT NOT NULL COMMENT '微信AppSecretAES加密',
`template_id` VARCHAR(64) NOT NULL COMMENT '消息模板ID',
`status` TINYINT NOT NULL DEFAULT 1,
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updated_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
PRIMARY KEY (`id`),
UNIQUE KEY `uk_app_id` (`app_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='微信公众号绑定';
-- 微信消息发送日志
CREATE TABLE IF NOT EXISTS `wechat_message_log` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`app_id` VARCHAR(32) NOT NULL,
`trade_no` VARCHAR(32) DEFAULT NULL,
`open_id` VARCHAR(64) NOT NULL,
`template_id` VARCHAR(64) NOT NULL,
`status` VARCHAR(20) NOT NULL DEFAULT 'PENDING',
`err_msg` VARCHAR(256) DEFAULT NULL,
`sent_at` DATETIME(3) DEFAULT NULL,
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
PRIMARY KEY (`id`),
KEY `idx_app_id` (`app_id`),
KEY `idx_trade_no` (`trade_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='微信消息发送日志';
-- 对账报告
CREATE TABLE IF NOT EXISTS `reconciliation_report` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`app_id` VARCHAR(32) NOT NULL,
`channel_code` VARCHAR(32) NOT NULL,
`bill_date` VARCHAR(10) NOT NULL COMMENT '账单日期 yyyy-MM-dd',
`total_count` INT NOT NULL DEFAULT 0 COMMENT '渠道账单总笔数',
`total_amount` BIGINT NOT NULL DEFAULT 0 COMMENT '渠道账单总金额',
`matched_count` INT NOT NULL DEFAULT 0 COMMENT '匹配成功笔数',
`exception_count` INT NOT NULL DEFAULT 0 COMMENT '异常笔数',
`status` VARCHAR(20) NOT NULL DEFAULT 'PENDING',
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updated_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
PRIMARY KEY (`id`),
KEY `idx_app_date` (`app_id`, `bill_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='对账报告';
-- 对账异常明细
CREATE TABLE IF NOT EXISTS `reconciliation_exception` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`report_id` BIGINT UNSIGNED NOT NULL COMMENT '关联对账报告ID',
`trade_no` VARCHAR(32) DEFAULT NULL,
`channel_bill_no` VARCHAR(64) DEFAULT NULL,
`exception_type` VARCHAR(32) NOT NULL COMMENT 'MISSING_LOCAL/MISSING_CHANNEL/AMOUNT_MISMATCH',
`local_amount` BIGINT NOT NULL DEFAULT 0,
`channel_amount` BIGINT NOT NULL DEFAULT 0,
`remark` VARCHAR(256) DEFAULT NULL,
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
PRIMARY KEY (`id`),
KEY `idx_report_id` (`report_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='对账异常明细';