feat(ai): 写作/生图/创意/活动策划也保存历史记录

- ai_chat_list 新增 chat_type / params,旧数据默认 chat
- 新增 AiGenerationRecorder:成功后同事务写 list + history,末帧回传 chatId
- 聊天改为成功收尾才建行,失败/中止不再留下空记录
- 写作(含自由创作)、生图、创意助手、活动策划四处接入,软失败与断流不入库
- 历史列表只取最近 30 条(SQL LIMIT),并强制按登录用户过滤
- 修复历史排序用了不存在的 sort_number 列(多行会 NPE)
- 新增 4 个测试类:记录器规则、排序回归、创意成功/软失败、30 条上限
This commit is contained in:
2026-10-24 17:37:39 +08:00
parent d54f559d34
commit 4c2a787d81
18 changed files with 1012 additions and 46 deletions
+50
View File
@@ -0,0 +1,50 @@
-- AI 历史记录:写作 / 生图 / 创意 / 活动策划也入库
--
-- 背景:ai_chat_list 原先只服务于聊天,没有区分记录来源的列,也没有保存生成参数。
-- 现在「生成记录」与聊天的每轮提问共用这张表:写作(文稿生成)、生图(创意助手
-- mode=image)、创意助手(独立页)、活动策划大纲各写一条,需要 chat_type 区分,
-- 并保存入参快照 params,供「按原参数再来一次」与回看时展示。
--
-- 决策见 docs/adr/0001-ai-generation-records.md,三端契约见 docs/ai-history-contract.md。
--
-- 幂等:重复执行只会命中 SELECT 1。
SET @db = DATABASE();
SET @sql = IF(
EXISTS(
SELECT 1 FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'ai_chat_list' AND COLUMN_NAME = 'chat_type'
),
'SELECT 1',
'ALTER TABLE ai_chat_list ADD COLUMN chat_type VARCHAR(32) NOT NULL DEFAULT ''chat'' COMMENT ''记录类型:chat/writing/image/creative/activity_outline'' AFTER title'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET @sql = IF(
EXISTS(
SELECT 1 FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'ai_chat_list' AND COLUMN_NAME = 'params'
),
'SELECT 1',
'ALTER TABLE ai_chat_list ADD COLUMN params TEXT COMMENT ''生成参数快照(JSON)'' AFTER chat_type'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 历史面板按「当前用户 + 类型 + 时间」取数,原表只有主键索引。
SET @sql = IF(
EXISTS(
SELECT 1 FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'ai_chat_list'
AND INDEX_NAME = 'idx_ai_chat_list_user_type_time'
),
'SELECT 1',
'ALTER TABLE ai_chat_list ADD INDEX idx_ai_chat_list_user_type_time (user_id, chat_type, create_time)'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;