86 lines
3.2 KiB
TypeScript

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 })
}
}