Files
dax-pay/_config/sql/update-tables.sql
2026-07-12 15:48:51 +08:00

557 lines
34 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.
-- ============================================================
-- 升级 SQL - 建表语句增量
-- 数据库: PostgreSQL 14+
-- 注意: 所有表必须有 COMMENT ON 注释
-- ============================================================
-- ------------------------------------------------------------
-- 商户微信域名验证文件表
-- 商户将公众号/小程序的 MP_verify_xxx.txt 上传至平台, 由平台网关统一响应
-- 微信域名校验请求, 便于商户将网关域名绑定到自己的公众号/小程序
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS mch_wx_domain_verify (
id int8 NOT NULL,
mch_no varchar(32) NOT NULL,
platform bool NOT NULL DEFAULT false,
file_name varchar(100) NOT NULL,
verify_code varchar(64) NOT NULL,
file_content varchar(200) NOT NULL,
remark varchar(200),
creator int8,
create_time timestamptz(6),
last_modifier int8,
last_modified_time timestamptz(6),
version int4 NOT NULL DEFAULT 0,
deleted bool NOT NULL DEFAULT false,
CONSTRAINT pk_mch_wx_domain_verify PRIMARY KEY (id)
);
COMMENT ON TABLE mch_wx_domain_verify IS '商户微信域名验证文件';
COMMENT ON COLUMN mch_wx_domain_verify.id IS '主键';
COMMENT ON COLUMN mch_wx_domain_verify.mch_no IS '商户号(平台级填 0';
COMMENT ON COLUMN mch_wx_domain_verify.platform IS '是否平台级false-商户级 true-平台级';
COMMENT ON COLUMN mch_wx_domain_verify.file_name IS '完整文件名(如 MP_verify_PjhdRxpB8FhG06Fr.txt';
COMMENT ON COLUMN mch_wx_domain_verify.verify_code IS '验证码(文件名提取,全局唯一)';
COMMENT ON COLUMN mch_wx_domain_verify.file_content IS '文件内容(微信生成的随机字符串)';
COMMENT ON COLUMN mch_wx_domain_verify.remark IS '备注';
COMMENT ON COLUMN mch_wx_domain_verify.creator IS '创建者ID';
COMMENT ON COLUMN mch_wx_domain_verify.create_time IS '创建时间';
COMMENT ON COLUMN mch_wx_domain_verify.last_modifier IS '最后修改者ID';
COMMENT ON COLUMN mch_wx_domain_verify.last_modified_time IS '最后修改时间';
COMMENT ON COLUMN mch_wx_domain_verify.version IS '版本号(乐观锁)';
COMMENT ON COLUMN mch_wx_domain_verify.deleted IS '逻辑删除标记';
CREATE UNIQUE INDEX IF NOT EXISTS uk_mch_wx_domain_verify_code ON mch_wx_domain_verify (verify_code) WHERE deleted = false;
CREATE INDEX IF NOT EXISTS idx_mch_wx_domain_verify_mch_no ON mch_wx_domain_verify (mch_no);
CREATE INDEX IF NOT EXISTS idx_mch_wx_domain_verify_platform ON mch_wx_domain_verify (platform);
-- 删除已废弃的归属类型/微信原始ID列旧版建表时存在现已从实体移除
ALTER TABLE mch_wx_domain_verify DROP COLUMN IF EXISTS owner_type;
ALTER TABLE mch_wx_domain_verify DROP COLUMN IF EXISTS owner_id;
-- ------------------------------------------------------------
-- 微信服务商通道商户绑定表新增认证应用类型字段
-- 控制服务商模式下授权获取openId时, 使用服务商应用(sp_appid)还是子商户应用(sub_appid)
-- ------------------------------------------------------------
ALTER TABLE wechat_isv_channel_merchant ADD COLUMN IF NOT EXISTS auth_app_type varchar(32);
COMMENT ON COLUMN wechat_isv_channel_merchant.auth_app_type IS '认证应用类型: SP_APP=服务商应用(sp_appid), SUB_APP=子商户应用(sub_appid), 默认 SP_APP';
-- ------------------------------------------------------------
-- 微信服务商通道商户应用授权认证配置表
-- 配置服务商通道商户应用(子商户应用)的应用密钥, 用于微信OAuth授权流程中的身份验证
-- 一个应用对应一份授权配置(由唯一约束 channel_mch_no + wechat_isv_mch_app_id 保证)
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS wechat_isv_mch_app_auth_config (
id int8 NOT NULL,
channel_mch_no varchar(32) NOT NULL,
wechat_isv_mch_app_id int8 NOT NULL,
app_secret varchar(255),
mch_no varchar(32),
creator int8,
create_time timestamptz(6),
last_modifier int8,
last_modified_time timestamptz(6),
version int4 NOT NULL DEFAULT 0,
deleted bool NOT NULL DEFAULT false,
CONSTRAINT pk_wechat_isv_mch_app_auth_config PRIMARY KEY (id)
);
COMMENT ON TABLE wechat_isv_mch_app_auth_config IS '微信服务商通道商户应用授权认证配置';
COMMENT ON COLUMN wechat_isv_mch_app_auth_config.id IS '主键';
COMMENT ON COLUMN wechat_isv_mch_app_auth_config.channel_mch_no IS '通道商户号(服务商特约商户)';
COMMENT ON COLUMN wechat_isv_mch_app_auth_config.wechat_isv_mch_app_id IS '关联服务商通道商户应用ID';
COMMENT ON COLUMN wechat_isv_mch_app_auth_config.app_secret IS '应用密钥(加密存储)';
COMMENT ON COLUMN wechat_isv_mch_app_auth_config.mch_no IS '商户号';
COMMENT ON COLUMN wechat_isv_mch_app_auth_config.creator IS '创建者ID';
COMMENT ON COLUMN wechat_isv_mch_app_auth_config.create_time IS '创建时间';
COMMENT ON COLUMN wechat_isv_mch_app_auth_config.last_modifier IS '最后修改者ID';
COMMENT ON COLUMN wechat_isv_mch_app_auth_config.last_modified_time IS '最后修改时间';
COMMENT ON COLUMN wechat_isv_mch_app_auth_config.version IS '版本号(乐观锁)';
COMMENT ON COLUMN wechat_isv_mch_app_auth_config.deleted IS '逻辑删除标记';
CREATE UNIQUE INDEX IF NOT EXISTS uk_wechat_isv_mch_app_auth_config ON wechat_isv_mch_app_auth_config (channel_mch_no, wechat_isv_mch_app_id) WHERE deleted = false;
CREATE INDEX IF NOT EXISTS idx_wechat_isv_mch_app_auth_config_mch_app_id ON wechat_isv_mch_app_auth_config (wechat_isv_mch_app_id);
-- ------------------------------------------------------------
-- 微信消息通知模板配置已迁入 system_platform_config
-- (config_type=wechat_notify, 非加密 JSON: tradeTemplateId/operateTemplateId).
-- 公众号凭据仍在 system_platform_encrypt_config (wechat_mp_auth).
-- 兼容已建独立表环境: 直接丢弃废弃表.
-- ------------------------------------------------------------
DROP TABLE IF EXISTS pay_platform_wechat_config;
-- ------------------------------------------------------------
-- 微信消息发送记录表
-- 每次发送(含重发)产生一条, 记录发送参数与结果, 供管理端查询与失败重发.
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS pay_platform_wechat_message_record (
id int8 NOT NULL,
user_id int8,
message_type varchar(32),
open_id varchar(64),
template_id varchar(64),
template_data text,
url varchar(500),
status varchar(32),
msg_id varchar(64),
error_code varchar(32),
error_msg varchar(500),
send_time timestamptz(6),
scene varchar(32),
wx_app_id varchar(64),
creator int8,
create_time timestamptz(6),
last_modifier int8,
last_modified_time timestamptz(6),
version int4 NOT NULL DEFAULT 0,
deleted bool NOT NULL DEFAULT false,
CONSTRAINT pk_pay_platform_wechat_message_record PRIMARY KEY (id)
);
COMMENT ON TABLE pay_platform_wechat_message_record IS '微信消息发送记录';
COMMENT ON COLUMN pay_platform_wechat_message_record.id IS '主键';
COMMENT ON COLUMN pay_platform_wechat_message_record.user_id IS '接收平台用户ID(发送目标, 未绑定时也能追溯)';
COMMENT ON COLUMN pay_platform_wechat_message_record.message_type IS '消息类型: template-公众号模板消息, uniform-小程序统一服务消息';
COMMENT ON COLUMN pay_platform_wechat_message_record.open_id IS '接收者 OpenId';
COMMENT ON COLUMN pay_platform_wechat_message_record.template_id IS '模板ID';
COMMENT ON COLUMN pay_platform_wechat_message_record.template_data IS '模板数据(JSON)';
COMMENT ON COLUMN pay_platform_wechat_message_record.url IS '跳转链接或小程序页面路径';
COMMENT ON COLUMN pay_platform_wechat_message_record.status IS '发送状态: sending-发送中, success-成功, failed-失败';
COMMENT ON COLUMN pay_platform_wechat_message_record.msg_id IS '微信消息ID(成功时返回)';
COMMENT ON COLUMN pay_platform_wechat_message_record.error_code IS '错误码(微信错误码)';
COMMENT ON COLUMN pay_platform_wechat_message_record.error_msg IS '错误信息';
COMMENT ON COLUMN pay_platform_wechat_message_record.send_time IS '发送时间';
COMMENT ON COLUMN pay_platform_wechat_message_record.scene IS '业务场景标识(trade/operate)';
COMMENT ON COLUMN pay_platform_wechat_message_record.wx_app_id IS '使用的公众号 AppId';
COMMENT ON COLUMN pay_platform_wechat_message_record.creator IS '创建者ID';
COMMENT ON COLUMN pay_platform_wechat_message_record.create_time IS '创建时间';
COMMENT ON COLUMN pay_platform_wechat_message_record.last_modifier IS '最后修改者ID';
COMMENT ON COLUMN pay_platform_wechat_message_record.last_modified_time IS '最后修改时间';
COMMENT ON COLUMN pay_platform_wechat_message_record.version IS '版本号(乐观锁)';
COMMENT ON COLUMN pay_platform_wechat_message_record.deleted IS '逻辑删除标记';
CREATE INDEX IF NOT EXISTS idx_pay_platform_wechat_message_record_user_id ON pay_platform_wechat_message_record (user_id);
CREATE INDEX IF NOT EXISTS idx_pay_platform_wechat_message_record_status ON pay_platform_wechat_message_record (status);
CREATE INDEX IF NOT EXISTS idx_pay_platform_wechat_message_record_send_time ON pay_platform_wechat_message_record (send_time);
-- rename iam_social_config -> iam_social_login_config (avoid naming clash with upcoming third-party platform management)
ALTER TABLE IF EXISTS iam_social_config RENAME TO iam_social_login_config;
-- ----------------------------
-- 平台级移动端应用配置(按 app_type + platform 维度, 每组合一条)
-- app_config: text + DataEncryptTypeHandler 加密(密文非合法JSON, 不用 jsonb)
-- notify_config: jsonb 明文(模板/开关等非敏感配置, JsonbStringTypeHandler)
-- ----------------------------
CREATE TABLE IF NOT EXISTS pay_platform_mobile_app (
id int8 NOT NULL,
app_type varchar(32) NOT NULL,
platform varchar(32) NOT NULL,
app_config text,
notify_config jsonb,
binding_enabled bool NOT NULL DEFAULT false,
enabled bool NOT NULL DEFAULT true,
remark varchar(500),
creator int8,
create_time timestamptz(6),
last_modifier int8,
last_modified_time timestamptz(6),
version int4 NOT NULL DEFAULT 0,
deleted bool NOT NULL DEFAULT false,
CONSTRAINT pk_pay_platform_mobile_app PRIMARY KEY (id)
);
COMMENT ON TABLE pay_platform_mobile_app IS '平台级移动端应用配置';
COMMENT ON COLUMN pay_platform_mobile_app.id IS '主键';
COMMENT ON COLUMN pay_platform_mobile_app.app_type IS '端类型: merchant-商户端 / admin-管理端 / cashier-收银台';
COMMENT ON COLUMN pay_platform_mobile_app.platform IS '移动平台: wx_h5/wx_mini/alipay_mini/dy_mini/android/ios';
COMMENT ON COLUMN pay_platform_mobile_app.app_config IS '平台特有密钥配置(JSON文本, AES-256-GCM加密存储)';
COMMENT ON COLUMN pay_platform_mobile_app.notify_config IS '消息通知配置(jsonb, 明文, 非敏感)';
-- 移除无用的展示字段 app_name(以端类型/平台区分即可)
ALTER TABLE pay_platform_mobile_app DROP COLUMN IF EXISTS app_name;
COMMENT ON COLUMN pay_platform_mobile_app.binding_enabled IS '是否启用第三方账号用户绑定';
COMMENT ON COLUMN pay_platform_mobile_app.enabled IS '是否启用';
COMMENT ON COLUMN pay_platform_mobile_app.remark IS '备注';
COMMENT ON COLUMN pay_platform_mobile_app.creator IS '创建者ID';
COMMENT ON COLUMN pay_platform_mobile_app.create_time IS '创建时间';
COMMENT ON COLUMN pay_platform_mobile_app.last_modifier IS '最后修改者ID';
COMMENT ON COLUMN pay_platform_mobile_app.last_modified_time IS '最后修改时间';
COMMENT ON COLUMN pay_platform_mobile_app.version IS '版本号(乐观锁)';
COMMENT ON COLUMN pay_platform_mobile_app.deleted IS '逻辑删除标记';
CREATE UNIQUE INDEX IF NOT EXISTS uk_pay_platform_mobile_app_type_platform
ON pay_platform_mobile_app (app_type, platform) WHERE deleted = false;
-- 兼容历史列类型:
-- app_config: 若曾为 jsonb 需改为 text(加密密文)
-- notify_config: 若为 text 需改为 jsonb(明文配置); 空串按 NULL
-- 目标类型已正确时再执行无副作用(jsonb::text::jsonb 可逆)
ALTER TABLE pay_platform_mobile_app
ALTER COLUMN app_config TYPE text USING app_config::text;
ALTER TABLE pay_platform_mobile_app
ALTER COLUMN notify_config TYPE jsonb USING (
CASE
WHEN notify_config IS NULL THEN NULL
WHEN btrim(notify_config::text) = '' THEN NULL
ELSE notify_config::text::jsonb
END
);
COMMENT ON COLUMN pay_platform_mobile_app.app_config IS '平台特有密钥配置(JSON文本, AES-256-GCM加密存储)';
COMMENT ON COLUMN pay_platform_mobile_app.notify_config IS '消息通知配置(jsonb, 明文, 非敏感)';
-- ------------------------------------------------------------
-- 开源版已取消硬件对接(云音箱/云打印/厂商配置), 相关表 device_speaker /
-- device_printer / device_vendor_config 不再由开源维护, 可手工 DROP。
-- 码牌 device_qr_code 仍为开源能力(收款入口)。
-- ------------------------------------------------------------
-- ------------------------------------------------------------
-- 码牌: 支持空白库存与划拨(批次号 + 商户号可空)
-- ------------------------------------------------------------
ALTER TABLE device_qr_code ADD COLUMN IF NOT EXISTS batch_no varchar(64);
ALTER TABLE device_qr_code ALTER COLUMN mch_no DROP NOT NULL;
COMMENT ON COLUMN device_qr_code.batch_no IS '批次号(批量创建空白码时写入)';
COMMENT ON COLUMN device_qr_code.mch_no IS '所属商户号(空白码为空, 划拨后写入)';
-- ------------------------------------------------------------
-- 网关支付业务单(容器): 预下单时创建, 支付时再挂 pay_trade
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS pay_gateway_order (
id int8 NOT NULL,
mch_no varchar(32) NOT NULL,
app_id varchar(32) NOT NULL,
order_no varchar(64) NOT NULL,
biz_order_no varchar(64) NOT NULL,
gateway_type varchar(32) NOT NULL,
title varchar(128) NOT NULL,
description varchar(512),
amount int8 NOT NULL,
currency varchar(8) NOT NULL DEFAULT 'CNY',
status varchar(32) NOT NULL,
notify_url varchar(256),
return_url varchar(256),
attach varchar(512),
expired_time timestamptz(6),
channel varchar(32),
method varchar(32),
product varchar(32),
capability varchar(64),
channel_mch_no varchar(64),
scene varchar(32),
device varchar(16),
pay_time timestamptz(6),
close_time timestamptz(6),
client_ip varchar(64),
terminal_no varchar(64),
goods_detail jsonb,
creator int8,
create_time timestamptz(6),
last_modifier int8,
last_modified_time timestamptz(6),
version int4 NOT NULL DEFAULT 0,
deleted bool NOT NULL DEFAULT false,
CONSTRAINT pk_pay_gateway_order PRIMARY KEY (id)
);
COMMENT ON TABLE pay_gateway_order IS '网关支付业务单容器(聚合扫码/收银台预下单)';
COMMENT ON COLUMN pay_gateway_order.id IS '主键';
COMMENT ON COLUMN pay_gateway_order.mch_no IS '商户号';
COMMENT ON COLUMN pay_gateway_order.app_id IS '应用号';
COMMENT ON COLUMN pay_gateway_order.order_no IS '平台网关单号(URL用)';
COMMENT ON COLUMN pay_gateway_order.biz_order_no IS '商户业务单号';
COMMENT ON COLUMN pay_gateway_order.gateway_type IS '网关类型: cashier/aggregate';
COMMENT ON COLUMN pay_gateway_order.title IS '标题';
COMMENT ON COLUMN pay_gateway_order.description IS '描述';
COMMENT ON COLUMN pay_gateway_order.amount IS '金额(最小货币单位)';
COMMENT ON COLUMN pay_gateway_order.currency IS '币种';
COMMENT ON COLUMN pay_gateway_order.status IS '业务状态: wait_pay/paying/paid/closed/expired';
COMMENT ON COLUMN pay_gateway_order.notify_url IS '异步通知地址';
COMMENT ON COLUMN pay_gateway_order.return_url IS '同步跳转地址';
COMMENT ON COLUMN pay_gateway_order.attach IS '商户附加参数';
COMMENT ON COLUMN pay_gateway_order.expired_time IS '过期时间';
COMMENT ON COLUMN pay_gateway_order.channel IS '支付通道(支付后冗余)';
COMMENT ON COLUMN pay_gateway_order.method IS '支付方式(支付后冗余)';
COMMENT ON COLUMN pay_gateway_order.product IS '支付产品(支付后冗余)';
COMMENT ON COLUMN pay_gateway_order.capability IS '支付能力(路由回填)';
COMMENT ON COLUMN pay_gateway_order.channel_mch_no IS '通道商户号(路由回填)';
COMMENT ON COLUMN pay_gateway_order.scene IS '收银场景 wechat_pay/alipay/union_pay';
COMMENT ON COLUMN pay_gateway_order.device IS '最后发起设备 mobile/pc';
COMMENT ON COLUMN pay_gateway_order.pay_time IS '支付成功时间';
COMMENT ON COLUMN pay_gateway_order.close_time IS '关闭时间';
COMMENT ON COLUMN pay_gateway_order.client_ip IS '客户端IP';
COMMENT ON COLUMN pay_gateway_order.terminal_no IS '终端设备编码';
COMMENT ON COLUMN pay_gateway_order.goods_detail IS '商品明细(jsonb)';
COMMENT ON COLUMN pay_gateway_order.creator IS '创建者ID';
COMMENT ON COLUMN pay_gateway_order.create_time IS '创建时间';
COMMENT ON COLUMN pay_gateway_order.last_modifier IS '最后修改者ID';
COMMENT ON COLUMN pay_gateway_order.last_modified_time IS '最后修改时间';
COMMENT ON COLUMN pay_gateway_order.version IS '版本号(乐观锁)';
COMMENT ON COLUMN pay_gateway_order.deleted IS '逻辑删除标记';
CREATE UNIQUE INDEX IF NOT EXISTS uk_pay_gateway_order_no ON pay_gateway_order (order_no) WHERE deleted = false;
CREATE UNIQUE INDEX IF NOT EXISTS uk_pay_gateway_biz ON pay_gateway_order (app_id, biz_order_no) WHERE deleted = false;
CREATE INDEX IF NOT EXISTS idx_pay_gateway_status_expired ON pay_gateway_order (status, expired_time);
CREATE INDEX IF NOT EXISTS idx_pay_gateway_mch_time ON pay_gateway_order (mch_no, create_time);
-- ------------------------------------------------------------
-- 网关聚合扫码配置(应用级一行)
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS pay_gateway_aggregate_config (
id int8 NOT NULL,
mch_no varchar(32) NOT NULL,
app_id varchar(32) NOT NULL,
wx_product varchar(32),
wx_method varchar(32),
alipay_product varchar(32),
alipay_method varchar(32),
union_product varchar(32),
union_method varchar(32),
auto_launch bool NOT NULL DEFAULT false,
creator int8,
create_time timestamptz(6),
last_modifier int8,
last_modified_time timestamptz(6),
version int4 NOT NULL DEFAULT 0,
deleted bool NOT NULL DEFAULT false,
CONSTRAINT pk_pay_gateway_aggregate_config PRIMARY KEY (id)
);
COMMENT ON TABLE pay_gateway_aggregate_config IS '网关聚合扫码支付配置(应用级)';
COMMENT ON COLUMN pay_gateway_aggregate_config.id IS '主键';
COMMENT ON COLUMN pay_gateway_aggregate_config.mch_no IS '商户号';
COMMENT ON COLUMN pay_gateway_aggregate_config.app_id IS '应用号';
COMMENT ON COLUMN pay_gateway_aggregate_config.wx_product IS '微信场景支付产品';
COMMENT ON COLUMN pay_gateway_aggregate_config.wx_method IS '微信场景支付方式';
COMMENT ON COLUMN pay_gateway_aggregate_config.alipay_product IS '支付宝场景支付产品';
COMMENT ON COLUMN pay_gateway_aggregate_config.alipay_method IS '支付宝场景支付方式';
COMMENT ON COLUMN pay_gateway_aggregate_config.union_product IS '云闪付场景支付产品';
COMMENT ON COLUMN pay_gateway_aggregate_config.union_method IS '云闪付场景支付方式';
COMMENT ON COLUMN pay_gateway_aggregate_config.auto_launch IS '是否自动拉起支付';
COMMENT ON COLUMN pay_gateway_aggregate_config.creator IS '创建者ID';
COMMENT ON COLUMN pay_gateway_aggregate_config.create_time IS '创建时间';
COMMENT ON COLUMN pay_gateway_aggregate_config.last_modifier IS '最后修改者ID';
COMMENT ON COLUMN pay_gateway_aggregate_config.last_modified_time IS '最后修改时间';
COMMENT ON COLUMN pay_gateway_aggregate_config.version IS '版本号(乐观锁)';
COMMENT ON COLUMN pay_gateway_aggregate_config.deleted IS '逻辑删除标记';
CREATE UNIQUE INDEX IF NOT EXISTS uk_pay_gateway_aggregate_app ON pay_gateway_aggregate_config (app_id) WHERE deleted = false;
-- ------------------------------------------------------------
-- pay_trade: 冗余路由参数 + 业务单号 + 客户端IP, 消除 sync/close/callback 对容器的依赖
-- ------------------------------------------------------------
ALTER TABLE pay_trade ADD COLUMN IF NOT EXISTS biz_order_no varchar(64);
ALTER TABLE pay_trade ADD COLUMN IF NOT EXISTS channel_mch_no varchar(64);
ALTER TABLE pay_trade ADD COLUMN IF NOT EXISTS capability varchar(64);
ALTER TABLE pay_trade ADD COLUMN IF NOT EXISTS client_ip varchar(64);
COMMENT ON COLUMN pay_trade.biz_order_no IS '商户业务单号(冗余自容器, 供同步/关闭/回调等流程直接读取)';
COMMENT ON COLUMN pay_trade.channel_mch_no IS '通道商户号(路由回填, 冗余自容器, 供策略层直接读取)';
COMMENT ON COLUMN pay_trade.capability IS '支付能力编码(路由回填, 冗余自容器, 供策略层直接读取)';
COMMENT ON COLUMN pay_trade.client_ip IS '客户端IP(冗余自容器, 供关闭/同步等策略读取)';
-- ------------------------------------------------------------
-- 网关聚合扫码配置重构: 三级配置深度(AUTO/METHOD/DIRECT) + 场景子表
-- ------------------------------------------------------------
ALTER TABLE pay_gateway_aggregate_config DROP COLUMN IF EXISTS wx_product;
ALTER TABLE pay_gateway_aggregate_config DROP COLUMN IF EXISTS wx_method;
ALTER TABLE pay_gateway_aggregate_config DROP COLUMN IF EXISTS alipay_product;
ALTER TABLE pay_gateway_aggregate_config DROP COLUMN IF EXISTS alipay_method;
ALTER TABLE pay_gateway_aggregate_config DROP COLUMN IF EXISTS union_product;
ALTER TABLE pay_gateway_aggregate_config DROP COLUMN IF EXISTS union_method;
ALTER TABLE pay_gateway_aggregate_config ADD COLUMN IF NOT EXISTS level varchar(16) NOT NULL DEFAULT 'auto';
COMMENT ON COLUMN pay_gateway_aggregate_config.level IS '配置深度: auto-自动/method-方式/direct-精确';
CREATE TABLE IF NOT EXISTS pay_gateway_aggregate_scene (
id int8 NOT NULL,
config_id int8 NOT NULL,
scene varchar(32) NOT NULL,
method varchar(32),
channel_mch_no varchar(64),
capability varchar(64),
creator int8,
create_time timestamptz(6),
last_modifier int8,
last_modified_time timestamptz(6),
version int4 NOT NULL DEFAULT 0,
deleted bool NOT NULL DEFAULT false,
CONSTRAINT pk_pay_gateway_aggregate_scene PRIMARY KEY (id)
);
COMMENT ON TABLE pay_gateway_aggregate_scene IS '网关聚合扫码场景配置(子表, 每场景一行)';
COMMENT ON COLUMN pay_gateway_aggregate_scene.id IS '主键';
COMMENT ON COLUMN pay_gateway_aggregate_scene.config_id IS '聚合配置主表ID';
COMMENT ON COLUMN pay_gateway_aggregate_scene.scene IS '场景编码: wechat_pay/alipay/union_pay/douyin';
COMMENT ON COLUMN pay_gateway_aggregate_scene.method IS '支付方式(METHOD模式填)';
COMMENT ON COLUMN pay_gateway_aggregate_scene.channel_mch_no IS '通道商户号(DIRECT模式填)';
COMMENT ON COLUMN pay_gateway_aggregate_scene.capability IS '支付能力(DIRECT模式填)';
COMMENT ON COLUMN pay_gateway_aggregate_scene.creator IS '创建者ID';
COMMENT ON COLUMN pay_gateway_aggregate_scene.create_time IS '创建时间';
COMMENT ON COLUMN pay_gateway_aggregate_scene.last_modifier IS '最后修改者ID';
COMMENT ON COLUMN pay_gateway_aggregate_scene.last_modified_time IS '最后修改时间';
COMMENT ON COLUMN pay_gateway_aggregate_scene.version IS '版本号(乐观锁)';
COMMENT ON COLUMN pay_gateway_aggregate_scene.deleted IS '逻辑删除标记';
CREATE UNIQUE INDEX IF NOT EXISTS uk_pay_gateway_aggregate_scene ON pay_gateway_aggregate_scene (config_id, scene) WHERE deleted = false;
-- ----------------------------
-- 网关收银台支付项配置(应用级, H5 按终端分桶 / WEB 扁平列表)
-- ----------------------------
CREATE TABLE IF NOT EXISTS pay_gateway_cashier_item (
id int8 NOT NULL,
mch_no varchar(32) NOT NULL,
app_id varchar(32) NOT NULL,
cashier_type varchar(16) NOT NULL,
scene varchar(32),
name varchar(64) NOT NULL,
icon varchar(32),
recommend bool NOT NULL DEFAULT false,
sort_no int4 NOT NULL DEFAULT 0,
resolve_mode varchar(16) NOT NULL,
method varchar(32),
channel_mch_no varchar(64),
capability varchar(64),
creator int8,
create_time timestamptz(6),
last_modifier int8,
last_modified_time timestamptz(6),
version int4 NOT NULL DEFAULT 0,
deleted bool NOT NULL DEFAULT false,
CONSTRAINT pk_pay_gateway_cashier_item PRIMARY KEY (id)
);
COMMENT ON TABLE pay_gateway_cashier_item IS '网关收银台支付项配置(应用级)';
COMMENT ON COLUMN pay_gateway_cashier_item.id IS '主键';
COMMENT ON COLUMN pay_gateway_cashier_item.mch_no IS '商户号';
COMMENT ON COLUMN pay_gateway_cashier_item.app_id IS '应用号';
COMMENT ON COLUMN pay_gateway_cashier_item.cashier_type IS '收银台类型: h5/web';
COMMENT ON COLUMN pay_gateway_cashier_item.scene IS 'H5终端场景: browser/wechat_pay/alipay/union_pay/douyin; WEB为空';
COMMENT ON COLUMN pay_gateway_cashier_item.name IS '前台展示名称';
COMMENT ON COLUMN pay_gateway_cashier_item.icon IS '图标编码: wechat/alipay/union/douyin/aggregate';
COMMENT ON COLUMN pay_gateway_cashier_item.recommend IS '是否推荐';
COMMENT ON COLUMN pay_gateway_cashier_item.sort_no IS '排序号, 越小越前';
COMMENT ON COLUMN pay_gateway_cashier_item.resolve_mode IS '解析模式: method/direct';
COMMENT ON COLUMN pay_gateway_cashier_item.method IS '支付方式(METHOD模式填)';
COMMENT ON COLUMN pay_gateway_cashier_item.channel_mch_no IS '通道商户号(DIRECT模式填)';
COMMENT ON COLUMN pay_gateway_cashier_item.capability IS '支付能力(DIRECT模式填)';
COMMENT ON COLUMN pay_gateway_cashier_item.creator IS '创建者ID';
COMMENT ON COLUMN pay_gateway_cashier_item.create_time IS '创建时间';
COMMENT ON COLUMN pay_gateway_cashier_item.last_modifier IS '最后修改者ID';
COMMENT ON COLUMN pay_gateway_cashier_item.last_modified_time IS '最后修改时间';
COMMENT ON COLUMN pay_gateway_cashier_item.version IS '版本号(乐观锁)';
COMMENT ON COLUMN pay_gateway_cashier_item.deleted IS '逻辑删除标记';
CREATE INDEX IF NOT EXISTS idx_pay_gateway_cashier_item_list
ON pay_gateway_cashier_item (app_id, cashier_type, scene)
WHERE deleted = false;
-- ============================================================
-- PayTrade 瘦身: 业务/路由/回执字段归容器, trade 仅留资金动作固有属性
-- ============================================================
-- pay_normal_order 补充 14 字段(请求参数 + 回执 + 通道关联 + 错误)
ALTER TABLE pay_normal_order ADD COLUMN IF NOT EXISTS other_method varchar(64);
ALTER TABLE pay_normal_order ADD COLUMN IF NOT EXISTS limit_pay varchar(128);
ALTER TABLE pay_normal_order ADD COLUMN IF NOT EXISTS openid varchar(128);
ALTER TABLE pay_normal_order ADD COLUMN IF NOT EXISTS bar_code varchar(64);
ALTER TABLE pay_normal_order ADD COLUMN IF NOT EXISTS error_msg varchar(500);
ALTER TABLE pay_normal_order ADD COLUMN IF NOT EXISTS buyer_id varchar(64);
ALTER TABLE pay_normal_order ADD COLUMN IF NOT EXISTS buyer_logon_id varchar(128);
ALTER TABLE pay_normal_order ADD COLUMN IF NOT EXISTS trade_product varchar(64);
ALTER TABLE pay_normal_order ADD COLUMN IF NOT EXISTS trade_way varchar(64);
ALTER TABLE pay_normal_order ADD COLUMN IF NOT EXISTS bank_type varchar(32);
ALTER TABLE pay_normal_order ADD COLUMN IF NOT EXISTS promotion_type varchar(64);
ALTER TABLE pay_normal_order ADD COLUMN IF NOT EXISTS provider varchar(32);
ALTER TABLE pay_normal_order ADD COLUMN IF NOT EXISTS trans_order_no varchar(64);
ALTER TABLE pay_normal_order ADD COLUMN IF NOT EXISTS relation_order_no varchar(64);
COMMENT ON COLUMN pay_normal_order.other_method IS '其他支付方式, method=other 时生效';
COMMENT ON COLUMN pay_normal_order.limit_pay IS '限制支付类型(如限制信用卡)';
COMMENT ON COLUMN pay_normal_order.openid IS '微信 openid(jsapi/app/miniapp)';
COMMENT ON COLUMN pay_normal_order.bar_code IS '付款码(被扫支付)';
COMMENT ON COLUMN pay_normal_order.error_msg IS '错误信息';
COMMENT ON COLUMN pay_normal_order.buyer_id IS '付款用户 ID(支付宝 buyer_user_id 等)';
COMMENT ON COLUMN pay_normal_order.buyer_logon_id IS '买家登录账号(支付宝手机号/邮箱)';
COMMENT ON COLUMN pay_normal_order.trade_product IS '通道方记录的支付产品';
COMMENT ON COLUMN pay_normal_order.trade_way IS '通道方记录的交易方式';
COMMENT ON COLUMN pay_normal_order.bank_type IS '银行卡类型(借记卡/贷记卡)';
COMMENT ON COLUMN pay_normal_order.promotion_type IS '活动类型';
COMMENT ON COLUMN pay_normal_order.provider IS '支付渠道(微信/支付宝/银联等)';
COMMENT ON COLUMN pay_normal_order.trans_order_no IS '透传订单号(三方通道产生的透传订单号)';
COMMENT ON COLUMN pay_normal_order.relation_order_no IS '特殊通道关联订单号(部分通道订单号有前缀/长度限制时使用)';
-- pay_gateway_order 补充 14 字段
ALTER TABLE pay_gateway_order ADD COLUMN IF NOT EXISTS other_method varchar(64);
ALTER TABLE pay_gateway_order ADD COLUMN IF NOT EXISTS limit_pay varchar(128);
ALTER TABLE pay_gateway_order ADD COLUMN IF NOT EXISTS openid varchar(128);
ALTER TABLE pay_gateway_order ADD COLUMN IF NOT EXISTS bar_code varchar(64);
ALTER TABLE pay_gateway_order ADD COLUMN IF NOT EXISTS error_msg varchar(500);
ALTER TABLE pay_gateway_order ADD COLUMN IF NOT EXISTS buyer_id varchar(64);
ALTER TABLE pay_gateway_order ADD COLUMN IF NOT EXISTS buyer_logon_id varchar(128);
ALTER TABLE pay_gateway_order ADD COLUMN IF NOT EXISTS trade_product varchar(64);
ALTER TABLE pay_gateway_order ADD COLUMN IF NOT EXISTS trade_way varchar(64);
ALTER TABLE pay_gateway_order ADD COLUMN IF NOT EXISTS bank_type varchar(32);
ALTER TABLE pay_gateway_order ADD COLUMN IF NOT EXISTS promotion_type varchar(64);
ALTER TABLE pay_gateway_order ADD COLUMN IF NOT EXISTS provider varchar(32);
ALTER TABLE pay_gateway_order ADD COLUMN IF NOT EXISTS trans_order_no varchar(64);
ALTER TABLE pay_gateway_order ADD COLUMN IF NOT EXISTS relation_order_no varchar(64);
COMMENT ON COLUMN pay_gateway_order.other_method IS '其他支付方式, method=other 时生效';
COMMENT ON COLUMN pay_gateway_order.limit_pay IS '限制支付类型(如限制信用卡)';
COMMENT ON COLUMN pay_gateway_order.openid IS '微信 openid(jsapi/app/miniapp)';
COMMENT ON COLUMN pay_gateway_order.bar_code IS '付款码(被扫支付)';
COMMENT ON COLUMN pay_gateway_order.error_msg IS '错误信息';
COMMENT ON COLUMN pay_gateway_order.buyer_id IS '付款用户 ID(支付宝 buyer_user_id 等)';
COMMENT ON COLUMN pay_gateway_order.buyer_logon_id IS '买家登录账号(支付宝手机号/邮箱)';
COMMENT ON COLUMN pay_gateway_order.trade_product IS '通道方记录的支付产品';
COMMENT ON COLUMN pay_gateway_order.trade_way IS '通道方记录的交易方式';
COMMENT ON COLUMN pay_gateway_order.bank_type IS '银行卡类型(借记卡/贷记卡)';
COMMENT ON COLUMN pay_gateway_order.promotion_type IS '活动类型';
COMMENT ON COLUMN pay_gateway_order.provider IS '支付渠道(微信/支付宝/银联等)';
COMMENT ON COLUMN pay_gateway_order.trans_order_no IS '透传订单号(三方通道产生的透传订单号)';
COMMENT ON COLUMN pay_gateway_order.relation_order_no IS '特殊通道关联订单号(部分通道订单号有前缀/长度限制时使用)';
-- pay_trade 删除 22 字段(已归容器)
ALTER TABLE pay_trade DROP COLUMN IF EXISTS biz_order_no;
ALTER TABLE pay_trade DROP COLUMN IF EXISTS product;
ALTER TABLE pay_trade DROP COLUMN IF EXISTS channel;
ALTER TABLE pay_trade DROP COLUMN IF EXISTS method;
ALTER TABLE pay_trade DROP COLUMN IF EXISTS other_method;
ALTER TABLE pay_trade DROP COLUMN IF EXISTS limit_pay;
ALTER TABLE pay_trade DROP COLUMN IF EXISTS provider;
ALTER TABLE pay_trade DROP COLUMN IF EXISTS expired_time;
ALTER TABLE pay_trade DROP COLUMN IF EXISTS trans_order_no;
ALTER TABLE pay_trade DROP COLUMN IF EXISTS relation_order_no;
ALTER TABLE pay_trade DROP COLUMN IF EXISTS buyer_id;
ALTER TABLE pay_trade DROP COLUMN IF EXISTS buyer_logon_id;
ALTER TABLE pay_trade DROP COLUMN IF EXISTS openid;
ALTER TABLE pay_trade DROP COLUMN IF EXISTS trade_product;
ALTER TABLE pay_trade DROP COLUMN IF EXISTS trade_way;
ALTER TABLE pay_trade DROP COLUMN IF EXISTS bank_type;
ALTER TABLE pay_trade DROP COLUMN IF EXISTS bar_code;
ALTER TABLE pay_trade DROP COLUMN IF EXISTS promotion_type;
ALTER TABLE pay_trade DROP COLUMN IF EXISTS channel_mch_no;
ALTER TABLE pay_trade DROP COLUMN IF EXISTS capability;
ALTER TABLE pay_trade DROP COLUMN IF EXISTS client_ip;
ALTER TABLE pay_trade DROP COLUMN IF EXISTS error_msg;