This commit is contained in:
freedakgmail
2025-12-21 17:32:33 +08:00
parent cffdd75e96
commit 5c8c70097c
190 changed files with 2746 additions and 893 deletions
+111 -1
View File
@@ -6,6 +6,7 @@ import { checkPermission } from "@/lib/permissions"
import { Role, Gender } from "@prisma/client"
import { z } from "zod"
import { recordMemberHistory } from "@/lib/member-history"
import { recalculateGenerations, getMinGeneration, findNewRootMember } from "@/lib/generation-utils"
const createMemberSchema = z.object({
surname: z.string().min(1),
@@ -122,6 +123,35 @@ export async function POST(
const body = await req.json()
const data = createMemberSchema.parse(body)
// 检查是否需要调整全族代数
const minGeneration = await getMinGeneration(treeId)
let needRecalculate = false
let generationOffset = 0
// 检查是否给第1代成员添加父母
let isAddingParentToFounder = false
if (data.childrenIds && data.childrenIds.length > 0) {
// 检查子女中是否有第1代成员
const children = await prisma.familyMember.findMany({
where: {
id: { in: data.childrenIds },
generation: 1
},
select: { id: true }
})
isAddingParentToFounder = children.length > 0
}
if (minGeneration !== null && data.generation < minGeneration) {
// 新成员的代数小于当前最小代数,需要调整全族代数
needRecalculate = true
generationOffset = minGeneration - data.generation
} else if (isAddingParentToFounder && minGeneration === 1) {
// 给第1代成员添加父母,需要将全族代数+1
needRecalculate = true
generationOffset = 1
}
const member = await prisma.familyMember.create({
data: {
...data,
@@ -204,6 +234,82 @@ export async function POST(
}
}
// 如果需要调整全族代数
if (needRecalculate) {
try {
if (isAddingParentToFounder) {
// 给第1代成员添加父母的情况
// 1. 先将所有现有成员的代数+1(包括原来的第1代)
await recalculateGenerations(treeId, generationOffset, member.id)
// 2. 将原始祖的 isFounder 设为 false
const oldFounders = await prisma.familyMember.findMany({
where: {
treeId,
isFounder: true,
id: { not: member.id }
}
})
for (const oldFounder of oldFounders) {
await prisma.familyMember.update({
where: { id: oldFounder.id },
data: { isFounder: false }
})
}
// 3. 新父母成员保持代数为1,并设为始祖
await prisma.familyMember.update({
where: { id: member.id },
data: { generation: 1, isFounder: true }
})
// 4. 更新家族树的 rootMemberId 为新父母
await prisma.familyTree.update({
where: { id: treeId },
data: { rootMemberId: member.id }
})
} else {
// 其他情况:新成员代数小于最小代数
// 调整其他成员的代数(排除新创建的成员)
await recalculateGenerations(treeId, generationOffset, member.id)
// 将新成员的代数设为1(成为新的始祖)
await prisma.familyMember.update({
where: { id: member.id },
data: { generation: 1 }
})
// 更新家族树的 rootMemberId
await prisma.familyTree.update({
where: { id: treeId },
data: { rootMemberId: member.id }
})
}
// 记录全族代数调整的日志
await prisma.activityLog.create({
data: {
treeId,
userId: session.user.id,
action: 'UPDATE',
entityType: 'TREE',
entityId: treeId,
entityName: `全族代数调整(+${generationOffset}代)`,
changes: {
reason: isAddingParentToFounder ? '给始祖添加父母' : '添加更早代数成员',
offset: generationOffset,
newRootMemberId: member.id
}
}
})
} catch (error) {
console.error('调整全族代数失败:', error)
// 如果调整失败,删除新创建的成员
await prisma.familyMember.delete({ where: { id: member.id } })
throw new Error('调整全族代数失败,操作已回滚')
}
}
// 记录成员历史版本
await recordMemberHistory({
memberId: member.id,
@@ -225,7 +331,11 @@ export async function POST(
}
})
return NextResponse.json({ member }, { status: 201 })
return NextResponse.json({
member,
generationRecalculated: needRecalculate,
generationOffset: needRecalculate ? generationOffset : 0
}, { status: 201 })
} catch (error) {
if (error instanceof z.ZodError) {
return NextResponse.json(