chore(sql): 新增脱敏 data.sql 与 redact 工具, 移除 iam_perm_menu.sql, 清空 update-datas.sql, 刷新 table.sql

This commit is contained in:
daxpay
2026-08-04 10:32:46 +08:00
parent 63104c5fa7
commit e5b543e556
7 changed files with 9933 additions and 4716 deletions

View File

@@ -0,0 +1,226 @@
# DaxPay Data SQL 敏感数据清除方案报告
> 工具:`redact-data.mjs`(同目录) 输入:`../sql/data.sql`pg_dump --inserts 导出) 输出:`../sql/data.sql`
> 用途:生成**干净安装包/演示数据**,供他人导入;清除全部敏感数据与运行时业务数据,仅保留系统运行所必需的种子数据与一个内置超级管理员账号。
---
## 1. 背景与目标
从生产/测试库导出 `../sql/data.sql` 后,其中包含大量敏感信息(支付通道密钥、证书、应用 secret、密码哈希、授权令牌等以及与安装包无关的业务/交易数据。本方案的目标是:
1. **彻底清除敏感数据**——密钥/证书/secret/令牌/密码等,杜绝明文与密文外泄。
2. **清除业务与运行时数据**——商户、订单、交易、日志、通知等安装包不需要的数据。
3. **保留系统运行必需的种子数据**——权限码、菜单、角色、字典、地区、支付能力元数据等(`datas.sql` 不在仓库,清掉后无现成脚本恢复)。
4. **保留一个内置超级管理员账号**——确保导入后可登录。
## 2. 数据源格式特征
| 特征 | 说明 |
|------|------|
| 导出方式 | `pg_dump --inserts` |
| 语句形态 | `INSERT INTO public.<表名> VALUES (...)`**不带列名** |
| 分段标记 | `-- Data for Name: <表名>; Type: TABLE DATA; Schema: public; Owner: bootx` |
| 跨行 INSERT | 6 条(`base_user_protocol_version`×3、`notify_notice`×2、`starter_audit_unipay_log`×1值内含真实换行 |
| 规模 | 约 14500 行4.0 MB约 80 张表有数据13562 条 INSERT |
**关键约束**:因无列名,脱敏**不能按列定位**,只能按“表名 + 整表/行级”决策。脚本通过 `INSERT INTO public.<表>` 解析表名,跨行 INSERT 累积到行尾 `);` 视为一条完整语句。
## 3. 敏感数据分布(清除对象识别)
通过实体类 `@TableName` + `DataEncryptTypeHandler` 标注与 SQL 数据交叉分析,敏感数据分 5 类:
| 类别 | 代表表 | 敏感字段类型 | 存储形态 |
|------|--------|------------|---------|
| **A. 通道密钥配置** | 17 张 `*_key_config`alipay/wechat/douyin/lakala/ums/union/stripe/yeepay/leshua/fuyou/dougong/hkrt/hmpay/vbill/adapay 的 direct/isv | api_key / private_key / public_key / cert / secret_key / encrypt_key / sm4_key / 证书密码 | AES-256-GCM 加密(`v1:` 前缀密文) |
| **B. 应用 secret / 授权令牌** | `wx_mch_app``wx_platform_app``dy_mch_app``dy_platform_app`app_secret`alipay_isv_channel_merchant`app_auth_token`pay_platform_mobile_app`(小程序 appSecret`iam_social_login_config`(第三方登录 client_secret | 应用通信密钥 / 授权令牌 | 加密存储 |
| **C. 商户凭据** | `mch_credential`public_key/secret_key`pay_easy_pay_credential`md5_key/public_key | 商户对接 RSA 密钥 / 签名密钥 | 加密 / 部分明文 |
| **D. 用户认证** | `iam_user_info`bcrypt 密码哈希 `$2a$10$`)、`iam_user_password_history`(密码历史)、`iam_user_two_factor`2FA secret + backup_codes`iam_user_social`(第三方 openid/昵称/头像) | 密码哈希 / TOTP 密钥 / 个人隐私 | 哈希 / 加密 / 明文 |
| **E. 平台配置** | `system_platform_config`jsonb含 OSS accessKey/secretKey **明文**)、`system_platform_encrypt_config`(加密的平台认证配置) | OSS 密钥 / 支付宝/微信/抖音开放平台认证 | 明文 jsonb / 加密 |
> ⚠️ `system_platform_config.config_data` 为**明文 jsonb**,其中 `oss` 配置项含 OSS `accessKey`/`secretKey` 明文——是最高优先级清除点。
## 4. 脱敏策略:白名单架构
经权衡,采用**白名单保留**而非黑名单跳过:
- 黑名单需枚举 60+ 张敏感/业务表,清单冗长且未来新增表默认保留(有遗漏风险)。
- 白名单只需列出“必须保留”的 18 张种子表,**其余一律清除**,对未来新增表默认安全,更契合“安装包”用途。
### 决策三原则
```
对每条 INSERT
① 表 ∈ KEEP_TABLES18 张系统种子) → 整表原样保留
② iam_user_info 且 id=1 (bootx 内置超管) → 该行保留
③ 其余 → 整表跳过(写一行审计注释 -- REDACTED: <table>
```
## 5. 完整表分类清单
### 5.1 保留清单18 张系统种子表,整表保留)
| 类别 | 表名 | 条数 | 用途 |
|------|------|------|------|
| 权限 | `iam_perm_code` | 163 | 权限点定义 |
| 菜单 | `iam_perm_menu` | 149 | 菜单/路由i18n_key 真相源) |
| 角色 | `iam_role` | 2 | admin_admin / merchant_admin 内置角色 |
| 角色权限 | `iam_role_code` | 128 | 角色-权限码关联 |
| 角色菜单 | `iam_role_menu` | 121 | 角色-菜单关联 |
| 字典 | `system_dict` | 2 | 字典分类 |
| 字典项 | `system_dict_item` | 3 | 字典枚举值 |
| 地区 | `base_area` | 2984 | 区/县 |
| 城市 | `base_city` | 342 | 市 |
| 省份 | `base_province` | 31 | 省 |
| 支付元数据 | `pay_md_provider` | 7 | 支付通道提供商wechat/alipay/…) |
| 支付元数据 | `pay_md_channel` | 18 | 通道 |
| 支付元数据 | `pay_md_method` | 27 | 支付方式 |
| 支付元数据 | `pay_md_capability` | 26 | 支付能力 |
| 支付元数据 | `pay_md_provider_method` | 26 | 提供商-方式关联 |
| 支付元数据 | `pay_md_product` | 26 | 支付产品定义 |
| 支付元数据 | `pay_md_product_capability` | 222 | 产品-能力关联 |
| 系统配置 | `system_sensitive_word` | 1 | 敏感词库 |
**行级保留**
| 表 | 保留行 | 标识 |
|----|--------|------|
| `iam_user_info` | 1 行 | `id=1`username=`bootx`name=`超级管理员`client_code=`admin`)—— 系统内置超级管理员 |
> 该账号在 `iam_user_role` 中无角色绑定记录,推断为代码层面识别的内置超管(拥有全部权限),故 `iam_user_role` 可整表清除。
### 5.2 清除清单(约 63 张表,整表跳过)
#### A. 支付通道密钥配置(`*_key_config`
`alipay_direct_app_key_config``douyin_direct_key_config``wechat_direct_key_config``wechat_isv_key_config`(仓库种子数据仅此 4 张有数据,其余 `*_key_config` 表存在但无 INSERT脚本对无数据表自然无操作
#### B. 应用 secret / 授权令牌
`wx_mch_app``wx_platform_app``dy_mch_app``dy_platform_app``alipay_isv_channel_merchant``pay_platform_mobile_app``iam_social_login_config`
#### C. 商户凭据
`mch_credential``pay_easy_pay_credential`
#### D. 用户认证与隐私
`iam_user_info`(仅留 id=1`iam_user_password_history``iam_user_two_factor``iam_user_social``iam_user_role``iam_user_expand_info``iam_user_password_security``iam_user_dashboard_preference``mch_user`
#### E. 平台配置
`system_platform_config`(含明文 OSS 密钥,整表清)、`system_platform_encrypt_config`(加密平台认证配置)。
#### F. 商户 / 应用 / 门店
`mch_info``mch_app_info``mch_channel_merchant``mch_store_info``alipay_direct_app``alipay_direct_app_auth_config``alipay_direct_channel_merchant``douyin_direct_channel_merchant``wechat_direct_channel_merchant``wechat_isv_channel_merchant``wx_platform_app_capability``wx_channel_app_capability`
#### G. 支付业务配置
`pay_md_product_config``pay_route_basic_config``pay_route_strategy``pay_gateway_pay_config``pay_gateway_pay_client_env``pay_gateway_cashier_item``pay_easy_pay_config`
#### H. 运行时交易与日志
- **订单/交易**`pay_normal_order``pay_gateway_order``pay_refund_order``pay_trade`
- **回调/同步/关闭**`pay_callback_record``pay_close_record``pay_sync_record`
- **风控**`pay_blacklist``pay_risk_hit`
- **通知**`notify_notice``notify_notice_read``mch_notice_record``mch_notice_task`
- **审计日志**`starter_audit_login_log``starter_audit_operate_log``starter_audit_unipay_log`
- **文件/设备/杂项**`starter_platform_file_record``device_qr_code``system_sensitive_word_hit``base_user_protocol``base_user_protocol_version`
## 6. 脚本设计:`redact-data.mjs`
| 项 | 说明 |
|----|------|
| 语言 | Node.js ESM`.mjs`**零第三方依赖**`node:fs` + `node:readline` |
| 处理方式 | 流式逐行内存友好4 MB 文件) |
| 跨行处理 | 维护 `inInsert` 状态 + 缓冲,累积到行尾 `);` 视为一条语句结束,再做表名决策 |
| 输出头 | 写入时间戳、模式、清除范围说明,便于审计 |
| 审计注释 | 每张被清除的表首次出现时写 `-- REDACTED: <table>`,原 INSERT 不输出 |
| 统计报告 | 结尾打印每张表的 INSERT 总数/保留/清除数 |
### 核心逻辑(伪代码)
```js
const KEEP_TABLES = new Set([
'iam_perm_code','iam_perm_menu','iam_role','iam_role_code','iam_role_menu',
'system_dict','system_dict_item',
'base_area','base_city','base_province',
'pay_md_provider','pay_md_channel','pay_md_method','pay_md_capability',
'pay_md_provider_method','pay_md_product','pay_md_product_capability',
'system_sensitive_word',
])
// iam_user_info 行级保留id=1 (bootx 超管)
const BOOTX_ADMIN_RE = /^INSERT INTO public\.iam_user_info\s+VALUES\s*\(\s*1\s*,/
function handleInsert(table, lines) {
if (KEEP_TABLES.has(table)) return output(lines) // ① 种子表保留
if (BOOTX_ADMIN_RE.test(lines[0])) return output(lines) // ② bootx 行保留
// ③ 其余清除
writeRedactedMark(table)
}
```
### 用法
```bash
node redact-data.mjs <input.sql> <output.sql>
# 例:
node redact-data.mjs data_raw.sql data.sql
```
## 7. 验证方案
### 7.1 统计核对
脚本结尾输出三类统计:
- `[保留]` 18 张种子表 INSERT 数(应与原文件一致)
- `[行级保留]` iam_user_info 14 → 1保留 id=1
- `[清除]` 其余表 INSERT 数 → 0
### 7.2 敏感关键词兜底(输出文件应全部为 0
```powershell
$f='data.sql'
# 明文敏感值
(Select-String -LiteralPath $f -Pattern 'accessKey|secretKey').Count # = 0
# 加密密文前缀(清除全部加密字段后应归零)
(Select-String -LiteralPath $f -Pattern 'v1:').Count # = 0
# 密码哈希
(Select-String -LiteralPath $f -Pattern '\$2[aby]\$10\$').Count # 仅剩 1bootx
# 证书明文
(Select-String -LiteralPath $f -Pattern 'BEGIN CERTIFICATE|BEGIN PRIVATE KEY').Count # = 0
# OSS 配置行
(Select-String -LiteralPath $f -Pattern "VALUES\s*\(\s*\d+\s*,\s*'oss'\s*,").Count # = 0
```
### 7.3 完整性核对(保留项应存在)
```powershell
# bootx 超管仍在
(Select-String -LiteralPath $f -Pattern "INSERT INTO public\.iam_user_info VALUES \(1,").Count # = 1
# 菜单种子仍在
(Select-String -LiteralPath $f -Pattern '^INSERT INTO public\.iam_perm_menu').Count # = 149
# 支付元数据仍在(注意加 \s+VALUES 排除 pay_md_provider_method 前缀误匹配)
(Select-String -LiteralPath $f -Pattern '^INSERT INTO public\.pay_md_provider\s+VALUES').Count # = 7
```
## 8. 预期结果
| 指标 | 原始 | 实测脱敏后 |
|------|------|--------|
| 文件大小 | 4186110 B (~4.0 MB) | 429098 B (~0.41 MB) |
| 有数据表数 | ~80 | 1918 种子 + iam_user_info 仅 1 行 bootx |
| 保留 INSERT | 13562 | 42794278 种子 + 1 bootx |
| 清除 INSERT | — | 927061 张表) |
| `v1:` 加密密文 | 28 | 0 ✓ |
| `accessKey`/`secretKey` | 各 1 | 0 ✓ |
| 密码哈希 `$2a$10$` | 14 | 1bootx✓ |
| `BEGIN CERTIFICATE` | — | 0 ✓ |
| 敏感表(密钥/凭据/secret | 有 | 全空 ✓ |
## 9. 边界与风险说明
1. **`bootx` 账号密码哈希保留**:导入者需知悉 daxpay 默认密码,登录后应立即改密。若需彻底零密码,则放弃保留账号,改为依赖系统首启建管理员机制(需后端支持)。
2. **`pay_md_*` 元数据定义保留**:这是系统支持的支付通道/方式/产品的“枚举定义”,清除后无 `datas.sql` 恢复,故保留。商户侧的产品开通配置(`pay_md_product_config`)属业务数据,清除。
3. **未来新增表默认被清除**:白名单架构下,升级后若新增业务表,其数据默认不出现在安装包——符合安装包语义,但每次升级需人工确认新增的“系统种子表”是否应补入 `KEEP_TABLES`
4. **跨行 INSERT 处理**:脚本以行尾 `);` 判断语句结束,对当前 6 条跨行 INSERT均位于清除表安全若未来保留表出现含 `);` 字符串的跨行值,需复核。
5. **脚本状态**`redact-data.mjs` 已按本报告第 6 节改写为**白名单版本并验证通过**(实测结果见 §8
## 10. 实施步骤Checklist
- [x] 按 §6 改写 `redact-data.mjs` 为白名单架构(`KEEP_TABLES` + `BOOTX_ADMIN_RE`
- [x] 运行 `node redact-data.mjs data.sql data-redacted.sql`
- [x] 执行 §7 验证(统计 + 关键词兜底 + 完整性核对)
- [ ] (可选)导入干净 PG 库验证应用可启动、`bootx` 可登录

View File

@@ -0,0 +1,176 @@
#!/usr/bin/env node
/**
* Data SQL 敏感数据清除脚本(白名单架构)
*
* 用途:生成干净安装包/演示数据,供他人导入。
* 策略:保留 18 张系统种子表 + bootx 内置超管(id=1),其余整表清除。
*
* 三原则决策:
* ① 表 ∈ KEEP_TABLES系统种子 → 整表原样保留
* ② iam_user_info 且 id=1 (bootx 超管) → 该行保留,同表其余行清除
* ③ 其余 → 整表跳过(写审计注释)
*
* 格式假设pg_dump --insertsINSERT INTO public.表名 VALUES (...),无列名)。
* 自动处理跨多行 INSERT值内含换行累积到行尾 ");" 视为语句结束)。
*
* 用法node redact-data.mjs <input.sql> <output.sql>
*/
import { createReadStream, createWriteStream } from 'node:fs'
import { createInterface } from 'node:readline'
import { argv, exit } from 'node:process'
// ---------- 参数 ----------
const positional = argv.slice(2).filter((a) => !a.startsWith('--'))
if (positional.length < 2) {
console.error('用法node redact-data.mjs <input.sql> <output.sql>')
exit(1)
}
const [inputPath, outputPath] = positional
// ---------- 白名单:系统种子表(整表保留) ----------
const KEEP_TABLES = new Set([
// 权限/菜单/角色
'iam_perm_code',
'iam_perm_menu',
'iam_role',
'iam_role_code',
'iam_role_menu',
// 字典
'system_dict',
'system_dict_item',
// 地区
'base_area',
'base_city',
'base_province',
// 支付元数据定义
'pay_md_provider',
'pay_md_channel',
'pay_md_method',
'pay_md_capability',
'pay_md_provider_method',
'pay_md_product',
'pay_md_product_capability',
// 敏感词库
'system_sensitive_word',
])
// ---------- 行级保留iam_user_info 的 bootx 超管id=1 ----------
const BOOTX_ADMIN_TABLE = 'iam_user_info'
const BOOTX_ADMIN_RE = /^INSERT INTO public\.iam_user_info\s+VALUES\s*\(\s*1\s*,/
// ---------- 解析规则 ----------
const INSERT_RE = /^INSERT INTO public\.(\w+)\s+VALUES\b/i
const STMT_END_RE = /\);\s*$/
// ---------- 统计 ----------
const stats = new Map() // table -> { total, kept }
function bump(table, kept) {
const s = stats.get(table) ?? { total: 0, kept: 0 }
s.total += 1
if (kept) s.kept += 1
stats.set(table, s)
}
// ---------- 主流程 ----------
const input = createReadStream(inputPath, { encoding: 'utf8' })
const output = createWriteStream(outputPath, { encoding: 'utf8' })
output.write(`-- ============================================================\n`)
output.write(`-- 敏感数据已清除(白名单模式) | 工具 redact-data.mjs | 时间 ${new Date().toISOString()}\n`)
output.write(`-- 策略:保留 18 张系统种子表 + bootx 超管(id=1),其余整表清除\n`)
output.write(`-- 用途:干净安装包/演示数据\n`)
output.write(`-- ============================================================\n\n`)
const rl = createInterface({ input, crlfDelay: Infinity })
const redactedMarked = new Set() // 每张被清除的表仅写一次审计注释
let inInsert = false // 是否在累积跨行 INSERT
let buf = [] // 跨行 INSERT 累积缓冲
let bufTable = '' // 当前累积的表名
function writeRedactedMark(table) {
if (redactedMarked.has(table)) return
output.write(`-- REDACTED: ${table} (整表清除)\n`)
redactedMarked.add(table)
}
/** 决策一条完整 INSERTlines 为单行或跨行合并后的行数组) */
function handleInsert(table, lines) {
// ① 系统种子表:整表保留
if (KEEP_TABLES.has(table)) {
bump(table, true)
for (const ln of lines) output.write(ln + '\n')
return
}
// ② iam_user_info 行级保留bootx 超管 (id=1)
if (table === BOOTX_ADMIN_TABLE && BOOTX_ADMIN_RE.test(lines[0])) {
bump(table, true)
for (const ln of lines) output.write(ln + '\n')
return
}
// ③ 其余:整表清除
bump(table, false)
writeRedactedMark(table)
}
rl.on('line', (line) => {
if (inInsert) {
// 正在累积跨行 INSERT
buf.push(line)
if (STMT_END_RE.test(line)) {
handleInsert(bufTable, buf)
inInsert = false
buf = []
bufTable = ''
}
return
}
const m = line.match(INSERT_RE)
if (m) {
const table = m[1]
if (STMT_END_RE.test(line)) {
handleInsert(table, [line]) // 单行 INSERT
} else {
inInsert = true // 跨行 INSERT 起始
bufTable = table
buf = [line]
}
return
}
// 非 INSERT 行(注释、空行等)原样输出
output.write(line + '\n')
})
rl.on('close', () => {
// 兜底:文件结束时若仍在累积(理论上不会发生)
if (inInsert && buf.length) handleInsert(bufTable, buf)
output.end(() => printReport())
})
function printReport() {
const keptSeedTables = []
const partialTables = [] // 行级保留表iam_user_info
const clearedTables = []
for (const [t, s] of stats) {
if (KEEP_TABLES.has(t)) keptSeedTables.push([t, s])
else if (t === BOOTX_ADMIN_TABLE) partialTables.push([t, s])
else clearedTables.push([t, s])
}
const sumKept = keptSeedTables.reduce((a, [, s]) => a + s.kept, 0)
const sumCleared = clearedTables.reduce((a, [, s]) => a + s.total, 0)
const sumPartialCleared = partialTables.reduce((a, [, s]) => a + (s.total - s.kept), 0)
const lines = []
lines.push('')
lines.push('========== 脱敏统计(白名单模式) ==========')
lines.push(`[保留·种子表] ${keptSeedTables.length} 张表INSERT ${sumKept} 条(全保留)`)
lines.push(`[保留·行级] iam_user_infoINSERT ${partialTables[0]?.[1].total ?? 0} → 保留 ${partialTables[0]?.[1].kept ?? 0} (bootx id=1),清除 ${sumPartialCleared}`)
lines.push(`[清除] ${clearedTables.length} 张表,丢弃 INSERT ${sumCleared}`)
lines.push('---- 清除明细 ----')
for (const [t, s] of clearedTables.sort((a, b) => a[0].localeCompare(b[0]))) {
lines.push(` ${t.padEnd(38)} ${s.total}`)
}
lines.push('=============================================')
console.log(lines.join('\n'))
}

View File

@@ -1,8 +1,6 @@
# SQL脚本说明
## 注意事项
- 默认只提供postgresql的SQLMySQL数据脚本可以根据教程自行转换[PG转MySQL脚本流程](https://yibeiguangnian.feishu.cn/wiki/ZyiYwwfCfiv9TBkt8kIcjubynvs)
- 项目中不直接提供历史SQL文件如果需要可以去飞书[系统安装包](https://yibeiguangnian.feishu.cn/wiki/ITXMw7riaiifVdkn1Zwc2sWYnJh)中下载历史版本
- 项目中不直接提供历史SQL文件如果需要可以查看项目的历史版本其中的SQL文件就是对应的历史版本
- 全新安装的脚本执行顺序tables.sql -> datas.sql
- 升级脚本执行顺序update-tables.sql -> update-datas.sql提供的更新版本是上一个版本升级到当前版本所对应的SQL文件不能跨版本升级

5060
_config/sql/data.sql Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,240 +0,0 @@
/*
Navicat Premium Data Transfer
Source Server : 229本地服务
Source Server Type : PostgreSQL
Source Server Version : 160014 (160014)
Source Host : 192.168.1.229:5432
Source Catalog : daxpay-dev
Source Schema : public
Target Server Type : PostgreSQL
Target Server Version : 160014 (160014)
File Encoding : 65001
Date: 01/08/2026 08:20:25
*/
-- ----------------------------
-- Table structure for iam_perm_menu
-- ----------------------------
DROP TABLE IF EXISTS "public"."iam_perm_menu";
CREATE TABLE "public"."iam_perm_menu" (
"id" int8 NOT NULL,
"pid" int8,
"menu_code" varchar(100) COLLATE "pg_catalog"."default",
"client_code" varchar(100) COLLATE "pg_catalog"."default",
"name" varchar(200) COLLATE "pg_catalog"."default",
"i18n_key" varchar(200) COLLATE "pg_catalog"."default",
"icon" varchar(200) COLLATE "pg_catalog"."default",
"hidden" bool DEFAULT false,
"hide_children_menu" bool DEFAULT false,
"component" varchar(500) COLLATE "pg_catalog"."default",
"path" varchar(500) COLLATE "pg_catalog"."default",
"redirect" varchar(500) COLLATE "pg_catalog"."default",
"sort_no" float8,
"root" bool DEFAULT false,
"keep_alive" bool DEFAULT false,
"affix_tab" bool DEFAULT false,
"creator" int8,
"last_modifier" int8,
"version" int4 DEFAULT 0,
"deleted" bool DEFAULT false,
"menu_type" varchar(20) COLLATE "pg_catalog"."default",
"active_icon" varchar(100) COLLATE "pg_catalog"."default",
"badge" varchar(50) COLLATE "pg_catalog"."default",
"badge_type" varchar(20) COLLATE "pg_catalog"."default",
"badge_variants" varchar(50) COLLATE "pg_catalog"."default",
"iframe_src" varchar(500) COLLATE "pg_catalog"."default",
"link" varchar(500) COLLATE "pg_catalog"."default",
"create_time" timestamptz(6),
"last_modified_time" timestamptz(6)
)
;
COMMENT ON COLUMN "public"."iam_perm_menu"."id" IS '主键';
COMMENT ON COLUMN "public"."iam_perm_menu"."pid" IS '父菜单ID,0表示根菜单';
COMMENT ON COLUMN "public"."iam_perm_menu"."menu_code" IS '菜单编码';
COMMENT ON COLUMN "public"."iam_perm_menu"."client_code" IS '关联终端code';
COMMENT ON COLUMN "public"."iam_perm_menu"."name" IS '路由名称,建议唯一';
COMMENT ON COLUMN "public"."iam_perm_menu"."i18n_key" IS '国际化key';
COMMENT ON COLUMN "public"."iam_perm_menu"."icon" IS '菜单图标';
COMMENT ON COLUMN "public"."iam_perm_menu"."hidden" IS '是否隐藏';
COMMENT ON COLUMN "public"."iam_perm_menu"."hide_children_menu" IS '是否隐藏子菜单';
COMMENT ON COLUMN "public"."iam_perm_menu"."component" IS '组件';
COMMENT ON COLUMN "public"."iam_perm_menu"."path" IS '访问路径';
COMMENT ON COLUMN "public"."iam_perm_menu"."redirect" IS '菜单跳转地址(重定向)';
COMMENT ON COLUMN "public"."iam_perm_menu"."sort_no" IS '菜单排序';
COMMENT ON COLUMN "public"."iam_perm_menu"."root" IS '是否是一级菜单';
COMMENT ON COLUMN "public"."iam_perm_menu"."keep_alive" IS '是否开启页面缓存';
COMMENT ON COLUMN "public"."iam_perm_menu"."affix_tab" IS '是否固定标签页';
COMMENT ON COLUMN "public"."iam_perm_menu"."creator" IS '创建者ID';
COMMENT ON COLUMN "public"."iam_perm_menu"."last_modifier" IS '最后修改ID';
COMMENT ON COLUMN "public"."iam_perm_menu"."version" IS '版本号';
COMMENT ON COLUMN "public"."iam_perm_menu"."deleted" IS '删除标志';
COMMENT ON COLUMN "public"."iam_perm_menu"."menu_type" IS '菜单类型: catalog-目录, menu-菜单, subpage-子页面, subpage_group-子页面分组, embedded-内嵌, link-外链';
COMMENT ON COLUMN "public"."iam_perm_menu"."active_icon" IS '激活状态图标';
COMMENT ON COLUMN "public"."iam_perm_menu"."badge" IS '徽章显示文本';
COMMENT ON COLUMN "public"."iam_perm_menu"."badge_type" IS '徽章类型: dot-圆点, normal-文本';
COMMENT ON COLUMN "public"."iam_perm_menu"."badge_variants" IS '徽章样式变体';
COMMENT ON COLUMN "public"."iam_perm_menu"."iframe_src" IS '内嵌页面URL地址';
COMMENT ON COLUMN "public"."iam_perm_menu"."link" IS '外部链接URL地址';
COMMENT ON TABLE "public"."iam_perm_menu" IS '菜单权限配置';
-- ----------------------------
-- Records of iam_perm_menu
-- ----------------------------
INSERT INTO "public"."iam_perm_menu" VALUES (202, 2, NULL, 'admin', 'FileUploadDemo', 'menu.demos.fileUpload', 'lucide:upload', 'f', 'f', '/demos/file-upload/FileUploadDemo', '/demos/file-upload', NULL, 2, 'f', 't', 'f', 0, NULL, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-04-09 16:00:00+00', '2026-04-09 16:00:00+00');
INSERT INTO "public"."iam_perm_menu" VALUES (307, 3, 'system:monitor', 'admin', 'SystemMonitor', 'menu.system.monitor', 'lucide:monitor', 'f', 'f', NULL, '/system/monitor', NULL, 50, 'f', 't', 'f', 1, 1, 1, 'f', 'catalog', NULL, NULL, NULL, NULL, NULL, NULL, '2026-04-10 16:00:00+00', '2026-04-12 12:53:45.790453+00');
INSERT INTO "public"."iam_perm_menu" VALUES (305, 3, 'iam:perm', 'admin', 'SystemPerm', 'menu.system.perm', 'lucide:shield', 'f', 'f', NULL, '/system/perm', NULL, 2, 'f', 't', 'f', 1, 1, 1, 'f', 'catalog', NULL, NULL, NULL, NULL, NULL, NULL, '2026-04-08 16:00:00+00', '2026-04-09 15:10:44.651238+00');
INSERT INTO "public"."iam_perm_menu" VALUES (302, 3, NULL, 'admin', 'SystemLog', 'menu.system.log', 'lucide:file-text', 'f', 'f', NULL, '/system/log', NULL, 99, 'f', 't', 'f', 0, 1, 1, 'f', 'catalog', NULL, NULL, NULL, NULL, NULL, NULL, '2026-03-20 03:11:13.134079+00', '2026-04-05 08:56:11.97756+00');
INSERT INTO "public"."iam_perm_menu" VALUES (304, 3, 'system:config', 'admin', 'SystemConfig', 'menu.system.config', 'lucide:settings-2', 'f', 'f', NULL, '/system/config', NULL, 10, 'f', 't', 'f', 0, 1, 1, 'f', 'catalog', NULL, NULL, NULL, NULL, NULL, NULL, '2026-04-04 16:00:00+00', '2026-04-09 15:11:00.840153+00');
INSERT INTO "public"."iam_perm_menu" VALUES (203, 2, 'demos:region', 'admin', 'RegionCascaderDemo', 'menu.demos.region', 'lucide:map-pin', 'f', 'f', '/demos/region/RegionCascaderDemo', '/demos/region', NULL, 3, 'f', 't', 'f', 0, NULL, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-04-24 16:00:00+00', '2026-04-24 16:00:00+00');
INSERT INTO "public"."iam_perm_menu" VALUES (401, 4, 'payment:platform', 'admin', 'PaymentPlatform', 'menu.payment.platform', 'lucide:building', 'f', 'f', NULL, '/payment/platform', NULL, 10, 'f', 't', 'f', 0, 1, 3, 'f', 'catalog', NULL, NULL, NULL, NULL, NULL, NULL, '2026-04-05 16:00:00+00', '2026-07-31 03:18:17.020454+00');
INSERT INTO "public"."iam_perm_menu" VALUES (3, NULL, NULL, 'admin', 'System', 'menu.system', 'lucide:sliders-horizontal', 'f', 'f', NULL, '/system', NULL, 0, 'f', 't', 'f', 0, 1, 2, 'f', 'catalog', NULL, NULL, NULL, NULL, NULL, NULL, '2026-03-20 03:11:13.134079+00', '2026-06-25 02:00:30.22348+00');
INSERT INTO "public"."iam_perm_menu" VALUES (30102, 301, 'iam:menu', 'admin', 'SystemMenu', 'menu.system.perm.menu', 'lucide:panel-top', 'f', 'f', '/iam/perm/menu/MenuList', '/system/basic/menu', NULL, 0, 'f', 't', 'f', 0, 1, 3, 'f', 'menu', NULL, NULL, NULL, NULL, '', '', '2026-03-20 03:11:13.134079+00', '2026-06-27 10:29:51.371435+00');
INSERT INTO "public"."iam_perm_menu" VALUES (301, 3, NULL, 'admin', 'SystemBasic', 'menu.system.basic', 'lucide:boxes', 'f', 'f', NULL, '/system/basic', NULL, 1, 'f', 't', 'f', 0, NULL, 0, 'f', 'catalog', NULL, NULL, NULL, NULL, NULL, NULL, '2026-03-20 03:11:13.134079+00', '2026-06-25 02:00:30.236321+00');
INSERT INTO "public"."iam_perm_menu" VALUES (30101, 301, 'system:dict', 'admin', 'SystemDict', 'menu.system.basic.dict', 'lucide:book-open', 'f', 'f', '/system/basic/dict/DictList', '/system/basic/dict', NULL, 1, 'f', 't', 'f', 0, 1, 2, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-03-20 03:11:13.134079+00', '2026-06-25 02:00:30.243488+00');
INSERT INTO "public"."iam_perm_menu" VALUES (30601, 307, 'system:file', 'admin', 'StorageFile', 'menu.system.monitor.file', 'lucide:files', 'f', 'f', '/system/monitor/file/PlatformFileList', '/system/monitor/file', NULL, 2, 'f', 't', 'f', 1, 1, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-04-09 16:00:00+00', '2026-06-25 02:43:43.71511+00');
INSERT INTO "public"."iam_perm_menu" VALUES (30501, 305, 'iam:user', 'admin', 'UserList', 'menu.system.perm.user', 'lucide:users-round', 'f', 'f', '/iam/user/UserList', '/iam/user', NULL, 10, 'f', 't', 'f', 1, 1, 4, 'f', 'menu', NULL, NULL, NULL, NULL, '', '', '2026-03-31 00:23:04.37507+00', '2026-07-13 02:15:41.494775+00');
INSERT INTO "public"."iam_perm_menu" VALUES (2, NULL, NULL, 'admin', 'Demos', 'menu.demos', 'lucide:blocks', 'f', 'f', NULL, '/demos', NULL, 1000, 'f', 't', 'f', 0, NULL, 0, 'f', 'catalog', NULL, NULL, NULL, NULL, NULL, NULL, '2026-03-20 03:11:13.134079+00', '2026-06-25 02:00:30.27727+00');
INSERT INTO "public"."iam_perm_menu" VALUES (1, NULL, NULL, 'admin', 'Dashboard', 'menu.dashboard', 'lucide:layout-dashboard', 'f', 'f', NULL, '/dashboard', '/workspace', -1, 'f', 'f', 'f', 0, NULL, 0, 'f', 'catalog', NULL, NULL, NULL, NULL, NULL, NULL, '2026-03-20 03:11:13.134079+00', '2026-06-27 13:46:52.151771+00');
INSERT INTO "public"."iam_perm_menu" VALUES (30202, 302, 'system:log:operate', 'admin', 'SystemOperateLog', 'menu.system.log.operate', 'lucide:activity', 'f', 'f', '/system/log/operate/OperateLogList', '/system/log/operate', NULL, 2, 'f', 't', 'f', 0, 1, 1, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-03-20 03:11:13.134079+00', '2026-03-30 15:24:57.076166+00');
INSERT INTO "public"."iam_perm_menu" VALUES (4, NULL, 'payment', 'admin', 'PaymentSystem', 'menu.platform', 'lucide:credit-card', 'f', 'f', NULL, '/payment', NULL, 3, 'f', 't', 'f', 0, 1, 1, 'f', 'catalog', NULL, NULL, NULL, NULL, NULL, NULL, '2026-04-05 16:00:00+00', '2026-07-13 13:02:20.694464+00');
INSERT INTO "public"."iam_perm_menu" VALUES (30401, 304, 'system:security-config', 'admin', 'SecurityManage', 'menu.system.security', 'lucide:shield-check', 'f', 'f', NULL, '/system/config/security', NULL, 2, 'f', 't', 'f', 1, 1, 1, 'f', 'catalog', NULL, NULL, NULL, NULL, NULL, NULL, '2026-04-05 02:00:00+00', '2026-07-16 07:31:19.436479+00');
INSERT INTO "public"."iam_perm_menu" VALUES (30201, 302, 'system:log:login', 'admin', 'SystemLoginLog', 'menu.system.log.login', 'lucide:log-in', 'f', 'f', '/system/log/login/LoginLogList', '/system/log/login', NULL, 1, 'f', 't', 'f', 0, 1, 1, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-03-20 03:11:13.134079+00', '2026-03-30 15:25:09.855555+00');
INSERT INTO "public"."iam_perm_menu" VALUES (102, 1, 'dashboard:workspace', 'admin', 'Workspace', 'menu.dashboard.workspace', 'lucide:panels-top-left', 'f', 'f', '/dashboard/workspace/index', '/workspace', NULL, 1, 'f', 'f', 't', 0, 1, 1, 'f', 'menu', NULL, NULL, NULL, NULL, '', '', '2026-03-20 03:11:13.134079+00', '2026-06-28 02:50:37.055128+00');
INSERT INTO "public"."iam_perm_menu" VALUES (101, 1, 'dashboard:analytics', 'admin', 'Analytics', 'menu.dashboard.analytics', 'lucide:area-chart', 'f', 'f', '/dashboard/analytics/index', '/analytics', NULL, 2, 'f', 'f', 'f', 0, 1, 1, 'f', 'menu', NULL, NULL, NULL, NULL, '', '', '2026-03-20 03:11:13.134079+00', '2026-06-28 02:50:43.072618+00');
INSERT INTO "public"."iam_perm_menu" VALUES (30103, 305, 'iam:role', 'admin', 'SystemRole', 'menu.system.perm.role', 'lucide:shield-user', 'f', 'f', '/iam/perm/role/RoleList', '/iam/perm/role', NULL, 3, 'f', 't', 'f', 0, 1, 2, 'f', 'menu', NULL, NULL, NULL, NULL, '', '', '2026-03-20 03:11:13.134079+00', '2026-06-25 02:00:30.246504+00');
INSERT INTO "public"."iam_perm_menu" VALUES (30701, 307, 'iam:online', 'admin', 'OnlineUser', 'menu.system.monitor.online', 'lucide:users', 'f', 'f', '/system/monitor/online/OnlineUserList', '/system/monitor/online', NULL, 1, 'f', 't', 'f', 1, 1, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-04-11 16:00:00+00', '2026-04-11 16:00:00+00');
INSERT INTO "public"."iam_perm_menu" VALUES (6, NULL, 'trade', 'admin', 'TransactionManagement', 'menu.trade', 'lucide:arrow-left-right', 'f', 'f', NULL, '/trade', '/trade/pay-trade', 4, 'f', 't', 'f', 1, 1, 0, 'f', 'catalog', NULL, NULL, NULL, NULL, NULL, NULL, '2026-05-24 16:00:00+00', '2026-07-17 06:18:15.479497+00');
INSERT INTO "public"."iam_perm_menu" VALUES (40401, 404, 'merchant:info', 'admin', 'MerchantInfo', 'menu.payment.merchant.list', 'lucide:shopping-bag', 'f', 'f', '/payment/merchant/info/MerchantList', '/payment/merchant/info', NULL, 1, 'f', 't', 'f', 1, 1, 1, 'f', 'menu', NULL, NULL, NULL, NULL, '', '', '2026-04-13 16:00:00+00', '2026-06-25 02:00:30.290399+00');
INSERT INTO "public"."iam_perm_menu" VALUES (30402, 304, 'system:platform-config', 'admin', 'PlatformConfig', 'menu.system.config.platform', 'lucide:settings', 'f', 'f', '/system/config/platform/PlatformConfig', '/system/config/platform', NULL, 1, 'f', 't', 'f', 1, 1, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-04-07 16:00:00+00', '2026-07-13 13:17:21.921261+00');
INSERT INTO "public"."iam_perm_menu" VALUES (40104, 401, 'payment:platform:capability', 'admin', 'PayCapabilityList', 'menu.payment.platform.capability', 'lucide:zap', 'f', 'f', '/payment/masterdata/capability/PayCapabilityList', '/payment/platform/pay-capability', NULL, 3, 'f', 't', 'f', 1, 1, 4, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-05-26 16:00:00+00', '2026-05-28 06:43:27.505831+00');
INSERT INTO "public"."iam_perm_menu" VALUES (4040102, 4040130, 'merchant:credential', 'admin', 'MerchantCredentialConfig', 'menu.payment.merchant.credential', NULL, 't', 'f', '/payment/merchant/manage/credential/MerchantCredentialConfig', '/payment/merchant/manage/credential', NULL, 3, 'f', 't', 'f', 1, 1, 0, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, '2026-05-01 16:00:00+00', '2026-07-13 10:13:20.809377+00');
INSERT INTO "public"."iam_perm_menu" VALUES (404, NULL, 'merchant', 'admin', 'PaymentMerchant', 'menu.merchant', 'lucide:store', 'f', 'f', NULL, '/payment/merchant', NULL, 3.5, 't', 't', 'f', 0, NULL, 0, 'f', 'catalog', NULL, NULL, NULL, NULL, NULL, NULL, '2026-04-05 16:00:00+00', '2026-07-13 13:12:49.514288+00');
INSERT INTO "public"."iam_perm_menu" VALUES (601, 610, 'trade:order', 'admin', 'NormalOrderList', 'menu.trade.normalPay', 'lucide:credit-card', 'f', 'f', '/payment/order/NormalOrderList', '/trade/pay-order/normal', NULL, 1, 'f', 'f', 'f', 1, 1, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-05-24 16:00:00+00', '2026-07-17 06:18:15.466267+00');
INSERT INTO "public"."iam_perm_menu" VALUES (4040111, 4040130, 'merchant:app:route', 'admin', 'PayRouteConfig', 'menu.payment.merchant.payRoute', NULL, 't', 'f', '/payment/route/PayRouteConfig', '/payment/route', NULL, 2, 'f', 't', 'f', 1, 1, 1, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, '2026-05-24 22:23:46.483985+00', '2026-07-22 13:50:46.613056+00');
INSERT INTO "public"."iam_perm_menu" VALUES (40101, 401, 'payment:platform:product', 'admin', 'ProductList', 'menu.payment.platform.product', 'lucide:package', 'f', 'f', '/payment/masterdata/product/PayProductList', '/payment/platform/product', NULL, 2, 'f', 't', 'f', 1, 1, 3, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-04-23 16:00:00+00', '2026-05-28 06:25:42.892396+00');
INSERT INTO "public"."iam_perm_menu" VALUES (4040109, 4040131, 'channel:merchant:create', 'admin', 'ChannelMerchantCreate', 'menu.payment.merchant.channelMerchant.create', NULL, 't', 'f', '/payment/global/channel-merchant/ChannelMerchantCreate', '/payment/global/channel-merchant/create', NULL, 9, 'f', 't', 'f', 1, 1, 0, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, '2026-05-05 16:00:00+00', '2026-07-22 13:50:46.619325+00');
INSERT INTO "public"."iam_perm_menu" VALUES (4040101, 4040130, 'merchant:workbench', 'admin', 'MerchantManage', 'menu.payment.merchant.workbench', '', 't', 'f', '/payment/merchant/manage/workbench/MerchantManage', '/payment/merchant/manage', NULL, 2, 'f', 't', 'f', 1, 1, 0, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, '2026-04-13 16:00:00+00', '2026-07-11 03:37:15.424776+00');
INSERT INTO "public"."iam_perm_menu" VALUES (4040112, 4040131, 'channel:merchant:detail', 'admin', 'ChannelMerchantDetailDispatch', 'menu.payment.merchant.channelMerchant.detail', NULL, 't', 'f', '/payment/global/channel-merchant/detail/ChannelMerchantDetailDispatch', '/payment/global/channel-merchant/detail', NULL, 10, 'f', 't', 'f', 1, 1, 0, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, '2026-06-07 19:48:34.936565+00', '2026-07-22 13:50:46.623111+00');
INSERT INTO "public"."iam_perm_menu" VALUES (40103, 401, 'payment:platform:pay-channel', 'admin', 'PayChannelList', 'menu.payment.platform.channel', 'lucide:radio-tower', 'f', 'f', '/payment/masterdata/channel/PayChannelList', '/payment/platform/pay-channel', NULL, 0, 'f', 't', 'f', 1, 1, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-05-28 16:00:00+00', '2026-06-27 13:01:24.315365+00');
INSERT INTO "public"."iam_perm_menu" VALUES (40102, 401, 'payment:platform:pay-method', 'admin', 'PayProviderList', 'menu.payment.platform.provider', 'lucide:list-tree', 'f', 'f', '/payment/masterdata/provider/PayMethodList', '/payment/platform/pay-method', NULL, 1, 'f', 't', 'f', 1, 1, 5, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-05-27 20:18:01.383008+00', '2026-05-30 08:21:19.464024+00');
INSERT INTO "public"."iam_perm_menu" VALUES (4040114, 4040132, 'channel:app', 'admin', 'AlipayMchAppManage', 'menu.payment.merchant.channelMerchant.alipayApp', NULL, 't', 'f', '/payment/channel/alipay/manage/mch/app/AlipayMchAppManage', '/payment/global/channel-merchant/alipay-app-manage', NULL, 12, 'f', 't', 'f', 1, 1, 0, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, '2026-06-11 22:28:11.274785+00', '2026-07-22 13:50:46.635605+00');
INSERT INTO "public"."iam_perm_menu" VALUES (4040108, 4040130, 'merchant:user', 'admin', 'MerchantUser', 'menu.payment.merchant.user', '', 't', 'f', '/payment/merchant/user/MerchantUserList', '/payment/merchant/user', NULL, 8, 'f', 't', 'f', 1, 1, 0, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, '2026-05-04 16:00:00+00', '2026-07-11 03:37:15.424776+00');
INSERT INTO "public"."iam_perm_menu" VALUES (4040110, 4040130, 'merchant:app', 'admin', 'MchAppInfoList', 'menu.payment.merchant.app', NULL, 't', 'f', '/payment/merchant/app/MchAppInfoList', '/payment/merchant/app', NULL, 10, 'f', 't', 'f', 1, 1, 1, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, '2026-05-24 16:00:00+00', '2026-07-11 03:37:15.424776+00');
INSERT INTO "public"."iam_perm_menu" VALUES (4040117, 4040130, 'merchant:store', 'admin', 'MchStoreInfoList', 'menu.payment.merchant.store', NULL, 't', 'f', '/payment/merchant/store/MchStoreInfoList', '/payment/merchant/store', NULL, 15, 'f', 't', 'f', 1, 1, 0, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, '2026-06-24 16:00:00+00', '2026-07-11 03:37:15.424776+00');
INSERT INTO "public"."iam_perm_menu" VALUES (602, 6, 'trade:fund', 'admin', 'PayTradeList', 'menu.trade.payTrade', 'lucide:arrow-left-right', 'f', 'f', '/payment/order/PayTradeList', '/trade/pay-trade', NULL, 1, 'f', 't', 'f', NULL, NULL, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-01 15:09:04.769906+00', '2026-07-17 06:18:15.474015+00');
INSERT INTO "public"."iam_perm_menu" VALUES (8, NULL, 'develop', 'admin', 'Develop', 'menu.develop', 'lucide:wrench', 'f', 'f', NULL, '/develop', NULL, 5, 'f', 't', 'f', 1, 1, 0, 'f', 'catalog', NULL, NULL, NULL, NULL, NULL, NULL, '2026-06-23 16:00:00+00', '2026-06-23 16:00:00+00');
INSERT INTO "public"."iam_perm_menu" VALUES (204, 2, 'demos:artemis', 'admin', 'ArtemisDemo', 'menu.demos.artemis', 'lucide:send', 'f', 'f', '/demos/artemis/ArtemisDemo', '/demos/artemis', NULL, 4, 'f', 't', 'f', 0, NULL, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-06-18 00:00:00+00', '2026-06-18 00:00:00+00');
INSERT INTO "public"."iam_perm_menu" VALUES (206, 2, 'demos:callback', 'admin', 'CallbackDemo', 'menu.demos.callback', 'lucide:webhook', 'f', 'f', '/demos/callback/CallbackDemo', '/demos/callback', NULL, 5, 'f', 't', 'f', 0, NULL, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-08-01 16:00:00+00', '2026-08-01 16:00:00+00');
INSERT INTO "public"."iam_perm_menu" VALUES (900001, 304, 'iam:social', 'admin', 'ThirdPlatform', 'menu.system.config.thirdPlatform', 'lucide:share-2', 'f', 'f', '/system/config/third-platform/ThirdPlatform', '/system/config/third-platform', NULL, 5, 'f', 't', 'f', 1, 1, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-13 02:15:41.505142+00');
INSERT INTO "public"."iam_perm_menu" VALUES (4040103, 4040130, 'merchant:profile', 'admin', 'MchInfoManage', 'menu.payment.merchant.profile', NULL, 't', 'f', '/payment/merchant/manage/info/MchInfoManage', '/payment/merchant/manage/info', NULL, 1, 'f', 't', 'f', 1, 1, 0, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-11 03:37:15.424776+00');
INSERT INTO "public"."iam_perm_menu" VALUES (801, 8, 'develop:trade', 'admin', 'DevelopTrade', 'menu.develop.trade', 'lucide:credit-card', 'f', 'f', '/payment/develop/trade/DevelopTrade', '/develop/trade', NULL, 1, 'f', 't', 'f', 1, 1, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-06-23 16:00:00+00', '2026-06-23 16:00:00+00');
INSERT INTO "public"."iam_perm_menu" VALUES (405, 4, 'payment:config', 'admin', 'PaymentConfig', 'menu.payment.config', 'lucide:settings-2', 'f', 'f', NULL, '/payment/config', NULL, 50, 'f', 't', 'f', 1, 1, 0, 'f', 'catalog', NULL, NULL, NULL, NULL, NULL, NULL, '2026-06-14 00:00:00+00', '2026-07-31 03:18:17.016499+00');
INSERT INTO "public"."iam_perm_menu" VALUES (40105, 4, 'payment:config:product-config', 'admin', 'ProductConfig', 'menu.payment.config.productConfig', 'lucide:layout-grid', 'f', 'f', '/payment/config/product/ProductConfig', '/payment/config/product', NULL, 20, 'f', 't', 'f', 1, 1, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-06-13 00:00:00+00', '2026-07-31 03:18:17.022986+00');
INSERT INTO "public"."iam_perm_menu" VALUES (901, 4, 'device:qrcode', 'admin', 'DeviceQrCode', 'menu.device.qrcode', 'lucide:qr-code', 'f', 'f', '/payment/device/qrcode/DeviceQrCode', '/device/qrcode', NULL, 40, 'f', 't', 'f', 1, 1, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-06-25 01:21:34.634639+00', '2026-07-31 03:18:17.02516+00');
INSERT INTO "public"."iam_perm_menu" VALUES (4040116, 401, 'payment:platform:provider', 'admin', 'PayProviderManage', 'menu.payment.platform.provider.manage', 'lucide:wallet', 'f', 'f', '/payment/masterdata/provider/PayProviderList', '/payment/platform/pay-provider', NULL, 0.5, 'f', 't', 'f', 1, 1, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-06-17 10:00:31.640482+00', '2026-06-27 13:01:24.318649+00');
INSERT INTO "public"."iam_perm_menu" VALUES (603, 6, 'trade:refund', 'admin', 'RefundOrderList', 'menu.trade.refundOrder', 'lucide:rotate-ccw', 'f', 'f', '/payment/order/RefundOrderList', '/trade/refund-order', NULL, 2, 'f', 't', 'f', 1, 1, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-03 16:00:00+00', '2026-07-17 06:18:15.476169+00');
INSERT INTO "public"."iam_perm_menu" VALUES (309, 308, 'system:notify:notice', 'admin', 'SystemNotify', 'menu.system.notify.notice', 'lucide:megaphone', 'f', 'f', '/system/notify/notice/NoticeList', '/system/notify/notice', NULL, 20, 'f', 't', 'f', 1, 1, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, '2026-06-24 16:00:00+00', '2026-06-24 16:00:00+00', NULL);
INSERT INTO "public"."iam_perm_menu" VALUES (308, 3, 'system:notify', 'admin', 'SystemNotice', 'menu.system.notify', 'lucide:bell', 'f', 'f', NULL, '/system/notify', '/system/notify/notice', 20, 'f', 't', 'f', 1, 1, 0, 'f', 'catalog', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-01 07:16:30.927645+00', '2026-07-01 07:16:30.927645+00');
INSERT INTO "public"."iam_perm_menu" VALUES (40502, 40508, 'payment:isv', 'admin', 'AlipayIsvAppManage', 'menu.payment.config.alipayApp', NULL, 't', 'f', '/payment/channel/alipay/manage/app/AlipayIsvAppManage', '/payment/config/product/app-manage', NULL, 3, 'f', 't', 'f', 1, 1, 0, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, '2026-06-14 00:00:00+00', '2026-07-11 03:37:15.43231+00');
INSERT INTO "public"."iam_perm_menu" VALUES (4040106, 4040131, 'channel:merchant', 'admin', 'ChannelMerchant', 'menu.payment.merchant.channelMerchant', NULL, 't', 'f', '/payment/global/channel-merchant/ChannelMerchantList', '/payment/global/channel-merchant', NULL, 6, 'f', 't', 'f', 1, 1, 0, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, '2026-05-03 16:00:00+00', '2026-07-22 13:50:46.61698+00');
INSERT INTO "public"."iam_perm_menu" VALUES (30403, 301, 'system:protocol', 'admin', 'UserProtocol', 'menu.system.basic.protocol', 'lucide:file-text', 'f', 'f', '/system/basic/protocol/UserProtocolList', '/system/basic/protocol', NULL, 2, 'f', 't', 'f', 1, 1, 1, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-06-24 10:32:13.183371+00', '2026-07-16 08:43:35.038937+00');
INSERT INTO "public"."iam_perm_menu" VALUES (802, 8, 'develop:sign', 'admin', 'DevelopSign', 'menu.develop.sign', 'lucide:pen-tool', 'f', 'f', '/payment/develop/sign/DevelopSign', '/develop/sign', NULL, 3, 'f', 't', 'f', 1, 1, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-06-23 16:00:00+00', '2026-06-23 16:00:00+00');
INSERT INTO "public"."iam_perm_menu" VALUES (310, 308, 'system:notify:wechat-config', 'admin', 'WechatNotify', 'menu.system.notify.wechatConfig', 'lucide:message-circle', 'f', 'f', '/system/notify/wechat/index', '/system/notify/wechat', NULL, 30, 'f', 't', 'f', 1, 1, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-09 00:00:00+00', '2026-07-09 00:00:00+00');
INSERT INTO "public"."iam_perm_menu" VALUES (40504, 405, 'payment:config:mobile-app', 'admin', 'MobileAppConfig', 'menu.payment.config.mobileApp', 'lucide:smartphone', 'f', 'f', '/payment/config/mobile-app/MobileAppConfig', '/payment/config/mobile-app', NULL, 10, 'f', 't', 'f', 1, 1, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-05 00:00:00+00', '2026-07-31 03:18:17.013352+00');
INSERT INTO "public"."iam_perm_menu" VALUES (4040130, 40401, NULL, 'admin', 'MchManageGroup', 'menu.payment.merchant.group.manage', 'lucide:settings-2', 't', 'f', NULL, NULL, NULL, 1, 'f', 'f', 'f', 1, 1, 0, 'f', 'subpage_group', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-11 03:37:15.421585+00', '2026-07-11 03:37:15.421585+00');
INSERT INTO "public"."iam_perm_menu" VALUES (4040131, 40401, NULL, 'admin', 'ChannelMerchantGroup', 'menu.payment.merchant.group.channelMerchant', 'lucide:repeat', 't', 'f', NULL, NULL, NULL, 2, 'f', 'f', 'f', 1, 1, 0, 'f', 'subpage_group', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-11 03:37:15.421585+00', '2026-07-11 03:37:15.421585+00');
INSERT INTO "public"."iam_perm_menu" VALUES (3040101, 30401, 'system:security-config:system', 'admin', 'SystemSecurityConfig', 'menu.system.security.system', 'lucide:lock', 'f', 'f', '/system/config/security/SystemSecurityConfig', '/system/config/security/system', NULL, 1, 'f', 't', 'f', 1, 1, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-16 07:31:19.446929+00', '2026-07-16 07:31:19.446929+00');
INSERT INTO "public"."iam_perm_menu" VALUES (4040120, 4040130, 'merchant:wx-verify', 'admin', 'MchWxDomainVerifyList', 'menu.payment.merchant.wxVerify', NULL, 't', 'f', '/payment/merchant/manage/wx-verify/MchWxDomainVerifyList', '/payment/merchant/manage/wx-verify', NULL, 20, 'f', 't', 'f', 1, 1, 0, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-09 16:00:00+00', '2026-07-11 03:37:15.424776+00');
INSERT INTO "public"."iam_perm_menu" VALUES (40501, 40105, 'payment:config:product-detail', 'admin', 'ProductDetailDispatch', 'menu.payment.config.detail', NULL, 't', 'f', '/payment/config/product/detail/ProductDetailDispatch', '/payment/product-detail', NULL, 2, 'f', 't', 'f', 1, 1, 0, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, '2026-06-14 00:00:00+00', '2026-06-27 13:01:24.321883+00');
INSERT INTO "public"."iam_perm_menu" VALUES (3040102, 30401, 'system:security-config:pay', 'admin', 'PaySecurityConfig', 'menu.system.security.pay', 'lucide:shield-alert', 'f', 'f', '/system/config/security/PaySecurityConfig', '/system/config/security/pay', NULL, 2, 'f', 't', 'f', 1, 1, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-16 07:31:19.449836+00', '2026-07-16 07:31:19.449836+00');
INSERT INTO "public"."iam_perm_menu" VALUES (40507, 405, 'payment:config:wx-verify', 'admin', 'PlatformWxDomainVerifyList', 'menu.payment.config.wxVerify', 'lucide:shield-check', 'f', 'f', '/payment/config/wx-verify/PlatformWxDomainVerifyList', '/payment/config/wx-verify', NULL, 20, 'f', 't', 'f', 1, 1, 1, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-09 16:00:00+00', '2026-07-31 03:18:17.018417+00');
INSERT INTO "public"."iam_perm_menu" VALUES (803, 8, 'develop:auth', 'admin', 'ChannelAuth', 'menu.develop.auth', 'lucide:shield-check', 'f', 'f', '/payment/develop/auth/ChannelAuth', '/develop/auth', NULL, 4, 'f', 't', 'f', 1, 1, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-09 16:00:00+00', '2026-07-09 16:00:00+00');
INSERT INTO "public"."iam_perm_menu" VALUES (4040123, 4040130, 'merchant:app:workbench', 'admin', 'MchAppWorkbench', 'menu.payment.merchant.appWorkbench', NULL, 't', 'f', '/payment/merchant/app/MchAppWorkbench', '/payment/merchant/app/manage', NULL, 11, 'f', 't', 'f', 1, 1, 1, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-11 08:00:00+00', '2026-07-11 08:00:00+00');
INSERT INTO "public"."iam_perm_menu" VALUES (40506, 40508, 'payment:isv', 'admin', 'LakalaManage', 'menu.payment.lakala.config', NULL, 't', 'f', '/payment/channel/lakala/manage/LakalaManage', '/payment/config/product/lakala-manage', NULL, 5, 'f', 't', 'f', 1, 1, 0, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-05 00:00:00+00', '2026-07-11 03:37:15.43231+00');
INSERT INTO "public"."iam_perm_menu" VALUES (4040132, 40401, NULL, 'admin', 'ChannelAppGroup', 'menu.payment.merchant.group.channelApp', 'lucide:layout-grid', 't', 'f', NULL, NULL, NULL, 3, 'f', 'f', 'f', 1, 1, 0, 'f', 'subpage_group', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-11 03:37:15.421585+00', '2026-07-13 10:13:20.804554+00');
INSERT INTO "public"."iam_perm_menu" VALUES (40508, 40105, NULL, 'admin', 'ChannelIsvConfigGroup', 'menu.payment.config.group.channelIsv', 'lucide:server', 't', 'f', NULL, NULL, NULL, 1, 'f', 'f', 'f', 1, 1, 0, 'f', 'subpage_group', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-11 03:37:15.421585+00', '2026-07-13 10:13:20.806797+00');
INSERT INTO "public"."iam_perm_menu" VALUES (4040122, 4040130, 'merchant:gateway-cashier', 'admin', 'CashierConfig', 'menu.payment.merchant.cashierConfig', NULL, 't', 'f', '/payment/merchant/cashier/CashierConfig', '/payment/merchant/cashier', NULL, 5, 'f', 't', 'f', 1, 1, 1, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-11 03:00:13.374496+00', '2026-07-15 09:03:23.614722+00');
INSERT INTO "public"."iam_perm_menu" VALUES (4040124, 4040130, 'merchant:easypay', 'admin', 'EasyPayConfig', 'menu.payment.merchant.easypay', NULL, 't', 'f', '/payment/merchant/easypay/EasyPayConfig', '/payment/merchant/easypay', NULL, 6, 'f', 't', 'f', 1, 1, 1, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-15 00:00:00+00', '2026-07-15 09:03:23.618+00');
INSERT INTO "public"."iam_perm_menu" VALUES (40601, 406, 'payment:risk:blacklist', 'admin', 'PayBlacklistList', 'menu.payment.risk.blacklist', 'lucide:ban', 'f', 'f', '/payment/risk/blacklist/PayBlacklistList', '/payment/risk/blacklist', NULL, 1, 'f', 't', 'f', 1, 1, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-15 00:00:00+00', '2026-07-15 00:00:00+00');
INSERT INTO "public"."iam_perm_menu" VALUES (40602, 406, 'payment:risk:hit', 'admin', 'PayRiskHitList', 'menu.payment.risk.hit', 'lucide:triangle-alert', 'f', 'f', '/payment/risk/hit/PayRiskHitList', '/payment/risk/hit', NULL, 2, 'f', 't', 'f', 1, 1, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-15 00:00:00+00', '2026-07-15 00:00:00+00');
INSERT INTO "public"."iam_perm_menu" VALUES (311, 3, 'system:sensitive', 'admin', 'SensitiveWord', 'menu.system.sensitive', 'lucide:shield-ban', 'f', 'f', NULL, '/system/sensitive', NULL, 15, 'f', 't', 'f', 1, 1, 0, 'f', 'catalog', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-16 00:40:06.501938+00', '2026-07-16 00:40:06.501938+00');
INSERT INTO "public"."iam_perm_menu" VALUES (31101, 311, 'system:sensitive-word', 'admin', 'SensitiveWordList', 'menu.system.sensitive.word', 'lucide:book-x', 'f', 'f', '/system/sensitive-word/SensitiveWordList', '/system/sensitive/word', NULL, 1, 'f', 't', 'f', 1, 1, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-16 00:40:06.511319+00', '2026-07-16 00:40:06.511319+00');
INSERT INTO "public"."iam_perm_menu" VALUES (31102, 311, 'system:sensitive-word-hit', 'admin', 'SensitiveWordHitList', 'menu.system.sensitive.hit', 'lucide:scan-search', 'f', 'f', '/system/sensitive-word/SensitiveWordHitList', '/system/sensitive/hit', NULL, 2, 'f', 't', 'f', 1, 1, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-16 00:40:06.51532+00', '2026-07-16 00:40:06.51532+00');
INSERT INTO "public"."iam_perm_menu" VALUES (406, 4, 'payment:risk', 'admin', 'PaymentRisk', 'menu.payment.risk', 'lucide:shield-alert', 'f', 'f', NULL, '/payment/risk', NULL, 60, 'f', 't', 'f', 0, 1, 0, 'f', 'catalog', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-15 00:00:00+00', '2026-07-31 03:18:17.027286+00');
INSERT INTO "public"."iam_perm_menu" VALUES (40505, 40504, 'payment:config:mobile-app-detail', 'admin', 'MobileAppDetail', 'menu.payment.config.mobileAppDetail', NULL, 't', 'f', '/payment/config/mobile-app/detail/MobileAppDetail', '/payment/config/mobile-app/detail/:appType', NULL, 1, 'f', 't', 'f', 1, 1, 0, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-05 00:00:00+00', '2026-07-22 13:50:46.655058+00');
INSERT INTO "public"."iam_perm_menu" VALUES (804, 8, 'develop:gateway', 'admin', 'DevelopGateway', 'menu.develop.gateway', 'lucide:globe', 'f', 'f', '/payment/develop/gateway/DevelopGateway', '/develop/gateway', NULL, 2, 'f', 't', 'f', 1, 1, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-16 16:00:00+00', '2026-07-16 16:00:00+00');
INSERT INTO "public"."iam_perm_menu" VALUES (610, 6, 'trade:pay-order', 'admin', 'PayOrderCatalog', 'menu.trade.payOrder', 'lucide:receipt', 'f', 'f', NULL, '/trade/pay-order', '/trade/pay-order/normal', 3, 'f', 't', 'f', 1, 1, 0, 'f', 'catalog', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-17 06:18:15.454191+00', '2026-07-17 06:18:15.463823+00');
INSERT INTO "public"."iam_perm_menu" VALUES (604, 610, 'trade:gateway-order', 'admin', 'GatewayOrderList', 'menu.trade.gatewayOrder', 'lucide:store', 'f', 'f', '/payment/order/GatewayOrderList', '/trade/pay-order/gateway', NULL, 2, 'f', 't', 'f', 1, 1, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-17 06:18:15.468829+00', '2026-07-17 06:18:15.47158+00');
INSERT INTO "public"."iam_perm_menu" VALUES (30203, 302, 'system:log:unipay', 'admin', 'SystemUnipayApiLog', 'menu.system.log.unipay', 'lucide:webhook', 'f', 'f', '/system/log/unipay/UnipayApiLogList', '/system/log/unipay', NULL, 3, 'f', 't', 'f', 0, 1, 1, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-17 00:00:00+00', '2026-07-17 00:00:00+00');
INSERT INTO "public"."iam_perm_menu" VALUES (91200, NULL, 'trade:record', 'merchant', 'TradeRecordCatalog', 'menu.trade.record', 'lucide:scroll-text', 'f', 'f', NULL, '/trade/record', '/trade/record/mch-notice', 4, 'f', 't', 'f', 0, NULL, 0, 'f', 'catalog', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-23 09:32:12.651967+00', '2026-07-23 09:32:12.651967+00');
INSERT INTO "public"."iam_perm_menu" VALUES (91101, 91100, 'trade:fund', 'merchant', 'PayTradeList', 'menu.trade.payTrade', 'lucide:arrow-left-right', 'f', 'f', '/payment/order/PayTradeList', '/trade/pay-trade', NULL, 1, 'f', 't', 'f', 1, 1, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-23 03:48:14.896997+00', '2026-07-23 06:44:16.735074+00');
INSERT INTO "public"."iam_perm_menu" VALUES (91103, 91100, 'trade:refund', 'merchant', 'RefundOrderList', 'menu.trade.refundOrder', 'lucide:rotate-ccw', 'f', 'f', '/payment/order/RefundOrderList', '/trade/refund-order', NULL, 2, 'f', 't', 'f', 1, 1, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-23 03:48:14.903907+00', '2026-07-23 06:44:16.737803+00');
INSERT INTO "public"."iam_perm_menu" VALUES (607, NULL, 'trade:record', 'admin', 'TradeRecordCatalog', 'menu.trade.record', 'lucide:scroll-text', 'f', 'f', NULL, '/trade/record', '/trade/record/mch-notice', 4.5, 'f', 't', 'f', 1, 1, 0, 'f', 'catalog', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-21 06:30:00+00', '2026-07-21 06:45:00+00');
INSERT INTO "public"."iam_perm_menu" VALUES (605, 607, 'trade:mch-notice', 'admin', 'MchNoticeTaskList', 'menu.trade.mchNotice', 'lucide:bell-ring', 'f', 'f', '/payment/notice/MchNoticeTaskList', '/trade/record/mch-notice', NULL, 1, 'f', 't', 'f', 1, 1, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-21 03:00:00+00', '2026-07-21 06:30:00+00');
INSERT INTO "public"."iam_perm_menu" VALUES (606, 607, 'trade:callback-record', 'admin', 'PayCallbackRecordList', 'menu.trade.callbackRecord', 'lucide:inbox', 'f', 'f', '/payment/record/PayCallbackRecordList', '/trade/record/callback-record', NULL, 2, 'f', 't', 'f', 1, 1, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-21 06:00:00+00', '2026-07-21 06:30:00+00');
INSERT INTO "public"."iam_perm_menu" VALUES (905, 4040130, 'merchant:terminal', 'admin', 'SystemTerminalList', 'menu.payment.merchant.terminal', NULL, 't', 'f', '/payment/device/terminal/system/SystemTerminalList', '/payment/device/terminal/system', NULL, 16, 'f', 't', 'f', 1, 1, 0, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-17 00:00:00+00', '2026-07-22 13:50:46.597022+00');
INSERT INTO "public"."iam_perm_menu" VALUES (40402, 404, 'channel:merchant', 'admin', 'ChannelMerchantGlobal', 'menu.payment.merchant.channelMerchant.global', 'lucide:repeat', 'f', 'f', '/payment/global/channel-merchant-global/ChannelMerchantGlobalList', '/payment/global/channel-merchants', NULL, 2, 'f', 't', 'f', 1, 1, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-13 13:12:31.180398+00', '2026-07-22 13:50:46.629357+00');
INSERT INTO "public"."iam_perm_menu" VALUES (91001, NULL, NULL, 'merchant', 'Dashboard', 'menu.dashboard', 'lucide:layout-dashboard', 'f', 'f', NULL, '/dashboard', '/workspace', -1, 'f', 'f', 'f', 0, NULL, 0, 'f', 'catalog', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-23 02:30:21.982361+00', '2026-07-23 02:30:21.982361+00');
INSERT INTO "public"."iam_perm_menu" VALUES (91002, 91001, 'dashboard:workspace', 'merchant', 'Workspace', 'menu.dashboard.workspace', 'lucide:panels-top-left', 'f', 'f', '/dashboard/workspace/index', '/workspace', NULL, 1, 'f', 'f', 't', 0, 1, 1, 'f', 'menu', NULL, NULL, NULL, NULL, '', '', '2026-07-23 02:30:21.991345+00', '2026-07-23 02:30:21.991345+00');
INSERT INTO "public"."iam_perm_menu" VALUES (91003, 91001, 'dashboard:analytics', 'merchant', 'Analytics', 'menu.dashboard.analytics', 'lucide:area-chart', 'f', 'f', '/dashboard/analytics/index', '/analytics', NULL, 2, 'f', 'f', 'f', 0, 1, 1, 'f', 'menu', NULL, NULL, NULL, NULL, '', '', '2026-07-23 02:30:21.994392+00', '2026-07-23 02:30:21.994392+00');
INSERT INTO "public"."iam_perm_menu" VALUES (91104, 91100, 'trade:pay-order', 'merchant', 'PayOrderCatalog', 'menu.trade.payOrder', 'lucide:receipt', 'f', 'f', NULL, '/trade/pay-order', '/trade/pay-order/normal', 3, 'f', 't', 'f', 1, 1, 0, 't', 'catalog', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-23 06:33:41.347277+00', '2026-07-23 14:54:00.459736+00');
INSERT INTO "public"."iam_perm_menu" VALUES (91102, 91104, 'trade:order', 'merchant', 'NormalOrderList', 'menu.trade.normalPay', 'lucide:credit-card', 'f', 'f', '/payment/order/NormalOrderList', '/trade/pay-order/normal', NULL, 1, 'f', 't', 'f', 1, 1, 0, 't', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-23 03:48:14.901128+00', '2026-07-23 14:54:00.459736+00');
INSERT INTO "public"."iam_perm_menu" VALUES (91105, 91104, 'trade:gateway-order', 'merchant', 'GatewayOrderList', 'menu.trade.gatewayOrder', 'lucide:store', 'f', 'f', '/payment/order/GatewayOrderList', '/trade/pay-order/gateway', NULL, 2, 'f', 't', 'f', 1, 1, 0, 't', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-23 06:33:41.366052+00', '2026-07-23 14:54:00.459736+00');
INSERT INTO "public"."iam_perm_menu" VALUES (91110, 91100, 'trade:pay-order', 'merchant', 'PayOrderCatalog', 'menu.trade.payOrder', 'lucide:receipt', 'f', 'f', NULL, '/trade/pay-order', '/trade/pay-order/normal', 3, 'f', 't', 'f', 0, NULL, 0, 'f', 'catalog', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-23 09:32:12.651967+00', '2026-07-23 09:32:12.651967+00');
INSERT INTO "public"."iam_perm_menu" VALUES (91111, 91110, 'trade:order', 'merchant', 'NormalOrderList', 'menu.trade.normalPay', 'lucide:file-text', 'f', 'f', '/payment/order/NormalOrderList', '/trade/pay-order/normal', NULL, 1, 'f', 'f', 'f', 0, 1, 1, 'f', 'menu', NULL, NULL, NULL, NULL, '', '', '2026-07-23 09:32:12.645988+00', '2026-07-23 09:32:12.645988+00');
INSERT INTO "public"."iam_perm_menu" VALUES (91112, 91110, 'trade:gateway-order', 'merchant', 'GatewayOrderList', 'menu.trade.gatewayOrder', 'lucide:globe', 'f', 'f', '/payment/order/GatewayOrderList', '/trade/pay-order/gateway', NULL, 2, 'f', 'f', 'f', 0, 1, 1, 'f', 'menu', NULL, NULL, NULL, NULL, '', '', '2026-07-23 09:32:12.648789+00', '2026-07-23 09:32:12.648789+00');
INSERT INTO "public"."iam_perm_menu" VALUES (91106, NULL, 'trade:record', 'merchant', 'TradeRecordCatalog', 'menu.trade.record', 'lucide:scroll-text', 'f', 'f', NULL, '/trade/record', '/trade/record/mch-notice', 4.5, 'f', 't', 'f', 1, 1, 0, 't', 'catalog', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-23 06:33:41.369341+00', '2026-07-23 14:54:00.459736+00');
INSERT INTO "public"."iam_perm_menu" VALUES (91107, 91106, 'trade:mch-notice', 'merchant', 'MchNoticeTaskList', 'menu.trade.mchNotice', 'lucide:bell-ring', 'f', 'f', '/payment/notice/MchNoticeTaskList', '/trade/record/mch-notice', NULL, 1, 'f', 't', 'f', 1, 1, 0, 't', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-23 06:33:41.372431+00', '2026-07-23 14:54:00.459736+00');
INSERT INTO "public"."iam_perm_menu" VALUES (91108, 91106, 'trade:callback-record', 'merchant', 'PayCallbackRecordList', 'menu.trade.callbackRecord', 'lucide:inbox', 'f', 'f', '/payment/record/PayCallbackRecordList', '/trade/record/callback-record', NULL, 2, 'f', 't', 'f', 1, 1, 0, 't', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-23 06:33:41.375612+00', '2026-07-23 14:54:00.459736+00');
INSERT INTO "public"."iam_perm_menu" VALUES (91100, NULL, 'trade', 'merchant', 'TransactionManagement', 'menu.trade', 'lucide:arrow-left-right', 'f', 'f', NULL, '/trade', '/trade/pay-trade', 3, 'f', 't', 'f', 1, 1, 0, 'f', 'catalog', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-23 03:48:14.886531+00', '2026-07-23 06:44:16.725707+00');
INSERT INTO "public"."iam_perm_menu" VALUES (91201, 91200, 'trade:mch-notice', 'merchant', 'MchNoticeTaskList', 'menu.trade.mchNotice', 'lucide:bell-ring', 'f', 'f', '/payment/notice/MchNoticeTaskList', '/trade/record/mch-notice', NULL, 1, 'f', 'f', 'f', 0, 1, 1, 'f', 'menu', NULL, NULL, NULL, NULL, '', '', '2026-07-23 09:32:12.655107+00', '2026-07-23 09:32:12.655107+00');
INSERT INTO "public"."iam_perm_menu" VALUES (91301, 91300, 'merchant:profile', 'merchant', 'MchInfoManage', 'menu.payment.merchant.profile', 'lucide:badge-info', 'f', 'f', '/payment/merchant/info/MchInfoManage', '/mch/info', NULL, 1, 'f', 'f', 'f', 0, 1, 1, 'f', 'menu', NULL, NULL, NULL, NULL, '', '', '2026-07-23 09:32:12.665593+00', '2026-07-23 09:32:12.665593+00');
INSERT INTO "public"."iam_perm_menu" VALUES (91302, 91300, 'merchant:user', 'merchant', 'MerchantUserList', 'menu.payment.merchant.user', 'lucide:users', 'f', 'f', '/payment/merchant/user/MerchantUserList', '/mch/user', NULL, 2, 'f', 'f', 'f', 0, 1, 1, 'f', 'menu', NULL, NULL, NULL, NULL, '', '', '2026-07-23 09:32:12.669009+00', '2026-07-23 09:32:12.669009+00');
INSERT INTO "public"."iam_perm_menu" VALUES (91303, 91300, 'merchant:store', 'merchant', 'MchStoreInfoList', 'menu.payment.merchant.store', 'lucide:store', 'f', 'f', '/payment/merchant/store/MchStoreInfoList', '/mch/store', NULL, 3, 'f', 'f', 'f', 0, 1, 1, 'f', 'menu', NULL, NULL, NULL, NULL, '', '', '2026-07-23 09:32:12.671534+00', '2026-07-23 09:32:12.671534+00');
INSERT INTO "public"."iam_perm_menu" VALUES (91304, 91300, 'merchant:terminal', 'merchant', 'SystemTerminalList', 'menu.payment.merchant.terminal', 'lucide:monitor', 'f', 'f', '/payment/device/terminal/system/SystemTerminalList', '/mch/terminal', NULL, 4, 'f', 'f', 'f', 0, 1, 1, 'f', 'menu', NULL, NULL, NULL, NULL, '', '', '2026-07-23 09:32:12.67447+00', '2026-07-23 09:32:12.67447+00');
INSERT INTO "public"."iam_perm_menu" VALUES (91401, 91400, 'merchant:app', 'merchant', 'MchAppInfoList', 'menu.payment.merchant.app', 'lucide:app-window', 'f', 'f', '/payment/merchant/app/MchAppInfoList', '/mch/app', NULL, 1, 'f', 'f', 'f', 0, 1, 1, 'f', 'menu', NULL, NULL, NULL, NULL, '', '', '2026-07-23 09:32:12.681008+00', '2026-07-23 09:32:12.681008+00');
INSERT INTO "public"."iam_perm_menu" VALUES (91402, 91400, 'channel:merchant', 'merchant', 'ChannelMerchantList', 'menu.payment.merchant.channelMerchant', 'lucide:store', 'f', 'f', '/payment/channel-merchant/ChannelMerchantList', '/mch/channel-merchant', NULL, 2, 'f', 'f', 'f', 0, 1, 1, 'f', 'menu', NULL, NULL, NULL, NULL, '', '', '2026-07-23 09:32:12.684068+00', '2026-07-23 09:32:12.684068+00');
INSERT INTO "public"."iam_perm_menu" VALUES (91411, 91402, 'channel:merchant:detail', 'merchant', 'ChannelMerchantDetail', 'menu.payment.merchant.channelMerchant.detail', NULL, 't', 'f', '/payment/channel-merchant/detail/ChannelMerchantDetailDispatch', '/mch/channel-merchant/detail', NULL, 2, 'f', 'f', 'f', 0, 1, 1, 'f', 'subpage', NULL, NULL, NULL, NULL, '', '', '2026-07-23 09:32:12.689613+00', '2026-07-23 09:32:12.689613+00');
INSERT INTO "public"."iam_perm_menu" VALUES (91403, 91401, NULL, 'merchant', 'AppConfigDir', 'menu.payment.merchant.appWorkbench', NULL, 't', 'f', NULL, '/mch/app-config', NULL, 4, 'f', 'f', 'f', 0, NULL, 0, 'f', 'subpage_group', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-23 09:32:12.692738+00', '2026-07-23 09:32:12.692738+00');
INSERT INTO "public"."iam_perm_menu" VALUES (40107, 40106, 'payment:wx:mch-app', 'admin', 'WxMchApp', 'menu.payment.wx.mchApp', NULL, 't', 'f', NULL, NULL, NULL, 1, 'f', 'f', 'f', 1, 1, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-23 13:44:05.963399+00', '2026-07-23 14:32:14.494862+00');
INSERT INTO "public"."iam_perm_menu" VALUES (91412, 91400, 'payment:wx:mch-app', 'merchant', 'MchWxAppList', 'menu.payment.wx.mchApp', 'lucide:message-circle', 'f', 'f', '/payment/wx/mch/MchWxAppList', '/mch/wx-app', NULL, 3, 'f', 'f', 'f', 0, 1, 1, 'f', 'menu', NULL, NULL, NULL, NULL, '', '', '2026-07-24 01:58:27.304104+00', '2026-07-24 01:58:27.304104+00');
INSERT INTO "public"."iam_perm_menu" VALUES (91413, 91403, 'merchant:app:workbench', 'merchant', 'MchAppWorkbench', 'menu.payment.merchant.appWorkbench', NULL, 't', 'f', '/payment/merchant/app/MchAppWorkbench', '/mch/app/manage', NULL, 0, 'f', 'f', 'f', 0, 1, 1, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-24 10:20:36.109679+00', '2026-07-24 13:08:44.946319+00');
INSERT INTO "public"."iam_perm_menu" VALUES (91300, NULL, NULL, 'merchant', 'MchCenter', 'menu.mch.center', 'lucide:building-2', 'f', 'f', NULL, '/mch-center', '/mch/info', 1, 'f', 't', 'f', 0, NULL, 0, 'f', 'catalog', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-23 09:32:12.662617+00', '2026-07-23 09:32:12.662617+00');
INSERT INTO "public"."iam_perm_menu" VALUES (91400, NULL, NULL, 'merchant', 'PaymentConfig', 'menu.payment.config', 'lucide:settings-2', 'f', 'f', NULL, '/mch-payment', '/mch/app', 2, 'f', 't', 'f', 0, NULL, 0, 'f', 'catalog', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-23 09:32:12.677882+00', '2026-07-23 09:32:12.677882+00');
INSERT INTO "public"."iam_perm_menu" VALUES (91202, 91200, 'trade:callback-record', 'merchant', 'PayCallbackRecordList', 'menu.trade.callbackRecord', 'lucide:inbox', 'f', 'f', '/payment/record/PayCallbackRecordList', '/trade/record/callback-record', NULL, 2, 'f', 'f', 'f', 0, 1, 1, 'f', 'menu', NULL, NULL, NULL, NULL, '', '', '2026-07-23 09:32:12.658982+00', '2026-07-23 09:32:12.658982+00');
INSERT INTO "public"."iam_perm_menu" VALUES (40106, 409, 'payment:wx:platform-app', 'admin', 'WxAppHub', 'menu.payment.wx.app', 'lucide:app-window', 'f', 'f', '/payment/wx/WxAppHub', '/payment/wx/app', NULL, 10, 'f', 't', 'f', 1, 1, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-23 13:44:05.953634+00', '2026-07-31 03:18:17.00789+00');
INSERT INTO "public"."iam_perm_menu" VALUES (91404, 91403, 'merchant:app:route', 'merchant', 'PayRouteConfig', 'menu.payment.merchant.payRoute', 'lucide:git-branch', 't', 'f', '/payment/route/PayRouteConfig', '/mch/route', NULL, 1, 'f', 'f', 'f', 0, 1, 1, 'f', 'subpage', NULL, NULL, NULL, NULL, '', '', '2026-07-23 09:32:12.695589+00', '2026-07-23 09:32:12.695589+00');
INSERT INTO "public"."iam_perm_menu" VALUES (91407, 91403, 'merchant:gateway-cashier', 'merchant', 'CashierConfig', 'menu.payment.merchant.cashierConfig', 'lucide:monitor-smartphone', 't', 'f', '/payment/merchant/cashier/CashierConfig', '/mch/cashier', NULL, 4, 'f', 'f', 'f', 0, 1, 1, 'f', 'subpage', NULL, NULL, NULL, NULL, '', '', '2026-07-23 09:32:12.704415+00', '2026-07-23 09:32:12.704415+00');
INSERT INTO "public"."iam_perm_menu" VALUES (91409, 91403, 'merchant:easypay', 'merchant', 'EasyPayConfig', 'menu.payment.merchant.easypay', 'lucide:plug', 't', 'f', '/payment/merchant/easypay/EasyPayConfig', '/mch/easypay', NULL, 6, 'f', 'f', 'f', 0, 1, 1, 'f', 'subpage', NULL, NULL, NULL, NULL, '', '', '2026-07-23 09:32:12.710238+00', '2026-07-23 09:32:12.710238+00');
INSERT INTO "public"."iam_perm_menu" VALUES (91501, 91300, 'merchant:credential', 'merchant', 'MerchantCredentialConfig', 'menu.payment.merchant.credential', 'lucide:key', 'f', 'f', '/payment/merchant/credential/MerchantCredentialConfig', '/mch/credential', NULL, 5, 'f', 'f', 'f', 0, 1, 1, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-24 13:08:44.950986+00', '2026-07-24 13:08:44.950986+00');
INSERT INTO "public"."iam_perm_menu" VALUES (91305, 91300, 'merchant:wx-verify', 'merchant', 'MchWxDomainVerifyList', 'menu.payment.merchant.wxVerify', 'lucide:shield-check', 'f', 'f', '/payment/merchant/wx-verify/MchWxDomainVerifyList', '/mch/wx-verify', NULL, 6, 'f', 'f', 'f', 0, 1, 1, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-24 14:17:59.251093+00', '2026-07-24 14:17:59.251093+00');
INSERT INTO "public"."iam_perm_menu" VALUES (91421, 91402, 'channel:app', 'merchant', 'AlipayMchAppManage', 'menu.payment.merchant.channelMerchant.alipayApp', NULL, 't', 'f', '/payment/channel/alipay/manage/mch/app/AlipayMchAppManage', '/mch/channel-merchant/alipay-app-manage', NULL, 4, 'f', 'f', 'f', 0, 1, 1, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-25 01:53:14.928869+00', '2026-07-25 01:53:14.928869+00');
INSERT INTO "public"."iam_perm_menu" VALUES (91601, 91600, 'develop:trade', 'merchant', 'DevelopTrade', 'menu.develop.trade', 'lucide:credit-card', 'f', 'f', '/payment/develop/trade/DevelopTrade', '/develop/trade', NULL, 1, 'f', 'f', 'f', 0, NULL, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-25 15:10:00+00', '2026-07-25 15:10:00+00');
INSERT INTO "public"."iam_perm_menu" VALUES (91602, 91600, 'develop:gateway', 'merchant', 'DevelopGateway', 'menu.develop.gateway', 'lucide:globe', 'f', 'f', '/payment/develop/gateway/DevelopGateway', '/develop/gateway', NULL, 2, 'f', 'f', 'f', 0, NULL, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-25 15:10:00+00', '2026-07-25 15:10:00+00');
INSERT INTO "public"."iam_perm_menu" VALUES (91603, 91600, 'develop:sign', 'merchant', 'DevelopSign', 'menu.develop.sign', 'lucide:pen-tool', 'f', 'f', '/payment/develop/sign/DevelopSign', '/develop/sign', NULL, 3, 'f', 'f', 'f', 0, NULL, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-25 15:10:00+00', '2026-07-25 15:10:00+00');
INSERT INTO "public"."iam_perm_menu" VALUES (91604, 91600, 'develop:auth', 'merchant', 'ChannelAuth', 'menu.develop.auth', 'lucide:shield-check', 'f', 'f', '/payment/develop/auth/ChannelAuth', '/develop/auth', NULL, 4, 'f', 'f', 'f', 0, NULL, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-25 15:10:00+00', '2026-07-25 15:10:00+00');
INSERT INTO "public"."iam_perm_menu" VALUES (91600, NULL, NULL, 'merchant', 'Develop', 'menu.develop', 'lucide:wrench', 'f', 'f', NULL, '/develop', '/develop/trade', 9, 'f', 't', 'f', 0, NULL, 0, 'f', 'catalog', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-25 15:10:00+00', '2026-07-25 15:10:00+00');
INSERT INTO "public"."iam_perm_menu" VALUES (701, 7, NULL, 'admin', 'EasyPayPlugin', 'menu.plugin.easypay', 'lucide:plug', 'f', 'f', NULL, '/plugin/easypay', '/plugin/easypay/order', 1, 'f', 't', 'f', 0, NULL, 0, 'f', 'catalog', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-26 02:00:00+00', '2026-07-26 02:00:00+00');
INSERT INTO "public"."iam_perm_menu" VALUES (70101, 701, 'plugin:easypay-order', 'admin', 'EasyPayOrderList', 'menu.plugin.easypay.order', 'lucide:credit-card', 'f', 'f', '/plugin/easypay/EasyPayOrderList', '/plugin/easypay/order', NULL, 1, 'f', 't', 'f', 0, NULL, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-26 02:00:00+00', '2026-07-26 02:00:00+00');
INSERT INTO "public"."iam_perm_menu" VALUES (70102, 701, 'plugin:easypay-refund', 'admin', 'EasyPayRefundOrderList', 'menu.plugin.easypay.refund', 'lucide:undo-2', 'f', 'f', '/plugin/easypay/EasyPayRefundOrderList', '/plugin/easypay/refund-order', NULL, 2, 'f', 't', 'f', 0, NULL, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-26 02:00:00+00', '2026-07-26 02:00:00+00');
INSERT INTO "public"."iam_perm_menu" VALUES (91701, 91700, NULL, 'merchant', 'EasyPayPlugin', 'menu.plugin.easypay', 'lucide:plug', 'f', 'f', NULL, '/plugin/easypay', '/plugin/easypay/order', 1, 'f', 't', 'f', 0, NULL, 0, 'f', 'catalog', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-26 02:00:00+00', '2026-07-26 02:00:00+00');
INSERT INTO "public"."iam_perm_menu" VALUES (91702, 91701, 'plugin:easypay-order', 'merchant', 'EasyPayOrderList', 'menu.plugin.easypay.order', 'lucide:credit-card', 'f', 'f', '/plugin/easypay/EasyPayOrderList', '/plugin/easypay/order', NULL, 1, 'f', 't', 'f', 0, NULL, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-26 02:00:00+00', '2026-07-26 02:00:00+00');
INSERT INTO "public"."iam_perm_menu" VALUES (91703, 91701, 'plugin:easypay-refund', 'merchant', 'EasyPayRefundOrderList', 'menu.plugin.easypay.refund', 'lucide:undo-2', 'f', 'f', '/plugin/easypay/EasyPayRefundOrderList', '/plugin/easypay/refund-order', NULL, 2, 'f', 't', 'f', 0, NULL, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-26 02:00:00+00', '2026-07-26 02:00:00+00');
INSERT INTO "public"."iam_perm_menu" VALUES (7, NULL, 'plugin', 'admin', 'PluginManagement', 'menu.plugin', 'lucide:puzzle', 'f', 'f', NULL, '/plugin', '/plugin/easypay/order', 6, 'f', 't', 'f', 0, NULL, 0, 'f', 'catalog', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-26 02:00:00+00', '2026-07-26 02:00:00+00');
INSERT INTO "public"."iam_perm_menu" VALUES (91700, NULL, 'plugin', 'merchant', 'PluginManagement', 'menu.plugin', 'lucide:puzzle', 'f', 'f', NULL, '/plugin', '/plugin/easypay/order', 10, 'f', 't', 'f', 0, NULL, 0, 'f', 'catalog', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-26 02:00:00+00', '2026-07-26 02:00:00+00');
INSERT INTO "public"."iam_perm_menu" VALUES (205, 2, 'demos:ip-region', 'admin', 'IpRegionDemo', 'menu.demos.ipRegion', 'lucide:locate-fixed', 'f', 'f', '/demos/ip-region/IpRegionDemo', '/demos/ip-region', NULL, 5, 'f', 't', 'f', 0, NULL, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-27 16:00:00+00', '2026-07-27 16:00:00+00');
INSERT INTO "public"."iam_perm_menu" VALUES (40109, 40108, 'payment:douyin:mch-app', 'admin', 'DyMchApp', 'menu.payment.douyin.mchApp', NULL, 't', 'f', NULL, NULL, NULL, 1, 'f', 'f', 'f', 1, 1, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-28 14:00:00+00', '2026-07-28 14:00:00+00');
INSERT INTO "public"."iam_perm_menu" VALUES (91420, 91400, 'payment:douyin:mch-app', 'merchant', 'MchDyAppList', 'menu.payment.douyin.mchApp', 'lucide:message-circle', 'f', 'f', '/payment/douyin/mch/MchDyAppList', '/mch/douyin-app', NULL, 4, 'f', 'f', 'f', 0, 1, 1, 'f', 'menu', NULL, NULL, NULL, NULL, '', '', '2026-07-28 14:00:00+00', '2026-07-28 14:00:00+00');
INSERT INTO "public"."iam_perm_menu" VALUES (4040121, 4040130, 'merchant:gateway-pay-config', 'admin', 'GatewayPayConfig', 'menu.payment.merchant.gatewayPayConfig', NULL, 't', 'f', '/payment/merchant/gateway-config/GatewayPayConfig', '/payment/merchant/gateway-config', NULL, 3, 'f', 't', 'f', 1, 1, 1, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-30 12:24:51.675237+00', '2026-07-30 12:24:51.675237+00');
INSERT INTO "public"."iam_perm_menu" VALUES (91405, 91403, 'merchant:gateway-pay-config', 'merchant', 'GatewayPayConfig', 'menu.payment.merchant.gatewayPayConfig', 'lucide:qr-code', 't', 'f', '/payment/merchant/gateway-config/GatewayPayConfig', '/mch/gateway-config', NULL, 2, 'f', 'f', 'f', 0, 1, 1, 'f', 'subpage', NULL, NULL, NULL, NULL, '', '', '2026-07-30 12:24:51.676811+00', '2026-07-30 12:24:51.676811+00');
INSERT INTO "public"."iam_perm_menu" VALUES (409, 4, 'payment:app', 'admin', 'PaymentApp', 'menu.payment.app', 'lucide:layout-grid', 'f', 'f', NULL, '/payment/app', NULL, 30, 'f', 't', 'f', 1, 1, 0, 'f', 'catalog', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-31 03:18:16.99898+00', '2026-07-31 03:18:16.99898+00');
INSERT INTO "public"."iam_perm_menu" VALUES (40108, 409, 'payment:douyin:platform-app', 'admin', 'DyAppHub', 'menu.payment.douyin.app', 'lucide:app-window', 'f', 'f', '/payment/douyin/DyAppHub', '/payment/douyin/app', NULL, 20, 'f', 't', 'f', 1, 1, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-28 14:00:00+00', '2026-07-31 03:18:17.0111+00');
-- ----------------------------
-- Primary Key structure for table iam_perm_menu
-- ----------------------------
ALTER TABLE "public"."iam_perm_menu" ADD CONSTRAINT "iam_perm_menu_pkey" PRIMARY KEY ("id");

File diff suppressed because it is too large Load Diff

View File

@@ -1,177 +0,0 @@
-- ============================================================
-- 支付管理(id=4) 菜单结构优化 (admin 端)
--
-- 目标结构:
-- ├─ 支付主数据 (catalog) 服务商/通道/方式/产品/能力
-- ├─ 支付产品配置 (menu, 提为1级·前移)
-- ├─ 支付应用 (catalog 新建) 微信支付应用 / 抖音支付应用
-- ├─ 码牌管理 (menu, 顶层叶子)
-- ├─ 接入配置 (catalog, 原"支付配置"恢复) 移动端应用管理 / 平台微信域名校验
-- └─ 支付风控 (catalog) 黑名单 / 风险命中记录
--
-- 说明:
-- 1. 仅改 admin 端(pid=4 子树), 不影响 merchant 端
-- 2. 菜单显示文案改名(接入配置/微信支付应用等)在 locale json 维护, 见文件末尾清单
-- 3. 顺带清理死节点 id=9(设备管理, 已软删除且零子节点)
-- 4. 排序整数化, 替换原 0.5/2.5/2.6/2.7 小数补位
-- ============================================================
-- 1. 新建「支付应用」目录 (id=409, 收拢微信/抖音)
INSERT INTO iam_perm_menu
(id, pid, menu_code, client_code, name, i18n_key, icon,
hidden, hide_children_menu, component, path, redirect,
sort_no, root, keep_alive, affix_tab, creator, last_modifier, version, deleted, menu_type,
create_time, last_modified_time)
VALUES
(409, 4, 'payment:app', 'admin', 'PaymentApp', 'menu.payment.app', 'lucide:layout-grid',
false, false, NULL, '/payment/app', NULL,
30, false, true, false, 1, 1, 0, false, 'catalog',
now(), now());
-- 2. 归组: 微信/抖音 -> 支付应用(409)
UPDATE iam_perm_menu SET pid = 409, sort_no = 10, last_modified_time = now()
WHERE id = 40106 AND client_code = 'admin';
UPDATE iam_perm_menu SET pid = 409, sort_no = 20, last_modified_time = now()
WHERE id = 40108 AND client_code = 'admin';
-- 3. 归组: 移动端应用管理 -> 接入配置(405)
UPDATE iam_perm_menu SET pid = 405, sort_no = 10, last_modified_time = now()
WHERE id = 40504 AND client_code = 'admin';
-- 4. 「接入配置」(原"支付配置", id=405) 恢复显示
-- 该目录此前 deleted='t' 且 hidden='t', 导致子项"平台微信域名校验"(40507) 成孤儿
UPDATE iam_perm_menu
SET deleted = false, hidden = false, sort_no = 50, last_modified_time = now()
WHERE id = 405 AND client_code = 'admin';
UPDATE iam_perm_menu SET sort_no = 20, last_modified_time = now()
WHERE id = 40507 AND client_code = 'admin';
-- 5. 「支付产品配置」提为1级并前移; 其余目录排序整数化
UPDATE iam_perm_menu SET sort_no = 10, last_modified_time = now()
WHERE id = 401 AND client_code = 'admin';
UPDATE iam_perm_menu SET sort_no = 20, last_modified_time = now()
WHERE id = 40105 AND client_code = 'admin';
UPDATE iam_perm_menu SET sort_no = 40, last_modified_time = now()
WHERE id = 901 AND client_code = 'admin';
UPDATE iam_perm_menu SET sort_no = 60, last_modified_time = now()
WHERE id = 406 AND client_code = 'admin';
-- 6. 清理设备管理死节点 (已软删除且零子节点, 终端已归商户)
DELETE FROM iam_perm_menu WHERE id = 9;
-- ============================================================
-- 可选: 码牌 menu_code/path 前缀归一 (device: -> payment:)
-- !! 执行前需核对 dax-pay-open controller 映射与前端 router.push 字面量 !!
-- ============================================================
-- UPDATE iam_perm_menu
-- SET menu_code = 'payment:qrcode',
-- path = '/payment/qrcode',
-- last_modified_time = now()
-- WHERE id = 901 AND client_code = 'admin';
-- ============================================================
-- i18n 文案改动 (不在本 SQL, 在 dax-pay-ui/apps/daxpay-admin/src/locales/menu-titles/{locale}.json, 至少 6 语种)
-- 新增 key: menu.payment.app = 支付应用
-- 改文案(key 不变):
-- menu.payment.config 支付配置 -> 接入配置
-- menu.payment.wx.app 支付应用(微信) -> 微信支付应用
-- menu.payment.douyin.app 支付应用(抖音) -> 抖音支付应用
-- 去重(隐藏子页, 避免与上面重名):
-- menu.payment.wx.mchApp -> 微信支付应用(商户)
-- menu.payment.douyin.mchApp -> 抖音支付应用(商户)
-- 删失效 key(10 语种 locale 同步删):
-- menu.payment.merchant.channelMerchant.douyinApp
-- menu.payment.merchant.aggregateScan
-- menu.payment.merchant.codePayConfig
-- menu.business.config
-- menu.payment.merchant.notifyConfig
-- ============================================================
-- ============================================================
-- 附: 本次未处理的存量软删除 (merchant 端历史残留, 与支付管理无关, 待单独确认)
-- 91104/91102/91105 trade:pay-order 旧目录及其子(已被 91110/91111/91112 取代)
-- 91106/91107/91108 trade:record 旧目录及其子(已被 91200/91201/91202 取代)
-- ============================================================
-- ============================================================
-- 云闪付(union_pay) 支付主数据种子
--
-- 目标: 补全 pay_md_* 主数据表中的 union 相关行, 使云闪付在
-- 支付渠道Tab/支付方式目录/支付能力页/支付产品页正常展示
--
-- 说明:
-- 1. union 复用通用 channel:merchant 菜单族, 无需新增菜单/权限种子
-- 2. 展示名走枚举 i18n (common-i18n enum/*.json 已全 10 语种就绪),
-- DB 行 description/name 仅作维护参考, 不直接驱动前端文案
-- 3. 幂等: 有部分唯一索引(WHERE deleted=false)的表用 ON CONFLICT ... DO NOTHING,
-- pay_md_channel 无唯一索引用 WHERE NOT EXISTS 兜底
-- 4. ID 段位 9xxxx 自成一段, 避开既有雪花ID与商业版数据
-- 5. pay_md_product_config 不补, active_env 由 PayProductConfigService 启动时兜底
-- ============================================================
-- 1. 支付通道 (pay_md_channel) — 无唯一索引, 用 WHERE NOT EXISTS
INSERT INTO public.pay_md_channel
(id, code, sort_no, description, icon, creator, create_time, last_modifier, last_modified_time, version, deleted)
SELECT 91001, 'union_pay', 3, '云闪付', NULL, 1, now(), 1, now(), 0, false
WHERE NOT EXISTS (
SELECT 1 FROM public.pay_md_channel WHERE code = 'union_pay' AND deleted = false
);
-- 2. 支付渠道 (pay_md_provider)
INSERT INTO public.pay_md_provider
(id, code, icon, sort_no, deleted, last_modifier, last_modified_time, version, creator, create_time, enabled, description)
VALUES
(92001, 'union_pay', NULL, 3, false, 1, now(), 0, 1, now(), true, '银联')
ON CONFLICT (code) WHERE deleted = false DO NOTHING;
-- 3. 支付方式 (pay_md_method) — 4 种方式
INSERT INTO public.pay_md_method
(id, code, sort_no, description, deleted, last_modifier, last_modified_time, version, creator, create_time)
VALUES
(93001, 'union_qr', 30, '银联扫码', false, 1, now(), 0, 1, now()),
(93002, 'union_jsapi', 31, '银联JSAPI', false, 1, now(), 0, 1, now()),
(93003, 'union_h5', 32, '银联H5', false, 1, now(), 0, 1, now()),
(93004, 'union_barcode', 33, '银联付款码', false, 1, now(), 0, 1, now())
ON CONFLICT (code) WHERE deleted = false DO NOTHING;
-- 4. 支付能力 (pay_md_capability) — 与支付方式同码
INSERT INTO public.pay_md_capability
(id, code, sort_no, enabled, description, deleted, last_modifier, last_modified_time, version, creator, create_time)
VALUES
(94001, 'union_qr', 30, true, '银联扫码', false, 1, now(), 0, 1, now()),
(94002, 'union_jsapi', 31, true, '银联JSAPI', false, 1, now(), 0, 1, now()),
(94003, 'union_h5', 32, true, '银联H5', false, 1, now(), 0, 1, now()),
(94004, 'union_barcode', 33, true, '银联付款码', false, 1, now(), 0, 1, now())
ON CONFLICT (code) WHERE deleted = false DO NOTHING;
-- 5. 渠道-方式关联 (pay_md_provider_method) — union_pay 下 4 种方式
INSERT INTO public.pay_md_provider_method
(id, provider, method, sort_no, deleted, last_modifier, last_modified_time, version, creator, create_time, description)
VALUES
(95001, 'union_pay', 'union_qr', 1, false, 1, now(), 0, 1, now(), NULL),
(95002, 'union_pay', 'union_jsapi', 2, false, 1, now(), 0, 1, now(), NULL),
(95003, 'union_pay', 'union_h5', 3, false, 1, now(), 0, 1, now(), NULL),
(95004, 'union_pay', 'union_barcode', 4, false, 1, now(), 0, 1, now(), NULL)
ON CONFLICT (provider, method) WHERE deleted = false DO NOTHING;
-- 6. 支付产品 (pay_md_product) — 3 个产品, 均支持沙箱(sandbox=true)
INSERT INTO public.pay_md_product
(id, code, name, channel, description, sort_no, creator, create_time, last_modifier, last_modified_time, version, deleted, sandbox, enabled)
VALUES
(96001, 'union_qrcode', '云闪付(C扫B)', 'union_pay', '云闪付主扫(二维码)', 1, 1, now(), 1, now(), 0, false, true, true),
(96002, 'union_h5', '云闪付(H5)', 'union_pay', '云闪付H5', 2, 1, now(), 1, now(), 0, false, true, true),
(96003, 'union_barcode', '云闪付(B扫C)', 'union_pay', '云闪付被扫(付款码)', 3, 1, now(), 1, now(), 0, false, true, true)
ON CONFLICT (code) WHERE deleted = false DO NOTHING;
-- 7. 产品-能力关联 (pay_md_product_capability) — 对齐各 ProductStrategy 的 methodCapabilityMapping
INSERT INTO public.pay_md_product_capability
(id, product_code, capability_code, sort_no, enabled, remark, deleted, last_modifier, last_modified_time, version, creator, create_time)
VALUES
(97001, 'union_qrcode', 'union_qr', 1, true, NULL, false, 1, now(), 0, 1, now()),
(97002, 'union_h5', 'union_h5', 1, true, NULL, false, 1, now(), 0, 1, now()),
(97003, 'union_barcode', 'union_barcode', 1, true, NULL, false, 1, now(), 0, 1, now())
ON CONFLICT (product_code, capability_code) WHERE deleted = false DO NOTHING;