v1.8: FastAdmin chathub-addon — register/plan/payment/member-center + 5 channel bindings

- New fastadmin/chathub/ (11 files, 204K): user-facing FastAdmin ThinkPHP 5 addon
- _markOrderPaid() now calls _provisionAsync() on empty embed_code (closes 'paid but no code' gap)
- New reprovision() action — user-initiated resource rebuild
- payReturn() smart redirect: 3 branches (just_paid / provisioning / pending / fallback)
- status badge updated with 'provisioning' state (blue)
- _initialize() whitelist expanded: reprovision (user) + payNotify/payReturn (public webhook)
- 5 chathub_* tables (tenant/log/order/channel_account/gateway_log) + MIGRATIONS.md

Bugfixes during E2E:
- payNotify HTTP 500: tenant.status ENUM missing 'provisioning' value (DBA migration)
- payNotify HTTP 500: chathub_log.status='received' (not in ENUM) — changed to 'success'
- TP5 method signature: function reprovision(\$ids) does not read query string — use \$this->request->param('ids')
This commit is contained in:
GreatQiu
2026-06-05 14:20:00 +08:00
parent 1d620ede9b
commit 91104e58cf
13 changed files with 3385 additions and 0 deletions
+98
View File
@@ -0,0 +1,98 @@
CREATE TABLE IF NOT EXISTS `__PREFIX__chathub_tenant` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
`user_id` int(11) unsigned DEFAULT NULL COMMENT 'fa_user.id (创建者)',
`tenant_name` varchar(100) NOT NULL DEFAULT '' COMMENT '租户名称',
`domain` varchar(255) NOT NULL DEFAULT '' COMMENT '域名',
`email` varchar(255) NOT NULL DEFAULT '' COMMENT 'Chatwoot登录邮箱',
`inbox_id` int(11) DEFAULT NULL COMMENT 'Chatwoot Inbox ID',
`inbox_token` varchar(100) DEFAULT NULL COMMENT 'Chatwoot Inbox Token',
`team_id` int(11) DEFAULT NULL COMMENT 'Chatwoot Team ID',
`agent_id` varchar(100) DEFAULT NULL COMMENT 'QwenPaw Agent ID',
`agent_cw_id` int(11) DEFAULT NULL COMMENT 'Chatwoot Agent用户ID',
`agent_cw_password` varchar(100) DEFAULT NULL COMMENT 'Chatwoot初始密码',
`agent_name` varchar(100) DEFAULT NULL COMMENT 'QwenPaw Agent 名称',
`max_agents` int(11) NOT NULL DEFAULT 3 COMMENT '最大坐席数',
`channel_type` enum('web_widget','api','amazon','jd','taobao','pdd','tiktok') NOT NULL DEFAULT 'web_widget' COMMENT '通道类型',
`status` enum('pending','provisioning','active','suspended','disabled') NOT NULL DEFAULT 'pending' COMMENT '状态',
`config` text COMMENT '配置JSON',
`embed_code` text COMMENT '嵌入代码',
`api_credentials` text COMMENT 'API凭据JSON',
`provisioned_at` datetime DEFAULT NULL COMMENT '开通时间',
`expire_at` datetime DEFAULT NULL COMMENT '到期时间',
`last_active_at` datetime DEFAULT NULL COMMENT '最后活跃时间',
`createtime` int(10) DEFAULT NULL COMMENT '创建时间',
`updatetime` int(10) DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_domain` (`domain`),
KEY `idx_status` (`status`),
KEY `idx_inbox_id` (`inbox_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='ChatHub租户表';
CREATE TABLE IF NOT EXISTS `__PREFIX__chathub_log` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
`tenant_id` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '租户ID (0=系统级)',
`action` varchar(50) NOT NULL DEFAULT '' COMMENT '操作类型 (register/renew/pay_notify_*/reprovision/...)',
`detail` text COMMENT '操作详情',
`status` enum('success','failed') NOT NULL DEFAULT 'success' COMMENT '状态',
`operator` varchar(100) DEFAULT NULL COMMENT '操作人 (用户邮箱或system)',
`createtime` int(10) DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`),
KEY `idx_tenant_id` (`tenant_id`),
KEY `idx_action` (`action`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='ChatHub操作日志表';
CREATE TABLE IF NOT EXISTS `__PREFIX__chathub_order` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
`order_no` varchar(50) NOT NULL COMMENT '订单号',
`tenant_id` int(11) unsigned NOT NULL COMMENT '租户ID',
`user_id` int(11) unsigned NOT NULL COMMENT '下单用户ID',
`plan` varchar(20) NOT NULL COMMENT '方案 (basic/pro/enterprise)',
`amount` decimal(10,2) NOT NULL COMMENT '金额',
`pay_method` varchar(20) DEFAULT NULL COMMENT '支付方式 (alipay/wechat)',
`pay_trade_no` varchar(100) DEFAULT NULL COMMENT '支付平台交易号',
`status` enum('pending','paid','failed','refunded') NOT NULL DEFAULT 'pending' COMMENT '状态',
`paid_at` datetime DEFAULT NULL COMMENT '支付完成时间',
`expire_at` datetime DEFAULT NULL COMMENT '续期到期时间',
`createtime` int(10) unsigned NOT NULL COMMENT '创建时间',
`updatetime` int(10) unsigned DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_order_no` (`order_no`),
KEY `idx_tenant_id` (`tenant_id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='ChatHub订单表';
CREATE TABLE IF NOT EXISTS `__PREFIX__chathub_channel_account` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
`tenant_id` int(11) unsigned NOT NULL COMMENT '租户ID',
`channel` enum('amazon','jd','taobao','pdd','tiktok') NOT NULL COMMENT '平台',
`shop_id` varchar(100) DEFAULT NULL COMMENT '店铺ID',
`shop_name` varchar(200) DEFAULT NULL COMMENT '店铺名称',
`credentials_encrypted` varbinary(2048) NOT NULL COMMENT 'AES-256-GCM 加密凭据',
`expires_at` datetime DEFAULT NULL COMMENT 'Access Token 过期时间',
`status` enum('active','expired','error','paused') DEFAULT 'active' COMMENT '状态',
`last_error` text COMMENT '最后一次错误',
`last_refresh_at` datetime DEFAULT NULL COMMENT '上次刷新时间',
`rate_limit_per_sec` int(10) unsigned DEFAULT 5 COMMENT '每秒请求上限',
`createtime` int(10) DEFAULT NULL COMMENT '创建时间',
`updatetime` int(10) DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `idx_tenant_id` (`tenant_id`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='ChatHub渠道账号表';
CREATE TABLE IF NOT EXISTS `__PREFIX__chathub_gateway_log` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
`tenant_id` int(11) unsigned NOT NULL COMMENT '租户ID',
`channel` enum('amazon','jd','taobao','pdd','tiktok') NOT NULL COMMENT '平台',
`query_hash` char(64) NOT NULL COMMENT '查询内容 SHA256',
`status` enum('success','cache_hit','rate_limited','breaker_open','error','timeout','no_creds') NOT NULL COMMENT '调用结果',
`latency_ms` int(10) unsigned DEFAULT NULL COMMENT '延迟(毫秒)',
`error_msg` varchar(500) DEFAULT NULL COMMENT '错误信息',
`createtime` int(10) DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`),
KEY `idx_tenant_id` (`tenant_id`),
KEY `idx_channel_status` (`channel`,`status`),
KEY `idx_createtime` (`createtime`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='ChatHub Gateway调用日志';