86 lines
3.2 KiB
TypeScript
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 })
|
|
}
|
|
}
|