BIZ8-11 增强采购项目关联

这个提交包含在:
2026-05-13 21:42:34 +08:00
父节点 83be13df27
当前提交 32823edc1b
共修改 11 个文件,包含 737 行新增和 6 行删除
+25
查看文件
@@ -187,6 +187,7 @@ function buildProjectDetailInclude() {
tasks: true,
risks: true,
reimbursements: true,
purchase_requests: true,
travel_requests: true,
todo_items: true,
weekly_reports: true,
@@ -425,6 +426,7 @@ function mapProjectDetail(project) {
tasks: project._count?.tasks ?? 0,
risks: project._count?.risks ?? 0,
reimbursements: project._count?.reimbursements ?? 0,
purchaseRequests: project._count?.purchase_requests ?? 0,
travelRequests: project._count?.travel_requests ?? 0,
todoItems: project._count?.todo_items ?? 0,
weeklyReports: project._count?.weekly_reports ?? 0,
@@ -861,6 +863,29 @@ async function projectsRoutes(fastify) {
return sendData(reply, request, { totalAmount: totalAmount.toFixed(2), items: items.map((item) => ({ id: item.id, requestNo: item.request_no ?? item.id, status: item.status, estimatedAmount: String(item.estimated_amount ?? 0), startDate: item.start_date?.toISOString?.().slice(0, 10) ?? null, endDate: item.end_date?.toISOString?.().slice(0, 10) ?? null, updatedAt: item.updated_at?.toISOString?.() ?? null })) });
});
fastify.get("/projects/:id/purchase-requests/summary", { preHandler: fastify.authenticate }, async (request, reply) => {
await ensureFeatureEnabled(fastify, request, FEATURE_FLAG_KEYS.projectLinking);
const projectId = parseId(request.params?.id);
await ensureReadableProject(fastify, request, projectId);
const items = await fastify.prisma.purchaseRequest.findMany({
where: { project_id: projectId },
orderBy: { updated_at: "desc" },
select: { id: true, request_no: true, title: true, status: true, total_amount: true, updated_at: true },
});
const totalAmount = items.reduce((sum, item) => sum + Number(item.total_amount ?? 0), 0);
return sendData(reply, request, {
totalAmount: totalAmount.toFixed(2),
items: items.map((item) => ({
id: item.id,
requestNo: item.request_no ?? item.id,
title: item.title,
status: item.status,
totalAmount: String(item.total_amount ?? 0),
updatedAt: item.updated_at?.toISOString?.() ?? null,
})),
});
});
fastify.get("/projects/:id/weekly-reports", { preHandler: fastify.authenticate }, async (request, reply) => {
await ensureFeatureEnabled(fastify, request, FEATURE_FLAG_KEYS.projectLinking);
const projectId = parseId(request.params?.id);