This commit is contained in:
技术老胡
2026-04-01 14:30:50 +08:00
parent 0eee3b92c2
commit d34bd386ec
15 changed files with 542 additions and 186 deletions

View File

@@ -0,0 +1,169 @@
-- Current schema alignment for the updated merchant / merchant-app model.
-- Target DB: MySQL 5.7+
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- =========================================================
-- 1. Expand ma_mer for admin + merchant backend scenarios
-- =========================================================
ALTER TABLE `ma_mer`
ADD COLUMN `merchant_short_name` varchar(60) NOT NULL DEFAULT '' COMMENT '商户简称' AFTER `merchant_name`,
ADD COLUMN `merchant_type` varchar(20) NOT NULL DEFAULT 'company' COMMENT '商户类型company/individual/other' AFTER `merchant_short_name`,
ADD COLUMN `group_code` varchar(32) NOT NULL DEFAULT '' COMMENT '商户分组编码' AFTER `merchant_type`,
ADD COLUMN `legal_name` varchar(100) NOT NULL DEFAULT '' COMMENT '法人姓名' AFTER `funds_mode`,
ADD COLUMN `contact_name` varchar(50) NOT NULL DEFAULT '' COMMENT '联系人姓名' AFTER `legal_name`,
ADD COLUMN `contact_phone` varchar(20) NOT NULL DEFAULT '' COMMENT '联系人手机号' AFTER `contact_name`,
ADD COLUMN `contact_email` varchar(100) NOT NULL DEFAULT '' COMMENT '联系人邮箱' AFTER `contact_phone`,
ADD COLUMN `website` varchar(255) NOT NULL DEFAULT '' COMMENT '商户官网' AFTER `contact_email`,
ADD COLUMN `province` varchar(50) NOT NULL DEFAULT '' COMMENT '省份' AFTER `website`,
ADD COLUMN `city` varchar(50) NOT NULL DEFAULT '' COMMENT '城市' AFTER `province`,
ADD COLUMN `address` varchar(255) NOT NULL DEFAULT '' COMMENT '详细地址' AFTER `city`,
ADD COLUMN `callback_domain` varchar(255) NOT NULL DEFAULT '' COMMENT '回调域名' AFTER `address`,
ADD COLUMN `callback_ip_whitelist` text COMMENT '回调IP白名单' AFTER `callback_domain`,
ADD COLUMN `risk_level` varchar(20) NOT NULL DEFAULT 'standard' COMMENT '风控等级low/standard/high' AFTER `callback_ip_whitelist`,
ADD COLUMN `settlement_mode` varchar(20) NOT NULL DEFAULT 'auto' COMMENT '结算方式auto/manual' AFTER `risk_level`,
ADD COLUMN `settlement_cycle` varchar(20) NOT NULL DEFAULT 't1' COMMENT '结算周期d0/t1/manual' AFTER `settlement_mode`,
ADD COLUMN `settlement_account_name` varchar(100) NOT NULL DEFAULT '' COMMENT '结算账户名' AFTER `settlement_cycle`,
ADD COLUMN `settlement_account_no` varchar(100) NOT NULL DEFAULT '' COMMENT '结算账户号' AFTER `settlement_account_name`,
ADD COLUMN `settlement_bank_name` varchar(100) NOT NULL DEFAULT '' COMMENT '结算银行名称' AFTER `settlement_account_no`,
ADD COLUMN `settlement_bank_branch` varchar(100) NOT NULL DEFAULT '' COMMENT '结算支行名称' AFTER `settlement_bank_name`,
ADD COLUMN `single_limit` decimal(12,2) NOT NULL DEFAULT 0.00 COMMENT '单笔限额(元)' AFTER `settlement_bank_branch`,
ADD COLUMN `daily_limit` decimal(12,2) NOT NULL DEFAULT 0.00 COMMENT '日限额(元)' AFTER `single_limit`,
ADD COLUMN `remark` varchar(500) NOT NULL DEFAULT '' COMMENT '备注' AFTER `daily_limit`,
ADD COLUMN `extra` json DEFAULT NULL COMMENT '扩展字段(JSON)' AFTER `remark`;
ALTER TABLE `ma_mer`
ADD KEY `idx_group_code` (`group_code`),
ADD KEY `idx_contact_phone` (`contact_phone`),
ADD KEY `idx_status` (`status`);
-- =========================================================
-- 2. Expand ma_pay_app for merchant app backend settings
-- =========================================================
ALTER TABLE `ma_pay_app`
ADD COLUMN `package_code` varchar(32) NOT NULL DEFAULT '' COMMENT '商户套餐编码' AFTER `app_name`,
ADD COLUMN `notify_url` varchar(255) NOT NULL DEFAULT '' COMMENT '异步通知地址' AFTER `package_code`,
ADD COLUMN `return_url` varchar(255) NOT NULL DEFAULT '' COMMENT '同步跳转地址' AFTER `notify_url`,
ADD COLUMN `callback_mode` varchar(20) NOT NULL DEFAULT 'server' COMMENT '回调模式server/server+page/manual' AFTER `return_url`,
ADD COLUMN `sign_type` varchar(20) NOT NULL DEFAULT 'md5' COMMENT '签名方式' AFTER `callback_mode`,
ADD COLUMN `order_expire_minutes` int(11) NOT NULL DEFAULT 30 COMMENT '订单超时时间(分钟)' AFTER `sign_type`,
ADD COLUMN `callback_retry_limit` int(11) NOT NULL DEFAULT 6 COMMENT '回调重试次数' AFTER `order_expire_minutes`,
ADD COLUMN `ip_whitelist` text COMMENT 'IP白名单' AFTER `callback_retry_limit`,
ADD COLUMN `amount_min` decimal(12,2) NOT NULL DEFAULT 0.00 COMMENT '单笔最小金额' AFTER `ip_whitelist`,
ADD COLUMN `amount_max` decimal(12,2) NOT NULL DEFAULT 0.00 COMMENT '单笔最大金额' AFTER `amount_min`,
ADD COLUMN `daily_limit` decimal(12,2) NOT NULL DEFAULT 0.00 COMMENT '日限额' AFTER `amount_max`,
ADD COLUMN `notify_enabled` tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否开启通知0-否,1-是' AFTER `daily_limit`,
ADD COLUMN `remark` varchar(500) NOT NULL DEFAULT '' COMMENT '备注' AFTER `notify_enabled`,
ADD COLUMN `extra` json DEFAULT NULL COMMENT '扩展字段(JSON)' AFTER `remark`;
ALTER TABLE `ma_pay_app`
ADD KEY `idx_api_type` (`api_type`),
ADD KEY `idx_status` (`status`);
-- =========================================================
-- 3. Merchant backend user table
-- =========================================================
CREATE TABLE IF NOT EXISTS `ma_mer_user` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`mer_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '商户ID',
`username` varchar(50) NOT NULL DEFAULT '' COMMENT '登录账号',
`password` varchar(255) DEFAULT NULL COMMENT '登录密码hash',
`nick_name` varchar(50) NOT NULL DEFAULT '' COMMENT '昵称',
`avatar` varchar(255) NOT NULL DEFAULT '' COMMENT '头像地址',
`mobile` varchar(20) NOT NULL DEFAULT '' COMMENT '手机号',
`email` varchar(100) NOT NULL DEFAULT '' COMMENT '邮箱',
`role_code` varchar(32) NOT NULL DEFAULT 'owner' COMMENT '角色编码',
`is_owner` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否商户主账号0-否,1-是',
`status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态0-禁用,1-启用',
`login_ip` varchar(45) NOT NULL DEFAULT '' COMMENT '最后登录IP',
`login_at` datetime DEFAULT NULL COMMENT '最后登录时间',
`created_at` datetime DEFAULT NULL COMMENT '创建时间',
`updated_at` datetime DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_username` (`username`),
KEY `idx_mer_id` (`mer_id`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商户后台用户表';
-- =========================================================
-- 4. Compatibility views for legacy code paths
-- =========================================================
DROP VIEW IF EXISTS `ma_merchant`;
CREATE VIEW `ma_merchant` AS
SELECT
`id`,
`merchant_no`,
`merchant_name`,
`merchant_short_name`,
`merchant_type`,
`group_code`,
`funds_mode`,
`legal_name`,
`contact_name`,
`contact_phone`,
`contact_email`,
`website`,
`province`,
`city`,
`address`,
`callback_domain`,
`callback_ip_whitelist`,
`risk_level`,
`settlement_mode`,
`settlement_cycle`,
`settlement_account_name`,
`settlement_account_no`,
`settlement_bank_name`,
`settlement_bank_branch`,
`single_limit`,
`daily_limit`,
`status`,
`remark`,
`extra`,
`created_at`,
`updated_at`
FROM `ma_mer`;
DROP VIEW IF EXISTS `ma_merchant_app`;
CREATE VIEW `ma_merchant_app` AS
SELECT
`id`,
`mer_id` AS `merchant_id`,
`api_type`,
`app_code` AS `app_id`,
`app_secret`,
`app_name`,
`package_code`,
`notify_url`,
`return_url`,
`callback_mode`,
`sign_type`,
`order_expire_minutes`,
`callback_retry_limit`,
`ip_whitelist`,
`amount_min`,
`amount_max`,
`daily_limit`,
`notify_enabled`,
`status`,
`remark`,
`extra`,
`created_at`,
`updated_at`
FROM `ma_pay_app`;
DROP VIEW IF EXISTS `ma_pay_method`;
CREATE VIEW `ma_pay_method` AS
SELECT
`id`,
`type` AS `method_code`,
`name` AS `method_name`,
`icon`,
`sort`,
`status`,
`created_at`,
`updated_at`
FROM `ma_pay_type`;
SET FOREIGN_KEY_CHECKS = 1;

View File

@@ -78,13 +78,13 @@ ON DUPLICATE KEY UPDATE
-- 7) 支付通道(为测试商户 M001 / 应用 1001 初始化拉卡拉通道)
INSERT INTO `ma_pay_channel` (
`merchant_id`,
`merchant_app_id`,
`mer_id`,
`app_id`,
`chan_code`,
`chan_name`,
`plugin_code`,
`method_id`,
`config_json`,
`pay_type_id`,
`config`,
`split_ratio`,
`chan_cost`,
`chan_mode`,
@@ -98,16 +98,16 @@ INSERT INTO `ma_pay_channel` (
`updated_at`
)
SELECT
m.id AS merchant_id,
app.id AS merchant_app_id,
m.id AS mer_id,
app.id AS app_id,
'lakala_alipay' AS chan_code,
'拉卡拉-支付宝' AS chan_name,
'lakala' AS plugin_code,
pm.id AS method_id,
JSON_OBJECT('notify_url', 'https://example.com/notify') AS config_json,
pm.id AS pay_type_id,
JSON_OBJECT('notify_url', 'https://example.com/notify') AS config,
100.00 AS split_ratio,
0.00 AS chan_cost,
'wallet' AS chan_mode,
0 AS chan_mode,
0.00 AS daily_limit,
0 AS daily_cnt,
0.01 AS min_amount,
@@ -122,8 +122,8 @@ JOIN `ma_pay_method` pm ON pm.method_code = 'alipay'
ON DUPLICATE KEY UPDATE
`chan_name` = VALUES(`chan_name`),
`plugin_code` = VALUES(`plugin_code`),
`method_id` = VALUES(`method_id`),
`config_json` = VALUES(`config_json`),
`pay_type_id` = VALUES(`pay_type_id`),
`config` = VALUES(`config`),
`split_ratio` = VALUES(`split_ratio`),
`chan_cost` = VALUES(`chan_cost`),
`chan_mode` = VALUES(`chan_mode`),
@@ -136,13 +136,13 @@ ON DUPLICATE KEY UPDATE
`updated_at` = NOW();
INSERT INTO `ma_pay_channel` (
`merchant_id`,
`merchant_app_id`,
`mer_id`,
`app_id`,
`chan_code`,
`chan_name`,
`plugin_code`,
`method_id`,
`config_json`,
`pay_type_id`,
`config`,
`split_ratio`,
`chan_cost`,
`chan_mode`,
@@ -156,16 +156,16 @@ INSERT INTO `ma_pay_channel` (
`updated_at`
)
SELECT
m.id AS merchant_id,
app.id AS merchant_app_id,
m.id AS mer_id,
app.id AS app_id,
'lakala_wechat' AS chan_code,
'拉卡拉-微信支付' AS chan_name,
'lakala' AS plugin_code,
pm.id AS method_id,
JSON_OBJECT('notify_url', 'https://example.com/notify') AS config_json,
pm.id AS pay_type_id,
JSON_OBJECT('notify_url', 'https://example.com/notify') AS config,
100.00 AS split_ratio,
0.00 AS chan_cost,
'wallet' AS chan_mode,
0 AS chan_mode,
0.00 AS daily_limit,
0 AS daily_cnt,
0.01 AS min_amount,
@@ -180,8 +180,8 @@ JOIN `ma_pay_method` pm ON pm.method_code = 'wechat'
ON DUPLICATE KEY UPDATE
`chan_name` = VALUES(`chan_name`),
`plugin_code` = VALUES(`plugin_code`),
`method_id` = VALUES(`method_id`),
`config_json` = VALUES(`config_json`),
`pay_type_id` = VALUES(`pay_type_id`),
`config` = VALUES(`config`),
`split_ratio` = VALUES(`split_ratio`),
`chan_cost` = VALUES(`chan_cost`),
`chan_mode` = VALUES(`chan_mode`),
@@ -191,4 +191,4 @@ ON DUPLICATE KEY UPDATE
`max_amount` = VALUES(`max_amount`),
`status` = VALUES(`status`),
`sort` = VALUES(`sort`),
`updated_at` = NOW();
`updated_at` = NOW();