-- ----------------------------
-- 支付应用表
-- ----------------------------
DROP TABLE IF EXISTS `pay_app`;
CREATE TABLE `pay_app` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '应用ID',
  `name` varchar(64) NOT NULL COMMENT '应用名',
  `status` tinyint NOT NULL DEFAULT '0' COMMENT '状态(0开启 1关闭)',
  `remark` varchar(255) DEFAULT NULL COMMENT '备注',
  `pay_notify_url` varchar(1024) NOT NULL COMMENT '支付结果回调地址',
  `refund_notify_url` varchar(1024) NOT NULL COMMENT '退款结果回调地址',
  `create_by` varchar(64) DEFAULT '' COMMENT '创建者',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_by` varchar(64) DEFAULT '' COMMENT '更新者',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='支付应用信息';

-- ----------------------------
-- 支付渠道表
-- ----------------------------
DROP TABLE IF EXISTS `pay_channel`;
CREATE TABLE `pay_channel` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '渠道ID',
  `code` varchar(32) NOT NULL COMMENT '渠道编码(alipay_pc, wx_pub)',
  `status` tinyint NOT NULL DEFAULT '0' COMMENT '状态(0开启 1关闭)',
  `remark` varchar(255) DEFAULT NULL COMMENT '备注',
  `fee_rate` double NOT NULL DEFAULT '0' COMMENT '渠道费率(%)',
  `app_id` bigint NOT NULL COMMENT '应用ID',
  `config` text NOT NULL COMMENT '支付渠道配置(JSON)',
  `create_by` varchar(64) DEFAULT '' COMMENT '创建者',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_by` varchar(64) DEFAULT '' COMMENT '更新者',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='支付渠道';

-- ----------------------------
-- 支付订单表
-- ----------------------------
DROP TABLE IF EXISTS `pay_order`;
CREATE TABLE `pay_order` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '订单ID',
  `app_id` bigint NOT NULL COMMENT '应用ID',
  `channel_id` bigint DEFAULT NULL COMMENT '渠道ID',
  `channel_code` varchar(32) DEFAULT NULL COMMENT '渠道编码',
  `merchant_order_id` varchar(64) NOT NULL COMMENT '商户订单编号',
  `subject` varchar(32) NOT NULL COMMENT '商品标题',
  `body` varchar(128) DEFAULT NULL COMMENT '商品描述',
  `notify_url` varchar(1024) NOT NULL COMMENT '异步通知地址',
  `price` int NOT NULL COMMENT '支付金额(分)',
  `channel_fee_rate` double DEFAULT '0' COMMENT '渠道费率',
  `channel_fee_price` int DEFAULT '0' COMMENT '渠道手续费(分)',
  `status` tinyint NOT NULL COMMENT '状态(0未支付 10已支付 20已退款 30已关闭)',
  `user_ip` varchar(50) NOT NULL COMMENT '用户IP',
  `expire_time` datetime NOT NULL COMMENT '订单失效时间',
  `success_time` datetime DEFAULT NULL COMMENT '支付成功时间',
  `extension_id` bigint DEFAULT NULL COMMENT '拓展业务ID (如扫码支付的记录ID)',
  `no` varchar(32) DEFAULT NULL COMMENT '支付单号(内部生成)',
  `channel_order_no` varchar(64) DEFAULT NULL COMMENT '渠道订单号(微信/支付宝)',
  `channel_user_id` varchar(64) DEFAULT NULL COMMENT '渠道用户OpenId',
  `channel_extras` varchar(1024) DEFAULT NULL COMMENT '渠道额外参数(JSON)',
  `create_by` varchar(64) DEFAULT '' COMMENT '创建者',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_by` varchar(64) DEFAULT '' COMMENT '更新者',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_merchant_order_id` (`merchant_order_id`)
) ENGINE=InnoDB COMMENT='支付订单';

-- ----------------------------
-- 退款订单表
-- ----------------------------
DROP TABLE IF EXISTS `pay_refund`;
CREATE TABLE `pay_refund` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '退款ID',
  `no` varchar(32) NOT NULL COMMENT '退款单号',
  `app_id` bigint NOT NULL COMMENT '应用ID',
  `channel_id` bigint NOT NULL COMMENT '渠道ID',
  `channel_code` varchar(32) NOT NULL COMMENT '渠道编码',
  `order_id` bigint NOT NULL COMMENT '支付订单ID',
  `order_no` varchar(32) NOT NULL COMMENT '支付订单no',
  `merchant_order_id` varchar(64) NOT NULL COMMENT '商户订单编号',
  `merchant_refund_id` varchar(64) NOT NULL COMMENT '商户退款编号',
  `notify_url` varchar(1024) NOT NULL COMMENT '回调地址',
  `status` tinyint NOT NULL COMMENT '状态(0等待 10成功 20失败)',
  `pay_price` int NOT NULL COMMENT '支付金额(分)',
  `refund_price` int NOT NULL COMMENT '退款金额(分)',
  `reason` varchar(256) NOT NULL COMMENT '退款原因',
  `user_ip` varchar(50) DEFAULT NULL COMMENT '用户IP',
  `channel_order_no` varchar(64) NOT NULL COMMENT '渠道订单号',
  `channel_refund_no` varchar(64) DEFAULT NULL COMMENT '渠道退款单号',
  `success_time` datetime DEFAULT NULL COMMENT '退款成功时间',
  `error_code` varchar(32) DEFAULT NULL COMMENT '渠道错误码',
  `error_msg` varchar(128) DEFAULT NULL COMMENT '渠道错误描述',
  `create_by` varchar(64) DEFAULT '' COMMENT '创建者',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_by` varchar(64) DEFAULT '' COMMENT '更新者',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='退款订单';

-- ----------------------------
-- 支付通知日志表
-- ----------------------------
DROP TABLE IF EXISTS `pay_notify_log`;
CREATE TABLE `pay_notify_log` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '日志ID',
  `app_id` bigint NOT NULL COMMENT '应用ID',
  `channel_id` bigint NOT NULL COMMENT '渠道ID',
  `order_id` bigint NOT NULL COMMENT '支付订单ID',
  `notify_type` varchar(32) NOT NULL COMMENT '通知类型(pay, refund)',
  `status` tinyint NOT NULL COMMENT '处理状态(0处理中 10成功 20失败)',
  `request_params` text COMMENT '请求参数',
  `response_body` text COMMENT '响应结果',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`),
  KEY `idx_order_id` (`order_id`)
) ENGINE=InnoDB COMMENT='支付通知日志';

-- ----------------------------
-- 支付通知任务表
-- ----------------------------
DROP TABLE IF EXISTS `pay_notify_task`;
CREATE TABLE `pay_notify_task` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '任务ID',
  `order_id` bigint NOT NULL COMMENT '订单ID',
  `order_no` varchar(32) NOT NULL COMMENT '订单号',
  `notify_url` varchar(1024) NOT NULL COMMENT '通知地址',
  `notify_body` text COMMENT '通知内容',
  `retry_count` int NOT NULL DEFAULT '0' COMMENT '重试次数',
  `max_retry` int NOT NULL DEFAULT '5' COMMENT '最大重试次数',
  `status` tinyint NOT NULL DEFAULT '0' COMMENT '状态(0进行中 1成功 2失败)',
  `next_notify_time` datetime NOT NULL COMMENT '下次通知时间',
  `create_by` varchar(64) DEFAULT '' COMMENT '创建者',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_by` varchar(64) DEFAULT '' COMMENT '更新者',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_next_notify_time` (`next_notify_time`)
) ENGINE=InnoDB COMMENT='支付通知任务';

