import { NextRequest, NextResponse } from "next/server" import { getServerSession } from "next-auth" import { authOptions } from "@/lib/auth" import { prisma } from "@/lib/prisma" import { checkPermission } from "@/lib/permissions" import { Role } from "@prisma/client" import { recordMemberHistory } from "@/lib/member-history" import { recalculateGenerations, isRootMember, hasChildren, findNewRootMember } from "@/lib/generation-utils" // 获取单个成员 export async function GET( req: NextRequest, { params }: { params: Promise<{ treeId: string; memberId: string }> } ) { try { const session = await getServerSession(authOptions) if (!session?.user?.id) { return NextResponse.json({ error: "未授权" }, { status: 401 }) } const { treeId, memberId } = await params // 检查权限 const { hasPermission } = await checkPermission(session.user.id, treeId) if (!hasPermission) { return NextResponse.json({ error: "无权访问此家族树" }, { status: 403 }) } const member = await prisma.familyMember.findFirst({ where: { id: memberId, treeId, } }) if (!member) { return NextResponse.json({ error: "成员不存在" }, { status: 404 }) } return NextResponse.json({ member }) } catch (error) { console.error("获取成员失败:", error) return NextResponse.json( { error: "获取成员失败" }, { status: 500 } ) } } // 更新成员 export async function PATCH( req: NextRequest, { params }: { params: Promise<{ treeId: string; memberId: string }> } ) { try { const session = await getServerSession(authOptions) if (!session?.user?.id) { return NextResponse.json({ error: "未授权" }, { status: 401 }) } const { treeId, memberId } = await params // 检查权限(需要 EDITOR 权限) const { hasPermission } = await checkPermission(session.user.id, treeId, Role.EDITOR) if (!hasPermission) { return NextResponse.json({ error: "无权限修改成员" }, { status: 403 }) } const body = await req.json() // 检查成员是否存在 const existingMember = await prisma.familyMember.findFirst({ where: { id: memberId, treeId, } }) if (!existingMember) { return NextResponse.json({ error: "成员不存在" }, { status: 404 }) } const member = await prisma.familyMember.update({ where: { id: memberId }, data: { ...body, updatedAt: new Date(), } }) // 维护配偶双向关系 if (body.spouseIds !== undefined) { const newSpouseIds = body.spouseIds || [] const oldSpouseIds = existingMember.spouseIds || [] // 添加新配偶的反向关系 for (const spouseId of newSpouseIds) { if (!oldSpouseIds.includes(spouseId)) { const spouse = await prisma.familyMember.findUnique({ where: { id: spouseId } }) if (spouse && !spouse.spouseIds.includes(memberId)) { await prisma.familyMember.update({ where: { id: spouseId }, data: { spouseIds: [...spouse.spouseIds, memberId] } }) } } } // 移除旧配偶的反向关系 for (const oldSpouseId of oldSpouseIds) { if (!newSpouseIds.includes(oldSpouseId)) { const spouse = await prisma.familyMember.findUnique({ where: { id: oldSpouseId } }) if (spouse && spouse.spouseIds.includes(memberId)) { await prisma.familyMember.update({ where: { id: oldSpouseId }, data: { spouseIds: spouse.spouseIds.filter(id => id !== memberId) } }) } } } } // 维护父母-子女双向关系 // 1. 处理父亲关系变化 if (body.fatherId !== undefined) { const oldFatherId = existingMember.fatherId const newFatherId = body.fatherId // 从旧父亲的子女列表中移除 if (oldFatherId && oldFatherId !== newFatherId) { const oldFather = await prisma.familyMember.findUnique({ where: { id: oldFatherId } }) if (oldFather && oldFather.childrenIds.includes(memberId)) { await prisma.familyMember.update({ where: { id: oldFatherId }, data: { childrenIds: oldFather.childrenIds.filter(id => id !== memberId) } }) } } // 添加到新父亲的子女列表 if (newFatherId && newFatherId !== oldFatherId) { const newFather = await prisma.familyMember.findUnique({ where: { id: newFatherId } }) if (newFather && !newFather.childrenIds.includes(memberId)) { await prisma.familyMember.update({ where: { id: newFatherId }, data: { childrenIds: [...newFather.childrenIds, memberId] } }) } } } // 2. 处理母亲关系变化 if (body.motherId !== undefined) { const oldMotherId = existingMember.motherId const newMotherId = body.motherId // 从旧母亲的子女列表中移除 if (oldMotherId && oldMotherId !== newMotherId) { const oldMother = await prisma.familyMember.findUnique({ where: { id: oldMotherId } }) if (oldMother && oldMother.childrenIds.includes(memberId)) { await prisma.familyMember.update({ where: { id: oldMotherId }, data: { childrenIds: oldMother.childrenIds.filter(id => id !== memberId) } }) } } // 添加到新母亲的子女列表 if (newMotherId && newMotherId !== oldMotherId) { const newMother = await prisma.familyMember.findUnique({ where: { id: newMotherId } }) if (newMother && !newMother.childrenIds.includes(memberId)) { await prisma.familyMember.update({ where: { id: newMotherId }, data: { childrenIds: [...newMother.childrenIds, memberId] } }) } } } // 3. 处理子女关系变化 if (body.childrenIds !== undefined) { const newChildrenIds = body.childrenIds || [] const oldChildrenIds = existingMember.childrenIds || [] // 添加新子女的父母关系 for (const childId of newChildrenIds) { if (!oldChildrenIds.includes(childId)) { const child = await prisma.familyMember.findUnique({ where: { id: childId } }) if (child) { // 根据当前成员的性别设置为父亲或母亲 if (member.gender === 'MALE' && !child.fatherId) { await prisma.familyMember.update({ where: { id: childId }, data: { fatherId: memberId } }) } else if (member.gender === 'FEMALE' && !child.motherId) { await prisma.familyMember.update({ where: { id: childId }, data: { motherId: memberId } }) } } } } // 移除旧子女的父母关系 for (const oldChildId of oldChildrenIds) { if (!newChildrenIds.includes(oldChildId)) { const child = await prisma.familyMember.findUnique({ where: { id: oldChildId } }) if (child) { // 根据当前成员的性别移除父亲或母亲 if (member.gender === 'MALE' && child.fatherId === memberId) { await prisma.familyMember.update({ where: { id: oldChildId }, data: { fatherId: null } }) } else if (member.gender === 'FEMALE' && child.motherId === memberId) { await prisma.familyMember.update({ where: { id: oldChildId }, data: { motherId: null } }) } } } } } // 记录成员历史版本 const historyRecord = await recordMemberHistory({ memberId: member.id, treeId, changedBy: session.user.id, changeType: 'UPDATE', oldData: existingMember, newData: member }) // 记录操作日志,使用历史记录中的详细变更信息 await prisma.activityLog.create({ data: { treeId, userId: session.user.id, action: 'UPDATE', entityType: 'MEMBER', entityId: member.id, entityName: member.fullName, changes: historyRecord?.changes || body, } }) return NextResponse.json({ member }) } catch (error) { console.error("更新成员失败:", error) return NextResponse.json( { error: "更新成员失败" }, { status: 500 } ) } } // 删除成员 export async function DELETE( req: NextRequest, { params }: { params: Promise<{ treeId: string; memberId: string }> } ) { try { const session = await getServerSession(authOptions) if (!session?.user?.id) { return NextResponse.json({ error: "未授权" }, { status: 401 }) } const { treeId, memberId } = await params // 检查权限(需要 EDITOR 权限) const { hasPermission } = await checkPermission(session.user.id, treeId, Role.EDITOR) if (!hasPermission) { return NextResponse.json({ error: "无权限删除成员" }, { status: 403 }) } // 检查成员是否存在 const existingMember = await prisma.familyMember.findFirst({ where: { id: memberId, treeId, } }) if (!existingMember) { return NextResponse.json({ error: "成员不存在" }, { status: 404 }) } // 获取家族树信息 const tree = await prisma.familyTree.findUnique({ where: { id: treeId }, select: { rootMemberId: true } }) // 检查是否删除的是根成员(始祖) const isDeletingRoot = await isRootMember(memberId) const memberHasChildren = await hasChildren(memberId) let needRecalculate = false let newRootId: string | null = null // 如果删除的是根成员且有子女,需要调整全族代数 if (isDeletingRoot && memberHasChildren) { needRecalculate = true } // 清理关系引用 // 1. 清理配偶关系 if (existingMember.spouseIds && existingMember.spouseIds.length > 0) { for (const spouseId of existingMember.spouseIds) { const spouse = await prisma.familyMember.findUnique({ where: { id: spouseId } }) if (spouse && spouse.spouseIds.includes(memberId)) { await prisma.familyMember.update({ where: { id: spouseId }, data: { spouseIds: spouse.spouseIds.filter(id => id !== memberId) } }) } } } // 2. 清理父母的子女引用 if (existingMember.fatherId) { const father = await prisma.familyMember.findUnique({ where: { id: existingMember.fatherId } }) if (father && father.childrenIds.includes(memberId)) { await prisma.familyMember.update({ where: { id: existingMember.fatherId }, data: { childrenIds: father.childrenIds.filter(id => id !== memberId) } }) } } if (existingMember.motherId) { const mother = await prisma.familyMember.findUnique({ where: { id: existingMember.motherId } }) if (mother && mother.childrenIds.includes(memberId)) { await prisma.familyMember.update({ where: { id: existingMember.motherId }, data: { childrenIds: mother.childrenIds.filter(id => id !== memberId) } }) } } // 3. 清理子女的父母引用 if (existingMember.childrenIds && existingMember.childrenIds.length > 0) { for (const childId of existingMember.childrenIds) { const child = await prisma.familyMember.findUnique({ where: { id: childId } }) if (child) { const updates: any = {} if (child.fatherId === memberId) { updates.fatherId = null } if (child.motherId === memberId) { updates.motherId = null } if (Object.keys(updates).length > 0) { await prisma.familyMember.update({ where: { id: childId }, data: updates }) } } } } // 删除成员 await prisma.familyMember.delete({ where: { id: memberId } }) // 如果需要调整全族代数 if (needRecalculate) { try { // 将所有成员的代数 -1 await recalculateGenerations(treeId, -1) // 查找新的根成员 newRootId = await findNewRootMember(treeId) if (newRootId) { // 更新家族树的 rootMemberId await prisma.familyTree.update({ where: { id: treeId }, data: { rootMemberId: newRootId } }) // 将新根成员设为始祖 await prisma.familyMember.update({ where: { id: newRootId }, data: { isFounder: true } }) } else { // 如果没有找到新的根成员,清空 rootMemberId await prisma.familyTree.update({ where: { id: treeId }, data: { rootMemberId: null } }) } // 记录全族代数调整的日志 await prisma.activityLog.create({ data: { treeId, userId: session.user.id, action: 'UPDATE', entityType: 'TREE', entityId: treeId, entityName: `全族代数调整(-1代)`, changes: { reason: '删除始祖', offset: -1, newRootMemberId: newRootId, deletedMemberId: memberId, deletedMemberName: existingMember.fullName } } }) } catch (error) { console.error('调整全族代数失败:', error) // 注意:此时成员已被删除,无法回滚 // 记录错误日志 await prisma.activityLog.create({ data: { treeId, userId: session.user.id, action: 'ERROR', entityType: 'TREE', entityId: treeId, entityName: '代数调整失败', changes: { error: '删除始祖后调整代数失败', deletedMemberId: memberId } } }) } } else if (tree?.rootMemberId === memberId) { // 如果删除的是根成员但没有子女,需要更新 rootMemberId // 情况1: 有配偶,配偶成为新根 if (existingMember.spouseIds && existingMember.spouseIds.length > 0) { const newRoot = existingMember.spouseIds[0] await prisma.familyTree.update({ where: { id: treeId }, data: { rootMemberId: newRoot } }) } else { // 情况2: 无配偶无子女,清空 rootMemberId await prisma.familyTree.update({ where: { id: treeId }, data: { rootMemberId: null } }) } } // 记录操作日志 await prisma.activityLog.create({ data: { treeId, userId: session.user.id, action: 'DELETE', entityType: 'MEMBER', entityId: memberId, entityName: existingMember.fullName, } }) return NextResponse.json({ success: true, generationRecalculated: needRecalculate, newRootMemberId: newRootId }) } catch (error) { console.error("删除成员失败:", error) return NextResponse.json( { error: "删除成员失败" }, { status: 500 } ) } }