From 1b81ca10b92d2e4b6dc63ac2184f83ac10bd9927 Mon Sep 17 00:00:00 2001 From: YangJinSoo94 Date: Thu, 19 Jun 2025 19:03:12 +0900 Subject: [PATCH] =?UTF-8?q?=EC=A4=91=EC=88=98=EB=8F=84=EC=8B=9C=EC=84=A4?= =?UTF-8?q?=ED=86=B5=EA=B3=84=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 | 4 +- apps/wr/app/stats/rswtStat/page.tsx | 109 ++++++++++++++++++++- apps/wr/app/store/stats/rainStat/index.tsx | 2 +- apps/wr/app/store/stats/rswtStat/excel.tsx | 46 +++++++++ apps/wr/app/store/stats/rswtStat/index.tsx | 37 +++++-- apps/wr/public/sample_rswtStats.xlsx | Bin 0 -> 10897 bytes 6 files changed, 186 insertions(+), 12 deletions(-) create mode 100644 apps/wr/app/store/stats/rswtStat/excel.tsx create mode 100644 apps/wr/public/sample_rswtStats.xlsx diff --git a/apps/wr/app/stats/rainStat/page.tsx b/apps/wr/app/stats/rainStat/page.tsx index f9d2a1350..26faf2616 100644 --- a/apps/wr/app/stats/rainStat/page.tsx +++ b/apps/wr/app/stats/rainStat/page.tsx @@ -31,7 +31,7 @@ export default function RainStat() { searchRainStatList(searchYear); }, [code.cityCd, code.sggCd, searchRainStatList, searchYear]) - const excelDownLoad=() =>{ + const excelDetailDownLoad=() =>{ const sidoList = new Set(); const sidoDataMap = new Map(); // 시도별 데이터를 저장할 Map @@ -203,7 +203,7 @@ export default function RainStat() { - diff --git a/apps/wr/app/stats/rswtStat/page.tsx b/apps/wr/app/stats/rswtStat/page.tsx index 74a8a3c82..cd5fa667c 100644 --- a/apps/wr/app/stats/rswtStat/page.tsx +++ b/apps/wr/app/stats/rswtStat/page.tsx @@ -1,7 +1,7 @@ "use client"; import { useWrStore } from "@/app/store"; import type { ExcelType, RswtStatProps } from "@/app/store/stats/rswtStat"; -import { tableData, yearOptions } from "@/components/lib/func/commom"; +import { excelDownload, tableData, yearOptions } from "@/components/lib/func/commom"; import { ContentsDiv, SearchDiv, @@ -15,7 +15,7 @@ import { useEffect, useState } from "react"; export default function RswtStat() { const { code, rswtStat, searchRswtStatList } = useWrStore((state) => state); - const { rswtStatList, excelList } = rswtStat; + const { rswtStatList, excelList, rswtDetailList } = rswtStat; const [rswtTable, setRswtTable] = useState(); const [pageNation, setPageNation] = useState(1); const [searchYear, setSearchYear] = useState( @@ -43,6 +43,109 @@ export default function RswtStat() { const tbData = Array.isArray(excelData) }, [excelList]) + const excelDetailDownLoad=() =>{ + const sidoList = new Set(); + const sidoDataMap = new Map(); // 시도별 데이터를 저장할 Map + + console.log("rswtDetailList : ", rswtDetailList); + rswtDetailList.forEach((item: RswtStatProps[]) => { + 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 RswtStatProps; + } + if (item.length > 1) { + item[1] = sigunText as unknown as RswtStatProps; + } + if (item.length > 2) { + item[2] = sidoText+' '+sigunText as unknown as RswtStatProps; + } + + // 시도별 데이터 수집 + 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); + } + }); + // 시도별 합계 계산 + rswtDetailList.forEach((item: RswtStatProps[]) => { + 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 = rswtDetailList.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 = rswtDetailList.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==9){ + const value = Number(item[9]) || 0; + sidoData[i] = (Number(sidoData[i]) + value) as string | number; + } else if(i==10){ + const value = Number(item[10]) || 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==13){ + const value = Number(item[13]) || 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 if(i==16){ + const value = Number(item[16]) || 0; + sidoData[i] = (Number(sidoData[i]) + value) as string | number; + } else { + sidoData[i] = ''; + } + } + } + }); + // Map을 배열로 변환 + const sidoSummaryList = Array.from(sidoDataMap.values()); + console.log("sidoSummaryList : ", sidoSummaryList) + // sidoSummaryList와 rainDetailList를 합쳐서 엑셀 데이터 생성 + const excelData = [...sidoSummaryList, ...rswtDetailList]; + + excelDownload( + excelData, + "중수도시설 통계", + "sample_rswtStats.xlsx", + "A1:V3", + 4 + ); + } + return (<>
@@ -81,7 +184,7 @@ export default function RswtStat() { diff --git a/apps/wr/app/store/stats/rainStat/index.tsx b/apps/wr/app/store/stats/rainStat/index.tsx index 059de2b65..d6e48a53e 100644 --- a/apps/wr/app/store/stats/rainStat/index.tsx +++ b/apps/wr/app/store/stats/rainStat/index.tsx @@ -139,7 +139,7 @@ export const rainStatActionsExport = ( }) }) - //상세세 + //상세 const rainDetailList : RainStatProps[] = []; res.forEach((item:RainStatProps) => { const utztnUsgArray = new Array(); diff --git a/apps/wr/app/store/stats/rswtStat/excel.tsx b/apps/wr/app/store/stats/rswtStat/excel.tsx new file mode 100644 index 000000000..d47e0e3fe --- /dev/null +++ b/apps/wr/app/store/stats/rswtStat/excel.tsx @@ -0,0 +1,46 @@ +import type { RswtStatProps } from "."; + +export const excelRswtStat = (excelList:RswtStatProps[]) : string[][] => { + const excelData: string[][] = []; + excelList.forEach((item) => { + excelData.push([ + //시도 + String(item.ctpvCd) ?? "", + //시군구 + String(item.sggCd) ?? "", + //행정구역명 + String(item.areaNm) ?? "", + //건축물명 + String(item.bdstNm) ?? "", + //건축물용도코드(빈칸) + //String(item.bdstUsgCd) ?? "", + "", + //주소 + String(item.daddr) ?? "", + //법적의무대상여부 + String(item.lawTrgtYn) ?? "", + //설치완료일자 + String(item.instlCmptnDt) ?? "", + //가동개시일(빈칸) + //String(item.instlCst) ?? "", + "", + //건축물면적 + String(item.archArea) ?? "", + //처리용량 + String(item.filtrTrtmfctCpct) ?? "", + //물사용량 + String(item.wtrUsqty) ?? "", + //중수도+대체수이용량 + String(item.rswtAltSum) ?? "", + //중수도이용량 + String(item.rswtrUsqty) ?? "", + //대체수이용량 + String(item.altUswtrUtztnQnt) ?? "", + //중수도용도 + String(item.utztnUsgCd) ?? "", + //연간운영비 + String(item.anlOperCst) ?? "", + ]); + }); + return excelData; +} \ No newline at end of file diff --git a/apps/wr/app/store/stats/rswtStat/index.tsx b/apps/wr/app/store/stats/rswtStat/index.tsx index f1b09354e..4e2a7ecc8 100644 --- a/apps/wr/app/store/stats/rswtStat/index.tsx +++ b/apps/wr/app/store/stats/rswtStat/index.tsx @@ -1,9 +1,14 @@ import { fetchType, getFetch } from "@/components/lib/api"; import type { TableUpperProps } from "../../common/type/header"; import { rswtStatHeadListExport } from "./headList"; +import { excelRswtStat } from "./excel"; export type RswtStatProps = { ctpvCd: string //시도 + sggCd : string //시군구 + areaNm: string //행정구역명 + bdstNm: string //시설명 + daddr: string //주소 ctpvCnt: string //개소 archArea: number //건축연면적 filtrTrtmfctCpct: number //처리용량 @@ -20,6 +25,9 @@ export type RswtStatProps = { ithlEtcUswtr: number //기타 anlOperCst: number //연간운영비 guideStats: GuideStatProps[] + utztnUsgCd : string //이용코드 + lawTrgtYn : string //법적의무대상여부 + instlCmptnDt : string //설치완료일자 } export type GuideStatProps = { @@ -40,9 +48,10 @@ const excelDownList: ExcelType[] = []; export type rswtStatState = { rswtStat: { - rswtStatHeadList: TableUpperProps[] + rswtStatHeadList: TableUpperProps[]; rswtStatList: RswtStatProps[]; - excelList: ExcelType[] + excelList: ExcelType[]; + rswtDetailList: RswtStatProps[][]; } } @@ -52,7 +61,8 @@ export const rswtStatExport: rswtStatState = { rswtStat: { rswtStatHeadList: rswtStatHeadListExport, rswtStatList: [], - excelList: [] + excelList: [], + rswtDetailList: [] } } @@ -62,10 +72,9 @@ export const rswtStatActionsExport: (set: any) => rswtStatActions = ( return { searchRswtStatList: async (year: string) => { const res = await getFetch(fetchType.WR, `/reuseChk/reuseWater/stat/${year}`) - const rswtStatList: RswtStatProps[] = []; - let cityArr: any[] = []; + const cityArr: any[] = []; res.forEach((item: RswtStatProps) => { let obj = cityArr.find((e) => { return e.ctpvCd == item.ctpvCd @@ -131,11 +140,27 @@ export const rswtStatActionsExport: (set: any) => rswtStatActions = ( }) }) + //상세 + const rswtDetailList : RswtStatProps[] = []; + res.forEach((item:RswtStatProps) => { + const utztnUsgArray = new Array(); + item.guideStats.forEach((guideStat) => { + utztnUsgArray.push(guideStat.utztnUsgCd); + }) + rswtDetailList.push({ + ...item, + rswtAltSum : item.rswtrUsqty + item.altUswtrUtztnQnt, + utztnUsgCd : utztnUsgArray.join(', '), + }) + }); + + const excelDetailData = excelRswtStat(rswtDetailList); set((state: rswtStatState) => ({ rswtStat: { ...state.rswtStat, rswtStatList: cityArr, - excelList: excelDownList + excelList: excelDownList, + rswtDetailList: excelDetailData } })); } diff --git a/apps/wr/public/sample_rswtStats.xlsx b/apps/wr/public/sample_rswtStats.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..702c4cec0da4eefb5c10e37547be86a7579c4cc9 GIT binary patch literal 10897 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 RAU}TspZ5hn>3;k5{{W-jJnR4f literal 0 HcmV?d00001