From d27ca6cd58fb22b54e289854f943d6f07dd9055b Mon Sep 17 00:00:00 2001 From: leeyongjae Date: Thu, 21 Nov 2024 13:24:10 +0900 Subject: [PATCH] =?UTF-8?q?=EB=B0=9C=EC=A0=84=EC=8B=9C=EB=AC=BC=EB=A0=88?= =?UTF-8?q?=EC=9D=B4=EC=85=98=20excel,=20pdf=20=EB=8B=A4=EC=9A=B4=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/floor-plan/CanvasMenu.jsx | 56 +++++++++++++++++++++++- src/components/simulator/Simulator.jsx | 11 ++++- src/store/simulatorAtom.js | 8 ++++ 3 files changed, 71 insertions(+), 4 deletions(-) create mode 100644 src/store/simulatorAtom.js diff --git a/src/components/floor-plan/CanvasMenu.jsx b/src/components/floor-plan/CanvasMenu.jsx index 99694f12..f6f2f481 100644 --- a/src/components/floor-plan/CanvasMenu.jsx +++ b/src/components/floor-plan/CanvasMenu.jsx @@ -38,6 +38,10 @@ import DocDownOptionPop from '../estimate/popup/DocDownOptionPop' import { FloorPlanContext } from '@/app/floor-plan/FloorPlanProvider' import EstimateCopyPop from '../estimate/popup/EstimateCopyPop' +import { floorPlanObjectState } from '@/store/floorPlanObjectAtom' +import { pwrGnrSimTypeState } from '@/store/simulatorAtom' +import { useAxios } from '@/hooks/useAxios' + export default function CanvasMenu(props) { const { menuNumber, setMenuNumber } = props const pathname = usePathname() @@ -189,6 +193,54 @@ export default function CanvasMenu(props) { return ([2, 3].some((num) => num === canvasSetting?.roofSizeSet) && menu.index === 2) || (menuNumber === 4 && menu.index === 2) } + // 발전시물레이션 Excel/PDF 다운 + const { promisePost } = useAxios(globalLocale) + const objectRecoil = useRecoilValue(floorPlanObjectState) + const pwrGnrSimTypeRecoil = useRecoilValue(pwrGnrSimTypeState) + + const { plans } = usePlan() + const plan = plans.find((plan) => plan.isCurrent === true) + + const handleExcelPdfFileDown = async (donwloadType, drawingFlg) => { + const url = '/api/estimate/excel-download' + + const params = { + objectNo: objectRecoil.floorPlanObjectNo, + planNo: plan?.id, + schDownload: donwloadType, + schDrawingFlg: drawingFlg, + pwrGnrSimType: pwrGnrSimTypeRecoil.type, + } + + const options = { responseType: 'blob' } + await promisePost({ url: url, data: params, option: options }) + .then((resultData) => { + if (resultData) { + let fileName = 'unknow' + const blob = new Blob([resultData.data], { type: resultData.headers['content-type'] || 'application/octet-stream' }) + const fileUrl = window.URL.createObjectURL(blob) + + const link = document.createElement('a') + link.href = fileUrl + + //서버에서 내려오는 파일명 + const contentDisposition = resultData.headers['content-disposition'] + if (contentDisposition) { + fileName = contentDisposition.split('filename=')[1].replace(/['"]/g, '') + } + + link.download = fileName + document.body.appendChild(link) + link.click() + link.remove() + window.URL.revokeObjectURL(fileUrl) + } + }) + .catch((error) => { + alert('File does not exist.') + }) + } + return (
num === menuNumber) ? 'active' : ''}`}>
@@ -299,11 +351,11 @@ export default function CanvasMenu(props) { {menuNumber === 6 && ( <>
- - diff --git a/src/components/simulator/Simulator.jsx b/src/components/simulator/Simulator.jsx index 90687c1b..fcef3a08 100644 --- a/src/components/simulator/Simulator.jsx +++ b/src/components/simulator/Simulator.jsx @@ -5,8 +5,9 @@ import { Bar } from 'react-chartjs-2' import dayjs from 'dayjs' import { useEffect, useState, useRef } from 'react' -import { useRecoilValue } from 'recoil' +import { useRecoilValue, useRecoilState } from 'recoil' import { floorPlanObjectState } from '@/store/floorPlanObjectAtom' +import { pwrGnrSimTypeState } from '@/store/simulatorAtom' import { useAxios } from '@/hooks/useAxios' import { useMessage } from '@/hooks/useMessage' @@ -107,6 +108,8 @@ export default function Simulator() { if (objectNo) { fetchObjectDetail(objectNo) fetchSimulatorNotice() + setPwrGnrSimType('D') + setPwrRecoil({ ...pwrRecoil, type: 'D' }) } }, [objectNo, plan]) @@ -168,8 +171,10 @@ export default function Simulator() { // 차트 데이터 변경 시, list type 셋팅 const [pwrGnrSimType, setPwrGnrSimType] = useState('D') + const [pwrRecoil, setPwrRecoil] = useRecoilState(pwrGnrSimTypeState) + const handleChartChangeData = (type) => { - setPwrGnrSimType(type) + setPwrRecoil({ ...pwrRecoil, type: type }) switch (type) { case 'A': setChartData(hatsudenryouAll) @@ -251,9 +256,11 @@ export default function Simulator() {