Files
yunzerwebsiteallinone/go/docs/sql/create_platform_payment.sql
T
2026-09-15 12:46:29 +08:00

224 lines
17 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.
-- =============================================================
-- 平台端支付模块相关表(平台向租户收取平台使用费)
-- yz_platform_payment_channel 渠道配置(一渠道一行,敏感参数加密后存 JSON)
-- yz_platform_payment_order 支付单
-- yz_platform_payment_order_log 支付单状态流转流水
-- yz_platform_payment_callback_log 渠道回调日志(幂等去重 + 问题排查)
-- yz_platform_payment_channel_bill 渠道账单明细(对账源数据)
-- yz_platform_payment_reconcile_diff 对账差异
-- yz_platform_payment_refund 手动原路退回记录(兜底能力)
--
-- 设计约定(与业务约定一致):
-- 1. 资金流向:租户付款直接进平台对公账户,不涉及分账;仅保留后台「手动原路退回」兜底;
-- 2. 金额一律用「分」为单位的 bigint 存储,前端展示时 /100 转元;
-- 3. 状态类字段用 varchar 存英文枚举,前端 StatusTag 直接映射,避免数字魔法值;
-- 4. 渠道密钥 / 私钥 / ClientSecret 不入库明文,只存 config_json(写入前由后端加密);
-- 证书本体存文件(object_key),库内只留元信息(cert_json);
-- 5. 表结构与项目其他表一致:软删除 delete_time、create_time/update_time 自动维护;
-- 6. 唯一键带上 delete_time 是本项目约定(软删除后可重新插入同键数据);
-- 注意 MySQL 唯一索引对 NULL 不去重,因此「支付幂等/回调去重」仍必须在业务层
-- 用「按 pay_no 查重 + 条件更新(WHERE status <> 'paid')」兜底,不能只依赖唯一键。
-- 7. 业务订单字段(业务订单状态、订单摘要等)由业务模块持有,本模块只冗余订单号与金额,
-- 详情接口聚合返回,不在此重复落库。
--
-- 可重复执行(CREATE TABLE IF NOT EXISTS)。
-- 运行:mysql --default-character-set=utf8mb4 -h<host> -P<port> -u<user> -p <db> < create_platform_payment.sql
-- =============================================================
-- -------------------------------------------------------------
-- 1. 支付渠道配置表
-- -------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `yz_platform_payment_channel` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主键ID',
`channel` varchar(32) NOT NULL DEFAULT '' COMMENT '渠道标识:wechat/alipay/unionpay/cloudpay/paypal',
`name` varchar(64) NOT NULL DEFAULT '' COMMENT '渠道名称(展示用)',
`merchant_no` varchar(128) NOT NULL DEFAULT '' COMMENT '商户号(展示用,未配置时前端显示未配置)',
`config_json` text COMMENT '渠道参数JSON(含密钥/私钥/Secret,写入前加密;接口回显敏感字段时只回掩码)',
`cert_json` text COMMENT '证书元信息JSON:文件名、object_key、序列号、到期日(不含证书私钥内容)',
`callback_url` varchar(255) NOT NULL DEFAULT '' COMMENT '回调地址(只读):/api/payment/callback/{channel}',
`enabled` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否启用:1启用/0停用(参数不完整时前端展示为未配置)',
`extra_json` text COMMENT '渠道扩展开关JSON:云闪付 show_logo/logo_positions、PayPal env 等',
`last_test_time` datetime DEFAULT NULL COMMENT '最近一次「测试连接」时间',
`last_test_result` varchar(255) NOT NULL DEFAULT '' COMMENT '最近一次测试连接结果说明',
`remark` varchar(255) NOT NULL DEFAULT '' COMMENT '备注',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`delete_time` datetime DEFAULT NULL COMMENT '删除时间(软删除)',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_channel` (`channel`,`delete_time`),
KEY `idx_enabled` (`enabled`),
KEY `idx_delete_time` (`delete_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='平台支付渠道配置表';
-- -------------------------------------------------------------
-- 2. 支付单表
-- -------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `yz_platform_payment_order` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主键ID',
`pay_no` varchar(40) NOT NULL DEFAULT '' COMMENT '支付单号(支付模块生成,形如 P202609150009)',
`out_trade_no` varchar(64) NOT NULL DEFAULT '' COMMENT '业务订单号(业务模块生成;同一订单可有多笔支付单)',
`order_type` varchar(32) NOT NULL DEFAULT 'platform_usage' COMMENT '订单类型:platform_usage平台使用费/module_shop模块购买/service_fee服务费',
`subject` varchar(255) NOT NULL DEFAULT '' COMMENT '订单标题(渠道侧展示文案)',
`tenant_id` varchar(64) NOT NULL DEFAULT '' COMMENT '租户ID',
`tenant_name` varchar(128) NOT NULL DEFAULT '' COMMENT '租户名称(冗余,便于列表展示)',
`amount` bigint(20) NOT NULL DEFAULT '0' COMMENT '实付金额(分)',
`order_amount` bigint(20) NOT NULL DEFAULT '0' COMMENT '业务订单金额(分)',
`currency` varchar(8) NOT NULL DEFAULT 'CNY' COMMENT '币种',
`channel` varchar(32) NOT NULL DEFAULT '' COMMENT '支付渠道标识',
`merchant_no` varchar(128) NOT NULL DEFAULT '' COMMENT '下单时商户号快照',
`channel_trade_no` varchar(64) NOT NULL DEFAULT '' COMMENT '渠道流水号',
`status` varchar(20) NOT NULL DEFAULT 'created' COMMENT '状态:created/pending/paying/paid/failed/closed/refunding/refunded',
`refund_amount` bigint(20) NOT NULL DEFAULT '0' COMMENT '已退回金额(分),仅兜底手动退回时累加',
`client_ip` varchar(64) NOT NULL DEFAULT '' COMMENT '下单客户端IP',
`return_url` varchar(255) NOT NULL DEFAULT '' COMMENT '支付完成同步跳回地址(由下单参数带入)',
`notify_url` varchar(255) NOT NULL DEFAULT '' COMMENT '渠道回调地址快照',
`expire_at` datetime DEFAULT NULL COMMENT '支付超时时间(过期由补偿任务置为 closed)',
`paid_at` datetime DEFAULT NULL COMMENT '支付完成时间',
`closed_at` datetime DEFAULT NULL COMMENT '关闭时间',
`notify_at` datetime DEFAULT NULL COMMENT '最近一次成功回调时间',
`last_query_at` datetime DEFAULT NULL COMMENT '最近一次主动查询渠道状态时间',
`order_synced` tinyint(1) NOT NULL DEFAULT '0' COMMENT '业务订单状态是否已同步:1已同步/0待同步(补偿任务扫描用)',
`remark` varchar(255) NOT NULL DEFAULT '' COMMENT '备注',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`delete_time` datetime DEFAULT NULL COMMENT '删除时间(软删除)',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_pay_no` (`pay_no`,`delete_time`),
KEY `idx_out_trade_no` (`out_trade_no`),
KEY `idx_tenant` (`tenant_id`,`create_time`),
KEY `idx_status` (`status`,`create_time`),
KEY `idx_channel_trade` (`channel`,`channel_trade_no`),
KEY `idx_order_synced` (`order_synced`,`status`),
KEY `idx_delete_time` (`delete_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='平台支付单表';
-- -------------------------------------------------------------
-- 3. 支付单状态流转流水(详情页时间轴数据源)
-- -------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `yz_platform_payment_order_log` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主键ID',
`pay_no` varchar(40) NOT NULL DEFAULT '' COMMENT '支付单号(yz_platform_payment_order.pay_no)',
`from_status` varchar(20) NOT NULL DEFAULT '' COMMENT '变更前状态(创建时为空)',
`to_status` varchar(20) NOT NULL DEFAULT '' COMMENT '变更后状态',
`operator` varchar(64) NOT NULL DEFAULT '' COMMENT '操作来源:租户端下单页/渠道回调/平台管理员/定时补偿',
`remark` varchar(500) NOT NULL DEFAULT '' COMMENT '变更说明(如:支付成功,已同步业务订单为已支付)',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`delete_time` datetime DEFAULT NULL COMMENT '删除时间(软删除)',
PRIMARY KEY (`id`),
KEY `idx_pay_no` (`pay_no`,`create_time`),
KEY `idx_delete_time` (`delete_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='平台支付单状态流转流水表';
-- -------------------------------------------------------------
-- 4. 渠道回调日志表(幂等去重与排查)
-- -------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `yz_platform_payment_callback_log` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主键ID',
`channel` varchar(32) NOT NULL DEFAULT '' COMMENT '渠道标识',
`event_type` varchar(64) NOT NULL DEFAULT '' COMMENT '事件类型:TRANSACTION.SUCCESS/trade.success/PAYMENT.CAPTURE.COMPLETED 等',
`event_id` varchar(128) NOT NULL DEFAULT '' COMMENT '渠道事件ID(微信 event id / 支付宝 notify_id / PayPal event id)',
`pay_no` varchar(40) NOT NULL DEFAULT '' COMMENT '关联支付单号',
`out_trade_no` varchar(64) NOT NULL DEFAULT '' COMMENT '业务订单号',
`channel_trade_no` varchar(64) NOT NULL DEFAULT '' COMMENT '渠道流水号',
`trade_state` varchar(32) NOT NULL DEFAULT '' COMMENT '渠道侧交易状态原文',
`amount` bigint(20) NOT NULL DEFAULT '0' COMMENT '渠道通知金额(分)',
`verify_result` tinyint(1) NOT NULL DEFAULT '0' COMMENT '验签结果:1通过/0失败',
`is_duplicate` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否重复通知:1是(幂等命中,直接返回渠道要求的成功响应)/0否',
`handle_result` tinyint(1) NOT NULL DEFAULT '0' COMMENT '处理结果:1成功/0失败',
`handle_msg` varchar(255) NOT NULL DEFAULT '' COMMENT '处理说明或错误信息',
`raw_body` mediumtext COMMENT '渠道原始报文(脱敏后保留,详情页「渠道回调原文」数据源)',
`client_ip` varchar(64) NOT NULL DEFAULT '' COMMENT '渠道来源IP',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`delete_time` datetime DEFAULT NULL COMMENT '删除时间(软删除)',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_channel_event` (`channel`,`channel_trade_no`,`event_type`,`delete_time`),
KEY `idx_pay_no` (`pay_no`),
KEY `idx_event_id` (`event_id`),
KEY `idx_create_time` (`create_time`),
KEY `idx_delete_time` (`delete_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='平台支付渠道回调日志表(幂等去重)';
-- -------------------------------------------------------------
-- 5. 渠道账单明细表(对账源数据)
-- -------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `yz_platform_payment_channel_bill` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主键ID',
`channel` varchar(32) NOT NULL DEFAULT '' COMMENT '渠道标识',
`bill_date` date NOT NULL COMMENT '账单日期(渠道账单自然日)',
`channel_trade_no` varchar(64) NOT NULL DEFAULT '' COMMENT '渠道流水号',
`out_trade_no` varchar(64) NOT NULL DEFAULT '' COMMENT '渠道侧商户订单号(对应业务订单号)',
`amount` bigint(20) NOT NULL DEFAULT '0' COMMENT '渠道账单金额(分)',
`fee` bigint(20) NOT NULL DEFAULT '0' COMMENT '渠道手续费(分)',
`trade_state` varchar(32) NOT NULL DEFAULT '' COMMENT '渠道侧交易状态',
`trade_time` datetime DEFAULT NULL COMMENT '渠道交易时间',
`is_matched` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否已与本地支付单匹配:1是/0否',
`matched_pay_no` varchar(40) NOT NULL DEFAULT '' COMMENT '匹配到的本地支付单号',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`delete_time` datetime DEFAULT NULL COMMENT '删除时间(软删除)',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_channel_trade` (`channel`,`channel_trade_no`,`delete_time`),
KEY `idx_bill_date` (`channel`,`bill_date`,`is_matched`),
KEY `idx_out_trade_no` (`out_trade_no`,`bill_date`),
KEY `idx_delete_time` (`delete_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='平台支付渠道账单明细表(对账源数据)';
-- -------------------------------------------------------------
-- 6. 对账差异表
-- -------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `yz_platform_payment_reconcile_diff` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主键ID',
`channel` varchar(32) NOT NULL DEFAULT '' COMMENT '渠道标识',
`bill_date` date NOT NULL COMMENT '对账日期(同渠道账单日)',
`batch_no` varchar(40) NOT NULL DEFAULT '' COMMENT '对账批次号(同渠道同日一次对账一个批次,便于追溯与重跑)',
`local_trade_no` varchar(64) NOT NULL DEFAULT '' COMMENT '本地支付单号(长款时为空串,不写 NULL 以便参与唯一键)',
`channel_trade_no` varchar(64) NOT NULL DEFAULT '' COMMENT '渠道流水号(短款时为空串)',
`local_amount` bigint(20) DEFAULT NULL COMMENT '本地金额(分),无本地记录时为 NULL',
`channel_amount` bigint(20) DEFAULT NULL COMMENT '渠道金额(分),无渠道记录时为 NULL',
`diff_amount` bigint(20) NOT NULL DEFAULT '0' COMMENT '差额(分)= 渠道金额 - 本地金额,负数表示短款',
`diff_type` varchar(20) NOT NULL DEFAULT '' COMMENT '差异类型:long长款(渠道有本地无)/short短款(本地有渠道无)/status_mismatch状态不一致',
`handle_status` varchar(20) NOT NULL DEFAULT 'unhandled' COMMENT '处理状态:unhandled待处理/handling处理中/handled已处理/ignored已忽略',
`handle_user_id` varchar(64) NOT NULL DEFAULT '' COMMENT '处理人ID',
`handle_user_name` varchar(128) NOT NULL DEFAULT '' COMMENT '处理人姓名',
`handle_time` datetime DEFAULT NULL COMMENT '处理时间',
`remark` varchar(500) NOT NULL DEFAULT '' COMMENT '处理说明(人工填写,便于日后追溯)',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`delete_time` datetime DEFAULT NULL COMMENT '删除时间(软删除)',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_diff` (`channel`,`bill_date`,`diff_type`,`channel_trade_no`,`local_trade_no`,`delete_time`),
KEY `idx_channel_date` (`channel`,`bill_date`),
KEY `idx_handle` (`handle_status`,`bill_date`),
KEY `idx_batch_no` (`batch_no`),
KEY `idx_delete_time` (`delete_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='平台支付对账差异表';
-- -------------------------------------------------------------
-- 7. 手动原路退回记录表(兜底能力,业务上不提供退款入口)
-- -------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `yz_platform_payment_refund` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主键ID',
`refund_no` varchar(40) NOT NULL DEFAULT '' COMMENT '退回单号(支付模块生成)',
`pay_no` varchar(40) NOT NULL DEFAULT '' COMMENT '关联支付单号',
`out_trade_no` varchar(64) NOT NULL DEFAULT '' COMMENT '关联业务订单号',
`channel` varchar(32) NOT NULL DEFAULT '' COMMENT '渠道标识',
`channel_refund_no` varchar(64) NOT NULL DEFAULT '' COMMENT '渠道退回流水号',
`amount` bigint(20) NOT NULL DEFAULT '0' COMMENT '退回金额(分)',
`reason` varchar(500) NOT NULL DEFAULT '' COMMENT '退回原因(必填,人工填写,用于审计)',
`status` varchar(20) NOT NULL DEFAULT 'processing' COMMENT '退回状态:processing处理中/success成功/failed失败',
`fail_reason` varchar(500) NOT NULL DEFAULT '' COMMENT '失败原因',
`operator_id` varchar(64) NOT NULL DEFAULT '' COMMENT '操作人ID(平台管理员)',
`operator_name` varchar(128) NOT NULL DEFAULT '' COMMENT '操作人姓名',
`finished_at` datetime DEFAULT NULL COMMENT '退回完成时间',
`remark` varchar(500) NOT NULL DEFAULT '' COMMENT '备注',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`delete_time` datetime DEFAULT NULL COMMENT '删除时间(软删除)',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_refund_no` (`refund_no`,`delete_time`),
KEY `idx_pay_no` (`pay_no`),
KEY `idx_status` (`status`,`create_time`),
KEY `idx_delete_time` (`delete_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='平台支付手动原路退回记录表(兜底能力)';