优化计划查询避免 N+1 数据库访问

This commit is contained in:
2026-03-03 13:05:29 +08:00
parent 41ac21ea12
commit 325b7b5742
2 changed files with 45 additions and 45 deletions
+39 -41
View File
@@ -1,5 +1,4 @@
import { prisma } from "@/lib/prisma";
import { ApiError } from "@/lib/api";
export async function getLatestPlan(roomId: string, userId: string) {
const plan = await prisma.weekendPlan.findFirst({
@@ -23,28 +22,27 @@ export async function getPendingPlans(userId: string) {
endTime: { not: null, lt: new Date() },
},
orderBy: { createdAt: "desc" },
select: { id: true, planData: true, roomId: true, createdAt: true },
select: {
id: true,
planData: true,
createdAt: true,
room: { select: { name: true, code: true } },
},
take: 5,
});
const result = await Promise.all(
plans.map(async (p) => {
const room = await prisma.blindBoxRoom.findUnique({
where: { id: p.roomId },
select: { name: true, code: true },
});
const parsed = JSON.parse(p.planData);
const days = parsed.days as { date: string; items: { activity: string }[] }[];
return {
id: p.id,
roomName: room?.name ?? "未知房间",
roomCode: room?.code ?? "",
date: days.map((d) => d.date).join(" + "),
activities: days.flatMap((d) => d.items.map((i) => i.activity)),
createdAt: p.createdAt,
};
}),
);
const result = plans.map((p) => {
const parsed = JSON.parse(p.planData);
const days = parsed.days as { date: string; items: { activity: string }[] }[];
return {
id: p.id,
roomName: p.room?.name ?? "未知房间",
roomCode: p.room?.code ?? "",
date: days.map((d) => d.date).join(" + "),
activities: days.flatMap((d) => d.items.map((i) => i.activity)),
createdAt: p.createdAt,
};
});
return { pending: result };
}
@@ -56,30 +54,30 @@ export async function getHistoryPlans(userId: string) {
status: { in: ["completed", "expired"] },
},
orderBy: { createdAt: "desc" },
select: { id: true, planData: true, status: true, roomId: true, createdAt: true },
select: {
id: true,
planData: true,
status: true,
createdAt: true,
room: { select: { name: true, code: true } },
},
take: 50,
});
const result = await Promise.all(
plans.map(async (p) => {
const room = await prisma.blindBoxRoom.findUnique({
where: { id: p.roomId },
select: { name: true, code: true },
});
const parsed = JSON.parse(p.planData);
const days = parsed.days as { date: string; items: { activity: string }[] }[];
return {
id: p.id,
status: p.status,
roomName: room?.name ?? "未知房间",
roomCode: room?.code ?? "",
date: days.map((d) => d.date).join(" + "),
dayCount: days.length,
activities: days.flatMap((d) => d.items.map((i) => i.activity)),
createdAt: p.createdAt,
};
}),
);
const result = plans.map((p) => {
const parsed = JSON.parse(p.planData);
const days = parsed.days as { date: string; items: { activity: string }[] }[];
return {
id: p.id,
status: p.status,
roomName: p.room?.name ?? "未知房间",
roomCode: p.room?.code ?? "",
date: days.map((d) => d.date).join(" + "),
dayCount: days.length,
activities: days.flatMap((d) => d.items.map((i) => i.activity)),
createdAt: p.createdAt,
};
});
return { history: result };
}