mirror of
https://gitee.com/technical-laohu/mpay_v2_webman.git
synced 2026-05-10 02:44:27 +08:00
1. 维护代码健壮
2. 更新项目结构文档
This commit is contained in:
61
doc/db/README.md
Normal file
61
doc/db/README.md
Normal file
@@ -0,0 +1,61 @@
|
||||
# 数据库总说明
|
||||
|
||||
这里放数据库相关的稳定说明和 DDL 入口。
|
||||
|
||||
## 当前 DDL
|
||||
|
||||
当前数据库事实源已经迁移到 [`payment-middle-ddl.sql`](./payment-middle-ddl.sql)。
|
||||
|
||||
它覆盖的核心表分组包括:
|
||||
|
||||
- 商户与登录主体
|
||||
- 支付方式、支付插件、支付通道
|
||||
- 轮询组、轮询组通道、轮询组绑定
|
||||
- 商户策略与商户 API 凭证
|
||||
- 支付单、退款单、转账单、清算单
|
||||
- 商户资金账户与流水
|
||||
- 通知日志、回调日志、日统计
|
||||
- 文件资产、系统配置、后台用户
|
||||
|
||||
## 关键表分组
|
||||
|
||||
| 分组 | 代表表 |
|
||||
| --- | --- |
|
||||
| 基础字典 | `ma_payment_type`、`ma_system_config` |
|
||||
| 商户主体 | `ma_merchant`、`ma_merchant_group`、`ma_merchant_api_credential`、`ma_merchant_policy` |
|
||||
| 支付编排 | `ma_payment_plugin`、`ma_payment_plugin_conf`、`ma_payment_channel`、`ma_payment_poll_group`、`ma_payment_poll_group_channel`、`ma_payment_poll_group_bind` |
|
||||
| 交易订单 | `ma_biz_order`、`ma_pay_order`、`ma_refund_order`、`ma_transfer_order`、`ma_settlement_order`、`ma_settlement_item` |
|
||||
| 资金账户 | `ma_merchant_account`、`ma_merchant_account_ledger` |
|
||||
| 运维日志 | `ma_channel_notify_log`、`ma_pay_callback_log`、`ma_channel_daily_stat`、`ma_notify_task` |
|
||||
| 文件与后台 | `ma_file_asset`、`ma_admin_user` |
|
||||
|
||||
## 说明原则
|
||||
|
||||
- DDL 是事实源
|
||||
- 表结构变化要先更新 DDL,再补说明
|
||||
- 文档里不要重复贴大段 SQL,尽量只解释结构和用途
|
||||
- `ma_merchant` 是商户主体,也是后台登录主体
|
||||
- `ma_merchant_api_credential` 只用于开放接口签名和兼容层,不参与后台登录
|
||||
- `ma_merchant_api_credential` 同时承载 V1 的 MD5 凭证值和 V2 的 RSA 公钥
|
||||
- `ma_transfer_order` 负责承接 V2 转账单据
|
||||
- 路由链路优先遵循“商户分组 -> 轮询组 -> 支付通道”
|
||||
- `ext_json` 使用分区结构保存轻量运行上下文;`_protocol_version` 这类强语义字段可放顶层,商户透传放 `merchant`,支付载体放 `payment`,收银台承接放 `presentation`
|
||||
- 通知、回调、重试、原始报文进入 `ma_pay_callback_log`、`ma_notify_task`、`ma_channel_notify_log`,不要塞进订单扩展槽
|
||||
- `ma_pay_order` 不再保留 `request_method` 这类 HTTP 快照字段
|
||||
|
||||
## 建议写法
|
||||
|
||||
以后每个表说明都按下面的结构写:
|
||||
|
||||
1. 表用途
|
||||
2. 主键与索引
|
||||
3. 核心字段
|
||||
4. 状态值含义
|
||||
5. 与哪些业务链路相关
|
||||
|
||||
## 继续阅读
|
||||
|
||||
- [数据表目录](./tables.md)
|
||||
- [项目稳定口径](../standards.md)
|
||||
- [项目总览](../overview.md)
|
||||
- [架构与请求流](../architecture.md)
|
||||
609
doc/db/payment-middle-ddl.sql
Normal file
609
doc/db/payment-middle-ddl.sql
Normal file
@@ -0,0 +1,609 @@
|
||||
-- 支付中台最新总 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;
|
||||
73
doc/db/tables.md
Normal file
73
doc/db/tables.md
Normal file
@@ -0,0 +1,73 @@
|
||||
# 数据表目录
|
||||
|
||||
这份目录页只负责“表去哪看、表大概干什么”,详细结构仍以 [`payment-middle-ddl.sql`](./payment-middle-ddl.sql) 为准。
|
||||
|
||||
## 基础字典
|
||||
|
||||
| 表名 | 用途 | 说明 |
|
||||
| --- | --- | --- |
|
||||
| `ma_payment_type` | 支付方式字典 | 维护支付方式编码、名称、图标和启用状态 |
|
||||
| `ma_system_config` | 系统配置表 | 维护全局配置键值 |
|
||||
|
||||
## 商户主体
|
||||
|
||||
| 表名 | 用途 | 说明 |
|
||||
| --- | --- | --- |
|
||||
| `ma_merchant_group` | 商户分组表 | 作为路由绑定和商户归类的输入条件 |
|
||||
| `ma_merchant` | 商户表 | 商户主体资料,也是后台登录主体 |
|
||||
| `ma_merchant_api_credential` | 商户 API 凭证表 | 开放接口签名凭证,V1 使用 MD5 key,V2 保存 RSA 公钥,与后台登录分离 |
|
||||
| `ma_merchant_policy` | 商户策略预留表 | 预留的商户策略结构 |
|
||||
|
||||
## 支付编排
|
||||
|
||||
| 表名 | 用途 | 说明 |
|
||||
| --- | --- | --- |
|
||||
| `ma_payment_plugin` | 支付插件注册表 | 扫描和注册支付插件定义 |
|
||||
| `ma_payment_plugin_conf` | 支付插件 API 配置表 | 插件初始化配置和结算周期配置 |
|
||||
| `ma_payment_channel` | 支付通道表 | 维护平台通道和商户自有通道 |
|
||||
| `ma_payment_poll_group` | 支付轮询组表 | 承载轮询策略和候选通道编排 |
|
||||
| `ma_payment_poll_group_channel` | 支付轮询组-通道编排表 | 轮询组内的通道顺序和权重配置 |
|
||||
| `ma_payment_poll_group_bind` | 商户分组-轮询组绑定表 | 商户分组与轮询组的映射关系 |
|
||||
|
||||
## 交易订单
|
||||
|
||||
| 表名 | 用途 | 说明 |
|
||||
| --- | --- | --- |
|
||||
| `ma_biz_order` | 业务订单表 | 统一业务订单入口,只承载业务事实、收银台恢复所需信息(subject/body/notify_url/return_url/client_ip/device)和业务扩展参数 |
|
||||
| `ma_pay_order` | 支付单表 | 记录支付发起、状态推进和回调信息,扩展字段只留商户附加参数 |
|
||||
| `ma_refund_order` | 退款单表 | 记录退款发起、状态推进和结果,扩展字段只留商户附加参数 |
|
||||
| `ma_transfer_order` | 转账单表 | 记录转账发起、状态推进和渠道结果,扩展字段只留商户附加参数 |
|
||||
| `ma_settlement_order` | 清算单表 | 记录清算批次和清算状态,扩展字段只留清算附加信息 |
|
||||
| `ma_settlement_item` | 清算明细表 | 记录清算单内的明细拆分 |
|
||||
|
||||
## 资金账户
|
||||
|
||||
| 表名 | 用途 | 说明 |
|
||||
| --- | --- | --- |
|
||||
| `ma_merchant_account` | 商户余额账户表 | 记录商户余额、冻结、可用等账户信息 |
|
||||
| `ma_merchant_account_ledger` | 商户余额流水表 | 记录账户变更流水和账务明细 |
|
||||
|
||||
## 运维日志
|
||||
|
||||
| 表名 | 用途 | 说明 |
|
||||
| --- | --- | --- |
|
||||
| `ma_channel_notify_log` | 通道通知日志表 | 记录通道侧通知、重试和失败原因 |
|
||||
| `ma_pay_callback_log` | 支付回调日志表 | 记录支付回调处理和幂等结果 |
|
||||
| `ma_channel_daily_stat` | 通道日统计表 | 记录通道成功率、耗时和健康度数据 |
|
||||
| `ma_notify_task` | 商户通知任务表 | 记录商户异步通知任务和重试情况 |
|
||||
|
||||
## 文件与后台
|
||||
|
||||
| 表名 | 用途 | 说明 |
|
||||
| --- | --- | --- |
|
||||
| `ma_file_asset` | 文件表 | 记录上传文件、预览、下载和存储位置 |
|
||||
| `ma_admin_user` | 管理员用户表 | 记录后台管理员账号信息 |
|
||||
|
||||
## 使用建议
|
||||
|
||||
- 先看 `tables.md`,再看 DDL
|
||||
- 如果字段定义变了,以 DDL 为准
|
||||
- 如果表用途变了,先补 DDL 注释,再补这里的目录说明
|
||||
- `ext_json` 使用分区结构保存轻量运行上下文:顶层可放 `_protocol_version`,商户透传放 `merchant`,支付载体放 `payment`,收银台承接放 `presentation`
|
||||
- 回调、通知、重试和原始报文使用专门日志/任务表,不进入订单扩展字段
|
||||
- 表级说明后面可以按业务域继续拆成独立文档
|
||||
Reference in New Issue
Block a user