From 10ebd8cbef5e5f60749bfa73a22e12cea2267e9e Mon Sep 17 00:00:00 2001 From: YangJinSoo94 Date: Fri, 20 Jun 2025 11:03:38 +0900 Subject: [PATCH] =?UTF-8?q?=EC=97=91=EC=85=80=20=EC=8B=9C=EB=8F=84?= =?UTF-8?q?=EB=B3=84=EB=A1=9C=20=EC=86=8C=EA=B3=84=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/wr/app/stats/rainStat/page.tsx | 51 +++++++++++++++++++------- apps/wr/app/stats/rswtStat/page.tsx | 55 +++++++++++++++++++++-------- 2 files changed, 80 insertions(+), 26 deletions(-) diff --git a/apps/wr/app/stats/rainStat/page.tsx b/apps/wr/app/stats/rainStat/page.tsx index 8da063a90..d1b2f54cc 100644 --- a/apps/wr/app/stats/rainStat/page.tsx +++ b/apps/wr/app/stats/rainStat/page.tsx @@ -19,9 +19,8 @@ import { useEffect, useState } from "react"; export default function RainStat() { const { code, rainStat, searchRainStatList } = useWrStore((state) => state); - const { rainStatHeadList, rainStatList, excelList, rainDetailList } = rainStat; + const { rainStatList, excelList, rainDetailList } = rainStat; - const [pageNation, setPageNation] = useState(1); const [searchYear, setSearchYear] = useState( String(new Date().getFullYear()) ); @@ -33,9 +32,11 @@ export default function RainStat() { }, [code.cityCd, code.sggCd, searchRainStatList, searchYear]) const excelDetailDownLoad=() =>{ - const sidoList = new Set(); - const sidoDataMap = new Map(); // 시도별 데이터를 저장할 Map + const sidoList = new Set(); + const sidoDataMap = new Map(); // 시도별 데이터를 저장할 Map + const sidoDetailMap = new Map(); // 시도별 상세 데이터를 저장할 Map + // 먼저 시도별 상세 데이터를 그룹화 rainDetailList.forEach((item: RainStatProps[]) => { const sidoVal = item.at(0)?.toString().trim(); const sigunVal = item.at(1)?.toString().trim(); @@ -60,7 +61,15 @@ export default function RainStat() { item[2] = sidoText+' '+sigunText as unknown as RainStatProps; } - // 시도별 데이터 수집 + // 시도별 상세 데이터 수집 + if (sidoText) { + if (!sidoDetailMap.has(sidoText)) { + sidoDetailMap.set(sidoText, []); + } + sidoDetailMap.get(sidoText)!.push(item as unknown as (string | number)[]); + } + + // 시도별 합계 데이터 수집 if (sidoText && !sidoList.has(sidoText)) { sidoList.add(sidoText); // 시도별 초기 데이터 구조 생성 (예: [시도명, 0, 0, 0, ...]) @@ -72,11 +81,12 @@ export default function RainStat() { sidoDataMap.set(sidoText, initialData); } }); + // 시도별 합계 계산 rainDetailList.forEach((item: RainStatProps[]) => { const sidoText = item[0]?.toString(); if (sidoText && sidoDataMap.has(sidoText)) { - const sidoData = sidoDataMap.get(sidoText); + const sidoData = sidoDataMap.get(sidoText)!; // 각 컬럼의 값을 합계에 더하기 (1번 인덱스부터 시작) for (let i = 1; i < item.length && i < sidoData.length; i++) { if(i == 2){ @@ -115,13 +125,30 @@ export default function RainStat() { } }); - // Map을 배열로 변환 + // 시도별로 합계와 상세 데이터를 순서대로 배치 + const summaryExcelData: (string | number)[][] = []; + + // 시도별로 순회하면서 합계와 상세 데이터를 추가 + Array.from(sidoList).forEach((sidoText) => { + const sidoSummary = sidoDataMap.get(sidoText); + const sidoDetails = sidoDetailMap.get(sidoText) || []; + + if (sidoSummary) { + // 시도 합계 데이터 추가 + summaryExcelData.push(sidoSummary); + // 해당 시도의 상세 데이터들 추가 + sidoDetails.forEach(detail => { + summaryExcelData.push(detail); + }); + } + }); + const sidoSummaryList = Array.from(sidoDataMap.values()); // sidoSummaryList와 rainDetailList를 합쳐서 엑셀 데이터 생성 - const excelData = [...sidoSummaryList, ...rainDetailList]; + const excelData = [...sidoSummaryList, ...summaryExcelData]; excelDownload( - excelData, + excelData as unknown as [][], "빗물이용시설 통계", "sample_rainStats.xlsx", "A1:V3", @@ -144,7 +171,7 @@ export default function RainStat() { const tbData = Array.isArray(excelData) ? excelData.map((item: RainStatProps) => { return { - "시도": item.cityText, + "시도": item.ctpvCd, "개소": item.tmp, "설치비(백만원)": item.instlCst, "저류조용량(m³/년)": item.dtfcltCpct, @@ -170,7 +197,7 @@ export default function RainStat() { ? data.map((item: RainStatProps) => { return { ...item, - ctpvCd: item.cityText + ctpvCd: item.ctpvCd }; }) : []; @@ -198,7 +225,7 @@ export default function RainStat() { />
-