import { db } from "./db" import { prisma } from "./prisma" import type { FamilyMember } from "@/types/family" /** * 从 IndexedDB 迁移数据到 PostgreSQL * @param treeId 目标家族树ID * @param userId 用户ID */ export async function migrateFromIndexedDB(treeId: string, userId: string) { try { console.log("🚀 开始数据迁移...") // 1. 从 IndexedDB 读取所有成员 const members = await db.members.toArray() console.log(`📊 找到 ${members.length} 个成员`) if (members.length === 0) { console.log("⚠️ 没有数据需要迁移") return { success: true, count: 0 } } // 2. 获取 rootId const rootIdSetting = await db.settings.get("rootId") const rootId = rootIdSetting?.value // 3. 批量创建成员 let successCount = 0 let errorCount = 0 for (const member of members) { try { await prisma.familyMember.create({ data: { id: member.id, treeId, surname: member.surname, givenName: member.givenName, fullName: member.fullName, gender: member.gender.toUpperCase() as "MALE" | "FEMALE", generation: member.generation, generationName: member.generationName, courtesyName: member.courtesyName, artName: member.artName, posthumousName: member.posthumousName, rank: member.rank, birthDate: member.birthDate, deathDate: member.deathDate, isLunarDate: member.isLunarDate || false, ancestralHome: member.ancestralHome, birthPlace: member.birthPlace, burialPlace: member.burialPlace, phone: member.phone, telephone: member.telephone, email: member.email, address: member.address, fatherId: member.fatherId, motherId: member.motherId, spouseIds: member.spouseIds || [], childrenIds: member.childrenIds || [], spouseFatherName: member.spouseFatherName, spouseMotherName: member.spouseMotherName, bio: member.bio, tags: member.tags || [], avatarUrl: member.avatarUrl, avatarImageId: member.avatarImageId, photoIds: member.photoIds || [], } }) successCount++ console.log(`✅ 迁移成员: ${member.fullName}`) } catch (error) { errorCount++ console.error(`❌ 迁移失败: ${member.fullName}`, error) } } // 4. 更新家族树的 rootMemberId if (rootId) { await prisma.familyTree.update({ where: { id: treeId }, data: { rootMemberId: rootId } }) } // 5. 记录迁移日志 await prisma.activityLog.create({ data: { treeId, userId, action: "IMPORT", entityType: "MEMBER", entityName: `迁移 ${successCount} 个成员`, } }) console.log(`✅ 迁移完成!成功: ${successCount}, 失败: ${errorCount}`) return { success: true, count: successCount, errors: errorCount, total: members.length } } catch (error) { console.error("❌ 迁移失败:", error) throw error } } /** * 清空 IndexedDB 数据(迁移后可选) */ export async function clearIndexedDB() { try { await db.members.clear() await db.settings.clear() await db.activityLogs.clear() console.log("✅ IndexedDB 数据已清空") return { success: true } } catch (error) { console.error("❌ 清空失败:", error) throw error } }