From 68a3d45f3bae3b169a79f56a4cf86855f3a4864b Mon Sep 17 00:00:00 2001 From: YangJinSoo94 Date: Thu, 19 Jun 2025 14:39:50 +0900 Subject: [PATCH] =?UTF-8?q?=EC=97=91=EC=85=80=20=EC=83=81=EC=84=B8=20?= =?UTF-8?q?=EB=8B=A4=EC=9A=B4=EB=A1=9C=EB=93=9C=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/wr/app/stats/rainStat/page.tsx | 104 ++++++++++++++++++--- apps/wr/app/store/stats/rainStat/excel.tsx | 17 +++- 2 files changed, 109 insertions(+), 12 deletions(-) diff --git a/apps/wr/app/stats/rainStat/page.tsx b/apps/wr/app/stats/rainStat/page.tsx index ab855be1c..bb6184600 100644 --- a/apps/wr/app/stats/rainStat/page.tsx +++ b/apps/wr/app/stats/rainStat/page.tsx @@ -1,6 +1,7 @@ "use client"; import { useWrStore } from "@/app/store"; +import type { RainStatProps } from "@/app/store/stats/rainStat"; import { excelDownload, yearOptions } from "@/components/lib/func/commom"; import { ContentsDiv, @@ -17,7 +18,6 @@ export default function RainStat() { const { code } = useWrStore((state) => state) const { rainStat, searchRainStatList } = useWrStore((state) => state) const { rainDetailList } = rainStat; - const [ pageNation, setPageNation] = useState(1); const [searchYear, setSearchYear] = useState( String(new Date().getFullYear()) ); @@ -27,13 +27,95 @@ export default function RainStat() { }, [code.cityCd, code.sggCd, searchRainStatList, searchYear]) const excelDownLoad=() =>{ - rainDetailList.forEach((item) => { - item.forEach((item2) => { - console.log(item2); - }) - }) + const sidoList = new Set(); + const sidoDataMap = new Map(); // 시도별 데이터를 저장할 Map + + rainDetailList.forEach((item: RainStatProps[]) => { + const sidoVal = item.at(0)?.toString().trim(); + const sigunVal = item.at(1)?.toString().trim(); + + let sidoText = ''; + let sigunText = ''; + + const sido = code.cityCd.find((city) => city.val === sidoVal); + const sigun = code.sggCd.find((sgg) => sgg.val === sigunVal); + + sidoText = sido?.text || ''; + sigunText = sigun?.text || ''; + + // 시도, 시군구 코드를 텍스트로 변환하여 데이터에 할당 + if (item.length > 0) { + item[0] = sidoText as unknown as RainStatProps; + } + if (item.length > 1) { + item[1] = sigunText as unknown as RainStatProps; + } + if (item.length > 2) { + item[2] = sidoText+' '+sigunText as unknown as RainStatProps; + } + + // 시도별 데이터 수집 + if (sidoText && !sidoList.has(sidoText)) { + sidoList.add(sidoText); + // 시도별 초기 데이터 구조 생성 (예: [시도명, 0, 0, 0, ...]) + const initialData: (string | number)[] = [sidoText]; + // 데이터의 나머지 컬럼들을 0으로 초기화 (실제 컬럼 수에 맞게 조정 필요) + for (let i = 1; i < item.length; i++) { + initialData.push(0); + } + sidoDataMap.set(sidoText, initialData); + } + }); + // 시도별 합계 계산 + rainDetailList.forEach((item: RainStatProps[]) => { + const sidoText = item[0]?.toString(); + if (sidoText && sidoDataMap.has(sidoText)) { + const sidoData = sidoDataMap.get(sidoText); + // 각 컬럼의 값을 합계에 더하기 (1번 인덱스부터 시작) + for (let i = 1; i < item.length && i < sidoData.length; i++) { + if(i == 2){ + sidoData[i] = '합계'; + } else if(i == 3){ + // 해당 시도의 데이터 개수를 계산 + const sidoDataCount = rainDetailList.filter((data: unknown[]) => + Array.isArray(data) && data.length > 0 && String(data[0]) === sidoText + ).length; + sidoData[i] = sidoDataCount; + } else if( i == 4){ + sidoData[i] = ''; + } else if(i == 6){ + // 법정 대상 건축물 개수 (인덱스 6이 'Y'인 경우) + const bumCnt = rainDetailList.filter((data: unknown[]) => + Array.isArray(data) && data.length > 6 && String(data[0]) === sidoText + ).filter((data: unknown[]) => String(data[6]) === 'Y').length; + sidoData[i] = bumCnt; + } else if(i==8){ + const value = Number(item[8]) || 0; + sidoData[i] = (Number(sidoData[i]) + value) as string | number; + } else if(i==11){ + const value = Number(item[11]) || 0; + sidoData[i] = (Number(sidoData[i]) + value) as string | number; + } else if(i==12){ + const value = Number(item[12]) || 0; + sidoData[i] = (Number(sidoData[i]) + value) as string | number; + } else if(i==14){ + const value = Number(item[14]) || 0; + sidoData[i] = (Number(sidoData[i]) + value) as string | number; + } + else { + sidoData[i] = ''; + } + } + } + }); + + // Map을 배열로 변환 + const sidoSummaryList = Array.from(sidoDataMap.values()); + // sidoSummaryList와 rainDetailList를 합쳐서 엑셀 데이터 생성 + const excelData = [...sidoSummaryList, ...rainDetailList]; + excelDownload( - rainDetailList, + excelData, "빗물이용시설 통계", "sample_rainStats.xlsx", "A1:V3", @@ -62,10 +144,10 @@ export default function RainStat() { />
- -