draft
This commit is contained in:
118
backend/configs/migrations/001_init.sql
Normal file
118
backend/configs/migrations/001_init.sql
Normal file
@@ -0,0 +1,118 @@
|
||||
-- pay-bridge 初始化数据库脚本
|
||||
-- MySQL 8.0, utf8mb4, InnoDB
|
||||
-- 金额字段统一使用 BIGINT(单位:分)
|
||||
|
||||
CREATE DATABASE IF NOT EXISTS pay_bridge DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
USE pay_bridge;
|
||||
|
||||
-- 接入应用
|
||||
CREATE TABLE IF NOT EXISTS `app` (
|
||||
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`app_id` VARCHAR(32) NOT NULL COMMENT '应用ID,下游系统鉴权凭证',
|
||||
`app_secret` VARCHAR(128) NOT NULL COMMENT '应用密钥(AES加密存储)',
|
||||
`app_name` VARCHAR(64) NOT NULL COMMENT '应用名称',
|
||||
`status` TINYINT NOT NULL DEFAULT 1 COMMENT '1=启用 0=禁用',
|
||||
`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 `trade_order` (
|
||||
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`trade_no` VARCHAR(32) NOT NULL COMMENT 'pay-bridge生成的交易号',
|
||||
`merchant_order_no` VARCHAR(64) NOT NULL COMMENT '下游系统的商户订单号',
|
||||
`app_id` VARCHAR(32) NOT NULL COMMENT '所属应用ID',
|
||||
`channel_code` VARCHAR(32) NOT NULL COMMENT '支付渠道编码',
|
||||
`channel_trade_no` VARCHAR(64) DEFAULT NULL COMMENT '上游渠道交易号',
|
||||
`pay_method` VARCHAR(32) NOT NULL COMMENT '支付方式',
|
||||
`amount` BIGINT NOT NULL COMMENT '订单金额(分)',
|
||||
`profit_sharing_amount` BIGINT NOT NULL DEFAULT 0 COMMENT '分润金额(分)',
|
||||
`service_fee_amount` BIGINT NOT NULL DEFAULT 0 COMMENT '服务费金额(分)',
|
||||
`subject` VARCHAR(256) NOT NULL COMMENT '商品描述',
|
||||
`notify_url` VARCHAR(512) NOT NULL COMMENT '下游通知地址',
|
||||
`status` VARCHAR(20) NOT NULL DEFAULT 'CREATING' COMMENT '交易状态',
|
||||
`extra` JSON DEFAULT NULL COMMENT '支付方式扩展参数',
|
||||
`channel_extra` JSON DEFAULT NULL COMMENT '渠道返回的支付凭证',
|
||||
`expire_time` DATETIME(3) NOT NULL COMMENT '订单过期时间',
|
||||
`pay_time` DATETIME(3) 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_trade_no` (`trade_no`),
|
||||
UNIQUE KEY `uk_app_merchant_order` (`app_id`, `merchant_order_no`),
|
||||
KEY `idx_channel_trade_no` (`channel_trade_no`),
|
||||
KEY `idx_app_status_created` (`app_id`, `status`, `created_at`),
|
||||
KEY `idx_expire_time` (`expire_time`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='交易订单';
|
||||
|
||||
-- 退款记录
|
||||
CREATE TABLE IF NOT EXISTS `refund_order` (
|
||||
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`refund_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_refund_no` VARCHAR(64) DEFAULT NULL COMMENT '上游渠道退款单号',
|
||||
`refund_amount` BIGINT NOT NULL COMMENT '退款金额(分)',
|
||||
`reason` VARCHAR(256) DEFAULT NULL COMMENT '退款原因',
|
||||
`status` VARCHAR(20) NOT NULL DEFAULT 'PENDING',
|
||||
`notify_url` VARCHAR(512) DEFAULT NULL,
|
||||
`refund_time` DATETIME(3) 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_refund_no` (`refund_no`),
|
||||
KEY `idx_trade_no` (`trade_no`),
|
||||
KEY `idx_app_status` (`app_id`, `status`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='退款记录';
|
||||
|
||||
-- 渠道配置
|
||||
CREATE TABLE IF NOT EXISTS `channel_config` (
|
||||
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`app_id` VARCHAR(32) NOT NULL COMMENT '关联应用ID',
|
||||
`channel_code` VARCHAR(32) NOT NULL COMMENT '渠道编码',
|
||||
`merchant_id` VARCHAR(64) NOT NULL COMMENT '渠道商户ID',
|
||||
`api_key` TEXT DEFAULT NULL COMMENT 'API密钥(AES加密)',
|
||||
`private_key` TEXT DEFAULT NULL COMMENT 'RSA私钥(AES加密)',
|
||||
`public_key` TEXT DEFAULT NULL COMMENT '渠道公钥(明文)',
|
||||
`notify_url` VARCHAR(512) NOT NULL COMMENT '上游回调接收地址',
|
||||
`sandbox` TINYINT NOT NULL DEFAULT 0 COMMENT '1=沙箱 0=生产',
|
||||
`extra_config` JSON DEFAULT NULL COMMENT '渠道特有扩展配置',
|
||||
`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 `notify_log` (
|
||||
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`trade_no` VARCHAR(32) NOT NULL COMMENT '关联交易号',
|
||||
`notify_type` VARCHAR(20) NOT NULL COMMENT 'PAYMENT / REFUND',
|
||||
`notify_url` VARCHAR(512) NOT NULL,
|
||||
`status` VARCHAR(20) NOT NULL DEFAULT 'PENDING',
|
||||
`retry_count` INT NOT NULL DEFAULT 0,
|
||||
`next_retry_time` DATETIME(3) DEFAULT NULL,
|
||||
`last_response` TEXT 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_trade_notify_type` (`trade_no`, `notify_type`),
|
||||
KEY `idx_status_next_retry` (`status`, `next_retry_time`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='下游通知记录';
|
||||
|
||||
-- 订单编码序列
|
||||
CREATE TABLE IF NOT EXISTS `order_sequence` (
|
||||
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`app_id` VARCHAR(32) NOT NULL,
|
||||
`seq_type` VARCHAR(20) NOT NULL COMMENT 'TRADE / REFUND / SHARING',
|
||||
`prefix` VARCHAR(8) NOT NULL COMMENT '序号前缀',
|
||||
`current_value` BIGINT UNSIGNED NOT NULL DEFAULT 0,
|
||||
`step` INT NOT NULL DEFAULT 1,
|
||||
`updated_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_app_type` (`app_id`, `seq_type`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单编码序列';
|
||||
223
backend/configs/migrations/002_extensions.sql
Normal file
223
backend/configs/migrations/002_extensions.sql
Normal file
@@ -0,0 +1,223 @@
|
||||
-- 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 '微信AppSecret(AES加密)',
|
||||
`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='对账异常明细';
|
||||
19
backend/configs/migrations/003_admin_user.sql
Normal file
19
backend/configs/migrations/003_admin_user.sql
Normal file
@@ -0,0 +1,19 @@
|
||||
-- 管理后台用户表
|
||||
|
||||
USE pay_bridge;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `admin_user` (
|
||||
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`username` VARCHAR(64) NOT NULL COMMENT '用户名',
|
||||
`password_hash` VARCHAR(128) NOT NULL COMMENT 'bcrypt hash',
|
||||
`status` TINYINT NOT NULL DEFAULT 1 COMMENT '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_username` (`username`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='管理后台用户';
|
||||
|
||||
-- 默认管理员账号: admin / admin123
|
||||
-- bcrypt hash of "admin123" with cost=10
|
||||
INSERT IGNORE INTO `admin_user` (`username`, `password_hash`, `status`)
|
||||
VALUES ('admin', '$2a$10$MdQLRo6pwF9SyWCYU4TTneJoQL22PxLV4eGzQ0bxnqUKIFNaEQ1YO', 1);
|
||||
4
backend/configs/migrations/004_merchant_app_id.sql
Normal file
4
backend/configs/migrations/004_merchant_app_id.sql
Normal file
@@ -0,0 +1,4 @@
|
||||
ALTER TABLE `merchant`
|
||||
ADD COLUMN `app_id` VARCHAR(32) NOT NULL DEFAULT '' AFTER `merchant_id`;
|
||||
ALTER TABLE `merchant`
|
||||
ADD INDEX `idx_merchant_app_id` (`app_id`);
|
||||
@@ -0,0 +1,5 @@
|
||||
-- merchant_application 记录渠道审核通过后下发的渠道商户ID
|
||||
-- 支持同一商户在多个渠道分别进件,每条记录对应一个渠道
|
||||
ALTER TABLE `merchant_application`
|
||||
ADD COLUMN `channel_merchant_id` VARCHAR(64) NOT NULL DEFAULT '' AFTER `channel_code`,
|
||||
ADD UNIQUE KEY `uk_merchant_channel` (`merchant_id`, `channel_code`);
|
||||
Reference in New Issue
Block a user