import { ipcMain } from "electron"; import DBMain from "../db/main"; import type { KeywordGroup } from "../../../src/types/smartSubtitle"; // 获取所有关键词分组 const getAllKeywordGroups = async (): Promise => { try { console.log('[keywordGroup:getAllKeywordGroups] IPC 处理器被调用'); // 检查数据库是否初始化 if (!DBMain) { console.error('[keywordGroup:getAllKeywordGroups] ❌ DBMain 未定义'); return []; } console.log('[keywordGroup:getAllKeywordGroups] 准备执行数据库查询...'); const groups = await DBMain.select( `SELECT * FROM keyword_groups WHERE id NOT LIKE 'test_group_%' AND name != '测试分组-全部字统一特效' ORDER BY createdAt DESC` ); console.log('[keywordGroup:getAllKeywordGroups] 数据库查询完成,返回结果:', { count: groups?.length || 0, groups: groups?.map((g: any) => ({ id: g.id, name: g.name })) || [] }); // 🔍 调试:显示所有分组的贴纸数据 console.log('[keywordGroup:getAllKeywordGroups] 所有分组的贴纸数据:'); groups.forEach((g: any, idx: number) => { console.log(` 分组 #${idx} "${g.name}": stickerId=${g.stickerId}, stickerConfig=${g.stickerConfig}`); }); const result = groups.map((group: any) => ({ ...group, keywords: JSON.parse(group.keywords || "[]"), styleOverride: group.styleOverride ? JSON.parse(group.styleOverride) : undefined, // 🔧 修复:为 effectConfig 和 styleConfig 提供默认值以通过前端验证 effectConfig: group.effectConfig ? JSON.parse(group.effectConfig) : { type: 'pulse-scale', duration: 600, delay: 0, intensity: 0.8 }, styleConfig: group.styleConfig ? JSON.parse(group.styleConfig) : { fontSize: 64, fontColor: '#FFFFFF', outlineColor: '#000000', outlineWidth: 2 }, // 🔧 修复:贴纸字段直接从对应列读取(stickerId, stickerConfig) stickerId: group.stickerId, // 直接读取贴纸ID列 stickerConfig: group.stickerConfig ? JSON.parse(group.stickerConfig) : undefined // 直接读取贴纸配置列 })); // 🔍 调试:显示映射后的结果 console.log('[keywordGroup:getAllKeywordGroups] 映射后的第一个分组:'); if (result.length > 0) { console.log(` ID: ${result[2]?.id}`); console.log(` Name: ${result[2]?.name}`); console.log(` stickerId: ${result[2]?.stickerId}`); console.log(` stickerConfig: ${JSON.stringify(result[2]?.stickerConfig)}`); } console.log('[keywordGroup:getAllKeywordGroups] ✅ 返回最终结果,数量:', result.length); return result; } catch (error) { console.error('[keywordGroup:getAllKeywordGroups] ❌ 异常:', { message: error?.message, stack: error?.stack }); return []; } }; // 保存关键词分组 const saveKeywordGroup = async (group: KeywordGroup): Promise<{ success: boolean; id?: string; message?: string }> => { try { const now = Date.now(); const existingGroup = await DBMain.first( `SELECT id FROM keyword_groups WHERE id = ?`, [group.id] ); const keywords = JSON.stringify(group.keywords || []); const styleOverride = group.styleOverride ? JSON.stringify(group.styleOverride) : null; const effectConfig = group.effectConfig ? JSON.stringify(group.effectConfig) : null; const styleConfig = group.styleConfig ? JSON.stringify(group.styleConfig) : null; const stickerConfig = group.stickerConfig ? JSON.stringify(group.stickerConfig) : null; // 🆕 const soundEffectConfig = group.soundEffectConfig ? JSON.stringify(group.soundEffectConfig) : null; // 🆕 // 🔍 调试:显示即将保存的贴纸数据 console.log('[keywordGroup:saveGroup] 准备保存的贴纸数据:', { groupId: group.id, groupName: group.name, stickerId: group.stickerId, stickerConfig: group.stickerConfig, stickerConfigStringified: stickerConfig }); if (existingGroup) { // 更新现有分组 await DBMain.update( `UPDATE keyword_groups SET name = ?, description = ?, keywords = ?, color = ?, effectId = ?, styleOverride = ?, effectConfig = ?, styleConfig = ?, stickerId = ?, stickerConfig = ?, effectDuration = ?, sound_effect_id = ?, sound_effect_config = ?, updatedAt = ? WHERE id = ?`, [ group.name, group.description || null, keywords, group.color || null, group.effectId || null, styleOverride, effectConfig, styleConfig, group.stickerId || null, stickerConfig, group.effectDuration || null, group.soundEffectId || null, soundEffectConfig, now, group.id ] ); console.log('[keywordGroup:saveGroup] ✅ UPDATE 成功,groupId:', group.id, 'stickerId:', group.stickerId); } else { // 插入新分组 await DBMain.insert( `INSERT INTO keyword_groups (id, name, description, keywords, color, effectId, styleOverride, effectConfig, styleConfig, stickerId, stickerConfig, effectDuration, sound_effect_id, sound_effect_config, createdAt, updatedAt) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [ group.id, group.name, group.description || null, keywords, group.color || null, group.effectId || null, styleOverride, effectConfig, styleConfig, group.stickerId || null, stickerConfig, group.effectDuration || null, group.soundEffectId || null, soundEffectConfig, now, now ] ); console.log('[keywordGroup:saveGroup] ✅ INSERT 成功,groupId:', group.id, 'stickerId:', group.stickerId); } return { success: true, id: group.id }; } catch (error) { console.error("保存关键词分组失败:", error); return { success: false, message: "保存关键词分组失败" }; } }; // 删除关键词分组 const deleteKeywordGroup = async (groupId: string): Promise<{ success: boolean; message?: string }> => { try { await DBMain.delete( `DELETE FROM keyword_groups WHERE id = ?`, [groupId] ); return { success: true }; } catch (error) { console.error("删除关键词分组失败:", error); return { success: false, message: "删除关键词分组失败" }; } }; // 查询关键词所属的分组 const queryKeyword = async (keyword: string): Promise => { try { const groups = await getAllKeywordGroups(); for (const group of groups) { const groupKeywords = group.keywords || []; const found = groupKeywords.some((kw: any) => { const kwStr = typeof kw === 'string' ? kw : kw.keyword; return kwStr === keyword; }); if (found) { return group; } } return null; } catch (error) { console.error("查询关键词所属分组失败:", error); return null; } }; // 批量查询关键词 const queryKeywordBatch = async (keywords: string[]): Promise> => { try { const result = new Map(); const groups = await getAllKeywordGroups(); for (const keyword of keywords) { for (const group of groups) { const groupKeywords = group.keywords || []; const found = groupKeywords.some((kw: any) => { const kwStr = typeof kw === 'string' ? kw : kw.keyword; return kwStr === keyword; }); if (found) { result.set(keyword, group); break; } } } return result; } catch (error) { console.error("批量查询关键词所属分组失败:", error); return new Map(); } }; // 注册IPC处理程序 const registerIpcHandlers = () => { console.log('[keywordGroup:registerIpcHandlers] 开始注册关键词分组 IPC 处理器...'); // 获取所有关键词分组 ipcMain.handle("keywordGroup:getAllGroups", async () => { console.log('[keywordGroup:IPC:getAllGroups] 处理器被触发'); return await getAllKeywordGroups(); }); console.log('[keywordGroup:registerIpcHandlers] ✓ 已注册 keywordGroup:getAllGroups'); // 保存关键词分组 ipcMain.handle("keywordGroup:saveGroup", async (event, group: KeywordGroup) => { console.log('[keywordGroup:IPC:saveGroup] 处理器被触发,groupId:', group.id); return await saveKeywordGroup(group); }); console.log('[keywordGroup:registerIpcHandlers] ✓ 已注册 keywordGroup:saveGroup'); // 删除关键词分组 ipcMain.handle("keywordGroup:deleteGroup", async (event, groupId: string) => { console.log('[keywordGroup:IPC:deleteGroup] 处理器被触发,groupId:', groupId); return await deleteKeywordGroup(groupId); }); console.log('[keywordGroup:registerIpcHandlers] ✓ 已注册 keywordGroup:deleteGroup'); // 查询关键词所属分组 ipcMain.handle("keywordGroup:queryKeyword", async (event, keyword: string) => { console.log('[keywordGroup:IPC:queryKeyword] 处理器被触发,keyword:', keyword); return await queryKeyword(keyword); }); console.log('[keywordGroup:registerIpcHandlers] ✓ 已注册 keywordGroup:queryKeyword'); // 批量查询关键词 ipcMain.handle("keywordGroup:queryKeywordBatch", async (event, keywords: string[]) => { console.log('[keywordGroup:IPC:queryKeywordBatch] 处理器被触发,keywords数量:', keywords.length); const result = await queryKeywordBatch(keywords); return Array.from(result.entries()).map(([keyword, group]) => ({ keyword, group })); }); console.log('[keywordGroup:registerIpcHandlers] ✓ 已注册 keywordGroup:queryKeywordBatch'); console.log('[keywordGroup:registerIpcHandlers] ===================== 所有 IPC 处理器注册完成 ====================='); }; export default { getAllKeywordGroups, saveKeywordGroup, deleteKeywordGroup, queryKeyword, queryKeywordBatch, registerIpcHandlers };