feat: 小程序与管理端迭代(神仙AI、了解自己CRM、AI测试入口、报表与分润等)
Made-with: Cursor
This commit is contained in:
80
api/database/migrations/add_ai_chat_and_soul_articles.sql
Normal file
80
api/database/migrations/add_ai_chat_and_soul_articles.sql
Normal file
@@ -0,0 +1,80 @@
|
||||
-- AI 聊天 + Soul 文章推荐 + 欠费预警字段
|
||||
-- 对应需求:ai功能202600417 -6.md
|
||||
-- 建议部署时用 source 一次性执行;前缀 mbti_ 按环境 .env DATABASE_PREFIX 调整
|
||||
|
||||
-- 1) ai_providers 新增排序权重(故障切换时可手动调优先级)
|
||||
ALTER TABLE `mbti_ai_providers`
|
||||
ADD COLUMN `sortWeight` INT NOT NULL DEFAULT 100 COMMENT '优先级,升序;欠费自动降到999' AFTER `visible`;
|
||||
|
||||
-- 2) AI 对话表
|
||||
CREATE TABLE IF NOT EXISTS `mbti_ai_conversations` (
|
||||
`id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||
`userId` INT UNSIGNED NOT NULL,
|
||||
`title` VARCHAR(128) NOT NULL DEFAULT '',
|
||||
`mbtiType` VARCHAR(16) NOT NULL DEFAULT '',
|
||||
`providerId` VARCHAR(32) NOT NULL DEFAULT '',
|
||||
`lastMessageAt` INT UNSIGNED NOT NULL DEFAULT 0,
|
||||
`messageCount` INT UNSIGNED NOT NULL DEFAULT 0,
|
||||
`createdAt` INT UNSIGNED NOT NULL DEFAULT 0,
|
||||
`updatedAt` INT UNSIGNED NOT NULL DEFAULT 0,
|
||||
`deletedAt` INT UNSIGNED NULL,
|
||||
INDEX `idx_user` (`userId`, `updatedAt`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='神仙 AI 对话';
|
||||
|
||||
-- 3) AI 消息表
|
||||
CREATE TABLE IF NOT EXISTS `mbti_ai_messages` (
|
||||
`id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||
`conversationId` INT UNSIGNED NOT NULL,
|
||||
`role` ENUM('system','user','assistant') NOT NULL,
|
||||
`content` MEDIUMTEXT NOT NULL,
|
||||
`tokensIn` INT UNSIGNED NOT NULL DEFAULT 0,
|
||||
`tokensOut` INT UNSIGNED NOT NULL DEFAULT 0,
|
||||
`providerId` VARCHAR(32) NOT NULL DEFAULT '',
|
||||
`isDegraded` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否为降级兜底回答',
|
||||
`createdAt` INT UNSIGNED NOT NULL DEFAULT 0,
|
||||
INDEX `idx_conv` (`conversationId`, `id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='神仙 AI 消息流';
|
||||
|
||||
-- 4) Soul 采集文章表(一场 soul 创业实验 引流内容池)
|
||||
CREATE TABLE IF NOT EXISTS `mbti_soul_articles` (
|
||||
`id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||
`sourceId` VARCHAR(64) NOT NULL COMMENT 'soul 侧文章 id',
|
||||
`title` VARCHAR(255) NOT NULL,
|
||||
`cover` VARCHAR(512) NOT NULL DEFAULT '',
|
||||
`url` VARCHAR(512) NOT NULL,
|
||||
`summary` VARCHAR(512) NOT NULL DEFAULT '',
|
||||
`author` VARCHAR(64) NOT NULL DEFAULT '',
|
||||
`tag` VARCHAR(32) NOT NULL DEFAULT 'MBTI',
|
||||
`publishedAt` INT UNSIGNED NOT NULL DEFAULT 0,
|
||||
`isRecommended` TINYINT(1) NOT NULL DEFAULT 0,
|
||||
`recommendedOrder` INT NOT NULL DEFAULT 0,
|
||||
`viewCount` INT UNSIGNED NOT NULL DEFAULT 0,
|
||||
`createdAt` INT UNSIGNED NOT NULL DEFAULT 0,
|
||||
`updatedAt` INT UNSIGNED NOT NULL DEFAULT 0,
|
||||
`deletedAt` INT UNSIGNED NULL,
|
||||
UNIQUE KEY `uk_source` (`sourceId`),
|
||||
INDEX `idx_reco` (`isRecommended`, `recommendedOrder`, `publishedAt`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Soul 采集文章(MBTI 主题)';
|
||||
|
||||
-- 5) AI 使用限额(每日)—— 用户层面的限流记录
|
||||
CREATE TABLE IF NOT EXISTS `mbti_ai_usage_daily` (
|
||||
`id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||
`userId` INT UNSIGNED NOT NULL,
|
||||
`dateStr` CHAR(10) NOT NULL COMMENT '格式 YYYY-MM-DD',
|
||||
`messageCount` INT UNSIGNED NOT NULL DEFAULT 0,
|
||||
`createdAt` INT UNSIGNED NOT NULL DEFAULT 0,
|
||||
`updatedAt` INT UNSIGNED NOT NULL DEFAULT 0,
|
||||
UNIQUE KEY `uk_user_date` (`userId`, `dateStr`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='神仙 AI 每日限流计数';
|
||||
|
||||
-- 6) AI 余额预警日志(去重同一阈值每天只发 1 次)
|
||||
CREATE TABLE IF NOT EXISTS `mbti_ai_balance_alerts` (
|
||||
`id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||
`providerId` VARCHAR(32) NOT NULL,
|
||||
`balance` DECIMAL(10,2) NOT NULL DEFAULT 0,
|
||||
`threshold` DECIMAL(10,2) NOT NULL DEFAULT 0,
|
||||
`currency` VARCHAR(8) NOT NULL DEFAULT 'CNY',
|
||||
`alertedAt` INT UNSIGNED NOT NULL DEFAULT 0,
|
||||
`dateStr` CHAR(10) NOT NULL,
|
||||
UNIQUE KEY `uk_provider_date` (`providerId`, `dateStr`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='AI 欠费预警去重日志';
|
||||
12
api/database/migrations/add_cold_face.sql
Normal file
12
api/database/migrations/add_cold_face.sql
Normal file
@@ -0,0 +1,12 @@
|
||||
-- 冷脸分析字段:扩展 user_profile,用于列表/详情展示
|
||||
-- 说明:
|
||||
-- coldFaceScore 0-100;<35=暖(warm), 35-65=中(neutral), >65=冷(cold)
|
||||
-- coldFaceLevel 字符串枚举 cold/neutral/warm
|
||||
-- coldFaceUpdatedAt 最近一次测评更新时间戳(秒)
|
||||
-- 执行: 在 phpMyAdmin 或 CLI 运行
|
||||
|
||||
ALTER TABLE `mbti_user_profile`
|
||||
ADD COLUMN `coldFaceScore` tinyint(3) UNSIGNED NULL DEFAULT NULL COMMENT '冷脸分(0-100)' AFTER `lastFaceResultId`,
|
||||
ADD COLUMN `coldFaceLevel` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '冷脸等级: cold/neutral/warm' AFTER `coldFaceScore`,
|
||||
ADD COLUMN `coldFaceUpdatedAt` int(11) NULL DEFAULT NULL COMMENT '冷脸更新时间(时间戳)' AFTER `coldFaceLevel`,
|
||||
ADD INDEX `idx_coldFaceLevel` (`coldFaceLevel`) USING BTREE;
|
||||
@@ -0,0 +1,4 @@
|
||||
-- 埋点表补充:userId + createdAt 复合索引(用于用户旅程、分享统计)
|
||||
-- 幂等写法:若索引已存在会报错,可忽略(或手工 SHOW INDEX 检查后再执行)
|
||||
ALTER TABLE `mbti_analytics_events`
|
||||
ADD INDEX `idx_user_created` (`userId`, `createdAt`);
|
||||
95
api/database/migrations/add_tabbar_and_ai_profit_sharing.sql
Normal file
95
api/database/migrations/add_tabbar_and_ai_profit_sharing.sql
Normal file
@@ -0,0 +1,95 @@
|
||||
-- =====================================================
|
||||
-- 神仙 AI v2 · TabBar 后台可配 + AI 深度报告 + 分账规则
|
||||
-- Date: 2026-04-17
|
||||
-- 生产库表前缀若为 mbti_,则下方表名以 mbti_ 为准
|
||||
-- =====================================================
|
||||
|
||||
-- ---------- 1) 小程序 TabBar 配置 ----------
|
||||
CREATE TABLE IF NOT EXISTS `mbti_mp_tabbar_items` (
|
||||
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`sortOrder` INT NOT NULL DEFAULT 100 COMMENT '排序,小的在前',
|
||||
`pagePath` VARCHAR(128) NOT NULL COMMENT '目标页面 pages/xxx/xxx',
|
||||
`text` VARCHAR(32) NOT NULL COMMENT '底部文案',
|
||||
`iconKey` VARCHAR(32) NOT NULL DEFAULT 'home' COMMENT '图标key: home/camera/ai/profile',
|
||||
`visible` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '1=显示 0=隐藏(审核模式)',
|
||||
`highlight` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '1=中间突出按钮(圆形)',
|
||||
`badgeKey` VARCHAR(32) NULL COMMENT '红点角标来源key(预留)',
|
||||
`createdAt` INT UNSIGNED NOT NULL DEFAULT 0,
|
||||
`updatedAt` INT UNSIGNED NOT NULL DEFAULT 0,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_sort` (`sortOrder`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='小程序 TabBar 后台可配';
|
||||
|
||||
-- 初始 4 项(默认顺序:首页·拍摄·神仙AI·我)
|
||||
INSERT INTO `mbti_mp_tabbar_items` (sortOrder, pagePath, text, iconKey, highlight, visible, createdAt, updatedAt) VALUES
|
||||
(10, 'pages/index/index', '首页', 'home', 0, 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),
|
||||
(20, 'pages/index/camera', '拍摄', 'camera', 1, 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),
|
||||
(30, 'pages/ai-chat/index', '神仙AI', 'ai', 0, 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),
|
||||
(40, 'pages/profile/index', '我', 'profile', 0, 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP());
|
||||
|
||||
|
||||
-- ---------- 2) 分账规则(知己 profit-sharing 思路) ----------
|
||||
CREATE TABLE IF NOT EXISTS `mbti_profit_sharing_rules` (
|
||||
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`productType` VARCHAR(64) NOT NULL COMMENT 'ai_deep_report / mbti_report / face_analysis / default',
|
||||
`name` VARCHAR(128) NOT NULL,
|
||||
`receivers` JSON NOT NULL COMMENT '[{type,name,ratio,account?}]',
|
||||
`status` VARCHAR(16) NOT NULL DEFAULT 'active' COMMENT 'active/disabled',
|
||||
`createdAt` INT UNSIGNED NOT NULL DEFAULT 0,
|
||||
`updatedAt` INT UNSIGNED NOT NULL DEFAULT 0,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_product` (`productType`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单分账规则';
|
||||
|
||||
INSERT INTO `mbti_profit_sharing_rules` (productType, name, receivers, status, createdAt, updatedAt) VALUES
|
||||
('ai_deep_report', 'AI 深度画像报告',
|
||||
'[{"type":"platform","name":"平台","ratio":0.70},{"type":"distributor_l1","name":"一级分销","ratio":0.20},{"type":"distributor_l2","name":"二级分销","ratio":0.10}]',
|
||||
'active', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),
|
||||
('default', '默认规则 · 平台 100%',
|
||||
'[{"type":"platform","name":"平台","ratio":1.00}]',
|
||||
'active', UNIX_TIMESTAMP(), UNIX_TIMESTAMP());
|
||||
|
||||
|
||||
-- ---------- 3) 分账记录 ----------
|
||||
CREATE TABLE IF NOT EXISTS `mbti_profit_sharing_records` (
|
||||
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`orderSn` VARCHAR(64) NOT NULL COMMENT '订单号',
|
||||
`orderId` INT UNSIGNED NULL COMMENT '订单表id',
|
||||
`productType` VARCHAR(64) NOT NULL,
|
||||
`totalAmount` INT NOT NULL DEFAULT 0 COMMENT '订单总金额(分)',
|
||||
`details` JSON NOT NULL COMMENT '分账明细 [{receiverType,receiverName,amount,ratio,account,status}]',
|
||||
`status` VARCHAR(16) NOT NULL DEFAULT 'pending' COMMENT 'pending/processing/completed/failed',
|
||||
`processedAt` INT UNSIGNED NULL,
|
||||
`createdAt` INT UNSIGNED NOT NULL DEFAULT 0,
|
||||
`updatedAt` INT UNSIGNED NOT NULL DEFAULT 0,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_order_sn` (`orderSn`),
|
||||
KEY `idx_status` (`status`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单分账记录';
|
||||
|
||||
|
||||
-- ---------- 4) AI 深度报告(付费解锁阅读) ----------
|
||||
CREATE TABLE IF NOT EXISTS `mbti_ai_reports` (
|
||||
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`userId` INT UNSIGNED NOT NULL,
|
||||
`conversationId` INT UNSIGNED NULL COMMENT '来源对话',
|
||||
`mbtiType` VARCHAR(8) NULL,
|
||||
`orderSn` VARCHAR(64) NULL COMMENT '对应订单号',
|
||||
`orderId` INT UNSIGNED NULL,
|
||||
`priceFen` INT NOT NULL DEFAULT 990 COMMENT '单价(分)',
|
||||
`status` VARCHAR(16) NOT NULL DEFAULT 'pending' COMMENT 'pending=未支付 paid=已支付未生成 generating=生成中 done=已完成 failed=失败',
|
||||
`title` VARCHAR(255) NULL,
|
||||
`summary` TEXT NULL COMMENT '免费预览的摘要片段',
|
||||
`content` MEDIUMTEXT NULL COMMENT '完整报告正文',
|
||||
`posterUrl` VARCHAR(512) NULL COMMENT '分享海报',
|
||||
`retryCount` INT NOT NULL DEFAULT 0,
|
||||
`lastError` VARCHAR(512) NULL,
|
||||
`paidAt` INT UNSIGNED NULL,
|
||||
`generatedAt` INT UNSIGNED NULL,
|
||||
`createdAt` INT UNSIGNED NOT NULL DEFAULT 0,
|
||||
`updatedAt` INT UNSIGNED NOT NULL DEFAULT 0,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_user` (`userId`),
|
||||
KEY `idx_order_sn` (`orderSn`),
|
||||
KEY `idx_status` (`status`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='AI 深度画像报告';
|
||||
@@ -0,0 +1,24 @@
|
||||
-- =====================================================
|
||||
-- plan7 补丁:给 tabBar 配置加 iconUrl(可传图片 URL 覆盖 SVG)
|
||||
-- 给 soul_articles 自动推送时间戳
|
||||
-- Date: 2026-04-17
|
||||
-- =====================================================
|
||||
|
||||
ALTER TABLE `mbti_mp_tabbar_items`
|
||||
ADD COLUMN `iconUrl` VARCHAR(512) NULL AFTER `iconKey`
|
||||
COMMENT '图片图标 URL,若有则优先覆盖 iconKey 的 SVG';
|
||||
|
||||
-- 给"神仙AI"tab 默认用团队 logo 图
|
||||
UPDATE `mbti_mp_tabbar_items`
|
||||
SET `iconUrl` = '/images/mbti-team-image.png'
|
||||
WHERE `iconKey` = 'ai' AND (`iconUrl` IS NULL OR `iconUrl` = '');
|
||||
|
||||
-- Soul 自动采集:last sync 时间戳记录到 system_config
|
||||
INSERT INTO `mbti_system_config` (`key`, `value`, `description`, `createdAt`, `updatedAt`)
|
||||
SELECT 'soul_article_auto_sync',
|
||||
JSON_OBJECT('enabled', TRUE, 'intervalSec', 3600, 'limit', 10),
|
||||
'Soul 文章自动采集配置',
|
||||
UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
|
||||
WHERE NOT EXISTS (
|
||||
SELECT 1 FROM `mbti_system_config` WHERE `key` = 'soul_article_auto_sync'
|
||||
);
|
||||
Reference in New Issue
Block a user