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() { />
-