diff --git a/apps/wr/app/(with-layout)/stats/rswtStat/page.tsx b/apps/wr/app/(with-layout)/stats/rswtStat/page.tsx index 3e3e26dcf..b8c7d735c 100644 --- a/apps/wr/app/(with-layout)/stats/rswtStat/page.tsx +++ b/apps/wr/app/(with-layout)/stats/rswtStat/page.tsx @@ -41,7 +41,7 @@ export default function RswtStat() { "개소": item.ctpvCnt, // "건축연면적(m³)": item.archArea, "처리용량(m³)": item.filtrTrtmfctCpct, - "물사용량(m³/년)": item.wtrUsqty, + // "물사용량(m³/년)": item.wtrUsqty, "중수도+대체수이용량(m³/년)": item.rswtAltSum, "중수도이용량(m³/년)": item.rswtrUsqty, "대체수이용량(m³/년)": item.altUswtrUtztnQnt, @@ -59,8 +59,8 @@ export default function RswtStat() { data: (data as unknown as JSON[]) ?? [], fileName: "중수도재이용통계", sheetNameArray: ["Sheet1"], - headerRange: "A1:N1", - decimalArray0: [1,2,3,4,5,6,7,8,9,10,11,12,13], // 0부터 시작 + headerRange: "A1:M1", + decimalArray0: [1,2,3,4,5,6,7,8,9,10,11,12], // 0부터 시작 }) } else { alert(t("excelDownErrMsg")) @@ -174,15 +174,9 @@ export default function RswtStat() { } else if (i == 12) { const value = Number(item[12]) || 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] = ''; } @@ -209,7 +203,7 @@ export default function RswtStat() { }); const sidoSummaryList = Array.from(sidoDataMap.values()); - const sidoTotalSummary = [['전국', '', '합계', 0, '', '', 0, '', '', 0, 0, 0, 0, 0, 0, '']]; + const sidoTotalSummary = [['전국', '', '합계', 0, '', '', 0, '', '', 0, 0, 0, 0, '', 0]]; sidoSummaryList.forEach((item: (string | number)[]) => { item.forEach((value: string | number, index: number) => { if (typeof value === 'number') { @@ -226,7 +220,7 @@ export default function RswtStat() { const sheetArray: SheetParameter[] = [{ data: excelData, headerNum: 3, - headerRange: "A1:P3", + headerRange: "A1:O3", sheetName: 'sheet1', startCol: 'A', decimalArray0: [1,2,3,4,5,6,7,8,9,10,11,12], // 0부터 시작 diff --git a/apps/wr/app/store/stats/rainStat/excel.tsx b/apps/wr/app/store/stats/rainStat/excel.tsx index db2099d9a..2405872bb 100644 --- a/apps/wr/app/store/stats/rainStat/excel.tsx +++ b/apps/wr/app/store/stats/rainStat/excel.tsx @@ -1,41 +1,51 @@ -import type { RainStatProps } from "."; +import { codeToText } from "@/components/lib/func/common"; +import type { RainStatProps } from "."; -export const excelRainStat = (excelList:RainStatProps[]) : (string | number)[][] => { +const toUseTypeText = (val: string) => + val + .split(",") + .map((code) => code.trim()) + .filter(Boolean) + .map((code) => codeToText(code, "dmdUszCd") ?? code) + .join(", "); + +export const excelRainStat = ( + excelList: RainStatProps[] +): (string | number)[][] => { const excelData: (string | number)[][] = []; - excelList.forEach((item) => { + excelList.forEach((item) => { excelData.push([ //시도 item.ctpvCd ?? "", //시군구 item.sggCd ?? "", - //행정구역명 - String(item.areaNm) ?? "", + //행정구역명 + String(item.areaNm) ?? "", //시설명 String(item.bdstNm) ?? "", //건축물용도코드 (값 없음) - //String(item.bdstUsgCd) ?? "", - "", + codeToText(String(item.bdstUsgCd ?? ""), "bdstUsgCd") ?? String(item.bdstUsgCd ?? ""), //주소 String(item.daddr) ?? "", //법적의무대상여부 - String(item.lawTrgtYn)==="Y" ? "대상" : "미대상", + String(item.lawTrgtYn) === "Y" ? "대상" : "미대상", //설치완료일자 String(item.instlCmptnDt).substring(0, 10) ?? "", //설치비용 item.instlCst ?? "", - //접수면종류 - String(item.pntfColKnd) ?? "", + //집수면종류 + codeToText(String(item.pntfColKnd ?? ""), "rainFcltCd") ?? String(item.pntfColKnd ?? ""), //여과등처리시설유무 String(item.filtrTrtmfctYn) ?? "", - //처리용량(저류조용량) - item.dtfcltCpct ?? "", - //연간사용량 - item.wtrUsqty ?? "", - //이용용도코드 - item.utztnUsgCd ?? "", - //연간운영비 - item.anlOperCst ?? "", - ]); - }); + //처리용량(저류조용량) + item.dtfcltCpct ?? "", + //연간사용량 + item.wtrUsqty ?? "", + //이용용도코드 + toUseTypeText(item.utztnUsgCd ?? ""), + //연간운영비 + item.anlOperCst ?? "", + ]); + }); return excelData; -} \ No newline at end of file +}; diff --git a/apps/wr/app/store/stats/rainStat/index.tsx b/apps/wr/app/store/stats/rainStat/index.tsx index d08db404d..084d6e938 100644 --- a/apps/wr/app/store/stats/rainStat/index.tsx +++ b/apps/wr/app/store/stats/rainStat/index.tsx @@ -89,6 +89,7 @@ export const rainStatActionsExport = ( searchRainStatList: async (year: string, city: SelectDataType[]) => { const res = await fetchRainStatList(year); const cityArr: any[] = []; + excelDownList.length = 0; res.filter((resFilter: RainStatProps) => city.some((cityCd) => @@ -104,7 +105,6 @@ export const rainStatActionsExport = ( if (obj) { obj.instlCst += item.instlCst; obj.dtfcltCpct += item.dtfcltCpct; - obj.wtrUsqty += item.wtrUsqty; obj.anlOperCst += item.anlOperCst; obj.tmp += 1; } else { @@ -113,7 +113,7 @@ export const rainStatActionsExport = ( obj.instlCst = item.instlCst; obj.tmp = 1; obj.dtfcltCpct = item.dtfcltCpct; - obj.wtrUsqty = item.wtrUsqty; + obj.wtrUsqty = 0; obj.anlOperCst = item.anlOperCst; obj.lndwtr = 0; //조경용수 obj.cleanToilUswtr = 0; //청소화장실용수 @@ -138,6 +138,15 @@ export const rainStatActionsExport = ( }); }); } + + obj.wtrUsqty = + obj.lndwtr + + obj.cleanToilUswtr + + obj.resn + + obj.farmUswtr + + obj.indstUswtr + + obj.hydUswtr + + obj.ithlEtcUswtr; }); const totalObj = { @@ -145,7 +154,7 @@ export const rainStatActionsExport = ( tmp: 0, instlCst: 0, //설치비 dtfcltCpct: 0, //저류조용량 - bdstUsgCd: 0, //연간사용량 + wtrUsqty: 0, //연간사용량 lndwtr: 0, //조경용수 cleanToilUswtr: 0, //청소화장실용수 resn: 0, //세척살수용수 @@ -165,8 +174,8 @@ export const rainStatActionsExport = ( totalObj.dtfcltCpct += !isNaN(Number(item.dtfcltCpct)) ? Number(item.dtfcltCpct) : 0; - totalObj.bdstUsgCd += !isNaN(Number(item.bdstUsgCd)) - ? Number(item.bdstUsgCd) + totalObj.wtrUsqty += !isNaN(Number(item.wtrUsqty)) + ? Number(item.wtrUsqty) : 0; totalObj.lndwtr += !isNaN(Number(item.lndwtr)) ? Number(item.lndwtr) @@ -196,7 +205,7 @@ export const rainStatActionsExport = ( tmp: item.tmp, instlCst: item.instlCst, //설치비 dtfcltCpct: item.dtfcltCpct, //저류조용량 - bdstUsgCd: item.bdstUsgCd, //연간사용량 + wtrUsqty: item.wtrUsqty, //연간사용량 lndwtr: item.lndwtr, //조경용수 cleanToilUswtr: item.cleanToilUswtr, //청소화장실용수 resn: item.resn, //세척살수용수 @@ -208,17 +217,30 @@ export const rainStatActionsExport = ( }); }); + cityArr.forEach((item) => { + item.instlCst = Math.round(Number(item.instlCst) / 1000000); + item.anlOperCst = Math.round(Number(item.anlOperCst) / 1000000); + }); + + totalObj.instlCst = Math.round(Number(totalObj.instlCst) / 1000000); + totalObj.anlOperCst = Math.round(Number(totalObj.anlOperCst) / 1000000); + //상세 const rainDetailList: RainStatProps[] = []; res.forEach((item: RainStatProps) => { const utztnUsgArray = new Array(); + let wtrUsqty = 0; item.guideStats.forEach((guideStat) => { utztnUsgArray.push(guideStat.utztnUsgCd); + wtrUsqty += Number(guideStat.ruseFcltUtztnQnt) || 0; }); rainDetailList.push({ ...item, + instlCst: Math.round(Number(item.instlCst) / 1000000), + wtrUsqty, utztnUsgCd: utztnUsgArray.join(", "), + anlOperCst: Math.round(Number(item.anlOperCst) / 1000000), }); }); diff --git a/apps/wr/app/store/stats/rswtStat/excel.tsx b/apps/wr/app/store/stats/rswtStat/excel.tsx index 4bd698ad0..eb9eba6da 100644 --- a/apps/wr/app/store/stats/rswtStat/excel.tsx +++ b/apps/wr/app/store/stats/rswtStat/excel.tsx @@ -1,50 +1,53 @@ -import type { SelectDataType } from "@common/business_components/ui"; +import { codeToText } from "@/components/lib/func/common"; import type { RswtStatProps } from "."; -export const excelRswtStat = (excelList: RswtStatProps[], rswtBdstType : SelectDataType[] ) : (string | number)[][] => { +const toUseTypeText = (val: string) => + val + .split(",") + .map((code) => code.trim()) + .filter(Boolean) + .map((code) => codeToText(code, "dmdUszCd") ?? code) + .join(", "); - - console.log('bdstUsgCd ', rswtBdstType) +export const excelRswtStat = ( + excelList: RswtStatProps[] +): (string | number)[][] => { const excelData: (string | number)[][] = []; - excelList.forEach((item) => { - excelData.push([ - //시도 - String(item.ctpvCd) ?? "", - //시군구 - String(item.sggCd) ?? "", - //행정구역명 - String(item.areaNm) ?? "", - //건축물명 - String(item.bdstNm) ?? "", - //건축물용도코드(빈칸) - //String(item.bdstUsgCd) ?? "", - rswtBdstType?.find((cd)=> cd.val === item.bdstUsgCd.toString())?.text ?? "", //건축물용도 - //주소 - String(item.daddr) ?? "", - //법적의무대상여부 - String(item.lawTrgtYn)==="Y" ? "대상" : "미대상", - //설치완료일자 - item.instlCmptnDt ? String(item.instlCmptnDt).substring(0, 10) : "", - //가동개시일(빈칸) - //String(item.instlCst) ?? "", - "", - //건축물면적 - // item.archArea ?? "", - //처리용량 - item.filtrTrtmfctCpct ?? "", - //물사용량 - item.wtrUsqty ?? "", - //중수도+대체수이용량 - item.rswtAltSum ?? "", - //중수도이용량 - item.rswtrUsqty ?? "", - //대체수이용량 - item.altUswtrUtztnQnt ?? "", - //중수도용도 - String(item.utztnUsgCd) ?? "", - //연간운영비 - item.anlOperCst ?? "", - ]); - }); + excelList.forEach((item) => { + excelData.push([ + //시도 + String(item.ctpvCd) ?? "", + //시군구 + String(item.sggCd) ?? "", + //행정구역명 + String(item.areaNm) ?? "", + //건축물명 + String(item.bdstNm) ?? "", + //건축물용도코드 + codeToText(String(item.bdstUsgCd ?? ""), "rswtBdstType") ?? String(item.bdstUsgCd ?? ""), + //주소 + String(item.daddr) ?? "", + //법적의무대상여부 + String(item.lawTrgtYn) === "Y" ? "대상" : "미대상", + //설치완료일자 + item.instlCmptnDt ? String(item.instlCmptnDt).substring(0, 10) : "", + //가동개시일(빈칸) + "", + //처리용량 + item.filtrTrtmfctCpct ?? "", + //물사용량 + // item.wtrUsqty ?? "", + //중수도+대체수이용량 + item.rswtAltSum ?? "", + //중수도이용량 + item.rswtrUsqty ?? "", + //대체수이용량 + item.altUswtrUtztnQnt ?? "", + //중수도용도 + toUseTypeText(String(item.utztnUsgCd ?? "")), + //연간운영비 + item.anlOperCst ?? "", + ]); + }); return excelData; -} \ No newline at end of file +}; diff --git a/apps/wr/app/store/stats/rswtStat/headList.tsx b/apps/wr/app/store/stats/rswtStat/headList.tsx index 47aeca57b..609a155cd 100644 --- a/apps/wr/app/store/stats/rswtStat/headList.tsx +++ b/apps/wr/app/store/stats/rswtStat/headList.tsx @@ -30,12 +30,12 @@ export const rswtStatHeadListExport :TableUpperProps[]=[ row:0, rowSpan:2 }, - { - id: "wtrUsqty", - title: "물사용량(m³/년)", - row:0, - rowSpan:2 - }, + // { + // id: "wtrUsqty", + // title: "물사용량(m³/년)", + // row:0, + // rowSpan:2 + // }, { id: "rswtAltSum", title: "중수도+대체수이용량(m³/년)", @@ -105,4 +105,4 @@ export const rswtStatHeadListExport :TableUpperProps[]=[ }, -] \ 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 fa183f1a2..ac4387aa9 100644 --- a/apps/wr/app/store/stats/rswtStat/index.tsx +++ b/apps/wr/app/store/stats/rswtStat/index.tsx @@ -35,6 +35,7 @@ export type RswtStatProps = { export type GuideStatProps = { utztnUsgCd: string + splyUswtrUtztnQnt: number ruseFcltUtztnQnt: number } @@ -80,7 +81,15 @@ export const rswtStatActionsExport: (set: any) => rswtStatActions = ( return city.some(el => el.val === code); }); const cityArr: any[] = []; + excelDownList.length = 0; data.forEach((item: RswtStatProps) => { + const itemAltUswtrUtztnQnt = + item.guideStats && item.guideStats.length > 0 + ? item.guideStats.reduce( + (sum, guide) => sum + (Number(guide.splyUswtrUtztnQnt) || 0), + 0 + ) + : Number(item.altUswtrUtztnQnt) || 0; let obj = cityArr.find((e) => { return e.ctpvCd == item.ctpvCd }) @@ -90,9 +99,7 @@ export const rswtStatActionsExport: (set: any) => rswtStatActions = ( // obj.archArea += item.archArea 건축면적 삭제 obj.filtrTrtmfctCpct += item.filtrTrtmfctCpct //처리용량 obj.wtrUsqty += item.wtrUsqty //물사용량 - obj.rswtAltSum += (item.rswtrUsqty + item.altUswtrUtztnQnt) //중수도+대체수 - obj.rswtrUsqty += item.rswtrUsqty //중수도사용량 - obj.altUswtrUtztnQnt += item.altUswtrUtztnQnt //대체수이용량 + obj.altUswtrUtztnQnt += itemAltUswtrUtztnQnt //대체수이용량 obj.anlOperCst += item.anlOperCst //연간운영비용 } else { obj = { @@ -100,9 +107,9 @@ export const rswtStatActionsExport: (set: any) => rswtStatActions = ( ctpvCnt: 1, filtrTrtmfctCpct: item.filtrTrtmfctCpct, wtrUsqty: item.wtrUsqty, - rswtAltSum: item.rswtrUsqty + item.altUswtrUtztnQnt, - rswtrUsqty: item.rswtrUsqty, - altUswtrUtztnQnt: item.altUswtrUtztnQnt, + rswtAltSum: 0, + rswtrUsqty: 0, + altUswtrUtztnQnt: itemAltUswtrUtztnQnt, anlOperCst: item.anlOperCst, lndwtr: 0, cleanToilUswtr: 0, @@ -127,6 +134,15 @@ export const rswtStatActionsExport: (set: any) => rswtStatActions = ( }); }) } + + obj.rswtrUsqty = + obj.lndwtr + + obj.cleanToilUswtr + + obj.farmUswtr + + obj.indstUswtr + + obj.hydUswtr + + obj.ithlEtcUswtr; + obj.rswtAltSum = obj.rswtrUsqty + obj.altUswtrUtztnQnt; }); const total: any = { @@ -163,6 +179,11 @@ export const rswtStatActionsExport: (set: any) => rswtStatActions = ( total.ithlEtcUswtr += item.ithlEtcUswtr; }); + cityArr.forEach(item => { + item.anlOperCst = Math.round(Number(item.anlOperCst) / 1000000); + }); + total.anlOperCst = Math.round(Number(total.anlOperCst) / 1000000); + cityArr.unshift(total); cityArr.forEach(item => { @@ -189,16 +210,23 @@ export const rswtStatActionsExport: (set: any) => rswtStatActions = ( const rswtDetailList: RswtStatProps[] = []; res.forEach((item: RswtStatProps) => { const utztnUsgArray = new Array(); + let rswtrUsqty = 0; + let altUswtrUtztnQnt = 0; item.guideStats.forEach((guideStat) => { utztnUsgArray.push(guideStat.utztnUsgCd); + rswtrUsqty += Number(guideStat.ruseFcltUtztnQnt) || 0; + altUswtrUtztnQnt += Number(guideStat.splyUswtrUtztnQnt) || 0; }) rswtDetailList.push({ ...item, - rswtAltSum: item.rswtrUsqty + item.altUswtrUtztnQnt, + rswtAltSum: rswtrUsqty + altUswtrUtztnQnt, + rswtrUsqty, + altUswtrUtztnQnt, utztnUsgCd: utztnUsgArray.join(', '), + anlOperCst: Math.round(Number(item.anlOperCst) / 1000000), }) }); - const excelDetailData = excelRswtStat(rswtDetailList,rswtBdstType); + const excelDetailData = excelRswtStat(rswtDetailList); set((state: rswtStatState) => ({ rswtStat: { ...state.rswtStat, @@ -209,4 +237,4 @@ export const rswtStatActionsExport: (set: any) => rswtStatActions = ( })); } } -} \ No newline at end of file +} diff --git a/apps/wr/public/sample_rswtStats.xlsx b/apps/wr/public/sample_rswtStats.xlsx index 82dad8d2b..c3885eca4 100644 Binary files a/apps/wr/public/sample_rswtStats.xlsx and b/apps/wr/public/sample_rswtStats.xlsx differ diff --git a/apps/wr/public/sample_rswtStats_물사용량.xlsx b/apps/wr/public/sample_rswtStats_물사용량.xlsx new file mode 100644 index 000000000..68cae66ee Binary files /dev/null and b/apps/wr/public/sample_rswtStats_물사용량.xlsx differ