import React from 'react' import { NextRequest, NextResponse } from 'next/server' import { pdf, Document } from '@react-pdf/renderer' import { prisma } from '@/libs/prisma' import { type Suitable } from '@/types/Suitable' import SuitablePdf from '@/components/pdf/SuitablePdf' export async function POST(request: NextRequest) { // 파라미터 체크 const formData = await request.formData() const ids = formData.get('ids') as string const detailIds = formData.get('detailIds') as string const fileTitle = formData.get('fileTitle') as string if (ids === '' || detailIds === '' || fileTitle === '') { return NextResponse.json({ error: '필수 파라미터가 누락되었습니다' }, { status: 400 }) } try { let query = ` SELECT msm.id , msm.product_name as productName , ( SELECT bcl.code_jp FROM BC_COMM_L bcl WHERE bcl.head_cd = (SELECT head_cd FROM BC_COMM_H bch WHERE head_id = 'MANU_FT_CD') AND bcl.code = msm.manu_ft_cd ) AS manuFtCd , ( SELECT bcl.code_jp FROM BC_COMM_L bcl WHERE bcl.head_cd = (SELECT head_cd FROM BC_COMM_H bch WHERE head_id = 'ROOF_MT_CD') AND bcl.code = msm.roof_mt_cd ) AS roofMtCd , ( SELECT bcl.code_jp FROM BC_COMM_L bcl WHERE bcl.head_cd = (SELECT head_cd FROM BC_COMM_H bch WHERE head_id = 'ROOF_SH_CD') AND bcl.code = msm.roof_sh_cd ) AS roofShCd , details.detail FROM ms_suitable_main msm LEFT JOIN ( SELECT msd.main_id , ( SELECT msd_json.id , ( SELECT bcl.code_jp FROM BC_COMM_L bcl WHERE bcl.head_cd = (SELECT head_cd FROM BC_COMM_H bch WHERE head_id = 'TRESTLE_MFPC_CD') AND bcl.code = msd_json.trestle_mfpc_cd ) AS trestleMfpcCd , msd_json.trestle_manufacturer_product_name as trestleManufacturerProductName , msd_json.memo FROM ms_suitable_detail msd_json WHERE msd.main_id = msd_json.main_id AND msd_json.id IN (:detailIds) FOR JSON PATH ) AS detail FROM ms_suitable_detail msd GROUP BY msd.main_id ) AS details ON msm.id = details.main_id AND details.main_id IN (:mainIds) WHERE msm.id IN (:mainIds) ORDER BY msm.product_name; ` // 검색 조건 설정 query = query.replaceAll(':mainIds', ids) query = query.replaceAll(':detailIds', detailIds) // 데이터 조회 const suitable: Suitable[] = await prisma.$queryRawUnsafe(query) // pdf 생성 const content = React.createElement(Document, null, React.createElement(SuitablePdf, { data: suitable, fileTitle: fileTitle })) const pdfBlob = await pdf(content).toBlob() const fileName = `${fileTitle.replace(' ', '_')}.pdf` const encodedFileName = encodeURIComponent(fileName) return new Response(pdfBlob, { headers: { 'Content-Type': 'application/pdf', 'Content-Disposition': `attachment; filename="suitable.pdf"; filename*=UTF-8''${encodedFileName}`, }, }) } catch (error) { console.error('❌ 데이터 조회 중 오류가 발생했습니다:', error) return NextResponse.json({ error: '데이터 조회 중 오류가 발생했습니다' }, { status: 500 }) } }