diff --git a/apps/dm/app/(landing)/reuse/cases/_components/RainStatusSection.tsx b/apps/dm/app/(landing)/reuse/cases/_components/RainStatusSection.tsx index ec150d55b..f67175f9e 100644 --- a/apps/dm/app/(landing)/reuse/cases/_components/RainStatusSection.tsx +++ b/apps/dm/app/(landing)/reuse/cases/_components/RainStatusSection.tsx @@ -1,133 +1,99 @@ -"use client"; +'use client'; -import React from "react"; +import React from 'react'; // 공통 섹션 타이틀 컴포넌트 function SectionTitle({ children }: { children: React.ReactNode }) { return ( -
- -

{children}

+
+ +

{children}

); } // 구분선 -function Hr({ className = "" }: { className?: string }) { +function Hr({ className = '' }: { className?: string }) { return
; } // 출처 텍스트 function SourceText() { - return ( -

- 자료: 환경부(2024), 「2023 하수도 통계」 -

- ); + return

자료: 환경부(2024), 「2023 하수도 통계」

; } const tableStyles = { - container: "w-[1000px] mx-auto overflow-hidden", - table: "w-full table-fixed border-collapse text-center text-[16px]", - th: "border border-[#858F98] py-3 font-bold text-neutral-800", - td: "border border-[#858F98] py-3 text-neutral-700 font-medium break-keep", - headerBg: "bg-[#E3E7EA]", + container: 'w-[1000px] mx-auto overflow-hidden', + table: 'w-full table-fixed border-collapse text-center text-[16px]', + th: 'border border-[#858F98] py-3 font-bold text-neutral-800', + td: 'border border-[#858F98] py-3 text-neutral-700 font-medium break-keep', + headerBg: 'bg-[#E3E7EA]', }; export default function RainStatusSection() { - const title = "빗물이용시설(현황)"; + const title = '빗물이용시설(현황)'; return ( -
+
{/* 상단 타이틀 */} -
-

- {title} - +
+

+ {title} +

-
+
{/* 1) 빗물이용시설의 건축물별 빗물이용량 현황 */} -
+
빗물이용시설의 건축물별 빗물이용량 현황 -
+
- - - - - - - - {[ - ["골프장", "6,771.8", "6,417.4", "8,371.6", "10,215.4", "11,360", "10,191.6"], - ["공공시설", "364", "325.2", "201.9", "244.6", "209.9", "299.6"], - ["공동주택", "291", "840.5", "804.2", "2,393.0", "2,386", "2,428.4"], - ["대규모점포", "169.9", "214.4", "58.4", "427.2", "371", "293.3"], - ["체육시설", "52.6", "44.7", "48.6", "75.3", "71.8", "77.6"], - ["학교", "33", "25.5", "22", "155.8", "165.4", "32.6"], - ["기타", "311.6", "901.2", "344.5", "537.8", "564", "621.2"], + ['골프장', '6,771.8', '6,417.4', '8,371.6', '10,215.4', '11,360', '10,191.6'], + ['공공시설', '364', '325.2', '201.9', '244.6', '209.9', '299.6'], + ['공동주택', '291', '840.5', '804.2', '2,393.0', '2,386', '2,428.4'], + ['대규모점포', '169.9', '214.4', '58.4', '427.2', '371', '293.3'], + ['체육시설', '52.6', '44.7', '48.6', '75.3', '71.8', '77.6'], + ['학교', '33', '25.5', '22', '155.8', '165.4', '32.6'], + ['기타', '311.6', '901.2', '344.5', '537.8', '564', '621.2'], ].map((row, idx) => ( - + {row.map((val, i) => ( - ))} @@ -141,129 +107,79 @@ export default function RainStatusSection() { -
+
{/* 2) 빗물이용시설의 용도별 분포 (2023년 기준) */} -
+
빗물이용시설의 용도별 분포 (2023년 기준) -
+
+ 구분 + 빗물이용량 (천m³/년)
+ 2018 + 2019 + 2020 + 2021 + 2022 + 2023
+ {val}
- - - - - - - - - - - - {[ - ["청소·환경정화용수", "195", "32.7", "108.8", "24.9", "5.8", "2.6", "4.4", "2.9", "-", "68.1"], - ["세척·살수용수", "12", "1.4", "37", "35", "-", "-", "1.9", "-", "-", "0.2"], - ["조경용수", "3,165", "7,440.8", "13,554.1", "168.1", "2,421.9", "290.7", "66.2", "29", "10,044", "534.3"], - ["냉·난방수", "8", "1.6", "0.1", "-", "-", "-", "-", "0.1", "-", "-"], - ["공업용수", "6", "14.9", "53.2", "52.8", "-", "-", "-", "-", "-", "0.4"], - ["농업용수", "6.0", "0.5", "0.6", "-", "-", "-", "-", "-", "-", "0.6"], - ["기타", "48", "306.1", "155.6", "2.8", "-", "-", "0.6", "0.5", "147.5", "4.2"], - ["미기재", "103", "22.9", "34.8", "16.0", "0.6", "-", "4.6", "0.2", "-", "13.5"], - ["합계", "3,543", "7,820.8", "13,944.7", "299.6", "2,428.4", "293.3", "77.6", "32.6", "10,191.6", "621.2"], + ['청소·환경정화용수', '195', '32.7', '108.8', '24.9', '5.8', '2.6', '4.4', '2.9', '-', '68.1'], + ['세척·살수용수', '12', '1.4', '37', '35', '-', '-', '1.9', '-', '-', '0.2'], + ['조경용수', '3,165', '7,440.8', '13,554.1', '168.1', '2,421.9', '290.7', '66.2', '29', '10,044', '534.3'], + ['냉·난방수', '8', '1.6', '0.1', '-', '-', '-', '-', '0.1', '-', '-'], + ['공업용수', '6', '14.9', '53.2', '52.8', '-', '-', '-', '-', '-', '0.4'], + ['농업용수', '6.0', '0.5', '0.6', '-', '-', '-', '-', '-', '-', '0.6'], + ['기타', '48', '306.1', '155.6', '2.8', '-', '-', '0.6', '0.5', '147.5', '4.2'], + ['미기재', '103', '22.9', '34.8', '16.0', '0.6', '-', '4.6', '0.2', '-', '13.5'], + ['합계', '3,543', '7,820.8', '13,944.7', '299.6', '2,428.4', '293.3', '77.6', '32.6', '10,191.6', '621.2'], ].map((row, idx) => ( - + {row.map((val, i) => { const isHighlightedCol = [1, 2].includes(i); return ( - ); @@ -278,91 +194,58 @@ export default function RainStatusSection() { -
+
{/* 3) 빗물이용시설의 용도별 빗물이용량 현황 */} -
+
빗물이용시설의 용도별 빗물이용량 현황 -
+
+ 용도 + 개소수
(개소)
- 저류용량 + + 저류조용량
(천m³)
+ 빗물이용량 (천m³/년)
+ 총사용량 + 공공시설 + 공동주택 + 대규모점포 + 체육시설 + 학교 + 골프장 + 기타
+ {val}
- - - - - - - - {[ - ["청소·화장실용수", "126.5", "134.1", "96.5", "153.9", "140.5", "108.8"], - ["세척·살수용수", "14.8", "14.6", "9.5", "49.8", "49.7", "37.0"], - ["조경용수", "7,629.8", "8,496.2", "9,415.4", "13,360.4", "14,466.3", "13,554.1"], - ["친수용수", "1.0", "0.1", "0.1", "0.1", "0.1", "0.1"], - ["공업용수", "152.0", "77.0", "77.0", "75.4", "0.4", "53.2"], - ["농업용수", "4.4", "4.3", "4.3", "4.3", "0.6", "0.6"], - ["기타", "37.7", "42.6", "230.7", "394.3", "463.2", "155.6"], + ['청소·화장실용수', '126.5', '134.1', '96.5', '153.9', '140.5', '108.8'], + ['세척·살수용수', '14.8', '14.6', '9.5', '49.8', '49.7', '37.0'], + ['조경용수', '7,629.8', '8,496.2', '9,415.4', '13,360.4', '14,466.3', '13,554.1'], + ['친수용수', '1.0', '0.1', '0.1', '0.1', '0.1', '0.1'], + ['공업용수', '152.0', '77.0', '77.0', '75.4', '0.4', '53.2'], + ['농업용수', '4.4', '4.3', '4.3', '4.3', '0.6', '0.6'], + ['기타', '37.7', '42.6', '230.7', '394.3', '463.2', '155.6'], ].map((row, idx) => ( - + {row.map((val, i) => ( - ))} @@ -378,4 +261,4 @@ export default function RainStatusSection() { ); -} \ No newline at end of file +} diff --git a/apps/dm/app/(landing)/reuse/cases/_components/SewageStatusSection.tsx b/apps/dm/app/(landing)/reuse/cases/_components/SewageStatusSection.tsx index 0a2b34d5d..5a953e2c3 100644 --- a/apps/dm/app/(landing)/reuse/cases/_components/SewageStatusSection.tsx +++ b/apps/dm/app/(landing)/reuse/cases/_components/SewageStatusSection.tsx @@ -1,60 +1,56 @@ -"use client"; +'use client'; -import React from "react"; +import React from 'react'; function SectionTitle({ children }: { children: React.ReactNode }) { return ( -
- -

{children}

+
+ +

{children}

); } -function Hr({ className = "" }: { className?: string }) { +function Hr({ className = '' }: { className?: string }) { return
; } function SourceText() { - return ( -

- 자료: 환경부(2024), 「2023 하수도 통계」 -

- ); + return

자료: 환경부(2024), 「2023 하수도 통계」

; } const tableStyles = { - container: "w-[1000px] mx-auto overflow-hidden", - table: "w-full table-fixed border-collapse text-center text-[16px]", - th: "border border-[#858F98] py-3 font-bold text-neutral-800", - td: "border border-[#858F98] py-3 text-neutral-700 font-medium break-keep", - headerBg: "bg-[#E3E7EA]", + container: 'w-[1000px] mx-auto overflow-hidden', + table: 'w-full table-fixed border-collapse text-center text-[16px]', + th: 'border border-[#858F98] py-3 font-bold text-neutral-800', + td: 'border border-[#858F98] py-3 text-neutral-700 font-medium break-keep', + headerBg: 'bg-[#E3E7EA]', }; export default function SewageStatusSection() { - const title = "하수처리수 재이용시설(현황)"; + const title = '하수처리수 재이용시설(현황)'; return ( -
+
{/* 상단 타이틀 */} -
-

- {title} - +
+

+ {title} +

-
+
{/* 1) 연도별 하수처리수 재이용 현황 */} -
+
연도별 하수처리수 재이용 현황 -
+

+ 용도 + 빗물이용량 (천m³/년)
+ 2018 + 2019 + 2020 + 2021 + 2022 + 2023
+ {val}
- - + + @@ -64,166 +60,52 @@ export default function SewageStatusSection() { - - - - - - - + + + + + + {[ { - group: "전체", + group: '전체', rows: [ - [ - "개소수 (개소)", - "671", - "681", - "698", - "704", - "714", - "717", - ], - [ - "하수처리량 (백만m³/년)", - "7,163.7", - "7,140.4", - "7,375.6", - "7,335.8", - "7,378.9", - "7,537.2", - ], - [ - "재이용량 (백만m³/년)", - "1,112.7", - "1,148.7", - "1,148.7", - "1,127.0", - "1,136.8", - "1,137.5", - ], - [ - "재이용률 (%)", - "17.4", - "16.5", - "15.5", - "14.1", - "14.3", - "14.4", - ], + ["개소수 (개소)", '671', '681', '698', '704', '714', '717'], + ["하수처리량 (백만m³/년)", '7,163.7', '7,140.4', '7,375.6', '7,335.8', '7,378.9', '7,537.2'], + ["재이용량 (백만m³/년)", '1,112.7', '1,148.7', '1,148.7', '1,127.0', '1,136.8', '1,137.5'], + ["재이용률 (%)", '17.4', '16.5', '15.5', '14.1', '14.3', '14.4'], ], }, { - group: "법적 대상", + group: '법적 대상', rows: [ - [ - "개소수 (개소)", - "68", - "82", - "94", - "97", - "101", - "118", - ], - [ - "하수처리량 (백만m³/년)", - "761.2", - "839.0", - "935.3", - "1,158.7", - "1,220.6", - "1,473.6", - ], - [ - "재이용량 (백만m³/년)", - "162.2", - "190.6", - "218.5", - "244.6", - "247.2", - "324.9", - ], - [ - "재이용률 (%)", - "24.7", - "25.4", - "27.8", - "25.7", - "24.2", - "24.1", - ], + ["개소수 (개소)", '68', '82', '94', '97', '101', '118'], + ["하수처리량 (백만m³/년)", '761.2', '839.0', '935.3', '1,158.7', '1,220.6', '1,473.6'], + ["재이용량 (백만m³/년)", '162.2', '190.6', '218.5', '244.6', '247.2', '324.9'], + ["재이용률 (%)", '24.7', '25.4', '27.8', '25.7', '24.2', '24.1'], ], }, { - group: "법적 미대상", + group: '법적 미대상', rows: [ - [ - "개소수 (개소)", - "603", - "599", - "604", - "607", - "613", - "599", - ], - [ - "하수처리량 (백만m³/년)", - "6,402.5", - "6,301.4", - "6,440.3", - "6,177.1", - "6,158.3", - "6,063.5", - ], - [ - "재이용량 (백만m³/년)", - "950.6", - "958.1", - "926.2", - "882.4", - "889.5", - "812.7", - ], - [ - "재이용률 (%)", - "16.5", - "15.3", - "13.6", - "12.2", - "12.6", - "12.5", - ], + ["개소수 (개소)", '603', '599', '604', '607', '613', '599'], + ["하수처리량 (백만m³/년)", '6,402.5', '6,301.4', '6,440.3', '6,177.1', '6,158.3', '6,063.5'], + ["재이용량 (백만m³/년)", '950.6', '958.1', '926.2', '882.4', '889.5', '812.7'], + ["재이용률 (%)", '16.5', '15.3', '13.6', '12.2', '12.6', '12.5'], ], }, ].map((section, sIdx) => ( {section.rows.map((row, rIdx) => ( - + {rIdx === 0 && ( - )} @@ -234,9 +116,7 @@ export default function SewageStatusSection() { return ( +
+ 구분 - 2018 - - 2019 - - 2020 - - 2021 - - 2022 - - 2023 - 201820192020202120222023
+ {section.group} ); @@ -253,17 +133,17 @@ export default function SewageStatusSection() { -
+
{/* 2) 용도별 하수처리수 재이용 현황 */} -
+
용도별 하수처리수 재이용 현황 -
+
- + @@ -273,88 +153,59 @@ export default function SewageStatusSection() { - - - - - - - + + + + + + + {[ - { label: "총 재이용량", type: "total", values: ["1,112.7", "1,148.7", "1,144.7", "1,127.0", "1,136.8", "1,137.5"] }, - { label: "장내 재이용", type: "category", values: ["520.6", "519.8", "513.9", "520.3", "502.2", "490.0"] }, - { label: "세척수", type: "red-item", values: ["177.9", "174.4", "169.4", "180.9", "196.8", "191.2"] }, - { label: "냉각수", type: "red-item", values: ["45.5", "46.8", "50.4", "40.6", "38.3", "41.7"] }, - { label: "청소수", type: "red-item", values: ["17.6", "21.2", "21.2", "21.7", "20.8", "20.5"] }, - { label: "조경용수", type: "red-item", values: ["0.1", "0.1", "-", "-", "-", "-"] }, - { label: "회생용수", type: "red-item", values: ["15.8", "16.7", "17.8", "15.7", "14.4", "14.0"] }, - { label: "장내급수도", type: "red-item", values: ["2.4", "-", "-", "-", "-", "-"] }, - { label: "장내기타용수", type: "red-item", values: ["261.3", "260.6", "255.0", "261.1", "231.8", "222.6"] }, - { label: "장외 재이용", type: "category", values: ["592.1", "628.9", "630.8", "606.7", "634.6", "647.5"] }, - { label: "청소·화장실용수", type: "blue-item", values: ["0.6", "0.4", "0.4", "0.4", "0.4", "0.4"] }, - { label: "세척·살수용수", type: "blue-item", values: ["5.6", "9.9", "2.9", "2.1", "3.0", "3.6"] }, - { label: "조경용수", type: "blue-item", values: ["10.3", "16.4", "5.9", "4.5", "8.9", "9.5"] }, - { label: "친수용수", type: "blue-item", values: ["7.8", "3.1", "3.1", "3.0", "10.9", "10.5"] }, - { label: "하천유지용수", type: "blue-item", values: ["480.5", "482.5", "496.2", "442.7", "471.7", "484.0"] }, - { label: "농업용수", type: "blue-item", values: ["12.2", "11.9", "13.4", "10.7", "10.6", "11.4"] }, - { label: "지하수 충전", type: "blue-item", values: ["0.0", "0.0", "0.0", "13.4", "0.0", "0.0"] }, - { label: "공업용수", type: "blue-item", values: ["75.2", "104.6", "108.9", "129.9", "129.0", "128.1"] }, + { label: '총 재이용량', type: 'total', values: ['1,112.7', '1,148.7', '1,144.7', '1,127.0', '1,136.8', '1,137.5'] }, + { label: '장내 재이용', type: 'category', values: ['520.6', '519.8', '513.9', '520.3', '502.2', '490.0'] }, + { label: '세척수', type: 'red-item', values: ['177.9', '174.4', '169.4', '180.9', '196.8', '191.2'] }, + { label: '냉각수', type: 'red-item', values: ['45.5', '46.8', '50.4', '40.6', '38.3', '41.7'] }, + { label: '청소수', type: 'red-item', values: ['17.6', '21.2', '21.2', '21.7', '20.8', '20.5'] }, + { label: '조경용수', type: 'red-item', values: ['0.1', '0.1', '-', '-', '-', '-'] }, + { label: '회생용수', type: 'red-item', values: ['15.8', '16.7', '17.8', '15.7', '14.4', '14.0'] }, + { label: '장내급수도', type: 'red-item', values: ['2.4', '-', '-', '-', '-', '-'] }, + { label: '장내기타용수', type: 'red-item', values: ['261.3', '260.6', '255.0', '261.1', '231.8', '222.6'] }, + { label: '장외 재이용', type: 'category', values: ['592.1', '628.9', '630.8', '606.7', '634.6', '647.5'] }, + { label: '청소·화장실용수', type: 'blue-item', values: ['0.6', '0.4', '0.4', '0.4', '0.4', '0.4'] }, + { label: '세척·살수용수', type: 'blue-item', values: ['5.6', '9.9', '2.9', '2.1', '3.0', '3.6'] }, + { label: '조경용수', type: 'blue-item', values: ['10.3', '16.4', '5.9', '4.5', '8.9', '9.5'] }, + { label: '친수용수', type: 'blue-item', values: ['7.8', '3.1', '3.1', '3.0', '10.9', '10.5'] }, + { label: '하천유지용수', type: 'blue-item', values: ['480.5', '482.5', '496.2', '442.7', '471.7', '484.0'] }, + { label: '농업용수', type: 'blue-item', values: ['12.2', '11.9', '13.4', '10.7', '10.6', '11.4'] }, + { label: '지하수 충전', type: 'blue-item', values: ['0.0', '0.0', '0.0', '13.4', '0.0', '0.0'] }, + { label: '공업용수', type: 'blue-item', values: ['75.2', '104.6', '108.9', '129.9', '129.0', '128.1'] }, ].map((row, idx) => { - const isSubItem = row.type === "red-item" || row.type === "blue-item"; + const isSubItem = row.type === 'red-item' || row.type === 'blue-item'; const isLastInGroup = idx === 8 || idx === 17; return ( - + {row.values.map((val, i) => ( - ))} @@ -369,18 +220,18 @@ export default function SewageStatusSection() { -
+
{/* 3) 하수처리시설 설치 및 이용 현황 */} -
+
하수처리시설 설치 및 이용 현황 -
+
- 구분 - - 2018 - - 2019 - - 2020 - - 2021 - - 2022 - - 2023 - 구분201820192020202120222023
{isSubItem ? ( <> +
-
- - {row.label} - + {row.label} ) : ( - - {row.label} - + {row.label} )}
+ {val}
- - + + @@ -390,139 +241,49 @@ export default function SewageStatusSection() { - - - - - - - + + + + + + {[ { - group: "전체", + group: '전체', rows: [ - [ - "시설수 (개소)", - "671", - "681", - "698", - "704", - "714", - "717", - ], - [ - "시설용량 (만m³/일)", - "25,846", - "26,067", - "26,244", - "26,492", - "26,586", - "26,766", - ], - [ - "처리용량 (만m³/일)", - "1,112.7", - "1,148.7", - "1,144.7", - "1,127.0", - "1,136.8", - "1,137.5", - ], + ["시설수 (개소)", '671', '681', '698', '704', '714', '717'], + ["시설용량 (만m³/일)", '25,846', '26,067', '26,244', '26,492', '26,586', '26,766'], + ["처리용량 (만m³/일)", '1,112.7', '1,148.7', '1,144.7', '1,127.0', '1,136.8', '1,137.5'], ], }, { - group: "법적 대상", + group: '법적 대상', rows: [ - [ - "시설수 (개소)", - "68", - "82", - "94", - "97", - "101", - "118", - ], - [ - "시설용량 (만m³/일)", - "3,088.9", - "3,359.2", - "3,612.6", - "4,412.2", - "4,692.3", - "5,503.8", - ], - [ - "처리용량 (만m³/일)", - "162.2", - "190.6", - "218.5", - "244.6", - "247.2", - "324.9", - ], + ["시설수 (개소)", '68', '82', '94', '97', '101', '118'], + ["시설용량 (만m³/일)", '3,088.9', '3,359.2', '3,612.6', '4,412.2', '4,692.3', '5,503.8'], + ["처리용량 (만m³/일)", '162.2', '190.6', '218.5', '244.6', '247.2', '324.9'], ], }, { - group: "법적 미대상", + group: '법적 미대상', rows: [ - [ - "시설수 (개소)", - "603", - "599", - "604", - "607", - "613", - "599", - ], - [ - "시설용량 (만m³/일)", - "22,757", - "22,708", - "22,631", - "22,080", - "21,894", - "21,262", - ], - [ - "처리용량 (만m³/일)", - "950.6", - "958.1", - "926.2", - "882.4", - "889.5", - "812.7", - ], + ["시설수 (개소)", '603', '599', '604', '607', '613', '599'], + ["시설용량 (만m³/일)", '22,757', '22,708', '22,631', '22,080', '21,894', '21,262'], + ["처리용량 (만m³/일)", '950.6', '958.1', '926.2', '882.4', '889.5', '812.7'], ], }, ].map((section, sIdx) => ( {section.rows.map((row, rIdx) => ( - + {rIdx === 0 && ( - )} @@ -533,9 +294,7 @@ export default function SewageStatusSection() { return ( )); }; - const renderBuildingUsageCells = ( - row: DmStatusBildTpYearsType | DmStatusUsgYearsType | DmStatusUsgYearsType, - headers: TableHeaderType[] - ) => { + const renderBuildingUsageCells = (row: DmStatusBildTpYearsType | DmStatusUsgYearsType | DmStatusUsgYearsType, headers: TableHeaderType[]) => { const rowData = row as Record; const firstHeaderId = headers[0]?.id; - const rowKey = firstHeaderId ? String(rowData[firstHeaderId] ?? "") : ""; + const rowKey = firstHeaderId ? String(rowData[firstHeaderId] ?? '') : ''; return headers.map((header, index) => { const value = rowData[header.id]; return ( - ); @@ -126,63 +84,49 @@ export default function RainwaterStatusPage() { const renderRainyByUsgBildTpCells = (row: DmStatusUsgBildTpType) => { return rainyByUsgBildTpHeader.map((header, index) => { const value = row[header.id as keyof DmStatusUsgBildTpType]; - const displayValue = - index === 0 - ? value - : header.id === "CNT" - ? Number(value).toLocaleString("ko-KR") - : formatUsage(value as string | number, 1000, 1); + const displayValue = index === 0 ? value : header.id === 'CNT' ? Number(value).toLocaleString('ko-KR') : formatUsage(value as string | number, 1000, 1); return ( - ); }); }; return ( -
+
-
-
+
+
{/* 1) 빗물이용시설의 건축물별 빗물이용량 현황 */} -
+
빗물이용시설의 건축물별 빗물이용량 현황 -
+
+ 구분 - 2018 - - 2019 - - 2020 - - 2021 - - 2022 - - 2023 - 201820192020202120222023
+ {section.group} ); @@ -552,24 +311,19 @@ export default function SewageStatusSection() { -
+
{/* 4) 시도별 하수처리수 재이용 현황 */} -
+
시도별 하수처리수 재이용 현황 -
+
-
- (단위: 백만m³/일) -
+
(단위: 백만m³/년)
- + @@ -583,110 +337,71 @@ export default function SewageStatusSection() { - - - - - - - - - - - - - + + + + + {[ - ["합계", "7,537.2", "1,137.5", "490.0", "647.5", "484.0", "128.1", "11.4", "24.0", "15.1%", ""], - ["서울특별시", "1,567.0", "114.9", "59.3", "55.6", "55.1", "-", "-", "0.5", "7.3%", ""], - ["부산광역시", "491.5", "146.2", "120.7", "25.5", "25.3", "-", "-", "0.2", "29.7%", ""], - ["대구광역시", "432.7", "102.4", "38.2", "64.2", "64.1", "-", "-", "0.1", "23.7%", ""], - ["인천광역시", "302.3", "57.7", "11.6", "46.1", "29.2", "12.1", "0.5", "4.3", "19.1%", ""], - ["광주광역시", "211.1", "28.7", "6.5", "22.3", "22.2", "-", "-", "0.1", "13.6%", ""], - ["대전광역시", "244.6", "11.9", "11.9", "0.68", "0.0", "-", "-", "0.1", "4.9%", ""], - ["울산광역시", "235.1", "36.1", "6.1", "29.9", "29.7", "0.2", "-", "-", "15.3%", ""], - ["세종특별자치시", "38.5", "2.5", "2.0", "0.5", "0.4", "-", "0.2", "-", "6.6%", ""], - ["경기도", "1,926.8", "313.3", "122.2", "191.0", "153.0", "33.3", "0.4", "4.3", "16.3%", ""], - ["강원도", "230.4", "19.6", "15.4", "4.2", "2.1", "-", "-", "2.1", "8.5%", ""], - ["충청북도", "190.9", "15.6", "6.3", "9.2", "7.4", "0.6", "-", "1.2", "8.2%", ""], - ["충청남도", "241.5", "41.4", "9.8", "31.5", "17.7", "8.6", "4.5", "0.8", "17.1%", ""], - ["전라북도", "292.4", "42.7", "7.5", "35.1", "33.5", "0.2", "1.0", "0.5", "14.6%", ""], - ["전라남도", "254.0", "23.6", "12.3", "11.3", "8.7", "0.0", "1.0", "1.6", "9.3%", ""], - ["경상북도", "378.4", "129.1", "33.7", "95.3", "20.8", "72.5", "0.8", "1.3", "34.1%", ""], - ["경상남도", "411.3", "50.1", "25.0", "25.0", "14.7", "0.5", "3.0", "6.9", "12.2%", ""], - ["제주특별자치도", "88.6", "1.7", "1.5", "0.12", "-", "-", "0.1", "-", "1.9%", ""], + ['합계', '7,537.2', '1,137.5', '490.0', '647.5', '484.0', '128.1', '11.4', '24.0', '15.1%', ''], + ['서울특별시', '1,567.0', '114.9', '59.3', '55.6', '55.1', '-', '-', '0.5', '7.3%', ''], + ['부산광역시', '491.5', '146.2', '120.7', '25.5', '25.3', '-', '-', '0.2', '29.7%', ''], + ['대구광역시', '432.7', '102.4', '38.2', '64.2', '64.1', '-', '-', '0.1', '23.7%', ''], + ['인천광역시', '302.3', '57.7', '11.6', '46.1', '29.2', '12.1', '0.5', '4.3', '19.1%', ''], + ['광주광역시', '211.1', '28.7', '6.5', '22.3', '22.2', '-', '-', '0.1', '13.6%', ''], + ['대전광역시', '244.6', '11.9', '11.9', '0.68', '0.0', '-', '-', '0.1', '4.9%', ''], + ['울산광역시', '235.1', '36.1', '6.1', '29.9', '29.7', '0.2', '-', '-', '15.3%', ''], + ['세종특별자치시', '38.5', '2.5', '2.0', '0.5', '0.4', '-', '0.2', '-', '6.6%', ''], + ['경기도', '1,926.8', '313.3', '122.2', '191.0', '153.0', '33.3', '0.4', '4.3', '16.3%', ''], + ['강원도', '230.4', '19.6', '15.4', '4.2', '2.1', '-', '-', '2.1', '8.5%', ''], + ['충청북도', '190.9', '15.6', '6.3', '9.2', '7.4', '0.6', '-', '1.2', '8.2%', ''], + ['충청남도', '241.5', '41.4', '9.8', '31.5', '17.7', '8.6', '4.5', '0.8', '17.1%', ''], + ['전라북도', '292.4', '42.7', '7.5', '35.1', '33.5', '0.2', '1.0', '0.5', '14.6%', ''], + ['전라남도', '254.0', '23.6', '12.3', '11.3', '8.7', '0.0', '1.0', '1.6', '9.3%', ''], + ['경상북도', '378.4', '129.1', '33.7', '95.3', '20.8', '72.5', '0.8', '1.3', '34.1%', ''], + ['경상남도', '411.3', '50.1', '25.0', '25.0', '14.7', '0.5', '3.0', '6.9', '12.2%', ''], + ['제주특별자치도', '88.6', '1.7', '1.5', '0.12', '-', '-', '0.1', '-', '1.9%', ''], ].map((row, idx) => ( - + {row.map((val, i) => ( - ))} @@ -702,4 +417,4 @@ export default function SewageStatusSection() { ); -} \ No newline at end of file +} diff --git a/apps/dm/app/(landing)/reuse/intro/_components/LawIntroSection.tsx b/apps/dm/app/(landing)/reuse/intro/_components/LawIntroSection.tsx index de39aa798..8c2a535ce 100644 --- a/apps/dm/app/(landing)/reuse/intro/_components/LawIntroSection.tsx +++ b/apps/dm/app/(landing)/reuse/intro/_components/LawIntroSection.tsx @@ -1,123 +1,92 @@ -"use client"; +'use client'; -import React from "react"; -import Image, { type StaticImageData } from "next/image"; +import React from 'react'; +import Image, { type StaticImageData } from 'next/image'; -import lawPlan from "@/public/images/landing/intro/law_timeline.png"; -import planPerformance from "@/public/images/landing/intro/performance_left.png"; -import domesticChange from "@/public/images/landing/intro/domestic_textbox.png"; -import policyHistory from "@/public/images/landing/intro/policy_timeline.png"; -import lawRelation from "@/public/images/landing/intro/rel_note.png"; -import domesticLinkage from "@/public/images/landing/intro/linkage.png"; +import lawPlan from '@/public/images/landing/intro/law_timeline.png'; +import planPerformance from '@/public/images/landing/intro/performance_left.png'; +import domesticChange from '@/public/images/landing/intro/domestic_textbox.png'; +import policyHistory from '@/public/images/landing/intro/policy_timeline.png'; +import lawRelation from '@/public/images/landing/intro/rel_note.png'; +import domesticLinkage from '@/public/images/landing/intro/linkage.png'; function SectionTitle({ children }: { children: React.ReactNode }) { return ( -
- -

{children}

+
+ +

{children}

); } -function Hr({ className = "" }: { className?: string }) { +function Hr({ className = '' }: { className?: string }) { return
; } function ImgCard({ src, alt }: { src: StaticImageData; alt: string }) { return ( -
- +
+
); } -function SectionShell({ - id, - title, - children, - className = "", -}: { - id: string; - title: string; - children: React.ReactNode; - className?: string; -}) { +function SectionShell({ id, title, children, className = '' }: { id: string; title: string; children: React.ReactNode; className?: string }) { return (
{title} -
{children}
+
{children}
); } export default function LawIntroSection() { - const title = "물 재이용 법"; + const title = '물 재이용 법'; return ( -
-
-

- {title} - +
+
+

+ {title} +

-
- - +
+ + -
+
- - + + -
+
- - + + -
+
- - + + -
+
- - + + -
+
- - + +
); -} \ No newline at end of file +} diff --git a/apps/dm/app/(landing)/reuse/intro/law/page.tsx b/apps/dm/app/(landing)/reuse/intro/law/page.tsx index c9952bf0b..d8d391202 100644 --- a/apps/dm/app/(landing)/reuse/intro/law/page.tsx +++ b/apps/dm/app/(landing)/reuse/intro/law/page.tsx @@ -1,20 +1,20 @@ // apps/dm/app/(landing)/reuse/intro/law/page.tsx -"use client"; +'use client'; -import Image, { type StaticImageData } from "next/image"; -import SubPageHeader from "../../_components/SubPageHeader"; -import lawTimeline from "@/public/images/landing/intro/law_timeline.png"; -import performanceLeft from "@/public/images/landing/intro/performance_left.png"; -import domesticTextbox from "@/public/images/landing/intro/domestic_textbox.png"; -import policyTimeline from "@/public/images/landing/intro/policy_timeline.png"; -import relNote from "@/public/images/landing/intro/rel_note.png"; -import linkage from "@/public/images/landing/intro/linkage.png"; +import Image, { type StaticImageData } from 'next/image'; +import SubPageHeader from '../../_components/SubPageHeader'; +import lawTimeline from '@/public/images/landing/intro/law_timeline.png'; +import performanceLeft from '@/public/images/landing/intro/performance_left.png'; +import domesticTextbox from '@/public/images/landing/intro/domestic_textbox.png'; +import policyTimeline from '@/public/images/landing/intro/policy_timeline.png'; +import relNote from '@/public/images/landing/intro/rel_note.png'; +import linkage from '@/public/images/landing/intro/linkage.png'; function SectionTitle({ children }: { children: React.ReactNode }) { return ( -
- -

{children}

+
+ +

{children}

); } @@ -23,7 +23,7 @@ type HrProps = { className?: string; }; -function Hr({ className = "" }: HrProps) { +function Hr({ className = '' }: HrProps) { return
; } @@ -34,95 +34,87 @@ type ImgCardProps = { function ImgCard({ src, alt }: ImgCardProps) { return ( -
- +
+
); } export default function WaterReuseLawPage() { return ( -
+
-
+
{/* 1) 법제도/계획 수립 타임라인 */} -
+
법제도 · 계획 및 기본계획 수립 -
- +
+
-
+
{/* 2) 제2차 계획 대비 실적 현황 (2컬럼) */}
제 2차 계획 대비 실적 현황 -
- +
+
-
+
{/* 3) 국내 관련 현황 */}
국내 관련 현황 -
- +
+
-
+
{/* 4) 정책 변천 추이 */}
물 재이용 정책 변천 추이 -
- +
+
-
+
{/* 5) 타 법령과의 관계도 */}
타법령과의 관계도 -
- +
+
-
+
{/* 6) 국내 연계 현황 */} -
+
국내 연계 현황 -
-
-

주요 국가계획의 정책방향과 연계한 물 재이용 정책 필요

-

국가 상위계획의 정책 방향이 기후위기 대응 등 수자원의 공급 안전성을 위한 물 재이용 활성화로 정책 실효성 제고 필요
- • 물관리 계획(국가수도기본계획, 국가 및 유역하수도종합계획, 하천유역수자원관리계획 등)과의 연계성 확보 → 통합적인 관점에서 물이용 체계 구축 필요 +

+
+

주요 국가계획의 정책방향과 연계한 물 재이용 정책 필요

+

+ 국가 상위계획의 정책 방향이 기후위기 대응 등 수자원의 공급 안전성을 위한 물 재이용 활성화로 정책 실효성 제고 필요 +
• 물관리 계획(국가수도기본계획, 국가 및 유역하수도종합계획, 하천유역수자원관리계획 등)과의 연계성 확보 → 통합적인 관점에서 물이용 체계 구축 필요

- +
diff --git a/apps/dm/app/(with-layout)/intro/_components/LawIntroSection.tsx b/apps/dm/app/(with-layout)/intro/_components/LawIntroSection.tsx index 0ca6ccf69..ea4ad810d 100644 --- a/apps/dm/app/(with-layout)/intro/_components/LawIntroSection.tsx +++ b/apps/dm/app/(with-layout)/intro/_components/LawIntroSection.tsx @@ -1,4 +1,4 @@ -"use client"; +'use client'; export default function LawIntroSection() { const contentsHtml = ` @@ -84,10 +84,5 @@ export default function LawIntroSection() {
`; - return ( -
- ); + return
; } diff --git a/apps/dm/app/(with-layout)/intro/law/page.tsx b/apps/dm/app/(with-layout)/intro/law/page.tsx index 63f504af4..9e881b921 100644 --- a/apps/dm/app/(with-layout)/intro/law/page.tsx +++ b/apps/dm/app/(with-layout)/intro/law/page.tsx @@ -1,22 +1,22 @@ // DM 물 재이용 소개(물 재이용 법) 페이지 -"use client"; +'use client'; -import Image, { type StaticImageData } from "next/image"; -import SubPageHeader from "@/components/SubPageHeader"; +import Image, { type StaticImageData } from 'next/image'; +import SubPageHeader from '@/components/SubPageHeader'; // import BusinessSubNav from "@/components/BusinessSubNav"; -import lawTimeline from "@/public/images/landing/intro/law_timeline.png"; -import performanceLeft from "@/public/images/landing/intro/performance_left.png"; -import domesticTextbox from "@/public/images/landing/intro/domestic_textbox.png"; -import policyTimeline from "@/public/images/landing/intro/policy_timeline.png"; -import relNote from "@/public/images/landing/intro/rel_note.png"; -import linkage from "@/public/images/landing/intro/linkage.png"; +import lawTimeline from '@/public/images/landing/intro/law_timeline.png'; +import performanceLeft from '@/public/images/landing/intro/performance_left.png'; +import domesticTextbox from '@/public/images/landing/intro/domestic_textbox.png'; +import policyTimeline from '@/public/images/landing/intro/policy_timeline.png'; +import relNote from '@/public/images/landing/intro/rel_note.png'; +import linkage from '@/public/images/landing/intro/linkage.png'; function SectionTitle({ children }: { children: React.ReactNode }) { return ( -
- -

{children}

+
+ +

{children}

); } @@ -25,7 +25,7 @@ type HrProps = { className?: string; }; -function Hr({ className = "" }: HrProps) { +function Hr({ className = '' }: HrProps) { return
; } @@ -36,14 +36,8 @@ type ImgCardProps = { function ImgCard({ src, alt }: ImgCardProps) { return ( -
- +
+
); } @@ -55,109 +49,73 @@ type SectionShellProps = { className?: string; }; -function SectionShell({ id, title, children, className = "" }: SectionShellProps) { +function SectionShell({ id, title, children, className = '' }: SectionShellProps) { return ( -
+
{title} -
{children}
+
{children}
); } export default function WaterReuseLawPage() { return ( -
+
{/* */} -
-
+
+
- - + + -
+
- - + + -
+
- - + + -
+
- - + + -
+
- - + + -
+
- -
-

- 주요 국가계획의 정책방향과 연계한 물 재이용 정책 필요 -

-

- 국가 상위계획의 정책 방향이 기후위기 대응 등 수자원의 공급 안전성을 위한 - 물 재이용 활성화로 정책 실효성 제고 필요 -
- • 물관리 계획(국가수도기본계획, 국가 및 유역하수도종합계획, - 하천유역수자원관리계획 등)과의 연계성 확보 → 통합적인 관점에서 - 물이용 체계 구축 필요 + +

+

주요 국가계획의 정책방향과 연계한 물 재이용 정책 필요

+

+ 국가 상위계획의 정책 방향이 기후위기 대응 등 수자원의 공급 안전성을 위한 물 재이용 활성화로 정책 실효성 제고 필요 +
• 물관리 계획(국가수도기본계획, 국가 및 유역하수도종합계획, 하천유역수자원관리계획 등)과의 연계성 확보 → 통합적인 관점에서 물이용 체계 구축 필요

- +
); -} \ No newline at end of file +} diff --git a/apps/dm/app/(with-layout)/status/_components/RainStatusSection.tsx b/apps/dm/app/(with-layout)/status/_components/RainStatusSection.tsx index 6a534294d..e30cc8df0 100644 --- a/apps/dm/app/(with-layout)/status/_components/RainStatusSection.tsx +++ b/apps/dm/app/(with-layout)/status/_components/RainStatusSection.tsx @@ -1,30 +1,24 @@ -"use client"; +'use client'; -import { useEffect, useMemo } from "react"; +import { useEffect, useMemo } from 'react'; // import SubPageHeader from "@/components/SubPageHeader"; -import Image from "next/image"; -import { useDmStore } from "@/app/store"; -import { formatUsage } from "@/app/common/transValueFormat"; -import type { - DmStatusBildTpYearsType, - DmStatusUsgBildTpType, - DmStatusUsgYearsType, - TableHeaderType, -} from "@/app/store/dm-status/type"; - +import Image from 'next/image'; +import { useDmStore } from '@/app/store'; +import { formatUsage } from '@/app/common/transValueFormat'; +import type { DmStatusBildTpYearsType, DmStatusUsgBildTpType, DmStatusUsgYearsType, TableHeaderType } from '@/app/store/dm-status/type'; // 공통 섹션 타이틀 컴포넌트 function SectionTitle({ children }: { children: React.ReactNode }) { return ( -
- -

{children}

+
+ +

{children}

); } // 구분선 -function Hr({ className = "" }: { className?: string }) { +function Hr({ className = '' }: { className?: string }) { return
; } @@ -32,62 +26,49 @@ function Hr({ className = "" }: { className?: string }) { function RainIntroSummary() { const items = [ { - icon: "/images/landing/icon_chart.png", - title: "지속적인 이용량 증가", - desc: "2018년 약 797만m³이었던 빗물 이용량은 5년 사이 약 75% 증가하여 수자원 절약에 기여하고 있습니다.", + icon: '/images/landing/icon_chart.png', + title: '지속적인 이용량 증가', + desc: '2018년 약 797만m³이었던 빗물 이용량은 5년 사이 약 75% 증가하여 수자원 절약에 기여하고 있습니다.', }, { - icon: "/images/landing/icon_hand.png", - title: "조경용수의 핵심 자원", - desc: "재이용되는 빗물의 약 97%가 조경용수로 활용되고 있으며 이는 공원, 아파트 단지 등의 녹지 관리에 중요한 역할을 합니다.", + icon: '/images/landing/icon_hand.png', + title: '조경용수의 핵심 자원', + desc: '재이용되는 빗물의 약 97%가 조경용수로 활용되고 있으며 이는 공원, 아파트 단지 등의 녹지 관리에 중요한 역할을 합니다.', }, { - icon: "/images/landing/icon_building.png", - title: "민간·공공의 협력", - desc: "골프장과 같은 대규모 스포츠 시설은 물론, 최근에는 공동주택·아파트 등 내 이용량이 급증하며 일상생활 속 빗물 활용이 확산되는 추세입니다.", + icon: '/images/landing/icon_building.png', + title: '민간·공공의 협력', + desc: '골프장과 같은 대규모 스포츠 시설은 물론, 최근에는 공동주택·아파트 등 내 이용량이 급증하며 일상생활 속 빗물 활용이 확산되는 추세입니다.', }, ]; return ( -
-
+
+
{/* 좌측 */}
-

+

기후위기 시대의 수자원 확보,
- - 빗물 재이용 - - 이 앞장섭니다. + 빗물 재이용이 앞장섭니다.

-

+

2023년 기준 전국 3,500여 개 시설에서
연간 약 1,394만m³의 빗물을 소중한 자원으로 다시 활용하고 있습니다.

-
+
{items.map((item) => ( -
-
- +
+
+
- - {item.title} - -

- {item.desc} -

+ {item.title} +

{item.desc}

))} @@ -95,15 +76,8 @@ function RainIntroSummary() {
{/* 우측 이미지 */} -
- +
+
@@ -111,31 +85,15 @@ function RainIntroSummary() { } const tableStyles = { - container: "w-[1000px] mx-auto overflow-hidden", - table: "w-full table-fixed border-collapse text-center text-[16px]", - th: "border border-[#858F98] py-3 font-bold text-neutral-800", - td: "border border-[#858F98] py-3 text-neutral-700 font-medium break-keep", - headerBg: "bg-[#E3E7EA]", + container: 'w-[1000px] mx-auto overflow-hidden', + table: 'w-full table-fixed border-collapse text-center text-[16px]', + th: 'border border-[#858F98] py-3 font-bold text-neutral-800', + td: 'border border-[#858F98] py-3 text-neutral-700 font-medium break-keep', + headerBg: 'bg-[#E3E7EA]', }; -const headerColors6 = [ - "bg-[#01ACE5]", - "bg-[#17AFC7]", - "bg-[#2CB2A9]", - "bg-[#42B58B]", - "bg-[#57B86D]", - "bg-[#81C784]", -]; -const headerColors8 = [ - "bg-[#01ACE5]", - "bg-[#10AED0]", - "bg-[#20B0BA]", - "bg-[#2FB2A5]", - "bg-[#3FB58F]", - "bg-[#4EB77A]", - "bg-[#5EB964]", - "bg-[#6DBB4F]", -]; +const headerColors6 = ['bg-[#01ACE5]', 'bg-[#17AFC7]', 'bg-[#2CB2A9]', 'bg-[#42B58B]', 'bg-[#57B86D]', 'bg-[#81C784]']; +const headerColors8 = ['bg-[#01ACE5]', 'bg-[#10AED0]', 'bg-[#20B0BA]', 'bg-[#2FB2A5]', 'bg-[#3FB58F]', 'bg-[#4EB77A]', 'bg-[#5EB964]', 'bg-[#6DBB4F]']; export default function RainStatusSection() { const getRainyByBildTpYears = useDmStore((state) => state.getRainyByBildTpYears); const getRainyByUsgBildTp = useDmStore((state) => state.getRainyByUsgBildTp); @@ -148,19 +106,11 @@ export default function RainStatusSection() { const rainyByUsgBildTp = useDmStore((state) => state.rainy.rainyByUsgBildTp); const rainyByUsgYearsHeader = useDmStore((state) => state.rainy.rainyByUsgYearsHeader); const rainyByUsgYears = useDmStore((state) => state.rainy.rainyByUsgYears); - const partBildTpHeader = useMemo( - () => rainyByUsgBildTpHeader.slice(3).map((header) => header.title), - [rainyByUsgBildTpHeader] - ); - + const partBildTpHeader = useMemo(() => rainyByUsgBildTpHeader.slice(3).map((header) => header.title), [rainyByUsgBildTpHeader]); // 출처 텍스트 function SourceText() { - return ( -

- 자료: 하수도정보시스템 {selectYear} 하수도 통계 -

- ); + return

자료: 하수도정보시스템 {selectYear} 하수도 통계

; } useEffect(() => { @@ -171,32 +121,22 @@ export default function RainStatusSection() { const renderPartHeaders = (headers: string[], headerColors: string[]) => { return headers.map((header, index) => ( -

)); }; - const renderBuildingUsageCells = ( - row: DmStatusBildTpYearsType | DmStatusUsgYearsType | DmStatusUsgYearsType, - headers: TableHeaderType[] - ) => { + const renderBuildingUsageCells = (row: DmStatusBildTpYearsType | DmStatusUsgYearsType | DmStatusUsgYearsType, headers: TableHeaderType[]) => { const rowData = row as Record; const firstHeaderId = headers[0]?.id; - const rowKey = firstHeaderId ? String(rowData[firstHeaderId] ?? "") : ""; + const rowKey = firstHeaderId ? String(rowData[firstHeaderId] ?? '') : ''; return headers.map((header, index) => { const value = rowData[header.id]; return ( - ); @@ -206,102 +146,99 @@ export default function RainStatusSection() { const renderRainyByUsgBildTpCells = (row: DmStatusUsgBildTpType) => { return rainyByUsgBildTpHeader.map((header, index) => { const value = row[header.id as keyof DmStatusUsgBildTpType]; - const displayValue = - index === 0 - ? value - : header.id === "CNT" - ? Number(value).toLocaleString("ko-KR") - : formatUsage(value as string | number, 1000, 1); + const displayValue = index === 0 ? value : header.id === 'CNT' ? Number(value).toLocaleString('ko-KR') : formatUsage(value as string | number, 1000, 1); return ( - ); }); }; - - const title = "빗물이용시설(현황)"; + + const title = '빗물이용시설(현황)'; return ( -
+
{/* 상단 타이틀 */} -
-

- {title} - +
+

+ {title} +

-
+
{/* 1) 빗물이용시설의 건축물별 빗물이용량 현황 */}
{/* 인트로 영역 */} - -
+ +
빗물이용시설의 건축물별 빗물이용량 현황 -
-
+
+

+ 시도 + 연간
하수
처리량
+ 재이용현황 + 재이용률
(%)
+ 비고
+ 계 + 장내 + 장외
- 소계 - - 하천유지용수 - - 공업용수 - - 농업용수 - - 기타용수 - 소계하천유지용수공업용수농업용수기타용수
+ {val} + {header} + {index === 0 ? value : formatUsage(value as string | number, 1000, 1)} - {displayValue == 0.0 ? "-" : displayValue} + + {displayValue == 0.0 ? '-' : displayValue}
- + - - + + - - {renderPartHeaders(rainyYears, headerColors6)} - - - + {renderPartHeaders(rainyYears, headerColors6)} + + {rainyByBildTpYears.map((row, idx) => ( - + {renderBuildingUsageCells(row, rainyByBildTpYearsHeader)} - + ))} - +
+ 구분 - + 빗물이용량 (천m³/년) -
-
+
- +
-
+
{/* 2) 빗물이용시설의 용도별 분포 (xxxx년 기준) */} -
+
빗물이용시설의 용도별 분포 ({selectYear}년 기준) -
+
- - - - - - - {renderPartHeaders(partBildTpHeader, headerColors8)} + + + + + {renderPartHeaders(partBildTpHeader, headerColors8)} {rainyByUsgBildTp.map((row, idx) => ( - + {renderRainyByUsgBildTpCells(row)} ))} @@ -313,30 +250,29 @@ export default function RainStatusSection() { -
+
{/* 3) 빗물이용시설의 용도별 빗물이용량 현황 */} -
+
빗물이용시설의 용도별 빗물이용량 현황 -
+
용도개소수
(개소)
저류용량
(천m³)
빗물이용량 (천m³/년)
+ 용도 + + 개소수 +
+ (개소) +
+ 저류조용량 +
+ (천m³) +
+ 빗물이용량 (천m³/년) +
- - - - - {renderPartHeaders(rainyYears, headerColors6)} + + + {renderPartHeaders(rainyYears, headerColors6)} {rainyByUsgYears.map((row, idx) => ( - + {renderBuildingUsageCells(row, rainyByUsgYearsHeader)} ))} @@ -350,4 +286,4 @@ export default function RainStatusSection() { ); -} \ No newline at end of file +} diff --git a/apps/dm/app/(with-layout)/status/_components/SewageStatusSection.tsx b/apps/dm/app/(with-layout)/status/_components/SewageStatusSection.tsx index f7eb49a84..c1ae8e05e 100644 --- a/apps/dm/app/(with-layout)/status/_components/SewageStatusSection.tsx +++ b/apps/dm/app/(with-layout)/status/_components/SewageStatusSection.tsx @@ -1,116 +1,97 @@ /** * 하수처리수 */ -"use client"; +'use client'; -import React from "react"; -import Image from "next/image"; -import { useEffect } from "react"; -import { useDmStore } from "@/app/store"; -import { formatUsage } from "@/app/common/transValueFormat"; -import type { - DmStatusLawYearsType, - DmStatusBildTpYearsType, - DmStatusUsgYearsType, - DmStatusSidoUsgType, - TableHeaderType, -} from "@/app/store/dm-status/type"; -import { Col2Name } from "@/app/store/dm-status/type"; +import React from 'react'; +import Image from 'next/image'; +import { useEffect } from 'react'; +import { useDmStore } from '@/app/store'; +import { formatUsage } from '@/app/common/transValueFormat'; +import type { DmStatusLawYearsType, DmStatusBildTpYearsType, DmStatusUsgYearsType, DmStatusSidoUsgType, TableHeaderType } from '@/app/store/dm-status/type'; +import { Col2Name } from '@/app/store/dm-status/type'; function SectionTitle({ children }: { children: React.ReactNode }) { return ( -
- -

{children}

+
+ +

{children}

); } -function Hr({ className = "" }: { className?: string }) { +function Hr({ className = '' }: { className?: string }) { return
; } function SewageIntroSummary() { const items = [ { - icon: "/images/landing/icon_cycle_water.png", - title: "안정적인 재이용률 유지", + icon: '/images/landing/icon_cycle_water.png', + title: '안정적인 재이용률 유지', desc: ( - <> + <> 연간 약 1,136백만m³의 하수처리수가 재이용되고 있으며, -
+
약 15%에 달하는 높은 재이용률을 통해 -
+
수자원 선순환 체계를 구축하고 있습니다. - + ), }, { - icon: "/images/landing/icon_water_flow.png", - title: "메마른 하천을 살리는 물", + icon: '/images/landing/icon_water_flow.png', + title: '메마른 하천을 살리는 물', desc: ( - <> + <> 재이용되는 물의 가장 많은 부분이 하천유지용수로 사용되어 -
+
도심 속 하천의 생태계를 보호하고 쾌적한 수변 환경을 조성합니다. - + ), }, { - icon: "/images/landing/icon_location.png", - title: "지역별 균형 있는 활용", + icon: '/images/landing/icon_location.png', + title: '지역별 균형 있는 활용', desc: ( - <> + <> 전국적으로 고르게 시설이 확충되고 있으며, 특히 경기 지역을 중심으로 -
+
대규모 공업용수 공급망을 구축하여 -
+
지역 경제와 환경 보호를 동시에 실현하고 있습니다. - + ), }, ]; return ( -
-
+
+
{/* 좌측 */}
-

+

버려지는 하수에서 찾는 새로운 가치,
- - 하수처리수 재이용 - - 이 도시를 숨쉬게 합니다. + 하수처리수 재이용이 도시를 숨쉬게 합니다.

-

+

하수처리장에서 정화된 물은 하천의 수량을 조절하고
산업 현장에 용수를 공급하는 소중한 자원입니다.

-
+
{items.map((item) => ( -
-
- +
+
+
- - {item.title} - -

- {item.desc} -

+ {item.title} +

{item.desc}

))} @@ -118,15 +99,8 @@ function SewageIntroSummary() {
{/* 우측 이미지 */} -
- +
+
@@ -134,31 +108,24 @@ function SewageIntroSummary() { } const tableStyles = { - container: "w-[1000px] mx-auto overflow-hidden", - table: "w-full table-fixed border-collapse text-center text-[16px]", - th: "border border-[#858F98] py-3 font-bold text-neutral-800", - td: "border border-[#858F98] py-3 text-neutral-700 font-medium break-keep", - headerBg: "bg-[#E3E7EA]", + container: 'w-[1000px] mx-auto overflow-hidden', + table: 'w-full table-fixed border-collapse text-center text-[16px]', + th: 'border border-[#858F98] py-3 font-bold text-neutral-800', + td: 'border border-[#858F98] py-3 text-neutral-700 font-medium break-keep', + headerBg: 'bg-[#E3E7EA]', }; -const headerColors6 = [ - "bg-[#01ACE5]", - "bg-[#17AFC7]", - "bg-[#2CB2A9]", - "bg-[#42B58B]", - "bg-[#57B86D]", - "bg-[#81C784]", -]; +const headerColors6 = ['bg-[#01ACE5]', 'bg-[#17AFC7]', 'bg-[#2CB2A9]', 'bg-[#42B58B]', 'bg-[#57B86D]', 'bg-[#81C784]']; export default function SewageStatusSection() { const getPbnstByLawYears = useDmStore((state) => state.getPbnstByLawYears); - const getPbnstByUsgYears = useDmStore((state) => state.getPbnstByUsgYears); - const getPbnstByCpcYears = useDmStore((state) => state.getPbnstByCpcYears); - const getPbnstBySido = useDmStore((state) => state.getPbnstBySido); + const getPbnstByUsgYears = useDmStore((state) => state.getPbnstByUsgYears); + const getPbnstByCpcYears = useDmStore((state) => state.getPbnstByCpcYears); + const getPbnstBySido = useDmStore((state) => state.getPbnstBySido); const pbnstYears = useDmStore((state) => state.pbnst.pbnstYears); const selectYear = pbnstYears.slice(-1)[0]; const pbnstByLawYearsHeader = useDmStore((state) => state.pbnst.pbnstByLawYearsHeader); - const pbnstByLawYears = useDmStore((state) => state.pbnst.pbnstByLawYears); + const pbnstByLawYears = useDmStore((state) => state.pbnst.pbnstByLawYears); const pbnstByUsgYearsHeader = useDmStore((state) => state.pbnst.pbnstByUsgYearsHeader); const pbnstByUsgYears = useDmStore((state) => state.pbnst.pbnstByUsgYears); const pbnstByCpcYearsHeader = useDmStore((state) => state.pbnst.pbnstByCpcYearsHeader); @@ -168,15 +135,11 @@ export default function SewageStatusSection() { // 출처 텍스트 function SourceText() { - return ( -

- 자료: 하수도정보시스템 {selectYear} 하수도 통계 -

- ); + return

자료: 하수도정보시스템 {selectYear} 하수도 통계

; } - + useEffect(() => { - void getPbnstByLawYears(); + void getPbnstByLawYears(); void getPbnstByUsgYears(); void getPbnstByCpcYears(); void getPbnstBySido(); @@ -184,10 +147,7 @@ export default function SewageStatusSection() { const renderPartHeaders = (headers: string[], headerColors: string[]) => { return headers.map((header, index) => ( -
)); @@ -198,10 +158,10 @@ export default function SewageStatusSection() { row: DmStatusLawYearsType, data: DmStatusLawYearsType[], headers: TableHeaderType[], - unitSize: number = 1, // 단위 변경 1000 인 경우, 100,000 -> 100 으로 변경 + unitSize: number = 1 // 단위 변경 1000 인 경우, 100,000 -> 100 으로 변경 ) => { const rowData = row as Record; - const currentCol1 = String(rowData["COL1"] ?? ""); + const currentCol1 = String(rowData['COL1'] ?? ''); // 이전 값 const prevCol1 = rowIdx > 0 ? data[rowIdx - 1]?.COL1 : null; @@ -220,56 +180,38 @@ export default function SewageStatusSection() { const value = rowData[header.id]; // COL1 처리 (rowspan 핵심) - if (header.id === "COL1") { + if (header.id === 'COL1') { // 이전과 같으면 렌더링 안함 if (currentCol1 === prevCol1) return null; return ( - ); - } else if (header.id === "COL2") { - return ( - ); }); }; - const renderPbnstUsgCells = ( - rowIdx: number, - row: DmStatusBildTpYearsType | DmStatusUsgYearsType, - headers: TableHeaderType[] - ) => { + const renderPbnstUsgCells = (rowIdx: number, row: DmStatusBildTpYearsType | DmStatusUsgYearsType, headers: TableHeaderType[]) => { const rowData = row as Record; const isLastInGroup = rowIdx === 8 || rowIdx === 17; - const getType = (colNm:string) => { + const getType = (colNm: string) => { const last3 = colNm.slice(-3); // 끝 3자리 - const prefix = last3[0]; // S 또는 D + const prefix = last3[0]; // S 또는 D if (prefix === 'S') { const num = parseInt(last3.slice(1), 10); // 숫자 @@ -282,149 +224,117 @@ export default function SewageStatusSection() { return headers.map((header, index) => { const value = rowData[header.id]; - const colNm = String(rowData["COL_NM"] ?? ""); + const colNm = String(rowData['COL_NM'] ?? ''); const type = getType(colNm); - const isSubItem = type === "red-item" || type === "blue-item"; - + const isSubItem = type === 'red-item' || type === 'blue-item'; + if (index === 0) { // console.log(header.id, value); return ( - ); - } + ); + } return ( - ); - }); }; - const renderSidoUsgCells = ( - rowIdx: number, - row: DmStatusSidoUsgType, - headers: TableHeaderType[] - ) => { + const renderSidoUsgCells = (rowIdx: number, row: DmStatusSidoUsgType, headers: TableHeaderType[]) => { const rowData = row as Record; return headers.map((header, index) => { let value = rowData[header.id]; - value = (index === 0||index ===9) ? value : formatUsage(value as string | number, 1000, 1); - value = value === "0.0"? "-" : value; + value = index === 0 || index === 9 ? value : formatUsage(value as string | number, 1000, 1); + value = value === '0.0' ? '-' : value; return ( - ); }); }; - const title = "하수처리수 재이용시설(현황)"; + const title = '하수처리수 재이용시설(현황)'; return ( -
+
{/* 상단 타이틀 */} -
-

- {title} - +
+

+ {title} +

-
+
{/* 1) 연도별 하수처리수 재이용 현황 */}
- {/* 인트로 */} - + {/* 인트로 */} + -
- 연도별 하수처리수 재이용 현황 -
-
-

용도빗물이용량 (천m³/년)
+ 용도 + + 빗물이용량 (천m³/년) +
+ {header} + {value} - ); + } else if (header.id === 'COL2') { + return ; } - + return ( - - {(String(rowData["COL2"]).indexOf("CNT") > -1) - ? Number(value).toLocaleString("ko-KR") - : ((String(rowData["COL2"]).indexOf("REUSERT") > -1) + + {String(rowData['COL2']).indexOf('CNT') > -1 + ? Number(value).toLocaleString('ko-KR') + : String(rowData['COL2']).indexOf('REUSERT') > -1 ? formatUsage(value as string | number, 1, 1) - : formatUsage(value as string | number, unitSize, 1)) - } + : formatUsage(value as string | number, unitSize, 1)} {isSubItem ? ( <> -
-
- - {value} - +
+
+ {value} ) : ( - - {value} - + {value} )}
+ {formatUsage(value as string | number, 1000, 1)} + {value}
- - - - - - - - - - - - - - {renderPartHeaders(pbnstYears, headerColors6)} - - - - {pbnstByLawYears.map((row, idx, arr) => ( - - {renderCells(idx, row, arr, pbnstByLawYearsHeader, 1000)} - - ))} - -
- 구분 -
-
+
+ 연도별 하수처리수 재이용 현황 +
+
+ + + + + + + + + + + + + + + {renderPartHeaders(pbnstYears, headerColors6)} + + + + {pbnstByLawYears.map((row, idx, arr) => ( + {renderCells(idx, row, arr, pbnstByLawYearsHeader, 1000)} + ))} + +
+ 구분 +
+
- -
+
+
-
+
{/* 2) 용도별 하수처리수 재이용 현황 */} -
+
용도별 하수처리수 재이용 현황 -
+
-
- (단위: 백만m³/일) -
+
(단위: 백만m³/년)
- + @@ -434,17 +344,15 @@ export default function SewageStatusSection() { - + {renderPartHeaders(pbnstYears, headerColors6)} {pbnstByUsgYears.map((row, idx) => ( - + {renderPbnstUsgCells(idx, row, pbnstByUsgYearsHeader)} - + ))}
- 구분 - 구분
@@ -454,18 +362,18 @@ export default function SewageStatusSection() {
-
+
{/* 3) 하수처리시설 설치 및 이용 현황 */} -
+
하수처리시설 설치 및 이용 현황 -
+
- - + + @@ -475,10 +383,7 @@ export default function SewageStatusSection() { - {renderPartHeaders(pbnstYears, headerColors6)} @@ -486,9 +391,7 @@ export default function SewageStatusSection() { {pbnstByCpcYears.map((row, idx, arr) => ( - - {renderCells(idx, row, arr, pbnstByCpcYearsHeader, 10000)} - + {renderCells(idx, row, arr, pbnstByCpcYearsHeader, 10000)} ))}
+ 구분
@@ -498,24 +401,19 @@ export default function SewageStatusSection() {
-
+
{/* 4) 시도별 하수처리수 재이용 현황 */} -
+
시도별 하수처리수 재이용 현황 -
+
-
- (단위: 백만m³/일) -
+
(단위: 백만m³/년)
- + @@ -529,54 +427,53 @@ export default function SewageStatusSection() { - - - + - - - - - - - - - - + + + + + {pbnstBySido.map((row, idx) => ( - + {renderSidoUsgCells(idx, row, pbnstBySidoHeader)} - + ))}
시도 - 연간
하수
처리량 +
+ {' '} + 시도{' '} + + 연간 +
+ 하수 +
+ 처리량 +
재이용현황 - 재이용률
(%) +
+ 재이용률 +
+ (%)
+ 비고
+ 계 + 장내 + 장외
- 소계 - - 하천유지용수 - - 공업용수 - - 농업용수 - - 기타용수 - 소계하천유지용수공업용수농업용수기타용수
diff --git a/apps/dm/app/(with-layout)/status/rain/page.tsx b/apps/dm/app/(with-layout)/status/rain/page.tsx index 88f041edf..fe4caa7c4 100644 --- a/apps/dm/app/(with-layout)/status/rain/page.tsx +++ b/apps/dm/app/(with-layout)/status/rain/page.tsx @@ -1,60 +1,36 @@ -"use client"; +'use client'; -import { useEffect, useMemo } from "react"; -import SubPageHeader from "@/components/SubPageHeader"; -import { useDmStore } from "@/app/store"; -import { formatUsage } from "@/app/common/transValueFormat"; -import type { - DmStatusBildTpYearsType, - DmStatusUsgBildTpType, - DmStatusUsgYearsType, - TableHeaderType, -} from "@/app/store/dm-status/type"; +import { useEffect, useMemo } from 'react'; +import SubPageHeader from '@/components/SubPageHeader'; +import { useDmStore } from '@/app/store'; +import { formatUsage } from '@/app/common/transValueFormat'; +import type { DmStatusBildTpYearsType, DmStatusUsgBildTpType, DmStatusUsgYearsType, TableHeaderType } from '@/app/store/dm-status/type'; // 공통 섹션 타이틀 컴포넌트 function SectionTitle({ children }: { children: React.ReactNode }) { return ( -
- -

{children}

+
+ +

{children}

); } // 구분선 -function Hr({ className = "" }: { className?: string }) { +function Hr({ className = '' }: { className?: string }) { return
; } - - const tableStyles = { - container: "w-[1000px] mx-auto overflow-hidden", - table: "w-full table-fixed border-collapse text-center text-[16px]", - th: "border border-[#858F98] py-3 font-bold text-neutral-800", - td: "border border-[#858F98] py-3 text-neutral-700 font-medium break-keep", - headerBg: "bg-[#E3E7EA]", + container: 'w-[1000px] mx-auto overflow-hidden', + table: 'w-full table-fixed border-collapse text-center text-[16px]', + th: 'border border-[#858F98] py-3 font-bold text-neutral-800', + td: 'border border-[#858F98] py-3 text-neutral-700 font-medium break-keep', + headerBg: 'bg-[#E3E7EA]', }; -const headerColors6 = [ - "bg-[#01ACE5]", - "bg-[#17AFC7]", - "bg-[#2CB2A9]", - "bg-[#42B58B]", - "bg-[#57B86D]", - "bg-[#81C784]", -]; -const headerColors8 = [ - "bg-[#01ACE5]", - "bg-[#10AED0]", - "bg-[#20B0BA]", - "bg-[#2FB2A5]", - "bg-[#3FB58F]", - "bg-[#4EB77A]", - "bg-[#5EB964]", - "bg-[#6DBB4F]", -]; - +const headerColors6 = ['bg-[#01ACE5]', 'bg-[#17AFC7]', 'bg-[#2CB2A9]', 'bg-[#42B58B]', 'bg-[#57B86D]', 'bg-[#81C784]']; +const headerColors8 = ['bg-[#01ACE5]', 'bg-[#10AED0]', 'bg-[#20B0BA]', 'bg-[#2FB2A5]', 'bg-[#3FB58F]', 'bg-[#4EB77A]', 'bg-[#5EB964]', 'bg-[#6DBB4F]']; export default function RainwaterStatusPage() { const getRainyByBildTpYears = useDmStore((state) => state.getRainyByBildTpYears); @@ -68,19 +44,11 @@ export default function RainwaterStatusPage() { const rainyByUsgBildTp = useDmStore((state) => state.rainy.rainyByUsgBildTp); const rainyByUsgYearsHeader = useDmStore((state) => state.rainy.rainyByUsgYearsHeader); const rainyByUsgYears = useDmStore((state) => state.rainy.rainyByUsgYears); - const partBildTpHeader = useMemo( - () => rainyByUsgBildTpHeader.slice(3).map((header) => header.title), - [rainyByUsgBildTpHeader] - ); - + const partBildTpHeader = useMemo(() => rainyByUsgBildTpHeader.slice(3).map((header) => header.title), [rainyByUsgBildTpHeader]); // 출처 텍스트 function SourceText() { - return ( -

- 자료: 환경부(2024), 「{selectYear} 하수도 통계」 -

- ); + return

자료: 환경부(2024), 「{selectYear} 하수도 통계」

; } useEffect(() => { @@ -91,32 +59,22 @@ export default function RainwaterStatusPage() { const renderPartHeaders = (headers: string[], headerColors: string[]) => { return headers.map((header, index) => ( -
+ {header} + {index === 0 ? value : formatUsage(value as string | number, 1000, 1)} - {displayValue == 0.0 ? "-" : displayValue} + + {displayValue == 0.0 ? '-' : displayValue}
- - - {renderPartHeaders(rainyYears, headerColors6)} - + {renderPartHeaders(rainyYears, headerColors6)} {rainyByBildTpYears.map((row, idx) => ( - + {renderBuildingUsageCells(row, rainyByBildTpYearsHeader)} ))} @@ -193,28 +137,38 @@ export default function RainwaterStatusPage() { -
+
{/* 2) 빗물이용시설의 용도별 분포 (2023년 기준) */} -
+
빗물이용시설의 용도별 분포 ({selectYear}년 기준) -
+
+ 구분 빗물이용량 (천m³/년)
- - - - - - - {renderPartHeaders(partBildTpHeader, headerColors8)} + + + + + {renderPartHeaders(partBildTpHeader, headerColors8)} {rainyByUsgBildTp.map((row, idx) => ( - + {renderRainyByUsgBildTpCells(row)} ))} @@ -225,26 +179,28 @@ export default function RainwaterStatusPage() { -
+
{/* 3) 빗물이용시설의 용도별 빗물이용량 현황 */} -
+
빗물이용시설의 용도별 빗물이용량 현황 -
+
용도개소수
(개소)
저류용량
(천m³)
빗물이용량 (천m³/년)
+ 용도 + + 개소수 +
+ (개소) +
+ 저류조용량 +
+ (천m³) +
+ 빗물이용량 (천m³/년) +
- - - - - {renderPartHeaders(rainyYears, headerColors6)} + + + {renderPartHeaders(rainyYears, headerColors6)} {rainyByUsgYears.map((row, idx) => ( - + {renderBuildingUsageCells(row, rainyByUsgYearsHeader)} ))} diff --git a/apps/dm/app/(with-layout)/status/sewage/page.tsx b/apps/dm/app/(with-layout)/status/sewage/page.tsx index fdb1fe8f9..98d49bfc1 100644 --- a/apps/dm/app/(with-layout)/status/sewage/page.tsx +++ b/apps/dm/app/(with-layout)/status/sewage/page.tsx @@ -1,30 +1,26 @@ -"use client"; +'use client'; -import React from "react"; -import SubPageHeader from "@/components/SubPageHeader"; +import React from 'react'; +import SubPageHeader from '@/components/SubPageHeader'; // 공통 섹션 타이틀 컴포넌트 function SectionTitle({ children }: { children: React.ReactNode }) { return ( -
- -

{children}

+
+ +

{children}

); } // 구분선 -function Hr({ className = "" }: { className?: string }) { +function Hr({ className = '' }: { className?: string }) { return
; } // 출처 텍스트 function SourceText() { - return ( -

- 자료: 환경부(2024), 「2023 하수도 통계」 -

- ); + return

자료: 환경부(2024), 「2023 하수도 통계」

; } /** @@ -33,11 +29,11 @@ function SourceText() { * - 폰트 사이즈: 16px로 수정 */ const tableStyles = { - container: "w-[1000px] mx-auto overflow-hidden", - table: "w-full table-fixed border-collapse text-center text-[16px]", - th: "border border-[#858F98] py-3 font-bold text-neutral-800", - td: "border border-[#858F98] py-3 text-neutral-700 font-medium break-keep", - headerBg: "bg-[#E3E7EA]", + container: 'w-[1000px] mx-auto overflow-hidden', + table: 'w-full table-fixed border-collapse text-center text-[16px]', + th: 'border border-[#858F98] py-3 font-bold text-neutral-800', + td: 'border border-[#858F98] py-3 text-neutral-700 font-medium break-keep', + headerBg: 'bg-[#E3E7EA]', }; // export default function TreatedWaterPage() { @@ -51,368 +47,382 @@ const tableStyles = { export default function TreatedStatusPage() { return ( -
+
{/* */} -
-
+
+
- {/* 1) 연도별 하수처리수 재이용 현황 */} -
- 연도별 하수처리수 재이용 현황 -
-
-
용도빗물이용량 (천m³/년)
+ 용도 + + 빗물이용량 (천m³/년) +
- - - - - - - - - - - - - - - - - - - - - - - {[ - { - group: "전체", - rows: [ - ["개소수 (개소)", "671", "681", "698", "704", "714", "717"], - ["하수처리량 (백만m³/년)", "7,163.7", "7,140.4", "7,375.6", "7,335.8", "7,378.9", "7,537.2"], - ["재이용량 (백만m³/년)", "1,112.7", "1,148.7", "1,148.7", "1,127.0", "1,136.8", "1,137.5"], - ["재이용률 (%)", "17.4", "16.5", "15.5", "14.1", "14.3", "14.4"], - ] - }, - { - group: "법적 대상", - rows: [ - ["개소수 (개소)", "68", "82", "94", "97", "101", "118"], - ["하수처리량 (백만m³/년)", "761.2", "839.0", "935.3", "1,158.7", "1,220.6", "1,473.6"], - ["재이용량 (백만m³/년)", "162.2", "190.6", "218.5", "244.6", "247.2", "324.9"], - ["재이용률 (%)", "24.7", "25.4", "27.8", "25.7", "24.2", "24.1"], - ] - }, - { - group: "법적 미대상", - rows: [ - ["개소수 (개소)", "603", "599", "604", "607", "613", "599"], - ["하수처리량 (백만m³/년)", "6,402.5", "6,301.4", "6,440.3", "6,177.1", "6,158.3", "6,063.5"], - ["재이용량 (백만m³/년)", "950.6", "958.1", "926.2", "882.4", "889.5", "812.7"], - ["재이용률 (%)", "16.5", "15.3", "13.6", "12.2", "12.6", "12.5"], - ] - } - ].map((section, sIdx) => ( - - {section.rows.map((row, rIdx) => ( - - {rIdx === 0 && ( - - )} - {row.map((val, i) => { - const isFirstCol = i === 0; - const isHighlightedCol = [1, 3, 5].includes(i); - return ( - - ))} - - ))} - -
구분201820192020202120222023
- {section.group} - - ); - })} -
+ {/* 1) 연도별 하수처리수 재이용 현황 */} +
+ 연도별 하수처리수 재이용 현황 +
+
+ + + + + + + + + + + + + + + + + + + + + + + + {[ + { + group: '전체', + rows: [ + ["개소수 (개소)", '671', '681', '698', '704', '714', '717'], + ["하수처리량 (백만m³/년)", '7,163.7', '7,140.4', '7,375.6', '7,335.8', '7,378.9', '7,537.2'], + ["재이용량 (백만m³/년)", '1,112.7', '1,148.7', '1,148.7', '1,127.0', '1,136.8', '1,137.5'], + ["재이용률 (%)", '17.4', '16.5', '15.5', '14.1', '14.3', '14.4'], + ], + }, + { + group: '법적 대상', + rows: [ + ["개소수 (개소)", '68', '82', '94', '97', '101', '118'], + ["하수처리량 (백만m³/년)", '761.2', '839.0', '935.3', '1,158.7', '1,220.6', '1,473.6'], + ["재이용량 (백만m³/년)", '162.2', '190.6', '218.5', '244.6', '247.2', '324.9'], + ["재이용률 (%)", '24.7', '25.4', '27.8', '25.7', '24.2', '24.1'], + ], + }, + { + group: '법적 미대상', + rows: [ + ["개소수 (개소)", '603', '599', '604', '607', '613', '599'], + ["하수처리량 (백만m³/년)", '6,402.5', '6,301.4', '6,440.3', '6,177.1', '6,158.3', '6,063.5'], + ["재이용량 (백만m³/년)", '950.6', '958.1', '926.2', '882.4', '889.5', '812.7'], + ["재이용률 (%)", '16.5', '15.3', '13.6', '12.2', '12.6', '12.5'], + ], + }, + ].map((section, sIdx) => ( + + {section.rows.map((row, rIdx) => ( + + {rIdx === 0 && ( + + )} + {row.map((val, i) => { + const isFirstCol = i === 0; + const isHighlightedCol = [1, 3, 5].includes(i); + return ( + + ))} + + ))} + +
+ 구분 + 201820192020202120222023
+ {section.group} + + ); + })} +
+
+
- -
-
+
-
+
- {/* 2) 용도별 하수처리수 재이용 현황 */} -
- 용도별 하수처리수 재이용 현황 -
-
- - - - - - - - - - - - - - - - - - - - - - - {[ - { label: "총 재이용량", type: "total", values: ["1,112.7", "1,148.7", "1,144.7", "1,127.0", "1,136.8", "1,137.5"] }, - { label: "장내 재이용", type: "category", values: ["520.6", "519.8", "513.9", "520.3", "502.2", "490.0"] }, - { label: "세척수", type: "red-item", values: ["177.9", "174.4", "169.4", "180.9", "196.8", "191.2"] }, - { label: "냉각수", type: "red-item", values: ["45.5", "46.8", "50.4", "40.6", "38.3", "41.7"] }, - { label: "청소수", type: "red-item", values: ["17.6", "21.2", "21.2", "21.7", "20.8", "20.5"] }, - { label: "조경용수", type: "red-item", values: ["0.1", "0.1", "-", "-", "-", "-"] }, - { label: "회생용수", type: "red-item", values: ["15.8", "16.7", "17.8", "15.7", "14.4", "14.0"] }, - { label: "장내급수도", type: "red-item", values: ["2.4", "-", "-", "-", "-", "-"] }, - { label: "장내기타용수", type: "red-item", values: ["261.3", "260.6", "255.0", "261.1", "231.8", "222.6"] }, - { label: "장외 재이용", type: "category", values: ["592.1", "628.9", "630.8", "606.7", "634.6", "647.5"] }, - { label: "청소·화장실용수", type: "blue-item", values: ["0.6", "0.4", "0.4", "0.4", "0.4", "0.4"] }, - { label: "세척·살수용수", type: "blue-item", values: ["5.6", "9.9", "2.9", "2.1", "3.0", "3.6"] }, - { label: "조경용수", type: "blue-item", values: ["10.3", "16.4", "5.9", "4.5", "8.9", "9.5"] }, - { label: "친수용수", type: "blue-item", values: ["7.8", "3.1", "3.1", "3.0", "10.9", "10.5"] }, - { label: "하천유지용수", type: "blue-item", values: ["480.5", "482.5", "496.2", "442.7", "471.7", "484.0"] }, - { label: "농업용수", type: "blue-item", values: ["12.2", "11.9", "13.4", "10.7", "10.6", "11.4"] }, - { label: "지하수 충전", type: "blue-item", values: ["0.0", "0.0", "0.0", "13.4", "0.0", "0.0"] }, - { label: "공업용수", type: "blue-item", values: ["75.2", "104.6", "108.9", "129.9", "129.0", "128.1"] }, - ].map((row, idx) => { - const isSubItem = row.type === "red-item" || row.type === "blue-item"; - const isLastInGroup = idx === 8 || idx === 17; + {/* 2) 용도별 하수처리수 재이용 현황 */} +
+ 용도별 하수처리수 재이용 현황 +
+
+
구분201820192020202120222023
+ + + + + + + + + + + + + + + + + + + + + + {[ + { label: '총 재이용량', type: 'total', values: ['1,112.7', '1,148.7', '1,144.7', '1,127.0', '1,136.8', '1,137.5'] }, + { label: '장내 재이용', type: 'category', values: ['520.6', '519.8', '513.9', '520.3', '502.2', '490.0'] }, + { label: '세척수', type: 'red-item', values: ['177.9', '174.4', '169.4', '180.9', '196.8', '191.2'] }, + { label: '냉각수', type: 'red-item', values: ['45.5', '46.8', '50.4', '40.6', '38.3', '41.7'] }, + { label: '청소수', type: 'red-item', values: ['17.6', '21.2', '21.2', '21.7', '20.8', '20.5'] }, + { label: '조경용수', type: 'red-item', values: ['0.1', '0.1', '-', '-', '-', '-'] }, + { label: '회생용수', type: 'red-item', values: ['15.8', '16.7', '17.8', '15.7', '14.4', '14.0'] }, + { label: '장내급수도', type: 'red-item', values: ['2.4', '-', '-', '-', '-', '-'] }, + { label: '장내기타용수', type: 'red-item', values: ['261.3', '260.6', '255.0', '261.1', '231.8', '222.6'] }, + { label: '장외 재이용', type: 'category', values: ['592.1', '628.9', '630.8', '606.7', '634.6', '647.5'] }, + { label: '청소·화장실용수', type: 'blue-item', values: ['0.6', '0.4', '0.4', '0.4', '0.4', '0.4'] }, + { label: '세척·살수용수', type: 'blue-item', values: ['5.6', '9.9', '2.9', '2.1', '3.0', '3.6'] }, + { label: '조경용수', type: 'blue-item', values: ['10.3', '16.4', '5.9', '4.5', '8.9', '9.5'] }, + { label: '친수용수', type: 'blue-item', values: ['7.8', '3.1', '3.1', '3.0', '10.9', '10.5'] }, + { label: '하천유지용수', type: 'blue-item', values: ['480.5', '482.5', '496.2', '442.7', '471.7', '484.0'] }, + { label: '농업용수', type: 'blue-item', values: ['12.2', '11.9', '13.4', '10.7', '10.6', '11.4'] }, + { label: '지하수 충전', type: 'blue-item', values: ['0.0', '0.0', '0.0', '13.4', '0.0', '0.0'] }, + { label: '공업용수', type: 'blue-item', values: ['75.2', '104.6', '108.9', '129.9', '129.0', '128.1'] }, + ].map((row, idx) => { + const isSubItem = row.type === 'red-item' || row.type === 'blue-item'; + const isLastInGroup = idx === 8 || idx === 17; - return ( - - - {row.values.map((val, i) => ( - + + {row.values.map((val, i) => ( + + ))} + + ); + })} + +
구분201820192020202120222023
- {isSubItem ? ( - <> -
-
- {row.label} - - ) : ( - {row.label} - )} -
+ return ( +
+ {isSubItem ? ( + <> +
+
+ {row.label} + + ) : ( + {row.label} + )} +
+ {val} +
+
+ +
+
+ +
+ + {/* 3) 하수처리시설 설치 및 이용 현황 */} +
+ 하수처리시설 설치 및 이용 현황 +
+
+ + + + + + + + + + + + + + + + + + + + + + + + {[ + { + group: '전체', + rows: [ + ["시설수 (개소)", '671', '681', '698', '704', '714', '717'], + ["시설용량 (만m³/일)", '25,846', '26,067', '26,244', '26,492', '26,586', '26,766'], + ["처리용량 (만m³/일)", '1,112.7', '1,148.7', '1,144.7', '1,127.0', '1,136.8', '1,137.5'], + ], + }, + { + group: '법적 대상', + rows: [ + ["시설수 (개소)", '68', '82', '94', '97', '101', '118'], + ["시설용량 (만m³/일)", '3,088.9', '3,359.2', '3,612.6', '4,412.2', '4,692.3', '5,503.8'], + ["처리용량 (만m³/일)", '162.2', '190.6', '218.5', '244.6', '247.2', '324.9'], + ], + }, + { + group: '법적 미대상', + rows: [ + ["시설수 (개소)", '603', '599', '604', '607', '613', '599'], + ["시설용량 (만m³/일)", '22,757', '22,708', '22,631', '22,080', '21,894', '21,262'], + ["처리용량 (만m³/일)", '950.6', '958.1', '926.2', '882.4', '889.5', '812.7'], + ], + }, + ].map((section, sIdx) => ( + + {section.rows.map((row, rIdx) => ( + + {rIdx === 0 && ( + + )} + {row.map((val, i) => { + const isFirstCol = i === 0; + const isHighlightedCol = [1, 3, 5].includes(i); + return ( + + ))} + + ))} + +
+ 구분 + 201820192020202120222023
+ {section.group} + + ); + })} +
+
+ +
+
+ +
+ + {/* 4) 시도별 하수처리수 재이용 현황 */} +
+ 시도별 하수처리수 재이용 현황 +
+
+
(단위: 백만m³/년)
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + {/* 💡 하천유지용수는 14px, 나머지 하위 헤더는 16px로 적용 */} + + + + + + + + + {[ + ['합계', '7,537.2', '1,137.5', '490.0', '647.5', '484.0', '128.1', '11.4', '24.0', '15.1%', ''], + ['서울특별시', '1,567.0', '114.9', '59.3', '55.6', '55.1', '-', '-', '0.5', '7.3%', ''], + ['부산광역시', '491.5', '146.2', '120.7', '25.5', '25.3', '-', '-', '0.2', '29.7%', ''], + ['대구광역시', '432.7', '102.4', '38.2', '64.2', '64.1', '-', '-', '0.1', '23.7%', ''], + ['인천광역시', '302.3', '57.7', '11.6', '46.1', '29.2', '12.1', '0.5', '4.3', '19.1%', ''], + ['광주광역시', '211.1', '28.7', '6.5', '22.3', '22.2', '-', '-', '0.1', '13.6%', ''], + ['대전광역시', '244.6', '11.9', '11.9', '0.68', '0.0', '-', '-', '0.1', '4.9%', ''], + ['울산광역시', '235.1', '36.1', '6.1', '29.9', '29.7', '0.2', '-', '-', '15.3%', ''], + ['세종특별자치시', '38.5', '2.5', '2.0', '0.5', '0.4', '-', '0.2', '-', '6.6%', ''], + ['경기도', '1,926.8', '313.3', '122.2', '191.0', '153.0', '33.3', '0.4', '4.3', '16.3%', ''], + ['강원도', '230.4', '19.6', '15.4', '4.2', '2.1', '-', '-', '2.1', '8.5%', ''], + ['충청북도', '190.9', '15.6', '6.3', '9.2', '7.4', '0.6', '-', '1.2', '8.2%', ''], + ['충청남도', '241.5', '41.4', '9.8', '31.5', '17.7', '8.6', '4.5', '0.8', '17.1%', ''], + ['전라북도', '292.4', '42.7', '7.5', '35.1', '33.5', '0.2', '1.0', '0.5', '14.6%', ''], + ['전라남도', '254.0', '23.6', '12.3', '11.3', '8.7', '0.0', '1.0', '1.6', '9.3%', ''], + ['경상북도', '378.4', '129.1', '33.7', '95.3', '20.8', '72.5', '0.8', '1.3', '34.1%', ''], + ['경상남도', '411.3', '50.1', '25.0', '25.0', '14.7', '0.5', '3.0', '6.9', '12.2%', ''], + ['제주특별자치도', '88.6', '1.7', '1.5', '0.12', '-', '-', '0.1', '-', '1.9%', ''], + ].map((row, idx) => ( + + {/* 💡 연간하수처리량(index 1), 장내(index 3), 재이용률(index 9) 컬러 하이라이트 적용 */} + {row.map((val, i) => ( + ))} - ); - })} - -
+ 시도 + + 연간 +
+ 하수 +
+ 처리량 +
+ 재이용현황 + + 재이용률 +
+ (%) +
+ 비고 +
+ 계 + + 장내 + + 장외 +
소계하천유지용수공업용수농업용수기타용수
{val}
+ ))} +
+
+
- -
-
- -
- - {/* 3) 하수처리시설 설치 및 이용 현황 */} -
- 하수처리시설 설치 및 이용 현황 -
-
- - - - - - - - - - - - - - - - - - - - - - - - {[ - { - group: "전체", - rows: [ - ["시설수 (개소)", "671", "681", "698", "704", "714", "717"], - ["시설용량 (만m³/일)", "25,846", "26,067", "26,244", "26,492", "26,586", "26,766"], - ["처리용량 (만m³/일)", "1,112.7", "1,148.7", "1,144.7", "1,127.0", "1,136.8", "1,137.5"], - ] - }, - { - group: "법적 대상", - rows: [ - ["시설수 (개소)", "68", "82", "94", "97", "101", "118"], - ["시설용량 (만m³/일)", "3,088.9", "3,359.2", "3,612.6", "4,412.2", "4,692.3", "5,503.8"], - ["처리용량 (만m³/일)", "162.2", "190.6", "218.5", "244.6", "247.2", "324.9"], - ] - }, - { - group: "법적 미대상", - rows: [ - ["시설수 (개소)", "603", "599", "604", "607", "613", "599"], - ["시설용량 (만m³/일)", "22,757", "22,708", "22,631", "22,080", "21,894", "21,262"], - ["처리용량 (만m³/일)", "950.6", "958.1", "926.2", "882.4", "889.5", "812.7"], - ] - } - ].map((section, sIdx) => ( - - {section.rows.map((row, rIdx) => ( - - {rIdx === 0 && ( - - )} - {row.map((val, i) => { - const isFirstCol = i === 0; - const isHighlightedCol = [1, 3, 5].includes(i); - return ( - - ))} - - ))} - -
구분201820192020202120222023
- {section.group} - - ); - })} -
-
- -
-
- -
- - {/* 4) 시도별 하수처리수 재이용 현황 */} -
- 시도별 하수처리수 재이용 현황 -
-
-
(단위: 백만m³/일)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - {/* 💡 하천유지용수는 14px, 나머지 하위 헤더는 16px로 적용 */} - - - - - - - - - {[ - ["합계", "7,537.2", "1,137.5", "490.0", "647.5", "484.0", "128.1", "11.4", "24.0", "15.1%", ""], - ["서울특별시", "1,567.0", "114.9", "59.3", "55.6", "55.1", "-", "-", "0.5", "7.3%", ""], - ["부산광역시", "491.5", "146.2", "120.7", "25.5", "25.3", "-", "-", "0.2", "29.7%", ""], - ["대구광역시", "432.7", "102.4", "38.2", "64.2", "64.1", "-", "-", "0.1", "23.7%", ""], - ["인천광역시", "302.3", "57.7", "11.6", "46.1", "29.2", "12.1", "0.5", "4.3", "19.1%", ""], - ["광주광역시", "211.1", "28.7", "6.5", "22.3", "22.2", "-", "-", "0.1", "13.6%", ""], - ["대전광역시", "244.6", "11.9", "11.9", "0.68", "0.0", "-", "-", "0.1", "4.9%", ""], - ["울산광역시", "235.1", "36.1", "6.1", "29.9", "29.7", "0.2", "-", "-", "15.3%", ""], - ["세종특별자치시", "38.5", "2.5", "2.0", "0.5", "0.4", "-", "0.2", "-", "6.6%", ""], - ["경기도", "1,926.8", "313.3", "122.2", "191.0", "153.0", "33.3", "0.4", "4.3", "16.3%", ""], - ["강원도", "230.4", "19.6", "15.4", "4.2", "2.1", "-", "-", "2.1", "8.5%", ""], - ["충청북도", "190.9", "15.6", "6.3", "9.2", "7.4", "0.6", "-", "1.2", "8.2%", ""], - ["충청남도", "241.5", "41.4", "9.8", "31.5", "17.7", "8.6", "4.5", "0.8", "17.1%", ""], - ["전라북도", "292.4", "42.7", "7.5", "35.1", "33.5", "0.2", "1.0", "0.5", "14.6%", ""], - ["전라남도", "254.0", "23.6", "12.3", "11.3", "8.7", "0.0", "1.0", "1.6", "9.3%", ""], - ["경상북도", "378.4", "129.1", "33.7", "95.3", "20.8", "72.5", "0.8", "1.3", "34.1%", ""], - ["경상남도", "411.3", "50.1", "25.0", "25.0", "14.7", "0.5", "3.0", "6.9", "12.2%", ""], - ["제주특별자치도", "88.6", "1.7", "1.5", "0.12", "-", "-", "0.1", "-", "1.9%", ""], - ].map((row, idx) => ( - - {/* 💡 연간하수처리량(index 1), 장내(index 3), 재이용률(index 9) 컬러 하이라이트 적용 */} - {row.map((val, i) => ( - - ))} - - ))} - -
시도연간
하수
처리량
재이용현황재이용률
(%)
비고
계장내장외
소계하천유지용수공업용수농업용수기타용수
- {val} -
-
- -
-
- +
); -} \ No newline at end of file +} diff --git a/apps/dm/public/images/landing/intro/greywater_mandatory.png b/apps/dm/public/images/landing/intro/greywater_mandatory.png index f3dc58ab6..4476f1245 100644 Binary files a/apps/dm/public/images/landing/intro/greywater_mandatory.png and b/apps/dm/public/images/landing/intro/greywater_mandatory.png differ diff --git a/apps/dm/public/images/landing/intro/greywater_standard.png b/apps/dm/public/images/landing/intro/greywater_standard.png index d544a1fc7..52fcb0518 100644 Binary files a/apps/dm/public/images/landing/intro/greywater_standard.png and b/apps/dm/public/images/landing/intro/greywater_standard.png differ diff --git a/apps/dm/public/images/landing/intro/law_timeline.png b/apps/dm/public/images/landing/intro/law_timeline.png index 56ff1c347..f4e0a1417 100644 Binary files a/apps/dm/public/images/landing/intro/law_timeline.png and b/apps/dm/public/images/landing/intro/law_timeline.png differ diff --git a/apps/dm/public/images/landing/intro/linkage.png b/apps/dm/public/images/landing/intro/linkage.png index a7595a598..91f98fa98 100644 Binary files a/apps/dm/public/images/landing/intro/linkage.png and b/apps/dm/public/images/landing/intro/linkage.png differ diff --git a/apps/dm/public/images/landing/intro/performance_left.png b/apps/dm/public/images/landing/intro/performance_left.png index b85bdd920..4bdd1e836 100644 Binary files a/apps/dm/public/images/landing/intro/performance_left.png and b/apps/dm/public/images/landing/intro/performance_left.png differ diff --git a/apps/dm/public/images/landing/intro/policy_timeline.png b/apps/dm/public/images/landing/intro/policy_timeline.png index 296bad776..744ec87c9 100644 Binary files a/apps/dm/public/images/landing/intro/policy_timeline.png and b/apps/dm/public/images/landing/intro/policy_timeline.png differ diff --git a/apps/dm/public/images/landing/intro/rainwater_design.png b/apps/dm/public/images/landing/intro/rainwater_design.png index 714f506f3..5bff2e747 100644 Binary files a/apps/dm/public/images/landing/intro/rainwater_design.png and b/apps/dm/public/images/landing/intro/rainwater_design.png differ diff --git a/apps/dm/public/images/landing/intro/rel_note.png b/apps/dm/public/images/landing/intro/rel_note.png index 94880c743..5f00b677e 100644 Binary files a/apps/dm/public/images/landing/intro/rel_note.png and b/apps/dm/public/images/landing/intro/rel_note.png differ diff --git a/apps/dm/public/images/landing/intro/treatedwater_mandatory.png b/apps/dm/public/images/landing/intro/treatedwater_mandatory.png index 84704c6ec..617bf1391 100644 Binary files a/apps/dm/public/images/landing/intro/treatedwater_mandatory.png and b/apps/dm/public/images/landing/intro/treatedwater_mandatory.png differ