diff --git a/apps/dm/.env.local b/apps/dm/.env.local index 44e7072c3..e73fe4485 100644 --- a/apps/dm/.env.local +++ b/apps/dm/.env.local @@ -4,17 +4,16 @@ NEXT_PUBLIC_AUTH_USER_ID = token-id NEXT_PUBLIC_ACCESS_TOKEN = access-token NEXT_PUBLIC_REFRESH_TOKEN = refresh-token NEXT_PUBLIC_PORT = 3005 -#NEXT_PUBLIC_PROXY_HOST = http://con.mind-one.co.kr:11035 NEXT_PUBLIC_PROXY_HOST = http://localhost:3005 -NEXT_PUBLIC_DM_SERVER_API_URL = http://con.mind-one.co.kr:11083/reuse-service/api/v1 -NEXT_PUBLIC_SERVER_API_URL = http://dev.onasys.co.kr:8000 -NEXT_PUBLIC_FO_SERVER_API_URL = http://con.mind-one.co.kr:11083/operation-service/api/v1 -# NEXT_PUBLIC_FO_SERVER_API_URL = http://192.168.1.222:8883/operation-service/api/v1 NEXT_PUBLIC_CS_SERVER_API_URL = http://dev.onasys.co.kr:8000 +NEXT_PUBLIC_SERVER_API_URL = http://dev.onasys.co.kr:8000 +NEXT_PUBLIC_DM_SERVER_API_URL = http://con.mind-one.co.kr:11083/reuse-service/api/v1 +# NEXT_PUBLIC_FO_SERVER_API_URL = http://192.168.1.222:8883/operation-service/api/v1 +NEXT_PUBLIC_FO_SERVER_API_URL = http://con.mind-one.co.kr:11083/operation-service/api/v1 +NEXT_PUBLIC_WR_SERVER_API_URL = http://con.mind-one.co.kr:11083/reuse-service/api/v1 NEXT_PUBLIC_GEOSERVER_URL = http://rsone.iptime.org:10010/geoserver NEXT_PUBLIC_LX_GEOSERVER_URL = http://con.mind-one.co.kr:11306/geoserver NEXT_PUBLIC_CS_TUS_UPLOAD = /attach-service/api/v1/tus/upload -NEXT_PUBLIC_WR_SERVER_API_URL = http://con.mind-one.co.kr:11083/reuse-service/api/v1 NEXT_PUBLIC_NGII_URL = https://map.ngii.go.kr NEXT_PUBLIC_NGII_PARAM = 04trYP9_xwLAfALjwZ-B8g&service=WMTS&request=GetTile&version=1.0.0&format=image/png&layer=korean_map&style=korean&tilematrixset=korean&tilematrix={z}&tilecol={x}&tilerow={y} NEXT_PUBLIC_SEWERAGE_API_URL=http://con.mind-one.co.kr:11083/sewerage-service # 개발 서버 API diff --git a/apps/dm/app/layout.tsx b/apps/dm/app/layout.tsx index 462537e09..7224c9dc2 100644 --- a/apps/dm/app/layout.tsx +++ b/apps/dm/app/layout.tsx @@ -1,5 +1,8 @@ "use client"; import "./globals.css"; +import { setCookie } from "../src/shared/lib"; + +setCookie("site-id-key", process.env.NEXT_PUBLIC_SITE_ID || "DM"); export default function RootLayout({ children, diff --git a/apps/dm/next.config.ts b/apps/dm/next.config.ts index bc21e16a4..5e1533ec9 100644 --- a/apps/dm/next.config.ts +++ b/apps/dm/next.config.ts @@ -5,6 +5,9 @@ const subDomain = const nextConfig: NextConfig = { output: "standalone", + experimental: { + proxyTimeout: 600000, + }, async rewrites() { return { beforeFiles: [ diff --git a/apps/fo/app/store/dashboard/index.tsx b/apps/fo/app/store/dashboard/index.tsx index b2778e3d8..09097d6e4 100644 --- a/apps/fo/app/store/dashboard/index.tsx +++ b/apps/fo/app/store/dashboard/index.tsx @@ -53,21 +53,21 @@ export type planFcltyListProps = { export type OperationalStatusListProps = { flowRate: string, waterQlty: string, - yearAvg: number | '', - yearMax: number | '', - yearMin: number | '', - summerAll: number | string | '', - summerThree: number | string | '', - summerRain: number | string | '', - winterAll: number | string | '', - winterSunnyAvg: number | string | '', - winterSunnyMax: number | string | '', - winterSunnyMin: number | string | '', - groundWaterAvg: number | string | '', - groundWaterSummer: number | string | '', - groundWaterWinter: number | string | '', - rdi: number | string | '', - rdiRain: number | string | '', + yearAvg: number | '', // 평균 + yearMax: number | '', // 최대 + yearMin: number | '', // 최소 + summerAll: number | string | '', // 하절기 전체 + summerThree: number | string | '', // 하절기 3mm이상 + summerRain: number | string | '', // 하절기 강우 + winterAll: number | string | '', // 동절기 전체 + winterSunnyAvg: number | string | '', // 동절기 청천시 평균 + winterSunnyMax: number | string | '', // 동절기 청천시 최대 + winterSunnyMin: number | string | '', // 동절기 청천시 최소 + groundWaterAvg: number | string | '', // 지하수 유입량 연평균 + groundWaterSummer: number | string | '',// 지하수 유입량 하절기 평균 + groundWaterWinter: number | string | '',// 지하수 유입량 동절기 평균 + rdi: number | string | '', // RDII 추정 + rdiRain: number | string | '', // RDII 추정시 일강수량(mm) } export interface operationalStatusListProps { @@ -345,7 +345,7 @@ const planFcltyList: planFcltyListProps[] = [ }, ] -const upHeadListOperationStatus: TableUpperProps[] = [ +const upHeadListOperationStatus: TableUpperProps[] = [ // 시설정보 및 운영현황 { id: "flowRate", title: "유량 및 수질", upName: "upChangeRe1", upSequnce: 1 }, { id: "waterQlty", title: "유량 및 수질", upName: "upChangeRe1", upSequnce: 2 }, { id: "yearAvg", title: "평균", upName: "upChangeRe2", upSequnce: 1 }, @@ -365,7 +365,7 @@ const upHeadListOperationStatus: TableUpperProps[] = [ { id: "rdiRain", title: "RDII 추정시\n일강수량(mm)" }, ] -const upHeadListRainManage: TableUpperProps[] = [ +const upHeadListRainManage: TableUpperProps[] = [ // 강우일 운영현황 { id: "rainItem", title: "강우량", row: 0, rowSpan: 2, widthPercent: 8 }, { id: "rainRate", title: "강우조건\n비율(%)", row: 0, rowSpan: 2, align: "right", widthPercent: 5 }, { id: "rainDay", title: "일수", row: 0, rowSpan: 2, align: "right", widthPercent: 5 }, @@ -699,6 +699,7 @@ const drainageEquipmentList: DrainageEquipmentListProps[] = [ } ]; +type ApiRes = { data: any; count: any; } /**==================================== * Store - api (데이터 호출) ====================================*/ @@ -722,16 +723,16 @@ const fetchFacilityPlan = async (targetYear: string | undefined, fcltyCd: string }; /* 시설정보 및 운영현황 - 운영실태 */ -const fetchOperationStatus = async (searchYear: string | undefined, fcltyCd: string | undefined) => { - try { - const url = '/dashBoard/mngInfo/' + (searchYear ? searchYear : '2023') + '/' + (fcltyCd ? fcltyCd : ''); - const res = await getFetch('fo', url); - return { data: res.data, count: res.count } - } catch (error) { - console.error('운영실태 데이터를 가져오는데 실패했습니다:', error); - return { data: [], count: 0 }; - } -} +// const fetchOperationStatus = async (searchYear: string | undefined, fcltyCd: string | undefined): Promise => { +// try { +// const url = '/dashBoard/mngInfo/' + (searchYear ? searchYear : '2023') + '/' + (fcltyCd ? fcltyCd : ''); +// const res = await getFetch('fo', url); +// return { data: res.data, count: res.count } +// } catch (error) { +// console.error('운영실태 데이터를 가져오는데 실패했습니다:', error); +// return { data: [], count: 0 }; +// } +// } // 주요그래프 데이터 const fetchMainGraph = async (searchYear: string | undefined, fcltyCd: string | undefined) => { @@ -746,14 +747,24 @@ const fetchMainGraph = async (searchYear: string | undefined, fcltyCd: string | } // 수질 데이터 청천시, 강우시 재계산 -const calcWaterQltyData = async (data: any[], searchYear: string | undefined, fcltyCd: string | undefined) => { +const calcWaterQltyData = async (data: any[], searchYear: string | undefined, fcltyCd: string | undefined, mainGraphData: any) => { + const operList = { + inflBod: {yearTot: 0, yearAvg: 0, yearMax: 0, yearMin: 9999999}, // 유입BOD + inflTN: {yearTot: 0, yearAvg: 0, yearMax: 0, yearMin: 9999999}, // 유입TN + inflTP: {yearTot: 0, yearAvg: 0, yearMax: 0, yearMin: 9999999}, // 유입TP + efflBod: {yearTot: 0, yearAvg: 0, yearMax: 0, yearMin: 9999999}, // 방류BOD + efflTN: {yearTot: 0, yearAvg: 0, yearMax: 0, yearMin: 9999999}, // 방류TN + efflTP: {yearTot: 0, yearAvg: 0, yearMax: 0, yearMin: 9999999}, // 방류TP + tpInflTp: {yearTot: 0, yearAvg: 0, yearMax: 0, yearMin: 9999999}, //총인 유입수질 TP(mg/L) + }; const nullToZero = (value: any) => { return value === null || value === undefined || value === '' ? 0 : Number(value); }; const orgData = data; - const res = await fetchMainGraph(searchYear, fcltyCd); + // const res = await fetchMainGraph(searchYear, fcltyCd); // /fclt/qlty/hist/{year}/{fcltyCd} + const res = mainGraphData; if (res.data.wqltObjs.length > 0) { // const clone = (arr: any[]) => arr?.map(v => ({ ...v })) ?? []; const qltyData = res.data.wqltObjs; @@ -761,7 +772,7 @@ const calcWaterQltyData = async (data: any[], searchYear: string | undefined, fc // 강우시 변수 const rainEffectDayArray: string[] = []; - + // (0) 전체변수 let summerDay = 0, noNullSummerDay = 0; let totalInflBodAvgSummer = 0, totalInflTnAvgSummer = 0, totalInflTpAvgSummer = 0; @@ -773,6 +784,7 @@ const calcWaterQltyData = async (data: any[], searchYear: string | undefined, fc // (1) 청천시 변수 // (1-1) 날짜 count + let chungchunSummerDay = 0, noNullChungchunSummerDay = 0; let chungchunWinterDay = 0, noNullChungchunWinterDay = 0; @@ -802,6 +814,8 @@ const calcWaterQltyData = async (data: any[], searchYear: string | undefined, fc let rainEffectDay = 0; // 전체 대상 + const totalDay = qltyData.length; + let noNullYearDay = 0; qltyData.forEach((item: any) => { if (item.infoRnDay == null) item.infoRnDay = 0; const month = item.msrDt.substring(4, 6); // 월 추출 @@ -896,7 +910,7 @@ const calcWaterQltyData = async (data: any[], searchYear: string | undefined, fc totalEfflBodAvgWinter += nullToZero(item.efflWqltBod); totalEfflTnAvgWinter += nullToZero(item.efflWqltTn); totalEfflTpAvgWinter += nullToZero(item.efflWqltTp); - totalTpInflAvgWinter += nullToZero(item.tpInflWqltTp); + totalTpInflAvgWinter += nullToZero(item.tpInflWqltTp); //총인 유입수질 TP(mg/L) } else if (month === '06' || month === '07' || month === '08') { summerDay += 1; if (item.tpInflWqltTp != null && item.tpInflWqltTp != 0) { @@ -910,74 +924,81 @@ const calcWaterQltyData = async (data: any[], searchYear: string | undefined, fc totalEfflTpAvgSummer += nullToZero(item.efflWqltTp); totalTpInflAvgSummer += nullToZero(item.tpInflWqltTp); } + + if (item.tpInflWqltTp != null && item.tpInflWqltTp != 0) { + noNullYearDay += 1; + } + operList.inflBod.yearTot += nullToZero(item.inflAssctBfrWqltBod); + operList.inflTN.yearTot += nullToZero(item.inflAssctBfrWqltTn); + operList.inflTP.yearTot += nullToZero(item.inflAssctBfrWqltTp); + operList.efflBod.yearTot += nullToZero(item.efflWqltBod); + operList.efflTN.yearTot += nullToZero(item.efflWqltTn); + operList.efflTP.yearTot += nullToZero(item.efflWqltTp); + operList.tpInflTp.yearTot += nullToZero(item.tpInflWqltTp); + // 최대 최소 + operList.inflBod.yearMax = Math.max(operList.inflBod.yearMax, nullToZero(item.inflAssctBfrWqltBod)); + operList.inflBod.yearMin = Math.min(operList.inflBod.yearMin, nullToZero(item.inflAssctBfrWqltBod)); + operList.inflTN.yearMax = Math.max(operList.inflTN.yearMax, nullToZero(item.inflAssctBfrWqltTn)); + operList.inflTN.yearMin = Math.min(operList.inflTN.yearMin, nullToZero(item.inflAssctBfrWqltTn)); + operList.inflTP.yearMax = Math.max(operList.inflTP.yearMax, nullToZero(item.inflAssctBfrWqltTp)); + operList.inflTP.yearMin = Math.min(operList.inflTP.yearMin, nullToZero(item.inflAssctBfrWqltTp)); + operList.efflBod.yearMax = Math.max(operList.efflBod.yearMax, nullToZero(item.efflWqltBod)); + operList.efflBod.yearMin = Math.min(operList.efflBod.yearMin, nullToZero(item.efflWqltBod)); + operList.efflTN.yearMax = Math.max(operList.efflTN.yearMax, nullToZero(item.efflWqltTn)); + operList.efflTN.yearMin = Math.min(operList.efflTN.yearMin, nullToZero(item.efflWqltTn)); + operList.efflTP.yearMax = Math.max(operList.efflTP.yearMax, nullToZero(item.efflWqltTp)); + operList.efflTP.yearMin = Math.min(operList.efflTP.yearMin, nullToZero(item.efflWqltTp)); + operList.tpInflTp.yearMax = Math.max(operList.tpInflTp.yearMax, nullToZero(item.tpInflWqltTp)); + operList.tpInflTp.yearMin = Math.min(operList.tpInflTp.yearMin, nullToZero(item.tpInflWqltTp)); + }); - orgData[5].winterAll = qltyDataSetting(totalInflBodAvgWinter, winterDay, 1); // 동절기 유입BOD - orgData[6].winterAll = qltyDataSetting(totalEfflBodAvgWinter, winterDay, 1); // 동절기 방류BOD - orgData[7].winterAll = qltyDataSetting(totalInflTnAvgWinter, winterDay, 3); // 동절기 유입TN - orgData[8].winterAll = qltyDataSetting(totalEfflTnAvgWinter, winterDay, 3); // 동절기 방류TN - orgData[9].winterAll = qltyDataSetting(totalInflTpAvgWinter, winterDay, 3); // 동절기 유입TP - orgData[10].winterAll = qltyDataSetting(totalEfflTpAvgWinter, winterDay, 3); // 동절기 방류TP + operList.inflBod.yearAvg = operList.inflBod.yearTot / totalDay; + operList.inflTN.yearAvg = operList.inflTN.yearTot / totalDay; + operList.inflTP.yearAvg = operList.inflTP.yearTot / totalDay; + operList.efflBod.yearAvg = operList.efflBod.yearTot / totalDay; + operList.efflTN.yearAvg = operList.efflTN.yearTot / totalDay; + operList.efflTP.yearAvg = operList.efflTP.yearTot / totalDay; + operList.tpInflTp.yearAvg = operList.tpInflTp.yearTot / totalDay; + orgData[5].yearAvg = qltyDataSetting(operList.inflBod.yearTot, totalDay, 1); // 연간 유입BOD + orgData[6].yearAvg = qltyDataSetting(operList.efflBod.yearTot,totalDay, 1); // 연간 방류BOD + orgData[7].yearAvg = qltyDataSetting(operList.inflTN.yearTot,totalDay, 3); // 연간 유입TN + orgData[8].yearAvg = qltyDataSetting(operList.efflTN.yearTot,totalDay, 3); // 연간 방류TN + orgData[9].yearAvg = qltyDataSetting(operList.inflTP.yearTot,totalDay, 3); // 연간 유입TP + orgData[10].yearAvg = qltyDataSetting(operList.efflTP.yearTot,totalDay, 3); // 연간 방류TP //총인설비 - orgData[11].winterAll = qltyDataSetting(totalTpInflAvgWinter, noNullWinterDay, 3); - orgData[12].winterAll = qltyDataSetting(totalEfflTpAvgWinter, winterDay, 3); + orgData[11].yearAvg = qltyDataSetting(operList.tpInflTp.yearTot, noNullYearDay, 3); // 연간 총인 유입수질 TP + orgData[12].yearAvg = qltyDataSetting(operList.efflTP.yearTot, totalDay, 3); // 연간 총인 유입수질 TP - orgData[5].summerAll = qltyDataSetting(totalInflBodAvgSummer, summerDay, 1); // 하절기 유입BOD - orgData[6].summerAll = qltyDataSetting(totalEfflBodAvgSummer, summerDay, 1); // 하절기 방류BOD - orgData[7].summerAll = qltyDataSetting(totalInflTnAvgSummer, summerDay, 3); // 하절기 유입TN - orgData[8].summerAll = qltyDataSetting(totalEfflTnAvgSummer, summerDay, 3); // 하절기 방류TN - orgData[9].summerAll = qltyDataSetting(totalInflTpAvgSummer, summerDay, 3); // 하절기 유입TP - orgData[10].summerAll = qltyDataSetting(totalEfflTpAvgSummer, summerDay, 3); // 하절기 방류TP + orgData[5].yearMax = roundUp(operList.inflBod.yearMax, 1); // 연간 유입BOD + orgData[6].yearMax = roundUp(operList.efflBod.yearMax, 1); // 연간 방류BOD + orgData[7].yearMax = roundUp(operList.inflTN.yearMax, 3).toFixed(3); // 연간 유입TN + orgData[8].yearMax = roundUp(operList.efflTN.yearMax, 3).toFixed(3); // 연간 방류TN + orgData[9].yearMax = roundUp(operList.inflTP.yearMax, 3).toFixed(3); // 연간 유입TP + orgData[10].yearMax = roundUp(operList.efflTP.yearMax, 3).toFixed(3); // 연간 방류TP + orgData[11].yearMax = roundUp(operList.tpInflTp.yearMax, 3).toFixed(3); // 연간 총인 유입수질 TP + orgData[12].yearMax = roundUp(operList.efflTP.yearMax, 3).toFixed(3); // 연간 총인 유입수질 TP + orgData[5].yearMin = roundUp(operList.inflBod.yearMin, 1); // 연간 유입BOD + orgData[6].yearMin = roundUp(operList.efflBod.yearMin, 1); // 연간 방류BOD + orgData[7].yearMin = roundUp(operList.inflTN.yearMin, 3).toFixed(3); // 연간 유입TN + orgData[8].yearMin = roundUp(operList.efflTN.yearMin, 3).toFixed(3); // 연간 방류TN + orgData[9].yearMin = roundUp(operList.inflTP.yearMin, 3).toFixed(3); // 연간 유입TP + orgData[10].yearMin = roundUp(operList.efflTP.yearMin, 3).toFixed(3); // 연간 방류TP + orgData[11].yearMin = roundUp(operList.tpInflTp.yearMin, 3).toFixed(3); // 연간 총인 유입수질 TP + orgData[12].yearMin = roundUp(operList.efflTP.yearMin, 3).toFixed(3); // 연간 총인 유입수질 TP + + orgData[5].summerAll = qltyDataSetting(totalInflBodAvgSummer, summerDay, 1); // 하절기 전기간 유입BOD + orgData[6].summerAll = qltyDataSetting(totalEfflBodAvgSummer, summerDay, 1); // 하절기 전기간 방류BOD + orgData[7].summerAll = qltyDataSetting(totalInflTnAvgSummer, summerDay, 3); // 하절기 전기간 유입TN + orgData[8].summerAll = qltyDataSetting(totalEfflTnAvgSummer, summerDay, 3); // 하절기 전기간 방류TN + orgData[9].summerAll = qltyDataSetting(totalInflTpAvgSummer, summerDay, 3); // 하절기 전기간 유입TP + orgData[10].summerAll = qltyDataSetting(totalEfflTpAvgSummer, summerDay, 3); // 하절기 전기간 방류TP //총인설비 orgData[11].summerAll = qltyDataSetting(totalTpInflAvgSummer, noNullSummerDay, 3); orgData[12].summerAll = qltyDataSetting(totalEfflTpAvgSummer, summerDay, 3); - - // 청천시 수질 데이터 수정 - // 하절기 - orgData[5].summerRain = qltyDataSetting(chungchunInflBodAvgSummer, chungchunSummerDay, 1); - orgData[6].summerRain = qltyDataSetting(chungchunEfflBodAvgSummer, chungchunSummerDay, 1); - orgData[7].summerRain = qltyDataSetting(chungchunInflTnAvgSummer, chungchunSummerDay, 3); - orgData[8].summerRain = qltyDataSetting(chungchunEfflTnAvgSummer, chungchunSummerDay, 3); - orgData[9].summerRain = qltyDataSetting(chungchunInflTpAvgSummer, chungchunSummerDay, 3); - orgData[10].summerRain = qltyDataSetting(chungchunEfflTpAvgSummer, chungchunSummerDay, 3); - - // 총인설비 - orgData[11].summerRain = qltyDataSetting(chungchunTpInflAvgSummer, noNullChungchunSummerDay, 3); - orgData[12].summerRain = qltyDataSetting(chungchunEfflTpAvgSummer, chungchunSummerDay, 3); - - // 동절기 - orgData[5].winterSunnyAvg = qltyDataSetting(chungchunInflBodAvg, chungchunWinterDay, 1); - orgData[6].winterSunnyAvg = qltyDataSetting(chungchunEfflBodAvg, chungchunWinterDay, 1); - orgData[7].winterSunnyAvg = qltyDataSetting(chungchunInflTnAvg, chungchunWinterDay, 3); - orgData[8].winterSunnyAvg = qltyDataSetting(chungchunEfflTnAvg, chungchunWinterDay, 3); - orgData[9].winterSunnyAvg = qltyDataSetting(chungchunInflTpAvg, chungchunWinterDay, 3); - orgData[10].winterSunnyAvg = qltyDataSetting(chungchunEfflTpAvg, chungchunWinterDay, 3); - - // 총인설비 - orgData[11].winterSunnyAvg = qltyDataSetting(chungchunTpInflAvg, noNullChungchunWinterDay, 3); - orgData[12].winterSunnyAvg = qltyDataSetting(chungchunInflTpAvg, chungchunWinterDay, 3); - - orgData[5].winterSunnyMax = roundUp(chungchunInflBodMax, 1).toFixed(1); - orgData[6].winterSunnyMax = roundUp(chungchunEfflBodMax, 1).toFixed(1); - orgData[7].winterSunnyMax = roundUp(chungchunInflTnMax, 3).toFixed(3); - orgData[8].winterSunnyMax = roundUp(chungchunEfflTnMax, 3).toFixed(3); - orgData[9].winterSunnyMax = roundUp(chungchunInflTpMax, 3).toFixed(3); - orgData[10].winterSunnyMax = roundUp(chungchunEfflTpMax, 3).toFixed(3); - orgData[11].winterSunnyMax = roundUp(chungchunTpInflMax, 3).toFixed(3); - orgData[12].winterSunnyMax = roundUp(chungchunInflTpMax, 3).toFixed(3); - - orgData[5].winterSunnyMin = chungchunInflBodMin === 99999999 ? '0.0' : roundUp(chungchunInflBodMin, 1).toFixed(1); - orgData[6].winterSunnyMin = chungchunEfflBodMin === 99999999 ? '0.0' : roundUp(chungchunEfflBodMin, 1).toFixed(1); - orgData[7].winterSunnyMin = chungchunInflTnMin === 99999999 ? '0.000' : roundUp(chungchunInflTnMin, 3).toFixed(3); - orgData[8].winterSunnyMin = chungchunEfflTnMin === 99999999 ? '0.000' : roundUp(chungchunEfflTnMin, 3).toFixed(3); - orgData[9].winterSunnyMin = chungchunInflTpMin === 99999999 ? '0.000' : roundUp(chungchunInflTpMin, 3).toFixed(3); - orgData[10].winterSunnyMin = chungchunEfflTpMin === 99999999 ? '0.000' : roundUp(chungchunEfflTpMin, 3).toFixed(3); - orgData[11].winterSunnyMin = chungchunTpInflMin === 99999999 ? '0.000' : roundUp(chungchunTpInflMin, 3).toFixed(3); - orgData[12].winterSunnyMin = chungchunInflTpMin === 99999999 ? '0.000' : roundUp(chungchunInflTpMin, 3).toFixed(3); - // 강우시 수질 데이터 수정 orgData[5].summerThree = qltyDataSetting(rainInflBodAvg, rainSummerDay, 1); orgData[6].summerThree = qltyDataSetting(rainEfflBodAvg, rainSummerDay, 1); @@ -985,12 +1006,61 @@ const calcWaterQltyData = async (data: any[], searchYear: string | undefined, fc orgData[8].summerThree = qltyDataSetting(rainEfflTnAvg, rainSummerDay, 3); orgData[9].summerThree = qltyDataSetting(rainInflTpAvg, rainSummerDay, 3); orgData[10].summerThree = qltyDataSetting(rainEfflTpAvg, rainSummerDay, 3); - // 총인설비 orgData[11].summerThree = qltyDataSetting(rainTpInflAvg, noNullRainSummerDay, 3); - orgData[12].summerThree = qltyDataSetting(rainInflTpAvg, rainSummerDay, 3); - // console.log(rainEffectDayArray); - // console.log("000000000", rainSummerDay, noNullRainSummerDay, rainInflBodAvg, rainInflTnAvg, rainInflTpAvg, rainEfflBodAvg, rainEfflTnAvg, rainEfflTpAvg, rainTpInflAvg); + orgData[12].summerThree = qltyDataSetting(rainEfflTpAvg, rainSummerDay, 3); + + // 하절기 청천시 수질 데이터 + orgData[5].summerRain = qltyDataSetting(chungchunInflBodAvgSummer, chungchunSummerDay, 1); + orgData[6].summerRain = qltyDataSetting(chungchunEfflBodAvgSummer, chungchunSummerDay, 1); + orgData[7].summerRain = qltyDataSetting(chungchunInflTnAvgSummer, chungchunSummerDay, 3); + orgData[8].summerRain = qltyDataSetting(chungchunEfflTnAvgSummer, chungchunSummerDay, 3); + orgData[9].summerRain = qltyDataSetting(chungchunInflTpAvgSummer, chungchunSummerDay, 3); + orgData[10].summerRain = qltyDataSetting(chungchunEfflTpAvgSummer, chungchunSummerDay, 3); + // 총인설비 + orgData[11].summerRain = qltyDataSetting(chungchunTpInflAvgSummer, noNullChungchunSummerDay, 3); + orgData[12].summerRain = qltyDataSetting(chungchunEfflTpAvgSummer, chungchunSummerDay, 3); + + orgData[5].winterAll = qltyDataSetting(totalInflBodAvgWinter, winterDay, 1); // 동절기 전기간 유입BOD + orgData[6].winterAll = qltyDataSetting(totalEfflBodAvgWinter, winterDay, 1); // 동절기 전기간 방류BOD + orgData[7].winterAll = qltyDataSetting(totalInflTnAvgWinter, winterDay, 3); // 동절기 전기간 유입TN + orgData[8].winterAll = qltyDataSetting(totalEfflTnAvgWinter, winterDay, 3); // 동절기 전기간 방류TN + orgData[9].winterAll = qltyDataSetting(totalInflTpAvgWinter, winterDay, 3); // 동절기 전기간 유입TP + orgData[10].winterAll = qltyDataSetting(totalEfflTpAvgWinter, winterDay, 3); // 동절기 전기간 방류TP + //총인설비 + orgData[11].winterAll = qltyDataSetting(totalTpInflAvgWinter, noNullWinterDay, 3); + orgData[12].winterAll = qltyDataSetting(totalEfflTpAvgWinter, winterDay, 3); + + // 동절기 청천시 수질 데이터 + orgData[5].winterSunnyAvg = qltyDataSetting(chungchunInflBodAvg, chungchunWinterDay, 1); + orgData[6].winterSunnyAvg = qltyDataSetting(chungchunEfflBodAvg, chungchunWinterDay, 1); + orgData[7].winterSunnyAvg = qltyDataSetting(chungchunInflTnAvg, chungchunWinterDay, 3); + orgData[8].winterSunnyAvg = qltyDataSetting(chungchunEfflTnAvg, chungchunWinterDay, 3); + orgData[9].winterSunnyAvg = qltyDataSetting(chungchunInflTpAvg, chungchunWinterDay, 3); + orgData[10].winterSunnyAvg = qltyDataSetting(chungchunEfflTpAvg, chungchunWinterDay, 3); + // 총인설비 + orgData[11].winterSunnyAvg = qltyDataSetting(chungchunTpInflAvg, noNullChungchunWinterDay, 3); + orgData[12].winterSunnyAvg = qltyDataSetting(chungchunEfflTpAvg, chungchunWinterDay, 3); + + orgData[5].winterSunnyMax = roundUp(chungchunInflBodMax, 1).toFixed(1); + orgData[6].winterSunnyMax = roundUp(chungchunEfflBodMax, 1).toFixed(1); + orgData[7].winterSunnyMax = roundUp(chungchunInflTnMax, 3).toFixed(3); + orgData[8].winterSunnyMax = roundUp(chungchunEfflTnMax, 3).toFixed(3); + orgData[9].winterSunnyMax = roundUp(chungchunInflTpMax, 3).toFixed(3); + orgData[10].winterSunnyMax = roundUp(chungchunEfflTpMax, 3).toFixed(3); + orgData[11].winterSunnyMax = roundUp(chungchunTpInflMax, 3).toFixed(3); + orgData[12].winterSunnyMax = roundUp(chungchunEfflTpMax, 3).toFixed(3); + + orgData[5].winterSunnyMin = chungchunInflBodMin === 99999999 ? '0.0' : roundUp(chungchunInflBodMin, 1).toFixed(1); + orgData[6].winterSunnyMin = chungchunEfflBodMin === 99999999 ? '0.0' : roundUp(chungchunEfflBodMin, 1).toFixed(1); + orgData[7].winterSunnyMin = chungchunInflTnMin === 99999999 ? '0.000' : roundUp(chungchunInflTnMin, 3).toFixed(3); + orgData[8].winterSunnyMin = chungchunEfflTnMin === 99999999 ? '0.000' : roundUp(chungchunEfflTnMin, 3).toFixed(3); + orgData[9].winterSunnyMin = chungchunInflTpMin === 99999999 ? '0.000' : roundUp(chungchunInflTpMin, 3).toFixed(3); + orgData[10].winterSunnyMin = chungchunEfflTpMin === 99999999 ? '0.000' : roundUp(chungchunEfflTpMin, 3).toFixed(3); + orgData[11].winterSunnyMin = chungchunTpInflMin === 99999999 ? '0.000' : roundUp(chungchunTpInflMin, 3).toFixed(3); + orgData[12].winterSunnyMin = chungchunEfflTpMin === 99999999 ? '0.000' : roundUp(chungchunEfflTpMin, 3).toFixed(3); + + return orgData; } else { @@ -1064,6 +1134,9 @@ export type DashBoardType = { rainManageList: RainManageListProps[]; excelList: RainManageExcelType[]; isLoadingRainManage: boolean; + mainGraphData: any; + mainGraphYear: string; + mainGraphFcltyCd: string; }, DrainageEquipment: { @@ -1127,6 +1200,9 @@ export const dashBoardInitState: DashBoardType = { rainManageList: rainManageList, excelList: [], isLoadingRainManage: false, + mainGraphData: null, + mainGraphYear: '', + mainGraphFcltyCd: '', }, DrainageEquipment: { @@ -1185,46 +1261,47 @@ export const dataFormSettingWqlty = (item: OperationalStatusListProps) => { DataForm({ type: 'float1', column: 'rdi', item: item as unknown as Record }); }; -const changeValue = (operationalStatus, data, keyTxt = 'INFL_AMNT') => { - operationalStatus.yearAvg = data.yearData ? (keyTxt.includes('_TP') || keyTxt.includes("_TN")) ? data.yearData ? Number(Math.round(data.yearData['AVG_' + keyTxt] * 1000) / 1000).toFixed(3).toString() : '' : data.yearData['AVG_' + keyTxt] : ''; - operationalStatus.yearMax = data.yearData ? (keyTxt.includes('_TP') || keyTxt.includes("_TN")) ? data.yearData ? Number(Math.round(data.yearData['MAX_' + keyTxt] * 1000) / 1000).toFixed(3).toString() : '' : data.yearData['MAX_' + keyTxt] : ''; - operationalStatus.yearMin = data.yearData ? (keyTxt.includes('_TP') || keyTxt.includes("_TN")) ? data.yearData ? Number(Math.round(data.yearData['MIN_' + keyTxt] * 1000) / 1000).toFixed(3).toString() : '' : data.yearData['MIN_' + keyTxt] : ''; - // 여름 - operationalStatus.summerAll = data.summer ? (keyTxt.includes('_TP') || keyTxt.includes("_TN")) ? data.summer ? Number(Math.round(data.summer['AVG_' + keyTxt] * 1000) / 1000).toFixed(3).toString() : '' : data.summer['AVG_' + keyTxt] : ''; - operationalStatus.summerThree = data.summerRainy ? (keyTxt.includes('_TP') || keyTxt.includes("_TN")) ? data.summerRainy ? Number(Math.round(data.summerRainy["AVG_" + keyTxt] * 1000) / 1000).toFixed(3).toString() : '' : data.summerRainy["AVG_" + keyTxt] : ''; - operationalStatus.summerRain = data.summerSunny ? (keyTxt.includes('_TP') || keyTxt.includes("_TN")) ? data.summerSunny ? Number(Math.round(data.summerSunny["AVG_" + keyTxt] * 1000) / 1000).toFixed(3).toString() : '' : data.summerSunny["AVG_" + keyTxt] : ''; - // 겨울 - operationalStatus.winterAll = data.winter ? (keyTxt.includes('_TP') || keyTxt.includes("_TN")) ? data.winter ? Number(Math.round(data.winter["AVG_" + keyTxt] * 1000) / 1000).toFixed(3).toString() : '' : data.winter["AVG_" + keyTxt] : ''; - operationalStatus.winterSunnyMin = data.winterSunny ? (keyTxt.includes('_TP') || keyTxt.includes("_TN")) ? data.winterSunny ? Number(Math.round(data.winterSunny["MIN_" + keyTxt] * 1000) / 1000).toFixed(3).toString() : '' : data.winterSunny["MIN_" + keyTxt] : ''; - operationalStatus.winterSunnyAvg = data.winterSunny ? (keyTxt.includes('_TP') || keyTxt.includes("_TN")) ? data.winterSunny ? Number(Math.round(data.winterSunny["AVG_" + keyTxt] * 1000) / 1000).toFixed(3).toString() : '' : data.winterSunny["AVG_" + keyTxt] : ''; - operationalStatus.winterSunnyMax = data.winterSunny ? (keyTxt.includes('_TP') || keyTxt.includes("_TN")) ? data.winterSunny ? Number(Math.round(data.winterSunny["MAX_" + keyTxt] * 1000) / 1000).toFixed(3).toString() : '' : data.winterSunny["MAX_" + keyTxt] : ''; - // 지하수 +// const changeValue = (operationalStatus, data, keyTxt = 'INFL_AMNT') => { +// //console.log('data.yearData', data.yearData); +// operationalStatus.yearAvg = data.yearData ? (keyTxt.includes('_TP') || keyTxt.includes("_TN")) ? data.yearData ? Number(Math.round(data.yearData['AVG_' + keyTxt] * 1000) / 1000).toFixed(3).toString() : '' : data.yearData['AVG_' + keyTxt] : ''; +// operationalStatus.yearMax = data.yearData ? (keyTxt.includes('_TP') || keyTxt.includes("_TN")) ? data.yearData ? Number(Math.round(data.yearData['MAX_' + keyTxt] * 1000) / 1000).toFixed(3).toString() : '' : data.yearData['MAX_' + keyTxt] : ''; +// operationalStatus.yearMin = data.yearData ? (keyTxt.includes('_TP') || keyTxt.includes("_TN")) ? data.yearData ? Number(Math.round(data.yearData['MIN_' + keyTxt] * 1000) / 1000).toFixed(3).toString() : '' : data.yearData['MIN_' + keyTxt] : ''; +// // 여름 +// operationalStatus.summerAll = data.summer ? (keyTxt.includes('_TP') || keyTxt.includes("_TN")) ? data.summer ? Number(Math.round(data.summer['AVG_' + keyTxt] * 1000) / 1000).toFixed(3).toString() : '' : data.summer['AVG_' + keyTxt] : ''; +// operationalStatus.summerThree = data.summerRainy ? (keyTxt.includes('_TP') || keyTxt.includes("_TN")) ? data.summerRainy ? Number(Math.round(data.summerRainy["AVG_" + keyTxt] * 1000) / 1000).toFixed(3).toString() : '' : data.summerRainy["AVG_" + keyTxt] : ''; +// operationalStatus.summerRain = data.summerSunny ? (keyTxt.includes('_TP') || keyTxt.includes("_TN")) ? data.summerSunny ? Number(Math.round(data.summerSunny["AVG_" + keyTxt] * 1000) / 1000).toFixed(3).toString() : '' : data.summerSunny["AVG_" + keyTxt] : ''; +// // 겨울 +// operationalStatus.winterAll = data.winter ? (keyTxt.includes('_TP') || keyTxt.includes("_TN")) ? data.winter ? Number(Math.round(data.winter["AVG_" + keyTxt] * 1000) / 1000).toFixed(3).toString() : '' : data.winter["AVG_" + keyTxt] : ''; +// operationalStatus.winterSunnyMin = data.winterSunny ? (keyTxt.includes('_TP') || keyTxt.includes("_TN")) ? data.winterSunny ? Number(Math.round(data.winterSunny["MIN_" + keyTxt] * 1000) / 1000).toFixed(3).toString() : '' : data.winterSunny["MIN_" + keyTxt] : ''; +// operationalStatus.winterSunnyAvg = data.winterSunny ? (keyTxt.includes('_TP') || keyTxt.includes("_TN")) ? data.winterSunny ? Number(Math.round(data.winterSunny["AVG_" + keyTxt] * 1000) / 1000).toFixed(3).toString() : '' : data.winterSunny["AVG_" + keyTxt] : ''; +// operationalStatus.winterSunnyMax = data.winterSunny ? (keyTxt.includes('_TP') || keyTxt.includes("_TN")) ? data.winterSunny ? Number(Math.round(data.winterSunny["MAX_" + keyTxt] * 1000) / 1000).toFixed(3).toString() : '' : data.winterSunny["MAX_" + keyTxt] : ''; +// // 지하수 - // 오염물질 - // RDII 추정 = 하절기(6~8월) 중 최저 유입 BOD일때 유입유량 x ((동절기 청천시 유입BOD - 하절기(6~8월) 중 최저 유입BOD) / (동절기 청천시 유입BOD)) - const summerLowFlow = data.summerBod && data.summerBod.INFL_AMNT && data.summerBod.INFL_AMNT != 'null' ? Number(data.summerBod.INFL_AMNT) : 0; - const winterAvgBod = data.winterSunny && data.winterSunny.AVG_INFL_ASSCT_BFR_WQLT_BOD && data.winterSunny.AVG_INFL_ASSCT_BFR_WQLT_BOD != 'null' ? Number(data.winterSunny.AVG_INFL_ASSCT_BFR_WQLT_BOD) : 0; - const summerLowBod = data.summerBod && data.summerBod.MIN_INFL_ASSCT_BFR_WQLT_BOD && data.summerBod.MIN_INFL_ASSCT_BFR_WQLT_BOD != 'null' ? Number(data.summerBod.MIN_INFL_ASSCT_BFR_WQLT_BOD) : 0; - const summerLowRain = data.summerBod && data.summerBod.INFO_RN_DAY && data.summerBod.INFO_RN_DAY != 'null' ? Number(data.summerBod.INFO_RN_DAY) : 0; - operationalStatus.rdi = winterAvgBod === 0 ? 0 : roundUp(summerLowFlow * ((winterAvgBod - summerLowBod) / winterAvgBod), 1); - operationalStatus.rdiRain = summerLowRain; -} +// // 오염물질 +// // RDII 추정 = 하절기(6~8월) 중 최저 유입 BOD일때 유입유량 x ((동절기 청천시 유입BOD - 하절기(6~8월) 중 최저 유입BOD) / (동절기 청천시 유입BOD)) +// const summerLowFlow = data.summerBod && data.summerBod.INFL_AMNT && data.summerBod.INFL_AMNT != 'null' ? Number(data.summerBod.INFL_AMNT) : 0; +// const winterAvgBod = data.winterSunny && data.winterSunny.AVG_INFL_ASSCT_BFR_WQLT_BOD && data.winterSunny.AVG_INFL_ASSCT_BFR_WQLT_BOD != 'null' ? Number(data.winterSunny.AVG_INFL_ASSCT_BFR_WQLT_BOD) : 0; +// const summerLowBod = data.summerBod && data.summerBod.MIN_INFL_ASSCT_BFR_WQLT_BOD && data.summerBod.MIN_INFL_ASSCT_BFR_WQLT_BOD != 'null' ? Number(data.summerBod.MIN_INFL_ASSCT_BFR_WQLT_BOD) : 0; +// const summerLowRain = data.summerBod && data.summerBod.INFO_RN_DAY && data.summerBod.INFO_RN_DAY != 'null' ? Number(data.summerBod.INFO_RN_DAY) : 0; +// operationalStatus.rdi = winterAvgBod === 0 ? 0 : roundUp(summerLowFlow * ((winterAvgBod - summerLowBod) / winterAvgBod), 1); +// operationalStatus.rdiRain = summerLowRain; +// } -const calcValue = (operationalStatus, data, keyTxt = 'INFL_ASSCT_BFR_WQLT_TP') => { - // 연간 - operationalStatus.yearAvg = data.yearData && data.yearData['AVG_' + keyTxt] ? Number(Math.round(data.yearData['AVG_' + keyTxt] * 1000) / 1000).toFixed(3).toString() : ''; - operationalStatus.yearMax = data.yearData && data.yearData['MAX_' + keyTxt] ? Number(Math.round(data.yearData['MAX_' + keyTxt] * 1000) / 1000).toFixed(3).toString() : ''; - operationalStatus.yearMin = data.yearData && data.yearData['MIN_' + keyTxt] ? Number(Math.round(data.yearData['MIN_' + keyTxt] * 1000) / 1000).toFixed(3).toString() : ''; - // 여름 - operationalStatus.summerAll = data.summer && data.summer['AVG_' + keyTxt] ? Number(Math.round(data.summer['AVG_' + keyTxt] * 0.8 * 1000) / 1000).toFixed(3).toString() : ''; - operationalStatus.summerThree = data.summerRainy && data.summerRainy['AVG_' + keyTxt] ? Number(Math.round(data.summerRainy['AVG_' + keyTxt] * 0.82 * 1000) / 1000).toFixed(3).toString() : ''; - operationalStatus.summerRain = data.summerSunny && data.summerSunny['AVG_' + keyTxt] ? Number(Math.round(data.summerSunny['AVG_' + keyTxt] * 0.74 * 1000) / 1000).toFixed(3).toString() : ''; - // 겨울 - operationalStatus.winterAll = data.winter && data.winter['AVG_' + keyTxt] ? Number(Math.round(data.winter['AVG_' + keyTxt] * 1.16 * 1000) / 1000).toFixed(3).toString() : ''; - operationalStatus.winterSunnyMin = data.winterSunny && data.winterSunny['MIN_' + keyTxt] ? Number(Math.round(data.winterSunny['MIN_' + keyTxt] * 1.2 * 1000) / 1000).toFixed(3).toString() : ''; - operationalStatus.winterSunnyAvg = data.winterSunny && data.winterSunny['AVG_' + keyTxt] ? Number(Math.round(data.winterSunny['AVG_' + keyTxt] * 1.25 * 1000) / 1000).toFixed(3).toString() : ''; - operationalStatus.winterSunnyMax = data.winterSunny && data.winterSunny['MAX_' + keyTxt] ? Number(Math.round(data.winterSunny['MAX_' + keyTxt] * 1.3 * 1000) / 1000).toFixed(3).toString() : ''; -} +// const calcValue = (operationalStatus, data, keyTxt = 'INFL_ASSCT_BFR_WQLT_TP') => { +// // 연간 +// operationalStatus.yearAvg = data.yearData && data.yearData['AVG_' + keyTxt] ? Number(Math.round(data.yearData['AVG_' + keyTxt] * 1000) / 1000).toFixed(3).toString() : ''; +// operationalStatus.yearMax = data.yearData && data.yearData['MAX_' + keyTxt] ? Number(Math.round(data.yearData['MAX_' + keyTxt] * 1000) / 1000).toFixed(3).toString() : ''; +// operationalStatus.yearMin = data.yearData && data.yearData['MIN_' + keyTxt] ? Number(Math.round(data.yearData['MIN_' + keyTxt] * 1000) / 1000).toFixed(3).toString() : ''; +// // 여름 +// operationalStatus.summerAll = data.summer && data.summer['AVG_' + keyTxt] ? Number(Math.round(data.summer['AVG_' + keyTxt] * 0.8 * 1000) / 1000).toFixed(3).toString() : ''; +// operationalStatus.summerThree = data.summerRainy && data.summerRainy['AVG_' + keyTxt] ? Number(Math.round(data.summerRainy['AVG_' + keyTxt] * 0.82 * 1000) / 1000).toFixed(3).toString() : ''; +// operationalStatus.summerRain = data.summerSunny && data.summerSunny['AVG_' + keyTxt] ? Number(Math.round(data.summerSunny['AVG_' + keyTxt] * 0.74 * 1000) / 1000).toFixed(3).toString() : ''; +// // 겨울 +// operationalStatus.winterAll = data.winter && data.winter['AVG_' + keyTxt] ? Number(Math.round(data.winter['AVG_' + keyTxt] * 1.16 * 1000) / 1000).toFixed(3).toString() : ''; +// operationalStatus.winterSunnyMin = data.winterSunny && data.winterSunny['MIN_' + keyTxt] ? Number(Math.round(data.winterSunny['MIN_' + keyTxt] * 1.2 * 1000) / 1000).toFixed(3).toString() : ''; +// operationalStatus.winterSunnyAvg = data.winterSunny && data.winterSunny['AVG_' + keyTxt] ? Number(Math.round(data.winterSunny['AVG_' + keyTxt] * 1.25 * 1000) / 1000).toFixed(3).toString() : ''; +// operationalStatus.winterSunnyMax = data.winterSunny && data.winterSunny['MAX_' + keyTxt] ? Number(Math.round(data.winterSunny['MAX_' + keyTxt] * 1.3 * 1000) / 1000).toFixed(3).toString() : ''; +// } type wtrUsgYearsType = { YEAR: string; @@ -1251,7 +1328,8 @@ const searchWaterUsage = async (searchYear: string, fcltyCd: string) => { } export const dashBoardReducer = ( - set: (fn: (state: DashBoardType) => DashBoardType) => void + set: (fn: (state: DashBoardType) => DashBoardType) => void, + get: () => DashBoardType ): DashBoardActions => { return { initializeDashBoardData: async () => { @@ -1275,7 +1353,7 @@ export const dashBoardReducer = ( })); let waterUsage = [0, 0, 0]; waterUsage = await searchWaterUsage(targetYear, fcltyCd); // /fclt/flow/{fcltyCd}/{year} -console.log(waterUsage); + set((state: DashBoardType) => ({ ...state, PlanFclty: { @@ -1355,6 +1433,26 @@ console.log(waterUsage); /** 시설정보 및 운영현황 - 운영실태 */ searchOperationStatus: async (isExcel: boolean, searchYear: string, fcltyCd: string) => { + const state = get(); + let mainGraphData: ApiRes = { data: [], count: 0 }; + + // 이미 조회된 데이터가 있는지 확인 (연도와 시설코드가 같을 때만) + if (state.RainManage.mainGraphYear === searchYear && state.RainManage.mainGraphFcltyCd === fcltyCd && state.RainManage.mainGraphData) { + mainGraphData = state.RainManage.mainGraphData; + } else { + mainGraphData = await fetchMainGraph(searchYear, fcltyCd); + // 조회된 데이터 저장 + set((state: DashBoardType) => ({ + ...state, + RainManage: { + ...state.RainManage, + mainGraphData: mainGraphData, + mainGraphYear: searchYear, + mainGraphFcltyCd: fcltyCd, + } + })); + } + set((state: DashBoardType) => ({ ...state, OperationStatus: { @@ -1362,129 +1460,63 @@ console.log(waterUsage); isLoadingOperationStatus: true, }, })); - const res = await fetchOperationStatus(searchYear, fcltyCd); // /dashBoard/mngInfo/ - const data = res.data; - - let yearMaxSumFlow = 1, yearMinSumFlow = 1, yearAvgSumFlow = 1; // 연간 최대, 최소, 평균 - let summerAll = 1; // 하절기 전기간 - let summerThree = 1; // 하절기 - let summerRain = 1; // 하절기 - let winterAll = 1; // 동절기 전기간 - let winterSunnyMin = 1, winterSunnyAvg = 1, winterSunnyMax = 1; // 동절기 청천 최소, 평균, 최대 - - // 최대, 최소 총 유입량 (1년 하루 합계의 최대, 최소) - // 하절기 청천시, 강우시 재계산 리턴값 - let summerChungchunFlow = 1, summerChungchunReturnAmnt = 1, summerChungchunEfflAmnt = 1; // 하절기 청천 - let summerRainInflAmnt = 1, summerRainReturnAmnt = 1, summerRainEfflAmnt = 1; // 하절기 강우시 - // 동절기 청천시 최대, 최소, 평균 리턴값 - let winterChungchunFlowAvg = 1, winterChungchunFlowMax = 1, winterChungchunFlowMin = 1; // 동절기 청천 하수유입량 평균, 최대, 최소 - let winterChungchunReturnAvg = 1, winterChungchunReturnMax = 1, winterChungchunReturnMin = 1; // 동절기 청천 총인반류수 평균, 최대, 최소 - let winterChungchunEfflAvg = 1, winterChungchunEfflMax = 1, winterChungchunEfflMin = 1; // 동절기 청천 방류량 평균, 최대, 최소 + // const res = await fetchOperationStatus(searchYear, fcltyCd); // /dashBoard/mngInfo/ + // const data = res.data; + const operList = { + inFlow : {yearTot: 0, yearAvg: 0, yearMax: 0, yearMin: 9999999 + , summerTot: 0, summerAvg: 0, summerRainy: 0, summerSunny: 0 + , winterTot: 0, winterAvg: 0, winterSunny: 0, winterSunnyMax: 0, winterSunnyMin: 9999999 + , groundTot: 0, groundSummer: 0, groundWinter: 0, rdii: 0, rdiiRainAmt: 0}, + inflAmt: {yearTot: 0, yearAvg: 0, yearMax: 0, yearMin: 9999999, yearSunny: 0 + , summerTot: 0, summerAvg: 0, summerRainy: 0, summerSunny: 0 + , winterTot: 0, winterAvg: 0, winterSunny: 0, winterSunnyMax: 0, winterSunnyMin: 9999999 + , groundTot: 0, groundSummer: 0, groundWinter: 0, rdii: 0, rdiiRainAmt: 0}, + sumFlow: {yearTot: 0, yearAvg: 0, yearMax: 0, yearMin: 9999999 + , summerTot: 0, summerAvg: 0, summerRainy: 0, summerSunny: 0 + , winterTot: 0, winterAvg: 0, winterSunny: 0, winterSunnyMax: 0, winterSunnyMin: 9999999 + , groundTot: 0, groundSummer: 0, groundWinter: 0, rdii: 0, rdiiRainAmt: 0}, + returnFlow: {yearTot: 0, yearAvg: 0, yearMax: 0, yearMin: 9999999 + , summerTot: 0, summerAvg: 0, summerRainy: 0, summerSunny: 0 + , winterTot: 0, winterAvg: 0, winterSunny: 0, winterSunnyMax: 0, winterSunnyMin: 9999999 + , groundTot: 0, groundSummer: 0, groundWinter: 0, rdii: 0, rdiiRainAmt: 0}, + efflFlow: {yearTot: 0, yearAvg: 0, yearMax: 0, yearMin: 9999999 + , summerTot: 0, summerAvg: 0, summerRainy: 0, summerSunny: 0 + , winterTot: 0, winterAvg: 0, winterSunny: 0, winterSunnyMax: 0, winterSunnyMin: 9999999 + , groundTot: 0, groundSummer: 0, groundWinter: 0, rdii: 0, rdiiRainAmt: 0}, + }; const clone = (arr: any[]) => arr?.map(v => ({ ...v })) ?? []; let rdiPercent = 0; let operationalStatusList = clone(operationalStatusListOrg); - if (data && operationalStatusList) { + if (operationalStatusList) { // 유량 - 유입 if (operationalStatusList?.[0]) { - // 연간 - const yearAvg = data.yearData === null ? '' : ( - (data.yearData.AVG_INFL_AMNT ? data.yearData.AVG_INFL_AMNT : 0) + // 실제유입량(반류수제거)(m³/일) 평균 - (data.yearData.AVG_SUM_FLOW ? data.yearData.AVG_SUM_FLOW : 0) + // api 주석처리되어 있음. - (data.yearData.AVG_RETURN_AMNT ? data.yearData.AVG_RETURN_AMNT : 0) // 반류수유량(m³/일) 평균 - ); - const yearMax = data.yearData === null ? '' : ( - (data.yearData.MAX_INFL_AMNT ? data.yearData.MAX_INFL_AMNT : 0) + // 실제유입량(반류수제거)(m³/일) 최대 - (data.yearData.MAX_SUM_FLOW ? data.yearData.MAX_SUM_FLOW : 0) + // api 주석처리되어 있음. - (data.yearData.MAX_RETURN_AMNT ? data.yearData.MAX_RETURN_AMNT : 0) // 반류수유량(m³/일) 최대 - ); - const yearMin = data.yearData === null ? '' : ( - (data.yearData.MIN_INFL_AMNT ? data.yearData.MIN_INFL_AMNT : 0) + // 실제유입량(반류수제거)(m³/일) 최소 - (data.yearData.MIN_SUM_FLOW ? data.yearData.MIN_SUM_FLOW : 0) + // api 주석처리되어 있음. - (data.yearData.MIN_RETURN_AMNT ? data.yearData.MIN_RETURN_AMNT : 0) // 반류수유량(m³/일) 최소 - ); - operationalStatusList[0].yearAvg = yearAvg; // 연간유입평균 - operationalStatusList[0].yearMax = yearMax; // 연간유입최대 - operationalStatusList[0].yearMin = yearMin; // 연간유입최소 - // 하절기 - operationalStatusList[0].summerAll = data.summer === null ? '' : ( // 하절기전기간 - (data.summer.AVG_INFL_AMNT ? data.summer.AVG_INFL_AMNT : 0) + - (data.summer.AVG_SUM_FLOW ? data.summer.AVG_SUM_FLOW : 0) - ); - operationalStatusList[0].summerThree = data.summerRainy === null ? '' : ( // 하절기 강우시 - (data.summerRainy.AVG_INFL_AMNT ? data.summerRainy.AVG_INFL_AMNT : 0) + - (data.summerRainy.AVG_SUM_FLOW ? data.summerRainy.AVG_SUM_FLOW : 0) - ); - operationalStatusList[0].summerRain = data.summerSunny === null ? '' : ( // 하절기 청천시 - (data.summerSunny.AVG_INFL_AMNT ? data.summerSunny.AVG_INFL_AMNT : 0) + - (data.summerSunny.AVG_SUM_FLOW ? data.summerSunny.AVG_SUM_FLOW : 0) - ); - // 동절기 - operationalStatusList[0].winterAll = data.winter === null ? '' : ( // 동절기 전기간 - (data.winter.AVG_INFL_AMNT ? data.winter.AVG_INFL_AMNT : 0) + - (data.winter.AVG_SUM_FLOW ? data.winter.AVG_SUM_FLOW : 0) + - (data.winter.AVG_TP_INFL_WQLT_TP ? data.winter.AVG_TP_INFL_WQLT_TP : 0) - ); - operationalStatusList[0].winterSunnyMin = data.winterSunny === null ? '' : (// 동절기 청천 최소 - (data.winterSunny.MIN_INFL_AMNT ? data.winterSunny.MIN_INFL_AMNT : 0) + - (data.winterSunny.MIN_SUM_FLOW ? data.winterSunny.MIN_SUM_FLOW : 0) + - (data.winterSunny.MIN_TP_INFL_WQLT_TP ? data.winterSunny.MIN_TP_INFL_WQLT_TP : 0) - ); - operationalStatusList[0].winterSunnyAvg = data.winterSunny === null ? '' : (// 동절기 청천 평균 - (data.winterSunny.AVG_INFL_AMNT ? data.winterSunny.AVG_INFL_AMNT : 0) + - (data.winterSunny.AVG_SUM_FLOW ? data.winterSunny.AVG_SUM_FLOW : 0) + - (data.winterSunny.AVG_TP_INFL_WQLT_TP ? data.winterSunny.AVG_TP_INFL_WQLT_TP : 0) - ); - operationalStatusList[0].winterSunnyMax = data.winterSunny === null ? '' : (// 동절기 청천 최대 - (data.winterSunny.MAX_INFL_AMNT ? data.winterSunny.MAX_INFL_AMNT : 0) + - (data.winterSunny.MAX_SUM_FLOW ? data.winterSunny.MAX_SUM_FLOW : 0) + - (data.winterSunny.MAX_TP_INFL_WQLT_TP ? data.winterSunny.MAX_TP_INFL_WQLT_TP : 0) - ); - + // 연계처리수 let yearDay = 0, summerDay = 0, winterDay = 0; // 연간 일수, 하절기 일수, 동절기 일수 let summerRainDay = 0, summerChungchunDay = 0, winterChungchuDay = 0; // 하절기 강우 일수, 하절기 청천 일수, 동절기 청천 일수 - let totFlowMax = 0, totFlowMin = 9999999; - let yearSumFlow = 0, maxYearSumFlow = 0, minYearSumFlow = 9999999; - let summerSumFlow = 0, summerChungchunSumFlow = 0, summerRainDaySumFlow = 0; // 하절기 유입량 합, 하절기 청천 유입량 합, 하절기 강우 유입량 합 - let summerRainDayFlow = 0, summerRainDayReturnFlow = 0, summerRainDayEfflFlow = 0; // 하절기 강우 유입량, 하절기 강우 반류량, 하절기 강우 방류량 - let winterSumFlow = 0; // 동절기 유입량 합 - let winterChungchunSumFlow = 0; // 동절기 청천 유입량 합 - let maxWinterChungchunSumFlow = 0, minWinterChungchunSumFlow = 9999999; - + // 연계처리수,지하수유입량 const bscFctCd = fcltyCd; - const res2 = await fetchFlowRateModalList(bscFctCd, searchYear); // /fclt/flow/ + const res2 = await fetchFlowRateModalList(bscFctCd, searchYear); // /fclt/flow/ - 일별 유량 조회 //const calData = CalcRainEffect(clone(res2.data), 'SUNNY'); //const calRainData = CalcRainEffect(clone(res2.data), 'RAIN'); let cntSunnyDay = 0; // 청천일 수 - // 지하수유입량 - 청천시 기준 - let chungcunSumFlow = 0; - let sumSummerChungcunFlow = 0; - let sumWinterChungcunFlow = 0; - let summerChungchunDayReturnAmnt = 0; // 하절기 청천시 총인설비 반류수 - let summerChungchunDayEfflAmnt = 0; // 하절기 청천시 총인설비 방류수 - - let winterChungchunTotalInflAmntMax = 0, winterChungchunTotalInflAmntMin = 9999999; // 동절기 총 유입량 최대, 최소 - let winterChungchunDayFlowMax = 0, winterChungchunDayFlowMin = 9999999; // 동절기 청천시 하수유입량 최대, 최소 - let winterChungchunDayReturnMax = 0, winterChungchunDayReturnMin = 9999999; // 동절기 청천시 총인반류수 최대, 최소, 평균 - let winterChungchunDayReturnAvg = 0; - // 동절기 청천시 방류량 최대, 최소, 평균 - let winterChungchunDayEfflMax = 0, winterChungchunDayEfflMin = 9999999, winterChungchunDayEfflAvg = 0; - + // let chungcunSumFlow = 0; // 연간 청천 순수하수 + let rainEffectDay = 0; yearDay = res2.data ? res2.data.length : 1; - res2.data.forEach((item: any) => { + res2.data.forEach((item: any) => { // --일별 유량 start const month = item.msrDt.substring(4, 6); // 월 추출 const sumFlow = item.sumFlow && item.sumFlow !== 'x' ? Number(item.sumFlow.toString().trim()) : 0; const inflAmnt = item.inflAmnt && item.inflAmnt !== 'x' ? Number(item.inflAmnt.toString().trim()) : 0; const returnAmnt = item.returnAmnt && item.returnAmnt !== 'x' ? Number(item.returnAmnt.toString().trim()) : 0; const efflAmnt = item.efflAmnt && item.efflAmnt !== 'x' ? Number(item.efflAmnt.toString().trim()) : 0; - + if (item.infoRnDay == null) item.infoRnDay = 0; if (item.infoRnDay >= 3) { rainEffectDay = 2; @@ -1495,310 +1527,243 @@ console.log(waterUsage); if (rainEffectDay >= 0) { // 강우영향일 - if (month === '06' || month === '07' || month === '08') { // 하절기 + if (month === '06' || month === '07' || month === '08') { // 하절기 강우영향일 summerRainDay += 1; - summerRainDaySumFlow += sumFlow; - summerRainDayFlow += inflAmnt; - summerRainDayReturnFlow += returnAmnt; - summerRainDayEfflFlow += efflAmnt; + operList.inFlow.summerRainy += inflAmnt + sumFlow + returnAmnt; + operList.inflAmt.summerRainy += inflAmnt; + operList.sumFlow.summerRainy += sumFlow; + operList.returnFlow.summerRainy += returnAmnt; + operList.efflFlow.summerRainy += efflAmnt; } } else if (rainEffectDay < 0) { cntSunnyDay += 1; // 청천일수 // 청천시 - chungcunSumFlow += inflAmnt; + // chungcunSumFlow += inflAmnt; // 연간 청천 순수하수 + operList.inflAmt.yearSunny += inflAmnt; // 연간 청천 순수하수 - if (month === '06' || month === '07' || month === '08') { // 하절기 + if (month === '06' || month === '07' || month === '08') { // 하절기 청천 summerChungchunDay += 1; - summerChungchunSumFlow += sumFlow; - sumSummerChungcunFlow += inflAmnt; - summerChungchunDayReturnAmnt += returnAmnt; - summerChungchunDayEfflAmnt += efflAmnt; - - } else if (month === '01' || month === '02') { // 동절기 + operList.inFlow.summerSunny += inflAmnt + sumFlow + returnAmnt; + operList.inflAmt.summerSunny += inflAmnt; + operList.sumFlow.summerSunny += sumFlow; + operList.returnFlow.summerSunny += returnAmnt; + operList.efflFlow.summerSunny += efflAmnt; + } else if (month === '01' || month === '02') { // 동절기 청천 winterChungchuDay += 1; - winterChungchunSumFlow += sumFlow; - sumWinterChungcunFlow += inflAmnt; - winterChungchunDayReturnAvg += returnAmnt; - winterChungchunDayEfflAvg += efflAmnt; + const inflowOne = inflAmnt + sumFlow + returnAmnt; + operList.inFlow.winterSunny += inflAmnt + sumFlow + returnAmnt; + operList.inflAmt.winterSunny += inflAmnt; + operList.sumFlow.winterSunny += sumFlow; + operList.returnFlow.winterSunny += returnAmnt; + operList.efflFlow.winterSunny += efflAmnt; - let totWinterTotalInflAmnt = 0; - totWinterTotalInflAmnt = inflAmnt + sumFlow + returnAmnt; - if (winterChungchunTotalInflAmntMax < totWinterTotalInflAmnt) winterChungchunTotalInflAmntMax = totWinterTotalInflAmnt; - if (winterChungchunTotalInflAmntMin > totWinterTotalInflAmnt || winterChungchunTotalInflAmntMin === 0) winterChungchunTotalInflAmntMin = totWinterTotalInflAmnt; + if (operList.inFlow.winterSunnyMax < inflowOne) operList.inFlow.winterSunnyMax = inflowOne; + if (operList.inflAmt.winterSunnyMax < inflAmnt) operList.inflAmt.winterSunnyMax = inflAmnt; + if (operList.sumFlow.winterSunnyMax < sumFlow) operList.sumFlow.winterSunnyMax = sumFlow; + if (operList.returnFlow.winterSunnyMax < returnAmnt) operList.returnFlow.winterSunnyMax = returnAmnt; + if (operList.efflFlow.winterSunnyMax < efflAmnt) operList.efflFlow.winterSunnyMax = efflAmnt; - if (winterChungchunDayFlowMin > inflAmnt) winterChungchunDayFlowMin = inflAmnt; - if (winterChungchunDayFlowMax < inflAmnt) winterChungchunDayFlowMax = inflAmnt; - - if (minWinterChungchunSumFlow > sumFlow) minWinterChungchunSumFlow = sumFlow; - if (maxWinterChungchunSumFlow < sumFlow) maxWinterChungchunSumFlow = sumFlow; - - if (winterChungchunDayReturnMin > returnAmnt) winterChungchunDayReturnMin = returnAmnt; - if (winterChungchunDayReturnMax < returnAmnt) winterChungchunDayReturnMax = returnAmnt; - - if (winterChungchunDayEfflMin > efflAmnt) winterChungchunDayEfflMin = efflAmnt; - if (winterChungchunDayEfflMax < efflAmnt) winterChungchunDayEfflMax = efflAmnt; + if (operList.inFlow.winterSunnyMin > inflowOne) operList.inFlow.winterSunnyMin = inflowOne; + if (operList.inflAmt.winterSunnyMin > inflAmnt) operList.inflAmt.winterSunnyMin = inflAmnt; + if (operList.sumFlow.winterSunnyMin > sumFlow) operList.sumFlow.winterSunnyMin = sumFlow; + if (operList.returnFlow.winterSunnyMin > returnAmnt) operList.returnFlow.winterSunnyMin = returnAmnt; + if (operList.efflFlow.winterSunnyMin > efflAmnt) operList.efflFlow.winterSunnyMin = efflAmnt; } } + const inflowOne = inflAmnt + sumFlow + returnAmnt; + operList.inFlow.yearTot += inflAmnt + sumFlow + returnAmnt; + operList.inflAmt.yearTot += inflAmnt; + operList.sumFlow.yearTot += sumFlow; + operList.returnFlow.yearTot += returnAmnt; + operList.efflFlow.yearTot += efflAmnt; - yearSumFlow += sumFlow; - if (maxYearSumFlow < sumFlow) maxYearSumFlow = sumFlow; - if (minYearSumFlow > sumFlow) minYearSumFlow = sumFlow; + if (operList.inFlow.yearMax < inflowOne) operList.inFlow.yearMax = inflowOne; + if (operList.inflAmt.yearMax < inflAmnt) operList.inflAmt.yearMax = inflAmnt; + if (operList.sumFlow.yearMax < sumFlow) operList.sumFlow.yearMax = sumFlow; + if (operList.returnFlow.yearMax < returnAmnt) operList.returnFlow.yearMax = returnAmnt; + if (operList.efflFlow.yearMax < efflAmnt) operList.efflFlow.yearMax = efflAmnt; - // 1년 최대 총 하수유입량 - let totYearFlow = 0; - totYearFlow = inflAmnt + sumFlow + returnAmnt; - if (totFlowMax < totYearFlow) totFlowMax = totYearFlow; - if (totFlowMin > totYearFlow || totFlowMin === 0) { - totFlowMin = totYearFlow; - } + if (operList.inFlow.yearMin > inflowOne) operList.inFlow.yearMin = inflowOne; + if (operList.inflAmt.yearMin > inflAmnt) operList.inflAmt.yearMin = inflAmnt; + if (operList.sumFlow.yearMin > sumFlow) operList.sumFlow.yearMin = sumFlow; + if (operList.returnFlow.yearMin > returnAmnt) operList.returnFlow.yearMin = returnAmnt; + if (operList.efflFlow.yearMin > efflAmnt) operList.efflFlow.yearMin = efflAmnt; if (month === '06' || month === '07' || month === '08') { summerDay += 1; - summerSumFlow += sumFlow; + operList.inFlow.summerTot += inflAmnt + sumFlow + returnAmnt; + operList.inflAmt.summerTot += inflAmnt; + operList.sumFlow.summerTot += sumFlow; + operList.returnFlow.summerTot += returnAmnt; + operList.efflFlow.summerTot += efflAmnt; } else if (month === '01' || month === '02') { winterDay += 1; - winterSumFlow += sumFlow; + operList.inFlow.winterTot += inflAmnt + sumFlow + returnAmnt; + operList.inflAmt.winterTot += inflAmnt; + operList.sumFlow.winterTot += sumFlow; + operList.returnFlow.winterTot += returnAmnt; + operList.efflFlow.winterTot += efflAmnt; } - }); + }); // --일별 유량 end + // 연간 평균 + operList.inFlow.yearAvg = (yearDay > 0)? operList.inFlow.yearTot / yearDay : 0; + operList.inflAmt.yearAvg = (yearDay > 0)? operList.inflAmt.yearTot / yearDay : 0; + operList.sumFlow.yearAvg = (yearDay > 0)? operList.sumFlow.yearTot / yearDay : 0; + operList.returnFlow.yearAvg = (yearDay > 0)? operList.returnFlow.yearTot / yearDay : 0; + operList.efflFlow.yearAvg = (yearDay > 0)? operList.efflFlow.yearTot / yearDay : 0; + // 하절기 전기간 평균 + operList.inFlow.summerAvg = (summerDay > 0)? operList.inFlow.summerTot / summerDay : 0; + operList.inflAmt.summerAvg = (summerDay > 0)? operList.inflAmt.summerTot / summerDay : 0; + operList.sumFlow.summerAvg = (summerDay > 0)? operList.sumFlow.summerTot / summerDay : 0; + operList.returnFlow.summerAvg = (summerDay > 0)? operList.returnFlow.summerTot / summerDay : 0; + operList.efflFlow.summerAvg = (summerDay > 0)? operList.efflFlow.summerTot / summerDay : 0; + // 하절기 강우시 평균 + operList.inFlow.summerRainy = (summerRainDay > 0)? operList.inFlow.summerRainy / summerRainDay : 0; + operList.inflAmt.summerRainy = (summerRainDay > 0)? operList.inflAmt.summerRainy / summerRainDay : 0; + operList.sumFlow.summerRainy = (summerRainDay > 0)? operList.sumFlow.summerRainy / summerRainDay : 0; + operList.returnFlow.summerRainy = (summerRainDay > 0)? operList.returnFlow.summerRainy / summerRainDay : 0; + operList.efflFlow.summerRainy = (summerRainDay > 0)? operList.efflFlow.summerRainy / summerRainDay : 0; + // 하절기 청천시 평균 + operList.inFlow.summerSunny = (summerChungchunDay > 0)? operList.inFlow.summerSunny / summerChungchunDay : 0; + operList.inflAmt.summerSunny = (summerChungchunDay > 0)? operList.inflAmt.summerSunny / summerChungchunDay : 0; + operList.sumFlow.summerSunny = (summerChungchunDay > 0)? operList.sumFlow.summerSunny / summerChungchunDay : 0; + operList.returnFlow.summerSunny = (summerChungchunDay > 0)? operList.returnFlow.summerSunny / summerChungchunDay : 0; + operList.efflFlow.summerSunny = (summerChungchunDay > 0)? operList.efflFlow.summerSunny / summerChungchunDay : 0; + // 동절기 전기간 평균 + operList.inFlow.winterAvg = (winterDay > 0)? operList.inFlow.winterTot / winterDay : 0; + operList.inflAmt.winterAvg = (winterDay > 0)? operList.inflAmt.winterTot / winterDay : 0; + operList.sumFlow.winterAvg = (winterDay > 0)? operList.sumFlow.winterTot / winterDay : 0; + operList.returnFlow.winterAvg = (winterDay > 0)? operList.returnFlow.winterTot / winterDay : 0; + operList.efflFlow.winterAvg = (winterDay > 0)? operList.efflFlow.winterTot / winterDay : 0; + // 동절기 청천시 평균 + operList.inFlow.winterSunny = (winterChungchuDay > 0)? operList.inFlow.winterSunny / winterChungchuDay : 0; + operList.inflAmt.winterSunny = (winterChungchuDay > 0)? operList.inflAmt.winterSunny / winterChungchuDay : 0; + operList.sumFlow.winterSunny = (winterChungchuDay > 0)? operList.sumFlow.winterSunny / winterChungchuDay : 0; + operList.returnFlow.winterSunny = (winterChungchuDay > 0)? operList.returnFlow.winterSunny / winterChungchuDay : 0; + operList.efflFlow.winterSunny = (winterChungchuDay > 0)? operList.efflFlow.winterSunny / winterChungchuDay : 0; - // 연계처리수 - yearAvgSumFlow = Number((yearSumFlow && Number(yearSumFlow) != 0) ? (yearSumFlow / yearDay) : ''); - yearMaxSumFlow = maxYearSumFlow; - yearMinSumFlow = minYearSumFlow; - summerAll = summerSumFlow && Number(summerSumFlow) != 0 ? Number(summerSumFlow / summerDay) : 0 - summerThree = summerRainDaySumFlow && Number(summerRainDaySumFlow) != 0 ? Number(summerRainDaySumFlow / summerRainDay) : 0; - summerRain = summerChungchunSumFlow && Number(summerChungchunSumFlow) != 0 ? Number(summerChungchunSumFlow / summerChungchunDay) : 0; - winterAll = winterSumFlow && Number(winterSumFlow) != 0 ? Number(winterSumFlow / winterDay) : 0; - winterSunnyMin = minWinterChungchunSumFlow; - winterSunnyAvg = winterChungchunSumFlow && Number(winterChungchunSumFlow) != 0 ? (winterChungchunSumFlow / winterChungchuDay) : 0; - winterSunnyMax = maxWinterChungchunSumFlow; - - // 하절기 강우시 계산 - // 하수유입량 (강우시) - summerRainInflAmnt = summerRainDayFlow && Number(summerRainDayFlow) != 0 ? Number(summerRainDayFlow / summerRainDay) : 0; - // 총인설비방류수 (강우시) - summerRainReturnAmnt = summerRainDayReturnFlow && Number(summerRainDayReturnFlow) != 0 ? Number(summerRainDayReturnFlow / summerRainDay) : 0; - // 방루량 (강우시) - summerRainEfflAmnt = summerRainDayEfflFlow && summerRainDayEfflFlow != 0 ? summerRainDayEfflFlow / summerRainDay : 0; - - // 동절기 청천시 계산 - // 하수유입량 (청천시) 평균 - winterChungchunFlowAvg = sumWinterChungcunFlow && Number(sumWinterChungcunFlow) != 0 ? (sumWinterChungcunFlow / winterChungchuDay) : 0; - // 총인반류수 (청천시) 평균 - winterChungchunReturnAvg = winterChungchunDayReturnAvg && Number(winterChungchunDayReturnAvg) != 0 ? (winterChungchunDayReturnAvg / winterChungchuDay) : 0; - // 방류량 (청천시) 평균 - winterChungchunEfflAvg = winterChungchunDayEfflAvg && Number(winterChungchunDayEfflAvg) != 0 ? (winterChungchunDayEfflAvg / winterChungchuDay) : 0; - // 하수유입량 (청천시) 최대 - winterChungchunFlowMax = winterChungchunDayFlowMax; - // 총인반류수 (청천시) 최대 - winterChungchunReturnMax = winterChungchunDayReturnMax; - // 방류량 (청천시) 최대 - winterChungchunEfflMax = winterChungchunDayEfflMax; - // 하수유입량 (청천시) 최소 - winterChungchunFlowMin = winterChungchunDayFlowMin; - // 총인반류수 (청천시) 최소 - winterChungchunReturnMin = winterChungchunDayReturnMin; - // 방류량 (청천시) 최소 - winterChungchunEfflMin = winterChungchunDayEfflMin - - operationalStatusList[0].yearAvg = roundUp(Number(operationalStatusList[0].yearAvg), 0) + roundUp(yearAvgSumFlow, 0); - operationalStatusList[0].yearMax = roundUp(totFlowMax, 0); // + roundUp(yearMaxSumFlow, 0); - operationalStatusList[0].yearMin = roundUp(totFlowMin, 0); - operationalStatusList[0].summerAll = roundUp(Number(operationalStatusList[0].summerAll), 0) + roundUp(summerAll, 0); - operationalStatusList[0].summerThree = roundUp(Number(operationalStatusList[0].summerThree), 0) + roundUp(summerThree, 0); - operationalStatusList[0].summerRain = roundUp(Number(operationalStatusList[0].summerRain), 0) + roundUp(summerRain, 0); - operationalStatusList[0].winterAll = roundUp(Number(operationalStatusList[0].winterAll), 0) + roundUp(winterAll, 0); - operationalStatusList[0].winterSunnyMin = roundUp(winterChungchunTotalInflAmntMin, 0); - operationalStatusList[0].winterSunnyMax = roundUp(winterChungchunTotalInflAmntMax, 0); - operationalStatusList[0].winterSunnyAvg = roundUp(Number(operationalStatusList[0].winterSunnyAvg), 0) + roundUp(winterSunnyAvg, 0); + // 연간 유입 평균 = 하수유입량(순수하수유입량) + 연계처리량 + 반류수유량(m³/일) + operationalStatusList[0].yearAvg = roundUp(operList.inFlow.yearAvg, 0); // 연간 유입 평균 = 하수유입량(순수하수유입량) + 연계처리량 + 반류수유량(m³/일) + operationalStatusList[0].yearMax = roundUp(operList.inFlow.yearMax, 0); // 연간 유입 최대 + operationalStatusList[0].yearMin = roundUp(operList.inFlow.yearMin, 0); // 연간 유입 최소 + operationalStatusList[0].summerAll = roundUp(operList.inFlow.summerAvg, 0); // 하절기 유입 전기간 + operationalStatusList[0].summerThree = roundUp(operList.inFlow.summerRainy, 0); // 하절기 유입 강우시(강우영향일) + operationalStatusList[0].summerRain = roundUp(operList.inFlow.summerSunny, 0); // 하절기 유입 청천시 + operationalStatusList[0].winterAll = roundUp(operList.inFlow.winterAvg, 0); // 동절기 유입 전기간 + operationalStatusList[0].winterSunnyMin = roundUp(operList.inFlow.winterSunnyMin, 0); // 동절기 유입 최소 + operationalStatusList[0].winterSunnyMax = roundUp(operList.inFlow.winterSunnyMax, 0); // 동절기 유입 최대 + operationalStatusList[0].winterSunnyAvg = roundUp(operList.inFlow.winterAvg, 0); // 동절기 유입 평균 // 지하수유입량 - const usage = chungcunSumFlow / cntSunnyDay; //calData.length; - const summerUsage = sumSummerChungcunFlow / summerChungchunDay; - const winterUsage = sumWinterChungcunFlow / winterChungchuDay; + const usage = operList.inflAmt.yearSunny / cntSunnyDay; // 연간 청천 순수하수 평균 + const summerUsage = operList.inflAmt.summerSunny; // 하절기 청천 순수하수 평균 + const winterUsage = operList.inflAmt.winterSunny; // 동절기 청천 순수하수 평균 // 임시 계산변수값들 메인에 대입 - summerChungchunFlow = summerUsage; - summerChungchunReturnAmnt = summerChungchunDayReturnAmnt / summerChungchunDay; - summerChungchunEfflAmnt = summerChungchunDayEfflAmnt / summerChungchunDay; - operationalStatusList[0].groundWaterAvg = Math.round((usage - (usage * 0.65 * OSU_PERCENT)) * 100) / 100; operationalStatusList[0].groundWaterSummer = Math.round((summerUsage - (summerUsage * 0.65 * OSU_PERCENT)) * 100) / 100; operationalStatusList[0].groundWaterWinter = Math.round((winterUsage - (winterUsage * 0.65 * OSU_PERCENT)) * 100) / 100; // 오염물질 // RDII 추정 = 하절기(6~8월) 중 최저 유입 BOD일때 유입유량 x ((동절기 청천시 유입BOD - 하절기(6~8월) 중 최저 유입BOD) / (동절기 청천시 유입BOD)) - const resp = await fetchMainGraph(searchYear, fcltyCd); - const wqltData = resp.data.wqltObjs; - const wqltDataTot = CalcRainEffect(clone(wqltData)); - const wqltDataSunny = CalcRainEffect(clone(wqltData), 'SUNNY'); + // const resp = await fetchMainGraph(searchYear, fcltyCd); + const resp = mainGraphData; + if (resp && resp.data && resp.data.wqltObjs) { + const wqltData = resp.data.wqltObjs; + const wqltDataTot = CalcRainEffect(clone(wqltData)); + const wqltDataSunny = CalcRainEffect(clone(wqltData), 'SUNNY'); - let minSummerBod = 99999999; - let minSummerBodInfl = 99999999; - let winterCnt = 0; - let winterBodSunny = 0; - let rdiRain = 0; + let minSummerBod = 99999999; + let minSummerBodInfl = 99999999; + let winterCnt = 0; + let winterBodSunny = 0; + let rdiRain = 0; - const summerMonth = ['06', '07', '08']; - const winterMonth = ['01', '02']; + const summerMonth = ['06', '07', '08']; + const winterMonth = ['01', '02']; - wqltDataTot.filter(item => summerMonth.includes(item.msrDt.toString().replaceAll('-', '').substring(4, 6))).forEach(item2 => { - if (Number(item2.infoRnDay) >= 3) { - const inflBod = Number(item2.inflAssctBfrWqltBod); - const infl = Number(item2.inflAmnt); - const rain = Number(item2.infoRnDay); - if (inflBod < minSummerBod) { - minSummerBodInfl = infl; - minSummerBod = inflBod; - rdiRain = rain; + wqltDataTot.filter(item => summerMonth.includes(item.msrDt.toString().replaceAll('-', '').substring(4, 6))).forEach(item2 => { + if (Number(item2.infoRnDay) >= 3) { // 3mm 이상 강우일 + const inflBod = Number(item2.inflAssctBfrWqltBod); //유입연계전수질_BOD(mg/L) + const infl = Number(item2.inflAmnt); //실제유입량(반류수제거)(m³/일) + const rain = Number(item2.infoRnDay); //강우량 + if (inflBod < minSummerBod) { + minSummerBodInfl = infl; + minSummerBod = inflBod; + rdiRain = rain; // 하절기 최소 bod일때의 일강수량 + } } - } - }); + }); - wqltDataSunny.filter(item => winterMonth.includes(item.msrDt.toString().replaceAll('-', '').substring(4, 6))).forEach(item2 => { - winterBodSunny += Number(item2.inflAssctBfrWqltBod); - winterCnt += 1; - }); + wqltDataSunny.filter(item => winterMonth.includes(item.msrDt.toString().replaceAll('-', '').substring(4, 6))).forEach(item2 => { + winterBodSunny += Number(item2.inflAssctBfrWqltBod); // 동절기 청천시 유입BOD(mg/L) + winterCnt += 1; + }); - const roundMinSummerBodInfl = Number(roundNumber(minSummerBodInfl, 0).toString().replaceAll(',', '')); - const roundMinSummerBod = Number(roundNumber(minSummerBod, 1).toString().replaceAll(',', '')); - const roundWinterBodSunny = Number(roundNumber(winterBodSunny, 1).toString().replaceAll(',', '')); + const roundMinSummerBodInfl = Number(roundNumber(minSummerBodInfl, 0).toString().replaceAll(',', '')); + const roundMinSummerBod = Number(roundNumber(minSummerBod, 1).toString().replaceAll(',', '')); + const roundWinterBodSunny = Number(roundNumber(winterBodSunny, 1).toString().replaceAll(',', '')); - const winterBodAvg = Number(roundNumber((roundWinterBodSunny / winterCnt), 1).toString().replaceAll(',', '')); - // 하절기(6~8월) 중 최저 유입 BOD일때 유입유량 x ((동절기 청천시 유입BOD - 하절기(6~8월) 중 최저 유입BOD) / (동절기 청천시 유입BOD)) - const winMinusSum = winterBodAvg - roundMinSummerBod; + const winterBodAvg = Number(roundNumber((roundWinterBodSunny / winterCnt), 1).toString().replaceAll(',', '')); + // 하절기(6~8월) 중 최저 유입 BOD일때 유입유량 x ((동절기 청천시 유입BOD - 하절기(6~8월) 중 최저 유입BOD) / (동절기 청천시 유입BOD)) + const winMinusSum = winterBodAvg - roundMinSummerBod; - const rdiValue = winMinusSum === 0 ? 0 : roundMinSummerBodInfl * (winMinusSum / winterBodAvg); + const rdiValue = winMinusSum === 0 ? 0 : roundMinSummerBodInfl * (winMinusSum / winterBodAvg); - rdiPercent = (rdiValue / minSummerBodInfl) * 100; + rdiPercent = (rdiValue / minSummerBodInfl) * 100; - operationalStatusList[0].rdi = rdiValue; - operationalStatusList[0].rdiRain = rdiRain; - /* const summerLowFlow = data.summerBod&&data.summerBod.INFL_AMNT&&data.summerBod.INFL_AMNT!='null'?Number(data.summerBod.INFL_AMNT):0; - const winterAvgBod = data.winterSunny&&data.winterSunny.AVG_INFL_ASSCT_BFR_WQLT_BOD&&data.winterSunny.AVG_INFL_ASSCT_BFR_WQLT_BOD!='null'?Number(data.winterSunny.AVG_INFL_ASSCT_BFR_WQLT_BOD):0; - const summerLowBod = data.summerBod&&data.summerBod.MIN_INFL_ASSCT_BFR_WQLT_BOD&&data.summerBod.MIN_INFL_ASSCT_BFR_WQLT_BOD!='null'?Number(data.summerBod.MIN_INFL_ASSCT_BFR_WQLT_BOD):0; - const summerLowRain = data.summerBod&&data.summerBod.INFO_RN_DAY&&data.summerBod.INFO_RN_DAY!='null'?Number(data.summerBod.INFO_RN_DAY):0; - operationalStatusList[0].rdi = winterAvgBod===0?0:roundUp(summerLowFlow * ((winterAvgBod - summerLowBod) / winterAvgBod), 2); - operationalStatusList[0].rdiRain = summerLowRain; */ - } - - if (operationalStatusList[0] && operationalStatusList[7]) { - operationalStatusList[7].groundWaterAvg = operationalStatusList[0].groundWaterAvg === null ? '' : data.yearData && data.yearData.AVG_INFL_AMNT === 0 ? '' : Math.round((Number(operationalStatusList[0].groundWaterAvg.toString().replaceAll(',', '')) / (data.yearData && data.yearData.AVG_INFL_AMNT ? Number(data.yearData.AVG_INFL_AMNT.toString().replaceAll(',', '')) : 0) * 100) * 10) / 10 + '%'; - operationalStatusList[7].groundWaterSummer = operationalStatusList[0].groundWaterSummer === null ? '' : data.summer && data.summer.AVG_INFL_AMNT === 0 ? '' : Math.round((Number(operationalStatusList[0].groundWaterSummer.toString().replaceAll(',', '')) / (data.summer && data.summer.AVG_INFL_AMNT ? Number(data.summer.AVG_INFL_AMNT.toString().replaceAll(',', '')) : 0) * 100) * 10) / 10 + '%'; - operationalStatusList[7].groundWaterWinter = operationalStatusList[0].groundWaterWinter === null ? '' : data.winter && data.winter.AVG_INFL_AMNT === 0 ? '' : Math.round((Number(operationalStatusList[0].groundWaterWinter.toString().replaceAll(',', '')) / (data.winter && data.winter.AVG_INFL_AMNT ? Number(data.winter.AVG_INFL_AMNT.toString().replaceAll(',', '')) : 0) * 100) * 10) / 10 + '%'; - operationalStatusList[7].rdi = roundNumber(rdiPercent, 1) + '%'; - /* operationalStatusList[7].groundWaterAvg = operationalStatusList[0].groundWaterAvg === null ? '' : Number(Number(operationalStatusList[0].groundWaterAvg) / Number(data.yearData.AVG_INFL_AMNT)) * 100; - operationalStatusList[7].groundWaterSummer = operationalStatusList[0].groundWaterSummer === null ? '' : Number(Number(operationalStatusList[0].groundWaterSummer) / Number(data.summer.AVG_INFL_AMNT)) * 100; - operationalStatusList[7].groundWaterWinter = operationalStatusList[0].groundWaterWinter === null ? '' : Number(Number(operationalStatusList[0].groundWaterWinter) / Number(data.winter.AVG_INFL_AMNT)) * 100;*/ - } - - for (let i = 1; i < operationalStatusList.length; i++) { - const txtArray = ['1', 'INFL_AMNT', 'SUM_FLOW', 'RETURN_AMNT', 'EFFL_AMNT', 'INFL_ASSCT_BFR_WQLT_BOD', 'EFFL_WQLT_BOD', 'INFL_ASSCT_BFR_WQLT_TN', 'EFFL_WQLT_TN', 'INFL_ASSCT_BFR_WQLT_TP', 'EFFL_WQLT_TP', 'TP_INFL_WQLT_TP', 'EFFL_WQLT_TP']; - if (operationalStatusList[i]) { - if (i < 7) { - changeValue(operationalStatusList[i], data, txtArray[i]); - if (i < 5) { - dataFormSetting(operationalStatusList[i]!); - } else { - dataFormSettingWqlty(operationalStatusList[i]!); - } - - } else { - calcValue(operationalStatusList[i], data, txtArray[i]); - } + operationalStatusList[0].rdi = rdiValue; // RDII 추정 + operationalStatusList[0].rdiRain = rdiRain; // RDII 추정시 일강수량(mm) } } - // 순수하수량 - if (operationalStatusList[1]) { - operationalStatusList[1].summerThree = summerRainInflAmnt; - operationalStatusList[1].summerRain = summerChungchunFlow; - operationalStatusList[1].winterSunnyAvg = winterChungchunFlowAvg; - operationalStatusList[1].winterSunnyMax = winterChungchunFlowMax; - operationalStatusList[1].winterSunnyMin = winterChungchunFlowMin; - dataFormSetting(operationalStatusList[1]); + if (operationalStatusList[0] && operationalStatusList[7]) { + // operationalStatusList[7].groundWaterAvg = operationalStatusList[0].groundWaterAvg === null ? '' : operList.inFlow.yearTot && data.yearData.AVG_INFL_AMNT === 0 ? '' : Math.round((Number(operationalStatusList[0].groundWaterAvg.toString().replaceAll(',', '')) / (data.yearData && data.yearData.AVG_INFL_AMNT ? Number(data.yearData.AVG_INFL_AMNT.toString().replaceAll(',', '')) : 0) * 100) * 10) / 10 + '%'; + // operationalStatusList[7].groundWaterSummer = operationalStatusList[0].groundWaterSummer === null ? '' : data.summer && data.summer.AVG_INFL_AMNT === 0 ? '' : Math.round((Number(operationalStatusList[0].groundWaterSummer.toString().replaceAll(',', '')) / (data.summer && data.summer.AVG_INFL_AMNT ? Number(data.summer.AVG_INFL_AMNT.toString().replaceAll(',', '')) : 0) * 100) * 10) / 10 + '%'; + // operationalStatusList[7].groundWaterWinter = operationalStatusList[0].groundWaterWinter === null ? '' : data.winter && data.winter.AVG_INFL_AMNT === 0 ? '' : Math.round((Number(operationalStatusList[0].groundWaterWinter.toString().replaceAll(',', '')) / (data.winter && data.winter.AVG_INFL_AMNT ? Number(data.winter.AVG_INFL_AMNT.toString().replaceAll(',', '')) : 0) * 100) * 10) / 10 + '%'; + operationalStatusList[7].groundWaterAvg = operList.inflAmt.yearAvg === 0 ? '' : Math.round((Number(operationalStatusList[0].groundWaterAvg.toString().replaceAll(',', '')) / operList.inflAmt.yearAvg * 100) * 10) / 10 + '%'; + operationalStatusList[7].groundWaterSummer = operList.inflAmt.summerAvg === 0 ? '' : Math.round((Number(operationalStatusList[0].groundWaterSummer.toString().replaceAll(',', '')) / operList.inflAmt.summerAvg * 100) * 10) / 10 + '%'; + operationalStatusList[7].groundWaterWinter = operList.inflAmt.winterAvg === 0 ? '' : Math.round((Number(operationalStatusList[0].groundWaterWinter.toString().replaceAll(',', '')) / operList.inflAmt.winterAvg * 100) * 10) / 10 + '%'; + operationalStatusList[7].rdi = roundNumber(rdiPercent, 1) + '%'; } - // 연계처리수 - if (operationalStatusList[2]) { - operationalStatusList[2].yearAvg = yearAvgSumFlow; - operationalStatusList[2].yearMax = yearMaxSumFlow; - operationalStatusList[2].yearMin = yearMinSumFlow; - operationalStatusList[2].summerAll = summerAll; - operationalStatusList[2].summerThree = summerThree; - operationalStatusList[2].summerRain = summerRain; - operationalStatusList[2].winterAll = winterAll; - operationalStatusList[2].winterSunnyMin = winterSunnyMin; - operationalStatusList[2].winterSunnyAvg = winterSunnyAvg; - operationalStatusList[2].winterSunnyMax = winterSunnyMax; - dataFormSetting(operationalStatusList[2]); - } + // 순수하수량(1), 연계처리수(2), 총인설비방류수(3), 방류수(4) 데이터 매핑 + const flowMappings = [ + { index: 0, source: operList.inFlow }, + { index: 1, source: operList.inflAmt }, + { index: 2, source: operList.sumFlow }, + { index: 3, source: operList.returnFlow }, + { index: 4, source: operList.efflFlow }, + ]; + flowMappings.forEach(({ index, source }) => { + const item = operationalStatusList[index]; + if (item) { + item.yearAvg = source.yearAvg; + item.yearMax = source.yearMax; + item.yearMin = source.yearMin; + item.summerAll = source.summerAvg; + item.summerThree = source.summerRainy; + item.summerRain = source.summerSunny; + item.winterSunnyAvg = source.winterSunny; + item.winterSunnyMax = source.winterSunnyMax; + item.winterSunnyMin = source.winterSunnyMin; + item.winterAll = source.winterAvg; + dataFormSetting(item); + } + }); - // 총인설비방류수 - if (operationalStatusList[3]) { - operationalStatusList[3].summerThree = summerRainReturnAmnt; - operationalStatusList[3].summerRain = summerChungchunReturnAmnt; - operationalStatusList[3].winterSunnyAvg = winterChungchunReturnAvg; - operationalStatusList[3].winterSunnyMax = winterChungchunReturnMax; - operationalStatusList[3].winterSunnyMin = winterChungchunReturnMin; - dataFormSetting(operationalStatusList[3]); - } - - // 방류수 - if (operationalStatusList[4]) { - operationalStatusList[4].summerThree = summerRainEfflAmnt; - operationalStatusList[4].summerRain = summerChungchunEfflAmnt; - operationalStatusList[4].winterSunnyAvg = winterChungchunEfflAvg; - operationalStatusList[4].winterSunnyMax = winterChungchunEfflMax; - operationalStatusList[4].winterSunnyMin = winterChungchunEfflMin; - dataFormSetting(operationalStatusList[4]); - } - - if (operationalStatusList[0]) { - // 안전하게 숫자 변환하는 함수 - const toNum = (val) => { - if (val === null || val === undefined || val === '' || val === '0') return 0; - return Number(val.toString().replaceAll(',', '')) || 0; - }; - - operationalStatusList[0].summerAll = - toNum(operationalStatusList[1]?.summerAll) + - toNum(operationalStatusList[2]?.summerAll) + - toNum(operationalStatusList[3]?.summerAll); - - operationalStatusList[0].summerThree = - toNum(operationalStatusList[1]?.summerThree) + - toNum(operationalStatusList[2]?.summerThree) + - toNum(operationalStatusList[3]?.summerThree); - - operationalStatusList[0].summerRain = - toNum(operationalStatusList[1]?.summerRain) + - toNum(operationalStatusList[2]?.summerRain) + - toNum(operationalStatusList[3]?.summerRain); - - operationalStatusList[0].winterAll = - toNum(operationalStatusList[1]?.winterAll) + - toNum(operationalStatusList[2]?.winterAll) + - toNum(operationalStatusList[3]?.winterAll); - - operationalStatusList[0].winterSunnyAvg = - toNum(operationalStatusList[1]?.winterSunnyAvg) + - toNum(operationalStatusList[2]?.winterSunnyAvg) + - toNum(operationalStatusList[3]?.winterSunnyAvg); - - dataFormSetting(operationalStatusList[0]); - } } - const rtnData = await calcWaterQltyData(operationalStatusList, searchYear, fcltyCd); // 수질 데이터 청천시, 강우시 재계산 + const rtnData = await calcWaterQltyData(operationalStatusList, searchYear, fcltyCd, mainGraphData); // 수질 데이터 청천시, 강우시 재계산 // 총인설비가 없을 경우 제외 - // console.log('총인시설 여부 : ', data.yearData?.TP_FCT_YN); + console.log('총인시설 여부 : ', mainGraphData.data.wqltObjs?.tpFctYn); + const tpFctYn = mainGraphData.data.wqltObjs?.tpFctYn; // console.log('rtnData : ', rtnData); - if (data.yearData?.TP_FCT_YN !== 'Y') { + if (tpFctYn !== 'Y') { operationalStatusList = rtnData.slice(0, 11); } else { operationalStatusList = rtnData; @@ -1808,13 +1773,33 @@ console.log(waterUsage); OperationStatus: { ...state.OperationStatus, operationalStatusList: operationalStatusList, - operationalStatusCount: res.count, + operationalStatusCount: 0, isLoadingOperationStatus: false, }, })) }, searchMainGraph: async (searchYear: string, fcltyCd: string) => { + const state = get(); + let res: any = null; + + // 이미 조회된 데이터가 있는지 확인 + if (state.RainManage.mainGraphYear === searchYear && state.RainManage.mainGraphFcltyCd === fcltyCd && state.RainManage.mainGraphData) { + res = state.RainManage.mainGraphData; + } else { + res = await fetchMainGraph(searchYear, fcltyCd); + // 데이터 저장 + set((state: DashBoardType) => ({ + ...state, + RainManage: { + ...state.RainManage, + mainGraphData: res, + mainGraphYear: searchYear, + mainGraphFcltyCd: fcltyCd, + } + })); + } + set((state: DashBoardType) => ({ ...state, MainGraph: { @@ -1822,7 +1807,7 @@ console.log(waterUsage); isLoadingMainGraph: true, }, })); - const res = await fetchMainGraph(searchYear, fcltyCd); + // const res = await fetchMainGraph(searchYear, fcltyCd); const res2 = await fetchFacilityWaterQltyInfo(fcltyCd); let chungcunSumFlow = 0; @@ -1944,6 +1929,24 @@ console.log(waterUsage); }, searchRainManage: async (searchYear: string, fcltyCd: string, isExcel: boolean) => { + const state = get(); + let res: any = null; + + if (state.RainManage.mainGraphYear === searchYear && state.RainManage.mainGraphFcltyCd === fcltyCd && state.RainManage.mainGraphData) { + res = state.RainManage.mainGraphData; + } else { + res = await fetchMainGraph(searchYear, fcltyCd); + set((state: DashBoardType) => ({ + ...state, + RainManage: { + ...state.RainManage, + mainGraphData: res, + mainGraphYear: searchYear, + mainGraphFcltyCd: fcltyCd, + } + })); + } + set((state: DashBoardType) => ({ ...state, RainManage: { @@ -1951,7 +1954,7 @@ console.log(waterUsage); isLoadingRainManage: true, }, })); - const res = await fetchMainGraph(searchYear, fcltyCd); + // const res = await fetchMainGraph(searchYear, fcltyCd); if (res == null || res.data.wqltObjs == null || res.data.wqltObjs.length === 0) { set((state: DashBoardType) => ({ ...state, diff --git a/apps/fo/app/store/flowRate/index.tsx b/apps/fo/app/store/flowRate/index.tsx index 66d639fb8..94d4b9326 100644 --- a/apps/fo/app/store/flowRate/index.tsx +++ b/apps/fo/app/store/flowRate/index.tsx @@ -283,7 +283,7 @@ export const flowRateSearchReducer:(set:(fn: (state: FlowRateSearchType) => Flow const excelDownList: ExcelType[] = []; const rtnData = data.map((item: flowRateListProps) => { item.fctCpc = parseFloat(item.fctCpc.toString().replace(/,/g, '')); - item.totInflAmnt = Number(item.inflAmnt || 0) + Number(item.sumFlow || 0) + Number(item.returnAmnt || 0) + item.totInflAmnt = Number(item.inflAmnt || 0) + Number(item.sumFlow || 0) + Number(item.returnAmnt || 0); // 하수유입량 + 연계처리량 + 반류수유량(m³/일) dataFormSetting(item); return item; }); diff --git a/apps/fo/app/store/store.tsx b/apps/fo/app/store/store.tsx index f7f2222c6..c7064a40e 100644 --- a/apps/fo/app/store/store.tsx +++ b/apps/fo/app/store/store.tsx @@ -42,8 +42,9 @@ import { export type FoStore = CommonStore & tableType & DashBoardStore & ProcessFacilityStore & ProcessAreaStore & FlowRateSearchStore & FacilityPrecipitationStore & FacilityWaterQltyStore & PlanSewageStore & SewageOccurStore & UnderWaterStore & RdiStore; export type FoState = CommonType & tableState & ProcessFacilityType & ProcessAreaType & FacilityPrecipitationType & FlowRateSearchType & DashBoardType & FacilityWaterQltyType & PlanSewageType & SewageOccurType & UnderWaterType & RdiType; -export const StoreZus = - (initState: FoState = { ...commonState, +export const StoreZus = + (initState: FoState = { + ...commonState, ...tableStateExport , ...processFacilityInitState , ...processAreaInitState @@ -57,22 +58,22 @@ export const StoreZus = , ...rdiInitState } ) => { - return createStore()((set) => { - return { - ...initState, - ...CommonReducer(set), - ...tableActionsExport(set), - ...dashBoardReducer(set), - ...processFacilityReducer(set), - ...processAreaReducer(set), - ...facilityPrecipitationReducer(set), - ...flowRateSearchReducer(set), - ...facilityWaterQltyReducer(set), - ...planSewageReducer(set), - ...sewageOccurReducer(set), - ...underWaterReducer(set), - ...rdiReducer(set), - } - }) -} + return createStore()((set, get) => { + return { + ...initState, + ...CommonReducer(set), + ...tableActionsExport(set), + ...dashBoardReducer(set, get), + ...processFacilityReducer(set), + ...processAreaReducer(set), + ...facilityPrecipitationReducer(set), + ...flowRateSearchReducer(set), + ...facilityWaterQltyReducer(set), + ...planSewageReducer(set), + ...sewageOccurReducer(set), + ...underWaterReducer(set), + ...rdiReducer(set), + } + }) + } //store 등록하는 부분 \ No newline at end of file diff --git a/apps/wr/app/(map-layout)/map/mainMap/page.tsx b/apps/wr/app/(map-layout)/map/mainMap/page.tsx index 362d45cb8..927703ad9 100644 --- a/apps/wr/app/(map-layout)/map/mainMap/page.tsx +++ b/apps/wr/app/(map-layout)/map/mainMap/page.tsx @@ -21,7 +21,7 @@ import WrOverLay from "@/components/ui/map/wrOverLay/wrOverLay"; const Map = () => { - const {code, comMap ,rainMapDetile ,rswtMapDetile,getRuseMaplListReturn,pbnMapDetaile,ldrmntMapDetile,htdfMapDetile,coSttnMapDetail} = useWrStore((state) => state); + const { code, comMap, rainMapDetile, rswtMapDetile, getRuseMaplListReturn, pbnMapDetaile, ldrmntMapDetile, htdfMapDetile, coSttnMapDetail } = useWrStore((state) => state); const { isFeatured } = comMap; const [treeData, setTreeData] = useState([]); // 초기값을 객체 또는 null로 설정 const gisMaps = useRef(null); @@ -93,7 +93,6 @@ const Map = () => { return; } - // 항상 같은 select 객체 사용 const select = GisApp.Module.select as any; if (!select) return; @@ -109,7 +108,6 @@ const Map = () => { const layerName = getWrLayerNm(data); const featurePk = getWrFeaturePk(layerName ?? ""); - // 재이용시설 if (featurePk) { const lastPk = @@ -254,139 +252,139 @@ const Map = () => { const OVERLAY_MIN_ZOOM = 16; -const OVERLAY_COORD_PRECISION = 5; -const OVERLAY_MAX_PER_VIEW = 800; + const OVERLAY_COORD_PRECISION = 5; + const OVERLAY_MAX_PER_VIEW = 800; -const overlayManagersRef = useRef([]); -const overlayActiveRef = useRef(false); -const moveEndDebounceRef = useRef(null); + const overlayManagersRef = useRef([]); + const overlayActiveRef = useRef(false); + const moveEndDebounceRef = useRef(null); -// 반환: Promise -const overlayFormatter = async (feature: any, props: any) => { - const p = props || {}; - const featureId = - feature.getId?.() ?? p?.id ?? p?.fid ?? p?.ftrIdn ?? ''; - if (!featureId) return null; + // 반환: Promise + const overlayFormatter = async (feature: any, props: any) => { + const p = props || {}; + const featureId = + feature.getId?.() ?? p?.id ?? p?.fid ?? p?.ftrIdn ?? ''; + if (!featureId) return null; - const tableId = String(featureId).split('.')[0]??''; - const fcltCd = getFeatureCd(props, tableId); + const tableId = String(featureId).split('.')[0] ?? ''; + const fcltCd = getFeatureCd(props, tableId); - if (!fcltCd) return null; + if (!fcltCd) return null; - let data: any = null; - let title = ''; + let data: any = null; + let title = ''; - if (tableId === 'tb_il_swage_prcs_fclt') { data = await pbnMapDetaile(fcltCd); title = '하수처리시설'; } - else if (tableId === 'tb_wr_bdst_ruse_fclt') { data = await getRuseMaplListReturn(fcltCd); title = '하수재이용시설'; } - else if (tableId === 'tb_wr_rnwtr_utztn_fclt'){ data = await rainMapDetile(fcltCd); title = '빗물이용시설'; } - else if (tableId === 'tb_wr_rswtr_fclt') { data = await rswtMapDetile(fcltCd); title = '중수도시설'; } - else if (tableId === 'tb_wr_htdfl_fclt') { data = await htdfMapDetile(fcltCd); title = '온배수시설'; } - else if (tableId === 'tb_wr_ruse_fclt_dmd_co'){ data = await coSttnMapDetail(fcltCd); title = '수요처'; } - else if (tableId === 'tb_wr_tmpr_dmd_co') { data = await ldrmntMapDetile(fcltCd); title = '잠재수요처'; } + if (tableId === 'tb_il_swage_prcs_fclt') { data = await pbnMapDetaile(fcltCd); title = '하수처리시설'; } + else if (tableId === 'tb_wr_bdst_ruse_fclt') { data = await getRuseMaplListReturn(fcltCd); title = '하수재이용시설'; } + else if (tableId === 'tb_wr_rnwtr_utztn_fclt') { data = await rainMapDetile(fcltCd); title = '빗물이용시설'; } + else if (tableId === 'tb_wr_rswtr_fclt') { data = await rswtMapDetile(fcltCd); title = '중수도시설'; } + else if (tableId === 'tb_wr_htdfl_fclt') { data = await htdfMapDetile(fcltCd); title = '온배수시설'; } + else if (tableId === 'tb_wr_ruse_fclt_dmd_co') { data = await coSttnMapDetail(fcltCd); title = '수요처'; } + else if (tableId === 'tb_wr_tmpr_dmd_co') { data = await ldrmntMapDetile(fcltCd); title = '잠재수요처'; } - const empty = - data == null || - (Array.isArray(data) && data.length === 0) || - (typeof data === 'object' && !Array.isArray(data) && Object.keys(data).length === 0); + const empty = + data == null || + (Array.isArray(data) && data.length === 0) || + (typeof data === 'object' && !Array.isArray(data) && Object.keys(data).length === 0); - if (empty) return null; + if (empty) return null; - const div = document.createElement('div'); - const root = createRoot(div); - (div as any).__dispose = () => { try { root.unmount(); } catch {} }; - root.render(); - return div; // ← 데이터 있을 때만 HTMLElement 반환 -}; -const destroyAllManagers = () => { - overlayManagersRef.current.forEach(m => { try { m.destroy(); } catch {} }); - overlayManagersRef.current = []; - overlayActiveRef.current = false; -}; + const div = document.createElement('div'); + const root = createRoot(div); + (div as any).__dispose = () => { try { root.unmount(); } catch { } }; + root.render(); + return div; // ← 데이터 있을 때만 HTMLElement 반환 + }; + const destroyAllManagers = () => { + overlayManagersRef.current.forEach(m => { try { m.destroy(); } catch { } }); + overlayManagersRef.current = []; + overlayActiveRef.current = false; + }; -const mountOverlayManagers = () => { - const map = gisMaps.current; - if (!map) return; + const mountOverlayManagers = () => { + const map = gisMaps.current; + if (!map) return; - // 이전 것 정리 - destroyAllManagers(); + // 이전 것 정리 + destroyAllManagers(); - // 체크된 벡터 레이어만 골라 매니저 생성 - const checkedSet = new Set(checkedLayers.map(String)); - const layers: any[] = map.getLayers().getArray(); - const targets = layers.filter((layer: any) => { - const src = layer.getSource?.(); - const isVector = src && typeof src.getFeatures === "function"; - const id = String(layer.get?.("lyrSn") ?? layer.get?.("id") ?? ""); - return isVector && layer.getVisible?.() && checkedSet.has(id); - }); - - targets.forEach((layer: any) => { - const mgr = createOverlayManager(map, layer, overlayFormatter, { - coordPrecision: OVERLAY_COORD_PRECISION, - maxOverlaysPerViewport: OVERLAY_MAX_PER_VIEW, + // 체크된 벡터 레이어만 골라 매니저 생성 + const checkedSet = new Set(checkedLayers.map(String)); + const layers: any[] = map.getLayers().getArray(); + const targets = layers.filter((layer: any) => { + const src = layer.getSource?.(); + const isVector = src && typeof src.getFeatures === "function"; + const id = String(layer.get?.("lyrSn") ?? layer.get?.("id") ?? ""); + return isVector && layer.getVisible?.() && checkedSet.has(id); }); - mgr.mount(); // 리스너 1회 등록 - mgr.enable(); // 표시 + 1회 sync - overlayManagersRef.current.push(mgr); - }); - overlayActiveRef.current = overlayManagersRef.current.length > 0; -}; + targets.forEach((layer: any) => { + const mgr = createOverlayManager(map, layer, overlayFormatter, { + coordPrecision: OVERLAY_COORD_PRECISION, + maxOverlaysPerViewport: OVERLAY_MAX_PER_VIEW, + }); + mgr.mount(); // 리스너 1회 등록 + mgr.enable(); // 표시 + 1회 sync + overlayManagersRef.current.push(mgr); + }); -useEffect(() => { - const map = gisMaps.current; - if (!map) return; - - const z = map.getView()?.getZoom?.() ?? 0; - if (z < OVERLAY_MIN_ZOOM) { - // 저줌에선 그냥 안 보이게만 - overlayManagersRef.current.forEach(m => { try { m.disable({ clear:true, delayed:true }); } catch {} }); - return; - } - mountOverlayManagers(); - - return () => { destroyAllManagers(); }; -}, [checkedLayers]); - - -useEffect(() => { - const map = gisMaps.current; - if (!map) return; - - const onMoveStart = () => { - // 숨기기만 (리스너/DOM 대량 제거 X) - overlayManagersRef.current.forEach(m => { try { m.disable({ clear:false }); } catch {} }); - if (moveEndDebounceRef.current) { clearTimeout(moveEndDebounceRef.current); moveEndDebounceRef.current = null; } + overlayActiveRef.current = overlayManagersRef.current.length > 0; }; - const onMoveEnd = () => { + useEffect(() => { + const map = gisMaps.current; + if (!map) return; + const z = map.getView()?.getZoom?.() ?? 0; - const active = overlayActiveRef.current; + if (z < OVERLAY_MIN_ZOOM) { + // 저줌에선 그냥 안 보이게만 + overlayManagersRef.current.forEach(m => { try { m.disable({ clear: true, delayed: true }); } catch { } }); + return; + } + mountOverlayManagers(); - if (moveEndDebounceRef.current) clearTimeout(moveEndDebounceRef.current); - moveEndDebounceRef.current = window.setTimeout(() => { - if (z < OVERLAY_MIN_ZOOM) { - if (active) overlayManagersRef.current.forEach(m => { try { m.disable({ clear:true, delayed:true }); } catch {} }); - return; - } - if (!active) { - mountOverlayManagers(); - } else { - // 다시 보이고 1회만 동기화 - overlayManagersRef.current.forEach(m => { try { m.enable(); m.syncOverlays(); } catch {} }); - } - }, 180) as unknown as number; - }; + return () => { destroyAllManagers(); }; + }, [checkedLayers]); - map.on("movestart", onMoveStart); - map.on("moveend", onMoveEnd); - return () => { - map.un("movestart", onMoveStart); - map.un("moveend", onMoveEnd); - if (moveEndDebounceRef.current) { clearTimeout(moveEndDebounceRef.current); moveEndDebounceRef.current = null; } - }; -}, [checkedLayers]); + + useEffect(() => { + const map = gisMaps.current; + if (!map) return; + + const onMoveStart = () => { + // 숨기기만 (리스너/DOM 대량 제거 X) + overlayManagersRef.current.forEach(m => { try { m.disable({ clear: false }); } catch { } }); + if (moveEndDebounceRef.current) { clearTimeout(moveEndDebounceRef.current); moveEndDebounceRef.current = null; } + }; + + const onMoveEnd = () => { + const z = map.getView()?.getZoom?.() ?? 0; + const active = overlayActiveRef.current; + + if (moveEndDebounceRef.current) clearTimeout(moveEndDebounceRef.current); + moveEndDebounceRef.current = window.setTimeout(() => { + if (z < OVERLAY_MIN_ZOOM) { + if (active) overlayManagersRef.current.forEach(m => { try { m.disable({ clear: true, delayed: true }); } catch { } }); + return; + } + if (!active) { + mountOverlayManagers(); + } else { + // 다시 보이고 1회만 동기화 + overlayManagersRef.current.forEach(m => { try { m.enable(); m.syncOverlays(); } catch { } }); + } + }, 180) as unknown as number; + }; + + map.on("movestart", onMoveStart); + map.on("moveend", onMoveEnd); + return () => { + map.un("movestart", onMoveStart); + map.un("moveend", onMoveEnd); + if (moveEndDebounceRef.current) { clearTimeout(moveEndDebounceRef.current); moveEndDebounceRef.current = null; } + }; + }, [checkedLayers]); return (
{ const featureCd = - layerNm === "tb_wr_bdst_ruse_fclt" + layerNm === "tb_wr_bdst_ruse_fclt" //하수재이용시설 ? featurePropertise?.swtrmt_fclt_cd : [ - "tb_wr_rswtr_fclt", - "tb_wr_htdfl_fclt", - "tb_wr_rnwtr_utztn_fclt", - "tb_wr_tmpr_dmd_co", - ].includes(layerNm) + "tb_wr_rswtr_fclt", // 중수도시설 + "tb_wr_htdfl_fclt", // 온배수시설 + "tb_wr_rnwtr_utztn_fclt", // 빗물이용시설 + "tb_wr_tmpr_dmd_co", // 잠재수요처 + ].includes(layerNm) ? featurePropertise?.bdst_nm - : layerNm === "tb_il_swage_prcs_fclt" + : layerNm === "tb_il_swage_prcs_fclt" //하수처리시설 ? featurePropertise?.swtrmt_fclt_cd - : layerNm === "tb_wr_ruse_fclt_dmd_co" + : layerNm === "tb_wr_ruse_fclt_dmd_co" //수요처 ? featurePropertise?.bdst_info_sn : null; @@ -71,9 +71,9 @@ export const getSelectedLayers = (isFeature: any, gisMaps: any) => { let result = null; const layers = map ? map - .getLayers() - .getArray() - .filter((l: any) => l.getVisible()) + .getLayers() + .getArray() + .filter((l: any) => l.getVisible()) : []; // gisMap이 null인지 확인 후 레이어 가져오기 let featureLayer: { get: (key: string) => any } = { get: () => null }; @@ -119,12 +119,12 @@ export const getClickFeatureId = (data: any) => { } else if (layerName == "수요처") { //수요처 featureId = `${layerName}.${data.dmdInfoId.replaceAll("-", "")}`; - }else if (layerName == "잠재수요처") { + } else if (layerName == "잠재수요처") { //잠재수요처 featureId = data.id_ - } else { - + } else { + featureId = data.id_ } @@ -160,7 +160,7 @@ export function featurePopUpOpen( ); } -export const getOverLayObj = (fclType: string, data: any,code?:any) => { +export const getOverLayObj = (fclType: string, data: any, code?: any) => { let newObj = {}; let title = ""; @@ -169,11 +169,11 @@ export const getOverLayObj = (fclType: string, data: any,code?:any) => { if (fclType === "하수재이용시설") { newObj = { - "시설용량(톤/일)": formatCommaNumber(data?.fcltCpct) ??'확인불가', - "재이용률(%)": (data?.fcltCpct / data?.bscFctCpc)||0, + "시설용량(톤/일)": formatCommaNumber(data?.fcltCpct) ?? '확인불가', + "재이용률(%)": (data?.fcltCpct / data?.bscFctCpc) || 0, "장내용수(m³/년)": formatCommaNumber(data?.inUsage) ?? '확인불가', - "장외용수(m3/년)":formatCommaNumber(data?.outUsage) ?? '확인불가', - // 수요처: data?.reuseBuilding[0]?.rainyObj.pntfColArea ?? '확인불가', + "장외용수(m3/년)": formatCommaNumber(data?.outUsage) ?? '확인불가', + // 수요처: data?.reuseBuilding[0]?.rainyObj.pntfColArea ?? '확인불가', }; title = data?.bdstNm ?? '확인불가'; } else if (fclType === "하수처리시설") { @@ -184,9 +184,9 @@ export const getOverLayObj = (fclType: string, data: any,code?:any) => { "재이용시설 등록여부": data?.ruse ?? '확인불가', }; title = data?.bscFctNm ?? '확인불가'; - } else if (fclType === "빗물이용시설" ) { + } else if (fclType === "빗물이용시설") { newObj = { - 건물용도: code?.bdstUsgCd.find((item) => item.val=== String(data?.reuseBuilding[0].bdstUsgCd) )?.text ?? '확인불가', + 건물용도: code?.bdstUsgCd.find((item) => item.val === String(data?.reuseBuilding[0].bdstUsgCd))?.text ?? '확인불가', 설치완료일: data?.reuseBuilding[0]?.instlCmptnDt ?? '확인불가', 처리시설유무: data?.reuseBuilding[0]?.rainyObj.filtrTrtmfctYn ?? '확인불가', "처리시설용량(m³/일)": formatCommaNumber(data?.reuseBuilding[0]?.rainyObj.filtrTrtmfctCpct) ?? '확인불가', @@ -195,25 +195,25 @@ export const getOverLayObj = (fclType: string, data: any,code?:any) => { title = data?.bdstNm ?? '확인불가'; } else if (fclType === "중수도시설") { newObj = { - 건물용도: code?.bdstUsgCd.find((item) => item.val===String(data?.reuseBuilding[0].bdstUsgCd) )?.text ?? '확인불가', + 건물용도: code?.bdstUsgCd.find((item) => item.val === String(data?.reuseBuilding[0].bdstUsgCd))?.text ?? '확인불가', 설치완료일: data?.reuseBuilding[0]?.instlCmptnDt ?? '확인불가', - "주요 처리공정": data?.reuseBuilding[0]?.rswtrObj.filtrTrtmfctProcs ?? '확인불가', - 원수종류: code?.orgwtKndCd.find((item) => item.val === data?.reuseBuilding[0]?.rswtrObj.orgwtKndCd)?.text ?? '확인불가', + "주요 처리공정": data?.reuseBuilding[0]?.rswtrObj.filtrTrtmfctProcs ?? '확인불가', + 원수종류: code?.orgwtKndCd.find((item) => item.val === data?.reuseBuilding[0]?.rswtrObj.orgwtKndCd)?.text ?? '확인불가', //이용용도: isCode.filtrTrtmfctUsgCd data?.reuseBuilding[0]?.rswtrObj.altUswtrKndCd ?? '확인불가', }; title = data?.bdstNm ?? '확인불가'; } else if (fclType === "온배수시설") { newObj = { - '발전유형': data?.reuseBuilding[0]?.htdflObj.etgtType??'', - '설비용량': data?.reuseBuilding[0]?.htdflObj.fclCpct??'', - '담수화 여부': data?.reuseBuilding[0]?.htdflObj.plwtYn??'', + '발전유형': data?.reuseBuilding[0]?.htdflObj.etgtType ?? '', + '설비용량': data?.reuseBuilding[0]?.htdflObj.fclCpct ?? '', + '담수화 여부': data?.reuseBuilding[0]?.htdflObj.plwtYn ?? '', }; title = data?.bdstNm ?? '확인불가'; } else if (fclType === "수요처") { newObj = { - '사업자등록번호': data?.dmdInfoId??'', - '주소': data?.daddr??'', - '전화번호': formatPhoneNumber(data?.telno)??'', + '사업자등록번호': data?.dmdInfoId ?? '', + '주소': data?.daddr ?? '', + '전화번호': formatPhoneNumber(data?.telno) ?? '', }; title = data?.dmdCoNm ?? '확인불가'; diff --git a/packages/common/components/src/ui/header/index.tsx b/packages/common/components/src/ui/header/index.tsx index 15b431b6a..b15af9d25 100644 --- a/packages/common/components/src/ui/header/index.tsx +++ b/packages/common/components/src/ui/header/index.tsx @@ -182,10 +182,10 @@ export function Header({ viewOnly }: { viewOnly?: boolean }) {

{mounted ? ( - logo { if (logoRef.current) { @@ -196,7 +196,7 @@ export function Header({ viewOnly }: { viewOnly?: boolean }) { ) : ( )} - 0 ? `${(logoWidth - 120) / (siteInfo?.siteNm?.length || 1)}px` : '0.05em'